Move Fl_X::set_high_resolution() to classes Fl_Graphics_Driver and Fl_Quartz_Graphics_Driver
git-svn-id: file:///fltk/svn/fltk/branches/branch-1.3-porting@11656 ea41ed52-d2ee-0310-a9c1-e6b18d33e121
This commit is contained in:
parent
366f4bfbc9
commit
034cfc94a3
@ -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();
|
||||
};
|
||||
|
||||
/**
|
||||
|
||||
@ -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();
|
||||
|
||||
1
FL/mac.H
1
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?
|
||||
|
||||
@ -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()
|
||||
{
|
||||
|
||||
@ -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);
|
||||
|
||||
@ -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();
|
||||
};
|
||||
|
||||
|
||||
@ -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
|
||||
|
||||
@ -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));
|
||||
}
|
||||
|
||||
@ -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;
|
||||
}
|
||||
|
||||
Loading…
Reference in New Issue
Block a user