PageRenderTime 31ms CodeModel.GetById 12ms app.highlight 15ms RepoModel.GetById 1ms app.codeStats 1ms

/src/Attrib.c

#
C | 308 lines | 216 code | 25 blank | 67 comment | 45 complexity | 35fd2d29d0cc977d74b287315eb530a6 MD5 | raw file
  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/* October 2004, source code review by Thomas Biege <thomas@suse.de> */
 36
 37#ifdef HAVE_CONFIG_H
 38#include <config.h>
 39#endif
 40#include "XpmI.h"
 41
 42/* 3.2 backward compatibility code */
 43LFUNC(CreateOldColorTable, int, (XpmColor *ct, unsigned int ncolors,
 44				 XpmColor ***oldct));
 45
 46LFUNC(FreeOldColorTable, void, (XpmColor **colorTable, unsigned int ncolors));
 47
 48/*
 49 * Create a colortable compatible with the old style colortable
 50 */
 51static int
 52CreateOldColorTable(
 53    XpmColor	  *ct,
 54    unsigned int   ncolors,
 55    XpmColor	***oldct)
 56{
 57    XpmColor **colorTable, **color;
 58    unsigned int a;
 59
 60    if (ncolors >= UINT_MAX / sizeof(XpmColor *))
 61	return XpmNoMemory;
 62
 63    colorTable = (XpmColor **) XpmMalloc(ncolors * sizeof(XpmColor *));
 64    if (!colorTable) {
 65	*oldct = NULL;
 66	return (XpmNoMemory);
 67    }
 68    for (a = 0, color = colorTable; a < ncolors; a++, color++, ct++)
 69	*color = ct;
 70    *oldct = colorTable;
 71    return (XpmSuccess);
 72}
 73
 74static void
 75FreeOldColorTable(
 76    XpmColor	**colorTable,
 77    unsigned int  ncolors)
 78{
 79    unsigned int a, b;
 80    XpmColor **color;
 81    char **sptr;
 82
 83    if (colorTable) {
 84	for (a = 0, color = colorTable; a < ncolors; a++, color++) {
 85	    for (b = 0, sptr = (char **) *color; b <= NKEYS; b++, sptr++)
 86		if (*sptr)
 87		    XpmFree(*sptr);
 88	}
 89	XpmFree(*colorTable);
 90	XpmFree(colorTable);
 91    }
 92}
 93
 94/* end 3.2 bc */
 95
 96/*
 97 * Free the computed color table
 98 */
 99void
100xpmFreeColorTable(
101    XpmColor	*colorTable,
102    int		 ncolors)
103{
104    int a, b;
105    XpmColor *color;
106    char **sptr;
107
108    if (colorTable) {
109	for (a = 0, color = colorTable; a < ncolors; a++, color++) {
110	    for (b = 0, sptr = (char **) color; b <= NKEYS; b++, sptr++)
111		if (*sptr)
112		    XpmFree(*sptr);
113	}
114	XpmFree(colorTable);
115    }
116}
117
118/*
119 * Free array of extensions
120 */
121void
122XpmFreeExtensions(
123    XpmExtension	*extensions,
124    int			 nextensions)
125{
126    unsigned int i, j, nlines;
127    XpmExtension *ext;
128    char **sptr;
129
130    if (extensions  && nextensions > 0) {
131	for (i = 0, ext = extensions; i < nextensions; i++, ext++) {
132	    if (ext->name)
133		XpmFree(ext->name);
134	    nlines = ext->nlines;
135	    for (j = 0, sptr = ext->lines; j < nlines; j++, sptr++)
136		if (sptr && *sptr)
137		    XpmFree(*sptr);
138	    if (ext->lines)
139		XpmFree(ext->lines);
140	}
141	XpmFree(extensions);
142    }
143}
144
145/*
146 * Return the XpmAttributes structure size
147 */
148
149int
150XpmAttributesSize(void)
151{
152    return sizeof(XpmAttributes);
153}
154
155/*
156 * Init returned data to free safely later on
157 */
158void
159xpmInitAttributes(XpmAttributes *attributes)
160{
161    if (attributes) {
162	attributes->pixels = NULL;
163	attributes->npixels = 0;
164	attributes->colorTable = NULL;
165	attributes->ncolors = 0;
166/* 3.2 backward compatibility code */
167	attributes->hints_cmt = NULL;
168	attributes->colors_cmt = NULL;
169	attributes->pixels_cmt = NULL;
170/* end 3.2 bc */
171	if (attributes->valuemask & XpmReturnExtensions) {
172	    attributes->extensions = NULL;
173	    attributes->nextensions = 0;
174	}
175	if (attributes->valuemask & XpmReturnAllocPixels) {
176	    attributes->alloc_pixels = NULL;
177	    attributes->nalloc_pixels = 0;
178	}
179    }
180}
181
182/*
183 * Fill in the XpmAttributes with the XpmImage and the XpmInfo
184 */
185void
186xpmSetAttributes(
187    XpmAttributes	*attributes,
188    XpmImage		*image,
189    XpmInfo		*info)
190{
191    if (attributes->valuemask & XpmReturnColorTable) {
192	attributes->colorTable = image->colorTable;
193	attributes->ncolors = image->ncolors;
194
195	/* avoid deletion of copied data */
196	image->ncolors = 0;
197	image->colorTable = NULL;
198    }
199/* 3.2 backward compatibility code */
200    else if (attributes->valuemask & XpmReturnInfos) {
201	int ErrorStatus;
202
203	ErrorStatus = CreateOldColorTable(image->colorTable, image->ncolors,
204					  (XpmColor ***)
205					  &attributes->colorTable);
206
207	/* if error just say we can't return requested data */
208	if (ErrorStatus != XpmSuccess) {
209	    attributes->valuemask &= ~XpmReturnInfos;
210	    if (!(attributes->valuemask & XpmReturnPixels)) {
211		XpmFree(attributes->pixels);
212		attributes->pixels = NULL;
213		attributes->npixels = 0;
214	    }
215	    attributes->ncolors = 0;
216	} else {
217	    attributes->ncolors = image->ncolors;
218	    attributes->hints_cmt = info->hints_cmt;
219	    attributes->colors_cmt = info->colors_cmt;
220	    attributes->pixels_cmt = info->pixels_cmt;
221
222	    /* avoid deletion of copied data */
223	    image->ncolors = 0;
224	    image->colorTable = NULL;
225	    info->hints_cmt = NULL;
226	    info->colors_cmt = NULL;
227	    info->pixels_cmt = NULL;
228	}
229    }
230/* end 3.2 bc */
231    if (attributes->valuemask & XpmReturnExtensions) {
232	attributes->extensions = info->extensions;
233	attributes->nextensions = info->nextensions;
234
235	/* avoid deletion of copied data */
236	info->extensions = NULL;
237	info->nextensions = 0;
238    }
239    if (info->valuemask & XpmHotspot) {
240	attributes->valuemask |= XpmHotspot;
241	attributes->x_hotspot = info->x_hotspot;
242	attributes->y_hotspot = info->y_hotspot;
243    }
244    attributes->valuemask |= XpmCharsPerPixel;
245    attributes->cpp = image->cpp;
246    attributes->valuemask |= XpmSize;
247    attributes->width = image->width;
248    attributes->height = image->height;
249}
250
251/*
252 * Free the XpmAttributes structure members
253 * but the structure itself
254 */
255void
256XpmFreeAttributes(XpmAttributes *attributes)
257{
258    if (attributes->valuemask & XpmReturnPixels && attributes->npixels) {
259	XpmFree(attributes->pixels);
260	attributes->pixels = NULL;
261	attributes->npixels = 0;
262    }
263    if (attributes->valuemask & XpmReturnColorTable) {
264	xpmFreeColorTable(attributes->colorTable, attributes->ncolors);
265	attributes->colorTable = NULL;
266	attributes->ncolors = 0;
267    }
268/* 3.2 backward compatibility code */
269    else if (attributes->valuemask & XpmInfos) {
270	if (attributes->colorTable) {
271	    FreeOldColorTable((XpmColor **) attributes->colorTable,
272			      attributes->ncolors);
273	    attributes->colorTable = NULL;
274	    attributes->ncolors = 0;
275	}
276	if (attributes->hints_cmt) {
277	    XpmFree(attributes->hints_cmt);
278	    attributes->hints_cmt = NULL;
279	}
280	if (attributes->colors_cmt) {
281	    XpmFree(attributes->colors_cmt);
282	    attributes->colors_cmt = NULL;
283	}
284	if (attributes->pixels_cmt) {
285	    XpmFree(attributes->pixels_cmt);
286	    attributes->pixels_cmt = NULL;
287	}
288	if (attributes->pixels) {
289	    XpmFree(attributes->pixels);
290	    attributes->pixels = NULL;
291	    attributes->npixels = 0;
292	}
293    }
294/* end 3.2 bc */
295    if (attributes->valuemask & XpmReturnExtensions
296	&& attributes->nextensions) {
297	XpmFreeExtensions(attributes->extensions, attributes->nextensions);
298	attributes->extensions = NULL;
299	attributes->nextensions = 0;
300    }
301    if (attributes->valuemask & XpmReturnAllocPixels
302	&& attributes->nalloc_pixels) {
303	XpmFree(attributes->alloc_pixels);
304	attributes->alloc_pixels = NULL;
305	attributes->nalloc_pixels = 0;
306    }
307    attributes->valuemask = 0;
308}