gdiplus: Don't copy bits into the buffer when a bitmap is locked write-only.
authorVincent Povirk <vincent@codeweavers.com>
Thu, 24 Feb 2011 22:12:43 +0000 (16:12 -0600)
committerAlexandre Julliard <julliard@winehq.org>
Fri, 25 Feb 2011 10:06:30 +0000 (11:06 +0100)
dlls/gdiplus/image.c

index 3c4e9bf140fa45ea154359e121e3b8059ed3fdb9..2139e97f6255b751ef31d1d4fdf4232114d49b2f 100644 (file)
@@ -968,11 +968,14 @@ GpStatus WINGDIPAPI GdipBitmapLockBits(GpBitmap* bitmap, GDIPCONST GpRect* rect,
     }
 
     /* Make sure we can convert to the requested format. */
-    stat = convert_pixels(0, 0, 0, NULL, format, 0, NULL, bitmap->format, NULL);
-    if (stat == NotImplemented)
+    if (flags & ImageLockModeRead)
     {
-        FIXME("cannot read bitmap from %x to %x\n", bitmap->format, format);
-        return NotImplemented;
+        stat = convert_pixels(0, 0, 0, NULL, format, 0, NULL, bitmap->format, NULL);
+        if (stat == NotImplemented)
+        {
+            FIXME("cannot read bitmap from %x to %x\n", bitmap->format, format);
+            return NotImplemented;
+        }
     }
 
     /* If we're opening for writing, make sure we'll be able to write back in
@@ -995,14 +998,17 @@ GpStatus WINGDIPAPI GdipBitmapLockBits(GpBitmap* bitmap, GDIPCONST GpRect* rect,
 
     if (!buff) return OutOfMemory;
 
-    stat = convert_pixels(bitmap->width, bitmap->height,
-        stride, buff, format,
-        bitmap->stride, bitmap->bits, bitmap->format, bitmap->image.palette_entries);
-
-    if (stat != Ok)
+    if (flags & ImageLockModeRead)
     {
-        GdipFree(buff);
-        return stat;
+        stat = convert_pixels(bitmap->width, bitmap->height,
+            stride, buff, format,
+            bitmap->stride, bitmap->bits, bitmap->format, bitmap->image.palette_entries);
+
+        if (stat != Ok)
+        {
+            GdipFree(buff);
+            return stat;
+        }
     }
 
     lockeddata->Width  = act_rect.Width;