From 9402e110e904b4644ebc467e7f8e78ba4e91333c Mon Sep 17 00:00:00 2001 From: James Shaw Date: Sat, 29 Mar 2008 13:30:04 +0000 Subject: Implement sprite support for GTK using librosprite svn path=/trunk/netsurf/; revision=4051 --- image/nssprite.c | 125 +++++++++++++++++++++++++++++++++++++++++++++++++++++++ image/nssprite.h | 41 ++++++++++++++++++ 2 files changed, 166 insertions(+) create mode 100644 image/nssprite.c create mode 100644 image/nssprite.h (limited to 'image') diff --git a/image/nssprite.c b/image/nssprite.c new file mode 100644 index 000000000..e482336d0 --- /dev/null +++ b/image/nssprite.c @@ -0,0 +1,125 @@ + /* + * Copyright 2008 James Shaw + * + * This file is part of NetSurf, http://www.netsurf-browser.org/ + * + * NetSurf is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; version 2 of the License. + * + * NetSurf is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +/** \file + * Content for image/x-riscos-sprite (librosprite implementation). + * + */ + +#include +#include +#include +#include +#include "utils/config.h" +#include "desktop/plotters.h" +#include "content/content.h" +#include "utils/log.h" +#include "utils/messages.h" +#include "utils/utils.h" + +#ifdef WITH_NSSPRITE + +#define ERRCHK(x) do { \ + rosprite_error err = x; \ + if (err == ROSPRITE_EOF) { \ + LOG(("Got ROSPRITE_EOF when loading sprite file")); \ + return false; \ + } else if (err == ROSPRITE_BADMODE) { \ + LOG(("Got ROSPRITE_BADMODE when loading sprite file")); \ + return false; \ + } else if (err == ROSPRITE_OK) { \ + } else { \ + return false; \ + } \ +} while(0) + +/** + * Convert a CONTENT_SPRITE for display. + * + * No conversion is necessary. We merely read the sprite dimensions. + */ + +bool nssprite_convert(struct content *c, int width, int height) +{ + struct rosprite_mem_context* ctx; + ERRCHK(rosprite_create_mem_context(c->source_data, c->total_size, &ctx)); + + struct rosprite_area* sprite_area; + ERRCHK(rosprite_load(rosprite_mem_reader, ctx, &sprite_area)); + rosprite_destroy_mem_context(ctx); + c->data.nssprite.sprite_area = sprite_area; + + assert(sprite_area->sprite_count > 0); + + struct rosprite* sprite = sprite_area->sprites[0]; + + c->bitmap = bitmap_create(sprite->width, sprite->height, BITMAP_NEW); + if (!c->bitmap) { + return false; + } + char* imagebuf = bitmap_get_buffer(c->bitmap); + unsigned int row_width = bitmap_get_rowstride(c->bitmap); + + memcpy(imagebuf, sprite->image, row_width * sprite->height); // TODO: avoid copying entire image buffer + + /* reverse byte order of each word */ + for (uint32_t y = 0; y < sprite->height; y++) { + for (uint32_t x = 0; x < sprite->width; x++) { + int offset = 4 * (y * sprite->width + x); + uint32_t r = imagebuf[offset+3]; + uint32_t g = imagebuf[offset+2]; + uint32_t b = imagebuf[offset+1]; + uint32_t a = imagebuf[offset]; + imagebuf[offset] = r; + imagebuf[offset+1] = g; + imagebuf[offset+2] = b; + imagebuf[offset+3] = a; + } + } + + c->width = sprite->width; + c->height = sprite->height; + c->status = CONTENT_STATUS_DONE; + return true; +} + + +/** + * Destroy a CONTENT_SPRITE and free all resources it owns. + */ + +void nssprite_destroy(struct content *c) +{ + rosprite_destroy_sprite_area(c->data.nssprite.sprite_area); +} + + +/** + * Redraw a CONTENT_SPRITE. + */ + +bool nssprite_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, colour background_colour) +{ + return plot.bitmap(x, y, width, height, + c->bitmap, background_colour); +} + +#endif diff --git a/image/nssprite.h b/image/nssprite.h new file mode 100644 index 000000000..06e0a366e --- /dev/null +++ b/image/nssprite.h @@ -0,0 +1,41 @@ +/* + * Copyright 2008 James Shaw + * + * This file is part of NetSurf, http://www.netsurf-browser.org/ + * + * NetSurf is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; version 2 of the License. + * + * NetSurf is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +/** \file + * Content for image/x-riscos-sprite (librosprite interface). + */ + +#ifndef _NETSURF_NS_SPRITE_H_ +#define _NETSURF_NS_SPRITE_H_ + +#include + +struct content; + +struct content_nssprite_data { + struct rosprite_area* sprite_area; +}; + +bool nssprite_convert(struct content *c, int width, int height); +void nssprite_destroy(struct content *c); +bool nssprite_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, colour background_colour); + +#endif -- cgit v1.2.3