From 80b5d5ede35cfb393591ed6326ca97ca23ce0c31 Mon Sep 17 00:00:00 2001 From: Ian Jackson Date: Sat, 6 Jun 2009 11:03:22 +0100 Subject: [PATCH] wip fetching images from X --- pctb/Makefile | 6 ++-- pctb/convert.c | 46 ++++++++++++++------------ pctb/ocr.h | 12 ++++++- pctb/pages.c | 75 +++++++++++++++++++++++++++++++++++++++++++ pctb/x-manip-window.c | 2 +- pctb/x.gdb | 2 +- 6 files changed, 118 insertions(+), 25 deletions(-) create mode 100644 pctb/pages.c diff --git a/pctb/Makefile b/pctb/Makefile index c28e00b..55f4d53 100644 --- a/pctb/Makefile +++ b/pctb/Makefile @@ -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 diff --git a/pctb/convert.c b/pctb/convert.c index 546ac6e..3a2b79f 100644 --- a/pctb/convert.c +++ b/pctb/convert.c @@ -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; yc; 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; diff --git a/pctb/ocr.h b/pctb/ocr.h index 4b8ff05..d8491e6 100644 --- a/pctb/ocr.h +++ b/pctb/ocr.h @@ -14,6 +14,13 @@ #include #include + +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 index 0000000..272e5cf --- /dev/null +++ b/pctb/pages.c @@ -0,0 +1,75 @@ +/* + */ + +#include "ocr.h" + +#include +#include +#include + +#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; +} diff --git a/pctb/x-manip-window.c b/pctb/x-manip-window.c index 7dd15a7..33d08c2 100644 --- a/pctb/x-manip-window.c +++ b/pctb/x-manip-window.c @@ -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); diff --git a/pctb/x.gdb b/pctb/x.gdb index 922bd4c..d842d57 100644 --- a/pctb/x.gdb +++ b/pctb/x.gdb @@ -1,4 +1,4 @@ file convert set confirm off -set args