[Spice-devel] [PATCH spice-common 3/8] canvas: Remove Windows bitmap allocation
Frediano Ziglio
fziglio at redhat.com
Wed Jan 17 11:31:05 UTC 2018
There's no reason to use a DIB section if we are going to use just the
memory in it assigned to a pixman surface, use normal path and memory.
Signed-off-by: Frediano Ziglio <fziglio at redhat.com>
---
common/canvas_utils.c | 105 --------------------------------------------------
1 file changed, 105 deletions(-)
diff --git a/common/canvas_utils.c b/common/canvas_utils.c
index a6527e7..57fffbe 100644
--- a/common/canvas_utils.c
+++ b/common/canvas_utils.c
@@ -23,14 +23,7 @@
#include "canvas_utils.h"
#include "mem.h"
-#ifdef WIN32
-static int gdi_handlers = 0;
-#endif
-
typedef struct PixmanData {
-#ifdef WIN32
- HBITMAP bitmap;
-#endif
uint8_t *data;
pixman_format_code_t format;
} PixmanData;
@@ -40,12 +33,6 @@ static void release_data(SPICE_GNUC_UNUSED pixman_image_t *image,
{
PixmanData *data = (PixmanData *)release_data;
-#ifdef WIN32
- if (data->bitmap) {
- DeleteObject((HBITMAP)data->bitmap);
- gdi_handlers--;
- }
-#endif
free(data->data);
free(data);
@@ -134,94 +121,6 @@ pixman_image_t *surface_create(HDC dc, pixman_format_code_t format,
pixman_image_t * surface_create(pixman_format_code_t format, int width, int height, int top_down)
#endif
{
-#ifdef WIN32
- /*
- * Windows xp allow only 10,000 of gdi handlers, considering the fact that
- * we limit here the number to 5000, we dont use atomic operations to sync
- * this calculation against the other canvases (in case of multiple
- * monitors), in worst case there will be little more than 5000 gdi
- * handlers.
- */
- if (dc && gdi_handlers < 5000) {
- uint8_t *data;
- uint8_t *src;
- struct {
- BITMAPINFO inf;
- RGBQUAD palette[255];
- } bitmap_info;
- int nstride;
- pixman_image_t *surface;
- PixmanData *pixman_data;
- HBITMAP bitmap;
-
- memset(&bitmap_info, 0, sizeof(bitmap_info));
- bitmap_info.inf.bmiHeader.biSize = sizeof(bitmap_info.inf.bmiHeader);
- bitmap_info.inf.bmiHeader.biWidth = width;
-
- bitmap_info.inf.bmiHeader.biHeight = (!top_down) ? height : -height;
-
- bitmap_info.inf.bmiHeader.biPlanes = 1;
- switch (format) {
- case PIXMAN_a8r8g8b8:
- case PIXMAN_x8r8g8b8:
-#ifdef WORDS_BIGENDIAN
- case PIXMAN_b8g8r8a8:
- case PIXMAN_b8g8r8x8:
-#endif
- bitmap_info.inf.bmiHeader.biBitCount = 32;
- nstride = width * 4;
- break;
- case PIXMAN_r8g8b8:
-#ifdef WORDS_BIGENDIAN
- case PIXMAN_b8g8r8:
-#endif
- bitmap_info.inf.bmiHeader.biBitCount = 24;
- nstride = SPICE_ALIGN(width * 3, 4);
- break;
- case PIXMAN_x1r5g5b5:
- case PIXMAN_r5g6b5:
- bitmap_info.inf.bmiHeader.biBitCount = 16;
- nstride = SPICE_ALIGN(width * 2, 4);
- break;
- case PIXMAN_a8:
- bitmap_info.inf.bmiHeader.biBitCount = 8;
- nstride = SPICE_ALIGN(width, 4);
- break;
- case PIXMAN_a1:
- bitmap_info.inf.bmiHeader.biBitCount = 1;
- nstride = SPICE_ALIGN(width, 32) / 8;
- break;
- default:
- spice_error("invalid format");
- return NULL;
- }
-
- bitmap_info.inf.bmiHeader.biCompression = BI_RGB;
-
- bitmap = CreateDIBSection(dc, &bitmap_info.inf, 0, (VOID **)&data, NULL, 0);
- if (!bitmap) {
- spice_error("Unable to CreateDIBSection");
- }
-
- if (top_down) {
- src = data;
- } else {
- src = data + nstride * (height - 1);
- nstride = -nstride;
- }
-
- surface = pixman_image_create_bits(format, width, height, (uint32_t *)src, nstride);
- if (surface == NULL) {
- DeleteObject(bitmap);
- spice_error("create surface failed, out of memory");
- }
- pixman_data = pixman_image_add_data(surface);
- pixman_data->format = format;
- pixman_data->bitmap = bitmap;
- gdi_handlers++;
- return surface;
- } else {
-#endif
if (top_down) {
pixman_image_t *surface;
PixmanData *data;
@@ -265,10 +164,6 @@ pixman_image_t * surface_create(pixman_format_code_t format, int width, int heig
stride = -stride;
return __surface_create_stride(format, width, height, stride);
}
-#ifdef WIN32
-}
-
-#endif
}
#ifdef WIN32
--
2.14.3
More information about the Spice-devel
mailing list