summaryrefslogtreecommitdiff
path: root/image/bmp.c
diff options
context:
space:
mode:
authorJames Bursa <james@netsurf-browser.org>2008-08-12 03:49:34 +0000
committerJames Bursa <james@netsurf-browser.org>2008-08-12 03:49:34 +0000
commit33107b160f09bbb301791759b83d772c820c4813 (patch)
tree2b0a0293ddcc63a44a2d01421db1e3286aa5f753 /image/bmp.c
parent4c8989a6db25de8b2d3bf7fff07489c05808122b (diff)
downloadnetsurf-33107b160f09bbb301791759b83d772c820c4813.tar.gz
netsurf-33107b160f09bbb301791759b83d772c820c4813.tar.bz2
Merged revisions 4345-4346,4350-4351,4389,4391,4395,4401-4403,4423,4485-4486 via svnmerge from
svn://semichrome.net/branches/dynis/netsurf ........ r4345 | dynis | 2008-06-15 18:37:23 -0500 (Sun, 15 Jun 2008) | 1 line Move NetSurf's gifread.h to libnsgif ........ r4346 | dynis | 2008-06-15 18:38:38 -0500 (Sun, 15 Jun 2008) | 1 line Remove NetSurf's gifread.c (replaced by libnsgif) ........ r4350 | dynis | 2008-06-15 18:57:17 -0500 (Sun, 15 Jun 2008) | 1 line Added references to libnsgif where necessary; corrected function calls where callbacks were implemented ........ r4351 | dynis | 2008-06-15 19:00:33 -0500 (Sun, 15 Jun 2008) | 1 line Updated Makefile to compile with libnsgif ........ r4389 | dynis | 2008-06-18 13:58:51 -0500 (Wed, 18 Jun 2008) | 1 line Altered bitmap callback table name for gif images to avoid ambiguity when bmp image library is created ........ r4391 | dynis | 2008-06-18 14:08:39 -0500 (Wed, 18 Jun 2008) | 1 line Updated netsurf branch to use new bitmap callback table structure name that was altered in libnsgif ........ r4395 | dynis | 2008-06-18 14:54:51 -0500 (Wed, 18 Jun 2008) | 1 line Corrected param comments for bitmap_set_suspendable() ........ r4401 | dynis | 2008-06-18 18:39:50 -0500 (Wed, 18 Jun 2008) | 1 line Added references to libnsbmp where necessary; corrected function calls where callbacks were implemented ........ r4402 | dynis | 2008-06-18 18:40:47 -0500 (Wed, 18 Jun 2008) | 1 line Updated Makefile to compile with libnsbmp ........ r4403 | dynis | 2008-06-18 18:41:53 -0500 (Wed, 18 Jun 2008) | 1 line Remove NetSurf's bmpread.c and bmpread.h (replaced by libnsbmp) ........ r4423 | dynis | 2008-06-22 14:21:30 -0500 (Sun, 22 Jun 2008) | 1 line Correct a silly mistake in nsbmp_bitmap_create ........ r4485 | dynis | 2008-07-01 04:13:48 -0500 (Tue, 01 Jul 2008) | 1 line Integrated the latest versions of libnsgif and libnsbmp into NetSurf ........ r4486 | dynis | 2008-07-01 05:27:10 -0500 (Tue, 01 Jul 2008) | 1 line Altered bitmap functions to receive void pointers for proper utilisation of libnsgif and libnsbmp ........ svn path=/trunk/netsurf/; revision=5071
Diffstat (limited to 'image/bmp.c')
-rw-r--r--image/bmp.c54
1 files changed, 45 insertions, 9 deletions
diff --git a/image/bmp.c b/image/bmp.c
index 25f65bc25..440e3e282 100644
--- a/image/bmp.c
+++ b/image/bmp.c
@@ -1,5 +1,6 @@
/*
* Copyright 2006 Richard Wilson <info@tinct.net>
+ * Copyright 2008 Sean Fox <dyntryx@gmail.com>
*
* This file is part of NetSurf, http://www.netsurf-browser.org/
*
@@ -23,16 +24,27 @@
#include <string.h>
#include <stdbool.h>
#include <stdlib.h>
+#include <libnsbmp.h>
#include "utils/config.h"
#include "content/content.h"
#include "desktop/plotters.h"
#include "image/bitmap.h"
#include "image/bmp.h"
-#include "image/bmpread.h"
#include "utils/log.h"
#include "utils/messages.h"
#include "utils/utils.h"
+/* The Bitmap callbacks function table;
+ necessary for interaction with nsbmplib.
+*/
+bmp_bitmap_callback_vt bmp_bitmap_callbacks = {
+ .bitmap_create = nsbmp_bitmap_create,
+ .bitmap_destroy = bitmap_destroy,
+ .bitmap_set_suspendable = bitmap_set_suspendable,
+ .bitmap_get_buffer = bitmap_get_buffer,
+ .bitmap_get_bpp = bitmap_get_bpp
+};
+
bool nsbmp_create(struct content *c, const char *params[]) {
union content_msg_data msg_data;
@@ -42,22 +54,22 @@ bool nsbmp_create(struct content *c, const char *params[]) {
content_broadcast(c, CONTENT_MSG_ERROR, msg_data);
return false;
}
+ bmp_create(c->data.bmp.bmp, &bmp_bitmap_callbacks);
return true;
}
bool nsbmp_convert(struct content *c, int iwidth, int iheight) {
bmp_result res;
- struct bmp_image *bmp;
+ bmp_image *bmp;
union content_msg_data msg_data;
+ uint32_t swidth;
- /* set our source data */
+ /* set the bmp data */
bmp = c->data.bmp.bmp;
- bmp->bmp_data = (unsigned char *) c->source_data;
- bmp->buffer_size = c->source_size;
/* analyse the BMP */
- res = bmp_analyse(bmp);
+ res = bmp_analyse(bmp, c->source_size, (unsigned char *)c->source_data);
switch (res) {
case BMP_OK:
break;
@@ -76,11 +88,13 @@ bool nsbmp_convert(struct content *c, int iwidth, int iheight) {
*/
c->width = bmp->width;
c->height = bmp->height;
+ LOG(("BMP width %u height %u\n\n", c->width, c->height));
c->title = malloc(100);
if (c->title)
snprintf(c->title, 100, messages_get("BMPTitle"), c->width,
c->height, c->source_size);
- c->size += (bmp->width * bmp->height * 4) + 16 + 44 + 100;
+ swidth = bmp->bitmap_callbacks.bitmap_get_bpp(bmp->bitmap) * bmp->width;
+ c->size += (swidth * bmp->height) + 16 + 44 + 100;
/* exit as a success */
c->bitmap = bmp->bitmap;
@@ -97,7 +111,8 @@ bool nsbmp_redraw(struct content *c, int x, int y,
float scale, unsigned long background_colour) {
if (!c->data.bmp.bmp->decoded)
- bmp_decode(c->data.bmp.bmp);
+ if (bmp_decode(c->data.bmp.bmp) != BMP_OK)
+ return false;
c->bitmap = c->data.bmp.bmp->bitmap;
return plot.bitmap(x, y, width, height, c->bitmap, background_colour, c);
}
@@ -110,7 +125,8 @@ bool nsbmp_redraw_tiled(struct content *c, int x, int y,
bool repeat_x, bool repeat_y) {
if (!c->data.bmp.bmp->decoded)
- bmp_decode(c->data.bmp.bmp);
+ if (bmp_decode(c->data.bmp.bmp) != BMP_OK)
+ return false;
c->bitmap = c->data.bmp.bmp->bitmap;
return plot.bitmap_tile(x, y, width, height, c->bitmap,
background_colour, repeat_x, repeat_y, c);
@@ -124,4 +140,24 @@ void nsbmp_destroy(struct content *c)
free(c->title);
}
+
+/**
+ * Callback for libnsbmp; forwards the call to bitmap_create()
+ *
+ * \param width width of image in pixels
+ * \param height width of image in pixels
+ * \param state a flag word indicating the initial state
+ * \return an opaque struct bitmap, or NULL on memory exhaustion
+ */
+void *nsbmp_bitmap_create(int width, int height, unsigned int bmp_state) {
+ unsigned int bitmap_state = BITMAP_NEW;
+
+ /* set bitmap state based on bmp state */
+ bitmap_state |= (bmp_state & BMP_OPAQUE) ? BITMAP_OPAQUE : 0;
+ bitmap_state |= (bmp_state & BMP_CLEAR_MEMORY) ? BITMAP_CLEAR_MEMORY : 0;
+
+ /* return the created bitmap */
+ return bitmap_create(width, height, bitmap_state);
+}
+
#endif