static HRESULT WINAPI BmpFrameEncode_WritePixels(IWICBitmapFrameEncode *iface, UINT lineCount, UINT cbStride, UINT cbBufferSize, BYTE *pbPixels) { BmpFrameEncode *This = impl_from_IWICBitmapFrameEncode(iface); HRESULT hr; WICRect rc; TRACE("(%p,%u,%u,%u,%p)\n", iface, lineCount, cbStride, cbBufferSize, pbPixels); if (!This->initialized || !This->width || !This->height || !This->format) return WINCODEC_ERR_WRONGSTATE; hr = BmpFrameEncode_AllocateBits(This); if (FAILED(hr)) return hr; rc.X = 0; rc.Y = 0; rc.Width = This->width; rc.Height = lineCount; hr = copy_pixels(This->format->bpp, pbPixels, This->width, lineCount, cbStride, &rc, This->stride, This->stride*(This->height-This->lineswritten), This->bits + This->stride*This->lineswritten); if (SUCCEEDED(hr)) This->lineswritten += lineCount; return hr; }
static HRESULT WINAPI BmpFrameEncode_WritePixels(IWICBitmapFrameEncode *iface, UINT lineCount, UINT cbStride, UINT cbBufferSize, BYTE *pbPixels) { BmpFrameEncode *This = impl_from_IWICBitmapFrameEncode(iface); UINT dstbuffersize, bytesperrow, row; BYTE *dst, *src; HRESULT hr; TRACE("(%p,%u,%u,%u,%p)\n", iface, lineCount, cbStride, cbBufferSize, pbPixels); if (!This->initialized || !This->width || !This->height || !This->format) return WINCODEC_ERR_WRONGSTATE; hr = BmpFrameEncode_AllocateBits(This); if (FAILED(hr)) return hr; bytesperrow = ((This->format->bpp * This->width) + 7) / 8; if (This->stride < bytesperrow) return E_INVALIDARG; dstbuffersize = This->stride * (This->height - This->lineswritten); if ((This->stride * (lineCount - 1)) + bytesperrow > dstbuffersize) return E_INVALIDARG; src = pbPixels; dst = This->bits + This->stride * (This->height - This->lineswritten - 1); for (row = 0; row < lineCount; row++) { memcpy(dst, src, bytesperrow); src += cbStride; dst -= This->stride; } This->lineswritten += lineCount; return S_OK; }
static HRESULT WINAPI BmpFrameEncode_WriteSource(IWICBitmapFrameEncode *iface, IWICBitmapSource *pIBitmapSource, WICRect *prc) { BmpFrameEncode *This = impl_from_IWICBitmapFrameEncode(iface); HRESULT hr; WICRect rc; WICPixelFormatGUID guid; TRACE("(%p,%p,%p)\n", iface, pIBitmapSource, prc); if (!This->initialized || !This->width || !This->height) return WINCODEC_ERR_WRONGSTATE; if (!This->format) { hr = IWICBitmapSource_GetPixelFormat(pIBitmapSource, &guid); if (FAILED(hr)) return hr; hr = BmpFrameEncode_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) { /* should use WICConvertBitmapSource to convert, but that's unimplemented */ 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 = BmpFrameEncode_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; hr = BmpFrameEncode_AllocateBits(This); if (FAILED(hr)) return hr; hr = IWICBitmapSource_CopyPixels(pIBitmapSource, prc, This->stride, This->stride*(This->height-This->lineswritten), This->bits + This->stride*This->lineswritten); This->lineswritten += prc->Height; return S_OK; }