From: Ian Jackson Date: Sat, 4 Jul 2009 00:24:28 +0000 (+0100) Subject: Merge branch 'twomack' X-Git-Tag: 1.9.2~48 X-Git-Url: http://www.chiark.greenend.org.uk/ucgi/~yarrgweb/git?p=ypp-sc-tools.db-live.git;a=commitdiff_plain;h=f23577a2c5659be8d42d87da85a6a62beb80cd3c;hp=62c6511084ac851f374aaeb68b4d1d9f117690a1 Merge branch 'twomack' --- diff --git a/pctb/README b/pctb/README index 49f2c28..4f56fd8 100644 --- a/pctb/README +++ b/pctb/README @@ -8,6 +8,8 @@ This tool can: To run it, change to this directory, type `make', and then: ./ypp-commodities --tsv >commods.tsv +or + ./ypp-commodities --upload While it is capturing the screenshots, do not move the mouse or use the keyboard. Keyboard focus must stay in the YPP client window. diff --git a/pctb/common.h b/pctb/common.h index e4100f9..23b8ca3 100644 --- a/pctb/common.h +++ b/pctb/common.h @@ -48,6 +48,7 @@ typedef struct { int w,h; + struct RgbImage *rgb; char d[]; } CanonImage; diff --git a/pctb/convert.c b/pctb/convert.c index c7c027a..8101fb9 100644 --- a/pctb/convert.c +++ b/pctb/convert.c @@ -305,7 +305,7 @@ int main(int argc, char **argv) { } if (o_mode & mf_analyse) { if (o_flags & ff_needisland) { - find_islandname(page0_rgbimage); + find_islandname(page_images[0]->rgb); if (o_flags & ff_printisland) printf("%s, %s\n", archipelago, island); sysassert(! setenv("YPPSC_ISLAND",island,1) ); diff --git a/pctb/convert.h b/pctb/convert.h index 80979ec..b61563f 100644 --- a/pctb/convert.h +++ b/pctb/convert.h @@ -51,6 +51,8 @@ typedef struct RgbImage { */ } RgbImage; +typedef unsigned long Rgb; + void identify_rgbimage(const RgbImage *base, Rect portion, char result[MAXIMGIDENT], const char *what); RgbImage *alloc_rgb_image(int w, int h); @@ -58,6 +60,13 @@ void fwrite_ppmraw(FILE *f, const RgbImage *ri); #define RI_PIXEL(ri,x,y) ((ri)->data + ((y)*(ri)->w + (x)) * 3) +static inline Rgb ri_rgb(const RgbImage *ri, int x, int y) { + const unsigned char *rip= RI_PIXEL(ri,x,y); + return (rip[0] << 16) | + (rip[1] << 8) | + (rip[2] ); +} + /*----- from structure.c -----*/ void find_structure(const CanonImage *im, int *max_relevant_y_r); @@ -118,7 +127,6 @@ void take_one_screenshot(void); #define MAX_PAGES 100 extern CanonImage *page_images[MAX_PAGES]; extern int npages; -RgbImage *page0_rgbimage; extern const char *ocean, *pirate; extern char *archipelago, *island; diff --git a/pctb/pages.c b/pctb/pages.c index d93beff..f9ca6e0 100644 --- a/pctb/pages.c +++ b/pctb/pages.c @@ -43,7 +43,6 @@ CanonImage *page_images[MAX_PAGES]; int npages; -RgbImage *page0_rgbimage; const char *ocean, *pirate; @@ -349,7 +348,7 @@ static void wait_for_stability(Snapshot **output, last=*output; *output=0; } else if (!identical(*output,last)) { debugf("PAGING wait_for_stability changed...\n"); - free(last); last=*output; *output=0; + free_snapshot(&last); last=*output; *output=0; nidentical=0; if (!with_keypress) { min_interval *= 3.0; @@ -494,11 +493,10 @@ static void set_focus_commodity(void) { debugf("PAGING raise_and_set_focus done.\n"); } -static CanonImage *convert_page(Snapshot *sn, RgbImage *ri) { +static CanonImage *convert_page(Snapshot *sn) { CanonImage *im; fwrite_ppmraw(screenshot_file, sn); - if (ri) memcpy(ri->data, sn->data, ri->h * ri->w * 3); unsigned char *pixel= sn->data; CANONICALISE_IMAGE(im, sn->w, sn->h, { @@ -523,7 +521,7 @@ static void prepare_ypp_client(void) { raise_and_get_details(); wait_for_stability(¤t,0,0, "checking current YPP client screen..."); - test= convert_page(current, 0); + test= convert_page(current); find_structure(test, &max_relevant_y); check_correct_commodities(); Rect sunshine= find_sunshine_widget(); @@ -553,7 +551,6 @@ static void prepare_ypp_client(void) { void take_screenshots(void) { Snapshot *current=0, *last=0; - RgbImage *page0_store; prepare_ypp_client(); @@ -562,8 +559,6 @@ void take_screenshots(void) { wait_for_stability(¤t,0, send_pgup_many, "paging up to top of commodity list..."); - page0_rgbimage= page0_store= alloc_rgb_image(current->w, current->h); - /* now to actually page down */ for (;;) { debugf("paging page %d\n",npages); @@ -572,8 +567,8 @@ void take_screenshots(void) { fatal("Paging down seems to generate too many pages - max is %d.", MAX_PAGES); - page_images[npages]= convert_page(current, page0_store); - free_snapshot(&last); last=current; current=0; page0_store=0; + page_images[npages]= convert_page(current); + free_snapshot(&last); last=current; current=0; debugf("PAGING page %d converted\n",npages); @@ -595,7 +590,6 @@ void take_screenshots(void) { debugf("PAGING all done.\n"); progress_log("collected %d screenshots.",npages); - assert(!page0_store); } void take_one_screenshot(void) { @@ -603,8 +597,7 @@ void take_one_screenshot(void) { prepare_ypp_client(); wait_for_stability(¤t,0,0, "taking screenshot..."); - page0_rgbimage= alloc_rgb_image(current->w, current->h); - page_images[0]= convert_page(current, page0_rgbimage); + page_images[0]= convert_page(current); npages= 1; progress_log("collected single screenshot."); } diff --git a/pctb/structure.c b/pctb/structure.c index 5309489..1f3c743 100644 --- a/pctb/structure.c +++ b/pctb/structure.c @@ -133,20 +133,23 @@ static void mustfail2(void) { #define REQUIRE_RECTANGLE(tlx,tly,brx,bry,ok) \ require_rectangle(tlx, tly, brx, bry, ok, __LINE__); -static void require_rectangle(int tlx, int tly, int brx, int bry, - const char *ok, int lineno) { +#define FOR_P_RECT(p,rect) \ + for ((p).x=(rr).tl.x; (p).x<=(rr).br.x; (p).x++) \ + for ((p).y=(rr).tl.y; (p).y<=(rr).br.y; (p).y++) + +static void require_rectangle_r(Rect rr, const char *ok, int lineno) { Point p; - for (p.x=tlx; p.x<=brx; p.x++) - for (p.y=tly; p.y<=bry; p.y++) { - int c= get_p(p); - MUST( strchr(ok,c), ({ - Rect rm={{tlx,tly},{brx,bry}}; - MI(lineno),MR(rm);MP(p);MS(ok); - })); - } + FOR_P_RECT(p,rr) { + int c= get_p(p); + MUST( strchr(ok,c), ({ + MI(lineno),MR(rr);MP(p);MS(ok); + })); + } } -static void require_rectangle_r(Rect rr, const char *ok, int lineno) { - require_rectangle(rr.tl.x,rr.tl.y, rr.br.x,rr.br.y, ok, lineno); +static void require_rectangle(int tlx, int tly, int brx, int bry, + const char *ok, int lineno) { + Rect rr= {{tlx,tly},{brx,bry}}; + require_rectangle_r(rr, ok, lineno); } static void debug_rect(const char *what, int whati, Rect rr) { @@ -375,7 +378,6 @@ static void file_read_image_ppm(FILE *f) { struct pam inpam; unsigned char rgb_buf[3]; CanonImage *im; - RgbImage *ri=0; pnm_readpaminit(f, &inpam, sizeof(inpam)); if (!(inpam.maxval == 255 && @@ -383,9 +385,6 @@ static void file_read_image_ppm(FILE *f) { inpam.format == RPPM_FORMAT)) fatal("PNM screenshot(s) file must be 8bpp 1 byte per sample RGB"); - if (!npages) - page0_rgbimage= ri= alloc_rgb_image(inpam.width, inpam.height); - CANONICALISE_IMAGE(im, inpam.width, inpam.height, { int r= fread(&rgb_buf,1,3,f); sysassert(!ferror(f)); @@ -396,8 +395,6 @@ static void file_read_image_ppm(FILE *f) { ((unsigned long)rgb_buf[1]<<8) | (rgb_buf[2]); - if (ri) - CANONIMG_ALSO_STORERGB(ri); }); sysassert(!ferror(screenshot_file)); @@ -560,7 +557,7 @@ void find_islandname(RgbImage *ri) { const unsigned char *srcp; unsigned char *destp, *endp; - for (srcp=page0_rgbimage->data, destp=ri->data, + for (srcp=page_images[0]->rgb->data, destp=ri->data, endp= ri->data + 3 * ri->w * ri->h; destp < endp; srcp++, destp++) { diff --git a/pctb/structure.h b/pctb/structure.h index ec399a2..beadfed 100644 --- a/pctb/structure.h +++ b/pctb/structure.h @@ -34,7 +34,7 @@ typedef struct { - unsigned long rgb; /* on screen */ + Rgb rgb; /* on screen */ char c; /* canonical */ } CanonColourInfo; @@ -42,45 +42,47 @@ extern const CanonColourInfo canoncolourinfos[]; CanonImage *alloc_canon_image(int w, int h); -#define CANONICALISE_IMAGE(im,w,h, COMPUTE_RGB) do{ \ - /* compute_rgb should be a number of statements, or \ - * a block, which assigns to \ - * unsigned long rgb; \ - * given the values of \ - * int x,y; \ - * all of which are anamorphic. Result is stored in im. \ - * The COMPUTE_RGB is executed exactly once for \ - * each pixel in reading order. \ - */ \ - (im)= alloc_canon_image((w), (h)); \ - \ - int x,y; \ - unsigned long last_rgb= ~0UL; \ - int last_c= -1; \ - for (y=0; y<(h); y++) { \ - for (x=0; x<(w); x++) { \ - const CanonColourInfo *cci; \ - unsigned long rgb; \ - COMPUTE_RGB; \ - if (rgb == last_rgb) { \ - (im)->d[y*(w) + x]= last_c; \ - } else { \ - for (cci=canoncolourinfos; cci->c; cci++) { \ - if (cci->rgb == rgb) { \ - last_rgb= rgb; \ - (im)->d[y*(w) + x]= last_c= cci->c; \ - break; \ - } \ - } \ - } \ - } \ - if (DEBUGP(rect)) { \ - fprintf(debug, "%4d ",y); \ - fwrite(im->d + y*w, 1,w, debug); \ - fputc('\n',debug); \ - } \ - } \ - debug_flush(); \ +#define CANONICALISE_IMAGE(im,w,h, COMPUTE_RGB) do{ \ + /* compute_rgb should be a number of statements, or \ + * a block, which assigns to \ + * Rgb rgb; \ + * given the values of \ + * int x,y; \ + * all of which are anamorphic. Result is stored in im. \ + * The COMPUTE_RGB is executed exactly once for \ + * each pixel in reading order. \ + */ \ + (im)= alloc_canon_image((w), (h)); \ + (im)->rgb= alloc_rgb_image((w), (h)); \ + \ + int x,y; \ + unsigned long last_rgb= ~0UL; \ + int last_c= -1; \ + for (y=0; y<(h); y++) { \ + for (x=0; x<(w); x++) { \ + const CanonColourInfo *cci; \ + unsigned long rgb; \ + COMPUTE_RGB; \ + CANONIMG_ALSO_STORERGB((im)->rgb); \ + if (rgb == last_rgb) { \ + (im)->d[y*(w) + x]= last_c; \ + } else { \ + for (cci=canoncolourinfos; cci->c; cci++) { \ + if (cci->rgb == rgb) { \ + last_rgb= rgb; \ + (im)->d[y*(w) + x]= last_c= cci->c; \ + break; \ + } \ + } \ + } \ + } \ + if (DEBUGP(rect)) { \ + fprintf(debug, "%4d ",y); \ + fwrite(im->d + y*(w), 1,(w), debug); \ + fputc('\n',debug); \ + } \ + } \ + debug_flush(); \ }while(0)