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