From mboxrd@z Thu Jan 1 00:00:00 1970 Path: news.gmane.org!not-for-mail From: Lars Magne Ingebrigtsen Newsgroups: gmane.emacs.devel Subject: Re: image-size Date: Thu, 20 Jun 2013 14:18:34 +0200 Organization: Programmerer Ingebrigtsen Message-ID: References: NNTP-Posting-Host: plane.gmane.org Mime-Version: 1.0 Content-Type: multipart/mixed; boundary="=-=-=" X-Trace: ger.gmane.org 1371730741 23350 80.91.229.3 (20 Jun 2013 12:19:01 GMT) X-Complaints-To: usenet@ger.gmane.org NNTP-Posting-Date: Thu, 20 Jun 2013 12:19:01 +0000 (UTC) To: emacs-devel@gnu.org Original-X-From: emacs-devel-bounces+ged-emacs-devel=m.gmane.org@gnu.org Thu Jun 20 14:19:02 2013 Return-path: Envelope-to: ged-emacs-devel@m.gmane.org Original-Received: from lists.gnu.org ([208.118.235.17]) by plane.gmane.org with esmtp (Exim 4.69) (envelope-from ) id 1UpdpM-0004Zd-V6 for ged-emacs-devel@m.gmane.org; Thu, 20 Jun 2013 14:19:01 +0200 Original-Received: from localhost ([::1]:57443 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1UpdpM-00064Q-Dp for ged-emacs-devel@m.gmane.org; Thu, 20 Jun 2013 08:19:00 -0400 Original-Received: from eggs.gnu.org ([2001:4830:134:3::10]:52551) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1UpdpF-00061g-0q for emacs-devel@gnu.org; Thu, 20 Jun 2013 08:18:57 -0400 Original-Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1Updp9-0007aW-Tz for emacs-devel@gnu.org; Thu, 20 Jun 2013 08:18:52 -0400 Original-Received: from plane.gmane.org ([80.91.229.3]:44787) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1Updp9-0007aO-JH for emacs-devel@gnu.org; Thu, 20 Jun 2013 08:18:47 -0400 Original-Received: from list by plane.gmane.org with local (Exim 4.69) (envelope-from ) id 1Updp7-00043D-E1 for emacs-devel@gnu.org; Thu, 20 Jun 2013 14:18:45 +0200 Original-Received: from cm-84.215.51.58.getinternet.no ([84.215.51.58]) by main.gmane.org with esmtp (Gmexim 0.1 (Debian)) id 1AlnuQ-0007hv-00 for ; Thu, 20 Jun 2013 14:18:45 +0200 Original-Received: from larsi by cm-84.215.51.58.getinternet.no with local (Gmexim 0.1 (Debian)) id 1AlnuQ-0007hv-00 for ; Thu, 20 Jun 2013 14:18:45 +0200 X-Injected-Via-Gmane: http://gmane.org/ Mail-Followup-To: emacs-devel@gnu.org Original-Lines: 166 Original-X-Complaints-To: usenet@ger.gmane.org X-Gmane-NNTP-Posting-Host: cm-84.215.51.58.getinternet.no Face: iVBORw0KGgoAAAANSUhEUgAAADAAAAAwBAMAAAClLOS0AAAAJFBMVEX5sRrZeREOGGUQDlMb LnsOKIJgQ0ERBSguNGyqXhUNIHQKI4H4MXR5AAACQUlEQVQ4jVWTPYvbQBCGZ0t1u41h20AI+Epz OCRtDKnNbXNq4kZCrcVp89GFFCm1jWDqIxzYnY04uP1zeWcl2fLbSJpH87k75EQPX2ZyLo/xRM5N aDP8gAfIBcD49fdf/C32G/CwgtYfk30OtisP1at6IAL69LbyTQH59fcBbCmPvYvuebB3IPeJPFIU nZK9LAoufL2Rwh7hAX3wsHPXAZf1H2llm8Dbuil/GNOZAF7XQygBZ180RmUZBVNUpX9/yQGHHWXK KMMM8DSBN2QgUjviQMEi/QQQaUdEmkIAL0o/gdembEkkgLrS349g3RTJbgJbTYtOkgwgRaKMg7Em oPufI/DFN7IclCYAqWuP+RIG6YuWFAd4MGtj0LzLAfJTU2gJpQwctNHI7qJ4nMfcpCxbY2gE8QqQ nI2eg2rogkXBAGyuHlmreARo/Z+7ADWCzswBQmXSSnIwaVg5zuMs5WbSClt7BalBTQrza62VXgBy JO9lJBguU4auUe+iKusYJVSaFbFmBqh0V/m9eMQe062kLLuQ3BrTfYoJ5C+oVynGbC0bC/ArRozd OZTVZppbklExct8lj1zK2lGb4WBVcvCw5+P1KXSWTjBUcNjjOkuOPiKJHK6tKrk9SOHSSHqJVSKL HJVEykcgsXDlhFCXIl3BK9agYdmQ0ktNl/2AS1ocse+TYQJn2UBsGnS8AfHFj/ocbwGWKunT+Jlf QHyWdb4bP/oZmKufyj0cjrf2ARyg5XKGZDvp7XCE/d2g5eAp4D/r7+FFmxZ3QgAAAABJRU5ErkJg gg== Mail-Copies-To: never X-Now-Playing: Various's _This May Be My Last Time Singing (3)_: "Deacon Williams + The Golder Stars - I Went To The House" User-Agent: Gnus/5.130008 (Ma Gnus v0.8) Emacs/24.3.50 (gnu/linux) Cancel-Lock: sha1:HSu65qkQWkv1dmRt3qfZdACearg= X-detected-operating-system: by eggs.gnu.org: Genre and OS details not recognized. X-Received-From: 80.91.229.3 X-BeenThere: emacs-devel@gnu.org X-Mailman-Version: 2.1.14 Precedence: list List-Id: "Emacs development discussions." List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: emacs-devel-bounces+ged-emacs-devel=m.gmane.org@gnu.org Original-Sender: emacs-devel-bounces+ged-emacs-devel=m.gmane.org@gnu.org Xref: news.gmane.org gmane.emacs.devel:160743 Archived-At: --=-=-= Content-Type: text/plain Er, whaddayou know. I implemented this (patch below), and reading 9gag via ssh is now a lot faster. Does the patch look ok? --=-=-= Content-Type: text/x-diff Content-Disposition: inline; filename=size.patch === modified file 'src/image.c' --- src/image.c 2013-05-12 19:17:04 +0000 +++ src/image.c 2013-06-20 12:17:20 +0000 @@ -876,6 +876,33 @@ } +#if defined (HAVE_IMAGEMAGICK) +void +imagemagick_image_size (unsigned char *contents, size_t size, + char *filename, + size_t *width, size_t *height); + +static void +fast_image_size (Lisp_Object spec, size_t *width, size_t *height) +{ + Lisp_Object filename, data; + + *width = -1; + *height = -1; + + filename = Fplist_get (Fcdr (spec), QCfile); + if (! NILP (filename)) { + imagemagick_image_size (NULL, 0, SSDATA (x_find_image_file (filename)), + width, height); + return; + } + + data = Fplist_get (Fcdr (spec), QCdata); + if (! NILP (data)) + imagemagick_image_size (SDATA (data), SBYTES (data), NULL, width, height); +} +#endif + DEFUN ("image-size", Fimage_size, Simage_size, 1, 3, 0, doc: /* Return the size of image SPEC as pair (WIDTH . HEIGHT). PIXELS non-nil means return the size in pixels, otherwise return the @@ -884,26 +911,33 @@ or omitted means use the selected frame. */) (Lisp_Object spec, Lisp_Object pixels, Lisp_Object frame) { - Lisp_Object size; + Lisp_Object size = Qnil; - size = Qnil; - if (valid_image_p (spec)) - { - 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; - int height = img->height + 2 * img->vmargin; - - if (NILP (pixels)) - size = Fcons (make_float ((double) width / FRAME_COLUMN_WIDTH (f)), - make_float ((double) height / FRAME_LINE_HEIGHT (f))); - else - size = Fcons (make_number (width), make_number (height)); - } - else + if (! valid_image_p (spec)) error ("Invalid image specification"); +#if defined (HAVE_IMAGEMAGICK) + if (! NILP (pixels)) { + size_t width, height; + fast_image_size (spec, &width, &height); + return Fcons (make_number (width), make_number (height)); + } +#endif + + { + struct frame *f = decode_window_system_frame (frame); + ptrdiff_t id = lookup_image (f, spec); + struct image *img = IMAGE_FROM_ID (f, id); + size_t width = img->width + 2 * img->hmargin; + size_t height = img->height + 2 * img->vmargin; + + if (NILP (pixels)) + size = Fcons (make_float ((double) width / FRAME_COLUMN_WIDTH (f)), + make_float ((double) height / FRAME_LINE_HEIGHT (f))); + else + size = Fcons (make_number (width), make_number (height)); + } + return size; } @@ -7616,6 +7650,52 @@ description = (char *) MagickRelinquishMemory (description); } +/* Return the size of an image that's either contained in contents or + filename. If we couldn't read the image, return -1 as the + width/height. */ + +void +imagemagick_image_size (unsigned char *contents, size_t size, + char *filename, + size_t *width, size_t *height) +{ + MagickWand *image_wand, *ping_wand; + + *width = -1; + *height = -1; + + /* Initialize the imagemagick environment. */ + MagickWandGenesis (); + ping_wand = NewMagickWand (); + + if ((filename + ? MagickPingImage (ping_wand, filename) + : MagickPingImageBlob (ping_wand, contents, size)) + == MagickFalse) + { + imagemagick_error (ping_wand); + DestroyMagickWand (ping_wand); + return; + } + + DestroyMagickWand (ping_wand); + image_wand = NewMagickWand (); + + if ((filename + ? MagickReadImage (image_wand, filename) + : MagickReadImageBlob (image_wand, contents, size)) + == MagickFalse) + { + imagemagick_error (image_wand); + } else { + *height = MagickGetImageHeight (image_wand); + *width = MagickGetImageWidth (image_wand); + } + + DestroyMagickWand (image_wand); + MagickWandTerminus (); +} + /* Helper function for imagemagick_load, which does the actual loading given contents and size, apart from frame and image structures, passed from imagemagick_load. Uses librimagemagick to do most of --=-=-= Content-Type: text/plain -- (domestic pets only, the antidote for overdose, milk.) bloggy blog http://lars.ingebrigtsen.no/ --=-=-=--