static void CleanupOpenGL() { #if defined(__APPLE__) CGLSetCurrentContext(NULL); if (s_GLContext) CGLDestroyContext(s_GLContext); if (s_GLContext3) CGLDestroyContext(s_GLContext3); #endif }
static void CleanupGL() { #if GOT_GFX #ifdef __APPLE__ CGLSetCurrentContext(NULL); if (s_GLContext) CGLDestroyContext(s_GLContext); if (s_GLContext3) CGLDestroyContext(s_GLContext3); #endif // #ifdef __APPLE__ #endif // #if GOT_GFX }
int screen_CloseCapture( demux_t *p_demux ) { screen_data_t *p_data = ( screen_data_t * )p_demux->p_sys->p_data; CGLSetCurrentContext( NULL ); /* Cursor */ glBindTexture( GL_TEXTURE_2D, 0 ); glDeleteTextures( 1, &( p_data->cursor_texture ) ); CGSReleaseConnection( p_data->connection ); /* Screen Image */ if( p_data->screen_image != NULL ) { free( p_data->screen_image ); p_data->screen_image = NULL; } /* Clipped Image */ if( p_data->clipped_image != NULL ) { free( p_data->clipped_image ); p_data->clipped_image = NULL; } /* Clipped Context */ CGLClearDrawable( p_data->clipped ); CGLDestroyContext( p_data->clipped ); /* Screen Context */ if( p_data->myCGDisplayCreateImageForRect == NULL ) { CGLClearDrawable( p_data->screen ); CGLDestroyContext( p_data->screen ); } /* CGImage */ CFRelease( p_data->bundle ); free( p_data ); return VLC_SUCCESS; }
/* Cleans up CGLContext created by createFullScreenCGLContext(); */ static void destroyFullScreenCGLContext(CGLContextObj glContext) { glPopClientAttrib(); /* Clear attributes previously set. */ CGLSetCurrentContext(NULL); /* Reset context. */ CGLClearDrawable(glContext); /* Disassociate from full-screen. */ CGLDestroyContext(glContext); /* Release memory. */ }
GLContext::~GLContext() { if ( context != NULL ) { CGLDestroyContext( context ); } }
void macosx_opengl_fini(void) { if (!macosx_read_opengl) { return; } CGLSetCurrentContext(NULL); CGLClearDrawable(glContextObj); CGLDestroyContext(glContextObj); }
//----------------------------------------------------------------------------// OpenGLApplePBTextureTarget::~OpenGLApplePBTextureTarget() { if (d_context) CGLDestroyContext(d_context); if (d_pbuffer) CGLDestroyPBuffer(d_pbuffer); }
OSXCGLContext::~OSXCGLContext() { CGLClearDrawable(mCGLContext); CGLDestroyContext(mCGLContext); if(mPixelFormat != NULL) CGLDestroyPixelFormat(mPixelFormat); }
bool RTCALL VBoxOglIs3DAccelerationSupported() { if (RTEnvGet("VBOX_CROGL_FORCE_SUPPORTED")) { LogRel(("VBOX_CROGL_FORCE_SUPPORTED is specified, skipping 3D test, and treating as supported\n")); return true; } CGDirectDisplayID display = CGMainDisplayID (); CGOpenGLDisplayMask cglDisplayMask = CGDisplayIDToOpenGLDisplayMask (display); CGLPixelFormatObj pixelFormat = NULL; GLint numPixelFormats = 0; CGLPixelFormatAttribute attribs[] = { kCGLPFADisplayMask, (CGLPixelFormatAttribute)cglDisplayMask, kCGLPFAAccelerated, kCGLPFADoubleBuffer, kCGLPFAWindow, (CGLPixelFormatAttribute)NULL }; display = CGMainDisplayID(); cglDisplayMask = CGDisplayIDToOpenGLDisplayMask(display); CGLChoosePixelFormat(attribs, &pixelFormat, &numPixelFormats); if (pixelFormat) { CGLContextObj cglContext = 0; CGLCreateContext(pixelFormat, NULL, &cglContext); CGLDestroyPixelFormat(pixelFormat); if (cglContext) { GLboolean isSupported = GL_TRUE; #ifdef VBOX_WITH_COCOA_QT /* On the Cocoa port we depend on the GL_EXT_framebuffer_object & * the GL_EXT_texture_rectangle extension. If they are not * available, disable 3D support. */ CGLSetCurrentContext(cglContext); const GLubyte* strExt; strExt = glGetString(GL_EXTENSIONS); isSupported = gluCheckExtension((const GLubyte*)"GL_EXT_framebuffer_object", strExt); if (isSupported) { isSupported = gluCheckExtension((const GLubyte*)"GL_EXT_texture_rectangle", strExt); if (!isSupported) LogRel(("OpenGL Info: GL_EXT_texture_rectangle extension not supported\n")); } else LogRel(("OpenGL Info: GL_EXT_framebuffer_object extension not supported\n")); #endif /* VBOX_WITH_COCOA_QT */ CGLDestroyContext(cglContext); return isSupported == GL_TRUE ? true : false; } } return false; }
PBuffer::~PBuffer() { if(data->context) CGLDestroyContext( data->context ); if(data->pbuffer) CGLDestroyPBuffer( data->pbuffer ); if(data->pixfmt) CGLDestroyPixelFormat( data->pixfmt ); CGLSetCurrentContext(NULL); delete data; }
Gre::RenderContextHolder DarwinGlRenderer::iCreateRenderContext(const std::string &name, const Gre::RenderContextInfo &info) const { if ( iGlobalContext ) { if ( !name.empty() ) { // For now, we don't take advantage of the data in 'info' . CGLContextObj ctxt = nullptr; if ( CGLCreateContext(iDefaultPixelFormat, iGlobalContext, &ctxt) == kCGLNoError ) { GreDebugPretty() << "OpenGl Context '" << name << "' created." << std::endl; Gre::RenderContextHolder holder = Gre::RenderContextHolder ( new DarwinGlContext(name, info, ctxt) ); if ( holder.isInvalid() ) { GreDebugPretty() << "Can't create 'Gre::RenderContextHolder' Resource." << std::endl; if ( CGLDestroyContext(ctxt) != kCGLNoError ) { GreDebugPretty() << "Can't destroy OpenGl Context." << std::endl; } return Gre::RenderContextHolder ( nullptr ); } else { return holder; } } else { GreDebugPretty() << "OpenGl Context '" << name << "' couldn't be created." << std::endl; return Gre::RenderContextHolder ( nullptr ); } } else { GreDebugPretty() << "'name' is invalid." << std::endl; return Gre::RenderContextHolder ( nullptr ); } } else { GreDebugPretty() << "'iGlobalContext' has not been initialized." << std::endl; return Gre::RenderContextHolder ( nullptr ); } }
static void RLXAPI ReleaseSurfaces(void) { if (!g_pCGLC) return; CGLSetCurrentContext( NULL ); CGLClearDrawable( g_pCGLC ); CGLDestroyContext( g_pCGLC ); g_pCGLC = 0; g_pRLX->pGX->Surfaces.maxSurface = 0; }
int screen_CloseCapture( demux_t *p_demux ) { screen_data_t *p_data = ( screen_data_t * )p_demux->p_sys->p_data; CGSReleaseConnection( p_data->connection ); CGLSetCurrentContext( NULL ); CGLClearDrawable( p_data->screen ); CGLDestroyContext( p_data->screen ); return VLC_SUCCESS; }
static void PlatformReleaseOpenGL(void* ContextPtr, void* PrevContextPtr) { CGLContextObj ShaderCompileContext = (CGLContextObj)ContextPtr; CGLContextObj PreviousShaderCompileContext = (CGLContextObj)PrevContextPtr; CGLError Error; Error = CGLSetCurrentContext(PreviousShaderCompileContext); check(Error == kCGLNoError); Error = CGLDestroyContext(ShaderCompileContext); check(Error == kCGLNoError); }
static void gfx_ctx_cgl_destroy(void *data) { gfx_ctx_cgl_data_t *cgl = (gfx_ctx_cgl_data_t*)data; if (cgl->glCtx) { CGLSetCurrentContext(NULL); CGLDestroyContext(cgl->glCtx); } if (cgl->displayID) CGDisplayRelease(cgl->displayID); if (cgl) free(cgl); }
void LLWindowMacOSX::destroyContext() { if (!mContext) { // We don't have a context return; } // Unhook the GL context from any drawable it may have if(mContext != NULL) { LL_DEBUGS("Window") << "destroyContext: unhooking drawable " << LL_ENDL; CGLSetCurrentContext(NULL); } // Clean up remaining GL state before blowing away window gGLManager.shutdownGL(); // Clean up the pixel format if(mPixelFormat != NULL) { CGLDestroyPixelFormat(mPixelFormat); mPixelFormat = NULL; } // Clean up the GL context if(mContext != NULL) { CGLDestroyContext(mContext); } // Destroy our LLOpenGLView if(mGLView != NULL) { removeGLView(mGLView); mGLView = NULL; } // Close the window if(mWindow != NULL) { NSWindowRef dead_window = mWindow; mWindow = NULL; closeWindow(dead_window); } }
HeadlessView::~HeadlessView() { activate(); clearBuffers(); deactivate(); #if MBGL_USE_CGL CGLDestroyContext(glContext); #endif #if MBGL_USE_GLX if (glxPbuffer) { glXDestroyPbuffer(xDisplay, glxPbuffer); glxPbuffer = 0; } glXDestroyContext(xDisplay, glContext); #endif }
static int cleanup(void) { #if USE_OSMESA OSMesaDestroyContext(context); free(pbuffer); #elif USE_CGL (void)CGLDestroyContext(context); (void)CGLDestroyPBuffer(pbuffer); #elif USE_GLX display = XOpenDisplay(NULL); glXDestroyPbuffer(display, pbuffer); XCloseDisplay(display); #else /* TODO: cleanup pbuffer and OpenGL context */ #endif return 0; }
void _glfwPlatformCloseWindow( void ) { if( _glfwWin.WindowFunctions != NULL ) { if( _glfwWin.WindowUPP != NULL ) { DisposeEventHandlerUPP( _glfwWin.WindowUPP ); _glfwWin.WindowUPP = NULL; } _glfwWin.WindowFunctions->CloseWindow(); if( !_glfwWin.Fullscreen && _glfwWin.AGLContext != NULL ) { aglSetCurrentContext( NULL ); aglSetDrawable( _glfwWin.AGLContext, NULL ); aglDestroyContext( _glfwWin.AGLContext ); _glfwWin.AGLContext = NULL; } if( _glfwWin.Fullscreen && _glfwWin.CGLContext != NULL ) { CGLSetCurrentContext( NULL ); CGLClearDrawable( _glfwWin.CGLContext ); CGLDestroyContext( _glfwWin.CGLContext ); CGReleaseAllDisplays(); _glfwWin.CGLContext = NULL; } if( _glfwWin.MacWindow != NULL ) { ReleaseWindow( _glfwWin.MacWindow ); _glfwWin.MacWindow = NULL; } _glfwWin.WindowFunctions = NULL; } }
//----------------------------------------------------------------------------- // utilities //----------------------------------------------------------------------------- bool DoGLSection(Environment &env, Signal &sig, Argument &arg, Image *pImage) { #if GURA_USE_MSWIN_DIB PIXELFORMATDESCRIPTOR pfd = { sizeof(PIXELFORMATDESCRIPTOR), 1, PFD_DRAW_TO_BITMAP | PFD_SUPPORT_OPENGL, PFD_TYPE_RGBA, static_cast<BYTE>(pImage->GetBitsPerPixel()), 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 32, 0, 0, PFD_MAIN_PLANE, 0, 0, 0, 0 }; HDC hdc = ::CreateCompatibleDC(nullptr); HBITMAP hBmp = pImage->GetHBITMAP(); HBITMAP hBmpOld = reinterpret_cast<HBITMAP>(::SelectObject(hdc, hBmp)); int iPixelFormat = ::ChoosePixelFormat(hdc, &pfd); ::SetPixelFormat(hdc, iPixelFormat, &pfd); HGLRC hglrc = ::wglCreateContext(hdc); ::wglMakeCurrent(hdc, hglrc); const Expr_Block *pExprBlock = arg.GetBlockCooked(env); if (!sig.IsSignalled()) { pExprBlock->Exec(env); } ::wglMakeCurrent(nullptr, nullptr); ::wglDeleteContext(hglrc); ::SelectObject(hdc, hBmpOld); ::DeleteDC(hdc); return true; #elif defined(GURA_ON_DARWIN) //***************** // not working yet. //***************** GLsizei width = static_cast<GLsizei>(pImage->GetWidth()); GLsizei height = static_cast<GLsizei>(pImage->GetHeight()); CGLError errCode = kCGLNoError; GLuint texOut = 0; CGLContextObj ctx = nullptr; CGLContextObj ctxOrg = CGLGetCurrentContext(); CGLPixelFormatAttribute attributes[4] = { kCGLPFAAccelerated, kCGLPFAOpenGLProfile, (CGLPixelFormatAttribute)kCGLOGLPVersion_3_2_Core, (CGLPixelFormatAttribute)0 }; CGLPixelFormatObj pixelFormat = nullptr; GLint numPixelFormats = 0; errCode = CGLChoosePixelFormat(attributes, &pixelFormat, &numPixelFormats); errCode = CGLCreateContext(pixelFormat, nullptr, &ctx); errCode = CGLSetCurrentContext(ctx); glGenTextures(1, &texOut); glBindTexture(GL_TEXTURE_2D, texOut); glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, width, height, 0, GL_RGBA, GL_FLOAT, nullptr); GLuint frameBuffer = 0; glGenFramebuffers(1, &frameBuffer); glBindFramebuffer(GL_FRAMEBUFFER, frameBuffer); glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, texOut, 0); GLenum status = glCheckFramebufferStatus(GL_FRAMEBUFFER); if (status == GL_FRAMEBUFFER_COMPLETE) { const Expr_Block *pExprBlock = arg.GetBlockCooked(env); if (!sig.IsSignalled()) { pExprBlock->Exec(env); } } do { GLenum format = GetImageFormat(env, pImage); if (sig.IsSignalled()) return false; glBindTexture(GL_TEXTURE_2D, texOut); glGetTexImage(GL_TEXTURE_2D, 0, format, GL_UNSIGNED_BYTE, pImage->GetBuffer()); } while (0); glDeleteTextures(1, &texOut); glBindFramebuffer(GL_FRAMEBUFFER, 0); CGLSetCurrentContext(ctxOrg); CGLDestroyContext(ctx); return true; #else #if 0 int width = static_cast<int>(pImage->GetWidth()); int height = static_cast<int>(pImage->GetHeight()); GLXFBConfig config; Pixmap pixmap = ::XCreatePixmap(nullptr, d, width, height, 32); GLXPixmap xid = ::glXCreatePixmap(nullptr, config, pixmap, nullptr); GLXContext ctx; ::glXMakeCurrent(nullptr, xid, ctx); const Expr_Block *pExprBlock = arg.GetBlockCooked(env); if (!sig.IsSignalled()) { pExprBlock->Exec(env); } ::glReadPixels(0, 0, width, height, GL_BGRA_EXT, GL_UNSIGNED_BYTE, pImage->GetBuffer()); #endif #endif return true; }
bool RTCALL VBoxOglIs3DAccelerationSupported() { if (RTEnvExist("VBOX_CROGL_FORCE_SUPPORTED")) { LogRel(("VBOX_CROGL_FORCE_SUPPORTED is specified, skipping 3D test, and treating as supported\n")); return true; } CGDirectDisplayID display = CGMainDisplayID (); CGOpenGLDisplayMask cglDisplayMask = CGDisplayIDToOpenGLDisplayMask (display); CGLPixelFormatObj pixelFormat = NULL; GLint numPixelFormats = 0; CGLError rcCgl; CGLPixelFormatAttribute attribs[] = { kCGLPFADisplayMask, (CGLPixelFormatAttribute)cglDisplayMask, kCGLPFAAccelerated, kCGLPFADoubleBuffer, VBoxOglIsOfflineRenderingAppropriate() ? kCGLPFAAllowOfflineRenderers : (CGLPixelFormatAttribute)NULL, (CGLPixelFormatAttribute)NULL }; display = CGMainDisplayID(); cglDisplayMask = CGDisplayIDToOpenGLDisplayMask(display); rcCgl = CGLChoosePixelFormat(attribs, &pixelFormat, &numPixelFormats); if (rcCgl != kCGLNoError) { LogRel(("OpenGL Info: 3D test unable to choose pixel format (rcCgl=0x%X)\n", rcCgl)); return false; } if (pixelFormat) { CGLContextObj cglContext = 0; rcCgl = CGLCreateContext(pixelFormat, NULL, &cglContext); CGLDestroyPixelFormat(pixelFormat); if (rcCgl != kCGLNoError) { LogRel(("OpenGL Info: 3D test unable to create context (rcCgl=0x%X)\n", rcCgl)); return false; } if (cglContext) { GLboolean isSupported = GL_TRUE; #ifdef VBOX_WITH_COCOA_QT /* On the Cocoa port we depend on the GL_EXT_framebuffer_object & * the GL_EXT_texture_rectangle extension. If they are not * available, disable 3D support. */ CGLSetCurrentContext(cglContext); const GLubyte* strExt; strExt = glGetString(GL_EXTENSIONS); isSupported = gluCheckExtension((const GLubyte*)"GL_EXT_framebuffer_object", strExt); if (isSupported) { isSupported = gluCheckExtension((const GLubyte*)"GL_EXT_texture_rectangle", strExt); if (!isSupported) LogRel(("OpenGL Info: 3D test found that GL_EXT_texture_rectangle extension not supported\n")); } else LogRel(("OpenGL Info: 3D test found that GL_EXT_framebuffer_object extension not supported\n")); #endif /* VBOX_WITH_COCOA_QT */ CGLDestroyContext(cglContext); LogRel(("OpenGL Info: 3D test %spassed\n", isSupported == GL_TRUE ? "" : "not ")); return isSupported == GL_TRUE ? true : false; } else LogRel(("OpenGL Info: 3D test unable to create context (internal error)\n")); } else LogRel(("OpenGL Info: 3D test unable to choose pixel format (internal error)\n")); return false; }
COffscreenGLContext::~COffscreenGLContext() { CGLDestroyContext(cglWorkerCtx); }
WindowlessCglApplication::~WindowlessCglApplication() { _context.reset(); CGLDestroyContext(_glContext); CGLDestroyPixelFormat(_pixelFormat); }
void COffscreenGLContext::WorkerThreadFree() { CGLSetCurrentContext(NULL); CGLDestroyContext(cglWorkerCtx); }
void CheckOpenGLCaps (CGDisplayCount maxDspys, GLCaps dCaps[], CGDisplayCount * dCnt) { CGLContextObj curr_ctx = 0; CGDirectDisplayID dspys[32]; CGDisplayErr theErr; short i; short size = sizeof (GLCaps); // no devices *dCnt = 0; if (maxDspys == 0) { // find number of displays *dCnt = 0; theErr = CGGetActiveDisplayList (32, dspys, dCnt); if (theErr) // theErr getting list *dCnt = 0; // 0 displays since can't correctly find any // zero list to ensure the routines are used correctly memset (dspys, 0, sizeof (CGDirectDisplayID) * *dCnt); return; // return dCnt } if (NULL == dCaps) return; theErr = CGGetActiveDisplayList(maxDspys, dspys, dCnt); if (theErr) return; // theErr getting list if (0 == *dCnt) return; // no displays memset (dCaps, 0, size * *dCnt); // zero memory for (i = 0; i < *dCnt; i++) { // get device ids dCaps[i].cgDisplayID = dspys[i]; dCaps[i].cglDisplayMask = CGDisplayIDToOpenGLDisplayMask(dspys[i]); { // get current geometry CGRect displayRect = CGDisplayBounds (dspys[i]); // get mode dictionary CFDictionaryRef dispMode = CGDisplayCurrentMode (dspys[i]); dCaps[i].deviceWidth = (long) displayRect.size.width; dCaps[i].deviceHeight = (long) displayRect.size.height; dCaps[i].deviceOriginX = (long) displayRect.origin.x; dCaps[i].deviceOriginY = (long) displayRect.origin.y; dCaps[i].deviceDepth = (short) _getDictLong (dispMode, kCGDisplayBitsPerPixel); dCaps[i].deviceRefresh = (short) (_getDictDouble (dispMode, kCGDisplayRefreshRate) + 0.5); } { // get renderer info based on gDevice CGLRendererInfoObj info; long j; GLint numRenderers = 0; GLint rv = 0; CGLError theErr2 = 0; theErr2 = CGLQueryRendererInfo (dCaps[i].cglDisplayMask, &info, &numRenderers); if(0 == theErr2) { CGLDescribeRenderer (info, 0, kCGLRPRendererCount, &numRenderers); for (j = 0; j < numRenderers; j++) { // find accelerated renderer (assume only one) CGLDescribeRenderer (info, j, kCGLRPAccelerated, &rv); if (true == rv) { // if accelerated // what is the renderer ID CGLDescribeRenderer (info, j, kCGLRPRendererID, &dCaps[i].rendererID); // can we do full screen? CGLDescribeRenderer (info, j, kCGLRPFullScreen, &rv); dCaps[i].fullScreenCapable = (bool) rv; // what is the VRAM? CGLDescribeRenderer (info, j, kCGLRPVideoMemory, &dCaps[i].deviceVRAM); // what is the current texture memory? CGLDescribeRenderer (info, j, kCGLRPTextureMemory, &dCaps[i].deviceTextureRAM); break; // done } } } CGLDestroyRendererInfo (info); } { // build context and context specific info CGLPixelFormatAttribute attribs[] = { kCGLPFADisplayMask, dCaps[i].cglDisplayMask, (CGLPixelFormatAttribute)0 }; CGLPixelFormatObj pixelFormat = NULL; GLint numPixelFormats = 0; CGLContextObj cglContext; curr_ctx = CGLGetCurrentContext (); // get current CGL context CGLChoosePixelFormat (attribs, &pixelFormat, &numPixelFormats); if (pixelFormat) { CGLCreateContext(pixelFormat, NULL, &cglContext); CGLDestroyPixelFormat (pixelFormat); CGLSetCurrentContext (cglContext); if (cglContext) { const GLubyte * strExt; const GLubyte * strRend; const GLubyte * strVers; const GLubyte * strVend; // get renderer strings strRend = glGetString (GL_RENDERER); strncpy (dCaps[i].strRendererName, (char *) strRend, 255); strVend = glGetString (GL_VENDOR); strncpy (dCaps[i].strRendererVendor, (char *) strVend, 255); strVers = glGetString (GL_VERSION); strncpy (dCaps[i].strRendererVersion, (char *) strVers, 255); { // get BCD version short j = 0; short shiftVal = 8; while (((strVers[j] <= '9') && (strVers[j] >= '0')) || (strVers[j] == '.')) { // get only basic version info (until first non-digit or non-.) if ((strVers[j] <= '9') && (strVers[j] >= '0')) { dCaps[i].glVersion += (strVers[j] - '0') << shiftVal; shiftVal -= 4; } j++; } } strExt = glGetString (GL_EXTENSIONS); // get caps glGetIntegerv (GL_MAX_TEXTURE_UNITS, &dCaps[i].textureUnits); glGetIntegerv (GL_MAX_TEXTURE_SIZE, &dCaps[i].maxTextureSize); glGetIntegerv (GL_MAX_3D_TEXTURE_SIZE, &dCaps[i].max3DTextureSize); glGetIntegerv (GL_MAX_CUBE_MAP_TEXTURE_SIZE, &dCaps[i].maxCubeMapTextureSize); // get functionality info dCaps[i].fSpecularVector = gluCheckExtension ((const GLubyte *) "GL_APPLE_specular_vector", strExt); dCaps[i].fTransformHint = gluCheckExtension ((const GLubyte *) "GL_APPLE_transform_hint", strExt); dCaps[i].fPackedPixels = gluCheckExtension ((const GLubyte *) "GL_APPLE_packed_pixels", strExt) || gluCheckExtension ((const GLubyte *) "GL_APPLE_packed_pixel", strExt) || (dCaps[i].glVersion >= 0x0120); dCaps[i].fClientStorage = gluCheckExtension ((const GLubyte *) "GL_APPLE_client_storage", strExt); dCaps[i].fYCbCr = gluCheckExtension ((const GLubyte *) "GL_APPLE_ycbcr_422", strExt); dCaps[i].fTextureRange = gluCheckExtension ((const GLubyte *) "GL_APPLE_texture_range", strExt); dCaps[i].fFence = gluCheckExtension ((const GLubyte *) "GL_APPLE_fence", strExt); dCaps[i].fVAR = gluCheckExtension ((const GLubyte *) "GL_APPLE_vertex_array_range", strExt); dCaps[i].fVAO = gluCheckExtension ((const GLubyte *) "GL_APPLE_vertex_array_object", strExt); dCaps[i].fElementArray = gluCheckExtension ((const GLubyte *) "GL_APPLE_element_array", strExt); dCaps[i].fVPEvals = gluCheckExtension ((const GLubyte *) "GL_APPLE_vertex_program_evaluators",strExt); dCaps[i].fFloatPixels = gluCheckExtension ((const GLubyte *) "GL_APPLE_float_pixels", strExt); dCaps[i].fFlushRenderer = gluCheckExtension ((const GLubyte *) "GL_APPLE_flush_render", strExt); dCaps[i].fPixelBuffer = gluCheckExtension ((const GLubyte *) "GL_APPLE_pixel_buffer", strExt); dCaps[i].fImaging = gluCheckExtension ((const GLubyte *) "GL_ARB_imaging", strExt); dCaps[i].fTransposeMatrix = gluCheckExtension ((const GLubyte *) "GL_ARB_transpose_matrix", strExt) || (dCaps[i].glVersion >= 0x0130); dCaps[i].fMultitexture = gluCheckExtension ((const GLubyte *) "GL_ARB_multitexture", strExt) || (dCaps[i].glVersion >= 0x0130); dCaps[i].fTexEnvAdd = gluCheckExtension ((const GLubyte *) "GL_ARB_texture_env_add", strExt) || gluCheckExtension ((const GLubyte *) "GL_EXT_texture_env_add", strExt) || (dCaps[i].glVersion >= 0x0130); dCaps[i].fTexEnvCombine = gluCheckExtension ((const GLubyte *) "GL_ARB_texture_env_combine", strExt) || (dCaps[i].glVersion >= 0x0130); dCaps[i].fTexEnvDot3 = gluCheckExtension ((const GLubyte *) "GL_ARB_texture_env_dot3", strExt) || (dCaps[i].glVersion >= 0x0130); dCaps[i].fTexEnvCrossbar = gluCheckExtension ((const GLubyte *) "GL_ARB_texture_env_crossbar", strExt) || (dCaps[i].glVersion >= 0x0140); dCaps[i].fTexCubeMap = gluCheckExtension ((const GLubyte *) "GL_ARB_texture_cube_map", strExt) || (dCaps[i].glVersion >= 0x0130); dCaps[i].fTexCompress = gluCheckExtension ((const GLubyte *) "GL_ARB_texture_compression", strExt) || (dCaps[i].glVersion >= 0x0130); dCaps[i].fMultisample = gluCheckExtension ((const GLubyte *) "GL_ARB_multisample", strExt) || (dCaps[i].glVersion >= 0x0130); dCaps[i].fTexBorderClamp = gluCheckExtension ((const GLubyte *) "GL_ARB_texture_border_clamp", strExt) || (dCaps[i].glVersion >= 0x0130); dCaps[i].fPointParam = gluCheckExtension ((const GLubyte *) "GL_ARB_point_parameters", strExt) || (dCaps[i].glVersion >= 0x0140); dCaps[i].fVertexProg = gluCheckExtension ((const GLubyte *) "GL_ARB_vertex_program", strExt); dCaps[i].fFragmentProg = gluCheckExtension ((const GLubyte *) "GL_ARB_fragment_program", strExt); dCaps[i].fTexMirrorRepeat = gluCheckExtension ((const GLubyte *) "GL_ARB_texture_mirrored_repeat", strExt) || (dCaps[i].glVersion >= 0x0140); dCaps[i].fDepthTex = gluCheckExtension ((const GLubyte *) "GL_ARB_depth_texture", strExt) || (dCaps[i].glVersion >= 0x0140); dCaps[i].fShadow = gluCheckExtension ((const GLubyte *) "GL_ARB_shadow", strExt) || (dCaps[i].glVersion >= 0x0140); dCaps[i].fShadowAmbient = gluCheckExtension ((const GLubyte *) "GL_ARB_shadow_ambient", strExt); dCaps[i].fVertexBlend = gluCheckExtension ((const GLubyte *) "GL_ARB_vertex_blend", strExt); dCaps[i].fWindowPos = gluCheckExtension ((const GLubyte *) "GL_ARB_window_pos", strExt) || (dCaps[i].glVersion >= 0x0140); dCaps[i].fTex3D = gluCheckExtension ((const GLubyte *) "GL_EXT_texture3D", strExt) || (dCaps[i].glVersion >= 0x0120); dCaps[i].fClipVolHint = gluCheckExtension ((const GLubyte *) "GL_EXT_clip_volume_hint", strExt); dCaps[i].fRescaleNorm = gluCheckExtension ((const GLubyte *) "GL_EXT_rescale_normal", strExt) || (dCaps[i].glVersion >= 0x0120); dCaps[i].fBlendColor = gluCheckExtension ((const GLubyte *) "GL_EXT_blend_color", strExt) || gluCheckExtension ((const GLubyte *) "GL_ARB_imaging", strExt); dCaps[i].fBlendMinMax = gluCheckExtension ((const GLubyte *) "GL_EXT_blend_minmax", strExt) || gluCheckExtension ((const GLubyte *) "GL_ARB_imaging", strExt); dCaps[i].fBlendSub = gluCheckExtension ((const GLubyte *) "GL_EXT_blend_subtract", strExt) || gluCheckExtension ((const GLubyte *) "GL_ARB_imaging", strExt); dCaps[i].fCVA = gluCheckExtension ((const GLubyte *) "GL_EXT_compiled_vertex_array", strExt); dCaps[i].fTexLODBias = gluCheckExtension ((const GLubyte *) "GL_EXT_texture_lod_bias", strExt) || (dCaps[i].glVersion >= 0x0140); dCaps[i].fABGR = gluCheckExtension ((const GLubyte *) "GL_EXT_abgr", strExt); dCaps[i].fBGRA = gluCheckExtension ((const GLubyte *) "GL_EXT_bgra", strExt) || (dCaps[i].glVersion >= 0x0120); dCaps[i].fTexFilterAniso = gluCheckExtension ((const GLubyte *) "GL_EXT_texture_filter_anisotropic",strExt); dCaps[i].fPaletteTex = gluCheckExtension ((const GLubyte *) "GL_EXT_paletted_texture", strExt); dCaps[i].fShareTexPalette = gluCheckExtension ((const GLubyte *) "GL_EXT_shared_texture_palette", strExt); dCaps[i].fSecColor = gluCheckExtension ((const GLubyte *) "GL_EXT_secondary_color", strExt) || (dCaps[i].glVersion >= 0x0140); dCaps[i].fTexCompressS3TC = gluCheckExtension ((const GLubyte *) "GL_EXT_texture_compression_s3tc", strExt); dCaps[i].fTexRect = gluCheckExtension ((const GLubyte *) "GL_EXT_texture_rectangle", strExt); dCaps[i].fFogCoord = gluCheckExtension ((const GLubyte *) "GL_EXT_fog_coord", strExt); dCaps[i].fDrawRangeElements = gluCheckExtension ((const GLubyte *) "GL_EXT_draw_range_elements", strExt); dCaps[i].fStencilWrap = gluCheckExtension ((const GLubyte *) "GL_EXT_stencil_wrap", strExt) || (dCaps[i].glVersion >= 0x0140); dCaps[i].fBlendFuncSep = gluCheckExtension ((const GLubyte *) "GL_EXT_blend_func_separate", strExt) || (dCaps[i].glVersion >= 0x0140); dCaps[i].fMultiDrawArrays = gluCheckExtension ((const GLubyte *) "GL_EXT_multi_draw_arrays", strExt) || (dCaps[i].glVersion >= 0x0140); dCaps[i].fShadowFunc = gluCheckExtension ((const GLubyte *) "GL_EXT_shadow_funcs", strExt); dCaps[i].fStencil2Side = gluCheckExtension ((const GLubyte *) "GL_EXT_stencil_two_side", strExt) || (dCaps[i].glVersion >= 0x0140); dCaps[i].fColorSubtable = gluCheckExtension ((const GLubyte *) "GL_EXT_color_subtable", strExt) || gluCheckExtension ((const GLubyte *) "GL_ARB_imaging", strExt); dCaps[i].fConvolution = gluCheckExtension ((const GLubyte *) "GL_EXT_convolution", strExt) || gluCheckExtension ((const GLubyte *) "GL_ARB_imaging", strExt); dCaps[i].fHistogram = gluCheckExtension ((const GLubyte *) "GL_EXT_histogram", strExt) || gluCheckExtension ((const GLubyte *) "GL_ARB_imaging", strExt); dCaps[i].fColorTable = gluCheckExtension ((const GLubyte *) "GL_SGI_color_table", strExt) || gluCheckExtension ((const GLubyte *) "GL_ARB_imaging", strExt); dCaps[i].fColorMatrix = gluCheckExtension ((const GLubyte *) "GL_SGI_color_matrix", strExt) || gluCheckExtension ((const GLubyte *) "GL_ARB_imaging", strExt); dCaps[i].fTexEdgeClamp = gluCheckExtension ((const GLubyte *) "GL_SGIS_texture_edge_clamp", strExt) || (dCaps[i].glVersion >= 0x0120); dCaps[i].fGenMipmap = gluCheckExtension ((const GLubyte *) "GL_SGIS_generate_mipmap", strExt); dCaps[i].fTexLOD = gluCheckExtension ((const GLubyte *) "GL_SGIS_texture_lod", strExt) || (dCaps[i].glVersion >= 0x0120); dCaps[i].fPointCull = gluCheckExtension ((const GLubyte *) "GL_ATI_point_cull_mode", strExt); dCaps[i].fTexMirrorOnce = gluCheckExtension ((const GLubyte *) "GL_ATI_texture_mirror_once", strExt); dCaps[i].fPNtriangles = gluCheckExtension ((const GLubyte *) "GL_ATI_pn_triangles", strExt) || gluCheckExtension ((const GLubyte *) "GL_ATIX_pn_triangles", strExt); dCaps[i].fTextFragShader = gluCheckExtension ((const GLubyte *) "GL_ATI_text_fragment_shader", strExt); dCaps[i].fATIBlendEqSep = gluCheckExtension ((const GLubyte *) "GL_ATI_blend_equation_separate", strExt); dCaps[i].fBlendWeightMinMax = gluCheckExtension ((const GLubyte *) "GL_ATI_blend_weighted_minmax", strExt); dCaps[i].fCombine3 = gluCheckExtension ((const GLubyte *) "GL_ATI_texture_env_combine3", strExt); dCaps[i].fSepStencil = gluCheckExtension ((const GLubyte *) "GL_ATI_separate_stencil", strExt); dCaps[i].fArrayRevComps4Byte = gluCheckExtension ((const GLubyte *) "GL_ATI_array_rev_comps_in_4_bytes",strExt); dCaps[i].fNVPointSprite = gluCheckExtension ((const GLubyte *) "GL_NV_point_sprite", strExt); dCaps[i].fRegCombiners = gluCheckExtension ((const GLubyte *) "GL_NV_register_combiners", strExt); dCaps[i].fRegCombiners2 = gluCheckExtension ((const GLubyte *) "GL_NV_register_combiners2", strExt); dCaps[i].fTexEnvCombine4 = gluCheckExtension ((const GLubyte *) "GL_NV_texture_env_combine4", strExt); dCaps[i].fBlendSquare = gluCheckExtension ((const GLubyte *) "GL_NV_blend_square", strExt) || (dCaps[i].glVersion >= 0x0140); dCaps[i].fFogDist = gluCheckExtension ((const GLubyte *) "GL_NV_fog_distance", strExt); dCaps[i].fMultisampleFilterHint = gluCheckExtension ((const GLubyte *) "GL_NV_multisample_filter_hint", strExt); dCaps[i].fTexGenReflect = gluCheckExtension ((const GLubyte *) "GL_NV_texgen_reflection", strExt); dCaps[i].fTexShader = gluCheckExtension ((const GLubyte *) "GL_NV_texture_shader", strExt); dCaps[i].fTexShader2 = gluCheckExtension ((const GLubyte *) "GL_NV_texture_shader2", strExt); dCaps[i].fTexShader3 = gluCheckExtension ((const GLubyte *) "GL_NV_texture_shader3", strExt); dCaps[i].fDepthClamp = gluCheckExtension ((const GLubyte *) "GL_NV_depth_clamp", strExt); dCaps[i].fLightMaxExp = gluCheckExtension ((const GLubyte *) "GL_NV_light_max_exponent", strExt); dCaps[i].fRasterPosClip = gluCheckExtension ((const GLubyte *) "GL_IBM_rasterpos_clip", strExt); dCaps[i].fConvBorderModes = gluCheckExtension ((const GLubyte *) "GL_HP_convolution_border_modes", strExt) || gluCheckExtension ((const GLubyte *) "GL_ARB_imaging", strExt); dCaps[i].fAuxDeptStencil = gluCheckExtension ((const GLubyte *) "GL_APPLE_aux_depth_stencil", strExt); dCaps[i].fFlushBufferRange = gluCheckExtension ((const GLubyte *) "GL_APPLE_flush_buffer_range", strExt); dCaps[i].fObjectPurgeable = gluCheckExtension ((const GLubyte *) "GL_APPLE_object_purgeable", strExt); dCaps[i].fDrawBuffers = gluCheckExtension ((const GLubyte *) "GL_ARB_draw_buffers", strExt) || (dCaps[i].glVersion >= 0x0200); dCaps[i].fFragmentProgShadow = gluCheckExtension ((const GLubyte *) "GL_ARB_fragment_program_shadow", strExt); dCaps[i].fFragmentShader = gluCheckExtension ((const GLubyte *) "GL_ARB_fragment_shader", strExt) || (dCaps[i].glVersion >= 0x0200); dCaps[i].fHalfFloatPixel = gluCheckExtension ((const GLubyte *) "GL_ARB_half_float_pixel", strExt); dCaps[i].fOcclusionQuery = gluCheckExtension ((const GLubyte *) "GL_ARB_occlusion_query", strExt) || (dCaps[i].glVersion >= 0x0150); dCaps[i].fPBO = gluCheckExtension ((const GLubyte *) "GL_ARB_pixel_buffer_object", strExt) || (dCaps[i].glVersion >= 0x0210); dCaps[i].fPointSprite = gluCheckExtension ((const GLubyte *) "GL_ARB_point_sprite", strExt) || (dCaps[i].glVersion >= 0x0200); dCaps[i].fShaderObjects = gluCheckExtension ((const GLubyte *) "GL_ARB_shader_objects", strExt) || (dCaps[i].glVersion >= 0x0200); dCaps[i].fShaderTextureLOD = gluCheckExtension ((const GLubyte *) "GL_ARB_shader_texture_lod", strExt); dCaps[i].fShadingLanguage100 = gluCheckExtension ((const GLubyte *) "GL_ARB_shading_language_100", strExt) || (dCaps[i].glVersion >= 0x0200); dCaps[i].fTexFloat = gluCheckExtension ((const GLubyte *) "GL_ARB_texture_float", strExt); dCaps[i].fTexNPOT = gluCheckExtension ((const GLubyte *) "GL_ARB_texture_non_power_of_two", strExt) || (dCaps[i].glVersion >= 0x0200); dCaps[i].fVBO = gluCheckExtension ((const GLubyte *) "GL_ARB_vertex_buffer_object", strExt) || (dCaps[i].glVersion >= 0x0150); dCaps[i].fVertexShader = gluCheckExtension ((const GLubyte *) "GL_ARB_vertex_shader", strExt) || (dCaps[i].glVersion >= 0x0200); dCaps[i].fTexComp3dc = gluCheckExtension ((const GLubyte *) "GL_ATI_texture_compression_3dc", strExt); dCaps[i].fTexATIfloat = gluCheckExtension ((const GLubyte *) "GL_ATI_texture_float", strExt); dCaps[i].fBlendEqSep = gluCheckExtension ((const GLubyte *) "GL_EXT_blend_equation_separate", strExt) || (dCaps[i].glVersion >= 0x0200); dCaps[i].fDepthBounds = gluCheckExtension ((const GLubyte *) "GL_EXT_depth_bounds_test", strExt); dCaps[i].fFBOblit = gluCheckExtension ((const GLubyte *) "GL_EXT_framebuffer_blit", strExt); dCaps[i].fFBO = gluCheckExtension ((const GLubyte *) "GL_EXT_framebuffer_object", strExt); dCaps[i].fGeometryShader4 = gluCheckExtension ((const GLubyte *) "GL_EXT_geometry_shader4", strExt); dCaps[i].fGPUProgParams = gluCheckExtension ((const GLubyte *) "GL_EXT_gpu_program_parameters", strExt); dCaps[i].fGPUShader4 = gluCheckExtension ((const GLubyte *) "GL_EXT_gpu_shader4", strExt); dCaps[i].fDepthStencil = gluCheckExtension ((const GLubyte *) "GL_EXT_packed_depth_stencil", strExt); dCaps[i].fSepSpecColor = gluCheckExtension ((const GLubyte *) "GL_EXT_separate_specular_color", strExt) || (dCaps[i].glVersion >= 0x0120); dCaps[i].fTexCompDXT1 = gluCheckExtension ((const GLubyte *) "GL_EXT_texture_compression_dxt1", strExt); dCaps[i].fTexMirrorClamp = gluCheckExtension ((const GLubyte *) "GL_EXT_texture_mirror_clamp", strExt); dCaps[i].fTexSRGB = gluCheckExtension ((const GLubyte *) "GL_EXT_texture_sRGB", strExt) || (dCaps[i].glVersion >= 0x0210); if (dCaps[i].fTexRect) // only check if extension supported glGetIntegerv (GL_MAX_RECTANGLE_TEXTURE_SIZE_EXT, &dCaps[i].maxRectTextureSize); else dCaps[i].maxRectTextureSize = 0; CGLDestroyContext (cglContext); } } CGLSetCurrentContext (curr_ctx); // reset current CGL context } } }
screenshot* capture() { CGContextRef bitmap; CGImageRef image; void * data; long bytewidth; GLint width, height; long bytes; CGColorSpaceRef cSpace = CGColorSpaceCreateWithName (kCGColorSpaceGenericRGB); CGLContextObj glContextObj; CGLPixelFormatObj pixelFormatObj ; long numPixelFormats ; CGLPixelFormatAttribute attribs[] = { kCGLPFAFullScreen, kCGLPFADisplayMask, 0, /* Display mask bit goes here */ 0 } ; if ( display == kCGNullDirectDisplay ) display = CGMainDisplayID(); attribs[2] = CGDisplayIDToOpenGLDisplayMask(display); /* Build a full-screen GL context */ CGLChoosePixelFormat( attribs, &pixelFormatObj, &numPixelFormats ); if ( pixelFormatObj == NULL ) // No full screen context support return NULL; CGLCreateContext( pixelFormatObj, NULL, &glContextObj ) ; CGLDestroyPixelFormat( pixelFormatObj ) ; if ( glContextObj == NULL ) return NULL; CGLSetCurrentContext( glContextObj ) ; CGLSetFullScreen( glContextObj ) ; glReadBuffer(GL_FRONT); width = srcRect.size.width; height = srcRect.size.height; bytewidth = width * 4; // Assume 4 bytes/pixel for now bytewidth = (bytewidth + 3) & ~3; // Align to 4 bytes bytes = bytewidth * height; // width * height /* Build bitmap context */ data = malloc(height * bytewidth); if ( data == NULL ) { CGLSetCurrentContext( NULL ); CGLClearDrawable( glContextObj ); // disassociate from full screen CGLDestroyContext( glContextObj ); // and destroy the context return NULL; } bitmap = CGBitmapContextCreate(data, width, height, 8, bytewidth, cSpace, kCGImageAlphaNoneSkipFirst /* XRGB */); CFRelease(cSpace); /* Read framebuffer into our bitmap */ glFinish(); /* Finish all OpenGL commands */ glPixelStorei(GL_PACK_ALIGNMENT, 4); /* Force 4-byte alignment */ glPixelStorei(GL_PACK_ROW_LENGTH, 0); glPixelStorei(GL_PACK_SKIP_ROWS, 0); glPixelStorei(GL_PACK_SKIP_PIXELS, 0); /* * Fetch the data in XRGB format, matching the bitmap context. */ glReadPixels( (GLint) srcRect.origin.x, (GLint)srcRect.origin.y, width, height, GL_BGRA, #ifdef __BIG_ENDIAN__ GL_UNSIGNED_INT_8_8_8_8_REV, // for PPC #else GL_UNSIGNED_INT_8_8_8_8, // for Intel! http://lists.apple.com/archives/quartz-dev/2006/May/msg00100.html #endif data); /* * glReadPixels generates a quadrant I raster, with origin in the lower left * This isn't a problem for signal processing routines such as compressors, * as they can simply use a negative 'advance' to move between scanlines. * CGImageRef and CGBitmapContext assume a quadrant III raster, though, so we need to * invert it. Pixel reformatting can also be done here. */ swizzleBitmap(data, bytewidth, height); /* Make an image out of our bitmap; does a cheap vm_copy of the bitmap */ image = CGBitmapContextCreateImage(bitmap); /* Get rid of bitmap */ CFRelease(bitmap); free(data); /* Get rid of GL context */ CGLSetCurrentContext( NULL ); CGLClearDrawable( glContextObj ); // disassociate from full screen CGLDestroyContext( glContextObj ); // and destroy the context /* Returned image has a reference count of 1 */ return image; }
~CGLImpl() { CGLDestroyContext(glContext); }
int doMain (int argc, char **argv) { int dummy; // OSG init OSG::osgInit(argc, argv); // create the graph // beacon for camera and light OSG::NodeUnrecPtr b1n = OSG::Node::create(); OSG::GroupUnrecPtr b1 = OSG::Group::create(); b1n->setCore( b1 ); // transformation OSG::NodeUnrecPtr t1n = OSG::Node::create(); OSG::TransformUnrecPtr t1 = OSG::Transform::create(); t1n->setCore( t1 ); t1n->addChild( b1n ); cam_trans = t1; // light OSG::NodeUnrecPtr dlight = OSG::Node::create(); OSG::DirectionalLightUnrecPtr dl = OSG::DirectionalLight::create(); dlight->setCore( dl ); dl->setAmbient( .3, .3, .3, 1 ); dl->setDiffuse( 1, 1, 1, 1 ); dl->setDirection(0,0,1); dl->setBeacon( b1n); // root root = OSG::Node::create(); OSG::GroupUnrecPtr gr1 = OSG::Group::create(); root->setCore( gr1 ); root->addChild( t1n ); root->addChild( dlight ); // Load the file OSG::NodeUnrecPtr file = NULL; if ( argc > 1 ) file = OSG::SceneFileHandler::the()->read(argv[1]); if ( file == NULL ) { std::cerr << "Couldn't load file, ignoring" << std::endl; file = OSG::makeTorus( .5, 2, 16, 16 ); } OSG::Thread::getCurrentChangeList()->commitChanges(); file->updateVolume(); OSG::Vec3f min,max; file->getVolume().getBounds( min, max ); std::cout << "Volume: from " << min << " to " << max << std::endl; dlight->addChild( file ); std::cerr << "Tree: " << std::endl; //root->dump(); // Camera cam = OSG::PerspectiveCamera::create(); cam->setBeacon( b1n ); cam->setFov( OSG::osgDegree2Rad( 90 ) ); cam->setNear( 0.1 ); cam->setFar( 100000 ); // Background OSG::SolidBackgroundUnrecPtr bkgnd = OSG::SolidBackground::create(); bkgnd->setColor(OSG::Color3f(0,0,1)); // Viewport vp = OSG::Viewport::create(); vp->setCamera( cam ); vp->setBackground( bkgnd ); vp->setRoot( root ); vp->setSize( 0,0, 1,1 ); // Action ract = OSG::RenderAction::create(); // tball OSG::Vec3f pos; pos.setValues(min[0] + ((max[0] - min[0]) * 0.5), min[1] + ((max[1] - min[1]) * 0.5), max[2] + ( max[2] - min[2] ) * 1.5 ); float scale = (max[2] - min[2] + max[1] - min[1] + max[0] - min[0]) / 6; OSG::Pnt3f tCenter(min[0] + (max[0] - min[0]) / 2, min[1] + (max[1] - min[1]) / 2, min[2] + (max[2] - min[2]) / 2); tball.setMode( OSG::Trackball::OSGObject ); tball.setStartPosition( pos, true ); tball.setSum( true ); tball.setTranslationMode( OSG::Trackball::OSGFree ); tball.setTranslationScale(scale); tball.setRotationCenter(tCenter); // CoreGL init // Install event handler EventHandlerUPP eventHandlerUPP = NewEventHandlerUPP(eventHandler); EventTypeSpec eventList[] = { { kEventClassTextInput, kEventTextInputUnicodeForKeyEvent }, { kEventClassMouse, kEventMouseDown }, { kEventClassMouse, kEventMouseUp }, { kEventClassMouse, kEventMouseDragged } }; InstallApplicationEventHandler(eventHandlerUPP, GetEventTypeCount(eventList), eventList, 0, 0); CGDisplayCapture(kCGDirectMainDisplay); CGLPixelFormatAttribute attribs[] = { kCGLPFADoubleBuffer, kCGLPFAFullScreen, kCGLPFADepthSize, (CGLPixelFormatAttribute)16, kCGLPFADisplayMask, (CGLPixelFormatAttribute)CGDisplayIDToOpenGLDisplayMask(kCGDirectMainDisplay), (CGLPixelFormatAttribute)0 }; CGLPixelFormatObj pixelFormatObj; GLint numPixelFormats; CGLChoosePixelFormat(attribs, &pixelFormatObj, &numPixelFormats); CGLContextObj contextObj; CGLCreateContext(pixelFormatObj, 0, &contextObj); CGLDestroyPixelFormat(pixelFormatObj); CGLSetCurrentContext(contextObj); CGLSetFullScreen(contextObj); // Create OpenSG window win = OSG::CoreGLWindow::create(); win->addPort( vp ); win->setContext ( contextObj ); win->init(); win->resize( CGDisplayPixelsWide(kCGDirectMainDisplay), CGDisplayPixelsHigh(kCGDirectMainDisplay) ); win->activate(); // do some OpenGL init. Will move into State Chunks later. glEnable( GL_DEPTH_TEST ); glEnable( GL_LIGHTING ); glEnable( GL_LIGHT0 ); redraw(); // Main loop ( event dispatching ) RunApplicationEventLoop(); // Cleanup CGLSetCurrentContext(0); CGLClearDrawable(contextObj); CGLDestroyContext(contextObj); CGReleaseAllDisplays(); DisposeEventHandlerUPP(eventHandlerUPP); ract = NULL; win = NULL; root = NULL; file = NULL; vp = NULL; cam_trans = NULL; cam = NULL; return 0; }
i_img * imss_darwin(i_img_dim left, i_img_dim top, i_img_dim right, i_img_dim bottom) { CGDisplayCount count; CGDisplayErr err; CGRect rect; CGLPixelFormatObj pix; GLint npix; CGLContextObj ctx; i_img *im; CGDirectDisplayID disp; i_img_dim screen_width, screen_height; i_img_dim width, height; CGLPixelFormatAttribute pix_attrs[] = { kCGLPFADisplayMask, 0, /* filled in later */ kCGLPFAColorSize, 24, kCGLPFAAlphaSize, 0, kCGLPFAFullScreen, 0 }; i_clear_error(); disp = CGMainDisplayID(); if (!disp) { i_push_error(0, "No main display"); return NULL; } /* for now, only interested in the first display */ rect = CGDisplayBounds(disp); screen_width = rect.size.width; screen_height = rect.size.height; /* adjust negative/zero values to window size */ if (left < 0) left += screen_width; if (top < 0) top += screen_height; if (right <= 0) right += screen_width; if (bottom <= 0) bottom += screen_height; /* clamp */ if (left < 0) left = 0; if (right > screen_width) right = screen_width; if (top < 0) top = 0; if (bottom > screen_height) bottom = screen_height; /* validate */ if (right <= left || bottom <= top) { i_push_error(0, "image would be empty"); return NULL; } width = right - left; height = bottom - top; /* select a pixel format */ pix_attrs[1] = CGDisplayIDToOpenGLDisplayMask(disp); err = CGLChoosePixelFormat(pix_attrs, &pix, &npix); if (err) { i_push_errorf(err, "CGLChoosePixelFormat: %d", (int)err); return NULL; } if (!npix) { i_push_error(0, "No pixel format found - hidden display?"); return NULL; } /* make ourselves a context */ err = CGLCreateContext(pix, NULL, &ctx); CGLDestroyPixelFormat(pix); if (err) { i_push_errorf(err, "CGLCreateContext: %d", (int)err); return NULL; } err = CGLSetCurrentContext(ctx); if (err) { i_push_errorf(err, "CGLSetCurrentContext: %d", (int)err); return NULL; } err = CGLSetFullScreen(ctx); if (err) { i_push_errorf(err, "CGLSetFullScreen: %d", (int)err); return NULL; } /* capture */ im = i_img_8_new(width, height, 3); if (im) { size_t line_size = width * 4; size_t buf_size = line_size * height; unsigned char *buf = malloc(buf_size); i_img_dim y = height - 1; i_color *bufp = (i_color *)buf; /* hackish */ /* GL has the vertical axis going from bottom to top, so translate it */ glReadBuffer(GL_FRONT); glReadPixels(left, screen_height - top - height, width, height, GL_RGBA, GL_UNSIGNED_BYTE, buf); /* transfer */ while (y >= 0) { i_plin(im, 0, width, y, bufp); bufp += width; --y; } free(buf); i_tags_setn(&im->tags, "ss_window_width", width); i_tags_setn(&im->tags, "ss_window_height", height); i_tags_set(&im->tags, "ss_type", "Darwin", 6); i_tags_set(&im->tags, "ss_variant", "<11", 3); i_tags_setn(&im->tags, "ss_left", left); i_tags_setn(&im->tags, "ss_top", top); } /* clean up */ CGLSetCurrentContext(NULL); CGLDestroyContext(ctx); return im; }
void _glfwPlatformCloseWindow( void ) { if( _glfwWin.mouseUPP != NULL ) { DisposeEventHandlerUPP( _glfwWin.mouseUPP ); _glfwWin.mouseUPP = NULL; } if( _glfwWin.commandUPP != NULL ) { DisposeEventHandlerUPP( _glfwWin.commandUPP ); _glfwWin.commandUPP = NULL; } if( _glfwWin.keyboardUPP != NULL ) { DisposeEventHandlerUPP( _glfwWin.keyboardUPP ); _glfwWin.keyboardUPP = NULL; } if( _glfwWin.windowUPP != NULL ) { DisposeEventHandlerUPP( _glfwWin.windowUPP ); _glfwWin.windowUPP = NULL; } if( _glfwWin.fullscreen ) { if( _glfwWin.cglContext != NULL ) { CGLSetCurrentContext( NULL ); CGLClearDrawable( _glfwWin.cglContext ); CGLDestroyContext( _glfwWin.cglContext ); CGReleaseAllDisplays(); _glfwWin.cglContext = NULL; } if( _glfwWin.cglPixelFormat != NULL ) { CGLDestroyPixelFormat( _glfwWin.cglPixelFormat ); _glfwWin.cglPixelFormat = NULL; } } else { if( _glfwWin.aglContext != NULL ) { aglSetCurrentContext( NULL ); aglSetDrawable( _glfwWin.aglContext, NULL ); aglDestroyContext( _glfwWin.aglContext ); _glfwWin.aglContext = NULL; } if( _glfwWin.aglPixelFormat != NULL ) { aglDestroyPixelFormat( _glfwWin.aglPixelFormat ); _glfwWin.aglPixelFormat = NULL; } } if( _glfwWin.window != NULL ) { ReleaseWindow( _glfwWin.window ); _glfwWin.window = NULL; } }