2 * Handling of colour (RGB) images
5 * This is part of ypp-sc-tools, a set of third-party tools for assisting
6 * players of Yohoho Puzzle Pirates.
8 * Copyright (C) 2009 Ian Jackson <ijackson@chiark.greenend.org.uk>
10 * This program is free software: you can redistribute it and/or modify
11 * it under the terms of the GNU General Public License as published by
12 * the Free Software Foundation, either version 3 of the License, or
13 * (at your option) any later version.
15 * This program is distributed in the hope that it will be useful,
16 * but WITHOUT ANY WARRANTY; without even the implied warranty of
17 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
18 * GNU General Public License for more details.
20 * You should have received a copy of the GNU General Public License
21 * along with this program. If not, see <http://www.gnu.org/licenses/>.
23 * Yohoho and Puzzle Pirates are probably trademarks of Three Rings and
24 * are used without permission. This program is not endorsed or
25 * sponsored by Three Rings.
53 fatal("Error in pixmap database.\n" \
54 " Requirement not met: %s:%d: %s", __FILE__,__LINE__, #x))
56 static int identify(const RgbImage *base, Rect portion,
57 char result[MAXIMGIDENT]) {
59 sysassert( f= fopen("pixmaps.txt","r") );
62 #define FGETSLINE (fgetsline(f,result,MAXIMGIDENT))
65 fprintf(stderr,">%s<\n",result);
66 dbassert(!strcmp(result,"# ypp-sc-tools pctb pixmaps v1"));
73 if (!result || result[0]=='#') continue;
74 if (!strcmp(result,".")) break;
76 pnm_readpaminit(f, &inpam, sizeof(inpam));
77 dbassert(inpam.maxval == 255);
78 dbassert(inpam.bytes_per_sample == 1);
79 dbassert(inpam.format == PPM_FORMAT);
81 if (rowa < inpam.width) {
83 row= mrealloc(row, rowa*3);
86 inpam.width != RECT_W(portion) ||
87 inpam.height != RECT_H(portion);
90 for (y=0; y<inpam.height; y++) {
91 int r= fread(row,1, 3*inpam.width, f);
92 sysassert(!ferror(f));
94 assert(r == 3*inpam.width);
97 diff= memcmp(RI_PIXEL(base, portion.tl.x, portion.tl.y + y),
106 void identify_rgbimage(const RgbImage *base, Rect portion,
107 char result[MAXIMGIDENT]) {
108 int ok= identify(base, portion, result);
111 if (DEBUGP(pixmap)) {
113 fprintf(stderr,"P3\n%d %d\n255\n", RECT_W(portion), RECT_H(portion));
114 for (y=portion.tl.y; y<=portion.br.y; y++) {
115 for (x=portion.tl.x; x<=portion.br.x; x++) {
118 fprintf(stderr," %3d", RI_PIXEL(base,x,y)[i]);
123 fatal("Unrecognised pixmap.");
126 RgbImage *alloc_rgb_image(int w, int h) {
128 ri= mmalloc(sizeof(*ri) + w*h*3);