summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/Fl_cocoa.mm39
1 files changed, 26 insertions, 13 deletions
diff --git a/src/Fl_cocoa.mm b/src/Fl_cocoa.mm
index d6da12bee..899f35d9b 100644
--- a/src/Fl_cocoa.mm
+++ b/src/Fl_cocoa.mm
@@ -559,7 +559,7 @@ void Fl_Cocoa_Screen_Driver::breakMacEventLoop()
#endif
- (BOOL)did_view_resolution_change;
#if MAC_OS_X_VERSION_MAX_ALLOWED >= MAC_OS_X_VERSION_10_14
-- (void)create_aux_bitmap:(BOOL)retina;
+- (void)create_aux_bitmap:(CGContextRef)gc retina:(BOOL)r;
- (void)reset_aux_bitmap;
#endif
@end
@@ -2182,12 +2182,19 @@ static FLTextInputContext* fltextinputcontext_instance = nil;
return NO;
}
#if MAC_OS_X_VERSION_MAX_ALLOWED >= MAC_OS_X_VERSION_10_14
-- (void)create_aux_bitmap:(BOOL)retina {
- int W = [self frame].size.width, H = [self frame].size.height;
- if (retina) { W *= 2; H *= 2; }
- static CGColorSpaceRef cspace = CGColorSpaceCreateDeviceRGB();
- aux_bitmap = CGBitmapContextCreate(NULL, W, H, 8, 0, cspace, kCGImageAlphaPremultipliedFirst);
- if (retina) CGContextScaleCTM(aux_bitmap, 2, 2);
+- (void)create_aux_bitmap:(CGContextRef)gc retina:(BOOL)r {
+ if (!gc || fl_mac_os_version >= 110000) {
+ // bitmap context-related functions (e.g., CGBitmapContextGetBytesPerRow) can't be used here with macOS 11.0 "Big Sur"
+ static CGColorSpaceRef cspace = CGColorSpaceCreateDeviceRGB();
+ int W = [self frame].size.width, H = [self frame].size.height;
+ if (r) { W *= 2; H *= 2; }
+ aux_bitmap = CGBitmapContextCreate(NULL, W, H, 8, 0, cspace, kCGImageAlphaPremultipliedFirst);
+ } else {
+ aux_bitmap = CGBitmapContextCreate(NULL, CGBitmapContextGetWidth(gc), CGBitmapContextGetHeight(gc),
+ CGBitmapContextGetBitsPerComponent(gc), CGBitmapContextGetBytesPerRow(gc),
+ CGBitmapContextGetColorSpace(gc), CGBitmapContextGetBitmapInfo(gc));
+ }
+ if (r) CGContextScaleCTM(aux_bitmap, 2, 2);
}
- (void)reset_aux_bitmap {
CGContextRelease(aux_bitmap);
@@ -2241,20 +2248,26 @@ static FLTextInputContext* fltextinputcontext_instance = nil;
window->clear_damage(FL_DAMAGE_ALL);
}
#if MAC_OS_X_VERSION_MAX_ALLOWED >= MAC_OS_X_VERSION_10_14
- if (views_use_CA && !aux_bitmap && !window->as_gl_window()) [self create_aux_bitmap:d->mapped_to_retina()];
+ CGContextRef destination = NULL;
+ if (views_use_CA) {
+ destination = [[NSGraphicsContext currentContext] CGContext];
+ if (!aux_bitmap && !window->as_gl_window()) [self create_aux_bitmap:destination retina:d->mapped_to_retina()];
+ }
#endif
through_drawRect = YES;
if (window->damage()) d->Fl_Window_Driver::flush();
#if MAC_OS_X_VERSION_MAX_ALLOWED >= MAC_OS_X_VERSION_10_14
- if (views_use_CA) {
- CGContextRef destination = [[NSGraphicsContext currentContext] CGContext];
- if (destination) { // can be NULL with gl_start/gl_finish
+ if (destination) { // can be NULL with gl_start/gl_finish
+ if (fl_mac_os_version < 110000 && CGBitmapContextGetBytesPerRow(aux_bitmap) == CGBitmapContextGetBytesPerRow(destination)) {
+ memcpy(CGBitmapContextGetData(destination), CGBitmapContextGetData(aux_bitmap),
+ CGBitmapContextGetHeight(aux_bitmap) * CGBitmapContextGetBytesPerRow(aux_bitmap));
+ } else {
CGImageRef img = CGBitmapContextCreateImage(aux_bitmap);
CGContextDrawImage(destination, [self frame], img);
CGImageRelease(img);
}
- Fl_Cocoa_Window_Driver::q_release_context();
- }
+ }
+ Fl_Cocoa_Window_Driver::q_release_context();
#endif
if (!through_Fl_X_flush) window->clear_damage();
through_drawRect = NO;