From ab4295d148c3112ab2859fac0349152d9b6987be Mon Sep 17 00:00:00 2001 From: Ian Jackson Date: Fri, 26 Jun 2009 23:37:10 +0100 Subject: [PATCH] Decombobulate island names in building screen (/w) --- pctb/TODO | 1 - pctb/common.h | 1 + pctb/structure.c | 90 +++++++++++++++++++++++++++++++++++++++++++++++- 3 files changed, 90 insertions(+), 2 deletions(-) diff --git a/pctb/TODO b/pctb/TODO index 465c15e..020b4c9 100644 --- a/pctb/TODO +++ b/pctb/TODO @@ -1,4 +1,3 @@ write real uploader test real uploader -building island name extractor speed it up diff --git a/pctb/common.h b/pctb/common.h index 3fa8a81..48483e2 100644 --- a/pctb/common.h +++ b/pctb/common.h @@ -74,6 +74,7 @@ typedef struct { /* both inclusive */ DF(struct) \ DF(ocr) \ DF(rsync) \ + DF(structcolon) \ DF(callout) enum { diff --git a/pctb/structure.c b/pctb/structure.c index 466c466..6ccbb5e 100644 --- a/pctb/structure.c +++ b/pctb/structure.c @@ -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"); } -- 2.30.2