Tk Source Code

Artifact [aeab72de]
Login

Artifact aeab72dee09494880b08bb5d2a945e158f817ece820a3fb45b76943e170f9f92:

Attachment "0004-Rename-TkMacOSXBitmapRepFromDrawableRect.patch" to ticket [685ac307] added by chrstphrchvz 2020-08-18 01:59:57.
From 95f2f06d4a33893fc8c582fc3eae6577f3a442f8 Mon Sep 17 00:00:00 2001
From: Christopher Chavez <[email protected]>
Date: Thu, 13 Aug 2020 20:10:52 -0500
Subject: [PATCH 4/6] Rename TkMacOSXBitmapRepFromDrawableRect()
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

…to TkMacOSXCreateCGImageFromDrawableRect() and return a CGImageRef
instead.
---
 macosx/tkMacOSXDraw.c    | 32 +++++++++++++-------------------
 macosx/tkMacOSXImage.c   |  9 +++++----
 macosx/tkMacOSXPrivate.h |  2 +-
 3 files changed, 19 insertions(+), 24 deletions(-)

diff --git macosx/tkMacOSXDraw.c macosx/tkMacOSXDraw.c
index 9d9dcadc6..2f0d3d458 100644
--- macosx/tkMacOSXDraw.c
+++ macosx/tkMacOSXDraw.c
@@ -108,29 +108,29 @@ TkMacOSXInitCGDrawing(
 /*
  *----------------------------------------------------------------------
  *
- * TkMacOSXBitmapRepFromDrawableRect
+ * TkMacOSXCreateCGImageFromDrawableRect
  *
- *	Extract bitmap data from a MacOSX drawable as an NSBitmapImageRep.
+ *	Extract bitmap data from a MacOSX drawable as a CGImage.
  *
  *      Currently only used by XGetImage and XCopyArea.
  *
  * Results:
- *	Returns an NSBitmapRep representing the image of the given rectangle of
- *      the given drawable. This object is retained. The caller is responsible
- *      for releasing it.
+ *	Returns a CGImageRef representing the image of the given rectangle of
+ *	the given drawable. The caller is responsible for releasing it.
+ *	If the CGImage couldn't be created, then NULL is returned.
  *
  *      NOTE: The x,y coordinates should be relative to a coordinate system
  *      with origin at the top left, as used by XImage and CGImage, not bottom
  *      left as used by NSView.
  *
  * Side effects:
- *     None
+ *	If successful, allocates a new CGImage.
  *
  *----------------------------------------------------------------------
  */
 
-NSBitmapImageRep *
-TkMacOSXBitmapRepFromDrawableRect(
+CGImageRef
+TkMacOSXCreateCGImageFromDrawableRect(
     Drawable drawable,
     int x,
     int y,
@@ -152,10 +152,6 @@ TkMacOSXBitmapRepFromDrawableRect(
 	cg_context = TkMacOSXGetCGContextForDrawable(drawable);
 	cg_image = CGBitmapContextCreateImage((CGContextRef) cg_context);
 	sub_cg_image = CGImageCreateWithImageInRect(cg_image, image_rect);
-	if (sub_cg_image) {
-	    bitmap_rep = [NSBitmapImageRep alloc];
-	    [bitmap_rep initWithCGImage:sub_cg_image];
-	}
 	if (cg_image) {
 	    CGImageRelease(cg_image);
 	}
@@ -189,15 +185,17 @@ TkMacOSXBitmapRepFromDrawableRect(
 	     */
 	    bitmap_rep = [[NSBitmapImageRep alloc]
 		    initWithFocusedViewRect:view_rect];
-	    [bitmap_rep retain];
 	}
 	if (needsToUnlockFocus) {
 	    [view unlockFocus];
 	}
+	sub_cg_image = [bitmap_rep CGImage];
+	CGImageRetain(sub_cg_image);
+	[bitmap_rep release];
     } else {
 	TkMacOSXDbgMsg("Invalid source drawable");
     }
-    return bitmap_rep;
+    return sub_cg_image;
 }
 
 /*
@@ -273,7 +271,6 @@ XCopyArea(
 {
     TkMacOSXDrawingContext dc;
     MacDrawable *srcDraw = (MacDrawable *) src;
-    NSBitmapImageRep *bitmap_rep = NULL;
     CGImageRef img = NULL;
     CGRect bounds, srcRect, dstRect;
 
@@ -295,11 +292,8 @@ XCopyArea(
     if (srcDraw->flags & TK_IS_PIXMAP) {
 	img = TkMacOSXCreateCGImageWithDrawable(src);
     } else if (TkMacOSXDrawableWindow(src)) {
-	bitmap_rep = TkMacOSXBitmapRepFromDrawableRect(src,
+	img = TkMacOSXCreateCGImageFromDrawableRect(src,
 		src_x, src_y, width, height);
-	if (bitmap_rep) {
-	    img = [bitmap_rep CGImage];
-	}
     } else {
 	TkMacOSXDbgMsg("Invalid source drawable - neither window nor pixmap.");
     }
diff --git macosx/tkMacOSXImage.c macosx/tkMacOSXImage.c
index 3604841ee..3c8530505 100644
--- macosx/tkMacOSXImage.c
+++ macosx/tkMacOSXImage.c
@@ -177,12 +177,13 @@ XGetImage(
 	    return NULL;
 	}
 
-	bitmap_rep = TkMacOSXBitmapRepFromDrawableRect(drawable,
-		x, y, width, height);
-	if (!bitmap_rep) {
-	    TkMacOSXDbgMsg("XGetImage: Failed to construct NSBitmapRep");
+	CGImageRef cg_image = TkMacOSXCreateCGImageFromDrawableRect(
+		drawable, x, y, width, height);
+	if (!cg_image) {
+	    TkMacOSXDbgMsg("XGetImage: Failed to get CGImage");
 	    return NULL;
 	}
+	bitmap_rep = [[NSBitmapImageRep alloc] initWithCGImage:cg_image];
 	bitmap_fmt = [bitmap_rep bitmapFormat];
 	size = [bitmap_rep bytesPerPlane];
 	bytes_per_row = [bitmap_rep bytesPerRow];
diff --git macosx/tkMacOSXPrivate.h macosx/tkMacOSXPrivate.h
index d8372c1e4..f3900ee33 100644
--- macosx/tkMacOSXPrivate.h
+++ macosx/tkMacOSXPrivate.h
@@ -267,7 +267,7 @@ MODULE_SCOPE WindowClass TkMacOSXWindowClass(TkWindow *winPtr);
 MODULE_SCOPE int	TkMacOSXIsWindowZoomed(TkWindow *winPtr);
 MODULE_SCOPE int	TkGenerateButtonEventForXPointer(Window window);
 MODULE_SCOPE EventModifiers TkMacOSXModifierState(void);
-MODULE_SCOPE NSBitmapImageRep* TkMacOSXBitmapRepFromDrawableRect(Drawable drawable,
+MODULE_SCOPE CGImageRef	TkMacOSXCreateCGImageFromDrawableRect(Drawable drawable,
 			    int x, int y, unsigned int width, unsigned int height);
 MODULE_SCOPE CGImageRef TkMacOSXCreateCGImageWithXImage(XImage *image);
 MODULE_SCOPE void       TkMacOSXDrawCGImage(Drawable d, GC gc, CGContextRef context,
-- 
2.28.0