diff options
| author | Manolo Gouy <Manolo> | 2012-09-17 09:00:22 +0000 |
|---|---|---|
| committer | Manolo Gouy <Manolo> | 2012-09-17 09:00:22 +0000 |
| commit | 7ee797304098d0906c2eff4bfe088290d2c58165 (patch) | |
| tree | 8c8a0fe8091929aae748d99ec4a0a9dfcb11523e | |
| parent | 703d78c4b0d765a9eb59132c6b1a697414697bac (diff) | |
Fix for bug described in fltk.development "fl_scroll not copying all channels on OS X"
http://www.fltk.org/newsgroups.php?s13117+gfltk.development+v13134+T0
Sending the CGImage message to an NSBitmapImageRep object seems to be the solution
when Mac OS X >=10.5.
git-svn-id: file:///fltk/svn/fltk/branches/branch-1.3@9680 ea41ed52-d2ee-0310-a9c1-e6b18d33e121
| -rw-r--r-- | src/Fl_cocoa.mm | 40 |
1 files changed, 27 insertions, 13 deletions
diff --git a/src/Fl_cocoa.mm b/src/Fl_cocoa.mm index bc7fbb7d3..6d3defed7 100644 --- a/src/Fl_cocoa.mm +++ b/src/Fl_cocoa.mm @@ -3315,10 +3315,10 @@ int Fl::dnd(void) return true; } -unsigned char *Fl_X::bitmap_from_window_rect(Fl_Window *win, int x, int y, int w, int h, int *bytesPerPixel) -// delete[] the returned pointer after use +static NSBitmapImageRep* rect_to_NSBitmapImageRep(Fl_Window *win, int x, int y, int w, int h) +// release the returned value after use { - while(win->window()) { + while (win->window()) { x += win->x(); y += win->y(); win = win->window(); @@ -3329,7 +3329,13 @@ unsigned char *Fl_X::bitmap_from_window_rect(Fl_Window *win, int x, int y, int w // left pixel column are not read, and bitmap is read shifted by one pixel in both directions. // Under 10.5, we want no offset. NSRect rect = NSMakeRect(x - epsilon, y - epsilon, w, h); - NSBitmapImageRep *bitmap = [[NSBitmapImageRep alloc] initWithFocusedViewRect:rect]; + return [[NSBitmapImageRep alloc] initWithFocusedViewRect:rect]; +} + +unsigned char *Fl_X::bitmap_from_window_rect(Fl_Window *win, int x, int y, int w, int h, int *bytesPerPixel) +// delete[] the returned pointer after use +{ + NSBitmapImageRep *bitmap = rect_to_NSBitmapImageRep(win, x, y, w, h); *bytesPerPixel = [bitmap bitsPerPixel]/8; int bpp = (int)[bitmap bytesPerPlane]; int bpr = (int)[bitmap bytesPerRow]; @@ -3359,16 +3365,24 @@ static void imgProviderReleaseData (void *info, const void *data, size_t size) CGImageRef Fl_X::CGImage_from_window_rect(Fl_Window *win, int x, int y, int w, int h) // CFRelease the returned CGImageRef after use { - int bpp; - unsigned char *bitmap = bitmap_from_window_rect(win, x, y, w, h, &bpp); CGImageRef img; - CGColorSpaceRef lut = CGColorSpaceCreateDeviceRGB(); - CGDataProviderRef provider = CGDataProviderCreateWithData(NULL, bitmap, w*h*bpp, imgProviderReleaseData); - img = CGImageCreate(w, h, 8, 8*bpp, w*bpp, lut, - bpp == 3 ? kCGImageAlphaNone : kCGImageAlphaLast, - provider, NULL, false, kCGRenderingIntentDefault); - CGColorSpaceRelease(lut); - CGDataProviderRelease(provider); + if (fl_mac_os_version >= 100500) { + NSBitmapImageRep *bitmap = rect_to_NSBitmapImageRep(win, x, y, w, h); + img = [bitmap CGImage]; // requires Mac OS 10.5 + CGImageRetain(img); + [bitmap release]; + } + else { + int bpp; + unsigned char *bitmap = bitmap_from_window_rect(win, x, y, w, h, &bpp); + CGColorSpaceRef lut = CGColorSpaceCreateDeviceRGB(); + CGDataProviderRef provider = CGDataProviderCreateWithData(NULL, bitmap, w*h*bpp, imgProviderReleaseData); + img = CGImageCreate(w, h, 8, 8*bpp, w*bpp, lut, + bpp == 3 ? kCGImageAlphaNone : kCGImageAlphaLast, + provider, NULL, false, kCGRenderingIntentDefault); + CGColorSpaceRelease(lut); + CGDataProviderRelease(provider); + } return img; } |
