Vincent Povirk : gdiplus: Implement ImageLockModeUserInputBuf.

Alexandre Julliard julliard at winehq.org
Fri Feb 25 11:19:44 CST 2011


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

Author: Vincent Povirk <vincent at codeweavers.com>
Date:   Thu Feb 24 16:48:03 2011 -0600

gdiplus: Implement ImageLockModeUserInputBuf.

---

 dlls/gdiplus/image.c       |   49 +++++++++++++++++--------------------------
 dlls/gdiplus/tests/image.c |   14 ++++++------
 2 files changed, 26 insertions(+), 37 deletions(-)

diff --git a/dlls/gdiplus/image.c b/dlls/gdiplus/image.c
index 070ea3d..2582ae2 100644
--- a/dlls/gdiplus/image.c
+++ b/dlls/gdiplus/image.c
@@ -913,9 +913,7 @@ GpStatus convert_pixels(UINT width, UINT height,
 GpStatus WINGDIPAPI GdipBitmapLockBits(GpBitmap* bitmap, GDIPCONST GpRect* rect,
     UINT flags, PixelFormat format, BitmapData* lockeddata)
 {
-    INT stride, bitspp = PIXELFORMATBPP(format);
-    BYTE *buff = NULL;
-    UINT abs_height;
+    INT bitspp = PIXELFORMATBPP(format);
     GpRect act_rect; /* actual rect to be used */
     GpStatus stat;
 
@@ -937,20 +935,13 @@ GpStatus WINGDIPAPI GdipBitmapLockBits(GpBitmap* bitmap, GDIPCONST GpRect* rect,
         act_rect.Height = bitmap->height;
     }
 
-    if(flags & ImageLockModeUserInputBuf)
-    {
-        static int fixme=0;
-        if (!fixme++) FIXME("ImageLockModeUserInputBuf not implemented\n");
-        return NotImplemented;
-    }
-
     if(bitmap->lockmode)
     {
         WARN("bitmap is already locked and cannot be locked again\n");
         return WrongState;
     }
 
-    if (bitmap->bits && bitmap->format == format)
+    if (bitmap->bits && bitmap->format == format && !(flags & ImageLockModeUserInputBuf))
     {
         /* no conversion is necessary; just use the bits directly */
         lockeddata->Width = act_rect.Width;
@@ -990,13 +981,21 @@ GpStatus WINGDIPAPI GdipBitmapLockBits(GpBitmap* bitmap, GDIPCONST GpRect* rect,
         }
     }
 
-    abs_height = act_rect.Height;
-    stride = (act_rect.Width * bitspp + 7) / 8;
-    stride = (stride + 3) & ~3;
+    lockeddata->Width  = act_rect.Width;
+    lockeddata->Height = act_rect.Height;
+    lockeddata->PixelFormat = format;
+    lockeddata->Reserved = flags;
+
+    if(!(flags & ImageLockModeUserInputBuf))
+    {
+        lockeddata->Stride = (((act_rect.Width * bitspp + 7) / 8) + 3) & ~3;
+
+        bitmap->bitmapbits = GdipAlloc(lockeddata->Stride * act_rect.Height);
 
-    buff = GdipAlloc(stride * abs_height);
+        if (!bitmap->bitmapbits) return OutOfMemory;
 
-    if (!buff) return OutOfMemory;
+        lockeddata->Scan0  = bitmap->bitmapbits;
+    }
 
     if (flags & ImageLockModeRead)
     {
@@ -1009,28 +1008,21 @@ GpStatus WINGDIPAPI GdipBitmapLockBits(GpBitmap* bitmap, GDIPCONST GpRect* rect,
         }
 
         stat = convert_pixels(act_rect.Width, act_rect.Height,
-            stride, buff, format,
+            lockeddata->Stride, lockeddata->Scan0, format,
             bitmap->stride,
             bitmap->bits + bitmap->stride * act_rect.Y + PIXELFORMATBPP(bitmap->format) * act_rect.X / 8,
             bitmap->format, bitmap->image.palette_entries);
 
         if (stat != Ok)
         {
-            GdipFree(buff);
+            GdipFree(bitmap->bitmapbits);
+            bitmap->bitmapbits = NULL;
             return stat;
         }
     }
 
-    lockeddata->Width  = act_rect.Width;
-    lockeddata->Height = act_rect.Height;
-    lockeddata->PixelFormat = format;
-    lockeddata->Reserved = flags;
-    lockeddata->Stride = stride;
-    lockeddata->Scan0  = buff;
-
     bitmap->lockmode = flags;
     bitmap->numlocks++;
-    bitmap->bitmapbits = buff;
     bitmap->lockx = act_rect.X;
     bitmap->locky = act_rect.Y;
 
@@ -1064,9 +1056,6 @@ GpStatus WINGDIPAPI GdipBitmapUnlockBits(GpBitmap* bitmap,
     if(!bitmap->lockmode)
         return WrongState;
 
-    if(lockeddata->Reserved & ImageLockModeUserInputBuf)
-        return NotImplemented;
-
     if(!(lockeddata->Reserved & ImageLockModeWrite)){
         if(!(--bitmap->numlocks))
             bitmap->lockmode = 0;
@@ -1076,7 +1065,7 @@ GpStatus WINGDIPAPI GdipBitmapUnlockBits(GpBitmap* bitmap,
         return Ok;
     }
 
-    if (!bitmap->bitmapbits)
+    if (!bitmap->bitmapbits && !(lockeddata->Reserved & ImageLockModeUserInputBuf))
     {
         /* we passed a direct reference; no need to do anything */
         bitmap->lockmode = 0;
diff --git a/dlls/gdiplus/tests/image.c b/dlls/gdiplus/tests/image.c
index 005969b..71a99ea 100644
--- a/dlls/gdiplus/tests/image.c
+++ b/dlls/gdiplus/tests/image.c
@@ -777,10 +777,10 @@ static void test_LockBits_UserBuf(void)
 
     /* read-only */
     stat = GdipBitmapLockBits(bm, &rect, ImageLockModeRead|ImageLockModeUserInputBuf, PixelFormat32bppARGB, &bd);
-    todo_wine expect(Ok, stat);
+    expect(Ok, stat);
 
     expect(0xaaaaaaaa, bits[0]);
-    todo_wine expect(0, bits[2+3*WIDTH]);
+    expect(0, bits[2+3*WIDTH]);
 
     bits[2+3*WIDTH] = 0xdeadbeef;
 
@@ -795,7 +795,7 @@ static void test_LockBits_UserBuf(void)
 
     /* write-only */
     stat = GdipBitmapLockBits(bm, &rect, ImageLockModeWrite|ImageLockModeUserInputBuf, PixelFormat32bppARGB, &bd);
-    todo_wine expect(Ok, stat);
+    expect(Ok, stat);
 
     expect(0xdeadbeef, bits[2+3*WIDTH]);
     bits[2+3*WIDTH] = 0x12345678;
@@ -807,15 +807,15 @@ static void test_LockBits_UserBuf(void)
 
     stat = GdipBitmapGetPixel(bm, 2, 3, &color);
     expect(Ok, stat);
-    todo_wine expect(0x12345678, color);
+    expect(0x12345678, color);
 
     bits[2+3*WIDTH] = 0;
 
     /* read/write */
     stat = GdipBitmapLockBits(bm, &rect, ImageLockModeRead|ImageLockModeWrite|ImageLockModeUserInputBuf, PixelFormat32bppARGB, &bd);
-    todo_wine expect(Ok, stat);
+    expect(Ok, stat);
 
-    todo_wine expect(0x12345678, bits[2+3*WIDTH]);
+    expect(0x12345678, bits[2+3*WIDTH]);
     bits[2+3*WIDTH] = 0xdeadbeef;
 
     if (stat == Ok) {
@@ -825,7 +825,7 @@ static void test_LockBits_UserBuf(void)
 
     stat = GdipBitmapGetPixel(bm, 2, 3, &color);
     expect(Ok, stat);
-    todo_wine expect(0xdeadbeef, color);
+    expect(0xdeadbeef, color);
 
     stat = GdipDisposeImage((GpImage*)bm);
     expect(Ok, stat);




More information about the wine-cvs mailing list