X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/facd6764872eede45605ba7c9dfa0e1d0c708fa2..ccd67a6af88981a8c1a2b752a14051fe7698814b:/src/mac/carbon/glcanvas.cpp?ds=sidebyside diff --git a/src/mac/carbon/glcanvas.cpp b/src/mac/carbon/glcanvas.cpp index a867fa651f..f1f70a4ecb 100644 --- a/src/mac/carbon/glcanvas.cpp +++ b/src/mac/carbon/glcanvas.cpp @@ -1,42 +1,38 @@ ///////////////////////////////////////////////////////////////////////////// -// Name: glcanvas.cpp -// Purpose: wxGLCanvas, for using OpenGL with wxWindows under Macintosh +// Name: src/mac/carbon/glcanvas.cpp +// Purpose: wxGLCanvas, for using OpenGL with wxWidgets under Macintosh // Author: Stefan Csomor // Modified by: // Created: 1998-01-01 // RCS-ID: $Id$ // Copyright: (c) Stefan Csomor -// Licence: wxWindows licence +// Licence: wxWindows licence ///////////////////////////////////////////////////////////////////////////// -#ifdef __GNUG__ -#pragma implementation "glcanvas.h" -#endif - #include "wx/wxprec.h" #if defined(__BORLANDC__) -#pragma hdrstop + #pragma hdrstop #endif -#include "wx/setup.h" - #if wxUSE_GLCANVAS +#include "wx/glcanvas.h" + #ifndef WX_PRECOMP -#include "wx/frame.h" + #include "wx/frame.h" + #include "wx/log.h" + #include "wx/settings.h" #endif -#include "wx/settings.h" -#include "wx/log.h" - -#include "wx/glcanvas.h" #include "wx/mac/uma.h" // DLL options compatibility check: #include "wx/build.h" WX_CHECK_BUILD_OPTIONS("wxGL") +#include "wx/mac/private.h" + /* * GLContext implementation */ @@ -48,12 +44,12 @@ wxGLContext::wxGLContext( ) { m_window = win; - + m_drawable = (AGLDrawable) UMAGetWindowPort(MAC_WXHWND(win->MacGetTopLevelWindowRef())); - + m_glContext = aglCreateContext(fmt, other ? other->m_glContext : NULL); wxCHECK_RET( m_glContext, wxT("Couldn't create OpenGl context") ); - + GLboolean b; b = aglSetDrawable(m_glContext, m_drawable); wxCHECK_RET( b, wxT("Couldn't bind OpenGl context") ); @@ -151,14 +147,14 @@ wxGLCanvas::~wxGLCanvas() static AGLPixelFormat ChoosePixelFormat(const int *attribList) { GLint data[512]; - GLint defaultAttribs[] = { AGL_RGBA, - AGL_DOUBLEBUFFER, - AGL_MINIMUM_POLICY, + GLint defaultAttribs[] = { AGL_RGBA, + AGL_DOUBLEBUFFER, + AGL_MINIMUM_POLICY, AGL_DEPTH_SIZE, 1, // use largest available depth buffer - AGL_RED_SIZE, 1, - AGL_GREEN_SIZE, 1, - AGL_BLUE_SIZE, 1, - AGL_ALPHA_SIZE, 0, + AGL_RED_SIZE, 1, + AGL_GREEN_SIZE, 1, + AGL_BLUE_SIZE, 1, + AGL_ALPHA_SIZE, 0, AGL_NONE }; GLint *attribs; if (!attribList) @@ -168,7 +164,7 @@ static AGLPixelFormat ChoosePixelFormat(const int *attribList) else { int arg=0, p=0; - + data[p++] = AGL_MINIMUM_POLICY; // make _SIZE tags behave more like GLX while( (attribList[arg]!=0) && (p<512) ) { @@ -191,9 +187,9 @@ static AGLPixelFormat ChoosePixelFormat(const int *attribList) data[p++]=AGL_BLUE_SIZE; data[p++]=attribList[arg++]; break; case WX_GL_MIN_ALPHA: data[p++]=AGL_ALPHA_SIZE; data[p++]=attribList[arg++]; break; - case WX_GL_DEPTH_SIZE: + case WX_GL_DEPTH_SIZE: data[p++]=AGL_DEPTH_SIZE; data[p++]=attribList[arg++]; break; - case WX_GL_STENCIL_SIZE: + case WX_GL_STENCIL_SIZE: data[p++]=AGL_STENCIL_SIZE; data[p++]=attribList[arg++]; break; case WX_GL_MIN_ACCUM_RED: data[p++]=AGL_ACCUM_RED_SIZE; data[p++]=attribList[arg++]; break; @@ -206,12 +202,12 @@ static AGLPixelFormat ChoosePixelFormat(const int *attribList) default: break; } - } - data[p] = 0; - + } + data[p] = 0; + attribs = data; } - + return aglChoosePixelFormat(NULL, 0, attribs); } @@ -219,15 +215,17 @@ bool wxGLCanvas::Create(wxWindow *parent, const wxGLContext *shared, wxWindowID const wxPoint& pos, const wxSize& size, long style, const wxString& name, int *attribList, const wxPalette& palette) { + m_macCanvasIsShown = false ; + m_glContext = 0 ; wxWindow::Create( parent, id, pos, size, style, name ); - + AGLPixelFormat fmt = ChoosePixelFormat(attribList); wxCHECK_MSG( fmt, false, wxT("Couldn't create OpenGl pixel format") ); - + m_glContext = new wxGLContext(fmt, this, palette, shared); m_macCanvasIsShown = true ; aglDestroyPixelFormat(fmt); - + return true; } @@ -249,30 +247,43 @@ void wxGLCanvas::SetViewport() // adjust glViewport to just this window int x = 0 ; int y = 0 ; - + wxWindow* iter = this ; while( iter->GetParent() ) { - iter = iter->GetParent() ; + iter = iter->GetParent() ; } - + if ( iter && iter->IsTopLevel() ) { - MacClientToRootWindow( &x , &y ) ; - int width, height; - GetClientSize(& width, & height); - Rect bounds ; - GetWindowPortBounds( MAC_WXHWND(MacGetTopLevelWindowRef()) , &bounds ) ; - GLint parms[4] ; - parms[0] = x ; - parms[1] = bounds.bottom - bounds.top - ( y + height ) ; - parms[2] = width ; - parms[3] = height ; - - if ( !m_macCanvasIsShown ) - parms[0] += 20000 ; - aglSetInteger( m_glContext->m_glContext , AGL_BUFFER_RECT , parms ) ; - } + MacClientToRootWindow( &x , &y ) ; + int width, height; + GetClientSize(& width, & height); + Rect bounds ; +#if 0 + // TODO in case we adopt point vs pixel coordinates, this will make the conversion + GetWindowPortBounds( MAC_WXHWND(MacGetTopLevelWindowRef()) , &bounds ) ; + HIRect hiRect = CGRectMake( x, y, width, height ) ; + HIRectConvert( &hiRect, kHICoordSpace72DPIGlobal, NULL, kHICoordSpaceScreenPixel, NULL) ; + HIRect hiBounds = CGRectMake( 0, 0, bounds.right - bounds.left , bounds.bottom - bounds.top ) ; + HIRectConvert( &hiBounds, kHICoordSpace72DPIGlobal, NULL, kHICoordSpaceScreenPixel, NULL) ; + GLint parms[4] ; + parms[0] = hiRect.origin.x ; + parms[1] = hiBounds.size.height - (hiRect.origin.y + hiRect.size.height) ; + parms[2] = hiRect.size.width ; + parms[3] = hiRect.size.height ; +#else + GetWindowPortBounds( MAC_WXHWND(MacGetTopLevelWindowRef()) , &bounds ) ; + GLint parms[4] ; + parms[0] = x ; + parms[1] = bounds.bottom - bounds.top - ( y + height ) ; + parms[2] = width ; + parms[3] = height ; +#endif + if ( !m_macCanvasIsShown ) + parms[0] += 20000 ; + aglSetInteger( m_glContext->m_glContext , AGL_BUFFER_RECT , parms ) ; + } } void wxGLCanvas::OnSize(wxSizeEvent& event) @@ -316,11 +327,11 @@ void wxGLCanvas::SetColour(const wxChar *colour) m_glContext->SetColour(colour); } -bool wxGLCanvas::Show(bool show) +bool wxGLCanvas::Show(bool show) { if ( !wxWindow::Show( show ) ) - return FALSE ; - + return false ; +/* if ( !show ) { if ( m_macCanvasIsShown ) @@ -331,18 +342,19 @@ bool wxGLCanvas::Show(bool show) } else { - if ( IsControlVisible( (ControlRef) m_macControl ) && !m_macCanvasIsShown ) + if ( m_peer->IsVisible()&& !m_macCanvasIsShown ) { m_macCanvasIsShown = true ; SetViewport() ; } } - return TRUE ; +*/ + return true ; } -void wxGLCanvas::MacSuperShown( bool show ) +void wxGLCanvas::MacVisibilityChanged() { - if ( !show ) + if ( !MacIsReallyShown() ) { if ( m_macCanvasIsShown ) { @@ -352,14 +364,13 @@ void wxGLCanvas::MacSuperShown( bool show ) } else { - if ( IsControlVisible( (ControlRef) m_macControl ) && !m_macCanvasIsShown ) + if ( !m_macCanvasIsShown ) { m_macCanvasIsShown = true ; SetViewport() ; } } - - wxWindow::MacSuperShown( show ) ; + wxWindowMac::MacVisibilityChanged() ; } //---------------------------------------------------------------------------