X-Git-Url: https://code.delx.au/gnu-emacs/blobdiff_plain/d3e4228575e9ba9e99dc4a7dae788280ffcc4566..e25d341cec1ebaee2b96d627d99d4d7b92dee6b0:/src/image.c diff --git a/src/image.c b/src/image.c index 9b41cf7499..2dae63a294 100644 --- a/src/image.c +++ b/src/image.c @@ -1,6 +1,6 @@ /* Functions for image support on window system. -Copyright (C) 1989, 1992-2012 Free Software Foundation, Inc. +Copyright (C) 1989, 1992-2013 Free Software Foundation, Inc. This file is part of GNU Emacs. @@ -68,8 +68,6 @@ typedef struct x_bitmap_record Bitmap_Record; #define GET_PIXEL(ximg, x, y) XGetPixel (ximg, x, y) #define NO_PIXMAP None -#define RGB_PIXEL_COLOR unsigned long - #define PIX_MASK_RETAIN 0 #define PIX_MASK_DRAW 1 #endif /* HAVE_X_WINDOWS */ @@ -88,8 +86,6 @@ typedef struct w32_bitmap_record Bitmap_Record; #define GET_PIXEL(ximg, x, y) GetPixel (ximg, x, y) #define NO_PIXMAP 0 -#define RGB_PIXEL_COLOR COLORREF - #define PIX_MASK_RETAIN 0 #define PIX_MASK_DRAW 1 @@ -110,7 +106,6 @@ typedef struct ns_bitmap_record Bitmap_Record; #define GET_PIXEL(ximg, x, y) XGetPixel (ximg, x, y) #define NO_PIXMAP 0 -#define RGB_PIXEL_COLOR unsigned long #define ZPixmap 0 #define PIX_MASK_RETAIN 0 @@ -159,15 +154,15 @@ XGetImage (Display *display, Pixmap pixmap, int x, int y, return pixmap; } -/* use with imgs created by ns_image_for_XPM */ +/* Use with images created by ns_image_for_XPM. */ unsigned long XGetPixel (XImagePtr ximage, int x, int y) { return ns_get_pixel (ximage, x, y); } -/* use with imgs created by ns_image_for_XPM; alpha set to 1; - pixel is assumed to be in form RGB */ +/* Use with images created by ns_image_for_XPM; alpha set to 1; + pixel is assumed to be in RGB form. */ void XPutPixel (XImagePtr ximage, int x, int y, unsigned long pixel) { @@ -894,7 +889,7 @@ or omitted means use the selected frame. */) size = Qnil; if (valid_image_p (spec)) { - struct frame *f = check_x_frame (frame); + struct frame *f = decode_window_system_frame (frame); ptrdiff_t id = lookup_image (f, spec); struct image *img = IMAGE_FROM_ID (f, id); int width = img->width + 2 * img->hmargin; @@ -924,7 +919,7 @@ or omitted means use the selected frame. */) mask = Qnil; if (valid_image_p (spec)) { - struct frame *f = check_x_frame (frame); + struct frame *f = decode_window_system_frame (frame); ptrdiff_t id = lookup_image (f, spec); struct image *img = IMAGE_FROM_ID (f, id); if (img->mask) @@ -947,7 +942,7 @@ or omitted means use the selected frame. */) ext = Qnil; if (valid_image_p (spec)) { - struct frame *f = check_x_frame (frame); + struct frame *f = decode_window_system_frame (frame); ptrdiff_t id = lookup_image (f, spec); struct image *img = IMAGE_FROM_ID (f, id); ext = img->lisp_data; @@ -1555,7 +1550,7 @@ which is then usually a filename. */) if (!(EQ (filter, Qnil) || FRAMEP (filter))) clear_image_caches (filter); else - clear_image_cache (check_x_frame (filter), Qt); + clear_image_cache (decode_window_system_frame (filter), Qt); return Qnil; } @@ -1586,7 +1581,7 @@ FRAME t means refresh the image on all frames. */) } } else - uncache_image (check_x_frame (frame), spec); + uncache_image (decode_window_system_frame (frame), spec); return Qnil; } @@ -2140,12 +2135,11 @@ x_find_image_file (Lisp_Object file) static unsigned char * slurp_file (char *file, ptrdiff_t *size) { - FILE *fp = NULL; + FILE *fp = fopen (file, "rb"); unsigned char *buf = NULL; struct stat st; - if (stat (file, &st) == 0 - && (fp = fopen (file, "rb")) != NULL + if (fp && fstat (fileno (fp), &st) == 0 && 0 <= st.st_size && st.st_size <= min (PTRDIFF_MAX, SIZE_MAX) && (buf = xmalloc (st.st_size), fread (buf, 1, st.st_size, fp) == st.st_size)) @@ -3732,10 +3726,10 @@ xpm_make_color_table_h (void (**put_func) (Lisp_Object, { *put_func = xpm_put_color_table_h; *get_func = xpm_get_color_table_h; - return make_hash_table (Qequal, make_number (DEFAULT_HASH_SIZE), + return make_hash_table (hashtest_equal, make_number (DEFAULT_HASH_SIZE), make_float (DEFAULT_REHASH_SIZE), make_float (DEFAULT_REHASH_THRESHOLD), - Qnil, Qnil, Qnil); + Qnil); } static void @@ -5004,45 +4998,6 @@ pbm_scan_number (unsigned char **s, unsigned char *end) } -#ifdef HAVE_NTGUI -#if 0 /* Unused. ++kfs */ - -/* Read FILE into memory. Value is a pointer to a buffer allocated - with xmalloc holding FILE's contents. Value is null if an error - occurred. *SIZE is set to the size of the file. */ - -static char * -pbm_read_file (Lisp_Object file, int *size) -{ - FILE *fp = NULL; - char *buf = NULL; - struct stat st; - - if (stat (SDATA (file), &st) == 0 - && (fp = fopen (SDATA (file), "rb")) != NULL - && 0 <= st.st_size && st.st_size <= min (PTRDIFF_MAX, SIZE_MAX) - && (buf = xmalloc (st.st_size), - fread (buf, 1, st.st_size, fp) == st.st_size)) - { - *size = st.st_size; - fclose (fp); - } - else - { - if (fp) - fclose (fp); - if (buf) - { - xfree (buf); - buf = NULL; - } - } - - return buf; -} -#endif -#endif /* HAVE_NTGUI */ - /* Load PBM image IMG for use on frame F. */ static bool @@ -6617,7 +6572,7 @@ static const struct image_keyword tiff_format[TIFF_LAST] = {":index", IMAGE_NON_NEGATIVE_INTEGER_VALUE, 0} }; -#ifdef HAVE_NTGUI +#if defined HAVE_NTGUI && defined WINDOWSNT static bool init_tiff_functions (void); #else #define init_tiff_functions NULL @@ -7418,11 +7373,10 @@ gif_load (struct frame *f, struct image *img) y < subimg_height; y++, row += interlace_increment[pass]) { - if (row >= subimg_height) + while (subimg_height <= row) { + lint_assume (pass < 3); row = interlace_start[++pass]; - while (row >= subimg_height) - row = interlace_start[++pass]; } for (x = 0; x < subimg_width; x++) @@ -7569,7 +7523,7 @@ static struct image_keyword imagemagick_format[IMAGEMAGICK_LAST] = {":crop", IMAGE_DONT_CHECK_VALUE_TYPE, 0} }; -#ifdef HAVE_NTGUI +#if defined HAVE_NTGUI && defined WINDOWSNT static bool init_imagemagick_functions (void); #else #define init_imagemagick_functions NULL @@ -7832,11 +7786,6 @@ imagemagick_load_image (struct frame *f, struct image *img, } } - /* Finally we are done manipulating the image. Figure out the - resulting width/height and transfer ownership to Emacs. */ - height = MagickGetImageHeight (image_wand); - width = MagickGetImageWidth (image_wand); - /* Set the canvas background color to the frame or specified background, and flatten the image. Note: as of ImageMagick 6.6.0, SVG image transparency is not handled properly @@ -7853,6 +7802,11 @@ imagemagick_load_image (struct frame *f, struct image *img, image_wand = new_wand; } + /* Finally we are done manipulating the image. Figure out the + resulting width/height and transfer ownership to Emacs. */ + height = MagickGetImageHeight (image_wand); + width = MagickGetImageWidth (image_wand); + if (! (width <= INT_MAX && height <= INT_MAX && check_image_size (f, width, height))) { @@ -8123,7 +8077,7 @@ static const struct image_keyword svg_format[SVG_LAST] = {":background", IMAGE_STRING_OR_NIL_VALUE, 0} }; -#ifdef HAVE_NTGUI +#if defined HAVE_NTGUI && defined WINDOWSNT static bool init_svg_functions (void); #else #define init_svg_functions NULL @@ -8166,24 +8120,25 @@ svg_image_p (Lisp_Object object) #ifdef WINDOWSNT /* SVG library functions. */ -DEF_IMGLIB_FN (RsvgHandle *, rsvg_handle_new); -DEF_IMGLIB_FN (void, rsvg_handle_get_dimensions); -DEF_IMGLIB_FN (gboolean, rsvg_handle_write); -DEF_IMGLIB_FN (gboolean, rsvg_handle_close); -DEF_IMGLIB_FN (GdkPixbuf *, rsvg_handle_get_pixbuf); - -DEF_IMGLIB_FN (int, gdk_pixbuf_get_width); -DEF_IMGLIB_FN (int, gdk_pixbuf_get_height); -DEF_IMGLIB_FN (guchar *, gdk_pixbuf_get_pixels); -DEF_IMGLIB_FN (int, gdk_pixbuf_get_rowstride); -DEF_IMGLIB_FN (GdkColorspace, gdk_pixbuf_get_colorspace); -DEF_IMGLIB_FN (int, gdk_pixbuf_get_n_channels); -DEF_IMGLIB_FN (gboolean, gdk_pixbuf_get_has_alpha); -DEF_IMGLIB_FN (int, gdk_pixbuf_get_bits_per_sample); - -DEF_IMGLIB_FN (void, g_type_init); -DEF_IMGLIB_FN (void, g_object_unref); -DEF_IMGLIB_FN (void, g_error_free); +DEF_IMGLIB_FN (RsvgHandle *, rsvg_handle_new, (void)); +DEF_IMGLIB_FN (void, rsvg_handle_get_dimensions, (RsvgHandle *, RsvgDimensionData *)); +DEF_IMGLIB_FN (gboolean, rsvg_handle_write, (RsvgHandle *, const guchar *, gsize, GError **)); +DEF_IMGLIB_FN (gboolean, rsvg_handle_close, (RsvgHandle *, GError **)); +DEF_IMGLIB_FN (GdkPixbuf *, rsvg_handle_get_pixbuf, (RsvgHandle *)); +DEF_IMGLIB_FN (void *, rsvg_handle_set_size_callback, (RsvgHandle *, RsvgSizeFunc, gpointer, GDestroyNotify)); + +DEF_IMGLIB_FN (int, gdk_pixbuf_get_width, (const GdkPixbuf *)); +DEF_IMGLIB_FN (int, gdk_pixbuf_get_height, (const GdkPixbuf *)); +DEF_IMGLIB_FN (guchar *, gdk_pixbuf_get_pixels, (const GdkPixbuf *)); +DEF_IMGLIB_FN (int, gdk_pixbuf_get_rowstride, (const GdkPixbuf *)); +DEF_IMGLIB_FN (GdkColorspace, gdk_pixbuf_get_colorspace, (const GdkPixbuf *)); +DEF_IMGLIB_FN (int, gdk_pixbuf_get_n_channels, (const GdkPixbuf *)); +DEF_IMGLIB_FN (gboolean, gdk_pixbuf_get_has_alpha, (const GdkPixbuf *)); +DEF_IMGLIB_FN (int, gdk_pixbuf_get_bits_per_sample, (const GdkPixbuf *)); + +DEF_IMGLIB_FN (void, g_type_init, (void)); +DEF_IMGLIB_FN (void, g_object_unref, (gpointer)); +DEF_IMGLIB_FN (void, g_error_free, (GError *)); Lisp_Object Qgdk_pixbuf, Qglib, Qgobject; @@ -8599,10 +8554,10 @@ gs_load (struct frame *f, struct image *img) info. */ pt_width = image_spec_value (img->spec, QCpt_width, NULL); in_width = INTEGERP (pt_width) ? XFASTINT (pt_width) / 72.0 : 0; - in_width *= FRAME_X_DISPLAY_INFO (f)->resx; + in_width *= FRAME_RES_X (f); pt_height = image_spec_value (img->spec, QCpt_height, NULL); in_height = INTEGERP (pt_height) ? XFASTINT (pt_height) / 72.0 : 0; - in_height *= FRAME_X_DISPLAY_INFO (f)->resy; + in_height *= FRAME_RES_Y (f); if (! (in_width <= INT_MAX && in_height <= INT_MAX && check_image_size (f, in_width, in_height)))