/////////////////////////////////////////////////////////////////////////////
-// Name: glcanvas.cpp
+// 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
*/
)
{
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") );
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)
else
{
int arg=0, p=0;
-
+
data[p++] = AGL_MINIMUM_POLICY; // make _SIZE tags behave more like GLX
while( (attribList[arg]!=0) && (p<512) )
{
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;
default:
break;
}
- }
- data[p] = 0;
-
+ }
+ data[p] = 0;
+
attribs = data;
}
-
+
return aglChoosePixelFormat(NULL, 0, attribs);
}
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;
}
// 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)
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 )
}
else
{
- if ( IsControlVisible( *m_peer ) && !m_macCanvasIsShown )
+ if ( m_peer->IsVisible()&& !m_macCanvasIsShown )
{
m_macCanvasIsShown = true ;
SetViewport() ;
}
}
*/
- return TRUE ;
+ return true ;
}
-void wxGLCanvas::MacVisibilityChanged()
+void wxGLCanvas::MacVisibilityChanged()
{
- if ( !IsControlVisible( *m_peer ) )
+ if ( !MacIsReallyShown() )
{
if ( m_macCanvasIsShown )
{