Subject: Re: bug#51381: HEIF image format support

From: Alan Third <[email-masked]>
Date: Fri, 26 Nov 2021 13:02:28 +0000

On Wed, Oct 27, 2021 at 05:13:17PM +0100, Alan Third wrote:
> 
> FWIW NSImage (on macOS) is already capable of loading an heic file, if
> we just point it to it. I thought all we needed to do is add heic to
> ns_can_use_native_image_api in nsimage.m and then load an image with
> the type of "heic" or whatever, but it doesn't work and I'm not sure
> what else I need to do. Probably define heic as a type elsewhere.

Patch attached. I'm not entirely sure this won't break anything, so
testing on a platform that already supports heif files would probably
be a good idea.

It doesn't support any of the interesting features of heif, for
example it doesn't allow you to view multiple images (like an animated
gif), but I have a suspicion the IM/GM code won't support that anyway,
so no great loss.
-- 
Alan Third
>From b12846cadfa052e222a7b026868e66a5a897a65a Mon Sep 17 00:00:00 2001
From: Alan Third <[email-masked]>
Date: Fri, 26 Nov 2021 12:54:07 +0000
Subject: [PATCH] Add native HEIC support on macOS (bug#51381)

* lisp/image.el (image-type-header-regexps):
(image-type-file-name-regexps):
(image-type-auto-detectable): Add auto-detect code for heic.
* src/image.c (syms_of_image): Add heic as an image type under NS.
* src/nsimage.m (ns_can_use_native_image_api): Add heic to list of
possible image types in the native image support lookup.
---
 lisp/image.el | 7 ++++---
 src/image.c   | 5 +++++
 src/nsimage.m | 2 ++
 3 files changed, 11 insertions(+), 3 deletions(-)

diff --git a/lisp/image.el b/lisp/image.el
index edbf6c54df..1321560575 100644
--- a/lisp/image.el
+++ b/lisp/image.el
@@ -56,7 +56,7 @@ image-type-header-regexps
 		"\\(?:!DOCTYPE[ \t\r\n]+[^>]*>[ \t\r\n]*<[ \t\r\n]*" comment-re "*\\)?"
 		"[Ss][Vv][Gg]"))
      . svg)
-    )
+    ("\\`....ftyp\\(heic\\|heix\\|hevc\\|heim\\|heis\\|hevm\\|hevs\\|mif1\\|msf1\\)" . heic))
   "Alist of (REGEXP . IMAGE-TYPE) pairs used to auto-detect image types.
 When the first bytes of an image file match REGEXP, it is assumed to
 be of image type IMAGE-TYPE if IMAGE-TYPE is a symbol.  If not a symbol,
@@ -76,7 +76,7 @@ image-type-file-name-regexps
     ("\\.ps\\'" . postscript)
     ("\\.tiff?\\'" . tiff)
     ("\\.svgz?\\'" . svg)
-    )
+    ("\\.hei[cf]s?\\'" . heic))
   "Alist of (REGEXP . IMAGE-TYPE) pairs used to identify image files.
 When the name of an image file match REGEXP, it is assumed to
 be of image type IMAGE-TYPE.")
@@ -95,7 +95,8 @@ image-type-auto-detectable
     (tiff . maybe)
     (svg . maybe)
     (webp . maybe)
-    (postscript . nil))
+    (postscript . nil)
+    (heic . maybe))
   "Alist of (IMAGE-TYPE . AUTODETECT) pairs used to auto-detect image files.
 \(See `image-type-auto-detected-p').
 
diff --git a/src/image.c b/src/image.c
index f2597f529d..e94a22caf7 100644
--- a/src/image.c
+++ b/src/image.c
@@ -11320,6 +11320,11 @@ syms_of_image (void)
 #endif /* HAVE_NTGUI  */
 #endif /* HAVE_RSVG  */
 
+#ifdef HAVE_NS
+  DEFSYM (Qheic, "heic");
+  add_image_type (Qheic);
+#endif
+
 #if HAVE_NATIVE_IMAGE_API
   DEFSYM (Qnative_image, "native-image");
 # ifdef HAVE_NTGUI
diff --git a/src/nsimage.m b/src/nsimage.m
index dd2bb3b0d7..98efc9c6c0 100644
--- a/src/nsimage.m
+++ b/src/nsimage.m
@@ -76,6 +76,8 @@ Updated by Christian Limpach ([email-masked])
     imageType = @"public.tiff";
   else if (EQ (type, Qsvg))
     imageType = @"public.svg-image";
+  else if (EQ (type, Qheic))
+    imageType = @"public.heic";
 
   /* NSImage also supports a host of other types such as PDF and BMP,
      but we don't yet support these in image.c.  */
-- 
2.32.0