static void SDLGL_BeginRendering(void *obj) { AG_DriverSDLGL *sgl = obj; #if defined(AG_THREADS) && defined(HAVE_GETTIMEOFDAY) && \ defined(HAVE_CLOCK_GETTIME) && !defined(HAVE_CYGWIN) { extern AG_Cond agCondBeginRender; /* Suspend any AG_Delay()'ed threads. */ AG_CondBroadcast(&agCondBeginRender); } #endif glPushAttrib(GL_VIEWPORT_BIT|GL_TRANSFORM_BIT|GL_LIGHTING_BIT| GL_ENABLE_BIT); if (AGDRIVER_SW(sgl)->flags & AG_DRIVER_SW_OVERLAY) { AG_GL_InitContext( AG_RECT(0, 0, AGDRIVER_SW(sgl)->w, AGDRIVER_SW(sgl)->h)); } else { glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT); } sgl->clipStates[0] = glIsEnabled(GL_CLIP_PLANE0); glEnable(GL_CLIP_PLANE0); sgl->clipStates[1] = glIsEnabled(GL_CLIP_PLANE1); glEnable(GL_CLIP_PLANE1); sgl->clipStates[2] = glIsEnabled(GL_CLIP_PLANE2); glEnable(GL_CLIP_PLANE2); sgl->clipStates[3] = glIsEnabled(GL_CLIP_PLANE3); glEnable(GL_CLIP_PLANE3); }
static void SDLGL_BeginRendering(void *obj) { AG_DriverSDLGL *sgl = obj; AG_GL_Context *gl = &sgl->gl; glPushAttrib(GL_VIEWPORT_BIT|GL_TRANSFORM_BIT|GL_LIGHTING_BIT| GL_ENABLE_BIT); if (AGDRIVER_SW(sgl)->flags & AG_DRIVER_SW_OVERLAY) { AG_Driver *drv = obj; /* Reinitialize Agar's OpenGL context. */ if (drv->gl != NULL) { AG_GL_DestroyContext(drv); } if (AG_GL_InitContext(drv, gl) == -1) { AG_FatalError(NULL); } AG_GL_SetViewport(gl, AG_RECT(0, 0, AGDRIVER_SW(sgl)->w, AGDRIVER_SW(sgl)->h)); } else { glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT); } gl->clipStates[0] = glIsEnabled(GL_CLIP_PLANE0); glEnable(GL_CLIP_PLANE0); gl->clipStates[1] = glIsEnabled(GL_CLIP_PLANE1); glEnable(GL_CLIP_PLANE1); gl->clipStates[2] = glIsEnabled(GL_CLIP_PLANE2); glEnable(GL_CLIP_PLANE2); gl->clipStates[3] = glIsEnabled(GL_CLIP_PLANE3); glEnable(GL_CLIP_PLANE3); }
static int SDLGL_OpenVideoContext(void *obj, void *ctx, Uint flags) { AG_DriverSDLGL *sgl = obj; AG_DriverSw *dsw = obj; AG_Driver *drv = obj; SDL_Surface *ctxSu = (SDL_Surface *)ctx; if (!(ctxSu->flags & SDL_OPENGL)) { AG_SetError("Given display surface is not SDL_OPENGL"); return (-1); } /* Set the requested display options. */ if (flags & AG_VIDEO_OVERLAY) dsw->flags |= AG_DRIVER_SW_OVERLAY; if (flags & AG_VIDEO_BGPOPUPMENU) dsw->flags |= AG_DRIVER_SW_BGPOPUP; /* Use the given display surface. */ sgl->s = (SDL_Surface *)ctx; if ((drv->videoFmt = AG_SDL_GetPixelFormat(sgl->s)) == NULL) { goto fail; } dsw->w = sgl->s->w; dsw->h = sgl->s->h; dsw->depth = (Uint)drv->videoFmt->BitsPerPixel; Verbose(_("SDLGL: Using existing display (%ux%ux%d bpp)\n"), dsw->w, dsw->h, (int)drv->videoFmt->BitsPerPixel); /* Initialize our OpenGL context and viewport. */ if (AG_GL_InitContext(sgl, &sgl->gl) == -1) { goto fail; } AG_GL_SetViewport(&sgl->gl, AG_RECT(0, 0, dsw->w, dsw->h)); /* Create the cursors. */ if (AG_SDL_InitDefaultCursor(sgl) == -1 || AG_InitStockCursors(drv) == -1) goto fail; return (0); fail: if (drv->videoFmt) { AG_PixelFormatFree(drv->videoFmt); drv->videoFmt = NULL; } return (-1); }
static int SDLGL_OpenVideo(void *obj, Uint w, Uint h, int depth, Uint flags) { char buf[16]; AG_Driver *drv = obj; AG_DriverSw *dsw = obj; AG_DriverSDLGL *sgl = obj; Uint32 sFlags = SDL_OPENGL; int newDepth; /* Set the requested display options. */ if (flags & AG_VIDEO_RESIZABLE) { sFlags |= SDL_RESIZABLE; } if (flags & AG_VIDEO_ANYFORMAT) { sFlags |= SDL_ANYFORMAT; } if (flags & AG_VIDEO_HWPALETTE) { sFlags |= SDL_HWPALETTE; } if (flags & AG_VIDEO_DOUBLEBUF) { sFlags |= SDL_DOUBLEBUF; } if (flags & AG_VIDEO_FULLSCREEN) { sFlags |= SDL_FULLSCREEN; } if (flags & AG_VIDEO_NOFRAME) { sFlags |= SDL_NOFRAME; } if (flags & AG_VIDEO_OVERLAY) dsw->flags |= AG_DRIVER_SW_OVERLAY; if (flags & AG_VIDEO_BGPOPUPMENU) dsw->flags |= AG_DRIVER_SW_BGPOPUP; /* Apply the output capture settings. */ if (AG_Defined(drv, "out")) { char *ext; AG_GetString(drv, "out", buf, sizeof(buf)); if ((ext = strrchr(buf, '.')) != NULL && ext[1] != '\0') { if (Strcasecmp(&ext[1], "jpeg") == 0 || Strcasecmp(&ext[1], "jpg") == 0) { sgl->outMode = AG_SDLGL_OUT_JPEG; if ((sgl->outPath = TryStrdup(buf)) == NULL) return (-1); } else if (Strcasecmp(&ext[1], "png") == 0) { sgl->outMode = AG_SDLGL_OUT_PNG; if ((sgl->outPath = TryStrdup(buf)) == NULL) return (-1); } else { AG_SetError("Invalid out= argument: `%s'", buf); return (-1); } if (AG_Defined(drv, "outFirst")) { AG_GetString(drv, "outFirst", buf, sizeof(buf)); sgl->outFrame = atoi(buf); } else { sgl->outFrame = 0; } if (AG_Defined(drv, "outLast")) { AG_GetString(drv, "outLast", buf, sizeof(buf)); sgl->outLast = atoi(buf); } } } /* Apply the default resolution settings. */ if (w == 0 && AG_Defined(drv, "width")) { AG_GetString(drv, "width", buf, sizeof(buf)); w = atoi(buf); } if (h == 0 && AG_Defined(drv, "height")) { AG_GetString(drv, "height", buf, sizeof(buf)); h = atoi(buf); } if (depth == 0 && AG_Defined(drv, "depth")) { AG_GetString(drv, "depth", buf, sizeof(buf)); depth = atoi(buf); } /* Set the video mode. Force hardware palette in 8bpp. */ Verbose(_("SDLGL: Setting mode %dx%d (%d bpp)\n"), w, h, depth); newDepth = SDL_VideoModeOK(w, h, depth, sFlags); if (newDepth == 8) { Verbose(_("Enabling hardware palette")); sFlags |= SDL_HWPALETTE; } if ((sgl->s = SDL_SetVideoMode((int)w, (int)h, newDepth, sFlags)) == NULL) { AG_SetError("Setting %dx%dx%d mode: %s", w, h, newDepth, SDL_GetError()); return (-1); } SDL_EnableUNICODE(1); if ((drv->videoFmt = AG_SDL_GetPixelFormat(sgl->s)) == NULL) { goto fail; } dsw->w = sgl->s->w; dsw->h = sgl->s->h; dsw->depth = (Uint)drv->videoFmt->BitsPerPixel; Verbose(_("SDLGL: New display (%dbpp)\n"), (int)drv->videoFmt->BitsPerPixel); /* Initialize clipping rectangles. */ if (InitClipRects(sgl, dsw->w, dsw->h) == -1) goto fail; /* Create the cursors. */ if (AG_SDL_InitDefaultCursor(sgl) == -1 || AG_InitStockCursors(drv) == -1) goto fail; /* Initialize the GL viewport. */ AG_GL_InitContext( AG_RECT(0, 0, AGDRIVER_SW(sgl)->w, AGDRIVER_SW(sgl)->h)); if (!(dsw->flags & AG_DRIVER_SW_OVERLAY)) { ClearBackground(); } /* Initialize the output capture buffer. */ Free(sgl->outBuf); if ((sgl->outBuf = AG_TryMalloc(dsw->w*dsw->h*4)) == NULL) { AG_Verbose("Out of memory for buffer; disabling capture\n"); sgl->outMode = AG_SDLGL_OUT_NONE; } /* Toggle fullscreen if requested. */ if (AG_CfgBool("view.full-screen")) { if (!SDL_WM_ToggleFullScreen(sgl->s)) AG_SetCfgBool("view.full-screen", 0); } return (0); fail: if (drv->videoFmt) { AG_PixelFormatFree(drv->videoFmt); drv->videoFmt = NULL; } return (-1); }
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 */ }