annotate src/glyphs-eimage.c @ 5898:2aeaf9bc7175

Regenerate configure.
author Stephen J. Turnbull <stephen@xemacs.org>
date Tue, 05 May 2015 04:06:37 +0900
parents 56144c8593a8
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1 /* EImage-specific Lisp objects.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2 Copyright (C) 1993, 1994, 1998 Free Software Foundation, Inc.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3 Copyright (C) 1995 Board of Trustees, University of Illinois.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4 Copyright (C) 1995 Tinker Systems
5169
6c6d78781d59 cleanup of code related to xfree(), better KKCC backtrace capabilities, document XD_INLINE_LISP_OBJECT_BLOCK_PTR, fix some memory leaks, other code cleanup
Ben Wing <ben@xemacs.org>
parents: 5024
diff changeset
5 Copyright (C) 1995, 1996, 2001, 2002, 2004, 2005, 2010 Ben Wing
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6 Copyright (C) 1995 Sun Microsystems
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
7
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
8 This file is part of XEmacs.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
9
5402
308d34e9f07d Changed bulk of GPLv2 or later files identified by script
Mats Lidell <matsl@xemacs.org>
parents: 5250
diff changeset
10 XEmacs is free software: you can redistribute it and/or modify it
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
11 under the terms of the GNU General Public License as published by the
5402
308d34e9f07d Changed bulk of GPLv2 or later files identified by script
Mats Lidell <matsl@xemacs.org>
parents: 5250
diff changeset
12 Free Software Foundation, either version 3 of the License, or (at your
308d34e9f07d Changed bulk of GPLv2 or later files identified by script
Mats Lidell <matsl@xemacs.org>
parents: 5250
diff changeset
13 option) any later version.
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
14
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
15 XEmacs is distributed in the hope that it will be useful, but WITHOUT
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
16 ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
17 FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
18 for more details.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
19
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
20 You should have received a copy of the GNU General Public License
5402
308d34e9f07d Changed bulk of GPLv2 or later files identified by script
Mats Lidell <matsl@xemacs.org>
parents: 5250
diff changeset
21 along with XEmacs. If not, see <http://www.gnu.org/licenses/>. */
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
22
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
23 /* Synched up with: Not in FSF. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
24
2959
4eb2a8c07cb3 [xemacs-hg @ 2005-09-27 05:48:22 by ben]
ben
parents: 2563
diff changeset
25 /* Originally part of glyphs.c.
4eb2a8c07cb3 [xemacs-hg @ 2005-09-27 05:48:22 by ben]
ben
parents: 2563
diff changeset
26
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
27 GIF/JPEG support added by Ben Wing for 19.14
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
28 PNG support added by Bill Perry for 19.14
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
29 Improved GIF/JPEG support added by Bill Perry for 19.14
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
30 Cleanup/simplification of error handling by Ben Wing for 19.14
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
31 GIF support changed to external Gifreader lib by Jareth Hein for 21.0
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
32 Many changes for color work and optimizations by Jareth Hein for 21.0
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
33 Switch of GIF/JPEG/PNG to new EImage intermediate code by Jareth Hein for 21.0
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
34 TIFF code by Jareth Hein for 21.0
4708
1cecc3e9f0a0 Use giflib or libungif to provide GIF support, instead of using internal
Jerry James <james@xemacs.org>
parents: 4698
diff changeset
35 GIF support changed to external giflib by Jerry James for 21.5
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
36 TODO:
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
37 Convert images.el to C and stick it in here?
3094
ad2f4ae9895b [xemacs-hg @ 2005-11-26 11:45:47 by stephent]
stephent
parents: 2959
diff changeset
38 This file is really repetitious; can we refactor?
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
39 */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
40
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
41 #include <config.h>
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
42 #include "lisp.h"
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
43 #include "lstream.h"
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
44 #include "console.h"
872
79c6ff3eef26 [xemacs-hg @ 2002-06-20 21:18:01 by ben]
ben
parents: 867
diff changeset
45 #include "device-impl.h"
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
46 #include "faces.h"
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
47 #include "glyphs.h"
5176
8b2f75cecb89 rename objects* (.c, .h and .el files) to fontcolor*
Ben Wing <ben@xemacs.org>
parents: 5024
diff changeset
48 #include "fontcolor-impl.h"
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
49
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
50 #include "buffer.h"
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
51 #include "frame.h"
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
52 #include "opaque.h"
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
53 #include "window.h"
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
54
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
55 #include "sysfile.h"
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
56
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
57 #ifdef HAVE_PNG
1743
543769b89fed [xemacs-hg @ 2003-10-14 05:02:57 by james]
james
parents: 1726
diff changeset
58
543769b89fed [xemacs-hg @ 2003-10-14 05:02:57 by james]
james
parents: 1726
diff changeset
59 BEGIN_C_DECLS
543769b89fed [xemacs-hg @ 2003-10-14 05:02:57 by james]
james
parents: 1726
diff changeset
60
647
b39c14581166 [xemacs-hg @ 2001-08-13 04:45:47 by ben]
ben
parents: 638
diff changeset
61 #define message message_ /* Yuck */
5536
bbcf3f979099 Suppress the "undefined macros" warnings for zlib.
Stephen J. Turnbull <stephen@xemacs.org>
parents: 5473
diff changeset
62 #if !defined(_LARGEFILE64_SOURCE) /* Yuck**2 -- see <zconf.h>. */
bbcf3f979099 Suppress the "undefined macros" warnings for zlib.
Stephen J. Turnbull <stephen@xemacs.org>
parents: 5473
diff changeset
63 #define _LARGEFILE64_SOURCE 0
bbcf3f979099 Suppress the "undefined macros" warnings for zlib.
Stephen J. Turnbull <stephen@xemacs.org>
parents: 5473
diff changeset
64 #endif
bbcf3f979099 Suppress the "undefined macros" warnings for zlib.
Stephen J. Turnbull <stephen@xemacs.org>
parents: 5473
diff changeset
65 #if !defined(_FILE_OFFSET_BITS) /* Yuck**2 -- see <zlib.h>. */
bbcf3f979099 Suppress the "undefined macros" warnings for zlib.
Stephen J. Turnbull <stephen@xemacs.org>
parents: 5473
diff changeset
66 #define _FILE_OFFSET_BITS 0
bbcf3f979099 Suppress the "undefined macros" warnings for zlib.
Stephen J. Turnbull <stephen@xemacs.org>
parents: 5473
diff changeset
67 #endif
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
68 #include <png.h>
647
b39c14581166 [xemacs-hg @ 2001-08-13 04:45:47 by ben]
ben
parents: 638
diff changeset
69 #undef message
1743
543769b89fed [xemacs-hg @ 2003-10-14 05:02:57 by james]
james
parents: 1726
diff changeset
70
543769b89fed [xemacs-hg @ 2003-10-14 05:02:57 by james]
james
parents: 1726
diff changeset
71 END_C_DECLS
543769b89fed [xemacs-hg @ 2003-10-14 05:02:57 by james]
james
parents: 1726
diff changeset
72
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
73 #else
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
74 #include <setjmp.h>
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
75 #endif
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
76 #include "file-coding.h"
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
77
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
78 #ifdef HAVE_TIFF
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
79 DEFINE_IMAGE_INSTANTIATOR_FORMAT (tiff);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
80 Lisp_Object Qtiff;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
81 #endif
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
82
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
83 #ifdef HAVE_JPEG
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
84 DEFINE_IMAGE_INSTANTIATOR_FORMAT (jpeg);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
85 Lisp_Object Qjpeg;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
86 #endif
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
87
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
88 #ifdef HAVE_GIF
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
89 DEFINE_IMAGE_INSTANTIATOR_FORMAT (gif);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
90 Lisp_Object Qgif;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
91 #endif
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
92
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
93 #ifdef HAVE_PNG
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
94 DEFINE_IMAGE_INSTANTIATOR_FORMAT (png);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
95 Lisp_Object Qpng;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
96 #endif
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
97
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
98
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
99 #ifdef HAVE_JPEG
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
100
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
101 /**********************************************************************
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
102 * JPEG *
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
103 **********************************************************************/
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
104
1743
543769b89fed [xemacs-hg @ 2003-10-14 05:02:57 by james]
james
parents: 1726
diff changeset
105 BEGIN_C_DECLS
543769b89fed [xemacs-hg @ 2003-10-14 05:02:57 by james]
james
parents: 1726
diff changeset
106
4854
95c4ced5c07c fix compile problems
Ben Wing <ben@xemacs.org>
parents: 4834
diff changeset
107 #ifdef WIN32_ANY
95c4ced5c07c fix compile problems
Ben Wing <ben@xemacs.org>
parents: 4834
diff changeset
108 /* #### Yuck! More horrifitude. tiffio.h, below, and sysfile.h above,
95c4ced5c07c fix compile problems
Ben Wing <ben@xemacs.org>
parents: 4834
diff changeset
109 include <windows.h>, which defines INT32 and INT16, the former
95c4ced5c07c fix compile problems
Ben Wing <ben@xemacs.org>
parents: 4834
diff changeset
110 differently and incompatibly from jmorecfg.h, included by jpeglib.h. We
95c4ced5c07c fix compile problems
Ben Wing <ben@xemacs.org>
parents: 4834
diff changeset
111 can disable the stuff in jmorecfg.h by defining XMD_H (clever, huh?);
95c4ced5c07c fix compile problems
Ben Wing <ben@xemacs.org>
parents: 4834
diff changeset
112 then we define these typedefs the way that <windows.h> wants them (which
95c4ced5c07c fix compile problems
Ben Wing <ben@xemacs.org>
parents: 4834
diff changeset
113 is more correct, anyway; jmorecfg.h defines INT32 as `long'). */
2500
3d8143fc88e1 [xemacs-hg @ 2005-01-24 23:33:30 by ben]
ben
parents: 2367
diff changeset
114 #define XMD_H
3d8143fc88e1 [xemacs-hg @ 2005-01-24 23:33:30 by ben]
ben
parents: 2367
diff changeset
115 typedef signed int INT32;
3d8143fc88e1 [xemacs-hg @ 2005-01-24 23:33:30 by ben]
ben
parents: 2367
diff changeset
116 typedef signed short INT16;
4326
a5ff7e67ac1b Don't let libtiff override the size of a boolean, Win32. From Ron Isaacson.
Aidan Kehoe <kehoea@parhasard.net>
parents: 3839
diff changeset
117
a5ff7e67ac1b Don't let libtiff override the size of a boolean, Win32. From Ron Isaacson.
Aidan Kehoe <kehoea@parhasard.net>
parents: 3839
diff changeset
118 /* And another one... jmorecfg.h defines the 'boolean' type as int,
a5ff7e67ac1b Don't let libtiff override the size of a boolean, Win32. From Ron Isaacson.
Aidan Kehoe <kehoea@parhasard.net>
parents: 3839
diff changeset
119 which conflicts with the standard Windows 'boolean' definition as
a5ff7e67ac1b Don't let libtiff override the size of a boolean, Win32. From Ron Isaacson.
Aidan Kehoe <kehoea@parhasard.net>
parents: 3839
diff changeset
120 unsigned char. Ref: http://www.asmail.be/msg0054688232.html */
a5ff7e67ac1b Don't let libtiff override the size of a boolean, Win32. From Ron Isaacson.
Aidan Kehoe <kehoea@parhasard.net>
parents: 3839
diff changeset
121 #ifndef __RPCNDR_H__ /* don't conflict if rpcndr.h already read */
a5ff7e67ac1b Don't let libtiff override the size of a boolean, Win32. From Ron Isaacson.
Aidan Kehoe <kehoea@parhasard.net>
parents: 3839
diff changeset
122 typedef unsigned char boolean;
a5ff7e67ac1b Don't let libtiff override the size of a boolean, Win32. From Ron Isaacson.
Aidan Kehoe <kehoea@parhasard.net>
parents: 3839
diff changeset
123 #endif
a5ff7e67ac1b Don't let libtiff override the size of a boolean, Win32. From Ron Isaacson.
Aidan Kehoe <kehoea@parhasard.net>
parents: 3839
diff changeset
124 #define HAVE_BOOLEAN /* prevent jmorecfg.h from redefining it */
2500
3d8143fc88e1 [xemacs-hg @ 2005-01-24 23:33:30 by ben]
ben
parents: 2367
diff changeset
125 #endif
3d8143fc88e1 [xemacs-hg @ 2005-01-24 23:33:30 by ben]
ben
parents: 2367
diff changeset
126
5009
2eec7322eb7f Miscellaneous small fixes to Windows VS6 build
Vin Shelton <acs@xemacs.org>
parents: 4982
diff changeset
127 /* Yet more breakage... jmorecfg.h unconditionally defines FAR either as
2eec7322eb7f Miscellaneous small fixes to Windows VS6 build
Vin Shelton <acs@xemacs.org>
parents: 4982
diff changeset
128 "far" or as blank. Windef.h unconditionally defines FAR as "far".
2eec7322eb7f Miscellaneous small fixes to Windows VS6 build
Vin Shelton <acs@xemacs.org>
parents: 4982
diff changeset
129 We'll avoid the compile warning by redefing FAR the way windows defines it,
2eec7322eb7f Miscellaneous small fixes to Windows VS6 build
Vin Shelton <acs@xemacs.org>
parents: 4982
diff changeset
130 after loading the JPEG headers. */
2eec7322eb7f Miscellaneous small fixes to Windows VS6 build
Vin Shelton <acs@xemacs.org>
parents: 4982
diff changeset
131 #undef FAR
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
132 #include <jpeglib.h>
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
133 #include <jerror.h>
5009
2eec7322eb7f Miscellaneous small fixes to Windows VS6 build
Vin Shelton <acs@xemacs.org>
parents: 4982
diff changeset
134 #undef FAR
2eec7322eb7f Miscellaneous small fixes to Windows VS6 build
Vin Shelton <acs@xemacs.org>
parents: 4982
diff changeset
135 #define FAR far
1743
543769b89fed [xemacs-hg @ 2003-10-14 05:02:57 by james]
james
parents: 1726
diff changeset
136
543769b89fed [xemacs-hg @ 2003-10-14 05:02:57 by james]
james
parents: 1726
diff changeset
137 END_C_DECLS
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
138
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
139 /*#define USE_TEMP_FILES_FOR_JPEG_IMAGES 1*/
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
140 static void
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
141 jpeg_validate (Lisp_Object instantiator)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
142 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
143 file_or_data_must_be_present (instantiator);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
144 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
145
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
146 static Lisp_Object
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
147 jpeg_normalize (Lisp_Object inst, Lisp_Object console_type,
2286
04bc9d2f42c7 [xemacs-hg @ 2004-09-20 19:18:55 by james]
james
parents: 2270
diff changeset
148 Lisp_Object UNUSED (dest_mask))
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
149 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
150 return simple_image_type_normalize (inst, console_type, Qjpeg);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
151 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
152
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
153 static int
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
154 jpeg_possible_dest_types (void)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
155 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
156 return IMAGE_COLOR_PIXMAP_MASK;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
157 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
158
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
159 /* To survive the otherwise baffling complexity of making sure
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
160 everything gets cleaned up in the presence of an error, we
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
161 use an unwind_protect(). */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
162
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
163 struct jpeg_unwind_data
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
164 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
165 /* Stream that we need to close */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
166 FILE *instream;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
167 /* Object that holds state info for JPEG decoding */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
168 struct jpeg_decompress_struct *cinfo_ptr;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
169 /* EImage data */
2367
ecf1ebac70d8 [xemacs-hg @ 2004-11-04 23:05:23 by ben]
ben
parents: 2286
diff changeset
170 Binbyte *eimage;
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
171 };
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
172
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
173 static Lisp_Object
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
174 jpeg_instantiate_unwind (Lisp_Object unwind_obj)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
175 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
176 struct jpeg_unwind_data *data =
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
177 (struct jpeg_unwind_data *) get_opaque_ptr (unwind_obj);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
178
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
179 free_opaque_ptr (unwind_obj);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
180 if (data->cinfo_ptr)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
181 jpeg_destroy_decompress (data->cinfo_ptr);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
182
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
183 if (data->instream)
5169
6c6d78781d59 cleanup of code related to xfree(), better KKCC backtrace capabilities, document XD_INLINE_LISP_OBJECT_BLOCK_PTR, fix some memory leaks, other code cleanup
Ben Wing <ben@xemacs.org>
parents: 5024
diff changeset
184 {
6c6d78781d59 cleanup of code related to xfree(), better KKCC backtrace capabilities, document XD_INLINE_LISP_OBJECT_BLOCK_PTR, fix some memory leaks, other code cleanup
Ben Wing <ben@xemacs.org>
parents: 5024
diff changeset
185 retry_fclose (data->instream);
6c6d78781d59 cleanup of code related to xfree(), better KKCC backtrace capabilities, document XD_INLINE_LISP_OBJECT_BLOCK_PTR, fix some memory leaks, other code cleanup
Ben Wing <ben@xemacs.org>
parents: 5024
diff changeset
186 data->instream = 0;
6c6d78781d59 cleanup of code related to xfree(), better KKCC backtrace capabilities, document XD_INLINE_LISP_OBJECT_BLOCK_PTR, fix some memory leaks, other code cleanup
Ben Wing <ben@xemacs.org>
parents: 5024
diff changeset
187 }
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
188
1726
a8d8f419b459 [xemacs-hg @ 2003-09-30 15:26:34 by james]
james
parents: 872
diff changeset
189 if (data->eimage)
5169
6c6d78781d59 cleanup of code related to xfree(), better KKCC backtrace capabilities, document XD_INLINE_LISP_OBJECT_BLOCK_PTR, fix some memory leaks, other code cleanup
Ben Wing <ben@xemacs.org>
parents: 5024
diff changeset
190 {
6c6d78781d59 cleanup of code related to xfree(), better KKCC backtrace capabilities, document XD_INLINE_LISP_OBJECT_BLOCK_PTR, fix some memory leaks, other code cleanup
Ben Wing <ben@xemacs.org>
parents: 5024
diff changeset
191 xfree (data->eimage);
6c6d78781d59 cleanup of code related to xfree(), better KKCC backtrace capabilities, document XD_INLINE_LISP_OBJECT_BLOCK_PTR, fix some memory leaks, other code cleanup
Ben Wing <ben@xemacs.org>
parents: 5024
diff changeset
192 data->eimage = 0;
6c6d78781d59 cleanup of code related to xfree(), better KKCC backtrace capabilities, document XD_INLINE_LISP_OBJECT_BLOCK_PTR, fix some memory leaks, other code cleanup
Ben Wing <ben@xemacs.org>
parents: 5024
diff changeset
193 }
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
194
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
195 return Qnil;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
196 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
197
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
198 /*
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
199 * ERROR HANDLING:
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
200 *
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
201 * The JPEG library's standard error handler (jerror.c) is divided into
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
202 * several "methods" which you can override individually. This lets you
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
203 * adjust the behavior without duplicating a lot of code, which you might
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
204 * have to update with each future release.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
205 *
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
206 * Our example here shows how to override the "error_exit" method so that
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
207 * control is returned to the library's caller when a fatal error occurs,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
208 * rather than calling exit() as the standard error_exit method does.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
209 *
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
210 * We use C's setjmp/longjmp facility to return control. This means that the
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
211 * routine which calls the JPEG library must first execute a setjmp() call to
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
212 * establish the return point. We want the replacement error_exit to do a
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
213 * longjmp(). But we need to make the setjmp buffer accessible to the
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
214 * error_exit routine. To do this, we make a private extension of the
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
215 * standard JPEG error handler object. (If we were using C++, we'd say we
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
216 * were making a subclass of the regular error handler.)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
217 *
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
218 * Here's the extended error handler struct:
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
219 */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
220
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
221 struct my_jpeg_error_mgr
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
222 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
223 struct jpeg_error_mgr pub; /* "public" fields */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
224 jmp_buf setjmp_buffer; /* for return to caller */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
225 };
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
226
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
227 #if defined(JPEG_LIB_VERSION) && (JPEG_LIB_VERSION >= 61)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
228 METHODDEF(void)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
229 #else
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
230 METHODDEF void
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
231 #endif
2286
04bc9d2f42c7 [xemacs-hg @ 2004-09-20 19:18:55 by james]
james
parents: 2270
diff changeset
232 our_init_source (j_decompress_ptr UNUSED (cinfo))
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
233 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
234 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
235
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
236 #if defined(JPEG_LIB_VERSION) && (JPEG_LIB_VERSION >= 61)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
237 METHODDEF(boolean)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
238 #else
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
239 METHODDEF boolean
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
240 #endif
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
241 our_fill_input_buffer (j_decompress_ptr cinfo)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
242 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
243 /* Insert a fake EOI marker */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
244 struct jpeg_source_mgr *src = cinfo->src;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
245 static JOCTET buffer[2];
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
246
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
247 buffer[0] = (JOCTET) 0xFF;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
248 buffer[1] = (JOCTET) JPEG_EOI;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
249
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
250 src->next_input_byte = buffer;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
251 src->bytes_in_buffer = 2;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
252 return TRUE;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
253 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
254
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
255 #if defined(JPEG_LIB_VERSION) && (JPEG_LIB_VERSION >= 61)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
256 METHODDEF(void)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
257 #else
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
258 METHODDEF void
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
259 #endif
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
260 our_skip_input_data (j_decompress_ptr cinfo, long num_bytes)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
261 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
262 struct jpeg_source_mgr *src = NULL;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
263
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
264 src = (struct jpeg_source_mgr *) cinfo->src;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
265
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
266 if (!src)
647
b39c14581166 [xemacs-hg @ 2001-08-13 04:45:47 by ben]
ben
parents: 638
diff changeset
267 return;
b39c14581166 [xemacs-hg @ 2001-08-13 04:45:47 by ben]
ben
parents: 638
diff changeset
268 else if (num_bytes > (long) src->bytes_in_buffer)
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
269 {
647
b39c14581166 [xemacs-hg @ 2001-08-13 04:45:47 by ben]
ben
parents: 638
diff changeset
270 ERREXIT (cinfo, JERR_INPUT_EOF);
b39c14581166 [xemacs-hg @ 2001-08-13 04:45:47 by ben]
ben
parents: 638
diff changeset
271 /*NOTREACHED*/
b39c14581166 [xemacs-hg @ 2001-08-13 04:45:47 by ben]
ben
parents: 638
diff changeset
272 }
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
273
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
274 src->bytes_in_buffer -= num_bytes;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
275 src->next_input_byte += num_bytes;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
276 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
277
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
278 #if defined(JPEG_LIB_VERSION) && (JPEG_LIB_VERSION >= 61)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
279 METHODDEF(void)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
280 #else
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
281 METHODDEF void
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
282 #endif
2286
04bc9d2f42c7 [xemacs-hg @ 2004-09-20 19:18:55 by james]
james
parents: 2270
diff changeset
283 our_term_source (j_decompress_ptr UNUSED (cinfo))
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
284 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
285 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
286
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
287 typedef struct
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
288 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
289 struct jpeg_source_mgr pub;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
290 } our_jpeg_source_mgr;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
291
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
292 static void
665
fdefd0186b75 [xemacs-hg @ 2001-09-20 06:28:42 by ben]
ben
parents: 647
diff changeset
293 jpeg_memory_src (j_decompress_ptr cinfo, JOCTET *data, Bytecount len)
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
294 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
295 struct jpeg_source_mgr *src;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
296
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
297 if (cinfo->src == NULL)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
298 { /* first time for this JPEG object? */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
299 cinfo->src = (struct jpeg_source_mgr *)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
300 (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_PERMANENT,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
301 sizeof(our_jpeg_source_mgr));
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
302 src = (struct jpeg_source_mgr *) cinfo->src;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
303 src->next_input_byte = data;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
304 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
305 src = (struct jpeg_source_mgr *) cinfo->src;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
306 src->init_source = our_init_source;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
307 src->fill_input_buffer = our_fill_input_buffer;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
308 src->skip_input_data = our_skip_input_data;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
309 src->resync_to_restart = jpeg_resync_to_restart; /* use default method */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
310 src->term_source = our_term_source;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
311 src->bytes_in_buffer = len;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
312 src->next_input_byte = data;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
313 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
314
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
315 #if defined(JPEG_LIB_VERSION) && (JPEG_LIB_VERSION >= 61)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
316 METHODDEF(void)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
317 #else
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
318 METHODDEF void
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
319 #endif
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
320 my_jpeg_error_exit (j_common_ptr cinfo)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
321 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
322 /* cinfo->err really points to a my_error_mgr struct, so coerce pointer */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
323 struct my_jpeg_error_mgr *myerr = (struct my_jpeg_error_mgr *) cinfo->err;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
324
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
325 /* Return control to the setjmp point */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
326 longjmp (myerr->setjmp_buffer, 1);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
327 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
328
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
329 #if defined(JPEG_LIB_VERSION) && (JPEG_LIB_VERSION >= 61)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
330 METHODDEF(void)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
331 #else
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
332 METHODDEF void
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
333 #endif
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
334 my_jpeg_output_message (j_common_ptr cinfo)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
335 {
771
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 665
diff changeset
336 Extbyte buffer[JMSG_LENGTH_MAX];
867
804517e16990 [xemacs-hg @ 2002-06-05 09:54:39 by ben]
ben
parents: 793
diff changeset
337 Ibyte *intbuf;
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
338
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
339 /* Create the message */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
340 (*cinfo->err->format_message) (cinfo, buffer);
4981
4aebb0131297 Cleanups/renaming of EXTERNAL_TO_C_STRING and friends
Ben Wing <ben@xemacs.org>
parents: 4953
diff changeset
341 intbuf = EXTERNAL_TO_ITEXT (buffer, Qjpeg_error_message_encoding);
771
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 665
diff changeset
342 warn_when_safe (Qjpeg, Qinfo, "%s", intbuf);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
343 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
344
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
345 /* The code in this routine is based on example.c from the JPEG library
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
346 source code and from gif_instantiate() */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
347 static void
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
348 jpeg_instantiate (Lisp_Object image_instance, Lisp_Object instantiator,
2959
4eb2a8c07cb3 [xemacs-hg @ 2005-09-27 05:48:22 by ben]
ben
parents: 2563
diff changeset
349 Lisp_Object pointer_fg, Lisp_Object pointer_bg,
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
350 int dest_mask, Lisp_Object domain)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
351 {
440
8de8e3f6228a Import from CVS: tag r21-2-28
cvs
parents: 438
diff changeset
352 Lisp_Image_Instance *ii = XIMAGE_INSTANCE (image_instance);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
353 /* It is OK for the unwind data to be local to this function,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
354 because the unwind-protect is always executed when this
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
355 stack frame is still valid. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
356 struct jpeg_unwind_data unwind;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
357 int speccount = specpdl_depth ();
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
358
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
359 /* This struct contains the JPEG decompression parameters and pointers to
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
360 * working space (which is allocated as needed by the JPEG library).
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
361 */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
362 struct jpeg_decompress_struct cinfo;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
363 /* We use our private extension JPEG error handler.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
364 * Note that this struct must live as long as the main JPEG parameter
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
365 * struct, to avoid dangling-pointer problems.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
366 */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
367 struct my_jpeg_error_mgr jerr;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
368
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
369 /* Step -1: First record our unwind-protect, which will clean up after
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
370 any exit, normal or not */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
371
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
372 xzero (unwind);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
373 record_unwind_protect (jpeg_instantiate_unwind, make_opaque_ptr (&unwind));
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
374
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
375 /* Step 1: allocate and initialize JPEG decompression object */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
376
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
377 /* We set up the normal JPEG error routines, then override error_exit. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
378 cinfo.err = jpeg_std_error (&jerr.pub);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
379 jerr.pub.error_exit = my_jpeg_error_exit;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
380 jerr.pub.output_message = my_jpeg_output_message;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
381
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
382 /* Establish the setjmp return context for my_error_exit to use. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
383 if (setjmp (jerr.setjmp_buffer))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
384 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
385 /* If we get here, the JPEG code has signaled an error.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
386 * We need to clean up the JPEG object, close the input file, and return.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
387 */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
388
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
389 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
390 Lisp_Object errstring;
771
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 665
diff changeset
391 Extbyte buffer[JMSG_LENGTH_MAX];
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
392
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
393 /* Create the message */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
394 (*cinfo.err->format_message) ((j_common_ptr) &cinfo, buffer);
4953
304aebb79cd3 function renamings to track names of char typedefs
Ben Wing <ben@xemacs.org>
parents: 4952
diff changeset
395 errstring = build_extstring (buffer, Qjpeg_error_message_encoding);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
396
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
397 signal_image_error_2 ("JPEG decoding error",
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
398 errstring, instantiator);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
399 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
400 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
401
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
402 /* Now we can initialize the JPEG decompression object. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
403 jpeg_create_decompress (&cinfo);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
404 unwind.cinfo_ptr = &cinfo;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
405
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
406 /* Step 2: specify data source (eg, a file) */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
407
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
408 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
409 Lisp_Object data = find_keyword_in_vector (instantiator, Q_data);
2367
ecf1ebac70d8 [xemacs-hg @ 2004-11-04 23:05:23 by ben]
ben
parents: 2286
diff changeset
410 const Binbyte *bytes;
665
fdefd0186b75 [xemacs-hg @ 2001-09-20 06:28:42 by ben]
ben
parents: 647
diff changeset
411 Bytecount len;
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
412
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
413 /* #### This is a definite problem under Mule due to the amount of
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
414 stack data it might allocate. Need to be able to convert and
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
415 write out to a file. */
4981
4aebb0131297 Cleanups/renaming of EXTERNAL_TO_C_STRING and friends
Ben Wing <ben@xemacs.org>
parents: 4953
diff changeset
416 LISP_STRING_TO_SIZED_EXTERNAL (data, bytes, len, Qbinary);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
417 jpeg_memory_src (&cinfo, (JOCTET *) bytes, len);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
418 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
419
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
420 /* Step 3: read file parameters with jpeg_read_header() */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
421
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
422 jpeg_read_header (&cinfo, TRUE);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
423 /* We can ignore the return value from jpeg_read_header since
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
424 * (a) suspension is not possible with the stdio data source, and
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
425 * (b) we passed TRUE to reject a tables-only JPEG file as an error.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
426 * See libjpeg.doc for more info.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
427 */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
429 {
4646
6c6bfdb80a0c Prevent integer overflow and subsequent crashes when attempting to load large
Jerry James <james@xemacs.org>
parents: 4326
diff changeset
430 UINT_64_BIT pixels_sq;
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
431 int jpeg_gray = 0; /* if we're dealing with a grayscale */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
432 /* Step 4: set parameters for decompression. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
433
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
434 /* Now that we're using EImages, send all data as 24bit color.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
435 The backend routine will take care of any necessary reductions.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
436 We do have to handle the grayscale case ourselves, however. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
437 if (cinfo.jpeg_color_space == JCS_GRAYSCALE)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
438 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
439 cinfo.out_color_space = JCS_GRAYSCALE;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
440 jpeg_gray = 1;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
441 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
442 else
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
443 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
444 /* we're relying on the jpeg driver to do any other conversions,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
445 or signal an error if the conversion isn't supported. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
446 cinfo.out_color_space = JCS_RGB;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
447 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
448
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
449 /* Step 5: Start decompressor */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
450 jpeg_start_decompress (&cinfo);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
451
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
452 /* Step 6: Read in the data and put into EImage format (8bit RGB triples)*/
4646
6c6bfdb80a0c Prevent integer overflow and subsequent crashes when attempting to load large
Jerry James <james@xemacs.org>
parents: 4326
diff changeset
453 pixels_sq =
6c6bfdb80a0c Prevent integer overflow and subsequent crashes when attempting to load large
Jerry James <james@xemacs.org>
parents: 4326
diff changeset
454 (UINT_64_BIT) cinfo.output_width * (UINT_64_BIT) cinfo.output_height;
6c6bfdb80a0c Prevent integer overflow and subsequent crashes when attempting to load large
Jerry James <james@xemacs.org>
parents: 4326
diff changeset
455 if (pixels_sq > ((size_t) -1) / 3)
6c6bfdb80a0c Prevent integer overflow and subsequent crashes when attempting to load large
Jerry James <james@xemacs.org>
parents: 4326
diff changeset
456 signal_image_error ("JPEG image too large to instantiate", instantiator);
2367
ecf1ebac70d8 [xemacs-hg @ 2004-11-04 23:05:23 by ben]
ben
parents: 2286
diff changeset
457 unwind.eimage =
ecf1ebac70d8 [xemacs-hg @ 2004-11-04 23:05:23 by ben]
ben
parents: 2286
diff changeset
458 xnew_binbytes (cinfo.output_width * cinfo.output_height * 3);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
459 if (!unwind.eimage)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
460 signal_image_error("Unable to allocate enough memory for image", instantiator);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
461
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
462 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
463 JSAMPARRAY row_buffer; /* Output row buffer */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
464 JSAMPLE *jp;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
465 int row_stride; /* physical row width in output buffer */
2367
ecf1ebac70d8 [xemacs-hg @ 2004-11-04 23:05:23 by ben]
ben
parents: 2286
diff changeset
466 Binbyte *op = unwind.eimage;
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
467
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
468 /* We may need to do some setup of our own at this point before reading
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
469 * the data. After jpeg_start_decompress() we have the correct scaled
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
470 * output image dimensions available
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
471 * We need to make an output work buffer of the right size.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
472 */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
473 /* JSAMPLEs per row in output buffer. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
474 row_stride = cinfo.output_width * cinfo.output_components;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
475 /* Make a one-row-high sample array that will go away when done
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
476 with image */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
477 row_buffer = ((*cinfo.mem->alloc_sarray)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
478 ((j_common_ptr) &cinfo, JPOOL_IMAGE, row_stride, 1));
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
479
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
480 /* Here we use the library's state variable cinfo.output_scanline as the
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
481 * loop counter, so that we don't have to keep track ourselves.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
482 */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
483 while (cinfo.output_scanline < cinfo.output_height)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
484 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
485 int i;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
486
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
487 /* jpeg_read_scanlines expects an array of pointers to scanlines.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
488 * Here the array is only one element long, but you could ask for
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
489 * more than one scanline at a time if that's more convenient.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
490 */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
491 (void) jpeg_read_scanlines (&cinfo, row_buffer, 1);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
492 jp = row_buffer[0];
647
b39c14581166 [xemacs-hg @ 2001-08-13 04:45:47 by ben]
ben
parents: 638
diff changeset
493 for (i = 0; i < (int) cinfo.output_width; i++)
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
494 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
495 int clr;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
496 if (jpeg_gray)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
497 {
2367
ecf1ebac70d8 [xemacs-hg @ 2004-11-04 23:05:23 by ben]
ben
parents: 2286
diff changeset
498 Binbyte val;
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
499 #if (BITS_IN_JSAMPLE == 8)
2367
ecf1ebac70d8 [xemacs-hg @ 2004-11-04 23:05:23 by ben]
ben
parents: 2286
diff changeset
500 val = (Binbyte) *jp++;
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
501 #else /* other option is 12 */
2367
ecf1ebac70d8 [xemacs-hg @ 2004-11-04 23:05:23 by ben]
ben
parents: 2286
diff changeset
502 val = (Binbyte) (*jp++ >> 4);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
503 #endif
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
504 for (clr = 0; clr < 3; clr++) /* copy the same value into RGB */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
505 *op++ = val;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
506 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
507 else
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
508 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
509 for (clr = 0; clr < 3; clr++)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
510 #if (BITS_IN_JSAMPLE == 8)
2367
ecf1ebac70d8 [xemacs-hg @ 2004-11-04 23:05:23 by ben]
ben
parents: 2286
diff changeset
511 *op++ = (Binbyte)*jp++;
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
512 #else /* other option is 12 */
2367
ecf1ebac70d8 [xemacs-hg @ 2004-11-04 23:05:23 by ben]
ben
parents: 2286
diff changeset
513 *op++ = (Binbyte)(*jp++ >> 4);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
514 #endif
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
515 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
516 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
517 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
518 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
519 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
520
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
521 /* Step 6.5: Create the pixmap and set up the image instance */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
522 /* now instantiate */
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
523 MAYBE_DEVMETH (DOMAIN_XDEVICE (ii->domain),
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
524 init_image_instance_from_eimage,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
525 (ii, cinfo.output_width, cinfo.output_height, 1,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
526 unwind.eimage, dest_mask,
2959
4eb2a8c07cb3 [xemacs-hg @ 2005-09-27 05:48:22 by ben]
ben
parents: 2563
diff changeset
527 instantiator, pointer_fg, pointer_bg, domain));
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
528
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
529 /* Step 7: Finish decompression */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
530
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
531 jpeg_finish_decompress (&cinfo);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
532 /* We can ignore the return value since suspension is not possible
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
533 * with the stdio data source.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
534 */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
535
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
536 /* And we're done! */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
537 /* This will clean up everything else. */
771
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 665
diff changeset
538 unbind_to (speccount);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
539 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
540
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
541 #endif /* HAVE_JPEG */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
542
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
543 #ifdef HAVE_GIF
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
544 /**********************************************************************
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
545 * GIF *
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
546 **********************************************************************/
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
547
4708
1cecc3e9f0a0 Use giflib or libungif to provide GIF support, instead of using internal
Jerry James <james@xemacs.org>
parents: 4698
diff changeset
548 #include <gif_lib.h>
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
549
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
550 static void
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
551 gif_validate (Lisp_Object instantiator)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
552 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
553 file_or_data_must_be_present (instantiator);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
554 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
555
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
556 static Lisp_Object
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
557 gif_normalize (Lisp_Object inst, Lisp_Object console_type,
2286
04bc9d2f42c7 [xemacs-hg @ 2004-09-20 19:18:55 by james]
james
parents: 2270
diff changeset
558 Lisp_Object UNUSED (dest_mask))
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
559 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
560 return simple_image_type_normalize (inst, console_type, Qgif);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
561 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
562
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
563 static int
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
564 gif_possible_dest_types (void)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
565 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
566 return IMAGE_COLOR_PIXMAP_MASK;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
567 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
568
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
569 /* To survive the otherwise baffling complexity of making sure
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
570 everything gets cleaned up in the presence of an error, we
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
571 use an unwind_protect(). */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
572
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
573 struct gif_unwind_data
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
574 {
2367
ecf1ebac70d8 [xemacs-hg @ 2004-11-04 23:05:23 by ben]
ben
parents: 2286
diff changeset
575 Binbyte *eimage;
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
576 /* Object that holds the decoded data from a GIF file */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
577 GifFileType *giffile;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
578 };
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
579
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
580 static Lisp_Object
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
581 gif_instantiate_unwind (Lisp_Object unwind_obj)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
582 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
583 struct gif_unwind_data *data =
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
584 (struct gif_unwind_data *) get_opaque_ptr (unwind_obj);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
585
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
586 free_opaque_ptr (unwind_obj);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
587 if (data->giffile)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
588 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
589 DGifCloseFile (data->giffile);
5169
6c6d78781d59 cleanup of code related to xfree(), better KKCC backtrace capabilities, document XD_INLINE_LISP_OBJECT_BLOCK_PTR, fix some memory leaks, other code cleanup
Ben Wing <ben@xemacs.org>
parents: 5024
diff changeset
590 FreeSavedImages (data->giffile);
6c6d78781d59 cleanup of code related to xfree(), better KKCC backtrace capabilities, document XD_INLINE_LISP_OBJECT_BLOCK_PTR, fix some memory leaks, other code cleanup
Ben Wing <ben@xemacs.org>
parents: 5024
diff changeset
591 data->giffile = 0;
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
592 }
647
b39c14581166 [xemacs-hg @ 2001-08-13 04:45:47 by ben]
ben
parents: 638
diff changeset
593 if (data->eimage)
5169
6c6d78781d59 cleanup of code related to xfree(), better KKCC backtrace capabilities, document XD_INLINE_LISP_OBJECT_BLOCK_PTR, fix some memory leaks, other code cleanup
Ben Wing <ben@xemacs.org>
parents: 5024
diff changeset
594 {
6c6d78781d59 cleanup of code related to xfree(), better KKCC backtrace capabilities, document XD_INLINE_LISP_OBJECT_BLOCK_PTR, fix some memory leaks, other code cleanup
Ben Wing <ben@xemacs.org>
parents: 5024
diff changeset
595 xfree (data->eimage);
6c6d78781d59 cleanup of code related to xfree(), better KKCC backtrace capabilities, document XD_INLINE_LISP_OBJECT_BLOCK_PTR, fix some memory leaks, other code cleanup
Ben Wing <ben@xemacs.org>
parents: 5024
diff changeset
596 data->eimage = 0;
6c6d78781d59 cleanup of code related to xfree(), better KKCC backtrace capabilities, document XD_INLINE_LISP_OBJECT_BLOCK_PTR, fix some memory leaks, other code cleanup
Ben Wing <ben@xemacs.org>
parents: 5024
diff changeset
597 }
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
598
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
599 return Qnil;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
600 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
601
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
602 typedef struct gif_memory_storage
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
603 {
2367
ecf1ebac70d8 [xemacs-hg @ 2004-11-04 23:05:23 by ben]
ben
parents: 2286
diff changeset
604 Binbyte *bytes; /* The data */
665
fdefd0186b75 [xemacs-hg @ 2001-09-20 06:28:42 by ben]
ben
parents: 647
diff changeset
605 Bytecount len; /* How big is it? */
fdefd0186b75 [xemacs-hg @ 2001-09-20 06:28:42 by ben]
ben
parents: 647
diff changeset
606 Bytecount index; /* Where are we? */
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
607 } gif_memory_storage;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
608
4708
1cecc3e9f0a0 Use giflib or libungif to provide GIF support, instead of using internal
Jerry James <james@xemacs.org>
parents: 4698
diff changeset
609 static int
1cecc3e9f0a0 Use giflib or libungif to provide GIF support, instead of using internal
Jerry James <james@xemacs.org>
parents: 4698
diff changeset
610 gif_read_from_memory (GifFileType *gif, GifByteType *buf, int size)
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
611 {
4708
1cecc3e9f0a0 Use giflib or libungif to provide GIF support, instead of using internal
Jerry James <james@xemacs.org>
parents: 4698
diff changeset
612 gif_memory_storage *mem = (gif_memory_storage *) gif->UserData;
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
613
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
614 if (size > (mem->len - mem->index))
647
b39c14581166 [xemacs-hg @ 2001-08-13 04:45:47 by ben]
ben
parents: 638
diff changeset
615 return -1;
b39c14581166 [xemacs-hg @ 2001-08-13 04:45:47 by ben]
ben
parents: 638
diff changeset
616 memcpy (buf, mem->bytes + mem->index, size);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
617 mem->index = mem->index + size;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
618 return size;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
619 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
620
4708
1cecc3e9f0a0 Use giflib or libungif to provide GIF support, instead of using internal
Jerry James <james@xemacs.org>
parents: 4698
diff changeset
621 static const char *
5016
2ade80e8c640 enable more warnings and fix them
Ben Wing <ben@xemacs.org>
parents: 4982
diff changeset
622 gif_decode_error_string (void)
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
623 {
4708
1cecc3e9f0a0 Use giflib or libungif to provide GIF support, instead of using internal
Jerry James <james@xemacs.org>
parents: 4698
diff changeset
624 switch (GifLastError ())
1cecc3e9f0a0 Use giflib or libungif to provide GIF support, instead of using internal
Jerry James <james@xemacs.org>
parents: 4698
diff changeset
625 {
1cecc3e9f0a0 Use giflib or libungif to provide GIF support, instead of using internal
Jerry James <james@xemacs.org>
parents: 4698
diff changeset
626 case D_GIF_ERR_OPEN_FAILED:
1cecc3e9f0a0 Use giflib or libungif to provide GIF support, instead of using internal
Jerry James <james@xemacs.org>
parents: 4698
diff changeset
627 return "GIF error: unable to open";
1cecc3e9f0a0 Use giflib or libungif to provide GIF support, instead of using internal
Jerry James <james@xemacs.org>
parents: 4698
diff changeset
628 case D_GIF_ERR_READ_FAILED:
1cecc3e9f0a0 Use giflib or libungif to provide GIF support, instead of using internal
Jerry James <james@xemacs.org>
parents: 4698
diff changeset
629 return "GIF error: read failed";
1cecc3e9f0a0 Use giflib or libungif to provide GIF support, instead of using internal
Jerry James <james@xemacs.org>
parents: 4698
diff changeset
630 case D_GIF_ERR_NOT_GIF_FILE:
1cecc3e9f0a0 Use giflib or libungif to provide GIF support, instead of using internal
Jerry James <james@xemacs.org>
parents: 4698
diff changeset
631 return "GIF error: not a GIF file";
1cecc3e9f0a0 Use giflib or libungif to provide GIF support, instead of using internal
Jerry James <james@xemacs.org>
parents: 4698
diff changeset
632 case D_GIF_ERR_NO_SCRN_DSCR:
1cecc3e9f0a0 Use giflib or libungif to provide GIF support, instead of using internal
Jerry James <james@xemacs.org>
parents: 4698
diff changeset
633 return "GIF error: no Screen Descriptor detected";
1cecc3e9f0a0 Use giflib or libungif to provide GIF support, instead of using internal
Jerry James <james@xemacs.org>
parents: 4698
diff changeset
634 case D_GIF_ERR_NO_IMAG_DSCR:
1cecc3e9f0a0 Use giflib or libungif to provide GIF support, instead of using internal
Jerry James <james@xemacs.org>
parents: 4698
diff changeset
635 return "GIF error: no Image Descriptor detected";
1cecc3e9f0a0 Use giflib or libungif to provide GIF support, instead of using internal
Jerry James <james@xemacs.org>
parents: 4698
diff changeset
636 case D_GIF_ERR_NO_COLOR_MAP:
1cecc3e9f0a0 Use giflib or libungif to provide GIF support, instead of using internal
Jerry James <james@xemacs.org>
parents: 4698
diff changeset
637 return "GIF error: no global or local color map";
1cecc3e9f0a0 Use giflib or libungif to provide GIF support, instead of using internal
Jerry James <james@xemacs.org>
parents: 4698
diff changeset
638 case D_GIF_ERR_WRONG_RECORD:
1cecc3e9f0a0 Use giflib or libungif to provide GIF support, instead of using internal
Jerry James <james@xemacs.org>
parents: 4698
diff changeset
639 return "GIF error: wrong record type";
1cecc3e9f0a0 Use giflib or libungif to provide GIF support, instead of using internal
Jerry James <james@xemacs.org>
parents: 4698
diff changeset
640 case D_GIF_ERR_DATA_TOO_BIG:
1cecc3e9f0a0 Use giflib or libungif to provide GIF support, instead of using internal
Jerry James <james@xemacs.org>
parents: 4698
diff changeset
641 return "GIF error: image is larger than indicated by header";
1cecc3e9f0a0 Use giflib or libungif to provide GIF support, instead of using internal
Jerry James <james@xemacs.org>
parents: 4698
diff changeset
642 case D_GIF_ERR_NOT_ENOUGH_MEM:
1cecc3e9f0a0 Use giflib or libungif to provide GIF support, instead of using internal
Jerry James <james@xemacs.org>
parents: 4698
diff changeset
643 return "GIF error: out of memory";
1cecc3e9f0a0 Use giflib or libungif to provide GIF support, instead of using internal
Jerry James <james@xemacs.org>
parents: 4698
diff changeset
644 case D_GIF_ERR_CLOSE_FAILED:
1cecc3e9f0a0 Use giflib or libungif to provide GIF support, instead of using internal
Jerry James <james@xemacs.org>
parents: 4698
diff changeset
645 return "GIF error: failed to close file";
1cecc3e9f0a0 Use giflib or libungif to provide GIF support, instead of using internal
Jerry James <james@xemacs.org>
parents: 4698
diff changeset
646 case D_GIF_ERR_NOT_READABLE:
1cecc3e9f0a0 Use giflib or libungif to provide GIF support, instead of using internal
Jerry James <james@xemacs.org>
parents: 4698
diff changeset
647 return "GIF error: file is not readable";
1cecc3e9f0a0 Use giflib or libungif to provide GIF support, instead of using internal
Jerry James <james@xemacs.org>
parents: 4698
diff changeset
648 case D_GIF_ERR_IMAGE_DEFECT:
1cecc3e9f0a0 Use giflib or libungif to provide GIF support, instead of using internal
Jerry James <james@xemacs.org>
parents: 4698
diff changeset
649 return "GIF error: image is defective";
1cecc3e9f0a0 Use giflib or libungif to provide GIF support, instead of using internal
Jerry James <james@xemacs.org>
parents: 4698
diff changeset
650 case D_GIF_ERR_EOF_TOO_SOON:
1cecc3e9f0a0 Use giflib or libungif to provide GIF support, instead of using internal
Jerry James <james@xemacs.org>
parents: 4698
diff changeset
651 return "GIF error: image EOF detected before image complete";
1cecc3e9f0a0 Use giflib or libungif to provide GIF support, instead of using internal
Jerry James <james@xemacs.org>
parents: 4698
diff changeset
652 default:
1cecc3e9f0a0 Use giflib or libungif to provide GIF support, instead of using internal
Jerry James <james@xemacs.org>
parents: 4698
diff changeset
653 return "GIF error: unknown error";
1cecc3e9f0a0 Use giflib or libungif to provide GIF support, instead of using internal
Jerry James <james@xemacs.org>
parents: 4698
diff changeset
654 }
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
655 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
656
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
657 static void
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
658 gif_instantiate (Lisp_Object image_instance, Lisp_Object instantiator,
2959
4eb2a8c07cb3 [xemacs-hg @ 2005-09-27 05:48:22 by ben]
ben
parents: 2563
diff changeset
659 Lisp_Object pointer_fg, Lisp_Object pointer_bg,
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
660 int dest_mask, Lisp_Object domain)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
661 {
440
8de8e3f6228a Import from CVS: tag r21-2-28
cvs
parents: 438
diff changeset
662 Lisp_Image_Instance *ii = XIMAGE_INSTANCE (image_instance);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
663 /* It is OK for the unwind data to be local to this function,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
664 because the unwind-protect is always executed when this
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
665 stack frame is still valid. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
666 struct gif_unwind_data unwind;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
667 int speccount = specpdl_depth ();
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
668 gif_memory_storage mem_struct;
2367
ecf1ebac70d8 [xemacs-hg @ 2004-11-04 23:05:23 by ben]
ben
parents: 2286
diff changeset
669 Binbyte *bytes;
665
fdefd0186b75 [xemacs-hg @ 2001-09-20 06:28:42 by ben]
ben
parents: 647
diff changeset
670 Bytecount len;
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
671 int height = 0;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
672 int width = 0;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
673
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
674 xzero (unwind);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
675 record_unwind_protect (gif_instantiate_unwind, make_opaque_ptr (&unwind));
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
676
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
677 /* 1. Now decode the data. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
678
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
679 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
680 Lisp_Object data = find_keyword_in_vector (instantiator, Q_data);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
681
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
682 assert (!NILP (data));
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
683
4981
4aebb0131297 Cleanups/renaming of EXTERNAL_TO_C_STRING and friends
Ben Wing <ben@xemacs.org>
parents: 4953
diff changeset
684 LISP_STRING_TO_SIZED_EXTERNAL (data, bytes, len, Qbinary);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
685 mem_struct.bytes = bytes;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
686 mem_struct.len = len;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
687 mem_struct.index = 0;
4708
1cecc3e9f0a0 Use giflib or libungif to provide GIF support, instead of using internal
Jerry James <james@xemacs.org>
parents: 4698
diff changeset
688 unwind.giffile = DGifOpen (&mem_struct, gif_read_from_memory);
1cecc3e9f0a0 Use giflib or libungif to provide GIF support, instead of using internal
Jerry James <james@xemacs.org>
parents: 4698
diff changeset
689 if (unwind.giffile == NULL)
1cecc3e9f0a0 Use giflib or libungif to provide GIF support, instead of using internal
Jerry James <james@xemacs.org>
parents: 4698
diff changeset
690 signal_image_error (gif_decode_error_string (), instantiator);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
691
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
692 /* Then slurp the image into memory, decoding along the way.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
693 The result is the image in a simple one-byte-per-pixel
4708
1cecc3e9f0a0 Use giflib or libungif to provide GIF support, instead of using internal
Jerry James <james@xemacs.org>
parents: 4698
diff changeset
694 format. */
1cecc3e9f0a0 Use giflib or libungif to provide GIF support, instead of using internal
Jerry James <james@xemacs.org>
parents: 4698
diff changeset
695 if (DGifSlurp (unwind.giffile) == GIF_ERROR)
1cecc3e9f0a0 Use giflib or libungif to provide GIF support, instead of using internal
Jerry James <james@xemacs.org>
parents: 4698
diff changeset
696 signal_image_error (gif_decode_error_string (), instantiator);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
697 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
698
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
699 /* 3. Now create the EImage(s) */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
700 {
5250
db84c9d41437 Apply GIF colormap fix from Adam Sjogren for issues 150 and 713
Vin Shelton <acs@xemacs.org>
parents: 5178
diff changeset
701 ColorMapObject *cmo = (unwind.giffile->Image.ColorMap ? unwind.giffile->Image.ColorMap : unwind.giffile->SColorMap);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
702 int i, j, row, pass, interlace, slice;
4646
6c6bfdb80a0c Prevent integer overflow and subsequent crashes when attempting to load large
Jerry James <james@xemacs.org>
parents: 4326
diff changeset
703 UINT_64_BIT pixels_sq;
2367
ecf1ebac70d8 [xemacs-hg @ 2004-11-04 23:05:23 by ben]
ben
parents: 2286
diff changeset
704 Binbyte *eip;
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
705 /* interlaced gifs have rows in this order:
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
706 0, 8, 16, ..., 4, 12, 20, ..., 2, 6, 10, ..., 1, 3, 5, ... */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
707 static int InterlacedOffset[] = { 0, 4, 2, 1 };
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
708 static int InterlacedJumps[] = { 8, 8, 4, 2 };
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
709
5250
db84c9d41437 Apply GIF colormap fix from Adam Sjogren for issues 150 and 713
Vin Shelton <acs@xemacs.org>
parents: 5178
diff changeset
710 if (cmo == NULL)
db84c9d41437 Apply GIF colormap fix from Adam Sjogren for issues 150 and 713
Vin Shelton <acs@xemacs.org>
parents: 5178
diff changeset
711 signal_image_error ("GIF image has no color map", instantiator);
db84c9d41437 Apply GIF colormap fix from Adam Sjogren for issues 150 and 713
Vin Shelton <acs@xemacs.org>
parents: 5178
diff changeset
712
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
713 height = unwind.giffile->SHeight;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
714 width = unwind.giffile->SWidth;
4646
6c6bfdb80a0c Prevent integer overflow and subsequent crashes when attempting to load large
Jerry James <james@xemacs.org>
parents: 4326
diff changeset
715 pixels_sq = (UINT_64_BIT) width * (UINT_64_BIT) height;
6c6bfdb80a0c Prevent integer overflow and subsequent crashes when attempting to load large
Jerry James <james@xemacs.org>
parents: 4326
diff changeset
716 if (pixels_sq > ((size_t) -1) / (3 * unwind.giffile->ImageCount))
6c6bfdb80a0c Prevent integer overflow and subsequent crashes when attempting to load large
Jerry James <james@xemacs.org>
parents: 4326
diff changeset
717 signal_image_error ("GIF image too large to instantiate", instantiator);
2367
ecf1ebac70d8 [xemacs-hg @ 2004-11-04 23:05:23 by ben]
ben
parents: 2286
diff changeset
718 unwind.eimage =
ecf1ebac70d8 [xemacs-hg @ 2004-11-04 23:05:23 by ben]
ben
parents: 2286
diff changeset
719 xnew_binbytes (width * height * 3 * unwind.giffile->ImageCount);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
720 if (!unwind.eimage)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
721 signal_image_error("Unable to allocate enough memory for image", instantiator);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
722
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
723 /* write the data in EImage format (8bit RGB triples) */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
724
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
725 for (slice = 0; slice < unwind.giffile->ImageCount; slice++)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
726 {
638
373ced43e288 [xemacs-hg @ 2001-07-26 21:10:44 by adrian]
adrian
parents: 593
diff changeset
727 /* We check here that the current image covers the full "screen" size. */
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
728 if (unwind.giffile->SavedImages[slice].ImageDesc.Height != height
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
729 || unwind.giffile->SavedImages[slice].ImageDesc.Width != width
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
730 || unwind.giffile->SavedImages[slice].ImageDesc.Left != 0
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
731 || unwind.giffile->SavedImages[slice].ImageDesc.Top != 0)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
732 signal_image_error ("Image in GIF file is not full size",
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
733 instantiator);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
734
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
735 interlace = unwind.giffile->SavedImages[slice].ImageDesc.Interlace;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
736 pass = 0;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
737 row = interlace ? InterlacedOffset[pass] : 0;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
738 eip = unwind.eimage + (width * height * 3 * slice);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
739 for (i = 0; i < height; i++)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
740 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
741 if (interlace)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
742 if (row >= height) {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
743 row = InterlacedOffset[++pass];
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
744 while (row >= height)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
745 row = InterlacedOffset[++pass];
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
746 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
747 eip = unwind.eimage + (width * height * 3 * slice) + (row * width * 3);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
748 for (j = 0; j < width; j++)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
749 {
2367
ecf1ebac70d8 [xemacs-hg @ 2004-11-04 23:05:23 by ben]
ben
parents: 2286
diff changeset
750 Binbyte pixel =
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
751 unwind.giffile->SavedImages[slice].RasterBits[(i * width) + j];
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
752 *eip++ = cmo->Colors[pixel].Red;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
753 *eip++ = cmo->Colors[pixel].Green;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
754 *eip++ = cmo->Colors[pixel].Blue;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
755 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
756 row += interlace ? InterlacedJumps[pass] : 1;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
757 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
758 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
759
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
760 /* now instantiate */
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
761 MAYBE_DEVMETH (DOMAIN_XDEVICE (ii->domain),
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
762 init_image_instance_from_eimage,
2959
4eb2a8c07cb3 [xemacs-hg @ 2005-09-27 05:48:22 by ben]
ben
parents: 2563
diff changeset
763 (ii, width, height, unwind.giffile->ImageCount,
4eb2a8c07cb3 [xemacs-hg @ 2005-09-27 05:48:22 by ben]
ben
parents: 2563
diff changeset
764 unwind.eimage, dest_mask, instantiator, pointer_fg,
4eb2a8c07cb3 [xemacs-hg @ 2005-09-27 05:48:22 by ben]
ben
parents: 2563
diff changeset
765 pointer_bg, domain));
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
766 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
767
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
768 /* We read the gif successfully. If we have more than one slice then
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
769 animate the gif. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
770 if (unwind.giffile->ImageCount > 1)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
771 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
772 /* See if there is a timeout value. In theory there could be one
4708
1cecc3e9f0a0 Use giflib or libungif to provide GIF support, instead of using internal
Jerry James <james@xemacs.org>
parents: 4698
diff changeset
773 for every image - but that makes the implementation way too
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
774 complicated for now so we just take the first. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
775 unsigned short timeout = 0;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
776 Lisp_Object tid;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
777
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
778 if (unwind.giffile->SavedImages[0].Function == GRAPHICS_EXT_FUNC_CODE
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
779 &&
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
780 unwind.giffile->SavedImages[0].ExtensionBlockCount)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
781 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
782 timeout = (unsigned short)
438
84b14dcb0985 Import from CVS: tag r21-2-27
cvs
parents: 428
diff changeset
783 ((unwind.giffile->SavedImages[0].ExtensionBlocks[0].Bytes[2] << 8) +
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
784 unwind.giffile-> SavedImages[0].ExtensionBlocks[0].Bytes[1]) * 10;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
785 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
786
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
787 /* Too short a timeout will crucify us performance-wise. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
788 tid = add_glyph_animated_timeout (timeout > 10 ? timeout : 10, image_instance);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
789
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
790 if (!NILP (tid))
5581
56144c8593a8 Mechanically change INT to FIXNUM in our sources.
Aidan Kehoe <kehoea@parhasard.net>
parents: 5537
diff changeset
791 IMAGE_INSTANCE_PIXMAP_TIMEOUT (ii) = XFIXNUM (tid);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
792 }
438
84b14dcb0985 Import from CVS: tag r21-2-27
cvs
parents: 428
diff changeset
793
771
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 665
diff changeset
794 unbind_to (speccount);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
795 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
796
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
797 #endif /* HAVE_GIF */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
798
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
799
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
800 #ifdef HAVE_PNG
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
801
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
802 /**********************************************************************
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
803 * PNG *
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
804 **********************************************************************/
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
805 static void
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
806 png_validate (Lisp_Object instantiator)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
807 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
808 file_or_data_must_be_present (instantiator);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
809 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
810
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
811 static Lisp_Object
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
812 png_normalize (Lisp_Object inst, Lisp_Object console_type,
2286
04bc9d2f42c7 [xemacs-hg @ 2004-09-20 19:18:55 by james]
james
parents: 2270
diff changeset
813 Lisp_Object UNUSED (dest_mask))
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
814 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
815 return simple_image_type_normalize (inst, console_type, Qpng);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
816 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
817
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
818 static int
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
819 png_possible_dest_types (void)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
820 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
821 return IMAGE_COLOR_PIXMAP_MASK;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
822 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
823
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
824 struct png_memory_storage
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
825 {
2367
ecf1ebac70d8 [xemacs-hg @ 2004-11-04 23:05:23 by ben]
ben
parents: 2286
diff changeset
826 const Binbyte *bytes; /* The data */
665
fdefd0186b75 [xemacs-hg @ 2001-09-20 06:28:42 by ben]
ben
parents: 647
diff changeset
827 Bytecount len; /* How big is it? */
fdefd0186b75 [xemacs-hg @ 2001-09-20 06:28:42 by ben]
ben
parents: 647
diff changeset
828 Bytecount index; /* Where are we? */
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
829 };
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
830
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
831 static void
647
b39c14581166 [xemacs-hg @ 2001-08-13 04:45:47 by ben]
ben
parents: 638
diff changeset
832 png_read_from_memory (png_structp png_ptr, png_bytep data,
b39c14581166 [xemacs-hg @ 2001-08-13 04:45:47 by ben]
ben
parents: 638
diff changeset
833 png_size_t length)
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
834 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
835 struct png_memory_storage *tbr =
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
836 (struct png_memory_storage *) png_get_io_ptr (png_ptr);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
837
665
fdefd0186b75 [xemacs-hg @ 2001-09-20 06:28:42 by ben]
ben
parents: 647
diff changeset
838 if ((Bytecount) length > (tbr->len - tbr->index))
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
839 png_error (png_ptr, (png_const_charp) "Read Error");
647
b39c14581166 [xemacs-hg @ 2001-08-13 04:45:47 by ben]
ben
parents: 638
diff changeset
840 memcpy (data, tbr->bytes + tbr->index,length);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
841 tbr->index = tbr->index + length;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
842 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
843
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
844 struct png_error_struct
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
845 {
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
846 const char *err_str;
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
847 jmp_buf setjmp_buffer; /* for return to caller */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
848 };
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
849
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
850 /* jh 98/03/12 - #### AARRRGH! libpng includes jmp_buf inside its own
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
851 structure, and there are cases where the size can be different from
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
852 between inside the library, and inside the code! To do an end run
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
853 around this, use our own error functions, and don't rely on things
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
854 passed in the png_ptr to them. This is an ugly hack and must
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
855 go away when the lisp engine is threaded! */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
856 static struct png_error_struct png_err_stct;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
857
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
858 static void
2286
04bc9d2f42c7 [xemacs-hg @ 2004-09-20 19:18:55 by james]
james
parents: 2270
diff changeset
859 png_error_func (png_structp UNUSED (png_ptr), png_const_charp msg)
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
860 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
861 png_err_stct.err_str = msg;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
862 longjmp (png_err_stct.setjmp_buffer, 1);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
863 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
864
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
865 static void
2286
04bc9d2f42c7 [xemacs-hg @ 2004-09-20 19:18:55 by james]
james
parents: 2270
diff changeset
866 png_warning_func (png_structp UNUSED (png_ptr), png_const_charp msg)
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
867 {
3734
e1f65870f845 [xemacs-hg @ 2006-12-11 10:04:27 by aidan]
aidan
parents: 3094
diff changeset
868 DECLARE_EISTRING (eimsg);
e1f65870f845 [xemacs-hg @ 2006-12-11 10:04:27 by aidan]
aidan
parents: 3094
diff changeset
869
e1f65870f845 [xemacs-hg @ 2006-12-11 10:04:27 by aidan]
aidan
parents: 3094
diff changeset
870 eicpy_ext(eimsg, msg, Qbinary);
e1f65870f845 [xemacs-hg @ 2006-12-11 10:04:27 by aidan]
aidan
parents: 3094
diff changeset
871 warn_when_safe (Qpng, Qinfo, "%s", eidata(eimsg));
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
872 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
873
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
874 struct png_unwind_data
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
875 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
876 FILE *instream;
2367
ecf1ebac70d8 [xemacs-hg @ 2004-11-04 23:05:23 by ben]
ben
parents: 2286
diff changeset
877 Binbyte *eimage;
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
878 png_structp png_ptr;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
879 png_infop info_ptr;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
880 };
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
881
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
882 static Lisp_Object
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
883 png_instantiate_unwind (Lisp_Object unwind_obj)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
884 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
885 struct png_unwind_data *data =
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
886 (struct png_unwind_data *) get_opaque_ptr (unwind_obj);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
887
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
888 free_opaque_ptr (unwind_obj);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
889 if (data->png_ptr)
3839
320acec37716 [xemacs-hg @ 2007-02-21 10:49:30 by stephent]
stephent
parents: 3734
diff changeset
890 {
320acec37716 [xemacs-hg @ 2007-02-21 10:49:30 by stephent]
stephent
parents: 3734
diff changeset
891 /* ensure we can't get here again */
320acec37716 [xemacs-hg @ 2007-02-21 10:49:30 by stephent]
stephent
parents: 3734
diff changeset
892 png_structp tmp = data->png_ptr;
320acec37716 [xemacs-hg @ 2007-02-21 10:49:30 by stephent]
stephent
parents: 3734
diff changeset
893 data->png_ptr = NULL;
320acec37716 [xemacs-hg @ 2007-02-21 10:49:30 by stephent]
stephent
parents: 3734
diff changeset
894 png_destroy_read_struct (&tmp, &(data->info_ptr), (png_infopp)NULL);
320acec37716 [xemacs-hg @ 2007-02-21 10:49:30 by stephent]
stephent
parents: 3734
diff changeset
895 }
320acec37716 [xemacs-hg @ 2007-02-21 10:49:30 by stephent]
stephent
parents: 3734
diff changeset
896
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
897 if (data->instream)
5169
6c6d78781d59 cleanup of code related to xfree(), better KKCC backtrace capabilities, document XD_INLINE_LISP_OBJECT_BLOCK_PTR, fix some memory leaks, other code cleanup
Ben Wing <ben@xemacs.org>
parents: 5024
diff changeset
898 {
6c6d78781d59 cleanup of code related to xfree(), better KKCC backtrace capabilities, document XD_INLINE_LISP_OBJECT_BLOCK_PTR, fix some memory leaks, other code cleanup
Ben Wing <ben@xemacs.org>
parents: 5024
diff changeset
899 retry_fclose (data->instream);
6c6d78781d59 cleanup of code related to xfree(), better KKCC backtrace capabilities, document XD_INLINE_LISP_OBJECT_BLOCK_PTR, fix some memory leaks, other code cleanup
Ben Wing <ben@xemacs.org>
parents: 5024
diff changeset
900 data->instream = 0;
6c6d78781d59 cleanup of code related to xfree(), better KKCC backtrace capabilities, document XD_INLINE_LISP_OBJECT_BLOCK_PTR, fix some memory leaks, other code cleanup
Ben Wing <ben@xemacs.org>
parents: 5024
diff changeset
901 }
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
902
1726
a8d8f419b459 [xemacs-hg @ 2003-09-30 15:26:34 by james]
james
parents: 872
diff changeset
903 if (data->eimage)
5169
6c6d78781d59 cleanup of code related to xfree(), better KKCC backtrace capabilities, document XD_INLINE_LISP_OBJECT_BLOCK_PTR, fix some memory leaks, other code cleanup
Ben Wing <ben@xemacs.org>
parents: 5024
diff changeset
904 {
6c6d78781d59 cleanup of code related to xfree(), better KKCC backtrace capabilities, document XD_INLINE_LISP_OBJECT_BLOCK_PTR, fix some memory leaks, other code cleanup
Ben Wing <ben@xemacs.org>
parents: 5024
diff changeset
905 xfree (data->eimage);
6c6d78781d59 cleanup of code related to xfree(), better KKCC backtrace capabilities, document XD_INLINE_LISP_OBJECT_BLOCK_PTR, fix some memory leaks, other code cleanup
Ben Wing <ben@xemacs.org>
parents: 5024
diff changeset
906 data->eimage = 0;
6c6d78781d59 cleanup of code related to xfree(), better KKCC backtrace capabilities, document XD_INLINE_LISP_OBJECT_BLOCK_PTR, fix some memory leaks, other code cleanup
Ben Wing <ben@xemacs.org>
parents: 5024
diff changeset
907 }
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
908
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
909 return Qnil;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
910 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
911
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
912 static void
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
913 png_instantiate (Lisp_Object image_instance, Lisp_Object instantiator,
2959
4eb2a8c07cb3 [xemacs-hg @ 2005-09-27 05:48:22 by ben]
ben
parents: 2563
diff changeset
914 Lisp_Object pointer_fg, Lisp_Object pointer_bg,
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
915 int dest_mask, Lisp_Object domain)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
916 {
440
8de8e3f6228a Import from CVS: tag r21-2-28
cvs
parents: 438
diff changeset
917 Lisp_Image_Instance *ii = XIMAGE_INSTANCE (image_instance);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
918 struct png_unwind_data unwind;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
919 int speccount = specpdl_depth ();
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
920 int height, width;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
921 struct png_memory_storage tbr; /* Data to be read */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
922
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
923 /* PNG variables */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
924 png_structp png_ptr;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
925 png_infop info_ptr;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
926
3839
320acec37716 [xemacs-hg @ 2007-02-21 10:49:30 by stephent]
stephent
parents: 3734
diff changeset
927 xzero (unwind);
320acec37716 [xemacs-hg @ 2007-02-21 10:49:30 by stephent]
stephent
parents: 3734
diff changeset
928 record_unwind_protect (png_instantiate_unwind, make_opaque_ptr (&unwind));
320acec37716 [xemacs-hg @ 2007-02-21 10:49:30 by stephent]
stephent
parents: 3734
diff changeset
929
320acec37716 [xemacs-hg @ 2007-02-21 10:49:30 by stephent]
stephent
parents: 3734
diff changeset
930 if (setjmp (png_err_stct.setjmp_buffer))
320acec37716 [xemacs-hg @ 2007-02-21 10:49:30 by stephent]
stephent
parents: 3734
diff changeset
931 {
320acec37716 [xemacs-hg @ 2007-02-21 10:49:30 by stephent]
stephent
parents: 3734
diff changeset
932 /* Something blew up:
320acec37716 [xemacs-hg @ 2007-02-21 10:49:30 by stephent]
stephent
parents: 3734
diff changeset
933 just display the error (cleanup happens in the unwind) */
320acec37716 [xemacs-hg @ 2007-02-21 10:49:30 by stephent]
stephent
parents: 3734
diff changeset
934 signal_image_error_2 ("Error decoding PNG",
4953
304aebb79cd3 function renamings to track names of char typedefs
Ben Wing <ben@xemacs.org>
parents: 4952
diff changeset
935 build_extstring (png_err_stct.err_str,
4952
19a72041c5ed Mule-izing, various fixes related to char * arguments
Ben Wing <ben@xemacs.org>
parents: 4854
diff changeset
936 Qerror_message_encoding),
3839
320acec37716 [xemacs-hg @ 2007-02-21 10:49:30 by stephent]
stephent
parents: 3734
diff changeset
937 instantiator);
320acec37716 [xemacs-hg @ 2007-02-21 10:49:30 by stephent]
stephent
parents: 3734
diff changeset
938 }
320acec37716 [xemacs-hg @ 2007-02-21 10:49:30 by stephent]
stephent
parents: 3734
diff changeset
939
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
940 /* Initialize all PNG structures */
3839
320acec37716 [xemacs-hg @ 2007-02-21 10:49:30 by stephent]
stephent
parents: 3734
diff changeset
941 png_ptr = png_create_read_struct (PNG_LIBPNG_VER_STRING,
320acec37716 [xemacs-hg @ 2007-02-21 10:49:30 by stephent]
stephent
parents: 3734
diff changeset
942 (void *) &png_err_stct,
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
943 png_error_func, png_warning_func);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
944 if (!png_ptr)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
945 signal_image_error ("Error obtaining memory for png_read", instantiator);
3839
320acec37716 [xemacs-hg @ 2007-02-21 10:49:30 by stephent]
stephent
parents: 3734
diff changeset
946 unwind.png_ptr = png_ptr;
320acec37716 [xemacs-hg @ 2007-02-21 10:49:30 by stephent]
stephent
parents: 3734
diff changeset
947
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
948 info_ptr = png_create_info_struct (png_ptr);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
949 if (!info_ptr)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
950 {
3839
320acec37716 [xemacs-hg @ 2007-02-21 10:49:30 by stephent]
stephent
parents: 3734
diff changeset
951 unwind.png_ptr = NULL; /* avoid re-calling png_destroy_read_struct
320acec37716 [xemacs-hg @ 2007-02-21 10:49:30 by stephent]
stephent
parents: 3734
diff changeset
952 when unwinding */
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
953 png_destroy_read_struct (&png_ptr, (png_infopp)NULL, (png_infopp)NULL);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
954 signal_image_error ("Error obtaining memory for png_read", instantiator);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
955 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
956 unwind.info_ptr = info_ptr;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
957
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
958 /* This code is a mixture of stuff from Ben's GIF/JPEG stuff from
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
959 this file, example.c from the libpng 0.81 distribution, and the
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
960 pngtopnm sources. -WMP-
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
961 */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
962 /* It has been further modified to handle the API changes for 0.96,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
963 and is no longer usable for previous versions. jh
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
964 */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
965
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
966 /* Initialize the IO layer and read in header information */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
967 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
968 Lisp_Object data = find_keyword_in_vector (instantiator, Q_data);
2367
ecf1ebac70d8 [xemacs-hg @ 2004-11-04 23:05:23 by ben]
ben
parents: 2286
diff changeset
969 const Binbyte *bytes;
665
fdefd0186b75 [xemacs-hg @ 2001-09-20 06:28:42 by ben]
ben
parents: 647
diff changeset
970 Bytecount len;
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
971
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
972 assert (!NILP (data));
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
973
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
974 /* #### This is a definite problem under Mule due to the amount of
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
975 stack data it might allocate. Need to think about using Lstreams */
4981
4aebb0131297 Cleanups/renaming of EXTERNAL_TO_C_STRING and friends
Ben Wing <ben@xemacs.org>
parents: 4953
diff changeset
976 LISP_STRING_TO_SIZED_EXTERNAL (data, bytes, len, Qbinary);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
977 tbr.bytes = bytes;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
978 tbr.len = len;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
979 tbr.index = 0;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
980 png_set_read_fn (png_ptr,(void *) &tbr, png_read_from_memory);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
981 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
982
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
983 png_read_info (png_ptr, info_ptr);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
984
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
985 {
4698
a9493cab536f Fix crash due to mishandling transparency.
Stephen J. Turnbull <stephen@xemacs.org>
parents: 4682
diff changeset
986 int y, padding;
2367
ecf1ebac70d8 [xemacs-hg @ 2004-11-04 23:05:23 by ben]
ben
parents: 2286
diff changeset
987 Binbyte **row_pointers;
4646
6c6bfdb80a0c Prevent integer overflow and subsequent crashes when attempting to load large
Jerry James <james@xemacs.org>
parents: 4326
diff changeset
988 UINT_64_BIT pixels_sq;
5372
6c3a695f54f5 Update png_instantiate () to work with more recent versions of libpng.
Aidan Kehoe <kehoea@parhasard.net>
parents: 5250
diff changeset
989 height = png_get_image_height (png_ptr, info_ptr);
6c3a695f54f5 Update png_instantiate () to work with more recent versions of libpng.
Aidan Kehoe <kehoea@parhasard.net>
parents: 5250
diff changeset
990 width = png_get_image_width (png_ptr, info_ptr);
4646
6c6bfdb80a0c Prevent integer overflow and subsequent crashes when attempting to load large
Jerry James <james@xemacs.org>
parents: 4326
diff changeset
991 pixels_sq = (UINT_64_BIT) width * (UINT_64_BIT) height;
6c6bfdb80a0c Prevent integer overflow and subsequent crashes when attempting to load large
Jerry James <james@xemacs.org>
parents: 4326
diff changeset
992 if (pixels_sq > ((size_t) -1) / 3)
6c6bfdb80a0c Prevent integer overflow and subsequent crashes when attempting to load large
Jerry James <james@xemacs.org>
parents: 4326
diff changeset
993 signal_image_error ("PNG image too large to instantiate", instantiator);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
994
4698
a9493cab536f Fix crash due to mishandling transparency.
Stephen J. Turnbull <stephen@xemacs.org>
parents: 4682
diff changeset
995 /* Wow, allocate all the memory. Truly, exciting.
a9493cab536f Fix crash due to mishandling transparency.
Stephen J. Turnbull <stephen@xemacs.org>
parents: 4682
diff changeset
996 Well, yes, there's excitement to be had. It turns out that libpng
a9493cab536f Fix crash due to mishandling transparency.
Stephen J. Turnbull <stephen@xemacs.org>
parents: 4682
diff changeset
997 strips in place, so the last row overruns the buffer if depth is 16
a9493cab536f Fix crash due to mishandling transparency.
Stephen J. Turnbull <stephen@xemacs.org>
parents: 4682
diff changeset
998 or there's an alpha channel. This is a crash on Linux. So we need
a9493cab536f Fix crash due to mishandling transparency.
Stephen J. Turnbull <stephen@xemacs.org>
parents: 4682
diff changeset
999 to add padding.
a9493cab536f Fix crash due to mishandling transparency.
Stephen J. Turnbull <stephen@xemacs.org>
parents: 4682
diff changeset
1000 The worst case is reducing 8 bytes (16-bit RGBA) to 3 (8-bit RGB). */
a9493cab536f Fix crash due to mishandling transparency.
Stephen J. Turnbull <stephen@xemacs.org>
parents: 4682
diff changeset
1001
a9493cab536f Fix crash due to mishandling transparency.
Stephen J. Turnbull <stephen@xemacs.org>
parents: 4682
diff changeset
1002 padding = 5 * width;
a9493cab536f Fix crash due to mishandling transparency.
Stephen J. Turnbull <stephen@xemacs.org>
parents: 4682
diff changeset
1003 unwind.eimage = xnew_array_and_zero (Binbyte,
a9493cab536f Fix crash due to mishandling transparency.
Stephen J. Turnbull <stephen@xemacs.org>
parents: 4682
diff changeset
1004 (size_t) (pixels_sq * 3 + padding));
a9493cab536f Fix crash due to mishandling transparency.
Stephen J. Turnbull <stephen@xemacs.org>
parents: 4682
diff changeset
1005
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1006 /* libpng expects that the image buffer passed in contains a
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1007 picture to draw on top of if the png has any transparencies.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1008 This could be a good place to pass that in... */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1009
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1010 row_pointers = xnew_array (png_byte *, height);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1011 for (y = 0; y < height; y++)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1012 row_pointers[y] = unwind.eimage + (width * 3 * y);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1013
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1014 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1015 /* if the png specifies a background chunk, go ahead and
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1016 use it, else use what we can get from the default face. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1017 png_color_16 my_background, *image_background;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1018 Lisp_Object bkgd = Qnil;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1019
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1020 my_background.red = 0x7fff;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1021 my_background.green = 0x7fff;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1022 my_background.blue = 0x7fff;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1023 bkgd = FACE_BACKGROUND (Vdefault_face, domain);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1024 if (!COLOR_INSTANCEP (bkgd))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1025 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1026 warn_when_safe (Qpng, Qinfo, "Couldn't get background color!");
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1027 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1028 else
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1029 {
4698
a9493cab536f Fix crash due to mishandling transparency.
Stephen J. Turnbull <stephen@xemacs.org>
parents: 4682
diff changeset
1030 Lisp_Color_Instance *c = XCOLOR_INSTANCE (bkgd);
a9493cab536f Fix crash due to mishandling transparency.
Stephen J. Turnbull <stephen@xemacs.org>
parents: 4682
diff changeset
1031 Lisp_Object rgb = MAYBE_LISP_DEVMETH (XDEVICE (c->device),
a9493cab536f Fix crash due to mishandling transparency.
Stephen J. Turnbull <stephen@xemacs.org>
parents: 4682
diff changeset
1032 color_instance_rgb_components,
a9493cab536f Fix crash due to mishandling transparency.
Stephen J. Turnbull <stephen@xemacs.org>
parents: 4682
diff changeset
1033 (c));
5581
56144c8593a8 Mechanically change INT to FIXNUM in our sources.
Aidan Kehoe <kehoea@parhasard.net>
parents: 5537
diff changeset
1034 #define GETCOLOR(col) my_background.col = (unsigned short) XFIXNUM (XCAR (rgb))
4698
a9493cab536f Fix crash due to mishandling transparency.
Stephen J. Turnbull <stephen@xemacs.org>
parents: 4682
diff changeset
1035 GETCOLOR(red); rgb = XCDR (rgb);
a9493cab536f Fix crash due to mishandling transparency.
Stephen J. Turnbull <stephen@xemacs.org>
parents: 4682
diff changeset
1036 GETCOLOR(green); rgb = XCDR (rgb);
a9493cab536f Fix crash due to mishandling transparency.
Stephen J. Turnbull <stephen@xemacs.org>
parents: 4682
diff changeset
1037 GETCOLOR(blue);
a9493cab536f Fix crash due to mishandling transparency.
Stephen J. Turnbull <stephen@xemacs.org>
parents: 4682
diff changeset
1038 #undef GETCOLOR
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1039 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1040
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1041 if (png_get_bKGD (png_ptr, info_ptr, &image_background))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1042 png_set_background (png_ptr, image_background,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1043 PNG_BACKGROUND_GAMMA_FILE, 1, 1.0);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1044 else
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1045 png_set_background (png_ptr, &my_background,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1046 PNG_BACKGROUND_GAMMA_SCREEN, 0, 1.0);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1047 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1048
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1049 /* Now that we're using EImage, ask for 8bit RGB triples for any type
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1050 of image*/
5372
6c3a695f54f5 Update png_instantiate () to work with more recent versions of libpng.
Aidan Kehoe <kehoea@parhasard.net>
parents: 5250
diff changeset
1051 switch (png_get_color_type (png_ptr, info_ptr))
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1052 {
5372
6c3a695f54f5 Update png_instantiate () to work with more recent versions of libpng.
Aidan Kehoe <kehoea@parhasard.net>
parents: 5250
diff changeset
1053 case PNG_COLOR_TYPE_PALETTE:
6c3a695f54f5 Update png_instantiate () to work with more recent versions of libpng.
Aidan Kehoe <kehoea@parhasard.net>
parents: 5250
diff changeset
1054 /* convert palette images to RGB */
6c3a695f54f5 Update png_instantiate () to work with more recent versions of libpng.
Aidan Kehoe <kehoea@parhasard.net>
parents: 5250
diff changeset
1055 png_set_palette_to_rgb (png_ptr);
6c3a695f54f5 Update png_instantiate () to work with more recent versions of libpng.
Aidan Kehoe <kehoea@parhasard.net>
parents: 5250
diff changeset
1056 break;
6c3a695f54f5 Update png_instantiate () to work with more recent versions of libpng.
Aidan Kehoe <kehoea@parhasard.net>
parents: 5250
diff changeset
1057
6c3a695f54f5 Update png_instantiate () to work with more recent versions of libpng.
Aidan Kehoe <kehoea@parhasard.net>
parents: 5250
diff changeset
1058 case PNG_COLOR_TYPE_GRAY:
6c3a695f54f5 Update png_instantiate () to work with more recent versions of libpng.
Aidan Kehoe <kehoea@parhasard.net>
parents: 5250
diff changeset
1059 case PNG_COLOR_TYPE_GRAY_ALPHA:
6c3a695f54f5 Update png_instantiate () to work with more recent versions of libpng.
Aidan Kehoe <kehoea@parhasard.net>
parents: 5250
diff changeset
1060 /* convert grayscale images to RGB */
6c3a695f54f5 Update png_instantiate () to work with more recent versions of libpng.
Aidan Kehoe <kehoea@parhasard.net>
parents: 5250
diff changeset
1061 png_set_gray_to_rgb (png_ptr);
6c3a695f54f5 Update png_instantiate () to work with more recent versions of libpng.
Aidan Kehoe <kehoea@parhasard.net>
parents: 5250
diff changeset
1062 break;
6c3a695f54f5 Update png_instantiate () to work with more recent versions of libpng.
Aidan Kehoe <kehoea@parhasard.net>
parents: 5250
diff changeset
1063
6c3a695f54f5 Update png_instantiate () to work with more recent versions of libpng.
Aidan Kehoe <kehoea@parhasard.net>
parents: 5250
diff changeset
1064 default:
6c3a695f54f5 Update png_instantiate () to work with more recent versions of libpng.
Aidan Kehoe <kehoea@parhasard.net>
parents: 5250
diff changeset
1065 /* pad images with depth < 8 bits */
6c3a695f54f5 Update png_instantiate () to work with more recent versions of libpng.
Aidan Kehoe <kehoea@parhasard.net>
parents: 5250
diff changeset
1066 if (png_get_bit_depth (png_ptr, info_ptr) < 8)
6c3a695f54f5 Update png_instantiate () to work with more recent versions of libpng.
Aidan Kehoe <kehoea@parhasard.net>
parents: 5250
diff changeset
1067 {
6c3a695f54f5 Update png_instantiate () to work with more recent versions of libpng.
Aidan Kehoe <kehoea@parhasard.net>
parents: 5250
diff changeset
1068 png_set_packing (png_ptr);
6c3a695f54f5 Update png_instantiate () to work with more recent versions of libpng.
Aidan Kehoe <kehoea@parhasard.net>
parents: 5250
diff changeset
1069 }
6c3a695f54f5 Update png_instantiate () to work with more recent versions of libpng.
Aidan Kehoe <kehoea@parhasard.net>
parents: 5250
diff changeset
1070 break;
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1071 }
5372
6c3a695f54f5 Update png_instantiate () to work with more recent versions of libpng.
Aidan Kehoe <kehoea@parhasard.net>
parents: 5250
diff changeset
1072
4698
a9493cab536f Fix crash due to mishandling transparency.
Stephen J. Turnbull <stephen@xemacs.org>
parents: 4682
diff changeset
1073 /* strip 16-bit depth files down to 8 bits */
5372
6c3a695f54f5 Update png_instantiate () to work with more recent versions of libpng.
Aidan Kehoe <kehoea@parhasard.net>
parents: 5250
diff changeset
1074 if (png_get_bit_depth (png_ptr, info_ptr) == 16)
4698
a9493cab536f Fix crash due to mishandling transparency.
Stephen J. Turnbull <stephen@xemacs.org>
parents: 4682
diff changeset
1075 png_set_strip_16 (png_ptr);
a9493cab536f Fix crash due to mishandling transparency.
Stephen J. Turnbull <stephen@xemacs.org>
parents: 4682
diff changeset
1076 /* strip alpha channel
a9493cab536f Fix crash due to mishandling transparency.
Stephen J. Turnbull <stephen@xemacs.org>
parents: 4682
diff changeset
1077 #### shouldn't we handle this?
a9493cab536f Fix crash due to mishandling transparency.
Stephen J. Turnbull <stephen@xemacs.org>
parents: 4682
diff changeset
1078 first call png_read_update_info in case above transformations
a9493cab536f Fix crash due to mishandling transparency.
Stephen J. Turnbull <stephen@xemacs.org>
parents: 4682
diff changeset
1079 have generated an alpha channel */
a9493cab536f Fix crash due to mishandling transparency.
Stephen J. Turnbull <stephen@xemacs.org>
parents: 4682
diff changeset
1080 png_read_update_info(png_ptr, info_ptr);
5372
6c3a695f54f5 Update png_instantiate () to work with more recent versions of libpng.
Aidan Kehoe <kehoea@parhasard.net>
parents: 5250
diff changeset
1081 if (png_get_color_type (png_ptr, info_ptr) & PNG_COLOR_MASK_ALPHA)
4698
a9493cab536f Fix crash due to mishandling transparency.
Stephen J. Turnbull <stephen@xemacs.org>
parents: 4682
diff changeset
1082 png_set_strip_alpha (png_ptr);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1083
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1084 png_read_image (png_ptr, row_pointers);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1085 png_read_end (png_ptr, info_ptr);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1086
4698
a9493cab536f Fix crash due to mishandling transparency.
Stephen J. Turnbull <stephen@xemacs.org>
parents: 4682
diff changeset
1087 /* #### There should be some way to pass this type of data down
a9493cab536f Fix crash due to mishandling transparency.
Stephen J. Turnbull <stephen@xemacs.org>
parents: 4682
diff changeset
1088 * into the glyph code, where you can get to it from lisp
a9493cab536f Fix crash due to mishandling transparency.
Stephen J. Turnbull <stephen@xemacs.org>
parents: 4682
diff changeset
1089 * anyway. - WMP */
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1090 {
5537
2df2d9171f20 Suppress a "shadowed local" warning.
Stephen J. Turnbull <stephen@xemacs.org>
parents: 5536
diff changeset
1091 int i, num_text = 0;
5372
6c3a695f54f5 Update png_instantiate () to work with more recent versions of libpng.
Aidan Kehoe <kehoea@parhasard.net>
parents: 5250
diff changeset
1092 png_textp text_ptr = NULL;
3734
e1f65870f845 [xemacs-hg @ 2006-12-11 10:04:27 by aidan]
aidan
parents: 3094
diff changeset
1093 DECLARE_EISTRING (key);
e1f65870f845 [xemacs-hg @ 2006-12-11 10:04:27 by aidan]
aidan
parents: 3094
diff changeset
1094 DECLARE_EISTRING (text);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1095
5372
6c3a695f54f5 Update png_instantiate () to work with more recent versions of libpng.
Aidan Kehoe <kehoea@parhasard.net>
parents: 5250
diff changeset
1096 if (png_get_text (png_ptr, info_ptr, &text_ptr, &num_text) > 0)
6c3a695f54f5 Update png_instantiate () to work with more recent versions of libpng.
Aidan Kehoe <kehoea@parhasard.net>
parents: 5250
diff changeset
1097 {
5537
2df2d9171f20 Suppress a "shadowed local" warning.
Stephen J. Turnbull <stephen@xemacs.org>
parents: 5536
diff changeset
1098 for (i = 0 ; i < num_text; i++)
5372
6c3a695f54f5 Update png_instantiate () to work with more recent versions of libpng.
Aidan Kehoe <kehoea@parhasard.net>
parents: 5250
diff changeset
1099 {
6c3a695f54f5 Update png_instantiate () to work with more recent versions of libpng.
Aidan Kehoe <kehoea@parhasard.net>
parents: 5250
diff changeset
1100 eireset (key);
6c3a695f54f5 Update png_instantiate () to work with more recent versions of libpng.
Aidan Kehoe <kehoea@parhasard.net>
parents: 5250
diff changeset
1101 eireset (text);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1102
5537
2df2d9171f20 Suppress a "shadowed local" warning.
Stephen J. Turnbull <stephen@xemacs.org>
parents: 5536
diff changeset
1103 eicpy_ext (key, text_ptr[i].key, Qbinary);
2df2d9171f20 Suppress a "shadowed local" warning.
Stephen J. Turnbull <stephen@xemacs.org>
parents: 5536
diff changeset
1104 eicpy_ext (text, text_ptr[i].text, Qbinary);
5372
6c3a695f54f5 Update png_instantiate () to work with more recent versions of libpng.
Aidan Kehoe <kehoea@parhasard.net>
parents: 5250
diff changeset
1105
6c3a695f54f5 Update png_instantiate () to work with more recent versions of libpng.
Aidan Kehoe <kehoea@parhasard.net>
parents: 5250
diff changeset
1106 warn_when_safe (Qpng, Qinfo, "%s - %s", eidata (key),
6c3a695f54f5 Update png_instantiate () to work with more recent versions of libpng.
Aidan Kehoe <kehoea@parhasard.net>
parents: 5250
diff changeset
1107 eidata (text));
6c3a695f54f5 Update png_instantiate () to work with more recent versions of libpng.
Aidan Kehoe <kehoea@parhasard.net>
parents: 5250
diff changeset
1108 }
6c3a695f54f5 Update png_instantiate () to work with more recent versions of libpng.
Aidan Kehoe <kehoea@parhasard.net>
parents: 5250
diff changeset
1109 }
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1110 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1111
4976
16112448d484 Rename xfree(FOO, TYPE) -> xfree(FOO)
Ben Wing <ben@xemacs.org>
parents: 4953
diff changeset
1112 xfree (row_pointers);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1113 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1114
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1115 /* now instantiate */
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1116 MAYBE_DEVMETH (DOMAIN_XDEVICE (ii->domain),
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1117 init_image_instance_from_eimage,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1118 (ii, width, height, 1, unwind.eimage, dest_mask,
2959
4eb2a8c07cb3 [xemacs-hg @ 2005-09-27 05:48:22 by ben]
ben
parents: 2563
diff changeset
1119 instantiator, pointer_fg, pointer_bg, domain));
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1120
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1121 /* This will clean up everything else. */
771
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 665
diff changeset
1122 unbind_to (speccount);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1123 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1124
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1125 #endif /* HAVE_PNG */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1126
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1127
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1128 #ifdef HAVE_TIFF
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1129 #include "tiffio.h"
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1130
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1131 /**********************************************************************
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1132 * TIFF *
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1133 **********************************************************************/
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1134 static void
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1135 tiff_validate (Lisp_Object instantiator)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1136 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1137 file_or_data_must_be_present (instantiator);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1138 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1139
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1140 static Lisp_Object
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1141 tiff_normalize (Lisp_Object inst, Lisp_Object console_type,
2286
04bc9d2f42c7 [xemacs-hg @ 2004-09-20 19:18:55 by james]
james
parents: 2270
diff changeset
1142 Lisp_Object UNUSED (dest_mask))
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1143 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1144 return simple_image_type_normalize (inst, console_type, Qtiff);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1145 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1146
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1147 static int
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1148 tiff_possible_dest_types (void)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1149 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1150 return IMAGE_COLOR_PIXMAP_MASK;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1151 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1152
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1153 struct tiff_unwind_data
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1154 {
2367
ecf1ebac70d8 [xemacs-hg @ 2004-11-04 23:05:23 by ben]
ben
parents: 2286
diff changeset
1155 Binbyte *eimage;
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1156 /* Object that holds the decoded data from a TIFF file */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1157 TIFF *tiff;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1158 };
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1159
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1160 static Lisp_Object
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1161 tiff_instantiate_unwind (Lisp_Object unwind_obj)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1162 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1163 struct tiff_unwind_data *data =
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1164 (struct tiff_unwind_data *) get_opaque_ptr (unwind_obj);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1165
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1166 free_opaque_ptr (unwind_obj);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1167 if (data->tiff)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1168 {
5169
6c6d78781d59 cleanup of code related to xfree(), better KKCC backtrace capabilities, document XD_INLINE_LISP_OBJECT_BLOCK_PTR, fix some memory leaks, other code cleanup
Ben Wing <ben@xemacs.org>
parents: 5024
diff changeset
1169 TIFFClose (data->tiff);
6c6d78781d59 cleanup of code related to xfree(), better KKCC backtrace capabilities, document XD_INLINE_LISP_OBJECT_BLOCK_PTR, fix some memory leaks, other code cleanup
Ben Wing <ben@xemacs.org>
parents: 5024
diff changeset
1170 data->tiff = 0;
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1171 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1172 if (data->eimage)
5169
6c6d78781d59 cleanup of code related to xfree(), better KKCC backtrace capabilities, document XD_INLINE_LISP_OBJECT_BLOCK_PTR, fix some memory leaks, other code cleanup
Ben Wing <ben@xemacs.org>
parents: 5024
diff changeset
1173 {
6c6d78781d59 cleanup of code related to xfree(), better KKCC backtrace capabilities, document XD_INLINE_LISP_OBJECT_BLOCK_PTR, fix some memory leaks, other code cleanup
Ben Wing <ben@xemacs.org>
parents: 5024
diff changeset
1174 xfree (data->eimage);
6c6d78781d59 cleanup of code related to xfree(), better KKCC backtrace capabilities, document XD_INLINE_LISP_OBJECT_BLOCK_PTR, fix some memory leaks, other code cleanup
Ben Wing <ben@xemacs.org>
parents: 5024
diff changeset
1175 data->eimage = 0;
6c6d78781d59 cleanup of code related to xfree(), better KKCC backtrace capabilities, document XD_INLINE_LISP_OBJECT_BLOCK_PTR, fix some memory leaks, other code cleanup
Ben Wing <ben@xemacs.org>
parents: 5024
diff changeset
1176 }
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1177
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1178 return Qnil;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1179 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1180
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1181 typedef struct tiff_memory_storage
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1182 {
2367
ecf1ebac70d8 [xemacs-hg @ 2004-11-04 23:05:23 by ben]
ben
parents: 2286
diff changeset
1183 Binbyte *bytes; /* The data */
665
fdefd0186b75 [xemacs-hg @ 2001-09-20 06:28:42 by ben]
ben
parents: 647
diff changeset
1184 Bytecount len; /* How big is it? */
fdefd0186b75 [xemacs-hg @ 2001-09-20 06:28:42 by ben]
ben
parents: 647
diff changeset
1185 Bytecount index; /* Where are we? */
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1186 } tiff_memory_storage;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1187
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1188 static size_t
647
b39c14581166 [xemacs-hg @ 2001-08-13 04:45:47 by ben]
ben
parents: 638
diff changeset
1189 tiff_memory_read (thandle_t data, tdata_t buf, tsize_t size)
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1190 {
647
b39c14581166 [xemacs-hg @ 2001-08-13 04:45:47 by ben]
ben
parents: 638
diff changeset
1191 tiff_memory_storage *mem = (tiff_memory_storage *) data;
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1192
665
fdefd0186b75 [xemacs-hg @ 2001-09-20 06:28:42 by ben]
ben
parents: 647
diff changeset
1193 if ((Bytecount) size > (mem->len - mem->index))
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1194 return (size_t) -1;
647
b39c14581166 [xemacs-hg @ 2001-08-13 04:45:47 by ben]
ben
parents: 638
diff changeset
1195 memcpy (buf, mem->bytes + mem->index, size);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1196 mem->index = mem->index + size;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1197 return size;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1198 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1199
647
b39c14581166 [xemacs-hg @ 2001-08-13 04:45:47 by ben]
ben
parents: 638
diff changeset
1200 static size_t
2286
04bc9d2f42c7 [xemacs-hg @ 2004-09-20 19:18:55 by james]
james
parents: 2270
diff changeset
1201 tiff_memory_write (thandle_t UNUSED (data), tdata_t UNUSED (buf),
04bc9d2f42c7 [xemacs-hg @ 2004-09-20 19:18:55 by james]
james
parents: 2270
diff changeset
1202 tsize_t UNUSED (size))
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1203 {
2500
3d8143fc88e1 [xemacs-hg @ 2005-01-24 23:33:30 by ben]
ben
parents: 2367
diff changeset
1204 ABORT();
2270
0be6ff2356c8 [xemacs-hg @ 2004-09-14 18:22:31 by james]
james
parents: 2235
diff changeset
1205 return 0;
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1206 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1207
647
b39c14581166 [xemacs-hg @ 2001-08-13 04:45:47 by ben]
ben
parents: 638
diff changeset
1208 static toff_t
b39c14581166 [xemacs-hg @ 2001-08-13 04:45:47 by ben]
ben
parents: 638
diff changeset
1209 tiff_memory_seek (thandle_t data, toff_t off, int whence)
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1210 {
647
b39c14581166 [xemacs-hg @ 2001-08-13 04:45:47 by ben]
ben
parents: 638
diff changeset
1211 tiff_memory_storage *mem = (tiff_memory_storage *) data;
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1212 int newidx;
647
b39c14581166 [xemacs-hg @ 2001-08-13 04:45:47 by ben]
ben
parents: 638
diff changeset
1213 switch(whence)
b39c14581166 [xemacs-hg @ 2001-08-13 04:45:47 by ben]
ben
parents: 638
diff changeset
1214 {
b39c14581166 [xemacs-hg @ 2001-08-13 04:45:47 by ben]
ben
parents: 638
diff changeset
1215 case SEEK_SET:
b39c14581166 [xemacs-hg @ 2001-08-13 04:45:47 by ben]
ben
parents: 638
diff changeset
1216 newidx = off;
b39c14581166 [xemacs-hg @ 2001-08-13 04:45:47 by ben]
ben
parents: 638
diff changeset
1217 break;
b39c14581166 [xemacs-hg @ 2001-08-13 04:45:47 by ben]
ben
parents: 638
diff changeset
1218 case SEEK_END:
b39c14581166 [xemacs-hg @ 2001-08-13 04:45:47 by ben]
ben
parents: 638
diff changeset
1219 newidx = mem->len + off;
b39c14581166 [xemacs-hg @ 2001-08-13 04:45:47 by ben]
ben
parents: 638
diff changeset
1220 break;
b39c14581166 [xemacs-hg @ 2001-08-13 04:45:47 by ben]
ben
parents: 638
diff changeset
1221 case SEEK_CUR:
b39c14581166 [xemacs-hg @ 2001-08-13 04:45:47 by ben]
ben
parents: 638
diff changeset
1222 newidx = mem->index + off;
b39c14581166 [xemacs-hg @ 2001-08-13 04:45:47 by ben]
ben
parents: 638
diff changeset
1223 break;
b39c14581166 [xemacs-hg @ 2001-08-13 04:45:47 by ben]
ben
parents: 638
diff changeset
1224 default:
b39c14581166 [xemacs-hg @ 2001-08-13 04:45:47 by ben]
ben
parents: 638
diff changeset
1225 fprintf (stderr, "Eh? invalid seek mode in tiff_memory_seek\n");
b39c14581166 [xemacs-hg @ 2001-08-13 04:45:47 by ben]
ben
parents: 638
diff changeset
1226 return (toff_t) -1;
b39c14581166 [xemacs-hg @ 2001-08-13 04:45:47 by ben]
ben
parents: 638
diff changeset
1227 }
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1228
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1229 if ((newidx > mem->len) || (newidx < 0))
593
5fd7ba8b56e7 [xemacs-hg @ 2001-05-31 12:45:27 by ben]
ben
parents: 442
diff changeset
1230 return (toff_t) -1;
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1231
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1232 mem->index = newidx;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1233 return newidx;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1234 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1235
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1236 static int
2286
04bc9d2f42c7 [xemacs-hg @ 2004-09-20 19:18:55 by james]
james
parents: 2270
diff changeset
1237 tiff_memory_close (thandle_t UNUSED (data))
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1238 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1239 return 0;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1240 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1241
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1242 static int
2286
04bc9d2f42c7 [xemacs-hg @ 2004-09-20 19:18:55 by james]
james
parents: 2270
diff changeset
1243 tiff_map_noop (thandle_t UNUSED (data), tdata_t* UNUSED (pbase),
04bc9d2f42c7 [xemacs-hg @ 2004-09-20 19:18:55 by james]
james
parents: 2270
diff changeset
1244 toff_t* UNUSED (psize))
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1245 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1246 return 0;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1247 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1248
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1249 static void
2286
04bc9d2f42c7 [xemacs-hg @ 2004-09-20 19:18:55 by james]
james
parents: 2270
diff changeset
1250 tiff_unmap_noop (thandle_t UNUSED (data), tdata_t UNUSED (pbase),
04bc9d2f42c7 [xemacs-hg @ 2004-09-20 19:18:55 by james]
james
parents: 2270
diff changeset
1251 toff_t UNUSED (psize))
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1252 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1253 return;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1254 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1255
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1256 static toff_t
647
b39c14581166 [xemacs-hg @ 2001-08-13 04:45:47 by ben]
ben
parents: 638
diff changeset
1257 tiff_memory_size (thandle_t data)
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1258 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1259 tiff_memory_storage *mem = (tiff_memory_storage*)data;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1260 return mem->len;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1261 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1262
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1263 struct tiff_error_struct
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1264 {
438
84b14dcb0985 Import from CVS: tag r21-2-27
cvs
parents: 428
diff changeset
1265 #ifdef HAVE_VSNPRINTF
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1266 char err_str[256];
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1267 #else
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1268 char err_str[1024]; /* return the error string */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1269 #endif
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1270 jmp_buf setjmp_buffer; /* for return to caller */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1271 };
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1272
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1273 /* jh 98/03/12 - ###This struct for passing data to the error functions
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1274 is an ugly hack caused by the fact that libtiff (as of v3.4) doesn't
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1275 have any place to store error func data. This should be rectified
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1276 before XEmacs gets threads! */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1277 static struct tiff_error_struct tiff_err_data;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1278
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1279 static void
2286
04bc9d2f42c7 [xemacs-hg @ 2004-09-20 19:18:55 by james]
james
parents: 2270
diff changeset
1280 tiff_error_func (const char *UNUSED (module), const char *fmt, ...)
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1281 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1282 va_list vargs;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1283
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1284 va_start (vargs, fmt);
438
84b14dcb0985 Import from CVS: tag r21-2-27
cvs
parents: 428
diff changeset
1285 #ifdef HAVE_VSNPRINTF
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1286 vsnprintf (tiff_err_data.err_str, 255, fmt, vargs);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1287 #else
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1288 /* pray this doesn't overflow... */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1289 vsprintf (tiff_err_data.err_str, fmt, vargs);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1290 #endif
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1291 va_end (vargs);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1292 /* return to setjmp point */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1293 longjmp (tiff_err_data.setjmp_buffer, 1);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1294 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1295
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1296 static void
647
b39c14581166 [xemacs-hg @ 2001-08-13 04:45:47 by ben]
ben
parents: 638
diff changeset
1297 tiff_warning_func (const char *module, const char *fmt, ...)
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1298 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1299 va_list vargs;
438
84b14dcb0985 Import from CVS: tag r21-2-27
cvs
parents: 428
diff changeset
1300 #ifdef HAVE_VSNPRINTF
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1301 char warn_str[256];
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1302 #else
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1303 char warn_str[1024];
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1304 #endif
3734
e1f65870f845 [xemacs-hg @ 2006-12-11 10:04:27 by aidan]
aidan
parents: 3094
diff changeset
1305 DECLARE_EISTRING (eimodule);
e1f65870f845 [xemacs-hg @ 2006-12-11 10:04:27 by aidan]
aidan
parents: 3094
diff changeset
1306 DECLARE_EISTRING (eiwarnstr);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1307
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1308 va_start (vargs, fmt);
438
84b14dcb0985 Import from CVS: tag r21-2-27
cvs
parents: 428
diff changeset
1309 #ifdef HAVE_VSNPRINTF
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1310 vsnprintf (warn_str, 255, fmt, vargs);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1311 #else
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1312 vsprintf (warn_str, fmt, vargs);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1313 #endif
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1314 va_end (vargs);
3734
e1f65870f845 [xemacs-hg @ 2006-12-11 10:04:27 by aidan]
aidan
parents: 3094
diff changeset
1315
e1f65870f845 [xemacs-hg @ 2006-12-11 10:04:27 by aidan]
aidan
parents: 3094
diff changeset
1316 eicpy_ext(eimodule, module, Qbinary);
e1f65870f845 [xemacs-hg @ 2006-12-11 10:04:27 by aidan]
aidan
parents: 3094
diff changeset
1317 eicpy_ext(eiwarnstr, warn_str, Qbinary);
e1f65870f845 [xemacs-hg @ 2006-12-11 10:04:27 by aidan]
aidan
parents: 3094
diff changeset
1318
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1319 warn_when_safe (Qtiff, Qinfo, "%s - %s",
3734
e1f65870f845 [xemacs-hg @ 2006-12-11 10:04:27 by aidan]
aidan
parents: 3094
diff changeset
1320 eidata(eimodule),
e1f65870f845 [xemacs-hg @ 2006-12-11 10:04:27 by aidan]
aidan
parents: 3094
diff changeset
1321 eidata(eiwarnstr));
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1322 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1323
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1324 static void
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1325 tiff_instantiate (Lisp_Object image_instance, Lisp_Object instantiator,
2959
4eb2a8c07cb3 [xemacs-hg @ 2005-09-27 05:48:22 by ben]
ben
parents: 2563
diff changeset
1326 Lisp_Object pointer_fg, Lisp_Object pointer_bg,
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1327 int dest_mask, Lisp_Object domain)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1328 {
440
8de8e3f6228a Import from CVS: tag r21-2-28
cvs
parents: 438
diff changeset
1329 Lisp_Image_Instance *ii = XIMAGE_INSTANCE (image_instance);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1330 tiff_memory_storage mem_struct;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1331 /* It is OK for the unwind data to be local to this function,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1332 because the unwind-protect is always executed when this
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1333 stack frame is still valid. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1334 struct tiff_unwind_data unwind;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1335 int speccount = specpdl_depth ();
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1336 uint32 width, height;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1337
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1338 xzero (unwind);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1339 record_unwind_protect (tiff_instantiate_unwind, make_opaque_ptr (&unwind));
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1340
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1341 /* set up error facilities */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1342 if (setjmp (tiff_err_data.setjmp_buffer))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1343 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1344 /* An error was signaled. No clean up is needed, as unwind handles that
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1345 for us. Just pass the error along. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1346 signal_image_error_2 ("TIFF decoding error",
4953
304aebb79cd3 function renamings to track names of char typedefs
Ben Wing <ben@xemacs.org>
parents: 4952
diff changeset
1347 build_extstring (tiff_err_data.err_str,
4952
19a72041c5ed Mule-izing, various fixes related to char * arguments
Ben Wing <ben@xemacs.org>
parents: 4854
diff changeset
1348 Qerror_message_encoding),
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1349 instantiator);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1350 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1351 TIFFSetErrorHandler ((TIFFErrorHandler)tiff_error_func);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1352 TIFFSetWarningHandler ((TIFFErrorHandler)tiff_warning_func);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1353 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1354 Lisp_Object data = find_keyword_in_vector (instantiator, Q_data);
2367
ecf1ebac70d8 [xemacs-hg @ 2004-11-04 23:05:23 by ben]
ben
parents: 2286
diff changeset
1355 Binbyte *bytes;
665
fdefd0186b75 [xemacs-hg @ 2001-09-20 06:28:42 by ben]
ben
parents: 647
diff changeset
1356 Bytecount len;
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1357
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1358 uint32 *raster;
2367
ecf1ebac70d8 [xemacs-hg @ 2004-11-04 23:05:23 by ben]
ben
parents: 2286
diff changeset
1359 Binbyte *ep;
4646
6c6bfdb80a0c Prevent integer overflow and subsequent crashes when attempting to load large
Jerry James <james@xemacs.org>
parents: 4326
diff changeset
1360 UINT_64_BIT pixels_sq;
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1361
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1362 assert (!NILP (data));
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1363
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1364 /* #### This is a definite problem under Mule due to the amount of
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1365 stack data it might allocate. Think about Lstreams... */
4981
4aebb0131297 Cleanups/renaming of EXTERNAL_TO_C_STRING and friends
Ben Wing <ben@xemacs.org>
parents: 4953
diff changeset
1366 LISP_STRING_TO_SIZED_EXTERNAL (data, bytes, len, Qbinary);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1367 mem_struct.bytes = bytes;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1368 mem_struct.len = len;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1369 mem_struct.index = 0;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1370
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1371 unwind.tiff = TIFFClientOpen ("memfile", "r", (thandle_t) &mem_struct,
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1372 (TIFFReadWriteProc)tiff_memory_read,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1373 (TIFFReadWriteProc)tiff_memory_write,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1374 tiff_memory_seek, tiff_memory_close, tiff_memory_size,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1375 tiff_map_noop, tiff_unmap_noop);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1376 if (!unwind.tiff)
440
8de8e3f6228a Import from CVS: tag r21-2-28
cvs
parents: 438
diff changeset
1377 signal_image_error ("Insufficient memory to instantiate TIFF image", instantiator);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1378
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1379 TIFFGetField (unwind.tiff, TIFFTAG_IMAGEWIDTH, &width);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1380 TIFFGetField (unwind.tiff, TIFFTAG_IMAGELENGTH, &height);
4646
6c6bfdb80a0c Prevent integer overflow and subsequent crashes when attempting to load large
Jerry James <james@xemacs.org>
parents: 4326
diff changeset
1381 pixels_sq = (UINT_64_BIT) width * (UINT_64_BIT) height;
6c6bfdb80a0c Prevent integer overflow and subsequent crashes when attempting to load large
Jerry James <james@xemacs.org>
parents: 4326
diff changeset
1382 if (pixels_sq >= 1 << 29)
6c6bfdb80a0c Prevent integer overflow and subsequent crashes when attempting to load large
Jerry James <james@xemacs.org>
parents: 4326
diff changeset
1383 signal_image_error ("TIFF image too large to instantiate", instantiator);
4682
648f4a0dac3e Fix build problems on WIN32 platforms caused by the large image crash fix.
Jerry James <james@xemacs.org>
parents: 4646
diff changeset
1384 unwind.eimage = xnew_binbytes ((size_t) pixels_sq * 3);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1385
440
8de8e3f6228a Import from CVS: tag r21-2-28
cvs
parents: 438
diff changeset
1386 /* #### This is little more than proof-of-concept/function testing.
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1387 It needs to be reimplemented via scanline reads for both memory
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1388 compactness. */
4646
6c6bfdb80a0c Prevent integer overflow and subsequent crashes when attempting to load large
Jerry James <james@xemacs.org>
parents: 4326
diff changeset
1389 raster = (uint32*) _TIFFmalloc ((tsize_t) (pixels_sq * sizeof (uint32)));
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1390 if (raster != NULL)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1391 {
647
b39c14581166 [xemacs-hg @ 2001-08-13 04:45:47 by ben]
ben
parents: 638
diff changeset
1392 int i, j;
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1393 uint32 *rp;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1394 ep = unwind.eimage;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1395 rp = raster;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1396 if (TIFFReadRGBAImage (unwind.tiff, width, height, raster, 0))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1397 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1398 for (i = height - 1; i >= 0; i--)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1399 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1400 /* This is to get around weirdness in the libtiff library where properly
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1401 made TIFFs will come out upside down. libtiff bug or jhod-brainlock? */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1402 rp = raster + (i * width);
647
b39c14581166 [xemacs-hg @ 2001-08-13 04:45:47 by ben]
ben
parents: 638
diff changeset
1403 for (j = 0; j < (int) width; j++)
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1404 {
2367
ecf1ebac70d8 [xemacs-hg @ 2004-11-04 23:05:23 by ben]
ben
parents: 2286
diff changeset
1405 *ep++ = (Binbyte)TIFFGetR(*rp);
ecf1ebac70d8 [xemacs-hg @ 2004-11-04 23:05:23 by ben]
ben
parents: 2286
diff changeset
1406 *ep++ = (Binbyte)TIFFGetG(*rp);
ecf1ebac70d8 [xemacs-hg @ 2004-11-04 23:05:23 by ben]
ben
parents: 2286
diff changeset
1407 *ep++ = (Binbyte)TIFFGetB(*rp);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1408 rp++;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1409 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1410 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1411 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1412 _TIFFfree (raster);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1413 } else
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1414 signal_image_error ("Unable to allocate memory for TIFFReadRGBA", instantiator);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1415
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1416 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1417
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1418 /* now instantiate */
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1419 MAYBE_DEVMETH (DOMAIN_XDEVICE (ii->domain),
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1420 init_image_instance_from_eimage,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1421 (ii, width, height, 1, unwind.eimage, dest_mask,
2959
4eb2a8c07cb3 [xemacs-hg @ 2005-09-27 05:48:22 by ben]
ben
parents: 2563
diff changeset
1422 instantiator, pointer_fg, pointer_bg, domain));
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1423
771
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 665
diff changeset
1424 unbind_to (speccount);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1425 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1426
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1427 #endif /* HAVE_TIFF */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1429
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1430 /************************************************************************/
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1431 /* initialization */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1432 /************************************************************************/
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1433
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1434 void
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1435 syms_of_glyphs_eimage (void)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1436 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1437 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1438
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1439 void
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1440 image_instantiator_format_create_glyphs_eimage (void)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1441 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1442 /* image-instantiator types */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1443 #ifdef HAVE_JPEG
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1444 INITIALIZE_IMAGE_INSTANTIATOR_FORMAT (jpeg, "jpeg");
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1445
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1446 IIFORMAT_HAS_METHOD (jpeg, validate);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1447 IIFORMAT_HAS_METHOD (jpeg, normalize);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1448 IIFORMAT_HAS_METHOD (jpeg, possible_dest_types);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1449 IIFORMAT_HAS_METHOD (jpeg, instantiate);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1450
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1451 IIFORMAT_VALID_KEYWORD (jpeg, Q_data, check_valid_string);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1452 IIFORMAT_VALID_KEYWORD (jpeg, Q_file, check_valid_string);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1453 #endif
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1454
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1455 #ifdef HAVE_GIF
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1456 INITIALIZE_IMAGE_INSTANTIATOR_FORMAT (gif, "gif");
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1457
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1458 IIFORMAT_HAS_METHOD (gif, validate);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1459 IIFORMAT_HAS_METHOD (gif, normalize);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1460 IIFORMAT_HAS_METHOD (gif, possible_dest_types);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1461 IIFORMAT_HAS_METHOD (gif, instantiate);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1462
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1463 IIFORMAT_VALID_KEYWORD (gif, Q_data, check_valid_string);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1464 IIFORMAT_VALID_KEYWORD (gif, Q_file, check_valid_string);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1465 #endif
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1466
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1467 #ifdef HAVE_PNG
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1468 INITIALIZE_IMAGE_INSTANTIATOR_FORMAT (png, "png");
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1469
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1470 IIFORMAT_HAS_METHOD (png, validate);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1471 IIFORMAT_HAS_METHOD (png, normalize);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1472 IIFORMAT_HAS_METHOD (png, possible_dest_types);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1473 IIFORMAT_HAS_METHOD (png, instantiate);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1474
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1475 IIFORMAT_VALID_KEYWORD (png, Q_data, check_valid_string);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1476 IIFORMAT_VALID_KEYWORD (png, Q_file, check_valid_string);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1477 #endif
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1478
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1479 #ifdef HAVE_TIFF
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1480 INITIALIZE_IMAGE_INSTANTIATOR_FORMAT (tiff, "tiff");
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1481
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1482 IIFORMAT_HAS_METHOD (tiff, validate);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1483 IIFORMAT_HAS_METHOD (tiff, normalize);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1484 IIFORMAT_HAS_METHOD (tiff, possible_dest_types);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1485 IIFORMAT_HAS_METHOD (tiff, instantiate);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1486
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1487 IIFORMAT_VALID_KEYWORD (tiff, Q_data, check_valid_string);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1488 IIFORMAT_VALID_KEYWORD (tiff, Q_file, check_valid_string);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1489 #endif
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1490
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1491 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1492
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1493 void
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1494 vars_of_glyphs_eimage (void)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1495 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1496 #ifdef HAVE_JPEG
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1497 Fprovide (Qjpeg);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1498 #endif
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1499
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1500 #ifdef HAVE_GIF
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1501 Fprovide (Qgif);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1502 #endif
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1503
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1504 #ifdef HAVE_PNG
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1505 Fprovide (Qpng);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1506 #endif
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1507
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1508 #ifdef HAVE_TIFF
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1509 Fprovide (Qtiff);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1510 #endif
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1511
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1512 }