X-Git-Url: http://www.chiark.greenend.org.uk/ucgi/~yarrgweb/git?a=blobdiff_plain;f=pctb%2Fstructure.h;h=263a26ad86fe1e8ea5e0ee588b88d4c1cba0393a;hb=b958771fa67513ba09630953ec91b9d21b3f42f9;hp=008c183421dd1a00a8148f5872240cc2d40d466c;hpb=52210ae670b22ce2d187bd2dc943fd8ae3f4a8c0;p=ypp-sc-tools.web-live.git diff --git a/pctb/structure.h b/pctb/structure.h index 008c183..263a26a 100644 --- a/pctb/structure.h +++ b/pctb/structure.h @@ -1,3 +1,31 @@ +/* + * Image canonicalisation function for use by callers feeding + * images into structure.c's routines. + */ +/* + * This is part of ypp-sc-tools, a set of third-party tools for assisting + * players of Yohoho Puzzle Pirates. + * + * Copyright (C) 2009 Ian Jackson + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + * Yohoho and Puzzle Pirates are probably trademarks of Three Rings and + * are used without permission. This program is not endorsed or + * sponsored by Three Rings. + */ + #ifndef STRUCTURE_H #define STRUCTURE_H @@ -5,47 +33,58 @@ #include "convert.h" -typedef struct { - unsigned long 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); -#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; \ - * given the values of \ - * int x,y; \ - * all of which are anamorphic. Result is stored in im. \ - * The COMPUTE_RGB is executed exactly once for \ - * each pixel in reading order. \ - */ \ - (im)= alloc_canon_image((w), (h)); \ - \ - int x,y; \ - 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; \ - } \ - } \ - } \ - if (DEBUGP(rect)) { \ - fprintf(debug, "%4d ",y); \ - fwrite(im->d + y*w, 1,w, debug); \ - fputc('\n',debug); \ - } \ - } \ - debug_flush(); \ +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,rgb_save, COMPUTE_RGB) do{ \ + /* compute_rgb should be a number of statements, or \ + * a block, which assigns to \ + * Rgb rgb; \ + * given the values of \ + * int x,y; \ + * all of which are anamorphic. Result is stored in im. \ + * The COMPUTE_RGB is executed exactly once for \ + * each pixel in reading order. \ + */ \ + (im)= alloc_canon_image((w), (h)); \ + (rgb_save)= alloc_rgb_image((w), (h)); \ + \ + int x,y; \ + for (y=0; y<(h); y++) { \ + for (x=0; x<(w); x++) { \ + Rgb rgb; \ + COMPUTE_RGB; \ + CANONIMG_ALSO_STORERGB((rgb_save)); \ + (im)->d[y*(w) + x]= canon_lookup_colour(rgb, rgb>>8, rgb>>16); \ + } \ + if (DEBUGP(rect)) { \ + fprintf(debug, "%4d ",y); \ + fwrite(im->d + y*(w), 1,(w), debug); \ + fputc('\n',debug); \ + } \ + } \ + debug_flush(); \ + }while(0) + + +#define CANONIMG_ALSO_STORERGB(ri) \ + do{ \ + Rgb *rip= RI_PIXEL32((ri),x,y); \ + *rip= rgb; \ }while(0)