X-Git-Url: http://www.chiark.greenend.org.uk/ucgi/~yarrgweb/git?a=blobdiff_plain;f=pctb%2Frgbimage.c;fp=pctb%2Frgbimage.c;h=634ead1362a2bacb0870f891e769c623d1327e12;hb=8360f12a6a457b73ebb18dbeedbb15e6ed91318b;hp=e49044f419f0f7ef06c530a74f8d46c10a8f0dd0;hpb=74e4e249f2c3e848592984cb193aded6a77a341d;p=ypp-sc-tools.main.git diff --git a/pctb/rgbimage.c b/pctb/rgbimage.c index e49044f..634ead1 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,42 +62,49 @@ 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 diff= w != RECT_W(portion) || h != 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); + char result[MAXIMGIDENT], const char *what) { + int ok= identify(base, portion, result, what); if (ok) return; if (DEBUGP(pixmap)) { @@ -120,7 +119,7 @@ void identify_rgbimage(const RgbImage *base, Rect portion, putc('\n',stderr); } } - fatal("Unrecognised pixmap."); + fatal("Unrecognised pixmap for %s.", what); } RgbImage *alloc_rgb_image(int w, int h) {