From: Alex Gramiak <agrambot@gmail.com>
To: mituharu@math.s.chiba-u.ac.jp
Cc: 35468@debbugs.gnu.org
Subject: bug#35468: [PATCH] Refactor draw_glyph_string on X and w32
Date: Fri, 03 May 2019 13:01:18 -0600 [thread overview]
Message-ID: <877eb7l5vl.fsf@gmail.com> (raw)
In-Reply-To: <c560b2f02aea5b22d56d3989e3588508.squirrel@weber.math.s.chiba-u.ac.jp> (mituharu@math.s.chiba-u.ac.jp's message of "Wed, 1 May 2019 09:14:50 +0900")
mituharu@math.s.chiba-u.ac.jp writes:
> Unlike the NS port, the terminal code in the Mac port is much like the X11
> version.
I looked at your code and fortunately it indeed looks like the same
abstractions for glyph drawing that would work for the X11 version would
work for the Mac port.
> But there is one notable difference in the above respect.
> It defines mac_erase_rectangle, which is like mac_fill_rectangle (the
> XFillRectangle counterpart)
> but uses the background color of GC and also handles stipples:
>
> /* Mac replacement for XFillRectangle. */
>
> static void
> mac_fill_rectangle (struct frame *f, GC gc, int x, int y, int width, int
> height)
> {
> MAC_BEGIN_DRAW_TO_FRAME (f, gc, context);
> CGContextSetFillColorWithColor (context, gc->cg_fore_color);
> {
> CGRect rect = mac_rect_make (f, x, y, width, height);
>
> CGContextFillRects (context, &rect, 1);
> }
> MAC_END_DRAW_TO_FRAME (f);
> }
>
> static void
> mac_erase_rectangle (struct frame *f, GC gc, int x, int y,
> int width, int height)
> {
> MAC_BEGIN_DRAW_TO_FRAME (f, gc, context);
> {
> CGRect rect = mac_rect_make (f, x, y, width, height);
>
> CG_CONTEXT_FILL_RECT_WITH_GC_BACKGROUND (f, context, rect, gc);
> if (gc->xgcv.fill_style == FillOpaqueStippled && gc->xgcv.stipple)
> {
> CGContextClipToRects (context, &rect, 1);
> CGContextSetFillColorWithColor (context, gc->cg_fore_color);
> int scale = CFArrayGetCount (gc->xgcv.stipple);
> if (FRAME_BACKING_SCALE_FACTOR (f) < scale)
> scale = FRAME_BACKING_SCALE_FACTOR (f);
> CGImageRef image_mask =
> (CGImageRef) CFArrayGetValueAtIndex (gc->xgcv.stipple, scale - 1);
> rect = CGRectMake (0, 0, CGImageGetWidth (image_mask) / (CGFloat) scale,
> CGImageGetHeight (image_mask) / (CGFloat) scale);
> CGContextScaleCTM (context, 1, -1);
> CGContextSetInterpolationQuality (context, kCGInterpolationNone);
> CGContextDrawTiledImage (context, rect, image_mask);
> }
> }
> MAC_END_DRAW_TO_FRAME (f);
> }
Why does it use the background color of GC? It appears that the
Cairo version uses the foreground color of GC; is that because the Cairo
version doesn't handle stippling?
> I guess introducing the erase_rectagle handler makes things simpler and
> efficient.
Looking over the code, and considering that stippling is quite uncommon
nowadays (GTK 3 removed it, AFAIK), I think the best approach would be
to define 3 separate interface procedures:
1) fill_rectangle: handles x_fill_rectangle/mac_fill_rectangle
2) fill_rectangle_with_color: handles (1), but also with the temporary
overriding of the GC that's done frequently for mac_erase_rectangle.
3) fill_rectangle_with_stipple: handles the temporary XFillStyle
overriding of the GC.
A third procedure wouldn't be inelegant in comparison to the
alternatives, since otherwise I would need a set_context_stipple
procedure to indicate stippling.
Then mac_fill_rectangle can be assigned to fill_rectangle, and
mac_erase_rectangle can be assigned to fill_rectangle_with_stipple.
next prev parent reply other threads:[~2019-05-03 19:01 UTC|newest]
Thread overview: 26+ messages / expand[flat|nested] mbox.gz Atom feed top
2019-04-28 1:29 bug#35468: [PATCH] Refactor draw_glyph_string on X and w32 Alex Gramiak
2019-04-28 17:11 ` Eli Zaretskii
2019-04-28 19:46 ` Alex Gramiak
2019-04-29 17:43 ` Alex Gramiak
2019-04-30 4:59 ` Eli Zaretskii
2019-04-30 18:00 ` Alex Gramiak
2019-05-01 0:14 ` mituharu
2019-05-03 19:01 ` Alex Gramiak [this message]
2019-05-03 21:33 ` mituharu
2019-05-04 4:00 ` mituharu
2019-05-01 18:19 ` Eli Zaretskii
2019-05-02 19:41 ` Alex Gramiak
2019-05-02 20:14 ` Eli Zaretskii
2019-05-03 15:26 ` Basil L. Contovounesios
2019-05-04 8:17 ` Eli Zaretskii
2019-05-04 19:29 ` Alex Gramiak
2019-05-05 0:10 ` mituharu
2019-05-05 16:00 ` Eli Zaretskii
2019-05-05 2:34 ` Eli Zaretskii
2019-04-30 20:11 ` Alan Third
2019-05-01 17:38 ` Eli Zaretskii
2019-05-01 21:08 ` Alan Third
2019-05-02 18:14 ` Alex Gramiak
2019-05-03 21:12 ` Alan Third
2021-05-12 14:43 ` Lars Ingebrigtsen
2021-07-22 12:55 ` Lars Ingebrigtsen
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=877eb7l5vl.fsf@gmail.com \
--to=agrambot@gmail.com \
--cc=35468@debbugs.gnu.org \
--cc=mituharu@math.s.chiba-u.ac.jp \
/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.