summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/Fl_cocoa.mm4
-rw-r--r--src/drivers/Cocoa/Fl_Cocoa_Window_Driver.H1
-rw-r--r--src/drivers/Cocoa/Fl_Cocoa_Window_Driver.cxx58
-rw-r--r--src/drivers/Quartz/Fl_Quartz_Graphics_Driver_rect.cxx13
-rw-r--r--src/drivers/Quartz/Fl_Quartz_Image_Surface_Driver.cxx8
5 files changed, 43 insertions, 41 deletions
diff --git a/src/Fl_cocoa.mm b/src/Fl_cocoa.mm
index b36ca5ae8..8cbf3aca9 100644
--- a/src/Fl_cocoa.mm
+++ b/src/Fl_cocoa.mm
@@ -3349,6 +3349,10 @@ void Fl_Cocoa_Window_Driver::make_current()
fl_window = i->xid;
((Fl_Quartz_Graphics_Driver&)Fl_Graphics_Driver::default_driver()).high_resolution( mapped_to_retina() );
+ if (pWindow->as_overlay_window() && other_xid && changed_resolution()) {
+ destroy_double_buffer();
+ changed_resolution(false);
+ }
NSGraphicsContext *nsgc;
#if MAC_OS_X_VERSION_MAX_ALLOWED >= MAC_OS_X_VERSION_10_4
if (fl_mac_os_version >= 100400)
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;
diff --git a/src/drivers/Quartz/Fl_Quartz_Graphics_Driver_rect.cxx b/src/drivers/Quartz/Fl_Quartz_Graphics_Driver_rect.cxx
index 4bfaa39dc..2a223bb9c 100644
--- a/src/drivers/Quartz/Fl_Quartz_Graphics_Driver_rect.cxx
+++ b/src/drivers/Quartz/Fl_Quartz_Graphics_Driver_rect.cxx
@@ -296,19 +296,6 @@ void Fl_Quartz_Graphics_Driver::restore_clip() {
CGContextRestoreGState(gc_);
CGContextSaveGState(gc_);
}
- // FLTK has only one global graphics state.
- // This copies the FLTK state into the current Quartz context
- if ( ! fl_window ) { // a bitmap context
- CGFloat hgt = CGBitmapContextGetHeight(gc_);
- CGAffineTransform at = CGContextGetCTM(gc_);
- CGFloat offset = 0.5;
- if (at.a != 1 && at.a == at.d && at.b == 0 && at.c == 0) { // proportional scaling, no rotation
- hgt /= at.a;
- offset /= at.a;
- }
- CGContextTranslateCTM(gc_, offset, hgt-offset);
- CGContextScaleCTM(gc_, 1.0f, -1.0f); // now 0,0 is top-left point of the context
- }
color(color());
quartz_restore_line_style();
if (r) { //apply program clip
diff --git a/src/drivers/Quartz/Fl_Quartz_Image_Surface_Driver.cxx b/src/drivers/Quartz/Fl_Quartz_Image_Surface_Driver.cxx
index b31086b1f..c8d751aa1 100644
--- a/src/drivers/Quartz/Fl_Quartz_Image_Surface_Driver.cxx
+++ b/src/drivers/Quartz/Fl_Quartz_Image_Surface_Driver.cxx
@@ -57,9 +57,9 @@ Fl_Quartz_Image_Surface_Driver::Fl_Quartz_Image_Surface_Driver(int w, int h, int
CGContextScaleCTM(offscreen, 2, 2);
}
CGContextSetShouldAntialias(offscreen, false);
- CGContextSaveGState(offscreen);
- CGContextTranslateCTM(offscreen, 0, height);
+ CGContextTranslateCTM(offscreen, 0, height);
CGContextScaleCTM(offscreen, 1.0f, -1.0f);
+ CGContextSaveGState(offscreen);
CGContextSetRGBFillColor(offscreen, 1, 1, 1, 0);
CGContextFillRect(offscreen, CGRectMake(0,0,w,h));
}
@@ -84,10 +84,8 @@ void Fl_Quartz_Image_Surface_Driver::set_current() {
void Fl_Quartz_Image_Surface_Driver::translate(int x, int y) {
CGContextRestoreGState(offscreen);
CGContextSaveGState(offscreen);
- CGContextTranslateCTM(offscreen, x, -y);
+ CGContextTranslateCTM(offscreen, x, y);
CGContextSaveGState(offscreen);
- CGContextTranslateCTM(offscreen, 0, height);
- CGContextScaleCTM(offscreen, 1.0f, -1.0f);
}
void Fl_Quartz_Image_Surface_Driver::untranslate() {