chiark / gitweb /
Decombobulate island names in building screen (/w)
authorIan Jackson <ian@liberator.relativity.greenend.org.uk>
Fri, 26 Jun 2009 22:37:10 +0000 (23:37 +0100)
committerIan Jackson <ian@liberator.relativity.greenend.org.uk>
Fri, 26 Jun 2009 22:37:10 +0000 (23:37 +0100)
pctb/TODO
pctb/common.h
pctb/structure.c

index 465c15eecc462721e61e8b86c7f2a5136c47d90e..020b4c9fce8ecf3ef2a0a929ee11782577f0e112 100644 (file)
--- a/pctb/TODO
+++ b/pctb/TODO
@@ -1,4 +1,3 @@
 write real uploader
 test real uploader
-building island name extractor
 speed it up
index 3fa8a81d985621ad15277a461b7a5fb313b10398..48483e238b58d82e9ede0eaedf89600301804f46 100644 (file)
@@ -74,6 +74,7 @@ typedef struct { /* both inclusive */
    DF(struct)                                  \
    DF(ocr)                                     \
    DF(rsync)                                   \
+   DF(structcolon)                             \
    DF(callout)
 
 enum {
index 466c46624dda89ce1dafcf2fef8178ba3ddc2bab..6ccbb5e76b217518c54b7dcd66c84cb66e1554c4 100644 (file)
@@ -58,7 +58,8 @@ const CanonColourInfo canoncolourinfos[]= {
   { 0x6B828C, '*' }, /* background of ship status meter area */
   { 0x934405, '*' }, /* border of ship meter area */
   { 0x7D9094, '+' }, /* interbox */
-  { 0x022158, 'a' }, /* ahoy /w output foreground */
+  { 0x022158, 'O' }, /* ahoy /w output foreground */
+  { 0xB5B686, 'H' }, /* ahoy /w output heading background */
 
   { 0xBDC5BF, ' ' }, /* background - pale  Sugar cane, etc. */
   { 0xADB5AF, ' ' }, /* background - dark                   */
@@ -522,6 +523,8 @@ void analyse(FILE *tsv_output) {
 
 //static Rect islandnamer;
 
+DEBUG_DEFINE_SOME_DEBUGF(structcolon,colondebugf)
+
 void find_islandname(void) {
   Rect sunshiner;
   char sunshine[MAXIMGIDENT], archisland[MAXIMGIDENT];
@@ -590,6 +593,91 @@ void find_islandname(void) {
 
     identify_rgbimage(ri, islandnamer, archisland, "island");
   } else {
+    Rect islandnamer;
+
+    islandnamer.tl.x= (sunshiner.tl.x + sunshiner.br.x) / 2;
+    islandnamer.tl.y= sunshiner.tl.y + 100;
+    islandnamer.br= islandnamer.tl;
+    debug_rect("islandnamer",__LINE__, islandnamer);
+    
+    WALK_UNTIL_MUST(islandnamer.tl,y, -1, sunshiner.br.y, 'H');
+    WALK_UNTIL_MUST(islandnamer.tl,x, -1, 0,              'o');
+    WALK_UNTIL_MUST(islandnamer.br,x, +1, cim->w,         'o');
+    debug_rect("islandnamer",__LINE__, islandnamer);
+
+    require_rectangle_r(islandnamer, "O*", __LINE__);
+
+    int rw= RECT_W(islandnamer);
+    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);
+    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));
+
+    Point p;
+    int nspaces=1, might_be_colon=0;
+    uint32_t colon_pattern= 0;
+
+    for (p.x=islandnamer.br.x; p.x>islandnamer.tl.x; p.x--) {
+      colondebugf("structcolon: x=%4d nsp=%2d mbc=%d cp=%08"PRIx32" ",
+                 p.x, nspaces, might_be_colon, colon_pattern);
+
+      uint32_t pattern=0;
+      int runs[32], nruns=0;
+      runs[0]=0; runs[1]=0;
+      
+      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();
+       }
+      }
+
+      colondebugf(" pat=%08"PRIx32" nruns=%d runs[]={%d,%d..} ",
+                 pattern, nruns, runs[0],runs[1]);
+
+      if (!pattern) {
+       if (might_be_colon)
+         /* omg it _is_ a colon */
+         goto colon_found;
+       nspaces++;
+       might_be_colon=0;
+      } else {
+       if (nruns==2 && runs[1]==runs[0]) {
+         if (!nspaces) {
+           if (pattern==colon_pattern)
+             goto ok_might_be_colon;
+         } else if (nspaces>=2) {
+           colon_pattern= pattern;
+           might_be_colon=1;
+           goto ok_might_be_colon;
+         }
+       }
+       might_be_colon=0;
+      ok_might_be_colon:
+       nspaces= 0;
+      }
+      colondebugf(" nsp=%2d mbc=%d\n", nspaces, might_be_colon);
+    }
+    MUST(!"colon found", MP(p);MR(islandnamer) );
+
+  colon_found:
+    colondebugf(" found\n");
+    islandnamer.br.x= p.x;
+
+    identify_rgbimage(ri, islandnamer, archisland, "island");
+
     assert(!"not vessel");
   }