diff options
| -rw-r--r-- | src/Fl_cocoa.mm | 50 | ||||
| -rw-r--r-- | src/drivers/Cocoa/Fl_Cocoa_Window_Driver.cxx | 50 |
2 files changed, 50 insertions, 50 deletions
diff --git a/src/Fl_cocoa.mm b/src/Fl_cocoa.mm index cb549001e..94cd35489 100644 --- a/src/Fl_cocoa.mm +++ b/src/Fl_cocoa.mm @@ -4386,56 +4386,6 @@ void Fl_Cocoa_Window_Driver::draw_layer_to_context(CALayer *layer, CGContextRef #endif } - -/* Returns images of the capture of the window title-bar. - On the Mac OS platform, left, bottom and right are returned NULL; top is returned with depth 4. - */ -void Fl_Cocoa_Window_Driver::capture_titlebar_and_borders(Fl_RGB_Image*& top, Fl_RGB_Image*& left, Fl_RGB_Image*& bottom, Fl_RGB_Image*& right) -{ - left = bottom = right = NULL; - int htop = pWindow->decorated_h() - h(); - CALayer *layer = get_titlebar_layer(); - CGColorSpaceRef cspace = CGColorSpaceCreateDeviceRGB(); - float s = Fl::screen_driver()->scale(screen_num()); - int scaled_w = int(w() * s); - uchar *rgba = new uchar[4 * scaled_w * htop * 4]; - CGContextRef auxgc = CGBitmapContextCreate(rgba, 2 * scaled_w, 2 * htop, 8, 8 * scaled_w, cspace, kCGImageAlphaPremultipliedLast); - CGColorSpaceRelease(cspace); - CGContextClearRect(auxgc, CGRectMake(0,0,2*scaled_w,2*htop)); - CGContextScaleCTM(auxgc, 2, 2); - if (layer) { - Fl_Cocoa_Window_Driver::draw_layer_to_context(layer, auxgc, scaled_w, htop); - if (fl_mac_os_version >= 101300) { - // drawn layer is left transparent and alpha-premultiplied: demultiply it and set it opaque. - uchar *p = rgba; - uchar *last = rgba + 4 * scaled_w * htop * 4; - while (p < last) { - uchar q = *(p+3); - if (q) { - 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); - } - top = new Fl_RGB_Image(rgba, 2 * scaled_w, 2 * htop, 4); - top->alloc_array = 1; - top->scale(w(),htop, s <1 ? 0 : 1, 1); - CGContextRelease(auxgc); -} - void Fl_Cocoa_Window_Driver::gl_start(NSOpenGLContext *ctxt) { #if MAC_OS_X_VERSION_MAX_ALLOWED >= MAC_OS_X_VERSION_10_8 if (views_use_CA) { diff --git a/src/drivers/Cocoa/Fl_Cocoa_Window_Driver.cxx b/src/drivers/Cocoa/Fl_Cocoa_Window_Driver.cxx index 97308e666..43ae44664 100644 --- a/src/drivers/Cocoa/Fl_Cocoa_Window_Driver.cxx +++ b/src/drivers/Cocoa/Fl_Cocoa_Window_Driver.cxx @@ -19,6 +19,7 @@ #include "../../config_lib.h" #include "Fl_Cocoa_Window_Driver.H" +#include "../../Fl_Screen_Driver.H" #include "../Quartz/Fl_Quartz_Graphics_Driver.H" #include <FL/Fl_Double_Window.H> #include <FL/Fl_Overlay_Window.H> @@ -317,6 +318,55 @@ const Fl_Image* Fl_Cocoa_Window_Driver::shape() { return shape_data_ ? shape_data_->shape_ : NULL; } +/* Returns images of the capture of the window title-bar. + On the Mac OS platform, left, bottom and right are returned NULL; top is returned with depth 4. + */ +void Fl_Cocoa_Window_Driver::capture_titlebar_and_borders(Fl_RGB_Image*& top, Fl_RGB_Image*& left, Fl_RGB_Image*& bottom, Fl_RGB_Image*& right) +{ + left = bottom = right = NULL; + int htop = pWindow->decorated_h() - h(); + CALayer *layer = get_titlebar_layer(); + CGColorSpaceRef cspace = CGColorSpaceCreateDeviceRGB(); + float s = Fl::screen_driver()->scale(screen_num()); + int scaled_w = int(w() * s); + uchar *rgba = new uchar[4 * scaled_w * htop * 4]; + CGContextRef auxgc = CGBitmapContextCreate(rgba, 2 * scaled_w, 2 * htop, 8, 8 * scaled_w, cspace, kCGImageAlphaPremultipliedLast); + CGColorSpaceRelease(cspace); + CGContextClearRect(auxgc, CGRectMake(0,0,2*scaled_w,2*htop)); + CGContextScaleCTM(auxgc, 2, 2); + if (layer) { + Fl_Cocoa_Window_Driver::draw_layer_to_context(layer, auxgc, scaled_w, htop); + if (fl_mac_os_version >= 101300) { + // drawn layer is left transparent and alpha-premultiplied: demultiply it and set it opaque. + uchar *p = rgba; + uchar *last = rgba + 4 * scaled_w * htop * 4; + while (p < last) { + uchar q = *(p+3); + if (q) { + 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); + } + top = new Fl_RGB_Image(rgba, 2 * scaled_w, 2 * htop, 4); + top->alloc_array = 1; + top->scale(w(),htop, s <1 ? 0 : 1, 1); + CGContextRelease(auxgc); +} + // // End of "$Id$". // |
