]> git.saurik.com Git - wxWidgets.git/blob - src/xpm/Attrib.c
XPM updates
[wxWidgets.git] / src / xpm / Attrib.c
1 /*
2 * Copyright (C) 1989-95 GROUPE BULL
3 *
4 * Permission is hereby granted, free of charge, to any person obtaining a copy
5 * of this software and associated documentation files (the "Software"), to
6 * deal in the Software without restriction, including without limitation the
7 * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
8 * sell copies of the Software, and to permit persons to whom the Software is
9 * furnished to do so, subject to the following conditions:
10 *
11 * The above copyright notice and this permission notice shall be included in
12 * all copies or substantial portions of the Software.
13 *
14 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
15 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
16 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
17 * GROUPE BULL BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
18 * AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
19 * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
20 *
21 * Except as contained in this notice, the name of GROUPE BULL shall not be
22 * used in advertising or otherwise to promote the sale, use or other dealings
23 * in this Software without prior written authorization from GROUPE BULL.
24 */
25
26 /*****************************************************************************\
27 * Attrib.c: *
28 * *
29 * XPM library *
30 * Functions related to the XpmAttributes structure *
31 * *
32 * Developed by Arnaud Le Hors *
33 \*****************************************************************************/
34
35 #include "XpmI.h"
36
37 /* 3.2 backward compatibility code */
38 LFUNC(CreateOldColorTable, int, (XpmColor *ct, int ncolors,
39 XpmColor ***oldct));
40
41 LFUNC(FreeOldColorTable, void, (XpmColor **colorTable, int ncolors));
42
43 /*
44 * Create a colortable compatible with the old style colortable
45 */
46 #ifdef __OS2__
47 /* Visual Age cannot deal with old, non-ansi, code */
48 static int
49 CreateOldColorTable(XpmColor* ct, int ncolors, XpmColor*** oldct)
50 #else
51 static int
52 CreateOldColorTable(ct, ncolors, oldct)
53 XpmColor *ct;
54 int ncolors;
55 XpmColor ***oldct;
56 #endif
57 {
58 XpmColor **colorTable, **color;
59 int a;
60
61 colorTable = (XpmColor **) XpmMalloc(ncolors * sizeof(XpmColor *));
62 if (!colorTable) {
63 *oldct = NULL;
64 return (XpmNoMemory);
65 }
66 for (a = 0, color = colorTable; a < ncolors; a++, color++, ct++)
67 *color = ct;
68 *oldct = colorTable;
69 return (XpmSuccess);
70 }
71
72 #ifdef __OS2__
73 /* Visual Age cannot deal with old, non-ansi, code */
74 static void FreeOldColorTable(XpmColor** colorTable, int ncolors)
75 #else
76 static void
77 FreeOldColorTable(colorTable, ncolors)
78 XpmColor **colorTable;
79 int ncolors;
80 #endif
81 {
82 int a, b;
83 XpmColor **color;
84 char **sptr;
85
86 if (colorTable) {
87 for (a = 0, color = colorTable; a < ncolors; a++, color++) {
88 for (b = 0, sptr = (char **) *color; b <= NKEYS; b++, sptr++)
89 if (*sptr)
90 XpmFree(*sptr);
91 }
92 XpmFree(*colorTable);
93 XpmFree(colorTable);
94 }
95 }
96
97 /* end 3.2 bc */
98
99 /*
100 * Free the computed color table
101 */
102 #ifdef __OS2__
103 /* Visual Age cannot deal with old, non-ansi, code */
104 void xpmFreeColorTable(XpmColor* colorTable, int ncolors)
105 #else
106 void
107 xpmFreeColorTable(colorTable, ncolors)
108 XpmColor *colorTable;
109 int ncolors;
110 #endif
111 {
112 int a, b;
113 XpmColor *color;
114 char **sptr;
115
116 if (colorTable) {
117 for (a = 0, color = colorTable; a < ncolors; a++, color++) {
118 for (b = 0, sptr = (char **) color; b <= NKEYS; b++, sptr++)
119 if (*sptr)
120 XpmFree(*sptr);
121 }
122 XpmFree(colorTable);
123 }
124 }
125
126 /*
127 * Free array of extensions
128 */
129 #ifdef __OS2__
130 /* Visual Age cannot deal with old, non-ansi, code */
131 void XpmFreeExtensions(XpmExtension* extensions, int nextensions)
132 #else
133 void
134 XpmFreeExtensions(extensions, nextensions)
135 XpmExtension *extensions;
136 int nextensions;
137 #endif
138 {
139 unsigned int i, j, nlines;
140 XpmExtension *ext;
141 char **sptr;
142
143 if (extensions) {
144 for (i = 0, ext = extensions; i < (unsigned)nextensions; i++, ext++) {
145 if (ext->name)
146 XpmFree(ext->name);
147 nlines = ext->nlines;
148 for (j = 0, sptr = ext->lines; j < nlines; j++, sptr++)
149 if (*sptr)
150 XpmFree(*sptr);
151 if (ext->lines)
152 XpmFree(ext->lines);
153 }
154 XpmFree(extensions);
155 }
156 }
157
158 /*
159 * Return the XpmAttributes structure size
160 */
161
162 int
163 XpmAttributesSize()
164 {
165 return sizeof(XpmAttributes);
166 }
167
168 /*
169 * Init returned data to free safely later on
170 */
171 #ifdef __OS2__
172 /* Visual Age cannot deal with old, non-ansi, code */
173 void
174 xpmInitAttributes(XpmAttributes* attributes)
175 #else
176 void
177 xpmInitAttributes(attributes)
178 XpmAttributes *attributes;
179 #endif
180 {
181 if (attributes) {
182 attributes->pixels = NULL;
183 attributes->npixels = 0;
184 attributes->colorTable = NULL;
185 attributes->ncolors = 0;
186 /* 3.2 backward compatibility code */
187 attributes->hints_cmt = NULL;
188 attributes->colors_cmt = NULL;
189 attributes->pixels_cmt = NULL;
190 /* end 3.2 bc */
191 if (attributes->valuemask & XpmReturnExtensions) {
192 attributes->extensions = NULL;
193 attributes->nextensions = 0;
194 }
195 if (attributes->valuemask & XpmReturnAllocPixels) {
196 attributes->alloc_pixels = NULL;
197 attributes->nalloc_pixels = 0;
198 }
199 }
200 }
201
202 /*
203 * Fill in the XpmAttributes with the XpmImage and the XpmInfo
204 */
205 #ifdef __OS2__
206 /* Visual Age cannot deal with old, non-ansi, code */
207 void xpmSetAttributes(XpmAttributes* attributes, XpmImage* image, XpmInfo* info)
208 #else
209 void
210 xpmSetAttributes(attributes, image, info)
211 XpmAttributes *attributes;
212 XpmImage *image;
213 XpmInfo *info;
214 #endif
215 {
216 if (attributes->valuemask & XpmReturnColorTable) {
217 attributes->colorTable = image->colorTable;
218 attributes->ncolors = image->ncolors;
219
220 /* avoid deletion of copied data */
221 image->ncolors = 0;
222 image->colorTable = NULL;
223 }
224 /* 3.2 backward compatibility code */
225 else if (attributes->valuemask & XpmReturnInfos) {
226 int ErrorStatus;
227
228 ErrorStatus = CreateOldColorTable(image->colorTable, image->ncolors,
229 (XpmColor ***)
230 &attributes->colorTable);
231
232 /* if error just say we can't return requested data */
233 if (ErrorStatus != XpmSuccess) {
234 attributes->valuemask &= ~XpmReturnInfos;
235 if (!(attributes->valuemask & XpmReturnPixels)) {
236 XpmFree(attributes->pixels);
237 attributes->pixels = NULL;
238 attributes->npixels = 0;
239 }
240 attributes->ncolors = 0;
241 } else {
242 attributes->ncolors = image->ncolors;
243 attributes->hints_cmt = info->hints_cmt;
244 attributes->colors_cmt = info->colors_cmt;
245 attributes->pixels_cmt = info->pixels_cmt;
246
247 /* avoid deletion of copied data */
248 image->ncolors = 0;
249 image->colorTable = NULL;
250 info->hints_cmt = NULL;
251 info->colors_cmt = NULL;
252 info->pixels_cmt = NULL;
253 }
254 }
255 /* end 3.2 bc */
256 if (attributes->valuemask & XpmReturnExtensions) {
257 attributes->extensions = info->extensions;
258 attributes->nextensions = info->nextensions;
259
260 /* avoid deletion of copied data */
261 info->extensions = NULL;
262 info->nextensions = 0;
263 }
264 if (info->valuemask & XpmHotspot) {
265 attributes->valuemask |= XpmHotspot;
266 attributes->x_hotspot = info->x_hotspot;
267 attributes->y_hotspot = info->y_hotspot;
268 }
269 attributes->valuemask |= XpmCharsPerPixel;
270 attributes->cpp = image->cpp;
271 attributes->valuemask |= XpmSize;
272 attributes->width = image->width;
273 attributes->height = image->height;
274 }
275
276 /*
277 * Free the XpmAttributes structure members
278 * but the structure itself
279 */
280 #ifdef __OS2__
281 /* Visual Age cannot deal with old, non-ansi, code */
282 void XpmFreeAttributes(XpmAttributes* attributes)
283 #else
284 void
285 XpmFreeAttributes(attributes)
286 XpmAttributes *attributes;
287 #endif
288 {
289 if (attributes->valuemask & XpmReturnPixels && attributes->npixels) {
290 XpmFree(attributes->pixels);
291 attributes->pixels = NULL;
292 attributes->npixels = 0;
293 }
294 if (attributes->valuemask & XpmReturnColorTable) {
295 xpmFreeColorTable(attributes->colorTable, attributes->ncolors);
296 attributes->colorTable = NULL;
297 attributes->ncolors = 0;
298 }
299 /* 3.2 backward compatibility code */
300 else if (attributes->valuemask & XpmInfos) {
301 if (attributes->colorTable) {
302 FreeOldColorTable((XpmColor **) attributes->colorTable,
303 attributes->ncolors);
304 attributes->colorTable = NULL;
305 attributes->ncolors = 0;
306 }
307 if (attributes->hints_cmt) {
308 XpmFree(attributes->hints_cmt);
309 attributes->hints_cmt = NULL;
310 }
311 if (attributes->colors_cmt) {
312 XpmFree(attributes->colors_cmt);
313 attributes->colors_cmt = NULL;
314 }
315 if (attributes->pixels_cmt) {
316 XpmFree(attributes->pixels_cmt);
317 attributes->pixels_cmt = NULL;
318 }
319 if (attributes->pixels) {
320 XpmFree(attributes->pixels);
321 attributes->pixels = NULL;
322 attributes->npixels = 0;
323 }
324 }
325 /* end 3.2 bc */
326 if (attributes->valuemask & XpmReturnExtensions
327 && attributes->nextensions) {
328 XpmFreeExtensions(attributes->extensions, attributes->nextensions);
329 attributes->extensions = NULL;
330 attributes->nextensions = 0;
331 }
332 if (attributes->valuemask & XpmReturnAllocPixels
333 && attributes->nalloc_pixels) {
334 XpmFree(attributes->alloc_pixels);
335 attributes->alloc_pixels = NULL;
336 attributes->nalloc_pixels = 0;
337 }
338 attributes->valuemask = 0;
339 }