gdiplus: GdipBitmapLockBits should allow a NULL rect argument.
This commit is contained in:
parent
87bb1cbcdc
commit
36a7f31752
|
@ -101,15 +101,25 @@ GpStatus WINGDIPAPI GdipBitmapLockBits(GpBitmap* bitmap, GDIPCONST GpRect* rect,
|
|||
BITMAPINFO bmi;
|
||||
BYTE *buff = NULL;
|
||||
UINT abs_height;
|
||||
GpRect act_rect; /* actual rect to be used */
|
||||
|
||||
TRACE("%p %p %d %d %p\n", bitmap, rect, flags, format, lockeddata);
|
||||
|
||||
if(!lockeddata || !bitmap || !rect)
|
||||
if(!lockeddata || !bitmap)
|
||||
return InvalidParameter;
|
||||
|
||||
if(rect->X < 0 || rect->Y < 0 || (rect->X + rect->Width > bitmap->width) ||
|
||||
(rect->Y + rect->Height > bitmap->height) || !flags)
|
||||
return InvalidParameter;
|
||||
if(rect){
|
||||
if(rect->X < 0 || rect->Y < 0 || (rect->X + rect->Width > bitmap->width) ||
|
||||
(rect->Y + rect->Height > bitmap->height) || !flags)
|
||||
return InvalidParameter;
|
||||
|
||||
act_rect = *rect;
|
||||
}
|
||||
else{
|
||||
act_rect.X = act_rect.Y = 0;
|
||||
act_rect.Width = bitmap->width;
|
||||
act_rect.Height = bitmap->height;
|
||||
}
|
||||
|
||||
if(flags & ImageLockModeUserInputBuf)
|
||||
return NotImplemented;
|
||||
|
@ -151,19 +161,19 @@ GpStatus WINGDIPAPI GdipBitmapLockBits(GpBitmap* bitmap, GDIPCONST GpRect* rect,
|
|||
if(!buff)
|
||||
return OutOfMemory;
|
||||
|
||||
lockeddata->Width = rect->Width;
|
||||
lockeddata->Height = rect->Height;
|
||||
lockeddata->Width = act_rect.Width;
|
||||
lockeddata->Height = act_rect.Height;
|
||||
lockeddata->PixelFormat = format;
|
||||
lockeddata->Reserved = flags;
|
||||
|
||||
if(bmi.bmiHeader.biHeight > 0){
|
||||
lockeddata->Stride = -stride;
|
||||
lockeddata->Scan0 = buff + (bitspp / 8) * rect->X +
|
||||
stride * (abs_height - 1 - rect->Y);
|
||||
lockeddata->Scan0 = buff + (bitspp / 8) * act_rect.X +
|
||||
stride * (abs_height - 1 - act_rect.Y);
|
||||
}
|
||||
else{
|
||||
lockeddata->Stride = stride;
|
||||
lockeddata->Scan0 = buff + (bitspp / 8) * rect->X + stride * rect->Y;
|
||||
lockeddata->Scan0 = buff + (bitspp / 8) * act_rect.X + stride * act_rect.Y;
|
||||
}
|
||||
|
||||
bitmap->lockmode = flags;
|
||||
|
|
|
@ -247,7 +247,7 @@ static void test_LockBits(void)
|
|||
GpBitmap *bm;
|
||||
GpRect rect;
|
||||
BitmapData bd;
|
||||
const REAL WIDTH = 10.0, HEIGHT = 20.0;
|
||||
const INT WIDTH = 10, HEIGHT = 20;
|
||||
|
||||
bm = NULL;
|
||||
stat = GdipCreateBitmapFromScan0(WIDTH, HEIGHT, 0, PixelFormat24bppRGB, NULL, &bm);
|
||||
|
@ -267,6 +267,17 @@ static void test_LockBits(void)
|
|||
expect(Ok, stat);
|
||||
}
|
||||
|
||||
/* read-only, with NULL rect -> whole bitmap lock */
|
||||
stat = GdipBitmapLockBits(bm, NULL, ImageLockModeRead, PixelFormat24bppRGB, &bd);
|
||||
expect(Ok, stat);
|
||||
expect(bd.Width, WIDTH);
|
||||
expect(bd.Height, HEIGHT);
|
||||
|
||||
if (stat == Ok) {
|
||||
stat = GdipBitmapUnlockBits(bm, &bd);
|
||||
expect(Ok, stat);
|
||||
}
|
||||
|
||||
/* read-only, consecutive */
|
||||
stat = GdipBitmapLockBits(bm, &rect, ImageLockModeRead, PixelFormat24bppRGB, &bd);
|
||||
expect(Ok, stat);
|
||||
|
|
Loading…
Reference in New Issue