summaryrefslogtreecommitdiff
path: root/graphics/arrow.c
diff options
context:
space:
mode:
Diffstat (limited to 'graphics/arrow.c')
-rw-r--r--graphics/arrow.c84
1 files changed, 84 insertions, 0 deletions
diff --git a/graphics/arrow.c b/graphics/arrow.c
new file mode 100644
index 0000000..7389400
--- /dev/null
+++ b/graphics/arrow.c
@@ -0,0 +1,84 @@
+/* arrow.c
+ * (c) 2001 Karel 'Clock' Kulhavy
+ * This program is a part of Links project.
+ * It takes a 32x? png image (truecolor one) and puts stdout a hex representation.
+ */
+
+#include <stdlib.h>
+#include <stdio.h>
+#include <png.h>
+
+double r[256],g[256],b[256];
+unsigned char rc[256],gc[256],bc[256];
+double red_thr=130, green_thr=78, blue_thr=33;
+double red_gamma=2000,green_gamma=2000,blue_gamma=2000;
+
+void print_row_hex(FILE *f, unsigned char *buf, int n)
+{
+ int val1=0, val0=0, a;
+
+ for (a=0;a<n;a++){
+ val1<<=1;
+ if (*buf==255&&buf[1]==255&&buf[2]==255)val1|=1;
+ val0<<=1;
+ if (!*buf&&!buf[1]&&!buf[2])val0|=1;
+ buf+=3;
+ }
+ fprintf(f,"\t0x%08x,0x%08x,\n", val0, val1);
+}
+
+int main(int argc, char **argv)
+{
+ int x,y;
+ unsigned char* image;
+ png_structp png_ptr_read;
+ png_infop info_ptr_read;
+ FILE *in_file, *out_file;
+ double gamma;
+
+
+ in_file=fopen("arrow.png","r");
+ out_file=fopen("arrow.inc","w");
+ if (!(in_file&&out_file)){
+ perror("arrow");
+ exit(1);
+ }
+ png_ptr_read=png_create_read_struct(PNG_LIBPNG_VER_STRING, NULL, NULL,
+ NULL);
+ info_ptr_read=png_create_info_struct(png_ptr_read);
+ png_init_io(png_ptr_read, in_file);
+ png_read_info(png_ptr_read, info_ptr_read);
+ x=png_get_image_width(png_ptr_read,info_ptr_read);
+ y=png_get_image_height(png_ptr_read,info_ptr_read);
+ if (png_get_gAMA(png_ptr_read,info_ptr_read, &gamma))
+ {
+ png_set_gamma(png_ptr_read, 1, gamma);
+ }
+ else
+ {
+ png_set_gamma(png_ptr_read, 1, 1.0);
+ }
+ png_read_update_info(png_ptr_read, info_ptr_read);
+ image=malloc(3*x);
+ if (!image){
+ fprintf(stderr,"Not enough memory\n");
+ exit(1);
+ }
+
+ fprintf(out_file,"/* Automatically generated by the program \"arrow\" (arrow.c) */");
+ fprintf(out_file,"enum {arrow_width=32, arrow_height=%d, arrow_area=%d};\n",y,y*32);
+ fprintf(out_file,"\nstatic unsigned int arrow[%d]={\n",y+y);
+ for (;y;y--){
+ png_read_row(png_ptr_read,image,NULL);
+ print_row_hex(out_file,image,x);
+ }
+ fprintf(out_file,"};\n");
+
+ free(image);
+ png_read_end(png_ptr_read, NULL);
+ png_destroy_read_struct(&png_ptr_read, &info_ptr_read, NULL);
+ fclose(in_file);
+
+ return 0;
+}
+