X-Git-Url: http://git.hcoop.net/bpt/emacs.git/blobdiff_plain/1ba38c429fa6ce17568771ef51c8e53b1a72bb94..c16fbf67a040d3a1440cec001ba0de33f25559a4:/src/image.c diff --git a/src/image.c b/src/image.c index 047f751750..7fa28840c1 100644 --- a/src/image.c +++ b/src/image.c @@ -998,6 +998,11 @@ free_image (struct frame *f, struct image *img) c->images[img->id] = NULL; + /* Windows NT redefines 'free', but in this file, we need to + avoid the redefinition. */ +#ifdef WINDOWSNT +#undef free +#endif /* Free resources, then free IMG. */ img->type->free (f, img); xfree (img); @@ -1231,6 +1236,9 @@ image_background_transparent (struct image *img, struct frame *f, XImagePtr_or_D return img->background_transparent; } +#if defined (HAVE_PNG) || defined (HAVE_NS) \ + || defined (HAVE_IMAGEMAGICK) || defined (HAVE_RSVG) + /* Store F's background color into *BGCOLOR. */ static void x_query_frame_background_color (struct frame *f, XColor *bgcolor) @@ -1243,7 +1251,8 @@ x_query_frame_background_color (struct frame *f, XColor *bgcolor) #endif } - +#endif /* HAVE_PNG || HAVE_NS || HAVE_IMAGEMAGICK || HAVE_RSVG */ + /*********************************************************************** Helper functions for X image types ***********************************************************************/ @@ -1813,37 +1822,6 @@ cache_image (struct frame *f, struct image *img) img->prev = NULL; c->buckets[i] = img; } - - -/* Call FN on every image in the image cache of frame F. Used to mark - Lisp Objects in the image cache. */ - -/* Mark Lisp objects in image IMG. */ - -static void -mark_image (struct image *img) -{ - mark_object (img->spec); - mark_object (img->dependencies); - - if (!NILP (img->lisp_data)) - mark_object (img->lisp_data); -} - - -void -mark_image_cache (struct image_cache *c) -{ - if (c) - { - ptrdiff_t i; - for (i = 0; i < c->used; ++i) - if (c->images[i]) - mark_image (c->images[i]); - } -} - - /*********************************************************************** X / NS / W32 support code @@ -1942,7 +1920,7 @@ x_create_x_image_and_pixmap (struct frame *f, int width, int height, int depth, } /* Allocate image raster. */ - (*ximg)->data = xmalloc ((*ximg)->bytes_per_line * height); + (*ximg)->data = xmalloc_atomic ((*ximg)->bytes_per_line * height); /* Allocate a pixmap of the same size. */ *pixmap = XCreatePixmap (display, window, width, height, depth); @@ -2285,7 +2263,7 @@ slurp_file (char *file, ptrdiff_t *size) if (fp) { - ptrdiff_t count = SPECPDL_INDEX (); + dynwind_begin (); record_unwind_protect_ptr (fclose_unwind, fp); if (fstat (fileno (fp), &st) == 0 @@ -2304,7 +2282,7 @@ slurp_file (char *file, ptrdiff_t *size) } } - unbind_to (count, Qnil); + dynwind_end (); } return buf; @@ -2810,7 +2788,7 @@ xbm_read_bitmap_data (struct frame *f, unsigned char *contents, unsigned char *e } bytes_per_line = (*width + 7) / 8 + padding_p; nbytes = bytes_per_line * *height; - p = *data = xmalloc (nbytes); + p = *data = xmalloc_atomic (nbytes); if (v10) { @@ -3709,7 +3687,8 @@ xpm_load (struct frame *f, struct image *img) #endif /* HAVE_NTGUI */ /* Remember allocated colors. */ - img->colors = xnmalloc (attrs.nalloc_pixels, sizeof *img->colors); + img->colors = xnmalloc_atomic (attrs.nalloc_pixels, + sizeof *img->colors); img->ncolors = attrs.nalloc_pixels; for (i = 0; i < attrs.nalloc_pixels; ++i) { @@ -4504,7 +4483,7 @@ colors_in_color_table (int *n) } else { - colors = xmalloc (ct_colors_allocated * sizeof *colors); + colors = xmalloc_atomic (ct_colors_allocated * sizeof *colors); *n = ct_colors_allocated; for (i = j = 0; i < CT_SIZE; ++i) @@ -5933,8 +5912,8 @@ png_load_body (struct frame *f, struct image *img, struct png_load_context *c) if (min (PTRDIFF_MAX, SIZE_MAX) / sizeof *rows < height || min (PTRDIFF_MAX, SIZE_MAX) / sizeof *pixels / height < row_bytes) memory_full (SIZE_MAX); - c->pixels = pixels = xmalloc (sizeof *pixels * row_bytes * height); - c->rows = rows = xmalloc (height * sizeof *rows); + c->pixels = pixels = xmalloc_atomic (sizeof *pixels * row_bytes * height); + c->rows = rows = xmalloc_atomic (height * sizeof *rows); for (i = 0; i < height; ++i) rows[i] = pixels + i * row_bytes; @@ -6453,7 +6432,6 @@ jpeg_file_src (j_decompress_ptr cinfo, FILE *fp) src->mgr.next_input_byte = NULL; } - /* Load image IMG for use on frame F. Patterned after example.c from the JPEG lib. */ @@ -7036,7 +7014,7 @@ tiff_load (struct frame *f, struct image *img) return 0; } - buf = xmalloc (sizeof *buf * width * height); + buf = xmalloc_atomic (sizeof *buf * width * height); rc = fn_TIFFReadRGBAImage (tiff, width, height, buf, 0); @@ -7242,7 +7220,11 @@ gif_image_p (Lisp_Object object) #ifdef WINDOWSNT /* GIF library details. */ +#if 5 < GIFLIB_MAJOR + (1 <= GIFLIB_MINOR) +DEF_IMGLIB_FN (int, DGifCloseFile, (GifFileType *, int *)); +#else DEF_IMGLIB_FN (int, DGifCloseFile, (GifFileType *)); +#endif DEF_IMGLIB_FN (int, DGifSlurp, (GifFileType *)); #if GIFLIB_MAJOR < 5 DEF_IMGLIB_FN (GifFileType *, DGifOpen, (void *, InputFunc)); @@ -7312,6 +7294,22 @@ gif_read_from_memory (GifFileType *file, GifByteType *buf, int len) return len; } +static int +gif_close (GifFileType *gif, int *err) +{ + int retval; + +#if 5 < GIFLIB_MAJOR + (1 <= GIFLIB_MINOR) + retval = fn_DGifCloseFile (gif, err); +#else + retval = fn_DGifCloseFile (gif); +#if GIFLIB_MAJOR >= 5 + if (err) + *err = gif->Error; +#endif +#endif + return retval; +} /* Load GIF image IMG for use on frame F. Value is true if successful. */ @@ -7336,9 +7334,7 @@ gif_load (struct frame *f, struct image *img) Lisp_Object specified_data = image_spec_value (img->spec, QCdata, NULL); unsigned long bgcolor = 0; EMACS_INT idx; -#if GIFLIB_MAJOR >= 5 int gif_err; -#endif if (NILP (specified_data)) { @@ -7406,7 +7402,7 @@ gif_load (struct frame *f, struct image *img) if (!check_image_size (f, gif->SWidth, gif->SHeight)) { image_error ("Invalid image size (see `max-image-size')", Qnil, Qnil); - fn_DGifCloseFile (gif); + gif_close (gif, NULL); return 0; } @@ -7415,7 +7411,7 @@ gif_load (struct frame *f, struct image *img) if (rc == GIF_ERROR || gif->ImageCount <= 0) { image_error ("Error reading `%s'", img->spec, Qnil); - fn_DGifCloseFile (gif); + gif_close (gif, NULL); return 0; } @@ -7427,7 +7423,7 @@ gif_load (struct frame *f, struct image *img) { image_error ("Invalid image number `%s' in image `%s'", image_number, img->spec); - fn_DGifCloseFile (gif); + gif_close (gif, NULL); return 0; } } @@ -7445,7 +7441,7 @@ gif_load (struct frame *f, struct image *img) if (!check_image_size (f, width, height)) { image_error ("Invalid image size (see `max-image-size')", Qnil, Qnil); - fn_DGifCloseFile (gif); + gif_close (gif, NULL); return 0; } @@ -7463,7 +7459,7 @@ gif_load (struct frame *f, struct image *img) && 0 <= subimg_left && subimg_left <= width - subimg_width)) { image_error ("Subimage does not fit in image", Qnil, Qnil); - fn_DGifCloseFile (gif); + gif_close (gif, NULL); return 0; } } @@ -7471,7 +7467,7 @@ gif_load (struct frame *f, struct image *img) /* Create the X image and pixmap. */ if (!image_create_x_image_and_pixmap (f, img, width, height, 0, &ximg, 0)) { - fn_DGifCloseFile (gif); + gif_close (gif, NULL); return 0; } @@ -7642,7 +7638,18 @@ gif_load (struct frame *f, struct image *img) Fcons (make_number (gif->ImageCount), img->lisp_data)); - fn_DGifCloseFile (gif); + if (gif_close (gif, &gif_err) == GIF_ERROR) + { +#if 5 <= GIFLIB_MAJOR + char *error_text = fn_GifErrorString (gif_err); + + if (error_text) + image_error ("Error closing `%s': %s", + img->spec, build_string (error_text)); +#else + image_error ("Error closing `%s'", img->spec, Qnil); +#endif + } /* Maybe fill in the background field while we have ximg handy. */ if (NILP (image_spec_value (img->spec, QCbackground, NULL))) @@ -8368,6 +8375,7 @@ imagemagick_load_image (struct frame *f, struct image *img, #endif /* HAVE_MAGICKEXPORTIMAGEPIXELS */ { size_t image_height; + MagickRealType color_scale = 65535.0 / QuantumRange; /* Try to create a x pixmap to hold the imagemagick pixmap. */ if (!image_create_x_image_and_pixmap (f, img, width, height, 0, @@ -8408,9 +8416,9 @@ imagemagick_load_image (struct frame *f, struct image *img, PixelGetMagickColor (pixels[x], &pixel); XPutPixel (ximg, x, y, lookup_rgb_color (f, - pixel.red, - pixel.green, - pixel.blue)); + color_scale * pixel.red, + color_scale * pixel.green, + color_scale * pixel.blue)); } } DestroyPixelIterator (iterator); @@ -8511,7 +8519,6 @@ and `imagemagick-types-inhibit'. */) ExceptionInfo ex; char **imtypes; size_t i; - Lisp_Object Qimagemagicktype; GetExceptionInfo(&ex); imtypes = GetMagickList ("*", &numf, &ex); @@ -8519,8 +8526,8 @@ and `imagemagick-types-inhibit'. */) for (i = 0; i < numf; i++) { - Qimagemagicktype = intern (imtypes[i]); - typelist = Fcons (Qimagemagicktype, typelist); + Lisp_Object imagemagicktype = intern (imtypes[i]); + typelist = Fcons (imagemagicktype, typelist); imtypes[i] = MagickRelinquishMemory (imtypes[i]); } @@ -9340,6 +9347,8 @@ reset_image_types (void) void syms_of_image (void) { +#include "image.x" + /* Initialize this only once; it will be reset before dumping. */ image_types = NULL; @@ -9473,21 +9482,6 @@ non-numeric, there is no explicit limit on the size of images. */); #endif /* HAVE_NTGUI */ #endif /* HAVE_RSVG */ - defsubr (&Sinit_image_library); -#ifdef HAVE_IMAGEMAGICK - defsubr (&Simagemagick_types); -#endif - defsubr (&Sclear_image_cache); - defsubr (&Simage_flush); - defsubr (&Simage_size); - defsubr (&Simage_mask_p); - defsubr (&Simage_metadata); - -#ifdef GLYPH_DEBUG - defsubr (&Simagep); - defsubr (&Slookup_image); -#endif - DEFVAR_BOOL ("cross-disabled-images", cross_disabled_images, doc: /* Non-nil means always draw a cross over disabled images. Disabled images are those having a `:conversion disabled' property.