chiark / gitweb /
WIP island determination; generalise ADJUST
authorIan Jackson <ian@liberator.relativity.greenend.org.uk>
Sun, 14 Jun 2009 18:08:51 +0000 (19:08 +0100)
committerIan Jackson <ian@liberator.relativity.greenend.org.uk>
Sun, 14 Jun 2009 18:08:51 +0000 (19:08 +0100)
pctb/convert.h
pctb/pages.c
pctb/structure.c
pctb/structure.h

index 8c6efefd7b3c0311eaed52f4320257bbd8eb15a5..ba52f646dc0339834dfea349d3df2764cc9d32da 100644 (file)
@@ -40,7 +40,7 @@
 
 /*----- from structure.c -----*/
 
-void find_structure(CanonImage *im, int *max_relevant_y_r);
+void find_structure_commod(CanonImage *im, int *max_relevant_y_r);
 void check_correct_commodities(void);
 void read_screenshots(void);
 void read_one_screenshot(void);
index ab3a2b0b118125fcbe13e816d607c3ac834459ca..8a837595435d8181e7735ee00873fb80a7af7ada 100644 (file)
@@ -39,6 +39,7 @@
 
 CanonImage *page_images[MAX_PAGES];
 int npages;
+RawImage *page0_rawimage;
 
 char *ocean, *pirate;
 
@@ -364,7 +365,7 @@ static void compute_shift_mask(ShMask *sm, unsigned long ximage_mask) {
   assert(sm->rshift < LONG_BIT);
 }
 
-static CanonImage *convert_page(Snapshot *sn) {
+static CanonImage *convert_page(Snapshot *sn, RawImage *ri) {
   ShMask shiftmasks[3];
   CanonImage *im;
 
@@ -391,6 +392,8 @@ static CanonImage *convert_page(Snapshot *sn) {
       rgb |= sample;
       fputc(sample, screenshot_file);
     }
+    if (ri)
+      CANONIMG_ALSO_STORERAW(ri);
   });
 
   sysassert(!ferror(screenshot_file));
@@ -406,8 +409,8 @@ void take_screenshots(void) {
   /* find the window and check it's on the right kind of screen */
   raise_and_get_details();
   wait_for_stability(&current,0,0, "checking current YPP client screen...");
-  test= convert_page(current);
-  find_structure(test, &max_relevant_y);
+  test= convert_page(current, 0);
+  find_structure_commod(test, &max_relevant_y);
   check_correct_commodities();
   free(test);
 
@@ -424,7 +427,7 @@ void take_screenshots(void) {
       fatal("Paging down seems to generate too many pages - max is %d.",
            MAX_PAGES);
     
-    page_images[npages]= convert_page(current);
+    page_images[npages]= convert_page(current, 0);
     free_snapshot(&last); last=current; current=0;
 
     debugf("PAGING page %d converted\n",npages);
@@ -455,7 +458,8 @@ void take_one_screenshot(void) {
   raise_and_get_details();
   sync_after_input();
   wait_for_stability(&current,0,0, "taking screenshot...");
-  page_images[0]= convert_page(current);
+  //page0_rawimage= alloc_raw_image(sn->width, sn->height);
+  page_images[0]= convert_page(current, 0);
   npages= 1;
   progress_log("collected single screenshot.");
 }
index 0fbfb40e6eb076b5dd7081635362e1dabc1fead7..ce24da971f0157dd2b8d15dc302fffb2ac614265 100644 (file)
@@ -46,10 +46,14 @@ static int colrightx[INTERESTING_COLUMNS];
 static int text_h=-1, columns=-1;
 static OcrReader *rd;
 
+#define OTHERCOORD_x y
+#define OTHERCOORD_y x
+
 const CanonColourInfo canoncolourinfos[]= {
   { 0x475A5E, '*' }, /* edge */
   { 0x2C5F7A, '*' }, /* edge just under box heading shadow */
-  { 0xC5C7Ae, '*' }, /* blank area of partial commodities list */
+  { 0xC5C7AE, '*' }, /* blank area of partial commodities list */
+  { 0x6B828C, '*' }, /* background of ship status meter area */
   { 0x7D9094, '+' }, /* interbox */
 
   { 0xBDC5BF, ' ' }, /* background - pale  Sugar cane, etc. */
@@ -163,11 +167,39 @@ static void debug_rect(const char *what, int whati, Rect rr) {
          );                                            \
   }while(0)
 
-void find_structure(CanonImage *im, int *max_relevant_y_r) {
+#define ADJUST_BOX(search,insidechrs,want, lim,LIMIT_MUST, TLBR,XY,increm) \
+  for (;;) {                                                              \
+    LIMIT_MUST( (search).tl.XY != (search).br.XY &&                       \
+               (search).tl.XY != (lim),                                   \
+               MR((search));MSB(#TLBR);MSB(#XY) );                        \
+    int got;                                                              \
+    Point p;                                                              \
+    for (p=(search).tl, got=0;                                            \
+        p.OTHERCOORD_##XY <= (search).br.OTHERCOORD_##XY;                 \
+        p.OTHERCOORD_##XY++)                                              \
+      got += !!strchr(insidechrs, get_p(p));                              \
+    if (got >= (want))                                                    \
+      break;                                                              \
+    (search).TLBR.XY += increm;                                                   \
+  }
+
+void find_structure_commod(CanonImage *im, int *max_relevant_y_r) {
   cim= im;
   
   Rect whole = { {0,0}, {cim->w-1,cim->h-1} };
 
+  if (DEBUGP(rect)) {
+    int xscaleunit, y,x;
+    for (y=0, xscaleunit=1; y<4; y++, xscaleunit*=10) {
+      fprintf(debug,"     ");
+      for (x=0; x<=cim->w; x++) {
+       if (x % xscaleunit) fputc(' ',debug);
+       else fprintf(debug,"%d",(x / xscaleunit)%10);
+      }
+      fputc('\n',debug);
+    }
+  }
+
   WALK_UNTIL_MUST(mainr.tl, x,-1, whole.tl.x, '*');
   WALK_UNTIL_MUST(mainr.tl, y,-1, whole.tl.y, '*');
   WALK_UNTIL_MUST(mainr.br, x,+1, whole.br.x, '*');
@@ -209,18 +241,6 @@ void find_structure(CanonImage *im, int *max_relevant_y_r) {
   down.y++;
   WALK_UNTIL_MUST(down, y,+1, mainr.br.y, '+');
 
-  if (DEBUGP(rect)) {
-    int xscaleunit, y,x;
-    for (y=0, xscaleunit=1; y<4; y++, xscaleunit*=10) {
-      fprintf(debug,"     ");
-      for (x=0; x<=cim->w; x++) {
-       if (x % xscaleunit) fputc(' ',debug);
-       else fprintf(debug,"%d",(x / xscaleunit)%10);
-      }
-      fputc('\n',debug);
-    }
-  }
-
   commbasey= up.y;
   comminty= down.y - up.y + 2;
 
@@ -261,19 +281,8 @@ void find_structure(CanonImage *im, int *max_relevant_y_r) {
 void check_correct_commodities(void) {
   Rect search= { { 50,39 }, { 130,59 } };
 
-#define SEARCH_UPDOWN(this,increm)                             \
-  for (;;) {                                                   \
-    MUST( search.tl.y != search.br.y, MR(search);MSB(#this); );        \
-    int x, got=0;                                              \
-    for (x=search.tl.x; x<=search.br.x; x++)                   \
-      got += (get(x,this.y) == '_');                           \
-    if (got > 10)                                              \
-      break;                                                   \
-    this.y += increm;                                          \
-  }
-    
-  SEARCH_UPDOWN(search.tl, +1);
-  SEARCH_UPDOWN(search.br, -1);
+  ADJUST_BOX(search,"_",10, cim->h, MUST, tl,y,+1);
+  ADJUST_BOX(search,"_",10, 0,      MUST, br,y,-1);
 
   debug_rect("commodselr",1, search);
 
@@ -442,7 +451,7 @@ void analyse(FILE *tsv_output) {
   int page, tryrect, colno;
 
   for (page=0; page<npages; page++) {
-    find_structure(page_images[page], 0);
+    find_structure_commod(page_images[page], 0);
 
     if (!page)
       check_correct_commodities();
@@ -473,3 +482,48 @@ void analyse(FILE *tsv_output) {
     }
   }
 }
+
+#if 0
+
+static Rect islandnamer;
+
+void find_structure_islandname(CanonImage *im, RawImage *ri) {
+  Rect sunshiner;
+
+  sunshiner.tl.x= cim->w - 1034 +  885;
+  sunshiner.br.x= cim->w - 1034 + 1020;
+  sunshiner.tl.y= 227;
+  sunshiner.br.y= 227;
+
+  ADJUST_BOX(sunshiner,"o",30, 100,MUST, tl,y,-1);
+  ADJUST_BOX(sunshiner,"o",30, 100,MUST, tl,y,-1);
+     
+
+  islandnamer.tl.x= cim->w - 1034 +  885;
+  islandnamer.br.x= cim->w - 1034 + 1020;
+  islandnamer.tl.y=                 128;
+  islandnamer.br.y=                 156;
+
+#define IR_VSHRINK_MUST(CONDMUST,PRWHY) \
+  do{ if (!(CONDMUST)) goto not_in_radar; }while(0)
+
+  ADJUST_BOX(islandnamer,"o",5, IR_VSHRINK_MUST, tl,y,+1);
+  ADJUST_BOX(islandnamer,"o",5, IR_VSHRINK_MUST, br,y,-1);
+
+  debug_rect("islandnamer",0, islandnamer);
+  static int larger_islandnamebry= islandname.tl.y + 25;
+  if (islandnamer.br.y < larger_islandnamebry)
+    goto not_in_radar;
+  islandnamer.br.y = larger_islandnamebry;
+  debug_rect("islandnamer",1, islandnamer);
+
+  debug_ppmrect("islandnamer",2, islandnamer,ri);
+  
+ not_in_radar:
+  
+
+  
+  abort();
+}
+
+#endif
index e8ea9f9804a654f66e26e8c2aec3b97dc220b3c0..77396cf390db06ade4c30f7279b0105aa42377c7 100644 (file)
@@ -77,4 +77,25 @@ CanonImage *alloc_canon_image(int w, int h);
   }while(0)
 
 
+typedef struct {
+  int w, h;
+  char data[];
+  /* red   = data[ y*w*3 + x*3 + 0 ] = RI_PIXEL(ri,x,y)[0]
+   * green = data[ y*w*3 + x*3 + 1 ] = RI_PIXEL(ri,x,y)[1]
+   * blue  = data[ y*w*3 + x*3 + 2 ] = RI_PIXEL(ri,x,y)[2]
+   */
+} RawImage;
+
+RawImage *alloc_raw_image(int w, int h);
+
+#define RI_PIXEL(ri,x,y) ((ri)->data + ((y)*(ri)->w + (x)) * 3)
+
+#define CANONIMG_ALSO_STORERAW(ri)             \
+  do{                                          \
+    char *rip= RI_PIXEL((ri),x,y);             \
+    rip[0]= rgb >> 16;                         \
+    rip[1]= rgb >> 8;                          \
+    rip[2]= rgb;                               \
+  }while(0)
+
 #endif /*STRUCTURE_H*/