[PATCH 2/4] win32u: Use freelist cache allocator for NtGdiCreateBitmap.
Jinoh Kang
jinoh.kang.kr at gmail.com
Sun Mar 20 15:42:36 CDT 2022
Signed-off-by: Jinoh Kang <jinoh.kang.kr at gmail.com>
---
dlls/win32u/bitmap.c | 12 +++++++++---
1 file changed, 9 insertions(+), 3 deletions(-)
diff --git a/dlls/win32u/bitmap.c b/dlls/win32u/bitmap.c
index 2be88715948..dd0dfce4069 100644
--- a/dlls/win32u/bitmap.c
+++ b/dlls/win32u/bitmap.c
@@ -159,7 +159,7 @@ HBITMAP WINAPI NtGdiCreateBitmap( INT width, INT height, UINT planes,
bmpobj->dib.dsBm.bmWidthBytes = get_bitmap_stride( width, bpp );
bmpobj->dib.dsBm.bmPlanes = planes;
bmpobj->dib.dsBm.bmBitsPixel = bpp;
- bmpobj->dib.dsBm.bmBits = calloc( 1, size );
+ bmpobj->dib.dsBm.bmBits = alloc_gdi_cache_memory( size, TRUE );
if (!bmpobj->dib.dsBm.bmBits)
{
free( bmpobj );
@@ -169,7 +169,7 @@ HBITMAP WINAPI NtGdiCreateBitmap( INT width, INT height, UINT planes,
if (!(hbitmap = alloc_gdi_handle( &bmpobj->obj, NTGDI_OBJ_BITMAP, &bitmap_funcs )))
{
- free( bmpobj->dib.dsBm.bmBits );
+ free_gdi_cache_memory( bmpobj->dib.dsBm.bmBits, size );
free( bmpobj );
return 0;
}
@@ -444,9 +444,15 @@ HGDIOBJ WINAPI NtGdiSelectBitmap( HDC hdc, HGDIOBJ handle )
static BOOL BITMAP_DeleteObject( HGDIOBJ handle )
{
BITMAPOBJ *bmp = free_gdi_handle( handle );
+ INT dib_stride;
+ SIZE_T size;
if (!bmp) return FALSE;
- free( bmp->dib.dsBm.bmBits );
+
+ dib_stride = get_dib_stride( bmp->dib.dsBm.bmWidth, bmp->dib.dsBm.bmBitsPixel );
+ size = dib_stride * bmp->dib.dsBm.bmHeight;
+
+ free_gdi_cache_memory( bmp->dib.dsBm.bmBits, size );
free( bmp );
return TRUE;
}
--
2.34.1
More information about the wine-devel
mailing list