X-Git-Url: https://www.chiark.greenend.org.uk/ucgi/~yarrgweb/git?a=blobdiff_plain;f=pctb%2Fstructure.h;h=beadfed469a9476644ce4673d9b6cfa68e2fbf7f;hb=0784ae937712ff7bf220f25d58e8da0ae2a10d87;hp=6409c339038c4b0d2233e5e4c4db6f8245fcdd9e;hpb=2aaae8ee04d0a6a8ab85751ceb67f222d259eba8;p=ypp-sc-tools.db-test.git diff --git a/pctb/structure.h b/pctb/structure.h index 6409c33..beadfed 100644 --- a/pctb/structure.h +++ b/pctb/structure.h @@ -34,7 +34,7 @@ typedef struct { - unsigned long rgb; /* on screen */ + Rgb rgb; /* on screen */ char c; /* canonical */ } CanonColourInfo; @@ -45,7 +45,7 @@ CanonImage *alloc_canon_image(int w, int h); #define CANONICALISE_IMAGE(im,w,h, COMPUTE_RGB) do{ \ /* compute_rgb should be a number of statements, or \ * a block, which assigns to \ - * unsigned long rgb; \ + * Rgb rgb; \ * given the values of \ * int x,y; \ * all of which are anamorphic. Result is stored in im. \ @@ -53,23 +53,32 @@ CanonImage *alloc_canon_image(int w, int h); * each pixel in reading order. \ */ \ (im)= alloc_canon_image((w), (h)); \ + (im)->rgb= alloc_rgb_image((w), (h)); \ \ int x,y; \ + unsigned long last_rgb= ~0UL; \ + int last_c= -1; \ for (y=0; y<(h); y++) { \ for (x=0; x<(w); x++) { \ const CanonColourInfo *cci; \ unsigned long rgb; \ COMPUTE_RGB; \ - for (cci=canoncolourinfos; cci->c; cci++) { \ - if (cci->rgb == rgb) { \ - (im)->d[y*(w) + x]= cci->c; \ - break; \ + CANONIMG_ALSO_STORERGB((im)->rgb); \ + if (rgb == last_rgb) { \ + (im)->d[y*(w) + x]= last_c; \ + } else { \ + for (cci=canoncolourinfos; cci->c; cci++) { \ + if (cci->rgb == rgb) { \ + last_rgb= rgb; \ + (im)->d[y*(w) + x]= last_c= cci->c; \ + break; \ + } \ } \ } \ } \ if (DEBUGP(rect)) { \ fprintf(debug, "%4d ",y); \ - fwrite(im->d + y*w, 1,w, debug); \ + fwrite(im->d + y*(w), 1,(w), debug); \ fputc('\n',debug); \ } \ } \ @@ -77,25 +86,13 @@ CanonImage *alloc_canon_image(int w, int h); }while(0) -typedef struct { - int w, h; - char data[]; - /* red = data[ y*w*3 + x*3 + 0 ] = RI_PIXEL(ri,x,y)[0] - * green = data[ y*w*3 + x*3 + 1 ] = RI_PIXEL(ri,x,y)[1] - * blue = data[ y*w*3 + x*3 + 2 ] = RI_PIXEL(ri,x,y)[2] - */ -} RgbImage; - -RgbImage *alloc_rgb_image(int w, int h); - -#define RI_PIXEL(ri,x,y) ((ri)->data + ((y)*(ri)->w + (x)) * 3) - #define CANONIMG_ALSO_STORERGB(ri) \ do{ \ - char *rip= RI_PIXEL((ri),x,y); \ + unsigned char *rip= RI_PIXEL((ri),x,y); \ rip[0]= rgb >> 16; \ rip[1]= rgb >> 8; \ rip[2]= rgb; \ }while(0) + #endif /*STRUCTURE_H*/