From: Alan Third <alan@idiocy.org>
To: Aaron Jensen <aaronjensen@gmail.com>
Cc: Robert Pluim <rpluim@gmail.com>, 32932@debbugs.gnu.org
Subject: bug#32932: 27.0.50; render bugs on macOS Mojave
Date: Sat, 1 Feb 2020 21:20:34 +0000 [thread overview]
Message-ID: <20200201212034.GA30983@breton.holly.idiocy.org> (raw)
In-Reply-To: <CAHyO48yOpn5DyBUMQagVsFxeanNnv2G+MNg162uhV6S0aW698A@mail.gmail.com>
[-- Attachment #1: Type: text/plain, Size: 820 bytes --]
On Sat, Feb 01, 2020 at 08:29:10AM -0800, Aaron Jensen wrote:
> On Sat, Feb 1, 2020 at 6:22 AM Alan Third <alan@idiocy.org> wrote:
> >
> > I’m now stumped because I can’t actually find any image type in the
> > documentation that isn’t immutable. I’m sure there must be something.
> > The Mac port appears to be using IOSurfaces, but as far as I can tell
> > they can be changed underneath you so aren’t much use for just
> > updating little bits of the Emacs frame at a time. I must be
> > misunderstanding something.
>
> I know nothing, but have you looked into
> https://developer.apple.com/library/archive/documentation/GraphicsImaging/Conceptual/drawingwithquartz2d/dq_layers/dq_layers.html
> ?
Can you try the attached patch? It looks like it’s faster here, but I
can’t really tell.
--
Alan Third
[-- Attachment #2: 0001-Use-CGLayer-instead-of-NSBitmapImageRep-bug-32932.patch --]
[-- Type: text/plain, Size: 5704 bytes --]
From ad2feeba4284ce7ef7518781c26bd2a98389372a Mon Sep 17 00:00:00 2001
From: Alan Third <alan@idiocy.org>
Date: Sat, 1 Feb 2020 21:17:29 +0000
Subject: [PATCH] Use CGLayer instead of NSBitmapImageRep (bug#32932)
---
src/nsterm.h | 2 +-
src/nsterm.m | 67 ++++++++++++++++++++++------------------------------
2 files changed, 29 insertions(+), 40 deletions(-)
diff --git a/src/nsterm.h b/src/nsterm.h
index 980ca534cf..fbcd29be12 100644
--- a/src/nsterm.h
+++ b/src/nsterm.h
@@ -418,7 +418,7 @@ #define NSTRACE_UNSILENCE()
NSWindow *nonfs_window;
BOOL fs_is_native;
#ifdef NS_IMPL_COCOA
- NSBitmapImageRep *drawingBuffer;
+ CGLayerRef drawingBuffer;
#endif
@public
struct frame *emacsframe;
diff --git a/src/nsterm.m b/src/nsterm.m
index 9d427b9b38..94662a24fe 100644
--- a/src/nsterm.m
+++ b/src/nsterm.m
@@ -1141,7 +1141,6 @@ static NSRect constrain_frame_rect(NSRect frameRect, bool isFullscreen)
#ifdef NS_IMPL_COCOA
[NSGraphicsContext setCurrentContext:nil];
- [view display];
#else
block_input ();
@@ -2853,7 +2852,9 @@ so some key presses (TAB) are swallowed by the system. */
ns_unfocus (f);
/* as of 2006/11 or so this is now needed */
- ns_redraw_scroll_bars (f);
+ /* FIXME: I don't see any reason for this and removing it makes no
+ difference here. Do we need it for GNUstep? */
+ //ns_redraw_scroll_bars (f);
unblock_input ();
}
@@ -3169,18 +3170,6 @@ so some key presses (TAB) are swallowed by the system. */
NSTRACE_RECT ("fromRect", fromRect);
- /* Because we're drawing into an offscreen buffer which isn't
- flipped, the images come out upside down. To work around it
- we need to do some fancy transforms. */
- {
- NSAffineTransform *transform = [NSAffineTransform transform];
- [transform translateXBy:0 yBy:NSMaxY(imageRect)];
- [transform scaleXBy:1 yBy:-1];
- [transform concat];
-
- imageRect.origin.y = 0;
- }
-
[img drawInRect: imageRect
fromRect: fromRect
operation: NSCompositingOperationSourceOver
@@ -3938,11 +3927,6 @@ Function modeled after x_draw_glyph_string_box ().
NSAffineTransform *doTransform = [NSAffineTransform transform];
- /* We have to flip the image around the X axis as the offscreen
- bitmap we're drawing to is flipped. */
- [doTransform scaleXBy:1 yBy:-1];
- [doTransform translateXBy:0 yBy:-[img size].height];
-
/* ImageMagick images don't have transforms. */
if (img->transform)
[doTransform appendTransform:img->transform];
@@ -4838,7 +4822,7 @@ in certain situations (rapid incoming events).
if (NILP (window->vertical_scroll_bar))
{
if (width > 0 && height > 0)
- ns_clear_frame_area (f, left, top, width, height);
+ ns_clear_frame_area (f, left, top, width, height);
bar = [[EmacsScroller alloc] initFrame: r window: win];
wset_vertical_scroll_bar (window, make_mint_ptr (bar));
@@ -8239,10 +8223,15 @@ - (void)createDrawingBufferWithRect:(NSRect)rect
retain the old method of drawing direct to the EmacsView. */
{
#ifdef NS_IMPL_COCOA
+ NSGraphicsContext *screen;
+
if (drawingBuffer != nil)
- [drawingBuffer release];
+ CGLayerRelease (drawingBuffer);
- drawingBuffer = [[self bitmapImageRepForCachingDisplayInRect:rect] retain];
+ screen = [NSGraphicsContext graphicsContextWithBitmapImageRep:
+ [self bitmapImageRepForCachingDisplayInRect:rect]];
+
+ drawingBuffer = CGLayerCreateWithContext ([screen CGContext], rect.size, nil);
#endif
}
@@ -8250,11 +8239,12 @@ - (void)createDrawingBufferWithRect:(NSRect)rect
#ifdef NS_IMPL_COCOA
- (void)focusOnDrawingBuffer
{
- /* Creating the graphics context each time is very slow, but it
- doesn't seem possible to cache and reuse it. */
- [NSGraphicsContext
- setCurrentContext:
- [NSGraphicsContext graphicsContextWithBitmapImageRep:drawingBuffer]];
+ NSGraphicsContext *buf =
+ [NSGraphicsContext
+ graphicsContextWithCGContext:CGLayerGetContext (drawingBuffer)
+ flipped:YES];
+
+ [NSGraphicsContext setCurrentContext:buf];
}
@@ -8284,13 +8274,16 @@ - (void)copyRect:(NSRect)srcRect to:(NSRect)dstRect
NSTRACE_RECT ("Destination", dstRect);
#ifdef NS_IMPL_COCOA
- [drawingBuffer drawInRect:dstRect
- fromRect:srcRect
- operation:NSCompositingOperationCopy
- fraction:1.0
- respectFlipped:NO
- hints:nil];
+ CGPoint offset = CGPointMake (NSMinX (dstRect) - NSMinX (srcRect),
+ NSMinY (dstRect) - NSMinY (srcRect));
+ [[NSGraphicsContext currentContext] saveGraphicsState];
+ NSRectClip (dstRect);
+
+ CGContextDrawLayerAtPoint ([[NSGraphicsContext currentContext] CGContext],
+ offset, drawingBuffer);
+
+ [[NSGraphicsContext currentContext] restoreGraphicsState];
[self setNeedsDisplayInRect:dstRect];
#else
hide_bell(); // Ensure the bell image isn't scrolled.
@@ -8313,12 +8306,8 @@ - (void)drawRect: (NSRect)rect
return;
#ifdef NS_IMPL_COCOA
- [drawingBuffer drawInRect:rect
- fromRect:rect
- operation:NSCompositingOperationSourceOver
- fraction:1
- respectFlipped:NO
- hints:nil];
+ CGContextRef ctx = [[NSGraphicsContext currentContext] CGContext];
+ CGContextDrawLayerAtPoint (ctx, CGPointZero, drawingBuffer);
#else
int x = NSMinX (rect), y = NSMinY (rect);
int width = NSWidth (rect), height = NSHeight (rect);
--
2.24.0
next prev parent reply other threads:[~2020-02-01 21:20 UTC|newest]
Thread overview: 144+ messages / expand[flat|nested] mbox.gz Atom feed top
2018-10-04 13:05 bug#32932: 27.0.50; render bugs on macOS Mojave Aaron Jensen
2018-10-04 14:07 ` Alan Third
2018-10-04 17:33 ` Charles A. Roelli
2018-10-04 17:48 ` Aaron Jensen
2018-10-04 18:25 ` Alan Third
[not found] ` <CAHyO48xS6yOWVvw2Gu+Hjumahe5BC3-EA+Mwztz4831Ac2U6aA@mail.gmail.com>
2018-10-04 18:45 ` Alan Third
2018-10-04 21:51 ` Alan Third
2018-10-04 23:03 ` Aaron Jensen
[not found] ` <CAHyO48zMuX95RB7hRYxAxt6wH_XB6sF1kmnbWZWmjpPhnkqjdg@mail.gmail.com>
2018-10-09 7:15 ` Boris Buliga
2018-10-10 18:27 ` Alan Third
2018-10-11 3:40 ` Aaron Jensen
2018-10-14 8:19 ` Aaron Jensen
2018-10-14 9:04 ` Boris Buliga
2018-10-14 18:20 ` Alan Third
2018-10-14 20:17 ` Aaron Jensen
2018-10-16 4:53 ` Boris Buliga
2018-10-16 8:39 ` Boris Buliga
2018-10-16 19:04 ` Aaron Jensen
2018-10-19 16:26 ` Aaron Jensen
2018-10-19 18:48 ` Alan Third
2018-10-19 19:24 ` Aaron Jensen
2018-10-20 20:04 ` Alan Third
2018-10-23 2:15 ` Aaron Jensen
2018-10-24 10:42 ` Alan Third
2018-10-29 2:18 ` Aaron Jensen
2018-10-29 16:09 ` Alan Third
2018-10-29 17:41 ` Boris Buliga
2018-10-30 5:56 ` Aaron Jensen
2018-10-30 15:35 ` Boris Buliga
2018-10-31 21:59 ` Alan Third
2018-11-01 4:25 ` Aaron Jensen
2018-10-31 17:12 ` Alan Third
2018-11-01 4:51 ` Aaron Jensen
2018-11-01 4:58 ` Aaron Jensen
2018-11-01 5:11 ` Aaron Jensen
2018-11-01 6:13 ` Boris Buliga
2018-11-01 6:51 ` Aaron Jensen
2018-11-01 18:10 ` Eli Zaretskii
2018-11-01 19:52 ` Aaron Jensen
2018-11-01 20:12 ` Eli Zaretskii
2018-11-01 20:29 ` Aaron Jensen
2018-11-03 9:23 ` Eli Zaretskii
2018-11-01 22:55 ` Alan Third
2018-11-03 9:31 ` Eli Zaretskii
2018-11-03 20:36 ` Alan Third
2018-11-03 21:03 ` Eli Zaretskii
2018-11-04 13:24 ` Alan Third
2018-11-04 20:11 ` Alan Third
2018-11-05 16:11 ` Aaron Jensen
2018-11-05 18:55 ` Alan Third
2018-11-06 4:04 ` Aaron Jensen
2018-11-06 14:58 ` Aaron Jensen
2018-11-08 15:21 ` Alan Third
2018-11-08 15:35 ` Eli Zaretskii
2018-11-08 16:17 ` Alan Third
2018-11-08 16:28 ` Aaron Jensen
2018-11-08 23:21 ` Alan Third
2018-11-09 1:02 ` Aaron Jensen
2018-11-09 9:08 ` bug#32932: [PATCH v2] Fix more drawing bugs in NS port (bug#32932) Alan Third
2018-11-09 13:45 ` Aaron Jensen
2018-11-09 14:15 ` Aaron Jensen
2018-11-13 22:13 ` Alan Third
2018-11-14 17:08 ` Aaron Jensen
2018-11-14 18:19 ` Alan Third
2018-11-16 1:20 ` Aaron Jensen
2018-11-19 22:35 ` Alan Third
2018-11-20 2:30 ` Aaron Jensen
2018-11-23 18:17 ` Alan Third
2018-11-26 16:20 ` Aaron Jensen
2019-01-25 14:02 ` Aaron Jensen
2019-01-25 22:01 ` Alan Third
2018-11-09 8:02 ` bug#32932: 27.0.50; render bugs on macOS Mojave Eli Zaretskii
2018-11-08 16:51 ` Eli Zaretskii
2018-11-08 23:23 ` Alan Third
2018-11-03 17:57 ` Aaron Jensen
2018-11-03 19:09 ` Alan Third
2018-11-03 20:51 ` Alan Third
2018-11-03 23:56 ` Aaron Jensen
2018-11-04 13:24 ` Alan Third
2018-11-04 17:12 ` Aaron Jensen
2018-11-04 18:28 ` Eli Zaretskii
2018-10-04 19:43 ` Aaron Jensen
2018-11-03 17:56 ` Aaron Jensen
2018-11-03 18:17 ` Eli Zaretskii
2018-11-05 16:20 ` Aaron Jensen
2018-11-27 1:42 ` bug#32932: 26.2: Too many flickers with normal operations on macOS 10.13.6 Zhang Haijun
2019-11-11 18:16 ` bug#32932: 27.0.50; render bugs on macOS Mojave Alan Third
2019-11-12 13:27 ` Robert Pluim
2019-11-12 14:38 ` Alan Third
2020-01-25 12:44 ` Alan Third
2020-01-25 13:37 ` Eli Zaretskii
2020-01-27 11:06 ` Robert Pluim
2020-01-27 20:45 ` Alan Third
2020-01-28 3:21 ` Eli Zaretskii
2020-01-28 18:23 ` Alan Third
2020-01-28 19:35 ` Aaron Jensen
2020-01-28 20:07 ` Eli Zaretskii
2020-01-28 20:11 ` Aaron Jensen
2020-01-28 20:21 ` Eli Zaretskii
2020-01-28 20:24 ` Aaron Jensen
2020-01-29 10:08 ` Alan Third via Bug reports for GNU Emacs, the Swiss army knife of text editors
2020-01-29 16:32 ` Aaron Jensen
2020-01-29 20:04 ` Alan Third
2020-01-30 1:40 ` Aaron Jensen
2020-01-30 19:11 ` Alan Third
2020-01-30 20:07 ` Aaron Jensen
2020-01-31 14:57 ` Robert Pluim
2020-01-31 20:23 ` Alan Third
2020-01-31 20:26 ` Aaron Jensen
2020-02-01 1:26 ` Aaron Jensen
2020-02-01 14:22 ` Alan Third
2020-02-01 16:29 ` Aaron Jensen
2020-02-01 21:20 ` Alan Third [this message]
2020-02-01 23:05 ` Aaron Jensen
2020-02-02 13:42 ` Alan Third
2020-01-31 1:16 ` Stefan Kangas
2020-01-31 21:34 ` Mattias Engdegård
2020-02-02 12:31 ` Mattias Engdegård
2020-02-02 13:46 ` Alan Third
2020-02-02 16:49 ` Aaron Jensen
2020-02-02 22:30 ` Alan Third
2020-02-02 22:44 ` Mattias Engdegård
2020-02-03 0:14 ` Aaron Jensen
2020-02-03 7:39 ` Alan Third
2020-02-03 8:16 ` Aaron Jensen
2020-02-03 20:44 ` Alan Third
2020-02-03 20:46 ` Aaron Jensen
2020-02-03 21:30 ` Alan Third
2020-02-06 18:04 ` Aaron Jensen
2020-02-07 20:18 ` Alan Third
2020-02-08 1:26 ` Aaron Jensen
2020-02-08 14:13 ` Alan Third
2020-02-08 16:45 ` Aaron Jensen
2020-02-10 7:44 ` Alan Third
2020-02-10 15:21 ` Aaron Jensen
2020-02-10 17:14 ` Aaron Jensen
2020-02-10 21:33 ` Alan Third
2020-02-13 17:24 ` Aaron Jensen
2020-02-13 18:32 ` Alan Third
2020-02-03 16:04 ` Mattias Engdegård
2020-02-03 16:05 ` Aaron Jensen
2020-02-03 16:09 ` Mattias Engdegård
2020-02-03 21:28 ` Alan Third
2020-02-10 8:59 ` Robert Pluim
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
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20200201212034.GA30983@breton.holly.idiocy.org \
--to=alan@idiocy.org \
--cc=32932@debbugs.gnu.org \
--cc=aaronjensen@gmail.com \
--cc=rpluim@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 external index
https://git.savannah.gnu.org/cgit/emacs.git
https://git.savannah.gnu.org/cgit/emacs/org-mode.git
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.