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