X-Git-Url: http://www.chiark.greenend.org.uk/ucgi/~yarrgweb/git?a=blobdiff_plain;f=pctb%2Frgbimage.c;h=798a1043decc6c8badbf5370a9b9df49ba55c5f9;hb=3768c30b78a0afa7ca2c69c21365429c98cd868a;hp=e49044f419f0f7ef06c530a74f8d46c10a8f0dd0;hpb=74e4e249f2c3e848592984cb193aded6a77a341d;p=ypp-sc-tools.db-live.git diff --git a/pctb/rgbimage.c b/pctb/rgbimage.c index e49044f..798a104 100644 --- a/pctb/rgbimage.c +++ b/pctb/rgbimage.c @@ -48,21 +48,13 @@ #include "convert.h" -#define dbassert(x) \ - ((x) ? (void)0 : \ - fatal("Error in pixmap database.\n" \ - " Requirement not met: %s:%d: %s", __FILE__,__LINE__, #x)) - static int identify(const RgbImage *base, Rect portion, - char result[MAXIMGIDENT]) { - FILE *f; - sysassert( f= fopen("pixmaps.txt","r") ); - struct pam inpam; + char result[MAXIMGIDENT], const char *what) { + sysassert( dbfile_open("pixmaps.txt") ); -#define FGETSLINE (fgetsline(f,result,MAXIMGIDENT)) +#define FGETSLINE (dbfile_getsline(result,MAXIMGIDENT,__FILE__,__LINE__)) FGETSLINE; -fprintf(stderr,">%s<\n",result); dbassert(!strcmp(result,"# ypp-sc-tools pctb pixmaps v1")); void *row= 0; @@ -70,57 +62,81 @@ fprintf(stderr,">%s<\n",result); for (;;) { FGETSLINE; - if (!result || result[0]=='#') continue; + if (!result[0] || result[0]=='#') continue; if (!strcmp(result,".")) break; - pnm_readpaminit(f, &inpam, sizeof(inpam)); - dbassert(inpam.maxval == 255); - dbassert(inpam.bytes_per_sample == 1); - dbassert(inpam.format == PPM_FORMAT); + char magic[10]; + dbfile_getsline(magic,sizeof(magic),__FILE__,__LINE__); + + dbassert(!strcmp(magic,"P3")); + int w,h,maxval; + dbassert( dbfile_scanf("%d %d %d",&w,&h,&maxval) == 3); + dbassert(w>0); dbassert(h>0); dbassert(maxval==255); - if (rowa < inpam.width) { - rowa= inpam.width; + if (rowa < w) { + rowa= w; row= mrealloc(row, rowa*3); } - int diff= - inpam.width != RECT_W(portion) || - inpam.height != RECT_H(portion); - - int y; - for (y=0; y=0 && c<=255); + diff |= (c != RI_PIXEL(base, portion.tl.x + x, portion.tl.y + y)[i]); + } + } + } + if (!diff) { + progress_log("Identified %s image: %s.",what,result); + goto found; } - if (!diff) - return 1; } - return 0; + result[0]= 0; + +found: + dbfile_close(); + return !!result[0]; } - -void identify_rgbimage(const RgbImage *base, Rect portion, - char result[MAXIMGIDENT]) { - int ok= identify(base, portion, result); - if (ok) return; - if (DEBUGP(pixmap)) { - int x,y,i; - fprintf(stderr,"P3\n%d %d\n255\n", RECT_W(portion), RECT_H(portion)); - for (y=portion.tl.y; y<=portion.br.y; y++) { - for (x=portion.tl.x; x<=portion.br.x; x++) { - putc(' ',stderr); - for (i=0; i<3; i++) - fprintf(stderr," %3d", RI_PIXEL(base,x,y)[i]); - } - putc('\n',stderr); +static void fwrite_ppm(FILE *f, const RgbImage *base, Rect portion) { + int x,y,i; + fprintf(f,"P3\n%d %d\n255\n", RECT_W(portion), RECT_H(portion)); + for (y=portion.tl.y; y<=portion.br.y; y++) { + for (x=portion.tl.x; x<=portion.br.x; x++) { + putc(' ',f); + for (i=0; i<3; i++) + fprintf(f," %3d", RI_PIXEL(base,x,y)[i]); } + putc('\n',f); + } + sysassert(!ferror(f)); + sysassert(!fflush(f)); +} + +void identify_rgbimage(const RgbImage *base, Rect portion, + char result[MAXIMGIDENT], const char *what) { + for (;;) { + int ok= identify(base, portion, result, what); + if (ok) return; + + if (DEBUGP(pixmap)) + fwrite_ppm(stderr,base,portion); + + FILE *resolver= resolve_start(); + if (!resolver) + fatal("Image recognition failed - unrecognised island.\n" + "See FIXME.FIXME\n"); + + fprintf(resolver, "pixmap\n" "%s\n", what); + fwrite_ppm(resolver, base, portion); + putc('\n',resolver); + + resolve_finish(); } - fatal("Unrecognised pixmap."); } RgbImage *alloc_rgb_image(int w, int h) {