char c; /* canonical */
} CanonColourInfo;
-static int height, width;
-static char *image;
+static CanonImage *cim;
void debug_flush(void) {
eassert(!fflush(debug));
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); }
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);
} 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, '*');
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);
}
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) {
eassert(!fflush(stdout));
}
-int main(void) {
+int main_test(void) {
Rect thisr, entryr;
int tryrect, colno;
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;
--- /dev/null
+/*
+ */
+
+#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;
+}