Vincent Povirk : oleaut32: Use WIC to decode JPEG images.
Alexandre Julliard
julliard at winehq.org
Tue Sep 1 11:05:46 CDT 2009
Module: wine
Branch: master
Commit: 0ac2a855ce4e7cb83201fbe598eefb8ee8a57fa5
URL: http://source.winehq.org/git/wine.git/?a=commit;h=0ac2a855ce4e7cb83201fbe598eefb8ee8a57fa5
Author: Vincent Povirk <vincent at codeweavers.com>
Date: Mon Aug 31 17:06:53 2009 -0500
oleaut32: Use WIC to decode JPEG images.
---
dlls/oleaut32/olepicture.c | 178 +-------------------------------------------
1 files changed, 1 insertions(+), 177 deletions(-)
diff --git a/dlls/oleaut32/olepicture.c b/dlls/oleaut32/olepicture.c
index b4def3a..f3e7789 100644
--- a/dlls/oleaut32/olepicture.c
+++ b/dlls/oleaut32/olepicture.c
@@ -46,21 +46,6 @@
#include <stdio.h>
#include <string.h>
-#ifdef SONAME_LIBJPEG
-/* 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
-#define boolean jpeg_boolean
-#undef HAVE_STDLIB_H
-# include <jpeglib.h>
-#undef HAVE_STDLIB_H
-#define HAVE_STDLIB_H 1
-#undef UINT8
-#undef UINT16
-#undef boolean
-#endif
-
#ifdef HAVE_PNG_H
#include <png.h>
#endif
@@ -1002,167 +987,6 @@ static HRESULT WINAPI OLEPictureImpl_IsDirty(
return E_NOTIMPL;
}
-#ifdef SONAME_LIBJPEG
-
-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) { }
-
-static jpeg_boolean _jpeg_fill_input_buffer(j_decompress_ptr cinfo) {
- ERR("(), should not get here.\n");
- return FALSE;
-}
-
-static void _jpeg_skip_input_data(j_decompress_ptr cinfo,long num_bytes) {
- TRACE("Skipping %ld bytes...\n", num_bytes);
- cinfo->src->next_input_byte += num_bytes;
- cinfo->src->bytes_in_buffer -= num_bytes;
-}
-
-static jpeg_boolean _jpeg_resync_to_restart(j_decompress_ptr cinfo, int desired) {
- ERR("(desired=%d), should not get here.\n",desired);
- return FALSE;
-}
-static void _jpeg_term_source(j_decompress_ptr cinfo) { }
-#endif /* SONAME_LIBJPEG */
-
-static HRESULT OLEPictureImpl_LoadJpeg(OLEPictureImpl *This, BYTE *xbuf, ULONG xread)
-{
-#ifdef SONAME_LIBJPEG
- struct jpeg_decompress_struct jd;
- struct jpeg_error_mgr jerr;
- int ret;
- JDIMENSION x;
- JSAMPROW samprow,oldsamprow;
- BITMAPINFOHEADER bmi;
- LPBYTE bits;
- HDC hdcref;
- struct jpeg_source_mgr xjsm;
- LPBYTE oldbits;
- unsigned int i;
-
- if(!libjpeg_handle) {
- if(!load_libjpeg()) {
- ERR("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.
- */
- xjsm.next_input_byte = xbuf;
- xjsm.bytes_in_buffer = xread;
- xjsm.init_source = _jpeg_init_source;
- xjsm.fill_input_buffer = _jpeg_fill_input_buffer;
- xjsm.skip_input_data = _jpeg_skip_input_data;
- xjsm.resync_to_restart = _jpeg_resync_to_restart;
- xjsm.term_source = _jpeg_term_source;
-
- 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, sizeof(struct jpeg_decompress_struct));
- jd.src = &xjsm;
- ret=pjpeg_read_header(&jd,TRUE);
- jd.out_color_space = JCS_RGB;
- 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);
- return E_FAIL;
- }
-
- bits = HeapAlloc(GetProcessHeap(),HEAP_ZERO_MEMORY,
- (jd.output_height+1) * ((jd.output_width*jd.output_components + 3) & ~3) );
- samprow=HeapAlloc(GetProcessHeap(),HEAP_ZERO_MEMORY,jd.output_width*jd.output_components);
-
- oldbits = bits;
- oldsamprow = samprow;
- while ( jd.output_scanline<jd.output_height ) {
- x = pjpeg_read_scanlines(&jd,&samprow,1);
- if (x != 1) {
- ERR("failed to read current scanline?\n");
- break;
- }
- /* We have to convert from RGB to BGR, see MSDN/ BITMAPINFOHEADER */
- for(i=0;i<jd.output_width;i++,samprow+=jd.output_components) {
- *(bits++) = *(samprow+2);
- *(bits++) = *(samprow+1);
- *(bits++) = *(samprow);
- }
- bits = (LPBYTE)(((UINT_PTR)bits + 3) & ~3);
- samprow = oldsamprow;
- }
- bits = oldbits;
-
- bmi.biSize = sizeof(bmi);
- bmi.biWidth = jd.output_width;
- bmi.biHeight = -jd.output_height;
- bmi.biPlanes = 1;
- bmi.biBitCount = jd.output_components<<3;
- bmi.biCompression = BI_RGB;
- bmi.biSizeImage = jd.output_height*jd.output_width*jd.output_components;
- bmi.biXPelsPerMeter = 0;
- bmi.biYPelsPerMeter = 0;
- bmi.biClrUsed = 0;
- bmi.biClrImportant = 0;
-
- HeapFree(GetProcessHeap(),0,samprow);
- pjpeg_finish_decompress(&jd);
- pjpeg_destroy_decompress(&jd);
- hdcref = GetDC(0);
- This->desc.u.bmp.hbitmap=CreateDIBitmap(
- hdcref,
- &bmi,
- CBM_INIT,
- bits,
- (BITMAPINFO*)&bmi,
- DIB_RGB_COLORS
- );
- ReleaseDC(0, hdcref);
- This->desc.picType = PICTYPE_BITMAP;
- OLEPictureImpl_SetBitmap(This);
- HeapFree(GetProcessHeap(),0,bits);
- return S_OK;
-#else
- ERR("Trying to load JPEG picture, but JPEG supported not compiled in.\n");
- return E_FAIL;
-#endif
-}
-
static HRESULT OLEPictureImpl_LoadDIB(OLEPictureImpl *This, BYTE *xbuf, ULONG xread)
{
BITMAPFILEHEADER *bfh = (BITMAPFILEHEADER*)xbuf;
@@ -1891,7 +1715,7 @@ static HRESULT WINAPI OLEPictureImpl_Load(IPersistStream* iface,IStream*pStm) {
hr = OLEPictureImpl_LoadWICDecoder(This, &CLSID_WICGifDecoder, xbuf, xread);
break;
case BITMAP_FORMAT_JPEG: /* JPEG */
- hr = OLEPictureImpl_LoadJpeg(This, xbuf, xread);
+ hr = OLEPictureImpl_LoadWICDecoder(This, &CLSID_WICJpegDecoder, xbuf, xread);
break;
case BITMAP_FORMAT_BMP: /* Bitmap */
hr = OLEPictureImpl_LoadDIB(This, xbuf, xread);
More information about the wine-cvs
mailing list