X-Git-Url: http://www.chiark.greenend.org.uk/ucgi/~yarrgweb/git?a=blobdiff_plain;f=pctb%2Fstructure.h;fp=pctb%2Fstructure.h;h=ec7b4bf5b2490411141b66eb2e996d0423b80fe3;hb=64063c86071bbfc2de0fe032e372e1321c4b34e5;hp=beadfed469a9476644ce4673d9b6cfa68e2fbf7f;hpb=5a8b5305bfbff13a3952e93d35e46c32b80c7606;p=ypp-sc-tools.web-live.git diff --git a/pctb/structure.h b/pctb/structure.h index beadfed..ec7b4bf 100644 --- a/pctb/structure.h +++ b/pctb/structure.h @@ -33,15 +33,23 @@ #include "convert.h" -typedef struct { - Rgb rgb; /* on screen */ - char c; /* canonical */ -} CanonColourInfo; - -extern const CanonColourInfo canoncolourinfos[]; +typedef struct { char blue2[256]; } CanonColourInfoBlues; +typedef struct { CanonColourInfoBlues *green2[256]; } CanonColourInfoGreens; +typedef struct { CanonColourInfoGreens *red2[256]; } CanonColourInfoReds; +extern CanonColourInfoReds canoncolourinfo_tree; CanonImage *alloc_canon_image(int w, int h); +static inline char canon_lookup_colour(unsigned char r, + unsigned char g, + unsigned char b) { + CanonColourInfoGreens *greens= canoncolourinfo_tree.red2[r]; + if (!greens) return '?'; + CanonColourInfoBlues *blues= greens->green2[g]; + if (!blues) return '?'; + return blues->blue2[b]; +} + #define CANONICALISE_IMAGE(im,w,h, COMPUTE_RGB) do{ \ /* compute_rgb should be a number of statements, or \ * a block, which assigns to \ @@ -56,25 +64,12 @@ CanonImage *alloc_canon_image(int w, int 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; \ + unsigned char r,g,b; \ COMPUTE_RGB; \ 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; \ - } \ - } \ - } \ + (im)->d[y*(w) + x]= canon_lookup_colour(r,g,b); \ } \ if (DEBUGP(rect)) { \ fprintf(debug, "%4d ",y); \ @@ -89,9 +84,9 @@ CanonImage *alloc_canon_image(int w, int h); #define CANONIMG_ALSO_STORERGB(ri) \ do{ \ unsigned char *rip= RI_PIXEL((ri),x,y); \ - rip[0]= rgb >> 16; \ - rip[1]= rgb >> 8; \ - rip[2]= rgb; \ + rip[0]= r; \ + rip[1]= g; \ + rip[2]= b; \ }while(0)