olepicture: dlopen libungif and libjpeg

Huw D M Davies h.davies1 at physics.ox.ac.uk
Wed Aug 4 08:21:15 CDT 2004


        Huw Davies <huw at codeweavers.com>
        dlopen libungif and libjpeg
-- 
Huw Davies
huw at codeweavers.com
Index: configure.ac
===================================================================
RCS file: /home/wine/wine/configure.ac,v
retrieving revision 1.292
diff -u -r1.292 configure.ac
--- configure.ac	30 Jul 2004 18:54:32 -0000	1.292
+++ configure.ac	4 Aug 2004 13:17:17 -0000
@@ -145,24 +145,6 @@
 dnl Check for -lpthread
 AC_CHECK_LIB(pthread,pthread_create,AC_SUBST(LIBPTHREAD,"-lpthread"))
 
-JPEGLIB=""
-AC_SUBST(JPEGLIB)
-AC_CHECK_HEADERS(jpeglib.h,
-    AC_CHECK_LIB(jpeg,jpeg_start_decompress,
-    	AC_DEFINE(HAVE_LIBJPEG,1,[Define if you have libjpeg including devel headers])
-	JPEGLIB="-ljpeg"
-    )
-)
-
-AC_SUBST(GIFLIB,"")
-AC_CHECK_HEADERS(gif_lib.h,
-    AC_CHECK_LIB(ungif,DGifOpen,
-        [AC_DEFINE(HAVE_LIBGIF,1,[Define if you have libgif/libungif including devel headers])
-         GIFLIB="-lungif"],
-        [AC_CHECK_LIB(gif,DGifOpen,
-                      [AC_DEFINE(HAVE_LIBGIF,1)
-                       GIFLIB="-lgif"])]))
-
 AC_SUBST(XLIB)
 AC_SUBST(XFILES)
 XFILES=""
@@ -1031,6 +1013,8 @@
   WINE_GET_SONAME(crypto,BIO_new_socket)
   WINE_GET_SONAME(ncurses,waddch)
   WINE_GET_SONAME(curses,waddch)
+  WINE_GET_SONAME(jpeg,jpeg_start_decompress)
+  WINE_GET_SONAME(ungif,DGifOpen)
 fi
 
 
@@ -1108,9 +1092,11 @@
 	float.h \
 	fontconfig/fontconfig.h \
 	getopt.h \
+        gif_lib.h \
 	ieeefp.h \
 	io.h \
 	jack/jack.h \
+        jpeglib.h \
 	libio.h \
 	libutil.h \
 	link.h \
Index: dlls/oleaut32/Makefile.in
===================================================================
RCS file: /home/wine/wine/dlls/oleaut32/Makefile.in,v
retrieving revision 1.54
diff -u -r1.54 Makefile.in
--- dlls/oleaut32/Makefile.in	27 Jan 2004 00:11:16 -0000	1.54
+++ dlls/oleaut32/Makefile.in	4 Aug 2004 13:17:17 -0000
@@ -7,7 +7,7 @@
 IMPORTS   = ole32 rpcrt4 user32 gdi32 advapi32 kernel32 ntdll
 DELAYIMPORTS = comctl32
 ALTNAMES  = ole2disp.dll typelib.dll
-EXTRALIBS = $(LIBUNICODE) -luuid @GIFLIB@ @JPEGLIB@
+EXTRALIBS = $(LIBUNICODE) -luuid
 
 SPEC_SRCS16 = $(ALTNAMES:.dll=.spec)
 
Index: dlls/oleaut32/olepicture.c
===================================================================
RCS file: /home/wine/wine/dlls/oleaut32/olepicture.c,v
retrieving revision 1.33
diff -u -r1.33 olepicture.c
--- dlls/oleaut32/olepicture.c	10 May 2004 19:56:34 -0000	1.33
+++ dlls/oleaut32/olepicture.c	4 Aug 2004 13:17:17 -0000
@@ -49,6 +49,9 @@
  */
 #ifdef HAVE_GIF_LIB_H
 # include <gif_lib.h>
+#ifndef SONAME_LIBUNGIF
+#define SONAME_LIBUNGIF "libungif.so"
+#endif
 #endif
 
 #define NONAMELESSUNION
@@ -66,17 +69,19 @@
 
 #include "wine/wingdi16.h"
 #include "cursoricon.h"
+#include "wine/port.h"
 
-#ifdef HAVE_LIBJPEG
+#ifdef HAVE_JPEGLIB_H
 /* This is a hack, so jpeglib.h does not redefine INT32 and the like*/
 #define XMD_H
 #define UINT8 JPEG_UINT8
 #define UINT16 JPEG_UINT16
 #undef FAR
-#ifdef HAVE_JPEGLIB_H
 # include <jpeglib.h>
-#endif
 #undef UINT16
+#ifndef SONAME_LIBJPEG
+#define SONAME_LIBJPEG "libjpeg.so"
+#endif
 #endif
 
 WINE_DEFAULT_DEBUG_CHANNEL(ole);
@@ -825,7 +830,41 @@
   return E_NOTIMPL;
 }
 
-#ifdef HAVE_LIBJPEG
+#ifdef HAVE_JPEGLIB_H
+
+static void *libjpeg_handle;
+#define MAKE_FUNCPTR(f) static typeof(f) * p##f
+MAKE_FUNCPTR(jpeg_std_error);
+MAKE_FUNCPTR(jpeg_CreateDecompress);
+MAKE_FUNCPTR(jpeg_read_header);
+MAKE_FUNCPTR(jpeg_start_decompress);
+MAKE_FUNCPTR(jpeg_read_scanlines);
+MAKE_FUNCPTR(jpeg_finish_decompress);
+MAKE_FUNCPTR(jpeg_destroy_decompress);
+#undef MAKE_FUNCPTR
+
+static void *load_libjpeg(void)
+{
+    if((libjpeg_handle = wine_dlopen(SONAME_LIBJPEG, RTLD_NOW, NULL, 0)) != NULL) {
+
+#define LOAD_FUNCPTR(f) \
+    if((p##f = wine_dlsym(libjpeg_handle, #f, NULL, 0)) == NULL) { \
+        libjpeg_handle = NULL; \
+        return NULL; \
+    }
+
+        LOAD_FUNCPTR(jpeg_std_error);
+        LOAD_FUNCPTR(jpeg_CreateDecompress);
+        LOAD_FUNCPTR(jpeg_read_header);
+        LOAD_FUNCPTR(jpeg_start_decompress);
+        LOAD_FUNCPTR(jpeg_read_scanlines);
+        LOAD_FUNCPTR(jpeg_finish_decompress);
+        LOAD_FUNCPTR(jpeg_destroy_decompress);
+#undef LOAD_FUNCPTR
+    }
+    return libjpeg_handle;
+}
+
 /* for the jpeg decompressor source manager. */
 static void _jpeg_init_source(j_decompress_ptr cinfo) { }
 
@@ -845,15 +884,41 @@
     return FALSE;
 }
 static void _jpeg_term_source(j_decompress_ptr cinfo) { }
-#endif /* HAVE_LIBJPEG */
+#endif /* HAVE_JPEGLIB_H */
+
+#ifdef HAVE_GIF_LIB_H
+
+static void *libungif_handle;
+#define MAKE_FUNCPTR(f) static typeof(f) * p##f
+MAKE_FUNCPTR(DGifOpen);
+MAKE_FUNCPTR(DGifSlurp);
+MAKE_FUNCPTR(DGifCloseFile);
+#undef MAKE_FUNCPTR
 
-#ifdef HAVE_LIBGIF
 struct gifdata {
     unsigned char *data;
     unsigned int curoff;
     unsigned int len;
 };
 
+static void *load_libungif(void)
+{
+    if((libungif_handle = wine_dlopen(SONAME_LIBUNGIF, RTLD_NOW, NULL, 0)) != NULL) {
+
+#define LOAD_FUNCPTR(f) \
+    if((p##f = wine_dlsym(libungif_handle, #f, NULL, 0)) == NULL) { \
+        libungif_handle = NULL; \
+        return NULL; \
+    }
+
+        LOAD_FUNCPTR(DGifOpen);
+        LOAD_FUNCPTR(DGifSlurp);
+        LOAD_FUNCPTR(DGifCloseFile);
+#undef LOAD_FUNCPTR
+    }
+    return libungif_handle;
+}
+
 static int _gif_inputfunc(GifFileType *gif, GifByteType *data, int len) {
     struct gifdata *gd = (struct gifdata*)gif->UserData;
 
@@ -865,6 +930,8 @@
     gd->curoff += len;
     return len;
 }
+
+
 #endif
 
 /************************************************************************
@@ -875,7 +942,7 @@
  * 	DWORD magic;
  * 	DWORD len;
  *
- * Currently implemented: BITMAP, ICON, JPEG.
+ * Currently implemented: BITMAP, ICON, JPEG, GIF
  */
 static HRESULT WINAPI OLEPictureImpl_Load(IPersistStream* iface,IStream*pStm) {
   HRESULT	hr = E_FAIL;
@@ -930,7 +997,7 @@
   magic = xbuf[0] + (xbuf[1]<<8);
   switch (magic) {
   case 0x4947: { /* GIF */
-#ifdef HAVE_LIBGIF
+#ifdef HAVE_GIF_LIB_H
     struct gifdata 	gd;
     GifFileType 	*gif;
     BITMAPINFO		*bmi;
@@ -944,11 +1011,18 @@
     ExtensionBlock      *eb;
     int                 padding;
 
+    if(!libungif_handle) {
+        if(!load_libungif()) {
+            FIXME("Failed reading GIF because unable to find %s\n", SONAME_LIBUNGIF);
+            return E_FAIL;
+        }
+    }
+
     gd.data   = xbuf;
     gd.curoff = 0;
     gd.len    = xread;
-    gif = DGifOpen((void*)&gd, _gif_inputfunc);
-    ret = DGifSlurp(gif);
+    gif = pDGifOpen((void*)&gd, _gif_inputfunc);
+    ret = pDGifSlurp(gif);
     if (ret == GIF_ERROR) {
       FIXME("Failed reading GIF using libgif.\n");
       return E_FAIL;
@@ -1052,7 +1126,7 @@
     DeleteDC(hdcref);
     This->desc.picType = PICTYPE_BITMAP;
     OLEPictureImpl_SetBitmap(This);
-    DGifCloseFile(gif);
+    pDGifCloseFile(gif);
     HeapFree(GetProcessHeap(),0,bytes);
     return S_OK;
 #else
@@ -1062,7 +1136,7 @@
     break;
   }
   case 0xd8ff: { /* JPEG */
-#ifdef HAVE_LIBJPEG
+#ifdef HAVE_JPEGLIB_H
     struct jpeg_decompress_struct	jd;
     struct jpeg_error_mgr		jerr;
     int					ret;
@@ -1075,6 +1149,13 @@
     LPBYTE                              oldbits;
     int i;
 
+    if(!libjpeg_handle) {
+        if(!load_libjpeg()) {
+            FIXME("Failed reading JPEG because unable to find %s\n", SONAME_LIBJPEG);
+            return E_FAIL;
+        }
+    }
+
     /* This is basically so we can use in-memory data for jpeg decompression.
      * We need to have all the functions.
      */
@@ -1086,12 +1167,14 @@
     xjsm.resync_to_restart	= _jpeg_resync_to_restart;
     xjsm.term_source		= _jpeg_term_source;
 
-    jd.err = jpeg_std_error(&jerr);
-    jpeg_create_decompress(&jd);
+    jd.err = pjpeg_std_error(&jerr);
+    /* jpeg_create_decompress is a macro that expands to jpeg_CreateDecompress - see jpeglib.h
+     * jpeg_create_decompress(&jd); */
+    pjpeg_CreateDecompress(&jd, JPEG_LIB_VERSION, (size_t) sizeof(struct jpeg_decompress_struct));
     jd.src = &xjsm;
-    ret=jpeg_read_header(&jd,TRUE);
+    ret=pjpeg_read_header(&jd,TRUE);
     jd.out_color_space = JCS_RGB;
-    jpeg_start_decompress(&jd);
+    pjpeg_start_decompress(&jd);
     if (ret != JPEG_HEADER_OK) {
 	ERR("Jpeg image in stream has bad format, read header returned %d.\n",ret);
 	HeapFree(GetProcessHeap(),0,xbuf);
@@ -1105,7 +1188,7 @@
     oldbits = bits;
     oldsamprow = samprow;
     while ( jd.output_scanline<jd.output_height ) {
-      x = jpeg_read_scanlines(&jd,&samprow,1);
+      x = pjpeg_read_scanlines(&jd,&samprow,1);
       if (x != 1) {
 	FIXME("failed to read current scanline?\n");
 	break;
@@ -1134,8 +1217,8 @@
     bmi.biClrImportant	= 0;
 
     HeapFree(GetProcessHeap(),0,samprow);
-    jpeg_finish_decompress(&jd);
-    jpeg_destroy_decompress(&jd);
+    pjpeg_finish_decompress(&jd);
+    pjpeg_destroy_decompress(&jd);
     hdcref = GetDC(0);
     This->desc.u.bmp.hbitmap=CreateDIBitmap(
 	    hdcref,



More information about the wine-patches mailing list