chiark / gitweb /
Cope with AA island name on land
[ypp-sc-tools.db-test.git] / pctb / structure.c
index 8887c8ad624dde26d7704cca2384b0167933acc3..cb79f9996606b8209f0913267d0a3aed250a7370 100644 (file)
@@ -210,20 +210,20 @@ static int commod_selector_matches(Rect search, const char *const *all,
          );                                            \
   }while(0)
 
-#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=0;                                                            \
-    Point p=(search).tl;                                                  \
-    for (p.XY=(search).TLBR.XY;                                                   \
-        p.OTHERCOORD_##XY <= (search).br.OTHERCOORD_##XY;                 \
-        p.OTHERCOORD_##XY++)                                              \
-      got += !!strchr(insidechrs, get_p(p));                              \
-    if (got >= (want))                                                    \
-      break;                                                              \
-    (search).TLBR.XY += increm;                                                   \
+#define ADJUST_BOX(search,insidechrs,OP,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=0;                                                               \
+    Point p=(search).tl;                                                     \
+    for (p.XY=(search).TLBR.XY;                                                      \
+        p.OTHERCOORD_##XY <= (search).br.OTHERCOORD_##XY;                    \
+        p.OTHERCOORD_##XY++)                                                 \
+      got += !!strchr(insidechrs, get_p(p));                                 \
+    if ((got) OP (want))                                                     \
+      break;                                                                 \
+    (search).TLBR.XY += increm;                                                      \
   }
 
 void find_structure(CanonImage *im, int *max_relevant_y_r) {
@@ -326,8 +326,8 @@ void find_structure(CanonImage *im, int *max_relevant_y_r) {
 void check_correct_commodities(void) {
   Rect search= { { 50,39 }, { 130,59 } };
 
-  ADJUST_BOX(search,"_",10, cim->h, MUST, tl,y,+1);
-  ADJUST_BOX(search,"_",10, 0,      MUST, br,y,-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);
 
@@ -387,7 +387,7 @@ static void file_read_image_ppm(FILE *f) {
   if (!(inpam.maxval == 255 &&
        inpam.bytes_per_sample == 1 &&
        inpam.format == RPPM_FORMAT))
-    fatal("PNM screenshot(s) file must be 8bpp 1 byte per sample RGB");
+    fatal("PNM screenshot(s) file must be 8bpp 1 byte-per-sample RGB raw");
 
   CANONICALISE_IMAGE(im, inpam.width, inpam.height, {
     int r= fread(&rgb_buf,1,3,f);
@@ -608,15 +608,15 @@ Rect find_sunshine_widget(void) {
   sunshiner.tl.y= 227;
   sunshiner.br.y= 228;
 
-  ADJUST_BOX(sunshiner,"o*",30, 100,MUST, tl,y,-1);
-  ADJUST_BOX(sunshiner,"o*",30, 100,MUST, br,y,+1);
+  ADJUST_BOX(sunshiner,"o*",>=,30, 100,MUST, tl,y,-1);
+  ADJUST_BOX(sunshiner,"o*",>=,30, 100,MUST, br,y,+1);
   debug_rect("sunshiner",0, sunshiner);
 
   MUST(sunshiner.br.y - sunshiner.tl.y > 20, MR(sunshiner));
   sunshiner.br.y--;
 
-  ADJUST_BOX(sunshiner,"o",20, (cim->w - 1034 + 700), MUST, tl,x,-1);
-  ADJUST_BOX(sunshiner,"o",20,  cim->w,               MUST, br,x,+1);
+  ADJUST_BOX(sunshiner,"o",>=,20, (cim->w - 1034 + 700), MUST, tl,x,-1);
+  ADJUST_BOX(sunshiner,"o",>=,20,  cim->w,               MUST, br,x,+1);
   debug_rect("sunshiner",1, sunshiner);
   return sunshiner;
 }
@@ -647,11 +647,11 @@ void find_islandname(RgbImage *ri) {
     islandnamer.tl.y=                 128;
     islandnamer.br.y=                 156;
 
-    ADJUST_BOX(islandnamer,"o",5, 0,      MUST, tl,y,+1);
-    ADJUST_BOX(islandnamer,"o",5, cim->h, MUST, br,y,-1);
+    ADJUST_BOX(islandnamer,"o",>=,5, 0,      MUST, tl,y,+1);
+    ADJUST_BOX(islandnamer,"o",>=,5, cim->h, MUST, br,y,-1);
 
-    ADJUST_BOX(islandnamer,"o",1, 0,      MUST, tl,x,+1);
-    ADJUST_BOX(islandnamer,"o",1, cim->w, MUST, br,x,-1);
+    ADJUST_BOX(islandnamer,"o",>=,1, 0,      MUST, tl,x,+1);
+    ADJUST_BOX(islandnamer,"o",>=,1, cim->w, MUST, br,x,-1);
 
     debug_rect("islandnamer",0, islandnamer);
 //    int larger_islandnamebry= islandnamer.tl.y + 25;
@@ -671,7 +671,7 @@ void find_islandname(RgbImage *ri) {
       }
 
     identify_rgbimage(ri, islandnamer, archisland, "island");
-  } else if (!strcmp(sunshine,"Land - Ahoy")) {
+  } else if (!strcmp(sunshine,"Land - Ahoy!")) {
     Rect islandnamer;
 
     islandnamer.tl.x= (sunshiner.tl.x + sunshiner.br.x) / 2;
@@ -684,23 +684,28 @@ void find_islandname(RgbImage *ri) {
     WALK_UNTIL_MUST(islandnamer.br,x, +1, cim->w,         'o');
     debug_rect("islandnamer",__LINE__, islandnamer);
 
-    require_rectangle_r(islandnamer, "O*", __LINE__);
+#define RW (RECT_W(islandnamer))
+#define RH (RECT_H(islandnamer))
 
-    int rw= RECT_W(islandnamer);
-    ADJUST_BOX(islandnamer,"O",rw-4, cim->h, MUST,br,y,+1);
+    ADJUST_BOX(islandnamer,"O",>=,RW-4, cim->h, MUST,br,y,+1);
     debug_rect("islandnamer",__LINE__, islandnamer);
 
     islandnamer.br.y += 2;
-    ADJUST_BOX(islandnamer,"O",1,    cim->h, MUST,br,y,+1);
+
+    ADJUST_BOX(islandnamer,"*",<,RW, cim->h, MUST,br,y,+1);
     debug_rect("islandnamer",__LINE__, islandnamer);
 
     islandnamer.tl.y= islandnamer.br.y-1;
     islandnamer.br.y= islandnamer.br.y+1;
-    ADJUST_BOX(islandnamer,"*",rw,   cim->h, MUST,br,y,+1);
-    ADJUST_BOX(islandnamer,"O",1,    cim->w, MUST,tl,x,+1);
     debug_rect("islandnamer",__LINE__, islandnamer);
 
-    MUST( RECT_H(islandnamer) <= 31, MR(islandnamer));
+    ADJUST_BOX(islandnamer,"*",>=,RW, cim->h, MUST,br,y,+1);
+    debug_rect("islandnamer",__LINE__, islandnamer);
+
+    ADJUST_BOX(islandnamer,"*",<, RH, cim->w, MUST,tl,x,+1);
+    debug_rect("islandnamer",__LINE__, islandnamer);
+
+    MUST( RECT_H(islandnamer) <= 30, MR(islandnamer));
 
     Point p;
     int nspaces=1, might_be_colon=0;
@@ -718,9 +723,9 @@ void find_islandname(RgbImage *ri) {
       for (p.y=islandnamer.tl.y; p.y<=islandnamer.br.y; p.y++) {
        pattern <<= 1;
        switch (get_p(p)) {
-       case 'O': runs[nruns]++;                         pattern |= 1u; break;
        case '*': if (runs[nruns]) { nruns++; runs[nruns]=0; }          break;
-       default: abort();
+       case 'O': runs[nruns]++;              pattern |= 1u;            break;
+       default:                              pattern |= 1UL<<31;       break;
        }
       }
 
@@ -734,7 +739,7 @@ void find_islandname(RgbImage *ri) {
        nspaces++;
        might_be_colon=0;
       } else {
-       if (nruns==2 && runs[1]==runs[0]) {
+       if (!(pattern & 1UL<<31) && nruns==2 && runs[1]==runs[0]) {
          if (!nspaces) {
            if (pattern==colon_pattern)
              goto ok_might_be_colon;