Alexandre Julliard : gdi32: Sanitize the DIB information for DIB pattern brushes.
Alexandre Julliard
julliard at winehq.org
Wed Nov 2 14:23:34 CDT 2011
Module: wine
Branch: master
Commit: 7f7dd82c7b2dae9bd11a299ba9a19ff2f73a6178
URL: http://source.winehq.org/git/wine.git/?a=commit;h=7f7dd82c7b2dae9bd11a299ba9a19ff2f73a6178
Author: Alexandre Julliard <julliard at winehq.org>
Date: Wed Nov 2 12:22:44 2011 +0100
gdi32: Sanitize the DIB information for DIB pattern brushes.
---
dlls/gdi32/brush.c | 21 +++------------------
dlls/gdi32/dib.c | 17 +++++++++++++++++
dlls/gdi32/gdi_private.h | 1 +
dlls/gdi32/tests/brush.c | 10 ++++++++++
4 files changed, 31 insertions(+), 18 deletions(-)
diff --git a/dlls/gdi32/brush.c b/dlls/gdi32/brush.c
index 222ba42..45874af 100644
--- a/dlls/gdi32/brush.c
+++ b/dlls/gdi32/brush.c
@@ -53,21 +53,6 @@ static const struct gdi_obj_funcs brush_funcs =
BRUSH_DeleteObject /* pDeleteObject */
};
-static void *dib_copy(const BITMAPINFO *info, UINT coloruse)
-{
- BITMAPINFO *newInfo;
- INT size;
-
- if (info->bmiHeader.biCompression != BI_RGB && info->bmiHeader.biCompression != BI_BITFIELDS)
- size = info->bmiHeader.biSizeImage;
- else
- size = get_dib_image_size(info);
- size += bitmap_info_size( info, coloruse );
-
- if ((newInfo = HeapAlloc( GetProcessHeap(), 0, size ))) memcpy( newInfo, info, size );
- return newInfo;
-}
-
/***********************************************************************
* CreateBrushIndirect (GDI32.@)
@@ -117,8 +102,8 @@ HBRUSH WINAPI CreateBrushIndirect( const LOGBRUSH * brush )
case BS_DIBPATTERNPT:
ptr->logbrush.lbStyle = BS_DIBPATTERN;
- ptr->logbrush.lbHatch = (ULONG_PTR)dib_copy( (BITMAPINFO *) ptr->logbrush.lbHatch,
- ptr->logbrush.lbColor);
+ ptr->logbrush.lbHatch = (ULONG_PTR)copy_packed_dib( (BITMAPINFO *) ptr->logbrush.lbHatch,
+ ptr->logbrush.lbColor );
if (!ptr->logbrush.lbHatch) goto error;
break;
@@ -129,7 +114,7 @@ HBRUSH WINAPI CreateBrushIndirect( const LOGBRUSH * brush )
ptr->logbrush.lbStyle = BS_DIBPATTERN;
if (!(bmi = GlobalLock( h ))) goto error;
- ptr->logbrush.lbHatch = (ULONG_PTR)dib_copy( bmi, ptr->logbrush.lbColor);
+ ptr->logbrush.lbHatch = (ULONG_PTR)copy_packed_dib( bmi, ptr->logbrush.lbColor );
GlobalUnlock( h );
if (!ptr->logbrush.lbHatch) goto error;
break;
diff --git a/dlls/gdi32/dib.c b/dlls/gdi32/dib.c
index 7cc24a6..b9f9f3b 100644
--- a/dlls/gdi32/dib.c
+++ b/dlls/gdi32/dib.c
@@ -1113,6 +1113,23 @@ void get_ddb_bitmapinfo( BITMAPOBJ *bmp, BITMAPINFO *info )
if (info->bmiHeader.biBitCount <= 8) fill_default_color_table( info );
}
+BITMAPINFO *copy_packed_dib( const BITMAPINFO *src_info, UINT usage )
+{
+ char buffer[FIELD_OFFSET( BITMAPINFO, bmiColors[256] )];
+ BITMAPINFO *ret, *info = (BITMAPINFO *)buffer;
+ int info_size, image_size;
+
+ if (!bitmapinfo_from_user_bitmapinfo( info, src_info, usage, FALSE )) return NULL;
+
+ info_size = bitmap_info_size( info, usage );
+ image_size = get_dib_image_size( info );
+ if ((ret = HeapAlloc( GetProcessHeap(), 0, info_size + image_size )))
+ {
+ memcpy( ret, info, info_size );
+ memcpy( (char *)ret + info_size, (char *)src_info + bitmap_info_size(src_info,usage), image_size );
+ }
+ return ret;
+}
/******************************************************************************
* GetDIBits [GDI32.@]
diff --git a/dlls/gdi32/gdi_private.h b/dlls/gdi32/gdi_private.h
index 9ecb3b1..ddeb0bd 100644
--- a/dlls/gdi32/gdi_private.h
+++ b/dlls/gdi32/gdi_private.h
@@ -230,6 +230,7 @@ extern DWORD stretch_bits( const BITMAPINFO *src_info, struct bitblt_coords *src
/* bitmap.c */
extern void get_ddb_bitmapinfo( BITMAPOBJ *bmp, BITMAPINFO *info ) DECLSPEC_HIDDEN;
+extern BITMAPINFO *copy_packed_dib( const BITMAPINFO *src_info, UINT usage ) DECLSPEC_HIDDEN;
extern BOOL get_bitmap_image( HBITMAP hbitmap, BITMAPINFO *info, struct gdi_image_bits *bits ) DECLSPEC_HIDDEN;
extern HBITMAP BITMAP_CopyBitmap( HBITMAP hbitmap ) DECLSPEC_HIDDEN;
extern BOOL BITMAP_SetOwnerDC( HBITMAP hbitmap, PHYSDEV physdev ) DECLSPEC_HIDDEN;
diff --git a/dlls/gdi32/tests/brush.c b/dlls/gdi32/tests/brush.c
index 3742608..a02209f 100644
--- a/dlls/gdi32/tests/brush.c
+++ b/dlls/gdi32/tests/brush.c
@@ -192,6 +192,16 @@ static void test_pattern_brush(void)
ret = GlobalFlags( mem );
ok( ret == 2, "wrong flags %x\n", ret );
+ info->bmiHeader.biBitCount = 8;
+ info->bmiHeader.biCompression = BI_RLE8;
+ brush = CreateDIBPatternBrushPt( info, DIB_RGB_COLORS );
+ ok( !brush, "CreateDIBPatternBrushPt succeeded\n" );
+
+ info->bmiHeader.biBitCount = 4;
+ info->bmiHeader.biCompression = BI_RLE4;
+ brush = CreateDIBPatternBrushPt( info, DIB_RGB_COLORS );
+ ok( !brush, "CreateDIBPatternBrushPt succeeded\n" );
+
br.lbStyle = BS_DIBPATTERN8X8;
br.lbColor = DIB_RGB_COLORS;
br.lbHatch = (ULONG_PTR)mem;
More information about the wine-cvs
mailing list