static HRESULT WINAPI BitmapClipper_Initialize(IWICBitmapClipper *iface, IWICBitmapSource *source, const WICRect *rc) { BitmapClipper *This = impl_from_IWICBitmapClipper(iface); UINT width, height; HRESULT hr = S_OK; TRACE("(%p,%p,%s)\n", iface, source, debug_wic_rect(rc)); EnterCriticalSection(&This->lock); if (This->source) { hr = WINCODEC_ERR_WRONGSTATE; goto end; } hr = IWICBitmapSource_GetSize(source, &width, &height); if (FAILED(hr)) goto end; if ((rc->X + rc->Width > width) || (rc->Y + rc->Height > height)) { hr = E_INVALIDARG; goto end; } This->rect = *rc; This->source = source; IWICBitmapSource_AddRef(This->source); end: LeaveCriticalSection(&This->lock); return hr; }
static HRESULT WINAPI FlipRotator_Initialize(IWICBitmapFlipRotator *iface, IWICBitmapSource *pISource, WICBitmapTransformOptions options) { FlipRotator *This = impl_from_IWICBitmapFlipRotator(iface); HRESULT hr=S_OK; TRACE("(%p,%p,%u)\n", iface, pISource, options); EnterCriticalSection(&This->lock); if (This->source) { hr = WINCODEC_ERR_WRONGSTATE; goto end; } if (options&WICBitmapTransformRotate90) { This->swap_xy = 1; This->flip_x = !This->flip_x; } if (options&WICBitmapTransformRotate180) { This->flip_x = !This->flip_x; This->flip_y = !This->flip_y; } if (options&WICBitmapTransformFlipHorizontal) This->flip_x = !This->flip_x; if (options&WICBitmapTransformFlipVertical) This->flip_y = !This->flip_y; IWICBitmapSource_AddRef(pISource); This->source = pISource; end: LeaveCriticalSection(&This->lock); return hr; }
HRESULT WINAPI WICSetEncoderFormat_Proxy(IWICBitmapSource *pSourceIn, IWICPalette *pIPalette, IWICBitmapFrameEncode *pIFrameEncode, IWICBitmapSource **ppSourceOut) { HRESULT hr; WICPixelFormatGUID pixelformat, framepixelformat; TRACE("%p,%p,%p,%p\n", pSourceIn, pIPalette, pIFrameEncode, ppSourceOut); if (pIPalette) FIXME("ignoring palette\n"); if (!pSourceIn || !pIFrameEncode || !ppSourceOut) return E_INVALIDARG; *ppSourceOut = NULL; hr = IWICBitmapSource_GetPixelFormat(pSourceIn, &pixelformat); if (SUCCEEDED(hr)) { framepixelformat = pixelformat; hr = IWICBitmapFrameEncode_SetPixelFormat(pIFrameEncode, &framepixelformat); } if (SUCCEEDED(hr)) { if (IsEqualGUID(&pixelformat, &framepixelformat)) { *ppSourceOut = pSourceIn; IWICBitmapSource_AddRef(pSourceIn); } else { hr = WICConvertBitmapSource(&framepixelformat, pSourceIn, ppSourceOut); } } return hr; }
static HRESULT WINAPI BitmapScaler_Initialize(IWICBitmapScaler *iface, IWICBitmapSource *pISource, UINT uiWidth, UINT uiHeight, WICBitmapInterpolationMode mode) { BitmapScaler *This = impl_from_IWICBitmapScaler(iface); HRESULT hr; GUID src_pixelformat; TRACE("(%p,%p,%u,%u,%u)\n", iface, pISource, uiWidth, uiHeight, mode); EnterCriticalSection(&This->lock); if (This->source) { hr = WINCODEC_ERR_WRONGSTATE; goto end; } This->width = uiWidth; This->height = uiHeight; This->mode = mode; hr = IWICBitmapSource_GetSize(pISource, &This->src_width, &This->src_height); if (SUCCEEDED(hr)) hr = IWICBitmapSource_GetPixelFormat(pISource, &src_pixelformat); if (SUCCEEDED(hr)) { hr = get_pixelformat_bpp(&src_pixelformat, &This->bpp); } if (SUCCEEDED(hr)) { switch (mode) { default: FIXME("unsupported mode %i\n", mode); /* fall-through */ case WICBitmapInterpolationModeNearestNeighbor: if ((This->bpp % 8) == 0) { IWICBitmapSource_AddRef(pISource); This->source = pISource; } else { hr = WICConvertBitmapSource(&GUID_WICPixelFormat32bppBGRA, pISource, &This->source); This->bpp = 32; } This->fn_get_required_source_rect = NearestNeighbor_GetRequiredSourceRect; This->fn_copy_scanline = NearestNeighbor_CopyScanline; break; } } end: LeaveCriticalSection(&This->lock); return hr; }