AG_Box *AGOL_About::CreateTopBox(void *parent) { AG_Box *tbox; AG_Box *box; AG_Label *label; SDL_Surface *sf; AG_AgarVersion agv; tbox = AG_BoxNewHoriz(parent, 0); box = AG_BoxNewHoriz(tbox, 0); sf = IMG_Load_RW(SDL_RWFromConstMem(icon_odalaunch_96, sizeof(icon_odalaunch_96)), 1); if(sf) AG_PixmapFromSurface(box, AG_PIXMAP_EXPAND, AG_SurfaceFromSDL(sf)); box = AG_BoxNewVert(tbox, 0); label = AG_LabelNewS(box, AG_LABEL_HFILL, "The Odamex Launcher"); AG_LabelJustify(label, AG_TEXT_CENTER); label = AG_LabelNewS(box, AG_LABEL_HFILL, "Copyright (C) 2010 by The Odamex Team"); AG_LabelJustify(label, AG_TEXT_CENTER); label = AG_LabelNew(box, AG_LABEL_HFILL, "Version %d.%d.%d - Protocol Version %d", VERSIONMAJOR(VERSION), VERSIONMINOR(VERSION), VERSIONPATCH(VERSION), PROTOCOL_VERSION); AG_LabelJustify(label, AG_TEXT_CENTER); label = AG_LabelNewS(box, AG_LABEL_HFILL, "http://www.odamex.net"); AG_LabelJustify(label, AG_TEXT_CENTER); AG_GetVersion(&agv); label = AG_LabelNew(parent, AG_LABEL_HFILL, "Built with Agar, Version %d.%d.%d", agv.major, agv.minor, agv.patch); AG_LabelJustify(label, AG_TEXT_CENTER); label = AG_LabelNew(parent, AG_LABEL_HFILL, "(%s)", agv.release); AG_LabelJustify(label, AG_TEXT_CENTER); return tbox; }
int main(int argc, char *argv[]) { #ifdef HAVE_SDL AG_Window *win; SDL_Surface *screen, *bmp, *tex1, *tex2, *avatar; AG_Surface *agbmp, *agavatar; int c, useGL = 0; Uint32 sdlFlags = 0; char *optArg; Uint32 rmask, gmask, bmask, amask; if (AG_InitCore("agar-sdl-demo", 0) == -1) { fprintf(stderr, "AG_InitCore: %s\n", AG_GetError()); goto fail; } while ((c = AG_Getopt(argc, argv, "?g", &optArg, NULL)) != -1) { switch (c) { case 'g': useGL = 1; break; default: printf("Usage: %s [-g]\n", agProgName); break; } } /* Set up SDL */ if (SDL_Init(SDL_INIT_VIDEO) == -1) { fprintf(stderr, "SDL_Init: %s\n", SDL_GetError()); return (1); } if (useGL) { sdlFlags = SDL_RESIZABLE|SDL_OPENGL; } else { sdlFlags = SDL_RESIZABLE|SDL_SWSURFACE; } if ((screen = SDL_SetVideoMode(320, 240, 32, sdlFlags)) == NULL) { fprintf(stderr, "SDL_SetVideoMode: %s\n", SDL_GetError()); goto fail; } if (useGL) { /* Set up OpenGL viewport and projection. */ AG_GL_InitContext(AG_RECT(0,0,320,240)); } /* Initialize Agar-GUI to reuse display */ if (AG_InitVideoSDL(screen, 0) == -1) { fprintf(stderr, "%s\n", AG_GetError()); AG_Destroy(); goto fail; } AG_BindGlobalKey(AG_KEY_ESCAPE, AG_KEYMOD_ANY, AG_QuitGUI); /* Display some test widgets. */ win = AG_WindowNew(AG_WINDOW_PLAIN); AG_LabelNew(win, 0, "Attached to existing %s display", useGL ? "SDL/OpenGL" : "SDL"); /* Test conversion from SDL_Surface to AG_Surface. */ if ((bmp = SDL_LoadBMP("agar.bmp")) != NULL) { if ((agbmp = AG_SurfaceFromSDL(bmp)) != NULL) { AG_PixmapFromSurface(win, 0, agbmp); } else { AG_LabelNewS(win, 0, AG_GetError()); } } #ifdef HAVE_SDL_IMAGE if ((tex1 = IMG_Load("test1.png")) == NULL || (tex2 = IMG_Load("test2.png")) == NULL) { fprintf(stderr, "IMG_Load() failed\n"); goto fail; } # if SDL_BYTEORDER == SDL_BIG_ENDIAN rmask = 0xff000000; gmask = 0x00ff0000; bmask = 0x0000ff00; amask = 0x000000ff; # else rmask = 0x000000ff; gmask = 0x0000ff00; bmask = 0x00ff0000; amask = 0xff000000; # endif avatar = SDL_CreateRGBSurface(SDL_SWSURFACE|SDL_SRCALPHA, 64, 128, tex1->format->BitsPerPixel, rmask, gmask, bmask, amask); SDL_SetAlpha(tex1, 0, 0); SDL_BlitSurface(tex1, NULL, avatar, NULL); SDL_SetAlpha(tex2, SDL_SRCALPHA, 0); SDL_BlitSurface(tex2, NULL, avatar, NULL); if ((agavatar = AG_SurfaceFromSDL(avatar)) != NULL) { AG_PixmapFromSurface(win, 0, agavatar); } else { AG_LabelNewS(win, 0, AG_GetError()); } #endif /* HAVE_SDL_IMAGE */ AG_WindowShow(win); AG_EventLoop(); AG_Destroy(); SDL_Quit(); return (0); fail: SDL_Quit(); return (1); #else fprintf(stderr, "Agar was compiled without SDL support\n"); return (1); #endif /* HAVE_SDL */ }
static void * drawVideoThread(void *data) { ffmpegPlayer *me = data; AG_ObjectLock(me); for (;;) { SDL_ffmpegVideoFrame *frame = me->videoFrame[me->curVideoFrame]; if (!frame->ready) { DEBUG("Video buffer underrun!"); SDL_ffmpegGetVideoFrame(me->file, frame); } uint64_t sync = getSync(me); uint64_t pts = frame->pts; if (pts >= sync) { AG_ObjectUnlock(me); /* condition variable waiting may be faster, test with 500mhz */ AG_Delay(pts - sync); AG_ObjectLock(me); if (me->file == NULL) { /* FIXME */ break; } if (pts > getSync(me)) continue; #ifdef USE_OVERLAY if (frame->overlay != NULL) { if (AG_WidgetVisible(me)) { int frame_x = (AGWIDGET(me)->w - me->disp_w) / 2; int frame_y = (AGWIDGET(me)->h - me->disp_h) / 2; SDL_Rect rect = { .x = AGWIDGET(me)->rView.x1 + frame_x, .y = AGWIDGET(me)->rView.y1 + frame_y, .w = me->disp_w, .h = me->disp_h }; SDL_DisplayYUVOverlay(frame->overlay, &rect); } } #else if (frame->surface != NULL) { #ifdef USE_SDL_SHADOWSURFACE if (me->surface != NULL) AG_SDL_ShadowSurfaceFree(me->surface); me->surface = AG_SDL_ShadowSurface(frame->surface); #else if (me->surface != NULL) AG_SurfaceFree(me->surface); me->surface = AG_SurfaceFromSDL(frame->surface); #endif if (me->surface == NULL) { /* FIXME */ break; } AG_Redraw(AGWIDGET(me)); } #endif } else { /* frame is skipped */ DEBUG("skip frame: %lums late", sync - frame->pts); } frame->ready = 0; RR_INC(me->curVideoFrame, FFMPEGPLAYER_BUFSIZE); /* wake up buffer-fill thread */ AG_CondSignal(&me->video_cond); }