Skip to content

Commit

Permalink
Move Fl_X::set_high_resolution() to classes Fl_Graphics_Driver and Fl…
Browse files Browse the repository at this point in the history
…_Quartz_Graphics_Driver

git-svn-id: file:///fltk/svn/fltk/branches/branch-1.3-porting@11656 ea41ed52-d2ee-0310-a9c1-e6b18d33e121
  • Loading branch information
Manolo Gouy authored and Manolo Gouy committed Apr 19, 2016
1 parent 366f4bf commit 034cfc9
Show file tree
Hide file tree
Showing 9 changed files with 22 additions and 27 deletions.
4 changes: 1 addition & 3 deletions FL/Fl_Device.H
Expand Up @@ -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();
};

/**
Expand Down
3 changes: 2 additions & 1 deletion FL/Fl_Graphics_Driver.H
Expand Up @@ -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();
Expand Down
1 change: 0 additions & 1 deletion FL/mac.H
Expand Up @@ -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?
Expand Down
6 changes: 4 additions & 2 deletions src/Fl_Device.cxx
Expand Up @@ -48,8 +48,6 @@
*/

bool Fl_Display_Device::high_res_window_ = false;


/** \brief Make this surface the current drawing surface.
This surface will receive all future graphics requests. */
Expand Down Expand Up @@ -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()
{
Expand Down
8 changes: 1 addition & 7 deletions src/Fl_cocoa.mm
Expand Up @@ -3251,7 +3251,7 @@ to YES and calls handleUpdateEvent() that calls Fl_Cocoa_Window_Driver::flush().
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
Expand Down Expand Up @@ -3294,19 +3294,13 @@ to YES and calls handleUpdateEvent() that calls Fl_Cocoa_Window_Driver::flush().
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)
if (Fl::cairo_autolink_context()) Fl::cairo_make_current((Fl_Window*) 0); // capture gc changes automatically to update the cairo context adequately
#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);
Expand Down
8 changes: 6 additions & 2 deletions src/drivers/Quartz/Fl_Quartz_Graphics_Driver.H
Expand Up @@ -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; }
Expand All @@ -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();
Expand Down Expand Up @@ -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();
};

Expand Down
2 changes: 1 addition & 1 deletion src/drivers/Quartz/Fl_Quartz_Graphics_Driver_image.cxx
Expand Up @@ -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
Expand Down
12 changes: 6 additions & 6 deletions src/drivers/Quartz/Fl_Quartz_Graphics_Driver_rect.cxx
Expand Up @@ -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.
Expand All @@ -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));
}
Expand All @@ -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_));
}
Expand All @@ -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));
}
Expand All @@ -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_));
}
Expand All @@ -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));
}
Expand Down
5 changes: 1 addition & 4 deletions src/drivers/Quartz/Fl_Quartz_Image_Surface_Driver.cxx
Expand Up @@ -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();
Expand Down Expand Up @@ -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) {
Expand Down Expand Up @@ -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;
}
Expand Down

0 comments on commit 034cfc9

Please sign in to comment.