gdi32: Grab the bits directly for DIB pattern brushes instead of duplicating the bitmap.
This commit is contained in:
parent
c88f4d452f
commit
cc673f44c7
|
@ -90,6 +90,44 @@ static BOOL store_bitmap_bits( BRUSHOBJ *brush, BITMAPOBJ *bmp )
|
||||||
return TRUE;
|
return TRUE;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static BOOL copy_bitmap( BRUSHOBJ *brush, HBITMAP bitmap )
|
||||||
|
{
|
||||||
|
BITMAPINFO *info;
|
||||||
|
BITMAPOBJ *bmp = GDI_GetObjPtr( bitmap, OBJ_BITMAP );
|
||||||
|
|
||||||
|
if (!bmp) return FALSE;
|
||||||
|
|
||||||
|
if (!bmp->dib)
|
||||||
|
{
|
||||||
|
GDI_ReleaseObj( bitmap );
|
||||||
|
brush->bitmap = BITMAP_CopyBitmap( bitmap );
|
||||||
|
return brush->bitmap != 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
info = HeapAlloc( GetProcessHeap(), 0,
|
||||||
|
bitmap_info_size( (BITMAPINFO *)&bmp->dib->dsBmih, DIB_RGB_COLORS ));
|
||||||
|
if (!info) goto done;
|
||||||
|
info->bmiHeader = bmp->dib->dsBmih;
|
||||||
|
if (bmp->dib->dsBmih.biCompression == BI_BITFIELDS)
|
||||||
|
memcpy( &info->bmiHeader + 1, bmp->dib->dsBitfields, sizeof(bmp->dib->dsBitfields) );
|
||||||
|
else if (bmp->nb_colors)
|
||||||
|
memcpy( &info->bmiHeader + 1, bmp->color_table, bmp->nb_colors * sizeof(RGBQUAD) );
|
||||||
|
if (!(brush->bits.ptr = HeapAlloc( GetProcessHeap(), 0, get_dib_image_size( info ))))
|
||||||
|
{
|
||||||
|
HeapFree( GetProcessHeap(), 0, info );
|
||||||
|
goto done;
|
||||||
|
}
|
||||||
|
memcpy( brush->bits.ptr, bmp->dib->dsBm.bmBits, get_dib_image_size( info ));
|
||||||
|
brush->bits.is_copy = TRUE;
|
||||||
|
brush->bits.free = free_heap_bits;
|
||||||
|
brush->info = info;
|
||||||
|
brush->usage = DIB_RGB_COLORS;
|
||||||
|
|
||||||
|
done:
|
||||||
|
GDI_ReleaseObj( bitmap );
|
||||||
|
return brush->info != NULL;
|
||||||
|
}
|
||||||
|
|
||||||
BOOL get_brush_bitmap_info( HBRUSH handle, BITMAPINFO *info, void **bits, UINT *usage )
|
BOOL get_brush_bitmap_info( HBRUSH handle, BITMAPINFO *info, void **bits, UINT *usage )
|
||||||
{
|
{
|
||||||
BRUSHOBJ *brush;
|
BRUSHOBJ *brush;
|
||||||
|
@ -159,8 +197,7 @@ HBRUSH WINAPI CreateBrushIndirect( const LOGBRUSH * brush )
|
||||||
ptr->logbrush.lbStyle = BS_PATTERN;
|
ptr->logbrush.lbStyle = BS_PATTERN;
|
||||||
/* fall through */
|
/* fall through */
|
||||||
case BS_PATTERN:
|
case BS_PATTERN:
|
||||||
ptr->bitmap = BITMAP_CopyBitmap( (HBITMAP)ptr->logbrush.lbHatch );
|
if (!copy_bitmap( ptr, (HBITMAP)ptr->logbrush.lbHatch )) goto error;
|
||||||
if (!ptr->bitmap) goto error;
|
|
||||||
ptr->logbrush.lbColor = 0;
|
ptr->logbrush.lbColor = 0;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue