From mboxrd@z Thu Jan 1 00:00:00 1970 Path: news.gmane.org!not-for-mail From: Nicolas =?UTF-8?Q?L=C3=A9veill=C3=A9?= Newsgroups: gmane.emacs.bugs Subject: bug#17519: [PATCH] take into account QuantumScale when reading imagemagick images Date: Sat, 17 May 2014 15:25:56 +0200 Message-ID: NNTP-Posting-Host: plane.gmane.org Mime-Version: 1.0 (Mac OS X Mail 7.2 \(1874\)) Content-Type: multipart/mixed; boundary="Apple-Mail=_B9BABFF6-C986-46E2-A0C0-DA895C90D84D" X-Trace: ger.gmane.org 1400349946 18884 80.91.229.3 (17 May 2014 18:05:46 GMT) X-Complaints-To: usenet@ger.gmane.org NNTP-Posting-Date: Sat, 17 May 2014 18:05:46 +0000 (UTC) To: 17519@debbugs.gnu.org Original-X-From: bug-gnu-emacs-bounces+geb-bug-gnu-emacs=m.gmane.org@gnu.org Sat May 17 20:05:38 2014 Return-path: Envelope-to: geb-bug-gnu-emacs@m.gmane.org Original-Received: from lists.gnu.org ([208.118.235.17]) by plane.gmane.org with esmtp (Exim 4.69) (envelope-from ) id 1WlizJ-0003C5-Lb for geb-bug-gnu-emacs@m.gmane.org; Sat, 17 May 2014 20:05:38 +0200 Original-Received: from localhost ([::1]:41084 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1WlizJ-0002f1-52 for geb-bug-gnu-emacs@m.gmane.org; Sat, 17 May 2014 14:05:37 -0400 Original-Received: from eggs.gnu.org ([2001:4830:134:3::10]:58974) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1Wliyy-0002Ym-0Y for bug-gnu-emacs@gnu.org; Sat, 17 May 2014 14:05:26 -0400 Original-Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1Wliym-0006pW-5W for bug-gnu-emacs@gnu.org; Sat, 17 May 2014 14:05:15 -0400 Original-Received: from debbugs.gnu.org ([140.186.70.43]:52829) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1Wliyl-0006nk-Sg for bug-gnu-emacs@gnu.org; Sat, 17 May 2014 14:05:04 -0400 Original-Received: from Debian-debbugs by debbugs.gnu.org with local (Exim 4.80) (envelope-from ) id 1Wliyk-0000Cn-Vt for bug-gnu-emacs@gnu.org; Sat, 17 May 2014 14:05:03 -0400 X-Loop: help-debbugs@gnu.org Resent-From: Nicolas =?UTF-8?Q?L=C3=A9veill=C3=A9?= Original-Sender: "Debbugs-submit" Resent-CC: bug-gnu-emacs@gnu.org Resent-Date: Sat, 17 May 2014 18:05:02 +0000 Resent-Message-ID: Resent-Sender: help-debbugs@gnu.org X-GNU-PR-Message: report 17519 X-GNU-PR-Package: emacs X-GNU-PR-Keywords: patch X-Debbugs-Original-To: bug-gnu-emacs@gnu.org Original-Received: via spool by submit@debbugs.gnu.org id=B.1400349865724 (code B ref -1); Sat, 17 May 2014 18:05:02 +0000 Original-Received: (at submit) by debbugs.gnu.org; 17 May 2014 18:04:25 +0000 Original-Received: from localhost ([127.0.0.1]:51705 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.80) (envelope-from ) id 1Wliy8-0000BV-K4 for submit@debbugs.gnu.org; Sat, 17 May 2014 14:04:25 -0400 Original-Received: from eggs.gnu.org ([208.118.235.92]:38318) by debbugs.gnu.org with esmtp (Exim 4.80) (envelope-from ) id 1Wledn-0007gT-PS for submit@debbugs.gnu.org; Sat, 17 May 2014 09:27:08 -0400 Original-Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1WledY-00053i-CU for submit@debbugs.gnu.org; Sat, 17 May 2014 09:27:02 -0400 Original-Received: from lists.gnu.org ([2001:4830:134:3::11]:56731) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1WledY-00053c-6e for submit@debbugs.gnu.org; Sat, 17 May 2014 09:26:52 -0400 Original-Received: from eggs.gnu.org ([2001:4830:134:3::10]:40020) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1WledQ-0007vM-FD for bug-gnu-emacs@gnu.org; Sat, 17 May 2014 09:26:52 -0400 Original-Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1WledI-0004r7-Re for bug-gnu-emacs@gnu.org; Sat, 17 May 2014 09:26:44 -0400 Original-Received: from smtp2-g21.free.fr ([212.27.42.2]:23146) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1WledH-0004qt-UJ for bug-gnu-emacs@gnu.org; Sat, 17 May 2014 09:26:36 -0400 Original-Received: from [192.168.1.105] (unknown [46.79.88.170]) (Authenticated sender: knos@free.fr) by smtp2-g21.free.fr (Postfix) with ESMTPSA id 3D6574B0045 for ; Sat, 17 May 2014 15:24:17 +0200 (CEST) X-Mailer: Apple Mail (2.1874) X-detected-operating-system: by eggs.gnu.org: Windows NT kernel [generic] [fuzzy] X-detected-operating-system: by eggs.gnu.org: Error: Malformed IPv6 address (bad octet value). X-Mailman-Approved-At: Sat, 17 May 2014 14:04:15 -0400 X-BeenThere: debbugs-submit@debbugs.gnu.org X-Mailman-Version: 2.1.15 Precedence: list X-detected-operating-system: by eggs.gnu.org: GNU/Linux 3.x X-Received-From: 140.186.70.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-bounces+geb-bug-gnu-emacs=m.gmane.org@gnu.org Xref: news.gmane.org gmane.emacs.bugs:89199 Archived-At: --Apple-Mail=_B9BABFF6-C986-46E2-A0C0-DA895C90D84D Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset=us-ascii Symptom: On Macs with a freshly compiled "nexstep" emacs and no rsvg library, the = splash screen displays a corrupted picture. This patch is here corrects the "pixel pushing" (default) method for = loading images from ImageMagick to properly interpret pixels from images = loaded with ImageMagick compiled with any pixel quantum value. (Q32 for = instance) -- --Apple-Mail=_B9BABFF6-C986-46E2-A0C0-DA895C90D84D Content-Disposition: attachment; filename=0001-whitespace-cleanup-removed-tabs.patch Content-Type: application/octet-stream; name="0001-whitespace-cleanup-removed-tabs.patch" Content-Transfer-Encoding: quoted-printable =46rom=20f67f342d1ed1ed36d9b10072e1e1ae3800bf1ed7=20Mon=20Sep=2017=20= 00:00:00=202001=0AFrom:=20=3D?UTF-8?q?Nicolas=3D20L=3DC3=3DA9veill=3DC3=3D= A9?=3D=20=0ADate:=20Sat,=2017=20May=202014=20= 13:38:56=20+0200=0ASubject:=20[PATCH=201/3]=20whitespace-cleanup=20= (removed=20tabs)=0A=0A---=0A=20src/image.c=20|=203436=20= +++++++++++++++++++++++++++++------------------------------=0A=201=20= file=20changed,=201718=20insertions(+),=201718=20deletions(-)=0A=0Adiff=20= --git=20a/src/image.c=20b/src/image.c=0Aindex=20047f751..7ae417c=20= 100644=0A---=20a/src/image.c=0A+++=20b/src/image.c=0A@@=20-206,7=20= +206,7=20@@=20x_allocate_bitmap_record=20(struct=20frame=20*f)=0A=20=0A=20= =20=20dpyinfo->bitmaps=20=3D=0A=20=20=20=20=20xpalloc=20= (dpyinfo->bitmaps,=20&dpyinfo->bitmaps_size,=0A-=09=20=20=20=20=2010,=20= -1,=20sizeof=20*dpyinfo->bitmaps);=0A+=20=20=20=20=20=20=20=20=20=20=20=20= =2010,=20-1,=20sizeof=20*dpyinfo->bitmaps);=0A=20=20=20return=20= ++dpyinfo->bitmaps_last;=0A=20}=0A=20=0A@@=20-229,7=20+229,7=20@@=20= x_create_bitmap_from_data=20(struct=20frame=20*f,=20char=20*bits,=20= unsigned=20int=20width,=20unsi=0A=20#ifdef=20HAVE_X_WINDOWS=0A=20=20=20= Pixmap=20bitmap;=0A=20=20=20bitmap=20=3D=20XCreateBitmapFromData=20= (FRAME_X_DISPLAY=20(f),=20FRAME_X_WINDOW=20(f),=0A-=09=09=09=09=20=20= bits,=20width,=20height);=0A+=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= =20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20bits,=20width,=20= height);=0A=20=20=20if=20(!=20bitmap)=0A=20=20=20=20=20return=20-1;=0A=20= #endif=20/*=20HAVE_X_WINDOWS=20*/=0A@@=20-237,9=20+237,9=20@@=20= x_create_bitmap_from_data=20(struct=20frame=20*f,=20char=20*bits,=20= unsigned=20int=20width,=20unsi=0A=20#ifdef=20HAVE_NTGUI=0A=20=20=20= Pixmap=20bitmap;=0A=20=20=20bitmap=20=3D=20CreateBitmap=20(width,=20= height,=0A-=09=09=09=20FRAME_DISPLAY_INFO=20(XFRAME=20= (frame))->n_planes,=0A-=09=09=09=20FRAME_DISPLAY_INFO=20(XFRAME=20= (frame))->n_cbits,=0A-=09=09=09=20bits);=0A+=20=20=20=20=20=20=20=20=20=20= =20=20=20=20=20=20=20=20=20=20=20=20=20=20=20FRAME_DISPLAY_INFO=20= (XFRAME=20(frame))->n_planes,=0A+=20=20=20=20=20=20=20=20=20=20=20=20=20=20= =20=20=20=20=20=20=20=20=20=20=20FRAME_DISPLAY_INFO=20(XFRAME=20= (frame))->n_cbits,=0A+=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= =20=20=20=20=20=20=20=20bits);=0A=20=20=20if=20(!=20bitmap)=0A=20=20=20=20= =20return=20-1;=0A=20#endif=20/*=20HAVE_NTGUI=20*/=0A@@=20-318,24=20= +318,24=20@@=20x_create_bitmap_from_file=20(struct=20frame=20*f,=20= Lisp_Object=20file)=0A=20=20=20for=20(id=20=3D=200;=20id=20<=20= dpyinfo->bitmaps_last;=20++id)=0A=20=20=20=20=20{=0A=20=20=20=20=20=20=20= if=20(dpyinfo->bitmaps[id].refcount=0A-=09=20=20&&=20= dpyinfo->bitmaps[id].file=0A-=09=20=20&&=20!strcmp=20= (dpyinfo->bitmaps[id].file,=20SSDATA=20(file)))=0A-=09{=0A-=09=20=20= ++dpyinfo->bitmaps[id].refcount;=0A-=09=20=20return=20id=20+=201;=0A-=09= }=0A+=20=20=20=20=20=20=20=20=20=20&&=20dpyinfo->bitmaps[id].file=0A+=20=20= =20=20=20=20=20=20=20=20&&=20!strcmp=20(dpyinfo->bitmaps[id].file,=20= SSDATA=20(file)))=0A+=20=20=20=20=20=20=20=20{=0A+=20=20=20=20=20=20=20=20= =20=20++dpyinfo->bitmaps[id].refcount;=0A+=20=20=20=20=20=20=20=20=20=20= return=20id=20+=201;=0A+=20=20=20=20=20=20=20=20}=0A=20=20=20=20=20}=0A=20= =0A=20=20=20/*=20Search=20bitmap-file-path=20for=20the=20file,=20if=20= appropriate.=20=20*/=0A=20=20=20if=20(openp=20(Vx_bitmap_file_path,=20= file,=20Qnil,=20&found,=0A-=09=20=20=20=20=20make_number=20(R_OK),=20= false)=0A+=20=20=20=20=20=20=20=20=20=20=20=20=20make_number=20(R_OK),=20= false)=0A=20=20=20=20=20=20=20<=200)=0A=20=20=20=20=20return=20-1;=0A=20=0A= =20=20=20filename=20=3D=20SSDATA=20(found);=0A=20=0A=20=20=20result=20=3D=20= XReadBitmapFile=20(FRAME_X_DISPLAY=20(f),=20FRAME_X_WINDOW=20(f),=0A-=09=09= =09=20=20=20=20filename,=20&width,=20&height,=20&bitmap,=20&xhot,=20= &yhot);=0A+=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= =20=20=20=20=20=20=20filename,=20&width,=20&height,=20&bitmap,=20&xhot,=20= &yhot);=0A=20=20=20if=20(result=20!=3D=20BitmapSuccess)=0A=20=20=20=20=20= return=20-1;=0A=20=0A@@=20-390,11=20+390,11=20@@=20x_destroy_bitmap=20= (struct=20frame=20*f,=20ptrdiff_t=20id)=0A=20=20=20=20=20=20=20= Bitmap_Record=20*bm=20=3D=20&dpyinfo->bitmaps[id=20-=201];=0A=20=0A=20=20= =20=20=20=20=20if=20(--bm->refcount=20=3D=3D=200)=0A-=09{=0A-=09=20=20= block_input=20();=0A-=09=20=20free_bitmap_record=20(dpyinfo,=20bm);=0A-=09= =20=20unblock_input=20();=0A-=09}=0A+=20=20=20=20=20=20=20=20{=0A+=20=20=20= =20=20=20=20=20=20=20block_input=20();=0A+=20=20=20=20=20=20=20=20=20=20= free_bitmap_record=20(dpyinfo,=20bm);=0A+=20=20=20=20=20=20=20=20=20=20= unblock_input=20();=0A+=20=20=20=20=20=20=20=20}=0A=20=20=20=20=20}=0A=20= }=0A=20=0A@@=20-414,14=20+414,14=20@@=20x_destroy_all_bitmaps=20= (Display_Info=20*dpyinfo)=0A=20}=0A=20=0A=20static=20bool=20= x_create_x_image_and_pixmap=20(struct=20frame=20*,=20int,=20int,=20int,=0A= -=09=09=09=09=09=20XImagePtr=20*,=20Pixmap=20*);=0A+=20=20=20=20=20=20=20= =20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= =20=20=20=20=20=20=20=20=20XImagePtr=20*,=20Pixmap=20*);=0A=20static=20= void=20x_destroy_x_image=20(XImagePtr=20ximg);=0A=20=0A=20#ifdef=20= HAVE_NTGUI=0A=20static=20XImagePtr_or_DC=20image_get_x_image_or_dc=20= (struct=20frame=20*,=20struct=20image=20*,=0A-=09=09=09=09=09=09bool,=20= HGDIOBJ=20*);=0A+=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= =20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= =20=20=20=20bool,=20HGDIOBJ=20*);=0A=20static=20void=20= image_unget_x_image_or_dc=20(struct=20image=20*,=20bool,=20= XImagePtr_or_DC,=0A-=09=09=09=09=20=20=20=20=20=20=20HGDIOBJ);=0A+=20=20=20= =20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= =20=20=20=20=20=20=20=20=20=20=20HGDIOBJ);=0A=20#else=0A=20static=20= XImagePtr=20image_get_x_image=20(struct=20frame=20*,=20struct=20image=20= *,=20bool);=0A=20static=20void=20image_unget_x_image=20(struct=20image=20= *,=20bool,=20XImagePtr);=0A@@=20-469,7=20+469,7=20@@=20= x_create_bitmap_mask=20(struct=20frame=20*f,=20ptrdiff_t=20id)=0A=20=0A=20= =20=20block_input=20();=0A=20=20=20ximg=20=3D=20XGetImage=20= (FRAME_X_DISPLAY=20(f),=20pixmap,=200,=200,=20width,=20height,=0A-=09=09=20= =20=20=20~0,=20ZPixmap);=0A+=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= =20=20=20=20=20~0,=20ZPixmap);=0A=20=0A=20=20=20if=20(!ximg)=0A=20=20=20=20= =20{=0A@@=20-491,30=20+491,30=20@@=20x_create_bitmap_mask=20(struct=20= frame=20*f,=20ptrdiff_t=20id)=0A=20=20=20for=20(y=20=3D=200;=20y=20<=20= ximg->height;=20++y)=0A=20=20=20=20=20{=0A=20=20=20=20=20=20=20for=20(x=20= =3D=200;=20x=20<=20ximg->width;=20++x)=0A-=09{=0A-=09=20=20xp=20=3D=20x=20= !=3D=20ximg->width=20-=201=20?=20x=20+=201=20:=200;=0A-=09=20=20xm=20=3D=20= x=20!=3D=200=20?=20x=20-=201=20:=20ximg->width=20-=201;=0A-=09=20=20yp=20= =3D=20y=20!=3D=20ximg->height=20-=201=20?=20y=20+=201=20:=200;=0A-=09=20=20= ym=20=3D=20y=20!=3D=200=20?=20y=20-=201=20:=20ximg->height=20-=201;=0A-=09= =20=20if=20(XGetPixel=20(ximg,=20x,=20y)=20=3D=3D=20bg=0A-=09=20=20=20=20= =20=20&&=20XGetPixel=20(ximg,=20x,=20yp)=20=3D=3D=20bg=0A-=09=20=20=20=20= =20=20&&=20XGetPixel=20(ximg,=20x,=20ym)=20=3D=3D=20bg=0A-=09=20=20=20=20= =20=20&&=20XGetPixel=20(ximg,=20xp,=20y)=20=3D=3D=20bg=0A-=09=20=20=20=20= =20=20&&=20XGetPixel=20(ximg,=20xp,=20yp)=20=3D=3D=20bg=0A-=09=20=20=20=20= =20=20&&=20XGetPixel=20(ximg,=20xp,=20ym)=20=3D=3D=20bg=0A-=09=20=20=20=20= =20=20&&=20XGetPixel=20(ximg,=20xm,=20y)=20=3D=3D=20bg=0A-=09=20=20=20=20= =20=20&&=20XGetPixel=20(ximg,=20xm,=20yp)=20=3D=3D=20bg=0A-=09=20=20=20=20= =20=20&&=20XGetPixel=20(ximg,=20xm,=20ym)=20=3D=3D=20bg)=0A-=09=20=20=20=20= XPutPixel=20(mask_img,=20x,=20y,=200);=0A-=09=20=20else=0A-=09=20=20=20=20= XPutPixel=20(mask_img,=20x,=20y,=201);=0A-=09}=0A+=20=20=20=20=20=20=20=20= {=0A+=20=20=20=20=20=20=20=20=20=20xp=20=3D=20x=20!=3D=20ximg->width=20-=20= 1=20?=20x=20+=201=20:=200;=0A+=20=20=20=20=20=20=20=20=20=20xm=20=3D=20x=20= !=3D=200=20?=20x=20-=201=20:=20ximg->width=20-=201;=0A+=20=20=20=20=20=20= =20=20=20=20yp=20=3D=20y=20!=3D=20ximg->height=20-=201=20?=20y=20+=201=20= :=200;=0A+=20=20=20=20=20=20=20=20=20=20ym=20=3D=20y=20!=3D=200=20?=20y=20= -=201=20:=20ximg->height=20-=201;=0A+=20=20=20=20=20=20=20=20=20=20if=20= (XGetPixel=20(ximg,=20x,=20y)=20=3D=3D=20bg=0A+=20=20=20=20=20=20=20=20=20= =20=20=20=20=20&&=20XGetPixel=20(ximg,=20x,=20yp)=20=3D=3D=20bg=0A+=20=20= =20=20=20=20=20=20=20=20=20=20=20=20&&=20XGetPixel=20(ximg,=20x,=20ym)=20= =3D=3D=20bg=0A+=20=20=20=20=20=20=20=20=20=20=20=20=20=20&&=20XGetPixel=20= (ximg,=20xp,=20y)=20=3D=3D=20bg=0A+=20=20=20=20=20=20=20=20=20=20=20=20=20= =20&&=20XGetPixel=20(ximg,=20xp,=20yp)=20=3D=3D=20bg=0A+=20=20=20=20=20=20= =20=20=20=20=20=20=20=20&&=20XGetPixel=20(ximg,=20xp,=20ym)=20=3D=3D=20= bg=0A+=20=20=20=20=20=20=20=20=20=20=20=20=20=20&&=20XGetPixel=20(ximg,=20= xm,=20y)=20=3D=3D=20bg=0A+=20=20=20=20=20=20=20=20=20=20=20=20=20=20&&=20= XGetPixel=20(ximg,=20xm,=20yp)=20=3D=3D=20bg=0A+=20=20=20=20=20=20=20=20=20= =20=20=20=20=20&&=20XGetPixel=20(ximg,=20xm,=20ym)=20=3D=3D=20bg)=0A+=20=20= =20=20=20=20=20=20=20=20=20=20XPutPixel=20(mask_img,=20x,=20y,=200);=0A+=20= =20=20=20=20=20=20=20=20=20else=0A+=20=20=20=20=20=20=20=20=20=20=20=20= XPutPixel=20(mask_img,=20x,=20y,=201);=0A+=20=20=20=20=20=20=20=20}=0A=20= =20=20=20=20}=0A=20=0A=20=20=20eassert=20(input_blocked_p=20());=0A=20=20= =20gc=20=3D=20XCreateGC=20(FRAME_X_DISPLAY=20(f),=20mask,=200,=20NULL);=0A= =20=20=20XPutImage=20(FRAME_X_DISPLAY=20(f),=20mask,=20gc,=20mask_img,=20= 0,=200,=200,=200,=0A-=09=20=20=20=20=20width,=20height);=0A+=20=20=20=20=20= =20=20=20=20=20=20=20=20width,=20height);=0A=20=20=20XFreeGC=20= (FRAME_X_DISPLAY=20(f),=20gc);=0A=20=0A=20=20=20dpyinfo->bitmaps[id=20-=20= 1].have_mask=20=3D=20true;=0A@@=20-528,7=20+528,7=20@@=20= x_create_bitmap_mask=20(struct=20frame=20*f,=20ptrdiff_t=20id)=0A=20=0A=20= =0A=20= /***********************************************************************=0A= -=09=09=09=20=20=20=20Image=20types=0A+=20=20=20=20=20=20=20=20=20=20=20=20= =20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20Image=20types=0A=20=20= ***********************************************************************/=0A= =20=0A=20/*=20List=20of=20supported=20image=20types.=20=20Use=20= define_image_type=20to=20add=20new=0A@@=20-593,13=20+593,13=20@@=20= define_image_type=20(struct=20image_type=20*type)=0A=20=20=20=20=20=20=20= /*=20If=20we=20failed=20to=20load=20the=20library=20before,=20don't=20= try=20again.=20=20*/=0A=20=20=20=20=20=20=20Lisp_Object=20tested=20=3D=20= Fassq=20(target_type,=20Vlibrary_cache);=0A=20=20=20=20=20=20=20if=20= (CONSP=20(tested)=20&&=20NILP=20(XCDR=20(tested)))=0A-=09type_valid=20=3D=20= 0;=0A+=20=20=20=20=20=20=20=20type_valid=20=3D=200;=0A=20=20=20=20=20=20=20= else=0A=20#endif=0A-=09{=0A-=09=20=20type_valid=20=3D=20type->init=20();=0A= -=09=20=20CACHE_IMAGE_TYPE=20(target_type,=20type_valid=20?=20Qt=20:=20= Qnil);=0A-=09}=0A+=20=20=20=20=20=20=20=20{=0A+=20=20=20=20=20=20=20=20=20= =20type_valid=20=3D=20type->init=20();=0A+=20=20=20=20=20=20=20=20=20=20= CACHE_IMAGE_TYPE=20(target_type,=20type_valid=20?=20Qt=20:=20Qnil);=0A+=20= =20=20=20=20=20=20=20}=0A=20=20=20=20=20}=0A=20=0A=20=20=20if=20= (type_valid)=0A@@=20-635,19=20+635,19=20@@=20valid_image_p=20= (Lisp_Object=20object)=0A=20=20=20=20=20=20=20Lisp_Object=20tem;=0A=20=0A= =20=20=20=20=20=20=20for=20(tem=20=3D=20XCDR=20(object);=20CONSP=20= (tem);=20tem=20=3D=20XCDR=20(tem))=0A-=09if=20(EQ=20(XCAR=20(tem),=20= QCtype))=0A-=09=20=20{=0A-=09=20=20=20=20tem=20=3D=20XCDR=20(tem);=0A-=09= =20=20=20=20if=20(CONSP=20(tem)=20&&=20SYMBOLP=20(XCAR=20(tem)))=0A-=09=20= =20=20=20=20=20{=0A-=09=09struct=20image_type=20*type;=0A-=09=09type=20=3D= =20lookup_image_type=20(XCAR=20(tem));=0A-=09=09if=20(type)=0A-=09=09=20=20= valid_p=20=3D=20type->valid_p=20(object);=0A-=09=20=20=20=20=20=20}=0A+=20= =20=20=20=20=20=20=20if=20(EQ=20(XCAR=20(tem),=20QCtype))=0A+=20=20=20=20= =20=20=20=20=20=20{=0A+=20=20=20=20=20=20=20=20=20=20=20=20tem=20=3D=20= XCDR=20(tem);=0A+=20=20=20=20=20=20=20=20=20=20=20=20if=20(CONSP=20(tem)=20= &&=20SYMBOLP=20(XCAR=20(tem)))=0A+=20=20=20=20=20=20=20=20=20=20=20=20=20= =20{=0A+=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20struct=20= image_type=20*type;=0A+=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= type=20=3D=20lookup_image_type=20(XCAR=20(tem));=0A+=20=20=20=20=20=20=20= =20=20=20=20=20=20=20=20=20if=20(type)=0A+=20=20=20=20=20=20=20=20=20=20=20= =20=20=20=20=20=20=20valid_p=20=3D=20type->valid_p=20(object);=0A+=20=20=20= =20=20=20=20=20=20=20=20=20=20=20}=0A=20=0A-=09=20=20=20=20break;=0A-=09=20= =20}=0A+=20=20=20=20=20=20=20=20=20=20=20=20break;=0A+=20=20=20=20=20=20=20= =20=20=20}=0A=20=20=20=20=20}=0A=20=0A=20=20=20return=20valid_p;=0A@@=20= -669,7=20+669,7=20@@=20image_error=20(const=20char=20*format,=20= Lisp_Object=20arg1,=20Lisp_Object=20arg2)=0A=20=0A=20=0C=0A=20= /***********************************************************************=0A= -=09=09=09=20Image=20specifications=0A+=20=20=20=20=20=20=20=20=20=20=20=20= =20=20=20=20=20=20=20=20=20=20=20=20=20Image=20specifications=0A=20=20= ***********************************************************************/=0A= =20=0A=20enum=20image_value_type=0A@@=20-717,7=20+717,7=20@@=20struct=20= image_keyword=0A=20=0A=20static=20bool=0A=20parse_image_spec=20= (Lisp_Object=20spec,=20struct=20image_keyword=20*keywords,=0A-=09=09=20=20= int=20nkeywords,=20Lisp_Object=20type)=0A+=20=20=20=20=20=20=20=20=20=20=20= =20=20=20=20=20=20=20int=20nkeywords,=20Lisp_Object=20type)=0A=20{=0A=20=20= =20int=20i;=0A=20=20=20Lisp_Object=20plist;=0A@@=20-734,107=20+734,107=20= @@=20parse_image_spec=20(Lisp_Object=20spec,=20struct=20image_keyword=20= *keywords,=0A=20=20=20=20=20=20=20key=20=3D=20XCAR=20(plist);=0A=20=20=20= =20=20=20=20plist=20=3D=20XCDR=20(plist);=0A=20=20=20=20=20=20=20if=20= (!SYMBOLP=20(key))=0A-=09return=200;=0A+=20=20=20=20=20=20=20=20return=20= 0;=0A=20=0A=20=20=20=20=20=20=20/*=20There=20must=20follow=20a=20value.=20= =20*/=0A=20=20=20=20=20=20=20if=20(!CONSP=20(plist))=0A-=09return=200;=0A= +=20=20=20=20=20=20=20=20return=200;=0A=20=20=20=20=20=20=20value=20=3D=20= XCAR=20(plist);=0A=20=20=20=20=20=20=20plist=20=3D=20XCDR=20(plist);=0A=20= =0A=20=20=20=20=20=20=20/*=20Find=20key=20in=20KEYWORDS.=20=20Error=20if=20= not=20found.=20=20*/=0A=20=20=20=20=20=20=20for=20(i=20=3D=200;=20i=20<=20= nkeywords;=20++i)=0A-=09if=20(strcmp=20(keywords[i].name,=20SSDATA=20= (SYMBOL_NAME=20(key)))=20=3D=3D=200)=0A-=09=20=20break;=0A+=20=20=20=20=20= =20=20=20if=20(strcmp=20(keywords[i].name,=20SSDATA=20(SYMBOL_NAME=20= (key)))=20=3D=3D=200)=0A+=20=20=20=20=20=20=20=20=20=20break;=0A=20=0A=20= =20=20=20=20=20=20if=20(i=20=3D=3D=20nkeywords)=0A-=09continue;=0A+=20=20= =20=20=20=20=20=20continue;=0A=20=0A=20=20=20=20=20=20=20/*=20Record=20= that=20we=20recognized=20the=20keyword.=20=20If=20a=20keywords=0A-=09=20= was=20found=20more=20than=20once,=20it's=20an=20error.=20=20*/=0A+=20=20=20= =20=20=20=20=20=20was=20found=20more=20than=20once,=20it's=20an=20error.=20= =20*/=0A=20=20=20=20=20=20=20keywords[i].value=20=3D=20value;=0A=20=20=20= =20=20=20=20if=20(keywords[i].count=20>=201)=0A-=09return=200;=0A+=20=20=20= =20=20=20=20=20return=200;=0A=20=20=20=20=20=20=20++keywords[i].count;=0A= =20=0A=20=20=20=20=20=20=20/*=20Check=20type=20of=20value=20against=20= allowed=20type.=20=20*/=0A=20=20=20=20=20=20=20switch=20= (keywords[i].type)=0A-=09{=0A-=09case=20IMAGE_STRING_VALUE:=0A-=09=20=20= if=20(!STRINGP=20(value))=0A-=09=20=20=20=20return=200;=0A-=09=20=20= break;=0A-=0A-=09case=20IMAGE_STRING_OR_NIL_VALUE:=0A-=09=20=20if=20= (!STRINGP=20(value)=20&&=20!NILP=20(value))=0A-=09=20=20=20=20return=20= 0;=0A-=09=20=20break;=0A-=0A-=09case=20IMAGE_SYMBOL_VALUE:=0A-=09=20=20= if=20(!SYMBOLP=20(value))=0A-=09=20=20=20=20return=200;=0A-=09=20=20= break;=0A-=0A-=09case=20IMAGE_POSITIVE_INTEGER_VALUE:=0A-=09=20=20if=20= (!=20RANGED_INTEGERP=20(1,=20value,=20INT_MAX))=0A-=09=20=20=20=20return=20= 0;=0A-=09=20=20break;=0A-=0A-=09case=20= IMAGE_NON_NEGATIVE_INTEGER_VALUE_OR_PAIR:=0A-=09=20=20if=20= (RANGED_INTEGERP=20(0,=20value,=20INT_MAX))=0A-=09=20=20=20=20break;=0A-=09= =20=20if=20(CONSP=20(value)=0A-=09=20=20=20=20=20=20&&=20RANGED_INTEGERP=20= (0,=20XCAR=20(value),=20INT_MAX)=0A-=09=20=20=20=20=20=20&&=20= RANGED_INTEGERP=20(0,=20XCDR=20(value),=20INT_MAX))=0A-=09=20=20=20=20= break;=0A-=09=20=20return=200;=0A-=0A-=09case=20IMAGE_ASCENT_VALUE:=0A-=09= =20=20if=20(SYMBOLP=20(value)=20&&=20EQ=20(value,=20Qcenter))=0A-=09=20=20= =20=20break;=0A-=09=20=20else=20if=20(RANGED_INTEGERP=20(0,=20value,=20= 100))=0A-=09=20=20=20=20break;=0A-=09=20=20return=200;=0A-=0A-=09case=20= IMAGE_NON_NEGATIVE_INTEGER_VALUE:=0A-=09=20=20/*=20Unlike=20the=20other=20= integer-related=20cases,=20this=20one=20does=20not=0A-=09=20=20=20=20=20= verify=20that=20VALUE=20fits=20in=20'int'.=20=20This=20is=20because=20= callers=0A-=09=20=20=20=20=20want=20EMACS_INT.=20=20*/=0A-=09=20=20if=20= (!INTEGERP=20(value)=20||=20XINT=20(value)=20<=200)=0A-=09=20=20=20=20= return=200;=0A-=09=20=20break;=0A-=0A-=09case=20= IMAGE_DONT_CHECK_VALUE_TYPE:=0A-=09=20=20break;=0A-=0A-=09case=20= IMAGE_FUNCTION_VALUE:=0A-=09=20=20value=20=3D=20indirect_function=20= (value);=0A-=09=20=20if=20(!NILP=20(Ffunctionp=20(value)))=0A-=09=20=20=20= =20break;=0A-=09=20=20return=200;=0A-=0A-=09case=20IMAGE_NUMBER_VALUE:=0A= -=09=20=20if=20(!INTEGERP=20(value)=20&&=20!FLOATP=20(value))=0A-=09=20=20= =20=20return=200;=0A-=09=20=20break;=0A-=0A-=09case=20= IMAGE_INTEGER_VALUE:=0A-=09=20=20if=20(!=20TYPE_RANGED_INTEGERP=20(int,=20= value))=0A-=09=20=20=20=20return=200;=0A-=09=20=20break;=0A-=0A-=09case=20= IMAGE_BOOL_VALUE:=0A-=09=20=20if=20(!NILP=20(value)=20&&=20!EQ=20(value,=20= Qt))=0A-=09=20=20=20=20return=200;=0A-=09=20=20break;=0A-=0A-=09default:=0A= -=09=20=20emacs_abort=20();=0A-=09=20=20break;=0A-=09}=0A+=20=20=20=20=20= =20=20=20{=0A+=20=20=20=20=20=20=20=20case=20IMAGE_STRING_VALUE:=0A+=20=20= =20=20=20=20=20=20=20=20if=20(!STRINGP=20(value))=0A+=20=20=20=20=20=20=20= =20=20=20=20=20return=200;=0A+=20=20=20=20=20=20=20=20=20=20break;=0A+=0A= +=20=20=20=20=20=20=20=20case=20IMAGE_STRING_OR_NIL_VALUE:=0A+=20=20=20=20= =20=20=20=20=20=20if=20(!STRINGP=20(value)=20&&=20!NILP=20(value))=0A+=20= =20=20=20=20=20=20=20=20=20=20=20return=200;=0A+=20=20=20=20=20=20=20=20=20= =20break;=0A+=0A+=20=20=20=20=20=20=20=20case=20IMAGE_SYMBOL_VALUE:=0A+=20= =20=20=20=20=20=20=20=20=20if=20(!SYMBOLP=20(value))=0A+=20=20=20=20=20=20= =20=20=20=20=20=20return=200;=0A+=20=20=20=20=20=20=20=20=20=20break;=0A= +=0A+=20=20=20=20=20=20=20=20case=20IMAGE_POSITIVE_INTEGER_VALUE:=0A+=20=20= =20=20=20=20=20=20=20=20if=20(!=20RANGED_INTEGERP=20(1,=20value,=20= INT_MAX))=0A+=20=20=20=20=20=20=20=20=20=20=20=20return=200;=0A+=20=20=20= =20=20=20=20=20=20=20break;=0A+=0A+=20=20=20=20=20=20=20=20case=20= IMAGE_NON_NEGATIVE_INTEGER_VALUE_OR_PAIR:=0A+=20=20=20=20=20=20=20=20=20=20= if=20(RANGED_INTEGERP=20(0,=20value,=20INT_MAX))=0A+=20=20=20=20=20=20=20= =20=20=20=20=20break;=0A+=20=20=20=20=20=20=20=20=20=20if=20(CONSP=20= (value)=0A+=20=20=20=20=20=20=20=20=20=20=20=20=20=20&&=20= RANGED_INTEGERP=20(0,=20XCAR=20(value),=20INT_MAX)=0A+=20=20=20=20=20=20=20= =20=20=20=20=20=20=20&&=20RANGED_INTEGERP=20(0,=20XCDR=20(value),=20= INT_MAX))=0A+=20=20=20=20=20=20=20=20=20=20=20=20break;=0A+=20=20=20=20=20= =20=20=20=20=20return=200;=0A+=0A+=20=20=20=20=20=20=20=20case=20= IMAGE_ASCENT_VALUE:=0A+=20=20=20=20=20=20=20=20=20=20if=20(SYMBOLP=20= (value)=20&&=20EQ=20(value,=20Qcenter))=0A+=20=20=20=20=20=20=20=20=20=20= =20=20break;=0A+=20=20=20=20=20=20=20=20=20=20else=20if=20= (RANGED_INTEGERP=20(0,=20value,=20100))=0A+=20=20=20=20=20=20=20=20=20=20= =20=20break;=0A+=20=20=20=20=20=20=20=20=20=20return=200;=0A+=0A+=20=20=20= =20=20=20=20=20case=20IMAGE_NON_NEGATIVE_INTEGER_VALUE:=0A+=20=20=20=20=20= =20=20=20=20=20/*=20Unlike=20the=20other=20integer-related=20cases,=20= this=20one=20does=20not=0A+=20=20=20=20=20=20=20=20=20=20=20=20=20verify=20= that=20VALUE=20fits=20in=20'int'.=20=20This=20is=20because=20callers=0A+=20= =20=20=20=20=20=20=20=20=20=20=20=20want=20EMACS_INT.=20=20*/=0A+=20=20=20= =20=20=20=20=20=20=20if=20(!INTEGERP=20(value)=20||=20XINT=20(value)=20<=20= 0)=0A+=20=20=20=20=20=20=20=20=20=20=20=20return=200;=0A+=20=20=20=20=20=20= =20=20=20=20break;=0A+=0A+=20=20=20=20=20=20=20=20case=20= IMAGE_DONT_CHECK_VALUE_TYPE:=0A+=20=20=20=20=20=20=20=20=20=20break;=0A+=0A= +=20=20=20=20=20=20=20=20case=20IMAGE_FUNCTION_VALUE:=0A+=20=20=20=20=20=20= =20=20=20=20value=20=3D=20indirect_function=20(value);=0A+=20=20=20=20=20= =20=20=20=20=20if=20(!NILP=20(Ffunctionp=20(value)))=0A+=20=20=20=20=20=20= =20=20=20=20=20=20break;=0A+=20=20=20=20=20=20=20=20=20=20return=200;=0A= +=0A+=20=20=20=20=20=20=20=20case=20IMAGE_NUMBER_VALUE:=0A+=20=20=20=20=20= =20=20=20=20=20if=20(!INTEGERP=20(value)=20&&=20!FLOATP=20(value))=0A+=20= =20=20=20=20=20=20=20=20=20=20=20return=200;=0A+=20=20=20=20=20=20=20=20=20= =20break;=0A+=0A+=20=20=20=20=20=20=20=20case=20IMAGE_INTEGER_VALUE:=0A+=20= =20=20=20=20=20=20=20=20=20if=20(!=20TYPE_RANGED_INTEGERP=20(int,=20= value))=0A+=20=20=20=20=20=20=20=20=20=20=20=20return=200;=0A+=20=20=20=20= =20=20=20=20=20=20break;=0A+=0A+=20=20=20=20=20=20=20=20case=20= IMAGE_BOOL_VALUE:=0A+=20=20=20=20=20=20=20=20=20=20if=20(!NILP=20(value)=20= &&=20!EQ=20(value,=20Qt))=0A+=20=20=20=20=20=20=20=20=20=20=20=20return=20= 0;=0A+=20=20=20=20=20=20=20=20=20=20break;=0A+=0A+=20=20=20=20=20=20=20=20= default:=0A+=20=20=20=20=20=20=20=20=20=20emacs_abort=20();=0A+=20=20=20=20= =20=20=20=20=20=20break;=0A+=20=20=20=20=20=20=20=20}=0A=20=0A=20=20=20=20= =20=20=20if=20(EQ=20(key,=20QCtype)=20&&=20!EQ=20(type,=20value))=0A-=09= return=200;=0A+=20=20=20=20=20=20=20=20return=200;=0A=20=20=20=20=20}=0A=20= =0A=20=20=20/*=20Check=20that=20all=20mandatory=20fields=20are=20= present.=20=20*/=0A@@=20-862,11=20+862,11=20@@=20image_spec_value=20= (Lisp_Object=20spec,=20Lisp_Object=20key,=20bool=20*found)=0A=20=20=20=20= =20=20=20=20tail=20=3D=20XCDR=20(XCDR=20(tail)))=0A=20=20=20=20=20{=0A=20= =20=20=20=20=20=20if=20(EQ=20(XCAR=20(tail),=20key))=0A-=09{=0A-=09=20=20= if=20(found)=0A-=09=20=20=20=20*found=20=3D=201;=0A-=09=20=20return=20= XCAR=20(XCDR=20(tail));=0A-=09}=0A+=20=20=20=20=20=20=20=20{=0A+=20=20=20= =20=20=20=20=20=20=20if=20(found)=0A+=20=20=20=20=20=20=20=20=20=20=20=20= *found=20=3D=201;=0A+=20=20=20=20=20=20=20=20=20=20return=20XCAR=20(XCDR=20= (tail));=0A+=20=20=20=20=20=20=20=20}=0A=20=20=20=20=20}=0A=20=0A=20=20=20= if=20(found)=0A@@=20-895,10=20+895,10=20@@=20or=20omitted=20means=20use=20= the=20selected=20frame.=20=20*/)=0A=20=20=20=20=20=20=20int=20height=20=3D= =20img->height=20+=202=20*=20img->vmargin;=0A=20=0A=20=20=20=20=20=20=20= if=20(NILP=20(pixels))=0A-=09size=20=3D=20Fcons=20(make_float=20= ((double)=20width=20/=20FRAME_COLUMN_WIDTH=20(f)),=0A-=09=09=20=20=20=20=20= =20make_float=20((double)=20height=20/=20FRAME_LINE_HEIGHT=20(f)));=0A+=20= =20=20=20=20=20=20=20size=20=3D=20Fcons=20(make_float=20((double)=20= width=20/=20FRAME_COLUMN_WIDTH=20(f)),=0A+=20=20=20=20=20=20=20=20=20=20=20= =20=20=20=20=20=20=20=20=20=20=20make_float=20((double)=20height=20/=20= FRAME_LINE_HEIGHT=20(f)));=0A=20=20=20=20=20=20=20else=0A-=09size=20=3D=20= Fcons=20(make_number=20(width),=20make_number=20(height));=0A+=20=20=20=20= =20=20=20=20size=20=3D=20Fcons=20(make_number=20(width),=20make_number=20= (height));=0A=20=20=20=20=20}=0A=20=20=20else=0A=20=20=20=20=20error=20= ("Invalid=20image=20specification");=0A@@=20-922,7=20+922,7=20@@=20or=20= omitted=20means=20use=20the=20selected=20frame.=20=20*/)=0A=20=20=20=20=20= =20=20ptrdiff_t=20id=20=3D=20lookup_image=20(f,=20spec);=0A=20=20=20=20=20= =20=20struct=20image=20*img=20=3D=20IMAGE_FROM_ID=20(f,=20id);=0A=20=20=20= =20=20=20=20if=20(img->mask)=0A-=09mask=20=3D=20Qt;=0A+=20=20=20=20=20=20= =20=20mask=20=3D=20Qt;=0A=20=20=20=20=20}=0A=20=20=20else=0A=20=20=20=20=20= error=20("Invalid=20image=20specification");=0A@@=20-952,7=20+952,7=20@@=20= or=20omitted=20means=20use=20the=20selected=20frame.=20=20*/)=0A=20=0A=20= =0C=0A=20= /***********************************************************************=0A= -=09=09=20Image=20type=20independent=20image=20structures=0A+=20=20=20=20= =20=20=20=20=20=20=20=20=20=20=20=20=20Image=20type=20independent=20= image=20structures=0A=20=20= ***********************************************************************/=0A= =20=0A=20#define=20MAX_IMAGE_SIZE=2010.0=0A@@=20-989,12=20+989,12=20@@=20= free_image=20(struct=20frame=20*f,=20struct=20image=20*img)=0A=20=0A=20=20= =20=20=20=20=20/*=20Remove=20IMG=20from=20the=20hash=20table=20of=20its=20= cache.=20=20*/=0A=20=20=20=20=20=20=20if=20(img->prev)=0A-=09= img->prev->next=20=3D=20img->next;=0A+=20=20=20=20=20=20=20=20= img->prev->next=20=3D=20img->next;=0A=20=20=20=20=20=20=20else=0A-=09= c->buckets[img->hash=20%=20IMAGE_CACHE_BUCKETS_SIZE]=20=3D=20img->next;=0A= +=20=20=20=20=20=20=20=20c->buckets[img->hash=20%=20= IMAGE_CACHE_BUCKETS_SIZE]=20=3D=20img->next;=0A=20=0A=20=20=20=20=20=20=20= if=20(img->next)=0A-=09img->next->prev=20=3D=20img->prev;=0A+=20=20=20=20= =20=20=20=20img->next->prev=20=3D=20img->prev;=0A=20=0A=20=20=20=20=20=20= =20c->images[img->id]=20=3D=20NULL;=0A=20=0A@@=20-1016,18=20+1016,18=20= @@=20check_image_size=20(struct=20frame=20*f,=20int=20width,=20int=20= height)=0A=20=0A=20=20=20if=20(INTEGERP=20(Vmax_image_size))=0A=20=20=20=20= =20return=20(width=20<=3D=20XINT=20(Vmax_image_size)=0A-=09=20=20=20=20= &&=20height=20<=3D=20XINT=20(Vmax_image_size));=0A+=20=20=20=20=20=20=20=20= =20=20=20=20&&=20height=20<=3D=20XINT=20(Vmax_image_size));=0A=20=20=20= else=20if=20(FLOATP=20(Vmax_image_size))=0A=20=20=20=20=20{=0A=20=20=20=20= =20=20=20if=20(f=20!=3D=20NULL)=0A-=09{=0A-=09=20=20w=20=3D=20= FRAME_PIXEL_WIDTH=20(f);=0A-=09=20=20h=20=3D=20FRAME_PIXEL_HEIGHT=20(f);=0A= -=09}=0A+=20=20=20=20=20=20=20=20{=0A+=20=20=20=20=20=20=20=20=20=20w=20= =3D=20FRAME_PIXEL_WIDTH=20(f);=0A+=20=20=20=20=20=20=20=20=20=20h=20=3D=20= FRAME_PIXEL_HEIGHT=20(f);=0A+=20=20=20=20=20=20=20=20}=0A=20=20=20=20=20=20= =20else=0A-=09w=20=3D=20h=20=3D=201024;=20=20/*=20Arbitrary=20size=20for=20= unknown=20frame.=20*/=0A+=20=20=20=20=20=20=20=20w=20=3D=20h=20=3D=20= 1024;=20=20/*=20Arbitrary=20size=20for=20unknown=20frame.=20*/=0A=20=20=20= =20=20=20=20return=20(width=20<=3D=20XFLOAT_DATA=20(Vmax_image_size)=20*=20= w=0A-=09=20=20=20=20=20=20&&=20height=20<=3D=20XFLOAT_DATA=20= (Vmax_image_size)=20*=20h);=0A+=20=20=20=20=20=20=20=20=20=20=20=20=20=20= &&=20height=20<=3D=20XFLOAT_DATA=20(Vmax_image_size)=20*=20h);=0A=20=20=20= =20=20}=0A=20=20=20else=0A=20=20=20=20=20return=201;=0A@@=20-1077,23=20= +1077,23=20@@=20image_ascent=20(struct=20image=20*img,=20struct=20face=20= *face,=20struct=20glyph_slice=20*slice)=0A=20=20=20if=20(img->ascent=20= =3D=3D=20CENTERED_IMAGE_ASCENT)=0A=20=20=20=20=20{=0A=20=20=20=20=20=20=20= if=20(face->font)=0A-=09{=0A+=20=20=20=20=20=20=20=20{=0A=20#ifdef=20= HAVE_NTGUI=0A-=09=20=20/*=20W32=20specific=20version.=20=20Why?.=20++kfs=20= =20*/=0A-=09=20=20ascent=20=3D=20height=20/=202=20-=20(FONT_DESCENT=20= (face->font)=0A-=09=09=09=09=20-=20FONT_BASE=20(face->font))=20/=202;=0A= +=20=20=20=20=20=20=20=20=20=20/*=20W32=20specific=20version.=20=20Why?.=20= ++kfs=20=20*/=0A+=20=20=20=20=20=20=20=20=20=20ascent=20=3D=20height=20/=20= 2=20-=20(FONT_DESCENT=20(face->font)=0A+=20=20=20=20=20=20=20=20=20=20=20= =20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20-=20= FONT_BASE=20(face->font))=20/=202;=0A=20#else=0A-=09=20=20/*=20This=20= expression=20is=20arranged=20so=20that=20if=20the=20image=20can't=20be=0A= -=09=20=20=20=20=20exactly=20centered,=20it=20will=20be=20moved=20= slightly=20up.=20=20This=20is=0A-=09=20=20=20=20=20because=20a=20typical=20= font=20is=20`top-heavy'=20(due=20to=20the=20presence=0A-=09=20=20=20=20=20= uppercase=20letters),=20so=20the=20image=20placement=20should=20err=20= towards=0A-=09=20=20=20=20=20being=20top-heavy=20too.=20=20It=20also=20= just=20generally=20looks=20better.=20=20*/=0A-=09=20=20ascent=20=3D=20= (height=20+=20FONT_BASE=20(face->font)=0A+=20=20=20=20=20=20=20=20=20=20= /*=20This=20expression=20is=20arranged=20so=20that=20if=20the=20image=20= can't=20be=0A+=20=20=20=20=20=20=20=20=20=20=20=20=20exactly=20centered,=20= it=20will=20be=20moved=20slightly=20up.=20=20This=20is=0A+=20=20=20=20=20= =20=20=20=20=20=20=20=20because=20a=20typical=20font=20is=20`top-heavy'=20= (due=20to=20the=20presence=0A+=20=20=20=20=20=20=20=20=20=20=20=20=20= uppercase=20letters),=20so=20the=20image=20placement=20should=20err=20= towards=0A+=20=20=20=20=20=20=20=20=20=20=20=20=20being=20top-heavy=20= too.=20=20It=20also=20just=20generally=20looks=20better.=20=20*/=0A+=20=20= =20=20=20=20=20=20=20=20ascent=20=3D=20(height=20+=20FONT_BASE=20= (face->font)=0A=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= =20-=20FONT_DESCENT=20(face->font)=20+=201)=20/=202;=0A=20#endif=20/*=20= HAVE_NTGUI=20*/=0A-=09}=0A+=20=20=20=20=20=20=20=20}=0A=20=20=20=20=20=20= =20else=0A-=09ascent=20=3D=20height=20/=202;=0A+=20=20=20=20=20=20=20=20= ascent=20=3D=20height=20/=202;=0A=20=20=20=20=20}=0A=20=20=20else=0A=20=20= =20=20=20ascent=20=3D=20height=20*=20(img->ascent=20/=20100.0);=0A@@=20= -1109,7=20+1109,7=20@@=20image_ascent=20(struct=20image=20*img,=20struct=20= face=20*face,=20struct=20glyph_slice=20*slice)=0A=20=0A=20static=20= RGB_PIXEL_COLOR=0A=20four_corners_best=20(XImagePtr_or_DC=20ximg,=20int=20= *corners,=0A-=09=09=20=20=20unsigned=20long=20width,=20unsigned=20long=20= height)=0A+=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= unsigned=20long=20width,=20unsigned=20long=20height)=0A=20{=0A=20=20=20= RGB_PIXEL_COLOR=20corner_pixels[4],=20best=20IF_LINT=20(=3D=200);=0A=20=20= =20int=20i,=20best_count;=0A@@=20-1136,11=20+1136,11=20@@=20= four_corners_best=20(XImagePtr_or_DC=20ximg,=20int=20*corners,=0A=20=20=20= =20=20=20=20int=20j,=20n;=0A=20=0A=20=20=20=20=20=20=20for=20(j=20=3D=20= n=20=3D=200;=20j=20<=204;=20++j)=0A-=09if=20(corner_pixels[i]=20=3D=3D=20= corner_pixels[j])=0A-=09=20=20++n;=0A+=20=20=20=20=20=20=20=20if=20= (corner_pixels[i]=20=3D=3D=20corner_pixels[j])=0A+=20=20=20=20=20=20=20=20= =20=20++n;=0A=20=0A=20=20=20=20=20=20=20if=20(n=20>=20best_count)=0A-=09= best=20=3D=20corner_pixels[i],=20best_count=20=3D=20n;=0A+=20=20=20=20=20= =20=20=20best=20=3D=20corner_pixels[i],=20best_count=20=3D=20n;=0A=20=20=20= =20=20}=0A=20=0A=20=20=20return=20best;=0A@@=20-1183,12=20+1183,12=20@@=20= image_background=20(struct=20image=20*img,=20struct=20frame=20*f,=20= XImagePtr_or_DC=20ximg)=0A=20#endif=20/*=20HAVE_NTGUI=20*/=0A=20=0A=20=20= =20=20=20=20=20if=20(free_ximg)=0A-=09ximg=20=3D=20= image_get_x_image_or_dc=20(f,=20img,=200,=20&prev);=0A+=20=20=20=20=20=20= =20=20ximg=20=3D=20image_get_x_image_or_dc=20(f,=20img,=200,=20&prev);=0A= =20=0A=20=20=20=20=20=20=20img->background=20=3D=20four_corners_best=20= (ximg,=20img->corners,=20img->width,=20img->height);=0A=20=0A=20=20=20=20= =20=20=20if=20(free_ximg)=0A-=09image_unget_x_image_or_dc=20(img,=200,=20= ximg,=20prev);=0A+=20=20=20=20=20=20=20=20image_unget_x_image_or_dc=20= (img,=200,=20ximg,=20prev);=0A=20=0A=20=20=20=20=20=20=20= img->background_valid=20=3D=201;=0A=20=20=20=20=20}=0A@@=20-1207,23=20= +1207,23=20@@=20image_background_transparent=20(struct=20image=20*img,=20= struct=20frame=20*f,=20XImagePtr_or_D=0A=20=20=20=20=20/*=20IMG=20= doesn't=20have=20a=20background=20yet,=20try=20to=20guess=20a=20= reasonable=20value.=20=20*/=0A=20=20=20=20=20{=0A=20=20=20=20=20=20=20if=20= (img->mask)=0A-=09{=0A-=09=20=20bool=20free_mask=20=3D=20!mask;=0A+=20=20= =20=20=20=20=20=20{=0A+=20=20=20=20=20=20=20=20=20=20bool=20free_mask=20= =3D=20!mask;=0A=20#ifdef=20HAVE_NTGUI=0A-=09=20=20HGDIOBJ=20prev;=0A+=20=20= =20=20=20=20=20=20=20=20HGDIOBJ=20prev;=0A=20#endif=20/*=20HAVE_NTGUI=20= */=0A=20=0A-=09=20=20if=20(free_mask)=0A-=09=20=20=20=20mask=20=3D=20= image_get_x_image_or_dc=20(f,=20img,=201,=20&prev);=0A+=20=20=20=20=20=20= =20=20=20=20if=20(free_mask)=0A+=20=20=20=20=20=20=20=20=20=20=20=20mask=20= =3D=20image_get_x_image_or_dc=20(f,=20img,=201,=20&prev);=0A=20=0A-=09=20= =20img->background_transparent=0A-=09=20=20=20=20=3D=20= (four_corners_best=20(mask,=20img->corners,=20img->width,=20img->height)=20= =3D=3D=20PIX_MASK_RETAIN);=0A+=20=20=20=20=20=20=20=20=20=20= img->background_transparent=0A+=20=20=20=20=20=20=20=20=20=20=20=20=3D=20= (four_corners_best=20(mask,=20img->corners,=20img->width,=20img->height)=20= =3D=3D=20PIX_MASK_RETAIN);=0A=20=0A-=09=20=20if=20(free_mask)=0A-=09=20=20= =20=20image_unget_x_image_or_dc=20(img,=201,=20mask,=20prev);=0A-=09}=0A= +=20=20=20=20=20=20=20=20=20=20if=20(free_mask)=0A+=20=20=20=20=20=20=20=20= =20=20=20=20image_unget_x_image_or_dc=20(img,=201,=20mask,=20prev);=0A+=20= =20=20=20=20=20=20=20}=0A=20=20=20=20=20=20=20else=0A-=09= img->background_transparent=20=3D=200;=0A+=20=20=20=20=20=20=20=20= img->background_transparent=20=3D=200;=0A=20=0A=20=20=20=20=20=20=20= img->background_transparent_valid=20=3D=201;=0A=20=20=20=20=20}=0A@@=20= -1245,7=20+1245,7=20@@=20x_query_frame_background_color=20(struct=20= frame=20*f,=20XColor=20*bgcolor)=0A=20=0A=20=0C=0A=20= /***********************************************************************=0A= -=09=09=20=20Helper=20functions=20for=20X=20image=20types=0A+=20=20=20=20= =20=20=20=20=20=20=20=20=20=20=20=20=20=20Helper=20functions=20for=20X=20= image=20types=0A=20=20= ***********************************************************************/=0A= =20=0A=20/*=20Clear=20X=20resources=20of=20image=20IMG=20on=20frame=20F=20= according=20to=20FLAGS.=0A@@=20-1265,37=20+1265,37=20@@=20= x_clear_image_1=20(struct=20frame=20*f,=20struct=20image=20*img,=20int=20= flags)=0A=20=20=20if=20(flags=20&=20CLEAR_IMAGE_PIXMAP)=0A=20=20=20=20=20= {=0A=20=20=20=20=20=20=20if=20(img->pixmap)=0A-=09{=0A-=09=20=20= Free_Pixmap=20(FRAME_X_DISPLAY=20(f),=20img->pixmap);=0A-=09=20=20= img->pixmap=20=3D=20NO_PIXMAP;=0A-=09=20=20/*=20NOTE=20(HAVE_NS):=20= background=20color=20is=20NOT=20an=20indexed=20color!=20*/=0A-=09=20=20= img->background_valid=20=3D=200;=0A-=09}=0A+=20=20=20=20=20=20=20=20{=0A= +=20=20=20=20=20=20=20=20=20=20Free_Pixmap=20(FRAME_X_DISPLAY=20(f),=20= img->pixmap);=0A+=20=20=20=20=20=20=20=20=20=20img->pixmap=20=3D=20= NO_PIXMAP;=0A+=20=20=20=20=20=20=20=20=20=20/*=20NOTE=20(HAVE_NS):=20= background=20color=20is=20NOT=20an=20indexed=20color!=20*/=0A+=20=20=20=20= =20=20=20=20=20=20img->background_valid=20=3D=200;=0A+=20=20=20=20=20=20=20= =20}=0A=20#ifdef=20HAVE_X_WINDOWS=0A=20=20=20=20=20=20=20if=20= (img->ximg)=0A-=09{=0A-=09=20=20x_destroy_x_image=20(img->ximg);=0A-=09=20= =20img->ximg=20=3D=20NULL;=0A-=09=20=20img->background_valid=20=3D=200;=0A= -=09}=0A+=20=20=20=20=20=20=20=20{=0A+=20=20=20=20=20=20=20=20=20=20= x_destroy_x_image=20(img->ximg);=0A+=20=20=20=20=20=20=20=20=20=20= img->ximg=20=3D=20NULL;=0A+=20=20=20=20=20=20=20=20=20=20= img->background_valid=20=3D=200;=0A+=20=20=20=20=20=20=20=20}=0A=20= #endif=0A=20=20=20=20=20}=0A=20=0A=20=20=20if=20(flags=20&=20= CLEAR_IMAGE_MASK)=0A=20=20=20=20=20{=0A=20=20=20=20=20=20=20if=20= (img->mask)=0A-=09{=0A-=09=20=20Free_Pixmap=20(FRAME_X_DISPLAY=20(f),=20= img->mask);=0A-=09=20=20img->mask=20=3D=20NO_PIXMAP;=0A-=09=20=20= img->background_transparent_valid=20=3D=200;=0A-=09}=0A+=20=20=20=20=20=20= =20=20{=0A+=20=20=20=20=20=20=20=20=20=20Free_Pixmap=20(FRAME_X_DISPLAY=20= (f),=20img->mask);=0A+=20=20=20=20=20=20=20=20=20=20img->mask=20=3D=20= NO_PIXMAP;=0A+=20=20=20=20=20=20=20=20=20=20= img->background_transparent_valid=20=3D=200;=0A+=20=20=20=20=20=20=20=20= }=0A=20#ifdef=20HAVE_X_WINDOWS=0A=20=20=20=20=20=20=20if=20= (img->mask_img)=0A-=09{=0A-=09=20=20x_destroy_x_image=20(img->mask_img);=0A= -=09=20=20img->mask_img=20=3D=20NULL;=0A-=09=20=20= img->background_transparent_valid=20=3D=200;=0A-=09}=0A+=20=20=20=20=20=20= =20=20{=0A+=20=20=20=20=20=20=20=20=20=20x_destroy_x_image=20= (img->mask_img);=0A+=20=20=20=20=20=20=20=20=20=20img->mask_img=20=3D=20= NULL;=0A+=20=20=20=20=20=20=20=20=20=20img->background_transparent_valid=20= =3D=200;=0A+=20=20=20=20=20=20=20=20}=0A=20#endif=0A=20=20=20=20=20}=0A=20= =0A@@=20-1319,7=20+1319,7=20@@=20x_clear_image=20(struct=20frame=20*f,=20= struct=20image=20*img)=0A=20{=0A=20=20=20block_input=20();=0A=20=20=20= x_clear_image_1=20(f,=20img,=0A-=09=09=20=20=20CLEAR_IMAGE_PIXMAP=20|=20= CLEAR_IMAGE_MASK=20|=20CLEAR_IMAGE_COLORS);=0A+=20=20=20=20=20=20=20=20=20= =20=20=20=20=20=20=20=20=20=20CLEAR_IMAGE_PIXMAP=20|=20CLEAR_IMAGE_MASK=20= |=20CLEAR_IMAGE_COLORS);=0A=20=20=20unblock_input=20();=0A=20}=0A=20=0A= @@=20-1331,7=20+1331,7=20@@=20x_clear_image=20(struct=20frame=20*f,=20= struct=20image=20*img)=0A=20=0A=20static=20unsigned=20long=0A=20= x_alloc_image_color=20(struct=20frame=20*f,=20struct=20image=20*img,=20= Lisp_Object=20color_name,=0A-=09=09=20=20=20=20=20unsigned=20long=20= dflt)=0A+=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= unsigned=20long=20dflt)=0A=20{=0A=20=20=20XColor=20color;=0A=20=20=20= unsigned=20long=20result;=0A@@=20-1340,10=20+1340,10=20@@=20= x_alloc_image_color=20(struct=20frame=20*f,=20struct=20image=20*img,=20= Lisp_Object=20color_name,=0A=20=0A=20=20=20if=20(x_defined_color=20(f,=20= SSDATA=20(color_name),=20&color,=201)=0A=20=20=20=20=20=20=20&&=20= img->ncolors=20<=20min=20(min=20(PTRDIFF_MAX,=20SIZE_MAX)=20/=20sizeof=20= *img->colors,=0A-=09=09=09=20=20=20=20=20INT_MAX))=0A+=20=20=20=20=20=20=20= =20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= INT_MAX))=0A=20=20=20=20=20{=0A=20=20=20=20=20=20=20/*=20This=20isn't=20= called=20frequently=20so=20we=20get=20away=20with=20simply=0A-=09=20= reallocating=20the=20color=20vector=20to=20the=20needed=20size,=20here.=20= =20*/=0A+=20=20=20=20=20=20=20=20=20reallocating=20the=20color=20vector=20= to=20the=20needed=20size,=20here.=20=20*/=0A=20=20=20=20=20=20=20= ptrdiff_t=20ncolors=20=3D=20img->ncolors=20+=201;=0A=20=20=20=20=20=20=20= img->colors=20=3D=20xrealloc=20(img->colors,=20ncolors=20*=20sizeof=20= *img->colors);=0A=20=20=20=20=20=20=20img->colors[ncolors=20-=201]=20=3D=20= color.pixel;=0A@@=20-1359,7=20+1359,7=20@@=20x_alloc_image_color=20= (struct=20frame=20*f,=20struct=20image=20*img,=20Lisp_Object=20= color_name,=0A=20=0A=20=0C=0A=20= /***********************************************************************=0A= -=09=09=09=20=20=20=20=20Image=20Cache=0A+=20=20=20=20=20=20=20=20=20=20=20= =20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20Image=20Cache=0A=20= =20= ***********************************************************************/=0A= =20=0A=20static=20void=20cache_image=20(struct=20frame=20*f,=20struct=20= image=20*img);=0A@@=20-1405,9=20+1405,9=20@@=20search_image_cache=20= (struct=20frame=20*f,=20Lisp_Object=20spec,=20EMACS_UINT=20hash)=0A=20=0A= =20=20=20for=20(img=20=3D=20c->buckets[i];=20img;=20img=20=3D=20= img->next)=0A=20=20=20=20=20if=20(img->hash=20=3D=3D=20hash=0A-=09&&=20= !NILP=20(Fequal=20(img->spec,=20spec))=0A-=09&&=20img->frame_foreground=20= =3D=3D=20FRAME_FOREGROUND_PIXEL=20(f)=0A-=09&&=20img->frame_background=20= =3D=3D=20FRAME_BACKGROUND_PIXEL=20(f))=0A+=20=20=20=20=20=20=20=20&&=20= !NILP=20(Fequal=20(img->spec,=20spec))=0A+=20=20=20=20=20=20=20=20&&=20= img->frame_foreground=20=3D=3D=20FRAME_FOREGROUND_PIXEL=20(f)=0A+=20=20=20= =20=20=20=20=20&&=20img->frame_background=20=3D=3D=20= FRAME_BACKGROUND_PIXEL=20(f))=0A=20=20=20=20=20=20=20break;=0A=20=20=20= return=20img;=0A=20}=0A@@=20-1423,7=20+1423,7=20@@=20uncache_image=20= (struct=20frame=20*f,=20Lisp_Object=20spec)=0A=20=20=20=20=20{=0A=20=20=20= =20=20=20=20free_image=20(f,=20img);=0A=20=20=20=20=20=20=20/*=20As=20= display=20glyphs=20may=20still=20be=20referring=20to=20the=20image=20ID,=20= we=0A-=09=20must=20garbage=20the=20frame=20(Bug#6426).=20=20*/=0A+=20=20=20= =20=20=20=20=20=20must=20garbage=20the=20frame=20(Bug#6426).=20=20*/=0A=20= =20=20=20=20=20=20SET_FRAME_GARBAGED=20(f);=0A=20=20=20=20=20}=0A=20}=0A= @@=20-1444,7=20+1444,7=20@@=20free_image_cache=20(struct=20frame=20*f)=0A= =20=20=20=20=20=20=20eassert=20(c->refcount=20=3D=3D=200);=0A=20=0A=20=20= =20=20=20=20=20for=20(i=20=3D=200;=20i=20<=20c->used;=20++i)=0A-=09= free_image=20(f,=20c->images[i]);=0A+=20=20=20=20=20=20=20=20free_image=20= (f,=20c->images[i]);=0A=20=20=20=20=20=20=20xfree=20(c->images);=0A=20=20= =20=20=20=20=20xfree=20(c->buckets);=0A=20=20=20=20=20=20=20xfree=20(c);=0A= @@=20-1471,72=20+1471,72=20@@=20clear_image_cache=20(struct=20frame=20= *f,=20Lisp_Object=20filter)=0A=20=20=20=20=20=20=20ptrdiff_t=20i,=20= nfreed=20=3D=200;=0A=20=0A=20=20=20=20=20=20=20/*=20Block=20input=20so=20= that=20we=20won't=20be=20interrupted=20by=20a=20SIGIO=0A-=09=20while=20= being=20in=20an=20inconsistent=20state.=20=20*/=0A+=20=20=20=20=20=20=20=20= =20while=20being=20in=20an=20inconsistent=20state.=20=20*/=0A=20=20=20=20= =20=20=20block_input=20();=0A=20=0A=20=20=20=20=20=20=20if=20(!NILP=20= (filter))=0A-=09{=0A-=09=20=20/*=20Filter=20image=20cache.=20=20*/=0A-=09= =20=20for=20(i=20=3D=200;=20i=20<=20c->used;=20++i)=0A-=09=20=20=20=20{=0A= -=09=20=20=20=20=20=20struct=20image=20*img=20=3D=20c->images[i];=0A-=09=20= =20=20=20=20=20if=20(img=20&&=20(EQ=20(Qt,=20filter)=0A-=09=09=09=20=20= ||=20!NILP=20(Fmember=20(filter,=20img->dependencies))))=0A-=09=09{=0A-=09= =09=20=20free_image=20(f,=20img);=0A-=09=09=20=20++nfreed;=0A-=09=09}=0A= -=09=20=20=20=20}=0A-=09}=0A+=20=20=20=20=20=20=20=20{=0A+=20=20=20=20=20= =20=20=20=20=20/*=20Filter=20image=20cache.=20=20*/=0A+=20=20=20=20=20=20= =20=20=20=20for=20(i=20=3D=200;=20i=20<=20c->used;=20++i)=0A+=20=20=20=20= =20=20=20=20=20=20=20=20{=0A+=20=20=20=20=20=20=20=20=20=20=20=20=20=20= struct=20image=20*img=20=3D=20c->images[i];=0A+=20=20=20=20=20=20=20=20=20= =20=20=20=20=20if=20(img=20&&=20(EQ=20(Qt,=20filter)=0A+=20=20=20=20=20=20= =20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20||=20!NILP=20= (Fmember=20(filter,=20img->dependencies))))=0A+=20=20=20=20=20=20=20=20=20= =20=20=20=20=20=20=20{=0A+=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= =20=20free_image=20(f,=20img);=0A+=20=20=20=20=20=20=20=20=20=20=20=20=20= =20=20=20=20=20++nfreed;=0A+=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= =20}=0A+=20=20=20=20=20=20=20=20=20=20=20=20}=0A+=20=20=20=20=20=20=20=20= }=0A=20=20=20=20=20=20=20else=20if=20(INTEGERP=20= (Vimage_cache_eviction_delay))=0A-=09{=0A-=09=20=20/*=20Free=20cache=20= based=20on=20timestamp.=20=20*/=0A-=09=20=20struct=20timespec=20old,=20= t;=0A-=09=20=20double=20delay;=0A-=09=20=20ptrdiff_t=20nimages=20=3D=20= 0;=0A-=0A-=09=20=20for=20(i=20=3D=200;=20i=20<=20c->used;=20++i)=0A-=09=20= =20=20=20if=20(c->images[i])=0A-=09=20=20=20=20=20=20nimages++;=0A-=0A-=09= =20=20/*=20If=20the=20number=20of=20cached=20images=20has=20grown=20= unusually=20large,=0A-=09=20=20=20=20=20decrease=20the=20cache=20= eviction=20delay=20(Bug#6230).=20=20*/=0A-=09=20=20delay=20=3D=20XINT=20= (Vimage_cache_eviction_delay);=0A-=09=20=20if=20(nimages=20>=2040)=0A-=09= =20=20=20=20delay=20=3D=201600=20*=20delay=20/=20nimages=20/=20nimages;=0A= -=09=20=20delay=20=3D=20max=20(delay,=201);=0A-=0A-=09=20=20t=20=3D=20= current_timespec=20();=0A-=09=20=20old=20=3D=20timespec_sub=20(t,=20= dtotimespec=20(delay));=0A-=0A-=09=20=20for=20(i=20=3D=200;=20i=20<=20= c->used;=20++i)=0A-=09=20=20=20=20{=0A-=09=20=20=20=20=20=20struct=20= image=20*img=20=3D=20c->images[i];=0A-=09=20=20=20=20=20=20if=20(img=20= &&=20timespec_cmp=20(img->timestamp,=20old)=20<=200)=0A-=09=09{=0A-=09=09= =20=20free_image=20(f,=20img);=0A-=09=09=20=20++nfreed;=0A-=09=09}=0A-=09= =20=20=20=20}=0A-=09}=0A+=20=20=20=20=20=20=20=20{=0A+=20=20=20=20=20=20=20= =20=20=20/*=20Free=20cache=20based=20on=20timestamp.=20=20*/=0A+=20=20=20= =20=20=20=20=20=20=20struct=20timespec=20old,=20t;=0A+=20=20=20=20=20=20=20= =20=20=20double=20delay;=0A+=20=20=20=20=20=20=20=20=20=20ptrdiff_t=20= nimages=20=3D=200;=0A+=0A+=20=20=20=20=20=20=20=20=20=20for=20(i=20=3D=20= 0;=20i=20<=20c->used;=20++i)=0A+=20=20=20=20=20=20=20=20=20=20=20=20if=20= (c->images[i])=0A+=20=20=20=20=20=20=20=20=20=20=20=20=20=20nimages++;=0A= +=0A+=20=20=20=20=20=20=20=20=20=20/*=20If=20the=20number=20of=20cached=20= images=20has=20grown=20unusually=20large,=0A+=20=20=20=20=20=20=20=20=20=20= =20=20=20decrease=20the=20cache=20eviction=20delay=20(Bug#6230).=20=20*/=0A= +=20=20=20=20=20=20=20=20=20=20delay=20=3D=20XINT=20= (Vimage_cache_eviction_delay);=0A+=20=20=20=20=20=20=20=20=20=20if=20= (nimages=20>=2040)=0A+=20=20=20=20=20=20=20=20=20=20=20=20delay=20=3D=20= 1600=20*=20delay=20/=20nimages=20/=20nimages;=0A+=20=20=20=20=20=20=20=20= =20=20delay=20=3D=20max=20(delay,=201);=0A+=0A+=20=20=20=20=20=20=20=20=20= =20t=20=3D=20current_timespec=20();=0A+=20=20=20=20=20=20=20=20=20=20old=20= =3D=20timespec_sub=20(t,=20dtotimespec=20(delay));=0A+=0A+=20=20=20=20=20= =20=20=20=20=20for=20(i=20=3D=200;=20i=20<=20c->used;=20++i)=0A+=20=20=20= =20=20=20=20=20=20=20=20=20{=0A+=20=20=20=20=20=20=20=20=20=20=20=20=20=20= struct=20image=20*img=20=3D=20c->images[i];=0A+=20=20=20=20=20=20=20=20=20= =20=20=20=20=20if=20(img=20&&=20timespec_cmp=20(img->timestamp,=20old)=20= <=200)=0A+=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20{=0A+=20=20=20=20= =20=20=20=20=20=20=20=20=20=20=20=20=20=20free_image=20(f,=20img);=0A+=20= =20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20++nfreed;=0A+=20=20=20= =20=20=20=20=20=20=20=20=20=20=20=20=20}=0A+=20=20=20=20=20=20=20=20=20=20= =20=20}=0A+=20=20=20=20=20=20=20=20}=0A=20=0A=20=20=20=20=20=20=20/*=20= We=20may=20be=20clearing=20the=20image=20cache=20because,=20for=20= example,=0A-=09=20Emacs=20was=20iconified=20for=20a=20longer=20period=20= of=20time.=20=20In=20that=0A-=09=20case,=20current=20matrices=20may=20= still=20contain=20references=20to=0A-=09=20images=20freed=20above.=20=20= So,=20clear=20these=20matrices.=20=20*/=0A+=20=20=20=20=20=20=20=20=20= Emacs=20was=20iconified=20for=20a=20longer=20period=20of=20time.=20=20In=20= that=0A+=20=20=20=20=20=20=20=20=20case,=20current=20matrices=20may=20= still=20contain=20references=20to=0A+=20=20=20=20=20=20=20=20=20images=20= freed=20above.=20=20So,=20clear=20these=20matrices.=20=20*/=0A=20=20=20=20= =20=20=20if=20(nfreed)=0A-=09{=0A-=09=20=20Lisp_Object=20tail,=20frame;=0A= +=20=20=20=20=20=20=20=20{=0A+=20=20=20=20=20=20=20=20=20=20Lisp_Object=20= tail,=20frame;=0A=20=0A-=09=20=20FOR_EACH_FRAME=20(tail,=20frame)=0A-=09=20= =20=20=20{=0A-=09=20=20=20=20=20=20struct=20frame=20*fr=20=3D=20XFRAME=20= (frame);=0A-=09=20=20=20=20=20=20if=20(FRAME_IMAGE_CACHE=20(fr)=20=3D=3D=20= c)=0A-=09=09clear_current_matrices=20(fr);=0A-=09=20=20=20=20}=0A+=20=20=20= =20=20=20=20=20=20=20FOR_EACH_FRAME=20(tail,=20frame)=0A+=20=20=20=20=20=20= =20=20=20=20=20=20{=0A+=20=20=20=20=20=20=20=20=20=20=20=20=20=20struct=20= frame=20*fr=20=3D=20XFRAME=20(frame);=0A+=20=20=20=20=20=20=20=20=20=20=20= =20=20=20if=20(FRAME_IMAGE_CACHE=20(fr)=20=3D=3D=20c)=0A+=20=20=20=20=20=20= =20=20=20=20=20=20=20=20=20=20clear_current_matrices=20(fr);=0A+=20=20=20= =20=20=20=20=20=20=20=20=20}=0A=20=0A-=09=20=20= windows_or_buffers_changed=20=3D=2019;=0A-=09}=0A+=20=20=20=20=20=20=20=20= =20=20windows_or_buffers_changed=20=3D=2019;=0A+=20=20=20=20=20=20=20=20= }=0A=20=0A=20=20=20=20=20=20=20unblock_input=20();=0A=20=20=20=20=20}=0A= @@=20-1591,11=20+1591,11=20@@=20FRAME=20t=20means=20refresh=20the=20= image=20on=20all=20frames.=20=20*/)=0A=20=20=20=20=20{=0A=20=20=20=20=20=20= =20Lisp_Object=20tail;=0A=20=20=20=20=20=20=20FOR_EACH_FRAME=20(tail,=20= frame)=0A-=09{=0A-=09=20=20struct=20frame=20*f=20=3D=20XFRAME=20(frame);=0A= -=09=20=20if=20(FRAME_WINDOW_P=20(f))=0A-=09=20=20=20=20uncache_image=20= (f,=20spec);=0A-=09}=0A+=20=20=20=20=20=20=20=20{=0A+=20=20=20=20=20=20=20= =20=20=20struct=20frame=20*f=20=3D=20XFRAME=20(frame);=0A+=20=20=20=20=20= =20=20=20=20=20if=20(FRAME_WINDOW_P=20(f))=0A+=20=20=20=20=20=20=20=20=20= =20=20=20uncache_image=20(f,=20spec);=0A+=20=20=20=20=20=20=20=20}=0A=20=20= =20=20=20}=0A=20=20=20else=0A=20=20=20=20=20uncache_image=20= (decode_window_system_frame=20(frame),=20spec);=0A@@=20-1619,57=20= +1619,57=20@@=20postprocess_image=20(struct=20frame=20*f,=20struct=20= image=20*img)=0A=20=20=20=20=20=20=20spec=20=3D=20img->spec;=0A=20=0A=20=20= =20=20=20=20=20/*=20`:heuristic-mask=20t'=0A-=09=20`:mask=20heuristic'=0A= -=09=20means=20build=20a=20mask=20heuristically.=0A-=09=20= `:heuristic-mask=20(R=20G=20B)'=0A-=09=20`:mask=20(heuristic=20(R=20G=20= B))'=0A-=09=20means=20build=20a=20mask=20from=20color=20(R=20G=20B)=20in=20= the=0A-=09=20image.=0A-=09=20`:mask=20nil'=0A-=09=20means=20remove=20a=20= mask,=20if=20any.=20=20*/=0A+=20=20=20=20=20=20=20=20=20`:mask=20= heuristic'=0A+=20=20=20=20=20=20=20=20=20means=20build=20a=20mask=20= heuristically.=0A+=20=20=20=20=20=20=20=20=20`:heuristic-mask=20(R=20G=20= B)'=0A+=20=20=20=20=20=20=20=20=20`:mask=20(heuristic=20(R=20G=20B))'=0A= +=20=20=20=20=20=20=20=20=20means=20build=20a=20mask=20from=20color=20(R=20= G=20B)=20in=20the=0A+=20=20=20=20=20=20=20=20=20image.=0A+=20=20=20=20=20= =20=20=20=20`:mask=20nil'=0A+=20=20=20=20=20=20=20=20=20means=20remove=20= a=20mask,=20if=20any.=20=20*/=0A=20=0A=20=20=20=20=20=20=20mask=20=3D=20= image_spec_value=20(spec,=20QCheuristic_mask,=20NULL);=0A=20=20=20=20=20=20= =20if=20(!NILP=20(mask))=0A-=09x_build_heuristic_mask=20(f,=20img,=20= mask);=0A+=20=20=20=20=20=20=20=20x_build_heuristic_mask=20(f,=20img,=20= mask);=0A=20=20=20=20=20=20=20else=0A-=09{=0A-=09=20=20bool=20found_p;=0A= -=0A-=09=20=20mask=20=3D=20image_spec_value=20(spec,=20QCmask,=20= &found_p);=0A-=0A-=09=20=20if=20(EQ=20(mask,=20Qheuristic))=0A-=09=20=20=20= =20x_build_heuristic_mask=20(f,=20img,=20Qt);=0A-=09=20=20else=20if=20= (CONSP=20(mask)=0A-=09=09=20=20=20&&=20EQ=20(XCAR=20(mask),=20= Qheuristic))=0A-=09=20=20=20=20{=0A-=09=20=20=20=20=20=20if=20(CONSP=20= (XCDR=20(mask)))=0A-=09=09x_build_heuristic_mask=20(f,=20img,=20XCAR=20= (XCDR=20(mask)));=0A-=09=20=20=20=20=20=20else=0A-=09=09= x_build_heuristic_mask=20(f,=20img,=20XCDR=20(mask));=0A-=09=20=20=20=20= }=0A-=09=20=20else=20if=20(NILP=20(mask)=20&&=20found_p=20&&=20= img->mask)=0A-=09=20=20=20=20x_clear_image_1=20(f,=20img,=20= CLEAR_IMAGE_MASK);=0A-=09}=0A+=20=20=20=20=20=20=20=20{=0A+=20=20=20=20=20= =20=20=20=20=20bool=20found_p;=0A+=0A+=20=20=20=20=20=20=20=20=20=20mask=20= =3D=20image_spec_value=20(spec,=20QCmask,=20&found_p);=0A+=0A+=20=20=20=20= =20=20=20=20=20=20if=20(EQ=20(mask,=20Qheuristic))=0A+=20=20=20=20=20=20=20= =20=20=20=20=20x_build_heuristic_mask=20(f,=20img,=20Qt);=0A+=20=20=20=20= =20=20=20=20=20=20else=20if=20(CONSP=20(mask)=0A+=20=20=20=20=20=20=20=20= =20=20=20=20=20=20=20=20=20=20=20&&=20EQ=20(XCAR=20(mask),=20= Qheuristic))=0A+=20=20=20=20=20=20=20=20=20=20=20=20{=0A+=20=20=20=20=20=20= =20=20=20=20=20=20=20=20if=20(CONSP=20(XCDR=20(mask)))=0A+=20=20=20=20=20= =20=20=20=20=20=20=20=20=20=20=20x_build_heuristic_mask=20(f,=20img,=20= XCAR=20(XCDR=20(mask)));=0A+=20=20=20=20=20=20=20=20=20=20=20=20=20=20= else=0A+=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= x_build_heuristic_mask=20(f,=20img,=20XCDR=20(mask));=0A+=20=20=20=20=20=20= =20=20=20=20=20=20}=0A+=20=20=20=20=20=20=20=20=20=20else=20if=20(NILP=20= (mask)=20&&=20found_p=20&&=20img->mask)=0A+=20=20=20=20=20=20=20=20=20=20= =20=20x_clear_image_1=20(f,=20img,=20CLEAR_IMAGE_MASK);=0A+=20=20=20=20=20= =20=20=20}=0A=20=0A=20=0A=20=20=20=20=20=20=20/*=20Should=20we=20apply=20= an=20image=20transformation=20algorithm?=20=20*/=0A=20=20=20=20=20=20=20= conversion=20=3D=20image_spec_value=20(spec,=20QCconversion,=20NULL);=0A=20= =20=20=20=20=20=20if=20(EQ=20(conversion,=20Qdisabled))=0A-=09= x_disable_image=20(f,=20img);=0A+=20=20=20=20=20=20=20=20x_disable_image=20= (f,=20img);=0A=20=20=20=20=20=20=20else=20if=20(EQ=20(conversion,=20= Qlaplace))=0A-=09x_laplace=20(f,=20img);=0A+=20=20=20=20=20=20=20=20= x_laplace=20(f,=20img);=0A=20=20=20=20=20=20=20else=20if=20(EQ=20= (conversion,=20Qemboss))=0A-=09x_emboss=20(f,=20img);=0A+=20=20=20=20=20=20= =20=20x_emboss=20(f,=20img);=0A=20=20=20=20=20=20=20else=20if=20(CONSP=20= (conversion)=0A-=09=20=20=20=20=20=20=20&&=20EQ=20(XCAR=20(conversion),=20= Qedge_detection))=0A-=09{=0A-=09=20=20Lisp_Object=20tem;=0A-=09=20=20tem=20= =3D=20XCDR=20(conversion);=0A-=09=20=20if=20(CONSP=20(tem))=0A-=09=20=20=20= =20x_edge_detection=20(f,=20img,=0A-=09=09=09=20=20=20=20=20=20= Fplist_get=20(tem,=20QCmatrix),=0A-=09=09=09=20=20=20=20=20=20Fplist_get=20= (tem,=20QCcolor_adjustment));=0A-=09}=0A+=20=20=20=20=20=20=20=20=20=20=20= =20=20=20=20&&=20EQ=20(XCAR=20(conversion),=20Qedge_detection))=0A+=20=20= =20=20=20=20=20=20{=0A+=20=20=20=20=20=20=20=20=20=20Lisp_Object=20tem;=0A= +=20=20=20=20=20=20=20=20=20=20tem=20=3D=20XCDR=20(conversion);=0A+=20=20= =20=20=20=20=20=20=20=20if=20(CONSP=20(tem))=0A+=20=20=20=20=20=20=20=20=20= =20=20=20x_edge_detection=20(f,=20img,=0A+=20=20=20=20=20=20=20=20=20=20=20= =20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20Fplist_get=20= (tem,=20QCmatrix),=0A+=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= =20=20=20=20=20=20=20=20=20=20=20=20=20Fplist_get=20(tem,=20= QCcolor_adjustment));=0A+=20=20=20=20=20=20=20=20}=0A=20=20=20=20=20}=0A=20= }=0A=20=0A@@=20-1708,68=20+1708,68=20@@=20lookup_image=20(struct=20frame=20= *f,=20Lisp_Object=20spec)=0A=20=20=20=20=20=20=20img->frame_background=20= =3D=20FRAME_BACKGROUND_PIXEL=20(f);=0A=20=0A=20=20=20=20=20=20=20/*=20If=20= we=20can't=20load=20the=20image,=20and=20we=20don't=20have=20a=20width=20= and=0A-=09=20height,=20use=20some=20arbitrary=20width=20and=20height=20= so=20that=20we=20can=0A-=09=20draw=20a=20rectangle=20for=20it.=20=20*/=0A= +=20=20=20=20=20=20=20=20=20height,=20use=20some=20arbitrary=20width=20= and=20height=20so=20that=20we=20can=0A+=20=20=20=20=20=20=20=20=20draw=20= a=20rectangle=20for=20it.=20=20*/=0A=20=20=20=20=20=20=20if=20= (img->load_failed_p)=0A-=09{=0A-=09=20=20Lisp_Object=20value;=0A-=0A-=09=20= =20value=20=3D=20image_spec_value=20(spec,=20QCwidth,=20NULL);=0A-=09=20=20= img->width=20=3D=20(INTEGERP=20(value)=0A-=09=09=09?=20XFASTINT=20= (value)=20:=20DEFAULT_IMAGE_WIDTH);=0A-=09=20=20value=20=3D=20= image_spec_value=20(spec,=20QCheight,=20NULL);=0A-=09=20=20img->height=20= =3D=20(INTEGERP=20(value)=0A-=09=09=09=20?=20XFASTINT=20(value)=20:=20= DEFAULT_IMAGE_HEIGHT);=0A-=09}=0A+=20=20=20=20=20=20=20=20{=0A+=20=20=20=20= =20=20=20=20=20=20Lisp_Object=20value;=0A+=0A+=20=20=20=20=20=20=20=20=20= =20value=20=3D=20image_spec_value=20(spec,=20QCwidth,=20NULL);=0A+=20=20=20= =20=20=20=20=20=20=20img->width=20=3D=20(INTEGERP=20(value)=0A+=20=20=20=20= =20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20?=20XFASTINT=20= (value)=20:=20DEFAULT_IMAGE_WIDTH);=0A+=20=20=20=20=20=20=20=20=20=20= value=20=3D=20image_spec_value=20(spec,=20QCheight,=20NULL);=0A+=20=20=20= =20=20=20=20=20=20=20img->height=20=3D=20(INTEGERP=20(value)=0A+=20=20=20= =20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20?=20= XFASTINT=20(value)=20:=20DEFAULT_IMAGE_HEIGHT);=0A+=20=20=20=20=20=20=20=20= }=0A=20=20=20=20=20=20=20else=0A-=09{=0A-=09=20=20/*=20Handle=20image=20= type=20independent=20image=20attributes=0A-=09=20=20=20=20=20`:ascent=20= ASCENT',=20`:margin=20MARGIN',=20`:relief=20RELIEF',=0A-=09=20=20=20=20=20= `:background=20COLOR'.=20=20*/=0A-=09=20=20Lisp_Object=20ascent,=20= margin,=20relief,=20bg;=0A-=09=20=20int=20relief_bound;=0A-=0A-=09=20=20= ascent=20=3D=20image_spec_value=20(spec,=20QCascent,=20NULL);=0A-=09=20=20= if=20(INTEGERP=20(ascent))=0A-=09=20=20=20=20img->ascent=20=3D=20= XFASTINT=20(ascent);=0A-=09=20=20else=20if=20(EQ=20(ascent,=20Qcenter))=0A= -=09=20=20=20=20img->ascent=20=3D=20CENTERED_IMAGE_ASCENT;=0A-=0A-=09=20=20= margin=20=3D=20image_spec_value=20(spec,=20QCmargin,=20NULL);=0A-=09=20=20= if=20(INTEGERP=20(margin))=0A-=09=20=20=20=20img->vmargin=20=3D=20= img->hmargin=20=3D=20XFASTINT=20(margin);=0A-=09=20=20else=20if=20(CONSP=20= (margin))=0A-=09=20=20=20=20{=0A-=09=20=20=20=20=20=20img->hmargin=20=3D=20= XFASTINT=20(XCAR=20(margin));=0A-=09=20=20=20=20=20=20img->vmargin=20=3D=20= XFASTINT=20(XCDR=20(margin));=0A-=09=20=20=20=20}=0A-=0A-=09=20=20relief=20= =3D=20image_spec_value=20(spec,=20QCrelief,=20NULL);=0A-=09=20=20= relief_bound=20=3D=20INT_MAX=20-=20max=20(img->hmargin,=20img->vmargin);=0A= -=09=20=20if=20(RANGED_INTEGERP=20(-=20relief_bound,=20relief,=20= relief_bound))=0A-=09=20=20=20=20{=0A-=09=20=20=20=20=20=20img->relief=20= =3D=20XINT=20(relief);=0A-=09=20=20=20=20=20=20img->hmargin=20+=3D=20= eabs=20(img->relief);=0A-=09=20=20=20=20=20=20img->vmargin=20+=3D=20eabs=20= (img->relief);=0A-=09=20=20=20=20}=0A-=0A-=09=20=20if=20(!=20= img->background_valid)=0A-=09=20=20=20=20{=0A-=09=20=20=20=20=20=20bg=20= =3D=20image_spec_value=20(img->spec,=20QCbackground,=20NULL);=0A-=09=20=20= =20=20=20=20if=20(!NILP=20(bg))=0A-=09=09{=0A-=09=09=20=20= img->background=0A-=09=09=20=20=20=20=3D=20x_alloc_image_color=20(f,=20= img,=20bg,=0A-=09=09=09=09=09=20=20=20FRAME_BACKGROUND_PIXEL=20(f));=0A-=09= =09=20=20img->background_valid=20=3D=201;=0A-=09=09}=0A-=09=20=20=20=20}=0A= -=0A-=09=20=20/*=20Do=20image=20transformations=20and=20compute=20masks,=20= unless=20we=0A-=09=20=20=20=20=20don't=20have=20the=20image=20yet.=20=20= */=0A-=09=20=20if=20(!EQ=20(*img->type->type,=20Qpostscript))=0A-=09=20=20= =20=20postprocess_image=20(f,=20img);=0A-=09}=0A+=20=20=20=20=20=20=20=20= {=0A+=20=20=20=20=20=20=20=20=20=20/*=20Handle=20image=20type=20= independent=20image=20attributes=0A+=20=20=20=20=20=20=20=20=20=20=20=20=20= `:ascent=20ASCENT',=20`:margin=20MARGIN',=20`:relief=20RELIEF',=0A+=20=20= =20=20=20=20=20=20=20=20=20=20=20`:background=20COLOR'.=20=20*/=0A+=20=20= =20=20=20=20=20=20=20=20Lisp_Object=20ascent,=20margin,=20relief,=20bg;=0A= +=20=20=20=20=20=20=20=20=20=20int=20relief_bound;=0A+=0A+=20=20=20=20=20= =20=20=20=20=20ascent=20=3D=20image_spec_value=20(spec,=20QCascent,=20= NULL);=0A+=20=20=20=20=20=20=20=20=20=20if=20(INTEGERP=20(ascent))=0A+=20= =20=20=20=20=20=20=20=20=20=20=20img->ascent=20=3D=20XFASTINT=20= (ascent);=0A+=20=20=20=20=20=20=20=20=20=20else=20if=20(EQ=20(ascent,=20= Qcenter))=0A+=20=20=20=20=20=20=20=20=20=20=20=20img->ascent=20=3D=20= CENTERED_IMAGE_ASCENT;=0A+=0A+=20=20=20=20=20=20=20=20=20=20margin=20=3D=20= image_spec_value=20(spec,=20QCmargin,=20NULL);=0A+=20=20=20=20=20=20=20=20= =20=20if=20(INTEGERP=20(margin))=0A+=20=20=20=20=20=20=20=20=20=20=20=20= img->vmargin=20=3D=20img->hmargin=20=3D=20XFASTINT=20(margin);=0A+=20=20=20= =20=20=20=20=20=20=20else=20if=20(CONSP=20(margin))=0A+=20=20=20=20=20=20= =20=20=20=20=20=20{=0A+=20=20=20=20=20=20=20=20=20=20=20=20=20=20= img->hmargin=20=3D=20XFASTINT=20(XCAR=20(margin));=0A+=20=20=20=20=20=20=20= =20=20=20=20=20=20=20img->vmargin=20=3D=20XFASTINT=20(XCDR=20(margin));=0A= +=20=20=20=20=20=20=20=20=20=20=20=20}=0A+=0A+=20=20=20=20=20=20=20=20=20= =20relief=20=3D=20image_spec_value=20(spec,=20QCrelief,=20NULL);=0A+=20=20= =20=20=20=20=20=20=20=20relief_bound=20=3D=20INT_MAX=20-=20max=20= (img->hmargin,=20img->vmargin);=0A+=20=20=20=20=20=20=20=20=20=20if=20= (RANGED_INTEGERP=20(-=20relief_bound,=20relief,=20relief_bound))=0A+=20=20= =20=20=20=20=20=20=20=20=20=20{=0A+=20=20=20=20=20=20=20=20=20=20=20=20=20= =20img->relief=20=3D=20XINT=20(relief);=0A+=20=20=20=20=20=20=20=20=20=20= =20=20=20=20img->hmargin=20+=3D=20eabs=20(img->relief);=0A+=20=20=20=20=20= =20=20=20=20=20=20=20=20=20img->vmargin=20+=3D=20eabs=20(img->relief);=0A= +=20=20=20=20=20=20=20=20=20=20=20=20}=0A+=0A+=20=20=20=20=20=20=20=20=20= =20if=20(!=20img->background_valid)=0A+=20=20=20=20=20=20=20=20=20=20=20=20= {=0A+=20=20=20=20=20=20=20=20=20=20=20=20=20=20bg=20=3D=20= image_spec_value=20(img->spec,=20QCbackground,=20NULL);=0A+=20=20=20=20=20= =20=20=20=20=20=20=20=20=20if=20(!NILP=20(bg))=0A+=20=20=20=20=20=20=20=20= =20=20=20=20=20=20=20=20{=0A+=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= =20=20=20img->background=0A+=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= =20=20=20=20=20=3D=20x_alloc_image_color=20(f,=20img,=20bg,=0A+=20=20=20=20= =20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= =20=20=20=20=20=20=20=20=20=20=20=20=20=20FRAME_BACKGROUND_PIXEL=20(f));=0A= +=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= img->background_valid=20=3D=201;=0A+=20=20=20=20=20=20=20=20=20=20=20=20=20= =20=20=20}=0A+=20=20=20=20=20=20=20=20=20=20=20=20}=0A+=0A+=20=20=20=20=20= =20=20=20=20=20/*=20Do=20image=20transformations=20and=20compute=20= masks,=20unless=20we=0A+=20=20=20=20=20=20=20=20=20=20=20=20=20don't=20= have=20the=20image=20yet.=20=20*/=0A+=20=20=20=20=20=20=20=20=20=20if=20= (!EQ=20(*img->type->type,=20Qpostscript))=0A+=20=20=20=20=20=20=20=20=20=20= =20=20postprocess_image=20(f,=20img);=0A+=20=20=20=20=20=20=20=20}=0A=20=0A= =20=20=20=20=20=20=20unblock_input=20();=0A=20=20=20=20=20}=0A@@=20= -1838,15=20+1838,15=20@@=20mark_image_cache=20(struct=20image_cache=20= *c)=0A=20=20=20=20=20{=0A=20=20=20=20=20=20=20ptrdiff_t=20i;=0A=20=20=20=20= =20=20=20for=20(i=20=3D=200;=20i=20<=20c->used;=20++i)=0A-=09if=20= (c->images[i])=0A-=09=20=20mark_image=20(c->images[i]);=0A+=20=20=20=20=20= =20=20=20if=20(c->images[i])=0A+=20=20=20=20=20=20=20=20=20=20mark_image=20= (c->images[i]);=0A=20=20=20=20=20}=0A=20}=0A=20=0A=20=0A=20=0C=0A=20= /***********************************************************************=0A= -=09=09=09=20=20X=20/=20NS=20/=20W32=20support=20code=0A+=20=20=20=20=20=20= =20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20X=20/=20NS=20= /=20W32=20support=20code=0A=20=20= ***********************************************************************/=0A= =20=0A=20#ifdef=20WINDOWSNT=0A@@=20-1893,7=20+1893,7=20@@=20= x_check_image_size=20(XImagePtr=20ximg,=20int=20width,=20int=20height)=0A= =20=20=20=20=20=20=20bytes_per_line=20=3D=20(width=20>>=203)=20+=20= ((width=20&=207)=20!=3D=200);=0A=20=20=20=20=20}=0A=20=20=20return=20= (width=20<=3D=20(INT_MAX=20-=20(bitmap_pad=20-=201))=20/=20depth=0A-=09=20= =20&&=20height=20<=3D=20X_IMAGE_BYTES_MAX=20/=20bytes_per_line);=0A+=20=20= =20=20=20=20=20=20=20=20&&=20height=20<=3D=20X_IMAGE_BYTES_MAX=20/=20= bytes_per_line);=0A=20#else=0A=20=20=20/*=20FIXME:=20Implement=20this=20= check=20for=20the=20HAVE_NS=20and=20HAVE_NTGUI=20cases.=0A=20=20=20=20=20= =20For=20now,=20assume=20that=20every=20image=20size=20is=20allowed=20on=20= these=20systems.=20=20*/=0A@@=20-1912,7=20+1912,7=20@@=20= x_check_image_size=20(XImagePtr=20ximg,=20int=20width,=20int=20height)=0A= =20=0A=20static=20bool=0A=20x_create_x_image_and_pixmap=20(struct=20= frame=20*f,=20int=20width,=20int=20height,=20int=20depth,=0A-=09=09=09=20= =20=20=20=20XImagePtr=20*ximg,=20Pixmap=20*pixmap)=0A+=20=20=20=20=20=20=20= =20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= XImagePtr=20*ximg,=20Pixmap=20*pixmap)=0A=20{=0A=20#ifdef=20= HAVE_X_WINDOWS=0A=20=20=20Display=20*display=20=3D=20FRAME_X_DISPLAY=20= (f);=0A@@=20-1924,8=20+1924,8=20@@=20x_create_x_image_and_pixmap=20= (struct=20frame=20*f,=20int=20width,=20int=20height,=20int=20depth,=0A=20= =20=20if=20(depth=20<=3D=200)=0A=20=20=20=20=20depth=20=3D=20= DefaultDepthOfScreen=20(screen);=0A=20=20=20*ximg=20=3D=20XCreateImage=20= (display,=20DefaultVisualOfScreen=20(screen),=0A-=09=09=09depth,=20= ZPixmap,=200,=20NULL,=20width,=20height,=0A-=09=09=09depth=20>=2016=20?=20= 32=20:=20depth=20>=208=20?=2016=20:=208,=200);=0A+=20=20=20=20=20=20=20=20= =20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20depth,=20ZPixmap,=200,=20= NULL,=20width,=20height,=0A+=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= =20=20=20=20=20=20=20=20=20depth=20>=2016=20?=2032=20:=20depth=20>=208=20= ?=2016=20:=208,=200);=0A=20=20=20if=20(*ximg=20=3D=3D=20NULL)=0A=20=20=20= =20=20{=0A=20=20=20=20=20=20=20image_error=20("Unable=20to=20allocate=20= X=20image",=20Qnil,=20Qnil);=0A@@=20-1937,7=20+1937,7=20@@=20= x_create_x_image_and_pixmap=20(struct=20frame=20*f,=20int=20width,=20int=20= height,=20int=20depth,=0A=20=20=20=20=20=20=20x_destroy_x_image=20= (*ximg);=0A=20=20=20=20=20=20=20*ximg=20=3D=20NULL;=0A=20=20=20=20=20=20=20= image_error=20("Image=20too=20large=20(%dx%d)",=0A-=09=09=20=20=20= make_number=20(width),=20make_number=20(height));=0A+=20=20=20=20=20=20=20= =20=20=20=20=20=20=20=20=20=20=20=20make_number=20(width),=20make_number=20= (height));=0A=20=20=20=20=20=20=20return=200;=0A=20=20=20=20=20}=0A=20=0A= @@=20-2016,9=20+2016,9=20@@=20x_create_x_image_and_pixmap=20(struct=20= frame=20*f,=20int=20width,=20int=20height,=20int=20depth,=0A=20=20=20/*=20= Create=20a=20DIBSection=20and=20raster=20array=20for=20the=20bitmap,=0A=20= =20=20=20=20=20and=20store=20its=20handle=20in=20*pixmap.=20=20*/=0A=20=20= =20*pixmap=20=3D=20CreateDIBSection=20(hdc,=20&((*ximg)->info),=0A-=09=09= =09=20=20=20=20=20=20(depth=20<=2016)=20?=20DIB_PAL_COLORS=20:=20= DIB_RGB_COLORS,=0A-=09=09=09=20=20=20=20=20=20/*=20casting=20avoids=20a=20= GCC=20warning=20*/=0A-=09=09=09=20=20=20=20=20=20(void=20= **)&((*ximg)->data),=20NULL,=200);=0A+=20=20=20=20=20=20=20=20=20=20=20=20= =20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20(depth=20<=2016)=20= ?=20DIB_PAL_COLORS=20:=20DIB_RGB_COLORS,=0A+=20=20=20=20=20=20=20=20=20=20= =20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20/*=20casting=20= avoids=20a=20GCC=20warning=20*/=0A+=20=20=20=20=20=20=20=20=20=20=20=20=20= =20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20(void=20= **)&((*ximg)->data),=20NULL,=200);=0A=20=0A=20=20=20/*=20Realize=20= display=20palette=20and=20garbage=20all=20frames.=20*/=0A=20=20=20= release_frame_dc=20(f,=20hdc);=0A@@=20-2112,13=20+2112,13=20@@=20= x_put_x_image=20(struct=20frame=20*f,=20XImagePtr=20ximg,=20Pixmap=20= pixmap,=20int=20width,=20int=20he=0A=20=0A=20static=20bool=0A=20= image_create_x_image_and_pixmap=20(struct=20frame=20*f,=20struct=20image=20= *img,=0A-=09=09=09=09=20int=20width,=20int=20height,=20int=20depth,=0A-=09= =09=09=09=20XImagePtr=20*ximg,=20bool=20mask_p)=0A+=20=20=20=20=20=20=20=20= =20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= int=20width,=20int=20height,=20int=20depth,=0A+=20=20=20=20=20=20=20=20=20= =20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= XImagePtr=20*ximg,=20bool=20mask_p)=0A=20{=0A=20=20=20eassert=20= ((!mask_p=20?=20img->pixmap=20:=20img->mask)=20=3D=3D=20NO_PIXMAP);=0A=20= =0A=20=20=20return=20x_create_x_image_and_pixmap=20(f,=20width,=20= height,=20depth,=20ximg,=0A-=09=09=09=09=20=20=20=20=20=20!mask_p=20?=20= &img->pixmap=20:=20&img->mask);=0A+=20=20=20=20=20=20=20=20=20=20=20=20=20= =20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= !mask_p=20?=20&img->pixmap=20:=20&img->mask);=0A=20}=0A=20=0A=20/*=20Put=20= X=20image=20XIMG=20into=20image=20IMG=20on=20frame=20F,=20as=20a=20mask=20= if=20and=20only=0A@@=20-2129,7=20+2129,7=20@@=20= image_create_x_image_and_pixmap=20(struct=20frame=20*f,=20struct=20image=20= *img,=0A=20=0A=20static=20void=0A=20image_put_x_image=20(struct=20frame=20= *f,=20struct=20image=20*img,=20XImagePtr=20ximg,=0A-=09=09=20=20=20bool=20= mask_p)=0A+=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20bool=20= mask_p)=0A=20{=0A=20#ifdef=20HAVE_X_WINDOWS=0A=20=20=20if=20(!mask_p)=0A= @@=20-2144,7=20+2144,7=20@@=20image_put_x_image=20(struct=20frame=20*f,=20= struct=20image=20*img,=20XImagePtr=20ximg,=0A=20=20=20=20=20}=0A=20#else=0A= =20=20=20x_put_x_image=20(f,=20ximg,=20!mask_p=20?=20img->pixmap=20:=20= img->mask,=0A-=09=09=20img->width,=20img->height);=0A+=20=20=20=20=20=20=20= =20=20=20=20=20=20=20=20=20=20img->width,=20img->height);=0A=20=20=20= x_destroy_x_image=20(ximg);=0A=20#endif=0A=20}=0A@@=20-2178,7=20+2178,7=20= @@=20image_sync_to_pixmaps=20(struct=20frame=20*f,=20struct=20image=20= *img)=0A=20=0A=20static=20XImagePtr_or_DC=0A=20image_get_x_image_or_dc=20= (struct=20frame=20*f,=20struct=20image=20*img,=20bool=20mask_p,=0A-=09=09= =09=20HGDIOBJ=20*prev)=0A+=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= =20=20=20=20=20=20=20=20=20HGDIOBJ=20*prev)=0A=20{=0A=20=20=20HDC=20= frame_dc=20=3D=20get_frame_dc=20(f);=0A=20=20=20XImagePtr_or_DC=20ximg=20= =3D=20CreateCompatibleDC=20(frame_dc);=0A@@=20-2191,7=20+2191,7=20@@=20= image_get_x_image_or_dc=20(struct=20frame=20*f,=20struct=20image=20*img,=20= bool=20mask_p,=0A=20=0A=20static=20void=0A=20image_unget_x_image_or_dc=20= (struct=20image=20*img,=20bool=20mask_p,=0A-=09=09=09=20=20=20= XImagePtr_or_DC=20ximg,=20HGDIOBJ=20prev)=0A+=20=20=20=20=20=20=20=20=20=20= =20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20XImagePtr_or_DC=20= ximg,=20HGDIOBJ=20prev)=0A=20{=0A=20=20=20SelectObject=20(ximg,=20prev);=0A= =20=20=20DeleteDC=20(ximg);=0A@@=20-2210,7=20+2210,7=20@@=20= image_get_x_image=20(struct=20frame=20*f,=20struct=20image=20*img,=20= bool=20mask_p)=0A=20=20=20=20=20return=20ximg_in_img;=0A=20=20=20else=0A=20= =20=20=20=20return=20XGetImage=20(FRAME_X_DISPLAY=20(f),=20!mask_p=20?=20= img->pixmap=20:=20img->mask,=0A-=09=09=20=20=20=20=20=200,=200,=20= img->width,=20img->height,=20~0,=20ZPixmap);=0A+=20=20=20=20=20=20=20=20=20= =20=20=20=20=20=20=20=20=20=20=20=20=200,=200,=20img->width,=20= img->height,=20~0,=20ZPixmap);=0A=20#elif=20defined=20(HAVE_NS)=0A=20=20=20= XImagePtr=20pixmap=20=3D=20!mask_p=20?=20img->pixmap=20:=20img->mask;=0A=20= =0A@@=20-2237,7=20+2237,7=20@@=20image_unget_x_image=20(struct=20image=20= *img,=20bool=20mask_p,=20XImagePtr=20ximg)=0A=20=0A=20=0C=0A=20= /***********************************************************************=0A= -=09=09=09=20=20=20=20=20=20File=20Handling=0A+=20=20=20=20=20=20=20=20=20= =20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20File=20= Handling=0A=20=20= ***********************************************************************/=0A= =20=0A=20/*=20Find=20image=20file=20FILE.=20=20Look=20in=20= data-directory/images,=20then=0A@@=20-2253,8=20+2253,8=20@@=20= x_find_image_file=20(Lisp_Object=20file)=0A=20=20=20/*=20TODO=20I=20= think=20this=20should=20use=20something=20like=20image-load-path=0A=20=20= =20=20=20=20instead.=20=20Unfortunately,=20that=20can=20contain=20= non-string=20elements.=20=20*/=0A=20=20=20search_path=20=3D=20Fcons=20= (Fexpand_file_name=20(build_string=20("images"),=0A-=09=09=09=09=09=20=20= Vdata_directory),=0A-=09=09=20=20=20=20=20=20=20Vx_bitmap_file_path);=0A= +=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= =20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20Vdata_directory),=0A= +=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= Vx_bitmap_file_path);=0A=20=0A=20=20=20/*=20Try=20to=20find=20FILE=20in=20= data-directory/images,=20then=20x-bitmap-file-path.=20=20*/=0A=20=20=20= fd=20=3D=20openp=20(search_path,=20file,=20Qnil,=20&file_found,=20Qnil,=20= false);=0A@@=20-2265,7=20+2265,7=20@@=20x_find_image_file=20(Lisp_Object=20= file)=0A=20=20=20=20=20{=0A=20=20=20=20=20=20=20file_found=20=3D=20= ENCODE_FILE=20(file_found);=0A=20=20=20=20=20=20=20if=20(fd=20!=3D=20-2)=0A= -=09emacs_close=20(fd);=0A+=20=20=20=20=20=20=20=20emacs_close=20(fd);=0A= =20=20=20=20=20}=0A=20=0A=20=20=20return=20file_found;=0A@@=20-2289,20=20= +2289,20=20@@=20slurp_file=20(char=20*file,=20ptrdiff_t=20*size)=0A=20=20= =20=20=20=20=20record_unwind_protect_ptr=20(fclose_unwind,=20fp);=0A=20=0A= =20=20=20=20=20=20=20if=20(fstat=20(fileno=20(fp),=20&st)=20=3D=3D=200=0A= -=09=20=20&&=200=20<=3D=20st.st_size=20&&=20st.st_size=20<=20min=20= (PTRDIFF_MAX,=20SIZE_MAX))=0A-=09{=0A-=09=20=20/*=20Report=20an=20error=20= if=20we=20read=20past=20the=20purported=20EOF.=0A-=09=20=20=20=20=20This=20= can=20happen=20if=20the=20file=20grows=20as=20we=20read=20it.=20=20*/=0A= -=09=20=20ptrdiff_t=20buflen=20=3D=20st.st_size;=0A-=09=20=20buf=20=3D=20= xmalloc=20(buflen=20+=201);=0A-=09=20=20if=20(fread=20(buf,=201,=20= buflen=20+=201,=20fp)=20=3D=3D=20buflen)=0A-=09=20=20=20=20*size=20=3D=20= buflen;=0A-=09=20=20else=0A-=09=20=20=20=20{=0A-=09=20=20=20=20=20=20= xfree=20(buf);=0A-=09=20=20=20=20=20=20buf=20=3D=20NULL;=0A-=09=20=20=20=20= }=0A-=09}=0A+=20=20=20=20=20=20=20=20=20=20&&=200=20<=3D=20st.st_size=20= &&=20st.st_size=20<=20min=20(PTRDIFF_MAX,=20SIZE_MAX))=0A+=20=20=20=20=20= =20=20=20{=0A+=20=20=20=20=20=20=20=20=20=20/*=20Report=20an=20error=20= if=20we=20read=20past=20the=20purported=20EOF.=0A+=20=20=20=20=20=20=20=20= =20=20=20=20=20This=20can=20happen=20if=20the=20file=20grows=20as=20we=20= read=20it.=20=20*/=0A+=20=20=20=20=20=20=20=20=20=20ptrdiff_t=20buflen=20= =3D=20st.st_size;=0A+=20=20=20=20=20=20=20=20=20=20buf=20=3D=20xmalloc=20= (buflen=20+=201);=0A+=20=20=20=20=20=20=20=20=20=20if=20(fread=20(buf,=20= 1,=20buflen=20+=201,=20fp)=20=3D=3D=20buflen)=0A+=20=20=20=20=20=20=20=20= =20=20=20=20*size=20=3D=20buflen;=0A+=20=20=20=20=20=20=20=20=20=20else=0A= +=20=20=20=20=20=20=20=20=20=20=20=20{=0A+=20=20=20=20=20=20=20=20=20=20=20= =20=20=20xfree=20(buf);=0A+=20=20=20=20=20=20=20=20=20=20=20=20=20=20buf=20= =3D=20NULL;=0A+=20=20=20=20=20=20=20=20=20=20=20=20}=0A+=20=20=20=20=20=20= =20=20}=0A=20=0A=20=20=20=20=20=20=20unbind_to=20(count,=20Qnil);=0A=20=20= =20=20=20}=0A@@=20-2313,7=20+2313,7=20@@=20slurp_file=20(char=20*file,=20= ptrdiff_t=20*size)=0A=20=0A=20=0C=0A=20= /***********************************************************************=0A= -=09=09=09=20=20=20=20=20=20XBM=20images=0A+=20=20=20=20=20=20=20=20=20=20= =20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20XBM=20images=0A= =20=20= ***********************************************************************/=0A= =20=0A=20static=20bool=20xbm_load=20(struct=20frame=20*f,=20struct=20= image=20*img);=0A@@=20-2425,13=20+2425,13=20@@=20xbm_image_p=20= (Lisp_Object=20object)=0A=20=20=20if=20(kw[XBM_FILE].count)=0A=20=20=20=20= =20{=0A=20=20=20=20=20=20=20if=20(kw[XBM_WIDTH].count=20||=20= kw[XBM_HEIGHT].count=20||=20kw[XBM_DATA].count)=0A-=09return=200;=0A+=20=20= =20=20=20=20=20=20return=200;=0A=20=20=20=20=20}=0A=20=20=20else=20if=20= (kw[XBM_DATA].count=20&&=20xbm_file_p=20(kw[XBM_DATA].value))=0A=20=20=20= =20=20{=0A=20=20=20=20=20=20=20/*=20In-memory=20XBM=20file.=20=20*/=0A=20= =20=20=20=20=20=20if=20(kw[XBM_WIDTH].count=20||=20kw[XBM_HEIGHT].count=20= ||=20kw[XBM_FILE].count)=0A-=09return=200;=0A+=20=20=20=20=20=20=20=20= return=200;=0A=20=20=20=20=20}=0A=20=20=20else=0A=20=20=20=20=20{=0A@@=20= -2440,58=20+2440,58=20@@=20xbm_image_p=20(Lisp_Object=20object)=0A=20=0A=20= =20=20=20=20=20=20/*=20Entries=20for=20`:width',=20`:height'=20and=20= `:data'=20must=20be=20present.=20=20*/=0A=20=20=20=20=20=20=20if=20= (!kw[XBM_WIDTH].count=0A-=09=20=20||=20!kw[XBM_HEIGHT].count=0A-=09=20=20= ||=20!kw[XBM_DATA].count)=0A-=09return=200;=0A+=20=20=20=20=20=20=20=20=20= =20||=20!kw[XBM_HEIGHT].count=0A+=20=20=20=20=20=20=20=20=20=20||=20= !kw[XBM_DATA].count)=0A+=20=20=20=20=20=20=20=20return=200;=0A=20=0A=20=20= =20=20=20=20=20data=20=3D=20kw[XBM_DATA].value;=0A=20=20=20=20=20=20=20= width=20=3D=20XFASTINT=20(kw[XBM_WIDTH].value);=0A=20=20=20=20=20=20=20= height=20=3D=20XFASTINT=20(kw[XBM_HEIGHT].value);=0A=20=0A=20=20=20=20=20= =20=20/*=20Check=20type=20of=20data,=20and=20width=20and=20height=20= against=20contents=20of=0A-=09=20data.=20=20*/=0A+=20=20=20=20=20=20=20=20= =20data.=20=20*/=0A=20=20=20=20=20=20=20if=20(VECTORP=20(data))=0A-=09{=0A= -=09=20=20EMACS_INT=20i;=0A-=0A-=09=20=20/*=20Number=20of=20elements=20= of=20the=20vector=20must=20be=20>=3D=20height.=20=20*/=0A-=09=20=20if=20= (ASIZE=20(data)=20<=20height)=0A-=09=20=20=20=20return=200;=0A-=0A-=09=20= =20/*=20Each=20string=20or=20bool-vector=20in=20data=20must=20be=20large=20= enough=0A-=09=20=20=20=20=20for=20one=20line=20of=20the=20image.=20=20*/=0A= -=09=20=20for=20(i=20=3D=200;=20i=20<=20height;=20++i)=0A-=09=20=20=20=20= {=0A-=09=20=20=20=20=20=20Lisp_Object=20elt=20=3D=20AREF=20(data,=20i);=0A= -=0A-=09=20=20=20=20=20=20if=20(STRINGP=20(elt))=0A-=09=09{=0A-=09=09=20=20= if=20(SCHARS=20(elt)=0A-=09=09=20=20=20=20=20=20<=20(width=20+=20= BITS_PER_CHAR=20-=201)=20/=20BITS_PER_CHAR)=0A-=09=09=20=20=20=20return=20= 0;=0A-=09=09}=0A-=09=20=20=20=20=20=20else=20if=20(BOOL_VECTOR_P=20= (elt))=0A-=09=09{=0A-=09=09=20=20if=20(bool_vector_size=20(elt)=20<=20= width)=0A-=09=09=20=20=20=20return=200;=0A-=09=09}=0A-=09=20=20=20=20=20=20= else=0A-=09=09return=200;=0A-=09=20=20=20=20}=0A-=09}=0A+=20=20=20=20=20=20= =20=20{=0A+=20=20=20=20=20=20=20=20=20=20EMACS_INT=20i;=0A+=0A+=20=20=20=20= =20=20=20=20=20=20/*=20Number=20of=20elements=20of=20the=20vector=20must=20= be=20>=3D=20height.=20=20*/=0A+=20=20=20=20=20=20=20=20=20=20if=20(ASIZE=20= (data)=20<=20height)=0A+=20=20=20=20=20=20=20=20=20=20=20=20return=200;=0A= +=0A+=20=20=20=20=20=20=20=20=20=20/*=20Each=20string=20or=20bool-vector=20= in=20data=20must=20be=20large=20enough=0A+=20=20=20=20=20=20=20=20=20=20=20= =20=20for=20one=20line=20of=20the=20image.=20=20*/=0A+=20=20=20=20=20=20=20= =20=20=20for=20(i=20=3D=200;=20i=20<=20height;=20++i)=0A+=20=20=20=20=20=20= =20=20=20=20=20=20{=0A+=20=20=20=20=20=20=20=20=20=20=20=20=20=20= Lisp_Object=20elt=20=3D=20AREF=20(data,=20i);=0A+=0A+=20=20=20=20=20=20=20= =20=20=20=20=20=20=20if=20(STRINGP=20(elt))=0A+=20=20=20=20=20=20=20=20=20= =20=20=20=20=20=20=20{=0A+=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= =20=20if=20(SCHARS=20(elt)=0A+=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= =20=20=20=20=20=20=20<=20(width=20+=20BITS_PER_CHAR=20-=201)=20/=20= BITS_PER_CHAR)=0A+=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= =20return=200;=0A+=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20}=0A+=20= =20=20=20=20=20=20=20=20=20=20=20=20=20else=20if=20(BOOL_VECTOR_P=20= (elt))=0A+=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20{=0A+=20=20=20=20= =20=20=20=20=20=20=20=20=20=20=20=20=20=20if=20(bool_vector_size=20(elt)=20= <=20width)=0A+=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= return=200;=0A+=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20}=0A+=20=20= =20=20=20=20=20=20=20=20=20=20=20=20else=0A+=20=20=20=20=20=20=20=20=20=20= =20=20=20=20=20=20return=200;=0A+=20=20=20=20=20=20=20=20=20=20=20=20}=0A= +=20=20=20=20=20=20=20=20}=0A=20=20=20=20=20=20=20else=20if=20(STRINGP=20= (data))=0A-=09{=0A-=09=20=20if=20(SCHARS=20(data)=0A-=09=20=20=20=20=20=20= <=20(width=20+=20BITS_PER_CHAR=20-=201)=20/=20BITS_PER_CHAR=20*=20= height)=0A-=09=20=20=20=20return=200;=0A-=09}=0A+=20=20=20=20=20=20=20=20= {=0A+=20=20=20=20=20=20=20=20=20=20if=20(SCHARS=20(data)=0A+=20=20=20=20=20= =20=20=20=20=20=20=20=20=20<=20(width=20+=20BITS_PER_CHAR=20-=201)=20/=20= BITS_PER_CHAR=20*=20height)=0A+=20=20=20=20=20=20=20=20=20=20=20=20= return=200;=0A+=20=20=20=20=20=20=20=20}=0A=20=20=20=20=20=20=20else=20= if=20(BOOL_VECTOR_P=20(data))=0A-=09{=0A-=09=20=20if=20(bool_vector_size=20= (data)=20/=20height=20<=20width)=0A-=09=20=20=20=20return=200;=0A-=09}=0A= +=20=20=20=20=20=20=20=20{=0A+=20=20=20=20=20=20=20=20=20=20if=20= (bool_vector_size=20(data)=20/=20height=20<=20width)=0A+=20=20=20=20=20=20= =20=20=20=20=20=20return=200;=0A+=20=20=20=20=20=20=20=20}=0A=20=20=20=20= =20=20=20else=0A-=09return=200;=0A+=20=20=20=20=20=20=20=20return=200;=0A= =20=20=20=20=20}=0A=20=0A=20=20=20return=201;=0A@@=20-2522,42=20+2522,42=20= @@=20xbm_scan=20(unsigned=20char=20**s,=20unsigned=20char=20*end,=20char=20= *sval,=20int=20*ival)=0A=20=20=20=20=20=20=20int=20value=20=3D=200,=20= digit;=0A=20=0A=20=20=20=20=20=20=20if=20(c=20=3D=3D=20'0'=20&&=20*s=20<=20= end)=0A-=09{=0A-=09=20=20c=20=3D=20*(*s)++;=0A-=09=20=20if=20(c=20=3D=3D=20= 'x'=20||=20c=20=3D=3D=20'X')=0A-=09=20=20=20=20{=0A-=09=20=20=20=20=20=20= while=20(*s=20<=20end)=0A-=09=09{=0A-=09=09=20=20c=20=3D=20*(*s)++;=0A-=09= =09=20=20if=20(c_isdigit=20(c))=0A-=09=09=20=20=20=20digit=20=3D=20c=20-=20= '0';=0A-=09=09=20=20else=20if=20(c=20>=3D=20'a'=20&&=20c=20<=3D=20'f')=0A= -=09=09=20=20=20=20digit=20=3D=20c=20-=20'a'=20+=2010;=0A-=09=09=20=20= else=20if=20(c=20>=3D=20'A'=20&&=20c=20<=3D=20'F')=0A-=09=09=20=20=20=20= digit=20=3D=20c=20-=20'A'=20+=2010;=0A-=09=09=20=20else=0A-=09=09=20=20=20= =20break;=0A-=09=09=20=20value=20=3D=2016=20*=20value=20+=20digit;=0A-=09= =09}=0A-=09=20=20=20=20}=0A-=09=20=20else=20if=20(c_isdigit=20(c))=0A-=09= =20=20=20=20{=0A-=09=20=20=20=20=20=20value=20=3D=20c=20-=20'0';=0A-=09=20= =20=20=20=20=20while=20(*s=20<=20end=0A-=09=09=20=20=20=20=20&&=20(c=20=3D= =20*(*s)++,=20c_isdigit=20(c)))=0A-=09=09value=20=3D=208=20*=20value=20+=20= c=20-=20'0';=0A-=09=20=20=20=20}=0A-=09}=0A+=20=20=20=20=20=20=20=20{=0A= +=20=20=20=20=20=20=20=20=20=20c=20=3D=20*(*s)++;=0A+=20=20=20=20=20=20=20= =20=20=20if=20(c=20=3D=3D=20'x'=20||=20c=20=3D=3D=20'X')=0A+=20=20=20=20=20= =20=20=20=20=20=20=20{=0A+=20=20=20=20=20=20=20=20=20=20=20=20=20=20= while=20(*s=20<=20end)=0A+=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= {=0A+=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20c=20=3D=20= *(*s)++;=0A+=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20if=20= (c_isdigit=20(c))=0A+=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= =20=20digit=20=3D=20c=20-=20'0';=0A+=20=20=20=20=20=20=20=20=20=20=20=20=20= =20=20=20=20=20else=20if=20(c=20>=3D=20'a'=20&&=20c=20<=3D=20'f')=0A+=20=20= =20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20digit=20=3D=20c=20= -=20'a'=20+=2010;=0A+=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= else=20if=20(c=20>=3D=20'A'=20&&=20c=20<=3D=20'F')=0A+=20=20=20=20=20=20=20= =20=20=20=20=20=20=20=20=20=20=20=20=20digit=20=3D=20c=20-=20'A'=20+=20= 10;=0A+=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20else=0A+=20=20= =20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20break;=0A+=20=20=20= =20=20=20=20=20=20=20=20=20=20=20=20=20=20=20value=20=3D=2016=20*=20= value=20+=20digit;=0A+=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20}=0A= +=20=20=20=20=20=20=20=20=20=20=20=20}=0A+=20=20=20=20=20=20=20=20=20=20= else=20if=20(c_isdigit=20(c))=0A+=20=20=20=20=20=20=20=20=20=20=20=20{=0A= +=20=20=20=20=20=20=20=20=20=20=20=20=20=20value=20=3D=20c=20-=20'0';=0A= +=20=20=20=20=20=20=20=20=20=20=20=20=20=20while=20(*s=20<=20end=0A+=20=20= =20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20&&=20(c=20=3D=20= *(*s)++,=20c_isdigit=20(c)))=0A+=20=20=20=20=20=20=20=20=20=20=20=20=20=20= =20=20value=20=3D=208=20*=20value=20+=20c=20-=20'0';=0A+=20=20=20=20=20=20= =20=20=20=20=20=20}=0A+=20=20=20=20=20=20=20=20}=0A=20=20=20=20=20=20=20= else=0A-=09{=0A-=09=20=20value=20=3D=20c=20-=20'0';=0A-=09=20=20while=20= (*s=20<=20end=0A-=09=09=20&&=20(c=20=3D=20*(*s)++,=20c_isdigit=20(c)))=0A= -=09=20=20=20=20value=20=3D=2010=20*=20value=20+=20c=20-=20'0';=0A-=09}=0A= +=20=20=20=20=20=20=20=20{=0A+=20=20=20=20=20=20=20=20=20=20value=20=3D=20= c=20-=20'0';=0A+=20=20=20=20=20=20=20=20=20=20while=20(*s=20<=20end=0A+=20= =20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20&&=20(c=20=3D=20*(*s)++,=20= c_isdigit=20(c)))=0A+=20=20=20=20=20=20=20=20=20=20=20=20value=20=3D=20= 10=20*=20value=20+=20c=20-=20'0';=0A+=20=20=20=20=20=20=20=20}=0A=20=0A=20= =20=20=20=20=20=20if=20(*s=20<=20end)=0A-=09*s=20=3D=20*s=20-=201;=0A+=20= =20=20=20=20=20=20=20*s=20=3D=20*s=20-=201;=0A=20=20=20=20=20=20=20*ival=20= =3D=20value;=0A=20=20=20=20=20=20=20c=20=3D=20XBM_TK_NUMBER;=0A=20=20=20=20= =20}=0A@@=20-2565,11=20+2565,11=20@@=20xbm_scan=20(unsigned=20char=20= **s,=20unsigned=20char=20*end,=20char=20*sval,=20int=20*ival)=0A=20=20=20= =20=20{=0A=20=20=20=20=20=20=20*sval++=20=3D=20c;=0A=20=20=20=20=20=20=20= while=20(*s=20<=20end=0A-=09=20=20=20=20=20&&=20(c=20=3D=20*(*s)++,=20= (c_isalnum=20(c)=20||=20c=20=3D=3D=20'_')))=0A-=09*sval++=20=3D=20c;=0A+=20= =20=20=20=20=20=20=20=20=20=20=20=20&&=20(c=20=3D=20*(*s)++,=20= (c_isalnum=20(c)=20||=20c=20=3D=3D=20'_')))=0A+=20=20=20=20=20=20=20=20= *sval++=20=3D=20c;=0A=20=20=20=20=20=20=20*sval=20=3D=200;=0A=20=20=20=20= =20=20=20if=20(*s=20<=20end)=0A-=09*s=20=3D=20*s=20-=201;=0A+=20=20=20=20= =20=20=20=20*s=20=3D=20*s=20-=201;=0A=20=20=20=20=20=20=20c=20=3D=20= XBM_TK_IDENT;=0A=20=20=20=20=20}=0A=20=20=20else=20if=20(c=20=3D=3D=20= '/'=20&&=20**s=20=3D=3D=20'*')=0A@@=20-2577,12=20+2577,12=20@@=20= xbm_scan=20(unsigned=20char=20**s,=20unsigned=20char=20*end,=20char=20= *sval,=20int=20*ival)=0A=20=20=20=20=20=20=20/*=20C-style=20comment.=20=20= */=0A=20=20=20=20=20=20=20++*s;=0A=20=20=20=20=20=20=20while=20(**s=20&&=20= (**s=20!=3D=20'*'=20||=20*(*s=20+=201)=20!=3D=20'/'))=0A-=09++*s;=0A+=20=20= =20=20=20=20=20=20++*s;=0A=20=20=20=20=20=20=20if=20(**s)=0A-=09{=0A-=09=20= =20*s=20+=3D=202;=0A-=09=20=20goto=20loop;=0A-=09}=0A+=20=20=20=20=20=20=20= =20{=0A+=20=20=20=20=20=20=20=20=20=20*s=20+=3D=202;=0A+=20=20=20=20=20=20= =20=20=20=20goto=20loop;=0A+=20=20=20=20=20=20=20=20}=0A=20=20=20=20=20}=0A= =20=0A=20=20=20return=20c;=0A@@=20-2596,9=20+2596,9=20@@=20= w32_create_pixmap_from_bitmap_data=20(int=20width,=20int=20height,=20= char=20*data)=0A=20{=0A=20=20=20static=20unsigned=20char=20= swap_nibble[16]=0A=20=20=20=20=20=3D=20{=200x0,=200x8,=200x4,=200xc,=20=20= =20=20/*=200000=201000=200100=201100=20*/=0A-=090x2,=200xa,=200x6,=20= 0xe,=20=20=20=20/*=200010=201010=200110=201110=20*/=0A-=090x1,=200x9,=20= 0x5,=200xd,=20=20=20=20/*=200001=201001=200101=201101=20*/=0A-=090x3,=20= 0xb,=200x7,=200xf=20};=20=20/*=200011=201011=200111=201111=20*/=0A+=20=20= =20=20=20=20=20=200x2,=200xa,=200x6,=200xe,=20=20=20=20/*=200010=201010=20= 0110=201110=20*/=0A+=20=20=20=20=20=20=20=200x1,=200x9,=200x5,=200xd,=20=20= =20=20/*=200001=201001=200101=201101=20*/=0A+=20=20=20=20=20=20=20=20= 0x3,=200xb,=200x7,=200xf=20};=20=20/*=200011=201011=200111=201111=20*/=0A= =20=20=20int=20i,=20j,=20w1,=20w2;=0A=20=20=20unsigned=20char=20*bits,=20= *p;=0A=20=20=20HBITMAP=20bmp;=0A@@=20-2611,12=20+2611,12=20@@=20= w32_create_pixmap_from_bitmap_data=20(int=20width,=20int=20height,=20= char=20*data)=0A=20=20=20=20=20{=0A=20=20=20=20=20=20=20p=20=3D=20bits=20= +=20i*w2;=0A=20=20=20=20=20=20=20for=20(j=20=3D=200;=20j=20<=20w1;=20= j++)=0A-=09{=0A-=09=20=20/*=20Bitswap=20XBM=20bytes=20to=20match=20how=20= Windows=20does=20things.=20=20*/=0A-=09=20=20unsigned=20char=20c=20=3D=20= *data++;=0A-=09=20=20*p++=20=3D=20(unsigned=20char)((swap_nibble[c=20&=20= 0xf]=20<<=204)=0A-=09=09=09=09=20|=20(swap_nibble[(c>>4)=20&=200xf]));=0A= -=09}=0A+=20=20=20=20=20=20=20=20{=0A+=20=20=20=20=20=20=20=20=20=20/*=20= Bitswap=20XBM=20bytes=20to=20match=20how=20Windows=20does=20things.=20=20= */=0A+=20=20=20=20=20=20=20=20=20=20unsigned=20char=20c=20=3D=20*data++;=0A= +=20=20=20=20=20=20=20=20=20=20*p++=20=3D=20(unsigned=20= char)((swap_nibble[c=20&=200xf]=20<<=204)=0A+=20=20=20=20=20=20=20=20=20=20= =20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20|=20= (swap_nibble[(c>>4)=20&=200xf]));=0A+=20=20=20=20=20=20=20=20}=0A=20=20=20= =20=20}=0A=20=20=20bmp=20=3D=20CreateBitmap=20(width,=20height,=201,=20= 1,=20(char=20*)=20bits);=0A=20=0A@@=20-2625,7=20+2625,7=20@@=20= w32_create_pixmap_from_bitmap_data=20(int=20width,=20int=20height,=20= char=20*data)=0A=20=0A=20static=20void=0A=20convert_mono_to_color_image=20= (struct=20frame=20*f,=20struct=20image=20*img,=0A-=09=09=09=20=20=20=20=20= COLORREF=20foreground,=20COLORREF=20background)=0A+=20=20=20=20=20=20=20=20= =20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20COLORREF=20= foreground,=20COLORREF=20background)=0A=20{=0A=20=20=20HDC=20hdc,=20= old_img_dc,=20new_img_dc;=0A=20=20=20HGDIOBJ=20old_prev,=20new_prev;=0A= @@=20-2644,7=20+2644,7=20@@=20convert_mono_to_color_image=20(struct=20= frame=20*f,=20struct=20image=20*img,=0A=20=20=20SetBkColor=20= (new_img_dc,=20foreground);=0A=20=0A=20=20=20BitBlt=20(new_img_dc,=200,=20= 0,=20img->width,=20img->height,=20old_img_dc,=0A-=09=20=200,=200,=20= SRCCOPY);=0A+=20=20=20=20=20=20=20=20=20=200,=200,=20SRCCOPY);=0A=20=0A=20= =20=20SelectObject=20(old_img_dc,=20old_prev);=0A=20=20=20SelectObject=20= (new_img_dc,=20new_prev);=0A@@=20-2668,8=20+2668,8=20@@=20= convert_mono_to_color_image=20(struct=20frame=20*f,=20struct=20image=20= *img,=0A=20=0A=20static=20void=0A=20Create_Pixmap_From_Bitmap_Data=20= (struct=20frame=20*f,=20struct=20image=20*img,=20char=20*data,=0A-=09=09=09= =09RGB_PIXEL_COLOR=20fg,=20RGB_PIXEL_COLOR=20bg,=0A-=09=09=09=09bool=20= non_default_colors)=0A+=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= =20=20=20=20=20=20=20=20=20=20=20=20=20=20=20RGB_PIXEL_COLOR=20fg,=20= RGB_PIXEL_COLOR=20bg,=0A+=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= =20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20bool=20= non_default_colors)=0A=20{=0A=20#ifdef=20HAVE_NTGUI=0A=20=20=20= img->pixmap=0A@@=20-2686,11=20+2686,11=20@@=20= Create_Pixmap_From_Bitmap_Data=20(struct=20frame=20*f,=20struct=20image=20= *img,=20char=20*data,=0A=20=20=20img->pixmap=20=3D=0A=20=20=20=20= (x_check_image_size=20(0,=20img->width,=20img->height)=0A=20=20=20=20=20= ?=20XCreatePixmapFromBitmapData=20(FRAME_X_DISPLAY=20(f),=0A-=09=09=09=09= =20=20=20FRAME_X_WINDOW=20(f),=0A-=09=09=09=09=20=20=20data,=0A-=09=09=09= =09=20=20=20img->width,=20img->height,=0A-=09=09=09=09=20=20=20fg,=20bg,=0A= -=09=09=09=09=20=20=20DefaultDepthOfScreen=20(FRAME_X_SCREEN=20(f)))=0A+=20= =20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= =20=20=20=20=20=20=20=20=20FRAME_X_WINDOW=20(f),=0A+=20=20=20=20=20=20=20= =20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= =20=20=20data,=0A+=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= =20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20img->width,=20= img->height,=0A+=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= =20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20fg,=20bg,=0A+=20=20=20=20= =20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= =20=20=20=20=20=20DefaultDepthOfScreen=20(FRAME_X_SCREEN=20(f)))=0A=20=20= =20=20=20:=20NO_PIXMAP);=0A=20#endif=20/*=20!HAVE_NTGUI=20&&=20!HAVE_NS=20= */=0A=20}=0A@@=20-2708,8=20+2708,8=20@@=20Create_Pixmap_From_Bitmap_Data=20= (struct=20frame=20*f,=20struct=20image=20*img,=20char=20*data,=0A=20=0A=20= static=20bool=0A=20xbm_read_bitmap_data=20(struct=20frame=20*f,=20= unsigned=20char=20*contents,=20unsigned=20char=20*end,=0A-=09=09=20=20=20= =20=20=20int=20*width,=20int=20*height,=20char=20**data,=0A-=09=09=20=20=20= =20=20=20bool=20inhibit_image_error)=0A+=20=20=20=20=20=20=20=20=20=20=20= =20=20=20=20=20=20=20=20=20=20=20int=20*width,=20int=20*height,=20char=20= **data,=0A+=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= =20bool=20inhibit_image_error)=0A=20{=0A=20=20=20unsigned=20char=20*s=20= =3D=20contents;=0A=20=20=20char=20buffer[BUFSIZ];=0A@@=20-2726,8=20= +2726,8=20@@=20xbm_read_bitmap_data=20(struct=20frame=20*f,=20unsigned=20= char=20*contents,=20unsigned=20char=20*e=0A=20#define=20expect(TOKEN)=09=09= \=0A=20=20=20do=09=09=09=09\=0A=20=20=20=20=20{=09=09=09=09\=0A-=20=20=20= =20=20=20if=20(LA1=20!=3D=20(TOKEN))=20=09\=0A-=09goto=20failure;=09=09\=0A= +=20=20=20=20=20=20if=20(LA1=20!=3D=20(TOKEN))=20=20=20=20=20=20=20\=0A+=20= =20=20=20=20=20=20=20goto=20failure;=09=09\=0A=20=20=20=20=20=20=20match=20= ();=09=09=09\=0A=20=20=20=20=20}=09=09=09=09\=0A=20=20=20while=20(0)=0A= @@=20-2751,21=20+2751,21=20@@=20xbm_read_bitmap_data=20(struct=20frame=20= *f,=20unsigned=20char=20*contents,=20unsigned=20char=20*e=0A=20=20=20=20=20= =20=20expect=20(XBM_TK_IDENT);=0A=20=0A=20=20=20=20=20=20=20if=20(LA1=20= =3D=3D=20XBM_TK_NUMBER)=0A-=09{=0A-=09=20=20char=20*q=20=3D=20strrchr=20= (buffer,=20'_');=0A-=09=20=20q=20=3D=20q=20?=20q=20+=201=20:=20buffer;=0A= -=09=20=20if=20(strcmp=20(q,=20"width")=20=3D=3D=200)=0A-=09=20=20=20=20= *width=20=3D=20value;=0A-=09=20=20else=20if=20(strcmp=20(q,=20"height")=20= =3D=3D=200)=0A-=09=20=20=20=20*height=20=3D=20value;=0A-=09}=0A+=20=20=20= =20=20=20=20=20{=0A+=20=20=20=20=20=20=20=20=20=20char=20*q=20=3D=20= strrchr=20(buffer,=20'_');=0A+=20=20=20=20=20=20=20=20=20=20q=20=3D=20q=20= ?=20q=20+=201=20:=20buffer;=0A+=20=20=20=20=20=20=20=20=20=20if=20= (strcmp=20(q,=20"width")=20=3D=3D=200)=0A+=20=20=20=20=20=20=20=20=20=20=20= =20*width=20=3D=20value;=0A+=20=20=20=20=20=20=20=20=20=20else=20if=20= (strcmp=20(q,=20"height")=20=3D=3D=200)=0A+=20=20=20=20=20=20=20=20=20=20= =20=20*height=20=3D=20value;=0A+=20=20=20=20=20=20=20=20}=0A=20=20=20=20=20= =20=20expect=20(XBM_TK_NUMBER);=0A=20=20=20=20=20}=0A=20=0A=20=20=20if=20= (!check_image_size=20(f,=20*width,=20*height))=0A=20=20=20=20=20{=0A=20=20= =20=20=20=20=20if=20(!inhibit_image_error)=0A-=09image_error=20("Invalid=20= image=20size=20(see=20`max-image-size')",=20Qnil,=20Qnil);=0A+=20=20=20=20= =20=20=20=20image_error=20("Invalid=20image=20size=20(see=20= `max-image-size')",=20Qnil,=20Qnil);=0A=20=20=20=20=20=20=20goto=20= failure;=0A=20=20=20=20=20}=0A=20=20=20else=20if=20(data=20=3D=3D=20= NULL)=0A@@=20-2776,21=20+2776,21=20@@=20xbm_read_bitmap_data=20(struct=20= frame=20*f,=20unsigned=20char=20*contents,=20unsigned=20char=20*e=0A=20=20= =20if=20(LA1=20=3D=3D=20XBM_TK_IDENT)=0A=20=20=20=20=20{=0A=20=20=20=20=20= =20=20if=20(strcmp=20(buffer,=20"unsigned")=20=3D=3D=200)=0A-=09{=0A-=09=20= =20match=20();=0A-=09=20=20expect_ident=20("char");=0A-=09}=0A+=20=20=20=20= =20=20=20=20{=0A+=20=20=20=20=20=20=20=20=20=20match=20();=0A+=20=20=20=20= =20=20=20=20=20=20expect_ident=20("char");=0A+=20=20=20=20=20=20=20=20}=0A= =20=20=20=20=20=20=20else=20if=20(strcmp=20(buffer,=20"short")=20=3D=3D=20= 0)=0A-=09{=0A-=09=20=20match=20();=0A-=09=20=20v10=20=3D=201;=0A-=09=20=20= if=20(*width=20%=2016=20&&=20*width=20%=2016=20<=209)=0A-=09=20=20=20=20= padding_p=20=3D=201;=0A-=09}=0A+=20=20=20=20=20=20=20=20{=0A+=20=20=20=20= =20=20=20=20=20=20match=20();=0A+=20=20=20=20=20=20=20=20=20=20v10=20=3D=20= 1;=0A+=20=20=20=20=20=20=20=20=20=20if=20(*width=20%=2016=20&&=20*width=20= %=2016=20<=209)=0A+=20=20=20=20=20=20=20=20=20=20=20=20padding_p=20=3D=20= 1;=0A+=20=20=20=20=20=20=20=20}=0A=20=20=20=20=20=20=20else=20if=20= (strcmp=20(buffer,=20"char")=20=3D=3D=200)=0A-=09match=20();=0A+=20=20=20= =20=20=20=20=20match=20();=0A=20=20=20=20=20=20=20else=0A-=09goto=20= failure;=0A+=20=20=20=20=20=20=20=20goto=20failure;=0A=20=20=20=20=20}=0A= =20=20=20else=0A=20=20=20=20=20goto=20failure;=0A@@=20-2804,8=20+2804,8=20= @@=20xbm_read_bitmap_data=20(struct=20frame=20*f,=20unsigned=20char=20= *contents,=20unsigned=20char=20*e=0A=20=20=20if=20(!=20= x_check_image_size=20(0,=20*width,=20*height))=0A=20=20=20=20=20{=0A=20=20= =20=20=20=20=20if=20(!inhibit_image_error)=0A-=09image_error=20("Image=20= too=20large=20(%dx%d)",=0A-=09=09=20=20=20=20=20make_number=20(*width),=20= make_number=20(*height));=0A+=20=20=20=20=20=20=20=20image_error=20= ("Image=20too=20large=20(%dx%d)",=0A+=20=20=20=20=20=20=20=20=20=20=20=20= =20=20=20=20=20=20=20=20=20make_number=20(*width),=20make_number=20= (*height));=0A=20=20=20=20=20=20=20goto=20failure;=0A=20=20=20=20=20}=0A=20= =20=20bytes_per_line=20=3D=20(*width=20+=207)=20/=208=20+=20padding_p;=0A= @@=20-2815,34=20+2815,34=20@@=20xbm_read_bitmap_data=20(struct=20frame=20= *f,=20unsigned=20char=20*contents,=20unsigned=20char=20*e=0A=20=20=20if=20= (v10)=0A=20=20=20=20=20{=0A=20=20=20=20=20=20=20for=20(i=20=3D=200;=20i=20= <=20nbytes;=20i=20+=3D=202)=0A-=09{=0A-=09=20=20int=20val=20=3D=20value;=0A= -=09=20=20expect=20(XBM_TK_NUMBER);=0A+=20=20=20=20=20=20=20=20{=0A+=20=20= =20=20=20=20=20=20=20=20int=20val=20=3D=20value;=0A+=20=20=20=20=20=20=20= =20=20=20expect=20(XBM_TK_NUMBER);=0A=20=0A-=09=20=20*p++=20=3D=20= XBM_BIT_SHUFFLE=20(val);=0A-=09=20=20if=20(!padding_p=20||=20((i=20+=20= 2)=20%=20bytes_per_line))=0A-=09=20=20=20=20*p++=20=3D=20XBM_BIT_SHUFFLE=20= (value=20>>=208);=0A+=20=20=20=20=20=20=20=20=20=20*p++=20=3D=20= XBM_BIT_SHUFFLE=20(val);=0A+=20=20=20=20=20=20=20=20=20=20if=20= (!padding_p=20||=20((i=20+=202)=20%=20bytes_per_line))=0A+=20=20=20=20=20= =20=20=20=20=20=20=20*p++=20=3D=20XBM_BIT_SHUFFLE=20(value=20>>=208);=0A=20= =0A-=09=20=20if=20(LA1=20=3D=3D=20','=20||=20LA1=20=3D=3D=20'}')=0A-=09=20= =20=20=20match=20();=0A-=09=20=20else=0A-=09=20=20=20=20goto=20failure;=0A= -=09}=0A+=20=20=20=20=20=20=20=20=20=20if=20(LA1=20=3D=3D=20','=20||=20= LA1=20=3D=3D=20'}')=0A+=20=20=20=20=20=20=20=20=20=20=20=20match=20();=0A= +=20=20=20=20=20=20=20=20=20=20else=0A+=20=20=20=20=20=20=20=20=20=20=20=20= goto=20failure;=0A+=20=20=20=20=20=20=20=20}=0A=20=20=20=20=20}=0A=20=20=20= else=0A=20=20=20=20=20{=0A=20=20=20=20=20=20=20for=20(i=20=3D=200;=20i=20= <=20nbytes;=20++i)=0A-=09{=0A-=09=20=20int=20val=20=3D=20value;=0A-=09=20= =20expect=20(XBM_TK_NUMBER);=0A+=20=20=20=20=20=20=20=20{=0A+=20=20=20=20= =20=20=20=20=20=20int=20val=20=3D=20value;=0A+=20=20=20=20=20=20=20=20=20= =20expect=20(XBM_TK_NUMBER);=0A=20=0A-=09=20=20*p++=20=3D=20= XBM_BIT_SHUFFLE=20(val);=0A+=20=20=20=20=20=20=20=20=20=20*p++=20=3D=20= XBM_BIT_SHUFFLE=20(val);=0A=20=0A-=09=20=20if=20(LA1=20=3D=3D=20','=20||=20= LA1=20=3D=3D=20'}')=0A-=09=20=20=20=20match=20();=0A-=09=20=20else=0A-=09= =20=20=20=20goto=20failure;=0A-=09}=0A+=20=20=20=20=20=20=20=20=20=20if=20= (LA1=20=3D=3D=20','=20||=20LA1=20=3D=3D=20'}')=0A+=20=20=20=20=20=20=20=20= =20=20=20=20match=20();=0A+=20=20=20=20=20=20=20=20=20=20else=0A+=20=20=20= =20=20=20=20=20=20=20=20=20goto=20failure;=0A+=20=20=20=20=20=20=20=20}=0A= =20=20=20=20=20}=0A=20=0A=20=20success:=0A@@=20-2869,14=20+2869,14=20@@=20= xbm_read_bitmap_data=20(struct=20frame=20*f,=20unsigned=20char=20= *contents,=20unsigned=20char=20*e=0A=20=0A=20static=20bool=0A=20= xbm_load_image=20(struct=20frame=20*f,=20struct=20image=20*img,=20= unsigned=20char=20*contents,=0A-=09=09unsigned=20char=20*end)=0A+=20=20=20= =20=20=20=20=20=20=20=20=20=20=20=20=20unsigned=20char=20*end)=0A=20{=0A=20= =20=20bool=20rc;=0A=20=20=20char=20*data;=0A=20=20=20bool=20success_p=20= =3D=200;=0A=20=0A=20=20=20rc=20=3D=20xbm_read_bitmap_data=20(f,=20= contents,=20end,=20&img->width,=20&img->height,=0A-=09=09=09=20=20=20=20=20= &data,=200);=0A+=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= =20=20=20=20=20=20=20=20=20=20&data,=200);=0A=20=20=20if=20(rc)=0A=20=20=20= =20=20{=0A=20=20=20=20=20=20=20unsigned=20long=20foreground=20=3D=20= FRAME_FOREGROUND_PIXEL=20(f);=0A@@=20-2889,31=20+2889,31=20@@=20= xbm_load_image=20(struct=20frame=20*f,=20struct=20image=20*img,=20= unsigned=20char=20*contents,=0A=20=20=20=20=20=20=20/*=20Get=20= foreground=20and=20background=20colors,=20maybe=20allocate=20colors.=20=20= */=0A=20=20=20=20=20=20=20value=20=3D=20image_spec_value=20(img->spec,=20= QCforeground,=20NULL);=0A=20=20=20=20=20=20=20if=20(!NILP=20(value))=0A-=09= {=0A-=09=20=20foreground=20=3D=20x_alloc_image_color=20(f,=20img,=20= value,=20foreground);=0A-=09=20=20non_default_colors=20=3D=201;=0A-=09}=0A= +=20=20=20=20=20=20=20=20{=0A+=20=20=20=20=20=20=20=20=20=20foreground=20= =3D=20x_alloc_image_color=20(f,=20img,=20value,=20foreground);=0A+=20=20=20= =20=20=20=20=20=20=20non_default_colors=20=3D=201;=0A+=20=20=20=20=20=20=20= =20}=0A=20=20=20=20=20=20=20value=20=3D=20image_spec_value=20(img->spec,=20= QCbackground,=20NULL);=0A=20=20=20=20=20=20=20if=20(!NILP=20(value))=0A-=09= {=0A-=09=20=20background=20=3D=20x_alloc_image_color=20(f,=20img,=20= value,=20background);=0A-=09=20=20img->background=20=3D=20background;=0A= -=09=20=20img->background_valid=20=3D=201;=0A-=09=20=20= non_default_colors=20=3D=201;=0A-=09}=0A+=20=20=20=20=20=20=20=20{=0A+=20= =20=20=20=20=20=20=20=20=20background=20=3D=20x_alloc_image_color=20(f,=20= img,=20value,=20background);=0A+=20=20=20=20=20=20=20=20=20=20= img->background=20=3D=20background;=0A+=20=20=20=20=20=20=20=20=20=20= img->background_valid=20=3D=201;=0A+=20=20=20=20=20=20=20=20=20=20= non_default_colors=20=3D=201;=0A+=20=20=20=20=20=20=20=20}=0A=20=0A=20=20= =20=20=20=20=20Create_Pixmap_From_Bitmap_Data=20(f,=20img,=20data,=0A-=09= =09=09=09=20=20=20=20=20=20foreground,=20background,=0A-=09=09=09=09=20=20= =20=20=20=20non_default_colors);=0A+=20=20=20=20=20=20=20=20=20=20=20=20=20= =20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= foreground,=20background,=0A+=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= =20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= non_default_colors);=0A=20=20=20=20=20=20=20xfree=20(data);=0A=20=0A=20=20= =20=20=20=20=20if=20(img->pixmap=20=3D=3D=20NO_PIXMAP)=0A-=09{=0A-=09=20=20= x_clear_image=20(f,=20img);=0A-=09=20=20image_error=20("Unable=20to=20= create=20X=20pixmap=20for=20`%s'",=20img->spec,=20Qnil);=0A-=09}=0A+=20=20= =20=20=20=20=20=20{=0A+=20=20=20=20=20=20=20=20=20=20x_clear_image=20(f,=20= img);=0A+=20=20=20=20=20=20=20=20=20=20image_error=20("Unable=20to=20= create=20X=20pixmap=20for=20`%s'",=20img->spec,=20Qnil);=0A+=20=20=20=20=20= =20=20=20}=0A=20=20=20=20=20=20=20else=0A-=09success_p=20=3D=201;=0A+=20=20= =20=20=20=20=20=20success_p=20=3D=201;=0A=20=20=20=20=20}=0A=20=20=20= else=0A=20=20=20=20=20image_error=20("Error=20loading=20XBM=20image=20= `%s'",=20img->spec,=20Qnil);=0A@@=20-2929,9=20+2929,9=20@@=20xbm_file_p=20= (Lisp_Object=20data)=0A=20{=0A=20=20=20int=20w,=20h;=0A=20=20=20return=20= (STRINGP=20(data)=0A-=09=20=20&&=20xbm_read_bitmap_data=20(NULL,=20SDATA=20= (data),=0A-=09=09=09=09=20=20=20(SDATA=20(data)=20+=20SBYTES=20(data)),=0A= -=09=09=09=09=20=20=20&w,=20&h,=20NULL,=201));=0A+=20=20=20=20=20=20=20=20= =20=20&&=20xbm_read_bitmap_data=20(NULL,=20SDATA=20(data),=0A+=20=20=20=20= =20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= =20=20=20=20=20=20(SDATA=20(data)=20+=20SBYTES=20(data)),=0A+=20=20=20=20= =20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= =20=20=20=20=20=20&w,=20&h,=20NULL,=201));=0A=20}=0A=20=0A=20=0A@@=20= -2956,17=20+2956,17=20@@=20xbm_load=20(struct=20frame=20*f,=20struct=20= image=20*img)=0A=20=0A=20=20=20=20=20=20=20file=20=3D=20= x_find_image_file=20(file_name);=0A=20=20=20=20=20=20=20if=20(!STRINGP=20= (file))=0A-=09{=0A-=09=20=20image_error=20("Cannot=20find=20image=20file=20= `%s'",=20file_name,=20Qnil);=0A-=09=20=20return=200;=0A-=09}=0A+=20=20=20= =20=20=20=20=20{=0A+=20=20=20=20=20=20=20=20=20=20image_error=20("Cannot=20= find=20image=20file=20`%s'",=20file_name,=20Qnil);=0A+=20=20=20=20=20=20=20= =20=20=20return=200;=0A+=20=20=20=20=20=20=20=20}=0A=20=0A=20=20=20=20=20= =20=20contents=20=3D=20slurp_file=20(SSDATA=20(file),=20&size);=0A=20=20=20= =20=20=20=20if=20(contents=20=3D=3D=20NULL)=0A-=09{=0A-=09=20=20= image_error=20("Error=20loading=20XBM=20image=20`%s'",=20img->spec,=20= Qnil);=0A-=09=20=20return=200;=0A-=09}=0A+=20=20=20=20=20=20=20=20{=0A+=20= =20=20=20=20=20=20=20=20=20image_error=20("Error=20loading=20XBM=20image=20= `%s'",=20img->spec,=20Qnil);=0A+=20=20=20=20=20=20=20=20=20=20return=20= 0;=0A+=20=20=20=20=20=20=20=20}=0A=20=0A=20=20=20=20=20=20=20success_p=20= =3D=20xbm_load_image=20(f,=20img,=20contents,=20contents=20+=20size);=0A=20= =20=20=20=20=20=20xfree=20(contents);=0A@@=20-2993,61=20+2993,61=20@@=20= xbm_load=20(struct=20frame=20*f,=20struct=20image=20*img)=0A=20=0A=20=20=20= =20=20=20=20/*=20Get=20specified=20width,=20and=20height.=20=20*/=0A=20=20= =20=20=20=20=20if=20(!in_memory_file_p)=0A-=09{=0A-=09=20=20img->width=20= =3D=20XFASTINT=20(fmt[XBM_WIDTH].value);=0A-=09=20=20img->height=20=3D=20= XFASTINT=20(fmt[XBM_HEIGHT].value);=0A-=09=20=20eassert=20(img->width=20= >=200=20&&=20img->height=20>=200);=0A-=09=20=20if=20(!check_image_size=20= (f,=20img->width,=20img->height))=0A-=09=20=20=20=20{=0A-=09=20=20=20=20=20= =20image_error=20("Invalid=20image=20size=20(see=20`max-image-size')",=0A= -=09=09=09=20=20=20Qnil,=20Qnil);=0A-=09=20=20=20=20=20=20return=200;=0A= -=09=20=20=20=20}=0A-=09}=0A+=20=20=20=20=20=20=20=20{=0A+=20=20=20=20=20= =20=20=20=20=20img->width=20=3D=20XFASTINT=20(fmt[XBM_WIDTH].value);=0A+=20= =20=20=20=20=20=20=20=20=20img->height=20=3D=20XFASTINT=20= (fmt[XBM_HEIGHT].value);=0A+=20=20=20=20=20=20=20=20=20=20eassert=20= (img->width=20>=200=20&&=20img->height=20>=200);=0A+=20=20=20=20=20=20=20= =20=20=20if=20(!check_image_size=20(f,=20img->width,=20img->height))=0A+=20= =20=20=20=20=20=20=20=20=20=20=20{=0A+=20=20=20=20=20=20=20=20=20=20=20=20= =20=20image_error=20("Invalid=20image=20size=20(see=20= `max-image-size')",=0A+=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= =20=20=20=20=20=20=20=20=20=20Qnil,=20Qnil);=0A+=20=20=20=20=20=20=20=20=20= =20=20=20=20=20return=200;=0A+=20=20=20=20=20=20=20=20=20=20=20=20}=0A+=20= =20=20=20=20=20=20=20}=0A=20=0A=20=20=20=20=20=20=20/*=20Get=20= foreground=20and=20background=20colors,=20maybe=20allocate=20colors.=20=20= */=0A=20=20=20=20=20=20=20if=20(fmt[XBM_FOREGROUND].count=0A-=09=20=20&&=20= STRINGP=20(fmt[XBM_FOREGROUND].value))=0A-=09{=0A-=09=20=20foreground=20= =3D=20x_alloc_image_color=20(f,=20img,=20fmt[XBM_FOREGROUND].value,=0A-=09= =09=09=09=09=20=20=20=20foreground);=0A-=09=20=20non_default_colors=20=3D=20= 1;=0A-=09}=0A+=20=20=20=20=20=20=20=20=20=20&&=20STRINGP=20= (fmt[XBM_FOREGROUND].value))=0A+=20=20=20=20=20=20=20=20{=0A+=20=20=20=20= =20=20=20=20=20=20foreground=20=3D=20x_alloc_image_color=20(f,=20img,=20= fmt[XBM_FOREGROUND].value,=0A+=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= =20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= =20=20=20=20foreground);=0A+=20=20=20=20=20=20=20=20=20=20= non_default_colors=20=3D=201;=0A+=20=20=20=20=20=20=20=20}=0A=20=0A=20=20= =20=20=20=20=20if=20(fmt[XBM_BACKGROUND].count=0A-=09=20=20&&=20STRINGP=20= (fmt[XBM_BACKGROUND].value))=0A-=09{=0A-=09=20=20background=20=3D=20= x_alloc_image_color=20(f,=20img,=20fmt[XBM_BACKGROUND].value,=0A-=09=09=09= =09=09=20=20=20=20background);=0A-=09=20=20non_default_colors=20=3D=201;=0A= -=09}=0A+=20=20=20=20=20=20=20=20=20=20&&=20STRINGP=20= (fmt[XBM_BACKGROUND].value))=0A+=20=20=20=20=20=20=20=20{=0A+=20=20=20=20= =20=20=20=20=20=20background=20=3D=20x_alloc_image_color=20(f,=20img,=20= fmt[XBM_BACKGROUND].value,=0A+=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= =20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= =20=20=20=20background);=0A+=20=20=20=20=20=20=20=20=20=20= non_default_colors=20=3D=201;=0A+=20=20=20=20=20=20=20=20}=0A=20=0A=20=20= =20=20=20=20=20if=20(in_memory_file_p)=0A-=09success_p=20=3D=20= xbm_load_image=20(f,=20img,=20SDATA=20(data),=0A-=09=09=09=09=20=20=20=20= (SDATA=20(data)=0A-=09=09=09=09=20=20=20=20=20+=20SBYTES=20(data)));=0A+=20= =20=20=20=20=20=20=20success_p=20=3D=20xbm_load_image=20(f,=20img,=20= SDATA=20(data),=0A+=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= =20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20(SDATA=20(data)=0A= +=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= =20=20=20=20=20=20=20=20=20=20=20=20=20+=20SBYTES=20(data)));=0A=20=20=20= =20=20=20=20else=0A-=09{=0A-=09=20=20if=20(VECTORP=20(data))=0A-=09=20=20= =20=20{=0A-=09=20=20=20=20=20=20int=20i;=0A-=09=20=20=20=20=20=20char=20= *p;=0A-=09=20=20=20=20=20=20int=20nbytes=20=3D=20(img->width=20+=20= BITS_PER_CHAR=20-=201)=20/=20BITS_PER_CHAR;=0A-=0A-=09=20=20=20=20=20=20= p=20=3D=20bits=20=3D=20alloca=20(nbytes=20*=20img->height);=0A-=09=20=20=20= =20=20=20for=20(i=20=3D=200;=20i=20<=20img->height;=20++i,=20p=20+=3D=20= nbytes)=0A-=09=09{=0A-=09=09=20=20Lisp_Object=20line=20=3D=20AREF=20= (data,=20i);=0A-=09=09=20=20if=20(STRINGP=20(line))=0A-=09=09=20=20=20=20= memcpy=20(p,=20SDATA=20(line),=20nbytes);=0A-=09=09=20=20else=0A-=09=09=20= =20=20=20memcpy=20(p,=20bool_vector_data=20(line),=20nbytes);=0A-=09=09}=0A= -=09=20=20=20=20}=0A-=09=20=20else=20if=20(STRINGP=20(data))=0A-=09=20=20= =20=20bits=20=3D=20SSDATA=20(data);=0A-=09=20=20else=0A-=09=20=20=20=20= bits=20=3D=20(char=20*)=20bool_vector_data=20(data);=0A+=20=20=20=20=20=20= =20=20{=0A+=20=20=20=20=20=20=20=20=20=20if=20(VECTORP=20(data))=0A+=20=20= =20=20=20=20=20=20=20=20=20=20{=0A+=20=20=20=20=20=20=20=20=20=20=20=20=20= =20int=20i;=0A+=20=20=20=20=20=20=20=20=20=20=20=20=20=20char=20*p;=0A+=20= =20=20=20=20=20=20=20=20=20=20=20=20=20int=20nbytes=20=3D=20(img->width=20= +=20BITS_PER_CHAR=20-=201)=20/=20BITS_PER_CHAR;=0A+=0A+=20=20=20=20=20=20= =20=20=20=20=20=20=20=20p=20=3D=20bits=20=3D=20alloca=20(nbytes=20*=20= img->height);=0A+=20=20=20=20=20=20=20=20=20=20=20=20=20=20for=20(i=20=3D=20= 0;=20i=20<=20img->height;=20++i,=20p=20+=3D=20nbytes)=0A+=20=20=20=20=20=20= =20=20=20=20=20=20=20=20=20=20{=0A+=20=20=20=20=20=20=20=20=20=20=20=20=20= =20=20=20=20=20Lisp_Object=20line=20=3D=20AREF=20(data,=20i);=0A+=20=20=20= =20=20=20=20=20=20=20=20=20=20=20=20=20=20=20if=20(STRINGP=20(line))=0A+=20= =20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20memcpy=20(p,=20= SDATA=20(line),=20nbytes);=0A+=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= =20=20=20else=0A+=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= =20memcpy=20(p,=20bool_vector_data=20(line),=20nbytes);=0A+=20=20=20=20=20= =20=20=20=20=20=20=20=20=20=20=20}=0A+=20=20=20=20=20=20=20=20=20=20=20=20= }=0A+=20=20=20=20=20=20=20=20=20=20else=20if=20(STRINGP=20(data))=0A+=20=20= =20=20=20=20=20=20=20=20=20=20bits=20=3D=20SSDATA=20(data);=0A+=20=20=20=20= =20=20=20=20=20=20else=0A+=20=20=20=20=20=20=20=20=20=20=20=20bits=20=3D=20= (char=20*)=20bool_vector_data=20(data);=0A=20=0A=20#ifdef=20HAVE_NTGUI=0A= =20=20=20=20=20=20=20=20=20=20=20{=0A@@=20-3062,24=20+3062,24=20@@=20= xbm_load=20(struct=20frame=20*f,=20struct=20image=20*img)=0A=20=20=20=20=20= =20=20=20=20=20=20=20=20=20=20bits[i]=20=3D=20XBM_BIT_SHUFFLE=20= (invertedBits[i]);=0A=20=20=20=20=20=20=20=20=20=20=20}=0A=20#endif=0A-=09= =20=20/*=20Create=20the=20pixmap.=20=20*/=0A-=0A-=09=20=20if=20= (x_check_image_size=20(0,=20img->width,=20img->height))=0A-=09=20=20=20=20= Create_Pixmap_From_Bitmap_Data=20(f,=20img,=20bits,=0A-=09=09=09=09=09=20= =20=20=20foreground,=20background,=0A-=09=09=09=09=09=20=20=20=20= non_default_colors);=0A-=09=20=20else=0A-=09=20=20=20=20img->pixmap=20=3D=20= NO_PIXMAP;=0A-=0A-=09=20=20if=20(img->pixmap)=0A-=09=20=20=20=20= success_p=20=3D=201;=0A-=09=20=20else=0A-=09=20=20=20=20{=0A-=09=20=20=20= =20=20=20image_error=20("Unable=20to=20create=20pixmap=20for=20XBM=20= image=20`%s'",=0A-=09=09=09=20=20=20img->spec,=20Qnil);=0A-=09=20=20=20=20= =20=20x_clear_image=20(f,=20img);=0A-=09=20=20=20=20}=0A-=09}=0A+=20=20=20= =20=20=20=20=20=20=20/*=20Create=20the=20pixmap.=20=20*/=0A+=0A+=20=20=20= =20=20=20=20=20=20=20if=20(x_check_image_size=20(0,=20img->width,=20= img->height))=0A+=20=20=20=20=20=20=20=20=20=20=20=20= Create_Pixmap_From_Bitmap_Data=20(f,=20img,=20bits,=0A+=20=20=20=20=20=20= =20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= =20=20=20=20=20=20=20=20=20=20=20=20=20foreground,=20background,=0A+=20=20= =20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= =20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20non_default_colors);=0A= +=20=20=20=20=20=20=20=20=20=20else=0A+=20=20=20=20=20=20=20=20=20=20=20=20= img->pixmap=20=3D=20NO_PIXMAP;=0A+=0A+=20=20=20=20=20=20=20=20=20=20if=20= (img->pixmap)=0A+=20=20=20=20=20=20=20=20=20=20=20=20success_p=20=3D=20= 1;=0A+=20=20=20=20=20=20=20=20=20=20else=0A+=20=20=20=20=20=20=20=20=20=20= =20=20{=0A+=20=20=20=20=20=20=20=20=20=20=20=20=20=20image_error=20= ("Unable=20to=20create=20pixmap=20for=20XBM=20image=20`%s'",=0A+=20=20=20= =20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= img->spec,=20Qnil);=0A+=20=20=20=20=20=20=20=20=20=20=20=20=20=20= x_clear_image=20(f,=20img);=0A+=20=20=20=20=20=20=20=20=20=20=20=20}=0A+=20= =20=20=20=20=20=20=20}=0A=20=20=20=20=20}=0A=20=0A=20=20=20return=20= success_p;=0A@@=20-3088,7=20+3088,7=20@@=20xbm_load=20(struct=20frame=20= *f,=20struct=20image=20*img)=0A=20=0A=20=0C=0A=20= /***********************************************************************=0A= -=09=09=09=20=20=20=20=20=20XPM=20images=0A+=20=20=20=20=20=20=20=20=20=20= =20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20XPM=20images=0A= =20=20= ***********************************************************************/=0A= =20=0A=20#if=20defined=20(HAVE_XPM)=20||=20defined=20(HAVE_NS)=0A@@=20= -3233,13=20+3233,13=20@@=20xpm_init_color_cache=20(struct=20frame=20*f,=20= XpmAttributes=20*attrs)=0A=20=20=20=20=20=20=20XColor=20color;=0A=20=0A=20= =20=20=20=20=20=20for=20(i=20=3D=200;=20i=20<=20attrs->numsymbols;=20= ++i)=0A-=09if=20(XParseColor=20(FRAME_X_DISPLAY=20(f),=20= FRAME_X_COLORMAP=20(f),=0A-=09=09=09=20attrs->colorsymbols[i].value,=20= &color))=0A-=09=20=20{=0A-=09=20=20=20=20color.pixel=20=3D=20= lookup_rgb_color=20(f,=20color.red,=20color.green,=0A-=09=09=09=09=09=20=20= =20=20color.blue);=0A-=09=20=20=20=20xpm_cache_color=20(f,=20= attrs->colorsymbols[i].name,=20&color,=20-1);=0A-=09=20=20}=0A+=20=20=20=20= =20=20=20=20if=20(XParseColor=20(FRAME_X_DISPLAY=20(f),=20= FRAME_X_COLORMAP=20(f),=0A+=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= =20=20=20=20=20=20=20=20=20attrs->colorsymbols[i].value,=20&color))=0A+=20= =20=20=20=20=20=20=20=20=20{=0A+=20=20=20=20=20=20=20=20=20=20=20=20= color.pixel=20=3D=20lookup_rgb_color=20(f,=20color.red,=20color.green,=0A= +=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= =20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20color.blue);=0A= +=20=20=20=20=20=20=20=20=20=20=20=20xpm_cache_color=20(f,=20= attrs->colorsymbols[i].name,=20&color,=20-1);=0A+=20=20=20=20=20=20=20=20= =20=20}=0A=20=20=20=20=20}=0A=20}=0A=20=0A@@=20-3254,8=20+3254,8=20@@=20= xpm_free_color_cache=20(void)=0A=20=20=20for=20(i=20=3D=200;=20i=20<=20= XPM_COLOR_CACHE_BUCKETS;=20++i)=0A=20=20=20=20=20for=20(p=20=3D=20= xpm_color_cache[i];=20p;=20p=20=3D=20next)=0A=20=20=20=20=20=20=20{=0A-=09= next=20=3D=20p->next;=0A-=09xfree=20(p);=0A+=20=20=20=20=20=20=20=20next=20= =3D=20p->next;=0A+=20=20=20=20=20=20=20=20xfree=20(p);=0A=20=20=20=20=20=20= =20}=0A=20=0A=20=20=20xfree=20(xpm_color_cache);=0A@@=20-3314,10=20= +3314,10=20@@=20xpm_lookup_color=20(struct=20frame=20*f,=20char=20= *color_name,=20XColor=20*color)=0A=20=20=20if=20(p=20!=3D=20NULL)=0A=20=20= =20=20=20*color=20=3D=20p->color;=0A=20=20=20else=20if=20(XParseColor=20= (FRAME_X_DISPLAY=20(f),=20FRAME_X_COLORMAP=20(f),=0A-=09=09=09= color_name,=20color))=0A+=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= =20=20=20=20=20=20=20=20color_name,=20color))=0A=20=20=20=20=20{=0A=20=20= =20=20=20=20=20color->pixel=20=3D=20lookup_rgb_color=20(f,=20color->red,=20= color->green,=0A-=09=09=09=09=20=20=20=20=20=20=20color->blue);=0A+=20=20= =20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= =20=20=20=20=20=20=20=20=20=20=20=20color->blue);=0A=20=20=20=20=20=20=20= p=20=3D=20xpm_cache_color=20(f,=20color_name,=20color,=20h);=0A=20=20=20=20= =20}=0A=20=20=20/*=20You=20get=20`opaque'=20at=20least=20from=20= ImageMagick=20converting=20pbm=20to=20xpm=0A@@=20-3340,7=20+3340,7=20@@=20= xpm_lookup_color=20(struct=20frame=20*f,=20char=20*color_name,=20XColor=20= *color)=0A=20=0A=20static=20int=0A=20xpm_alloc_color=20(Display=20*dpy,=20= Colormap=20cmap,=20char=20*color_name,=20XColor=20*color,=0A-=09=09=20= void=20*closure)=0A+=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= void=20*closure)=0A=20{=0A=20=20=20return=20xpm_lookup_color=20(closure,=20= color_name,=20color);=0A=20}=0A@@=20-3365,9=20+3365,9=20@@=20= xpm_free_colors=20(Display=20*dpy,=20Colormap=20cmap,=20Pixel=20*pixels,=20= int=20npixels,=20void=20*=0A=20=0A=20DEF_IMGLIB_FN=20(void,=20= XpmFreeAttributes,=20(XpmAttributes=20*));=0A=20DEF_IMGLIB_FN=20(int,=20= XpmCreateImageFromBuffer,=20(Display=20*,=20char=20*,=20xpm_XImage=20**,=0A= -=09=09=09=09=09=20=20xpm_XImage=20**,=20XpmAttributes=20*));=0A+=20=20=20= =20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= =20=20=20=20=20=20=20=20=20=20=20=20=20=20xpm_XImage=20**,=20= XpmAttributes=20*));=0A=20DEF_IMGLIB_FN=20(int,=20XpmReadFileToImage,=20= (Display=20*,=20char=20*,=20xpm_XImage=20**,=0A-=09=09=09=09=20=20=20=20= xpm_XImage=20**,=20XpmAttributes=20*));=0A+=20=20=20=20=20=20=20=20=20=20= =20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= =20xpm_XImage=20**,=20XpmAttributes=20*));=0A=20DEF_IMGLIB_FN=20(void,=20= XImageFree,=20(xpm_XImage=20*));=0A=20=0A=20static=20bool=0A@@=20-3406,9=20= +3406,9=20@@=20xpm_valid_color_symbols_p=20(Lisp_Object=20color_symbols)=0A= =20=20=20=20=20{=0A=20=20=20=20=20=20=20Lisp_Object=20sym=20=3D=20XCAR=20= (color_symbols);=0A=20=20=20=20=20=20=20if=20(!CONSP=20(sym)=0A-=09=20=20= ||=20!STRINGP=20(XCAR=20(sym))=0A-=09=20=20||=20!STRINGP=20(XCDR=20= (sym)))=0A-=09break;=0A+=20=20=20=20=20=20=20=20=20=20||=20!STRINGP=20= (XCAR=20(sym))=0A+=20=20=20=20=20=20=20=20=20=20||=20!STRINGP=20(XCDR=20= (sym)))=0A+=20=20=20=20=20=20=20=20break;=0A=20=20=20=20=20=20=20= color_symbols=20=3D=20XCDR=20(color_symbols);=0A=20=20=20=20=20}=0A=20=0A= @@=20-3424,12=20+3424,12=20@@=20xpm_image_p=20(Lisp_Object=20object)=0A=20= =20=20struct=20image_keyword=20fmt[XPM_LAST];=0A=20=20=20memcpy=20(fmt,=20= xpm_format,=20sizeof=20fmt);=0A=20=20=20return=20(parse_image_spec=20= (object,=20fmt,=20XPM_LAST,=20Qxpm)=0A-=09=20=20/*=20Either=20`:file'=20= or=20`:data'=20must=20be=20present.=20=20*/=0A-=09=20=20&&=20= fmt[XPM_FILE].count=20+=20fmt[XPM_DATA].count=20=3D=3D=201=0A-=09=20=20= /*=20Either=20no=20`:color-symbols'=20or=20it's=20a=20list=20of=20conses=0A= -=09=20=20=20=20=20whose=20car=20and=20cdr=20are=20strings.=20=20*/=0A-=09= =20=20&&=20(fmt[XPM_COLOR_SYMBOLS].count=20=3D=3D=200=0A-=09=20=20=20=20=20= =20||=20xpm_valid_color_symbols_p=20(fmt[XPM_COLOR_SYMBOLS].value)));=0A= +=20=20=20=20=20=20=20=20=20=20/*=20Either=20`:file'=20or=20`:data'=20= must=20be=20present.=20=20*/=0A+=20=20=20=20=20=20=20=20=20=20&&=20= fmt[XPM_FILE].count=20+=20fmt[XPM_DATA].count=20=3D=3D=201=0A+=20=20=20=20= =20=20=20=20=20=20/*=20Either=20no=20`:color-symbols'=20or=20it's=20a=20= list=20of=20conses=0A+=20=20=20=20=20=20=20=20=20=20=20=20=20whose=20car=20= and=20cdr=20are=20strings.=20=20*/=0A+=20=20=20=20=20=20=20=20=20=20&&=20= (fmt[XPM_COLOR_SYMBOLS].count=20=3D=3D=200=0A+=20=20=20=20=20=20=20=20=20= =20=20=20=20=20||=20xpm_valid_color_symbols_p=20= (fmt[XPM_COLOR_SYMBOLS].value)));=0A=20}=0A=20=0A=20#endif=20/*=20= HAVE_XPM=20||=20HAVE_NS=20*/=0A@@=20-3452,7=20+3452,7=20@@=20= x_create_bitmap_from_xpm_data=20(struct=20frame=20*f,=20const=20char=20= **bits)=0A=20=20=20attrs.valuemask=20|=3D=20XpmColormap;=0A=20=0A=20=20=20= rc=20=3D=20XpmCreatePixmapFromData=20(FRAME_X_DISPLAY=20(f),=20= FRAME_X_WINDOW=20(f),=0A-=09=09=09=09(char=20**)=20bits,=20&bitmap,=20= &mask,=20&attrs);=0A+=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= =20=20=20=20=20=20=20=20=20=20=20=20=20=20(char=20**)=20bits,=20&bitmap,=20= &mask,=20&attrs);=0A=20=20=20if=20(rc=20!=3D=20XpmSuccess)=0A=20=20=20=20= =20{=0A=20=20=20=20=20=20=20XpmFreeAttributes=20(&attrs);=0A@@=20-3534,7=20= +3534,7=20@@=20xpm_load=20(struct=20frame=20*f,=20struct=20image=20*img)=0A= =20=20=20=20=20=20=20/*=20Count=20number=20of=20symbols.=20=20*/=0A=20=20= =20=20=20=20=20attrs.numsymbols=20=3D=200;=0A=20=20=20=20=20=20=20for=20= (tail=20=3D=20color_symbols;=20CONSP=20(tail);=20tail=20=3D=20XCDR=20= (tail))=0A-=09++attrs.numsymbols;=0A+=20=20=20=20=20=20=20=20= ++attrs.numsymbols;=0A=20=0A=20=20=20=20=20=20=20/*=20Allocate=20an=20= XpmColorSymbol=20array.=20=20*/=0A=20=20=20=20=20=20=20size=20=3D=20= attrs.numsymbols=20*=20sizeof=20*xpm_syms;=0A@@=20-3544,36=20+3544,36=20= @@=20xpm_load=20(struct=20frame=20*f,=20struct=20image=20*img)=0A=20=0A=20= =20=20=20=20=20=20/*=20Fill=20the=20color=20symbol=20array.=20=20*/=0A=20= =20=20=20=20=20=20for=20(tail=20=3D=20color_symbols,=20i=20=3D=200;=0A-=09= =20=20=20CONSP=20(tail);=0A-=09=20=20=20++i,=20tail=20=3D=20XCDR=20= (tail))=0A-=09{=0A-=09=20=20Lisp_Object=20name;=0A-=09=20=20Lisp_Object=20= color;=0A-=09=20=20char=20*empty_string=20=3D=20(char=20*)=20"";=0A-=0A-=09= =20=20if=20(!CONSP=20(XCAR=20(tail)))=0A-=09=20=20=20=20{=0A-=09=20=20=20= =20=20=20xpm_syms[i].name=20=3D=20empty_string;=0A-=09=20=20=20=20=20=20= xpm_syms[i].value=20=3D=20empty_string;=0A-=09=20=20=20=20=20=20= continue;=0A-=09=20=20=20=20}=0A-=09=20=20name=20=3D=20XCAR=20(XCAR=20= (tail));=0A-=09=20=20color=20=3D=20XCDR=20(XCAR=20(tail));=0A-=09=20=20= if=20(STRINGP=20(name))=0A-=09=20=20=20=20{=0A-=09=20=20=20=20=20=20= xpm_syms[i].name=20=3D=20alloca=20(SCHARS=20(name)=20+=201);=0A-=09=20=20= =20=20=20=20strcpy=20(xpm_syms[i].name,=20SSDATA=20(name));=0A-=09=20=20=20= =20}=0A-=09=20=20else=0A-=09=20=20=20=20xpm_syms[i].name=20=3D=20= empty_string;=0A-=09=20=20if=20(STRINGP=20(color))=0A-=09=20=20=20=20{=0A= -=09=20=20=20=20=20=20xpm_syms[i].value=20=3D=20alloca=20(SCHARS=20= (color)=20+=201);=0A-=09=20=20=20=20=20=20strcpy=20(xpm_syms[i].value,=20= SSDATA=20(color));=0A-=09=20=20=20=20}=0A-=09=20=20else=0A-=09=20=20=20=20= xpm_syms[i].value=20=3D=20empty_string;=0A-=09}=0A+=20=20=20=20=20=20=20=20= =20=20=20CONSP=20(tail);=0A+=20=20=20=20=20=20=20=20=20=20=20++i,=20tail=20= =3D=20XCDR=20(tail))=0A+=20=20=20=20=20=20=20=20{=0A+=20=20=20=20=20=20=20= =20=20=20Lisp_Object=20name;=0A+=20=20=20=20=20=20=20=20=20=20= Lisp_Object=20color;=0A+=20=20=20=20=20=20=20=20=20=20char=20= *empty_string=20=3D=20(char=20*)=20"";=0A+=0A+=20=20=20=20=20=20=20=20=20= =20if=20(!CONSP=20(XCAR=20(tail)))=0A+=20=20=20=20=20=20=20=20=20=20=20=20= {=0A+=20=20=20=20=20=20=20=20=20=20=20=20=20=20xpm_syms[i].name=20=3D=20= empty_string;=0A+=20=20=20=20=20=20=20=20=20=20=20=20=20=20= xpm_syms[i].value=20=3D=20empty_string;=0A+=20=20=20=20=20=20=20=20=20=20= =20=20=20=20continue;=0A+=20=20=20=20=20=20=20=20=20=20=20=20}=0A+=20=20=20= =20=20=20=20=20=20=20name=20=3D=20XCAR=20(XCAR=20(tail));=0A+=20=20=20=20= =20=20=20=20=20=20color=20=3D=20XCDR=20(XCAR=20(tail));=0A+=20=20=20=20=20= =20=20=20=20=20if=20(STRINGP=20(name))=0A+=20=20=20=20=20=20=20=20=20=20=20= =20{=0A+=20=20=20=20=20=20=20=20=20=20=20=20=20=20xpm_syms[i].name=20=3D=20= alloca=20(SCHARS=20(name)=20+=201);=0A+=20=20=20=20=20=20=20=20=20=20=20=20= =20=20strcpy=20(xpm_syms[i].name,=20SSDATA=20(name));=0A+=20=20=20=20=20=20= =20=20=20=20=20=20}=0A+=20=20=20=20=20=20=20=20=20=20else=0A+=20=20=20=20= =20=20=20=20=20=20=20=20xpm_syms[i].name=20=3D=20empty_string;=0A+=20=20=20= =20=20=20=20=20=20=20if=20(STRINGP=20(color))=0A+=20=20=20=20=20=20=20=20= =20=20=20=20{=0A+=20=20=20=20=20=20=20=20=20=20=20=20=20=20= xpm_syms[i].value=20=3D=20alloca=20(SCHARS=20(color)=20+=201);=0A+=20=20=20= =20=20=20=20=20=20=20=20=20=20=20strcpy=20(xpm_syms[i].value,=20SSDATA=20= (color));=0A+=20=20=20=20=20=20=20=20=20=20=20=20}=0A+=20=20=20=20=20=20=20= =20=20=20else=0A+=20=20=20=20=20=20=20=20=20=20=20=20xpm_syms[i].value=20= =3D=20empty_string;=0A+=20=20=20=20=20=20=20=20}=0A=20=20=20=20=20}=0A=20= =0A=20=20=20/*=20Create=20a=20pixmap=20for=20the=20image,=20either=20= from=20a=20file,=20or=20from=20a=0A@@=20-3596,53=20+3596,53=20@@=20= xpm_load=20(struct=20frame=20*f,=20struct=20image=20*img)=0A=20=20=20=20=20= {=0A=20=20=20=20=20=20=20Lisp_Object=20file=20=3D=20x_find_image_file=20= (specified_file);=0A=20=20=20=20=20=20=20if=20(!STRINGP=20(file))=0A-=09= {=0A-=09=20=20image_error=20("Cannot=20find=20image=20file=20`%s'",=20= specified_file,=20Qnil);=0A+=20=20=20=20=20=20=20=20{=0A+=20=20=20=20=20=20= =20=20=20=20image_error=20("Cannot=20find=20image=20file=20`%s'",=20= specified_file,=20Qnil);=0A=20#ifdef=20ALLOC_XPM_COLORS=0A-=09=20=20= xpm_free_color_cache=20();=0A+=20=20=20=20=20=20=20=20=20=20= xpm_free_color_cache=20();=0A=20#endif=0A-=09=20=20return=200;=0A-=09}=0A= +=20=20=20=20=20=20=20=20=20=20return=200;=0A+=20=20=20=20=20=20=20=20}=0A= =20=0A=20#ifdef=20HAVE_NTGUI=0A=20#ifdef=20WINDOWSNT=0A=20=20=20=20=20=20= =20/*=20FILE=20is=20encoded=20in=20UTF-8,=20but=20image=20libraries=20on=20= Windows=0A-=09=20support=20neither=20UTF-8=20nor=20UTF-16=20encoded=20= file=20names.=20=20So=20we=0A-=09=20need=20to=20re-encode=20it=20in=20= ANSI.=20=20*/=0A+=20=20=20=20=20=20=20=20=20support=20neither=20UTF-8=20= nor=20UTF-16=20encoded=20file=20names.=20=20So=20we=0A+=20=20=20=20=20=20= =20=20=20need=20to=20re-encode=20it=20in=20ANSI.=20=20*/=0A=20=20=20=20=20= =20=20file=20=3D=20ansi_encode_filename=20(file);=0A=20#endif=0A=20=20=20= =20=20=20=20/*=20XpmReadFileToPixmap=20is=20not=20available=20in=20the=20= Windows=20port=20of=0A-=09=20libxpm.=20=20But=20XpmReadFileToImage=20= almost=20does=20what=20we=20want.=20=20*/=0A+=20=20=20=20=20=20=20=20=20= libxpm.=20=20But=20XpmReadFileToImage=20almost=20does=20what=20we=20= want.=20=20*/=0A=20=20=20=20=20=20=20rc=20=3D=20fn_XpmReadFileToImage=20= (&hdc,=20SDATA=20(file),=0A-=09=09=09=09=20=20&xpm_image,=20&xpm_mask,=0A= -=09=09=09=09=20=20&attrs);=0A+=20=20=20=20=20=20=20=20=20=20=20=20=20=20= =20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20&xpm_image,=20= &xpm_mask,=0A+=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= =20=20=20=20=20=20=20=20=20=20=20=20=20=20&attrs);=0A=20#else=0A=20=20=20= =20=20=20=20rc=20=3D=20XpmReadFileToImage=20(FRAME_X_DISPLAY=20(f),=20= SSDATA=20(file),=0A-=09=09=09=20=20=20=20=20=20=20&img->ximg,=20= &img->mask_img,=0A-=09=09=09=20=20=20=20=20=20=20&attrs);=0A+=20=20=20=20= =20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= =20=20&img->ximg,=20&img->mask_img,=0A+=20=20=20=20=20=20=20=20=20=20=20=20= =20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20&attrs);=0A=20= #endif=20/*=20HAVE_NTGUI=20*/=0A=20=20=20=20=20}=0A=20=20=20else=0A=20=20= =20=20=20{=0A=20=20=20=20=20=20=20Lisp_Object=20buffer=20=3D=20= image_spec_value=20(img->spec,=20QCdata,=20NULL);=0A=20=20=20=20=20=20=20= if=20(!STRINGP=20(buffer))=0A-=09{=0A-=09=20=20image_error=20("Invalid=20= image=20data=20`%s'",=20buffer,=20Qnil);=0A+=20=20=20=20=20=20=20=20{=0A= +=20=20=20=20=20=20=20=20=20=20image_error=20("Invalid=20image=20data=20= `%s'",=20buffer,=20Qnil);=0A=20#ifdef=20ALLOC_XPM_COLORS=0A-=09=20=20= xpm_free_color_cache=20();=0A+=20=20=20=20=20=20=20=20=20=20= xpm_free_color_cache=20();=0A=20#endif=0A-=09=20=20return=200;=0A-=09}=0A= +=20=20=20=20=20=20=20=20=20=20return=200;=0A+=20=20=20=20=20=20=20=20}=0A= =20#ifdef=20HAVE_NTGUI=0A=20=20=20=20=20=20=20/*=20= XpmCreatePixmapFromBuffer=20is=20not=20available=20in=20the=20Windows=20= port=0A-=09=20of=20libxpm.=20=20But=20XpmCreateImageFromBuffer=20almost=20= does=20what=20we=20want.=20=20*/=0A+=20=20=20=20=20=20=20=20=20of=20= libxpm.=20=20But=20XpmCreateImageFromBuffer=20almost=20does=20what=20we=20= want.=20=20*/=0A=20=20=20=20=20=20=20rc=20=3D=20= fn_XpmCreateImageFromBuffer=20(&hdc,=20SDATA=20(buffer),=0A-=09=09=09=09=09= &xpm_image,=20&xpm_mask,=0A-=09=09=09=09=09&attrs);=0A+=20=20=20=20=20=20= =20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= =20=20=20=20=20=20=20=20=20&xpm_image,=20&xpm_mask,=0A+=20=20=20=20=20=20= =20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= =20=20=20=20=20=20=20=20=20&attrs);=0A=20#else=0A=20=20=20=20=20=20=20rc=20= =3D=20XpmCreateImageFromBuffer=20(FRAME_X_DISPLAY=20(f),=20SSDATA=20= (buffer),=0A-=09=09=09=09=20=20=20=20=20&img->ximg,=20&img->mask_img,=0A= -=09=09=09=09=20=20=20=20=20&attrs);=0A+=20=20=20=20=20=20=20=20=20=20=20= =20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= =20&img->ximg,=20&img->mask_img,=0A+=20=20=20=20=20=20=20=20=20=20=20=20=20= =20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= &attrs);=0A=20#endif=20/*=20HAVE_NTGUI=20*/=0A=20=20=20=20=20}=0A=20=0A= @@=20-3650,25=20+3650,25=20@@=20xpm_load=20(struct=20frame=20*f,=20= struct=20image=20*img)=0A=20=20=20if=20(rc=20=3D=3D=20XpmSuccess)=0A=20=20= =20=20=20{=0A=20=20=20=20=20=20=20img->pixmap=20=3D=20XCreatePixmap=20= (FRAME_X_DISPLAY=20(f),=20FRAME_X_WINDOW=20(f),=0A-=09=09=09=09=20=20=20= img->ximg->width,=20img->ximg->height,=0A-=09=09=09=09=20=20=20= img->ximg->depth);=0A+=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= =20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20img->ximg->width,=20= img->ximg->height,=0A+=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= =20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20img->ximg->depth);=0A= =20=20=20=20=20=20=20if=20(img->pixmap=20=3D=3D=20NO_PIXMAP)=0A-=09{=0A-=09= =20=20x_clear_image=20(f,=20img);=0A-=09=20=20rc=20=3D=20XpmNoMemory;=0A= -=09}=0A+=20=20=20=20=20=20=20=20{=0A+=20=20=20=20=20=20=20=20=20=20= x_clear_image=20(f,=20img);=0A+=20=20=20=20=20=20=20=20=20=20rc=20=3D=20= XpmNoMemory;=0A+=20=20=20=20=20=20=20=20}=0A=20=20=20=20=20=20=20else=20= if=20(img->mask_img)=0A-=09{=0A-=09=20=20img->mask=20=3D=20XCreatePixmap=20= (FRAME_X_DISPLAY=20(f),=20FRAME_X_WINDOW=20(f),=0A-=09=09=09=09=20=20=20=20= =20img->mask_img->width,=0A-=09=09=09=09=20=20=20=20=20= img->mask_img->height,=0A-=09=09=09=09=20=20=20=20=20= img->mask_img->depth);=0A-=09=20=20if=20(img->mask=20=3D=3D=20NO_PIXMAP)=0A= -=09=20=20=20=20{=0A-=09=20=20=20=20=20=20x_clear_image=20(f,=20img);=0A= -=09=20=20=20=20=20=20rc=20=3D=20XpmNoMemory;=0A-=09=20=20=20=20}=0A-=09= }=0A+=20=20=20=20=20=20=20=20{=0A+=20=20=20=20=20=20=20=20=20=20= img->mask=20=3D=20XCreatePixmap=20(FRAME_X_DISPLAY=20(f),=20= FRAME_X_WINDOW=20(f),=0A+=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= =20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= img->mask_img->width,=0A+=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= =20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= img->mask_img->height,=0A+=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= =20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= img->mask_img->depth);=0A+=20=20=20=20=20=20=20=20=20=20if=20(img->mask=20= =3D=3D=20NO_PIXMAP)=0A+=20=20=20=20=20=20=20=20=20=20=20=20{=0A+=20=20=20= =20=20=20=20=20=20=20=20=20=20=20x_clear_image=20(f,=20img);=0A+=20=20=20= =20=20=20=20=20=20=20=20=20=20=20rc=20=3D=20XpmNoMemory;=0A+=20=20=20=20=20= =20=20=20=20=20=20=20}=0A+=20=20=20=20=20=20=20=20}=0A=20=20=20=20=20}=0A= =20#endif=0A=20=0A@@=20-3681,29=20+3681,29=20@@=20xpm_load=20(struct=20= frame=20*f,=20struct=20image=20*img)=0A=20=0A=20#ifdef=20HAVE_NTGUI=0A=20= =20=20=20=20=20=20/*=20W32=20XPM=20uses=20XImage=20to=20wrap=20what=20= W32=20Emacs=20calls=20a=20Pixmap,=0A-=09=20plus=20some=20duplicate=20= attributes.=20=20*/=0A+=20=20=20=20=20=20=20=20=20plus=20some=20= duplicate=20attributes.=20=20*/=0A=20=20=20=20=20=20=20if=20(xpm_image=20= &&=20xpm_image->bitmap)=0A-=09{=0A-=09=20=20img->pixmap=20=3D=20= xpm_image->bitmap;=0A-=09=20=20/*=20XImageFree=20in=20libXpm=20frees=20= XImage=20struct=20without=20destroying=0A-=09=20=20=20=20=20the=20= bitmap,=20which=20is=20what=20we=20want.=20=20*/=0A-=09=20=20= fn_XImageFree=20(xpm_image);=0A-=09}=0A+=20=20=20=20=20=20=20=20{=0A+=20=20= =20=20=20=20=20=20=20=20img->pixmap=20=3D=20xpm_image->bitmap;=0A+=20=20=20= =20=20=20=20=20=20=20/*=20XImageFree=20in=20libXpm=20frees=20XImage=20= struct=20without=20destroying=0A+=20=20=20=20=20=20=20=20=20=20=20=20=20= the=20bitmap,=20which=20is=20what=20we=20want.=20=20*/=0A+=20=20=20=20=20= =20=20=20=20=20fn_XImageFree=20(xpm_image);=0A+=20=20=20=20=20=20=20=20}=0A= =20=20=20=20=20=20=20if=20(xpm_mask=20&&=20xpm_mask->bitmap)=0A-=09{=0A-=09= =20=20/*=20The=20mask=20appears=20to=20be=20inverted=20compared=20with=20= what=20we=20expect.=0A-=09=20=20=20=20=20TODO:=20invert=20our=20= expectations.=20=20See=20other=20places=20where=20we=0A-=09=20=20=20=20=20= have=20to=20invert=20bits=20because=20our=20idea=20of=20masks=20is=20= backwards.=20=20*/=0A-=09=20=20HGDIOBJ=20old_obj;=0A-=09=20=20old_obj=20= =3D=20SelectObject=20(hdc,=20xpm_mask->bitmap);=0A-=0A-=09=20=20PatBlt=20= (hdc,=200,=200,=20xpm_mask->width,=20xpm_mask->height,=20DSTINVERT);=0A-=09= =20=20SelectObject=20(hdc,=20old_obj);=0A-=0A-=09=20=20img->mask=20=3D=20= xpm_mask->bitmap;=0A-=09=20=20fn_XImageFree=20(xpm_mask);=0A-=09=20=20= DeleteDC=20(hdc);=0A-=09}=0A+=20=20=20=20=20=20=20=20{=0A+=20=20=20=20=20= =20=20=20=20=20/*=20The=20mask=20appears=20to=20be=20inverted=20compared=20= with=20what=20we=20expect.=0A+=20=20=20=20=20=20=20=20=20=20=20=20=20= TODO:=20invert=20our=20expectations.=20=20See=20other=20places=20where=20= we=0A+=20=20=20=20=20=20=20=20=20=20=20=20=20have=20to=20invert=20bits=20= because=20our=20idea=20of=20masks=20is=20backwards.=20=20*/=0A+=20=20=20=20= =20=20=20=20=20=20HGDIOBJ=20old_obj;=0A+=20=20=20=20=20=20=20=20=20=20= old_obj=20=3D=20SelectObject=20(hdc,=20xpm_mask->bitmap);=0A+=0A+=20=20=20= =20=20=20=20=20=20=20PatBlt=20(hdc,=200,=200,=20xpm_mask->width,=20= xpm_mask->height,=20DSTINVERT);=0A+=20=20=20=20=20=20=20=20=20=20= SelectObject=20(hdc,=20old_obj);=0A+=0A+=20=20=20=20=20=20=20=20=20=20= img->mask=20=3D=20xpm_mask->bitmap;=0A+=20=20=20=20=20=20=20=20=20=20= fn_XImageFree=20(xpm_mask);=0A+=20=20=20=20=20=20=20=20=20=20DeleteDC=20= (hdc);=0A+=20=20=20=20=20=20=20=20}=0A=20=0A=20=20=20=20=20=20=20= DeleteDC=20(hdc);=0A=20#endif=20/*=20HAVE_NTGUI=20*/=0A@@=20-3712,12=20= +3712,12=20@@=20xpm_load=20(struct=20frame=20*f,=20struct=20image=20= *img)=0A=20=20=20=20=20=20=20img->colors=20=3D=20xnmalloc=20= (attrs.nalloc_pixels,=20sizeof=20*img->colors);=0A=20=20=20=20=20=20=20= img->ncolors=20=3D=20attrs.nalloc_pixels;=0A=20=20=20=20=20=20=20for=20= (i=20=3D=200;=20i=20<=20attrs.nalloc_pixels;=20++i)=0A-=09{=0A-=09=20=20= img->colors[i]=20=3D=20attrs.alloc_pixels[i];=0A+=20=20=20=20=20=20=20=20= {=0A+=20=20=20=20=20=20=20=20=20=20img->colors[i]=20=3D=20= attrs.alloc_pixels[i];=0A=20#ifdef=20DEBUG_X_COLORS=0A-=09=20=20= register_color=20(img->colors[i]);=0A+=20=20=20=20=20=20=20=20=20=20= register_color=20(img->colors[i]);=0A=20#endif=0A-=09}=0A+=20=20=20=20=20= =20=20=20}=0A=20#endif=20/*=20not=20ALLOC_XPM_COLORS=20*/=0A=20=0A=20=20=20= =20=20=20=20img->width=20=3D=20attrs.width;=0A@@=20-3735,9=20+3735,9=20= @@=20xpm_load=20(struct=20frame=20*f,=20struct=20image=20*img)=0A=20=20=20= =20=20=20=20/*=20Maybe=20fill=20in=20the=20background=20field=20while=20= we=20have=20ximg=20handy.=20=20*/=0A=20=20=20=20=20=20=20= IMAGE_BACKGROUND=20(img,=20f,=20img->ximg);=0A=20=20=20=20=20=20=20if=20= (img->mask_img)=0A-=09/*=20Fill=20in=20the=20background_transparent=20= field=20while=20we=20have=20the=0A-=09=20=20=20mask=20handy.=20=20*/=0A-=09= image_background_transparent=20(img,=20f,=20img->mask_img);=0A+=20=20=20=20= =20=20=20=20/*=20Fill=20in=20the=20background_transparent=20field=20= while=20we=20have=20the=0A+=20=20=20=20=20=20=20=20=20=20=20mask=20= handy.=20=20*/=0A+=20=20=20=20=20=20=20=20image_background_transparent=20= (img,=20f,=20img->mask_img);=0A=20#endif=0A=20=20=20=20=20}=0A=20=20=20= else=0A@@=20-3747,27=20+3747,27=20@@=20xpm_load=20(struct=20frame=20*f,=20= struct=20image=20*img)=0A=20#endif=20/*=20HAVE_NTGUI=20*/=0A=20=0A=20=20=20= =20=20=20=20switch=20(rc)=0A-=09{=0A-=09case=20XpmOpenFailed:=0A-=09=20=20= image_error=20("Error=20opening=20XPM=20file=20(%s)",=20img->spec,=20= Qnil);=0A-=09=20=20break;=0A+=20=20=20=20=20=20=20=20{=0A+=20=20=20=20=20= =20=20=20case=20XpmOpenFailed:=0A+=20=20=20=20=20=20=20=20=20=20= image_error=20("Error=20opening=20XPM=20file=20(%s)",=20img->spec,=20= Qnil);=0A+=20=20=20=20=20=20=20=20=20=20break;=0A=20=0A-=09case=20= XpmFileInvalid:=0A-=09=20=20image_error=20("Invalid=20XPM=20file=20= (%s)",=20img->spec,=20Qnil);=0A-=09=20=20break;=0A+=20=20=20=20=20=20=20=20= case=20XpmFileInvalid:=0A+=20=20=20=20=20=20=20=20=20=20image_error=20= ("Invalid=20XPM=20file=20(%s)",=20img->spec,=20Qnil);=0A+=20=20=20=20=20=20= =20=20=20=20break;=0A=20=0A-=09case=20XpmNoMemory:=0A-=09=20=20= image_error=20("Out=20of=20memory=20(%s)",=20img->spec,=20Qnil);=0A-=09=20= =20break;=0A+=20=20=20=20=20=20=20=20case=20XpmNoMemory:=0A+=20=20=20=20=20= =20=20=20=20=20image_error=20("Out=20of=20memory=20(%s)",=20img->spec,=20= Qnil);=0A+=20=20=20=20=20=20=20=20=20=20break;=0A=20=0A-=09case=20= XpmColorFailed:=0A-=09=20=20image_error=20("Color=20allocation=20error=20= (%s)",=20img->spec,=20Qnil);=0A-=09=20=20break;=0A+=20=20=20=20=20=20=20=20= case=20XpmColorFailed:=0A+=20=20=20=20=20=20=20=20=20=20image_error=20= ("Color=20allocation=20error=20(%s)",=20img->spec,=20Qnil);=0A+=20=20=20=20= =20=20=20=20=20=20break;=0A=20=0A-=09default:=0A-=09=20=20image_error=20= ("Unknown=20error=20(%s)",=20img->spec,=20Qnil);=0A-=09=20=20break;=0A-=09= }=0A+=20=20=20=20=20=20=20=20default:=0A+=20=20=20=20=20=20=20=20=20=20= image_error=20("Unknown=20error=20(%s)",=20img->spec,=20Qnil);=0A+=20=20=20= =20=20=20=20=20=20=20break;=0A+=20=20=20=20=20=20=20=20}=0A=20=20=20=20=20= }=0A=20=0A=20#ifdef=20ALLOC_XPM_COLORS=0A@@=20-3820,50=20+3820,50=20@@=20= xpm_scan=20(const=20unsigned=20char=20**s,=0A=20=20=20=20=20{=0A=20=20=20= =20=20=20=20/*=20Skip=20white-space.=20=20*/=0A=20=20=20=20=20=20=20= while=20(*s=20<=20end=20&&=20(c=20=3D=20*(*s)++,=20c_isspace=20(c)))=0A-=09= ;=0A+=20=20=20=20=20=20=20=20;=0A=20=0A=20=20=20=20=20=20=20/*=20= gnus-pointer.xpm=20uses=20'-'=20in=20its=20identifier.=0A-=09=20= sb-dir-plus.xpm=20uses=20'+'=20in=20its=20identifier.=20=20*/=0A+=20=20=20= =20=20=20=20=20=20sb-dir-plus.xpm=20uses=20'+'=20in=20its=20identifier.=20= =20*/=0A=20=20=20=20=20=20=20if=20(c_isalpha=20(c)=20||=20c=20=3D=3D=20= '_'=20||=20c=20=3D=3D=20'-'=20||=20c=20=3D=3D=20'+')=0A-=09{=0A-=09=20=20= *beg=20=3D=20*s=20-=201;=0A-=09=20=20while=20(*s=20<=20end=0A-=09=09=20= &&=20(c=20=3D=20**s,=20c_isalnum=20(c)=0A-=09=09=20=20=20=20=20||=20c=20= =3D=3D=20'_'=20||=20c=20=3D=3D=20'-'=20||=20c=20=3D=3D=20'+'))=0A-=09=20=20= =20=20=20=20++*s;=0A-=09=20=20*len=20=3D=20*s=20-=20*beg;=0A-=09=20=20= return=20XPM_TK_IDENT;=0A-=09}=0A+=20=20=20=20=20=20=20=20{=0A+=20=20=20=20= =20=20=20=20=20=20*beg=20=3D=20*s=20-=201;=0A+=20=20=20=20=20=20=20=20=20= =20while=20(*s=20<=20end=0A+=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= =20=20&&=20(c=20=3D=20**s,=20c_isalnum=20(c)=0A+=20=20=20=20=20=20=20=20=20= =20=20=20=20=20=20=20=20=20=20=20=20||=20c=20=3D=3D=20'_'=20||=20c=20=3D=3D= =20'-'=20||=20c=20=3D=3D=20'+'))=0A+=20=20=20=20=20=20=20=20=20=20=20=20=20= =20++*s;=0A+=20=20=20=20=20=20=20=20=20=20*len=20=3D=20*s=20-=20*beg;=0A= +=20=20=20=20=20=20=20=20=20=20return=20XPM_TK_IDENT;=0A+=20=20=20=20=20=20= =20=20}=0A=20=20=20=20=20=20=20else=20if=20(c=20=3D=3D=20'"')=0A-=09{=0A= -=09=20=20*beg=20=3D=20*s;=0A-=09=20=20while=20(*s=20<=20end=20&&=20**s=20= !=3D=20'"')=0A-=09=20=20=20=20++*s;=0A-=09=20=20*len=20=3D=20*s=20-=20= *beg;=0A-=09=20=20if=20(*s=20<=20end)=0A-=09=20=20=20=20++*s;=0A-=09=20=20= return=20XPM_TK_STRING;=0A-=09}=0A+=20=20=20=20=20=20=20=20{=0A+=20=20=20= =20=20=20=20=20=20=20*beg=20=3D=20*s;=0A+=20=20=20=20=20=20=20=20=20=20= while=20(*s=20<=20end=20&&=20**s=20!=3D=20'"')=0A+=20=20=20=20=20=20=20=20= =20=20=20=20++*s;=0A+=20=20=20=20=20=20=20=20=20=20*len=20=3D=20*s=20-=20= *beg;=0A+=20=20=20=20=20=20=20=20=20=20if=20(*s=20<=20end)=0A+=20=20=20=20= =20=20=20=20=20=20=20=20++*s;=0A+=20=20=20=20=20=20=20=20=20=20return=20= XPM_TK_STRING;=0A+=20=20=20=20=20=20=20=20}=0A=20=20=20=20=20=20=20else=20= if=20(c=20=3D=3D=20'/')=0A-=09{=0A-=09=20=20if=20(*s=20<=20end=20&&=20= **s=20=3D=3D=20'*')=0A-=09=20=20=20=20{=0A-=09=20=20=20=20=20=20/*=20= C-style=20comment.=20=20*/=0A-=09=20=20=20=20=20=20++*s;=0A-=09=20=20=20=20= =20=20do=0A-=09=09{=0A-=09=09=20=20while=20(*s=20<=20end=20&&=20*(*s)++=20= !=3D=20'*')=0A-=09=09=20=20=20=20;=0A-=09=09}=0A-=09=20=20=20=20=20=20= while=20(*s=20<=20end=20&&=20**s=20!=3D=20'/');=0A-=09=20=20=20=20=20=20= if=20(*s=20<=20end)=0A-=09=09++*s;=0A-=09=20=20=20=20}=0A-=09=20=20else=0A= -=09=20=20=20=20return=20c;=0A-=09}=0A+=20=20=20=20=20=20=20=20{=0A+=20=20= =20=20=20=20=20=20=20=20if=20(*s=20<=20end=20&&=20**s=20=3D=3D=20'*')=0A= +=20=20=20=20=20=20=20=20=20=20=20=20{=0A+=20=20=20=20=20=20=20=20=20=20=20= =20=20=20/*=20C-style=20comment.=20=20*/=0A+=20=20=20=20=20=20=20=20=20=20= =20=20=20=20++*s;=0A+=20=20=20=20=20=20=20=20=20=20=20=20=20=20do=0A+=20=20= =20=20=20=20=20=20=20=20=20=20=20=20=20=20{=0A+=20=20=20=20=20=20=20=20=20= =20=20=20=20=20=20=20=20=20while=20(*s=20<=20end=20&&=20*(*s)++=20!=3D=20= '*')=0A+=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20;=0A= +=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20}=0A+=20=20=20=20=20=20=20= =20=20=20=20=20=20=20while=20(*s=20<=20end=20&&=20**s=20!=3D=20'/');=0A+=20= =20=20=20=20=20=20=20=20=20=20=20=20=20if=20(*s=20<=20end)=0A+=20=20=20=20= =20=20=20=20=20=20=20=20=20=20=20=20++*s;=0A+=20=20=20=20=20=20=20=20=20=20= =20=20}=0A+=20=20=20=20=20=20=20=20=20=20else=0A+=20=20=20=20=20=20=20=20= =20=20=20=20return=20c;=0A+=20=20=20=20=20=20=20=20}=0A=20=20=20=20=20=20= =20else=0A-=09return=20c;=0A+=20=20=20=20=20=20=20=20return=20c;=0A=20=20= =20=20=20}=0A=20=0A=20=20=20return=20XPM_TK_EOF;=0A@@=20-3919,9=20= +3919,9=20@@=20xpm_make_color_table_h=20(void=20(**put_func)=20= (Lisp_Object,=0A=20=20=20*put_func=20=3D=20xpm_put_color_table_h;=0A=20=20= =20*get_func=20=3D=20xpm_get_color_table_h;=0A=20=20=20return=20= make_hash_table=20(hashtest_equal,=20make_number=20(DEFAULT_HASH_SIZE),=0A= -=09=09=09=20=20make_float=20(DEFAULT_REHASH_SIZE),=0A-=09=09=09=20=20= make_float=20(DEFAULT_REHASH_THRESHOLD),=0A-=09=09=09=20=20Qnil);=0A+=20=20= =20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= make_float=20(DEFAULT_REHASH_SIZE),=0A+=20=20=20=20=20=20=20=20=20=20=20=20= =20=20=20=20=20=20=20=20=20=20=20=20=20=20make_float=20= (DEFAULT_REHASH_THRESHOLD),=0A+=20=20=20=20=20=20=20=20=20=20=20=20=20=20= =20=20=20=20=20=20=20=20=20=20=20=20Qnil);=0A=20}=0A=20=0A=20static=20= void=0A@@=20-3996,8=20+3996,8=20@@=20xpm_load_image=20(struct=20frame=20= *f,=0A=20#define=20expect(TOKEN)=09=09\=0A=20=20=20do=09=09=09=09\=0A=20=20= =20=20=20{=09=09=09=09\=0A-=20=20=20=20=20=20if=20(LA1=20!=3D=20(TOKEN))=20= =09\=0A-=09goto=20failure;=09=09\=0A+=20=20=20=20=20=20if=20(LA1=20!=3D=20= (TOKEN))=20=20=20=20=20=20=20\=0A+=20=20=20=20=20=20=20=20goto=20= failure;=09=09\=0A=20=20=20=20=20=20=20match=20();=09=09=09\=0A=20=20=20=20= =20}=09=09=09=09\=0A=20=20=20while=20(0)=0A@@=20-4027,7=20+4027,7=20@@=20= xpm_load_image=20(struct=20frame=20*f,=0A=20=20=20memcpy=20(buffer,=20= beg,=20len);=0A=20=20=20buffer[len]=20=3D=20'\0';=0A=20=20=20if=20= (sscanf=20(buffer,=20"%d=20%d=20%d=20%d",=20&width,=20&height,=0A-=09=20=20= =20=20=20=20&num_colors,=20&chars_per_pixel)=20!=3D=204=0A+=20=20=20=20=20= =20=20=20=20=20=20=20=20=20&num_colors,=20&chars_per_pixel)=20!=3D=204=0A= =20=20=20=20=20=20=20||=20width=20<=3D=200=20||=20height=20<=3D=200=0A=20= =20=20=20=20=20=20||=20num_colors=20<=3D=200=20||=20chars_per_pixel=20<=3D= =200)=0A=20=20=20=20=20goto=20failure;=0A@@=20-4041,7=20+4041,7=20@@=20= xpm_load_image=20(struct=20frame=20*f,=0A=20=20=20if=20= (!image_create_x_image_and_pixmap=20(f,=20img,=20width,=20height,=200,=20= &ximg,=200)=0A=20#ifndef=20HAVE_NS=0A=20=20=20=20=20=20=20||=20= !image_create_x_image_and_pixmap=20(f,=20img,=20width,=20height,=201,=0A= -=09=09=09=09=09=20=20=20&mask_img,=201)=0A+=20=20=20=20=20=20=20=20=20=20= =20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= =20=20=20=20=20=20=20=20&mask_img,=201)=0A=20#endif=0A=20=20=20=20=20=20=20= )=0A=20=20=20=20=20{=0A@@=20-4056,17=20+4056,17=20@@=20xpm_load_image=20= (struct=20frame=20*f,=0A=20=20=20=20=20best_key=20=3D=20XPM_COLOR_KEY_C;=0A= =20=20=20else=20if=20(!NILP=20(Fx_display_grayscale_p=20(frame)))=0A=20=20= =20=20=20best_key=20=3D=20(XFASTINT=20(Fx_display_planes=20(frame))=20>=20= 2=0A-=09=09?=20XPM_COLOR_KEY_G=20:=20XPM_COLOR_KEY_G4);=0A+=20=20=20=20=20= =20=20=20=20=20=20=20=20=20=20=20?=20XPM_COLOR_KEY_G=20:=20= XPM_COLOR_KEY_G4);=0A=20=20=20else=0A=20=20=20=20=20best_key=20=3D=20= XPM_COLOR_KEY_M;=0A=20=0A=20=20=20color_symbols=20=3D=20image_spec_value=20= (img->spec,=20QCcolor_symbols,=20NULL);=0A=20=20=20if=20(chars_per_pixel=20= =3D=3D=201)=0A=20=20=20=20=20color_table=20=3D=20xpm_make_color_table_v=20= (&put_color_table,=0A-=09=09=09=09=09=20=20&get_color_table);=0A+=20=20=20= =20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= =20=20=20=20=20=20=20=20=20=20=20=20=20=20&get_color_table);=0A=20=20=20= else=0A=20=20=20=20=20color_table=20=3D=20xpm_make_color_table_h=20= (&put_color_table,=0A-=09=09=09=09=09=20=20&get_color_table);=0A+=20=20=20= =20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= =20=20=20=20=20=20=20=20=20=20=20=20=20=20&get_color_table);=0A=20=0A=20=20= =20while=20(num_colors--=20>=200)=0A=20=20=20=20=20{=0A@@=20-4077,67=20= +4077,67=20@@=20xpm_load_image=20(struct=20frame=20*f,=0A=20=0A=20=20=20=20= =20=20=20expect=20(XPM_TK_STRING);=0A=20=20=20=20=20=20=20if=20(len=20<=3D= =20chars_per_pixel=20||=20len=20>=3D=20BUFSIZ=20+=20chars_per_pixel)=0A-=09= goto=20failure;=0A+=20=20=20=20=20=20=20=20goto=20failure;=0A=20=20=20=20= =20=20=20memcpy=20(buffer,=20beg=20+=20chars_per_pixel,=20len=20-=20= chars_per_pixel);=0A=20=20=20=20=20=20=20buffer[len=20-=20= chars_per_pixel]=20=3D=20'\0';=0A=20=0A=20=20=20=20=20=20=20str=20=3D=20= strtok=20(buffer,=20"=20\t");=0A=20=20=20=20=20=20=20if=20(str=20=3D=3D=20= NULL)=0A-=09goto=20failure;=0A+=20=20=20=20=20=20=20=20goto=20failure;=0A= =20=20=20=20=20=20=20key=20=3D=20xpm_str_to_color_key=20(str);=0A=20=20=20= =20=20=20=20if=20(key=20<=200)=0A-=09goto=20failure;=0A+=20=20=20=20=20=20= =20=20goto=20failure;=0A=20=20=20=20=20=20=20do=0A-=09{=0A-=09=20=20= color=20=3D=20strtok=20(NULL,=20"=20\t");=0A-=09=20=20if=20(color=20=3D=3D= =20NULL)=0A-=09=20=20=20=20goto=20failure;=0A-=0A-=09=20=20while=20((str=20= =3D=20strtok=20(NULL,=20"=20\t"))=20!=3D=20NULL)=0A-=09=20=20=20=20{=0A-=09= =20=20=20=20=20=20next_key=20=3D=20xpm_str_to_color_key=20(str);=0A-=09=20= =20=20=20=20=20if=20(next_key=20>=3D=200)=0A-=09=09break;=0A-=09=20=20=20= =20=20=20color[strlen=20(color)]=20=3D=20'=20';=0A-=09=20=20=20=20}=0A-=0A= -=09=20=20if=20(key=20=3D=3D=20XPM_COLOR_KEY_S)=0A-=09=20=20=20=20{=0A-=09= =20=20=20=20=20=20if=20(NILP=20(symbol_color))=0A-=09=09symbol_color=20=3D= =20build_string=20(color);=0A-=09=20=20=20=20}=0A-=09=20=20else=20if=20= (max_key=20<=20key=20&&=20key=20<=3D=20best_key)=0A-=09=20=20=20=20{=0A-=09= =20=20=20=20=20=20max_key=20=3D=20key;=0A-=09=20=20=20=20=20=20max_color=20= =3D=20color;=0A-=09=20=20=20=20}=0A-=09=20=20key=20=3D=20next_key;=0A-=09= }=0A+=20=20=20=20=20=20=20=20{=0A+=20=20=20=20=20=20=20=20=20=20color=20= =3D=20strtok=20(NULL,=20"=20\t");=0A+=20=20=20=20=20=20=20=20=20=20if=20= (color=20=3D=3D=20NULL)=0A+=20=20=20=20=20=20=20=20=20=20=20=20goto=20= failure;=0A+=0A+=20=20=20=20=20=20=20=20=20=20while=20((str=20=3D=20= strtok=20(NULL,=20"=20\t"))=20!=3D=20NULL)=0A+=20=20=20=20=20=20=20=20=20= =20=20=20{=0A+=20=20=20=20=20=20=20=20=20=20=20=20=20=20next_key=20=3D=20= xpm_str_to_color_key=20(str);=0A+=20=20=20=20=20=20=20=20=20=20=20=20=20=20= if=20(next_key=20>=3D=200)=0A+=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= =20break;=0A+=20=20=20=20=20=20=20=20=20=20=20=20=20=20color[strlen=20= (color)]=20=3D=20'=20';=0A+=20=20=20=20=20=20=20=20=20=20=20=20}=0A+=0A+=20= =20=20=20=20=20=20=20=20=20if=20(key=20=3D=3D=20XPM_COLOR_KEY_S)=0A+=20=20= =20=20=20=20=20=20=20=20=20=20{=0A+=20=20=20=20=20=20=20=20=20=20=20=20=20= =20if=20(NILP=20(symbol_color))=0A+=20=20=20=20=20=20=20=20=20=20=20=20=20= =20=20=20symbol_color=20=3D=20build_string=20(color);=0A+=20=20=20=20=20=20= =20=20=20=20=20=20}=0A+=20=20=20=20=20=20=20=20=20=20else=20if=20= (max_key=20<=20key=20&&=20key=20<=3D=20best_key)=0A+=20=20=20=20=20=20=20= =20=20=20=20=20{=0A+=20=20=20=20=20=20=20=20=20=20=20=20=20=20max_key=20= =3D=20key;=0A+=20=20=20=20=20=20=20=20=20=20=20=20=20=20max_color=20=3D=20= color;=0A+=20=20=20=20=20=20=20=20=20=20=20=20}=0A+=20=20=20=20=20=20=20=20= =20=20key=20=3D=20next_key;=0A+=20=20=20=20=20=20=20=20}=0A=20=20=20=20=20= =20=20while=20(str);=0A=20=0A=20=20=20=20=20=20=20color_val=20=3D=20= Qnil;=0A=20=20=20=20=20=20=20if=20(!NILP=20(color_symbols)=20&&=20!NILP=20= (symbol_color))=0A-=09{=0A-=09=20=20Lisp_Object=20specified_color=20=3D=20= Fassoc=20(symbol_color,=20color_symbols);=0A-=0A-=09=20=20if=20(CONSP=20= (specified_color)=20&&=20STRINGP=20(XCDR=20(specified_color)))=0A-=09=20=20= =20=20{=0A-=09=20=20=20=20=20=20if=20(xstrcasecmp=20(SSDATA=20(XCDR=20= (specified_color)),=20"None")=20=3D=3D=200)=0A-=09=09color_val=20=3D=20= Qt;=0A-=09=20=20=20=20=20=20else=20if=20(x_defined_color=20(f,=20SSDATA=20= (XCDR=20(specified_color)),=0A-=09=09=09=09=09&cdef,=200))=0A-=09=09= color_val=20=3D=20make_number=20(cdef.pixel);=0A-=09=20=20=20=20}=0A-=09= }=0A+=20=20=20=20=20=20=20=20{=0A+=20=20=20=20=20=20=20=20=20=20= Lisp_Object=20specified_color=20=3D=20Fassoc=20(symbol_color,=20= color_symbols);=0A+=0A+=20=20=20=20=20=20=20=20=20=20if=20(CONSP=20= (specified_color)=20&&=20STRINGP=20(XCDR=20(specified_color)))=0A+=20=20=20= =20=20=20=20=20=20=20=20=20{=0A+=20=20=20=20=20=20=20=20=20=20=20=20=20=20= if=20(xstrcasecmp=20(SSDATA=20(XCDR=20(specified_color)),=20"None")=20=3D=3D= =200)=0A+=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20color_val=20=3D=20= Qt;=0A+=20=20=20=20=20=20=20=20=20=20=20=20=20=20else=20if=20= (x_defined_color=20(f,=20SSDATA=20(XCDR=20(specified_color)),=0A+=20=20=20= =20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= =20=20=20=20=20=20=20=20=20=20=20=20&cdef,=200))=0A+=20=20=20=20=20=20=20= =20=20=20=20=20=20=20=20=20color_val=20=3D=20make_number=20(cdef.pixel);=0A= +=20=20=20=20=20=20=20=20=20=20=20=20}=0A+=20=20=20=20=20=20=20=20}=0A=20= =20=20=20=20=20=20if=20(NILP=20(color_val)=20&&=20max_key=20>=200)=0A-=09= {=0A-=09=20=20if=20(xstrcasecmp=20(max_color,=20"None")=20=3D=3D=200)=0A= -=09=20=20=20=20color_val=20=3D=20Qt;=0A-=09=20=20else=20if=20= (x_defined_color=20(f,=20max_color,=20&cdef,=200))=0A-=09=20=20=20=20= color_val=20=3D=20make_number=20(cdef.pixel);=0A-=09}=0A+=20=20=20=20=20=20= =20=20{=0A+=20=20=20=20=20=20=20=20=20=20if=20(xstrcasecmp=20(max_color,=20= "None")=20=3D=3D=200)=0A+=20=20=20=20=20=20=20=20=20=20=20=20color_val=20= =3D=20Qt;=0A+=20=20=20=20=20=20=20=20=20=20else=20if=20(x_defined_color=20= (f,=20max_color,=20&cdef,=200))=0A+=20=20=20=20=20=20=20=20=20=20=20=20= color_val=20=3D=20make_number=20(cdef.pixel);=0A+=20=20=20=20=20=20=20=20= }=0A=20=20=20=20=20=20=20if=20(!NILP=20(color_val))=0A-=09= (*put_color_table)=20(color_table,=20beg,=20chars_per_pixel,=20= color_val);=0A+=20=20=20=20=20=20=20=20(*put_color_table)=20= (color_table,=20beg,=20chars_per_pixel,=20color_val);=0A=20=0A=20=20=20=20= =20=20=20expect=20(',');=0A=20=20=20=20=20}=0A@@=20-4147,26=20+4147,26=20= @@=20xpm_load_image=20(struct=20frame=20*f,=0A=20=20=20=20=20=20=20= expect=20(XPM_TK_STRING);=0A=20=20=20=20=20=20=20str=20=3D=20beg;=0A=20=20= =20=20=20=20=20if=20(len=20<=20width=20*=20chars_per_pixel)=0A-=09goto=20= failure;=0A+=20=20=20=20=20=20=20=20goto=20failure;=0A=20=20=20=20=20=20=20= for=20(x=20=3D=200;=20x=20<=20width;=20x++,=20str=20+=3D=20= chars_per_pixel)=0A-=09{=0A-=09=20=20Lisp_Object=20color_val=20=3D=0A-=09= =20=20=20=20(*get_color_table)=20(color_table,=20str,=20= chars_per_pixel);=0A+=20=20=20=20=20=20=20=20{=0A+=20=20=20=20=20=20=20=20= =20=20Lisp_Object=20color_val=20=3D=0A+=20=20=20=20=20=20=20=20=20=20=20=20= (*get_color_table)=20(color_table,=20str,=20chars_per_pixel);=0A=20=0A-=09= =20=20XPutPixel=20(ximg,=20x,=20y,=0A-=09=09=20=20=20=20=20(INTEGERP=20= (color_val)=20?=20XINT=20(color_val)=0A-=09=09=20=20=20=20=20=20:=20= FRAME_FOREGROUND_PIXEL=20(f)));=0A+=20=20=20=20=20=20=20=20=20=20= XPutPixel=20(ximg,=20x,=20y,=0A+=20=20=20=20=20=20=20=20=20=20=20=20=20=20= =20=20=20=20=20=20=20(INTEGERP=20(color_val)=20?=20XINT=20(color_val)=0A= +=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20:=20= FRAME_FOREGROUND_PIXEL=20(f)));=0A=20#ifndef=20HAVE_NS=0A-=09=20=20= XPutPixel=20(mask_img,=20x,=20y,=0A-=09=09=20=20=20=20=20(!EQ=20= (color_val,=20Qt)=20?=20PIX_MASK_DRAW=0A-=09=09=20=20=20=20=20=20:=20= (have_mask=20=3D=20true,=20PIX_MASK_RETAIN)));=0A+=20=20=20=20=20=20=20=20= =20=20XPutPixel=20(mask_img,=20x,=20y,=0A+=20=20=20=20=20=20=20=20=20=20=20= =20=20=20=20=20=20=20=20=20=20(!EQ=20(color_val,=20Qt)=20?=20= PIX_MASK_DRAW=0A+=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= =20=20=20:=20(have_mask=20=3D=20true,=20PIX_MASK_RETAIN)));=0A=20#else=0A= =20=20=20=20=20=20=20=20=20=20=20if=20(EQ=20(color_val,=20Qt))=0A=20=20=20= =20=20=20=20=20=20=20=20=20=20ns_set_alpha=20(ximg,=20x,=20y,=200);=0A=20= #endif=0A-=09}=0A+=20=20=20=20=20=20=20=20}=0A=20=20=20=20=20=20=20if=20= (y=20+=201=20<=20height)=0A-=09expect=20(',');=0A+=20=20=20=20=20=20=20=20= expect=20(',');=0A=20=20=20=20=20}=0A=20=0A=20=20=20img->width=20=3D=20= width;=0A@@=20-4181,7=20+4181,7=20@@=20xpm_load_image=20(struct=20frame=20= *f,=0A=20=20=20if=20(have_mask)=0A=20=20=20=20=20{=0A=20=20=20=20=20=20=20= /*=20Fill=20in=20the=20background_transparent=20field=20while=20we=20= have=20the=0A-=09=20mask=20handy.=20=20*/=0A+=20=20=20=20=20=20=20=20=20= mask=20handy.=20=20*/=0A=20=20=20=20=20=20=20= image_background_transparent=20(img,=20f,=20mask_img);=0A=20=0A=20=20=20=20= =20=20=20image_put_x_image=20(f,=20img,=20mask_img,=201);=0A@@=20= -4223,17=20+4223,17=20@@=20xpm_load=20(struct=20frame=20*f,=0A=20=0A=20=20= =20=20=20=20=20file=20=3D=20x_find_image_file=20(file_name);=0A=20=20=20=20= =20=20=20if=20(!STRINGP=20(file))=0A-=09{=0A-=09=20=20image_error=20= ("Cannot=20find=20image=20file=20`%s'",=20file_name,=20Qnil);=0A-=09=20=20= return=200;=0A-=09}=0A+=20=20=20=20=20=20=20=20{=0A+=20=20=20=20=20=20=20= =20=20=20image_error=20("Cannot=20find=20image=20file=20`%s'",=20= file_name,=20Qnil);=0A+=20=20=20=20=20=20=20=20=20=20return=200;=0A+=20=20= =20=20=20=20=20=20}=0A=20=0A=20=20=20=20=20=20=20contents=20=3D=20= slurp_file=20(SSDATA=20(file),=20&size);=0A=20=20=20=20=20=20=20if=20= (contents=20=3D=3D=20NULL)=0A-=09{=0A-=09=20=20image_error=20("Error=20= loading=20XPM=20image=20`%s'",=20img->spec,=20Qnil);=0A-=09=20=20return=20= 0;=0A-=09}=0A+=20=20=20=20=20=20=20=20{=0A+=20=20=20=20=20=20=20=20=20=20= image_error=20("Error=20loading=20XPM=20image=20`%s'",=20img->spec,=20= Qnil);=0A+=20=20=20=20=20=20=20=20=20=20return=200;=0A+=20=20=20=20=20=20= =20=20}=0A=20=0A=20=20=20=20=20=20=20success_p=20=3D=20xpm_load_image=20= (f,=20img,=20contents,=20contents=20+=20size);=0A=20=20=20=20=20=20=20= xfree=20(contents);=0A@@=20-4244,12=20+4244,12=20@@=20xpm_load=20(struct=20= frame=20*f,=0A=20=0A=20=20=20=20=20=20=20data=20=3D=20image_spec_value=20= (img->spec,=20QCdata,=20NULL);=0A=20=20=20=20=20=20=20if=20(!STRINGP=20= (data))=0A-=09{=0A-=09=20=20image_error=20("Invalid=20image=20data=20= `%s'",=20data,=20Qnil);=0A-=09=20=20return=200;=0A-=09}=0A+=20=20=20=20=20= =20=20=20{=0A+=20=20=20=20=20=20=20=20=20=20image_error=20("Invalid=20= image=20data=20`%s'",=20data,=20Qnil);=0A+=20=20=20=20=20=20=20=20=20=20= return=200;=0A+=20=20=20=20=20=20=20=20}=0A=20=20=20=20=20=20=20= success_p=20=3D=20xpm_load_image=20(f,=20img,=20SDATA=20(data),=0A-=09=09= =09=09=20=20SDATA=20(data)=20+=20SBYTES=20(data));=0A+=20=20=20=20=20=20=20= =20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= =20=20SDATA=20(data)=20+=20SBYTES=20(data));=0A=20=20=20=20=20}=0A=20=0A=20= =20=20return=20success_p;=0A@@=20-4260,7=20+4260,7=20@@=20xpm_load=20= (struct=20frame=20*f,=0A=20=0A=20=0C=0A=20= /***********************************************************************=0A= -=09=09=09=20=20=20=20=20Color=20table=0A+=20=20=20=20=20=20=20=20=20=20=20= =20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20Color=20table=0A=20= =20= ***********************************************************************/=0A= =20=0A=20#ifdef=20COLOR_TABLE_SUPPORT=0A@@=20-4295,7=20+4295,7=20@@=20= enum=0A=20{=0A=20=20=20ct_colors_allocated_max=20=3D=0A=20=20=20=20=20= min=20(INT_MAX,=0A-=09=20min=20(PTRDIFF_MAX,=20SIZE_MAX)=20/=20sizeof=20= (unsigned=20long))=0A+=20=20=20=20=20=20=20=20=20min=20(PTRDIFF_MAX,=20= SIZE_MAX)=20/=20sizeof=20(unsigned=20long))=0A=20};=0A=20=0A=20/*=20= Initialize=20the=20color=20table.=20=20*/=0A@@=20-4320,8=20+4320,8=20@@=20= free_color_table=20(void)=0A=20=20=20for=20(i=20=3D=200;=20i=20<=20= CT_SIZE;=20++i)=0A=20=20=20=20=20for=20(p=20=3D=20ct_table[i];=20p;=20p=20= =3D=20next)=0A=20=20=20=20=20=20=20{=0A-=09next=20=3D=20p->next;=0A-=09= xfree=20(p);=0A+=20=20=20=20=20=20=20=20next=20=3D=20p->next;=0A+=20=20=20= =20=20=20=20=20xfree=20(p);=0A=20=20=20=20=20=20=20}=0A=20=0A=20=20=20= xfree=20(ct_table);=0A@@=20-4353,16=20+4353,16=20@@=20lookup_rgb_color=20= (struct=20frame=20*f,=20int=20r,=20int=20g,=20int=20b)=0A=20=0A=20=20=20=20= =20=20=20/*=20Apply=20gamma-correction=20like=20normal=20color=20= allocation=20does.=20=20*/=0A=20=20=20=20=20=20=20if=20(f->gamma)=0A-=09= {=0A-=09=20=20XColor=20color;=0A-=09=20=20color.red=20=3D=20r,=20= color.green=20=3D=20g,=20color.blue=20=3D=20b;=0A-=09=20=20gamma_correct=20= (f,=20&color);=0A-=09=20=20r=20=3D=20color.red,=20g=20=3D=20color.green,=20= b=20=3D=20color.blue;=0A-=09}=0A+=20=20=20=20=20=20=20=20{=0A+=20=20=20=20= =20=20=20=20=20=20XColor=20color;=0A+=20=20=20=20=20=20=20=20=20=20= color.red=20=3D=20r,=20color.green=20=3D=20g,=20color.blue=20=3D=20b;=0A= +=20=20=20=20=20=20=20=20=20=20gamma_correct=20(f,=20&color);=0A+=20=20=20= =20=20=20=20=20=20=20r=20=3D=20color.red,=20g=20=3D=20color.green,=20b=20= =3D=20color.blue;=0A+=20=20=20=20=20=20=20=20}=0A=20=0A=20=20=20=20=20=20= =20/*=20Scale=20down=20RGB=20values=20to=20the=20visual's=20bits=20per=20= RGB,=20and=20shift=0A-=09=20them=20to=20the=20right=20position=20in=20= the=20pixel=20color.=20=20Note=20that=20the=0A-=09=20original=20RGB=20= values=20are=2016-bit=20values,=20as=20usual=20in=20X.=20=20*/=0A+=20=20=20= =20=20=20=20=20=20them=20to=20the=20right=20position=20in=20the=20pixel=20= color.=20=20Note=20that=20the=0A+=20=20=20=20=20=20=20=20=20original=20= RGB=20values=20are=2016-bit=20values,=20as=20usual=20in=20X.=20=20*/=0A=20= =20=20=20=20=20=20pr=20=3D=20(r=20>>=20(16=20-=20dpyinfo->red_bits))=20=20= =20<<=20dpyinfo->red_offset;=0A=20=20=20=20=20=20=20pg=20=3D=20(g=20>>=20= (16=20-=20dpyinfo->green_bits))=20<<=20dpyinfo->green_offset;=0A=20=20=20= =20=20=20=20pb=20=3D=20(b=20>>=20(16=20-=20dpyinfo->blue_bits))=20=20<<=20= dpyinfo->blue_offset;=0A@@=20-4387,7=20+4387,7=20@@=20lookup_rgb_color=20= (struct=20frame=20*f,=20int=20r,=20int=20g,=20int=20b)=0A=20#endif=0A=20=0A= =20=20=20=20=20=20=20if=20(ct_colors_allocated_max=20<=3D=20= ct_colors_allocated)=0A-=09return=20FRAME_FOREGROUND_PIXEL=20(f);=0A+=20=20= =20=20=20=20=20=20return=20FRAME_FOREGROUND_PIXEL=20(f);=0A=20=0A=20= #ifdef=20HAVE_X_WINDOWS=0A=20=20=20=20=20=20=20color.red=20=3D=20r;=0A@@=20= -4397,18=20+4397,18=20@@=20lookup_rgb_color=20(struct=20frame=20*f,=20= int=20r,=20int=20g,=20int=20b)=0A=20=20=20=20=20=20=20cmap=20=3D=20= FRAME_X_COLORMAP=20(f);=0A=20=20=20=20=20=20=20rc=20=3D=20= x_alloc_nearest_color=20(f,=20cmap,=20&color);=0A=20=20=20=20=20=20=20if=20= (rc)=0A-=09{=0A-=09=20=20++ct_colors_allocated;=0A-=09=20=20p=20=3D=20= xmalloc=20(sizeof=20*p);=0A-=09=20=20p->r=20=3D=20r;=0A-=09=20=20p->g=20= =3D=20g;=0A-=09=20=20p->b=20=3D=20b;=0A-=09=20=20p->pixel=20=3D=20= color.pixel;=0A-=09=20=20p->next=20=3D=20ct_table[i];=0A-=09=20=20= ct_table[i]=20=3D=20p;=0A-=09}=0A+=20=20=20=20=20=20=20=20{=0A+=20=20=20=20= =20=20=20=20=20=20++ct_colors_allocated;=0A+=20=20=20=20=20=20=20=20=20=20= p=20=3D=20xmalloc=20(sizeof=20*p);=0A+=20=20=20=20=20=20=20=20=20=20p->r=20= =3D=20r;=0A+=20=20=20=20=20=20=20=20=20=20p->g=20=3D=20g;=0A+=20=20=20=20= =20=20=20=20=20=20p->b=20=3D=20b;=0A+=20=20=20=20=20=20=20=20=20=20= p->pixel=20=3D=20color.pixel;=0A+=20=20=20=20=20=20=20=20=20=20p->next=20= =3D=20ct_table[i];=0A+=20=20=20=20=20=20=20=20=20=20ct_table[i]=20=3D=20= p;=0A+=20=20=20=20=20=20=20=20}=0A=20=20=20=20=20=20=20else=0A-=09return=20= FRAME_FOREGROUND_PIXEL=20(f);=0A+=20=20=20=20=20=20=20=20return=20= FRAME_FOREGROUND_PIXEL=20(f);=0A=20=0A=20#else=0A=20#ifdef=20HAVE_NTGUI=0A= @@=20-4452,7=20+4452,7=20@@=20lookup_pixel_color=20(struct=20frame=20*f,=20= unsigned=20long=20pixel)=0A=20=20=20=20=20=20=20bool=20rc;=0A=20=0A=20=20= =20=20=20=20=20if=20(ct_colors_allocated_max=20<=3D=20= ct_colors_allocated)=0A-=09return=20FRAME_FOREGROUND_PIXEL=20(f);=0A+=20=20= =20=20=20=20=20=20return=20FRAME_FOREGROUND_PIXEL=20(f);=0A=20=0A=20= #ifdef=20HAVE_X_WINDOWS=0A=20=20=20=20=20=20=20cmap=20=3D=20= FRAME_X_COLORMAP=20(f);=0A@@=20-4469,19=20+4469,19=20@@=20= lookup_pixel_color=20(struct=20frame=20*f,=20unsigned=20long=20pixel)=0A=20= #endif=20/*=20HAVE_X_WINDOWS=20*/=0A=20=0A=20=20=20=20=20=20=20if=20(rc)=0A= -=09{=0A-=09=20=20++ct_colors_allocated;=0A-=0A-=09=20=20p=20=3D=20= xmalloc=20(sizeof=20*p);=0A-=09=20=20p->r=20=3D=20color.red;=0A-=09=20=20= p->g=20=3D=20color.green;=0A-=09=20=20p->b=20=3D=20color.blue;=0A-=09=20=20= p->pixel=20=3D=20pixel;=0A-=09=20=20p->next=20=3D=20ct_table[i];=0A-=09=20= =20ct_table[i]=20=3D=20p;=0A-=09}=0A+=20=20=20=20=20=20=20=20{=0A+=20=20=20= =20=20=20=20=20=20=20++ct_colors_allocated;=0A+=0A+=20=20=20=20=20=20=20=20= =20=20p=20=3D=20xmalloc=20(sizeof=20*p);=0A+=20=20=20=20=20=20=20=20=20=20= p->r=20=3D=20color.red;=0A+=20=20=20=20=20=20=20=20=20=20p->g=20=3D=20= color.green;=0A+=20=20=20=20=20=20=20=20=20=20p->b=20=3D=20color.blue;=0A= +=20=20=20=20=20=20=20=20=20=20p->pixel=20=3D=20pixel;=0A+=20=20=20=20=20= =20=20=20=20=20p->next=20=3D=20ct_table[i];=0A+=20=20=20=20=20=20=20=20=20= =20ct_table[i]=20=3D=20p;=0A+=20=20=20=20=20=20=20=20}=0A=20=20=20=20=20=20= =20else=0A-=09return=20FRAME_FOREGROUND_PIXEL=20(f);=0A+=20=20=20=20=20=20= =20=20return=20FRAME_FOREGROUND_PIXEL=20(f);=0A=20=20=20=20=20}=0A=20=20=20= return=20p->pixel;=0A=20}=0A@@=20-4508,8=20+4508,8=20@@=20= colors_in_color_table=20(int=20*n)=0A=20=20=20=20=20=20=20*n=20=3D=20= ct_colors_allocated;=0A=20=0A=20=20=20=20=20=20=20for=20(i=20=3D=20j=20=3D= =200;=20i=20<=20CT_SIZE;=20++i)=0A-=09for=20(p=20=3D=20ct_table[i];=20p;=20= p=20=3D=20p->next)=0A-=09=20=20colors[j++]=20=3D=20p->pixel;=0A+=20=20=20= =20=20=20=20=20for=20(p=20=3D=20ct_table[i];=20p;=20p=20=3D=20p->next)=0A= +=20=20=20=20=20=20=20=20=20=20colors[j++]=20=3D=20p->pixel;=0A=20=20=20=20= =20}=0A=20=0A=20=20=20return=20colors;=0A@@=20-4540,7=20+4540,7=20@@=20= init_color_table=20(void)=0A=20=0A=20=0C=0A=20= /***********************************************************************=0A= -=09=09=09=20=20=20=20=20=20Algorithms=0A+=20=20=20=20=20=20=20=20=20=20=20= =20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20Algorithms=0A=20= =20= ***********************************************************************/=0A= =20=0A=20/*=20Edge=20detection=20matrices=20for=20different=20= edge-detection=0A@@=20-4548,14=20+4548,14=20@@=20init_color_table=20= (void)=0A=20=0A=20static=20int=20emboss_matrix[9]=20=3D=20{=0A=20=20=20=20= /*=20x=20-=201=09x=09x=20+=201=20=20*/=0A-=20=20=20=20=20=20=20=202,=20=20= =20=20=20-1,=20=20=09=20=200,=09=09/*=20y=20-=201=20*/=0A+=20=20=20=20=20= =20=20=202,=20=20=20=20=20-1,=20=20=20=20=20=20=20=200,=09=09/*=20y=20-=20= 1=20*/=0A=20=20=20=20=20=20=20=20-1,=20=20=20=20=20=200,=20=20=20=20=20=20= =20=201,=09=09/*=20y=20=20=20=20=20*/=0A=20=20=20=20=20=20=20=20=200,=20=20= =20=20=20=201,=20=20=20=20=20=20=20-2=09=09/*=20y=20+=201=20*/=0A=20};=0A= =20=0A=20static=20int=20laplace_matrix[9]=20=3D=20{=0A=20=20=20=20/*=20x=20= -=201=09x=09x=20+=201=20=20*/=0A-=20=20=20=20=20=20=20=201,=20=20=20=20=20= =200,=20=20=09=20=200,=09=09/*=20y=20-=201=20*/=0A+=20=20=20=20=20=20=20=20= 1,=20=20=20=20=20=200,=20=20=20=20=20=20=20=200,=09=09/*=20y=20-=201=20= */=0A=20=20=20=20=20=20=20=20=200,=20=20=20=20=20=200,=20=20=20=20=20=20=20= =200,=09=09/*=20y=20=20=20=20=20*/=0A=20=20=20=20=20=20=20=20=200,=20=20=20= =20=20=200,=20=20=20=20=20=20=20-1=09=09/*=20y=20+=201=20*/=0A=20};=0A@@=20= -4597,23=20+4597,23=20@@=20x_to_xcolors=20(struct=20frame=20*f,=20struct=20= image=20*img,=20bool=20rgb_p)=0A=20#if=20defined=20(HAVE_X_WINDOWS)=20||=20= defined=20(HAVE_NTGUI)=0A=20=20=20=20=20=20=20XColor=20*row=20=3D=20p;=0A= =20=20=20=20=20=20=20for=20(x=20=3D=200;=20x=20<=20img->width;=20++x,=20= ++p)=0A-=09p->pixel=20=3D=20GET_PIXEL=20(ximg,=20x,=20y);=0A+=20=20=20=20= =20=20=20=20p->pixel=20=3D=20GET_PIXEL=20(ximg,=20x,=20y);=0A=20=20=20=20= =20=20=20if=20(rgb_p)=0A-=09x_query_colors=20(f,=20row,=20img->width);=0A= +=20=20=20=20=20=20=20=20x_query_colors=20(f,=20row,=20img->width);=0A=20= =0A=20#else=0A=20=0A=20=20=20=20=20=20=20for=20(x=20=3D=200;=20x=20<=20= img->width;=20++x,=20++p)=0A-=09{=0A-=09=20=20/*=20W32_TODO:=20palette=20= support=20needed=20here?=20=20*/=0A-=09=20=20p->pixel=20=3D=20GET_PIXEL=20= (ximg,=20x,=20y);=0A-=09=20=20if=20(rgb_p)=0A-=09=20=20=20=20{=0A-=09=20=20= =20=20=20=20p->red=20=3D=20RED16_FROM_ULONG=20(p->pixel);=0A-=09=20=20=20= =20=20=20p->green=20=3D=20GREEN16_FROM_ULONG=20(p->pixel);=0A-=09=20=20=20= =20=20=20p->blue=20=3D=20BLUE16_FROM_ULONG=20(p->pixel);=0A-=09=20=20=20=20= }=0A-=09}=0A+=20=20=20=20=20=20=20=20{=0A+=20=20=20=20=20=20=20=20=20=20= /*=20W32_TODO:=20palette=20support=20needed=20here?=20=20*/=0A+=20=20=20=20= =20=20=20=20=20=20p->pixel=20=3D=20GET_PIXEL=20(ximg,=20x,=20y);=0A+=20=20= =20=20=20=20=20=20=20=20if=20(rgb_p)=0A+=20=20=20=20=20=20=20=20=20=20=20= =20{=0A+=20=20=20=20=20=20=20=20=20=20=20=20=20=20p->red=20=3D=20= RED16_FROM_ULONG=20(p->pixel);=0A+=20=20=20=20=20=20=20=20=20=20=20=20=20= =20p->green=20=3D=20GREEN16_FROM_ULONG=20(p->pixel);=0A+=20=20=20=20=20=20= =20=20=20=20=20=20=20=20p->blue=20=3D=20BLUE16_FROM_ULONG=20(p->pixel);=0A= +=20=20=20=20=20=20=20=20=20=20=20=20}=0A+=20=20=20=20=20=20=20=20}=0A=20= #endif=20/*=20HAVE_X_WINDOWS=20*/=0A=20=20=20=20=20}=0A=20=0A@@=20= -4640,7=20+4640,7=20@@=20XPutPixel=20(XImagePtr=20ximg,=20int=20x,=20int=20= y,=20COLORREF=20color)=0A=20=20=20=20=20=20=20int=20rowbytes=20=3D=20= width=20*=203;=0A=20=20=20=20=20=20=20/*=20Ensure=20scanlines=20are=20= aligned=20on=204=20byte=20boundaries.=20=20*/=0A=20=20=20=20=20=20=20if=20= (rowbytes=20%=204)=0A-=09rowbytes=20+=3D=204=20-=20(rowbytes=20%=204);=0A= +=20=20=20=20=20=20=20=20rowbytes=20+=3D=204=20-=20(rowbytes=20%=204);=0A= =20=0A=20=20=20=20=20=20=20pixel=20=3D=20ximg->data=20+=20y=20*=20= rowbytes=20+=20x=20*=203;=0A=20=20=20=20=20=20=20/*=20Windows=20bitmaps=20= are=20in=20BGR=20order.=20=20*/=0A@@=20-4654,13=20+4654,13=20@@=20= XPutPixel=20(XImagePtr=20ximg,=20int=20x,=20int=20y,=20COLORREF=20color)=0A= =20=20=20=20=20=20=20int=20rowbytes=20=3D=20width=20/=208;=0A=20=20=20=20= =20=20=20/*=20Ensure=20scanlines=20are=20aligned=20on=204=20byte=20= boundaries.=20=20*/=0A=20=20=20=20=20=20=20if=20(rowbytes=20%=204)=0A-=09= rowbytes=20+=3D=204=20-=20(rowbytes=20%=204);=0A+=20=20=20=20=20=20=20=20= rowbytes=20+=3D=204=20-=20(rowbytes=20%=204);=0A=20=20=20=20=20=20=20= pixel=20=3D=20ximg->data=20+=20y=20*=20rowbytes=20+=20x=20/=208;=0A=20=20= =20=20=20=20=20/*=20Filter=20out=20palette=20info.=20=20*/=0A=20=20=20=20= =20=20=20if=20(color=20&=200x00ffffff)=0A-=09*pixel=20=3D=20*pixel=20|=20= (1=20<<=20x=20%=208);=0A+=20=20=20=20=20=20=20=20*pixel=20=3D=20*pixel=20= |=20(1=20<<=20x=20%=208);=0A=20=20=20=20=20=20=20else=0A-=09*pixel=20=3D=20= *pixel=20&=20~(1=20<<=20x=20%=208);=0A+=20=20=20=20=20=20=20=20*pixel=20= =3D=20*pixel=20&=20~(1=20<<=20x=20%=208);=0A=20=20=20=20=20}=0A=20=20=20= else=0A=20=20=20=20=20image_error=20("XPutPixel:=20palette=20image=20not=20= supported",=20Qnil,=20Qnil);=0A@@=20-4683,14=20+4683,14=20@@=20= x_from_xcolors=20(struct=20frame=20*f,=20struct=20image=20*img,=20XColor=20= *colors)=0A=20=0A=20=20=20x_clear_image_1=20(f,=20img,=20= CLEAR_IMAGE_PIXMAP=20|=20CLEAR_IMAGE_COLORS);=0A=20=20=20= image_create_x_image_and_pixmap=20(f,=20img,=20img->width,=20= img->height,=200,=0A-=09=09=09=09=20=20=20&oimg,=200);=0A+=20=20=20=20=20= =20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= =20=20=20=20=20&oimg,=200);=0A=20=20=20p=20=3D=20colors;=0A=20=20=20for=20= (y=20=3D=200;=20y=20<=20img->height;=20++y)=0A=20=20=20=20=20for=20(x=20= =3D=200;=20x=20<=20img->width;=20++x,=20++p)=0A=20=20=20=20=20=20=20{=0A= -=09unsigned=20long=20pixel;=0A-=09pixel=20=3D=20lookup_rgb_color=20(f,=20= p->red,=20p->green,=20p->blue);=0A-=09XPutPixel=20(oimg,=20x,=20y,=20= pixel);=0A+=20=20=20=20=20=20=20=20unsigned=20long=20pixel;=0A+=20=20=20=20= =20=20=20=20pixel=20=3D=20lookup_rgb_color=20(f,=20p->red,=20p->green,=20= p->blue);=0A+=20=20=20=20=20=20=20=20XPutPixel=20(oimg,=20x,=20y,=20= pixel);=0A=20=20=20=20=20=20=20}=0A=20=0A=20=20=20xfree=20(colors);=0A@@=20= -4748,25=20+4748,25=20@@=20x_detect_edges=20(struct=20frame=20*f,=20= struct=20image=20*img,=20int=20*matrix,=20int=20color_adjus=0A=20=20=20=20= =20=20=20p=20=3D=20COLOR=20(new,=201,=20y);=0A=20=0A=20=20=20=20=20=20=20= for=20(x=20=3D=201;=20x=20<=20img->width=20-=201;=20++x,=20++p)=0A-=09{=0A= -=09=20=20int=20r,=20g,=20b,=20yy,=20xx;=0A-=0A-=09=20=20r=20=3D=20g=20=3D= =20b=20=3D=20i=20=3D=200;=0A-=09=20=20for=20(yy=20=3D=20y=20-=201;=20yy=20= <=20y=20+=202;=20++yy)=0A-=09=20=20=20=20for=20(xx=20=3D=20x=20-=201;=20= xx=20<=20x=20+=202;=20++xx,=20++i)=0A-=09=20=20=20=20=20=20if=20= (matrix[i])=0A-=09=20=20=20=20=20=20=20=20{=0A-=09=20=20=20=20=20=20=20=20= =20=20XColor=20*t=20=3D=20COLOR=20(colors,=20xx,=20yy);=0A-=09=09=20=20r=20= +=3D=20matrix[i]=20*=20t->red;=0A-=09=09=20=20g=20+=3D=20matrix[i]=20*=20= t->green;=0A-=09=09=20=20b=20+=3D=20matrix[i]=20*=20t->blue;=0A-=09=09}=0A= -=0A-=09=20=20r=20=3D=20(r=20/=20sum=20+=20color_adjust)=20&=200xffff;=0A= -=09=20=20g=20=3D=20(g=20/=20sum=20+=20color_adjust)=20&=200xffff;=0A-=09= =20=20b=20=3D=20(b=20/=20sum=20+=20color_adjust)=20&=200xffff;=0A-=09=20=20= p->red=20=3D=20p->green=20=3D=20p->blue=20=3D=20COLOR_INTENSITY=20(r,=20= g,=20b);=0A-=09}=0A+=20=20=20=20=20=20=20=20{=0A+=20=20=20=20=20=20=20=20= =20=20int=20r,=20g,=20b,=20yy,=20xx;=0A+=0A+=20=20=20=20=20=20=20=20=20=20= r=20=3D=20g=20=3D=20b=20=3D=20i=20=3D=200;=0A+=20=20=20=20=20=20=20=20=20= =20for=20(yy=20=3D=20y=20-=201;=20yy=20<=20y=20+=202;=20++yy)=0A+=20=20=20= =20=20=20=20=20=20=20=20=20for=20(xx=20=3D=20x=20-=201;=20xx=20<=20x=20+=20= 2;=20++xx,=20++i)=0A+=20=20=20=20=20=20=20=20=20=20=20=20=20=20if=20= (matrix[i])=0A+=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20{=0A+=20=20= =20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20XColor=20*t=20=3D=20= COLOR=20(colors,=20xx,=20yy);=0A+=20=20=20=20=20=20=20=20=20=20=20=20=20=20= =20=20=20=20r=20+=3D=20matrix[i]=20*=20t->red;=0A+=20=20=20=20=20=20=20=20= =20=20=20=20=20=20=20=20=20=20g=20+=3D=20matrix[i]=20*=20t->green;=0A+=20= =20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20b=20+=3D=20matrix[i]=20= *=20t->blue;=0A+=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20}=0A+=0A= +=20=20=20=20=20=20=20=20=20=20r=20=3D=20(r=20/=20sum=20+=20= color_adjust)=20&=200xffff;=0A+=20=20=20=20=20=20=20=20=20=20g=20=3D=20= (g=20/=20sum=20+=20color_adjust)=20&=200xffff;=0A+=20=20=20=20=20=20=20=20= =20=20b=20=3D=20(b=20/=20sum=20+=20color_adjust)=20&=200xffff;=0A+=20=20=20= =20=20=20=20=20=20=20p->red=20=3D=20p->green=20=3D=20p->blue=20=3D=20= COLOR_INTENSITY=20(r,=20g,=20b);=0A+=20=20=20=20=20=20=20=20}=0A=20=20=20= =20=20}=0A=20=0A=20=20=20xfree=20(colors);=0A@@=20-4810,7=20+4810,7=20@@=20= x_laplace=20(struct=20frame=20*f,=20struct=20image=20*img)=0A=20=0A=20= static=20void=0A=20x_edge_detection=20(struct=20frame=20*f,=20struct=20= image=20*img,=20Lisp_Object=20matrix,=0A-=09=09=20=20Lisp_Object=20= color_adjust)=0A+=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= Lisp_Object=20color_adjust)=0A=20{=0A=20=20=20int=20i=20=3D=200;=0A=20=20= =20int=20trans[9];=0A@@=20-4818,14=20+4818,14=20@@=20x_edge_detection=20= (struct=20frame=20*f,=20struct=20image=20*img,=20Lisp_Object=20matrix,=0A= =20=20=20if=20(CONSP=20(matrix))=0A=20=20=20=20=20{=0A=20=20=20=20=20=20=20= for=20(i=20=3D=200;=0A-=09=20=20=20i=20<=209=20&&=20CONSP=20(matrix)=20= &&=20NUMBERP=20(XCAR=20(matrix));=0A-=09=20=20=20++i,=20matrix=20=3D=20= XCDR=20(matrix))=0A-=09trans[i]=20=3D=20XFLOATINT=20(XCAR=20(matrix));=0A= +=20=20=20=20=20=20=20=20=20=20=20i=20<=209=20&&=20CONSP=20(matrix)=20&&=20= NUMBERP=20(XCAR=20(matrix));=0A+=20=20=20=20=20=20=20=20=20=20=20++i,=20= matrix=20=3D=20XCDR=20(matrix))=0A+=20=20=20=20=20=20=20=20trans[i]=20=3D=20= XFLOATINT=20(XCAR=20(matrix));=0A=20=20=20=20=20}=0A=20=20=20else=20if=20= (VECTORP=20(matrix)=20&&=20ASIZE=20(matrix)=20>=3D=209)=0A=20=20=20=20=20= {=0A=20=20=20=20=20=20=20for=20(i=20=3D=200;=20i=20<=209=20&&=20NUMBERP=20= (AREF=20(matrix,=20i));=20++i)=0A-=09trans[i]=20=3D=20XFLOATINT=20(AREF=20= (matrix,=20i));=0A+=20=20=20=20=20=20=20=20trans[i]=20=3D=20XFLOATINT=20= (AREF=20(matrix,=20i));=0A=20=20=20=20=20}=0A=20=0A=20=20=20if=20(NILP=20= (color_adjust))=0A@@=20-4851,21=20+4851,21=20@@=20x_disable_image=20= (struct=20frame=20*f,=20struct=20image=20*img)=0A=20=20=20if=20(n_planes=20= >=3D=202)=0A=20=20=20=20=20{=0A=20=20=20=20=20=20=20/*=20Color=20(or=20= grayscale).=20=20Convert=20to=20gray,=20and=20equalize.=20=20Just=0A-=09=20= drawing=20such=20images=20with=20a=20stipple=20can=20look=20very=20odd,=20= so=0A-=09=20we're=20using=20this=20method=20instead.=20=20*/=0A+=20=20=20= =20=20=20=20=20=20drawing=20such=20images=20with=20a=20stipple=20can=20= look=20very=20odd,=20so=0A+=20=20=20=20=20=20=20=20=20we're=20using=20= this=20method=20instead.=20=20*/=0A=20=20=20=20=20=20=20XColor=20*colors=20= =3D=20x_to_xcolors=20(f,=20img,=201);=0A=20=20=20=20=20=20=20XColor=20= *p,=20*end;=0A=20=20=20=20=20=20=20const=20int=20h=20=3D=2015000;=0A=20=20= =20=20=20=20=20const=20int=20l=20=3D=2030000;=0A=20=0A=20=20=20=20=20=20=20= for=20(p=20=3D=20colors,=20end=20=3D=20colors=20+=20img->width=20*=20= img->height;=0A-=09=20=20=20p=20<=20end;=0A-=09=20=20=20++p)=0A-=09{=0A-=09= =20=20int=20i=20=3D=20COLOR_INTENSITY=20(p->red,=20p->green,=20p->blue);=0A= -=09=20=20int=20i2=20=3D=20(0xffff=20-=20h=20-=20l)=20*=20i=20/=200xffff=20= +=20l;=0A-=09=20=20p->red=20=3D=20p->green=20=3D=20p->blue=20=3D=20i2;=0A= -=09}=0A+=20=20=20=20=20=20=20=20=20=20=20p=20<=20end;=0A+=20=20=20=20=20= =20=20=20=20=20=20++p)=0A+=20=20=20=20=20=20=20=20{=0A+=20=20=20=20=20=20= =20=20=20=20int=20i=20=3D=20COLOR_INTENSITY=20(p->red,=20p->green,=20= p->blue);=0A+=20=20=20=20=20=20=20=20=20=20int=20i2=20=3D=20(0xffff=20-=20= h=20-=20l)=20*=20i=20/=200xffff=20+=20l;=0A+=20=20=20=20=20=20=20=20=20=20= p->red=20=3D=20p->green=20=3D=20p->blue=20=3D=20i2;=0A+=20=20=20=20=20=20= =20=20}=0A=20=0A=20=20=20=20=20=20=20x_from_xcolors=20(f,=20img,=20= colors);=0A=20=20=20=20=20}=0A@@=20-4886,21=20+4886,21=20@@=20= x_disable_image=20(struct=20frame=20*f,=20struct=20image=20*img)=0A=20=20= =20=20=20=20=20gc=20=3D=20XCreateGC=20(dpy,=20img->pixmap,=200,=20NULL);=0A= =20=20=20=20=20=20=20XSetForeground=20(dpy,=20gc,=20BLACK_PIX_DEFAULT=20= (f));=0A=20=20=20=20=20=20=20XDrawLine=20(dpy,=20img->pixmap,=20gc,=200,=20= 0,=0A-=09=09=20img->width=20-=201,=20img->height=20-=201);=0A+=20=20=20=20= =20=20=20=20=20=20=20=20=20=20=20=20=20img->width=20-=201,=20img->height=20= -=201);=0A=20=20=20=20=20=20=20XDrawLine=20(dpy,=20img->pixmap,=20gc,=20= 0,=20img->height=20-=201,=0A-=09=09=20img->width=20-=201,=200);=0A+=20=20= =20=20=20=20=20=20=20=20=20=20=20=20=20=20=20img->width=20-=201,=200);=0A= =20=20=20=20=20=20=20XFreeGC=20(dpy,=20gc);=0A=20=0A=20=20=20=20=20=20=20= if=20(img->mask)=0A-=09{=0A-=09=20=20gc=20=3D=20XCreateGC=20(dpy,=20= img->mask,=200,=20NULL);=0A-=09=20=20XSetForeground=20(dpy,=20gc,=20= MaskForeground=20(f));=0A-=09=20=20XDrawLine=20(dpy,=20img->mask,=20gc,=20= 0,=200,=0A-=09=09=20=20=20=20=20img->width=20-=201,=20img->height=20-=20= 1);=0A-=09=20=20XDrawLine=20(dpy,=20img->mask,=20gc,=200,=20img->height=20= -=201,=0A-=09=09=20=20=20=20=20img->width=20-=201,=200);=0A-=09=20=20= XFreeGC=20(dpy,=20gc);=0A-=09}=0A+=20=20=20=20=20=20=20=20{=0A+=20=20=20=20= =20=20=20=20=20=20gc=20=3D=20XCreateGC=20(dpy,=20img->mask,=200,=20= NULL);=0A+=20=20=20=20=20=20=20=20=20=20XSetForeground=20(dpy,=20gc,=20= MaskForeground=20(f));=0A+=20=20=20=20=20=20=20=20=20=20XDrawLine=20= (dpy,=20img->mask,=20gc,=200,=200,=0A+=20=20=20=20=20=20=20=20=20=20=20=20= =20=20=20=20=20=20=20=20=20img->width=20-=201,=20img->height=20-=201);=0A= +=20=20=20=20=20=20=20=20=20=20XDrawLine=20(dpy,=20img->mask,=20gc,=200,=20= img->height=20-=201,=0A+=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= =20=20=20=20img->width=20-=201,=200);=0A+=20=20=20=20=20=20=20=20=20=20= XFreeGC=20(dpy,=20gc);=0A+=20=20=20=20=20=20=20=20}=0A=20#endif=20/*=20= !HAVE_NS=20*/=0A=20#else=0A=20=20=20=20=20=20=20HDC=20hdc,=20bmpdc;=0A@@=20= -4919,14=20+4919,14=20@@=20x_disable_image=20(struct=20frame=20*f,=20= struct=20image=20*img)=0A=20=20=20=20=20=20=20LineTo=20(bmpdc,=20= img->width=20-=201,=200);=0A=20=0A=20=20=20=20=20=20=20if=20(img->mask)=0A= -=09{=0A-=09=20=20SelectObject=20(bmpdc,=20img->mask);=0A-=09=20=20= SetTextColor=20(bmpdc,=20WHITE_PIX_DEFAULT=20(f));=0A-=09=20=20MoveToEx=20= (bmpdc,=200,=200,=20NULL);=0A-=09=20=20LineTo=20(bmpdc,=20img->width=20-=20= 1,=20img->height=20-=201);=0A-=09=20=20MoveToEx=20(bmpdc,=200,=20= img->height=20-=201,=20NULL);=0A-=09=20=20LineTo=20(bmpdc,=20img->width=20= -=201,=200);=0A-=09}=0A+=20=20=20=20=20=20=20=20{=0A+=20=20=20=20=20=20=20= =20=20=20SelectObject=20(bmpdc,=20img->mask);=0A+=20=20=20=20=20=20=20=20= =20=20SetTextColor=20(bmpdc,=20WHITE_PIX_DEFAULT=20(f));=0A+=20=20=20=20=20= =20=20=20=20=20MoveToEx=20(bmpdc,=200,=200,=20NULL);=0A+=20=20=20=20=20=20= =20=20=20=20LineTo=20(bmpdc,=20img->width=20-=201,=20img->height=20-=20= 1);=0A+=20=20=20=20=20=20=20=20=20=20MoveToEx=20(bmpdc,=200,=20= img->height=20-=201,=20NULL);=0A+=20=20=20=20=20=20=20=20=20=20LineTo=20= (bmpdc,=20img->width=20-=201,=200);=0A+=20=20=20=20=20=20=20=20}=0A=20=20= =20=20=20=20=20SelectObject=20(bmpdc,=20prev);=0A=20=20=20=20=20=20=20= DeleteDC=20(bmpdc);=0A=20#endif=20/*=20HAVE_NTGUI=20*/=0A@@=20-4963,7=20= +4963,7=20@@=20x_build_heuristic_mask=20(struct=20frame=20*f,=20struct=20= image=20*img,=20Lisp_Object=20how)=0A=20#ifndef=20HAVE_NS=0A=20=20=20/*=20= Create=20an=20image=20and=20pixmap=20serving=20as=20mask.=20=20*/=0A=20=20= =20if=20(!=20image_create_x_image_and_pixmap=20(f,=20img,=20img->width,=20= img->height,=201,=0A-=09=09=09=09=09=20&mask_img,=201))=0A+=20=20=20=20=20= =20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= =20=20=20=20=20=20=20=20=20=20=20&mask_img,=201))=0A=20=20=20=20=20= return;=0A=20#endif=20/*=20!HAVE_NS=20*/=0A=20#else=0A@@=20-4984,22=20= +4984,22=20@@=20x_build_heuristic_mask=20(struct=20frame=20*f,=20struct=20= image=20*img,=20Lisp_Object=20how)=0A=20=20=20=20=20=20=20int=20rgb[3],=20= i;=0A=20=0A=20=20=20=20=20=20=20for=20(i=20=3D=200;=20i=20<=203=20&&=20= CONSP=20(how)=20&&=20NATNUMP=20(XCAR=20(how));=20++i)=0A-=09{=0A-=09=20=20= rgb[i]=20=3D=20XFASTINT=20(XCAR=20(how))=20&=200xffff;=0A-=09=20=20how=20= =3D=20XCDR=20(how);=0A-=09}=0A+=20=20=20=20=20=20=20=20{=0A+=20=20=20=20=20= =20=20=20=20=20rgb[i]=20=3D=20XFASTINT=20(XCAR=20(how))=20&=200xffff;=0A= +=20=20=20=20=20=20=20=20=20=20how=20=3D=20XCDR=20(how);=0A+=20=20=20=20=20= =20=20=20}=0A=20=0A=20=20=20=20=20=20=20if=20(i=20=3D=3D=203=20&&=20NILP=20= (how))=0A-=09{=0A-=09=20=20char=20color_name[30];=0A-=09=20=20sprintf=20= (color_name,=20"#%04x%04x%04x",=20rgb[0],=20rgb[1],=20rgb[2]);=0A-=09=20=20= bg=20=3D=20(=0A+=20=20=20=20=20=20=20=20{=0A+=20=20=20=20=20=20=20=20=20=20= char=20color_name[30];=0A+=20=20=20=20=20=20=20=20=20=20sprintf=20= (color_name,=20"#%04x%04x%04x",=20rgb[0],=20rgb[1],=20rgb[2]);=0A+=20=20=20= =20=20=20=20=20=20=20bg=20=3D=20(=0A=20#ifdef=20HAVE_NTGUI=0A-=09=09= 0x00ffffff=20&=20/*=20Filter=20out=20palette=20info.=20=20*/=0A+=20=20=20= =20=20=20=20=20=20=20=20=20=20=20=20=200x00ffffff=20&=20/*=20Filter=20= out=20palette=20info.=20=20*/=0A=20#endif=20/*=20HAVE_NTGUI=20*/=0A-=09=09= x_alloc_image_color=20(f,=20img,=20build_string=20(color_name),=200));=0A= -=09=20=20use_img_background=20=3D=200;=0A-=09}=0A+=20=20=20=20=20=20=20=20= =20=20=20=20=20=20=20=20x_alloc_image_color=20(f,=20img,=20build_string=20= (color_name),=200));=0A+=20=20=20=20=20=20=20=20=20=20use_img_background=20= =3D=200;=0A+=20=20=20=20=20=20=20=20}=0A=20=20=20=20=20}=0A=20=0A=20=20=20= if=20(use_img_background)=0A@@=20-5012,7=20+5012,7=20@@=20= x_build_heuristic_mask=20(struct=20frame=20*f,=20struct=20image=20*img,=20= Lisp_Object=20how)=0A=20=20=20=20=20for=20(x=20=3D=200;=20x=20<=20= img->width;=20++x)=0A=20#ifndef=20HAVE_NS=0A=20=20=20=20=20=20=20= XPutPixel=20(mask_img,=20x,=20y,=20(XGetPixel=20(ximg,=20x,=20y)=20!=3D=20= bg=0A-=09=09=09=09=20=20?=20PIX_MASK_DRAW=20:=20PIX_MASK_RETAIN));=0A+=20= =20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= =20=20=20=20=20=20=20=20?=20PIX_MASK_DRAW=20:=20PIX_MASK_RETAIN));=0A=20= #else=0A=20=20=20=20=20=20=20if=20(XGetPixel=20(ximg,=20x,=20y)=20=3D=3D=20= bg)=0A=20=20=20=20=20=20=20=20=20ns_set_alpha=20(ximg,=20x,=20y,=200);=0A= @@=20-5028,14=20+5028,14=20@@=20x_build_heuristic_mask=20(struct=20frame=20= *f,=20struct=20image=20*img,=20Lisp_Object=20how)=0A=20=20=20for=20(y=20= =3D=200;=20y=20<=20img->height;=20++y)=0A=20=20=20=20=20for=20(x=20=3D=20= 0;=20x=20<=20img->width;=20++x)=0A=20=20=20=20=20=20=20{=0A-=09COLORREF=20= p=20=3D=20GetPixel=20(ximg,=20x,=20y);=0A-=09if=20(p=20!=3D=20bg)=0A-=09=20= =20mask_img[y=20*=20row_width=20+=20x=20/=208]=20|=3D=201=20<<=20(x=20%=20= 8);=0A+=20=20=20=20=20=20=20=20COLORREF=20p=20=3D=20GetPixel=20(ximg,=20= x,=20y);=0A+=20=20=20=20=20=20=20=20if=20(p=20!=3D=20bg)=0A+=20=20=20=20=20= =20=20=20=20=20mask_img[y=20*=20row_width=20+=20x=20/=208]=20|=3D=201=20= <<=20(x=20%=208);=0A=20=20=20=20=20=20=20}=0A=20=0A=20=20=20/*=20Create=20= the=20mask=20image.=20=20*/=0A=20=20=20img->mask=20=3D=20= w32_create_pixmap_from_bitmap_data=20(img->width,=20img->height,=0A-=09=09= =09=09=09=09=20=20mask_img);=0A+=20=20=20=20=20=20=20=20=20=20=20=20=20=20= =20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= =20=20=20=20=20=20=20=20=20=20=20mask_img);=0A=20=20=20/*=20Fill=20in=20= the=20background_transparent=20field=20while=20we=20have=20the=20mask=20= handy.=20*/=0A=20=20=20SelectObject=20(ximg,=20img->mask);=0A=20=20=20= image_background_transparent=20(img,=20f,=20ximg);=0A@@=20-5049,7=20= +5049,7=20@@=20x_build_heuristic_mask=20(struct=20frame=20*f,=20struct=20= image=20*img,=20Lisp_Object=20how)=0A=20=0A=20=0C=0A=20= /***********************************************************************=0A= -=09=09=20=20=20=20=20=20=20PBM=20(mono,=20gray,=20color)=0A+=20=20=20=20= =20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20PBM=20(mono,=20= gray,=20color)=0A=20=20= ***********************************************************************/=0A= =20=0A=20static=20bool=20pbm_image_p=20(Lisp_Object=20object);=0A@@=20= -5192,17=20+5192,17=20@@=20pbm_load=20(struct=20frame=20*f,=20struct=20= image=20*img)=0A=20=20=20=20=20{=0A=20=20=20=20=20=20=20file=20=3D=20= x_find_image_file=20(specified_file);=0A=20=20=20=20=20=20=20if=20= (!STRINGP=20(file))=0A-=09{=0A-=09=20=20image_error=20("Cannot=20find=20= image=20file=20`%s'",=20specified_file,=20Qnil);=0A-=09=20=20return=200;=0A= -=09}=0A+=20=20=20=20=20=20=20=20{=0A+=20=20=20=20=20=20=20=20=20=20= image_error=20("Cannot=20find=20image=20file=20`%s'",=20specified_file,=20= Qnil);=0A+=20=20=20=20=20=20=20=20=20=20return=200;=0A+=20=20=20=20=20=20= =20=20}=0A=20=0A=20=20=20=20=20=20=20contents=20=3D=20slurp_file=20= (SSDATA=20(file),=20&size);=0A=20=20=20=20=20=20=20if=20(contents=20=3D=3D= =20NULL)=0A-=09{=0A-=09=20=20image_error=20("Error=20reading=20`%s'",=20= file,=20Qnil);=0A-=09=20=20return=200;=0A-=09}=0A+=20=20=20=20=20=20=20=20= {=0A+=20=20=20=20=20=20=20=20=20=20image_error=20("Error=20reading=20= `%s'",=20file,=20Qnil);=0A+=20=20=20=20=20=20=20=20=20=20return=200;=0A+=20= =20=20=20=20=20=20=20}=0A=20=0A=20=20=20=20=20=20=20p=20=3D=20contents;=0A= =20=20=20=20=20=20=20end=20=3D=20contents=20+=20size;=0A@@=20-5212,10=20= +5212,10=20@@=20pbm_load=20(struct=20frame=20*f,=20struct=20image=20= *img)=0A=20=20=20=20=20=20=20Lisp_Object=20data;=0A=20=20=20=20=20=20=20= data=20=3D=20image_spec_value=20(img->spec,=20QCdata,=20NULL);=0A=20=20=20= =20=20=20=20if=20(!STRINGP=20(data))=0A-=09{=0A-=09=20=20image_error=20= ("Invalid=20image=20data=20`%s'",=20data,=20Qnil);=0A-=09=20=20return=20= 0;=0A-=09}=0A+=20=20=20=20=20=20=20=20{=0A+=20=20=20=20=20=20=20=20=20=20= image_error=20("Invalid=20image=20data=20`%s'",=20data,=20Qnil);=0A+=20=20= =20=20=20=20=20=20=20=20return=200;=0A+=20=20=20=20=20=20=20=20}=0A=20=20= =20=20=20=20=20p=20=3D=20SDATA=20(data);=0A=20=20=20=20=20=20=20end=20=3D=20= p=20+=20SBYTES=20(data);=0A=20=20=20=20=20}=0A@@=20-5270,10=20+5270,10=20= @@=20pbm_load=20(struct=20frame=20*f,=20struct=20image=20*img)=0A=20=20=20= =20=20{=0A=20=20=20=20=20=20=20max_color_idx=20=3D=20pbm_scan_number=20= (&p,=20end);=0A=20=20=20=20=20=20=20if=20(max_color_idx=20>=2065535=20||=20= max_color_idx=20<=200)=0A-=09{=0A-=09=20=20image_error=20("Unsupported=20= maximum=20PBM=20color=20value",=20Qnil,=20Qnil);=0A-=09=20=20goto=20= error;=0A-=09}=0A+=20=20=20=20=20=20=20=20{=0A+=20=20=20=20=20=20=20=20=20= =20image_error=20("Unsupported=20maximum=20PBM=20color=20value",=20Qnil,=20= Qnil);=0A+=20=20=20=20=20=20=20=20=20=20goto=20error;=0A+=20=20=20=20=20=20= =20=20}=0A=20=20=20=20=20}=0A=20=0A=20=20=20if=20(!check_image_size=20= (f,=20width,=20height))=0A@@=20-5301,106=20+5301,106=20@@=20pbm_load=20= (struct=20frame=20*f,=20struct=20image=20*img)=0A=20=0A=20=20=20=20=20=20= =20/*=20Get=20foreground=20and=20background=20colors,=20maybe=20allocate=20= colors.=20=20*/=0A=20=20=20=20=20=20=20if=20(fmt[PBM_FOREGROUND].count=0A= -=09=20=20&&=20STRINGP=20(fmt[PBM_FOREGROUND].value))=0A-=09fg=20=3D=20= x_alloc_image_color=20(f,=20img,=20fmt[PBM_FOREGROUND].value,=20fg);=0A+=20= =20=20=20=20=20=20=20=20=20&&=20STRINGP=20(fmt[PBM_FOREGROUND].value))=0A= +=20=20=20=20=20=20=20=20fg=20=3D=20x_alloc_image_color=20(f,=20img,=20= fmt[PBM_FOREGROUND].value,=20fg);=0A=20=20=20=20=20=20=20if=20= (fmt[PBM_BACKGROUND].count=0A-=09=20=20&&=20STRINGP=20= (fmt[PBM_BACKGROUND].value))=0A-=09{=0A-=09=20=20bg=20=3D=20= x_alloc_image_color=20(f,=20img,=20fmt[PBM_BACKGROUND].value,=20bg);=0A-=09= =20=20img->background=20=3D=20bg;=0A-=09=20=20img->background_valid=20=3D=20= 1;=0A-=09}=0A+=20=20=20=20=20=20=20=20=20=20&&=20STRINGP=20= (fmt[PBM_BACKGROUND].value))=0A+=20=20=20=20=20=20=20=20{=0A+=20=20=20=20= =20=20=20=20=20=20bg=20=3D=20x_alloc_image_color=20(f,=20img,=20= fmt[PBM_BACKGROUND].value,=20bg);=0A+=20=20=20=20=20=20=20=20=20=20= img->background=20=3D=20bg;=0A+=20=20=20=20=20=20=20=20=20=20= img->background_valid=20=3D=201;=0A+=20=20=20=20=20=20=20=20}=0A=20=0A=20= =20=20=20=20=20=20for=20(y=20=3D=200;=20y=20<=20height;=20++y)=0A-=09for=20= (x=20=3D=200;=20x=20<=20width;=20++x)=0A-=09=20=20{=0A-=09=20=20=20=20if=20= (raw_p)=0A-=09=20=20=20=20=20=20{=0A-=09=09if=20((x=20&=207)=20=3D=3D=20= 0)=0A-=09=09=20=20{=0A-=09=09=20=20=20=20if=20(p=20>=3D=20end)=0A-=09=09=20= =20=20=20=20=20{=0A-=09=09=09x_destroy_x_image=20(ximg);=0A-=09=09=09= x_clear_image=20(f,=20img);=0A-=09=09=09image_error=20("Invalid=20image=20= size=20in=20image=20`%s'",=0A-=09=09=09=09=20=20=20=20=20img->spec,=20= Qnil);=0A-=09=09=09goto=20error;=0A-=09=09=20=20=20=20=20=20}=0A-=09=09=20= =20=20=20c=20=3D=20*p++;=0A-=09=09=20=20}=0A-=09=09g=20=3D=20c=20&=20= 0x80;=0A-=09=09c=20<<=3D=201;=0A-=09=20=20=20=20=20=20}=0A-=09=20=20=20=20= else=0A-=09=20=20=20=20=20=20g=20=3D=20pbm_scan_number=20(&p,=20end);=0A= -=0A-=09=20=20=20=20XPutPixel=20(ximg,=20x,=20y,=20g=20?=20fg=20:=20bg);=0A= -=09=20=20}=0A+=20=20=20=20=20=20=20=20for=20(x=20=3D=200;=20x=20<=20= width;=20++x)=0A+=20=20=20=20=20=20=20=20=20=20{=0A+=20=20=20=20=20=20=20= =20=20=20=20=20if=20(raw_p)=0A+=20=20=20=20=20=20=20=20=20=20=20=20=20=20= {=0A+=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20if=20((x=20&=207)=20= =3D=3D=200)=0A+=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20{=0A= +=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20if=20(p=20= >=3D=20end)=0A+=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= =20=20{=0A+=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= =20=20=20x_destroy_x_image=20(ximg);=0A+=20=20=20=20=20=20=20=20=20=20=20= =20=20=20=20=20=20=20=20=20=20=20=20=20x_clear_image=20(f,=20img);=0A+=20= =20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= image_error=20("Invalid=20image=20size=20in=20image=20`%s'",=0A+=20=20=20= =20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= =20=20=20=20=20=20=20=20=20img->spec,=20Qnil);=0A+=20=20=20=20=20=20=20=20= =20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20goto=20error;=0A+=20=20=20= =20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20}=0A+=20=20=20=20= =20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20c=20=3D=20*p++;=0A+=20=20= =20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20}=0A+=20=20=20=20=20=20=20= =20=20=20=20=20=20=20=20=20g=20=3D=20c=20&=200x80;=0A+=20=20=20=20=20=20=20= =20=20=20=20=20=20=20=20=20c=20<<=3D=201;=0A+=20=20=20=20=20=20=20=20=20=20= =20=20=20=20}=0A+=20=20=20=20=20=20=20=20=20=20=20=20else=0A+=20=20=20=20= =20=20=20=20=20=20=20=20=20=20g=20=3D=20pbm_scan_number=20(&p,=20end);=0A= +=0A+=20=20=20=20=20=20=20=20=20=20=20=20XPutPixel=20(ximg,=20x,=20y,=20= g=20?=20fg=20:=20bg);=0A+=20=20=20=20=20=20=20=20=20=20}=0A=20=20=20=20=20= }=0A=20=20=20else=0A=20=20=20=20=20{=0A=20=20=20=20=20=20=20int=20= expected_size=20=3D=20height=20*=20width;=0A=20=20=20=20=20=20=20if=20= (max_color_idx=20>=20255)=0A-=09expected_size=20*=3D=202;=0A+=20=20=20=20= =20=20=20=20expected_size=20*=3D=202;=0A=20=20=20=20=20=20=20if=20(type=20= =3D=3D=20PBM_COLOR)=0A-=09expected_size=20*=3D=203;=0A+=20=20=20=20=20=20= =20=20expected_size=20*=3D=203;=0A=20=0A=20=20=20=20=20=20=20if=20(raw_p=20= &&=20p=20+=20expected_size=20>=20end)=0A-=09{=0A-=09=20=20= x_destroy_x_image=20(ximg);=0A-=09=20=20x_clear_image=20(f,=20img);=0A-=09= =20=20image_error=20("Invalid=20image=20size=20in=20image=20`%s'",=0A-=09= =09=20=20=20=20=20=20=20img->spec,=20Qnil);=0A-=09=20=20goto=20error;=0A= -=09}=0A+=20=20=20=20=20=20=20=20{=0A+=20=20=20=20=20=20=20=20=20=20= x_destroy_x_image=20(ximg);=0A+=20=20=20=20=20=20=20=20=20=20= x_clear_image=20(f,=20img);=0A+=20=20=20=20=20=20=20=20=20=20image_error=20= ("Invalid=20image=20size=20in=20image=20`%s'",=0A+=20=20=20=20=20=20=20=20= =20=20=20=20=20=20=20=20=20=20=20=20=20=20=20img->spec,=20Qnil);=0A+=20=20= =20=20=20=20=20=20=20=20goto=20error;=0A+=20=20=20=20=20=20=20=20}=0A=20=0A= =20=20=20=20=20=20=20for=20(y=20=3D=200;=20y=20<=20height;=20++y)=0A-=09= for=20(x=20=3D=200;=20x=20<=20width;=20++x)=0A-=09=20=20{=0A-=09=20=20=20= =20int=20r,=20g,=20b;=0A-=0A-=09=20=20=20=20if=20(type=20=3D=3D=20= PBM_GRAY=20&&=20raw_p)=0A-=09=20=20=20=20=20=20{=0A-=09=09r=20=3D=20g=20= =3D=20b=20=3D=20*p++;=0A-=09=09if=20(max_color_idx=20>=20255)=0A-=09=09=20= =20r=20=3D=20g=20=3D=20b=20=3D=20r=20*=20256=20+=20*p++;=0A-=09=20=20=20=20= =20=20}=0A-=09=20=20=20=20else=20if=20(type=20=3D=3D=20PBM_GRAY)=0A-=09=20= =20=20=20=20=20r=20=3D=20g=20=3D=20b=20=3D=20pbm_scan_number=20(&p,=20= end);=0A-=09=20=20=20=20else=20if=20(raw_p)=0A-=09=20=20=20=20=20=20{=0A= -=09=09r=20=3D=20*p++;=0A-=09=09if=20(max_color_idx=20>=20255)=0A-=09=09=20= =20r=20=3D=20r=20*=20256=20+=20*p++;=0A-=09=09g=20=3D=20*p++;=0A-=09=09= if=20(max_color_idx=20>=20255)=0A-=09=09=20=20g=20=3D=20g=20*=20256=20+=20= *p++;=0A-=09=09b=20=3D=20*p++;=0A-=09=09if=20(max_color_idx=20>=20255)=0A= -=09=09=20=20b=20=3D=20b=20*=20256=20+=20*p++;=0A-=09=20=20=20=20=20=20}=0A= -=09=20=20=20=20else=0A-=09=20=20=20=20=20=20{=0A-=09=09r=20=3D=20= pbm_scan_number=20(&p,=20end);=0A-=09=09g=20=3D=20pbm_scan_number=20(&p,=20= end);=0A-=09=09b=20=3D=20pbm_scan_number=20(&p,=20end);=0A-=09=20=20=20=20= =20=20}=0A-=0A-=09=20=20=20=20if=20(r=20<=200=20||=20g=20<=200=20||=20b=20= <=200)=0A-=09=20=20=20=20=20=20{=0A-=09=09x_destroy_x_image=20(ximg);=0A= -=09=09image_error=20("Invalid=20pixel=20value=20in=20image=20`%s'",=0A-=09= =09=09=20=20=20=20=20img->spec,=20Qnil);=0A-=09=09goto=20error;=0A-=09=20= =20=20=20=20=20}=0A-=0A-=09=20=20=20=20/*=20RGB=20values=20are=20now=20= in=20the=20range=200..max_color_idx.=0A-=09=20=20=20=20=20=20=20Scale=20= this=20to=20the=20range=200..0xffff=20supported=20by=20X.=20=20*/=0A-=09=20= =20=20=20r=20=3D=20(double)=20r=20*=2065535=20/=20max_color_idx;=0A-=09=20= =20=20=20g=20=3D=20(double)=20g=20*=2065535=20/=20max_color_idx;=0A-=09=20= =20=20=20b=20=3D=20(double)=20b=20*=2065535=20/=20max_color_idx;=0A-=09=20= =20=20=20XPutPixel=20(ximg,=20x,=20y,=20lookup_rgb_color=20(f,=20r,=20g,=20= b));=0A-=09=20=20}=0A+=20=20=20=20=20=20=20=20for=20(x=20=3D=200;=20x=20= <=20width;=20++x)=0A+=20=20=20=20=20=20=20=20=20=20{=0A+=20=20=20=20=20=20= =20=20=20=20=20=20int=20r,=20g,=20b;=0A+=0A+=20=20=20=20=20=20=20=20=20=20= =20=20if=20(type=20=3D=3D=20PBM_GRAY=20&&=20raw_p)=0A+=20=20=20=20=20=20=20= =20=20=20=20=20=20=20{=0A+=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= r=20=3D=20g=20=3D=20b=20=3D=20*p++;=0A+=20=20=20=20=20=20=20=20=20=20=20=20= =20=20=20=20if=20(max_color_idx=20>=20255)=0A+=20=20=20=20=20=20=20=20=20= =20=20=20=20=20=20=20=20=20r=20=3D=20g=20=3D=20b=20=3D=20r=20*=20256=20+=20= *p++;=0A+=20=20=20=20=20=20=20=20=20=20=20=20=20=20}=0A+=20=20=20=20=20=20= =20=20=20=20=20=20else=20if=20(type=20=3D=3D=20PBM_GRAY)=0A+=20=20=20=20=20= =20=20=20=20=20=20=20=20=20r=20=3D=20g=20=3D=20b=20=3D=20pbm_scan_number=20= (&p,=20end);=0A+=20=20=20=20=20=20=20=20=20=20=20=20else=20if=20(raw_p)=0A= +=20=20=20=20=20=20=20=20=20=20=20=20=20=20{=0A+=20=20=20=20=20=20=20=20=20= =20=20=20=20=20=20=20r=20=3D=20*p++;=0A+=20=20=20=20=20=20=20=20=20=20=20= =20=20=20=20=20if=20(max_color_idx=20>=20255)=0A+=20=20=20=20=20=20=20=20= =20=20=20=20=20=20=20=20=20=20r=20=3D=20r=20*=20256=20+=20*p++;=0A+=20=20= =20=20=20=20=20=20=20=20=20=20=20=20=20=20g=20=3D=20*p++;=0A+=20=20=20=20= =20=20=20=20=20=20=20=20=20=20=20=20if=20(max_color_idx=20>=20255)=0A+=20= =20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20g=20=3D=20g=20*=20256=20= +=20*p++;=0A+=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20b=20=3D=20= *p++;=0A+=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20if=20= (max_color_idx=20>=20255)=0A+=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= =20=20=20b=20=3D=20b=20*=20256=20+=20*p++;=0A+=20=20=20=20=20=20=20=20=20= =20=20=20=20=20}=0A+=20=20=20=20=20=20=20=20=20=20=20=20else=0A+=20=20=20= =20=20=20=20=20=20=20=20=20=20=20{=0A+=20=20=20=20=20=20=20=20=20=20=20=20= =20=20=20=20r=20=3D=20pbm_scan_number=20(&p,=20end);=0A+=20=20=20=20=20=20= =20=20=20=20=20=20=20=20=20=20g=20=3D=20pbm_scan_number=20(&p,=20end);=0A= +=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20b=20=3D=20= pbm_scan_number=20(&p,=20end);=0A+=20=20=20=20=20=20=20=20=20=20=20=20=20= =20}=0A+=0A+=20=20=20=20=20=20=20=20=20=20=20=20if=20(r=20<=200=20||=20g=20= <=200=20||=20b=20<=200)=0A+=20=20=20=20=20=20=20=20=20=20=20=20=20=20{=0A= +=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20x_destroy_x_image=20= (ximg);=0A+=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20image_error=20= ("Invalid=20pixel=20value=20in=20image=20`%s'",=0A+=20=20=20=20=20=20=20=20= =20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= img->spec,=20Qnil);=0A+=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= goto=20error;=0A+=20=20=20=20=20=20=20=20=20=20=20=20=20=20}=0A+=0A+=20=20= =20=20=20=20=20=20=20=20=20=20/*=20RGB=20values=20are=20now=20in=20the=20= range=200..max_color_idx.=0A+=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= Scale=20this=20to=20the=20range=200..0xffff=20supported=20by=20X.=20=20= */=0A+=20=20=20=20=20=20=20=20=20=20=20=20r=20=3D=20(double)=20r=20*=20= 65535=20/=20max_color_idx;=0A+=20=20=20=20=20=20=20=20=20=20=20=20g=20=3D=20= (double)=20g=20*=2065535=20/=20max_color_idx;=0A+=20=20=20=20=20=20=20=20= =20=20=20=20b=20=3D=20(double)=20b=20*=2065535=20/=20max_color_idx;=0A+=20= =20=20=20=20=20=20=20=20=20=20=20XPutPixel=20(ximg,=20x,=20y,=20= lookup_rgb_color=20(f,=20r,=20g,=20b));=0A+=20=20=20=20=20=20=20=20=20=20= }=0A=20=20=20=20=20}=0A=20=0A=20#ifdef=20COLOR_TABLE_SUPPORT=0A@@=20= -5432,7=20+5432,7=20@@=20pbm_load=20(struct=20frame=20*f,=20struct=20= image=20*img)=0A=20=0A=20=0C=0A=20= /***********************************************************************=0A= -=09=09=09=09=20PNG=0A+=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= =20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20PNG=0A=20=20= ***********************************************************************/=0A= =20=0A=20#if=20defined=20(HAVE_PNG)=20||=20defined=20(HAVE_NS)=0A@@=20= -5524,21=20+5524,21=20@@=20png_image_p=20(Lisp_Object=20object)=0A=20= DEF_IMGLIB_FN=20(png_voidp,=20png_get_io_ptr,=20(png_structp));=0A=20= DEF_IMGLIB_FN=20(int,=20png_sig_cmp,=20(png_bytep,=20png_size_t,=20= png_size_t));=0A=20DEF_IMGLIB_FN=20(png_structp,=20= png_create_read_struct,=20(png_const_charp,=20png_voidp,=0A-=09=09=09=09=09= =09=20=20=20=20=20png_error_ptr,=20png_error_ptr));=0A+=20=20=20=20=20=20= =20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= =20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= png_error_ptr,=20png_error_ptr));=0A=20DEF_IMGLIB_FN=20(png_infop,=20= png_create_info_struct,=20(png_structp));=0A=20DEF_IMGLIB_FN=20(void,=20= png_destroy_read_struct,=20(png_structpp,=20png_infopp,=20png_infopp));=0A= =20DEF_IMGLIB_FN=20(void,=20png_set_read_fn,=20(png_structp,=20= png_voidp,=20png_rw_ptr));=0A=20DEF_IMGLIB_FN=20(void,=20= png_set_sig_bytes,=20(png_structp,=20int));=0A=20DEF_IMGLIB_FN=20(void,=20= png_read_info,=20(png_structp,=20png_infop));=0A=20DEF_IMGLIB_FN=20= (png_uint_32,=20png_get_IHDR,=20(png_structp,=20png_infop,=0A-=09=09=09=20= =20=20=20=20=20png_uint_32=20*,=20png_uint_32=20*,=0A-=09=09=09=20=20=20=20= =20=20int=20*,=20int=20*,=20int=20*,=20int=20*,=20int=20*));=0A+=20=20=20= =20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= =20=20png_uint_32=20*,=20png_uint_32=20*,=0A+=20=20=20=20=20=20=20=20=20=20= =20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20int=20*,=20= int=20*,=20int=20*,=20int=20*,=20int=20*));=0A=20DEF_IMGLIB_FN=20= (png_uint_32,=20png_get_valid,=20(png_structp,=20png_infop,=20= png_uint_32));=0A=20DEF_IMGLIB_FN=20(void,=20png_set_strip_16,=20= (png_structp));=0A=20DEF_IMGLIB_FN=20(void,=20png_set_expand,=20= (png_structp));=0A=20DEF_IMGLIB_FN=20(void,=20png_set_gray_to_rgb,=20= (png_structp));=0A=20DEF_IMGLIB_FN=20(void,=20png_set_background,=20= (png_structp,=20png_color_16p,=0A-=09=09=09=09=20=20=20=20int,=20int,=20= double));=0A+=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= =20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20int,=20int,=20double));=0A= =20DEF_IMGLIB_FN=20(png_uint_32,=20png_get_bKGD,=20(png_structp,=20= png_infop,=20png_color_16p=20*));=0A=20DEF_IMGLIB_FN=20(void,=20= png_read_update_info,=20(png_structp,=20png_infop));=0A=20DEF_IMGLIB_FN=20= (png_byte,=20png_get_channels,=20(png_structp,=20png_infop));=0A@@=20= -5747,35=20+5747,35=20@@=20png_load_body=20(struct=20frame=20*f,=20= struct=20image=20*img,=20struct=20png_load_context=20*c)=0A=20=20=20=20=20= {=0A=20=20=20=20=20=20=20file=20=3D=20x_find_image_file=20= (specified_file);=0A=20=20=20=20=20=20=20if=20(!STRINGP=20(file))=0A-=09= {=0A-=09=20=20image_error=20("Cannot=20find=20image=20file=20`%s'",=20= specified_file,=20Qnil);=0A-=09=20=20return=200;=0A-=09}=0A+=20=20=20=20=20= =20=20=20{=0A+=20=20=20=20=20=20=20=20=20=20image_error=20("Cannot=20= find=20image=20file=20`%s'",=20specified_file,=20Qnil);=0A+=20=20=20=20=20= =20=20=20=20=20return=200;=0A+=20=20=20=20=20=20=20=20}=0A=20=0A=20=20=20= =20=20=20=20/*=20Open=20the=20image=20file.=20=20*/=0A=20=20=20=20=20=20=20= fp=20=3D=20emacs_fopen=20(SSDATA=20(file),=20"rb");=0A=20=20=20=20=20=20=20= if=20(!fp)=0A-=09{=0A-=09=20=20image_error=20("Cannot=20open=20image=20= file=20`%s'",=20file,=20Qnil);=0A-=09=20=20return=200;=0A-=09}=0A+=20=20=20= =20=20=20=20=20{=0A+=20=20=20=20=20=20=20=20=20=20image_error=20("Cannot=20= open=20image=20file=20`%s'",=20file,=20Qnil);=0A+=20=20=20=20=20=20=20=20= =20=20return=200;=0A+=20=20=20=20=20=20=20=20}=0A=20=0A=20=20=20=20=20=20= =20/*=20Check=20PNG=20signature.=20=20*/=0A=20=20=20=20=20=20=20if=20= (fread=20(sig,=201,=20sizeof=20sig,=20fp)=20!=3D=20sizeof=20sig=0A-=09=20= =20||=20fn_png_sig_cmp=20(sig,=200,=20sizeof=20sig))=0A-=09{=0A-=09=20=20= fclose=20(fp);=0A-=09=20=20image_error=20("Not=20a=20PNG=20file:=20= `%s'",=20file,=20Qnil);=0A-=09=20=20return=200;=0A-=09}=0A+=20=20=20=20=20= =20=20=20=20=20||=20fn_png_sig_cmp=20(sig,=200,=20sizeof=20sig))=0A+=20=20= =20=20=20=20=20=20{=0A+=20=20=20=20=20=20=20=20=20=20fclose=20(fp);=0A+=20= =20=20=20=20=20=20=20=20=20image_error=20("Not=20a=20PNG=20file:=20= `%s'",=20file,=20Qnil);=0A+=20=20=20=20=20=20=20=20=20=20return=200;=0A+=20= =20=20=20=20=20=20=20}=0A=20=20=20=20=20}=0A=20=20=20else=0A=20=20=20=20=20= {=0A=20=20=20=20=20=20=20if=20(!STRINGP=20(specified_data))=0A-=09{=0A-=09= =20=20image_error=20("Invalid=20image=20data=20`%s'",=20specified_data,=20= Qnil);=0A-=09=20=20return=200;=0A-=09}=0A+=20=20=20=20=20=20=20=20{=0A+=20= =20=20=20=20=20=20=20=20=20image_error=20("Invalid=20image=20data=20= `%s'",=20specified_data,=20Qnil);=0A+=20=20=20=20=20=20=20=20=20=20= return=200;=0A+=20=20=20=20=20=20=20=20}=0A=20=0A=20=20=20=20=20=20=20/*=20= Read=20from=20memory.=20=20*/=0A=20=20=20=20=20=20=20tbr.bytes=20=3D=20= SDATA=20(specified_data);=0A@@=20-5784,11=20+5784,11=20@@=20= png_load_body=20(struct=20frame=20*f,=20struct=20image=20*img,=20struct=20= png_load_context=20*c)=0A=20=0A=20=20=20=20=20=20=20/*=20Check=20PNG=20= signature.=20=20*/=0A=20=20=20=20=20=20=20if=20(tbr.len=20<=20sizeof=20= sig=0A-=09=20=20||=20fn_png_sig_cmp=20(tbr.bytes,=200,=20sizeof=20sig))=0A= -=09{=0A-=09=20=20image_error=20("Not=20a=20PNG=20image:=20`%s'",=20= img->spec,=20Qnil);=0A-=09=20=20return=200;=0A-=09}=0A+=20=20=20=20=20=20= =20=20=20=20||=20fn_png_sig_cmp=20(tbr.bytes,=200,=20sizeof=20sig))=0A+=20= =20=20=20=20=20=20=20{=0A+=20=20=20=20=20=20=20=20=20=20image_error=20= ("Not=20a=20PNG=20image:=20`%s'",=20img->spec,=20Qnil);=0A+=20=20=20=20=20= =20=20=20=20=20return=200;=0A+=20=20=20=20=20=20=20=20}=0A=20=0A=20=20=20= =20=20=20=20/*=20Need=20to=20skip=20past=20the=20signature.=20=20*/=0A=20= =20=20=20=20=20=20tbr.bytes=20+=3D=20sizeof=20(sig);=0A@@=20-5796,8=20= +5796,8=20@@=20png_load_body=20(struct=20frame=20*f,=20struct=20image=20= *img,=20struct=20png_load_context=20*c)=0A=20=0A=20=20=20/*=20Initialize=20= read=20and=20info=20structs=20for=20PNG=20lib.=20=20*/=0A=20=20=20= png_ptr=20=3D=20fn_png_create_read_struct=20(PNG_LIBPNG_VER_STRING,=0A-=09= =09=09=09=20=20=20=20=20=20=20NULL,=20my_png_error,=0A-=09=09=09=09=20=20= =20=20=20=20=20my_png_warning);=0A+=20=20=20=20=20=20=20=20=20=20=20=20=20= =20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= =20NULL,=20my_png_error,=0A+=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= =20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= my_png_warning);=0A=20=20=20if=20(png_ptr)=0A=20=20=20=20=20{=0A=20=20=20= =20=20=20=20info_ptr=20=3D=20fn_png_create_info_struct=20(png_ptr);=0A@@=20= -5828,11=20+5828,11=20@@=20png_load_body=20(struct=20frame=20*f,=20= struct=20image=20*img,=20struct=20png_load_context=20*c)=0A=20=20=20=20=20= {=0A=20=20=20=20=20error:=0A=20=20=20=20=20=20=20if=20(c->png_ptr)=0A-=09= fn_png_destroy_read_struct=20(&c->png_ptr,=20&c->info_ptr,=20= &c->end_info);=0A+=20=20=20=20=20=20=20=20fn_png_destroy_read_struct=20= (&c->png_ptr,=20&c->info_ptr,=20&c->end_info);=0A=20=20=20=20=20=20=20= xfree=20(c->pixels);=0A=20=20=20=20=20=20=20xfree=20(c->rows);=0A=20=20=20= =20=20=20=20if=20(c->fp)=0A-=09fclose=20(c->fp);=0A+=20=20=20=20=20=20=20= =20fclose=20(c->fp);=0A=20=20=20=20=20=20=20return=200;=0A=20=20=20=20=20= }=0A=20=0A@@=20-5848,10=20+5848,10=20@@=20png_load_body=20(struct=20= frame=20*f,=20struct=20image=20*img,=20struct=20png_load_context=20*c)=0A= =20=20=20fn_png_set_sig_bytes=20(png_ptr,=20sizeof=20sig);=0A=20=20=20= fn_png_read_info=20(png_ptr,=20info_ptr);=0A=20=20=20fn_png_get_IHDR=20= (png_ptr,=20info_ptr,=20&width,=20&height,=20&bit_depth,=20&color_type,=0A= -=09=09=20=20=20&interlace_type,=20NULL,=20NULL);=0A+=20=20=20=20=20=20=20= =20=20=20=20=20=20=20=20=20=20=20=20&interlace_type,=20NULL,=20NULL);=0A=20= =0A=20=20=20if=20(!=20(width=20<=3D=20INT_MAX=20&&=20height=20<=3D=20= INT_MAX=0A-=09=20&&=20check_image_size=20(f,=20width,=20height)))=0A+=20=20= =20=20=20=20=20=20=20&&=20check_image_size=20(f,=20width,=20height)))=0A=20= =20=20=20=20{=0A=20=20=20=20=20=20=20image_error=20("Invalid=20image=20= size=20(see=20`max-image-size')",=20Qnil,=20Qnil);=0A=20=20=20=20=20=20=20= goto=20error;=0A@@=20-5893,26=20+5893,26=20@@=20png_load_body=20(struct=20= frame=20*f,=20struct=20image=20*img,=20struct=20png_load_context=20*c)=0A= =20=20=20=20=20{=0A=20=20=20=20=20=20=20/*=20png_color_16=20*image_bg;=20= */=0A=20=20=20=20=20=20=20Lisp_Object=20specified_bg=0A-=09=3D=20= image_spec_value=20(img->spec,=20QCbackground,=20NULL);=0A+=20=20=20=20=20= =20=20=20=3D=20image_spec_value=20(img->spec,=20QCbackground,=20NULL);=0A= =20=20=20=20=20=20=20XColor=20color;=0A=20=0A=20=20=20=20=20=20=20/*=20= If=20the=20user=20specified=20a=20color,=20try=20to=20use=20it;=20if=20= not,=20use=20the=0A-=09=20current=20frame=20background,=20ignoring=20any=20= default=20background=0A-=09=20color=20set=20by=20the=20image.=20=20*/=0A= +=20=20=20=20=20=20=20=20=20current=20frame=20background,=20ignoring=20= any=20default=20background=0A+=20=20=20=20=20=20=20=20=20color=20set=20= by=20the=20image.=20=20*/=0A=20=20=20=20=20=20=20if=20(STRINGP=20= (specified_bg)=0A-=09=20=20?=20x_defined_color=20(f,=20SSDATA=20= (specified_bg),=20&color,=20false)=0A-=09=20=20:=20= (x_query_frame_background_color=20(f,=20&color),=20true))=0A-=09/*=20The=20= user=20specified=20`:background',=20use=20that.=20=20*/=0A-=09{=0A-=09=20= =20int=20shift=20=3D=20bit_depth=20=3D=3D=2016=20?=200=20:=208;=0A-=09=20= =20png_color_16=20bg=20=3D=20{=200=20};=0A-=09=20=20bg.red=20=3D=20= color.red=20>>=20shift;=0A-=09=20=20bg.green=20=3D=20color.green=20>>=20= shift;=0A-=09=20=20bg.blue=20=3D=20color.blue=20>>=20shift;=0A-=0A-=09=20= =20fn_png_set_background=20(png_ptr,=20&bg,=0A-=09=09=09=09=20= PNG_BACKGROUND_GAMMA_SCREEN,=200,=201.0);=0A-=09}=0A+=20=20=20=20=20=20=20= =20=20=20?=20x_defined_color=20(f,=20SSDATA=20(specified_bg),=20&color,=20= false)=0A+=20=20=20=20=20=20=20=20=20=20:=20= (x_query_frame_background_color=20(f,=20&color),=20true))=0A+=20=20=20=20= =20=20=20=20/*=20The=20user=20specified=20`:background',=20use=20that.=20= =20*/=0A+=20=20=20=20=20=20=20=20{=0A+=20=20=20=20=20=20=20=20=20=20int=20= shift=20=3D=20bit_depth=20=3D=3D=2016=20?=200=20:=208;=0A+=20=20=20=20=20= =20=20=20=20=20png_color_16=20bg=20=3D=20{=200=20};=0A+=20=20=20=20=20=20= =20=20=20=20bg.red=20=3D=20color.red=20>>=20shift;=0A+=20=20=20=20=20=20=20= =20=20=20bg.green=20=3D=20color.green=20>>=20shift;=0A+=20=20=20=20=20=20= =20=20=20=20bg.blue=20=3D=20color.blue=20>>=20shift;=0A+=0A+=20=20=20=20=20= =20=20=20=20=20fn_png_set_background=20(png_ptr,=20&bg,=0A+=20=20=20=20=20= =20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= =20=20=20PNG_BACKGROUND_GAMMA_SCREEN,=200,=201.0);=0A+=20=20=20=20=20=20=20= =20}=0A=20=20=20=20=20}=0A=20=0A=20=20=20/*=20Update=20info=20structure.=20= =20*/=0A@@=20-5952,7=20+5952,7=20@@=20png_load_body=20(struct=20frame=20= *f,=20struct=20image=20*img,=20struct=20png_load_context=20*c)=0A=20=20=20= if=20(channels=20=3D=3D=204=0A=20=20=20=20=20=20=20&&=20!transparent_p=0A= =20=20=20=20=20=20=20&&=20!image_create_x_image_and_pixmap=20(f,=20img,=20= width,=20height,=201,=0A-=09=09=09=09=09=20=20=20&mask_img,=201))=0A+=20=20= =20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= =20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20&mask_img,=201))=0A=20=20= =20=20=20{=0A=20=20=20=20=20=20=20x_destroy_x_image=20(ximg);=0A=20=20=20= =20=20=20=20x_clear_image_1=20(f,=20img,=20CLEAR_IMAGE_PIXMAP);=0A@@=20= -5967,36=20+5967,36=20@@=20png_load_body=20(struct=20frame=20*f,=20= struct=20image=20*img,=20struct=20png_load_context=20*c)=0A=20=20=20=20=20= =20=20png_byte=20*p=20=3D=20rows[y];=0A=20=0A=20=20=20=20=20=20=20for=20= (x=20=3D=200;=20x=20<=20width;=20++x)=0A-=09{=0A-=09=20=20int=20r,=20g,=20= b;=0A-=0A-=09=20=20r=20=3D=20*p++=20<<=208;=0A-=09=20=20g=20=3D=20*p++=20= <<=208;=0A-=09=20=20b=20=3D=20*p++=20<<=208;=0A-=09=20=20XPutPixel=20= (ximg,=20x,=20y,=20lookup_rgb_color=20(f,=20r,=20g,=20b));=0A-=09=20=20= /*=20An=20alpha=20channel,=20aka=20mask=20channel,=20associates=20= variable=0A-=09=20=20=20=20=20transparency=20with=20an=20image.=20=20= Where=20other=20image=20formats=0A-=09=20=20=20=20=20support=20binary=20= transparency---fully=20transparent=20or=20fully=0A-=09=20=20=20=20=20= opaque---PNG=20allows=20up=20to=20254=20levels=20of=20partial=20= transparency.=0A-=09=20=20=20=20=20The=20PNG=20library=20implements=20= partial=20transparency=20by=20combining=0A-=09=20=20=20=20=20the=20image=20= with=20a=20specified=20background=20color.=0A-=0A-=09=20=20=20=20=20I'm=20= not=20sure=20how=20to=20handle=20this=20here=20nicely:=20because=20the=0A= -=09=20=20=20=20=20background=20on=20which=20the=20image=20is=20= displayed=20may=20change,=20for=0A-=09=20=20=20=20=20real=20alpha=20= channel=20support,=20it=20would=20be=20necessary=20to=20create=0A-=09=20=20= =20=20=20a=20new=20image=20for=20each=20possible=20background.=0A-=0A-=09= =20=20=20=20=20What=20I'm=20doing=20now=20is=20that=20a=20mask=20is=20= created=20if=20we=20have=0A-=09=20=20=20=20=20boolean=20transparency=20= information.=20=20Otherwise=20I'm=20using=0A-=09=20=20=20=20=20the=20= frame's=20background=20color=20to=20combine=20the=20image=20with.=20=20= */=0A-=0A-=09=20=20if=20(channels=20=3D=3D=204)=0A-=09=20=20=20=20{=0A-=09= =20=20=20=20=20=20if=20(mask_img)=0A-=09=09XPutPixel=20(mask_img,=20x,=20= y,=20*p=20>=200=20?=20PIX_MASK_DRAW=20:=20PIX_MASK_RETAIN);=0A-=09=20=20=20= =20=20=20++p;=0A-=09=20=20=20=20}=0A-=09}=0A+=20=20=20=20=20=20=20=20{=0A= +=20=20=20=20=20=20=20=20=20=20int=20r,=20g,=20b;=0A+=0A+=20=20=20=20=20=20= =20=20=20=20r=20=3D=20*p++=20<<=208;=0A+=20=20=20=20=20=20=20=20=20=20g=20= =3D=20*p++=20<<=208;=0A+=20=20=20=20=20=20=20=20=20=20b=20=3D=20*p++=20= <<=208;=0A+=20=20=20=20=20=20=20=20=20=20XPutPixel=20(ximg,=20x,=20y,=20= lookup_rgb_color=20(f,=20r,=20g,=20b));=0A+=20=20=20=20=20=20=20=20=20=20= /*=20An=20alpha=20channel,=20aka=20mask=20channel,=20associates=20= variable=0A+=20=20=20=20=20=20=20=20=20=20=20=20=20transparency=20with=20= an=20image.=20=20Where=20other=20image=20formats=0A+=20=20=20=20=20=20=20= =20=20=20=20=20=20support=20binary=20transparency---fully=20transparent=20= or=20fully=0A+=20=20=20=20=20=20=20=20=20=20=20=20=20opaque---PNG=20= allows=20up=20to=20254=20levels=20of=20partial=20transparency.=0A+=20=20=20= =20=20=20=20=20=20=20=20=20=20The=20PNG=20library=20implements=20partial=20= transparency=20by=20combining=0A+=20=20=20=20=20=20=20=20=20=20=20=20=20= the=20image=20with=20a=20specified=20background=20color.=0A+=0A+=20=20=20= =20=20=20=20=20=20=20=20=20=20I'm=20not=20sure=20how=20to=20handle=20= this=20here=20nicely:=20because=20the=0A+=20=20=20=20=20=20=20=20=20=20=20= =20=20background=20on=20which=20the=20image=20is=20displayed=20may=20= change,=20for=0A+=20=20=20=20=20=20=20=20=20=20=20=20=20real=20alpha=20= channel=20support,=20it=20would=20be=20necessary=20to=20create=0A+=20=20=20= =20=20=20=20=20=20=20=20=20=20a=20new=20image=20for=20each=20possible=20= background.=0A+=0A+=20=20=20=20=20=20=20=20=20=20=20=20=20What=20I'm=20= doing=20now=20is=20that=20a=20mask=20is=20created=20if=20we=20have=0A+=20= =20=20=20=20=20=20=20=20=20=20=20=20boolean=20transparency=20= information.=20=20Otherwise=20I'm=20using=0A+=20=20=20=20=20=20=20=20=20=20= =20=20=20the=20frame's=20background=20color=20to=20combine=20the=20image=20= with.=20=20*/=0A+=0A+=20=20=20=20=20=20=20=20=20=20if=20(channels=20=3D=3D= =204)=0A+=20=20=20=20=20=20=20=20=20=20=20=20{=0A+=20=20=20=20=20=20=20=20= =20=20=20=20=20=20if=20(mask_img)=0A+=20=20=20=20=20=20=20=20=20=20=20=20= =20=20=20=20XPutPixel=20(mask_img,=20x,=20y,=20*p=20>=200=20?=20= PIX_MASK_DRAW=20:=20PIX_MASK_RETAIN);=0A+=20=20=20=20=20=20=20=20=20=20=20= =20=20=20++p;=0A+=20=20=20=20=20=20=20=20=20=20=20=20}=0A+=20=20=20=20=20= =20=20=20}=0A=20=20=20=20=20}=0A=20=0A=20=20=20if=20(NILP=20= (image_spec_value=20(img->spec,=20QCbackground,=20NULL)))=0A@@=20= -6005,10=20+6005,10=20@@=20png_load_body=20(struct=20frame=20*f,=20= struct=20image=20*img,=20struct=20png_load_context=20*c)=0A=20=20=20=20=20= {=0A=20=20=20=20=20=20=20png_color_16=20*bg;=0A=20=20=20=20=20=20=20if=20= (fn_png_get_bKGD=20(png_ptr,=20info_ptr,=20&bg))=0A-=09{=0A-=09=20=20= img->background=20=3D=20lookup_rgb_color=20(f,=20bg->red,=20bg->green,=20= bg->blue);=0A-=09=20=20img->background_valid=20=3D=201;=0A-=09}=0A+=20=20= =20=20=20=20=20=20{=0A+=20=20=20=20=20=20=20=20=20=20img->background=20=3D= =20lookup_rgb_color=20(f,=20bg->red,=20bg->green,=20bg->blue);=0A+=20=20=20= =20=20=20=20=20=20=20img->background_valid=20=3D=201;=0A+=20=20=20=20=20=20= =20=20}=0A=20=20=20=20=20}=0A=20=0A=20#ifdef=20COLOR_TABLE_SUPPORT=0A@@=20= -6036,7=20+6036,7=20@@=20png_load_body=20(struct=20frame=20*f,=20struct=20= image=20*img,=20struct=20png_load_context=20*c)=0A=20=20=20if=20= (mask_img)=0A=20=20=20=20=20{=0A=20=20=20=20=20=20=20/*=20Fill=20in=20= the=20background_transparent=20field=20while=20we=20have=20the=0A-=09=20= mask=20handy.=20=20Casting=20avoids=20a=20GCC=20warning.=20=20*/=0A+=20=20= =20=20=20=20=20=20=20mask=20handy.=20=20Casting=20avoids=20a=20GCC=20= warning.=20=20*/=0A=20=20=20=20=20=20=20image_background_transparent=20= (img,=20f,=20(XImagePtr_or_DC)mask_img);=0A=20=0A=20=20=20=20=20=20=20= image_put_x_image=20(f,=20img,=20mask_img,=201);=0A@@=20-6067,7=20= +6067,7=20@@=20png_load=20(struct=20frame=20*f,=20struct=20image=20*img)=0A= =20=0A=20=0C=0A=20= /***********************************************************************=0A= -=09=09=09=09=20JPEG=0A+=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= =20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20JPEG=0A=20=20= ***********************************************************************/=0A= =20=0A=20#if=20defined=20(HAVE_JPEG)=20||=20defined=20(HAVE_NS)=0A@@=20= -6312,7=20+6312,7=20@@=20our_memory_skip_input_data=20(j_decompress_ptr=20= cinfo,=20long=20int=20num_bytes)=0A=20=20=20if=20(src)=0A=20=20=20=20=20= {=0A=20=20=20=20=20=20=20if=20(num_bytes=20>=20src->bytes_in_buffer)=0A-=09= ERREXIT=20(cinfo,=20JERR_INPUT_EOF);=0A+=20=20=20=20=20=20=20=20ERREXIT=20= (cinfo,=20JERR_INPUT_EOF);=0A=20=0A=20=20=20=20=20=20=20= src->bytes_in_buffer=20-=3D=20num_bytes;=0A=20=20=20=20=20=20=20= src->next_input_byte=20+=3D=20num_bytes;=0A@@=20-6333,7=20+6333,7=20@@=20= jpeg_memory_src=20(j_decompress_ptr=20cinfo,=20JOCTET=20*data,=20= ptrdiff_t=20len)=0A=20=20=20=20=20{=0A=20=20=20=20=20=20=20/*=20First=20= time=20for=20this=20JPEG=20object?=20=20*/=0A=20=20=20=20=20=20=20src=20= =3D=20cinfo->mem->alloc_small=20((j_common_ptr)=20cinfo,=0A-=09=09=09=09=20= =20=20=20=20JPOOL_PERMANENT,=20sizeof=20*src);=0A+=20=20=20=20=20=20=20=20= =20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= =20=20=20=20JPOOL_PERMANENT,=20sizeof=20*src);=0A=20=20=20=20=20=20=20= cinfo->src=20=3D=20src;=0A=20=20=20=20=20=20=20src->next_input_byte=20=3D=20= data;=0A=20=20=20=20=20}=0A@@=20-6435,11=20+6435,11=20@@=20jpeg_file_src=20= (j_decompress_ptr=20cinfo,=20FILE=20*fp)=0A=20=20=20=20=20{=0A=20=20=20=20= =20=20=20/*=20First=20time=20for=20this=20JPEG=20object?=20=20*/=0A=20=20= =20=20=20=20=20src=20=3D=20cinfo->mem->alloc_small=20((j_common_ptr)=20= cinfo,=0A-=09=09=09=09=20=20=20=20=20JPOOL_PERMANENT,=20sizeof=20*src);=0A= +=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= =20=20=20=20=20=20=20=20=20=20=20=20=20JPOOL_PERMANENT,=20sizeof=20= *src);=0A=20=20=20=20=20=20=20cinfo->src=20=3D=20(struct=20= jpeg_source_mgr=20*)=20src;=0A=20=20=20=20=20=20=20src->buffer=20=3D=20= cinfo->mem->alloc_small=20((j_common_ptr)=20cinfo,=0A-=09=09=09=09=09=20=20= =20=20=20JPOOL_PERMANENT,=0A-=09=09=09=09=09=20=20=20=20=20= JPEG_STDIO_BUFFER_SIZE);=0A+=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= =20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= =20=20=20=20=20JPOOL_PERMANENT,=0A+=20=20=20=20=20=20=20=20=20=20=20=20=20= =20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= =20=20=20=20=20=20=20JPEG_STDIO_BUFFER_SIZE);=0A=20=20=20=20=20}=0A=20=0A= =20=20=20src->file=20=3D=20fp;=0A@@=20-6459,7=20+6459,7=20@@=20= jpeg_file_src=20(j_decompress_ptr=20cinfo,=20FILE=20*fp)=0A=20=0A=20= static=20bool=0A=20jpeg_load_body=20(struct=20frame=20*f,=20struct=20= image=20*img,=0A-=09=09struct=20my_jpeg_error_mgr=20*mgr)=0A+=20=20=20=20= =20=20=20=20=20=20=20=20=20=20=20=20struct=20my_jpeg_error_mgr=20*mgr)=0A= =20{=0A=20=20=20Lisp_Object=20file,=20specified_file;=0A=20=20=20= Lisp_Object=20specified_data;=0A@@=20-6479,17=20+6479,17=20@@=20= jpeg_load_body=20(struct=20frame=20*f,=20struct=20image=20*img,=0A=20=20=20= =20=20{=0A=20=20=20=20=20=20=20file=20=3D=20x_find_image_file=20= (specified_file);=0A=20=20=20=20=20=20=20if=20(!STRINGP=20(file))=0A-=09= {=0A-=09=20=20image_error=20("Cannot=20find=20image=20file=20`%s'",=20= specified_file,=20Qnil);=0A-=09=20=20return=200;=0A-=09}=0A+=20=20=20=20=20= =20=20=20{=0A+=20=20=20=20=20=20=20=20=20=20image_error=20("Cannot=20= find=20image=20file=20`%s'",=20specified_file,=20Qnil);=0A+=20=20=20=20=20= =20=20=20=20=20return=200;=0A+=20=20=20=20=20=20=20=20}=0A=20=0A=20=20=20= =20=20=20=20fp=20=3D=20emacs_fopen=20(SSDATA=20(file),=20"rb");=0A=20=20=20= =20=20=20=20if=20(fp=20=3D=3D=20NULL)=0A-=09{=0A-=09=20=20image_error=20= ("Cannot=20open=20`%s'",=20file,=20Qnil);=0A-=09=20=20return=200;=0A-=09= }=0A+=20=20=20=20=20=20=20=20{=0A+=20=20=20=20=20=20=20=20=20=20= image_error=20("Cannot=20open=20`%s'",=20file,=20Qnil);=0A+=20=20=20=20=20= =20=20=20=20=20return=200;=0A+=20=20=20=20=20=20=20=20}=0A=20=20=20=20=20= }=0A=20=20=20else=20if=20(!STRINGP=20(specified_data))=0A=20=20=20=20=20= {=0A@@=20-6504,27=20+6504,27=20@@=20jpeg_load_body=20(struct=20frame=20= *f,=20struct=20image=20*img,=0A=20=20=20if=20(sys_setjmp=20= (mgr->setjmp_buffer))=0A=20=20=20=20=20{=0A=20=20=20=20=20=20=20switch=20= (mgr->failure_code)=0A-=09{=0A-=09case=20MY_JPEG_ERROR_EXIT:=0A-=09=20=20= {=0A-=09=20=20=20=20char=20buf[JMSG_LENGTH_MAX];=0A-=09=20=20=20=20= mgr->cinfo.err->format_message=20((j_common_ptr)=20&mgr->cinfo,=20buf);=0A= -=09=20=20=20=20image_error=20("Error=20reading=20JPEG=20image=20`%s':=20= %s",=20img->spec,=0A-=09=09=09=20build_string=20(buf));=0A-=09=20=20=20=20= break;=0A-=09=20=20}=0A-=0A-=09case=20MY_JPEG_INVALID_IMAGE_SIZE:=0A-=09=20= =20image_error=20("Invalid=20image=20size=20(see=20`max-image-size')",=20= Qnil,=20Qnil);=0A-=09=20=20break;=0A-=0A-=09case=20= MY_JPEG_CANNOT_CREATE_X:=0A-=09=20=20break;=0A-=09}=0A+=20=20=20=20=20=20= =20=20{=0A+=20=20=20=20=20=20=20=20case=20MY_JPEG_ERROR_EXIT:=0A+=20=20=20= =20=20=20=20=20=20=20{=0A+=20=20=20=20=20=20=20=20=20=20=20=20char=20= buf[JMSG_LENGTH_MAX];=0A+=20=20=20=20=20=20=20=20=20=20=20=20= mgr->cinfo.err->format_message=20((j_common_ptr)=20&mgr->cinfo,=20buf);=0A= +=20=20=20=20=20=20=20=20=20=20=20=20image_error=20("Error=20reading=20= JPEG=20image=20`%s':=20%s",=20img->spec,=0A+=20=20=20=20=20=20=20=20=20=20= =20=20=20=20=20=20=20=20=20=20=20=20=20=20=20build_string=20(buf));=0A+=20= =20=20=20=20=20=20=20=20=20=20=20break;=0A+=20=20=20=20=20=20=20=20=20=20= }=0A+=0A+=20=20=20=20=20=20=20=20case=20MY_JPEG_INVALID_IMAGE_SIZE:=0A+=20= =20=20=20=20=20=20=20=20=20image_error=20("Invalid=20image=20size=20(see=20= `max-image-size')",=20Qnil,=20Qnil);=0A+=20=20=20=20=20=20=20=20=20=20= break;=0A+=0A+=20=20=20=20=20=20=20=20case=20MY_JPEG_CANNOT_CREATE_X:=0A= +=20=20=20=20=20=20=20=20=20=20break;=0A+=20=20=20=20=20=20=20=20}=0A=20=0A= =20=20=20=20=20=20=20/*=20Close=20the=20input=20file=20and=20destroy=20= the=20JPEG=20object.=20=20*/=0A=20=20=20=20=20=20=20if=20(fp)=0A-=09= fclose=20(fp);=0A+=20=20=20=20=20=20=20=20fclose=20(fp);=0A=20=20=20=20=20= =20=20fn_jpeg_destroy_decompress=20(&mgr->cinfo);=0A=20=0A=20=20=20=20=20= =20=20/*=20If=20we=20already=20have=20an=20XImage,=20free=20that.=20=20= */=0A@@=20-6536,19=20+6536,19=20@@=20jpeg_load_body=20(struct=20frame=20= *f,=20struct=20image=20*img,=0A=20=20=20=20=20}=0A=20=0A=20=20=20/*=20= Create=20the=20JPEG=20decompression=20object.=20=20Let=20it=20read=20= from=20fp.=0A-=09=20Read=20the=20JPEG=20image=20header.=20=20*/=0A+=20=20= =20=20=20=20=20=20=20Read=20the=20JPEG=20image=20header.=20=20*/=0A=20=20= =20fn_jpeg_CreateDecompress=20(&mgr->cinfo,=20JPEG_LIB_VERSION,=20sizeof=20= *&mgr->cinfo);=0A=20=0A=20=20=20if=20(NILP=20(specified_data))=0A=20=20=20= =20=20jpeg_file_src=20(&mgr->cinfo,=20fp);=0A=20=20=20else=0A=20=20=20=20= =20jpeg_memory_src=20(&mgr->cinfo,=20SDATA=20(specified_data),=0A-=09=09=20= =20=20=20=20SBYTES=20(specified_data));=0A+=20=20=20=20=20=20=20=20=20=20= =20=20=20=20=20=20=20=20=20=20=20SBYTES=20(specified_data));=0A=20=0A=20=20= =20fn_jpeg_read_header=20(&mgr->cinfo,=201);=0A=20=0A=20=20=20/*=20= Customize=20decompression=20so=20that=20color=20quantization=20will=20be=20= used.=0A-=09=20Start=20decompression.=20=20*/=0A+=20=20=20=20=20=20=20=20= =20Start=20decompression.=20=20*/=0A=20=20=20mgr->cinfo.quantize_colors=20= =3D=201;=0A=20=20=20fn_jpeg_start_decompress=20(&mgr->cinfo);=0A=20=20=20= width=20=3D=20img->width=20=3D=20mgr->cinfo.output_width;=0A@@=20= -6591,12=20+6591,12=20@@=20jpeg_load_body=20(struct=20frame=20*f,=20= struct=20image=20*img,=0A=20=0A=20=20=20=20=20for=20(i=20=3D=200;=20i=20= <=20mgr->cinfo.actual_number_of_colors;=20++i)=0A=20=20=20=20=20=20=20{=0A= -=09/*=20Multiply=20RGB=20values=20with=20255=20because=20X=20expects=20= RGB=20values=0A-=09=20=20=20in=20the=20range=200..0xffff.=20=20*/=0A-=09= int=20r=20=3D=20mgr->cinfo.colormap[ir][i]=20<<=208;=0A-=09int=20g=20=3D=20= mgr->cinfo.colormap[ig][i]=20<<=208;=0A-=09int=20b=20=3D=20= mgr->cinfo.colormap[ib][i]=20<<=208;=0A-=09colors[i]=20=3D=20= lookup_rgb_color=20(f,=20r,=20g,=20b);=0A+=20=20=20=20=20=20=20=20/*=20= Multiply=20RGB=20values=20with=20255=20because=20X=20expects=20RGB=20= values=0A+=20=20=20=20=20=20=20=20=20=20=20in=20the=20range=200..0xffff.=20= =20*/=0A+=20=20=20=20=20=20=20=20int=20r=20=3D=20= mgr->cinfo.colormap[ir][i]=20<<=208;=0A+=20=20=20=20=20=20=20=20int=20g=20= =3D=20mgr->cinfo.colormap[ig][i]=20<<=208;=0A+=20=20=20=20=20=20=20=20= int=20b=20=3D=20mgr->cinfo.colormap[ib][i]=20<<=208;=0A+=20=20=20=20=20=20= =20=20colors[i]=20=3D=20lookup_rgb_color=20(f,=20r,=20g,=20b);=0A=20=20=20= =20=20=20=20}=0A=20=0A=20#ifdef=20COLOR_TABLE_SUPPORT=0A@@=20-6609,12=20= +6609,12=20@@=20jpeg_load_body=20(struct=20frame=20*f,=20struct=20image=20= *img,=0A=20=20=20/*=20Read=20pixels.=20=20*/=0A=20=20=20row_stride=20=3D=20= width=20*=20mgr->cinfo.output_components;=0A=20=20=20buffer=20=3D=20= mgr->cinfo.mem->alloc_sarray=20((j_common_ptr)=20&mgr->cinfo,=0A-=09=09=09= =09=09=20JPOOL_IMAGE,=20row_stride,=201);=0A+=20=20=20=20=20=20=20=20=20=20= =20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= =20=20=20=20=20=20JPOOL_IMAGE,=20row_stride,=201);=0A=20=20=20for=20(y=20= =3D=200;=20y=20<=20height;=20++y)=0A=20=20=20=20=20{=0A=20=20=20=20=20=20= =20fn_jpeg_read_scanlines=20(&mgr->cinfo,=20buffer,=201);=0A=20=20=20=20=20= =20=20for=20(x=20=3D=200;=20x=20<=20mgr->cinfo.output_width;=20++x)=0A-=09= XPutPixel=20(ximg,=20x,=20y,=20colors[buffer[0][x]]);=0A+=20=20=20=20=20=20= =20=20XPutPixel=20(ximg,=20x,=20y,=20colors[buffer[0][x]]);=0A=20=20=20=20= =20}=0A=20=0A=20=20=20/*=20Clean=20up.=20=20*/=0A@@=20-6647,8=20+6647,8=20= @@=20static=20bool=0A=20jpeg_load=20(struct=20frame=20*f,=20struct=20= image=20*img)=0A=20{=0A=20=20=20return=20ns_load_image=20(f,=20img,=0A-=09= =09=09image_spec_value=20(img->spec,=20QCfile,=20NULL),=0A-=09=09=09= image_spec_value=20(img->spec,=20QCdata,=20NULL));=0A+=20=20=20=20=20=20=20= =20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20image_spec_value=20= (img->spec,=20QCfile,=20NULL),=0A+=20=20=20=20=20=20=20=20=20=20=20=20=20= =20=20=20=20=20=20=20=20=20=20=20image_spec_value=20(img->spec,=20= QCdata,=20NULL));=0A=20}=0A=20#endif=20=20/*=20HAVE_NS=20*/=0A=20=0A@@=20= -6657,7=20+6657,7=20@@=20jpeg_load=20(struct=20frame=20*f,=20struct=20= image=20*img)=0A=20=0A=20=0C=0A=20= /***********************************************************************=0A= -=09=09=09=09=20TIFF=0A+=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= =20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20TIFF=0A=20=20= ***********************************************************************/=0A= =20=0A=20#if=20defined=20(HAVE_TIFF)=20||=20defined=20(HAVE_NS)=0A@@=20= -6751,9=20+6751,9=20@@=20DEF_IMGLIB_FN=20(TIFFErrorHandler,=20= TIFFSetErrorHandler,=20(TIFFErrorHandler));=0A=20DEF_IMGLIB_FN=20= (TIFFErrorHandler,=20TIFFSetWarningHandler,=20(TIFFErrorHandler));=0A=20= DEF_IMGLIB_FN=20(TIFF=20*,=20TIFFOpen,=20(const=20char=20*,=20const=20= char=20*));=0A=20DEF_IMGLIB_FN=20(TIFF=20*,=20TIFFClientOpen,=20(const=20= char=20*,=20const=20char=20*,=20thandle_t,=0A-=09=09=09=09= TIFFReadWriteProc,=20TIFFReadWriteProc,=0A-=09=09=09=09TIFFSeekProc,=20= TIFFCloseProc,=20TIFFSizeProc,=0A-=09=09=09=09TIFFMapFileProc,=20= TIFFUnmapFileProc));=0A+=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= =20=20=20=20=20=20=20=20=20=20=20=20=20=20=20TIFFReadWriteProc,=20= TIFFReadWriteProc,=0A+=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= =20=20=20=20=20=20=20=20=20=20=20=20=20=20=20TIFFSeekProc,=20= TIFFCloseProc,=20TIFFSizeProc,=0A+=20=20=20=20=20=20=20=20=20=20=20=20=20= =20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= TIFFMapFileProc,=20TIFFUnmapFileProc));=0A=20DEF_IMGLIB_FN=20(int,=20= TIFFGetField,=20(TIFF=20*,=20ttag_t,=20...));=0A=20DEF_IMGLIB_FN=20(int,=20= TIFFReadRGBAImage,=20(TIFF=20*,=20uint32,=20uint32,=20uint32=20*,=20= int));=0A=20DEF_IMGLIB_FN=20(void,=20TIFFClose,=20(TIFF=20*));=0A@@=20= -6897,7=20+6897,7=20@@=20tiff_handler=20(const=20char=20*,=20const=20= char=20*,=20const=20char=20*,=20va_list)=0A=20=20=20= ATTRIBUTE_FORMAT_PRINTF=20(3,=200);=0A=20MINGW_STATIC=20void=0A=20= tiff_handler=20(const=20char=20*log_format,=20const=20char=20*title,=0A-=09= =20=20=20=20=20=20const=20char=20*format,=20va_list=20ap)=0A+=20=20=20=20= =20=20=20=20=20=20=20=20=20=20const=20char=20*format,=20va_list=20ap)=0A=20= {=0A=20=20=20/*=20doprnt=20is=20not=20suitable=20here,=20as=20TIFF=20= handlers=20are=20called=20from=0A=20=20=20=20=20=20libtiff=20and=20are=20= passed=20arbitrary=20printf=20directives.=20=20Instead,=20use=0A@@=20= -6907,7=20+6907,7=20@@=20tiff_handler=20(const=20char=20*log_format,=20= const=20char=20*title,=0A=20=20=20char=20buf[4000];=0A=20=20=20int=20len=20= =3D=20vsnprintf=20(buf,=20sizeof=20buf,=20format,=20ap);=0A=20=20=20= add_to_log=20(log_format,=20build_string=20(title),=0A-=09=20=20=20=20=20= =20make_string=20(buf,=20max=20(0,=20min=20(len,=20sizeof=20buf=20-=20= 1))));=0A+=20=20=20=20=20=20=20=20=20=20=20=20=20=20make_string=20(buf,=20= max=20(0,=20min=20(len,=20sizeof=20buf=20-=201))));=0A=20}=0A=20#undef=20= MINGW_STATIC=0A=20=0A@@=20-6956,10=20+6956,10=20@@=20tiff_load=20(struct=20= frame=20*f,=20struct=20image=20*img)=0A=20=20=20=20=20=20=20/*=20Read=20= from=20a=20file=20*/=0A=20=20=20=20=20=20=20file=20=3D=20= x_find_image_file=20(specified_file);=0A=20=20=20=20=20=20=20if=20= (!STRINGP=20(file))=0A-=09{=0A-=09=20=20image_error=20("Cannot=20find=20= image=20file=20`%s'",=20specified_file,=20Qnil);=0A-=09=20=20return=200;=0A= -=09}=0A+=20=20=20=20=20=20=20=20{=0A+=20=20=20=20=20=20=20=20=20=20= image_error=20("Cannot=20find=20image=20file=20`%s'",=20specified_file,=20= Qnil);=0A+=20=20=20=20=20=20=20=20=20=20return=200;=0A+=20=20=20=20=20=20= =20=20}=0A=20#ifdef=20WINDOWSNT=0A=20=20=20=20=20=20=20file=20=3D=20= ansi_encode_filename=20(file);=0A=20#endif=0A@@=20-6967,18=20+6967,18=20= @@=20tiff_load=20(struct=20frame=20*f,=20struct=20image=20*img)=0A=20=20=20= =20=20=20=20/*=20Try=20to=20open=20the=20image=20file.=20=20*/=0A=20=20=20= =20=20=20=20tiff=20=3D=20fn_TIFFOpen=20(SSDATA=20(file),=20"r");=0A=20=20= =20=20=20=20=20if=20(tiff=20=3D=3D=20NULL)=0A-=09{=0A-=09=20=20= image_error=20("Cannot=20open=20`%s'",=20file,=20Qnil);=0A-=09=20=20= return=200;=0A-=09}=0A+=20=20=20=20=20=20=20=20{=0A+=20=20=20=20=20=20=20= =20=20=20image_error=20("Cannot=20open=20`%s'",=20file,=20Qnil);=0A+=20=20= =20=20=20=20=20=20=20=20return=200;=0A+=20=20=20=20=20=20=20=20}=0A=20=20= =20=20=20}=0A=20=20=20else=0A=20=20=20=20=20{=0A=20=20=20=20=20=20=20if=20= (!STRINGP=20(specified_data))=0A-=09{=0A-=09=20=20image_error=20= ("Invalid=20image=20data=20`%s'",=20specified_data,=20Qnil);=0A-=09=20=20= return=200;=0A-=09}=0A+=20=20=20=20=20=20=20=20{=0A+=20=20=20=20=20=20=20= =20=20=20image_error=20("Invalid=20image=20data=20`%s'",=20= specified_data,=20Qnil);=0A+=20=20=20=20=20=20=20=20=20=20return=200;=0A= +=20=20=20=20=20=20=20=20}=0A=20=0A=20=20=20=20=20=20=20/*=20Memory=20= source!=20*/=0A=20=20=20=20=20=20=20memsrc.bytes=20=3D=20SDATA=20= (specified_data);=0A@@=20-6986,19=20+6986,19=20@@=20tiff_load=20(struct=20= frame=20*f,=20struct=20image=20*img)=0A=20=20=20=20=20=20=20memsrc.index=20= =3D=200;=0A=20=0A=20=20=20=20=20=20=20tiff=20=3D=20fn_TIFFClientOpen=20= ("memory_source",=20"r",=20(thandle_t)&memsrc,=0A-=09=09=09=09= tiff_read_from_memory,=0A-=09=09=09=09tiff_write_from_memory,=0A-=09=09=09= =09tiff_seek_in_memory,=0A-=09=09=09=09tiff_close_memory,=0A-=09=09=09=09= tiff_size_of_memory,=0A-=09=09=09=09tiff_mmap_memory,=0A-=09=09=09=09= tiff_unmap_memory);=0A+=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= =20=20=20=20=20=20=20=20=20=20=20=20=20=20=20tiff_read_from_memory,=0A+=20= =20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= =20=20=20=20=20=20tiff_write_from_memory,=0A+=20=20=20=20=20=20=20=20=20=20= =20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= tiff_seek_in_memory,=0A+=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= =20=20=20=20=20=20=20=20=20=20=20=20=20=20=20tiff_close_memory,=0A+=20=20= =20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= =20=20=20=20=20tiff_size_of_memory,=0A+=20=20=20=20=20=20=20=20=20=20=20=20= =20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= tiff_mmap_memory,=0A+=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= =20=20=20=20=20=20=20=20=20=20=20=20=20=20tiff_unmap_memory);=0A=20=0A=20= =20=20=20=20=20=20if=20(!tiff)=0A-=09{=0A-=09=20=20image_error=20= ("Cannot=20open=20memory=20source=20for=20`%s'",=20img->spec,=20Qnil);=0A= -=09=20=20return=200;=0A-=09}=0A+=20=20=20=20=20=20=20=20{=0A+=20=20=20=20= =20=20=20=20=20=20image_error=20("Cannot=20open=20memory=20source=20for=20= `%s'",=20img->spec,=20Qnil);=0A+=20=20=20=20=20=20=20=20=20=20return=20= 0;=0A+=20=20=20=20=20=20=20=20}=0A=20=20=20=20=20}=0A=20=0A=20=20=20= image=20=3D=20image_spec_value=20(img->spec,=20QCindex,=20NULL);=0A@@=20= -7006,13=20+7006,13=20@@=20tiff_load=20(struct=20frame=20*f,=20struct=20= image=20*img)=0A=20=20=20=20=20{=0A=20=20=20=20=20=20=20EMACS_INT=20ino=20= =3D=20XFASTINT=20(image);=0A=20=20=20=20=20=20=20if=20(!=20(TYPE_MINIMUM=20= (tdir_t)=20<=3D=20ino=20&&=20ino=20<=3D=20TYPE_MAXIMUM=20(tdir_t)=0A-=09=20= =20=20=20=20&&=20fn_TIFFSetDirectory=20(tiff,=20ino)))=0A-=09{=0A-=09=20=20= image_error=20("Invalid=20image=20number=20`%s'=20in=20image=20`%s'",=0A= -=09=09=20=20=20=20=20=20=20image,=20img->spec);=0A-=09=20=20= fn_TIFFClose=20(tiff);=0A-=09=20=20return=200;=0A-=09}=0A+=20=20=20=20=20= =20=20=20=20=20=20=20=20&&=20fn_TIFFSetDirectory=20(tiff,=20ino)))=0A+=20= =20=20=20=20=20=20=20{=0A+=20=20=20=20=20=20=20=20=20=20image_error=20= ("Invalid=20image=20number=20`%s'=20in=20image=20`%s'",=0A+=20=20=20=20=20= =20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20image,=20= img->spec);=0A+=20=20=20=20=20=20=20=20=20=20fn_TIFFClose=20(tiff);=0A+=20= =20=20=20=20=20=20=20=20=20return=200;=0A+=20=20=20=20=20=20=20=20}=0A=20= =20=20=20=20}=0A=20=0A=20=20=20/*=20Get=20width=20and=20height=20of=20= the=20image,=20and=20allocate=20a=20raster=20buffer=0A@@=20-7029,8=20= +7029,8=20@@=20tiff_load=20(struct=20frame=20*f,=20struct=20image=20= *img)=0A=20=0A=20=20=20/*=20Create=20the=20X=20image=20and=20pixmap.=20=20= */=0A=20=20=20if=20(!=20(height=20<=3D=20min=20(PTRDIFF_MAX,=20SIZE_MAX)=20= /=20sizeof=20*buf=20/=20width=0A-=09=20&&=20= image_create_x_image_and_pixmap=20(f,=20img,=20width,=20height,=200,=0A-=09= =09=09=09=09=20=20=20=20=20&ximg,=200)))=0A+=20=20=20=20=20=20=20=20=20= &&=20image_create_x_image_and_pixmap=20(f,=20img,=20width,=20height,=20= 0,=0A+=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= =20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20&ximg,=20= 0)))=0A=20=20=20=20=20{=0A=20=20=20=20=20=20=20fn_TIFFClose=20(tiff);=0A=20= =20=20=20=20=20=20return=200;=0A@@=20-7046,8=20+7046,8=20@@=20tiff_load=20= (struct=20frame=20*f,=20struct=20image=20*img)=0A=20=0A=20=20=20if=20= (count=20>=201)=0A=20=20=20=20=20img->lisp_data=20=3D=20Fcons=20(Qcount,=0A= -=09=09=09=20=20=20=20Fcons=20(make_number=20(count),=0A-=09=09=09=09=20=20= =20img->lisp_data));=0A+=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= =20=20=20=20=20=20=20=20=20=20=20Fcons=20(make_number=20(count),=0A+=20=20= =20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= =20=20=20=20=20=20=20=20img->lisp_data));=0A=20=0A=20=20=20fn_TIFFClose=20= (tiff);=0A=20=20=20if=20(!rc)=0A@@=20-7066,13=20+7066,13=20@@=20= tiff_load=20(struct=20frame=20*f,=20struct=20image=20*img)=0A=20=20=20=20= =20=20=20uint32=20*row=20=3D=20buf=20+=20y=20*=20width;=0A=20=0A=20=20=20= =20=20=20=20for=20(x=20=3D=200;=20x=20<=20width;=20++x)=0A-=09{=0A-=09=20= =20uint32=20abgr=20=3D=20row[x];=0A-=09=20=20int=20r=20=3D=20TIFFGetR=20= (abgr)=20<<=208;=0A-=09=20=20int=20g=20=3D=20TIFFGetG=20(abgr)=20<<=208;=0A= -=09=20=20int=20b=20=3D=20TIFFGetB=20(abgr)=20<<=208;=0A-=09=20=20= XPutPixel=20(ximg,=20x,=20height=20-=201=20-=20y,=20lookup_rgb_color=20= (f,=20r,=20g,=20b));=0A-=09}=0A+=20=20=20=20=20=20=20=20{=0A+=20=20=20=20= =20=20=20=20=20=20uint32=20abgr=20=3D=20row[x];=0A+=20=20=20=20=20=20=20=20= =20=20int=20r=20=3D=20TIFFGetR=20(abgr)=20<<=208;=0A+=20=20=20=20=20=20=20= =20=20=20int=20g=20=3D=20TIFFGetG=20(abgr)=20<<=208;=0A+=20=20=20=20=20=20= =20=20=20=20int=20b=20=3D=20TIFFGetB=20(abgr)=20<<=208;=0A+=20=20=20=20=20= =20=20=20=20=20XPutPixel=20(ximg,=20x,=20height=20-=201=20-=20y,=20= lookup_rgb_color=20(f,=20r,=20g,=20b));=0A+=20=20=20=20=20=20=20=20}=0A=20= =20=20=20=20}=0A=20=0A=20#ifdef=20COLOR_TABLE_SUPPORT=0A@@=20-7113,7=20= +7113,7=20@@=20tiff_load=20(struct=20frame=20*f,=20struct=20image=20= *img)=0A=20=0A=20=0C=0A=20= /***********************************************************************=0A= -=09=09=09=09=20GIF=0A+=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= =20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20GIF=0A=20=20= ***********************************************************************/=0A= =20=0A=20#if=20defined=20(HAVE_GIF)=20||=20defined=20(HAVE_NS)=0A@@=20= -7344,10=20+7344,10=20@@=20gif_load=20(struct=20frame=20*f,=20struct=20= image=20*img)=0A=20=20=20=20=20{=0A=20=20=20=20=20=20=20file=20=3D=20= x_find_image_file=20(specified_file);=0A=20=20=20=20=20=20=20if=20= (!STRINGP=20(file))=0A-=09{=0A-=09=20=20image_error=20("Cannot=20find=20= image=20file=20`%s'",=20specified_file,=20Qnil);=0A-=09=20=20return=200;=0A= -=09}=0A+=20=20=20=20=20=20=20=20{=0A+=20=20=20=20=20=20=20=20=20=20= image_error=20("Cannot=20find=20image=20file=20`%s'",=20specified_file,=20= Qnil);=0A+=20=20=20=20=20=20=20=20=20=20return=200;=0A+=20=20=20=20=20=20= =20=20}=0A=20#ifdef=20WINDOWSNT=0A=20=20=20=20=20=20=20file=20=3D=20= ansi_encode_filename=20(file);=0A=20#endif=0A@@=20-7356,27=20+7356,27=20= @@=20gif_load=20(struct=20frame=20*f,=20struct=20image=20*img)=0A=20#if=20= GIFLIB_MAJOR=20<=205=0A=20=20=20=20=20=20=20gif=20=3D=20= fn_DGifOpenFileName=20(SSDATA=20(file));=0A=20=20=20=20=20=20=20if=20= (gif=20=3D=3D=20NULL)=0A-=09{=0A-=09=20=20image_error=20("Cannot=20open=20= `%s'",=20file,=20Qnil);=0A-=09=20=20return=200;=0A-=09}=0A+=20=20=20=20=20= =20=20=20{=0A+=20=20=20=20=20=20=20=20=20=20image_error=20("Cannot=20= open=20`%s'",=20file,=20Qnil);=0A+=20=20=20=20=20=20=20=20=20=20return=20= 0;=0A+=20=20=20=20=20=20=20=20}=0A=20#else=0A=20=20=20=20=20=20=20gif=20= =3D=20fn_DGifOpenFileName=20(SSDATA=20(file),=20&gif_err);=0A=20=20=20=20= =20=20=20if=20(gif=20=3D=3D=20NULL)=0A-=09{=0A-=09=20=20image_error=20= ("Cannot=20open=20`%s':=20%s",=0A-=09=09=20=20=20=20=20=20=20file,=20= build_string=20(fn_GifErrorString=20(gif_err)));=0A-=09=20=20return=200;=0A= -=09}=0A+=20=20=20=20=20=20=20=20{=0A+=20=20=20=20=20=20=20=20=20=20= image_error=20("Cannot=20open=20`%s':=20%s",=0A+=20=20=20=20=20=20=20=20=20= =20=20=20=20=20=20=20=20=20=20=20=20=20=20file,=20build_string=20= (fn_GifErrorString=20(gif_err)));=0A+=20=20=20=20=20=20=20=20=20=20= return=200;=0A+=20=20=20=20=20=20=20=20}=0A=20#endif=0A=20=20=20=20=20}=0A= =20=20=20else=0A=20=20=20=20=20{=0A=20=20=20=20=20=20=20if=20(!STRINGP=20= (specified_data))=0A-=09{=0A-=09=20=20image_error=20("Invalid=20image=20= data=20`%s'",=20specified_data,=20Qnil);=0A-=09=20=20return=200;=0A-=09}=0A= +=20=20=20=20=20=20=20=20{=0A+=20=20=20=20=20=20=20=20=20=20image_error=20= ("Invalid=20image=20data=20`%s'",=20specified_data,=20Qnil);=0A+=20=20=20= =20=20=20=20=20=20=20return=200;=0A+=20=20=20=20=20=20=20=20}=0A=20=0A=20= =20=20=20=20=20=20/*=20Read=20from=20memory!=20*/=0A=20=20=20=20=20=20=20= current_gif_memory_src=20=3D=20&memsrc;=0A@@=20-7387,18=20+7387,18=20@@=20= gif_load=20(struct=20frame=20*f,=20struct=20image=20*img)=0A=20#if=20= GIFLIB_MAJOR=20<=205=0A=20=20=20=20=20=20=20gif=20=3D=20fn_DGifOpen=20= (&memsrc,=20gif_read_from_memory);=0A=20=20=20=20=20=20=20if=20(!gif)=0A= -=09{=0A-=09=20=20image_error=20("Cannot=20open=20memory=20source=20= `%s'",=20img->spec,=20Qnil);=0A-=09=20=20return=200;=0A-=09}=0A+=20=20=20= =20=20=20=20=20{=0A+=20=20=20=20=20=20=20=20=20=20image_error=20("Cannot=20= open=20memory=20source=20`%s'",=20img->spec,=20Qnil);=0A+=20=20=20=20=20=20= =20=20=20=20return=200;=0A+=20=20=20=20=20=20=20=20}=0A=20#else=0A=20=20=20= =20=20=20=20gif=20=3D=20fn_DGifOpen=20(&memsrc,=20gif_read_from_memory,=20= &gif_err);=0A=20=20=20=20=20=20=20if=20(!gif)=0A-=09{=0A-=09=20=20= image_error=20("Cannot=20open=20memory=20source=20`%s':=20%s",=0A-=09=09=20= =20=20=20=20=20=20img->spec,=20build_string=20(fn_GifErrorString=20= (gif_err)));=0A-=09=20=20return=200;=0A-=09}=0A+=20=20=20=20=20=20=20=20= {=0A+=20=20=20=20=20=20=20=20=20=20image_error=20("Cannot=20open=20= memory=20source=20`%s':=20%s",=0A+=20=20=20=20=20=20=20=20=20=20=20=20=20= =20=20=20=20=20=20=20=20=20=20img->spec,=20build_string=20= (fn_GifErrorString=20(gif_err)));=0A+=20=20=20=20=20=20=20=20=20=20= return=200;=0A+=20=20=20=20=20=20=20=20}=0A=20#endif=0A=20=20=20=20=20}=0A= =20=0A@@=20-7425,10=20+7425,10=20@@=20gif_load=20(struct=20frame=20*f,=20= struct=20image=20*img)=0A=20=20=20=20=20idx=20=3D=20INTEGERP=20= (image_number)=20?=20XFASTINT=20(image_number)=20:=200;=0A=20=20=20=20=20= if=20(idx=20<=200=20||=20idx=20>=3D=20gif->ImageCount)=0A=20=20=20=20=20=20= =20{=0A-=09image_error=20("Invalid=20image=20number=20`%s'=20in=20image=20= `%s'",=0A-=09=09=20=20=20=20=20image_number,=20img->spec);=0A-=09= fn_DGifCloseFile=20(gif);=0A-=09return=200;=0A+=20=20=20=20=20=20=20=20= image_error=20("Invalid=20image=20number=20`%s'=20in=20image=20`%s'",=0A= +=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= image_number,=20img->spec);=0A+=20=20=20=20=20=20=20=20fn_DGifCloseFile=20= (gif);=0A+=20=20=20=20=20=20=20=20return=200;=0A=20=20=20=20=20=20=20}=0A= =20=20=20}=0A=20=0A@@=20-7459,13=20+7459,13=20@@=20gif_load=20(struct=20= frame=20*f,=20struct=20image=20*img)=0A=20=20=20=20=20=20=20int=20= subimg_top=20=3D=20subimage->ImageDesc.Top;=0A=20=20=20=20=20=20=20int=20= subimg_left=20=3D=20subimage->ImageDesc.Left;=0A=20=20=20=20=20=20=20if=20= (!=20(0=20<=3D=20subimg_width=20&&=200=20<=3D=20subimg_height=0A-=09=20=20= =20=20=20&&=200=20<=3D=20subimg_top=20&&=20subimg_top=20<=3D=20height=20= -=20subimg_height=0A-=09=20=20=20=20=20&&=200=20<=3D=20subimg_left=20&&=20= subimg_left=20<=3D=20width=20-=20subimg_width))=0A-=09{=0A-=09=20=20= image_error=20("Subimage=20does=20not=20fit=20in=20image",=20Qnil,=20= Qnil);=0A-=09=20=20fn_DGifCloseFile=20(gif);=0A-=09=20=20return=200;=0A-=09= }=0A+=20=20=20=20=20=20=20=20=20=20=20=20=20&&=200=20<=3D=20subimg_top=20= &&=20subimg_top=20<=3D=20height=20-=20subimg_height=0A+=20=20=20=20=20=20= =20=20=20=20=20=20=20&&=200=20<=3D=20subimg_left=20&&=20subimg_left=20<=3D= =20width=20-=20subimg_width))=0A+=20=20=20=20=20=20=20=20{=0A+=20=20=20=20= =20=20=20=20=20=20image_error=20("Subimage=20does=20not=20fit=20in=20= image",=20Qnil,=20Qnil);=0A+=20=20=20=20=20=20=20=20=20=20= fn_DGifCloseFile=20(gif);=0A+=20=20=20=20=20=20=20=20=20=20return=200;=0A= +=20=20=20=20=20=20=20=20}=0A=20=20=20=20=20}=0A=20=0A=20=20=20/*=20= Create=20the=20X=20image=20and=20pixmap.=20=20*/=0A@@=20-7490,9=20= +7490,9=20@@=20gif_load=20(struct=20frame=20*f,=20struct=20image=20*img)=0A= =20=20=20for=20(y=20=3D=20img->corners[TOP_CORNER];=20y=20<=20= img->corners[BOT_CORNER];=20++y)=0A=20=20=20=20=20{=0A=20=20=20=20=20=20=20= for=20(x=20=3D=200;=20x=20<=20img->corners[LEFT_CORNER];=20++x)=0A-=09= XPutPixel=20(ximg,=20x,=20y,=20FRAME_BACKGROUND_PIXEL=20(f));=0A+=20=20=20= =20=20=20=20=20XPutPixel=20(ximg,=20x,=20y,=20FRAME_BACKGROUND_PIXEL=20= (f));=0A=20=20=20=20=20=20=20for=20(x=20=3D=20= img->corners[RIGHT_CORNER];=20x=20<=20width;=20++x)=0A-=09XPutPixel=20= (ximg,=20x,=20y,=20FRAME_BACKGROUND_PIXEL=20(f));=0A+=20=20=20=20=20=20=20= =20XPutPixel=20(ximg,=20x,=20y,=20FRAME_BACKGROUND_PIXEL=20(f));=0A=20=20= =20=20=20}=0A=20=0A=20=20=20/*=20Read=20the=20GIF=20image=20into=20the=20= X=20image.=20=20=20*/=0A@@=20-7505,11=20+7505,11=20@@=20gif_load=20= (struct=20frame=20*f,=20struct=20image=20*img)=0A=20=20=20= init_color_table=20();=0A=20=20=20if=20(STRINGP=20(specified_bg))=0A=20=20= =20=20=20bgcolor=20=3D=20x_alloc_image_color=20(f,=20img,=20= specified_bg,=0A-=09=09=09=09=20=20=20FRAME_BACKGROUND_PIXEL=20(f));=0A+=20= =20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= =20=20=20=20=20=20=20=20=20FRAME_BACKGROUND_PIXEL=20(f));=0A=20=20=20for=20= (j=20=3D=200;=20j=20<=3D=20idx;=20++j)=0A=20=20=20=20=20{=0A=20=20=20=20=20= =20=20/*=20We=20use=20a=20local=20variable=20`raster'=20here=20because=20= RasterBits=20is=20a=0A-=09=20char=20*,=20which=20invites=20problems=20= with=20bytes=20>=3D=200x80.=20=20*/=0A+=20=20=20=20=20=20=20=20=20char=20= *,=20which=20invites=20problems=20with=20bytes=20>=3D=200x80.=20=20*/=0A=20= =20=20=20=20=20=20struct=20SavedImage=20*subimage=20=3D=20= gif->SavedImages=20+=20j;=0A=20=20=20=20=20=20=20unsigned=20char=20= *raster=20=3D=20(unsigned=20char=20*)=20subimage->RasterBits;=0A=20=20=20= =20=20=20=20int=20transparency_color_index=20=3D=20-1;=0A@@=20-7520,87=20= +7520,87=20@@=20gif_load=20(struct=20frame=20*f,=20struct=20image=20= *img)=0A=20=20=20=20=20=20=20int=20subimg_left=20=3D=20= subimage->ImageDesc.Left;=0A=20=0A=20=20=20=20=20=20=20/*=20Find=20the=20= Graphic=20Control=20Extension=20block=20for=20this=20sub-image.=0A-=09=20= Extract=20the=20disposal=20method=20and=20transparency=20color.=20=20*/=0A= +=20=20=20=20=20=20=20=20=20Extract=20the=20disposal=20method=20and=20= transparency=20color.=20=20*/=0A=20=20=20=20=20=20=20for=20(i=20=3D=200;=20= i=20<=20subimage->ExtensionBlockCount;=20i++)=0A-=09{=0A-=09=20=20= ExtensionBlock=20*extblock=20=3D=20subimage->ExtensionBlocks=20+=20i;=0A= -=0A-=09=20=20if=20((extblock->Function=20=3D=3D=20= GIF_LOCAL_DESCRIPTOR_EXTENSION)=0A-=09=20=20=20=20=20=20&&=20= extblock->ByteCount=20=3D=3D=204=0A-=09=20=20=20=20=20=20&&=20= extblock->Bytes[0]=20&=201)=0A-=09=20=20=20=20{=0A-=09=20=20=20=20=20=20= /*=20=46rom=20gif89a=20spec:=201=20=3D=20"keep=20in=20place",=202=20=3D=20= "restore=0A-=09=09=20to=20background".=20=20Treat=20any=20other=20value=20= like=202.=20=20*/=0A-=09=20=20=20=20=20=20disposal=20=3D=20= (extblock->Bytes[0]=20>>=202)=20&=207;=0A-=09=20=20=20=20=20=20= transparency_color_index=20=3D=20(unsigned=20char)=20extblock->Bytes[3];=0A= -=09=20=20=20=20=20=20break;=0A-=09=20=20=20=20}=0A-=09}=0A+=20=20=20=20=20= =20=20=20{=0A+=20=20=20=20=20=20=20=20=20=20ExtensionBlock=20*extblock=20= =3D=20subimage->ExtensionBlocks=20+=20i;=0A+=0A+=20=20=20=20=20=20=20=20=20= =20if=20((extblock->Function=20=3D=3D=20GIF_LOCAL_DESCRIPTOR_EXTENSION)=0A= +=20=20=20=20=20=20=20=20=20=20=20=20=20=20&&=20extblock->ByteCount=20=3D=3D= =204=0A+=20=20=20=20=20=20=20=20=20=20=20=20=20=20&&=20= extblock->Bytes[0]=20&=201)=0A+=20=20=20=20=20=20=20=20=20=20=20=20{=0A+=20= =20=20=20=20=20=20=20=20=20=20=20=20=20/*=20=46rom=20gif89a=20spec:=201=20= =3D=20"keep=20in=20place",=202=20=3D=20"restore=0A+=20=20=20=20=20=20=20=20= =20=20=20=20=20=20=20=20=20to=20background".=20=20Treat=20any=20other=20= value=20like=202.=20=20*/=0A+=20=20=20=20=20=20=20=20=20=20=20=20=20=20= disposal=20=3D=20(extblock->Bytes[0]=20>>=202)=20&=207;=0A+=20=20=20=20=20= =20=20=20=20=20=20=20=20=20transparency_color_index=20=3D=20(unsigned=20= char)=20extblock->Bytes[3];=0A+=20=20=20=20=20=20=20=20=20=20=20=20=20=20= break;=0A+=20=20=20=20=20=20=20=20=20=20=20=20}=0A+=20=20=20=20=20=20=20=20= }=0A=20=0A=20=20=20=20=20=20=20/*=20We=20can't=20"keep=20in=20place"=20= the=20first=20subimage.=20=20*/=0A=20=20=20=20=20=20=20if=20(j=20=3D=3D=20= 0)=0A-=09disposal=20=3D=202;=0A+=20=20=20=20=20=20=20=20disposal=20=3D=20= 2;=0A=20=0A=20=20=20=20=20=20=20/*=20For=20disposal=20=3D=3D=200,=20the=20= spec=20says=20"No=20disposal=20specified.=20The=0A-=09=20decoder=20is=20= not=20required=20to=20take=20any=20action."=20=20In=20practice,=20it=0A-=09= =20seems=20we=20need=20to=20treat=20this=20like=20"keep=20in=20place",=20= see=20e.g.=0A-=09=20= http://upload.wikimedia.org/wikipedia/commons/3/37/Clock.gif=20*/=0A+=20=20= =20=20=20=20=20=20=20decoder=20is=20not=20required=20to=20take=20any=20= action."=20=20In=20practice,=20it=0A+=20=20=20=20=20=20=20=20=20seems=20= we=20need=20to=20treat=20this=20like=20"keep=20in=20place",=20see=20e.g.=0A= +=20=20=20=20=20=20=20=20=20= http://upload.wikimedia.org/wikipedia/commons/3/37/Clock.gif=20*/=0A=20=20= =20=20=20=20=20if=20(disposal=20=3D=3D=200)=0A-=09disposal=20=3D=201;=0A= +=20=20=20=20=20=20=20=20disposal=20=3D=201;=0A=20=0A=20=20=20=20=20=20=20= /*=20Allocate=20subimage=20colors.=20=20*/=0A=20=20=20=20=20=20=20memset=20= (pixel_colors,=200,=20sizeof=20pixel_colors);=0A=20=20=20=20=20=20=20= gif_color_map=20=3D=20subimage->ImageDesc.ColorMap;=0A=20=20=20=20=20=20=20= if=20(!gif_color_map)=0A-=09gif_color_map=20=3D=20gif->SColorMap;=0A+=20=20= =20=20=20=20=20=20gif_color_map=20=3D=20gif->SColorMap;=0A=20=0A=20=20=20= =20=20=20=20if=20(gif_color_map)=0A-=09for=20(i=20=3D=200;=20i=20<=20= gif_color_map->ColorCount;=20++i)=0A-=09=20=20{=0A-=09=20=20=20=20if=20= (transparency_color_index=20=3D=3D=20i)=0A-=09=20=20=20=20=20=20= pixel_colors[i]=20=3D=20STRINGP=20(specified_bg)=0A-=09=09?=20bgcolor=20= :=20FRAME_BACKGROUND_PIXEL=20(f);=0A-=09=20=20=20=20else=0A-=09=20=20=20=20= =20=20{=0A-=09=09int=20r=20=3D=20gif_color_map->Colors[i].Red=20<<=208;=0A= -=09=09int=20g=20=3D=20gif_color_map->Colors[i].Green=20<<=208;=0A-=09=09= int=20b=20=3D=20gif_color_map->Colors[i].Blue=20<<=208;=0A-=09=09= pixel_colors[i]=20=3D=20lookup_rgb_color=20(f,=20r,=20g,=20b);=0A-=09=20=20= =20=20=20=20}=0A-=09=20=20}=0A+=20=20=20=20=20=20=20=20for=20(i=20=3D=20= 0;=20i=20<=20gif_color_map->ColorCount;=20++i)=0A+=20=20=20=20=20=20=20=20= =20=20{=0A+=20=20=20=20=20=20=20=20=20=20=20=20if=20= (transparency_color_index=20=3D=3D=20i)=0A+=20=20=20=20=20=20=20=20=20=20= =20=20=20=20pixel_colors[i]=20=3D=20STRINGP=20(specified_bg)=0A+=20=20=20= =20=20=20=20=20=20=20=20=20=20=20=20=20?=20bgcolor=20:=20= FRAME_BACKGROUND_PIXEL=20(f);=0A+=20=20=20=20=20=20=20=20=20=20=20=20= else=0A+=20=20=20=20=20=20=20=20=20=20=20=20=20=20{=0A+=20=20=20=20=20=20= =20=20=20=20=20=20=20=20=20=20int=20r=20=3D=20= gif_color_map->Colors[i].Red=20<<=208;=0A+=20=20=20=20=20=20=20=20=20=20=20= =20=20=20=20=20int=20g=20=3D=20gif_color_map->Colors[i].Green=20<<=208;=0A= +=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20int=20b=20=3D=20= gif_color_map->Colors[i].Blue=20<<=208;=0A+=20=20=20=20=20=20=20=20=20=20= =20=20=20=20=20=20pixel_colors[i]=20=3D=20lookup_rgb_color=20(f,=20r,=20= g,=20b);=0A+=20=20=20=20=20=20=20=20=20=20=20=20=20=20}=0A+=20=20=20=20=20= =20=20=20=20=20}=0A=20=0A=20=20=20=20=20=20=20/*=20Apply=20the=20pixel=20= values.=20=20*/=0A=20=20=20=20=20=20=20if=20(GIFLIB_MAJOR=20<=205=20&&=20= gif->SavedImages[j].ImageDesc.Interlace)=0A-=09{=0A-=09=20=20int=20row,=20= pass;=0A-=0A-=09=20=20for=20(y=20=3D=200,=20row=20=3D=20= interlace_start[0],=20pass=20=3D=200;=0A-=09=20=20=20=20=20=20=20y=20<=20= subimg_height;=0A-=09=20=20=20=20=20=20=20y++,=20row=20+=3D=20= interlace_increment[pass])=0A-=09=20=20=20=20{=0A-=09=20=20=20=20=20=20= while=20(subimg_height=20<=3D=20row)=0A-=09=09row=20=3D=20= interlace_start[++pass];=0A-=0A-=09=20=20=20=20=20=20for=20(x=20=3D=200;=20= x=20<=20subimg_width;=20x++)=0A-=09=09{=0A-=09=09=20=20int=20c=20=3D=20= raster[y=20*=20subimg_width=20+=20x];=0A-=09=09=20=20if=20= (transparency_color_index=20!=3D=20c=20||=20disposal=20!=3D=201)=0A-=09=09= =20=20=20=20XPutPixel=20(ximg,=20x=20+=20subimg_left,=20row=20+=20= subimg_top,=0A-=09=09=09=20=20=20=20=20=20=20pixel_colors[c]);=0A-=09=09= }=0A-=09=20=20=20=20}=0A-=09}=0A+=20=20=20=20=20=20=20=20{=0A+=20=20=20=20= =20=20=20=20=20=20int=20row,=20pass;=0A+=0A+=20=20=20=20=20=20=20=20=20=20= for=20(y=20=3D=200,=20row=20=3D=20interlace_start[0],=20pass=20=3D=200;=0A= +=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20y=20<=20subimg_height;=0A+=20= =20=20=20=20=20=20=20=20=20=20=20=20=20=20y++,=20row=20+=3D=20= interlace_increment[pass])=0A+=20=20=20=20=20=20=20=20=20=20=20=20{=0A+=20= =20=20=20=20=20=20=20=20=20=20=20=20=20while=20(subimg_height=20<=3D=20= row)=0A+=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20row=20=3D=20= interlace_start[++pass];=0A+=0A+=20=20=20=20=20=20=20=20=20=20=20=20=20=20= for=20(x=20=3D=200;=20x=20<=20subimg_width;=20x++)=0A+=20=20=20=20=20=20=20= =20=20=20=20=20=20=20=20=20{=0A+=20=20=20=20=20=20=20=20=20=20=20=20=20=20= =20=20=20=20int=20c=20=3D=20raster[y=20*=20subimg_width=20+=20x];=0A+=20=20= =20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20if=20= (transparency_color_index=20!=3D=20c=20||=20disposal=20!=3D=201)=0A+=20=20= =20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20XPutPixel=20(ximg,=20= x=20+=20subimg_left,=20row=20+=20subimg_top,=0A+=20=20=20=20=20=20=20=20=20= =20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= pixel_colors[c]);=0A+=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20}=0A= +=20=20=20=20=20=20=20=20=20=20=20=20}=0A+=20=20=20=20=20=20=20=20}=0A=20= =20=20=20=20=20=20else=0A-=09{=0A-=09=20=20for=20(y=20=3D=200;=20y=20<=20= subimg_height;=20++y)=0A-=09=20=20=20=20for=20(x=20=3D=200;=20x=20<=20= subimg_width;=20++x)=0A-=09=20=20=20=20=20=20{=0A-=09=09int=20c=20=3D=20= raster[y=20*=20subimg_width=20+=20x];=0A-=09=09if=20= (transparency_color_index=20!=3D=20c=20||=20disposal=20!=3D=201)=0A-=09=09= =20=20XPutPixel=20(ximg,=20x=20+=20subimg_left,=20y=20+=20subimg_top,=0A= -=09=09=09=20=20=20=20=20pixel_colors[c]);=0A-=09=20=20=20=20=20=20}=0A-=09= }=0A+=20=20=20=20=20=20=20=20{=0A+=20=20=20=20=20=20=20=20=20=20for=20(y=20= =3D=200;=20y=20<=20subimg_height;=20++y)=0A+=20=20=20=20=20=20=20=20=20=20= =20=20for=20(x=20=3D=200;=20x=20<=20subimg_width;=20++x)=0A+=20=20=20=20=20= =20=20=20=20=20=20=20=20=20{=0A+=20=20=20=20=20=20=20=20=20=20=20=20=20=20= =20=20int=20c=20=3D=20raster[y=20*=20subimg_width=20+=20x];=0A+=20=20=20=20= =20=20=20=20=20=20=20=20=20=20=20=20if=20(transparency_color_index=20!=3D=20= c=20||=20disposal=20!=3D=201)=0A+=20=20=20=20=20=20=20=20=20=20=20=20=20=20= =20=20=20=20XPutPixel=20(ximg,=20x=20+=20subimg_left,=20y=20+=20= subimg_top,=0A+=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= =20=20=20=20=20=20=20=20=20pixel_colors[c]);=0A+=20=20=20=20=20=20=20=20=20= =20=20=20=20=20}=0A+=20=20=20=20=20=20=20=20}=0A=20=20=20=20=20}=0A=20=0A= =20#ifdef=20COLOR_TABLE_SUPPORT=0A@@=20-7616,31=20+7616,31=20@@=20= gif_load=20(struct=20frame=20*f,=20struct=20image=20*img)=0A=20=20=20=20=20= =20=20int=20delay=20=3D=200;=0A=20=20=20=20=20=20=20ExtensionBlock=20= *ext=20=3D=20gif->SavedImages[idx].ExtensionBlocks;=0A=20=20=20=20=20=20=20= for=20(i=20=3D=200;=20i=20<=20gif->SavedImages[idx].ExtensionBlockCount;=20= i++,=20ext++)=0A-=09/*=20Append=20(...=20FUNCTION=20"BYTES")=20*/=0A-=09= {=0A-=09=20=20img->lisp_data=0A-=09=20=20=20=20=3D=20Fcons=20= (make_number=20(ext->Function),=0A-=09=09=20=20=20=20=20Fcons=20= (make_unibyte_string=20(ext->Bytes,=20ext->ByteCount),=0A-=09=09=09=20=20= =20=20img->lisp_data));=0A-=09=20=20if=20(ext->Function=20=3D=3D=20= GIF_LOCAL_DESCRIPTOR_EXTENSION=0A-=09=20=20=20=20=20=20&&=20= ext->ByteCount=20=3D=3D=204)=0A-=09=20=20=20=20{=0A-=09=20=20=20=20=20=20= delay=20=3D=20ext->Bytes[2]=20<<=20CHAR_BIT;=0A-=09=20=20=20=20=20=20= delay=20|=3D=20ext->Bytes[1];=0A-=09=20=20=20=20}=0A-=09}=0A+=20=20=20=20= =20=20=20=20/*=20Append=20(...=20FUNCTION=20"BYTES")=20*/=0A+=20=20=20=20= =20=20=20=20{=0A+=20=20=20=20=20=20=20=20=20=20img->lisp_data=0A+=20=20=20= =20=20=20=20=20=20=20=20=20=3D=20Fcons=20(make_number=20(ext->Function),=0A= +=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20Fcons=20= (make_unibyte_string=20(ext->Bytes,=20ext->ByteCount),=0A+=20=20=20=20=20= =20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= img->lisp_data));=0A+=20=20=20=20=20=20=20=20=20=20if=20(ext->Function=20= =3D=3D=20GIF_LOCAL_DESCRIPTOR_EXTENSION=0A+=20=20=20=20=20=20=20=20=20=20= =20=20=20=20&&=20ext->ByteCount=20=3D=3D=204)=0A+=20=20=20=20=20=20=20=20= =20=20=20=20{=0A+=20=20=20=20=20=20=20=20=20=20=20=20=20=20delay=20=3D=20= ext->Bytes[2]=20<<=20CHAR_BIT;=0A+=20=20=20=20=20=20=20=20=20=20=20=20=20= =20delay=20|=3D=20ext->Bytes[1];=0A+=20=20=20=20=20=20=20=20=20=20=20=20= }=0A+=20=20=20=20=20=20=20=20}=0A=20=20=20=20=20=20=20img->lisp_data=20=3D= =20list2=20(Qextension_data,=20img->lisp_data);=0A=20=20=20=20=20=20=20= if=20(delay)=0A-=09img->lisp_data=0A-=09=20=20=3D=20Fcons=20(Qdelay,=0A-=09= =09=20=20=20Fcons=20(make_float=20(delay=20/=20100.0),=0A-=09=09=09=20=20= img->lisp_data));=0A+=20=20=20=20=20=20=20=20img->lisp_data=0A+=20=20=20=20= =20=20=20=20=20=20=3D=20Fcons=20(Qdelay,=0A+=20=20=20=20=20=20=20=20=20=20= =20=20=20=20=20=20=20=20=20Fcons=20(make_float=20(delay=20/=20100.0),=0A= +=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= =20=20img->lisp_data));=0A=20=20=20=20=20}=0A=20=0A=20=20=20if=20= (gif->ImageCount=20>=201)=0A=20=20=20=20=20img->lisp_data=20=3D=20Fcons=20= (Qcount,=0A-=09=09=09=20=20=20=20Fcons=20(make_number=20= (gif->ImageCount),=0A-=09=09=09=09=20=20=20img->lisp_data));=0A+=20=20=20= =20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= Fcons=20(make_number=20(gif->ImageCount),=0A+=20=20=20=20=20=20=20=20=20=20= =20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= img->lisp_data));=0A=20=0A=20=20=20fn_DGifCloseFile=20(gif);=0A=20=0A@@=20= -7663,7=20+7663,7=20@@=20gif_load=20(struct=20frame=20*f,=20struct=20= image=20*img)=0A=20{=0A=20=20=20return=20ns_load_image=20(f,=20img,=0A=20= =20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= image_spec_value=20(img->spec,=20QCfile,=20NULL),=0A-=09=09=09= image_spec_value=20(img->spec,=20QCdata,=20NULL));=0A+=20=20=20=20=20=20=20= =20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20image_spec_value=20= (img->spec,=20QCdata,=20NULL));=0A=20}=0A=20#endif=20/*=20HAVE_NS=20*/=0A= =20=0A@@=20-7673,7=20+7673,7=20@@=20gif_load=20(struct=20frame=20*f,=20= struct=20image=20*img)=0A=20#ifdef=20HAVE_IMAGEMAGICK=0A=20=0A=20= /***********************************************************************=0A= -=09=09=09=09=20ImageMagick=0A+=20=20=20=20=20=20=20=20=20=20=20=20=20=20= =20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20ImageMagick=0A=20= ***********************************************************************/=0A= =20=0A=20/*=20Scale=20an=20image=20size=20by=20returning=20SIZE=20/=20= DIVISOR=20*=20MULTIPLIER,=0A@@=20-7687,7=20+7687,7=20@@=20= scale_image_size=20(int=20size,=20size_t=20divisor,=20size_t=20= multiplier)=0A=20=20=20=20=20=20=20double=20s=20=3D=20size;=0A=20=20=20=20= =20=20=20double=20scaled=20=3D=20s=20*=20multiplier=20/=20divisor=20+=20= 0.5;=0A=20=20=20=20=20=20=20if=20(scaled=20<=20INT_MAX)=0A-=09return=20= scaled;=0A+=20=20=20=20=20=20=20=20return=20scaled;=0A=20=20=20=20=20}=0A= =20=20=20return=20INT_MAX;=0A=20}=0A@@=20-7697,8=20+7697,8=20@@=20= scale_image_size=20(int=20size,=20size_t=20divisor,=20size_t=20= multiplier)=0A=20=20=20=20*D_WIDTH=20x=20*D_HEIGHT.=20=20Store=20-1=20x=20= -1=20if=20the=20native=20size=20is=20OK.=20=20*/=0A=20static=20void=0A=20= compute_image_size=20(size_t=20width,=20size_t=20height,=0A-=09=09=20=20=20= =20Lisp_Object=20spec,=0A-=09=09=20=20=20=20int=20*d_width,=20int=20= *d_height)=0A+=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= Lisp_Object=20spec,=0A+=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= =20=20=20int=20*d_width,=20int=20*d_height)=0A=20{=0A=20=20=20= Lisp_Object=20value;=0A=20=20=20int=20desired_width,=20desired_height;=0A= @@=20-7716,41=20+7716,41=20@@=20compute_image_size=20(size_t=20width,=20= size_t=20height,=0A=20=20=20=20=20{=0A=20=20=20=20=20=20=20value=20=3D=20= image_spec_value=20(spec,=20QCmax_width,=20NULL);=0A=20=20=20=20=20=20=20= if=20(NATNUMP=20(value))=0A-=09{=0A-=09=20=20int=20max_width=20=3D=20min=20= (XFASTINT=20(value),=20INT_MAX);=0A-=09=20=20if=20(max_width=20<=20= width)=0A-=09=20=20=20=20{=0A-=09=20=20=20=20=20=20/*=20The=20image=20is=20= wider=20than=20:max-width.=20*/=0A-=09=20=20=20=20=20=20desired_width=20= =3D=20max_width;=0A-=09=20=20=20=20=20=20if=20(desired_height=20=3D=3D=20= -1)=0A-=09=09{=0A-=09=09=20=20desired_height=20=3D=20scale_image_size=20= (desired_width,=0A-=09=09=09=09=09=09=20=20=20=20=20width,=20height);=0A= -=09=09=20=20value=20=3D=20image_spec_value=20(spec,=20QCmax_height,=20= NULL);=0A-=09=09=20=20if=20(NATNUMP=20(value))=0A-=09=09=20=20=20=20{=0A= -=09=09=20=20=20=20=20=20int=20max_height=20=3D=20min=20(XFASTINT=20= (value),=20INT_MAX);=0A-=09=09=20=20=20=20=20=20if=20(max_height=20<=20= desired_height)=0A-=09=09=09{=0A-=09=09=09=20=20desired_height=20=3D=20= max_height;=0A-=09=09=09=20=20desired_width=20=3D=20scale_image_size=20= (desired_height,=0A-=09=09=09=09=09=09=09=20=20=20=20height,=20width);=0A= -=09=09=09}=0A-=09=09=20=20=20=20}=0A-=09=09}=0A-=09=20=20=20=20}=0A-=09= }=0A+=20=20=20=20=20=20=20=20{=0A+=20=20=20=20=20=20=20=20=20=20int=20= max_width=20=3D=20min=20(XFASTINT=20(value),=20INT_MAX);=0A+=20=20=20=20=20= =20=20=20=20=20if=20(max_width=20<=20width)=0A+=20=20=20=20=20=20=20=20=20= =20=20=20{=0A+=20=20=20=20=20=20=20=20=20=20=20=20=20=20/*=20The=20image=20= is=20wider=20than=20:max-width.=20*/=0A+=20=20=20=20=20=20=20=20=20=20=20= =20=20=20desired_width=20=3D=20max_width;=0A+=20=20=20=20=20=20=20=20=20=20= =20=20=20=20if=20(desired_height=20=3D=3D=20-1)=0A+=20=20=20=20=20=20=20=20= =20=20=20=20=20=20=20=20{=0A+=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= =20=20=20desired_height=20=3D=20scale_image_size=20(desired_width,=0A+=20= =20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= =20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= =20=20width,=20height);=0A+=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= =20=20value=20=3D=20image_spec_value=20(spec,=20QCmax_height,=20NULL);=0A= +=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20if=20(NATNUMP=20= (value))=0A+=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= {=0A+=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= int=20max_height=20=3D=20min=20(XFASTINT=20(value),=20INT_MAX);=0A+=20=20= =20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20if=20= (max_height=20<=20desired_height)=0A+=20=20=20=20=20=20=20=20=20=20=20=20= =20=20=20=20=20=20=20=20=20=20=20=20{=0A+=20=20=20=20=20=20=20=20=20=20=20= =20=20=20=20=20=20=20=20=20=20=20=20=20=20=20desired_height=20=3D=20= max_height;=0A+=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= =20=20=20=20=20=20desired_width=20=3D=20scale_image_size=20= (desired_height,=0A+=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= =20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= =20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20height,=20width);=0A+=20= =20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20}=0A= +=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20}=0A+=20=20=20= =20=20=20=20=20=20=20=20=20=20=20=20=20}=0A+=20=20=20=20=20=20=20=20=20=20= =20=20}=0A+=20=20=20=20=20=20=20=20}=0A=20=20=20=20=20}=0A=20=0A=20=20=20= if=20(desired_height=20=3D=3D=20-1)=0A=20=20=20=20=20{=0A=20=20=20=20=20=20= =20value=20=3D=20image_spec_value=20(spec,=20QCmax_height,=20NULL);=0A=20= =20=20=20=20=20=20if=20(NATNUMP=20(value))=0A-=09{=0A-=09=20=20int=20= max_height=20=3D=20min=20(XFASTINT=20(value),=20INT_MAX);=0A-=09=20=20if=20= (max_height=20<=20height)=0A-=09=20=20=20=20desired_height=20=3D=20= max_height;=0A-=09}=0A+=20=20=20=20=20=20=20=20{=0A+=20=20=20=20=20=20=20= =20=20=20int=20max_height=20=3D=20min=20(XFASTINT=20(value),=20INT_MAX);=0A= +=20=20=20=20=20=20=20=20=20=20if=20(max_height=20<=20height)=0A+=20=20=20= =20=20=20=20=20=20=20=20=20desired_height=20=3D=20max_height;=0A+=20=20=20= =20=20=20=20=20}=0A=20=20=20=20=20}=0A=20=0A=20=20=20if=20(desired_width=20= !=3D=20-1=20&&=20desired_height=20=3D=3D=20-1)=0A@@=20-7815,7=20+7815,7=20= @@=20static=20struct=20image_keyword=20= imagemagick_format[IMAGEMAGICK_LAST]=20=3D=0A=20=20=20=20=20= {":max-height",=09IMAGE_INTEGER_VALUE,=09=09=090},=0A=20=20=20=20=20= {":max-width",=09IMAGE_INTEGER_VALUE,=09=09=090},=0A=20=20=20=20=20= {":format",=09=09IMAGE_SYMBOL_VALUE,=09=09=090},=0A-=20=20=20=20= {":rotation",=09IMAGE_NUMBER_VALUE,=20=20=20=20=20=09=090},=0A+=20=20=20=20= {":rotation",=09IMAGE_NUMBER_VALUE,=20=20=20=20=20=20=20=20=20=20=20=20=20= =20=20=20=20=20=20=20=200},=0A=20=20=20=20=20{":crop",=09=09= IMAGE_DONT_CHECK_VALUE_TYPE,=09=090}=0A=20=20=20};=0A=20=0A@@=20-7874,7=20= +7874,7=20@@=20imagemagick_image_p=20(Lisp_Object=20object)=0A=20= #include=20=0A=20#if=200x653=20<=3D=20MagickLibVersion=20= &&=20MagickLibVersion=20<=3D=200x665=0A=20extern=20WandExport=20void=20= PixelGetMagickColor=20(const=20PixelWand=20*,=0A-=09=09=09=09=09=20=20=20= =20MagickPixelPacket=20*);=0A+=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= =20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= =20=20=20=20MagickPixelPacket=20*);=0A=20#endif=0A=20=0A=20/*=20Log=20= ImageMagick=20error=20message.=0A@@=20-7888,8=20+7888,8=20@@=20= imagemagick_error=20(MagickWand=20*wand)=0A=20=0A=20=20=20description=20= =3D=20MagickGetException=20(wand,=20&severity);=0A=20=20=20image_error=20= ("ImageMagick=20error:=20%s",=0A-=09=20=20=20=20=20=20=20build_string=20= (description),=0A-=09=20=20=20=20=20=20=20Qnil);=0A+=20=20=20=20=20=20=20= =20=20=20=20=20=20=20=20build_string=20(description),=0A+=20=20=20=20=20=20= =20=20=20=20=20=20=20=20=20Qnil);=0A=20=20=20MagickRelinquishMemory=20= (description);=0A=20}=0A=20=0A@@=20-7945,7=20+7945,7=20@@=20= imagemagick_create_cache=20(char=20*signature)=0A=20{=0A=20=20=20struct=20= animation_cache=20*cache=0A=20=20=20=20=20=3D=20xmalloc=20(offsetof=20= (struct=20animation_cache,=20signature)=0A-=09=20=20=20=20=20=20=20+=20= strlen=20(signature)=20+=201);=0A+=20=20=20=20=20=20=20=20=20=20=20=20=20= =20=20+=20strlen=20(signature)=20+=201);=0A=20=20=20cache->wand=20=3D=20= 0;=0A=20=20=20cache->index=20=3D=200;=0A=20=20=20cache->next=20=3D=200;=0A= @@=20-7959,20=20+7959,20=20@@=20imagemagick_prune_animation_cache=20= (void)=0A=20{=0A=20=20=20struct=20animation_cache=20**pcache=20=3D=20= &animation_cache;=0A=20=20=20struct=20timespec=20old=20=3D=20= timespec_sub=20(current_timespec=20(),=0A-=09=09=09=09=20=20=20=20=20=20= make_timespec=20(60,=200));=0A+=20=20=20=20=20=20=20=20=20=20=20=20=20=20= =20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= make_timespec=20(60,=200));=0A=20=0A=20=20=20while=20(*pcache)=0A=20=20=20= =20=20{=0A=20=20=20=20=20=20=20struct=20animation_cache=20*cache=20=3D=20= *pcache;=0A=20=20=20=20=20=20=20if=20(timespec_cmp=20(old,=20= cache->update_time)=20<=3D=200)=0A-=09pcache=20=3D=20&cache->next;=0A+=20= =20=20=20=20=20=20=20pcache=20=3D=20&cache->next;=0A=20=20=20=20=20=20=20= else=0A-=09{=0A-=09=20=20if=20(cache->wand)=0A-=09=20=20=20=20= DestroyMagickWand=20(cache->wand);=0A-=09=20=20*pcache=20=3D=20= cache->next;=0A-=09=20=20xfree=20(cache);=0A-=09}=0A+=20=20=20=20=20=20=20= =20{=0A+=20=20=20=20=20=20=20=20=20=20if=20(cache->wand)=0A+=20=20=20=20=20= =20=20=20=20=20=20=20DestroyMagickWand=20(cache->wand);=0A+=20=20=20=20=20= =20=20=20=20=20*pcache=20=3D=20cache->next;=0A+=20=20=20=20=20=20=20=20=20= =20xfree=20(cache);=0A+=20=20=20=20=20=20=20=20}=0A=20=20=20=20=20}=0A=20= }=0A=20=0A@@=20-7989,12=20+7989,12=20@@=20= imagemagick_get_animation_cache=20(MagickWand=20*wand)=0A=20=20=20=20=20= {=0A=20=20=20=20=20=20=20cache=20=3D=20*pcache;=0A=20=20=20=20=20=20=20= if=20(!=20cache)=0A-=09{=0A+=20=20=20=20=20=20=20=20{=0A=20=20=20=20=20=20= =20=20=20=20=20*pcache=20=3D=20cache=20=3D=20imagemagick_create_cache=20= (signature);=0A=20=20=20=20=20=20=20=20=20=20=20break;=0A=20=20=20=20=20=20= =20=20=20}=0A=20=20=20=20=20=20=20if=20(strcmp=20(signature,=20= cache->signature)=20=3D=3D=200)=0A-=09break;=0A+=20=20=20=20=20=20=20=20= break;=0A=20=20=20=20=20=20=20pcache=20=3D=20&cache->next;=0A=20=20=20=20= =20}=0A=20=0A@@=20-8017,7=20+8017,7=20@@=20= imagemagick_compute_animated_image=20(MagickWand=20*super_wand,=20int=20= ino)=0A=20=20=20=20=20{=0A=20=20=20=20=20=20=20composite_wand=20=3D=20= MagickGetImage=20(super_wand);=0A=20=20=20=20=20=20=20if=20(cache->wand)=0A= -=09DestroyMagickWand=20(cache->wand);=0A+=20=20=20=20=20=20=20=20= DestroyMagickWand=20(cache->wand);=0A=20=20=20=20=20}=0A=20=20=20else=0A=20= =20=20=20=20composite_wand=20=3D=20cache->wand;=0A@@=20-8040,71=20= +8040,71=20@@=20imagemagick_compute_animated_image=20(MagickWand=20= *super_wand,=20int=20ino)=0A=20=20=20=20=20=20=20sub_wand=20=3D=20= MagickGetImage=20(super_wand);=0A=20=0A=20=20=20=20=20=20=20= MagickGetImagePage=20(sub_wand,=20&source_width,=20&source_height,=0A-=09= =09=09=20=20&source_left,=20&source_top);=0A+=20=20=20=20=20=20=20=20=20=20= =20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20&source_left,=20= &source_top);=0A=20=0A=20=20=20=20=20=20=20/*=20This=20flag=20says=20how=20= to=20handle=20transparent=20pixels.=20=20*/=0A=20=20=20=20=20=20=20= dispose=20=3D=20MagickGetImageDispose=20(sub_wand);=0A=20=0A=20=20=20=20=20= =20=20source_iterator=20=3D=20NewPixelIterator=20(sub_wand);=0A=20=20=20=20= =20=20=20if=20(!=20source_iterator)=0A-=09{=0A-=09=20=20= DestroyMagickWand=20(composite_wand);=0A-=09=20=20DestroyMagickWand=20= (sub_wand);=0A-=09=20=20cache->wand=20=3D=20NULL;=0A-=09=20=20= image_error=20("Imagemagick=20pixel=20iterator=20creation=20failed",=0A-=09= =09=20=20=20=20=20=20=20Qnil,=20Qnil);=0A-=09=20=20return=20NULL;=0A-=09= }=0A+=20=20=20=20=20=20=20=20{=0A+=20=20=20=20=20=20=20=20=20=20= DestroyMagickWand=20(composite_wand);=0A+=20=20=20=20=20=20=20=20=20=20= DestroyMagickWand=20(sub_wand);=0A+=20=20=20=20=20=20=20=20=20=20= cache->wand=20=3D=20NULL;=0A+=20=20=20=20=20=20=20=20=20=20image_error=20= ("Imagemagick=20pixel=20iterator=20creation=20failed",=0A+=20=20=20=20=20= =20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20Qnil,=20Qnil);=0A+=20= =20=20=20=20=20=20=20=20=20return=20NULL;=0A+=20=20=20=20=20=20=20=20}=0A= =20=0A=20=20=20=20=20=20=20dest_iterator=20=3D=20NewPixelIterator=20= (composite_wand);=0A=20=20=20=20=20=20=20if=20(!=20dest_iterator)=0A-=09= {=0A-=09=20=20DestroyMagickWand=20(composite_wand);=0A-=09=20=20= DestroyMagickWand=20(sub_wand);=0A-=09=20=20DestroyPixelIterator=20= (source_iterator);=0A-=09=20=20cache->wand=20=3D=20NULL;=0A-=09=20=20= image_error=20("Imagemagick=20pixel=20iterator=20creation=20failed",=0A-=09= =09=20=20=20=20=20=20=20Qnil,=20Qnil);=0A-=09=20=20return=20NULL;=0A-=09= }=0A+=20=20=20=20=20=20=20=20{=0A+=20=20=20=20=20=20=20=20=20=20= DestroyMagickWand=20(composite_wand);=0A+=20=20=20=20=20=20=20=20=20=20= DestroyMagickWand=20(sub_wand);=0A+=20=20=20=20=20=20=20=20=20=20= DestroyPixelIterator=20(source_iterator);=0A+=20=20=20=20=20=20=20=20=20=20= cache->wand=20=3D=20NULL;=0A+=20=20=20=20=20=20=20=20=20=20image_error=20= ("Imagemagick=20pixel=20iterator=20creation=20failed",=0A+=20=20=20=20=20= =20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20Qnil,=20Qnil);=0A+=20= =20=20=20=20=20=20=20=20=20return=20NULL;=0A+=20=20=20=20=20=20=20=20}=0A= =20=0A=20=20=20=20=20=20=20/*=20The=20sub-image=20may=20not=20start=20at=20= origin,=20so=20move=20the=20destination=0A-=09=20iterator=20to=20where=20= the=20sub-image=20should=20start.=20*/=0A+=20=20=20=20=20=20=20=20=20= iterator=20to=20where=20the=20sub-image=20should=20start.=20*/=0A=20=20=20= =20=20=20=20if=20(source_top=20>=200)=0A-=09{=0A-=09=20=20= PixelSetIteratorRow=20(dest_iterator,=20source_top);=0A-=09=20=20lines=20= =3D=20source_top;=0A-=09}=0A+=20=20=20=20=20=20=20=20{=0A+=20=20=20=20=20= =20=20=20=20=20PixelSetIteratorRow=20(dest_iterator,=20source_top);=0A+=20= =20=20=20=20=20=20=20=20=20lines=20=3D=20source_top;=0A+=20=20=20=20=20=20= =20=20}=0A=20=0A=20=20=20=20=20=20=20while=20((source=20=3D=20= PixelGetNextIteratorRow=20(source_iterator,=20&source_width))=0A-=09=20=20= =20=20=20!=3D=20NULL)=0A-=09{=0A-=09=20=20ptrdiff_t=20x;=0A-=0A-=09=20=20= /*=20Sanity=20check.=20=20This=20shouldn't=20happen,=20but=20apparently=0A= -=09=20=20=20=20=20does=20in=20some=20pictures.=20=20*/=0A-=09=20=20if=20= (++lines=20>=3D=20dest_height)=0A-=09=20=20=20=20break;=0A-=0A-=09=20=20= dest=20=3D=20PixelGetNextIteratorRow=20(dest_iterator,=20&dest_width);=0A= -=09=20=20for=20(x=20=3D=200;=20x=20<=20source_width;=20x++)=0A-=09=20=20= =20=20{=0A-=09=20=20=20=20=20=20/*=20Sanity=20check.=20=20This=20= shouldn't=20happen,=20but=20apparently=0A-=09=09=20also=20does=20in=20= some=20pictures.=20=20*/=0A-=09=20=20=20=20=20=20if=20(x=20+=20= source_left=20>=20dest_width=20-=201)=0A-=09=09break;=0A-=09=20=20=20=20=20= =20/*=20Normally=20we=20only=20copy=20over=20non-transparent=20pixels,=0A= -=09=09=20but=20if=20the=20disposal=20method=20is=20"Background",=20then=20= we=0A-=09=09=20copy=20over=20all=20pixels.=20=20*/=0A-=09=20=20=20=20=20=20= if=20(dispose=20=3D=3D=20BackgroundDispose=20||=0A-=09=09=20=20= PixelGetAlpha=20(source[x]))=0A-=09=09{=0A-=09=09=20=20= PixelGetMagickColor=20(source[x],=20&pixel);=0A-=09=09=20=20= PixelSetMagickColor=20(dest[x=20+=20source_left],=20&pixel);=0A-=09=09}=0A= -=09=20=20=20=20}=0A-=09=20=20PixelSyncIterator=20(dest_iterator);=0A-=09= }=0A+=20=20=20=20=20=20=20=20=20=20=20=20=20!=3D=20NULL)=0A+=20=20=20=20=20= =20=20=20{=0A+=20=20=20=20=20=20=20=20=20=20ptrdiff_t=20x;=0A+=0A+=20=20=20= =20=20=20=20=20=20=20/*=20Sanity=20check.=20=20This=20shouldn't=20= happen,=20but=20apparently=0A+=20=20=20=20=20=20=20=20=20=20=20=20=20= does=20in=20some=20pictures.=20=20*/=0A+=20=20=20=20=20=20=20=20=20=20if=20= (++lines=20>=3D=20dest_height)=0A+=20=20=20=20=20=20=20=20=20=20=20=20= break;=0A+=0A+=20=20=20=20=20=20=20=20=20=20dest=20=3D=20= PixelGetNextIteratorRow=20(dest_iterator,=20&dest_width);=0A+=20=20=20=20= =20=20=20=20=20=20for=20(x=20=3D=200;=20x=20<=20source_width;=20x++)=0A+=20= =20=20=20=20=20=20=20=20=20=20=20{=0A+=20=20=20=20=20=20=20=20=20=20=20=20= =20=20/*=20Sanity=20check.=20=20This=20shouldn't=20happen,=20but=20= apparently=0A+=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20also=20= does=20in=20some=20pictures.=20=20*/=0A+=20=20=20=20=20=20=20=20=20=20=20= =20=20=20if=20(x=20+=20source_left=20>=20dest_width=20-=201)=0A+=20=20=20= =20=20=20=20=20=20=20=20=20=20=20=20=20break;=0A+=20=20=20=20=20=20=20=20= =20=20=20=20=20=20/*=20Normally=20we=20only=20copy=20over=20= non-transparent=20pixels,=0A+=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= =20=20but=20if=20the=20disposal=20method=20is=20"Background",=20then=20= we=0A+=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20copy=20over=20= all=20pixels.=20=20*/=0A+=20=20=20=20=20=20=20=20=20=20=20=20=20=20if=20= (dispose=20=3D=3D=20BackgroundDispose=20||=0A+=20=20=20=20=20=20=20=20=20= =20=20=20=20=20=20=20=20=20PixelGetAlpha=20(source[x]))=0A+=20=20=20=20=20= =20=20=20=20=20=20=20=20=20=20=20{=0A+=20=20=20=20=20=20=20=20=20=20=20=20= =20=20=20=20=20=20PixelGetMagickColor=20(source[x],=20&pixel);=0A+=20=20=20= =20=20=20=20=20=20=20=20=20=20=20=20=20=20=20PixelSetMagickColor=20= (dest[x=20+=20source_left],=20&pixel);=0A+=20=20=20=20=20=20=20=20=20=20=20= =20=20=20=20=20}=0A+=20=20=20=20=20=20=20=20=20=20=20=20}=0A+=20=20=20=20= =20=20=20=20=20=20PixelSyncIterator=20(dest_iterator);=0A+=20=20=20=20=20= =20=20=20}=0A=20=0A=20=20=20=20=20=20=20DestroyPixelIterator=20= (source_iterator);=0A=20=20=20=20=20=20=20DestroyPixelIterator=20= (dest_iterator);=0A@@=20-8134,8=20+8134,8=20@@=20= imagemagick_compute_animated_image=20(MagickWand=20*super_wand,=20int=20= ino)=0A=20=0A=20static=20bool=0A=20imagemagick_load_image=20(struct=20= frame=20*f,=20struct=20image=20*img,=0A-=09=09=09unsigned=20char=20= *contents,=20unsigned=20int=20size,=0A-=09=09=09char=20*filename)=0A+=20=20= =20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= unsigned=20char=20*contents,=20unsigned=20int=20size,=0A+=20=20=20=20=20=20= =20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20char=20*filename)=0A= =20{=0A=20=20=20size_t=20width,=20height;=0A=20=20=20MagickBooleanType=20= status;=0A@@=20-8185,7=20+8185,7=20@@=20imagemagick_load_image=20(struct=20= frame=20*f,=20struct=20image=20*img,=0A=20=20=20if=20(ino=20<=200=20||=20= ino=20>=3D=20MagickGetNumberImages=20(image_wand))=0A=20=20=20=20=20{=0A=20= =20=20=20=20=20=20image_error=20("Invalid=20image=20number=20`%s'=20in=20= image=20`%s'",=0A-=09=09=20=20=20image,=20img->spec);=0A+=20=20=20=20=20=20= =20=20=20=20=20=20=20=20=20=20=20=20=20image,=20img->spec);=0A=20=20=20=20= =20=20=20DestroyMagickWand=20(image_wand);=0A=20=20=20=20=20=20=20return=20= 0;=0A=20=20=20=20=20}=0A@@=20-8203,9=20+8203,9=20@@=20= imagemagick_load_image=20(struct=20frame=20*f,=20struct=20image=20*img,=0A= =20=20=20=20=20=20=20MagickWand=20*super_wand=20=3D=20image_wand;=0A=20=20= =20=20=20=20=20image_wand=20=3D=20imagemagick_compute_animated_image=20= (super_wand,=20ino);=0A=20=20=20=20=20=20=20if=20(!=20image_wand)=0A-=09= image_wand=20=3D=20super_wand;=0A+=20=20=20=20=20=20=20=20image_wand=20=3D= =20super_wand;=0A=20=20=20=20=20=20=20else=0A-=09DestroyMagickWand=20= (super_wand);=0A+=20=20=20=20=20=20=20=20DestroyMagickWand=20= (super_wand);=0A=20=20=20=20=20}=0A=20=0A=20=20=20/*=20Retrieve=20the=20= frame's=20background=20color,=20for=20use=20later.=20=20*/=0A@@=20= -8215,7=20+8215,7=20@@=20imagemagick_load_image=20(struct=20frame=20*f,=20= struct=20image=20*img,=0A=20=0A=20=20=20=20=20specified_bg=20=3D=20= image_spec_value=20(img->spec,=20QCbackground,=20NULL);=0A=20=20=20=20=20= if=20(!STRINGP=20(specified_bg)=0A-=09||=20!x_defined_color=20(f,=20= SSDATA=20(specified_bg),=20&bgcolor,=200))=0A+=20=20=20=20=20=20=20=20||=20= !x_defined_color=20(f,=20SSDATA=20(specified_bg),=20&bgcolor,=200))=0A=20= =20=20=20=20=20=20x_query_frame_background_color=20(f,=20&bgcolor);=0A=20= =0A=20=20=20=20=20bg_wand=20=3D=20NewPixelWand=20();=0A@@=20-8225,18=20= +8225,18=20@@=20imagemagick_load_image=20(struct=20frame=20*f,=20struct=20= image=20*img,=0A=20=20=20}=0A=20=0A=20=20=20compute_image_size=20= (MagickGetImageWidth=20(image_wand),=0A-=09=09=20=20=20=20=20=20= MagickGetImageHeight=20(image_wand),=0A-=09=09=20=20=20=20=20=20= img->spec,=20&desired_width,=20&desired_height);=0A+=20=20=20=20=20=20=20= =20=20=20=20=20=20=20=20=20=20=20=20=20=20=20MagickGetImageHeight=20= (image_wand),=0A+=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= =20=20=20img->spec,=20&desired_width,=20&desired_height);=0A=20=0A=20=20=20= if=20(desired_width=20!=3D=20-1=20&&=20desired_height=20!=3D=20-1)=0A=20=20= =20=20=20{=0A=20=20=20=20=20=20=20status=20=3D=20MagickScaleImage=20= (image_wand,=20desired_width,=20desired_height);=0A=20=20=20=20=20=20=20= if=20(status=20=3D=3D=20MagickFalse)=0A-=09{=0A-=09=20=20image_error=20= ("Imagemagick=20scale=20failed",=20Qnil,=20Qnil);=0A-=09=20=20= imagemagick_error=20(image_wand);=0A-=09=20=20goto=20imagemagick_error;=0A= -=09}=0A+=20=20=20=20=20=20=20=20{=0A+=20=20=20=20=20=20=20=20=20=20= image_error=20("Imagemagick=20scale=20failed",=20Qnil,=20Qnil);=0A+=20=20= =20=20=20=20=20=20=20=20imagemagick_error=20(image_wand);=0A+=20=20=20=20= =20=20=20=20=20=20goto=20imagemagick_error;=0A+=20=20=20=20=20=20=20=20}=0A= =20=20=20=20=20}=0A=20=0A=20=20=20/*=20crop=20behaves=20similar=20to=20= image=20slicing=20in=20Emacs=20but=20is=20more=20memory=0A@@=20-8253,21=20= +8253,21=20@@=20imagemagick_load_image=20(struct=20frame=20*f,=20struct=20= image=20*img,=0A=20=20=20=20=20=20=20size_t=20crop_width=20=3D=20XINT=20= (XCAR=20(crop));=0A=20=20=20=20=20=20=20crop=20=3D=20XCDR=20(crop);=0A=20= =20=20=20=20=20=20if=20(CONSP=20(crop)=20&&=20TYPE_RANGED_INTEGERP=20= (size_t,=20XCAR=20(crop)))=0A-=09{=0A-=09=20=20size_t=20crop_height=20=3D=20= XINT=20(XCAR=20(crop));=0A-=09=20=20crop=20=3D=20XCDR=20(crop);=0A-=09=20= =20if=20(CONSP=20(crop)=20&&=20TYPE_RANGED_INTEGERP=20(ssize_t,=20XCAR=20= (crop)))=0A-=09=20=20=20=20{=0A-=09=20=20=20=20=20=20ssize_t=20crop_x=20= =3D=20XINT=20(XCAR=20(crop));=0A-=09=20=20=20=20=20=20crop=20=3D=20XCDR=20= (crop);=0A-=09=20=20=20=20=20=20if=20(CONSP=20(crop)=20&&=20= TYPE_RANGED_INTEGERP=20(ssize_t,=20XCAR=20(crop)))=0A-=09=09{=0A-=09=09=20= =20ssize_t=20crop_y=20=3D=20XINT=20(XCAR=20(crop));=0A-=09=09=20=20= MagickCropImage=20(image_wand,=20crop_width,=20crop_height,=0A-=09=09=09=09= =20=20=20crop_x,=20crop_y);=0A-=09=09}=0A-=09=20=20=20=20}=0A-=09}=0A+=20= =20=20=20=20=20=20=20{=0A+=20=20=20=20=20=20=20=20=20=20size_t=20= crop_height=20=3D=20XINT=20(XCAR=20(crop));=0A+=20=20=20=20=20=20=20=20=20= =20crop=20=3D=20XCDR=20(crop);=0A+=20=20=20=20=20=20=20=20=20=20if=20= (CONSP=20(crop)=20&&=20TYPE_RANGED_INTEGERP=20(ssize_t,=20XCAR=20= (crop)))=0A+=20=20=20=20=20=20=20=20=20=20=20=20{=0A+=20=20=20=20=20=20=20= =20=20=20=20=20=20=20ssize_t=20crop_x=20=3D=20XINT=20(XCAR=20(crop));=0A= +=20=20=20=20=20=20=20=20=20=20=20=20=20=20crop=20=3D=20XCDR=20(crop);=0A= +=20=20=20=20=20=20=20=20=20=20=20=20=20=20if=20(CONSP=20(crop)=20&&=20= TYPE_RANGED_INTEGERP=20(ssize_t,=20XCAR=20(crop)))=0A+=20=20=20=20=20=20=20= =20=20=20=20=20=20=20=20=20{=0A+=20=20=20=20=20=20=20=20=20=20=20=20=20=20= =20=20=20=20ssize_t=20crop_y=20=3D=20XINT=20(XCAR=20(crop));=0A+=20=20=20= =20=20=20=20=20=20=20=20=20=20=20=20=20=20=20MagickCropImage=20= (image_wand,=20crop_width,=20crop_height,=0A+=20=20=20=20=20=20=20=20=20=20= =20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= crop_x,=20crop_y);=0A+=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20}=0A= +=20=20=20=20=20=20=20=20=20=20=20=20}=0A+=20=20=20=20=20=20=20=20}=0A=20= =20=20=20=20}=0A=20=0A=20=20=20/*=20Furthermore=20:rotation.=20we=20need=20= background=20color=20and=20angle=20for=0A@@=20-8284,7=20+8284,7=20@@=20= imagemagick_load_image=20(struct=20frame=20*f,=20struct=20image=20*img,=0A= =20=20=20=20=20=20=20if=20(status=20=3D=3D=20MagickFalse)=0A=20=20=20=20=20= =20=20=20=20{=0A=20=20=20=20=20=20=20=20=20=20=20image_error=20= ("Imagemagick=20image=20rotate=20failed",=20Qnil,=20Qnil);=0A-=09=20=20= imagemagick_error=20(image_wand);=0A+=20=20=20=20=20=20=20=20=20=20= imagemagick_error=20(image_wand);=0A=20=20=20=20=20=20=20=20=20=20=20= goto=20imagemagick_error;=0A=20=20=20=20=20=20=20=20=20}=0A=20=20=20=20=20= }=0A@@=20-8311,7=20+8311,7=20@@=20imagemagick_load_image=20(struct=20= frame=20*f,=20struct=20image=20*img,=0A=20=20=20width=20=3D=20= MagickGetImageWidth=20(image_wand);=0A=20=0A=20=20=20if=20(!=20(width=20= <=3D=20INT_MAX=20&&=20height=20<=3D=20INT_MAX=0A-=09=20&&=20= check_image_size=20(f,=20width,=20height)))=0A+=20=20=20=20=20=20=20=20=20= &&=20check_image_size=20(f,=20width,=20height)))=0A=20=20=20=20=20{=0A=20= =20=20=20=20=20=20image_error=20("Invalid=20image=20size=20(see=20= `max-image-size')",=20Qnil,=20Qnil);=0A=20=20=20=20=20=20=20goto=20= imagemagick_error;=0A@@=20-8332,14=20+8332,14=20@@=20= imagemagick_load_image=20(struct=20frame=20*f,=20struct=20image=20*img,=0A= =20=20=20=20=20=20=20const=20char=20*exportdepth=20=3D=20imagedepth=20<=3D= =208=20?=20"I"=20:=20"BGRP";=20/*"RGBP";*/=0A=20=20=20=20=20=20=20/*=20= Try=20to=20create=20a=20x=20pixmap=20to=20hold=20the=20imagemagick=20= pixmap.=20=20*/=0A=20=20=20=20=20=20=20if=20= (!image_create_x_image_and_pixmap=20(f,=20img,=20width,=20height,=20= imagedepth,=0A-=09=09=09=09=09=20=20=20=20&ximg,=200))=0A-=09{=0A+=20=20=20= =20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= =20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20&ximg,=200))=0A+=20=20=20= =20=20=20=20=20{=0A=20#ifdef=20COLOR_TABLE_SUPPORT=0A-=09=20=20= free_color_table=20();=0A+=20=20=20=20=20=20=20=20=20=20free_color_table=20= ();=0A=20#endif=0A-=09=20=20image_error=20("Imagemagick=20X=20bitmap=20= allocation=20failure",=20Qnil,=20Qnil);=0A-=09=20=20goto=20= imagemagick_error;=0A-=09}=0A+=20=20=20=20=20=20=20=20=20=20image_error=20= ("Imagemagick=20X=20bitmap=20allocation=20failure",=20Qnil,=20Qnil);=0A+=20= =20=20=20=20=20=20=20=20=20goto=20imagemagick_error;=0A+=20=20=20=20=20=20= =20=20}=0A=20=0A=20=20=20=20=20=20=20/*=20Oddly,=20the=20below=20code=20= doesn't=20seem=20to=20work:*/=0A=20=20=20=20=20=20=20/*=20= switch(ximg->bitmap_unit){=20*/=0A@@=20-8362,7=20+8362,7=20@@=20= imagemagick_load_image=20(struct=20frame=20*f,=20struct=20image=20*img,=0A= =20=20=20=20=20=20=20*/=0A=20=20=20=20=20=20=20pixelwidth=20=3D=20= CharPixel;=20/*???=20TODO=20figure=20out*/=0A=20=20=20=20=20=20=20= MagickExportImagePixels=20(image_wand,=200,=200,=20width,=20height,=0A-=09= =09=09=20=20=20=20=20=20=20exportdepth,=20pixelwidth,=20ximg->data);=0A+=20= =20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= =20=20=20=20=20exportdepth,=20pixelwidth,=20ximg->data);=0A=20=20=20=20=20= }=0A=20=20=20else=0A=20#endif=20/*=20HAVE_MAGICKEXPORTIMAGEPIXELS=20*/=0A= @@=20-8371,10=20+8371,10=20@@=20imagemagick_load_image=20(struct=20frame=20= *f,=20struct=20image=20*img,=0A=20=0A=20=20=20=20=20=20=20/*=20Try=20to=20= create=20a=20x=20pixmap=20to=20hold=20the=20imagemagick=20pixmap.=20=20= */=0A=20=20=20=20=20=20=20if=20(!image_create_x_image_and_pixmap=20(f,=20= img,=20width,=20height,=200,=0A-=09=09=09=09=09=20=20=20=20&ximg,=200))=0A= +=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= =20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20&ximg,=200))=0A= =20=20=20=20=20=20=20=20=20{=0A=20#ifdef=20COLOR_TABLE_SUPPORT=0A-=09=20=20= free_color_table=20();=0A+=20=20=20=20=20=20=20=20=20=20free_color_table=20= ();=0A=20#endif=0A=20=20=20=20=20=20=20=20=20=20=20image_error=20= ("Imagemagick=20X=20bitmap=20allocation=20failure",=20Qnil,=20Qnil);=0A=20= =20=20=20=20=20=20=20=20=20=20goto=20imagemagick_error;=0A@@=20-8389,9=20= +8389,9=20@@=20imagemagick_load_image=20(struct=20frame=20*f,=20struct=20= image=20*img,=0A=20=20=20=20=20=20=20if=20(!=20iterator)=0A=20=20=20=20=20= =20=20=20=20{=0A=20#ifdef=20COLOR_TABLE_SUPPORT=0A-=09=20=20= free_color_table=20();=0A+=20=20=20=20=20=20=20=20=20=20free_color_table=20= ();=0A=20#endif=0A-=09=20=20x_destroy_x_image=20(ximg);=0A+=20=20=20=20=20= =20=20=20=20=20x_destroy_x_image=20(ximg);=0A=20=20=20=20=20=20=20=20=20=20= =20image_error=20("Imagemagick=20pixel=20iterator=20creation=20failed",=0A= =20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= Qnil,=20Qnil);=0A=20=20=20=20=20=20=20=20=20=20=20goto=20= imagemagick_error;=0A@@=20-8466,10=20+8466,10=20@@=20imagemagick_load=20= (struct=20frame=20*f,=20struct=20image=20*img)=0A=20=0A=20=20=20=20=20=20= =20file=20=3D=20x_find_image_file=20(file_name);=0A=20=20=20=20=20=20=20= if=20(!STRINGP=20(file))=0A-=09{=0A-=09=20=20image_error=20("Cannot=20= find=20image=20file=20`%s'",=20file_name,=20Qnil);=0A-=09=20=20return=20= 0;=0A-=09}=0A+=20=20=20=20=20=20=20=20{=0A+=20=20=20=20=20=20=20=20=20=20= image_error=20("Cannot=20find=20image=20file=20`%s'",=20file_name,=20= Qnil);=0A+=20=20=20=20=20=20=20=20=20=20return=200;=0A+=20=20=20=20=20=20= =20=20}=0A=20#ifdef=20WINDOWSNT=0A=20=20=20=20=20=20=20file=20=3D=20= ansi_encode_filename=20(file);=0A=20#endif=0A@@=20-8483,10=20+8483,10=20= @@=20imagemagick_load=20(struct=20frame=20*f,=20struct=20image=20*img)=0A= =20=0A=20=20=20=20=20=20=20data=20=3D=20image_spec_value=20(img->spec,=20= QCdata,=20NULL);=0A=20=20=20=20=20=20=20if=20(!STRINGP=20(data))=0A-=09{=0A= -=09=20=20image_error=20("Invalid=20image=20data=20`%s'",=20data,=20= Qnil);=0A-=09=20=20return=200;=0A-=09}=0A+=20=20=20=20=20=20=20=20{=0A+=20= =20=20=20=20=20=20=20=20=20image_error=20("Invalid=20image=20data=20= `%s'",=20data,=20Qnil);=0A+=20=20=20=20=20=20=20=20=20=20return=200;=0A+=20= =20=20=20=20=20=20=20}=0A=20=20=20=20=20=20=20success_p=20=3D=20= imagemagick_load_image=20(f,=20img,=20SDATA=20(data),=0A=20=20=20=20=20=20= =20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= =20=20=20=20=20=20=20=20=20=20=20=20SBYTES=20(data),=20NULL);=0A=20=20=20= =20=20}=0A@@=20-8533,7=20+8533,7=20@@=20and=20= `imagemagick-types-inhibit'.=20=20*/)=0A=20=0A=20=0C=0A=20= /***********************************************************************=0A= -=09=09=09=09=20SVG=0A+=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= =20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20SVG=0A=20=20= ***********************************************************************/=0A= =20=0A=20#if=20defined=20(HAVE_RSVG)=0A@@=20-8544,7=20+8544,7=20@@=20= static=20bool=20svg_image_p=20(Lisp_Object=20object);=0A=20static=20bool=20= svg_load=20(struct=20frame=20*f,=20struct=20image=20*img);=0A=20=0A=20= static=20bool=20svg_load_image=20(struct=20frame=20*,=20struct=20image=20= *,=0A-=09=09=09=20=20=20=20unsigned=20char=20*,=20ptrdiff_t);=0A+=20=20=20= =20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= unsigned=20char=20*,=20ptrdiff_t);=0A=20=0A=20/*=20The=20symbol=20`svg'=20= identifying=20images=20of=20this=20type.=20*/=0A=20=0A@@=20-8699,13=20= +8699,13=20@@=20init_svg_functions=20(void)=0A=20#define=20= fn_rsvg_handle_close=09=09rsvg_handle_close=0A=20#define=20= fn_rsvg_handle_get_pixbuf=09rsvg_handle_get_pixbuf=0A=20=0A-#define=20= fn_gdk_pixbuf_get_width=09=09=20=20gdk_pixbuf_get_width=0A-#define=20= fn_gdk_pixbuf_get_height=09=20=20gdk_pixbuf_get_height=0A-#define=20= fn_gdk_pixbuf_get_pixels=09=20=20gdk_pixbuf_get_pixels=0A-#define=20= fn_gdk_pixbuf_get_rowstride=09=20=20gdk_pixbuf_get_rowstride=0A-#define=20= fn_gdk_pixbuf_get_colorspace=09=20=20gdk_pixbuf_get_colorspace=0A= -#define=20fn_gdk_pixbuf_get_n_channels=09=20=20= gdk_pixbuf_get_n_channels=0A-#define=20fn_gdk_pixbuf_get_has_alpha=09=20=20= gdk_pixbuf_get_has_alpha=0A+#define=20fn_gdk_pixbuf_get_width=20=20=20=20= =20=20=20=20=20=20=20gdk_pixbuf_get_width=0A+#define=20= fn_gdk_pixbuf_get_height=20=20=20=20=20=20=20=20=20=20= gdk_pixbuf_get_height=0A+#define=20fn_gdk_pixbuf_get_pixels=20=20=20=20=20= =20=20=20=20=20gdk_pixbuf_get_pixels=0A+#define=20= fn_gdk_pixbuf_get_rowstride=20=20=20=20=20=20=20gdk_pixbuf_get_rowstride=0A= +#define=20fn_gdk_pixbuf_get_colorspace=20=20=20=20=20=20= gdk_pixbuf_get_colorspace=0A+#define=20fn_gdk_pixbuf_get_n_channels=20=20= =20=20=20=20gdk_pixbuf_get_n_channels=0A+#define=20= fn_gdk_pixbuf_get_has_alpha=20=20=20=20=20=20=20gdk_pixbuf_get_has_alpha=0A= =20#define=20fn_gdk_pixbuf_get_bits_per_sample=20= gdk_pixbuf_get_bits_per_sample=0A=20=0A=20#if=20!=20GLIB_CHECK_VERSION=20= (2,=2036,=200)=0A@@=20-8734,18=20+8734,18=20@@=20svg_load=20(struct=20= frame=20*f,=20struct=20image=20*img)=0A=20=0A=20=20=20=20=20=20=20file=20= =3D=20x_find_image_file=20(file_name);=0A=20=20=20=20=20=20=20if=20= (!STRINGP=20(file))=0A-=09{=0A-=09=20=20image_error=20("Cannot=20find=20= image=20file=20`%s'",=20file_name,=20Qnil);=0A-=09=20=20return=200;=0A-=09= }=0A+=20=20=20=20=20=20=20=20{=0A+=20=20=20=20=20=20=20=20=20=20= image_error=20("Cannot=20find=20image=20file=20`%s'",=20file_name,=20= Qnil);=0A+=20=20=20=20=20=20=20=20=20=20return=200;=0A+=20=20=20=20=20=20= =20=20}=0A=20=0A=20=20=20=20=20=20=20/*=20Read=20the=20entire=20file=20= into=20memory.=20=20*/=0A=20=20=20=20=20=20=20contents=20=3D=20= slurp_file=20(SSDATA=20(file),=20&size);=0A=20=20=20=20=20=20=20if=20= (contents=20=3D=3D=20NULL)=0A-=09{=0A-=09=20=20image_error=20("Error=20= loading=20SVG=20image=20`%s'",=20img->spec,=20Qnil);=0A-=09=20=20return=20= 0;=0A-=09}=0A+=20=20=20=20=20=20=20=20{=0A+=20=20=20=20=20=20=20=20=20=20= image_error=20("Error=20loading=20SVG=20image=20`%s'",=20img->spec,=20= Qnil);=0A+=20=20=20=20=20=20=20=20=20=20return=200;=0A+=20=20=20=20=20=20= =20=20}=0A=20=20=20=20=20=20=20/*=20If=20the=20file=20was=20slurped=20= into=20memory=20properly,=20parse=20it.=20=20*/=0A=20=20=20=20=20=20=20= success_p=20=3D=20svg_load_image=20(f,=20img,=20contents,=20size);=0A=20=20= =20=20=20=20=20xfree=20(contents);=0A@@=20-8758,10=20+8758,10=20@@=20= svg_load=20(struct=20frame=20*f,=20struct=20image=20*img)=0A=20=0A=20=20=20= =20=20=20=20data=20=3D=20image_spec_value=20(img->spec,=20QCdata,=20= NULL);=0A=20=20=20=20=20=20=20if=20(!STRINGP=20(data))=0A-=09{=0A-=09=20=20= image_error=20("Invalid=20image=20data=20`%s'",=20data,=20Qnil);=0A-=09=20= =20return=200;=0A-=09}=0A+=20=20=20=20=20=20=20=20{=0A+=20=20=20=20=20=20= =20=20=20=20image_error=20("Invalid=20image=20data=20`%s'",=20data,=20= Qnil);=0A+=20=20=20=20=20=20=20=20=20=20return=200;=0A+=20=20=20=20=20=20= =20=20}=0A=20=20=20=20=20=20=20success_p=20=3D=20svg_load_image=20(f,=20= img,=20SDATA=20(data),=20SBYTES=20(data));=0A=20=20=20=20=20}=0A=20=0A@@=20= -8777,9=20+8777,9=20@@=20svg_load=20(struct=20frame=20*f,=20struct=20= image=20*img)=0A=20=20=20=20Returns=20true=20when=20successful.=20=20*/=0A= =20static=20bool=0A=20svg_load_image=20(struct=20frame=20*f,=20=20=20=20=20= =20=20=20=20/*=20Pointer=20to=20emacs=20frame=20structure.=20=20*/=0A-=09= =09struct=20image=20*img,=20=20=20=20=20=20=20/*=20Pointer=20to=20emacs=20= image=20structure.=20=20*/=0A-=09=09unsigned=20char=20*contents,=20/*=20= String=20containing=20the=20SVG=20XML=20data=20to=20be=20parsed.=20=20*/=0A= -=09=09ptrdiff_t=20size)=20=20=20=20=20=20=20=20=20=20/*=20Size=20of=20= data=20in=20bytes.=20=20*/=0A+=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= =20struct=20image=20*img,=20=20=20=20=20=20=20/*=20Pointer=20to=20emacs=20= image=20structure.=20=20*/=0A+=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= =20unsigned=20char=20*contents,=20/*=20String=20containing=20the=20SVG=20= XML=20data=20to=20be=20parsed.=20=20*/=0A+=20=20=20=20=20=20=20=20=20=20=20= =20=20=20=20=20ptrdiff_t=20size)=20=20=20=20=20=20=20=20=20=20/*=20Size=20= of=20data=20in=20bytes.=20=20*/=0A=20{=0A=20=20=20RsvgHandle=20= *rsvg_handle;=0A=20=20=20RsvgDimensionData=20dimension_data;=0A@@=20= -8868,26=20+8868,26=20@@=20svg_load_image=20(struct=20frame=20*f,=20=20=20= =20=20=20=20=20=20/*=20Pointer=20to=20emacs=20frame=20structure.=20=20*=0A= =20=20=20for=20(y=20=3D=200;=20y=20<=20height;=20++y)=0A=20=20=20=20=20{=0A= =20=20=20=20=20=20=20for=20(x=20=3D=200;=20x=20<=20width;=20++x)=0A-=09{=0A= -=09=20=20int=20red;=0A-=09=20=20int=20green;=0A-=09=20=20int=20blue;=0A= -=09=20=20int=20opacity;=0A-=0A-=09=20=20red=20=20=20=20=20=3D=20= *pixels++;=0A-=09=20=20green=20=20=20=3D=20*pixels++;=0A-=09=20=20blue=20= =20=20=20=3D=20*pixels++;=0A-=09=20=20opacity=20=3D=20*pixels++;=0A-=0A-=09= =20=20red=20=20=20=3D=20((red=20*=20opacity)=0A-=09=09=20=20=20+=20= (background.red=20*=20((1=20<<=208)=20-=20opacity)));=0A-=09=20=20green=20= =3D=20((green=20*=20opacity)=0A-=09=09=20=20=20+=20(background.green=20*=20= ((1=20<<=208)=20-=20opacity)));=0A-=09=20=20blue=20=20=3D=20((blue=20*=20= opacity)=0A-=09=09=20=20=20+=20(background.blue=20*=20((1=20<<=208)=20-=20= opacity)));=0A-=0A-=09=20=20XPutPixel=20(ximg,=20x,=20y,=20= lookup_rgb_color=20(f,=20red,=20green,=20blue));=0A-=09}=0A+=20=20=20=20=20= =20=20=20{=0A+=20=20=20=20=20=20=20=20=20=20int=20red;=0A+=20=20=20=20=20= =20=20=20=20=20int=20green;=0A+=20=20=20=20=20=20=20=20=20=20int=20blue;=0A= +=20=20=20=20=20=20=20=20=20=20int=20opacity;=0A+=0A+=20=20=20=20=20=20=20= =20=20=20red=20=20=20=20=20=3D=20*pixels++;=0A+=20=20=20=20=20=20=20=20=20= =20green=20=20=20=3D=20*pixels++;=0A+=20=20=20=20=20=20=20=20=20=20blue=20= =20=20=20=3D=20*pixels++;=0A+=20=20=20=20=20=20=20=20=20=20opacity=20=3D=20= *pixels++;=0A+=0A+=20=20=20=20=20=20=20=20=20=20red=20=20=20=3D=20((red=20= *=20opacity)=0A+=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= +=20(background.red=20*=20((1=20<<=208)=20-=20opacity)));=0A+=20=20=20=20= =20=20=20=20=20=20green=20=3D=20((green=20*=20opacity)=0A+=20=20=20=20=20= =20=20=20=20=20=20=20=20=20=20=20=20=20=20+=20(background.green=20*=20= ((1=20<<=208)=20-=20opacity)));=0A+=20=20=20=20=20=20=20=20=20=20blue=20=20= =3D=20((blue=20*=20opacity)=0A+=20=20=20=20=20=20=20=20=20=20=20=20=20=20= =20=20=20=20=20+=20(background.blue=20*=20((1=20<<=208)=20-=20= opacity)));=0A+=0A+=20=20=20=20=20=20=20=20=20=20XPutPixel=20(ximg,=20x,=20= y,=20lookup_rgb_color=20(f,=20red,=20green,=20blue));=0A+=20=20=20=20=20=20= =20=20}=0A=20=0A=20=20=20=20=20=20=20pixels=20+=3D=20rowstride=20-=204=20= *=20width;=0A=20=20=20=20=20}=0A@@=20-8927,7=20+8927,7=20@@=20= svg_load_image=20(struct=20frame=20*f,=20=20=20=20=20=20=20=20=20/*=20= Pointer=20to=20emacs=20frame=20structure.=20=20*=0A=20=0A=20=0C=0A=20= /***********************************************************************=0A= -=09=09=09=09Ghostscript=0A+=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= =20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20Ghostscript=0A=20=20= ***********************************************************************/=0A= =20=0A=20#ifdef=20HAVE_X_WINDOWS=0A@@=20-9026,18=20+9026,18=20@@=20= gs_image_p=20(Lisp_Object=20object)=0A=20=20=20if=20(CONSP=20(tem))=0A=20= =20=20=20=20{=0A=20=20=20=20=20=20=20for=20(i=20=3D=200;=20i=20<=204;=20= ++i,=20tem=20=3D=20XCDR=20(tem))=0A-=09if=20(!CONSP=20(tem)=20||=20= !INTEGERP=20(XCAR=20(tem)))=0A-=09=20=20return=200;=0A+=20=20=20=20=20=20= =20=20if=20(!CONSP=20(tem)=20||=20!INTEGERP=20(XCAR=20(tem)))=0A+=20=20=20= =20=20=20=20=20=20=20return=200;=0A=20=20=20=20=20=20=20if=20(!NILP=20= (tem))=0A-=09return=200;=0A+=20=20=20=20=20=20=20=20return=200;=0A=20=20=20= =20=20}=0A=20=20=20else=20if=20(VECTORP=20(tem))=0A=20=20=20=20=20{=0A=20= =20=20=20=20=20=20if=20(ASIZE=20(tem)=20!=3D=204)=0A-=09return=200;=0A+=20= =20=20=20=20=20=20=20return=200;=0A=20=20=20=20=20=20=20for=20(i=20=3D=20= 0;=20i=20<=204;=20++i)=0A-=09if=20(!INTEGERP=20(AREF=20(tem,=20i)))=0A-=09= =20=20return=200;=0A+=20=20=20=20=20=20=20=20if=20(!INTEGERP=20(AREF=20= (tem,=20i)))=0A+=20=20=20=20=20=20=20=20=20=20return=200;=0A=20=20=20=20=20= }=0A=20=20=20else=0A=20=20=20=20=20return=200;=0A@@=20-9071,7=20+9071,7=20= @@=20gs_load=20(struct=20frame=20*f,=20struct=20image=20*img)=0A=20=20=20= in_height=20*=3D=20FRAME_RES_Y=20(f);=0A=20=0A=20=20=20if=20(!=20= (in_width=20<=3D=20INT_MAX=20&&=20in_height=20<=3D=20INT_MAX=0A-=09=20&&=20= check_image_size=20(f,=20in_width,=20in_height)))=0A+=20=20=20=20=20=20=20= =20=20&&=20check_image_size=20(f,=20in_width,=20in_height)))=0A=20=20=20=20= =20{=0A=20=20=20=20=20=20=20image_error=20("Invalid=20image=20size=20= (see=20`max-image-size')",=20Qnil,=20Qnil);=0A=20=20=20=20=20=20=20= return=200;=0A@@=20-9087,8=20+9087,8=20@@=20gs_load=20(struct=20frame=20= *f,=20struct=20image=20*img)=0A=20=20=20=20=20=20=20/*=20Only=20W32=20= version=20did=20BLOCK_INPUT=20here.=20=20++kfs=20*/=0A=20=20=20=20=20=20=20= block_input=20();=0A=20=20=20=20=20=20=20img->pixmap=20=3D=20= XCreatePixmap=20(FRAME_X_DISPLAY=20(f),=20FRAME_X_WINDOW=20(f),=0A-=09=09= =09=09=20=20=20img->width,=20img->height,=0A-=09=09=09=09=20=20=20= DefaultDepthOfScreen=20(FRAME_X_SCREEN=20(f)));=0A+=20=20=20=20=20=20=20=20= =20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= =20=20img->width,=20img->height,=0A+=20=20=20=20=20=20=20=20=20=20=20=20=20= =20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= DefaultDepthOfScreen=20(FRAME_X_SCREEN=20(f)));=0A=20=20=20=20=20=20=20= unblock_input=20();=0A=20=20=20=20=20}=0A=20=0A@@=20-9118,10=20+9118,10=20= @@=20gs_load=20(struct=20frame=20*f,=20struct=20image=20*img)=0A=20=20=20= =20=20loader=20=3D=20intern=20("gs-load-image");=0A=20=0A=20=20=20= img->lisp_data=20=3D=20call6=20(loader,=20frame,=20img->spec,=0A-=09=09=09= =20=20make_number=20(img->width),=0A-=09=09=09=20=20make_number=20= (img->height),=0A-=09=09=09=20=20window_and_pixmap_id,=0A-=09=09=09=20=20= pixel_colors);=0A+=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= =20=20=20=20=20=20=20make_number=20(img->width),=0A+=20=20=20=20=20=20=20= =20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20make_number=20= (img->height),=0A+=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= =20=20=20=20=20=20=20window_and_pixmap_id,=0A+=20=20=20=20=20=20=20=20=20= =20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20pixel_colors);=0A=20=20= =20return=20PROCESSP=20(img->lisp_data);=0A=20}=0A=20=0A@@=20-9169,44=20= +9169,44=20@@=20x_kill_gs_process=20(Pixmap=20pixmap,=20struct=20frame=20= *f)=0A=20=0A=20=20=20=20=20=20=20/*=20Try=20to=20get=20an=20XImage=20for=20= img->pixmep.=20=20*/=0A=20=20=20=20=20=20=20ximg=20=3D=20XGetImage=20= (FRAME_X_DISPLAY=20(f),=20img->pixmap,=0A-=09=09=090,=200,=20img->width,=20= img->height,=20~0,=20ZPixmap);=0A+=20=20=20=20=20=20=20=20=20=20=20=20=20= =20=20=20=20=20=20=20=20=20=20=200,=200,=20img->width,=20img->height,=20= ~0,=20ZPixmap);=0A=20=20=20=20=20=20=20if=20(ximg)=0A-=09{=0A-=09=20=20= int=20x,=20y;=0A-=0A-=09=20=20/*=20Initialize=20the=20color=20table.=20=20= */=0A-=09=20=20init_color_table=20();=0A-=0A-=09=20=20/*=20For=20each=20= pixel=20of=20the=20image,=20look=20its=20color=20up=20in=20the=0A-=09=20=20= =20=20=20color=20table.=20=20After=20having=20done=20so,=20the=20color=20= table=20will=0A-=09=20=20=20=20=20contain=20an=20entry=20for=20each=20= color=20used=20by=20the=20image.=20=20*/=0A-=09=20=20for=20(y=20=3D=200;=20= y=20<=20img->height;=20++y)=0A-=09=20=20=20=20for=20(x=20=3D=200;=20x=20= <=20img->width;=20++x)=0A-=09=20=20=20=20=20=20{=0A-=09=09unsigned=20= long=20pixel=20=3D=20XGetPixel=20(ximg,=20x,=20y);=0A-=09=09= lookup_pixel_color=20(f,=20pixel);=0A-=09=20=20=20=20=20=20}=0A-=0A-=09=20= =20/*=20Record=20colors=20in=20the=20image.=20=20Free=20color=20table=20= and=20XImage.=20=20*/=0A+=20=20=20=20=20=20=20=20{=0A+=20=20=20=20=20=20=20= =20=20=20int=20x,=20y;=0A+=0A+=20=20=20=20=20=20=20=20=20=20/*=20= Initialize=20the=20color=20table.=20=20*/=0A+=20=20=20=20=20=20=20=20=20=20= init_color_table=20();=0A+=0A+=20=20=20=20=20=20=20=20=20=20/*=20For=20= each=20pixel=20of=20the=20image,=20look=20its=20color=20up=20in=20the=0A= +=20=20=20=20=20=20=20=20=20=20=20=20=20color=20table.=20=20After=20= having=20done=20so,=20the=20color=20table=20will=0A+=20=20=20=20=20=20=20= =20=20=20=20=20=20contain=20an=20entry=20for=20each=20color=20used=20by=20= the=20image.=20=20*/=0A+=20=20=20=20=20=20=20=20=20=20for=20(y=20=3D=20= 0;=20y=20<=20img->height;=20++y)=0A+=20=20=20=20=20=20=20=20=20=20=20=20= for=20(x=20=3D=200;=20x=20<=20img->width;=20++x)=0A+=20=20=20=20=20=20=20= =20=20=20=20=20=20=20{=0A+=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= unsigned=20long=20pixel=20=3D=20XGetPixel=20(ximg,=20x,=20y);=0A+=20=20=20= =20=20=20=20=20=20=20=20=20=20=20=20=20lookup_pixel_color=20(f,=20= pixel);=0A+=20=20=20=20=20=20=20=20=20=20=20=20=20=20}=0A+=0A+=20=20=20=20= =20=20=20=20=20=20/*=20Record=20colors=20in=20the=20image.=20=20Free=20= color=20table=20and=20XImage.=20=20*/=0A=20#ifdef=20COLOR_TABLE_SUPPORT=0A= -=09=20=20img->colors=20=3D=20colors_in_color_table=20(&img->ncolors);=0A= -=09=20=20free_color_table=20();=0A+=20=20=20=20=20=20=20=20=20=20= img->colors=20=3D=20colors_in_color_table=20(&img->ncolors);=0A+=20=20=20= =20=20=20=20=20=20=20free_color_table=20();=0A=20#endif=0A-=09=20=20= XDestroyImage=20(ximg);=0A+=20=20=20=20=20=20=20=20=20=20XDestroyImage=20= (ximg);=0A=20=0A=20#if=200=20/*=20This=20doesn't=20seem=20to=20be=20the=20= case.=20=20If=20we=20free=20the=20colors=0A-=09=20here,=20we=20get=20a=20= BadAccess=20later=20in=20x_clear_image=20when=0A-=09=20freeing=20the=20= colors.=20=20*/=0A-=09=20=20/*=20We=20have=20allocated=20colors=20once,=20= but=20Ghostscript=20has=20also=0A-=09=20=20=20=20=20allocated=20colors=20= on=20behalf=20of=20us.=20=20So,=20to=20get=20the=0A-=09=20=20=20=20=20= reference=20counts=20right,=20free=20them=20once.=20=20*/=0A-=09=20=20if=20= (img->ncolors)=0A-=09=20=20=20=20x_free_colors=20(f,=20img->colors,=20= img->ncolors);=0A+=20=20=20=20=20=20=20=20=20here,=20we=20get=20a=20= BadAccess=20later=20in=20x_clear_image=20when=0A+=20=20=20=20=20=20=20=20= =20freeing=20the=20colors.=20=20*/=0A+=20=20=20=20=20=20=20=20=20=20/*=20= We=20have=20allocated=20colors=20once,=20but=20Ghostscript=20has=20also=0A= +=20=20=20=20=20=20=20=20=20=20=20=20=20allocated=20colors=20on=20behalf=20= of=20us.=20=20So,=20to=20get=20the=0A+=20=20=20=20=20=20=20=20=20=20=20=20= =20reference=20counts=20right,=20free=20them=20once.=20=20*/=0A+=20=20=20= =20=20=20=20=20=20=20if=20(img->ncolors)=0A+=20=20=20=20=20=20=20=20=20=20= =20=20x_free_colors=20(f,=20img->colors,=20img->ncolors);=0A=20#endif=0A= -=09}=0A+=20=20=20=20=20=20=20=20}=0A=20=20=20=20=20=20=20else=0A-=09= image_error=20("Cannot=20get=20X=20image=20of=20`%s';=20colors=20will=20= not=20be=20freed",=0A-=09=09=20=20=20=20=20img->spec,=20Qnil);=0A+=20=20=20= =20=20=20=20=20image_error=20("Cannot=20get=20X=20image=20of=20`%s';=20= colors=20will=20not=20be=20freed",=0A+=20=20=20=20=20=20=20=20=20=20=20=20= =20=20=20=20=20=20=20=20=20img->spec,=20Qnil);=0A=20=0A=20=20=20=20=20=20= =20unblock_input=20();=0A=20=20=20=20=20}=0A@@=20-9223,7=20+9223,7=20@@=20= x_kill_gs_process=20(Pixmap=20pixmap,=20struct=20frame=20*f)=0A=20=0A=20=0C= =0A=20= /***********************************************************************=0A= -=09=09=09=09Tests=0A+=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= =20=20=20=20=20=20=20=20=20=20=20=20=20=20=20Tests=0A=20=20= ***********************************************************************/=0A= =20=0A=20#ifdef=20GLYPH_DEBUG=0A@@=20-9252,7=20+9252,7=20@@=20DEFUN=20= ("lookup-image",=20Flookup_image,=20Slookup_image,=201,=201,=200,=20"")=0A= =20=0A=20=0A=20= /***********************************************************************=0A= -=09=09=09=20=20=20=20Initialization=0A+=20=20=20=20=20=20=20=20=20=20=20= =20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20Initialization=0A=20=20= ***********************************************************************/=0A= =20=0A=20DEFUN=20("init-image-library",=20Finit_image_library,=20= Sinit_image_library,=201,=201,=200,=0A@@=20-9401,29=20+9401,29=20@@=20= non-numeric,=20there=20is=20no=20explicit=20limit=20on=20the=20size=20of=20= images.=20=20*/);=0A=20=20=20DEFSYM=20(Qlibpng_version,=20= "libpng-version");=0A=20=20=20Fset=20(Qlibpng_version,=0A=20#if=20= HAVE_PNG=0A-=09make_number=20(PNG_LIBPNG_VER)=0A+=20=20=20=20=20=20=20=20= make_number=20(PNG_LIBPNG_VER)=0A=20#else=0A-=09make_number=20(-1)=0A+=20= =20=20=20=20=20=20=20make_number=20(-1)=0A=20#endif=0A-=09);=0A+=20=20=20= =20=20=20=20=20);=0A=20=20=20DEFSYM=20(Qlibgif_version,=20= "libgif-version");=0A=20=20=20Fset=20(Qlibgif_version,=0A=20#ifdef=20= HAVE_GIF=0A-=09make_number=20(GIFLIB_MAJOR=20*=2010000=0A-=09=09=20=20=20= =20=20+=20GIFLIB_MINOR=20*=20100=0A-=09=09=20=20=20=20=20+=20= GIFLIB_RELEASE)=0A+=20=20=20=20=20=20=20=20make_number=20(GIFLIB_MAJOR=20= *=2010000=0A+=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= =20+=20GIFLIB_MINOR=20*=20100=0A+=20=20=20=20=20=20=20=20=20=20=20=20=20=20= =20=20=20=20=20=20=20+=20GIFLIB_RELEASE)=0A=20#else=0A-=09make_number=20= (-1)=0A+=20=20=20=20=20=20=20=20make_number=20(-1)=0A=20#endif=0A=20=20=20= =20=20=20=20=20=20);=0A=20=20=20DEFSYM=20(Qlibjpeg_version,=20= "libjpeg-version");=0A=20=20=20Fset=20(Qlibjpeg_version,=0A=20#if=20= HAVE_JPEG=0A-=09make_number=20(JPEG_LIB_VERSION)=0A+=20=20=20=20=20=20=20= =20make_number=20(JPEG_LIB_VERSION)=0A=20#else=0A-=09make_number=20(-1)=0A= +=20=20=20=20=20=20=20=20make_number=20(-1)=0A=20#endif=0A-=09);=0A+=20=20= =20=20=20=20=20=20);=0A=20#endif=0A=20=0A=20=20=20DEFSYM=20(Qpbm,=20= "pbm");=0A--=20=0A1.9.0=0A=0A= --Apple-Mail=_B9BABFF6-C986-46E2-A0C0-DA895C90D84D Content-Disposition: attachment; filename=0002-remove-visibility-of-some-variables.patch Content-Type: application/octet-stream; name="0002-remove-visibility-of-some-variables.patch" Content-Transfer-Encoding: quoted-printable =46rom=2023c8e58ebc66453b9bf5edc357028ce8b7cb15c9=20Mon=20Sep=2017=20= 00:00:00=202001=0AFrom:=20=3D?UTF-8?q?Nicolas=3D20L=3DC3=3DA9veill=3DC3=3D= A9?=3D=20=0ADate:=20Sat,=2017=20May=202014=20= 13:41:51=20+0200=0ASubject:=20[PATCH=202/3]=20remove=20visibility=20of=20= some=20variables=0A=0A---=0A=20src/image.c=20|=206=20+++---=0A=201=20= file=20changed,=203=20insertions(+),=203=20deletions(-)=0A=0Adiff=20= --git=20a/src/image.c=20b/src/image.c=0Aindex=207ae417c..b2c74c9=20= 100644=0A---=20a/src/image.c=0A+++=20b/src/image.c=0A@@=20-8143,8=20= +8143,7=20@@=20imagemagick_load_image=20(struct=20frame=20*f,=20struct=20= image=20*img,=0A=20=20=20int=20x,=20y;=0A=20=20=20MagickWand=20= *image_wand;=0A=20=20=20PixelIterator=20*iterator;=0A-=20=20PixelWand=20= **pixels,=20*bg_wand=20=3D=20NULL;=0A-=20=20MagickPixelPacket=20=20= pixel;=0A+=20=20PixelWand=20*bg_wand=20=3D=20NULL;=0A=20=20=20= Lisp_Object=20image;=0A=20=20=20Lisp_Object=20value;=0A=20=20=20= Lisp_Object=20crop;=0A@@=20-8400,11=20+8399,12=20@@=20= imagemagick_load_image=20(struct=20frame=20*f,=20struct=20image=20*img,=0A= =20=20=20=20=20=20=20image_height=20=3D=20MagickGetImageHeight=20= (image_wand);=0A=20=20=20=20=20=20=20for=20(y=20=3D=200;=20y=20<=20= image_height;=20y++)=0A=20=20=20=20=20=20=20=20=20{=0A-=20=20=20=20=20=20= =20=20=20=20pixels=20=3D=20PixelGetNextIteratorRow=20(iterator,=20= &width);=0A+=20=20=20=20=20=20=20=20=20=20PixelWand=20**pixels=20=3D=20= PixelGetNextIteratorRow=20(iterator,=20&width);=0A=20=20=20=20=20=20=20=20= =20=20=20if=20(!=20pixels)=0A=20=20=20=20=20=20=20=20=20=20=20=20=20= break;=0A=20=20=20=20=20=20=20=20=20=20=20for=20(x=20=3D=200;=20x=20<=20= (long)=20width;=20x++)=0A=20=20=20=20=20=20=20=20=20=20=20=20=20{=0A+=20=20= =20=20=20=20=20=20=20=20=20=20=20=20MagickPixelPacket=20pixel;=0A=20=20=20= =20=20=20=20=20=20=20=20=20=20=20=20PixelGetMagickColor=20(pixels[x],=20= &pixel);=0A=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20XPutPixel=20= (ximg,=20x,=20y,=0A=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= =20=20=20=20=20=20=20=20lookup_rgb_color=20(f,=0A--=20=0A1.9.0=0A=0A= --Apple-Mail=_B9BABFF6-C986-46E2-A0C0-DA895C90D84D Content-Disposition: attachment; filename=0003-properly-scale-pixels-from-pixelmagick.patch Content-Type: application/octet-stream; name="0003-properly-scale-pixels-from-pixelmagick.patch" Content-Transfer-Encoding: quoted-printable =46rom=204d4470c72fe509aac53cec681b4e90a7856c1273=20Mon=20Sep=2017=20= 00:00:00=202001=0AFrom:=20=3D?UTF-8?q?Nicolas=3D20L=3DC3=3DA9veill=3DC3=3D= A9?=3D=20=0ADate:=20Sat,=2017=20May=202014=20= 15:14:17=20+0200=0ASubject:=20[PATCH=203/3]=20properly=20scale=20pixels=20= from=20pixelmagick=0A=0A---=0A=20src/image.c=20|=206=20+++---=0A=201=20= file=20changed,=203=20insertions(+),=203=20deletions(-)=0A=0Adiff=20= --git=20a/src/image.c=20b/src/image.c=0Aindex=20b2c74c9..b7be66c=20= 100644=0A---=20a/src/image.c=0A+++=20b/src/image.c=0A@@=20-8408,9=20= +8408,9=20@@=20imagemagick_load_image=20(struct=20frame=20*f,=20struct=20= image=20*img,=0A=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= PixelGetMagickColor=20(pixels[x],=20&pixel);=0A=20=20=20=20=20=20=20=20=20= =20=20=20=20=20=20XPutPixel=20(ximg,=20x,=20y,=0A=20=20=20=20=20=20=20=20= =20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20lookup_rgb_color=20= (f,=0A-=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= =20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= pixel.red,=0A-=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= =20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= pixel.green,=0A-=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= =20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= pixel.blue));=0A+=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= =20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= 65535.0*QuantumScale*pixel.red,=0A+=20=20=20=20=20=20=20=20=20=20=20=20=20= =20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= =20=20=20=20=2065535.0*QuantumScale*pixel.green,=0A+=20=20=20=20=20=20=20= =20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= =20=20=20=20=20=20=20=20=20=20=2065535.0*QuantumScale*pixel.blue));=0A=20= =20=20=20=20=20=20=20=20=20=20=20=20}=0A=20=20=20=20=20=20=20=20=20}=0A=20= =20=20=20=20=20=20DestroyPixelIterator=20(iterator);=0A--=20=0A1.9.0=0A=0A= --Apple-Mail=_B9BABFF6-C986-46E2-A0C0-DA895C90D84D Content-Transfer-Encoding: 7bit Content-Type: text/plain; charset=us-ascii --Apple-Mail=_B9BABFF6-C986-46E2-A0C0-DA895C90D84D--