From 8b3fce9b8ea2c995794cae985252785acdfb01d1 Mon Sep 17 00:00:00 2001 From: Vincent Povirk Date: Wed, 11 Apr 2012 16:01:58 -0500 Subject: [PATCH] windowscodecs: Implement JpegEncoder_Frame_WriteSource. --- dlls/windowscodecs/jpegformat.c | 70 ++++++++++++++++++++++++++++++++- 1 file changed, 68 insertions(+), 2 deletions(-) diff --git a/dlls/windowscodecs/jpegformat.c b/dlls/windowscodecs/jpegformat.c index 3a9b0955f4f..d15dabf0dd8 100644 --- a/dlls/windowscodecs/jpegformat.c +++ b/dlls/windowscodecs/jpegformat.c @@ -1064,8 +1064,74 @@ static HRESULT WINAPI JpegEncoder_Frame_WritePixels(IWICBitmapFrameEncode *iface static HRESULT WINAPI JpegEncoder_Frame_WriteSource(IWICBitmapFrameEncode *iface, IWICBitmapSource *pIBitmapSource, WICRect *prc) { - FIXME("(%p,%p,%p): stub\n", iface, pIBitmapSource, prc); - return E_NOTIMPL; + JpegEncoder *This = impl_from_IWICBitmapFrameEncode(iface); + HRESULT hr; + WICRect rc; + WICPixelFormatGUID guid; + UINT stride; + BYTE *pixeldata; + TRACE("(%p,%p,%p)\n", iface, pIBitmapSource, prc); + + if (!This->frame_initialized || !This->width || !This->height) + return WINCODEC_ERR_WRONGSTATE; + + if (!This->format) + { + hr = IWICBitmapSource_GetPixelFormat(pIBitmapSource, &guid); + if (FAILED(hr)) return hr; + hr = IWICBitmapFrameEncode_SetPixelFormat(iface, &guid); + if (FAILED(hr)) return hr; + } + + hr = IWICBitmapSource_GetPixelFormat(pIBitmapSource, &guid); + if (FAILED(hr)) return hr; + if (memcmp(&guid, This->format->guid, sizeof(GUID)) != 0) + { + /* FIXME: should use WICConvertBitmapSource to convert */ + ERR("format %s unsupported\n", debugstr_guid(&guid)); + return E_FAIL; + } + + if (This->xres == 0.0 || This->yres == 0.0) + { + double xres, yres; + hr = IWICBitmapSource_GetResolution(pIBitmapSource, &xres, &yres); + if (FAILED(hr)) return hr; + hr = IWICBitmapFrameEncode_SetResolution(iface, xres, yres); + if (FAILED(hr)) return hr; + } + + if (!prc) + { + UINT width, height; + hr = IWICBitmapSource_GetSize(pIBitmapSource, &width, &height); + if (FAILED(hr)) return hr; + rc.X = 0; + rc.Y = 0; + rc.Width = width; + rc.Height = height; + prc = &rc; + } + + if (prc->Width != This->width) return E_INVALIDARG; + + stride = (This->format->bpp * This->width + 7)/8; + + pixeldata = HeapAlloc(GetProcessHeap(), 0, stride * prc->Height); + if (!pixeldata) return E_OUTOFMEMORY; + + hr = IWICBitmapSource_CopyPixels(pIBitmapSource, prc, stride, + stride*prc->Height, pixeldata); + + if (SUCCEEDED(hr)) + { + hr = IWICBitmapFrameEncode_WritePixels(iface, prc->Height, stride, + stride*prc->Height, pixeldata); + } + + HeapFree(GetProcessHeap(), 0, pixeldata); + + return hr; } static HRESULT WINAPI JpegEncoder_Frame_Commit(IWICBitmapFrameEncode *iface)