diff options
author | Vincent Sanders <vince@netsurf-browser.org> | 2010-10-13 20:29:30 +0000 |
---|---|---|
committer | Vincent Sanders <vince@netsurf-browser.org> | 2010-10-13 20:29:30 +0000 |
commit | 83e6c1ba57e47efcb03573d8fdd17aa0cd0ff6dd (patch) | |
tree | 0a45490feed25525928e65c2cc6dded52fdaf017 /windows/bitmap.c | |
parent | d4d866c43fd2f551e4a6f6ee44529b773997cf07 (diff) | |
download | netsurf-83e6c1ba57e47efcb03573d8fdd17aa0cd0ff6dd.tar.gz netsurf-83e6c1ba57e47efcb03573d8fdd17aa0cd0ff6dd.tar.bz2 |
fix bitmap plotting
svn path=/trunk/netsurf/; revision=10882
Diffstat (limited to 'windows/bitmap.c')
-rw-r--r-- | windows/bitmap.c | 56 |
1 files changed, 44 insertions, 12 deletions
diff --git a/windows/bitmap.c b/windows/bitmap.c index 0fd323574..2f9d2810f 100644 --- a/windows/bitmap.c +++ b/windows/bitmap.c @@ -20,6 +20,7 @@ #include <inttypes.h> #include <sys/types.h> #include <string.h> +#include <windows.h> #include "image/bitmap.h" #include "windows/bitmap.h" @@ -38,20 +39,50 @@ void *bitmap_create(int width, int height, unsigned int state) { struct bitmap *bitmap; + BITMAPV5HEADER *pbmi; + BITMAP *windib; + uint8_t *pixdata; + LOG(("width %d, height %d, state %u",width,height,state)); + + pbmi = calloc(1, sizeof(BITMAPV5HEADER)); + if (pbmi == NULL) { + return NULL; + } + pbmi->bV5Size = sizeof(BITMAPV5HEADER); + pbmi->bV5Width = width; + pbmi->bV5Height = -height; + pbmi->bV5Planes = 1; + pbmi->bV5BitCount = 32; + pbmi->bV5Compression = BI_BITFIELDS; + + pbmi->bV5RedMask = 0xff; /* red mask */ + pbmi->bV5GreenMask = 0xff00; /* green mask */ + pbmi->bV5BlueMask = 0xff0000; /* blue mask */ + pbmi->bV5AlphaMask = 0xff000000; /* alpha mask */ + + windib = CreateDIBSection(NULL, (BITMAPINFO *)pbmi, DIB_RGB_COLORS, &pixdata, NULL, 0); + + + if (windib == NULL) { + free(pbmi); + return NULL; + } + bitmap = calloc(1 , sizeof(struct bitmap)); - if (bitmap) { - bitmap->pixdata = calloc(width * height, 4); - if (bitmap->pixdata != NULL) { - bitmap->width = width; - bitmap->height = height; - bitmap->opaque = false; - } else { - free(bitmap); - bitmap=NULL; - } + if (bitmap == NULL) { + DeleteObject(windib); + free(pbmi); + return NULL; } + bitmap->width = width; + bitmap->height = height; + bitmap->windib = windib; + bitmap->pbmi = pbmi; + bitmap->pixdata = pixdata; + bitmap->opaque = false; + LOG(("bitmap %p", bitmap)); return bitmap; @@ -114,8 +145,9 @@ void bitmap_destroy(void *bitmap) LOG(("NULL bitmap!")); return; } - - free(bm->pixdata); + + DeleteObject(bm->windib); + free(bm->pbmi); free(bm); } |