static HRESULT WINAPI BitmapImpl_SetPalette(IWICBitmap *iface, IWICPalette *pIPalette) { BitmapImpl *This = impl_from_IWICBitmap(iface); HRESULT hr; TRACE("(%p,%p)\n", iface, pIPalette); if (!This->palette) { IWICPalette *new_palette; hr = PaletteImpl_Create(&new_palette); if (FAILED(hr)) return hr; if (InterlockedCompareExchangePointer((void**)&This->palette, new_palette, NULL)) { /* someone beat us to it */ IWICPalette_Release(new_palette); } } hr = IWICPalette_InitializeFromPalette(This->palette, pIPalette); if (SUCCEEDED(hr)) This->palette_set = 1; return S_OK; }
static HRESULT WINAPI BitmapImpl_QueryInterface(IWICBitmap *iface, REFIID iid, void **ppv) { BitmapImpl *This = impl_from_IWICBitmap(iface); TRACE("(%p,%s,%p)\n", iface, debugstr_guid(iid), ppv); if (!ppv) return E_INVALIDARG; if (IsEqualIID(&IID_IUnknown, iid) || IsEqualIID(&IID_IWICBitmapSource, iid) || IsEqualIID(&IID_IWICBitmap, iid)) { *ppv = &This->IWICBitmap_iface; } else if (IsEqualIID(&IID_IMILBitmapSource, iid)) { *ppv = &This->IMILBitmapSource_iface; } else { *ppv = NULL; return E_NOINTERFACE; } IUnknown_AddRef((IUnknown*)*ppv); return S_OK; }
static HRESULT WINAPI BitmapImpl_CopyPixels(IWICBitmap *iface, const WICRect *prc, UINT cbStride, UINT cbBufferSize, BYTE *pbBuffer) { BitmapImpl *This = impl_from_IWICBitmap(iface); TRACE("(%p,%p,%u,%u,%p)\n", iface, prc, cbStride, cbBufferSize, pbBuffer); return copy_pixels(This->bpp, This->data, This->width, This->height, This->stride, prc, cbStride, cbBufferSize, pbBuffer); }
static ULONG WINAPI BitmapImpl_AddRef(IWICBitmap *iface) { BitmapImpl *This = impl_from_IWICBitmap(iface); ULONG ref = InterlockedIncrement(&This->ref); TRACE("(%p) refcount=%u\n", iface, ref); return ref; }
static HRESULT WINAPI BitmapImpl_CopyPalette(IWICBitmap *iface, IWICPalette *pIPalette) { BitmapImpl *This = impl_from_IWICBitmap(iface); TRACE("(%p,%p)\n", iface, pIPalette); if (!This->palette_set) return WINCODEC_ERR_PALETTEUNAVAILABLE; return IWICPalette_InitializeFromPalette(pIPalette, This->palette); }
static HRESULT WINAPI BitmapImpl_Lock(IWICBitmap *iface, const WICRect *prcLock, DWORD flags, IWICBitmapLock **ppILock) { BitmapImpl *This = impl_from_IWICBitmap(iface); BitmapLockImpl *result; WICRect rc; TRACE("(%p,%p,%x,%p)\n", iface, prcLock, flags, ppILock); if (!(flags & (WICBitmapLockRead|WICBitmapLockWrite)) || !ppILock) return E_INVALIDARG; if (!prcLock) { rc.X = rc.Y = 0; rc.Width = This->width; rc.Height = This->height; prcLock = &rc; } else if (prcLock->X >= This->width || prcLock->Y >= This->height || prcLock->X + prcLock->Width > This->width || prcLock->Y + prcLock->Height > This->height || prcLock->Width <= 0 || prcLock->Height <= 0) return E_INVALIDARG; else if (((prcLock->X * This->bpp) % 8) != 0) { FIXME("Cannot lock at an X coordinate not at a full byte\n"); return E_FAIL; } result = HeapAlloc(GetProcessHeap(), 0, sizeof(BitmapLockImpl)); if (!result) return E_OUTOFMEMORY; if (!BitmapImpl_AcquireLock(This, flags & WICBitmapLockWrite)) { HeapFree(GetProcessHeap(), 0, result); return WINCODEC_ERR_ALREADYLOCKED; } result->IWICBitmapLock_iface.lpVtbl = &BitmapLockImpl_Vtbl; result->ref = 1; result->parent = This; result->width = prcLock->Width; result->height = prcLock->Height; result->data = This->data + This->stride * prcLock->Y + (This->bpp * prcLock->X)/8; IWICBitmap_AddRef(&This->IWICBitmap_iface); *ppILock = &result->IWICBitmapLock_iface; return S_OK; }
static HRESULT WINAPI BitmapImpl_SetResolution(IWICBitmap *iface, double dpiX, double dpiY) { BitmapImpl *This = impl_from_IWICBitmap(iface); TRACE("(%p,%f,%f)\n", iface, dpiX, dpiY); EnterCriticalSection(&This->cs); This->dpix = dpiX; This->dpiy = dpiY; LeaveCriticalSection(&This->cs); return S_OK; }
static HRESULT WINAPI BitmapImpl_GetPixelFormat(IWICBitmap *iface, WICPixelFormatGUID *pPixelFormat) { BitmapImpl *This = impl_from_IWICBitmap(iface); TRACE("(%p,%p)\n", iface, pPixelFormat); if (!pPixelFormat) return E_INVALIDARG; memcpy(pPixelFormat, &This->pixelformat, sizeof(GUID)); return S_OK; }
static HRESULT WINAPI BitmapImpl_GetSize(IWICBitmap *iface, UINT *puiWidth, UINT *puiHeight) { BitmapImpl *This = impl_from_IWICBitmap(iface); TRACE("(%p,%p,%p)\n", iface, puiWidth, puiHeight); if (!puiWidth || !puiHeight) return E_INVALIDARG; *puiWidth = This->width; *puiHeight = This->height; return S_OK; }
static HRESULT WINAPI BitmapImpl_GetResolution(IWICBitmap *iface, double *pDpiX, double *pDpiY) { BitmapImpl *This = impl_from_IWICBitmap(iface); TRACE("(%p,%p,%p)\n", iface, pDpiX, pDpiY); if (!pDpiX || !pDpiY) return E_INVALIDARG; EnterCriticalSection(&This->cs); *pDpiX = This->dpix; *pDpiY = This->dpiy; LeaveCriticalSection(&This->cs); return S_OK; }
static ULONG WINAPI BitmapImpl_Release(IWICBitmap *iface) { BitmapImpl *This = impl_from_IWICBitmap(iface); ULONG ref = InterlockedDecrement(&This->ref); TRACE("(%p) refcount=%u\n", iface, ref); if (ref == 0) { if (This->palette) IWICPalette_Release(This->palette); This->cs.DebugInfo->Spare[0] = 0; DeleteCriticalSection(&This->cs); HeapFree(GetProcessHeap(), 0, This->data); HeapFree(GetProcessHeap(), 0, This); } return ref; }