unofficial mirror of bug-gnu-emacs@gnu.org 
 help / color / mirror / code / Atom feed
From: Arash Esbati <arash@gnu.org>
To: Stefan Kangas <stefankangas@gmail.com>
Cc: "Rudolf Adamkovič" <rudolf@adamkovic.org>,
	73384@debbugs.gnu.org, "JD Smith" <jdtsmith@gmail.com>,
	"Ben Simms" <bsimms.simms@gmail.com>
Subject: bug#73384: [PATCH] Draw coloured stipples on NS
Date: Wed, 11 Dec 2024 07:20:06 +0100	[thread overview]
Message-ID: <m2cyhyoi5l.fsf@macmutant.fritz.box> (raw)
In-Reply-To: <m24j4v2oa2.fsf@macmutant.fritz.box> (Arash Esbati's message of "Tue, 29 Oct 2024 11:31:49 +0100")

[-- Attachment #1: Type: text/plain, Size: 334 bytes --]

Arash Esbati <arash@gnu.org> writes:

> Stefan, did you have a chance to look at this again?  I'm attaching the
> patch Ben sent me off-list.  Maybe you can advise how to proceed and get
> this installed.  TIA.

Ping!

Do you see a chance to install this change?  Or should I ask Alan Third
if he can kindly have a look?

Best, Arash

[-- Warning: decoded text below may be mangled, UTF-8 assumed --]
[-- Attachment #2: 0001-Use-masked-coregraphics-images-on-cocoa-NS.patch --]
[-- Type: text/x-patch, Size: 6731 bytes --]

From 1c4b8efb82bd0e35c91d98f2759217702f3a7c65 Mon Sep 17 00:00:00 2001
From: Ben Simms <ben@bensimms.moe>
Date: Mon, 14 Oct 2024 19:32:53 +0100
Subject: [PATCH] Use masked coregraphics images on cocoa NS

---
 src/nsimage.m | 31 +++++++++++++++++++++++++++++++
 src/nsterm.h  |  8 ++++++++
 src/nsterm.m  | 47 +++++++++++++++++++++++++++++++++++++++++++++--
 3 files changed, 84 insertions(+), 2 deletions(-)

diff --git a/src/nsimage.m b/src/nsimage.m
index ee72d6e0ea1..e36cbe5dc87 100644
--- a/src/nsimage.m
+++ b/src/nsimage.m
@@ -35,6 +35,9 @@ Updated by Christian Limpach (chris@nice.ch)
 #include "frame.h"
 #include "coding.h"
 
+#ifdef NS_IMPL_COCOA
+#include <CoreGraphics/CoreGraphics.h>
+#endif
 
 #if defined (NS_IMPL_GNUSTEP) || MAC_OS_X_VERSION_MAX_ALLOWED < 1070
 # define COLORSPACE_NAME NSCalibratedRGBColorSpace
@@ -289,7 +292,11 @@ + (instancetype)allocInitFromFile: (Lisp_Object)file
 
 - (void)dealloc
 {
+#ifdef NS_IMPL_COCOA
+  CGImageRelease(stippleMask);
+#else
   [stippleMask release];
+#endif
   [bmRep release];
   [transform release];
   [super dealloc];
@@ -300,7 +307,11 @@ - (id)copyWithZone:(NSZone *)zone
 {
   EmacsImage *copy = [super copyWithZone:zone];
 
+#ifdef NS_IMPL_COCOA
+  copy->stippleMask = CGImageCreateCopy(stippleMask);
+#else
   copy->stippleMask = [stippleMask copyWithZone:zone];
+#endif /* NS_IMPL_COCOA */
   copy->bmRep = [bmRep copyWithZone:zone];
   copy->transform = [transform copyWithZone:zone];
 
@@ -509,6 +520,25 @@ - (void) setAlphaAtX: (int) x Y: (int) y to: (unsigned char) a
     }
 }
 
+#ifdef NS_IMPL_COCOA
+/* Returns a cached CGImageMask of the stipple pattern */
+- (CGImageRef)stippleMask
+{
+  if (stippleMask == nil) {
+    CGDataProviderRef provider = CGDataProviderCreateWithData (NULL, [bmRep bitmapData],
+                                                             [self sizeInBytes], NULL);
+    CGImageRef mask = CGImageMaskCreate(
+                                        [self size].width,
+                                        [self size].height,
+                                        8, 8, [self size].width,
+                                        provider, NULL, 0);
+
+    CGDataProviderRelease(provider);
+    stippleMask = CGImageRetain(mask);
+  }
+  return stippleMask;
+}
+#else
 /* Returns a pattern color, which is cached here.  */
 - (NSColor *)stippleMask
 {
@@ -516,6 +546,7 @@ - (NSColor *)stippleMask
       stippleMask = [[NSColor colorWithPatternImage: self] retain];
   return stippleMask;
 }
+#endif /* NS_IMPL_COCOA */
 
 /* Find the first NSBitmapImageRep which has multiple frames.  */
 - (NSBitmapImageRep *)getAnimatedBitmapImageRep
diff --git a/src/nsterm.h b/src/nsterm.h
index 6c67653705e..2370f6ea3fb 100644
--- a/src/nsterm.h
+++ b/src/nsterm.h
@@ -671,7 +671,11 @@ #define NSTRACE_UNSILENCE()
 {
   NSBitmapImageRep *bmRep; /* used for accessing pixel data */
   unsigned char *pixmapData[5]; /* shortcut to access pixel data */
+#ifdef NS_IMPL_COCOA
+  CGImageRef stippleMask;
+#else
   NSColor *stippleMask;
+#endif // NS_IMPL_COCOA
 @public
   NSAffineTransform *transform;
   BOOL smoothing;
@@ -688,7 +692,11 @@ #define NSTRACE_UNSILENCE()
                green: (unsigned char)g blue: (unsigned char)b
               alpha:(unsigned char)a;
 - (void)setAlphaAtX: (int)x Y: (int)y to: (unsigned char)a;
+#ifdef NS_IMPL_COCOA
+- (CGImageRef)stippleMask;
+#else
 - (NSColor *)stippleMask;
+#endif // NS_IMPL_COCOA
 - (Lisp_Object)getMetadata;
 - (BOOL)setFrame: (unsigned int) index;
 - (void)setTransform: (double[3][3]) m;
diff --git a/src/nsterm.m b/src/nsterm.m
index f68a22d9fbc..a617669cb4d 100644
--- a/src/nsterm.m
+++ b/src/nsterm.m
@@ -3823,8 +3823,31 @@ Function modeled after x_draw_glyph_string_box ().
       if (s->stippled_p)
 	{
 	  struct ns_display_info *dpyinfo = FRAME_DISPLAY_INFO (s->f);
+#ifdef NS_IMPL_COCOA
+    [[NSColor colorWithUnsignedLong:face->background] set];
+    r = NSMakeRect (s->x, s->y + box_line_width,
+        s->background_width,
+        s->height - 2 * box_line_width);
+    NSRectFill (r);
+    s->background_filled_p = 1;
+    CGImageRef mask = [dpyinfo->bitmaps[face->stipple - 1].img stippleMask];
+    CGRect bounds = CGRectMake (s->x, s->y + box_line_width,
+        s->background_width,
+        s->height - 2 * box_line_width);
+    NSGraphicsContext *ctx = [NSGraphicsContext currentContext];
+    [ctx saveGraphicsState];
+    CGContextRef context = [ctx CGContext];
+    CGContextClipToRect (context, bounds);
+    CGContextScaleCTM (context, 1, -1);
+    [[NSColor colorWithUnsignedLong:face->foreground] set];
+    CGRect imageSize = CGRectMake (0, 0, CGImageGetWidth (mask), CGImageGetHeight (mask));
+    CGContextDrawTiledImage (context, imageSize, mask);
+    [[NSGraphicsContext currentContext] restoreGraphicsState];
+#else
 	  [[dpyinfo->bitmaps[face->stipple-1].img stippleMask] set];
 	  goto fill;
+#endif /* NS_IMPL_COCOA */
+
 	}
       else if (FONT_HEIGHT (s->font) < s->height - 2 * box_line_width
 	       /* When xdisp.c ignores FONT_HEIGHT, we cannot trust font
@@ -3847,7 +3870,9 @@ Function modeled after x_draw_glyph_string_box ().
 	  else
 	    [FRAME_CURSOR_COLOR (s->f) set];
 
+#ifndef NS_IMPL_COCOA
 	fill:
+#endif /* !NS_IMPL_COCOA */
 	  r = NSMakeRect (s->x, s->y + box_line_width,
 			  s->background_width,
 			  s->height - 2 * box_line_width);
@@ -4171,8 +4196,26 @@ Function modeled after x_draw_glyph_string_box ().
 	  dpyinfo = FRAME_DISPLAY_INFO (s->f);
 	  if (s->hl == DRAW_CURSOR)
 	    [FRAME_CURSOR_COLOR (s->f) set];
-	  else if (s->stippled_p)
-	    [[dpyinfo->bitmaps[s->face->stipple - 1].img stippleMask] set];
+	  else if (s->stippled_p) {
+#ifdef NS_IMPL_COCOA
+      [[NSColor colorWithUnsignedLong:s->face->background] set];
+      NSRectFill (NSMakeRect (x, s->y, background_width, s->height));
+      CGImageRef mask = [dpyinfo->bitmaps[s->face->stipple - 1].img stippleMask];
+      CGRect bounds = CGRectMake (s->x, s->y, s->background_width, s->height);
+      NSGraphicsContext *ctx = [NSGraphicsContext currentContext];
+      [ctx saveGraphicsState];
+      CGContextRef context = [ctx CGContext];
+      CGContextClipToRect(context, bounds);
+      CGContextScaleCTM (context, 1, -1);
+      [[NSColor colorWithUnsignedLong:s->face->foreground] set];
+      CGRect imageSize = CGRectMake (0, 0, CGImageGetWidth (mask),
+      CGImageGetHeight (mask));
+      CGContextDrawTiledImage (context, imageSize, mask);
+      [[NSGraphicsContext currentContext] restoreGraphicsState];
+#else 
+      [[dpyinfo->bitmaps[s->face->stipple - 1].img stippleMask] set];
+#endif /* NS_IMPL_COCOA */
+    }
 	  else
 	    [[NSColor colorWithUnsignedLong: s->face->background] set];
 
-- 
2.46.0


  reply	other threads:[~2024-12-11  6:20 UTC|newest]

Thread overview: 21+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2024-09-20  7:57 bug#73384: [PATCH] Draw coloured stipples on NS Ben Simms
2024-09-21 11:41 ` Stefan Kangas
2024-09-21 15:08   ` Arash Esbati
2024-09-28 18:30     ` JD Smith
2024-09-28 23:49       ` Po Lu via Bug reports for GNU Emacs, the Swiss army knife of text editors
2024-09-29 17:51         ` JD Smith
2024-09-29 20:33         ` Stefan Kangas
2024-09-29 23:31           ` Po Lu via Bug reports for GNU Emacs, the Swiss army knife of text editors
2024-09-30  0:13             ` Stefan Kangas
2024-09-30 11:24             ` Eli Zaretskii
2024-10-08  5:03               ` Arash Esbati
2024-10-14  1:29     ` Rudolf Adamkovič
2024-10-14 18:35       ` Ben Simms
2024-10-17 10:43         ` Arash Esbati
2024-10-19  8:34           ` Ben Simms
2024-10-21 18:23             ` Arash Esbati
     [not found]               ` <CALNBX0YYHHtHh-FMyBVNz5pE8EWeQ7v9cpdr6ifZyeQGf2Ecvg@mail.gmail.com>
2024-10-21 19:26                 ` Arash Esbati
2024-10-29 10:31                   ` Arash Esbati
2024-12-11  6:20                     ` Arash Esbati [this message]
2024-12-15 14:21                       ` Stefan Kangas
2024-12-18 21:55                       ` Alan Third

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

  List information: https://www.gnu.org/software/emacs/

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=m2cyhyoi5l.fsf@macmutant.fritz.box \
    --to=arash@gnu.org \
    --cc=73384@debbugs.gnu.org \
    --cc=bsimms.simms@gmail.com \
    --cc=jdtsmith@gmail.com \
    --cc=rudolf@adamkovic.org \
    --cc=stefankangas@gmail.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
Code repositories for project(s) associated with this public inbox

	https://git.savannah.gnu.org/cgit/emacs.git

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).