ViewVC Help
View File | Revision Log | Show Annotations | Download File
/cvs/deliantra/server/common/image.C
(Generate patch)

Comparing deliantra/server/common/image.C (file contents):
Revision 1.1 by elmex, Sun Aug 13 17:16:00 2006 UTC vs.
Revision 1.10 by pippijn, Sat Jan 6 14:42:28 2007 UTC

1/*
2 * static char *rcsid_image_c =
3 * "$Id: image.C,v 1.1 2006/08/13 17:16:00 elmex Exp $";
4 */
5
6/* 1/*
7 CrossFire, A Multiplayer game for X-windows 2 CrossFire, A Multiplayer game for X-windows
8 3
4 Copyright (C) 2005, 2006, 2007 Marc Lehmann & Crossfire+ Development Team
9 Copyright (C) 2002 Mark Wedel & Crossfire Development Team 5 Copyright (C) 2002 Mark Wedel & Crossfire Development Team
10 Copyright (C) 1992 Frank Tore Johansen 6 Copyright (C) 1992 Frank Tore Johansen
11 7
12 This program is free software; you can redistribute it and/or modify 8 This program is free software; you can redistribute it and/or modify
13 it under the terms of the GNU General Public License as published by 9 it under the terms of the GNU General Public License as published by
21 17
22 You should have received a copy of the GNU General Public License 18 You should have received a copy of the GNU General Public License
23 along with this program; if not, write to the Free Software 19 along with this program; if not, write to the Free Software
24 Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. 20 Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
25 21
26 The maintainer of this code can be reached at crossfire-devel@real-time.com 22 The maintainer of this code can be reached at <crossfire@schmorp.de>
27*/ 23*/
28 24
29 25
30#include <global.h> 26#include <global.h>
31#include <stdio.h> 27#include <stdio.h>
42 * that some number corresponds to the face at that number - for 38 * that some number corresponds to the face at that number - for
43 * xbm, it may not. At current time, these do in fact match because 39 * xbm, it may not. At current time, these do in fact match because
44 * the bmaps file is created in a sorted order. 40 * the bmaps file is created in a sorted order.
45 */ 41 */
46 42
47struct bmappair { 43struct bmappair
44{
48 char *name; 45 char *name;
49 unsigned int number; 46 unsigned int number;
50}; 47};
51 48
49void free (bmappair *); // guard to catch free when delete should be used
50
52static struct bmappair *xbm=NULL; 51static struct bmappair *xbm = NULL;
53 52
54/* Following can just as easily be pointers, but 53/* Following can just as easily be pointers, but
55 * it is easier to keep them like this. 54 * it is easier to keep them like this.
56 */ 55 */
57New_Face *blank_face, *dark_faces[3], *empty_face, *smooth_face; 56New_Face *blank_face, *dark_faces[3], *empty_face, *smooth_face;
71int nrofpixmaps = 0; 70int nrofpixmaps = 0;
72 71
73/** 72/**
74 * id is the face to smooth, smooth is the 16x2 face used to smooth id. 73 * id is the face to smooth, smooth is the 16x2 face used to smooth id.
75 */ 74 */
76struct smoothing { 75struct smoothing:zero_initialised
76{
77 uint16 id; 77 uint16 id;
78 uint16 smooth; 78 uint16 smooth;
79}; 79};
80
81void free (smoothing *); // guard to catch free when delete should be used
80 82
81/** 83/**
82 * Contains all defined smoothing entries. smooth is an array of nrofsmooth 84 * Contains all defined smoothing entries. smooth is an array of nrofsmooth
83 * entries. It is sorted by smooth[].id. 85 * entries. It is sorted by smooth[].id.
84 */ 86 */
85static struct smoothing *smooth=NULL; 87static struct smoothing *smooth = NULL;
86int nrofsmooth=0; 88int nrofsmooth = 0;
87 89
88/* the only thing this table is used for now is to 90/* the only thing this table is used for now is to
89 * translate the colorname in the magicmap field of the 91 * translate the colorname in the magicmap field of the
90 * face into a numeric index that is then sent to the 92 * face into a numeric index that is then sent to the
91 * client for magic map commands. The order of this table 93 * client for magic map commands. The order of this table
92 * must match that of the NDI colors in include/newclient.h. 94 * must match that of the NDI colors in include/newclient.h.
93 */ 95 */
94static const char *const colorname[] = { 96static const char *const colorname[] = {
95"black", /* 0 */ 97 "black", /* 0 */
96"white", /* 1 */ 98 "white", /* 1 */
97"blue", /* 2 */ 99 "blue", /* 2 */
98"red", /* 3 */ 100 "red", /* 3 */
99"orange", /* 4 */ 101 "orange", /* 4 */
100"light_blue", /* 5 */ 102 "light_blue", /* 5 */
101"dark_orange", /* 6 */ 103 "dark_orange", /* 6 */
102"green", /* 7 */ 104 "green", /* 7 */
103"light_green", /* 8 */ 105 "light_green", /* 8 */
104"grey", /* 9 */ 106 "grey", /* 9 */
105"brown", /* 10 */ 107 "brown", /* 10 */
106"yellow", /* 11 */ 108 "yellow", /* 11 */
107"khaki" /* 12 */ 109 "khaki" /* 12 */
108}; 110};
109 111
112static int
110static int compar (const struct bmappair *a, const struct bmappair *b) { 113compar (const struct bmappair *a, const struct bmappair *b)
114{
111 return strcmp (a->name, b->name); 115 return strcmp (a->name, b->name);
112} 116}
117static int
113static int compar_smooth (const struct smoothing *a, const struct smoothing *b) { 118compar_smooth (const struct smoothing *a, const struct smoothing *b)
119{
114 if (a->id<b->id) 120 if (a->id < b->id)
115 return -1; 121 return -1;
116 if (b->id<a->id) 122 if (b->id < a->id)
117 return 1;
118 return 0; 123 return 1;
124 return 0;
119} 125}
120 126
121 127
122/* 128/*
123 * Returns the matching color in the coloralias if found, 129 * Returns the matching color in the coloralias if found,
124 * 0 otherwise. Note that 0 will actually be black, so there is no 130 * 0 otherwise. Note that 0 will actually be black, so there is no
125 * way the calling function can tell if an error occurred or not 131 * way the calling function can tell if an error occurred or not
126 */ 132 */
127 133
134static uint8
128static uint8 find_color(const char *name) { 135find_color (const char *name)
136{
129 uint8 i; 137 uint8 i;
138
130 for(i=0;i<sizeof(colorname)/sizeof(*colorname);i++) 139 for (i = 0; i < sizeof (colorname) / sizeof (*colorname); i++)
131 if(!strcmp(name,colorname[i])) 140 if (!strcmp (name, colorname[i]))
132 return i; 141 return i;
133 LOG(llevError,"Unknown color: %s\n",name); 142 LOG (llevError, "Unknown color: %s\n", name);
134 return 0; 143 return 0;
135} 144}
136 145
137/* This reads the lib/faces file, getting color and visibility information. 146/* This reads the lib/faces file, getting color and visibility information.
138 * it is called by ReadBmapNames. 147 * it is called by ReadBmapNames.
139 */ 148 */
140 149
141static void ReadFaceData(void) 150static void
151ReadFaceData (void)
142{ 152{
143 char buf[MAX_BUF], *cp; 153 char buf[MAX_BUF], *cp;
144 New_Face *on_face=NULL; 154 New_Face *on_face = NULL;
145 FILE *fp; 155 FILE *fp;
146 156
147 sprintf(buf,"%s/faces", settings.datadir); 157 sprintf (buf, "%s/faces", settings.datadir);
148 LOG(llevDebug,"Reading faces from %s...",buf); 158 LOG (llevDebug, "Reading faces from %s...\n", buf);
149 if ((fp=fopen(buf,"r"))==NULL) { 159 if ((fp = fopen (buf, "r")) == NULL)
160 {
150 LOG(llevError, "Cannot open faces file %s: %s\n", buf, strerror_local(errno)); 161 LOG (llevError, "Cannot open faces file %s: %s\n", buf, strerror (errno));
151 exit(-1); 162 exit (-1);
152 } 163 }
153 while (fgets(buf, MAX_BUF, fp)!=NULL) { 164 while (fgets (buf, MAX_BUF, fp) != NULL)
154 if (*buf=='#') continue; 165 {
166 if (*buf == '#')
167 continue;
155 if (!strncmp(buf,"end",3)) { 168 if (!strncmp (buf, "end", 3))
169 {
156 on_face = NULL; 170 on_face = NULL;
157 } 171 }
158 else if (!strncmp(buf,"face",4)) { 172 else if (!strncmp (buf, "face", 4))
173 {
159 int tmp; 174 int tmp;
160 175
161 cp = buf + 5; 176 cp = buf + 5;
162 cp[strlen(cp)-1] = '\0'; /* remove newline */ 177 cp[strlen (cp) - 1] = '\0'; /* remove newline */
163 178
164 if ((tmp=FindFace(cp,-1))==-1) { 179 if ((tmp = FindFace (cp, -1)) == -1)
180 {
165 LOG(llevError,"Could not find face %s\n", cp); 181 LOG (llevError, "Could not find face %s\n", cp);
166 continue; 182 continue;
167 } 183 }
168 on_face = &new_faces[tmp]; 184 on_face = &new_faces[tmp];
169 on_face->visibility=0; 185 on_face->visibility = 0;
170 } 186 }
171 else if (on_face==NULL) { 187 else if (on_face == NULL)
188 {
172 LOG(llevError,"Got line with no face set: %s\n", buf); 189 LOG (llevError, "Got line with no face set: %s\n", buf);
173 } 190 }
174 else if (!strncmp(buf,"color_fg",8)) { 191 else if (!strncmp (buf, "color_fg", 8))
192 {
175 cp = buf + 9; 193 cp = buf + 9;
176 cp[strlen(cp)-1] = '\0'; 194 cp[strlen (cp) - 1] = '\0';
177 if (on_face->magicmap==255) on_face->magicmap=find_color(cp); 195 if (on_face->magicmap == 255)
178 } 196 on_face->magicmap = find_color (cp);
197 }
179 else if (!strncmp(buf,"color_bg",8)) { 198 else if (!strncmp (buf, "color_bg", 8))
199 {
180 /* ignore it */ 200 /* ignore it */
181 } 201 }
182 else if (!strncmp(buf,"visibility",10)) { 202 else if (!strncmp (buf, "visibility", 10))
203 {
183 on_face->visibility = atoi(buf + 11); 204 on_face->visibility = atoi (buf + 11);
184 } 205 }
185 else if (!strncmp(buf,"magicmap",8)) { 206 else if (!strncmp (buf, "magicmap", 8))
186 cp=buf+9; 207 {
208 cp = buf + 9;
187 cp[strlen(cp)-1] = '\0'; 209 cp[strlen (cp) - 1] = '\0';
188 on_face->magicmap=find_color(cp); 210 on_face->magicmap = find_color (cp);
189 } 211 }
190 else if (!strncmp(buf,"is_floor",8)) { 212 else if (!strncmp (buf, "is_floor", 8))
213 {
191 int value = atoi(buf+9); 214 int value = atoi (buf + 9);
192 if (value) on_face->magicmap |= FACE_FLOOR; 215
193 } 216 if (value)
217 on_face->magicmap |= FACE_FLOOR;
218 }
219 else
194 else LOG(llevDebug,"Got unknown line in faces file: %s\n", buf); 220 LOG (llevDebug, "Got unknown line in faces file: %s\n", buf);
195 } 221 }
196 LOG(llevDebug,"done\n"); 222 LOG (llevDebug, "done\n");
197 fclose(fp); 223 fclose (fp);
198} 224}
199 225
200/* This reads the bmaps file to get all the bitmap names and 226/* This reads the bmaps file to get all the bitmap names and
201 * stuff. It only needs to be done once, because it is player 227 * stuff. It only needs to be done once, because it is player
202 * independent (ie, what display the person is on will not make a 228 * independent (ie, what display the person is on will not make a
203 * difference.) 229 * difference.)
204 */ 230 */
205 231
232void
206void ReadBmapNames (void) { 233ReadBmapNames (void)
234{
207 char buf[MAX_BUF], *p, *q; 235 char buf[MAX_BUF], *p, *q;
208 FILE *fp; 236 FILE *fp;
209 int value, nrofbmaps = 0, i; 237 int value, nrofbmaps = 0, i;
210 size_t l; 238 size_t l;
211 239
212 bmaps_checksum=0; 240 bmaps_checksum = 0;
213 sprintf (buf,"%s/bmaps", settings.datadir); 241 sprintf (buf, "%s/bmaps", settings.datadir);
214 LOG(llevDebug,"Reading bmaps from %s...",buf); 242 LOG (llevDebug, "Reading bmaps from %s...\n", buf);
215 if ((fp=fopen(buf,"r"))==NULL) { 243 if ((fp = fopen (buf, "r")) == NULL)
244 {
216 LOG(llevError, "Cannot open bmaps file %s: %s\n", buf, strerror_local(errno)); 245 LOG (llevError, "Cannot open bmaps file %s: %s\n", buf, strerror (errno));
217 exit(-1); 246 exit (-1);
218 }
219 247 }
248
220 /* First count how many bitmaps we have, so we can allocate correctly */ 249 /* First count how many bitmaps we have, so we can allocate correctly */
221 while (fgets (buf, MAX_BUF, fp)!=NULL) 250 while (fgets (buf, MAX_BUF, fp) != NULL)
222 if(buf[0] != '#' && buf[0] != '\n' ) 251 if (buf[0] != '#' && buf[0] != '\n')
223 nrofbmaps++; 252 nrofbmaps++;
224 rewind(fp); 253 rewind (fp);
225 254
226 xbm = (struct bmappair *) malloc(sizeof(struct bmappair) * nrofbmaps); 255 xbm = new bmappair[nrofbmaps];
227 memset (xbm, 0, sizeof (struct bmappair) * nrofbmaps); 256 memset (xbm, 0, sizeof (struct bmappair) * nrofbmaps);
228 257
229 while(nroffiles < nrofbmaps && fgets (buf, MAX_BUF, fp) != NULL) { 258 while (nroffiles < nrofbmaps && fgets (buf, MAX_BUF, fp) != NULL)
259 {
230 if (*buf == '#') 260 if (*buf == '#')
231 continue; 261 continue;
232 262
233 p = (*buf == '\\') ? (buf + 1): buf; 263 p = (*buf == '\\') ? (buf + 1) : buf;
234 if (!(p = strtok (p , " \t")) || !(q = strtok (NULL , " \t\n"))) { 264 if (!(p = strtok (p, " \t")) || !(q = strtok (NULL, " \t\n")))
265 {
235 LOG(llevDebug,"Warning, syntax error: %s\n", buf); 266 LOG (llevDebug, "Warning, syntax error: %s\n", buf);
236 continue; 267 continue;
237 } 268 }
238 value = atoi (p); 269 value = atoi (p);
239 xbm[nroffiles].name = strdup_local(q); 270 xbm[nroffiles].name = strdup (q);
240 271
241 /* We need to calculate the checksum of the bmaps file 272 /* We need to calculate the checksum of the bmaps file
242 * name->number mapping to send to the client. This does not 273 * name->number mapping to send to the client. This does not
243 * need to match what sum or other utility may come up with - 274 * need to match what sum or other utility may come up with -
244 * as long as we get the same results on the same real file 275 * as long as we get the same results on the same real file
245 * data, it does the job as it lets the client know if 276 * data, it does the job as it lets the client know if
246 * the file has the same data or not. 277 * the file has the same data or not.
247 */ 278 */
248 ROTATE_RIGHT(bmaps_checksum);
249 bmaps_checksum += value & 0xff;
250 bmaps_checksum &= 0xffffffff;
251
252 ROTATE_RIGHT(bmaps_checksum);
253 bmaps_checksum += (value >> 8) & 0xff;
254 bmaps_checksum &= 0xffffffff;
255 for (l=0; l<strlen(q); l++) {
256 ROTATE_RIGHT(bmaps_checksum); 279 ROTATE_RIGHT (bmaps_checksum);
257 bmaps_checksum += q[l]; 280 bmaps_checksum += value & 0xff;
258 bmaps_checksum &= 0xffffffff; 281 bmaps_checksum &= 0xffffffff;
259 }
260 282
283 ROTATE_RIGHT (bmaps_checksum);
284 bmaps_checksum += (value >> 8) & 0xff;
285 bmaps_checksum &= 0xffffffff;
286 for (l = 0; l < strlen (q); l++)
287 {
288 ROTATE_RIGHT (bmaps_checksum);
289 bmaps_checksum += q[l];
290 bmaps_checksum &= 0xffffffff;
291 }
292
261 xbm[nroffiles].number = value; 293 xbm[nroffiles].number = value;
262 nroffiles++; 294 nroffiles++;
263 if(value >= nrofpixmaps) 295 if (value >= nrofpixmaps)
264 nrofpixmaps = value+1; 296 nrofpixmaps = value + 1;
265 } 297 }
266 fclose(fp); 298 fclose (fp);
267 299
268 LOG(llevDebug,"done (got %d/%d/%d)\n",nrofpixmaps,nrofbmaps,nroffiles); 300 LOG (llevDebug, "done (got %d/%d/%d)\n", nrofpixmaps, nrofbmaps, nroffiles);
269 301
270 new_faces = (New_Face *)malloc(sizeof(New_Face) * nrofpixmaps); 302 new_faces = new New_Face[nrofpixmaps];
303
271 for (i = 0; i < nrofpixmaps; i++) { 304 for (i = 0; i < nrofpixmaps; i++)
305 {
272 new_faces[i].name = ""; 306 new_faces[i].name = "";
273 new_faces[i].number = i; 307 new_faces[i].number = i;
274 new_faces[i].visibility=0; 308 new_faces[i].visibility = 0;
275 new_faces[i].magicmap=255; 309 new_faces[i].magicmap = 255;
276 } 310 }
277 for (i = 0; i < nroffiles; i++) { 311 for (i = 0; i < nroffiles; i++)
312 {
278 new_faces[xbm[i].number].name = xbm[i].name; 313 new_faces[xbm[i].number].name = xbm[i].name;
279 } 314 }
280 315
316 // non-pod datatype, likely not allowed
281 qsort (xbm, nroffiles, sizeof(struct bmappair), (int (*)(const void*, const void*))compar); 317 qsort (xbm, nroffiles, sizeof (struct bmappair), (int (*)(const void *, const void *)) compar);
282 318
283 ReadFaceData(); 319 ReadFaceData ();
284 320
285 for (i = 0; i < nrofpixmaps; i++) { 321 for (i = 0; i < nrofpixmaps; i++)
322 {
286 if (new_faces[i].magicmap==255) { 323 if (new_faces[i].magicmap == 255)
324 {
287#if 0 /* Useful for initial debugging, not needed now */ 325#if 0 /* Useful for initial debugging, not needed now */
288 LOG(llevDebug,"Face %s still had default magicmap, resetting to black\n", 326 LOG (llevDebug, "Face %s still had default magicmap, resetting to black\n", new_faces[i].name);
289 new_faces[i].name);
290#endif 327#endif
291 new_faces[i].magicmap=0; 328 new_faces[i].magicmap = 0;
292 } 329 }
293 } 330 }
294 /* Actually forcefully setting the colors here probably should not 331 /* Actually forcefully setting the colors here probably should not
295 * be done - it could easily create confusion. 332 * be done - it could easily create confusion.
296 */ 333 */
297 blank_face = &new_faces[FindFace(BLANK_FACE_NAME, 0)]; 334 blank_face = &new_faces[FindFace (BLANK_FACE_NAME, 0)];
298 blank_face->magicmap = find_color ("khaki") | FACE_FLOOR; 335 blank_face->magicmap = find_color ("khaki") | FACE_FLOOR;
299 336
300 empty_face = &new_faces[FindFace(EMPTY_FACE_NAME, 0)]; 337 empty_face = &new_faces[FindFace (EMPTY_FACE_NAME, 0)];
301 338
302 dark_faces[0] = &new_faces[FindFace (DARK_FACE1_NAME,0)]; 339 dark_faces[0] = &new_faces[FindFace (DARK_FACE1_NAME, 0)];
303 dark_faces[1] = &new_faces[FindFace (DARK_FACE2_NAME,0)]; 340 dark_faces[1] = &new_faces[FindFace (DARK_FACE2_NAME, 0)];
304 dark_faces[2] = &new_faces[FindFace (DARK_FACE3_NAME,0)]; 341 dark_faces[2] = &new_faces[FindFace (DARK_FACE3_NAME, 0)];
305 342
306 smooth_face = &new_faces[FindFace(SMOOTH_FACE_NAME,0)]; 343 smooth_face = &new_faces[FindFace (SMOOTH_FACE_NAME, 0)];
307} 344}
308 345
309/* This returns an the face number of face 'name'. Number is constant 346/* This returns an the face number of face 'name'. Number is constant
310 * during an invocation, but not necessarily between versions (this 347 * during an invocation, but not necessarily between versions (this
311 * is because the faces are arranged in alphabetical order, so 348 * is because the faces are arranged in alphabetical order, so
317 * you want some default face used, or can be set to negative 354 * you want some default face used, or can be set to negative
318 * so that it will be known that the face could not be found 355 * so that it will be known that the face could not be found
319 * (needed in client, so that it will know to request that image 356 * (needed in client, so that it will know to request that image
320 * from the server) 357 * from the server)
321 */ 358 */
359int
322int FindFace (const char *name, int error) { 360FindFace (const char *name, int error)
361{
323 struct bmappair *bp, tmp; 362 struct bmappair *bp, tmp;
324 char *p; 363 char *p;
325 364
365 if (!name)
366 return error;
367
326 if ((p = strchr (name, '\n'))) 368 if ((p = strchr (name, '\n')))
327 *p = '\0'; 369 *p = '\0';
328 370
329 tmp.name = (char *)name; 371 tmp.name = (char *) name;
330 bp = (struct bmappair *)bsearch
331 (&tmp, xbm, nroffiles, sizeof(struct bmappair), (int (*)(const void*, const void*))compar); 372 bp = (struct bmappair *) bsearch (&tmp, xbm, nroffiles, sizeof (struct bmappair), (int (*)(const void *, const void *)) compar);
332 373
333 return bp ? bp->number : error; 374 return bp ? bp->number : error;
334} 375}
335 376
336/* Reads the smooth file to know how to smooth datas. 377/* Reads the smooth file to know how to smooth datas.
337 * the smooth file if made of 2 elements lines. 378 * the smooth file if made of 2 elements lines.
338 * lines starting with # are comment 379 * lines starting with # are comment
339 * the first element of line is face to smooth 380 * the first element of line is face to smooth
340 * the next element is the 16x2 faces picture 381 * the next element is the 16x2 faces picture
341 * used for smoothing 382 * used for smoothing
342 */ 383 */
384int
343int ReadSmooth (void) { 385ReadSmooth (void)
386{
344 char buf[MAX_BUF], *p, *q; 387 char buf[MAX_BUF], *p, *q;
345 FILE *fp; 388 FILE *fp;
346 int smoothcount = 0; 389 int smoothcount = 0;
347 390
348 bmaps_checksum=0; 391 bmaps_checksum = 0;
349 sprintf (buf,"%s/smooth", settings.datadir); 392 sprintf (buf, "%s/smooth", settings.datadir);
350 LOG(llevDebug,"Reading smooth from %s...",buf); 393 LOG (llevDebug, "Reading smooth from %s...\n", buf);
351 if ((fp=fopen(buf,"r"))==NULL) { 394 if ((fp = fopen (buf, "r")) == NULL)
395 {
352 LOG(llevError, "Cannot open smooth file %s: %s\n", strerror_local(errno)); 396 LOG (llevError, "Cannot open smooth file %s: %s\n", strerror (errno));
353 exit(-1); 397 exit (-1);
354 } 398 }
355 399
356 /* First count how many smooth we have, so we can allocate correctly */ 400 /* First count how many smooth we have, so we can allocate correctly */
357 while (fgets (buf, MAX_BUF, fp)!=NULL) 401 while (fgets (buf, MAX_BUF, fp) != NULL)
358 if(buf[0] != '#' && buf[0] != '\n' ) 402 if (buf[0] != '#' && buf[0] != '\n')
359 smoothcount++; 403 smoothcount++;
360 rewind(fp); 404 rewind (fp);
361 405
362 smooth = (struct smoothing *) malloc(sizeof(struct smoothing) * (smoothcount)); 406 smooth = new smoothing[smoothcount];
363 memset (smooth, 0, sizeof (struct smoothing) * (smoothcount));
364 407
365 while(nrofsmooth < smoothcount && fgets (buf, MAX_BUF, fp)!=NULL) { 408 while (nrofsmooth < smoothcount && fgets (buf, MAX_BUF, fp) != NULL)
409 {
366 if (*buf == '#') 410 if (*buf == '#')
367 continue; 411 continue;
368 p=strchr(buf,' '); 412 p = strchr (buf, ' ');
369 if (!p) 413 if (!p)
370 continue; 414 continue;
371 *p='\0'; 415 *p = '\0';
372 q=buf; 416 q = buf;
373 smooth[nrofsmooth].id=FindFace(q,0); 417 smooth[nrofsmooth].id = FindFace (q, 0);
374 q=p+1; 418 q = p + 1;
375 smooth[nrofsmooth].smooth=FindFace(q,0); 419 smooth[nrofsmooth].smooth = FindFace (q, 0);
376 nrofsmooth++; 420 nrofsmooth++;
377 } 421 }
378 fclose(fp); 422 fclose (fp);
379 423
380 LOG(llevDebug,"done (got %d smooth entries)\n",nrofsmooth); 424 LOG (llevDebug, "done (got %d smooth entries)\n", nrofsmooth);
381 qsort (smooth, nrofsmooth, sizeof(struct smoothing), (int (*)(const void*, const void*))compar_smooth); 425 qsort (smooth, nrofsmooth, sizeof (struct smoothing), (int (*)(const void *, const void *)) compar_smooth);
382 return nrofsmooth; 426 return nrofsmooth;
383} 427}
384 428
385/** 429/**
386 * Find the smooth face for a given face. 430 * Find the smooth face for a given face.
387 * 431 *
389 * 433 *
390 * @param smoothed return value: set to smooth face 434 * @param smoothed return value: set to smooth face
391 * 435 *
392 * @return 1=smooth face found, 0=no smooth face found 436 * @return 1=smooth face found, 0=no smooth face found
393 */ 437 */
438int
394int FindSmooth (uint16 face, uint16* smoothed) { 439FindSmooth (uint16 face, uint16 * smoothed)
440{
395 struct smoothing *bp, tmp; 441 struct smoothing *bp, tmp;
396 442
397 tmp.id = face; 443 tmp.id = face;
398 bp = (struct smoothing *)bsearch 444 bp = (struct smoothing *) bsearch
399 (&tmp, smooth, nrofsmooth, sizeof(struct smoothing), (int (*)(const void*, const void*))compar_smooth); 445 (&tmp, smooth, nrofsmooth, sizeof (struct smoothing), (int (*)(const void *, const void *)) compar_smooth);
400 (*smoothed)=0; 446 (*smoothed) = 0;
401 if (bp) 447 if (bp)
402 (*smoothed)=bp->smooth; 448 (*smoothed) = bp->smooth;
403 return bp ? 1 : 0; 449 return bp ? 1 : 0;
404} 450}
405 451
406/** 452/**
407 * Deallocates memory allocated by ReadBmapNames() and ReadSmooth(). 453 * Deallocates memory allocated by ReadBmapNames() and ReadSmooth().
408 */ 454 */
455void
409void free_all_images(void) 456free_all_images (void)
410{ 457{
411 int i; 458 int i;
412 459
413 for (i=0; i<nroffiles; i++) 460 for (i = 0; i < nroffiles; i++)
414 free(xbm[i].name); 461 free (xbm[i].name);
415 free(xbm); 462
416 free(new_faces); 463 delete[]xbm;
417 free(smooth); 464 delete[]new_faces;
465 delete[]smooth;
418} 466}

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines