From 04df4cffdf1b9dae70f8651244e84c1445e61189 Mon Sep 17 00:00:00 2001 From: Ulrich Czekalla Date: Sat, 23 Oct 1999 18:56:30 +0000 Subject: [PATCH] Copy bitmaps properly. --- objects/brush.c | 209 ++++++++++++++++++++++++++++++-------------------------- 1 file changed, 114 insertions(+), 95 deletions(-) diff --git a/objects/brush.c b/objects/brush.c index 3e30715aaf0..0ea8dec44a6 100644 --- a/objects/brush.c +++ b/objects/brush.c @@ -12,12 +12,98 @@ DEFAULT_DEBUG_CHANNEL(gdi) +static HGLOBAL16 dib_copy(BITMAPINFO *info, UINT coloruse) +{ + BITMAPINFO *newInfo; + HGLOBAL16 hmem; + INT size; + + if (info->bmiHeader.biCompression) + size = info->bmiHeader.biSizeImage; + else + size = DIB_GetDIBImageBytes(info->bmiHeader.biWidth, + info->bmiHeader.biHeight, + info->bmiHeader.biBitCount); + size += DIB_BitmapInfoSize( info, coloruse ); + + if (!(hmem = GlobalAlloc16( GMEM_MOVEABLE, size ))) + { + return 0; + } + newInfo = (BITMAPINFO *) GlobalLock16( hmem ); + memcpy( newInfo, info, size ); + GlobalUnlock16( hmem ); + return hmem; +} + + + +static BOOL create_brush_indirect(BRUSHOBJ *brushPtr, BOOL v16) +{ + LOGBRUSH *brush = &brushPtr->logbrush; + + switch (brush->lbStyle) + { + case BS_PATTERN8X8: + brush->lbStyle = BS_PATTERN; + case BS_PATTERN: + brush->lbHatch = (LONG)BITMAP_CopyBitmap( (HBITMAP) brush->lbHatch ); + if (! brush->lbHatch) + break; + return TRUE; + + case BS_DIBPATTERNPT: + brush->lbStyle = BS_DIBPATTERN; + brush->lbHatch = (LONG)dib_copy( (BITMAPINFO *) brush->lbHatch, + brush->lbColor); + if (! brush->lbHatch) + break; + return TRUE; + + case BS_DIBPATTERN8X8: + case BS_DIBPATTERN: + { + BITMAPINFO* bmi; + HGLOBAL h = brush->lbHatch; + + brush->lbStyle = BS_DIBPATTERN; + if (v16) + { + if (!(bmi = (BITMAPINFO *)GlobalLock16( h ))) + break; + } + else + { + if (!(bmi = (BITMAPINFO *)GlobalLock( h ))) + break; + } + + brush->lbHatch = dib_copy( bmi, brush->lbColor); + + if (v16) GlobalUnlock16( h ); + else GlobalUnlock( h ); + + if (!brush->lbHatch) + break; + + return TRUE; + } + + default: + if( brush->lbStyle <= BS_MONOPATTERN) + return TRUE; + } + + return FALSE; +} + /*********************************************************************** * CreateBrushIndirect16 (GDI.50) */ HBRUSH16 WINAPI CreateBrushIndirect16( const LOGBRUSH16 * brush ) { + BOOL success; BRUSHOBJ * brushPtr; HBRUSH16 hbrush = GDI_AllocObject( sizeof(BRUSHOBJ), BRUSH_MAGIC ); if (!hbrush) return 0; @@ -25,7 +111,13 @@ HBRUSH16 WINAPI CreateBrushIndirect16( const LOGBRUSH16 * brush ) brushPtr->logbrush.lbStyle = brush->lbStyle; brushPtr->logbrush.lbColor = brush->lbColor; brushPtr->logbrush.lbHatch = brush->lbHatch; + success = create_brush_indirect(brushPtr, TRUE); GDI_HEAP_UNLOCK( hbrush ); + if(!success) + { + GDI_FreeObject(hbrush); + hbrush = 0; + } TRACE("%04x\n", hbrush); return hbrush; } @@ -33,9 +125,16 @@ HBRUSH16 WINAPI CreateBrushIndirect16( const LOGBRUSH16 * brush ) /*********************************************************************** * CreateBrushIndirect32 (GDI32.27) + * + * BUGS + * As for Windows 95 and Windows 98: + * Creating brushes from bitmaps or DIBs larger than 8x8 pixels + * is not supported. If a larger bitmap is given, only a portion + * of the bitmap is used. */ HBRUSH WINAPI CreateBrushIndirect( const LOGBRUSH * brush ) { + BOOL success; BRUSHOBJ * brushPtr; HBRUSH hbrush = GDI_AllocObject( sizeof(BRUSHOBJ), BRUSH_MAGIC ); if (!hbrush) return 0; @@ -43,7 +142,13 @@ HBRUSH WINAPI CreateBrushIndirect( const LOGBRUSH * brush ) brushPtr->logbrush.lbStyle = brush->lbStyle; brushPtr->logbrush.lbColor = brush->lbColor; brushPtr->logbrush.lbHatch = brush->lbHatch; + success = create_brush_indirect(brushPtr, FALSE); GDI_HEAP_UNLOCK( hbrush ); + if(!success) + { + GDI_FreeObject(hbrush); + hbrush = 0; + } TRACE("%08x\n", hbrush); return hbrush; } @@ -54,16 +159,7 @@ HBRUSH WINAPI CreateBrushIndirect( const LOGBRUSH * brush ) */ HBRUSH16 WINAPI CreateHatchBrush16( INT16 style, COLORREF color ) { - LOGBRUSH logbrush; - - TRACE("%d %06lx\n", style, color ); - - logbrush.lbStyle = BS_HATCHED; - logbrush.lbColor = color; - logbrush.lbHatch = style; - - if ((style < 0) || (style >= NB_HATCH_STYLES)) return 0; - return CreateBrushIndirect( &logbrush ); + return CreateHatchBrush( style, color ); } @@ -80,7 +176,6 @@ HBRUSH WINAPI CreateHatchBrush( INT style, COLORREF color ) logbrush.lbColor = color; logbrush.lbHatch = style; - if ((style < 0) || (style >= NB_HATCH_STYLES)) return 0; return CreateBrushIndirect( &logbrush ); } @@ -102,10 +197,7 @@ HBRUSH WINAPI CreatePatternBrush( HBITMAP hbitmap ) LOGBRUSH logbrush = { BS_PATTERN, 0, 0 }; TRACE("%04x\n", hbitmap ); - logbrush.lbHatch = (INT)BITMAP_CopyBitmap( hbitmap ); - if(!logbrush.lbHatch) - return 0; - else + logbrush.lbHatch = hbitmap; return CreateBrushIndirect( &logbrush ); } @@ -115,39 +207,16 @@ HBRUSH WINAPI CreatePatternBrush( HBITMAP hbitmap ) */ HBRUSH16 WINAPI CreateDIBPatternBrush16( HGLOBAL16 hbitmap, UINT16 coloruse ) { - LOGBRUSH logbrush; - BITMAPINFO *info, *newInfo; - INT size; + LOGBRUSH16 logbrush; TRACE("%04x\n", hbitmap ); logbrush.lbStyle = BS_DIBPATTERN; logbrush.lbColor = coloruse; - logbrush.lbHatch = 0; - - /* Make a copy of the bitmap */ + logbrush.lbHatch = hbitmap; - if (!(info = (BITMAPINFO *)GlobalLock16( hbitmap ))) return 0; - - if (info->bmiHeader.biCompression) - size = info->bmiHeader.biSizeImage; - else - size = DIB_GetDIBImageBytes(info->bmiHeader.biWidth, - info->bmiHeader.biHeight, - info->bmiHeader.biBitCount); - size += DIB_BitmapInfoSize( info, coloruse ); - - if (!(logbrush.lbHatch = (INT16)GlobalAlloc16( GMEM_MOVEABLE, size ))) - { - GlobalUnlock16( hbitmap ); - return 0; + return CreateBrushIndirect16( &logbrush ); } - newInfo = (BITMAPINFO *) GlobalLock16( (HGLOBAL16)logbrush.lbHatch ); - memcpy( newInfo, info, size ); - GlobalUnlock16( (HGLOBAL16)logbrush.lbHatch ); - GlobalUnlock16( hbitmap ); - return CreateBrushIndirect( &logbrush ); -} /*********************************************************************** @@ -170,36 +239,14 @@ HBRUSH WINAPI CreateDIBPatternBrush( ) { LOGBRUSH logbrush; - BITMAPINFO *info, *newInfo; - INT size; TRACE("%04x\n", hbitmap ); logbrush.lbStyle = BS_DIBPATTERN; logbrush.lbColor = coloruse; - logbrush.lbHatch = 0; - /* Make a copy of the bitmap */ + logbrush.lbHatch = (LONG)hbitmap; - if (!(info = (BITMAPINFO *)GlobalLock( hbitmap ))) return 0; - - if (info->bmiHeader.biCompression) - size = info->bmiHeader.biSizeImage; - else - size = DIB_GetDIBImageBytes(info->bmiHeader.biWidth, - info->bmiHeader.biHeight, - info->bmiHeader.biBitCount); - size += DIB_BitmapInfoSize( info, coloruse ); - - if (!(logbrush.lbHatch = (INT)GlobalAlloc16( GMEM_MOVEABLE, size ))) - { - GlobalUnlock16( hbitmap ); - return 0; - } - newInfo = (BITMAPINFO *) GlobalLock16( (HGLOBAL16)logbrush.lbHatch ); - memcpy( newInfo, info, size ); - GlobalUnlock16( (HGLOBAL16)logbrush.lbHatch ); - GlobalUnlock( hbitmap ); return CreateBrushIndirect( &logbrush ); } @@ -223,34 +270,14 @@ HBRUSH WINAPI CreateDIBPatternBrushPt( { BITMAPINFO *info=(BITMAPINFO*)data; LOGBRUSH logbrush; - BITMAPINFO *newInfo; - INT size; TRACE("%p %ldx%ld %dbpp\n", info, info->bmiHeader.biWidth, info->bmiHeader.biHeight, info->bmiHeader.biBitCount); - logbrush.lbStyle = BS_DIBPATTERN; + logbrush.lbStyle = BS_DIBPATTERNPT; logbrush.lbColor = coloruse; - logbrush.lbHatch = 0; - - /* Make a copy of the bitmap */ + logbrush.lbHatch = (LONG) data; - - if (info->bmiHeader.biCompression) - size = info->bmiHeader.biSizeImage; - else - size = DIB_GetDIBImageBytes(info->bmiHeader.biWidth, - info->bmiHeader.biHeight, - info->bmiHeader.biBitCount); - size += DIB_BitmapInfoSize( info, coloruse ); - - if (!(logbrush.lbHatch = (INT)GlobalAlloc16( GMEM_MOVEABLE, size ))) - { - return 0; - } - newInfo = (BITMAPINFO *) GlobalLock16( (HGLOBAL16)logbrush.lbHatch ); - memcpy( newInfo, info, size ); - GlobalUnlock16( (HGLOBAL16)logbrush.lbHatch ); return CreateBrushIndirect( &logbrush ); } @@ -260,15 +287,7 @@ HBRUSH WINAPI CreateDIBPatternBrushPt( */ HBRUSH16 WINAPI CreateSolidBrush16( COLORREF color ) { - LOGBRUSH logbrush; - - TRACE("%06lx\n", color ); - - logbrush.lbStyle = BS_SOLID; - logbrush.lbColor = color; - logbrush.lbHatch = 0; - - return CreateBrushIndirect( &logbrush ); + return CreateSolidBrush( color ); } -- 2.11.4.GIT