[1/2] gdiplus: Reimplement GdipCloneBitmapArea without using GdipBitmapLockBits.
Dmitry Timoshkov
dmitry at baikal.ru
Fri Oct 18 00:04:46 CDT 2013
---
dlls/gdiplus/image.c | 33 +++++----------------------------
dlls/gdiplus/tests/image.c | 1 -
2 files changed, 5 insertions(+), 29 deletions(-)
diff --git a/dlls/gdiplus/image.c b/dlls/gdiplus/image.c
index 2e9191e..83b0b08 100644
--- a/dlls/gdiplus/image.c
+++ b/dlls/gdiplus/image.c
@@ -1224,9 +1224,6 @@ GpStatus WINGDIPAPI GdipBitmapUnlockBits(GpBitmap* bitmap,
GpStatus WINGDIPAPI GdipCloneBitmapArea(REAL x, REAL y, REAL width, REAL height,
PixelFormat format, GpBitmap* srcBitmap, GpBitmap** dstBitmap)
{
- BitmapData lockeddata_src, lockeddata_dst;
- int i;
- UINT row_size;
Rect area;
GpStatus stat;
@@ -1248,39 +1245,19 @@ GpStatus WINGDIPAPI GdipCloneBitmapArea(REAL x, REAL y, REAL width, REAL height,
area.Width = gdip_round(width);
area.Height = gdip_round(height);
- stat = GdipBitmapLockBits(srcBitmap, &area, ImageLockModeRead, format,
- &lockeddata_src);
- if (stat != Ok) return stat;
-
- stat = GdipCreateBitmapFromScan0(lockeddata_src.Width, lockeddata_src.Height,
- 0, lockeddata_src.PixelFormat, NULL, dstBitmap);
+ stat = GdipCreateBitmapFromScan0(area.Width, area.Height, 0, format, NULL, dstBitmap);
if (stat == Ok)
{
- stat = GdipBitmapLockBits(*dstBitmap, NULL, ImageLockModeWrite,
- lockeddata_src.PixelFormat, &lockeddata_dst);
-
- if (stat == Ok)
- {
- /* copy the image data */
- row_size = (lockeddata_src.Width * PIXELFORMATBPP(lockeddata_src.PixelFormat) +7)/8;
- for (i=0; i<lockeddata_src.Height; i++)
- memcpy((BYTE*)lockeddata_dst.Scan0+lockeddata_dst.Stride*i,
- (BYTE*)lockeddata_src.Scan0+lockeddata_src.Stride*i,
- row_size);
-
- GdipBitmapUnlockBits(*dstBitmap, &lockeddata_dst);
- }
-
+ stat = convert_pixels(area.Width, area.Height, (*dstBitmap)->stride, (*dstBitmap)->bits, (*dstBitmap)->format,
+ srcBitmap->stride,
+ srcBitmap->bits + srcBitmap->stride * area.Y + PIXELFORMATBPP(srcBitmap->format) * area.X / 8,
+ srcBitmap->format, srcBitmap->image.palette);
if (stat != Ok)
GdipDisposeImage((GpImage*)*dstBitmap);
}
- GdipBitmapUnlockBits(srcBitmap, &lockeddata_src);
-
if (stat != Ok)
- {
*dstBitmap = NULL;
- }
return stat;
}
diff --git a/dlls/gdiplus/tests/image.c b/dlls/gdiplus/tests/image.c
index 650d12f..63d37cb 100644
--- a/dlls/gdiplus/tests/image.c
+++ b/dlls/gdiplus/tests/image.c
@@ -4257,7 +4257,6 @@ static void test_CloneBitmapArea(void)
expect(WrongState, status);
status = GdipCloneBitmapAreaI(0, 0, 1, 1, PixelFormat24bppRGB, bitmap, ©);
-todo_wine
expect(Ok, status);
status = GdipBitmapUnlockBits(bitmap, &data);
--
1.8.4.1
More information about the wine-patches
mailing list