Vincent Povirk : gdiplus: Implement GetPixel for indexed color bitmaps.
Alexandre Julliard
julliard at winehq.org
Mon Feb 1 08:55:57 CST 2010
Module: wine
Branch: master
Commit: 4d53a4c9f540275314111c1e26b2cddbb83a0a8f
URL: http://source.winehq.org/git/wine.git/?a=commit;h=4d53a4c9f540275314111c1e26b2cddbb83a0a8f
Author: Vincent Povirk <vincent at codeweavers.com>
Date: Sat Jan 30 19:01:52 2010 -0600
gdiplus: Implement GetPixel for indexed color bitmaps.
---
dlls/gdiplus/image.c | 33 ++++++++++++++++++++++++++++++++-
dlls/gdiplus/tests/image.c | 12 ++++++------
2 files changed, 38 insertions(+), 7 deletions(-)
diff --git a/dlls/gdiplus/image.c b/dlls/gdiplus/image.c
index 4d6448e..4fd593f 100644
--- a/dlls/gdiplus/image.c
+++ b/dlls/gdiplus/image.c
@@ -94,6 +94,24 @@ GpStatus WINGDIPAPI GdipBitmapCreateApplyEffect(GpBitmap** inputBitmaps,
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,
const BYTE *row, UINT x)
{
@@ -211,6 +229,7 @@ GpStatus WINGDIPAPI GdipBitmapGetPixel(GpBitmap* bitmap, INT x, INT y,
ARGB *color)
{
BYTE r, g, b, a;
+ BYTE index;
BYTE *row;
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)
{
+ 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:
getpixel_16bppGrayScale(&r,&g,&b,&a,row,x);
break;
@@ -260,7 +288,10 @@ GpStatus WINGDIPAPI GdipBitmapGetPixel(GpBitmap* bitmap, INT x, INT y,
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;
}
diff --git a/dlls/gdiplus/tests/image.c b/dlls/gdiplus/tests/image.c
index 53d66e0..10dc21e 100644
--- a/dlls/gdiplus/tests/image.c
+++ b/dlls/gdiplus/tests/image.c
@@ -1181,8 +1181,8 @@ static void test_palette(void)
/* test getting/setting pixels */
stat = GdipBitmapGetPixel(bitmap, 0, 0, &color);
- todo_wine expect(Ok, stat);
- todo_wine expect(0xff000000, color);
+ expect(Ok, stat);
+ expect(0xff000000, color);
stat = GdipBitmapSetPixel(bitmap, 0, 1, 0xffffffff);
todo_wine ok((stat == Ok) ||
@@ -1214,8 +1214,8 @@ static void test_palette(void)
/* test getting/setting pixels */
stat = GdipBitmapGetPixel(bitmap, 0, 0, &color);
- todo_wine expect(Ok, stat);
- todo_wine expect(0xff000000, color);
+ expect(Ok, stat);
+ expect(0xff000000, color);
stat = GdipBitmapSetPixel(bitmap, 0, 1, 0xffff00ff);
todo_wine ok((stat == Ok) ||
@@ -1247,8 +1247,8 @@ static void test_palette(void)
/* test getting/setting pixels */
stat = GdipBitmapGetPixel(bitmap, 0, 0, &color);
- todo_wine expect(Ok, stat);
- todo_wine expect(0xff000000, color);
+ expect(Ok, stat);
+ expect(0xff000000, color);
stat = GdipBitmapSetPixel(bitmap, 0, 1, 0xffcccccc);
todo_wine ok((stat == Ok) ||
More information about the wine-cvs
mailing list