From da4a9313f1260531ec3dde07b32c122f120f695c Mon Sep 17 00:00:00 2001 From: Richard Wilson Date: Sat, 25 Feb 2006 18:51:51 +0000 Subject: [project @ 2006-02-25 18:50:34 by rjw] Support for BMP files svn path=/import/netsurf/; revision=2095 --- image/bmp.c | 127 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 127 insertions(+) create mode 100644 image/bmp.c (limited to 'image/bmp.c') diff --git a/image/bmp.c b/image/bmp.c new file mode 100644 index 000000000..b2fc59f86 --- /dev/null +++ b/image/bmp.c @@ -0,0 +1,127 @@ +/* + * This file is part of NetSurf, http://netsurf.sourceforge.net/ + * Licensed under the GNU General Public License, + * http://www.opensource.org/licenses/gpl-license + * Copyright 2006 Richard Wilson + */ + +#include +#include +#include +#include +#include "netsurf/utils/config.h" +#include "netsurf/content/content.h" +#include "netsurf/desktop/browser.h" +#include "netsurf/desktop/options.h" +#include "netsurf/desktop/plotters.h" +#include "netsurf/image/bitmap.h" +#include "netsurf/image/bmp.h" +#include "netsurf/image/bmpread.h" +#include "netsurf/utils/log.h" +#include "netsurf/utils/messages.h" +#include "netsurf/utils/utils.h" + +#ifdef WITH_BMP + +static void nsbmp_invalidate(struct bitmap *bitmap, void *private_word); + +bool nsbmp_create(struct content *c, const char *params[]) { + union content_msg_data msg_data; + + c->data.bmp.bmp = calloc(sizeof(struct bmp_image), 1); + if (!c->data.bmp.bmp) { + msg_data.error = messages_get("NoMemory"); + content_broadcast(c, CONTENT_MSG_ERROR, msg_data); + warn_user("NoMemory", 0); + return false; + } + return true; +} + + +bool nsbmp_convert(struct content *c, int iwidth, int iheight) { + bmp_result res; + struct bmp_image *bmp; + union content_msg_data msg_data; + + /* set our source data */ + bmp = c->data.bmp.bmp; + bmp->bmp_data = c->source_data; + bmp->buffer_size = c->source_size; + + /* analyse the BMP */ + res = bmp_analyse(bmp); + switch (res) { + case BMP_OK: + break; + case BMP_INSUFFICIENT_MEMORY: + msg_data.error = messages_get("NoMemory"); + content_broadcast(c, CONTENT_MSG_ERROR, msg_data); + warn_user("NoMemory", 0); + return false; + case BMP_INSUFFICIENT_DATA: + case BMP_DATA_ERROR: + msg_data.error = messages_get("BadBMP"); + content_broadcast(c, CONTENT_MSG_ERROR, msg_data); + return false; + } + + /* Store our content width and description + */ + c->width = bmp->width; + c->height = bmp->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; + + /* make so that the bitmap code can free our image quickly */ + bitmap_set_suspendable(bmp->bitmap, bmp, nsbmp_invalidate); + + /* exit as a success */ + c->bitmap = bmp->bitmap; + c->status = CONTENT_STATUS_DONE; + return true; +} + +void nsbmp_invalidate(struct bitmap *bitmap, void *private_word) { + struct bmp_image *bmp = (struct bmp_image *)private_word; + + bmp->decoded = false; +} + +bool nsbmp_redraw(struct content *c, int x, int y, + int width, int height, + int clip_x0, int clip_y0, int clip_x1, int clip_y1, + float scale, unsigned long background_colour) { + + if (!c->data.bmp.bmp->decoded) + bmp_decode(c->data.bmp.bmp); + c->bitmap = c->data.bmp.bmp->bitmap; + return plot.bitmap(x, y, width, height, c->bitmap, background_colour); +} + + +bool nsbmp_redraw_tiled(struct content *c, int x, int y, + int width, int height, + int clip_x0, int clip_y0, int clip_x1, int clip_y1, + float scale, unsigned long background_colour, + bool repeat_x, bool repeat_y) { + + if (!c->data.bmp.bmp->decoded) + bmp_decode(c->data.bmp.bmp); + c->bitmap = c->data.bmp.bmp->bitmap; + return plot.bitmap_tile(x, y, width, height, c->bitmap, + background_colour, repeat_x, repeat_y); +} + + +void nsbmp_destroy(struct content *c) +{ + bmp_finalise(c->data.bmp.bmp); + free(c->data.bmp.bmp); + free(c->title); +} + +#endif -- cgit v1.2.3