summaryrefslogtreecommitdiff
path: root/src/drivers
diff options
context:
space:
mode:
Diffstat (limited to 'src/drivers')
-rw-r--r--src/drivers/Cocoa/Fl_Cocoa_Printer_Driver.mm83
-rw-r--r--src/drivers/Cocoa/Fl_Cocoa_Window_Driver.H3
-rw-r--r--src/drivers/Cocoa/Fl_Cocoa_Window_Driver.cxx31
-rw-r--r--src/drivers/Quartz/Fl_Quartz_Copy_Surface_Driver.H1
-rw-r--r--src/drivers/Quartz/Fl_Quartz_Copy_Surface_Driver.cxx15
5 files changed, 3 insertions, 130 deletions
diff --git a/src/drivers/Cocoa/Fl_Cocoa_Printer_Driver.mm b/src/drivers/Cocoa/Fl_Cocoa_Printer_Driver.mm
index 9cf95a24a..1f7511c9e 100644
--- a/src/drivers/Cocoa/Fl_Cocoa_Printer_Driver.mm
+++ b/src/drivers/Cocoa/Fl_Cocoa_Printer_Driver.mm
@@ -68,7 +68,6 @@ private:
void untranslate(void);
int end_page (void);
void end_job (void);
- void draw_decorated_window(Fl_Window *win, int x_offset, int y_offset);
~Fl_Cocoa_Printer_Driver(void);
};
@@ -388,85 +387,3 @@ void Fl_Cocoa_Printer_Driver::origin(int *x, int *y)
{
Fl_Paged_Device::origin(x, y);
}
-
-void Fl_Cocoa_Printer_Driver::draw_decorated_window(Fl_Window *win, int x_offset, int y_offset)
-{
- if (!win->shown() || win->parent() || !win->border() || !win->visible()) {
- this->print_widget(win, x_offset, y_offset);
- return;
- }
- int bt, hleft, hright, hbottom;
- Fl_Cocoa_Window_Driver::driver(win)->decoration_sizes(&bt, &hleft, &hright, &hbottom);
- float s = Fl::screen_scale(win->screen_num());
- if (s < 1) y_offset += bt*(1/s-1);
- CALayer *layer = Fl_Cocoa_Window_Driver::driver(win)->get_titlebar_layer();
- if (layer) { // if title bar uses a layer
- CGContextRef gc = (CGContextRef)driver()->gc();
- CGContextSaveGState(gc);
- CGContextTranslateCTM(gc, x_offset - 0.5, y_offset + bt - 0.5);
- CGContextScaleCTM(gc, 1/s, -1/s);
- Fl_Cocoa_Window_Driver::driver(win)->draw_layer_to_context(layer, gc, win->w() * s, bt);
- CGContextRestoreGState(gc);
- bool clip_corners = fl_mac_os_version >= 100600 && !win->parent();
- if (clip_corners) {
- CGContextRef gc = (CGContextRef)driver()->gc();
- CGContextSaveGState(gc);
- CGContextTranslateCTM(gc, x_offset, y_offset + bt );
- Fl_Cocoa_Window_Driver::clip_to_rounded_corners(gc, win->w(), win->h());
- CGContextTranslateCTM(gc, -x_offset, -y_offset - bt);
- }
- this->print_widget(win, x_offset, y_offset + bt);
- if (clip_corners) {
- CGContextRestoreGState((CGContextRef)driver()->gc());
- }
- return;
- }
- Fl_Display_Device::display_device()->set_current(); // send win to front and make it current
- NSString *title = [(NSWindow*)fl_xid(win) title];
- [title retain];
- [(NSWindow*)fl_xid(win) setTitle:@""]; // temporarily set a void window title
- win->show();
- Fl::check();
- // capture the window title bar with no title
- Fl_RGB_Image *top, *left, *bottom, *right;
- Fl_Window_Driver::driver(win)->capture_titlebar_and_borders(top, left, bottom, right);
- [(NSWindow*)fl_xid(win) setTitle:title]; // put back the window title
- this->set_current(); // back to the Fl_Paged_Device
- top->scale(win->w(), bt/s, 0, 1);
- top->draw(x_offset, y_offset + bt - bt/s); // print the title bar
- delete top;
- if (win->label()) { // print the window title
- const int skip = 65; // approx width of the zone of the 3 window control buttons
- float fs = [NSFont systemFontSize]/s;
- int text_y = y_offset+bt*(1-1/(2*s))+fs/3;
-#if MAC_OS_X_VERSION_MAX_ALLOWED >= MAC_OS_X_VERSION_10_4
- if ( fl_mac_os_version >= 100400 ) { // use Cocoa string drawing with exact title bar font
- // the exact font is LucidaGrande 13 pts (and HelveticaNeueDeskInterface-Regular with 10.10)
- NSGraphicsContext *current = [NSGraphicsContext currentContext];
- [NSGraphicsContext setCurrentContext:[NSGraphicsContext graphicsContextWithGraphicsPort:driver()->gc() flipped:YES]];//10.4
- NSDictionary *attr = [NSDictionary dictionaryWithObject:[NSFont titleBarFontOfSize:fs]
- forKey:NSFontAttributeName];
- NSSize size = [title sizeWithAttributes:attr];
- int x = x_offset + win->w()/2 - size.width/2;
- if (x < x_offset+skip) x = x_offset+skip;
- NSRect r = NSMakeRect(x, text_y , win->w() - skip, bt);
- [[NSGraphicsContext currentContext] setShouldAntialias:YES];
- [title drawWithRect:r options:(NSStringDrawingOptions)0 attributes:attr]; // 10.4
- [[NSGraphicsContext currentContext] setShouldAntialias:NO];
- [NSGraphicsContext setCurrentContext:current];
- }
- else
-#endif
- {
- fl_font(FL_HELVETICA, fs);
- fl_color(FL_BLACK);
- int x = x_offset + win->w()/2 - fl_width(win->label())/2;
- if (x < x_offset+skip) x = x_offset+skip;
- fl_push_clip(x_offset, y_offset + bt - bt/s, win->w(), bt/s);
- fl_draw(win->label(), x, text_y);
- fl_pop_clip();
- }
- }
- [title release];
- this->print_widget(win, x_offset, y_offset + bt); // print the window inner part
-}
diff --git a/src/drivers/Cocoa/Fl_Cocoa_Window_Driver.H b/src/drivers/Cocoa/Fl_Cocoa_Window_Driver.H
index 2b485490a..970d78839 100644
--- a/src/drivers/Cocoa/Fl_Cocoa_Window_Driver.H
+++ b/src/drivers/Cocoa/Fl_Cocoa_Window_Driver.H
@@ -139,8 +139,7 @@ public:
// next 4 are in Fl_cocoa.mm because they use Objective-c
virtual void capture_titlebar_and_borders(Fl_RGB_Image*& top, Fl_RGB_Image*& left, Fl_RGB_Image*& bottom, Fl_RGB_Image*& right);
virtual void wait_for_expose();
- CALayer *get_titlebar_layer();
- void draw_layer_to_context(CALayer *layer, CGContextRef gc, int w, int h);
+ void draw_titlebar_to_context(CGContextRef gc, int w, int h);
virtual int scroll(int src_x, int src_y, int src_w, int src_h, int dest_x, int dest_y, void (*draw_area)(void*, int,int,int,int), void* data);
// these functions are OpenGL-related and use objective-c
diff --git a/src/drivers/Cocoa/Fl_Cocoa_Window_Driver.cxx b/src/drivers/Cocoa/Fl_Cocoa_Window_Driver.cxx
index cec8e0b58..ed2772b42 100644
--- a/src/drivers/Cocoa/Fl_Cocoa_Window_Driver.cxx
+++ b/src/drivers/Cocoa/Fl_Cocoa_Window_Driver.cxx
@@ -316,44 +316,17 @@ void Fl_Cocoa_Window_Driver::capture_titlebar_and_borders(Fl_RGB_Image*& top, Fl
int htop, hleft, hright, hbottom;
Fl_Cocoa_Window_Driver::decoration_sizes(&htop, &hleft, &hright, &hbottom);
if (htop == 0) return; // when window is fullscreen
- CALayer *layer = get_titlebar_layer();
CGColorSpaceRef cspace = CGColorSpaceCreateDeviceRGB();
float s = Fl::screen_driver()->scale(screen_num());
int scaled_w = int(w() * s);
- const int factor = (layer && mapped_to_retina() ? 4 : 2); // resolution level for the titlebar (2 == retina's)
+ const int factor = (mapped_to_retina() ? 2 : 1);
int data_w = factor * scaled_w, data_h = factor * htop;
uchar *rgba = new uchar[4 * data_w * data_h];
CGContextRef auxgc = CGBitmapContextCreate(rgba, data_w, data_h, 8, 4 * data_w, cspace, kCGImageAlphaPremultipliedLast);
CGColorSpaceRelease(cspace);
CGContextClearRect(auxgc, CGRectMake(0,0,data_w,data_h));
CGContextScaleCTM(auxgc, factor, factor);
- if (layer) {
- draw_layer_to_context(layer, auxgc, scaled_w, htop);
- if (fl_mac_os_version >= 101300 && fl_mac_os_version < 101500) {
- // drawn layer is left transparent and alpha-premultiplied: demultiply it and set it opaque.
- uchar *p = rgba;
- uchar *last = rgba + data_w * data_h * 4;
- while (p < last) {
- uchar q = *(p+3);
- if (q && q != 0xff) {
- float m = 255./q;
- *p++ *= m;
- *p++ *= m;
- *p++ *= m;
- *p++ = 0xff;
- } else p += 4;
- }
- }
- } else {
- Fl_Graphics_Driver::default_driver().scale(1);
- CGImageRef img = CGImage_from_window_rect(0, -htop, scaled_w, htop, false);
- Fl_Graphics_Driver::default_driver().scale(s);
- CGContextSaveGState(auxgc);
- clip_to_rounded_corners(auxgc, scaled_w, htop);
- CGContextDrawImage(auxgc, CGRectMake(0, 0, scaled_w, htop), img);
- CGContextRestoreGState(auxgc);
- CFRelease(img);
- }
+ draw_titlebar_to_context(auxgc, scaled_w, htop);
top = new Fl_RGB_Image(rgba, data_w, data_h, 4);
top->alloc_array = 1;
top->scale(w(),htop, s <1 ? 0 : 1, 1);
diff --git a/src/drivers/Quartz/Fl_Quartz_Copy_Surface_Driver.H b/src/drivers/Quartz/Fl_Quartz_Copy_Surface_Driver.H
index e97304fe3..6aab63978 100644
--- a/src/drivers/Quartz/Fl_Quartz_Copy_Surface_Driver.H
+++ b/src/drivers/Quartz/Fl_Quartz_Copy_Surface_Driver.H
@@ -33,7 +33,6 @@ protected:
void set_current();
void translate(int x, int y);
void untranslate();
- virtual void draw_decorated_window(Fl_Window *win, int x_offset, int y_offset);
};
#endif /* Fl_Quartz_Copy_Surface_Driver_H */
diff --git a/src/drivers/Quartz/Fl_Quartz_Copy_Surface_Driver.cxx b/src/drivers/Quartz/Fl_Quartz_Copy_Surface_Driver.cxx
index 5f3735567..4a913abfc 100644
--- a/src/drivers/Quartz/Fl_Quartz_Copy_Surface_Driver.cxx
+++ b/src/drivers/Quartz/Fl_Quartz_Copy_Surface_Driver.cxx
@@ -87,19 +87,4 @@ void Fl_Quartz_Copy_Surface_Driver::untranslate() {
CGContextRestoreGState(gc);
}
-void Fl_Quartz_Copy_Surface_Driver::draw_decorated_window(Fl_Window *win, int x_offset, int y_offset) {
- CALayer *layer = Fl_Cocoa_Window_Driver::driver(win)->get_titlebar_layer();
- if (!layer) {
- return Fl_Widget_Surface::draw_decorated_window(win, x_offset, y_offset);
- }
- CGContextSaveGState(gc);
- int bt = win->decorated_h() - win->h();
- CGContextTranslateCTM(gc, x_offset - 0.5, y_offset + bt - 0.5);
- float s = Fl::screen_scale(win->screen_num());
- CGContextScaleCTM(gc, 1/s, s >= 1 ? -1/s : -1);
- Fl_Cocoa_Window_Driver::driver(win)->draw_layer_to_context(layer, gc, win->w() * s, bt*s);
- CGContextRestoreGState(gc);
- draw(win, x_offset, y_offset + bt); // print the window inner part
-}
-
#endif // FL_CFG_GFX_QUARTZ