gdiplus: Implement GetPixel for indexed color bitmaps.
This commit is contained in:
parent
3815add31b
commit
4d53a4c9f5
|
@ -94,6 +94,24 @@ GpStatus WINGDIPAPI GdipBitmapCreateApplyEffect(GpBitmap** inputBitmaps,
|
||||||
return NotImplemented;
|
return NotImplemented;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static inline void getpixel_1bppIndexed(BYTE *index, const BYTE *row, UINT x)
|
||||||
|
{
|
||||||
|
*index = (row[x/8]>>(7-x%8)) & 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
static inline void getpixel_4bppIndexed(BYTE *index, const BYTE *row, UINT x)
|
||||||
|
{
|
||||||
|
if (x & 1)
|
||||||
|
*index = row[x/2]&0xf;
|
||||||
|
else
|
||||||
|
*index = row[x/2]>>4;
|
||||||
|
}
|
||||||
|
|
||||||
|
static inline void getpixel_8bppIndexed(BYTE *index, const BYTE *row, UINT x)
|
||||||
|
{
|
||||||
|
*index = row[x];
|
||||||
|
}
|
||||||
|
|
||||||
static inline void getpixel_16bppGrayScale(BYTE *r, BYTE *g, BYTE *b, BYTE *a,
|
static inline void getpixel_16bppGrayScale(BYTE *r, BYTE *g, BYTE *b, BYTE *a,
|
||||||
const BYTE *row, UINT x)
|
const BYTE *row, UINT x)
|
||||||
{
|
{
|
||||||
|
@ -211,6 +229,7 @@ GpStatus WINGDIPAPI GdipBitmapGetPixel(GpBitmap* bitmap, INT x, INT y,
|
||||||
ARGB *color)
|
ARGB *color)
|
||||||
{
|
{
|
||||||
BYTE r, g, b, a;
|
BYTE r, g, b, a;
|
||||||
|
BYTE index;
|
||||||
BYTE *row;
|
BYTE *row;
|
||||||
TRACE("%p %d %d %p\n", bitmap, x, y, color);
|
TRACE("%p %d %d %p\n", bitmap, x, y, color);
|
||||||
|
|
||||||
|
@ -222,6 +241,15 @@ GpStatus WINGDIPAPI GdipBitmapGetPixel(GpBitmap* bitmap, INT x, INT y,
|
||||||
|
|
||||||
switch (bitmap->format)
|
switch (bitmap->format)
|
||||||
{
|
{
|
||||||
|
case PixelFormat1bppIndexed:
|
||||||
|
getpixel_1bppIndexed(&index,row,x);
|
||||||
|
break;
|
||||||
|
case PixelFormat4bppIndexed:
|
||||||
|
getpixel_4bppIndexed(&index,row,x);
|
||||||
|
break;
|
||||||
|
case PixelFormat8bppIndexed:
|
||||||
|
getpixel_8bppIndexed(&index,row,x);
|
||||||
|
break;
|
||||||
case PixelFormat16bppGrayScale:
|
case PixelFormat16bppGrayScale:
|
||||||
getpixel_16bppGrayScale(&r,&g,&b,&a,row,x);
|
getpixel_16bppGrayScale(&r,&g,&b,&a,row,x);
|
||||||
break;
|
break;
|
||||||
|
@ -260,7 +288,10 @@ GpStatus WINGDIPAPI GdipBitmapGetPixel(GpBitmap* bitmap, INT x, INT y,
|
||||||
return NotImplemented;
|
return NotImplemented;
|
||||||
}
|
}
|
||||||
|
|
||||||
*color = a<<24|r<<16|g<<8|b;
|
if (bitmap->format & PixelFormatIndexed)
|
||||||
|
*color = bitmap->image.palette_entries[index];
|
||||||
|
else
|
||||||
|
*color = a<<24|r<<16|g<<8|b;
|
||||||
|
|
||||||
return Ok;
|
return Ok;
|
||||||
}
|
}
|
||||||
|
|
|
@ -1181,8 +1181,8 @@ static void test_palette(void)
|
||||||
|
|
||||||
/* test getting/setting pixels */
|
/* test getting/setting pixels */
|
||||||
stat = GdipBitmapGetPixel(bitmap, 0, 0, &color);
|
stat = GdipBitmapGetPixel(bitmap, 0, 0, &color);
|
||||||
todo_wine expect(Ok, stat);
|
expect(Ok, stat);
|
||||||
todo_wine expect(0xff000000, color);
|
expect(0xff000000, color);
|
||||||
|
|
||||||
stat = GdipBitmapSetPixel(bitmap, 0, 1, 0xffffffff);
|
stat = GdipBitmapSetPixel(bitmap, 0, 1, 0xffffffff);
|
||||||
todo_wine ok((stat == Ok) ||
|
todo_wine ok((stat == Ok) ||
|
||||||
|
@ -1214,8 +1214,8 @@ static void test_palette(void)
|
||||||
|
|
||||||
/* test getting/setting pixels */
|
/* test getting/setting pixels */
|
||||||
stat = GdipBitmapGetPixel(bitmap, 0, 0, &color);
|
stat = GdipBitmapGetPixel(bitmap, 0, 0, &color);
|
||||||
todo_wine expect(Ok, stat);
|
expect(Ok, stat);
|
||||||
todo_wine expect(0xff000000, color);
|
expect(0xff000000, color);
|
||||||
|
|
||||||
stat = GdipBitmapSetPixel(bitmap, 0, 1, 0xffff00ff);
|
stat = GdipBitmapSetPixel(bitmap, 0, 1, 0xffff00ff);
|
||||||
todo_wine ok((stat == Ok) ||
|
todo_wine ok((stat == Ok) ||
|
||||||
|
@ -1247,8 +1247,8 @@ static void test_palette(void)
|
||||||
|
|
||||||
/* test getting/setting pixels */
|
/* test getting/setting pixels */
|
||||||
stat = GdipBitmapGetPixel(bitmap, 0, 0, &color);
|
stat = GdipBitmapGetPixel(bitmap, 0, 0, &color);
|
||||||
todo_wine expect(Ok, stat);
|
expect(Ok, stat);
|
||||||
todo_wine expect(0xff000000, color);
|
expect(0xff000000, color);
|
||||||
|
|
||||||
stat = GdipBitmapSetPixel(bitmap, 0, 1, 0xffcccccc);
|
stat = GdipBitmapSetPixel(bitmap, 0, 1, 0xffcccccc);
|
||||||
todo_wine ok((stat == Ok) ||
|
todo_wine ok((stat == Ok) ||
|
||||||
|
|
Loading…
Reference in New Issue