summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--FL/Fl_Device.H4
-rw-r--r--FL/Fl_Graphics_Driver.H3
-rw-r--r--FL/mac.H1
-rw-r--r--src/Fl_Device.cxx6
-rw-r--r--src/Fl_cocoa.mm8
-rw-r--r--src/drivers/Quartz/Fl_Quartz_Graphics_Driver.H8
-rw-r--r--src/drivers/Quartz/Fl_Quartz_Graphics_Driver_image.cxx2
-rw-r--r--src/drivers/Quartz/Fl_Quartz_Graphics_Driver_rect.cxx12
-rw-r--r--src/drivers/Quartz/Fl_Quartz_Image_Surface_Driver.cxx5
9 files changed, 22 insertions, 27 deletions
diff --git a/FL/Fl_Device.H b/FL/Fl_Device.H
index 26624487e..58c02a29e 100644
--- a/FL/Fl_Device.H
+++ b/FL/Fl_Device.H
@@ -81,14 +81,12 @@ public:
There is no need to create any other object of this class.
*/
class FL_EXPORT Fl_Display_Device : public Fl_Surface_Device {
- friend class Fl_X;
friend class Fl_Graphics_Driver;
static Fl_Display_Device *_display; // the platform display device
- static bool high_res_window_; //< true when drawing to a window of a retina display (Mac OS X only)
public:
Fl_Display_Device(Fl_Graphics_Driver *graphics_driver);
static Fl_Display_Device *display_device();
- static bool high_resolution() {return high_res_window_;}
+ static bool high_resolution();
};
/**
diff --git a/FL/Fl_Graphics_Driver.H b/FL/Fl_Graphics_Driver.H
index 51859b5c1..de54c72e3 100644
--- a/FL/Fl_Graphics_Driver.H
+++ b/FL/Fl_Graphics_Driver.H
@@ -249,7 +249,8 @@ public:
virtual void add_rectangle_to_region(Fl_Region r, int x, int y, int w, int h);
virtual Fl_Region XRectangleRegion(int x, int y, int w, int h);
virtual void XDestroyRegion(Fl_Region r);
-
+ // the default implementation may be enough
+ virtual bool high_resolution() { return false; }
protected:
// --- implementation is in src/fl_vertex.cxx which includes src/cfg_gfx/xxx_rect.cxx
virtual void global_gc();
diff --git a/FL/mac.H b/FL/mac.H
index f23bbf8b7..302783edb 100644
--- a/FL/mac.H
+++ b/FL/mac.H
@@ -130,7 +130,6 @@ public:
static Fl_X* first;
static Fl_X* i(const Fl_Window* w) {return (Fl_X*)w->i;}
static void make(Fl_Window*);
- static void set_high_resolution(bool);
CGRect* subRect() { return subRect_; } // getter
void subRect(CGRect *r) { subRect_ = r; } // setter
bool mapped_to_retina(); // is window mapped to retina display?
diff --git a/src/Fl_Device.cxx b/src/Fl_Device.cxx
index 7d37edb61..07df9d8db 100644
--- a/src/Fl_Device.cxx
+++ b/src/Fl_Device.cxx
@@ -48,8 +48,6 @@ TODO:
*/
-bool Fl_Display_Device::high_res_window_ = false;
-
/** \brief Make this surface the current drawing surface.
This surface will receive all future graphics requests. */
@@ -80,6 +78,10 @@ Fl_Display_Device *Fl_Display_Device::display_device() {
return display;
};
+bool Fl_Display_Device::high_resolution()
+{
+ return Fl_Display_Device::display_device()->driver()->high_resolution();
+}
Fl_Surface_Device *Fl_Surface_Device::default_surface()
{
diff --git a/src/Fl_cocoa.mm b/src/Fl_cocoa.mm
index 36cdba14d..0e2e72beb 100644
--- a/src/Fl_cocoa.mm
+++ b/src/Fl_cocoa.mm
@@ -3251,7 +3251,7 @@ void Fl_Cocoa_Window_Driver::make_current()
q_release_context();
Fl_X *i = Fl_X::i(pWindow);
fl_window = i->xid;
- Fl_X::set_high_resolution( i->mapped_to_retina() );
+ ((Fl_Quartz_Graphics_Driver*)Fl_Display_Device::display_device()->driver())->high_resolution( i->mapped_to_retina() );
NSGraphicsContext *nsgc;
#if MAC_OS_X_VERSION_MAX_ALLOWED >= MAC_OS_X_VERSION_10_4
@@ -3294,7 +3294,6 @@ void Fl_Cocoa_Window_Driver::q_release_context(Fl_Cocoa_Window_Driver *x) {
if (!gc) return;
CGContextRestoreGState(gc); // match the CGContextSaveGState's of make_current
CGContextRestoreGState(gc);
-// Fl_X::set_high_resolution(false);
CGContextFlush(gc);
Fl_Display_Device::display_device()->driver()->gc(0);
#if defined(FLTK_USE_CAIRO)
@@ -3302,11 +3301,6 @@ void Fl_Cocoa_Window_Driver::q_release_context(Fl_Cocoa_Window_Driver *x) {
#endif
}
-void Fl_X::set_high_resolution(bool new_val)
-{
- Fl_Display_Device::high_res_window_ = new_val;
-}
-
Fl_Quartz_Copy_Surface_Driver::~Fl_Quartz_Copy_Surface_Driver()
{
CGContextRestoreGState(gc);
diff --git a/src/drivers/Quartz/Fl_Quartz_Graphics_Driver.H b/src/drivers/Quartz/Fl_Quartz_Graphics_Driver.H
index d022ff1df..e6daeff74 100644
--- a/src/drivers/Quartz/Fl_Quartz_Graphics_Driver.H
+++ b/src/drivers/Quartz/Fl_Quartz_Graphics_Driver.H
@@ -39,8 +39,11 @@ protected:
int p_size;
typedef struct { float x; float y; } XPOINT;
XPOINT *p;
+ bool high_resolution_;
public:
- Fl_Quartz_Graphics_Driver() : Fl_Graphics_Driver(), gc_(NULL), p_size(0), p(NULL) {}
+ Fl_Quartz_Graphics_Driver() : Fl_Graphics_Driver(), gc_(NULL), p_size(0), p(NULL) {
+ high_resolution_ = false;
+ }
virtual ~Fl_Quartz_Graphics_Driver() { if (p) free(p); }
virtual int has_feature(driver_feature mask) { return mask & NATIVE; }
virtual void gc(void *ctxt) {if (ctxt != gc_) global_gc(); gc_ = (CGContextRef)ctxt; }
@@ -67,6 +70,7 @@ public:
void add_rectangle_to_region(Fl_Region r, int x, int y, int w, int h);
Fl_Region XRectangleRegion(int x, int y, int w, int h);
void XDestroyRegion(Fl_Region r);
+ void high_resolution(bool b) { high_resolution_ = b; }
protected:
void transformed_vertex0(float x, float y);
void fixloop();
@@ -127,7 +131,7 @@ protected:
void text_extents(const char*, int n, int& dx, int& dy, int& w, int& h);
int height();
int descent();
-protected:
+ virtual bool high_resolution() { return high_resolution_; }
virtual void global_gc();
};
diff --git a/src/drivers/Quartz/Fl_Quartz_Graphics_Driver_image.cxx b/src/drivers/Quartz/Fl_Quartz_Graphics_Driver_image.cxx
index d66694a35..44e6d008f 100644
--- a/src/drivers/Quartz/Fl_Quartz_Graphics_Driver_image.cxx
+++ b/src/drivers/Quartz/Fl_Quartz_Graphics_Driver_image.cxx
@@ -293,7 +293,7 @@ void Fl_Quartz_Graphics_Driver::draw_CGImage(CGImageRef cgimg, int x, int y, int
doit = true;
} else if (at.a == 0.5) {
doit = true;
- if (Fl_Display_Device::high_resolution()) { // make .tx and .ty have int or half-int values
+ if (high_resolution()) { // make .tx and .ty have int or half-int values
deltax = -(at.tx*2 - round(at.tx*2));
deltay = (at.ty*2 - round(at.ty*2));
} else { // make .tx and .ty have integral values
diff --git a/src/drivers/Quartz/Fl_Quartz_Graphics_Driver_rect.cxx b/src/drivers/Quartz/Fl_Quartz_Graphics_Driver_rect.cxx
index d61c7ad7e..caa5dc64c 100644
--- a/src/drivers/Quartz/Fl_Quartz_Graphics_Driver_rect.cxx
+++ b/src/drivers/Quartz/Fl_Quartz_Graphics_Driver_rect.cxx
@@ -78,7 +78,7 @@ void Fl_Quartz_Graphics_Driver::xyline(int x, int y, int x1) {
CGContextMoveToPoint(gc_, x, y);
CGContextAddLineToPoint(gc_, x1, y);
CGContextStrokePath(gc_);
- if (Fl_Display_Device::high_resolution()) {
+ if (high_resolution()) {
/* On retina displays, all xyline() and yxline() functions produce lines that are half-unit
(or one pixel) too short at both ends. This is corrected by filling at both ends rectangles
of size one unit by line-width.
@@ -95,7 +95,7 @@ void Fl_Quartz_Graphics_Driver::xyline(int x, int y, int x1, int y2) {
CGContextAddLineToPoint(gc_, x1, y);
CGContextAddLineToPoint(gc_, x1, y2);
CGContextStrokePath(gc_);
- if (Fl_Display_Device::high_resolution()) {
+ if (high_resolution()) {
CGContextFillRect(gc_, CGRectMake(x-0.5, y - fl_quartz_line_width_/2, 1 , fl_quartz_line_width_));
CGContextFillRect(gc_, CGRectMake(x1 - fl_quartz_line_width_/2, y2-0.5, fl_quartz_line_width_, 1));
}
@@ -109,7 +109,7 @@ void Fl_Quartz_Graphics_Driver::xyline(int x, int y, int x1, int y2, int x3) {
CGContextAddLineToPoint(gc_, x1, y2);
CGContextAddLineToPoint(gc_, x3, y2);
CGContextStrokePath(gc_);
- if (Fl_Display_Device::high_resolution()) {
+ if (high_resolution()) {
CGContextFillRect(gc_, CGRectMake(x-0.5, y - fl_quartz_line_width_/2, 1 , fl_quartz_line_width_));
CGContextFillRect(gc_, CGRectMake(x3-0.5, y2 - fl_quartz_line_width_/2, 1 , fl_quartz_line_width_));
}
@@ -121,7 +121,7 @@ void Fl_Quartz_Graphics_Driver::yxline(int x, int y, int y1) {
CGContextMoveToPoint(gc_, x, y);
CGContextAddLineToPoint(gc_, x, y1);
CGContextStrokePath(gc_);
- if (Fl_Display_Device::high_resolution()) {
+ if (high_resolution()) {
CGContextFillRect(gc_, CGRectMake(x - fl_quartz_line_width_/2, y-0.5, fl_quartz_line_width_, 1));
CGContextFillRect(gc_, CGRectMake(x - fl_quartz_line_width_/2, y1-0.5, fl_quartz_line_width_, 1));
}
@@ -134,7 +134,7 @@ void Fl_Quartz_Graphics_Driver::yxline(int x, int y, int y1, int x2) {
CGContextAddLineToPoint(gc_, x, y1);
CGContextAddLineToPoint(gc_, x2, y1);
CGContextStrokePath(gc_);
- if (Fl_Display_Device::high_resolution()) {
+ if (high_resolution()) {
CGContextFillRect(gc_, CGRectMake(x - fl_quartz_line_width_/2, y-0.5, fl_quartz_line_width_, 1));
CGContextFillRect(gc_, CGRectMake(x2-0.5, y1 - fl_quartz_line_width_/2, 1 , fl_quartz_line_width_));
}
@@ -148,7 +148,7 @@ void Fl_Quartz_Graphics_Driver::yxline(int x, int y, int y1, int x2, int y3) {
CGContextAddLineToPoint(gc_, x2, y1);
CGContextAddLineToPoint(gc_, x2, y3);
CGContextStrokePath(gc_);
- if (Fl_Display_Device::high_resolution()) {
+ if (high_resolution()) {
CGContextFillRect(gc_, CGRectMake(x - fl_quartz_line_width_/2, y-0.5, fl_quartz_line_width_, 1));
CGContextFillRect(gc_, CGRectMake(x2 - fl_quartz_line_width_/2, y3-0.5, fl_quartz_line_width_, 1));
}
diff --git a/src/drivers/Quartz/Fl_Quartz_Image_Surface_Driver.cxx b/src/drivers/Quartz/Fl_Quartz_Image_Surface_Driver.cxx
index db01a3fe0..528548ea4 100644
--- a/src/drivers/Quartz/Fl_Quartz_Image_Surface_Driver.cxx
+++ b/src/drivers/Quartz/Fl_Quartz_Image_Surface_Driver.cxx
@@ -30,7 +30,6 @@ class Fl_Quartz_Image_Surface_Driver : public Fl_Image_Surface_Driver {
public:
Fl_Surface_Device *previous;
Window pre_window;
- int was_high;
Fl_Quartz_Image_Surface_Driver(int w, int h, int high_res);
~Fl_Quartz_Image_Surface_Driver();
void set_current();
@@ -81,8 +80,7 @@ void Fl_Quartz_Image_Surface_Driver::set_current() {
driver()->gc(offscreen);
fl_window = 0;
Fl_Surface_Device::set_current();
- was_high = Fl_Display_Device::high_resolution();
- Fl_X::set_high_resolution( CGBitmapContextGetWidth(offscreen) > width );
+ ((Fl_Quartz_Graphics_Driver*)driver())->high_resolution( CGBitmapContextGetWidth(offscreen) > width );
}
void Fl_Quartz_Image_Surface_Driver::translate(int x, int y) {
@@ -111,7 +109,6 @@ Fl_RGB_Image* Fl_Quartz_Image_Surface_Driver::image()
void Fl_Quartz_Image_Surface_Driver::end_current()
{
- Fl_X::set_high_resolution(was_high);
previous->Fl_Surface_Device::set_current();
fl_window = pre_window;
}