unofficial mirror of bug-gnu-emacs@gnu.org 
 help / color / mirror / code / Atom feed
From: Alan Third <alan@idiocy.org>
To: Po Lu <luangruo@yahoo.com>
Cc: 51411@debbugs.gnu.org
Subject: bug#51411: NS port cleanups
Date: Thu, 28 Oct 2021 11:17:27 +0100	[thread overview]
Message-ID: <YXp4tzBGZQuxapLQ@idiocy.org> (raw)
In-Reply-To: <87ee86q7jm.fsf@yahoo.com>

On Thu, Oct 28, 2021 at 09:09:33AM +0800, Po Lu wrote:
> Alan Third <alan@idiocy.org> writes:
> 
> > I understand what you did, but I think the better solution is for us
> > is to try to untangle ns_draw_glyph_string, even if that means saving
> > the context there directly on occasion.
> 
> > If you want me to have a look at it let me know, I think I know what
> > needs to be done, but I probably won't get round to it as soon as you
> > could.
> 
> Thanks.  I had a try at it, cleaning up much of what appeared obviously
> unnecessary.  (Though I did not dare change what seemed to be mysterious
> to me.)
> 
> Though, OTOH, I think calling saveGraphicsState inside the overhang draw
> process is not too much of a problem as it happens infrequently enough
> to not be relevant.

Thanks, I'm much happier with this now.

I have no problem with saveGraphicsState being called within functions
directly, I'd just rather avoid adding complexity to commonly used
functions like ns_focus, which I already think are doing too much.

I've got a couple of further notes.

> diff --git a/src/nsterm.m b/src/nsterm.m
> index 4c2a3f287c..051ee511ca 100644
> --- a/src/nsterm.m
> +++ b/src/nsterm.m
> @@ -1078,11 +1078,20 @@ static NSRect constrain_frame_rect(NSRect frameRect, bool isFullscreen)
>    /* clipping */
>    if (r)
>      {
> -      [[NSGraphicsContext currentContext] saveGraphicsState];
> +      NSGraphicsContext *ctx = [NSGraphicsContext currentContext];
> +      [ctx saveGraphicsState];
>        if (n == 2)
>          NSRectClipList (r, 2);
>        else
>          NSRectClip (*r);
> +#ifdef NS_IMPL_GNUSTEP
> +      DPSrectclip (ctx, NSMinX (*r), NSMinY (*r),
> +		   NSWidth (*r), NSHeight (*r));
> +
> +      if (n == 2)
> +	DPSrectclip (ctx, NSMinX (r[1]), NSMinY (r[1]),
> +		     NSWidth (r[1]), NSHeight (r[1]));
> +#endif
>        gsaved = YES;
>      }
>  }

NSRectClipList creates a union of the passed rectangles and then sets
the clipping rectangle to that, so it contains all of them. That's
useful because NSRectClip uses the intersection of the current
clipping rectangle and the new one.

Does DPSrectclip use the intersection? If so this may not work as
intended and it might be better to union the rectangles ourselves.

> @@ -4195,13 +4091,88 @@ overwriting cursor (usually when cursor on a tab) */
>  
>    /* Draw box if not done already.  */
>    if (!s->for_overlaps && !box_drawn_p && s->face->box != FACE_NO_BOX)
> +    ns_dumpglyphs_box_or_relief (s);
> +
> +  ns_unfocus (s->f);

You unfocus here...

> +
> +  /* Draw surrounding overhangs. */
> +  if (s->prev)
>      {
> -      n = ns_get_glyph_string_clip_rect (s, r);
> -      ns_focus (s->f, r, n);
> -      ns_dumpglyphs_box_or_relief (s);
> -      ns_unfocus (s->f);
> +      struct glyph_string *prev;
> +
> +      for (prev = s->prev; prev; prev = prev->prev)
> +	if (prev->hl != s->hl
> +	    && prev->x + prev->width + prev->right_overhang > s->x)
> +	  {
> +	    /* As prev was drawn while clipped to its own area, we
> +	       must draw the right_overhang part using s->hl now.  */
> +	    enum draw_glyphs_face save = prev->hl;
> +	    struct face *save_face = prev->face;
> +
> +	    prev->face = s->face;
> +	    NSRect r = NSMakeRect (s->x, s->y, s->width, s->height);
> +	    [[NSGraphicsContext currentContext] saveGraphicsState];

... then continue working on the frame here. You either need to focus
again or extend the original focus. Remember you can focus without
setting the clipping, then save and reset the graphics state as
required if you prefer.

-- 
Alan Third





  reply	other threads:[~2021-10-28 10:17 UTC|newest]

Thread overview: 22+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
     [not found] <87mtmwt3mc.fsf.ref@yahoo.com>
2021-10-26 11:41 ` bug#51411: NS port cleanups Po Lu via Bug reports for GNU Emacs, the Swiss army knife of text editors
2021-10-26 12:39   ` Alan Third
2021-10-26 12:50     ` Po Lu via Bug reports for GNU Emacs, the Swiss army knife of text editors
2021-10-27 17:20       ` Alan Third
2021-10-28  1:09         ` Po Lu via Bug reports for GNU Emacs, the Swiss army knife of text editors
2021-10-28 10:17           ` Alan Third [this message]
2021-10-28 11:25             ` Po Lu via Bug reports for GNU Emacs, the Swiss army knife of text editors
2021-10-31 10:22               ` Alan Third
2021-10-31 10:34                 ` Po Lu via Bug reports for GNU Emacs, the Swiss army knife of text editors
2021-10-31 10:54                   ` Po Lu via Bug reports for GNU Emacs, the Swiss army knife of text editors
2021-10-31 10:59                   ` Alan Third
2021-10-31 11:20                     ` Po Lu via Bug reports for GNU Emacs, the Swiss army knife of text editors
2021-10-31 11:26                     ` Po Lu via Bug reports for GNU Emacs, the Swiss army knife of text editors
2021-10-31 12:55                       ` Alan Third
2021-10-31 13:12                         ` Po Lu via Bug reports for GNU Emacs, the Swiss army knife of text editors
2021-11-05  7:44                           ` Po Lu via Bug reports for GNU Emacs, the Swiss army knife of text editors
2021-11-06  0:20                             ` Po Lu via Bug reports for GNU Emacs, the Swiss army knife of text editors
2021-11-06 13:02                               ` Alan Third
     [not found] <CADwFkmnHko5UrsuNBKjTtt1LjgXet37zP+U9DTMv++njRHePmQ@mail.gmail.com>
2021-10-31  2:38 ` Po Lu via Bug reports for GNU Emacs, the Swiss army knife of text editors
2021-10-31  2:56   ` Stefan Kangas
2021-10-31  3:13     ` Po Lu via Bug reports for GNU Emacs, the Swiss army knife of text editors
2021-10-31  3:59       ` Stefan Kangas

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=YXp4tzBGZQuxapLQ@idiocy.org \
    --to=alan@idiocy.org \
    --cc=51411@debbugs.gnu.org \
    --cc=luangruo@yahoo.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).