diff --git a/common/gal/opengl/opengl_gal.cpp b/common/gal/opengl/opengl_gal.cpp index 462e10cde4..d993e84d29 100644 --- a/common/gal/opengl/opengl_gal.cpp +++ b/common/gal/opengl/opengl_gal.cpp @@ -70,6 +70,10 @@ OPENGL_GAL::OPENGL_GAL( wxWindow* aParent, wxEvtHandler* aMouseListener, isGrouping = false; groupCounter = 0; +#ifdef __APPLE__ + SetViewWantsBestResolution( true ); +#endif + // Connecting the event handlers Connect( wxEVT_PAINT, wxPaintEventHandler( OPENGL_GAL::onPaint ) ); @@ -122,10 +126,16 @@ void OPENGL_GAL::BeginDrawing() SetCurrent( *glContext ); clientDC = new wxClientDC( this ); +#ifdef __APPLE__ + const float scaleFactor = GetBackingScaleFactor(); +#else + const float scaleFactor = 1.0f; +#endif + // Set up the view port glMatrixMode( GL_PROJECTION ); glLoadIdentity(); - glViewport( 0, 0, (GLsizei) screenSize.x, (GLsizei) screenSize.y ); + glViewport( 0, 0, (GLsizei) screenSize.x * scaleFactor, (GLsizei) screenSize.y * scaleFactor ); // Create the screen transformation glOrtho( 0, (GLint) screenSize.x, 0, (GLsizei) screenSize.y, @@ -528,8 +538,14 @@ void OPENGL_GAL::ResizeScreen( int aWidth, int aHeight ) { screenSize = VECTOR2I( aWidth, aHeight ); +#ifdef __APPLE__ + const float scaleFactor = GetBackingScaleFactor(); +#else + const float scaleFactor = 1.0f; +#endif + // Resize framebuffers - compositor.Resize( aWidth, aHeight ); + compositor.Resize( aWidth * scaleFactor, aHeight * scaleFactor ); isFramebufferInitialized = false; wxGLCanvas::SetSize( aWidth, aHeight ); @@ -731,6 +747,7 @@ void OPENGL_GAL::DrawCursor( const VECTOR2D& aCursorPosition ) // Now we should only store the position of the mouse cursor // The real drawing routines are in blitCursor() VECTOR2D screenCursor = worldScreenMatrix * aCursorPosition; + cursorPosition = screenWorldMatrix * VECTOR2D( screenCursor.x, screenSize.y - screenCursor.y ); } diff --git a/patches/wxwidgets-3.0.2_macosx_retina_opengl.patch b/patches/wxwidgets-3.0.2_macosx_retina_opengl.patch new file mode 100644 index 0000000000..079d033cbf --- /dev/null +++ b/patches/wxwidgets-3.0.2_macosx_retina_opengl.patch @@ -0,0 +1,37 @@ +--- include/wx/osx/glcanvas.h 2015-05-16 15:40:21.000000000 +0200 ++++ include/wx/osx/glcanvas.h 2015-05-16 16:44:53.000000000 +0200 +@@ -88,6 +88,9 @@ public: + // update the view port of the current context to match this window + void SetViewport(); + ++ void SetViewWantsBestResolution( bool aValue ); ++ bool GetViewWantsBestResolution(); ++ float GetBackingScaleFactor(); + + // deprecated methods + // ------------------ +--- src/osx/cocoa/glcanvas.mm 2015-05-16 15:40:24.000000000 +0200 ++++ src/osx/cocoa/glcanvas.mm 2015-05-16 17:10:50.000000000 +0200 +@@ -313,6 +313,22 @@ bool wxGLCanvas::SwapBuffers() + return true; + } + ++void wxGLCanvas::SetViewWantsBestResolution( bool aValue ) ++{ ++ [GetHandle() setWantsBestResolutionOpenGLSurface:aValue]; ++} ++ ++bool wxGLCanvas::GetViewWantsBestResolution() ++{ ++ return [GetHandle() wantsBestResolutionOpenGLSurface]; ++} ++ ++float wxGLCanvas::GetBackingScaleFactor() ++{ ++ return [[GetHandle() window] backingScaleFactor]; ++} ++ ++ + bool wxGLContext::SetCurrent(const wxGLCanvas& win) const + { + if ( !m_glContext ) diff --git a/scripts/osx_build_wx.sh b/scripts/osx_build_wx.sh index e12acc4743..1714a5683a 100644 --- a/scripts/osx_build_wx.sh +++ b/scripts/osx_build_wx.sh @@ -140,6 +140,8 @@ echo "*** Patching wxWidgets..." doPatch "$1" "$3/patches/wxwidgets-3.0.0_macosx.patch" doPatch "$1" "$3/patches/wxwidgets-3.0.0_macosx_bug_15908.patch" doPatch "$1" "$3/patches/wxwidgets-3.0.0_macosx_soname.patch" +# high resolution in OpenGL canvas: http://trac.wxwidgets.org/ticket/15700 +doPatch "$1" "$3/patches/wxwidgets-3.0.2_macosx_opengl_retina.patch" # configure and build wxWidgets wxWidgets_configure "$1" "$2" "$4"