Huw Davies : gdi32: Use the gdi_image_bits structure to maintain the dib driver's bits.
Alexandre Julliard
julliard at winehq.org
Mon Aug 22 13:29:09 CDT 2011
Module: wine
Branch: master
Commit: 1e83fd0076c8c83240d5ecc0559fe828d27a52b6
URL: http://source.winehq.org/git/wine.git/?a=commit;h=1e83fd0076c8c83240d5ecc0559fe828d27a52b6
Author: Huw Davies <huw at codeweavers.com>
Date: Fri Aug 19 16:26:17 2011 +0100
gdi32: Use the gdi_image_bits structure to maintain the dib driver's bits.
---
dlls/gdi32/dibdrv/dc.c | 33 ++++++++++++++++++---------------
dlls/gdi32/dibdrv/objects.c | 14 ++++++++++----
dlls/gdi32/dibdrv/primitives.c | 14 +++++++-------
dlls/gdi32/gdi_private.h | 3 +--
4 files changed, 36 insertions(+), 28 deletions(-)
diff --git a/dlls/gdi32/dibdrv/dc.c b/dlls/gdi32/dibdrv/dc.c
index 2f93648..64769be 100644
--- a/dlls/gdi32/dibdrv/dc.c
+++ b/dlls/gdi32/dibdrv/dc.c
@@ -69,13 +69,15 @@ static void init_bit_fields(dib_info *dib, const DWORD *bit_fields)
static BOOL init_dib_info(dib_info *dib, const BITMAPINFOHEADER *bi, const DWORD *bit_fields,
RGBQUAD *color_table, int color_table_size, void *bits, enum dib_info_flags flags)
{
- dib->bit_count = bi->biBitCount;
- dib->width = bi->biWidth;
- dib->height = bi->biHeight;
- dib->stride = get_dib_stride( dib->width, dib->bit_count );
- dib->bits = bits;
- dib->ptr_to_free = NULL;
- dib->flags = flags;
+ dib->bit_count = bi->biBitCount;
+ dib->width = bi->biWidth;
+ dib->height = bi->biHeight;
+ dib->stride = get_dib_stride( dib->width, dib->bit_count );
+ dib->bits.ptr = bits;
+ dib->bits.is_copy = FALSE;
+ dib->bits.free = NULL;
+ dib->bits.param = NULL;
+ dib->flags = flags;
if(dib->height < 0) /* top-down */
{
@@ -84,7 +86,7 @@ static BOOL init_dib_info(dib_info *dib, const BITMAPINFOHEADER *bi, const DWORD
else /* bottom-up */
{
/* bits always points to the top-left corner and the stride is -ve */
- dib->bits = (BYTE*)dib->bits + (dib->height - 1) * dib->stride;
+ dib->bits.ptr = (BYTE*)dib->bits.ptr + (dib->height - 1) * dib->stride;
dib->stride = -dib->stride;
}
@@ -211,8 +213,9 @@ BOOL init_dib_info_from_bitmapinfo(dib_info *dib, const BITMAPINFO *info, void *
static void clear_dib_info(dib_info *dib)
{
dib->color_table = NULL;
- dib->bits = NULL;
- dib->ptr_to_free = NULL;
+ dib->bits.ptr = NULL;
+ dib->bits.free = NULL;
+ dib->bits.param = NULL;
}
/**********************************************************************
@@ -224,11 +227,9 @@ void free_dib_info(dib_info *dib)
{
if (dib->flags & private_color_table)
HeapFree(GetProcessHeap(), 0, dib->color_table);
- dib->color_table = NULL;
- HeapFree(GetProcessHeap(), 0, dib->ptr_to_free);
- dib->ptr_to_free = NULL;
- dib->bits = NULL;
+ if (dib->bits.free) dib->bits.free( &dib->bits );
+ clear_dib_info( dib );
}
void copy_dib_color_info(dib_info *dst, const dib_info *src)
@@ -423,7 +424,7 @@ static DWORD dibdrv_GetImage( PHYSDEV dev, HBITMAP hbitmap, BITMAPINFO *info,
if (bits)
{
- bits->ptr = dib->bits;
+ bits->ptr = dib->bits.ptr;
if (dib->stride < 0)
bits->ptr = (char *)bits->ptr + (dib->height - 1) * dib->stride;
bits->is_copy = FALSE;
@@ -479,6 +480,7 @@ static inline BOOL rop_uses_pat(DWORD rop)
return ((rop >> 4) & 0x0f0000) != (rop & 0x0f0000);
}
+
/***********************************************************************
* dibdrv_PutImage
*/
@@ -541,6 +543,7 @@ static DWORD dibdrv_PutImage( PHYSDEV dev, HBITMAP hbitmap, HRGN clip, BITMAPINF
}
init_dib_info_from_bitmapinfo( &src_dib, info, bits->ptr, 0 );
+ src_dib.bits.is_copy = bits->is_copy;
origin.x = src->visrect.left;
origin.y = src->visrect.top;
diff --git a/dlls/gdi32/dibdrv/objects.c b/dlls/gdi32/dibdrv/objects.c
index 15ce72f..d96f4bd 100644
--- a/dlls/gdi32/dibdrv/objects.c
+++ b/dlls/gdi32/dibdrv/objects.c
@@ -1089,7 +1089,7 @@ void free_pattern_brush( dibdrv_physdev *pdev )
static BOOL create_pattern_brush_bits(dibdrv_physdev *pdev)
{
DWORD size = pdev->brush_dib.height * abs(pdev->brush_dib.stride);
- DWORD *brush_bits = pdev->brush_dib.bits;
+ DWORD *brush_bits = pdev->brush_dib.bits.ptr;
DWORD *and_bits, *xor_bits;
assert(pdev->brush_and_bits == NULL);
@@ -1161,7 +1161,9 @@ static BOOL create_hatch_brush_bits(dibdrv_physdev *pdev)
hatch.bit_count = 1;
hatch.height = hatch.width = 8;
hatch.stride = 4;
- hatch.bits = (void *) hatches[pdev->brush_hatch];
+ hatch.bits.ptr = (void *) hatches[pdev->brush_hatch];
+ hatch.bits.free = hatch.bits.param = NULL;
+ hatch.bits.is_copy = FALSE;
fg_mask.and = pdev->brush_and;
fg_mask.xor = pdev->brush_xor;
@@ -1306,8 +1308,12 @@ HBRUSH dibdrv_SelectBrush( PHYSDEV dev, HBRUSH hbrush )
pdev->brush_dib.height = orig_dib.height;
pdev->brush_dib.width = orig_dib.width;
pdev->brush_dib.stride = get_dib_stride( pdev->brush_dib.width, pdev->brush_dib.bit_count );
- pdev->brush_dib.ptr_to_free = HeapAlloc( GetProcessHeap(), 0, pdev->brush_dib.height * pdev->brush_dib.stride );
- pdev->brush_dib.bits = pdev->brush_dib.ptr_to_free;
+
+ pdev->brush_dib.bits.param = NULL;
+ pdev->brush_dib.bits.ptr = HeapAlloc( GetProcessHeap(), 0,
+ pdev->brush_dib.height * pdev->brush_dib.stride );
+ pdev->brush_dib.bits.is_copy = TRUE;
+ pdev->brush_dib.bits.free = free_heap_bits;
rect.left = rect.top = 0;
rect.right = orig_dib.width;
diff --git a/dlls/gdi32/dibdrv/primitives.c b/dlls/gdi32/dibdrv/primitives.c
index 7b3468b..c102f9c 100644
--- a/dlls/gdi32/dibdrv/primitives.c
+++ b/dlls/gdi32/dibdrv/primitives.c
@@ -29,37 +29,37 @@ WINE_DEFAULT_DEBUG_CHANNEL(dib);
static inline DWORD *get_pixel_ptr_32(const dib_info *dib, int x, int y)
{
- return (DWORD *)((BYTE*)dib->bits + y * dib->stride + x * 4);
+ return (DWORD *)((BYTE*)dib->bits.ptr + y * dib->stride + x * 4);
}
static inline DWORD *get_pixel_ptr_24_dword(const dib_info *dib, int x, int y)
{
- return (DWORD *)((BYTE*)dib->bits + y * dib->stride) + x * 3 / 4;
+ return (DWORD *)((BYTE*)dib->bits.ptr + y * dib->stride) + x * 3 / 4;
}
static inline BYTE *get_pixel_ptr_24(const dib_info *dib, int x, int y)
{
- return (BYTE*)dib->bits + y * dib->stride + x * 3;
+ return (BYTE*)dib->bits.ptr + y * dib->stride + x * 3;
}
static inline WORD *get_pixel_ptr_16(const dib_info *dib, int x, int y)
{
- return (WORD *)((BYTE*)dib->bits + y * dib->stride + x * 2);
+ return (WORD *)((BYTE*)dib->bits.ptr + y * dib->stride + x * 2);
}
static inline BYTE *get_pixel_ptr_8(const dib_info *dib, int x, int y)
{
- return (BYTE*)dib->bits + y * dib->stride + x;
+ return (BYTE*)dib->bits.ptr + y * dib->stride + x;
}
static inline BYTE *get_pixel_ptr_4(const dib_info *dib, int x, int y)
{
- return (BYTE*)dib->bits + y * dib->stride + x / 2;
+ return (BYTE*)dib->bits.ptr + y * dib->stride + x / 2;
}
static inline BYTE *get_pixel_ptr_1(const dib_info *dib, int x, int y)
{
- return (BYTE*)dib->bits + y * dib->stride + x / 8;
+ return (BYTE*)dib->bits.ptr + y * dib->stride + x / 8;
}
static const BYTE pixel_masks_1[8] = {0x80, 0x40, 0x20, 0x10, 0x08, 0x04, 0x02, 0x01};
diff --git a/dlls/gdi32/gdi_private.h b/dlls/gdi32/gdi_private.h
index 3e3cc3c..f3ba2cf 100644
--- a/dlls/gdi32/gdi_private.h
+++ b/dlls/gdi32/gdi_private.h
@@ -83,8 +83,7 @@ typedef struct
{
int bit_count, width, height;
int stride; /* stride in bytes. Will be -ve for bottom-up dibs (see bits). */
- void *bits; /* points to the top-left corner of the dib. */
- void *ptr_to_free;
+ struct gdi_image_bits bits; /* bits.ptr points to the top-left corner of the dib. */
DWORD red_mask, green_mask, blue_mask;
int red_shift, green_shift, blue_shift;
More information about the wine-cvs
mailing list