Vincent Povirk : windowscodecs: Implement Commit for BMP frame encoder.

Alexandre Julliard julliard at winehq.org
Wed Aug 12 11:09:38 CDT 2009


Module: wine
Branch: master
Commit: 7cc0fd4fdea26918c14f9bd6c9b8225f55256146
URL:    http://source.winehq.org/git/wine.git/?a=commit;h=7cc0fd4fdea26918c14f9bd6c9b8225f55256146

Author: Vincent Povirk <vincent at codeweavers.com>
Date:   Tue Aug 11 17:17:31 2009 -0500

windowscodecs: Implement Commit for BMP frame encoder.

---

 dlls/windowscodecs/bmpencode.c |   55 ++++++++++++++++++++++++++++++++++++++-
 1 files changed, 53 insertions(+), 2 deletions(-)

diff --git a/dlls/windowscodecs/bmpencode.c b/dlls/windowscodecs/bmpencode.c
index 67282b9..869a60e 100644
--- a/dlls/windowscodecs/bmpencode.c
+++ b/dlls/windowscodecs/bmpencode.c
@@ -61,6 +61,7 @@ typedef struct BmpFrameEncode {
     double xres, yres;
     UINT lineswritten;
     UINT stride;
+    BOOL committed;
 } BmpFrameEncode;
 
 static HRESULT WINAPI BmpFrameEncode_QueryInterface(IWICBitmapFrameEncode *iface, REFIID iid,
@@ -251,8 +252,57 @@ static HRESULT WINAPI BmpFrameEncode_WriteSource(IWICBitmapFrameEncode *iface,
 
 static HRESULT WINAPI BmpFrameEncode_Commit(IWICBitmapFrameEncode *iface)
 {
-    FIXME("(%p): stub\n", iface);
-    return E_NOTIMPL;
+    BmpFrameEncode *This = (BmpFrameEncode*)iface;
+    BITMAPFILEHEADER bfh;
+    BITMAPV5HEADER bih;
+    UINT info_size;
+    LARGE_INTEGER pos;
+    ULONG byteswritten;
+    HRESULT hr;
+
+    TRACE("(%p)\n", iface);
+
+    if (!This->bits || This->committed || This->height != This->lineswritten)
+        return WINCODEC_ERR_WRONGSTATE;
+
+    bfh.bfType = 0x4d42; /* "BM" */
+    bfh.bfReserved1 = 0;
+    bfh.bfReserved2 = 0;
+
+    bih.bV5Size = info_size = sizeof(BITMAPINFOHEADER);
+    bih.bV5Width = This->width;
+    bih.bV5Height = -This->height; /* top-down bitmap */
+    bih.bV5Planes = 1;
+    bih.bV5BitCount = This->format->bpp;
+    bih.bV5Compression = This->format->compression;
+    bih.bV5SizeImage = This->stride*This->height;
+    bih.bV5XPelsPerMeter = (This->xres-0.0127) / 0.0254;
+    bih.bV5YPelsPerMeter = (This->yres-0.0127) / 0.0254;
+    bih.bV5ClrUsed = 0;
+    bih.bV5ClrImportant = 0;
+
+    bfh.bfSize = sizeof(BITMAPFILEHEADER) + info_size + bih.bV5SizeImage;
+    bfh.bfOffBits = sizeof(BITMAPFILEHEADER) + info_size;
+
+    pos.QuadPart = 0;
+    hr = IStream_Seek(This->stream, pos, STREAM_SEEK_SET, NULL);\
+    if (FAILED(hr)) return hr;
+
+    hr = IStream_Write(This->stream, &bfh, sizeof(BITMAPFILEHEADER), &byteswritten);
+    if (FAILED(hr)) return hr;
+    if (byteswritten != sizeof(BITMAPFILEHEADER)) return E_FAIL;
+
+    hr = IStream_Write(This->stream, &bih, info_size, &byteswritten);
+    if (FAILED(hr)) return hr;
+    if (byteswritten != info_size) return E_FAIL;
+
+    hr = IStream_Write(This->stream, This->bits, bih.bV5SizeImage, &byteswritten);
+    if (FAILED(hr)) return hr;
+    if (byteswritten != bih.bV5SizeImage) return E_FAIL;
+
+    This->committed = TRUE;
+
+    return S_OK;
 }
 
 static HRESULT WINAPI BmpFrameEncode_GetMetadataQueryWriter(IWICBitmapFrameEncode *iface,
@@ -423,6 +473,7 @@ static HRESULT WINAPI BmpEncoder_CreateNewFrame(IWICBitmapEncoder *iface,
     encode->xres = 0.0;
     encode->yres = 0.0;
     encode->lineswritten = 0;
+    encode->committed = FALSE;
 
     *ppIFrameEncode = (IWICBitmapFrameEncode*)encode;
     This->frame = (IWICBitmapFrameEncode*)encode;




More information about the wine-cvs mailing list