Huw Davies : gdi32: Add a dib primitive function table.
Alexandre Julliard
julliard at winehq.org
Tue Apr 5 11:23:32 CDT 2011
Module: wine
Branch: master
Commit: 0c5e7a6d4dcf07855742bb339a17e7f7ee0a196c
URL: http://source.winehq.org/git/wine.git/?a=commit;h=0c5e7a6d4dcf07855742bb339a17e7f7ee0a196c
Author: Huw Davies <huw at codeweavers.com>
Date: Tue Apr 5 13:23:20 2011 +0100
gdi32: Add a dib primitive function table.
---
dlls/gdi32/Makefile.in | 1 +
dlls/gdi32/dibdrv/dc.c | 20 +++++++++++++++++++
dlls/gdi32/dibdrv/dibdrv.h | 8 +++++++
dlls/gdi32/dibdrv/primitives.c | 42 ++++++++++++++++++++++++++++++++++++++++
dlls/gdi32/gdi_private.h | 2 +
5 files changed, 73 insertions(+), 0 deletions(-)
diff --git a/dlls/gdi32/Makefile.in b/dlls/gdi32/Makefile.in
index 13b1a72..9753ef4 100644
--- a/dlls/gdi32/Makefile.in
+++ b/dlls/gdi32/Makefile.in
@@ -15,6 +15,7 @@ C_SRCS = \
dc.c \
dib.c \
dibdrv/dc.c \
+ dibdrv/primitives.c \
driver.c \
enhmetafile.c \
enhmfdrv/bitblt.c \
diff --git a/dlls/gdi32/dibdrv/dc.c b/dlls/gdi32/dibdrv/dc.c
index d105f60..a230fbf 100644
--- a/dlls/gdi32/dibdrv/dc.c
+++ b/dlls/gdi32/dibdrv/dc.c
@@ -36,6 +36,13 @@ static BOOL CDECL dibdrv_DeleteDC( PHYSDEV dev )
return 0;
}
+static void init_bit_fields(dib_info *dib, const DWORD *bit_fields)
+{
+ dib->red_mask = bit_fields[0];
+ dib->green_mask = bit_fields[1];
+ dib->blue_mask = bit_fields[2];
+}
+
static BOOL init_dib(dib_info *dib, const BITMAPINFOHEADER *bi, const DWORD *bit_fields, void *bits)
{
dib->bit_count = bi->biBitCount;
@@ -55,8 +62,21 @@ static BOOL init_dib(dib_info *dib, const BITMAPINFOHEADER *bi, const DWORD *bit
dib->stride = -dib->stride;
}
+ dib->funcs = &funcs_null;
+
switch(dib->bit_count)
{
+ case 32:
+ init_bit_fields(dib, bit_fields);
+ if(dib->red_mask == 0xff0000 && dib->green_mask == 0x00ff00 && dib->blue_mask == 0x0000ff)
+ dib->funcs = &funcs_8888;
+ else
+ {
+ TRACE("32 bpp bitmasks not supported, will forward to graphics driver.\n");
+ return FALSE;
+ }
+ break;
+
default:
TRACE("bpp %d not supported, will forward to graphics driver.\n", dib->bit_count);
return FALSE;
diff --git a/dlls/gdi32/dibdrv/dibdrv.h b/dlls/gdi32/dibdrv/dibdrv.h
index 9dca50f..da41f21 100644
--- a/dlls/gdi32/dibdrv/dibdrv.h
+++ b/dlls/gdi32/dibdrv/dibdrv.h
@@ -22,3 +22,11 @@ static inline dibdrv_physdev *get_dibdrv_pdev( PHYSDEV dev )
{
return (dibdrv_physdev *)dev;
}
+
+typedef struct primitive_funcs
+{
+ DWORD (* colorref_to_pixel)(const dib_info *dib, COLORREF color);
+} primitive_funcs;
+
+extern const primitive_funcs funcs_8888 DECLSPEC_HIDDEN;
+extern const primitive_funcs funcs_null DECLSPEC_HIDDEN;
diff --git a/dlls/gdi32/dibdrv/primitives.c b/dlls/gdi32/dibdrv/primitives.c
new file mode 100644
index 0000000..8bbfc4d
--- /dev/null
+++ b/dlls/gdi32/dibdrv/primitives.c
@@ -0,0 +1,42 @@
+/*
+ * DIB driver primitives.
+ *
+ * Copyright 2011 Huw Davies
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+ */
+
+#include "gdi_private.h"
+#include "dibdrv.h"
+
+static DWORD colorref_to_pixel_888(const dib_info *dib, COLORREF color)
+{
+ return ( ((color >> 16) & 0xff) | (color & 0xff00) | ((color << 16) & 0xff0000) );
+}
+
+static DWORD colorref_to_pixel_null(const dib_info *dib, COLORREF color)
+{
+ return 0;
+}
+
+const primitive_funcs funcs_8888 =
+{
+ colorref_to_pixel_888
+};
+
+const primitive_funcs funcs_null =
+{
+ colorref_to_pixel_null
+};
diff --git a/dlls/gdi32/gdi_private.h b/dlls/gdi32/gdi_private.h
index 5849d88..8aa23bd 100644
--- a/dlls/gdi32/gdi_private.h
+++ b/dlls/gdi32/gdi_private.h
@@ -86,6 +86,8 @@ typedef struct
void *bits; /* points to the top-left corner of the dib. */
DWORD red_mask, green_mask, blue_mask;
+
+ const struct primitive_funcs *funcs;
} dib_info;
typedef struct dibdrv_physdev
More information about the wine-cvs
mailing list