HRESULT BitmapImpl_Create(UINT uiWidth, UINT uiHeight, UINT stride, UINT datasize, BYTE *data, REFWICPixelFormatGUID pixelFormat, WICBitmapCreateCacheOption option, IWICBitmap **ppIBitmap) { HRESULT hr; BitmapImpl *This; UINT bpp; hr = get_pixelformat_bpp(pixelFormat, &bpp); if (FAILED(hr)) return hr; if (!stride) stride = (((bpp*uiWidth)+31)/32)*4; if (!datasize) datasize = stride * uiHeight; if (datasize < stride * uiHeight) return WINCODEC_ERR_INSUFFICIENTBUFFER; if (stride < ((bpp*uiWidth)+7)/8) return E_INVALIDARG; This = HeapAlloc(GetProcessHeap(), 0, sizeof(BitmapImpl)); if (!This) return E_OUTOFMEMORY; if (!data) { data = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, datasize); if (!data) { HeapFree(GetProcessHeap(), 0, This); return E_OUTOFMEMORY; } This->is_section = FALSE; } else This->is_section = TRUE; This->IWICBitmap_iface.lpVtbl = &BitmapImpl_Vtbl; This->IMILBitmapSource_iface.lpVtbl = &IMILBitmapImpl_Vtbl; This->IMILUnknown1_iface.lpVtbl = &IMILUnknown1Impl_Vtbl; This->IMILUnknown2_iface.lpVtbl = &IMILUnknown2Impl_Vtbl; This->ref = 1; This->palette = NULL; This->palette_set = 0; This->lock = 0; This->data = data; This->width = uiWidth; This->height = uiHeight; This->stride = stride; This->bpp = bpp; memcpy(&This->pixelformat, pixelFormat, sizeof(GUID)); This->dpix = This->dpiy = 0.0; InitializeCriticalSection(&This->cs); This->cs.DebugInfo->Spare[0] = (DWORD_PTR)(__FILE__ ": BitmapImpl.lock"); *ppIBitmap = &This->IWICBitmap_iface; return S_OK; }
HRESULT WINAPI WICCreateBitmapFromSectionEx(UINT width, UINT height, REFWICPixelFormatGUID format, HANDLE section, UINT stride, UINT offset, WICSectionAccessLevel wicaccess, IWICBitmap **bitmap) { SYSTEM_INFO sysinfo; UINT bpp, access, size, view_offset, view_size; void *view; HRESULT hr; TRACE("%u,%u,%s,%p,%u,%u,%#x,%p\n", width, height, debugstr_guid(format), section, stride, offset, wicaccess, bitmap); if (!width || !height || !section || !bitmap) return E_INVALIDARG; hr = get_pixelformat_bpp(format, &bpp); if (FAILED(hr)) return hr; switch (wicaccess) { case WICSectionAccessLevelReadWrite: access = FILE_MAP_READ | FILE_MAP_WRITE; break; case WICSectionAccessLevelRead: access = FILE_MAP_READ; break; default: FIXME("unsupported access %#x\n", wicaccess); return E_INVALIDARG; } if (!stride) stride = (((bpp * width) + 31) / 32) * 4; size = stride * height; if (size / height != stride) return E_INVALIDARG; GetSystemInfo(&sysinfo); view_offset = offset - (offset % sysinfo.dwAllocationGranularity); view_size = size + (offset - view_offset); view = MapViewOfFile(section, access, 0, view_offset, view_size); if (!view) return HRESULT_FROM_WIN32(GetLastError()); offset -= view_offset; hr = BitmapImpl_Create(width, height, stride, 0, view, offset, format, WICBitmapCacheOnLoad, bitmap); if (FAILED(hr)) UnmapViewOfFile(view); return hr; }
HRESULT BitmapImpl_Create(UINT uiWidth, UINT uiHeight, REFWICPixelFormatGUID pixelFormat, WICBitmapCreateCacheOption option, IWICBitmap **ppIBitmap) { HRESULT hr; BitmapImpl *This; UINT bpp, stride, datasize; BYTE *data; hr = get_pixelformat_bpp(pixelFormat, &bpp); if (FAILED(hr)) return hr; stride = (((bpp*uiWidth)+31)/32)*4; datasize = stride * uiHeight; This = HeapAlloc(GetProcessHeap(), 0, sizeof(BitmapImpl)); data = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, datasize); if (!This || !data) { HeapFree(GetProcessHeap(), 0, This); HeapFree(GetProcessHeap(), 0, data); return E_OUTOFMEMORY; } This->IWICBitmap_iface.lpVtbl = &BitmapImpl_Vtbl; This->ref = 1; This->palette = NULL; This->palette_set = 0; This->lock = 0; This->data = data; This->width = uiWidth; This->height = uiHeight; This->stride = stride; This->bpp = bpp; memcpy(&This->pixelformat, pixelFormat, sizeof(GUID)); This->dpix = This->dpiy = 0.0; InitializeCriticalSection(&This->cs); This->cs.DebugInfo->Spare[0] = (DWORD_PTR)(__FILE__ ": BitmapImpl.lock"); *ppIBitmap = &This->IWICBitmap_iface; return S_OK; }
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; }