summaryrefslogtreecommitdiff
path: root/src/drivers/Quartz/Fl_Quartz_Graphics_Driver_rect.cxx
diff options
context:
space:
mode:
authorManolo Gouy <Manolo>2018-02-09 13:48:22 +0000
committerManolo Gouy <Manolo>2018-02-09 13:48:22 +0000
commitc472d5d8b76e17e4dd537ca20c9bfb144b06189c (patch)
treefbe64110002b5d36127631c37cc5d1bb44f86318 /src/drivers/Quartz/Fl_Quartz_Graphics_Driver_rect.cxx
parentb78b2f7f5f24b98640d31bb8ee7b573703e8cc19 (diff)
Fix fl_read_image() under MacOS platform when GUI is rescaled.
This commit also simplifies the platform-dependent support of fl_read_image(): only Fl_XXX_Screen_Driver::read_win_rectangle() contains platform-specific code to capture pixels from the current window or from an offscreen buffer. Platform-independent function Fl_Screen_Driver::traverse_to_gl_subwindows() captures subwindows that intersect with the area fl_read_image() targets. git-svn-id: file:///fltk/svn/fltk/branches/branch-1.4@12653 ea41ed52-d2ee-0310-a9c1-e6b18d33e121
Diffstat (limited to 'src/drivers/Quartz/Fl_Quartz_Graphics_Driver_rect.cxx')
-rw-r--r--src/drivers/Quartz/Fl_Quartz_Graphics_Driver_rect.cxx24
1 files changed, 24 insertions, 0 deletions
diff --git a/src/drivers/Quartz/Fl_Quartz_Graphics_Driver_rect.cxx b/src/drivers/Quartz/Fl_Quartz_Graphics_Driver_rect.cxx
index 3a83b94d6..8153f4e78 100644
--- a/src/drivers/Quartz/Fl_Quartz_Graphics_Driver_rect.cxx
+++ b/src/drivers/Quartz/Fl_Quartz_Graphics_Driver_rect.cxx
@@ -173,6 +173,30 @@ void Fl_Quartz_Graphics_Driver::loop(int x, int y, int x1, int y1, int x2, int y
if (quartz_line_width_ > 1.5f) CGContextSetShouldAntialias(gc_, false);
}
+// returns y of horizontal line corresponding to pixels of current window
+// read by Fl_Cocoa_Screen_Driver::read_win_rectangle( -, y, -, 1)
+// when GUI is scaled by s
+static float overlay_y(int y, float s, int H) {
+ int a, b, c;
+ a = int(H*s) - (y+1)*s; // in Cocoa units from window bottom
+ c = (s > 1 ? s : 1); // height of pixels read in Cocoa units
+ b = H*s - (a+c); // top of read image from window top in Cocoa units
+ return b/s; // top of read image from window top in FLTK units
+}
+
+void Fl_Quartz_Graphics_Driver::overlay_rect(int x, int y, int w , int h) {
+ float s = scale();
+ CGContextSetLineWidth(gc_, 0.01);
+ int H = Fl_Window::current()->h();
+ CGContextMoveToPoint(gc_, x, overlay_y(y, s, H));
+ CGContextAddLineToPoint(gc_, x+w-1, overlay_y(y, s, H));
+ CGContextAddLineToPoint(gc_, x+w-1, overlay_y(y+h-1, s, H));
+ CGContextAddLineToPoint(gc_, x, overlay_y(y+h-1, s, H));
+ CGContextClosePath(gc_);
+ CGContextStrokePath(gc_);
+ CGContextSetLineWidth(gc_, quartz_line_width_);
+}
+
void Fl_Quartz_Graphics_Driver::polygon(int x, int y, int x1, int y1, int x2, int y2) {
CGContextSetShouldAntialias(gc_, true);
CGContextMoveToPoint(gc_, x, y);