[PATCH 4/4] win32u: Use alloc_gdi_cache_bits in place of malloc / free.
Jinoh Kang
jinoh.kang.kr at gmail.com
Sun Mar 20 15:42:52 CDT 2022
Signed-off-by: Jinoh Kang <jinoh.kang.kr at gmail.com>
---
dlls/win32u/bitblt.c | 34 +++++++++++++---------------------
dlls/win32u/bitmap.c | 4 +---
dlls/win32u/brush.c | 3 +--
dlls/win32u/dib.c | 12 ++++++------
dlls/win32u/dibdrv/bitblt.c | 18 +++++-------------
dlls/win32u/dibdrv/objects.c | 5 ++---
dlls/win32u/font.c | 25 +++++++------------------
7 files changed, 35 insertions(+), 66 deletions(-)
diff --git a/dlls/win32u/bitblt.c b/dlls/win32u/bitblt.c
index 44bee3ef80a..d9abe243b5a 100644
--- a/dlls/win32u/bitblt.c
+++ b/dlls/win32u/bitblt.c
@@ -190,7 +190,7 @@ BOOL alloc_gdi_cache_bits( struct gdi_image_bits *bits, SIZE_T size, int flags )
DWORD convert_bits( const BITMAPINFO *src_info, struct bitblt_coords *src,
BITMAPINFO *dst_info, struct gdi_image_bits *bits )
{
- void *ptr;
+ struct gdi_image_bits new_bits;
DWORD err;
BOOL top_down = dst_info->bmiHeader.biHeight < 0;
@@ -199,14 +199,12 @@ DWORD convert_bits( const BITMAPINFO *src_info, struct bitblt_coords *src,
dst_info->bmiHeader.biSizeImage = get_dib_image_size( dst_info );
if (top_down) dst_info->bmiHeader.biHeight = -dst_info->bmiHeader.biHeight;
- if (!(ptr = malloc( dst_info->bmiHeader.biSizeImage )))
+ if (!alloc_gdi_cache_bits( &new_bits, dst_info->bmiHeader.biSizeImage, ALLOC_IS_COPY ))
return ERROR_OUTOFMEMORY;
- err = convert_bitmapinfo( src_info, bits->ptr, src, dst_info, ptr );
+ err = convert_bitmapinfo( src_info, bits->ptr, src, dst_info, new_bits.ptr );
if (bits->free) bits->free( bits );
- bits->ptr = ptr;
- bits->is_copy = TRUE;
- bits->free = free_heap_bits;
+ *bits = new_bits;
return err;
}
@@ -214,7 +212,7 @@ DWORD stretch_bits( const BITMAPINFO *src_info, struct bitblt_coords *src,
BITMAPINFO *dst_info, struct bitblt_coords *dst,
struct gdi_image_bits *bits, int mode )
{
- void *ptr;
+ struct gdi_image_bits new_bits;
DWORD err;
dst_info->bmiHeader.biWidth = dst->visrect.right - dst->visrect.left;
@@ -222,14 +220,12 @@ DWORD stretch_bits( const BITMAPINFO *src_info, struct bitblt_coords *src,
dst_info->bmiHeader.biSizeImage = get_dib_image_size( dst_info );
if (src_info->bmiHeader.biHeight < 0) dst_info->bmiHeader.biHeight = -dst_info->bmiHeader.biHeight;
- if (!(ptr = malloc( dst_info->bmiHeader.biSizeImage )))
+ if (!alloc_gdi_cache_bits( &new_bits, dst_info->bmiHeader.biSizeImage, ALLOC_IS_COPY ))
return ERROR_OUTOFMEMORY;
- err = stretch_bitmapinfo( src_info, bits->ptr, src, dst_info, ptr, dst, mode );
+ err = stretch_bitmapinfo( src_info, bits->ptr, src, dst_info, new_bits.ptr, dst, mode );
if (bits->free) bits->free( bits );
- bits->ptr = ptr;
- bits->is_copy = TRUE;
- bits->free = free_heap_bits;
+ *bits = new_bits;
return err;
}
@@ -240,13 +236,11 @@ static DWORD blend_bits( const BITMAPINFO *src_info, const struct gdi_image_bits
if (!dst_bits->is_copy)
{
int size = dst_info->bmiHeader.biSizeImage;
- void *ptr = malloc( size );
- if (!ptr) return ERROR_OUTOFMEMORY;
- memcpy( ptr, dst_bits->ptr, size );
+ struct gdi_image_bits new_bits;
+ if (!alloc_gdi_cache_bits( &new_bits, size, ALLOC_IS_COPY )) return ERROR_OUTOFMEMORY;
+ memcpy( new_bits.ptr, dst_bits->ptr, size );
if (dst_bits->free) dst_bits->free( dst_bits );
- dst_bits->ptr = ptr;
- dst_bits->is_copy = TRUE;
- dst_bits->free = free_heap_bits;
+ *dst_bits = new_bits;
}
return blend_bitmapinfo( src_info, src_bits->ptr, src, dst_info, dst_bits->ptr, dst, blend );
}
@@ -489,10 +483,8 @@ BOOL CDECL nulldrv_GradientFill( PHYSDEV dev, TRIVERTEX *vert_array, ULONG nvert
if (err && err != ERROR_BAD_FORMAT) goto done;
info->bmiHeader.biSizeImage = get_dib_image_size( info );
- if (!(bits.ptr = calloc( 1, info->bmiHeader.biSizeImage )))
+ if (!alloc_gdi_cache_bits( &bits, info->bmiHeader.biSizeImage, ALLOC_ZERO_MEMORY | ALLOC_IS_COPY ))
goto done;
- bits.is_copy = TRUE;
- bits.free = free_heap_bits;
/* make src and points relative to the bitmap */
src = dst;
diff --git a/dlls/win32u/bitmap.c b/dlls/win32u/bitmap.c
index dd0dfce4069..172e708178c 100644
--- a/dlls/win32u/bitmap.c
+++ b/dlls/win32u/bitmap.c
@@ -322,13 +322,11 @@ LONG WINAPI NtGdiSetBitmapBits(
}
else
{
- if (!(src_bits.ptr = malloc( dst.height * dst_stride )))
+ if (!alloc_gdi_cache_bits( &src_bits, dst.height * dst_stride, ALLOC_IS_COPY ))
{
GDI_ReleaseObj( hbitmap );
return 0;
}
- src_bits.is_copy = TRUE;
- src_bits.free = free_heap_bits;
for (i = 0; i < count / src_stride; i++)
memcpy( (char *)src_bits.ptr + i * dst_stride, (char *)bits + i * src_stride, src_stride );
if (count % src_stride)
diff --git a/dlls/win32u/brush.c b/dlls/win32u/brush.c
index f9b718b4d2e..b12d88d25a4 100644
--- a/dlls/win32u/brush.c
+++ b/dlls/win32u/brush.c
@@ -73,9 +73,8 @@ static BOOL copy_bitmap( struct brush_pattern *brush, HBITMAP bitmap )
brush->bits = bits;
if (!bits.free)
{
- if (!(brush->bits.ptr = malloc( info->bmiHeader.biSizeImage ))) goto done;
+ if (!alloc_gdi_cache_bits( &brush->bits, info->bmiHeader.biSizeImage, 0 )) goto done;
memcpy( brush->bits.ptr, bits.ptr, info->bmiHeader.biSizeImage );
- brush->bits.free = free_heap_bits;
}
if (!(brush->info = malloc( get_dib_info_size( info, DIB_RGB_COLORS ))))
diff --git a/dlls/win32u/dib.c b/dlls/win32u/dib.c
index ee82d1a8ed8..7150908b2ab 100644
--- a/dlls/win32u/dib.c
+++ b/dlls/win32u/dib.c
@@ -67,6 +67,7 @@
#include <stdlib.h>
#include <string.h>
#include <assert.h>
+#include <sys/mman.h>
#include "ntstatus.h"
#define WIN32_NO_STATUS
@@ -323,14 +324,15 @@ static BOOL build_rle_bitmap( BITMAPINFO *info, struct gdi_image_bits *bits, HRG
int x, y, width = info->bmiHeader.biWidth, height = info->bmiHeader.biHeight;
HRGN run = NULL;
BYTE skip, num, data;
- BYTE *out_bits, *in_bits = bits->ptr;
+ BYTE *out_bits = NULL, *in_bits = bits->ptr;
+ struct gdi_image_bits new_bits;
if (clip) *clip = NULL;
assert( info->bmiHeader.biBitCount == 4 || info->bmiHeader.biBitCount == 8 );
- out_bits = calloc( 1, get_dib_image_size( info ) );
- if (!out_bits) goto fail;
+ if (!alloc_gdi_cache_bits( &new_bits, get_dib_image_size( info ), ALLOC_ZERO_MEMORY | ALLOC_IS_COPY)) goto fail;
+ out_bits = new_bits.ptr;
if (clip)
{
@@ -446,9 +448,7 @@ done:
if (run) NtGdiDeleteObjectApp( run );
if (bits->free) bits->free( bits );
- bits->ptr = out_bits;
- bits->is_copy = TRUE;
- bits->free = free_heap_bits;
+ *bits = new_bits;
info->bmiHeader.biSizeImage = get_dib_image_size( info );
return TRUE;
diff --git a/dlls/win32u/dibdrv/bitblt.c b/dlls/win32u/dibdrv/bitblt.c
index 76330679e59..3a9c28bf9bf 100644
--- a/dlls/win32u/dibdrv/bitblt.c
+++ b/dlls/win32u/dibdrv/bitblt.c
@@ -699,22 +699,19 @@ static DWORD copy_src_bits( dib_info *src, RECT *src_rect )
{
int y, stride = get_dib_stride( src->width, src->bit_count );
int height = src_rect->bottom - src_rect->top;
- void *ptr = malloc( stride * height );
+ struct gdi_image_bits new_bits;
- if (!ptr) return ERROR_OUTOFMEMORY;
+ if (!alloc_gdi_cache_bits( &new_bits, stride * height, ALLOC_IS_COPY )) return ERROR_OUTOFMEMORY;
for (y = 0; y < height; y++)
- memcpy( (char *)ptr + y * stride,
+ memcpy( (char *)new_bits.ptr + y * stride,
(char *)src->bits.ptr + (src->rect.top + src_rect->top + y) * src->stride, stride );
src->stride = stride;
src->height = height;
src->rect.top = 0;
src->rect.bottom = height;
if (src->bits.free) src->bits.free( &src->bits );
- src->bits.is_copy = TRUE;
- src->bits.ptr = ptr;
- src->bits.free = free_heap_bits;
- src->bits.param = NULL;
+ src->bits = new_bits;
offset_rect( src_rect, 0, -src_rect->top );
return ERROR_SUCCESS;
@@ -730,12 +727,7 @@ static DWORD create_tmp_dib( const dib_info *copy, int width, int height, dib_in
ret->rect.top = 0;
ret->rect.right = width;
ret->rect.bottom = height;
- ret->bits.ptr = malloc( ret->height * ret->stride );
- ret->bits.is_copy = TRUE;
- ret->bits.free = free_heap_bits;
- ret->bits.param = NULL;
-
- return ret->bits.ptr ? ERROR_SUCCESS : ERROR_OUTOFMEMORY;
+ return alloc_gdi_cache_bits( &ret->bits, ret->height * ret->stride, ALLOC_IS_COPY ) ? ERROR_SUCCESS : ERROR_OUTOFMEMORY;
}
static DWORD execute_rop( dibdrv_physdev *pdev, const RECT *dst_rect, dib_info *src,
diff --git a/dlls/win32u/dibdrv/objects.c b/dlls/win32u/dibdrv/objects.c
index d137daa1f33..28ddea8c3da 100644
--- a/dlls/win32u/dibdrv/objects.c
+++ b/dlls/win32u/dibdrv/objects.c
@@ -2022,9 +2022,8 @@ static BOOL select_pattern_brush( dibdrv_physdev *pdev, dib_brush *brush, BOOL *
}
else
{
- brush->dib.bits.ptr = malloc( brush->dib.height * brush->dib.stride );
- brush->dib.bits.is_copy = TRUE;
- brush->dib.bits.free = free_heap_bits;
+ memset( &brush->dib.bits, 0, sizeof(brush->dib.bits) );
+ alloc_gdi_cache_bits( &brush->dib.bits, brush->dib.height * brush->dib.stride, ALLOC_IS_COPY );
brush->dib.funcs->convert_to(&brush->dib, &pattern, &pattern.rect, dither);
}
return TRUE;
diff --git a/dlls/win32u/font.c b/dlls/win32u/font.c
index 87ef75f04af..9746798dc84 100644
--- a/dlls/win32u/font.c
+++ b/dlls/win32u/font.c
@@ -5151,15 +5151,13 @@ static DWORD get_glyph_bitmap( HDC hdc, UINT index, UINT flags, UINT aa_flags,
stride = get_dib_stride( metrics->gmBlackBoxX, 1 );
size = metrics->gmBlackBoxY * stride;
- if (!(image->ptr = malloc( size ))) return ERROR_OUTOFMEMORY;
- image->is_copy = TRUE;
- image->free = free_heap_bits;
+ if (!alloc_gdi_cache_bits( image, size, ALLOC_IS_COPY )) return ERROR_OUTOFMEMORY;
ret = NtGdiGetGlyphOutline( hdc, index, aa_flags, metrics, size, image->ptr,
&identity, FALSE );
if (ret == GDI_ERROR)
{
- free( image->ptr );
+ if (image->free) image->free( image );
return ERROR_NOT_FOUND;
}
return ERROR_SUCCESS;
@@ -5322,10 +5320,7 @@ BOOL CDECL nulldrv_ExtTextOut( PHYSDEV dev, INT x, INT y, UINT flags, const RECT
src.visrect.right = src.width;
src.visrect.bottom = src.height;
- bits.ptr = malloc( info->bmiHeader.biSizeImage );
- if (!bits.ptr) return ERROR_OUTOFMEMORY;
- bits.is_copy = TRUE;
- bits.free = free_heap_bits;
+ if (!alloc_gdi_cache_bits( &bits, info->bmiHeader.biSizeImage, ALLOC_IS_COPY )) return ERROR_OUTOFMEMORY;
err = ERROR_SUCCESS;
}
}
@@ -5335,17 +5330,11 @@ BOOL CDECL nulldrv_ExtTextOut( PHYSDEV dev, INT x, INT y, UINT flags, const RECT
err = src_dev->funcs->pGetImage( src_dev, info, &bits, &src );
if (!err && !bits.is_copy)
{
- void *ptr = malloc( info->bmiHeader.biSizeImage );
- if (!ptr)
- {
- if (bits.free) bits.free( &bits );
- return ERROR_OUTOFMEMORY;
- }
- memcpy( ptr, bits.ptr, info->bmiHeader.biSizeImage );
+ struct gdi_image_bits new_bits;
+ if (!alloc_gdi_cache_bits( &new_bits, info->bmiHeader.biSizeImage, ALLOC_IS_COPY )) return ERROR_OUTOFMEMORY;
+ memcpy( new_bits.ptr, bits.ptr, info->bmiHeader.biSizeImage );
if (bits.free) bits.free( &bits );
- bits.ptr = ptr;
- bits.is_copy = TRUE;
- bits.free = free_heap_bits;
+ bits = new_bits;
}
}
if (!err)
--
2.34.1
More information about the wine-devel
mailing list