FLTK logo

[master] e4ce395 - macOS: account for deprecation of [NSBitmapImageRep initWithFocusedViewRect:] in macOS 10.14

FLTK matrix user chat room
(using Element browser app)   FLTK gitter user chat room   GitHub FLTK Project   FLTK News RSS Feed  
  FLTK Apps      FLTK Library      Forums      Links     Login 
 All Forums  |  Back to fltk.commit  ]
 
Previous Message ]Next Message ]

[master] e4ce395 - macOS: account for deprecation of [NSBitmapImageRep initWithFocusedViewRect:] in macOS 10.14 "ManoloFLTK" Aug 04, 2021  
 
commit e4ce39559a00e15ca25a83e117306a651f6bdeb3
Author:     ManoloFLTK <41016272+ManoloFLTK@users.noreply.github.com>
AuthorDate: Wed Aug 4 18:25:37 2021 +0200
Commit:     ManoloFLTK <41016272+ManoloFLTK@users.noreply.github.com>
CommitDate: Wed Aug 4 18:25:37 2021 +0200

    macOS: account for deprecation of [NSBitmapImageRep initWithFocusedViewRect:] in macOS 10.14

 src/Fl_cocoa.mm | 65 ++++++++++++++++++++++++++++++++++++++-------------------
 1 file changed, 43 insertions(+), 22 deletions(-)

diff --git src/Fl_cocoa.mm src/Fl_cocoa.mm
index d57de05..92e6d19 100644
--- src/Fl_cocoa.mm
+++ src/Fl_cocoa.mm
@@ -76,7 +76,6 @@ static NSBitmapImageRep* rect_to_NSBitmapImageRep_subwins(Fl_Window *win, int x,
 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);
-static NSBitmapImageRep *scale_nsbitmapimagerep(NSBitmapImageRep *img, float scale);
 
 int fl_mac_os_version = Fl_Darwin_System_Driver::calc_mac_os_version();         // the version number of the running Mac OS X (e.g., 100604 for 10.6.4)
 
@@ -107,9 +106,6 @@ static bool in_nsapp_run = false; // true during execution of [NSApp run]
 static NSMutableArray *dropped_files_list = nil; // list of files dropped at app launch
 typedef void (*open_cb_f_type)(const char *);
 static Fl_Window *starting_moved_window = NULL; // the moved window which brings its subwins with it
-#if MAC_OS_X_VERSION_MAX_ALLOWED >= MAC_OS_X_VERSION_10_4 && MAC_OS_X_VERSION_MAX_ALLOWED < MAC_OS_X_VERSION_10_12
-#  define NSBitmapFormatFloatingPointSamples NSFloatingPointSamplesBitmapFormat
-#endif
 
 #if CONSOLIDATE_MOTION
 static Fl_Window* send_motion;
@@ -3444,6 +3440,46 @@ void Fl_Cocoa_Window_Driver::q_release_context(Fl_Cocoa_Window_Driver *x) {
 #endif
 }
 
+
+static NSBitmapImageRep *pdf_to_nsbitmapimagerep(NSData *pdfdata) {
+  NSImage *image = [[NSImage alloc] initWithData:pdfdata];
+  NSInteger width = [image size].width * 2;
+  NSInteger height = [image size].height * 2;
+  NSBitmapImageRep *bitmap = [NSBitmapImageRep alloc];
+  NSRect dest_r = NSMakeRect(0, 0, width, height);
+#if MAC_OS_X_VERSION_MAX_ALLOWED >= MAC_OS_X_VERSION_10_9
+  if (fl_mac_os_version >= 100900) {
+    // This procedure is necessary because initWithFocusedViewRect is deprecated in macOS 10.14
+    // and because it produces a bitmap with floating point pixel values with macOS 11.x
+    bitmap = [bitmap initWithBitmapDataPlanes:NULL
+                                   pixelsWide:width
+                                   pixelsHigh:height
+                                bitsPerSample:8
+                              samplesPerPixel:4
+                                     hasAlpha:YES
+                                     isPlanar:NO
+                               colorSpaceName:NSDeviceRGBColorSpace
+                                  bytesPerRow:4 * width
+                                 bitsPerPixel:32];
+    NSAutoreleasePool *localPool = [[NSAutoreleasePool alloc] init];
+    [NSGraphicsContext saveGraphicsState];
+    [NSGraphicsContext setCurrentContext:[NSGraphicsContext graphicsContextWithBitmapImageRep:bitmap]];// 10.4
+    [image drawInRect:dest_r]; // 10.9
+    [NSGraphicsContext restoreGraphicsState];
+    [localPool release];
+  } else
+#endif
+  {
+    [image lockFocus];
+    bitmap = [bitmap initWithFocusedViewRect:dest_r]; // deprecated 10.14
+    [image unlockFocus];
+  }
+  [bitmap setSize:[image size]];
+  [image release];
+  return bitmap;
+}
+
+
 Fl_Quartz_Copy_Surface_Driver::~Fl_Quartz_Copy_Surface_Driver()
 {
   CGContextRestoreGState(gc);
@@ -3455,16 +3491,12 @@ Fl_Quartz_Copy_Surface_Driver::~Fl_Quartz_Copy_Surface_Driver()
   NSPasteboard *clip = [NSPasteboard generalPasteboard];
   [clip declareTypes:[NSArray arrayWithObjects:PDF_pasteboard_type, TIFF_pasteboard_type, nil] owner:nil];
   [clip setData:(NSData*)pdfdata forType:PDF_pasteboard_type];
+  
   //second, transform this PDF to a bitmap image and put it as tiff in clipboard with retina resolution
-  NSImage *image = [[NSImage alloc] initWithData:(NSData*)pdfdata];
+  NSBitmapImageRep *bitmap = pdf_to_nsbitmapimagerep((NSData*)pdfdata);
   CFRelease(pdfdata);
-  [image lockFocus];
-  NSBitmapImageRep *bitmap = [[NSBitmapImageRep alloc] initWithFocusedViewRect:NSMakeRect(0, 0, [image size].width*2, [image size].height*2)];
-  [image unlockFocus];
-  [bitmap setSize:[image size]];
   [clip setData:[bitmap TIFFRepresentation] forType:TIFF_pasteboard_type];
   [bitmap release];
-  [image release];
   delete driver();
 }
 
@@ -3598,20 +3630,9 @@ static Fl_RGB_Image* get_image_from_clipboard(Fl_Widget *receiver)
     bitmap = [[NSBitmapImageRep alloc] initWithData:data];
   }
   else if ([found isEqualToString:PDF_pasteboard_type] || [found isEqualToString:PICT_pasteboard_type]) {
-    NSImage *nsimg = [[NSImage alloc] initWithData:data];
-    [nsimg lockFocus];
-    bitmap = [[NSBitmapImageRep alloc] initWithFocusedViewRect:NSMakeRect(0, 0, [nsimg size].width*2, [nsimg size].height*2)];
-    [bitmap setSize:[nsimg size]];
-    [nsimg unlockFocus];
-    [nsimg release];
+    bitmap = pdf_to_nsbitmapimagerep(data);
   }
   if (!bitmap) return NULL;
-#if MAC_OS_X_VERSION_MAX_ALLOWED >= MAC_OS_X_VERSION_10_4
-  if (fl_mac_os_version >= 100400 && ([bitmap bitmapFormat] & NSBitmapFormatFloatingPointSamples)) {
-    // this may happen with macOS â?¥ 11.x
-    bitmap = scale_nsbitmapimagerep(bitmap, 1); // transform from floating point to integer pixel values
-  }
-#endif
   int bytesPerPixel([bitmap bitsPerPixel]/8);
   int bpr([bitmap bytesPerRow]);
   int hh([bitmap pixelsHigh]);
Direct Link to Message ]
 
     
Previous Message ]Next Message ]
 
 

Comments are owned by the poster. All other content is copyright 1998-2024 by Bill Spitzak and others. This project is hosted by The FLTK Team. Please report site problems to 'erco@seriss.com'.