]> git.eshelyaron.com Git - emacs.git/commitdiff
Fix WebP support on MS-Windows
authorEli Zaretskii <eliz@gnu.org>
Fri, 22 Oct 2021 12:41:00 +0000 (15:41 +0300)
committerEli Zaretskii <eliz@gnu.org>
Fri, 22 Oct 2021 12:41:00 +0000 (15:41 +0300)
* src/image.c (WebPDecodeRGBA, WebPDecodeRGB, WebPFree): Use
correct names and argument lists in DEF_DLL_FN; fix typos.
(WebPGetFeaturesInternal): Load this instead of WebPGetFeatures,
which is a static inline function in webp/decode.h.
(WebPGetFeatures): Redirect to call WebPGetFeaturesInternal.

* lisp/term/w32-win.el (dynamic-library-alist): Fix the name of
the WebP symbol.

* configure.ac (HAVE_WEBP): Fix detection of libwebp on MinGW.

* nt/INSTALL.W64:
* nt/INSTALL: Update information about libwebp availability.

configure.ac
lisp/term/w32-win.el
nt/INSTALL
nt/INSTALL.W64
src/image.c

index d091866b8724853cb69a50aaef612e0a13292ced..86928c839345063bc3d0f675a9461200403b9770 100644 (file)
@@ -2590,23 +2590,23 @@ if test "${HAVE_X11}" = "yes" || test "${HAVE_NS}" = "yes" || test "${opsys}" =
 fi
 
 ### Use -lwebp if available, unless '--with-webp=no'
-### mingw32 doesn't use -lwebp, since it loads the library dynamically.
 HAVE_WEBP=no
 if test "${with_webp}" != "no"; then
-   if test "$opsys" = mingw32; then
-      AC_CHECK_HEADER([webp/decode.h], [HAVE_WEBP=yes])
-   elif test "${HAVE_X11}" = "yes" || test "${HAVE_W32}" = "yes" \
-         || test "${HAVE_NS}" = "yes"; then
+   if test "${HAVE_X11}" = "yes" || test "${opsys}" = "mingw32" \
+   || test "${HAVE_W32}" = "yes" || test "${HAVE_NS}" = "yes"; then
       WEBP_REQUIRED=0.6.0
       WEBP_MODULE="libwebp >= $WEBP_REQUIRED"
 
       EMACS_CHECK_MODULES([WEBP], [$WEBP_MODULE])
       AC_SUBST(WEBP_CFLAGS)
       AC_SUBST(WEBP_LIBS)
-
-      if test $HAVE_WEBP = yes; then
-        AC_DEFINE(HAVE_WEBP, 1, [Define to 1 if using libwebp.])
-        CFLAGS="$CFLAGS $WEBP_CFLAGS"
+   fi
+   if test $HAVE_WEBP = yes; then
+      AC_DEFINE(HAVE_WEBP, 1, [Define to 1 if using libwebp.])
+      CFLAGS="$CFLAGS $WEBP_CFLAGS"
+      # Windows loads libwebp dynamically
+      if test "${opsys}" = "mingw32"; then
+       WEBP_LIBS=
       fi
    fi
 fi
index 366992cbbf018c41f2822aac1265b70469aa6275..8b745c495d51010c7adbacf8fab29ab99bdfd5bd 100644 (file)
@@ -274,7 +274,7 @@ See the documentation of `create-fontset-from-fontset-spec' for the format.")
             '(gif "libgif-6.dll" "giflib5.dll" "gif.dll")
         '(gif "libgif-5.dll" "giflib4.dll" "libungif4.dll" "libungif.dll")))
        '(svg "librsvg-2-2.dll")
-       '(libwebp "libwebp-7.dll" "libwebp.dll")
+       '(webp "libwebp-7.dll" "libwebp.dll")
        '(gdk-pixbuf "libgdk_pixbuf-2.0-0.dll")
        '(glib "libglib-2.0-0.dll")
        '(gio "libgio-2.0-0.dll")
index a39057c66c6c20d449c279584fb36c9a5e415cda..5a76f5bdedaae163c060b643690eadf780352796 100644 (file)
@@ -737,10 +737,18 @@ build will run on Windows 9X and newer systems).
   without it by specifying the --without-rsvg switch to the configure
   script.
 
-  For WebP images you will need libwebp:
+  For WebP images you will need libwebp.  You can find it here:
+
+    http://sourceforge.net/projects/ezwinports/files/
+
+  Note: the MS-Windows binary distribution on the Google site:
 
     https://developers.google.com/speed/webp/
 
+  were compiled by MSVC, and include only static libraries, no DLLs.
+  So you cannot use that to build Emacs with WebP support on
+  MS-Windows, as that needs libwebp as a DLL.
+
   Binaries for the other image libraries can be found on the
   ezwinports site or at the GnuWin32 project (the latter are generally
   very old, so not recommended).  Note specifically that, due to some
index 8f0d0c9528faa632e84dcc8b7e91abb2299c09cd..c3845d5b17753b7a7e1d1af7e755202370dacd1c 100644 (file)
@@ -51,6 +51,7 @@ packages (you can copy and paste it into the shell with Shift + Insert):
   mingw-w64-x86_64-libpng \
   mingw-w64-x86_64-libjpeg-turbo \
   mingw-w64-x86_64-librsvg \
+  mingw-w64-x86_64-libwebp \
   mingw-w64-x86_64-lcms2 \
   mingw-w64-x86_64-jansson \
   mingw-w64-x86_64-libxml2 \
index fe0bb509c58132f2627f1171f399600430cb5a24..308dc687260b3827c5653c79131e531ec83fbfc5 100644 (file)
@@ -8802,10 +8802,15 @@ webp_image_p (Lisp_Object object)
 /* WebP library details.  */
 
 DEF_DLL_FN (int, WebPGetInfo, (const uint8_t *, size_t, int *, int *));
-DEF_DLL_FN (VP8StatusCode, WebPGetFeatures, (const uint8_t *, size_t, WebPBitstreamFeatures *));
+/* WebPGetFeatures is a static inline function defined in WebP's
+   decode.h.  Since we cannot use that with dynamically-loaded libwebp
+   DLL, we instead load the internal function it calls and redirect to
+   that through a macro.  */
+DEF_DLL_FN (VP8StatusCode, WebPGetFeaturesInternal,
+           (const uint8_t *, size_t, WebPBitstreamFeatures *, int));
+DEF_DLL_FN (uint8_t *, WebPDecodeRGBA, (const uint8_t *, size_t, int *, int *));
 DEF_DLL_FN (uint8_t *, WebPDecodeRGB, (const uint8_t *, size_t, int *, int *));
-DEF_DLL_FN (uint8_t *, WebPDecodeBGR, (const uint8_t *, size_t, int *, int *));
-DEF_DLL_FN (void, WebPFreeDecBuffer (WebPDecBuffer *));
+DEF_DLL_FN (void, WebPFree, (void *));
 
 static bool
 init_webp_functions (void)
@@ -8816,7 +8821,7 @@ init_webp_functions (void)
     return false;
 
   LOAD_DLL_FN (library, WebPGetInfo);
-  LOAD_DLL_FN (library, WebPGetFeatures);
+  LOAD_DLL_FN (library, WebPGetFeaturesInternal);
   LOAD_DLL_FN (library, WebPDecodeRGBA);
   LOAD_DLL_FN (library, WebPDecodeRGB);
   LOAD_DLL_FN (library, WebPFree);
@@ -8830,7 +8835,8 @@ init_webp_functions (void)
 #undef WebPFree
 
 #define WebPGetInfo fn_WebPGetInfo
-#define WebPGetFeatures fn_WebPGetFeatures
+#define WebPGetFeatures(d,s,f)                                 \
+  fn_WebPGetFeaturesInternal(d,s,f,WEBP_DECODER_ABI_VERSION)
 #define WebPDecodeRGBA fn_WebPDecodeRGBA
 #define WebPDecodeRGB fn_WebPDecodeRGB
 #define WebPFree fn_WebPFree