From 7c6ea2a369e75e06d4e6303e59b20abe11c9b4d5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Rapha=C3=ABl=20Ass=C3=A9nat?= Date: Sat, 23 Nov 2013 03:41:02 +0000 Subject: [PATCH] Image tool and samples --- png_to_vmu_lcd/Makefile | 17 +++ png_to_vmu_lcd/main.c | 183 +++++++++++++++++++++++++++++++++ png_to_vmu_lcd/vme_raphnet.png | Bin 0 -> 470 bytes png_to_vmu_lcd/vmu_blob.png | Bin 0 -> 409 bytes 4 files changed, 200 insertions(+) create mode 100644 png_to_vmu_lcd/Makefile create mode 100644 png_to_vmu_lcd/main.c create mode 100644 png_to_vmu_lcd/vme_raphnet.png create mode 100644 png_to_vmu_lcd/vmu_blob.png diff --git a/png_to_vmu_lcd/Makefile b/png_to_vmu_lcd/Makefile new file mode 100644 index 0000000..dc344ba --- /dev/null +++ b/png_to_vmu_lcd/Makefile @@ -0,0 +1,17 @@ +CC=gcc +LD=$(CC) +CFLAGS=-Wall -g `libpng-config --cflags` +LDFLAGS=`libpng-config --libs` + +PROG=png_to_vmu_lcd +OBJS=main.o + +all: $(PROG) + +clean: + rm $(PROG) $(OBJS) + +$(PROG): $(OBJS) + $(LD) $(LDFLAGS) $^ -o $@ + + diff --git a/png_to_vmu_lcd/main.c b/png_to_vmu_lcd/main.c new file mode 100644 index 0000000..eb7bc8c --- /dev/null +++ b/png_to_vmu_lcd/main.c @@ -0,0 +1,183 @@ +#include +#include + +#include + +int convertPNG(FILE *fptr_in, FILE *fptr_out); + +static void printusage(void) +{ + printf("Usage: ./png_to_vmu_lcd input_file output_file\n"); + printf("\n"); + printf("input_file must be a 48x32 pixels PNG file.\n"); +} + +int main(int argc, char **argv) +{ + FILE *fptr_in = NULL, *fptr_out = NULL; + uint8_t header[8]; + int ret = 0; + + if (argc < 3) { + printusage(); + return 1; + } + + fptr_in = fopen(argv[1], "rb"); + if (!fptr_in) { + perror("fopen"); + return 2; + } + + if (8 != fread(header, 1, 8, fptr_in)) { + perror("fread"); + ret = 3; + goto done; + } + + if (png_sig_cmp(header, 0, 8)) { + fprintf(stderr, "Not a PNG file\n"); + ret = 3; + goto done; + } + + fptr_out = fopen(argv[2], "wb"); + if (!fptr_out) { + perror("fopen outfile"); + ret = 4; + goto done; + } + + ret = convertPNG(fptr_in, fptr_out); + +done: + if (fptr_out) { + fclose(fptr_out); + } + + if (fptr_in) { + fclose(fptr_in); + } + + return ret; +} + +int convertPNG(FILE *fptr_in, FILE *fptr_out) +{ + png_structp png_ptr; + png_infop info_ptr; + png_bytep *row_pointers; + int w,h,depth,color; + int ret; + int x,y; + int rotate180 = 1; + int bpp = 1; + unsigned char data, b; + + png_ptr = png_create_read_struct(PNG_LIBPNG_VER_STRING, NULL, NULL, NULL); + if (!png_ptr) + return -1; + + info_ptr = png_create_info_struct(png_ptr); + if (!info_ptr) { + png_destroy_read_struct(&png_ptr, NULL, NULL); + return -1; + } + + if (setjmp(png_jmpbuf(png_ptr))) { + ret = -1; + goto done; + } + + png_init_io(png_ptr, fptr_in); + png_set_sig_bytes(png_ptr, 8); + + png_read_png(png_ptr, info_ptr, PNG_TRANSFORM_EXPAND | PNG_TRANSFORM_STRIP_16 | PNG_TRANSFORM_STRIP_ALPHA, NULL); + + w = png_get_image_width(png_ptr, info_ptr); + h = png_get_image_height(png_ptr, info_ptr); + depth = png_get_bit_depth(png_ptr, info_ptr); + color = png_get_color_type(png_ptr, info_ptr); + + if (w != 48 || h != 32) { + fprintf(stderr, "Image is not 48 x 32 pixels. Current size: %d x %d. Please resize or rotate your image and try again.\n", w,h); + ret = -1; + goto done; + } + + printf("Image: %d x %d\n",w,h); + printf("Bit depth: %d\n", depth); + printf("Color type: %d\n", color); + row_pointers = png_get_rows(png_ptr, info_ptr); + + switch(color) + { + case PNG_COLOR_TYPE_GRAY: + printf("Processing grayscale image\n"); + bpp = 1; + break; + case PNG_COLOR_TYPE_RGB: + printf("Processing color image\n"); + bpp = 3; + break; + default: + fprintf(stderr, "Unsupported color type\n"); + ret = -1; + goto done; + } + + data = 0; + b = 0x80; + if (rotate180) + { + for (y=h-1; y>=0; y--) { + for (x=w-1; x>=0; x--) { + + if (row_pointers[y][x*bpp]) { + printf("XX"); + } + else { + printf(" "); + data |= b; + } + + b >>= 1; + if (!b) { + fprintf(fptr_out, "0x%02X, ", data); + data = 0; + b = 0x80; + } + } + printf("\n"); + fprintf(fptr_out, "\n"); + } + } + else + { + for (y=0; y>= 1; + if (!b) { + fprintf(fptr_out, "0x%02X, ", data); + data = 0; + b = 0x80; + } + } + printf("\n"); + fprintf(fptr_out, "\n"); + } + } + +done: + png_destroy_read_struct(&png_ptr, &info_ptr, NULL); + + return ret; +} diff --git a/png_to_vmu_lcd/vme_raphnet.png b/png_to_vmu_lcd/vme_raphnet.png new file mode 100644 index 0000000000000000000000000000000000000000..b04f0af6d91433515331d7a99e38f5a604848526 GIT binary patch literal 470 zcmV;{0V)28P)02y>e zSad^gZEa<4bO1wgWnpw>WFU8GbZ8()Nlj2!fese{00BNpL_t(o!|hnh62l+}1c(3s zWqPTdj3cm7w6Rl8jj3i?mxnSDDG`yX5)lzI(@D>T4mZ~7%4xvgJ0af7tBv}}%(Rjt zZezf5V8n@5uQNxehGb!s)6kqUYys{o+@M&;|qz&F6Rb5LT_V_+l!jDo*i2O?&p zfJ5fom9!fJ$gX69PpbpjsSceJkf_|+2F%EfVKpx8cJkk2P;UriU3q6 zb{_8Pwg!qa5j-2hgyNHu?Qd($OA3(`1=Y3(!UB%oQdrMOVi5GS z6jfdHe?5k0T9ey55J?AV!I9dLS_gJsp`bWE+dBV#vIgh+q)xHQcJ$V{8Zj)bQE!1B8}xX#h0ut%mHt%^)5FASsM0#4;B0 z7(J(u=bTnic#%zhiv^LyJ>j{X|n>o#E zr$dZ25@|Jn(CFM*rN~5FAh5+4)N7|Q$ocMprkX~-B`Z7ki{E7?00000NkvXXu0mjf DBVwul literal 0 HcmV?d00001