windowscodecs: Fix *_CopyPixels functions to properly handle a NULL rectangle.
This commit is contained in:
parent
f8e4a0f3b9
commit
145bda5aa6
|
@ -850,11 +850,27 @@ static HRESULT WINAPI FormatConverter_CopyPixels(IWICFormatConverter *iface,
|
||||||
const WICRect *prc, UINT cbStride, UINT cbBufferSize, BYTE *pbBuffer)
|
const WICRect *prc, UINT cbStride, UINT cbBufferSize, BYTE *pbBuffer)
|
||||||
{
|
{
|
||||||
FormatConverter *This = (FormatConverter*)iface;
|
FormatConverter *This = (FormatConverter*)iface;
|
||||||
|
WICRect rc;
|
||||||
|
HRESULT hr;
|
||||||
TRACE("(%p,%p,%u,%u,%p)\n", iface, prc, cbStride, cbBufferSize, pbBuffer);
|
TRACE("(%p,%p,%u,%u,%p)\n", iface, prc, cbStride, cbBufferSize, pbBuffer);
|
||||||
|
|
||||||
if (This->source)
|
if (This->source)
|
||||||
|
{
|
||||||
|
if (!prc)
|
||||||
|
{
|
||||||
|
UINT width, height;
|
||||||
|
hr = IWICBitmapSource_GetSize(This->source, &width, &height);
|
||||||
|
if (FAILED(hr)) return hr;
|
||||||
|
rc.X = 0;
|
||||||
|
rc.Y = 0;
|
||||||
|
rc.Width = width;
|
||||||
|
rc.Height = height;
|
||||||
|
prc = &rc;
|
||||||
|
}
|
||||||
|
|
||||||
return This->dst_format->copy_function(This, prc, cbStride, cbBufferSize,
|
return This->dst_format->copy_function(This, prc, cbStride, cbBufferSize,
|
||||||
pbBuffer, This->src_format->format);
|
pbBuffer, This->src_format->format);
|
||||||
|
}
|
||||||
else
|
else
|
||||||
return WINCODEC_ERR_NOTINITIALIZED;
|
return WINCODEC_ERR_NOTINITIALIZED;
|
||||||
}
|
}
|
||||||
|
|
|
@ -140,6 +140,7 @@ static HRESULT WINAPI FlipRotator_CopyPixels(IWICBitmapFlipRotator *iface,
|
||||||
UINT y;
|
UINT y;
|
||||||
UINT srcy, srcwidth, srcheight;
|
UINT srcy, srcwidth, srcheight;
|
||||||
WICRect rc;
|
WICRect rc;
|
||||||
|
WICRect rect;
|
||||||
|
|
||||||
TRACE("(%p,%p,%u,%u,%p)\n", iface, prc, cbStride, cbBufferSize, pbBuffer);
|
TRACE("(%p,%p,%u,%u,%p)\n", iface, prc, cbStride, cbBufferSize, pbBuffer);
|
||||||
|
|
||||||
|
@ -155,6 +156,18 @@ static HRESULT WINAPI FlipRotator_CopyPixels(IWICBitmapFlipRotator *iface,
|
||||||
hr = IWICBitmapSource_GetSize(This->source, &srcwidth, &srcheight);
|
hr = IWICBitmapSource_GetSize(This->source, &srcwidth, &srcheight);
|
||||||
if (FAILED(hr)) return hr;
|
if (FAILED(hr)) return hr;
|
||||||
|
|
||||||
|
if (!prc)
|
||||||
|
{
|
||||||
|
UINT width, height;
|
||||||
|
hr = IWICBitmapSource_GetSize(iface, &width, &height);
|
||||||
|
if (FAILED(hr)) return hr;
|
||||||
|
rect.X = 0;
|
||||||
|
rect.Y = 0;
|
||||||
|
rect.Width = width;
|
||||||
|
rect.Height = height;
|
||||||
|
prc = ▭
|
||||||
|
}
|
||||||
|
|
||||||
for (y=prc->Y; y - prc->Y < prc->Height; y++)
|
for (y=prc->Y; y - prc->Y < prc->Height; y++)
|
||||||
{
|
{
|
||||||
if (This->flip_y)
|
if (This->flip_y)
|
||||||
|
|
|
@ -184,9 +184,21 @@ static HRESULT copy_interlaced_pixels(const BYTE *srcbuffer,
|
||||||
const BYTE *src;
|
const BYTE *src;
|
||||||
BYTE *dst;
|
BYTE *dst;
|
||||||
UINT y;
|
UINT y;
|
||||||
|
WICRect rect;
|
||||||
|
|
||||||
|
if (!rc)
|
||||||
|
{
|
||||||
|
rect.X = 0;
|
||||||
|
rect.Y = 0;
|
||||||
|
rect.Width = srcwidth;
|
||||||
|
rect.Height = srcheight;
|
||||||
|
rc = ▭
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
if (rc->X < 0 || rc->Y < 0 || rc->X+rc->Width > srcwidth || rc->Y+rc->Height > srcheight)
|
if (rc->X < 0 || rc->Y < 0 || rc->X+rc->Width > srcwidth || rc->Y+rc->Height > srcheight)
|
||||||
return E_INVALIDARG;
|
return E_INVALIDARG;
|
||||||
|
}
|
||||||
|
|
||||||
if (dststride < rc->Width)
|
if (dststride < rc->Width)
|
||||||
return E_INVALIDARG;
|
return E_INVALIDARG;
|
||||||
|
|
|
@ -519,8 +519,24 @@ static HRESULT WINAPI JpegDecoder_Frame_CopyPixels(IWICBitmapFrameDecode *iface,
|
||||||
UINT data_size;
|
UINT data_size;
|
||||||
UINT max_row_needed;
|
UINT max_row_needed;
|
||||||
jmp_buf jmpbuf;
|
jmp_buf jmpbuf;
|
||||||
|
WICRect rect;
|
||||||
TRACE("(%p,%p,%u,%u,%p)\n", iface, prc, cbStride, cbBufferSize, pbBuffer);
|
TRACE("(%p,%p,%u,%u,%p)\n", iface, prc, cbStride, cbBufferSize, pbBuffer);
|
||||||
|
|
||||||
|
if (!prc)
|
||||||
|
{
|
||||||
|
rect.X = 0;
|
||||||
|
rect.Y = 0;
|
||||||
|
rect.Width = This->cinfo.output_width;
|
||||||
|
rect.Height = This->cinfo.output_height;
|
||||||
|
prc = ▭
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
if (prc->X < 0 || prc->Y < 0 || prc->X+prc->Width > This->cinfo.output_width ||
|
||||||
|
prc->Y+prc->Height > This->cinfo.output_height)
|
||||||
|
return E_INVALIDARG;
|
||||||
|
}
|
||||||
|
|
||||||
if (This->cinfo.out_color_space == JCS_GRAYSCALE) bpp = 8;
|
if (This->cinfo.out_color_space == JCS_GRAYSCALE) bpp = 8;
|
||||||
else if (This->cinfo.out_color_space == JCS_CMYK) bpp = 32;
|
else if (This->cinfo.out_color_space == JCS_CMYK) bpp = 32;
|
||||||
else bpp = 24;
|
else bpp = 24;
|
||||||
|
|
|
@ -53,9 +53,21 @@ HRESULT copy_pixels(UINT bpp, const BYTE *srcbuffer,
|
||||||
{
|
{
|
||||||
UINT bytesperrow;
|
UINT bytesperrow;
|
||||||
UINT row_offset; /* number of bits into the source rows where the data starts */
|
UINT row_offset; /* number of bits into the source rows where the data starts */
|
||||||
|
WICRect rect;
|
||||||
|
|
||||||
|
if (!rc)
|
||||||
|
{
|
||||||
|
rect.X = 0;
|
||||||
|
rect.Y = 0;
|
||||||
|
rect.Width = srcwidth;
|
||||||
|
rect.Height = srcheight;
|
||||||
|
rc = ▭
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
if (rc->X < 0 || rc->Y < 0 || rc->X+rc->Width > srcwidth || rc->Y+rc->Height > srcheight)
|
if (rc->X < 0 || rc->Y < 0 || rc->X+rc->Width > srcwidth || rc->Y+rc->Height > srcheight)
|
||||||
return E_INVALIDARG;
|
return E_INVALIDARG;
|
||||||
|
}
|
||||||
|
|
||||||
bytesperrow = ((bpp * rc->Width)+7)/8;
|
bytesperrow = ((bpp * rc->Width)+7)/8;
|
||||||
|
|
||||||
|
|
|
@ -799,12 +799,24 @@ static HRESULT WINAPI TiffFrameDecode_CopyPixels(IWICBitmapFrameDecode *iface,
|
||||||
HRESULT hr=S_OK;
|
HRESULT hr=S_OK;
|
||||||
BYTE *dst_tilepos;
|
BYTE *dst_tilepos;
|
||||||
UINT bytesperrow;
|
UINT bytesperrow;
|
||||||
|
WICRect rect;
|
||||||
|
|
||||||
TRACE("(%p,%p,%u,%u,%p)\n", iface, prc, cbStride, cbBufferSize, pbBuffer);
|
TRACE("(%p,%p,%u,%u,%p)\n", iface, prc, cbStride, cbBufferSize, pbBuffer);
|
||||||
|
|
||||||
|
if (!prc)
|
||||||
|
{
|
||||||
|
rect.X = 0;
|
||||||
|
rect.Y = 0;
|
||||||
|
rect.Width = This->decode_info.width;
|
||||||
|
rect.Height = This->decode_info.height;
|
||||||
|
prc = ▭
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
if (prc->X < 0 || prc->Y < 0 || prc->X+prc->Width > This->decode_info.width ||
|
if (prc->X < 0 || prc->Y < 0 || prc->X+prc->Width > This->decode_info.width ||
|
||||||
prc->Y+prc->Height > This->decode_info.height)
|
prc->Y+prc->Height > This->decode_info.height)
|
||||||
return E_INVALIDARG;
|
return E_INVALIDARG;
|
||||||
|
}
|
||||||
|
|
||||||
bytesperrow = ((This->decode_info.bpp * prc->Width)+7)/8;
|
bytesperrow = ((This->decode_info.bpp * prc->Width)+7)/8;
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue