* bug#21714: 25.0.50; image-metadata using Emacs --with-ns prevents *.gif animation. @ 2015-10-19 16:29 Keith David Bershatsky 2015-10-19 23:40 ` Xue Fuqiao 2017-08-13 0:58 ` bug#21714: [PATCH] Add multiframe image support to NS port (bug#21714) Alan Third 0 siblings, 2 replies; 9+ messages in thread From: Keith David Bershatsky @ 2015-10-19 16:29 UTC (permalink / raw) To: 21714 When using Emacs built --with-ns on OSX 10.6.8, the function `image-metadata` returns `nil` when trying to animate a *.gif file with the built-in image-mode by pressing the return key. I suspect it is because `valid_image_p` returns `nil`, but I do not know how to test that internal function. When opening a *.gif image, Emacs successfully displays the first image in the series of multiple images. Pressing the return key yields: "No image animation." OSX has its own built-in image support when building --with-ns, which is why I am able to see the first of the *.gif images. (image-type-available-p 'gif) returns t, so I am fairly certain I have image support. Animation works on Emacs for Windows, but not OSX. Thanks, Keith ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; In GNU Emacs 25.0.50.1 (x86_64-apple-darwin10.8.0, NS appkit-1038.36 Version 10.6.8 (Build 10K549)) of 2015-10-13 Repository revision: 6d6bf466477b004035a4314886e35214c6f8603b Windowing system distributor 'Apple', version 10.3.1038 Configured using: 'configure --with-ns --without-imagemagick --enable-checking=glyphs' Configured features: RSVG DBUS ACL LIBXML2 ZLIB TOOLKIT_SCROLL_BARS NS Important settings: locale-coding-system: utf-8-unix Major mode: C Minor modes in effect: tb-mode: t sb-mode: t ml-mode: t sd-mode: t fl-mode: t bc-mode: t +-mode: t buffer-read-only: t abbrev-mode: t Recent messages: Type C-c C-c to view the image as text. Wrote /Users/HOME/.0.data/.0.emacs/.lock Emacs: image-metadata *beep* if: End of buffer Load-path shadows: None found. Features: (shadow emacsbug sendmail lawlist-ztree lawlist-ys lawlist-ws lawlist-wl elmo-imap4 elmo-localdir modb-standard modb-legacy elmo-internal elmo-flag mmelmo-imap mmelmo-buffer elsp-generic mel-u ps-print ps-def lpr epg-config enriched lawlist-w3m doc-view jka-compr image-mode ccl lawlist-vl lawlist-view lawlist-undo lawlist-txt lawlist-tm lawlist-tex compare-w lawlist-tabbar lawlist-speedbar lawlist-shell info esh-groups ehelp ange-ftp lawlist-sgml lawlist-sb lawlist-saveplace lawlist-ruler lawlist-replace lawlist-rectangle lawlist-re-builder lawlist-python skeleton lawlist-profiler lawlist-print lawlist-php cl-seq cc-langs lawlist-perl lawlist-parens lawlist-org lawlist-calendar org-agenda org org-macro org-footnote org-pcomplete org-list org-faces org-entities org-version ob-emacs-lisp ob ob-tangle ob-ref ob-lob ob-table ob-exp org-src ob-keys ob-comint ob-core ob-eval org-compat org-macs org-loaddefs find-func holidays hol-loaddefs cal-menu calendar cal-loaddefs lawlist-neotree lawlist-movement lawlist-mouse lawlist-ml lawlist-misc lawlist-messages lawlist-mc rect lawlist-markdown noutline outline lawlist-lorem lawlist-ln lawlist-keymap lawlist-js cc-mode cc-fonts cc-guess cc-menus cc-cmds cc-styles cc-align cc-engine cc-vars cc-defs lawlist-ispell lawlist-isearch lawlist-imenu lawlist-ibuffer lawlist-hl lawlist-grep lawlist-git ido seq vc-git vc vc-dispatcher thingatpt time-stamp subr-x server nntp gnus-group gnus-undo gnus-start gnus-cloud nnimap nnmail mail-source tls utf7 netrc parse-time gnus-spec gnus-int gnus-range gnus-win nnoo mm-view mml-smime smime dig mailcap log-edit message mml mml-sec mm-decode mm-bodies mm-encode gmm-utils mailheader pcvs-util add-log ldap json find-lisp ediff-merg ediff-wind ediff-diff ediff-mult ediff-help ediff-init ediff-util ediff diff-mode conf-mode autorevert filenotify lawlist-framebufs lawlist-frame lawlist-fm lawlist-files zeroconf dbus xml lawlist-env lawlist-elscreen lawlist-elisp lawlist-dv lawlist-image lawlist-ds lawlist-dired dired format-spec lawlist-diff lawlist-desktop frameset lawlist-debug lawlist-window debug lawlist-css smie lawlist-compile rx lawlist-color lawlist-cm lawlist-cc lawlist-font-lock cl-macs lawlist-calc lawlist-calc+ lawlist-bk lawlist-bc lawlist-bbdb gnus gnus-ems nnheader mail-utils wid-edit mail-parse rfc2231 rfc2047 rfc2045 ietf-drums mailabbrev mail-extr rfc822 timezone lawlist-minibuffer gv lawlist-auth gnus-util mm-util help-fns mail-prsvr password-cache lawlist-as lawlist-archive lawlist-+ lawlist-lcl byte-opt bytecomp byte-compile cl-extra cconv lawlist-help disp-table easy-mmode edmacro kmacro quail help-mode easymenu cl-loaddefs cl-lib pcase derived advice shell pcomplete comint ansi-color ring savehist time-date mule-util tooltip eldoc electric uniquify ediff-hook vc-hooks lisp-float-type mwheel ns-win term/common-win tool-bar dnd fontset image regexp-opt fringe tabulated-list newcomment elisp-mode lisp-mode prog-mode register page menu-bar rfn-eshadow timer select scroll-bar mouse jit-lock font-lock syntax facemenu font-core frame cl-generic cham georgian utf-8-lang misc-lang vietnamese tibetan thai tai-viet lao korean japanese eucjp-ms cp51932 hebrew greek romanian slovak czech european ethiopic indian cyrillic chinese charscript case-table epa-hook jka-cmpr-hook help simple abbrev minibuffer cl-preloaded nadvice loaddefs button faces cus-face macroexp files text-properties overlay sha1 md5 base64 format env code-pages mule custom widget hashtable-print-readable backquote dbusbind cocoa ns multi-tty make-network-process emacs) Memory information: ((conses 16 2395843 198980) (symbols 48 89769 0) (miscs 40 1373 1067) (strings 32 212905 17549) (string-bytes 1 7685690) (vectors 16 44361) (vector-slots 8 1091868 14715) (floats 8 4334 755) (intervals 56 1101 110) (buffers 976 15)) ^ permalink raw reply [flat|nested] 9+ messages in thread
* bug#21714: 25.0.50; image-metadata using Emacs --with-ns prevents *.gif animation. 2015-10-19 16:29 bug#21714: 25.0.50; image-metadata using Emacs --with-ns prevents *.gif animation Keith David Bershatsky @ 2015-10-19 23:40 ` Xue Fuqiao 2017-08-13 0:58 ` bug#21714: [PATCH] Add multiframe image support to NS port (bug#21714) Alan Third 1 sibling, 0 replies; 9+ messages in thread From: Xue Fuqiao @ 2015-10-19 23:40 UTC (permalink / raw) To: Keith David Bershatsky; +Cc: 21714 On Tue, Oct 20, 2015 at 12:29 AM, Keith David Bershatsky <esq@lawlist.com> wrote: > When opening a *.gif image, Emacs successfully displays the first image in the series of multiple images. Pressing the return key yields: "No image animation." Yes, I can reproduce this problem on OS X 10.11 with Emacs master. Configured features: ACL LIBXML2 ZLIB TOOLKIT_SCROLL_BARS NS ^ permalink raw reply [flat|nested] 9+ messages in thread
* bug#21714: [PATCH] Add multiframe image support to NS port (bug#21714) 2015-10-19 16:29 bug#21714: 25.0.50; image-metadata using Emacs --with-ns prevents *.gif animation Keith David Bershatsky 2015-10-19 23:40 ` Xue Fuqiao @ 2017-08-13 0:58 ` Alan Third 2017-08-13 13:21 ` npostavs 2017-08-14 16:02 ` Charles A. Roelli 1 sibling, 2 replies; 9+ messages in thread From: Alan Third @ 2017-08-13 0:58 UTC (permalink / raw) To: Keith David Bershatsky; +Cc: 21714 * src/nsimage.m (image_spec_value): New function. (ns_load_image): Handle multiple frames. (EmacsImage::getMetadata, EmacsImage::setFrame): New function. * src/nsterm.h (EmacsImage::getMetadata, EmacsImage::setFrame): New function prototypes. --- src/nsimage.m | 79 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ src/nsterm.h | 2 ++ 2 files changed, 81 insertions(+) diff --git a/src/nsimage.m b/src/nsimage.m index fb2322afc3..6717202199 100644 --- a/src/nsimage.m +++ b/src/nsimage.m @@ -70,12 +70,38 @@ Updated by Christian Limpach (chris@nice.ch) return [EmacsImage allocInitFromFile: file]; } +static Lisp_Object +image_spec_value (Lisp_Object spec, Lisp_Object key, bool *found) +{ + Lisp_Object tail; + + eassert (valid_image_p (spec)); + + for (tail = XCDR (spec); + CONSP (tail) && CONSP (XCDR (tail)); + tail = XCDR (XCDR (tail))) + { + if (EQ (XCAR (tail), key)) + { + if (found) + *found = 1; + return XCAR (XCDR (tail)); + } + } + + if (found) + *found = 0; + return Qnil; +} + bool ns_load_image (struct frame *f, struct image *img, Lisp_Object spec_file, Lisp_Object spec_data) { EmacsImage *eImg = nil; NSSize size; + Lisp_Object lisp_index = image_spec_value (img->spec, QCindex, NULL); + unsigned int index = INTEGERP (lisp_index) ? XFASTINT (lisp_index) : 0; NSTRACE ("ns_load_image"); @@ -99,12 +125,20 @@ Updated by Christian Limpach (chris@nice.ch) return 0; } + if (index < 0 || ![eImg setFrame: index]) + { + add_to_log ("Unable to set index %d for image %s", index, img->spec); + return 0; + } + size = [eImg size]; img->width = size.width; img->height = size.height; /* 4) set img->pixmap = emacsimage */ img->pixmap = eImg; + + img->lisp_data = [eImg getMetadata]; return 1; } @@ -435,4 +469,49 @@ - (NSColor *)stippleMask return stippleMask; } +/* If the image has multiple frames, get a count of them and the + animation delay, if available. */ +- (Lisp_Object)getMetadata +{ + Lisp_Object metadata = Qnil; + + for (NSImageRep * r in [self representations]) + { + if ([r isKindOfClass:[NSBitmapImageRep class]]) + { + NSBitmapImageRep * bm = (NSBitmapImageRep *)r; + int frames = [[bm valueForProperty: NSImageFrameCount] intValue]; + float delay = [[bm valueForProperty: NSImageCurrentFrameDuration] + floatValue]; + + if (frames > 1) + metadata = Fcons (Qcount, Fcons (make_number (frames), metadata)); + if (delay > 0) + metadata = Fcons (Qdelay, Fcons (make_float (delay), metadata)); + break; + } + } + return metadata; +} + +/* Attempt to set the animation frame to be displayed. */ +- (BOOL)setFrame: (unsigned int) index +{ + for (NSImageRep * r in [self representations]) + { + if ([r isKindOfClass:[NSBitmapImageRep class]]) + { + NSBitmapImageRep * bm = (NSBitmapImageRep *)r; + if ([[bm valueForProperty: NSImageFrameCount] intValue] <= index) + continue; + + [bm setProperty: NSImageCurrentFrame + withValue: [NSNumber numberWithUnsignedInt: index]]; + return YES; + } + } + + return NO; +} + @end diff --git a/src/nsterm.h b/src/nsterm.h index 0f1b36db7b..67c0d42ac1 100644 --- a/src/nsterm.h +++ b/src/nsterm.h @@ -668,6 +668,8 @@ typedef id instancetype; alpha:(unsigned char)a; - (void)setAlphaAtX: (int)x Y: (int)y to: (unsigned char)a; - (NSColor *)stippleMask; +- (Lisp_Object)getMetadata; +- (BOOL)setFrame: (unsigned int) index; @end -- Animated gif support, and I expect it to handle tiff with multiple layers, or whatever. -- Alan Third ^ permalink raw reply related [flat|nested] 9+ messages in thread
* bug#21714: [PATCH] Add multiframe image support to NS port (bug#21714) 2017-08-13 0:58 ` bug#21714: [PATCH] Add multiframe image support to NS port (bug#21714) Alan Third @ 2017-08-13 13:21 ` npostavs 2017-08-13 13:37 ` Alan Third 2017-08-14 16:02 ` Charles A. Roelli 1 sibling, 1 reply; 9+ messages in thread From: npostavs @ 2017-08-13 13:21 UTC (permalink / raw) To: Alan Third; +Cc: Keith David Bershatsky, 21714 Alan Third <alan@idiocy.org> writes: > +static Lisp_Object > +image_spec_value (Lisp_Object spec, Lisp_Object key, bool *found) > +{ > + Lisp_Object tail; > + > + eassert (valid_image_p (spec)); > + > + for (tail = XCDR (spec); > + CONSP (tail) && CONSP (XCDR (tail)); > + tail = XCDR (XCDR (tail))) > + { > + if (EQ (XCAR (tail), key)) > + { > + if (found) > + *found = 1; > + return XCAR (XCDR (tail)); > + } > + } Wouldn't it be clearer to call Fplist_get here? ^ permalink raw reply [flat|nested] 9+ messages in thread
* bug#21714: [PATCH] Add multiframe image support to NS port (bug#21714) 2017-08-13 13:21 ` npostavs @ 2017-08-13 13:37 ` Alan Third 2017-08-13 13:54 ` npostavs 0 siblings, 1 reply; 9+ messages in thread From: Alan Third @ 2017-08-13 13:37 UTC (permalink / raw) To: npostavs; +Cc: Keith David Bershatsky, 21714 On Sun, Aug 13, 2017 at 09:21:44AM -0400, npostavs@users.sourceforge.net wrote: > Alan Third <alan@idiocy.org> writes: > > > +static Lisp_Object > > +image_spec_value (Lisp_Object spec, Lisp_Object key, bool *found) > > +{ > > + Lisp_Object tail; > > + > > + eassert (valid_image_p (spec)); > > + > > + for (tail = XCDR (spec); > > + CONSP (tail) && CONSP (XCDR (tail)); > > + tail = XCDR (XCDR (tail))) > > + { > > + if (EQ (XCAR (tail), key)) > > + { > > + if (found) > > + *found = 1; > > + return XCAR (XCDR (tail)); > > + } > > + } > > Wouldn't it be clearer to call Fplist_get here? Yes I think it would. I actually just copied the code from image.c, so would it maybe be worth tidying up that code too? Thanks! -- Alan Third ^ permalink raw reply [flat|nested] 9+ messages in thread
* bug#21714: [PATCH] Add multiframe image support to NS port (bug#21714) 2017-08-13 13:37 ` Alan Third @ 2017-08-13 13:54 ` npostavs 2017-08-13 14:56 ` Alan Third 0 siblings, 1 reply; 9+ messages in thread From: npostavs @ 2017-08-13 13:54 UTC (permalink / raw) To: Alan Third; +Cc: Keith David Bershatsky, 21714 Alan Third <alan@idiocy.org> writes: > On Sun, Aug 13, 2017 at 09:21:44AM -0400, npostavs@users.sourceforge.net wrote: >> Alan Third <alan@idiocy.org> writes: >> >> > +static Lisp_Object >> > +image_spec_value (Lisp_Object spec, Lisp_Object key, bool *found) >> > +{ >> > + Lisp_Object tail; >> > + >> > + eassert (valid_image_p (spec)); >> > + >> > + for (tail = XCDR (spec); >> > + CONSP (tail) && CONSP (XCDR (tail)); >> > + tail = XCDR (XCDR (tail))) >> > + { >> > + if (EQ (XCAR (tail), key)) >> > + { >> > + if (found) >> > + *found = 1; >> > + return XCAR (XCDR (tail)); >> > + } >> > + } >> >> Wouldn't it be clearer to call Fplist_get here? Actually we would need Fplist_member to set the 'found' parameter correctly in case the value is Qnil. Hmm, that one can signal an error, so potentially it's not the right thing. > Yes I think it would. I actually just copied the code from image.c, so > would it maybe be worth tidying up that code too? Oh, maybe we should make it non-static and call it rather than copying then? ^ permalink raw reply [flat|nested] 9+ messages in thread
* bug#21714: [PATCH] Add multiframe image support to NS port (bug#21714) 2017-08-13 13:54 ` npostavs @ 2017-08-13 14:56 ` Alan Third 0 siblings, 0 replies; 9+ messages in thread From: Alan Third @ 2017-08-13 14:56 UTC (permalink / raw) To: npostavs; +Cc: Keith David Bershatsky, 21714 On Sun, Aug 13, 2017 at 09:54:39AM -0400, npostavs@users.sourceforge.net wrote: > Alan Third <alan@idiocy.org> writes: > > > On Sun, Aug 13, 2017 at 09:21:44AM -0400, npostavs@users.sourceforge.net wrote: > >> Alan Third <alan@idiocy.org> writes: > >> > >> > +static Lisp_Object > >> > +image_spec_value (Lisp_Object spec, Lisp_Object key, bool *found) > >> > +{ > >> > + Lisp_Object tail; > >> > + > >> > + eassert (valid_image_p (spec)); > >> > + > >> > + for (tail = XCDR (spec); > >> > + CONSP (tail) && CONSP (XCDR (tail)); > >> > + tail = XCDR (XCDR (tail))) > >> > + { > >> > + if (EQ (XCAR (tail), key)) > >> > + { > >> > + if (found) > >> > + *found = 1; > >> > + return XCAR (XCDR (tail)); > >> > + } > >> > + } > >> > >> Wouldn't it be clearer to call Fplist_get here? > > Actually we would need Fplist_member to set the 'found' parameter > correctly in case the value is Qnil. Hmm, that one can signal an error, > so potentially it's not the right thing. In this particular case I’m not using the found parameter anyway so Fplist_get will work fine. -- Alan Third ^ permalink raw reply [flat|nested] 9+ messages in thread
* bug#21714: [PATCH] Add multiframe image support to NS port (bug#21714) 2017-08-13 0:58 ` bug#21714: [PATCH] Add multiframe image support to NS port (bug#21714) Alan Third 2017-08-13 13:21 ` npostavs @ 2017-08-14 16:02 ` Charles A. Roelli 2017-08-16 20:27 ` Alan Third 1 sibling, 1 reply; 9+ messages in thread From: Charles A. Roelli @ 2017-08-14 16:02 UTC (permalink / raw) To: Alan Third; +Cc: esq, 21714 Thanks for adding this feature. It's working on my end. ^ permalink raw reply [flat|nested] 9+ messages in thread
* bug#21714: [PATCH] Add multiframe image support to NS port (bug#21714) 2017-08-14 16:02 ` Charles A. Roelli @ 2017-08-16 20:27 ` Alan Third 0 siblings, 0 replies; 9+ messages in thread From: Alan Third @ 2017-08-16 20:27 UTC (permalink / raw) To: Charles A. Roelli; +Cc: esq, 21714-done On Mon, Aug 14, 2017 at 06:02:26PM +0200, Charles A. Roelli wrote: > Thanks for adding this feature. It's working on my end. Thanks. It’s pushed to master now. -- Alan Third ^ permalink raw reply [flat|nested] 9+ messages in thread
end of thread, other threads:[~2017-08-16 20:27 UTC | newest] Thread overview: 9+ messages (download: mbox.gz follow: Atom feed -- links below jump to the message on this page -- 2015-10-19 16:29 bug#21714: 25.0.50; image-metadata using Emacs --with-ns prevents *.gif animation Keith David Bershatsky 2015-10-19 23:40 ` Xue Fuqiao 2017-08-13 0:58 ` bug#21714: [PATCH] Add multiframe image support to NS port (bug#21714) Alan Third 2017-08-13 13:21 ` npostavs 2017-08-13 13:37 ` Alan Third 2017-08-13 13:54 ` npostavs 2017-08-13 14:56 ` Alan Third 2017-08-14 16:02 ` Charles A. Roelli 2017-08-16 20:27 ` Alan Third
Code repositories for project(s) associated with this external index https://git.savannah.gnu.org/cgit/emacs.git https://git.savannah.gnu.org/cgit/emacs/org-mode.git This is an external index of several public inboxes, see mirroring instructions on how to clone and mirror all data and code used by this external index.