gdiplus: Reimplement GdipCloneBitmapArea without using GdipBitmapLockBits.

This commit is contained in:
Dmitry Timoshkov 2013-10-18 14:04:46 +09:00 committed by Alexandre Julliard
parent 5e78e0b695
commit df367c3399
2 changed files with 5 additions and 29 deletions

View File

@ -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;
}

View File

@ -4257,7 +4257,6 @@ static void test_CloneBitmapArea(void)
expect(WrongState, status);
status = GdipCloneBitmapAreaI(0, 0, 1, 1, PixelFormat24bppRGB, bitmap, &copy);
todo_wine
expect(Ok, status);
status = GdipBitmapUnlockBits(bitmap, &data);