This patch fixes the loading of jpeg images through OleLoadPicture According to MSDN, each scanline of a DIB has to be aligned on DWORD. Moreover BITMAPINFOHEADER says that colors should be BGR. These changes fix the SplashScreen of emule. Now it looks as it should. a+ Max ChangeLog: * Fixes scanline size in OLEPictureImpl_Load for jpeg * Convert from RGB to BGR according to BITMAPINFOHEADER MSDN documentation. -- Maxime Bellengà <maxime.bellenge@laposte.net>
Index: wine/dlls/oleaut32/olepicture.c =================================================================== RCS file: /home/wine/wine/dlls/oleaut32/olepicture.c,v retrieving revision 1.24 diff -u -r1.24 olepicture.c --- wine/dlls/oleaut32/olepicture.c 9 Jan 2003 06:04:33 -0000 1.24 +++ wine/dlls/oleaut32/olepicture.c 25 Apr 2003 16:19:46 -0000 @@ -5,6 +5,7 @@ * * Copyright 2000 Huw D M Davies for CodeWeavers. * Copyright 2001 Marcus Meissner + * Copyright 2003 Maxime Bellengé * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public @@ -990,11 +991,14 @@ struct jpeg_error_mgr jerr; int ret; JDIMENSION x; - JSAMPROW samprow; + JSAMPROW samprow,oldsamprow; BITMAPINFOHEADER bmi; LPBYTE bits; HDC hdcref; struct jpeg_source_mgr xjsm; + LPBYTE oldbits; + int padding; + int i; /* This is basically so we can use in-memory data for jpeg decompression. * We need to have all the functions. @@ -1011,25 +1015,38 @@ jpeg_create_decompress(&jd); jd.src = &xjsm; ret=jpeg_read_header(&jd,TRUE); + jd.out_color_space = JCS_RGB; jpeg_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); + bits = HeapAlloc(GetProcessHeap(),HEAP_ZERO_MEMORY, + (jd.output_height+1)*(jd.output_width+jd.output_width%sizeof(DWORD))*jd.output_components); samprow=HeapAlloc(GetProcessHeap(),HEAP_ZERO_MEMORY,jd.output_width*jd.output_components); + + oldbits = bits; + oldsamprow = samprow; + padding = jd.output_width%sizeof(DWORD); while ( jd.output_scanline<jd.output_height ) { x = jpeg_read_scanlines(&jd,&samprow,1); if (x != 1) { FIXME("failed to read current scanline?\n"); break; } - memcpy( bits+jd.output_scanline*jd.output_width*jd.output_components, - samprow, - jd.output_width*jd.output_components - ); + /* We have to convert from RGB to BGR, see MSDN/ BITMAPINFOHEADER */ + for(i=0;i<jd.output_width;i++,samprow+=3) { + *(bits++) = *(samprow+2); + *(bits++) = *(samprow+1); + *(bits++) = *(samprow); + } + memset(bits,0x00,padding); + bits += padding; + samprow = oldsamprow; } + bits = oldbits; + bmi.biSize = sizeof(bmi); bmi.biWidth = jd.output_width; bmi.biHeight = -jd.output_height;