Author: dynis
Date: Thu Jun 26 23:06:59 2008
New Revision: 4462
URL:
http://source.netsurf-browser.org?rev=4462&view=rev
Log:
Added bmp decoding example
Added:
branches/dynis/libnsbmp/bin/
branches/dynis/libnsbmp/bin/decode_bmp (with props)
branches/dynis/libnsbmp/bmp_display (with props)
branches/dynis/libnsbmp/examples/
branches/dynis/libnsbmp/examples/decode_bmp.c
branches/dynis/libnsbmp/examples/linux.bmp (with props)
branches/dynis/libnsbmp/examples/ro.bmp (with props)
Modified:
branches/dynis/libnsbmp/Makefile
Modified: branches/dynis/libnsbmp/Makefile
URL:
http://source.netsurf-browser.org/branches/dynis/libnsbmp/Makefile?rev=44...
==============================================================================
--- branches/dynis/libnsbmp/Makefile (original)
+++ branches/dynis/libnsbmp/Makefile Thu Jun 26 23:06:59 2008
@@ -23,7 +23,7 @@
.PHONY: all clean docs install uninstall
-all: libnsbmp.a
+all: libnsbmp.a bin/decode_bmp
libnsbmp.a: libnsbmp.o libnsbmp.pc
${AR} ${ARFLAGS} libnsbmp.a libnsbmp.o
@@ -33,6 +33,9 @@
%.o: %.c
${CC} -c ${CFLAGS} -o $@ $<
+
+bin/decode_bmp: examples/decode_bmp.c libnsbmp.a
+ ${CC} ${CFLAGS} -o $@ $< libnsbmp.a
docs:
${DOXYGEN}
Added: branches/dynis/libnsbmp/bin/decode_bmp
URL:
http://source.netsurf-browser.org/branches/dynis/libnsbmp/bin/decode_bmp?...
==============================================================================
Binary file - no diff available.
Propchange: branches/dynis/libnsbmp/bin/decode_bmp
------------------------------------------------------------------------------
svn:executable = *
Propchange: branches/dynis/libnsbmp/bin/decode_bmp
------------------------------------------------------------------------------
svn:mime-type = application/octet-stream
Added: branches/dynis/libnsbmp/bmp_display
URL:
http://source.netsurf-browser.org/branches/dynis/libnsbmp/bmp_display?rev...
==============================================================================
--- branches/dynis/libnsbmp/bmp_display (added)
+++ branches/dynis/libnsbmp/bmp_display Thu Jun 26 23:06:59 2008
@@ -1,0 +1,3 @@
+set -e
+make
+bin/decode_bmp $1 | display
Propchange: branches/dynis/libnsbmp/bmp_display
------------------------------------------------------------------------------
svn:executable = *
Added: branches/dynis/libnsbmp/examples/decode_bmp.c
URL:
http://source.netsurf-browser.org/branches/dynis/libnsbmp/examples/decode...
==============================================================================
--- branches/dynis/libnsbmp/examples/decode_bmp.c (added)
+++ branches/dynis/libnsbmp/examples/decode_bmp.c Thu Jun 26 23:06:59 2008
@@ -1,0 +1,220 @@
+/*
+ * Copyright 2008 Sean Fox <dyntryx(a)gmail.com>
+ * Copyright 2008 James Bursa <james(a)netsurf-browser.org>
+ *
+ * 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/>.
+ */
+
+#include <assert.h>
+#include <errno.h>
+#include <stdbool.h>
+#include <stdlib.h>
+#include <stdio.h>
+#include <string.h>
+#include <sys/stat.h>
+#include <libnsbmp.h>
+
+#define BITMAP_BYTES_PER_PIXEL 4
+
+unsigned char *load_file(const char *path, size_t *data_size);
+void warning(const char *context, bmp_result code);
+void *bitmap_create(int width, int height, unsigned int state);
+void bitmap_set_suspendable(void *bitmap, void *private_word,
+ void (*invalidate)(void *bitmap, void *private_word));
+void invalidate(void *bitmap, void *private_word);
+unsigned char *bitmap_get_buffer(void *bitmap);
+size_t bitmap_get_bpp(void *bitmap);
+void bitmap_destroy(void *bitmap);
+
+/* The Bitmap callbacks function table;
+ necessary for interaction with nsgiflib.
+*/
+bmp_bitmap_callback_vt bitmap_callbacks = {
+ bitmap_create,
+ bitmap_destroy,
+ bitmap_set_suspendable,
+ bitmap_get_buffer,
+ bitmap_get_bpp
+};
+
+
+int main(int argc, char *argv[])
+{
+ bmp_result code;
+ bmp_image bmp;
+ size_t size;
+
+ if (argc != 2) {
+ fprintf(stderr, "Usage: %s image.bmp\n", argv[0]);
+ return 1;
+ }
+
+ /* create our bmp image */
+ bmp_create(&bmp);
+
+ /* load file into memory */
+ unsigned char *data = load_file(argv[1], &size);
+
+ /* set our source data */
+ bmp.bmp_data = data;
+ bmp.buffer_size = size;
+
+ /* analyse the BMP */
+ code = bmp_analyse(&bmp, &bitmap_callbacks);
+ if (code != BMP_OK) {
+ warning("bmp_analyse", code);
+ exit(1);
+ }
+
+ printf("P3\n");
+ printf("# %s\n", argv[1]);
+ printf("# width %u \n", bmp.width);
+ printf("# height %u \n", bmp.height);
+ printf("%u %u 256\n", bmp.width, bmp.height);
+
+ /* decode the image */
+ code = bmp_decode(&bmp, &bitmap_callbacks);
+ if (code != BMP_OK) {
+ warning("bmp_decode", code);
+ exit(1);
+ }
+ {
+ unsigned int row, col;
+ unsigned char *image;
+ image = (unsigned char *) bmp.bitmap;
+ for (row = 0; row != bmp.height; row++) {
+ for (col = 0; col != bmp.width; col++) {
+ size_t z = (row * bmp.width + col) * BITMAP_BYTES_PER_PIXEL;
+ printf("%u %u %u ",
+ (unsigned char) image[z],
+ (unsigned char) image[z + 1],
+ (unsigned char) image[z + 2]);
+ }
+ printf("\n");
+ }
+ }
+
+ /* clean up */
+ bmp_finalise(&bmp, &bitmap_callbacks);
+ free(data);
+
+ return 0;
+}
+
+
+unsigned char *load_file(const char *path, size_t *data_size)
+{
+ FILE *fd;
+ struct stat sb;
+ unsigned char *buffer;
+ size_t size;
+ size_t n;
+
+ fd = fopen(path, "rb");
+ if (!fd) {
+ perror(path);
+ exit(EXIT_FAILURE);
+ }
+
+ if (stat(path, &sb)) {
+ perror(path);
+ exit(EXIT_FAILURE);
+ }
+ size = sb.st_size;
+
+ buffer = malloc(size);
+ if (!buffer) {
+ fprintf(stderr, "Unable to allocate %lld bytes\n",
+ (long long) size);
+ exit(EXIT_FAILURE);
+ }
+
+ n = fread(buffer, 1, size, fd);
+ if (n != size) {
+ perror(path);
+ exit(EXIT_FAILURE);
+ }
+
+ fclose(fd);
+
+ *data_size = size;
+ return buffer;
+}
+
+
+void warning(const char *context, bmp_result code)
+{
+ fprintf(stderr, "%s failed: ", context);
+ switch (code) {
+ case BMP_INSUFFICIENT_MEMORY:
+ fprintf(stderr, "BMP_INSUFFICIENT_MEMORY");
+ break;
+ case BMP_INSUFFICIENT_DATA:
+ fprintf(stderr, "BMP_INSUFFICIENT_DATA");
+ break;
+ case BMP_DATA_ERROR:
+ fprintf(stderr, "BMP_DATA_ERROR");
+ break;
+ default:
+ fprintf(stderr, "unknown code %i", code);
+ break;
+ }
+ fprintf(stderr, "\n");
+}
+
+
+void *bitmap_create(int width, int height, unsigned int state)
+{
+ (void) state; /* unused */
+ return calloc(width * height, BITMAP_BYTES_PER_PIXEL);
+}
+
+
+void bitmap_set_suspendable(void *bitmap, void *private_word,
+ void (*invalidate)(void *bitmap, void *private_word))
+{
+ (void) bitmap; /* unused */
+ (void) private_word; /* unused */
+ (void) invalidate; /* unused */
+}
+
+
+void invalidate(void *bitmap, void *private_word)
+{
+ (void) bitmap; /* unused */
+ (void) private_word; /* unused */
+}
+
+
+unsigned char *bitmap_get_buffer(void *bitmap)
+{
+ assert(bitmap);
+ return bitmap;
+}
+
+
+size_t bitmap_get_bpp(void *bitmap)
+{
+ (void) bitmap; /* unused */
+ return BITMAP_BYTES_PER_PIXEL;
+}
+
+
+void bitmap_destroy(void *bitmap)
+{
+ assert(bitmap);
+ free(bitmap);
+}
+
Added: branches/dynis/libnsbmp/examples/linux.bmp
URL:
http://source.netsurf-browser.org/branches/dynis/libnsbmp/examples/linux....
==============================================================================
Binary file - no diff available.
Propchange: branches/dynis/libnsbmp/examples/linux.bmp
------------------------------------------------------------------------------
svn:mime-type = application/octet-stream
Added: branches/dynis/libnsbmp/examples/ro.bmp
URL:
http://source.netsurf-browser.org/branches/dynis/libnsbmp/examples/ro.bmp...
==============================================================================
Binary file - no diff available.
Propchange: branches/dynis/libnsbmp/examples/ro.bmp
------------------------------------------------------------------------------
svn:mime-type = application/octet-stream