diff options
| author | ManoloFLTK <41016272+ManoloFLTK@users.noreply.github.com> | 2020-05-20 07:51:20 +0200 |
|---|---|---|
| committer | ManoloFLTK <41016272+ManoloFLTK@users.noreply.github.com> | 2020-05-20 07:51:33 +0200 |
| commit | 026d560fb4ca61827832e66d0c54b350fb375d89 (patch) | |
| tree | 1b84c4c32b9155904139481155b2575401c3b4a6 /src | |
| parent | a432db8ca3300666bf3f3737a91dfc55d9429492 (diff) | |
Reorganise code that captures on-screen window content.
Also introduce new rect_to_NSBitmapImageRep: method of class FLWindow
which makes it possible to reimplement it.
Diffstat (limited to 'src')
| -rw-r--r-- | src/Fl_cocoa.mm | 100 |
1 files changed, 53 insertions, 47 deletions
diff --git a/src/Fl_cocoa.mm b/src/Fl_cocoa.mm index 02a270192..2c69c6165 100644 --- a/src/Fl_cocoa.mm +++ b/src/Fl_cocoa.mm @@ -31,6 +31,7 @@ extern "C" { #include <FL/Fl_Tooltip.H> #include <FL/Fl_Printer.H> #include <FL/fl_draw.H> +#include <FL/Fl_Rect.H> #include "drivers/Quartz/Fl_Quartz_Graphics_Driver.H" #include "drivers/Quartz/Fl_Quartz_Copy_Surface_Driver.H" #include "drivers/Cocoa/Fl_Cocoa_Screen_Driver.H" @@ -71,7 +72,8 @@ static size_t convert_crlf(char * string, size_t len); static void createAppleMenu(void); static void cocoaMouseHandler(NSEvent *theEvent); static void clipboard_check(void); -static NSBitmapImageRep* rect_to_NSBitmapImageRep(Fl_Window *win, int x, int y, int w, int h, bool capture_subwins = true); +static NSBitmapImageRep* rect_to_NSBitmapImageRep(Fl_Window *win, int x, int y, int w, int h); +static NSBitmapImageRep* rect_to_NSBitmapImageRep_subwins(Fl_Window *win, int x, int y, int w, int h, bool capture_subwins); static void drain_dropped_files_list(void); static NSPoint FLTKtoCocoa(Fl_Window *win, int x, int y, int H); static int get_window_frame_sizes(Fl_Window *win, int *pbx = NULL, int *pby = NULL); @@ -496,6 +498,7 @@ void Fl_Cocoa_Screen_Driver::breakMacEventLoop() #if MAC_OS_X_VERSION_MAX_ALLOWED >= MAC_OS_X_VERSION_10_7 - (NSPoint)convertBaseToScreen:(NSPoint)aPoint; #endif +- (NSBitmapImageRep*)rect_to_NSBitmapImageRep:(Fl_Rect*)r; @end @@ -717,6 +720,9 @@ void Fl_Cocoa_Screen_Driver::breakMacEventLoop() if ([self parentWindow]) return frameRect; // do not constrain subwindows return [super constrainFrameRect:frameRect toScreen:screen]; // will prevent a window from going above the menu bar } +- (NSBitmapImageRep*)rect_to_NSBitmapImageRep:(Fl_Rect*)r { + return rect_to_NSBitmapImageRep(w, r->x(), r->y(), r->w(), r->h()); +} @end @interface FLApplication : NSObject @@ -1333,7 +1339,7 @@ static FLWindowDelegate *flwindowdelegate_instance = nil; if ([[nsw childWindows] count]) { Fl_Window *window = [nsw getFl_Window]; // capture the window and its subwindows and use as miniature window image - NSBitmapImageRep *bitmap = rect_to_NSBitmapImageRep(window, 0, 0, window->w(), window->h()); + NSBitmapImageRep *bitmap = rect_to_NSBitmapImageRep_subwins(window, 0, 0, window->w(), window->h(), true); if (bitmap) { NSImage *img = [[[NSImage alloc] initWithSize:NSMakeSize([bitmap pixelsWide], [bitmap pixelsHigh])] autorelease]; [img addRepresentation:bitmap]; @@ -4213,7 +4219,7 @@ static NSBitmapImageRep* GL_rect_to_nsbitmap(Fl_Window *win, int x, int y, int w } #if MAC_OS_X_VERSION_MAX_ALLOWED >= MAC_OS_X_VERSION_10_14 -static CGImageRef rect_to_CGImage_layer(Fl_Window *win, int x, int y, int w, int h) +static NSBitmapImageRep* rect_to_NSBitmapImage_layer(Fl_Window *win, int x, int y, int w, int h) { // capture window data for layer-based views because initWithFocusedViewRect: does not work for them FLView *view = (FLView*)[fl_xid(win) contentView]; // make sure to get the most recent content of the view @@ -4229,57 +4235,59 @@ static CGImageRef rect_to_CGImage_layer(Fl_Window *win, int x, int y, int w, int CGImageRelease(cgimg); cgimg = cgimg2; } - return cgimg; + NSBitmapImageRep *bitmap = (cgimg ? [[NSBitmapImageRep alloc] initWithCGImage:cgimg/*10.5*/] : nil); + CGImageRelease(cgimg); + return bitmap; } #endif -static NSBitmapImageRep* rect_to_NSBitmapImageRep_layer(Fl_Window *win, int x, int y, int w, int h) { - NSBitmapImageRep *bitmap = nil; +static NSBitmapImageRep* rect_to_NSBitmapImageRep(Fl_Window *win, int x, int y, int w, int h) { + NSBitmapImageRep *bitmap = nil; + NSRect rect; + float s = Fl_Graphics_Driver::default_driver().scale(); + if (win->as_gl_window() && y >= 0) { + bitmap = GL_rect_to_nsbitmap(win, x, y, w, h); + } #if MAC_OS_X_VERSION_MAX_ALLOWED >= MAC_OS_X_VERSION_10_14 - CGImageRef cgimg = rect_to_CGImage_layer(win, x, y, w, h); - if (cgimg) bitmap = [[NSBitmapImageRep alloc] initWithCGImage:cgimg];//10.5 - CGImageRelease(cgimg); + else if (views_use_CA) { + bitmap = rect_to_NSBitmapImage_layer(win, x, y, w, h); + } #endif + else { + NSView *winview = nil; + if ( through_Fl_X_flush && Fl_Window::current() == win ) { + rect = NSMakeRect(x - 0.5, y - 0.5, w, h); + } + else { + winview = [fl_xid(win) contentView]; + int view_h = [winview frame].size.height; + rect = NSMakeRect(int(x*s), int(view_h-y*s-int(h*s)), int(w*s), int(h*s)); + // lock focus to win's view + #if MAC_OS_X_VERSION_MAX_ALLOWED >= MAC_OS_X_VERSION_10_4 + if (fl_mac_os_version >= 101100) [[fl_xid(win) graphicsContext] saveGraphicsState]; // necessary under 10.11 + #endif + [winview lockFocus]; + } + // The image depth is 3 until 10.5 and 4 with 10.6 and above + bitmap = [[NSBitmapImageRep alloc] initWithFocusedViewRect:rect]; + if ( !( through_Fl_X_flush && Fl_Window::current() == win) ) { + [winview unlockFocus]; + #if MAC_OS_X_VERSION_MAX_ALLOWED >= MAC_OS_X_VERSION_10_4 + if (fl_mac_os_version >= 101100) [[fl_xid(win) graphicsContext] restoreGraphicsState]; + #endif + } + } return bitmap; } -static NSBitmapImageRep* rect_to_NSBitmapImageRep(Fl_Window *win, int x, int y, int w, int h, bool capture_subwins) +static NSBitmapImageRep* rect_to_NSBitmapImageRep_subwins(Fl_Window *win, int x, int y, int w, int h, bool capture_subwins) /* Captures a rectangle from a mapped window. On retina displays, the resulting bitmap has 2 pixels per screen unit. The returned value is to be released after use */ { - NSBitmapImageRep *bitmap = nil; - NSRect rect; - float s = Fl_Graphics_Driver::default_driver().scale(); - if (win->as_gl_window() && y >= 0) { - bitmap = GL_rect_to_nsbitmap(win, x, y, w, h); - } else if (views_use_CA) { - bitmap = rect_to_NSBitmapImageRep_layer(win, x, y, w, h); - } else { - NSView *winview = nil; - if ( through_Fl_X_flush && Fl_Window::current() == win ) { - rect = NSMakeRect(x - 0.5, y - 0.5, w, h); - } - else { - winview = [fl_xid(win) contentView]; - int view_h = [winview frame].size.height; - rect = NSMakeRect(int(x*s), int(view_h-y*s-int(h*s)), int(w*s), int(h*s)); - // lock focus to win's view -#if MAC_OS_X_VERSION_MAX_ALLOWED >= MAC_OS_X_VERSION_10_4 - if (fl_mac_os_version >= 101100) [[fl_xid(win) graphicsContext] saveGraphicsState]; // necessary under 10.11 -#endif - [winview lockFocus]; - } - // The image depth is 3 until 10.5 and 4 with 10.6 and above - bitmap = [[NSBitmapImageRep alloc] initWithFocusedViewRect:rect]; - if ( !( through_Fl_X_flush && Fl_Window::current() == win) ) { - [winview unlockFocus]; -#if MAC_OS_X_VERSION_MAX_ALLOWED >= MAC_OS_X_VERSION_10_4 - if (fl_mac_os_version >= 101100) [[fl_xid(win) graphicsContext] restoreGraphicsState]; -#endif - } - } + Fl_Rect r(x, y, w, h); + NSBitmapImageRep *bitmap = [fl_xid(win) rect_to_NSBitmapImageRep:&r]; if (!capture_subwins || !bitmap) return bitmap; // capture also subwindows @@ -4293,13 +4301,14 @@ static NSBitmapImageRep* rect_to_NSBitmapImageRep(Fl_Window *win, int x, int y, CGRect clip = CGRectMake(x, win->h()-(y+h), w, h); clip = CGRectIntersection(rsub, clip); if (CGRectIsNull(clip)) continue; - NSBitmapImageRep *childbitmap = rect_to_NSBitmapImageRep(sub, clip.origin.x - sub->x(), - win->h() - clip.origin.y - sub->y() - clip.size.height, clip.size.width, clip.size.height); + NSBitmapImageRep *childbitmap = rect_to_NSBitmapImageRep_subwins(sub, clip.origin.x - sub->x(), + win->h() - clip.origin.y - sub->y() - clip.size.height, clip.size.width, clip.size.height, true); if (childbitmap) { // if bitmap is high res and childbitmap is not, childbitmap must be rescaled if (!win->as_gl_window() && Fl_Cocoa_Window_Driver::driver(win)->mapped_to_retina() && sub->as_gl_window() && !Fl::use_high_res_GL()) { childbitmap = scale_nsbitmapimagerep(childbitmap, 2); } + float s = Fl_Graphics_Driver::default_driver().scale(); write_bitmap_inside(bitmap, w*s, childbitmap, (clip.origin.x - x)*s, (win->h() - clip.origin.y - clip.size.height - y)*s ); } @@ -4319,11 +4328,8 @@ CGImageRef Fl_Cocoa_Window_Driver::CGImage_from_window_rect(int x, int y, int w, CFRelease the returned CGImageRef after use */ { -#if MAC_OS_X_VERSION_MAX_ALLOWED >= MAC_OS_X_VERSION_10_14 - if (views_use_CA && (!capture_subwins || [[fl_xid(pWindow) childWindows] count] == 0)) return rect_to_CGImage_layer(pWindow, x, y, w, h); -#endif CGImageRef img; - NSBitmapImageRep *bitmap = rect_to_NSBitmapImageRep(pWindow, x, y, w, h, capture_subwins); + NSBitmapImageRep *bitmap = rect_to_NSBitmapImageRep_subwins(pWindow, x, y, w, h, capture_subwins); if (fl_mac_os_version >= 100500) { img = (CGImageRef)[bitmap performSelector:@selector(CGImage)]; // requires Mac OS 10.5 CGImageRetain(img); |
