- Fix scanline size in OLEPictureImpl_Load for jpeg
- Convert from RGB to BGR according to BITMAPINFOHEADER documentation.
This commit is contained in:
parent
4eae772f89
commit
3270641c60
|
@ -990,11 +990,13 @@ static HRESULT WINAPI OLEPictureImpl_Load(IPersistStream* iface,IStream*pStm) {
|
||||||
struct jpeg_error_mgr jerr;
|
struct jpeg_error_mgr jerr;
|
||||||
int ret;
|
int ret;
|
||||||
JDIMENSION x;
|
JDIMENSION x;
|
||||||
JSAMPROW samprow;
|
JSAMPROW samprow,oldsamprow;
|
||||||
BITMAPINFOHEADER bmi;
|
BITMAPINFOHEADER bmi;
|
||||||
LPBYTE bits;
|
LPBYTE bits;
|
||||||
HDC hdcref;
|
HDC hdcref;
|
||||||
struct jpeg_source_mgr xjsm;
|
struct jpeg_source_mgr xjsm;
|
||||||
|
LPBYTE oldbits;
|
||||||
|
int i;
|
||||||
|
|
||||||
/* This is basically so we can use in-memory data for jpeg decompression.
|
/* This is basically so we can use in-memory data for jpeg decompression.
|
||||||
* We need to have all the functions.
|
* We need to have all the functions.
|
||||||
|
@ -1011,25 +1013,37 @@ static HRESULT WINAPI OLEPictureImpl_Load(IPersistStream* iface,IStream*pStm) {
|
||||||
jpeg_create_decompress(&jd);
|
jpeg_create_decompress(&jd);
|
||||||
jd.src = &xjsm;
|
jd.src = &xjsm;
|
||||||
ret=jpeg_read_header(&jd,TRUE);
|
ret=jpeg_read_header(&jd,TRUE);
|
||||||
|
jd.out_color_space = JCS_RGB;
|
||||||
jpeg_start_decompress(&jd);
|
jpeg_start_decompress(&jd);
|
||||||
if (ret != JPEG_HEADER_OK) {
|
if (ret != JPEG_HEADER_OK) {
|
||||||
ERR("Jpeg image in stream has bad format, read header returned %d.\n",ret);
|
ERR("Jpeg image in stream has bad format, read header returned %d.\n",ret);
|
||||||
HeapFree(GetProcessHeap(),0,xbuf);
|
HeapFree(GetProcessHeap(),0,xbuf);
|
||||||
return E_FAIL;
|
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_components + 3) & ~3) );
|
||||||
samprow=HeapAlloc(GetProcessHeap(),HEAP_ZERO_MEMORY,jd.output_width*jd.output_components);
|
samprow=HeapAlloc(GetProcessHeap(),HEAP_ZERO_MEMORY,jd.output_width*jd.output_components);
|
||||||
|
|
||||||
|
oldbits = bits;
|
||||||
|
oldsamprow = samprow;
|
||||||
while ( jd.output_scanline<jd.output_height ) {
|
while ( jd.output_scanline<jd.output_height ) {
|
||||||
x = jpeg_read_scanlines(&jd,&samprow,1);
|
x = jpeg_read_scanlines(&jd,&samprow,1);
|
||||||
if (x != 1) {
|
if (x != 1) {
|
||||||
FIXME("failed to read current scanline?\n");
|
FIXME("failed to read current scanline?\n");
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
memcpy( bits+jd.output_scanline*jd.output_width*jd.output_components,
|
/* We have to convert from RGB to BGR, see MSDN/ BITMAPINFOHEADER */
|
||||||
samprow,
|
for(i=0;i<jd.output_width;i++,samprow+=jd.output_components) {
|
||||||
jd.output_width*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.biSize = sizeof(bmi);
|
||||||
bmi.biWidth = jd.output_width;
|
bmi.biWidth = jd.output_width;
|
||||||
bmi.biHeight = -jd.output_height;
|
bmi.biHeight = -jd.output_height;
|
||||||
|
|
Loading…
Reference in New Issue