chiark / gitweb /
wip fetching images from X
authorIan Jackson <ian@liberator.relativity.greenend.org.uk>
Sat, 6 Jun 2009 10:03:22 +0000 (11:03 +0100)
committerIan Jackson <ian@liberator.relativity.greenend.org.uk>
Sat, 6 Jun 2009 10:03:22 +0000 (11:03 +0100)
pctb/Makefile
pctb/convert.c
pctb/ocr.h
pctb/pages.c [new file with mode: 0644]
pctb/x-manip-window.c
pctb/x.gdb

index c28e00b..55f4d53 100644 (file)
@@ -3,7 +3,9 @@ CFLAGS += -Wall -Wwrite-strings -Wpointer-arith -Wmissing-prototypes \
 
 all: convert x-manip-window
 
-convert: convert.o ocr.o -lnetpbm
-convert.o ocr.o: ocr.h
+CONVERT_OBJS= convert.o ocr.o pages.o
+
+convert: $(CONVERT_OBJS) -lnetpbm -lXtst -lX11
+$(CONVERT_OBJS): ocr.h
 
 x-manip-window: -lXtst -lX11
index 546ac6e..3a2b79f 100644 (file)
@@ -6,8 +6,7 @@ typedef struct {
   char c; /* canonical */
 } CanonColourInfo;
 
-static int height, width;
-static char *image;
+static CanonImage *cim;
 
 void debug_flush(void) {
   eassert(!fflush(debug));
@@ -23,7 +22,7 @@ typedef struct { /* both inclusive */
   Point br;
 } Rect;
 
-static inline char get(int x, int y) { return image[y * width + x]; }
+static inline char get(int x, int y) { return cim->d[y * cim->w + x]; }
 static inline char get_p(Point p) { return get(p.x,p.y); }
 
 
@@ -93,7 +92,7 @@ static void debug_rect(const char *what, int whati, Rect rr) {
   w= rr.br.x - rr.tl.x + 1;
   for (y=rr.tl.y; y<=rr.br.y; y++) {
     fprintf(debug, "%4d%*s|", y, rr.tl.x,"");
-    r= fwrite(image + y*width + rr.tl.x, 1, w, debug);
+    r= fwrite(cim->d + y*cim->w + rr.tl.x, 1, w, debug);
     eassert(r==w);
     fputc('|',debug);
     fputc('\n',debug);
@@ -116,7 +115,7 @@ static void debug_rect(const char *what, int whati, Rect rr) {
   } while(0)
 
 static void find_structure(void) {
-  Rect whole = { {0,0}, {width-1,height-1} };
+  Rect whole = { {0,0}, {cim->w-1,cim->h-1} };
 
   WALK_UNTIL_MUST(mainr.tl, x,-1, whole.tl.x, '*');
   WALK_UNTIL_MUST(mainr.tl, y,-1, whole.tl.y, '*');
@@ -163,7 +162,7 @@ static void find_structure(void) {
   int xscaleunit, y,x;
   for (y=0, xscaleunit=1; y<4; y++, xscaleunit*=10) {
     fprintf(debug,"     ");
-    for (x=0; x<=width; x++) {
+    for (x=0; x<=cim->w; x++) {
       if (x % xscaleunit) fputc(' ',debug);
       else fprintf(debug,"%d",(x / xscaleunit)%10);
     }
@@ -222,42 +221,49 @@ static void find_table_entry(Rect commod, int colno, Rect *cellr) {
   require_rectangle_r(*cellr, " o");
 }
 
-static void load_image_and_canonify(void) {
+CanonImage *file_read_image(FILE *f) {
   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;
+  pnm_readpaminit(f, &inpam, sizeof(inpam));
   eassert(inpam.maxval == 255);
   eassert(inpam.bytes_per_sample == 1);
 
-  image= malloc(width*height);
-  eassert(image);
-  memset(image,'?',width*height);
+  CanonImage *im= malloc(sizeof(CanonImage) + inpam.width*inpam.height);
+  eassert(im);
+  im->h= inpam.height;
+  im->w= inpam.width;
+
+  memset(im->d,'?',inpam.width*inpam.height);
 
-  for (y=0; y<height; y++) {
-    for (x=0; x<width; x++) {
-      r= fread(&rgb,1,3,stdin);  eassert(r==3);
+  for (y=0; y<inpam.height; y++) {
+    for (x=0; x<inpam.width; x++) {
+      r= fread(&rgb,1,3,f);  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;
+         im->d[y*inpam.width + x]= cci->c;
          break;
        }
     }
 #ifdef DEBUG_RECTANGLES
     fprintf(debug, "%4d ",y);
-    r= fwrite(image + y*width, 1,width, debug);  eassert(r==width);
+    r= fwrite(im->d + y*inpam.width, 1,inpam.width, debug);
+    eassert(r==inpam.width);
     fputc('\n',debug);
 #endif
   }
   debug_flush();
+  return im;
+}
+
+static void load_image_and_canonify(void) {
+  cim= file_read_image(stdin);
 }
 
 static void ocr_rectangle(Rect r, const OcrCellType ct) {
@@ -288,7 +294,7 @@ static void ocr_rectangle(Rect r, const OcrCellType ct) {
   eassert(!fflush(stdout));
 }
 
-int main(void) {
+int main_test(void) {
   Rect thisr, entryr;
   int tryrect, colno;
 
@@ -296,7 +302,7 @@ int main(void) {
   find_structure();
   rd= ocr_init(text_h);
 
-  for (tryrect= +height; tryrect >= -height; tryrect--) {
+  for (tryrect= +cim->h; tryrect >= -cim->h; tryrect--) {
     find_commodity(tryrect, &thisr);
     if (thisr.tl.x < 0)
       continue;
index 4b8ff05..d8491e6 100644 (file)
 #include <sys/types.h>
 #include <sys/wait.h>
 
+
+typedef struct {
+  int w,h;
+  char d[];
+} CanonImage;
+
+
 typedef uint32_t Pixcol;
 #define PSPIXCOL(priscan) priscan##32
 
@@ -42,8 +49,11 @@ void debug_flush(void);
 
 const char *get_vardir(void);
 
+CanonImage *file_read_image(FILE *f);
+int main_test(void);
+
 
-// #define DEBUG_RECTANGLES
+#define DEBUG_RECTANGLES
 // #define DEBUG_OCR
 
 #endif /*OCR_H*/
diff --git a/pctb/pages.c b/pctb/pages.c
new file mode 100644 (file)
index 0000000..272e5cf
--- /dev/null
@@ -0,0 +1,75 @@
+/*
+  */
+
+#include "ocr.h"
+
+#include <X11/Xlib.h>
+#include <X11/extensions/XTest.h>
+#include <X11/keysym.h>
+
+#define NUM_PAGES 25
+
+static Display *disp;
+
+static KeyCode keycode(KeySym sym) {
+  return XKeysymToKeycode(disp,sym);
+}
+
+static CanonImage *screenshot_now(Window id) {
+  char *cmd;
+  CanonImage *ci;
+  int r;
+  
+  r= asprintf(&cmd, "xwd -silent -id 0x%lx | xwdtopnm", (unsigned long)id);
+  eassert(r>=0);
+  FILE *f= popen(cmd,"r");  eassert(f);
+  ci= file_read_image(f);
+  r= fgetc(f);  eassert(r==EOF);  eassert(feof(f));
+  r= pclose(f);  eassert(r>=0);  eassert(WIFEXITED(r) && !WEXITSTATUS(r));
+  free(cmd);
+  return ci;
+}
+
+static void read_pages(Window id) {
+  int r;
+  XWindowAttributes attr;
+  int xpos,ypos, evbase,errbase,majver,minver;
+  unsigned width,height,bd,depth;
+  Window dummy;
+  
+  disp= XOpenDisplay(0);  eassert(disp);
+
+  r= XTestQueryExtension(disp, &evbase,&errbase,&majver,&minver);
+  eassert(r==True);
+
+  r= XRaiseWindow(disp, id);  eassert(r);
+
+  r= XGetWindowAttributes(disp, id, &attr);  eassert(r);
+  r= XGetGeometry(disp,id, &attr.root,&xpos,&ypos,&width,&height, &bd,&depth);
+  eassert(r);
+
+  r= XTranslateCoordinates(disp, id,attr.root, 160,160, &xpos,&ypos,
+                          &dummy);
+  eassert(r);
+
+  int screen= XScreenNumberOfScreen(attr.screen);
+  XTestFakeMotionEvent(disp,screen, xpos, ypos, 0);
+
+  XTestFakeButtonEvent(disp,1,1, 0);
+  XTestFakeButtonEvent(disp,1,0, 50);
+
+  XTestFakeKeyEvent(disp, keycode(XK_Next),1, 50);
+  XTestFakeKeyEvent(disp, keycode(XK_Next),0, 50);
+  
+  r= XSync(disp, False);  eassert(r);
+}
+
+int main(int argc, char **argv) {
+  Window id;
+  CanonImage *ci;
+
+  id= strtoul(*++argv,0,0);
+  read_pages(id);
+  ci= screenshot_now(id);
+  return 0;
+}
index 7dd15a7..33d08c2 100644 (file)
@@ -20,7 +20,6 @@ static KeyCode keycode(const char *s) {
 int main(int argc, const char *const *argv) {
   char *ep;
   XWindowAttributes attr;
-  Window dummy;
   int xpos,ypos;
   unsigned width,height,bd,depth;
   int r;
@@ -34,6 +33,7 @@ int main(int argc, const char *const *argv) {
   r= XGetGeometry(disp,id, &attr.root,&xpos,&ypos,&width,&height, &bd,&depth);
   eassert(r);
 
+  Window dummy;
   r= XTranslateCoordinates(disp, id,attr.root, 160,160, &xpos,&ypos,
                           &dummy);
   eassert(r);
index 922bd4c..d842d57 100644 (file)
@@ -1,4 +1,4 @@
 file convert
 set confirm off
-set args <u.pnm
+set args 0x7e00368
 run