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: Thu, 30 May 2024 18:12:42 -0600 Message-ID: <86sexydekl.fsf@gmail.com> References: <86cypcuhhk.fsf@gmail.com> <86jzjcgq00.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="14494"; mail-complaints-to="usenet@ciao.gmane.io" User-Agent: Gnus/5.13 (Gnus v5.13) Emacs/30.0.50 (windows-nt) Cc: Eli Zaretskii To: 71159@debbugs.gnu.org Original-X-From: bug-gnu-emacs-bounces+geb-bug-gnu-emacs=m.gmane-mx.org@gnu.org Fri May 31 02:15:24 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 1sCpvY-0003Xp-PM for geb-bug-gnu-emacs@m.gmane-mx.org; Fri, 31 May 2024 02:15:24 +0200 Original-Received: from localhost ([::1] helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1sCpv3-0004zF-T8; Thu, 30 May 2024 20:14: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 1sCpv2-0004yo-1J for bug-gnu-emacs@gnu.org; Thu, 30 May 2024 20:14: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 1sCpv1-0001p3-Og for bug-gnu-emacs@gnu.org; Thu, 30 May 2024 20:14:51 -0400 Original-Received: from Debian-debbugs by debbugs.gnu.org with local (Exim 4.84_2) (envelope-from ) id 1sCpvC-0006Yo-D2 for bug-gnu-emacs@gnu.org; Thu, 30 May 2024 20:15: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: Fri, 31 May 2024 00:15: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.171711446625158 (code B ref 71159); Fri, 31 May 2024 00:15:02 +0000 Original-Received: (at 71159) by debbugs.gnu.org; 31 May 2024 00:14:26 +0000 Original-Received: from localhost ([127.0.0.1]:52840 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1sCpub-0006Xi-Ok for submit@debbugs.gnu.org; Thu, 30 May 2024 20:14:26 -0400 Original-Received: from mail-ot1-f67.google.com ([209.85.210.67]:51490) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1sCpuZ-0006XV-LC for 71159@debbugs.gnu.org; Thu, 30 May 2024 20:14:24 -0400 Original-Received: by mail-ot1-f67.google.com with SMTP id 46e09a7af769-6f8d0a1e500so1121344a34.3 for <71159@debbugs.gnu.org>; Thu, 30 May 2024 17:14:12 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1717114387; x=1717719187; darn=debbugs.gnu.org; h=mime-version:user-agent:message-id:date:references:in-reply-to :subject:cc:to:from:from:to:cc:subject:date:message-id:reply-to; bh=VUYkoYz4W02Yi9bu6JsquLioQi6gXi2DzUBTALVn6gM=; b=S4lDIw/jRqJaAn647tYepIDFjNUXh9srcl5dsb4YNaNqLcd0hDImLSaCrW4STn7QER 8ADiiIct/u7U94Ac28RJiuYAOBu1GBhp5dzZFUv7iOFcswv7BkB7rhFbaMIXH6lhw0i9 e9dUt5YkR6fe4r/MGhaqOGfdfpNV7oCGB25UXLc8uDajFNmJU9mC7gr+/WQYSSxkgkSb ma0+IxnfJSRoIFS1AWVS7XOeA9ljhXZg5g7xMxdsNTA18kEEdMd/6MJGqEVJTTYJ1ZTu b8EYIogu09GECXE/3yjNWTrcwWIF5kT+e8yBPAwxpj3iqMoYPQFyItddexerIrbLVca6 79/w== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1717114387; x=1717719187; h=mime-version:user-agent:message-id:date:references:in-reply-to :subject:cc:to:from:x-gm-message-state:from:to:cc:subject:date :message-id:reply-to; bh=VUYkoYz4W02Yi9bu6JsquLioQi6gXi2DzUBTALVn6gM=; b=eUjR2P9ufaq4QF7+aila05cP2kPzqOrMhpJjF0Se+CfAxONFVmPYnPzTol6s9CoKhs jdKMTaAiCIpFFQJQqljMhZm29veniT/Gh1QOsk+baDlCaa8Y27a4XEa+k/mZyL7K5LZw W94CUP2pfEaGQtamu57K4cSCdt1VB15LByzftxyNRWk4wqejuJVeeugifBvhuiVH0uDN y6xtBJYF8plFo1Tfc2KcvPEFXNvPdRq+Ew7zYggYqrxThnN2nT9bJq5K5KNYapw1iQjK D0U4N5DVbsc9zXxyMlg3hPANhoFP7hFdf1YOO0JDCLkjkWVZyg5LqnWoI+EtY1EhVFgr xn6A== X-Gm-Message-State: AOJu0YyrtpCSZC4TTnBiuouDrTSk3xFUUygNEIY+nyV8vRcl9Ei9tcRu cfwRf9Jkb5yNwxdU8Oci6GhK/8nNpt6hWzwvKQeYv0PYim1k6uUkDap5c3Y8 X-Google-Smtp-Source: AGHT+IEU0UNCK4RIc+7qLqQ3ZtyJ1H4SSHP05u5EWNIZd9lYXX6Q5ZCzMLlBGDsXZkC+HIFfXZ7rBA== X-Received: by 2002:a05:6871:68c:b0:250:8970:499d with SMTP id 586e51a60fabf-2508b7de0cdmr566951fac.3.1717114386913; Thu, 30 May 2024 17:13:06 -0700 (PDT) Original-Received: from LIBERO ([187.184.27.251]) by smtp.gmail.com with ESMTPSA id 586e51a60fabf-25085023833sm204906fac.26.2024.05.30.17.12.44 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 30 May 2024 17:12:46 -0700 (PDT) In-Reply-To: <86jzjcgq00.fsf@gmail.com> (Elijah G.'s message of "Wed, 29 May 2024 17:25: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:286248 Archived-At: --=-=-= Content-Type: text/plain I've updated the patch for delete all the conflicts generated by ae7d0e86b37eabc434c48f85f56df0a221e0e7c7 commit. --=-=-= Content-Type: text/x-patch Content-Disposition: attachment; filename=0001-Stipple-support-for-MS-Windows.patch Content-Description: Final Patch >From e52e8200df7f41b709de892f3789b14fcc994882 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 | 99 ++++++++++++++++++++++++++++++++++++++++++--------- src/w32term.c | 55 +++++++++++++++++----------- src/w32term.h | 1 + 4 files changed, 122 insertions(+), 36 deletions(-) diff --git a/etc/NEWS b/etc/NEWS index 3c672ffed8f..f0aec17371f 100644 --- a/etc/NEWS +++ b/etc/NEWS @@ -2827,6 +2827,9 @@ thumbnail images and show them in the thumbnail buffer. Unlike with using 'convert', this fallback method is synchronous, so Emacs will wait until all the thumbnails are created and displayed, before showing them. +--- +*** 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..941d85d3a0b 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,30 @@ 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. */ + { + char *invertedBits; + int nbytes, i; + ptrdiff_t sa_avail; /* Used only for SAFE_NALLOCA. */ + + invertedBits = bits; + nbytes = (width + CHAR_BIT - 1) / CHAR_BIT * height; + sa_avail = MAX_ALLOCA + + 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 +711,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 +730,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 +742,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 +4821,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 +4873,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..3ef6d0f11f1 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 a19be1a9e6a..38eac4230dd 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 --=-=-=--