From mboxrd@z Thu Jan 1 00:00:00 1970 Path: news.gmane.io!.POSTED.blaine.gmane.org!not-for-mail From: "Elijah G." Newsgroups: gmane.emacs.bugs Subject: bug#71159: [PATCH] Stipple support for MS Windows Date: Wed, 29 May 2024 17:25:19 -0600 Message-ID: <86jzjcgq00.fsf@gmail.com> References: <86cypcuhhk.fsf@gmail.com> Mime-Version: 1.0 Content-Type: multipart/mixed; boundary="=-=-=" Injection-Info: ciao.gmane.io; posting-host="blaine.gmane.org:116.202.254.214"; logging-data="23430"; mail-complaints-to="usenet@ciao.gmane.io" User-Agent: Gnus/5.13 (Gnus v5.13) Emacs/30.0.50 (windows-nt) To: 71159@debbugs.gnu.org, Eli Zaretskii Original-X-From: bug-gnu-emacs-bounces+geb-bug-gnu-emacs=m.gmane-mx.org@gnu.org Thu May 30 01:29:09 2024 Return-path: Envelope-to: geb-bug-gnu-emacs@m.gmane-mx.org Original-Received: from lists.gnu.org ([209.51.188.17]) by ciao.gmane.io with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.92) (envelope-from ) id 1sCSjF-0005qh-8A for geb-bug-gnu-emacs@m.gmane-mx.org; Thu, 30 May 2024 01:29:09 +0200 Original-Received: from localhost ([::1] helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1sCSiz-0003dn-87; Wed, 29 May 2024 19:28:53 -0400 Original-Received: from eggs.gnu.org ([2001:470:142:3::10]) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1sCSiy-0003de-Hq for bug-gnu-emacs@gnu.org; Wed, 29 May 2024 19:28:52 -0400 Original-Received: from debbugs.gnu.org ([2001:470:142:5::43]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128) (Exim 4.90_1) (envelope-from ) id 1sCSiy-0002M2-9x for bug-gnu-emacs@gnu.org; Wed, 29 May 2024 19:28:52 -0400 Original-Received: from Debian-debbugs by debbugs.gnu.org with local (Exim 4.84_2) (envelope-from ) id 1sCSj8-0003v8-5I for bug-gnu-emacs@gnu.org; Wed, 29 May 2024 19:29:02 -0400 X-Loop: help-debbugs@gnu.org Resent-From: "Elijah G." Original-Sender: "Debbugs-submit" Resent-CC: bug-gnu-emacs@gnu.org Resent-Date: Wed, 29 May 2024 23:29:02 +0000 Resent-Message-ID: Resent-Sender: help-debbugs@gnu.org X-GNU-PR-Message: followup 71159 X-GNU-PR-Package: emacs X-GNU-PR-Keywords: patch Original-Received: via spool by 71159-submit@debbugs.gnu.org id=B71159.171702531215012 (code B ref 71159); Wed, 29 May 2024 23:29:02 +0000 Original-Received: (at 71159) by debbugs.gnu.org; 29 May 2024 23:28:32 +0000 Original-Received: from localhost ([127.0.0.1]:32846 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1sCSid-0003ty-8p for submit@debbugs.gnu.org; Wed, 29 May 2024 19:28:32 -0400 Original-Received: from mail-oo1-f68.google.com ([209.85.161.68]:58626) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1sCSia-0003tf-VQ for 71159@debbugs.gnu.org; Wed, 29 May 2024 19:28:29 -0400 Original-Received: by mail-oo1-f68.google.com with SMTP id 006d021491bc7-5b2cc8c4b8aso137822eaf.1 for <71159@debbugs.gnu.org>; Wed, 29 May 2024 16:28:18 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1717025233; x=1717630033; darn=debbugs.gnu.org; h=mime-version:user-agent:message-id:date:references:in-reply-to :subject:to:from:from:to:cc:subject:date:message-id:reply-to; bh=2UZljRb4sAfc1Zyedb8kNtFbjA+SGIfLUkCEo6kG6yE=; b=dDoJ92stnhKXCjJ+putvHBUINnF2TwYUDiw9QQWswqu8jhoGJqmz+HdhJu53gd0g47 UNq/e76sDcmPWibCQ8FW5qyt+bHd8cC7n2bktNcZvQCMJHol8L7bZLTygcTzTUMW5Uxs SCdWMcR7I6IHW6e+i/VIyxwmMm3tx7DwbPBholX30EmbQsLD/+p0rq5BzBj2ruTBks96 WiuneRSKedSIyp3BcwublxRpzBm5CalCIakPs3AQSAt6GE5kD8cO//1olPziC9FfqcGg 6fU2fMEb5HG8v6/gxGMK6tz3t/xwtcSWXKyrMjMhRf1gRFuF4Jm4El4NnAchRsZ43SYB +CYw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1717025233; x=1717630033; h=mime-version:user-agent:message-id:date:references:in-reply-to :subject:to:from:x-gm-message-state:from:to:cc:subject:date :message-id:reply-to; bh=2UZljRb4sAfc1Zyedb8kNtFbjA+SGIfLUkCEo6kG6yE=; b=YnH/Kvcyjs4tNDP62BEZHRoHEuuLAWRbtjXPz/7I4Zcsbvo9Dc84iyz6EJcVT1qc8U xs1ni/euX7xU7MMqCRMH9vZOGO9l3hK2oBFCsr9emu5W/tM0fa7LmZooGXI8+I/LTAfb hH4Y7Ob2mmD7+ZI5Ooire6dTjReG9Fr2rFba7tFdddxv/jCz3WIGHElZClHEFj6za5r6 MYHpBfcIH7AIBqz8Oige6OVsnSqaKdjyYeoKwwGKUOVfXtZmKOLOvErS6DF11afjX/nX I/Wun5gq5okGaZZQVdN0bViuCahITR/ApFyVacaqV07FWVPeBW0TJbL9haTELUdx/iEw r6+Q== X-Gm-Message-State: AOJu0Yysj0oGfFGL6X/groLgW19dZil4T4+9XLFgB10EjPIFgDmw4qf0 ETgtctM77xx3HlP1CPpV/JWYPkYzOmPp64csUVvu+RjZlFhthvY0 X-Google-Smtp-Source: AGHT+IFb+FpGe76mRRTuigfDdoEcq7m1E/T9KKe7T+fsGgwFBtcOup7HczFxnYa6yWxUa0xpZb0qHA== X-Received: by 2002:a05:6820:827:b0:5b7:3502:6543 with SMTP id 006d021491bc7-5b9ec7d0e2cmr656932eaf.7.1717025232824; Wed, 29 May 2024 16:27:12 -0700 (PDT) Original-Received: from LIBERO ([187.184.27.251]) by smtp.gmail.com with ESMTPSA id 006d021491bc7-5b96c461e88sm2992638eaf.8.2024.05.29.16.27.11 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 29 May 2024 16:27:12 -0700 (PDT) In-Reply-To: <86cypcuhhk.fsf@gmail.com> (Elijah G.'s message of "Thu, 23 May 2024 19:27:19 -0600") X-BeenThere: debbugs-submit@debbugs.gnu.org X-Mailman-Version: 2.1.18 Precedence: list X-BeenThere: bug-gnu-emacs@gnu.org List-Id: "Bug reports for GNU Emacs, the Swiss army knife of text editors" List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: bug-gnu-emacs-bounces+geb-bug-gnu-emacs=m.gmane-mx.org@gnu.org Original-Sender: bug-gnu-emacs-bounces+geb-bug-gnu-emacs=m.gmane-mx.org@gnu.org Xref: news.gmane.io gmane.emacs.bugs:286188 Archived-At: --=-=-= Content-Type: text/plain I'm sending here the fixed patch, now there is no problem with fg and bg color. --=-=-= Content-Type: text/x-patch Content-Disposition: attachment; filename=0001-Stipple-support-for-MS-Windows.patch >From e222f44f2677550b107bb1c84fbe63069b81208c Mon Sep 17 00:00:00 2001 From: "Elias G. Perez" Date: Fri, 10 May 2024 20:36:42 -0600 Subject: [PATCH] Stipple support for MS Windows * etc/NEWS: Announce support for stipples in MS-Windows. * src/w32term.h (w32_bitmap_record): Add stipple value. * src/w32term.c: (w32_fill_stipple_pattern): New function. (w32_draw_glyph_string_background, w32_draw_glyph_string_bg_rect) (w32_draw_stretch_glyph_string): Use new stipple function. * src/image.c: (image_create_bitmap_from_data): Create stipple bitmap. (image_create_bitmap_from_file): Add suuport for pixmap and create stipple bitmap. --- etc/NEWS | 3 ++ src/image.c | 98 ++++++++++++++++++++++++++++++++++++++++++--------- src/w32term.c | 55 ++++++++++++++++++----------- src/w32term.h | 1 + 4 files changed, 121 insertions(+), 36 deletions(-) diff --git a/etc/NEWS b/etc/NEWS index a79a5844a22..ff1932d42ca 100644 --- a/etc/NEWS +++ b/etc/NEWS @@ -2779,6 +2779,9 @@ title bars' and scroll bars' appearance. If the new user option will disregard the system's Dark mode and will always use the default Light mode. +--- +*** Emacs on MS-Windows now supports the :stipple face attribute + ---------------------------------------------------------------------- This file is part of GNU Emacs. diff --git a/src/image.c b/src/image.c index 3138ef25a63..427b530cb3a 100644 --- a/src/image.c +++ b/src/image.c @@ -130,6 +130,12 @@ #define NO_PIXMAP 0 #define PIX_MASK_RETAIN 0 #define PIX_MASK_DRAW 1 +#define XBM_BIT_SHUFFLE(b) (~(b)) + +#else + +#define XBM_BIT_SHUFFLE(b) (b) + #endif /* HAVE_NTGUI */ #ifdef HAVE_NS @@ -214,6 +220,13 @@ #define n_planes n_image_planes static unsigned long *colors_in_color_table (int *n); #endif +#ifdef HAVE_NTGUI +static HBITMAP w32_create_pixmap_from_bitmap_data (int width, + int height, + char *data); + +#endif + #if defined (HAVE_WEBP) || defined (HAVE_GIF) static void anim_prune_animation_cache (Lisp_Object); #endif @@ -596,13 +609,29 @@ image_create_bitmap_from_data (struct frame *f, char *bits, #endif /* HAVE_ANDROID && !defined ANDROID_STUBIFY */ #ifdef HAVE_NTGUI - Lisp_Object frame UNINIT; /* The value is not used. */ - Emacs_Pixmap bitmap; + Emacs_Pixmap stipple, bitmap; bitmap = CreateBitmap (width, height, - FRAME_DISPLAY_INFO (XFRAME (frame))->n_planes, - FRAME_DISPLAY_INFO (XFRAME (frame))->n_cbits, + dpyinfo->n_planes, + dpyinfo->n_cbits, bits); - if (! bitmap) + + /* Convert X bitmap to W32 bitmap. */ + /* Windows mono bitmaps are reversed compared with X. */ + { + USE_SAFE_ALLOCA; + char *invertedBits; + int nbytes, i; + + invertedBits = bits; + nbytes = (width + CHAR_BIT - 1) / CHAR_BIT * height; + + SAFE_NALLOCA (bits, 1, nbytes); + + for (i = 0; i < nbytes; i++) + bits[i] = XBM_BIT_SHUFFLE(invertedBits[i]); + } + stipple = w32_create_pixmap_from_bitmap_data (width, height, bits); + if (!bitmap || !stipple) return -1; #endif /* HAVE_NTGUI */ @@ -681,6 +710,7 @@ image_create_bitmap_from_data (struct frame *f, char *bits, #ifdef HAVE_NTGUI dpyinfo->bitmaps[id - 1].pixmap = bitmap; + dpyinfo->bitmaps[id - 1].stipple = stipple; dpyinfo->bitmaps[id - 1].hinst = NULL; dpyinfo->bitmaps[id - 1].depth = 1; #endif /* HAVE_NTGUI */ @@ -699,7 +729,7 @@ image_create_bitmap_from_data (struct frame *f, char *bits, #endif /* defined HAVE_ANDROID && !defined ANDROID_STUBIFY */ #if defined HAVE_HAIKU || defined HAVE_NS || defined HAVE_PGTK \ - || defined HAVE_ANDROID + || defined HAVE_ANDROID || defined HAVE_NTGUI static char *slurp_file (image_fd, ptrdiff_t *); static Lisp_Object image_find_image_fd (Lisp_Object, image_fd *); static bool xbm_read_bitmap_data (struct frame *, char *, char *, @@ -711,10 +741,53 @@ image_create_bitmap_from_data (struct frame *f, char *bits, ptrdiff_t image_create_bitmap_from_file (struct frame *f, Lisp_Object file) { -#if defined (HAVE_NTGUI) - return -1; /* W32_TODO : bitmap support */ -#else Display_Info *dpyinfo = FRAME_DISPLAY_INFO (f); + +#ifdef HAVE_NTGUI + ptrdiff_t id, size; + int width, height, rc; + image_fd fd; + char *contents, *data; + Emacs_Pixmap bitmap; + + if (!STRINGP (image_find_image_fd (file, &fd))) + return -1; + + contents = slurp_file (fd, &size); + + if (!contents) + return -1; + + rc = xbm_read_bitmap_data (f, contents, contents + size, + &width, &height, &data, 0); + + if (!rc) + { + xfree (contents); + return -1; + } + + { + /* Windows mono bitmaps are reversed compared with X. */ + + int nbytes, i; + nbytes = (width + CHAR_BIT - 1) / CHAR_BIT * height; + + for (i = 0; i < nbytes; i++) + data[i] = XBM_BIT_SHUFFLE(data[i]); + } + + id = image_allocate_bitmap_record (f); + bitmap = w32_create_pixmap_from_bitmap_data (width, height, data); + + dpyinfo->bitmaps[id - 1].height = width; + dpyinfo->bitmaps[id - 1].width = height; + dpyinfo->bitmaps[id - 1].stipple = bitmap; + dpyinfo->bitmaps[id - 1].file = xlispstrdup (file); + + xfree (contents); + xfree (data); + return id; #endif #ifdef HAVE_NS @@ -4747,7 +4820,6 @@ w32_create_pixmap_from_bitmap_data (int width, int height, char *data) int i, j, w1, w2; unsigned char *bits, *p; HBITMAP bmp; - w1 = (width + 7) / 8; /* nb of 8bits elt in X bitmap */ w2 = ((width + 15) / 16) * 2; /* nb of 16bits elt in W32 bitmap */ bits = alloca (height * w2); @@ -4800,12 +4872,6 @@ convert_mono_to_color_image (struct frame *f, struct image *img, img->pixmap = new_pixmap; } -#define XBM_BIT_SHUFFLE(b) (~(b)) - -#else - -#define XBM_BIT_SHUFFLE(b) (b) - #endif /* HAVE_NTGUI */ diff --git a/src/w32term.c b/src/w32term.c index 2bcd5d86a38..8a0cea417ca 100644 --- a/src/w32term.c +++ b/src/w32term.c @@ -1248,6 +1248,34 @@ w32_clear_glyph_string_rect (struct glyph_string *s, real_w, real_h); } +/* Fill background with bitmap pattern from S at specified position + given by X and Y. WIDTH and HEIGHT specifies bitmap size, GC is + used to get foreground and background color context and HDC where + fill it. */ + +static void +w32_fill_stipple_pattern (HDC hdc, struct glyph_string *s, Emacs_GC *gc, + int x, int y, unsigned int width, unsigned int height) +{ + SetTextColor (hdc, gc->foreground); + SetBkColor (hdc, gc->background); + + RECT r; + Emacs_Pixmap bm; + HBRUSH hb + + r.left = x; + r.top = y; + r.right = x + width; + r.bottom = y + height; + + bm = FRAME_DISPLAY_INFO (s->f)->bitmaps[s->face->stipple - 1].stipple; + + hb = CreatePatternBrush (bm); + FillRect (hdc, &r, hb); + + DeleteObject (hb); +} /* Draw the background of glyph_string S. If S->background_filled_p is non-zero don't draw it. FORCE_P non-zero means draw the @@ -1264,21 +1292,16 @@ w32_draw_glyph_string_background (struct glyph_string *s, bool force_p) { int box_line_width = max (s->face->box_horizontal_line_width, 0); -#if 0 /* TODO: stipple */ if (s->stippled_p) { /* Fill background with a stipple pattern. */ - XSetFillStyle (s->display, s->gc, FillOpaqueStippled); - XFillRectangle (s->display, FRAME_W32_WINDOW (s->f), s->gc, s->x, - s->y + box_line_width, - s->background_width, - s->height - 2 * box_line_width); - XSetFillStyle (s->display, s->gc, FillSolid); + w32_fill_stipple_pattern (s->hdc, s, s->gc, s->x, + s->y + box_line_width, + s->background_width, + s->height - 2 * box_line_width); s->background_filled_p = true; } - else -#endif - if (FONT_HEIGHT (s->font) < s->height - 2 * box_line_width + else if (FONT_HEIGHT (s->font) < s->height - 2 * box_line_width /* When xdisp.c ignores FONT_HEIGHT, we cannot trust font dimensions, since the actual glyphs might be much smaller. So in that case we always clear the @@ -2286,16 +2309,12 @@ w32_draw_image_foreground_1 (struct glyph_string *s, HBITMAP pixmap) static void w32_draw_glyph_string_bg_rect (struct glyph_string *s, int x, int y, int w, int h) { -#if 0 /* TODO: stipple */ if (s->stippled_p) { /* Fill background with a stipple pattern. */ - XSetFillStyle (s->display, s->gc, FillOpaqueStippled); - XFillRectangle (s->display, FRAME_W32_WINDOW (s->f), s->gc, x, y, w, h); - XSetFillStyle (s->display, s->gc, FillSolid); + w32_fill_stipple_pattern (s->hdc, s, s->gc, x, y, w, h); } else -#endif w32_clear_glyph_string_rect (s, x, y, w, h); } @@ -2500,16 +2519,12 @@ w32_draw_stretch_glyph_string (struct glyph_string *s) get_glyph_string_clip_rect (s, &r); w32_set_clip_rectangle (hdc, &r); -#if 0 /* TODO: stipple */ if (s->face->stipple) { /* Fill background with a stipple pattern. */ - XSetFillStyle (s->display, gc, FillOpaqueStippled); - XFillRectangle (s->display, FRAME_W32_WINDOW (s->f), gc, x, y, w, h); - XSetFillStyle (s->display, gc, FillSolid); + w32_fill_stipple_pattern (s->hdc, s, gc, x, y, w, h); } else -#endif { w32_fill_area (s->f, s->hdc, gc->background, x, y, w, h); } diff --git a/src/w32term.h b/src/w32term.h index 3120c8bd71f..1eb6a660248 100644 --- a/src/w32term.h +++ b/src/w32term.h @@ -58,6 +58,7 @@ #define CP_DEFAULT 1004 { Emacs_Pixmap pixmap; char *file; + Emacs_Pixmap stipple; HINSTANCE hinst; /* Used to load the file */ int refcount; /* Record some info about this pixmap. */ -- 2.44.0.windows.1 --=-=-=--