annotate src/glyphs-eimage.c @ 4981:4aebb0131297

Cleanups/renaming of EXTERNAL_TO_C_STRING and friends -------------------- ChangeLog entries follow: -------------------- modules/ChangeLog addition: 2010-02-05 Ben Wing <ben@xemacs.org> * postgresql/postgresql.c: * postgresql/postgresql.c (CHECK_LIVE_CONNECTION): * postgresql/postgresql.c (Fpq_connectdb): * postgresql/postgresql.c (Fpq_connect_start): * postgresql/postgresql.c (Fpq_lo_import): * postgresql/postgresql.c (Fpq_lo_export): * ldap/eldap.c (Fldap_open): * ldap/eldap.c (Fldap_search_basic): * ldap/eldap.c (Fldap_add): * ldap/eldap.c (Fldap_modify): * ldap/eldap.c (Fldap_delete): * canna/canna_api.c (Fcanna_initialize): * canna/canna_api.c (Fcanna_store_yomi): * canna/canna_api.c (Fcanna_parse): * canna/canna_api.c (Fcanna_henkan_begin): EXTERNAL_TO_C_STRING returns its argument instead of storing it in a parameter, and is renamed to EXTERNAL_TO_ITEXT. Similar things happen to related macros. See entry in src/ChangeLog. More Mule-izing of postgresql.c. Extract out common code between `pq-connectdb' and `pq-connect-start'. Fix places that signal an error string using a formatted string to instead follow the standard and have a fixed reason followed by the particular error message stored as one of the frobs. src/ChangeLog addition: 2010-02-05 Ben Wing <ben@xemacs.org> * console-msw.c (write_string_to_mswindows_debugging_output): * console-msw.c (Fmswindows_message_box): * console-x.c (x_perhaps_init_unseen_key_defaults): * console.c: * database.c (dbm_get): * database.c (dbm_put): * database.c (dbm_remove): * database.c (berkdb_get): * database.c (berkdb_put): * database.c (berkdb_remove): * database.c (Fopen_database): * device-gtk.c (gtk_init_device): * device-msw.c (msprinter_init_device_internal): * device-msw.c (msprinter_default_printer): * device-msw.c (msprinter_init_device): * device-msw.c (sync_printer_with_devmode): * device-msw.c (Fmsprinter_select_settings): * device-x.c (sanity_check_geometry_resource): * device-x.c (Dynarr_add_validified_lisp_string): * device-x.c (x_init_device): * device-x.c (Fx_put_resource): * device-x.c (Fx_valid_keysym_name_p): * device-x.c (Fx_set_font_path): * dialog-msw.c (push_lisp_string_as_unicode): * dialog-msw.c (handle_directory_dialog_box): * dialog-msw.c (handle_file_dialog_box): * dialog-x.c (dbox_descriptor_to_widget_value): * editfns.c (Fformat_time_string): * editfns.c (Fencode_time): * editfns.c (Fset_time_zone_rule): * emacs.c (make_argc_argv): * emacs.c (Fdump_emacs): * emodules.c (emodules_load): * eval.c: * eval.c (maybe_signal_error_1): * event-msw.c (Fdde_alloc_advise_item): * event-msw.c (mswindows_dde_callback): * event-msw.c (mswindows_wnd_proc): * fileio.c (report_error_with_errno): * fileio.c (Fsysnetunam): * fileio.c (Fdo_auto_save): * font-mgr.c (extract_fcapi_string): * font-mgr.c (Ffc_config_app_font_add_file): * font-mgr.c (Ffc_config_app_font_add_dir): * font-mgr.c (Ffc_config_filename): * frame-gtk.c (gtk_set_frame_text_value): * frame-gtk.c (gtk_create_widgets): * frame-msw.c (mswindows_init_frame_1): * frame-msw.c (mswindows_set_title_from_ibyte): * frame-msw.c (msprinter_init_frame_3): * frame-x.c (x_set_frame_text_value): * frame-x.c (x_set_frame_properties): * frame-x.c (start_drag_internal_1): * frame-x.c (x_cde_transfer_callback): * frame-x.c (x_create_widgets): * glyphs-eimage.c (my_jpeg_output_message): * glyphs-eimage.c (jpeg_instantiate): * glyphs-eimage.c (gif_instantiate): * glyphs-eimage.c (png_instantiate): * glyphs-eimage.c (tiff_instantiate): * glyphs-gtk.c (xbm_instantiate_1): * glyphs-gtk.c (gtk_xbm_instantiate): * glyphs-gtk.c (gtk_xpm_instantiate): * glyphs-gtk.c (gtk_xface_instantiate): * glyphs-gtk.c (cursor_font_instantiate): * glyphs-gtk.c (gtk_redisplay_widget): * glyphs-gtk.c (gtk_widget_instantiate_1): * glyphs-gtk.c (gtk_add_tab_item): * glyphs-msw.c (mswindows_xpm_instantiate): * glyphs-msw.c (bmp_instantiate): * glyphs-msw.c (mswindows_resource_instantiate): * glyphs-msw.c (xbm_instantiate_1): * glyphs-msw.c (mswindows_xbm_instantiate): * glyphs-msw.c (mswindows_xface_instantiate): * glyphs-msw.c (mswindows_redisplay_widget): * glyphs-msw.c (mswindows_widget_instantiate): * glyphs-msw.c (add_tree_item): * glyphs-msw.c (add_tab_item): * glyphs-msw.c (mswindows_combo_box_instantiate): * glyphs-msw.c (mswindows_widget_query_string_geometry): * glyphs-x.c (x_locate_pixmap_file): * glyphs-x.c (xbm_instantiate_1): * glyphs-x.c (x_xbm_instantiate): * glyphs-x.c (extract_xpm_color_names): * glyphs-x.c (x_xpm_instantiate): * glyphs-x.c (x_xface_instantiate): * glyphs-x.c (autodetect_instantiate): * glyphs-x.c (safe_XLoadFont): * glyphs-x.c (cursor_font_instantiate): * glyphs-x.c (x_redisplay_widget): * glyphs-x.c (Fchange_subwindow_property): * glyphs-x.c (x_widget_instantiate): * glyphs-x.c (x_tab_control_redisplay): * glyphs.c (pixmap_to_lisp_data): * gui-x.c (menu_separator_style_and_to_external): * gui-x.c (add_accel_and_to_external): * gui-x.c (button_item_to_widget_value): * hpplay.c (player_error_internal): * hpplay.c (play_sound_file): * hpplay.c (play_sound_data): * intl.c (Fset_current_locale): * lisp.h: * menubar-gtk.c (gtk_xemacs_set_accel_keys): * menubar-msw.c (populate_menu_add_item): * menubar-msw.c (populate_or_checksum_helper): * menubar-x.c (menu_item_descriptor_to_widget_value_1): * nt.c (init_user_info): * nt.c (get_long_basename): * nt.c (nt_get_resource): * nt.c (init_mswindows_environment): * nt.c (get_cached_volume_information): * nt.c (mswindows_readdir): * nt.c (read_unc_volume): * nt.c (mswindows_stat): * nt.c (mswindows_getdcwd): * nt.c (mswindows_executable_type): * nt.c (Fmswindows_short_file_name): * ntplay.c (nt_play_sound_file): * objects-gtk.c: * objects-gtk.c (gtk_valid_color_name_p): * objects-gtk.c (gtk_initialize_font_instance): * objects-gtk.c (gtk_font_list): * objects-msw.c (font_enum_callback_2): * objects-msw.c (parse_font_spec): * objects-x.c (x_parse_nearest_color): * objects-x.c (x_valid_color_name_p): * objects-x.c (x_initialize_font_instance): * objects-x.c (x_font_instance_truename): * objects-x.c (x_font_list): * objects-xlike-inc.c (XFUN): * objects-xlike-inc.c (xft_find_charset_font): * process-nt.c (mswindows_report_winsock_error): * process-nt.c (nt_create_process): * process-nt.c (get_internet_address): * process-nt.c (nt_open_network_stream): * process-unix.c: * process-unix.c (allocate_pty): * process-unix.c (get_internet_address): * process-unix.c (unix_canonicalize_host_name): * process-unix.c (unix_open_network_stream): * realpath.c: * select-common.h (lisp_data_to_selection_data): * select-gtk.c (symbol_to_gtk_atom): * select-gtk.c (atom_to_symbol): * select-msw.c (symbol_to_ms_cf): * select-msw.c (mswindows_register_selection_data_type): * select-x.c (symbol_to_x_atom): * select-x.c (x_atom_to_symbol): * select-x.c (hack_motif_clipboard_selection): * select-x.c (Fx_store_cutbuffer_internal): * sound.c (Fplay_sound_file): * sound.c (Fplay_sound): * sound.h (sound_perror): * sysdep.c: * sysdep.c (qxe_allocating_getcwd): * sysdep.c (qxe_execve): * sysdep.c (copy_in_passwd): * sysdep.c (qxe_getpwnam): * sysdep.c (qxe_ctime): * sysdll.c (dll_open): * sysdll.c (dll_function): * sysdll.c (dll_variable): * sysdll.c (search_linked_libs): * sysdll.c (dll_error): * sysfile.h: * sysfile.h (PATHNAME_CONVERT_OUT_TSTR): * sysfile.h (PATHNAME_CONVERT_OUT_UTF_8): * sysfile.h (PATHNAME_CONVERT_OUT): * sysfile.h (LISP_PATHNAME_CONVERT_OUT): * syswindows.h (ITEXT_TO_TSTR): * syswindows.h (LOCAL_FILE_FORMAT_TO_TSTR): * syswindows.h (TSTR_TO_LOCAL_FILE_FORMAT): * syswindows.h (LOCAL_FILE_FORMAT_TO_INTERNAL_MSWIN): * syswindows.h (LISP_LOCAL_FILE_FORMAT_MAYBE_URL_TO_TSTR): * text.h: * text.h (eicpy_ext_len): * text.h (enum new_dfc_src_type): * text.h (EXTERNAL_TO_ITEXT): * text.h (GET_STRERROR): * tooltalk.c (check_status): * tooltalk.c (Fadd_tooltalk_message_arg): * tooltalk.c (Fadd_tooltalk_pattern_attribute): * tooltalk.c (Fadd_tooltalk_pattern_arg): * win32.c (tstr_to_local_file_format): * win32.c (mswindows_lisp_error_1): * win32.c (mswindows_report_process_error): * win32.c (Fmswindows_shell_execute): * win32.c (mswindows_read_link_1): Changes involving external/internal format conversion, mostly code cleanup and renaming. 1. Eliminate the previous macros like LISP_STRING_TO_EXTERNAL that stored its result in a parameter. The new version of LISP_STRING_TO_EXTERNAL returns its result through the return value, same as the previous NEW_LISP_STRING_TO_EXTERNAL. Use the new-style macros throughout the code. 2. Rename C_STRING_TO_EXTERNAL and friends to ITEXT_TO_EXTERNAL, in keeping with overall naming rationalization involving Itext and related types. Macros involved in previous two: EXTERNAL_TO_C_STRING -> EXTERNAL_TO_ITEXT EXTERNAL_TO_C_STRING_MALLOC -> EXTERNAL_TO_ITEXT_MALLOC SIZED_EXTERNAL_TO_C_STRING -> SIZED_EXTERNAL_TO_ITEXT SIZED_EXTERNAL_TO_C_STRING_MALLOC -> SIZED_EXTERNAL_TO_ITEXT_MALLOC C_STRING_TO_EXTERNAL -> ITEXT_TO_EXTERNAL C_STRING_TO_EXTERNAL_MALLOC -> ITEXT_TO_EXTERNAL_MALLOC LISP_STRING_TO_EXTERNAL LISP_STRING_TO_EXTERNAL_MALLOC LISP_STRING_TO_TSTR C_STRING_TO_TSTR -> ITEXT_TO_TSTR TSTR_TO_C_STRING -> TSTR_TO_ITEXT The following four still return their values through parameters, since they have more than one value to return: C_STRING_TO_SIZED_EXTERNAL -> ITEXT_TO_SIZED_EXTERNAL LISP_STRING_TO_SIZED_EXTERNAL C_STRING_TO_SIZED_EXTERNAL_MALLOC -> ITEXT_TO_SIZED_EXTERNAL_MALLOC LISP_STRING_TO_SIZED_EXTERNAL_MALLOC Sometimes additional casts had to be inserted, since the old macros played strange games and completely defeated the type system of the store params. 3. Rewrite many places where direct calls to TO_EXTERNAL_FORMAT occurred with calls to one of the convenience macros listed above, or to make_extstring(). 4. Eliminate SIZED_C_STRING macros (they were hardly used, anyway) and use a direct call to TO_EXTERNAL_FORMAT or TO_INTERNAL_FORMAT. 4. Use LISP_PATHNAME_CONVERT_OUT in many places instead of something like LISP_STRING_TO_EXTERNAL(..., Qfile_name). 5. Eliminate some temporary variables that are no longer necessary now that we return a value rather than storing it into a variable. 6. Some Mule-izing in database.c. 7. Error functions: -- A bit of code cleanup in maybe_signal_error_1. -- Eliminate report_file_type_error; it's just an alias for signal_error_2 with params in a different order. -- Fix some places in the hostname-handling code that directly inserted externally-retrieved error strings into the supposed ASCII "reason" param instead of doing the right thing and sticking text descriptive of what was going on in "reason" and putting the external message in a frob. 8. Use Ascbyte instead of CIbyte in process-unix.c and maybe one or two other places. 9. Some code cleanup in copy_in_passwd() in sysdep.c. 10. Fix a real bug due to accidental variable shadowing in tstr_to_local_file_format() in win32.c.
author Ben Wing <ben@xemacs.org>
date Fri, 05 Feb 2010 11:02:24 -0600
parents 304aebb79cd3
children 3c3c1d139863
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
2959
4eb2a8c07cb3 [xemacs-hg @ 2005-09-27 05:48:22 by ben]
ben
parents: 2563
diff changeset
5 Copyright (C) 1995, 1996, 2001, 2002, 2004, 2005 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
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
10 XEmacs is free software; you can redistribute it and/or modify it
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
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
12 Free Software Foundation; either version 2, or (at your option) any
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
13 later version.
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
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
21 along with XEmacs; see the file COPYING. If not, write to
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
22 the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
23 Boston, MA 02111-1307, USA. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
24
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
25 /* Synched up with: Not in FSF. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
26
2959
4eb2a8c07cb3 [xemacs-hg @ 2005-09-27 05:48:22 by ben]
ben
parents: 2563
diff changeset
27 /* Originally part of glyphs.c.
4eb2a8c07cb3 [xemacs-hg @ 2005-09-27 05:48:22 by ben]
ben
parents: 2563
diff changeset
28
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
29 GIF/JPEG support added by Ben Wing for 19.14
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
30 PNG support added by Bill Perry for 19.14
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
31 Improved GIF/JPEG support added by Bill Perry for 19.14
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
32 Cleanup/simplification of error handling by Ben Wing for 19.14
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
33 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
34 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
35 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
36 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
37 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
38 TODO:
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
39 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
40 This file is really repetitious; can we refactor?
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
41 */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
42
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
43 #include <config.h>
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
44 #include "lisp.h"
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
45 #include "lstream.h"
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
46 #include "console.h"
872
79c6ff3eef26 [xemacs-hg @ 2002-06-20 21:18:01 by ben]
ben
parents: 867
diff changeset
47 #include "device-impl.h"
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
48 #include "faces.h"
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
49 #include "glyphs.h"
872
79c6ff3eef26 [xemacs-hg @ 2002-06-20 21:18:01 by ben]
ben
parents: 867
diff changeset
50 #include "objects-impl.h"
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
51
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
52 #include "buffer.h"
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
53 #include "frame.h"
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
54 #include "opaque.h"
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
55 #include "window.h"
428
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 #include "sysfile.h"
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
58
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
59 #ifdef HAVE_PNG
1743
543769b89fed [xemacs-hg @ 2003-10-14 05:02:57 by james]
james
parents: 1726
diff changeset
60
543769b89fed [xemacs-hg @ 2003-10-14 05:02:57 by james]
james
parents: 1726
diff changeset
61 BEGIN_C_DECLS
543769b89fed [xemacs-hg @ 2003-10-14 05:02:57 by james]
james
parents: 1726
diff changeset
62
647
b39c14581166 [xemacs-hg @ 2001-08-13 04:45:47 by ben]
ben
parents: 638
diff changeset
63 #define message message_ /* Yuck */
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
64 #include <png.h>
647
b39c14581166 [xemacs-hg @ 2001-08-13 04:45:47 by ben]
ben
parents: 638
diff changeset
65 #undef message
1743
543769b89fed [xemacs-hg @ 2003-10-14 05:02:57 by james]
james
parents: 1726
diff changeset
66
543769b89fed [xemacs-hg @ 2003-10-14 05:02:57 by james]
james
parents: 1726
diff changeset
67 END_C_DECLS
543769b89fed [xemacs-hg @ 2003-10-14 05:02:57 by james]
james
parents: 1726
diff changeset
68
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
69 #else
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
70 #include <setjmp.h>
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
71 #endif
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
72 #include "file-coding.h"
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
73
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
74 #ifdef HAVE_TIFF
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
75 DEFINE_IMAGE_INSTANTIATOR_FORMAT (tiff);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
76 Lisp_Object Qtiff;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
77 #endif
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
78
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
79 #ifdef HAVE_JPEG
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
80 DEFINE_IMAGE_INSTANTIATOR_FORMAT (jpeg);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
81 Lisp_Object Qjpeg;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
82 #endif
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
83
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
84 #ifdef HAVE_GIF
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
85 DEFINE_IMAGE_INSTANTIATOR_FORMAT (gif);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
86 Lisp_Object Qgif;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
87 #endif
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
88
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
89 #ifdef HAVE_PNG
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
90 DEFINE_IMAGE_INSTANTIATOR_FORMAT (png);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
91 Lisp_Object Qpng;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
92 #endif
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
93
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
94
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
95 #ifdef HAVE_JPEG
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
96
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 * JPEG *
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
99 **********************************************************************/
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
100
1743
543769b89fed [xemacs-hg @ 2003-10-14 05:02:57 by james]
james
parents: 1726
diff changeset
101 BEGIN_C_DECLS
543769b89fed [xemacs-hg @ 2003-10-14 05:02:57 by james]
james
parents: 1726
diff changeset
102
4854
95c4ced5c07c fix compile problems
Ben Wing <ben@xemacs.org>
parents: 4834
diff changeset
103 #ifdef WIN32_ANY
95c4ced5c07c fix compile problems
Ben Wing <ben@xemacs.org>
parents: 4834
diff changeset
104 /* #### Yuck! More horrifitude. tiffio.h, below, and sysfile.h above,
95c4ced5c07c fix compile problems
Ben Wing <ben@xemacs.org>
parents: 4834
diff changeset
105 include <windows.h>, which defines INT32 and INT16, the former
95c4ced5c07c fix compile problems
Ben Wing <ben@xemacs.org>
parents: 4834
diff changeset
106 differently and incompatibly from jmorecfg.h, included by jpeglib.h. We
95c4ced5c07c fix compile problems
Ben Wing <ben@xemacs.org>
parents: 4834
diff changeset
107 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
108 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
109 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
110 #define XMD_H
3d8143fc88e1 [xemacs-hg @ 2005-01-24 23:33:30 by ben]
ben
parents: 2367
diff changeset
111 typedef signed int INT32;
3d8143fc88e1 [xemacs-hg @ 2005-01-24 23:33:30 by ben]
ben
parents: 2367
diff changeset
112 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
113
a5ff7e67ac1b Don't let libtiff override the size of a boolean, Win32. From Ron Isaacson.
Aidan Kehoe <kehoea@parhasard.net>
parents: 3839
diff changeset
114 /* 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
115 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
116 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
117 #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
118 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
119 #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
120 #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
121 #endif
3d8143fc88e1 [xemacs-hg @ 2005-01-24 23:33:30 by ben]
ben
parents: 2367
diff changeset
122
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
123 #include <jpeglib.h>
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
124 #include <jerror.h>
1743
543769b89fed [xemacs-hg @ 2003-10-14 05:02:57 by james]
james
parents: 1726
diff changeset
125
543769b89fed [xemacs-hg @ 2003-10-14 05:02:57 by james]
james
parents: 1726
diff changeset
126 END_C_DECLS
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
127
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
128 /*#define USE_TEMP_FILES_FOR_JPEG_IMAGES 1*/
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
129 static void
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
130 jpeg_validate (Lisp_Object instantiator)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
131 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
132 file_or_data_must_be_present (instantiator);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
133 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
134
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
135 static Lisp_Object
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
136 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
137 Lisp_Object UNUSED (dest_mask))
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 return simple_image_type_normalize (inst, console_type, Qjpeg);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
140 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
141
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
142 static int
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
143 jpeg_possible_dest_types (void)
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 return IMAGE_COLOR_PIXMAP_MASK;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
146 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
147
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
148 /* To survive the otherwise baffling complexity of making sure
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
149 everything gets cleaned up in the presence of an error, we
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
150 use an unwind_protect(). */
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 struct jpeg_unwind_data
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
153 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
154 /* Stream that we need to close */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
155 FILE *instream;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
156 /* Object that holds state info for JPEG decoding */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
157 struct jpeg_decompress_struct *cinfo_ptr;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
158 /* EImage data */
2367
ecf1ebac70d8 [xemacs-hg @ 2004-11-04 23:05:23 by ben]
ben
parents: 2286
diff changeset
159 Binbyte *eimage;
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
160 };
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
161
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
162 static Lisp_Object
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
163 jpeg_instantiate_unwind (Lisp_Object unwind_obj)
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 struct jpeg_unwind_data *data =
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
166 (struct jpeg_unwind_data *) get_opaque_ptr (unwind_obj);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
167
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
168 free_opaque_ptr (unwind_obj);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
169 if (data->cinfo_ptr)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
170 jpeg_destroy_decompress (data->cinfo_ptr);
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 if (data->instream)
771
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 665
diff changeset
173 retry_fclose (data->instream);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
174
1726
a8d8f419b459 [xemacs-hg @ 2003-09-30 15:26:34 by james]
james
parents: 872
diff changeset
175 if (data->eimage)
2367
ecf1ebac70d8 [xemacs-hg @ 2004-11-04 23:05:23 by ben]
ben
parents: 2286
diff changeset
176 xfree (data->eimage, Binbyte *);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
177
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
178 return Qnil;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
179 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
180
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
181 /*
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
182 * ERROR HANDLING:
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
183 *
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
184 * The JPEG library's standard error handler (jerror.c) is divided into
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
185 * several "methods" which you can override individually. This lets you
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
186 * adjust the behavior without duplicating a lot of code, which you might
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
187 * have to update with each future release.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
188 *
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
189 * 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
190 * 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
191 * rather than calling exit() as the standard error_exit method does.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
192 *
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
193 * 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
194 * 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
195 * 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
196 * longjmp(). But we need to make the setjmp buffer accessible to the
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
197 * 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
198 * 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
199 * were making a subclass of the regular error handler.)
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 * Here's the extended error handler struct:
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
202 */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
203
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
204 struct my_jpeg_error_mgr
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 struct jpeg_error_mgr pub; /* "public" fields */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
207 jmp_buf setjmp_buffer; /* for return to caller */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
208 };
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 #if defined(JPEG_LIB_VERSION) && (JPEG_LIB_VERSION >= 61)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
211 METHODDEF(void)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
212 #else
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
213 METHODDEF void
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
214 #endif
2286
04bc9d2f42c7 [xemacs-hg @ 2004-09-20 19:18:55 by james]
james
parents: 2270
diff changeset
215 our_init_source (j_decompress_ptr UNUSED (cinfo))
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
216 {
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
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
219 #if defined(JPEG_LIB_VERSION) && (JPEG_LIB_VERSION >= 61)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
220 METHODDEF(boolean)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
221 #else
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
222 METHODDEF boolean
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
223 #endif
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
224 our_fill_input_buffer (j_decompress_ptr cinfo)
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 /* Insert a fake EOI marker */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
227 struct jpeg_source_mgr *src = cinfo->src;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
228 static JOCTET buffer[2];
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
229
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
230 buffer[0] = (JOCTET) 0xFF;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
231 buffer[1] = (JOCTET) JPEG_EOI;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
232
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
233 src->next_input_byte = buffer;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
234 src->bytes_in_buffer = 2;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
235 return TRUE;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
236 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
237
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
238 #if defined(JPEG_LIB_VERSION) && (JPEG_LIB_VERSION >= 61)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
239 METHODDEF(void)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
240 #else
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
241 METHODDEF void
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
242 #endif
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
243 our_skip_input_data (j_decompress_ptr cinfo, long num_bytes)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
244 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
245 struct jpeg_source_mgr *src = NULL;
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 src = (struct jpeg_source_mgr *) cinfo->src;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
248
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
249 if (!src)
647
b39c14581166 [xemacs-hg @ 2001-08-13 04:45:47 by ben]
ben
parents: 638
diff changeset
250 return;
b39c14581166 [xemacs-hg @ 2001-08-13 04:45:47 by ben]
ben
parents: 638
diff changeset
251 else if (num_bytes > (long) src->bytes_in_buffer)
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
252 {
647
b39c14581166 [xemacs-hg @ 2001-08-13 04:45:47 by ben]
ben
parents: 638
diff changeset
253 ERREXIT (cinfo, JERR_INPUT_EOF);
b39c14581166 [xemacs-hg @ 2001-08-13 04:45:47 by ben]
ben
parents: 638
diff changeset
254 /*NOTREACHED*/
b39c14581166 [xemacs-hg @ 2001-08-13 04:45:47 by ben]
ben
parents: 638
diff changeset
255 }
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
256
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
257 src->bytes_in_buffer -= num_bytes;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
258 src->next_input_byte += num_bytes;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
259 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
260
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
261 #if defined(JPEG_LIB_VERSION) && (JPEG_LIB_VERSION >= 61)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
262 METHODDEF(void)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
263 #else
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
264 METHODDEF void
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
265 #endif
2286
04bc9d2f42c7 [xemacs-hg @ 2004-09-20 19:18:55 by james]
james
parents: 2270
diff changeset
266 our_term_source (j_decompress_ptr UNUSED (cinfo))
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
267 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
268 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
269
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
270 typedef struct
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
271 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
272 struct jpeg_source_mgr pub;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
273 } our_jpeg_source_mgr;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
274
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
275 static void
665
fdefd0186b75 [xemacs-hg @ 2001-09-20 06:28:42 by ben]
ben
parents: 647
diff changeset
276 jpeg_memory_src (j_decompress_ptr cinfo, JOCTET *data, Bytecount len)
428
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 struct jpeg_source_mgr *src;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
279
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
280 if (cinfo->src == NULL)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
281 { /* first time for this JPEG object? */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
282 cinfo->src = (struct jpeg_source_mgr *)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
283 (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_PERMANENT,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
284 sizeof(our_jpeg_source_mgr));
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
285 src = (struct jpeg_source_mgr *) cinfo->src;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
286 src->next_input_byte = data;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
287 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
288 src = (struct jpeg_source_mgr *) cinfo->src;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
289 src->init_source = our_init_source;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
290 src->fill_input_buffer = our_fill_input_buffer;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
291 src->skip_input_data = our_skip_input_data;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
292 src->resync_to_restart = jpeg_resync_to_restart; /* use default method */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
293 src->term_source = our_term_source;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
294 src->bytes_in_buffer = len;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
295 src->next_input_byte = data;
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
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
298 #if defined(JPEG_LIB_VERSION) && (JPEG_LIB_VERSION >= 61)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
299 METHODDEF(void)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
300 #else
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
301 METHODDEF void
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
302 #endif
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
303 my_jpeg_error_exit (j_common_ptr cinfo)
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 /* 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
306 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
307
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
308 /* Return control to the setjmp point */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
309 longjmp (myerr->setjmp_buffer, 1);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
310 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
311
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
312 #if defined(JPEG_LIB_VERSION) && (JPEG_LIB_VERSION >= 61)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
313 METHODDEF(void)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
314 #else
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
315 METHODDEF void
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
316 #endif
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
317 my_jpeg_output_message (j_common_ptr cinfo)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
318 {
771
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 665
diff changeset
319 Extbyte buffer[JMSG_LENGTH_MAX];
867
804517e16990 [xemacs-hg @ 2002-06-05 09:54:39 by ben]
ben
parents: 793
diff changeset
320 Ibyte *intbuf;
428
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 /* Create the message */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
323 (*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
324 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
325 warn_when_safe (Qjpeg, Qinfo, "%s", intbuf);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
326 }
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 /* 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
329 source code and from gif_instantiate() */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
330 static void
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
331 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
332 Lisp_Object pointer_fg, Lisp_Object pointer_bg,
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
333 int dest_mask, Lisp_Object domain)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
334 {
440
8de8e3f6228a Import from CVS: tag r21-2-28
cvs
parents: 438
diff changeset
335 Lisp_Image_Instance *ii = XIMAGE_INSTANCE (image_instance);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
336 /* 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
337 because the unwind-protect is always executed when this
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
338 stack frame is still valid. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
339 struct jpeg_unwind_data unwind;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
340 int speccount = specpdl_depth ();
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
341
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
342 /* This struct contains the JPEG decompression parameters and pointers to
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
343 * working space (which is allocated as needed by the JPEG library).
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 struct jpeg_decompress_struct cinfo;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
346 /* We use our private extension JPEG error handler.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
347 * 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
348 * struct, to avoid dangling-pointer problems.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
349 */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
350 struct my_jpeg_error_mgr jerr;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
351
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
352 /* Step -1: First record our unwind-protect, which will clean up after
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
353 any exit, normal or not */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
354
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
355 xzero (unwind);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
356 record_unwind_protect (jpeg_instantiate_unwind, make_opaque_ptr (&unwind));
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
357
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
358 /* Step 1: allocate and initialize JPEG decompression object */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
359
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
360 /* We set up the normal JPEG error routines, then override error_exit. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
361 cinfo.err = jpeg_std_error (&jerr.pub);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
362 jerr.pub.error_exit = my_jpeg_error_exit;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
363 jerr.pub.output_message = my_jpeg_output_message;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
364
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
365 /* Establish the setjmp return context for my_error_exit to use. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
366 if (setjmp (jerr.setjmp_buffer))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
367 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
368 /* If we get here, the JPEG code has signaled an error.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
369 * 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
370 */
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 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
373 Lisp_Object errstring;
771
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 665
diff changeset
374 Extbyte buffer[JMSG_LENGTH_MAX];
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
375
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
376 /* Create the message */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
377 (*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
378 errstring = build_extstring (buffer, Qjpeg_error_message_encoding);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
379
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
380 signal_image_error_2 ("JPEG decoding error",
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
381 errstring, instantiator);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
382 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
383 }
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 /* Now we can initialize the JPEG decompression object. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
386 jpeg_create_decompress (&cinfo);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
387 unwind.cinfo_ptr = &cinfo;
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 /* Step 2: specify data source (eg, a file) */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
390
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
391 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
392 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
393 const Binbyte *bytes;
665
fdefd0186b75 [xemacs-hg @ 2001-09-20 06:28:42 by ben]
ben
parents: 647
diff changeset
394 Bytecount len;
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
395
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
396 /* #### This is a definite problem under Mule due to the amount of
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
397 stack data it might allocate. Need to be able to convert and
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
398 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
399 LISP_STRING_TO_SIZED_EXTERNAL (data, bytes, len, Qbinary);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
400 jpeg_memory_src (&cinfo, (JOCTET *) bytes, len);
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
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
403 /* Step 3: read file parameters with jpeg_read_header() */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
404
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
405 jpeg_read_header (&cinfo, TRUE);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
406 /* We can ignore the return value from jpeg_read_header since
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
407 * (a) suspension is not possible with the stdio data source, and
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
408 * (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
409 * See libjpeg.doc for more info.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
410 */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
411
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
412 {
4646
6c6bfdb80a0c Prevent integer overflow and subsequent crashes when attempting to load large
Jerry James <james@xemacs.org>
parents: 4326
diff changeset
413 UINT_64_BIT pixels_sq;
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
414 int jpeg_gray = 0; /* if we're dealing with a grayscale */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
415 /* Step 4: set parameters for decompression. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
416
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
417 /* Now that we're using EImages, send all data as 24bit color.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
418 The backend routine will take care of any necessary reductions.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
419 We do have to handle the grayscale case ourselves, however. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
420 if (cinfo.jpeg_color_space == JCS_GRAYSCALE)
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 cinfo.out_color_space = JCS_GRAYSCALE;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
423 jpeg_gray = 1;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
424 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
425 else
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
426 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
427 /* we're relying on the jpeg driver to do any other conversions,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
428 or signal an error if the conversion isn't supported. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
429 cinfo.out_color_space = JCS_RGB;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
430 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
431
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
432 /* Step 5: Start decompressor */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
433 jpeg_start_decompress (&cinfo);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
434
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
435 /* 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
436 pixels_sq =
6c6bfdb80a0c Prevent integer overflow and subsequent crashes when attempting to load large
Jerry James <james@xemacs.org>
parents: 4326
diff changeset
437 (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
438 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
439 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
440 unwind.eimage =
ecf1ebac70d8 [xemacs-hg @ 2004-11-04 23:05:23 by ben]
ben
parents: 2286
diff changeset
441 xnew_binbytes (cinfo.output_width * cinfo.output_height * 3);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
442 if (!unwind.eimage)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
443 signal_image_error("Unable to allocate enough memory for image", instantiator);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
444
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
445 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
446 JSAMPARRAY row_buffer; /* Output row buffer */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
447 JSAMPLE *jp;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
448 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
449 Binbyte *op = unwind.eimage;
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
450
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
451 /* 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
452 * the data. After jpeg_start_decompress() we have the correct scaled
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
453 * output image dimensions available
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
454 * We need to make an output work buffer of the right size.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
455 */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
456 /* JSAMPLEs per row in output buffer. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
457 row_stride = cinfo.output_width * cinfo.output_components;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
458 /* 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
459 with image */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
460 row_buffer = ((*cinfo.mem->alloc_sarray)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
461 ((j_common_ptr) &cinfo, JPOOL_IMAGE, row_stride, 1));
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 /* 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
464 * loop counter, so that we don't have to keep track ourselves.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
465 */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
466 while (cinfo.output_scanline < cinfo.output_height)
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 int i;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
469
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
470 /* jpeg_read_scanlines expects an array of pointers to scanlines.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
471 * 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
472 * more than one scanline at a time if that's more convenient.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
473 */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
474 (void) jpeg_read_scanlines (&cinfo, row_buffer, 1);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
475 jp = row_buffer[0];
647
b39c14581166 [xemacs-hg @ 2001-08-13 04:45:47 by ben]
ben
parents: 638
diff changeset
476 for (i = 0; i < (int) cinfo.output_width; i++)
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
477 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
478 int clr;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
479 if (jpeg_gray)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
480 {
2367
ecf1ebac70d8 [xemacs-hg @ 2004-11-04 23:05:23 by ben]
ben
parents: 2286
diff changeset
481 Binbyte val;
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
482 #if (BITS_IN_JSAMPLE == 8)
2367
ecf1ebac70d8 [xemacs-hg @ 2004-11-04 23:05:23 by ben]
ben
parents: 2286
diff changeset
483 val = (Binbyte) *jp++;
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
484 #else /* other option is 12 */
2367
ecf1ebac70d8 [xemacs-hg @ 2004-11-04 23:05:23 by ben]
ben
parents: 2286
diff changeset
485 val = (Binbyte) (*jp++ >> 4);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
486 #endif
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
487 for (clr = 0; clr < 3; clr++) /* copy the same value into RGB */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
488 *op++ = val;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
489 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
490 else
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
491 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
492 for (clr = 0; clr < 3; clr++)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
493 #if (BITS_IN_JSAMPLE == 8)
2367
ecf1ebac70d8 [xemacs-hg @ 2004-11-04 23:05:23 by ben]
ben
parents: 2286
diff changeset
494 *op++ = (Binbyte)*jp++;
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
495 #else /* other option is 12 */
2367
ecf1ebac70d8 [xemacs-hg @ 2004-11-04 23:05:23 by ben]
ben
parents: 2286
diff changeset
496 *op++ = (Binbyte)(*jp++ >> 4);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
497 #endif
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
498 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
499 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
500 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
501 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
502 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
503
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
504 /* Step 6.5: Create the pixmap and set up the image instance */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
505 /* now instantiate */
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
506 MAYBE_DEVMETH (DOMAIN_XDEVICE (ii->domain),
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
507 init_image_instance_from_eimage,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
508 (ii, cinfo.output_width, cinfo.output_height, 1,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
509 unwind.eimage, dest_mask,
2959
4eb2a8c07cb3 [xemacs-hg @ 2005-09-27 05:48:22 by ben]
ben
parents: 2563
diff changeset
510 instantiator, pointer_fg, pointer_bg, domain));
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
511
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
512 /* Step 7: Finish decompression */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
513
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
514 jpeg_finish_decompress (&cinfo);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
515 /* We can ignore the return value since suspension is not possible
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
516 * with the stdio data source.
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 /* And we're done! */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
520 /* This will clean up everything else. */
771
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 665
diff changeset
521 unbind_to (speccount);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
522 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
523
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
524 #endif /* HAVE_JPEG */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
525
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
526 #ifdef HAVE_GIF
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
527 /**********************************************************************
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
528 * GIF *
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
529 **********************************************************************/
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
530
4708
1cecc3e9f0a0 Use giflib or libungif to provide GIF support, instead of using internal
Jerry James <james@xemacs.org>
parents: 4698
diff changeset
531 #include <gif_lib.h>
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
532
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
533 static void
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
534 gif_validate (Lisp_Object instantiator)
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 file_or_data_must_be_present (instantiator);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
537 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
538
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
539 static Lisp_Object
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
540 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
541 Lisp_Object UNUSED (dest_mask))
428
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 return simple_image_type_normalize (inst, console_type, Qgif);
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
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
546 static int
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
547 gif_possible_dest_types (void)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
548 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
549 return IMAGE_COLOR_PIXMAP_MASK;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
550 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
551
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
552 /* To survive the otherwise baffling complexity of making sure
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
553 everything gets cleaned up in the presence of an error, we
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
554 use an unwind_protect(). */
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 struct gif_unwind_data
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
557 {
2367
ecf1ebac70d8 [xemacs-hg @ 2004-11-04 23:05:23 by ben]
ben
parents: 2286
diff changeset
558 Binbyte *eimage;
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
559 /* Object that holds the decoded data from a GIF file */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
560 GifFileType *giffile;
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 Lisp_Object
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
564 gif_instantiate_unwind (Lisp_Object unwind_obj)
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 struct gif_unwind_data *data =
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
567 (struct gif_unwind_data *) get_opaque_ptr (unwind_obj);
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 free_opaque_ptr (unwind_obj);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
570 if (data->giffile)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
571 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
572 DGifCloseFile (data->giffile);
4708
1cecc3e9f0a0 Use giflib or libungif to provide GIF support, instead of using internal
Jerry James <james@xemacs.org>
parents: 4698
diff changeset
573 FreeSavedImages(data->giffile);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
574 }
647
b39c14581166 [xemacs-hg @ 2001-08-13 04:45:47 by ben]
ben
parents: 638
diff changeset
575 if (data->eimage)
2367
ecf1ebac70d8 [xemacs-hg @ 2004-11-04 23:05:23 by ben]
ben
parents: 2286
diff changeset
576 xfree (data->eimage, Binbyte *);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
577
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
578 return Qnil;
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
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
581 typedef struct gif_memory_storage
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
582 {
2367
ecf1ebac70d8 [xemacs-hg @ 2004-11-04 23:05:23 by ben]
ben
parents: 2286
diff changeset
583 Binbyte *bytes; /* The data */
665
fdefd0186b75 [xemacs-hg @ 2001-09-20 06:28:42 by ben]
ben
parents: 647
diff changeset
584 Bytecount len; /* How big is it? */
fdefd0186b75 [xemacs-hg @ 2001-09-20 06:28:42 by ben]
ben
parents: 647
diff changeset
585 Bytecount index; /* Where are we? */
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
586 } gif_memory_storage;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
587
4708
1cecc3e9f0a0 Use giflib or libungif to provide GIF support, instead of using internal
Jerry James <james@xemacs.org>
parents: 4698
diff changeset
588 static int
1cecc3e9f0a0 Use giflib or libungif to provide GIF support, instead of using internal
Jerry James <james@xemacs.org>
parents: 4698
diff changeset
589 gif_read_from_memory (GifFileType *gif, GifByteType *buf, int size)
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
590 {
4708
1cecc3e9f0a0 Use giflib or libungif to provide GIF support, instead of using internal
Jerry James <james@xemacs.org>
parents: 4698
diff changeset
591 gif_memory_storage *mem = (gif_memory_storage *) gif->UserData;
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
592
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
593 if (size > (mem->len - mem->index))
647
b39c14581166 [xemacs-hg @ 2001-08-13 04:45:47 by ben]
ben
parents: 638
diff changeset
594 return -1;
b39c14581166 [xemacs-hg @ 2001-08-13 04:45:47 by ben]
ben
parents: 638
diff changeset
595 memcpy (buf, mem->bytes + mem->index, size);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
596 mem->index = mem->index + size;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
597 return size;
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
4708
1cecc3e9f0a0 Use giflib or libungif to provide GIF support, instead of using internal
Jerry James <james@xemacs.org>
parents: 4698
diff changeset
600 static const char *
1cecc3e9f0a0 Use giflib or libungif to provide GIF support, instead of using internal
Jerry James <james@xemacs.org>
parents: 4698
diff changeset
601 gif_decode_error_string ()
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
602 {
4708
1cecc3e9f0a0 Use giflib or libungif to provide GIF support, instead of using internal
Jerry James <james@xemacs.org>
parents: 4698
diff changeset
603 switch (GifLastError ())
1cecc3e9f0a0 Use giflib or libungif to provide GIF support, instead of using internal
Jerry James <james@xemacs.org>
parents: 4698
diff changeset
604 {
1cecc3e9f0a0 Use giflib or libungif to provide GIF support, instead of using internal
Jerry James <james@xemacs.org>
parents: 4698
diff changeset
605 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
606 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
607 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
608 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
609 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
610 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
611 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
612 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
613 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
614 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
615 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
616 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
617 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
618 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
619 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
620 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
621 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
622 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
623 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
624 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
625 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
626 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
627 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
628 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
629 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
630 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
631 default:
1cecc3e9f0a0 Use giflib or libungif to provide GIF support, instead of using internal
Jerry James <james@xemacs.org>
parents: 4698
diff changeset
632 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
633 }
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
634 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
635
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
636 static void
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
637 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
638 Lisp_Object pointer_fg, Lisp_Object pointer_bg,
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
639 int dest_mask, Lisp_Object domain)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
640 {
440
8de8e3f6228a Import from CVS: tag r21-2-28
cvs
parents: 438
diff changeset
641 Lisp_Image_Instance *ii = XIMAGE_INSTANCE (image_instance);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
642 /* 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
643 because the unwind-protect is always executed when this
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
644 stack frame is still valid. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
645 struct gif_unwind_data unwind;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
646 int speccount = specpdl_depth ();
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
647 gif_memory_storage mem_struct;
2367
ecf1ebac70d8 [xemacs-hg @ 2004-11-04 23:05:23 by ben]
ben
parents: 2286
diff changeset
648 Binbyte *bytes;
665
fdefd0186b75 [xemacs-hg @ 2001-09-20 06:28:42 by ben]
ben
parents: 647
diff changeset
649 Bytecount len;
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
650 int height = 0;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
651 int width = 0;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
652
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
653 xzero (unwind);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
654 record_unwind_protect (gif_instantiate_unwind, make_opaque_ptr (&unwind));
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 /* 1. Now decode the data. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
657
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
658 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
659 Lisp_Object data = find_keyword_in_vector (instantiator, Q_data);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
660
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
661 assert (!NILP (data));
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
662
4981
4aebb0131297 Cleanups/renaming of EXTERNAL_TO_C_STRING and friends
Ben Wing <ben@xemacs.org>
parents: 4953
diff changeset
663 LISP_STRING_TO_SIZED_EXTERNAL (data, bytes, len, Qbinary);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
664 mem_struct.bytes = bytes;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
665 mem_struct.len = len;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
666 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
667 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
668 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
669 signal_image_error (gif_decode_error_string (), instantiator);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
670
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
671 /* Then slurp the image into memory, decoding along the way.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
672 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
673 format. */
1cecc3e9f0a0 Use giflib or libungif to provide GIF support, instead of using internal
Jerry James <james@xemacs.org>
parents: 4698
diff changeset
674 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
675 signal_image_error (gif_decode_error_string (), instantiator);
428
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
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
678 /* 3. Now create the EImage(s) */
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 ColorMapObject *cmo = unwind.giffile->SColorMap;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
681 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
682 UINT_64_BIT pixels_sq;
2367
ecf1ebac70d8 [xemacs-hg @ 2004-11-04 23:05:23 by ben]
ben
parents: 2286
diff changeset
683 Binbyte *eip;
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
684 /* interlaced gifs have rows in this order:
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
685 0, 8, 16, ..., 4, 12, 20, ..., 2, 6, 10, ..., 1, 3, 5, ... */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
686 static int InterlacedOffset[] = { 0, 4, 2, 1 };
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
687 static int InterlacedJumps[] = { 8, 8, 4, 2 };
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
688
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
689 height = unwind.giffile->SHeight;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
690 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
691 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
692 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
693 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
694 unwind.eimage =
ecf1ebac70d8 [xemacs-hg @ 2004-11-04 23:05:23 by ben]
ben
parents: 2286
diff changeset
695 xnew_binbytes (width * height * 3 * unwind.giffile->ImageCount);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
696 if (!unwind.eimage)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
697 signal_image_error("Unable to allocate enough memory for image", instantiator);
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 /* write the data in EImage format (8bit RGB triples) */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
700
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
701 for (slice = 0; slice < unwind.giffile->ImageCount; slice++)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
702 {
638
373ced43e288 [xemacs-hg @ 2001-07-26 21:10:44 by adrian]
adrian
parents: 593
diff changeset
703 /* 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
704 if (unwind.giffile->SavedImages[slice].ImageDesc.Height != height
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
705 || unwind.giffile->SavedImages[slice].ImageDesc.Width != width
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
706 || unwind.giffile->SavedImages[slice].ImageDesc.Left != 0
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
707 || unwind.giffile->SavedImages[slice].ImageDesc.Top != 0)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
708 signal_image_error ("Image in GIF file is not full size",
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
709 instantiator);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
710
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
711 interlace = unwind.giffile->SavedImages[slice].ImageDesc.Interlace;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
712 pass = 0;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
713 row = interlace ? InterlacedOffset[pass] : 0;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
714 eip = unwind.eimage + (width * height * 3 * slice);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
715 for (i = 0; i < height; i++)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
716 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
717 if (interlace)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
718 if (row >= height) {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
719 row = InterlacedOffset[++pass];
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
720 while (row >= height)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
721 row = InterlacedOffset[++pass];
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 eip = unwind.eimage + (width * height * 3 * slice) + (row * width * 3);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
724 for (j = 0; j < width; j++)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
725 {
2367
ecf1ebac70d8 [xemacs-hg @ 2004-11-04 23:05:23 by ben]
ben
parents: 2286
diff changeset
726 Binbyte pixel =
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
727 unwind.giffile->SavedImages[slice].RasterBits[(i * width) + j];
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
728 *eip++ = cmo->Colors[pixel].Red;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
729 *eip++ = cmo->Colors[pixel].Green;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
730 *eip++ = cmo->Colors[pixel].Blue;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
731 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
732 row += interlace ? InterlacedJumps[pass] : 1;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
733 }
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
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
736 /* now instantiate */
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
737 MAYBE_DEVMETH (DOMAIN_XDEVICE (ii->domain),
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
738 init_image_instance_from_eimage,
2959
4eb2a8c07cb3 [xemacs-hg @ 2005-09-27 05:48:22 by ben]
ben
parents: 2563
diff changeset
739 (ii, width, height, unwind.giffile->ImageCount,
4eb2a8c07cb3 [xemacs-hg @ 2005-09-27 05:48:22 by ben]
ben
parents: 2563
diff changeset
740 unwind.eimage, dest_mask, instantiator, pointer_fg,
4eb2a8c07cb3 [xemacs-hg @ 2005-09-27 05:48:22 by ben]
ben
parents: 2563
diff changeset
741 pointer_bg, domain));
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
742 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
743
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
744 /* 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
745 animate the gif. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
746 if (unwind.giffile->ImageCount > 1)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
747 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
748 /* 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
749 for every image - but that makes the implementation way too
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
750 complicated for now so we just take the first. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
751 unsigned short timeout = 0;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
752 Lisp_Object tid;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
753
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
754 if (unwind.giffile->SavedImages[0].Function == GRAPHICS_EXT_FUNC_CODE
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 unwind.giffile->SavedImages[0].ExtensionBlockCount)
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 timeout = (unsigned short)
438
84b14dcb0985 Import from CVS: tag r21-2-27
cvs
parents: 428
diff changeset
759 ((unwind.giffile->SavedImages[0].ExtensionBlocks[0].Bytes[2] << 8) +
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
760 unwind.giffile-> SavedImages[0].ExtensionBlocks[0].Bytes[1]) * 10;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
761 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
762
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
763 /* Too short a timeout will crucify us performance-wise. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
764 tid = add_glyph_animated_timeout (timeout > 10 ? timeout : 10, image_instance);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
765
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
766 if (!NILP (tid))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
767 IMAGE_INSTANCE_PIXMAP_TIMEOUT (ii) = XINT (tid);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
768 }
438
84b14dcb0985 Import from CVS: tag r21-2-27
cvs
parents: 428
diff changeset
769
771
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 665
diff changeset
770 unbind_to (speccount);
428
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
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
773 #endif /* HAVE_GIF */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
774
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
775
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
776 #ifdef HAVE_PNG
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 /**********************************************************************
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
779 * PNG *
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
780 **********************************************************************/
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
781 static void
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
782 png_validate (Lisp_Object instantiator)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
783 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
784 file_or_data_must_be_present (instantiator);
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 static Lisp_Object
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
788 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
789 Lisp_Object UNUSED (dest_mask))
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
790 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
791 return simple_image_type_normalize (inst, console_type, Qpng);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
792 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
793
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
794 static int
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
795 png_possible_dest_types (void)
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 return IMAGE_COLOR_PIXMAP_MASK;
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 struct png_memory_storage
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
801 {
2367
ecf1ebac70d8 [xemacs-hg @ 2004-11-04 23:05:23 by ben]
ben
parents: 2286
diff changeset
802 const Binbyte *bytes; /* The data */
665
fdefd0186b75 [xemacs-hg @ 2001-09-20 06:28:42 by ben]
ben
parents: 647
diff changeset
803 Bytecount len; /* How big is it? */
fdefd0186b75 [xemacs-hg @ 2001-09-20 06:28:42 by ben]
ben
parents: 647
diff changeset
804 Bytecount index; /* Where are we? */
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
805 };
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
806
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
807 static void
647
b39c14581166 [xemacs-hg @ 2001-08-13 04:45:47 by ben]
ben
parents: 638
diff changeset
808 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
809 png_size_t length)
428
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 struct png_memory_storage *tbr =
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
812 (struct png_memory_storage *) png_get_io_ptr (png_ptr);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
813
665
fdefd0186b75 [xemacs-hg @ 2001-09-20 06:28:42 by ben]
ben
parents: 647
diff changeset
814 if ((Bytecount) length > (tbr->len - tbr->index))
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
815 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
816 memcpy (data, tbr->bytes + tbr->index,length);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
817 tbr->index = tbr->index + length;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
818 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
819
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
820 struct png_error_struct
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
821 {
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
822 const char *err_str;
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
823 jmp_buf setjmp_buffer; /* for return to caller */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
824 };
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
825
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
826 /* jh 98/03/12 - #### AARRRGH! libpng includes jmp_buf inside its own
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
827 structure, and there are cases where the size can be different from
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
828 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
829 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
830 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
831 go away when the lisp engine is threaded! */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
832 static struct png_error_struct png_err_stct;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
833
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
834 static void
2286
04bc9d2f42c7 [xemacs-hg @ 2004-09-20 19:18:55 by james]
james
parents: 2270
diff changeset
835 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
836 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
837 png_err_stct.err_str = msg;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
838 longjmp (png_err_stct.setjmp_buffer, 1);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
839 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
840
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
841 static void
2286
04bc9d2f42c7 [xemacs-hg @ 2004-09-20 19:18:55 by james]
james
parents: 2270
diff changeset
842 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
843 {
3734
e1f65870f845 [xemacs-hg @ 2006-12-11 10:04:27 by aidan]
aidan
parents: 3094
diff changeset
844 DECLARE_EISTRING (eimsg);
e1f65870f845 [xemacs-hg @ 2006-12-11 10:04:27 by aidan]
aidan
parents: 3094
diff changeset
845
e1f65870f845 [xemacs-hg @ 2006-12-11 10:04:27 by aidan]
aidan
parents: 3094
diff changeset
846 eicpy_ext(eimsg, msg, Qbinary);
e1f65870f845 [xemacs-hg @ 2006-12-11 10:04:27 by aidan]
aidan
parents: 3094
diff changeset
847 warn_when_safe (Qpng, Qinfo, "%s", eidata(eimsg));
428
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 struct png_unwind_data
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
851 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
852 FILE *instream;
2367
ecf1ebac70d8 [xemacs-hg @ 2004-11-04 23:05:23 by ben]
ben
parents: 2286
diff changeset
853 Binbyte *eimage;
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
854 png_structp png_ptr;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
855 png_infop info_ptr;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
856 };
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 Lisp_Object
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
859 png_instantiate_unwind (Lisp_Object unwind_obj)
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 struct png_unwind_data *data =
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
862 (struct png_unwind_data *) get_opaque_ptr (unwind_obj);
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 free_opaque_ptr (unwind_obj);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
865 if (data->png_ptr)
3839
320acec37716 [xemacs-hg @ 2007-02-21 10:49:30 by stephent]
stephent
parents: 3734
diff changeset
866 {
320acec37716 [xemacs-hg @ 2007-02-21 10:49:30 by stephent]
stephent
parents: 3734
diff changeset
867 /* ensure we can't get here again */
320acec37716 [xemacs-hg @ 2007-02-21 10:49:30 by stephent]
stephent
parents: 3734
diff changeset
868 png_structp tmp = data->png_ptr;
320acec37716 [xemacs-hg @ 2007-02-21 10:49:30 by stephent]
stephent
parents: 3734
diff changeset
869 data->png_ptr = NULL;
320acec37716 [xemacs-hg @ 2007-02-21 10:49:30 by stephent]
stephent
parents: 3734
diff changeset
870 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
871 }
320acec37716 [xemacs-hg @ 2007-02-21 10:49:30 by stephent]
stephent
parents: 3734
diff changeset
872
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
873 if (data->instream)
771
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 665
diff changeset
874 retry_fclose (data->instream);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
875
1726
a8d8f419b459 [xemacs-hg @ 2003-09-30 15:26:34 by james]
james
parents: 872
diff changeset
876 if (data->eimage)
2367
ecf1ebac70d8 [xemacs-hg @ 2004-11-04 23:05:23 by ben]
ben
parents: 2286
diff changeset
877 xfree(data->eimage, Binbyte *);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
878
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
879 return Qnil;
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 void
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
883 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
884 Lisp_Object pointer_fg, Lisp_Object pointer_bg,
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
885 int dest_mask, Lisp_Object domain)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
886 {
440
8de8e3f6228a Import from CVS: tag r21-2-28
cvs
parents: 438
diff changeset
887 Lisp_Image_Instance *ii = XIMAGE_INSTANCE (image_instance);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
888 struct png_unwind_data unwind;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
889 int speccount = specpdl_depth ();
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
890 int height, width;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
891 struct png_memory_storage tbr; /* Data to be read */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
892
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
893 /* PNG variables */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
894 png_structp png_ptr;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
895 png_infop info_ptr;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
896
3839
320acec37716 [xemacs-hg @ 2007-02-21 10:49:30 by stephent]
stephent
parents: 3734
diff changeset
897 xzero (unwind);
320acec37716 [xemacs-hg @ 2007-02-21 10:49:30 by stephent]
stephent
parents: 3734
diff changeset
898 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
899
320acec37716 [xemacs-hg @ 2007-02-21 10:49:30 by stephent]
stephent
parents: 3734
diff changeset
900 if (setjmp (png_err_stct.setjmp_buffer))
320acec37716 [xemacs-hg @ 2007-02-21 10:49:30 by stephent]
stephent
parents: 3734
diff changeset
901 {
320acec37716 [xemacs-hg @ 2007-02-21 10:49:30 by stephent]
stephent
parents: 3734
diff changeset
902 /* Something blew up:
320acec37716 [xemacs-hg @ 2007-02-21 10:49:30 by stephent]
stephent
parents: 3734
diff changeset
903 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
904 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
905 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
906 Qerror_message_encoding),
3839
320acec37716 [xemacs-hg @ 2007-02-21 10:49:30 by stephent]
stephent
parents: 3734
diff changeset
907 instantiator);
320acec37716 [xemacs-hg @ 2007-02-21 10:49:30 by stephent]
stephent
parents: 3734
diff changeset
908 }
320acec37716 [xemacs-hg @ 2007-02-21 10:49:30 by stephent]
stephent
parents: 3734
diff changeset
909
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
910 /* Initialize all PNG structures */
3839
320acec37716 [xemacs-hg @ 2007-02-21 10:49:30 by stephent]
stephent
parents: 3734
diff changeset
911 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
912 (void *) &png_err_stct,
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
913 png_error_func, png_warning_func);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
914 if (!png_ptr)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
915 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
916 unwind.png_ptr = png_ptr;
320acec37716 [xemacs-hg @ 2007-02-21 10:49:30 by stephent]
stephent
parents: 3734
diff changeset
917
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
918 info_ptr = png_create_info_struct (png_ptr);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
919 if (!info_ptr)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
920 {
3839
320acec37716 [xemacs-hg @ 2007-02-21 10:49:30 by stephent]
stephent
parents: 3734
diff changeset
921 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
922 when unwinding */
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
923 png_destroy_read_struct (&png_ptr, (png_infopp)NULL, (png_infopp)NULL);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
924 signal_image_error ("Error obtaining memory for png_read", instantiator);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
925 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
926 unwind.info_ptr = info_ptr;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
927
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
928 /* 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
929 this file, example.c from the libpng 0.81 distribution, and the
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
930 pngtopnm sources. -WMP-
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
931 */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
932 /* 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
933 and is no longer usable for previous versions. jh
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
934 */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
935
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
936 /* Initialize the IO layer and read in header information */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
937 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
938 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
939 const Binbyte *bytes;
665
fdefd0186b75 [xemacs-hg @ 2001-09-20 06:28:42 by ben]
ben
parents: 647
diff changeset
940 Bytecount len;
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
941
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
942 assert (!NILP (data));
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
943
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
944 /* #### This is a definite problem under Mule due to the amount of
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
945 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
946 LISP_STRING_TO_SIZED_EXTERNAL (data, bytes, len, Qbinary);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
947 tbr.bytes = bytes;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
948 tbr.len = len;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
949 tbr.index = 0;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
950 png_set_read_fn (png_ptr,(void *) &tbr, png_read_from_memory);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
951 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
952
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
953 png_read_info (png_ptr, info_ptr);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
954
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
955 {
4698
a9493cab536f Fix crash due to mishandling transparency.
Stephen J. Turnbull <stephen@xemacs.org>
parents: 4682
diff changeset
956 int y, padding;
2367
ecf1ebac70d8 [xemacs-hg @ 2004-11-04 23:05:23 by ben]
ben
parents: 2286
diff changeset
957 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
958 UINT_64_BIT pixels_sq;
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
959 height = info_ptr->height;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
960 width = info_ptr->width;
4646
6c6bfdb80a0c Prevent integer overflow and subsequent crashes when attempting to load large
Jerry James <james@xemacs.org>
parents: 4326
diff changeset
961 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
962 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
963 signal_image_error ("PNG image too large to instantiate", instantiator);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
964
4698
a9493cab536f Fix crash due to mishandling transparency.
Stephen J. Turnbull <stephen@xemacs.org>
parents: 4682
diff changeset
965 /* Wow, allocate all the memory. Truly, exciting.
a9493cab536f Fix crash due to mishandling transparency.
Stephen J. Turnbull <stephen@xemacs.org>
parents: 4682
diff changeset
966 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
967 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
968 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
969 to add padding.
a9493cab536f Fix crash due to mishandling transparency.
Stephen J. Turnbull <stephen@xemacs.org>
parents: 4682
diff changeset
970 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
971
a9493cab536f Fix crash due to mishandling transparency.
Stephen J. Turnbull <stephen@xemacs.org>
parents: 4682
diff changeset
972 padding = 5 * width;
a9493cab536f Fix crash due to mishandling transparency.
Stephen J. Turnbull <stephen@xemacs.org>
parents: 4682
diff changeset
973 unwind.eimage = xnew_array_and_zero (Binbyte,
a9493cab536f Fix crash due to mishandling transparency.
Stephen J. Turnbull <stephen@xemacs.org>
parents: 4682
diff changeset
974 (size_t) (pixels_sq * 3 + padding));
a9493cab536f Fix crash due to mishandling transparency.
Stephen J. Turnbull <stephen@xemacs.org>
parents: 4682
diff changeset
975
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
976 /* libpng expects that the image buffer passed in contains a
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
977 picture to draw on top of if the png has any transparencies.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
978 This could be a good place to pass that in... */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
979
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
980 row_pointers = xnew_array (png_byte *, height);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
981 for (y = 0; y < height; y++)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
982 row_pointers[y] = unwind.eimage + (width * 3 * y);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
983
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 /* if the png specifies a background chunk, go ahead and
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
986 use it, else use what we can get from the default face. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
987 png_color_16 my_background, *image_background;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
988 Lisp_Object bkgd = Qnil;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
989
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
990 my_background.red = 0x7fff;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
991 my_background.green = 0x7fff;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
992 my_background.blue = 0x7fff;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
993 bkgd = FACE_BACKGROUND (Vdefault_face, domain);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
994 if (!COLOR_INSTANCEP (bkgd))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
995 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
996 warn_when_safe (Qpng, Qinfo, "Couldn't get background color!");
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
997 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
998 else
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
999 {
4698
a9493cab536f Fix crash due to mishandling transparency.
Stephen J. Turnbull <stephen@xemacs.org>
parents: 4682
diff changeset
1000 Lisp_Color_Instance *c = XCOLOR_INSTANCE (bkgd);
a9493cab536f Fix crash due to mishandling transparency.
Stephen J. Turnbull <stephen@xemacs.org>
parents: 4682
diff changeset
1001 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
1002 color_instance_rgb_components,
a9493cab536f Fix crash due to mishandling transparency.
Stephen J. Turnbull <stephen@xemacs.org>
parents: 4682
diff changeset
1003 (c));
a9493cab536f Fix crash due to mishandling transparency.
Stephen J. Turnbull <stephen@xemacs.org>
parents: 4682
diff changeset
1004 #define GETCOLOR(col) my_background.col = (unsigned short) XINT (XCAR (rgb))
a9493cab536f Fix crash due to mishandling transparency.
Stephen J. Turnbull <stephen@xemacs.org>
parents: 4682
diff changeset
1005 GETCOLOR(red); rgb = XCDR (rgb);
a9493cab536f Fix crash due to mishandling transparency.
Stephen J. Turnbull <stephen@xemacs.org>
parents: 4682
diff changeset
1006 GETCOLOR(green); rgb = XCDR (rgb);
a9493cab536f Fix crash due to mishandling transparency.
Stephen J. Turnbull <stephen@xemacs.org>
parents: 4682
diff changeset
1007 GETCOLOR(blue);
a9493cab536f Fix crash due to mishandling transparency.
Stephen J. Turnbull <stephen@xemacs.org>
parents: 4682
diff changeset
1008 #undef GETCOLOR
428
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
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1011 if (png_get_bKGD (png_ptr, info_ptr, &image_background))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1012 png_set_background (png_ptr, image_background,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1013 PNG_BACKGROUND_GAMMA_FILE, 1, 1.0);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1014 else
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1015 png_set_background (png_ptr, &my_background,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1016 PNG_BACKGROUND_GAMMA_SCREEN, 0, 1.0);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1017 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1018
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1019 /* 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
1020 of image*/
4698
a9493cab536f Fix crash due to mishandling transparency.
Stephen J. Turnbull <stephen@xemacs.org>
parents: 4682
diff changeset
1021 /* convert palette images to RGB */
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1022 if (info_ptr->color_type == PNG_COLOR_TYPE_PALETTE)
4698
a9493cab536f Fix crash due to mishandling transparency.
Stephen J. Turnbull <stephen@xemacs.org>
parents: 4682
diff changeset
1023 png_set_palette_to_rgb (png_ptr);
a9493cab536f Fix crash due to mishandling transparency.
Stephen J. Turnbull <stephen@xemacs.org>
parents: 4682
diff changeset
1024 /* convert grayscale images to RGB */
a9493cab536f Fix crash due to mishandling transparency.
Stephen J. Turnbull <stephen@xemacs.org>
parents: 4682
diff changeset
1025 else if (info_ptr->color_type == PNG_COLOR_TYPE_GRAY ||
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1026 info_ptr->color_type == PNG_COLOR_TYPE_GRAY_ALPHA)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1027 png_set_gray_to_rgb (png_ptr);
4698
a9493cab536f Fix crash due to mishandling transparency.
Stephen J. Turnbull <stephen@xemacs.org>
parents: 4682
diff changeset
1028 /* pad images with depth < 8 bits */
a9493cab536f Fix crash due to mishandling transparency.
Stephen J. Turnbull <stephen@xemacs.org>
parents: 4682
diff changeset
1029 else if (info_ptr->bit_depth < 8)
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1030 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1031 if (info_ptr->color_type == PNG_COLOR_TYPE_GRAY)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1032 png_set_expand (png_ptr);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1033 else
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1034 png_set_packing (png_ptr);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1035 }
4698
a9493cab536f Fix crash due to mishandling transparency.
Stephen J. Turnbull <stephen@xemacs.org>
parents: 4682
diff changeset
1036 /* strip 16-bit depth files down to 8 bits */
a9493cab536f Fix crash due to mishandling transparency.
Stephen J. Turnbull <stephen@xemacs.org>
parents: 4682
diff changeset
1037 if (info_ptr->bit_depth == 16)
a9493cab536f Fix crash due to mishandling transparency.
Stephen J. Turnbull <stephen@xemacs.org>
parents: 4682
diff changeset
1038 png_set_strip_16 (png_ptr);
a9493cab536f Fix crash due to mishandling transparency.
Stephen J. Turnbull <stephen@xemacs.org>
parents: 4682
diff changeset
1039 /* strip alpha channel
a9493cab536f Fix crash due to mishandling transparency.
Stephen J. Turnbull <stephen@xemacs.org>
parents: 4682
diff changeset
1040 #### shouldn't we handle this?
a9493cab536f Fix crash due to mishandling transparency.
Stephen J. Turnbull <stephen@xemacs.org>
parents: 4682
diff changeset
1041 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
1042 have generated an alpha channel */
a9493cab536f Fix crash due to mishandling transparency.
Stephen J. Turnbull <stephen@xemacs.org>
parents: 4682
diff changeset
1043 png_read_update_info(png_ptr, info_ptr);
a9493cab536f Fix crash due to mishandling transparency.
Stephen J. Turnbull <stephen@xemacs.org>
parents: 4682
diff changeset
1044 if (info_ptr->color_type & PNG_COLOR_MASK_ALPHA)
a9493cab536f Fix crash due to mishandling transparency.
Stephen J. Turnbull <stephen@xemacs.org>
parents: 4682
diff changeset
1045 png_set_strip_alpha (png_ptr);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1046
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1047 png_read_image (png_ptr, row_pointers);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1048 png_read_end (png_ptr, info_ptr);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1049
4698
a9493cab536f Fix crash due to mishandling transparency.
Stephen J. Turnbull <stephen@xemacs.org>
parents: 4682
diff changeset
1050 /* #### 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
1051 * 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
1052 * anyway. - WMP */
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1053 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1054 int i;
3734
e1f65870f845 [xemacs-hg @ 2006-12-11 10:04:27 by aidan]
aidan
parents: 3094
diff changeset
1055 DECLARE_EISTRING (key);
e1f65870f845 [xemacs-hg @ 2006-12-11 10:04:27 by aidan]
aidan
parents: 3094
diff changeset
1056 DECLARE_EISTRING (text);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1057
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1058 for (i = 0 ; i < info_ptr->num_text ; i++)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1059 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1060 /* How paranoid do I have to be about no trailing NULLs, and
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1061 using (int)info_ptr->text[i].text_length, and strncpy and a temp
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1062 string somewhere? */
3734
e1f65870f845 [xemacs-hg @ 2006-12-11 10:04:27 by aidan]
aidan
parents: 3094
diff changeset
1063 eireset(key);
e1f65870f845 [xemacs-hg @ 2006-12-11 10:04:27 by aidan]
aidan
parents: 3094
diff changeset
1064 eireset(text);
e1f65870f845 [xemacs-hg @ 2006-12-11 10:04:27 by aidan]
aidan
parents: 3094
diff changeset
1065 eicpy_ext(key, info_ptr->text[i].key, Qbinary);
e1f65870f845 [xemacs-hg @ 2006-12-11 10:04:27 by aidan]
aidan
parents: 3094
diff changeset
1066 eicpy_ext(text, info_ptr->text[i].text, Qbinary);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1067
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1068 warn_when_safe (Qpng, Qinfo, "%s - %s",
3734
e1f65870f845 [xemacs-hg @ 2006-12-11 10:04:27 by aidan]
aidan
parents: 3094
diff changeset
1069 eidata(key), eidata(text));
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1070 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1071 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1072
2367
ecf1ebac70d8 [xemacs-hg @ 2004-11-04 23:05:23 by ben]
ben
parents: 2286
diff changeset
1073 xfree (row_pointers, Binbyte **);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1074 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1075
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1076 /* now instantiate */
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1077 MAYBE_DEVMETH (DOMAIN_XDEVICE (ii->domain),
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1078 init_image_instance_from_eimage,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1079 (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
1080 instantiator, pointer_fg, pointer_bg, domain));
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1081
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1082 /* This will clean up everything else. */
771
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 665
diff changeset
1083 unbind_to (speccount);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1084 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1085
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1086 #endif /* HAVE_PNG */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1087
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1088
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1089 #ifdef HAVE_TIFF
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1090 #include "tiffio.h"
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1091
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1092 /**********************************************************************
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1093 * TIFF *
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1094 **********************************************************************/
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1095 static void
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1096 tiff_validate (Lisp_Object instantiator)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1097 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1098 file_or_data_must_be_present (instantiator);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1099 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1100
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1101 static Lisp_Object
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1102 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
1103 Lisp_Object UNUSED (dest_mask))
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1104 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1105 return simple_image_type_normalize (inst, console_type, Qtiff);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1106 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1107
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1108 static int
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1109 tiff_possible_dest_types (void)
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 return IMAGE_COLOR_PIXMAP_MASK;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1112 }
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 struct tiff_unwind_data
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1115 {
2367
ecf1ebac70d8 [xemacs-hg @ 2004-11-04 23:05:23 by ben]
ben
parents: 2286
diff changeset
1116 Binbyte *eimage;
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1117 /* Object that holds the decoded data from a TIFF file */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1118 TIFF *tiff;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1119 };
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 static Lisp_Object
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1122 tiff_instantiate_unwind (Lisp_Object unwind_obj)
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 struct tiff_unwind_data *data =
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1125 (struct tiff_unwind_data *) get_opaque_ptr (unwind_obj);
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 free_opaque_ptr (unwind_obj);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1128 if (data->tiff)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1129 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1130 TIFFClose(data->tiff);
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 if (data->eimage)
2367
ecf1ebac70d8 [xemacs-hg @ 2004-11-04 23:05:23 by ben]
ben
parents: 2286
diff changeset
1133 xfree (data->eimage, Binbyte *);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1134
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1135 return Qnil;
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
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1138 typedef struct tiff_memory_storage
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1139 {
2367
ecf1ebac70d8 [xemacs-hg @ 2004-11-04 23:05:23 by ben]
ben
parents: 2286
diff changeset
1140 Binbyte *bytes; /* The data */
665
fdefd0186b75 [xemacs-hg @ 2001-09-20 06:28:42 by ben]
ben
parents: 647
diff changeset
1141 Bytecount len; /* How big is it? */
fdefd0186b75 [xemacs-hg @ 2001-09-20 06:28:42 by ben]
ben
parents: 647
diff changeset
1142 Bytecount index; /* Where are we? */
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1143 } tiff_memory_storage;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1144
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1145 static size_t
647
b39c14581166 [xemacs-hg @ 2001-08-13 04:45:47 by ben]
ben
parents: 638
diff changeset
1146 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
1147 {
647
b39c14581166 [xemacs-hg @ 2001-08-13 04:45:47 by ben]
ben
parents: 638
diff changeset
1148 tiff_memory_storage *mem = (tiff_memory_storage *) data;
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1149
665
fdefd0186b75 [xemacs-hg @ 2001-09-20 06:28:42 by ben]
ben
parents: 647
diff changeset
1150 if ((Bytecount) size > (mem->len - mem->index))
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1151 return (size_t) -1;
647
b39c14581166 [xemacs-hg @ 2001-08-13 04:45:47 by ben]
ben
parents: 638
diff changeset
1152 memcpy (buf, mem->bytes + mem->index, size);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1153 mem->index = mem->index + size;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1154 return size;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1155 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1156
647
b39c14581166 [xemacs-hg @ 2001-08-13 04:45:47 by ben]
ben
parents: 638
diff changeset
1157 static size_t
2286
04bc9d2f42c7 [xemacs-hg @ 2004-09-20 19:18:55 by james]
james
parents: 2270
diff changeset
1158 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
1159 tsize_t UNUSED (size))
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1160 {
2500
3d8143fc88e1 [xemacs-hg @ 2005-01-24 23:33:30 by ben]
ben
parents: 2367
diff changeset
1161 ABORT();
2270
0be6ff2356c8 [xemacs-hg @ 2004-09-14 18:22:31 by james]
james
parents: 2235
diff changeset
1162 return 0;
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1163 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1164
647
b39c14581166 [xemacs-hg @ 2001-08-13 04:45:47 by ben]
ben
parents: 638
diff changeset
1165 static toff_t
b39c14581166 [xemacs-hg @ 2001-08-13 04:45:47 by ben]
ben
parents: 638
diff changeset
1166 tiff_memory_seek (thandle_t data, toff_t off, int whence)
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1167 {
647
b39c14581166 [xemacs-hg @ 2001-08-13 04:45:47 by ben]
ben
parents: 638
diff changeset
1168 tiff_memory_storage *mem = (tiff_memory_storage *) data;
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1169 int newidx;
647
b39c14581166 [xemacs-hg @ 2001-08-13 04:45:47 by ben]
ben
parents: 638
diff changeset
1170 switch(whence)
b39c14581166 [xemacs-hg @ 2001-08-13 04:45:47 by ben]
ben
parents: 638
diff changeset
1171 {
b39c14581166 [xemacs-hg @ 2001-08-13 04:45:47 by ben]
ben
parents: 638
diff changeset
1172 case SEEK_SET:
b39c14581166 [xemacs-hg @ 2001-08-13 04:45:47 by ben]
ben
parents: 638
diff changeset
1173 newidx = off;
b39c14581166 [xemacs-hg @ 2001-08-13 04:45:47 by ben]
ben
parents: 638
diff changeset
1174 break;
b39c14581166 [xemacs-hg @ 2001-08-13 04:45:47 by ben]
ben
parents: 638
diff changeset
1175 case SEEK_END:
b39c14581166 [xemacs-hg @ 2001-08-13 04:45:47 by ben]
ben
parents: 638
diff changeset
1176 newidx = mem->len + off;
b39c14581166 [xemacs-hg @ 2001-08-13 04:45:47 by ben]
ben
parents: 638
diff changeset
1177 break;
b39c14581166 [xemacs-hg @ 2001-08-13 04:45:47 by ben]
ben
parents: 638
diff changeset
1178 case SEEK_CUR:
b39c14581166 [xemacs-hg @ 2001-08-13 04:45:47 by ben]
ben
parents: 638
diff changeset
1179 newidx = mem->index + off;
b39c14581166 [xemacs-hg @ 2001-08-13 04:45:47 by ben]
ben
parents: 638
diff changeset
1180 break;
b39c14581166 [xemacs-hg @ 2001-08-13 04:45:47 by ben]
ben
parents: 638
diff changeset
1181 default:
b39c14581166 [xemacs-hg @ 2001-08-13 04:45:47 by ben]
ben
parents: 638
diff changeset
1182 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
1183 return (toff_t) -1;
b39c14581166 [xemacs-hg @ 2001-08-13 04:45:47 by ben]
ben
parents: 638
diff changeset
1184 }
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1185
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1186 if ((newidx > mem->len) || (newidx < 0))
593
5fd7ba8b56e7 [xemacs-hg @ 2001-05-31 12:45:27 by ben]
ben
parents: 442
diff changeset
1187 return (toff_t) -1;
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1188
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1189 mem->index = newidx;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1190 return newidx;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1191 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1192
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1193 static int
2286
04bc9d2f42c7 [xemacs-hg @ 2004-09-20 19:18:55 by james]
james
parents: 2270
diff changeset
1194 tiff_memory_close (thandle_t UNUSED (data))
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1195 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1196 return 0;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1197 }
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 static int
2286
04bc9d2f42c7 [xemacs-hg @ 2004-09-20 19:18:55 by james]
james
parents: 2270
diff changeset
1200 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
1201 toff_t* UNUSED (psize))
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1202 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1203 return 0;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1204 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1205
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1206 static void
2286
04bc9d2f42c7 [xemacs-hg @ 2004-09-20 19:18:55 by james]
james
parents: 2270
diff changeset
1207 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
1208 toff_t UNUSED (psize))
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1209 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1210 return;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1211 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1212
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1213 static toff_t
647
b39c14581166 [xemacs-hg @ 2001-08-13 04:45:47 by ben]
ben
parents: 638
diff changeset
1214 tiff_memory_size (thandle_t data)
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1215 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1216 tiff_memory_storage *mem = (tiff_memory_storage*)data;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1217 return mem->len;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1218 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1219
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1220 struct tiff_error_struct
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1221 {
438
84b14dcb0985 Import from CVS: tag r21-2-27
cvs
parents: 428
diff changeset
1222 #ifdef HAVE_VSNPRINTF
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1223 char err_str[256];
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1224 #else
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1225 char err_str[1024]; /* return the error string */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1226 #endif
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1227 jmp_buf setjmp_buffer; /* for return to caller */
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
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1230 /* 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
1231 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
1232 have any place to store error func data. This should be rectified
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1233 before XEmacs gets threads! */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1234 static struct tiff_error_struct tiff_err_data;
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 void
2286
04bc9d2f42c7 [xemacs-hg @ 2004-09-20 19:18:55 by james]
james
parents: 2270
diff changeset
1237 tiff_error_func (const char *UNUSED (module), const char *fmt, ...)
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 va_list vargs;
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 va_start (vargs, fmt);
438
84b14dcb0985 Import from CVS: tag r21-2-27
cvs
parents: 428
diff changeset
1242 #ifdef HAVE_VSNPRINTF
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1243 vsnprintf (tiff_err_data.err_str, 255, fmt, vargs);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1244 #else
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1245 /* pray this doesn't overflow... */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1246 vsprintf (tiff_err_data.err_str, fmt, vargs);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1247 #endif
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1248 va_end (vargs);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1249 /* return to setjmp point */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1250 longjmp (tiff_err_data.setjmp_buffer, 1);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1251 }
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 static void
647
b39c14581166 [xemacs-hg @ 2001-08-13 04:45:47 by ben]
ben
parents: 638
diff changeset
1254 tiff_warning_func (const char *module, const char *fmt, ...)
428
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 va_list vargs;
438
84b14dcb0985 Import from CVS: tag r21-2-27
cvs
parents: 428
diff changeset
1257 #ifdef HAVE_VSNPRINTF
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1258 char warn_str[256];
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1259 #else
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1260 char warn_str[1024];
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1261 #endif
3734
e1f65870f845 [xemacs-hg @ 2006-12-11 10:04:27 by aidan]
aidan
parents: 3094
diff changeset
1262 DECLARE_EISTRING (eimodule);
e1f65870f845 [xemacs-hg @ 2006-12-11 10:04:27 by aidan]
aidan
parents: 3094
diff changeset
1263 DECLARE_EISTRING (eiwarnstr);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1264
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1265 va_start (vargs, fmt);
438
84b14dcb0985 Import from CVS: tag r21-2-27
cvs
parents: 428
diff changeset
1266 #ifdef HAVE_VSNPRINTF
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1267 vsnprintf (warn_str, 255, fmt, vargs);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1268 #else
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1269 vsprintf (warn_str, fmt, vargs);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1270 #endif
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1271 va_end (vargs);
3734
e1f65870f845 [xemacs-hg @ 2006-12-11 10:04:27 by aidan]
aidan
parents: 3094
diff changeset
1272
e1f65870f845 [xemacs-hg @ 2006-12-11 10:04:27 by aidan]
aidan
parents: 3094
diff changeset
1273 eicpy_ext(eimodule, module, Qbinary);
e1f65870f845 [xemacs-hg @ 2006-12-11 10:04:27 by aidan]
aidan
parents: 3094
diff changeset
1274 eicpy_ext(eiwarnstr, warn_str, Qbinary);
e1f65870f845 [xemacs-hg @ 2006-12-11 10:04:27 by aidan]
aidan
parents: 3094
diff changeset
1275
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1276 warn_when_safe (Qtiff, Qinfo, "%s - %s",
3734
e1f65870f845 [xemacs-hg @ 2006-12-11 10:04:27 by aidan]
aidan
parents: 3094
diff changeset
1277 eidata(eimodule),
e1f65870f845 [xemacs-hg @ 2006-12-11 10:04:27 by aidan]
aidan
parents: 3094
diff changeset
1278 eidata(eiwarnstr));
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1279 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1280
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1281 static void
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1282 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
1283 Lisp_Object pointer_fg, Lisp_Object pointer_bg,
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1284 int dest_mask, Lisp_Object domain)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1285 {
440
8de8e3f6228a Import from CVS: tag r21-2-28
cvs
parents: 438
diff changeset
1286 Lisp_Image_Instance *ii = XIMAGE_INSTANCE (image_instance);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1287 tiff_memory_storage mem_struct;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1288 /* 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
1289 because the unwind-protect is always executed when this
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1290 stack frame is still valid. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1291 struct tiff_unwind_data unwind;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1292 int speccount = specpdl_depth ();
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1293 uint32 width, height;
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 xzero (unwind);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1296 record_unwind_protect (tiff_instantiate_unwind, make_opaque_ptr (&unwind));
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1297
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1298 /* set up error facilities */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1299 if (setjmp (tiff_err_data.setjmp_buffer))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1300 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1301 /* 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
1302 for us. Just pass the error along. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1303 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
1304 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
1305 Qerror_message_encoding),
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1306 instantiator);
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 TIFFSetErrorHandler ((TIFFErrorHandler)tiff_error_func);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1309 TIFFSetWarningHandler ((TIFFErrorHandler)tiff_warning_func);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1310 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1311 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
1312 Binbyte *bytes;
665
fdefd0186b75 [xemacs-hg @ 2001-09-20 06:28:42 by ben]
ben
parents: 647
diff changeset
1313 Bytecount len;
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1314
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1315 uint32 *raster;
2367
ecf1ebac70d8 [xemacs-hg @ 2004-11-04 23:05:23 by ben]
ben
parents: 2286
diff changeset
1316 Binbyte *ep;
4646
6c6bfdb80a0c Prevent integer overflow and subsequent crashes when attempting to load large
Jerry James <james@xemacs.org>
parents: 4326
diff changeset
1317 UINT_64_BIT pixels_sq;
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1318
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1319 assert (!NILP (data));
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1320
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1321 /* #### This is a definite problem under Mule due to the amount of
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1322 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
1323 LISP_STRING_TO_SIZED_EXTERNAL (data, bytes, len, Qbinary);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1324 mem_struct.bytes = bytes;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1325 mem_struct.len = len;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1326 mem_struct.index = 0;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1327
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1328 unwind.tiff = TIFFClientOpen ("memfile", "r", (thandle_t) &mem_struct,
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1329 (TIFFReadWriteProc)tiff_memory_read,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1330 (TIFFReadWriteProc)tiff_memory_write,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1331 tiff_memory_seek, tiff_memory_close, tiff_memory_size,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1332 tiff_map_noop, tiff_unmap_noop);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1333 if (!unwind.tiff)
440
8de8e3f6228a Import from CVS: tag r21-2-28
cvs
parents: 438
diff changeset
1334 signal_image_error ("Insufficient memory to instantiate TIFF image", instantiator);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1335
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1336 TIFFGetField (unwind.tiff, TIFFTAG_IMAGEWIDTH, &width);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1337 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
1338 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
1339 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
1340 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
1341 unwind.eimage = xnew_binbytes ((size_t) pixels_sq * 3);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1342
440
8de8e3f6228a Import from CVS: tag r21-2-28
cvs
parents: 438
diff changeset
1343 /* #### This is little more than proof-of-concept/function testing.
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1344 It needs to be reimplemented via scanline reads for both memory
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1345 compactness. */
4646
6c6bfdb80a0c Prevent integer overflow and subsequent crashes when attempting to load large
Jerry James <james@xemacs.org>
parents: 4326
diff changeset
1346 raster = (uint32*) _TIFFmalloc ((tsize_t) (pixels_sq * sizeof (uint32)));
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1347 if (raster != NULL)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1348 {
647
b39c14581166 [xemacs-hg @ 2001-08-13 04:45:47 by ben]
ben
parents: 638
diff changeset
1349 int i, j;
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1350 uint32 *rp;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1351 ep = unwind.eimage;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1352 rp = raster;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1353 if (TIFFReadRGBAImage (unwind.tiff, width, height, raster, 0))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1354 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1355 for (i = height - 1; i >= 0; i--)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1356 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1357 /* This is to get around weirdness in the libtiff library where properly
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1358 made TIFFs will come out upside down. libtiff bug or jhod-brainlock? */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1359 rp = raster + (i * width);
647
b39c14581166 [xemacs-hg @ 2001-08-13 04:45:47 by ben]
ben
parents: 638
diff changeset
1360 for (j = 0; j < (int) width; j++)
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1361 {
2367
ecf1ebac70d8 [xemacs-hg @ 2004-11-04 23:05:23 by ben]
ben
parents: 2286
diff changeset
1362 *ep++ = (Binbyte)TIFFGetR(*rp);
ecf1ebac70d8 [xemacs-hg @ 2004-11-04 23:05:23 by ben]
ben
parents: 2286
diff changeset
1363 *ep++ = (Binbyte)TIFFGetG(*rp);
ecf1ebac70d8 [xemacs-hg @ 2004-11-04 23:05:23 by ben]
ben
parents: 2286
diff changeset
1364 *ep++ = (Binbyte)TIFFGetB(*rp);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1365 rp++;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1366 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1367 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1368 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1369 _TIFFfree (raster);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1370 } else
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1371 signal_image_error ("Unable to allocate memory for TIFFReadRGBA", instantiator);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1372
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1373 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1374
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1375 /* now instantiate */
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1376 MAYBE_DEVMETH (DOMAIN_XDEVICE (ii->domain),
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1377 init_image_instance_from_eimage,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1378 (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
1379 instantiator, pointer_fg, pointer_bg, domain));
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1380
771
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 665
diff changeset
1381 unbind_to (speccount);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1382 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1383
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1384 #endif /* HAVE_TIFF */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1385
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1386
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1387 /************************************************************************/
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1388 /* initialization */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1389 /************************************************************************/
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1390
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1391 void
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1392 syms_of_glyphs_eimage (void)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1393 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1394 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1395
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1396 void
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1397 image_instantiator_format_create_glyphs_eimage (void)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1398 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1399 /* image-instantiator types */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1400 #ifdef HAVE_JPEG
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1401 INITIALIZE_IMAGE_INSTANTIATOR_FORMAT (jpeg, "jpeg");
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1402
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1403 IIFORMAT_HAS_METHOD (jpeg, validate);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1404 IIFORMAT_HAS_METHOD (jpeg, normalize);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1405 IIFORMAT_HAS_METHOD (jpeg, possible_dest_types);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1406 IIFORMAT_HAS_METHOD (jpeg, instantiate);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1407
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1408 IIFORMAT_VALID_KEYWORD (jpeg, Q_data, check_valid_string);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1409 IIFORMAT_VALID_KEYWORD (jpeg, Q_file, check_valid_string);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1410 #endif
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 #ifdef HAVE_GIF
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1413 INITIALIZE_IMAGE_INSTANTIATOR_FORMAT (gif, "gif");
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1414
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1415 IIFORMAT_HAS_METHOD (gif, validate);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1416 IIFORMAT_HAS_METHOD (gif, normalize);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1417 IIFORMAT_HAS_METHOD (gif, possible_dest_types);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1418 IIFORMAT_HAS_METHOD (gif, instantiate);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1419
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1420 IIFORMAT_VALID_KEYWORD (gif, Q_data, check_valid_string);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1421 IIFORMAT_VALID_KEYWORD (gif, Q_file, check_valid_string);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1422 #endif
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1423
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1424 #ifdef HAVE_PNG
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1425 INITIALIZE_IMAGE_INSTANTIATOR_FORMAT (png, "png");
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 IIFORMAT_HAS_METHOD (png, validate);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1428 IIFORMAT_HAS_METHOD (png, normalize);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1429 IIFORMAT_HAS_METHOD (png, possible_dest_types);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1430 IIFORMAT_HAS_METHOD (png, instantiate);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1431
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1432 IIFORMAT_VALID_KEYWORD (png, Q_data, check_valid_string);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1433 IIFORMAT_VALID_KEYWORD (png, Q_file, check_valid_string);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1434 #endif
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1435
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1436 #ifdef HAVE_TIFF
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1437 INITIALIZE_IMAGE_INSTANTIATOR_FORMAT (tiff, "tiff");
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 IIFORMAT_HAS_METHOD (tiff, validate);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1440 IIFORMAT_HAS_METHOD (tiff, normalize);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1441 IIFORMAT_HAS_METHOD (tiff, possible_dest_types);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1442 IIFORMAT_HAS_METHOD (tiff, instantiate);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1443
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1444 IIFORMAT_VALID_KEYWORD (tiff, Q_data, check_valid_string);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1445 IIFORMAT_VALID_KEYWORD (tiff, Q_file, check_valid_string);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1446 #endif
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1447
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1448 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1449
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1450 void
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1451 vars_of_glyphs_eimage (void)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1452 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1453 #ifdef HAVE_JPEG
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1454 Fprovide (Qjpeg);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1455 #endif
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1456
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1457 #ifdef HAVE_GIF
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1458 Fprovide (Qgif);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1459 #endif
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1460
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1461 #ifdef HAVE_PNG
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1462 Fprovide (Qpng);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1463 #endif
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1464
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1465 #ifdef HAVE_TIFF
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1466 Fprovide (Qtiff);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1467 #endif
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1468
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1469 }