diff options
Diffstat (limited to 'src/drivers/Cocoa')
| -rw-r--r-- | src/drivers/Cocoa/Fl_Cocoa_Window_Driver.H | 1 | ||||
| -rw-r--r-- | src/drivers/Cocoa/Fl_Cocoa_Window_Driver.cxx | 58 |
2 files changed, 36 insertions, 23 deletions
diff --git a/src/drivers/Cocoa/Fl_Cocoa_Window_Driver.H b/src/drivers/Cocoa/Fl_Cocoa_Window_Driver.H index 1f58e2c16..08a8ce42c 100644 --- a/src/drivers/Cocoa/Fl_Cocoa_Window_Driver.H +++ b/src/drivers/Cocoa/Fl_Cocoa_Window_Driver.H @@ -104,6 +104,7 @@ public: virtual void draw_end(); virtual void make_current(); virtual void label(const char *name, const char *mininame); + virtual void destroy_double_buffer(); virtual void show(); virtual void resize(int X,int Y,int W,int H); virtual void hide(); diff --git a/src/drivers/Cocoa/Fl_Cocoa_Window_Driver.cxx b/src/drivers/Cocoa/Fl_Cocoa_Window_Driver.cxx index 372cb9aa0..59a4c538c 100644 --- a/src/drivers/Cocoa/Fl_Cocoa_Window_Driver.cxx +++ b/src/drivers/Cocoa/Fl_Cocoa_Window_Driver.cxx @@ -3,7 +3,7 @@ // // Definition of Apple Cocoa window driver. // -// Copyright 1998-2016 by Bill Spitzak and others. +// Copyright 1998-2017 by Bill Spitzak and others. // // This library is free software. Distribution and use rights are outlined in // the file "COPYING" which should have been included with this file. If this @@ -22,10 +22,11 @@ #include "../Quartz/Fl_Quartz_Graphics_Driver.H" #include <FL/Fl_Double_Window.H> #include <FL/Fl_Overlay_Window.H> +#include <FL/Fl_Image_Surface.H> #include <FL/fl_draw.H> #include <FL/Fl.H> #include <FL/x.H> - +#include <ApplicationServices/ApplicationServices.h> Fl_Window_Driver *Fl_Window_Driver::newWindowDriver(Fl_Window *w) { @@ -65,33 +66,44 @@ void Fl_Cocoa_Window_Driver::flush_overlay() if (!oWindow->shown()) return; pWindow->make_current(); // make sure fl_gc is non-zero - Fl_X *myi = Fl_X::i(pWindow); - if (!myi) return; // window not yet created - if (!other_xid) { - other_xid = fl_create_offscreen(oWindow->w(), oWindow->h()); - oWindow->clear_damage(FL_DAMAGE_ALL); + Fl_Quartz_Graphics_Driver *g_driver = (Fl_Quartz_Graphics_Driver*)&Fl_Graphics_Driver::default_driver(); + float s = g_driver->scale() * (mapped_to_retina() ? 2 : 1); + if (!other_xid) { // create offscreen accounting for GUI scaling and retina + other_xid = (Fl_Offscreen)new Fl_Image_Surface(s * oWindow->w(), s * oWindow->h()); + oWindow->clear_damage(FL_DAMAGE_ALL); + // scale the offscreen buffer's graphics context + Fl_Surface_Device::push_current((Fl_Image_Surface*)other_xid); + CGContextRestoreGState(fl_gc); + CGContextScaleCTM(fl_gc, s, s); + CGContextSaveGState(fl_gc); + Fl_Surface_Device::pop_current(); + } + if (oWindow->damage() & ~FL_DAMAGE_EXPOSE) { + Fl_X *myi = Fl_X::i(pWindow); + fl_clip_region(myi->region); myi->region = 0; + Fl_Surface_Device::push_current((Fl_Image_Surface*)other_xid); + draw(); + Fl_Surface_Device::pop_current(); } - if (oWindow->damage() & ~FL_DAMAGE_EXPOSE) { - fl_clip_region(myi->region); myi->region = 0; - if ( other_xid ) { - fl_begin_offscreen( other_xid ); - fl_clip_region( 0 ); - draw(); - fl_end_offscreen(); - } else { - draw(); - } - } if (erase_overlay) fl_clip_region(0); - // on Irix (at least) it is faster to reduce the area copied to - // the current clip region: - int X,Y,W,H; fl_clip_box(0,0,oWindow->w(),oWindow->h(),X,Y,W,H); - if (other_xid) fl_copy_offscreen(X, Y, W, H, other_xid, X, Y); - + if (other_xid) { + CGContextSaveGState(fl_gc); + CGContextScaleCTM(fl_gc, 1/s, 1/s); + // copy offscreen to window using adequate scaling + fl_copy_offscreen(0, 0, s * oWindow->w(),s * oWindow->h(), ((Fl_Image_Surface*)other_xid)->offscreen(), 0, 0); + CGContextRestoreGState(fl_gc); + } if (overlay() == oWindow) oWindow->draw_overlay(); } +void Fl_Cocoa_Window_Driver::destroy_double_buffer() +{ + if (pWindow->as_overlay_window()) delete (Fl_Image_Surface*)other_xid; + other_xid = 0; +} + + void Fl_Cocoa_Window_Driver::draw_begin() { if (!Fl_Surface_Device::surface()->driver()->has_feature(Fl_Graphics_Driver::NATIVE)) return; |
