chiark / gitweb /
WIP ocr
authorIan Jackson <ian@liberator.relativity.greenend.org.uk>
Sun, 31 May 2009 22:24:50 +0000 (23:24 +0100)
committerIan Jackson <ian@liberator.relativity.greenend.org.uk>
Sun, 31 May 2009 22:24:50 +0000 (23:24 +0100)
.gitignore
pctb/Makefile [new file with mode: 0644]
pctb/convert.c [new file with mode: 0644]
pctb/wrap-wip [new file with mode: 0755]

index 2ad500a..cfb08ee 100644 (file)
@@ -1,2 +1,6 @@
 *~
 t
+
+pctb/t.*
+pctb/u.*
+pctb/convert
diff --git a/pctb/Makefile b/pctb/Makefile
new file mode 100644 (file)
index 0000000..bff47f5
--- /dev/null
@@ -0,0 +1,5 @@
+LDLIBS += -lnetpbm
+CFLAGS += -Wall -Wwrite-strings -Wpointer-arith -Wmissing-prototypes \
+       -Wstrict-prototypes
+
+all: convert
diff --git a/pctb/convert.c b/pctb/convert.c
new file mode 100644 (file)
index 0000000..80bc894
--- /dev/null
@@ -0,0 +1,75 @@
+#include <pam.h>
+#include <stdint.h>
+#include <inttypes.h>
+#include <assert.h>
+#include <string.h>
+
+#define eassert assert
+
+typedef struct {
+  unsigned long rgb; /* on screen */
+  char c; /* canonical */
+} CanonColourInfo;
+
+static const CanonColourInfo canoncolourinfos[]= {
+  { 0x475A5E, '*' }, /* edge */
+  { 0x7D9094, '+' }, /* interbox */
+  { 0xBDC5BF, ' ' }, /* background - pale */
+  { 0xADB5AF, ' ' }, /* background - dark */
+  { 0x000000, 'o' }, /* foreground */
+  { 0xD4B356, ' ' }, /* background (cursor) */
+  { 0xFFFFFF, 'o' }, /* foreground (cursor) */
+  { 0,0 }
+};
+
+static int height, width;
+static char *image;
+
+static void load_image_and_canonify(void) {
+  struct pam inpam;
+  unsigned char rgb[3];
+  int x,y,r;
+  const CanonColourInfo *cci;
+
+  pnm_readpaminit(stdin, &inpam, sizeof(inpam));
+  height= inpam.height;
+  width= inpam.width;
+  eassert(inpam.maxval == 255);
+  eassert(inpam.bytes_per_sample == 1);
+
+  image= malloc(width*height);
+  eassert(image);
+  memset(image,'?',width*height);
+
+  for (y=0; y<height; y++) {
+    for (x=0; x<width; x++) {
+      r= fread(&rgb,1,3,stdin);  eassert(r==3);
+      unsigned long rgb_l=
+       ((unsigned long)rgb[0]<<16) |
+       ((unsigned long)rgb[1]<<8) |
+                      (rgb[2]);
+      for (cci=canoncolourinfos; cci->c; cci++)
+       if (cci->rgb == rgb_l) {
+         image[y*width + x]= cci->c;
+         break;
+       }
+      if (y==234 && x==82) {
+       printf("y=%d/%d x=%d/%d rgb=%d,%d,%d rgb_l=%lx c=%c\n",
+              y,height,x,width, rgb[0],rgb[1],rgb[2], rgb_l, image[y*width+x]);
+      }
+    }
+    r= fwrite(image + y*width, 1,width, stdout);  eassert(r==width);
+    putchar('\n');
+  }
+  eassert(!fflush(stdout));
+  eassert(!ferror(stdout));
+}
+int main(void) {
+  load_image_and_canonify();
+  /*
+  find_main_rectangle();
+  repeatedly_find_top_thing();
+  */
+  return 0;
+}
diff --git a/pctb/wrap-wip b/pctb/wrap-wip
new file mode 100755 (executable)
index 0000000..5c5bc1e
--- /dev/null
@@ -0,0 +1,8 @@
+#!/bin/bash
+set -ex
+
+xwd -name 'Puzzle Pirates - Aristarchus on the Midnight ocean' >t.xwd
+# 60-odd commodity pages!  Will take ~2 mins to run through them all
+
+convert t.xwd t.pnm
+pnmdepth <t.pnm 255 >u.pnm