From mboxrd@z Thu Jan 1 00:00:00 1970 Path: news.gmane.org!.POSTED.blaine.gmane.org!not-for-mail From: Alan Third Newsgroups: gmane.emacs.bugs Subject: bug#38109: Updated Emacs to HEAD, consistently not scaling now Date: Sun, 17 Nov 2019 19:01:05 +0000 Message-ID: <20191117190105.GB63158@breton.holly.idiocy.org> References: <20191108230345.GA42932@breton.holly.idiocy.org> <20191109172241.GA45056@breton.holly.idiocy.org> <8736ew1zp0.fsf@tullinup.koldfront.dk> <87sgmwvgmd.fsf@tullinup.koldfront.dk> <87d0e0ve29.fsf@tullinup.koldfront.dk> <20191110171241.GA60416@breton.holly.idiocy.org> <875zjj4vb7.fsf@tullinup.koldfront.dk> <20191117172208.GA63158@breton.holly.idiocy.org> <87tv72bbuz.fsf@tullinup.koldfront.dk> <87pnhq5odn.fsf@tullinup.koldfront.dk> Mime-Version: 1.0 Content-Type: multipart/mixed; boundary="tjCHc7DPkfUGtrlw" Content-Transfer-Encoding: 8bit Injection-Info: blaine.gmane.org; posting-host="blaine.gmane.org:195.159.176.226"; logging-data="155088"; mail-complaints-to="usenet@blaine.gmane.org" User-Agent: Mutt/1.12.0 (2019-05-25) Cc: 38109@debbugs.gnu.org To: Adam =?UTF-8?Q?Sj=C3=B8gren?= Original-X-From: bug-gnu-emacs-bounces+geb-bug-gnu-emacs=m.gmane.org@gnu.org Sun Nov 17 20:02:53 2019 Return-path: Envelope-to: geb-bug-gnu-emacs@m.gmane.org Original-Received: from lists.gnu.org ([209.51.188.17]) by blaine.gmane.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.89) (envelope-from ) id 1iWPoy-000eCg-T6 for geb-bug-gnu-emacs@m.gmane.org; Sun, 17 Nov 2019 20:02:53 +0100 Original-Received: from localhost ([::1]:55744 helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1iWPox-0002A7-PS for geb-bug-gnu-emacs@m.gmane.org; Sun, 17 Nov 2019 14:02:51 -0500 Original-Received: from eggs.gnu.org ([2001:470:142:3::10]:50797) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1iWPoK-0001wV-OL for bug-gnu-emacs@gnu.org; Sun, 17 Nov 2019 14:02:14 -0500 Original-Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1iWPoE-0002iy-HC for bug-gnu-emacs@gnu.org; Sun, 17 Nov 2019 14:02:08 -0500 Original-Received: from debbugs.gnu.org ([209.51.188.43]:33835) by eggs.gnu.org with esmtps (TLS1.0:RSA_AES_128_CBC_SHA1:16) (Exim 4.71) (envelope-from ) id 1iWPo9-0002hM-Qn for bug-gnu-emacs@gnu.org; Sun, 17 Nov 2019 14:02:03 -0500 Original-Received: from Debian-debbugs by debbugs.gnu.org with local (Exim 4.84_2) (envelope-from ) id 1iWPo9-0005J1-Mg for bug-gnu-emacs@gnu.org; Sun, 17 Nov 2019 14:02:01 -0500 X-Loop: help-debbugs@gnu.org Resent-From: Alan Third Original-Sender: "Debbugs-submit" Resent-CC: bug-gnu-emacs@gnu.org Resent-Date: Sun, 17 Nov 2019 19:02:01 +0000 Resent-Message-ID: Resent-Sender: help-debbugs@gnu.org X-GNU-PR-Message: followup 38109 X-GNU-PR-Package: emacs Original-Received: via spool by 38109-submit@debbugs.gnu.org id=B38109.157401727720333 (code B ref 38109); Sun, 17 Nov 2019 19:02:01 +0000 Original-Received: (at 38109) by debbugs.gnu.org; 17 Nov 2019 19:01:17 +0000 Original-Received: from localhost ([127.0.0.1]:42653 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1iWPnR-0005Hs-3g for submit@debbugs.gnu.org; Sun, 17 Nov 2019 14:01:17 -0500 Original-Received: from mail-wr1-f67.google.com ([209.85.221.67]:36380) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1iWPnN-0005He-VT for 38109@debbugs.gnu.org; Sun, 17 Nov 2019 14:01:15 -0500 Original-Received: by mail-wr1-f67.google.com with SMTP id r10so16905998wrx.3 for <38109@debbugs.gnu.org>; Sun, 17 Nov 2019 11:01:13 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=googlemail.com; s=20161025; h=sender:date:from:to:cc:subject:message-id:references:mime-version :content-disposition:content-transfer-encoding:in-reply-to :user-agent; bh=eKMY4rPAECDTaK9m7+xNdfksFssyG6fMSrdDWI9TTWc=; b=SjQeTZqW+EwFV7nqdXZP0yPeBd36fN3UIWnmLjfkk4iIsRYtCtIjhdl3NHNJbPGjw8 mbHInEYls+n94xd4E1L9UwtuaXwcw1r3HHzdc6VTp6bXwCuZNEu1y1RCdHG8bwEZI6hI TdARPJ8Tda303yPZFUbCPjfQU2DhLvih325iW+d2gmfwQwV+kKWsxIwtL+KNXlrHqk6/ 21nZSMX2V98wznGXuwaAbw45nQ2mmOmxTWBty8ySx+jFuSErDwWKQptSrvvYz9B0POma DQS5Gnx16Qa7JMkccC1EHA87hA45OBcnr3xl7/hvNCpdPet0tYVW+3GVgTnOdJPd/zzL BSsQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:sender:date:from:to:cc:subject:message-id :references:mime-version:content-disposition :content-transfer-encoding:in-reply-to:user-agent; bh=eKMY4rPAECDTaK9m7+xNdfksFssyG6fMSrdDWI9TTWc=; b=mWDU2P1TeyPheHlJRQrZPWpEVt71WZ5lLSApZeRHt7qfOamPWU8/WxNuQWx2PGLAi5 M2cqvudldQxydUsbCCCvt73QAkMCNSBn6slkkBkptRGVjC0C1p2jFa7bvTW4OXlX1Auc ykDqtV3qXfbLsg+5EaF7sQzcyWdZw5zHEn+ylaXhtI6sLaJq+vhppm4yknnHko8TDhwm pJFRjdVl+RN2CVkPFnITDBDQwtn+LCmnDBfdh7BhyZjNWxFLgiTeMFzC20Dm1LifICKL Mi2nTLYfWHzqSwNm4+iqftJRoMVKkdtZxcAsktDMWvO5FIPmDG+Dy/fopIYHGIA6Yy64 r/DA== X-Gm-Message-State: APjAAAXtHdp6ABYU/JiVzmbPE8XcZEKnDoTbM6pxQWgf4nOmFklhnYOH VS2sQmTbQAlXvsFlkwedankwVWEzsvQ= X-Google-Smtp-Source: APXvYqyyeiWZxlWrRJlgbUAHH2h6pXAxrbKBdOvOx+vugZ6ksgifZNEZHCg2VEnCmU63oLowbF8wxw== X-Received: by 2002:a5d:51c8:: with SMTP id n8mr25847681wrv.302.1574017267851; Sun, 17 Nov 2019 11:01:07 -0800 (PST) Original-Received: from breton.holly.idiocy.org (ip6-2001-08b0-03f8-8129-1980-cc6a-4f4e-9c42.holly.idiocy.org. [2001:8b0:3f8:8129:1980:cc6a:4f4e:9c42]) by smtp.gmail.com with ESMTPSA id a2sm16448880wrt.79.2019.11.17.11.01.06 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Sun, 17 Nov 2019 11:01:07 -0800 (PST) Content-Disposition: inline In-Reply-To: <87pnhq5odn.fsf@tullinup.koldfront.dk> X-BeenThere: debbugs-submit@debbugs.gnu.org X-Mailman-Version: 2.1.18 Precedence: list X-detected-operating-system: by eggs.gnu.org: GNU/Linux 2.2.x-3.x [generic] X-Received-From: 209.51.188.43 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.org@gnu.org Original-Sender: "bug-gnu-emacs" Xref: news.gmane.org gmane.emacs.bugs:171847 Archived-At: --tjCHc7DPkfUGtrlw Content-Type: text/plain; charset=utf-8 Content-Disposition: inline Content-Transfer-Encoding: 8bit On Sun, Nov 17, 2019 at 07:49:56PM +0100, Adam Sjøgren wrote: > Adam writes: > > >> New patch attached. > > > > After a while with this patch running Gnus, Emacs crashed like this: > > Here is a backtrace running Emacs with gdb (I don't really know how to > use gdb, just "run" and "bt"): Thanks for trying. I’m giving up on freeing the Pictures there, although I strongly suspect it’s adding a memory leak. New patch attached which should resize xpms and xbms. I noticed two problems: 1. sometimes shrinking an image leaves some pixels behind in clear areas. 2. In image mode if I shrink an image enough so that it disappears from view completely I can’t then scale it up with +. I suspect something’s going to zero and subsequent calculations all stay at zero. -- Alan Third --tjCHc7DPkfUGtrlw Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename="v3-0001-Fix-image-scaling-with-masks-bug-38109.patch" >From 8aeed43bbbf1931c4b5ef1ca0e61103ca9fcaf6c Mon Sep 17 00:00:00 2001 From: Alan Third Date: Sat, 9 Nov 2019 17:04:25 +0000 Subject: [PATCH v3] Fix image scaling with masks (bug#38109) * src/image.c (lookup_image): Move call to image_set_transform after postprocess_image. (image_create_x_image_and_pixmap_1): Use new function. (image_set_transform): Apply the transform to the mask too. (x_create_xrender_picture): New function. (Create_Pixmap_From_Bitmap_Data): (xpm_load): Use new function. * src/xterm.c (x_composite_image): Use PictOpOver when there is a mask so the transparency is honoured. (x_draw_image_foreground_1): Use x_composite_image. --- src/image.c | 139 +++++++++++++++++++++++++++++++++++----------------- src/xterm.c | 8 +-- 2 files changed, 97 insertions(+), 50 deletions(-) diff --git a/src/image.c b/src/image.c index 870f008b14..6c1898eae0 100644 --- a/src/image.c +++ b/src/image.c @@ -2244,6 +2244,14 @@ image_set_transform (struct frame *f, struct image *img) XRenderSetPictureFilter (FRAME_X_DISPLAY (f), img->picture, FilterBest, 0, 0); XRenderSetPictureTransform (FRAME_X_DISPLAY (f), img->picture, &tmat); + + if (img->mask_picture) + { + XRenderSetPictureFilter (FRAME_X_DISPLAY (f), img->mask_picture, + FilterBest, 0, 0); + XRenderSetPictureTransform (FRAME_X_DISPLAY (f), img->mask_picture, + &tmat); + } } # elif defined HAVE_NTGUI /* Store the transform matrix for application at draw time. */ @@ -2313,10 +2321,6 @@ lookup_image (struct frame *f, Lisp_Object spec) Lisp_Object ascent, margin, relief, bg; int relief_bound; -#ifdef HAVE_NATIVE_TRANSFORMS - image_set_transform (f, img); -#endif - ascent = image_spec_value (spec, QCascent, NULL); if (FIXNUMP (ascent)) img->ascent = XFIXNUM (ascent); @@ -2357,6 +2361,12 @@ lookup_image (struct frame *f, Lisp_Object spec) don't have the image yet. */ if (!EQ (builtin_lisp_symbol (img->type->type), Qpostscript)) postprocess_image (f, img); + + /* postprocess_image above may modify the image or the mask, + so image_set_transform must be called after it. */ +#ifdef HAVE_NATIVE_TRANSFORMS + image_set_transform (f, img); +#endif } unblock_input (); @@ -2527,6 +2537,54 @@ x_destroy_x_image (XImage *ximg) } } +# if !defined USE_CAIRO && defined HAVE_XRENDER +/* Create and return an XRender Picture for XRender transforms. */ +static Picture +x_create_xrender_picture (struct frame *f, Emacs_Pixmap pixmap, int depth) +{ + Picture p; + Display *display = FRAME_X_DISPLAY (f); + int event_basep, error_basep; + + if (XRenderQueryExtension (display, &event_basep, &error_basep)) + { + if (depth <= 0) + depth = DefaultDepthOfScreen (FRAME_X_SCREEN (f)); + if (depth == 32 || depth == 24 || depth == 8 || depth == 4 || depth == 1) + { + XRenderPictFormat *format; + XRenderPictureAttributes attr; + + /* FIXME: Do we need to handle all possible bit depths? + XRenderFindStandardFormat supports PictStandardARGB32, + PictStandardRGB24, PictStandardA8, PictStandardA4, + PictStandardA1, and PictStandardNUM (what is this?!). + + XRenderFindFormat may support more, but I don't + understand the documentation. */ + format = XRenderFindStandardFormat (display, + depth == 32 ? PictStandardARGB32 + : depth == 24 ? PictStandardRGB24 + : depth == 8 ? PictStandardA8 + : depth == 4 ? PictStandardA4 + : PictStandardA1); + p = XRenderCreatePicture (display, pixmap, format, 0, &attr); + } + else + { + image_error ("Specified image bit depth is not supported by XRender"); + return 0; + } + } + else + { + /* XRender not supported on this display. */ + return 0; + } + + return p; +} +# endif /* !defined USE_CAIRO && defined HAVE_XRENDER */ #endif /* HAVE_X_WINDOWS */ /* Return true if XIMG's size WIDTH x HEIGHT doesn't break the @@ -2579,36 +2637,8 @@ image_create_x_image_and_pixmap_1 (struct frame *f, int width, int height, int d if (!x_create_x_image_and_pixmap (f, width, height, depth, pimg, pixmap)) return 0; # ifdef HAVE_XRENDER - Display *display = FRAME_X_DISPLAY (f); - int event_basep, error_basep; - if (picture && XRenderQueryExtension (display, &event_basep, &error_basep)) - { - if (depth <= 0) - depth = DefaultDepthOfScreen (FRAME_X_SCREEN (f)); - if (depth == 32 || depth == 24 || depth == 8) - { - XRenderPictFormat *format; - XRenderPictureAttributes attr; - - /* FIXME: Do we need to handle all possible bit depths? - XRenderFindStandardFormat supports PictStandardARGB32, - PictStandardRGB24, PictStandardA8, PictStandardA4, - PictStandardA1, and PictStandardNUM (what is this?!). - - XRenderFindFormat may support more, but I don't - understand the documentation. */ - format = XRenderFindStandardFormat (display, - depth == 32 ? PictStandardARGB32 - : depth == 24 ? PictStandardRGB24 - : PictStandardA8); - *picture = XRenderCreatePicture (display, *pixmap, format, 0, &attr); - } - else - { - image_error ("Specified image bit depth is not supported by XRender"); - *picture = 0; - } - } + if (picture) + *picture = x_create_xrender_picture (f, *pixmap, depth); # endif return 1; @@ -3387,6 +3417,11 @@ Create_Pixmap_From_Bitmap_Data (struct frame *f, struct image *img, char *data, img->width, img->height, fg, bg, DefaultDepthOfScreen (FRAME_X_SCREEN (f))); +# if !defined USE_CAIRO && defined HAVE_XRENDER + if (img->pixmap) + img->picture = x_create_xrender_picture (f, img->pixmap, 0); +# endif + #elif defined HAVE_NTGUI img->pixmap = w32_create_pixmap_from_bitmap_data (img->width, img->height, data); @@ -4359,18 +4394,30 @@ xpm_load (struct frame *f, struct image *img) image_clear_image (f, img); rc = XpmNoMemory; } - else if (img->mask_img) - { - img->mask = XCreatePixmap (FRAME_X_DISPLAY (f), FRAME_X_DRAWABLE (f), - img->mask_img->width, - img->mask_img->height, - img->mask_img->depth); - if (img->mask == NO_PIXMAP) - { - image_clear_image (f, img); - rc = XpmNoMemory; - } - } + else + { +# if !defined USE_CAIRO && defined HAVE_XRENDER + img->picture = x_create_xrender_picture (f, img->pixmap, + img->ximg->depth); +# endif + if (img->mask_img) + { + img->mask = XCreatePixmap (FRAME_X_DISPLAY (f), FRAME_X_DRAWABLE (f), + img->mask_img->width, + img->mask_img->height, + img->mask_img->depth); + if (img->mask == NO_PIXMAP) + { + image_clear_image (f, img); + rc = XpmNoMemory; + } +# if !defined USE_CAIRO && defined HAVE_XRENDER + else + img->mask_picture = x_create_xrender_picture + (f, img->mask, img->mask_img->depth); +# endif + } + } } #endif diff --git a/src/xterm.c b/src/xterm.c index 44fbd27b11..6de1644cb0 100644 --- a/src/xterm.c +++ b/src/xterm.c @@ -3056,7 +3056,7 @@ x_composite_image (struct glyph_string *s, Pixmap dest, destination = XRenderCreatePicture (display, dest, default_format, 0, &attr); - XRenderComposite (display, PictOpSrc, + XRenderComposite (display, s->img->mask_picture ? PictOpOver : PictOpSrc, s->img->picture, s->img->mask_picture, destination, srcX, srcY, srcX, srcY, @@ -3325,9 +3325,9 @@ x_draw_image_foreground_1 (struct glyph_string *s, Pixmap pixmap) xgcv.function = GXcopy; XChangeGC (display, s->gc, mask, &xgcv); - XCopyArea (display, s->img->pixmap, pixmap, s->gc, - s->slice.x, s->slice.y, - s->slice.width, s->slice.height, x, y); + x_composite_image (s, pixmap, + s->slice.x, s->slice.y, + x, y, s->slice.width, s->slice.height); XSetClipMask (display, s->gc, None); } else -- 2.21.0 --tjCHc7DPkfUGtrlw--