summaryrefslogtreecommitdiff
path: root/image/nssprite.c
diff options
context:
space:
mode:
Diffstat (limited to 'image/nssprite.c')
-rw-r--r--image/nssprite.c125
1 files changed, 125 insertions, 0 deletions
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 <js102@zepler.net>
+ *
+ * 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 <http://www.gnu.org/licenses/>.
+ */
+
+/** \file
+ * Content for image/x-riscos-sprite (librosprite implementation).
+ *
+ */
+
+#include <assert.h>
+#include <librosprite.h>
+#include <string.h>
+#include <stdlib.h>
+#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