2 * Copyright (C) 1989-95 GROUPE BULL
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:
11 * The above copyright notice and this permission notice shall be included in
12 * all copies or substantial portions of the Software.
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.
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.
26 /*****************************************************************************\
30 * Internal Include file *
32 * ** Everything defined here is subject to changes any time. ** *
34 * Developed by Arnaud Le Hors *
35 \*****************************************************************************/
38 * The code related to FOR_MSW has been added by
39 * HeDu (hedu@cul-ipn.uni-kiel.de) 4/94
48 * lets try to solve include files
51 #include <sys/types.h>
55 /* stdio.h doesn't declare popen on a Sequent DYNIX OS */
64 #include <X11/Xfuncs.h>
73 /* The following should help people wanting to use their own memory allocation
74 * functions. To avoid the overhead of a function call when the standard
75 * functions are used these are all macros, even the XpmFree function which
76 * needs to be a real function for the outside world though.
77 * So if change these be sure to change the XpmFree function in misc.c
80 #define XpmFree(ptr) free(ptr)
83 #define XpmMalloc(size) malloc((size))
84 #define XpmRealloc(ptr, size) realloc((ptr), (size))
85 #define XpmCalloc(nelem, elsize) calloc((nelem), (elsize))
87 /* checks for mallocs bigger than 64K */
88 #define XpmMalloc(size) boundCheckingMalloc((long)(size))/* in simx.[ch] */
89 #define XpmRealloc(ptr, size) boundCheckingRealloc((ptr),(long)(size))
90 #define XpmCalloc(nelem, elsize) \
91 boundCheckingCalloc((long)(nelem),(long) (elsize))
94 #if defined(SCO) || defined(__USLC__)
95 #include <stdint.h> /* For SIZE_MAX */
100 # define SIZE_MAX ULONG_MAX
102 # define SIZE_MAX UINT_MAX
106 #define XPMMAXCMTLEN BUFSIZ
116 char Comment[XPMMAXCMTLEN];
117 const char *Bcmt, *Ecmt;
119 int format; /* 1 if XPM1, 0 otherwise */
136 const char *type; /* key word */
137 const char *Bcmt; /* string beginning comments */
138 const char *Ecmt; /* string ending comments */
139 char Bos; /* character beginning strings */
140 char Eos; /* character ending strings */
141 const char *Strs; /* strings separator */
142 const char *Dec; /* data declaration string */
143 const char *Boa; /* string beginning assignment */
144 const char *Eoa; /* string ending assignment */
147 extern xpmDataType xpmDataTypes[];
150 * rgb values and ascii names (from rgb text file) rgb values,
151 * range of 0 -> 65535 color mnemonic of rgb value
158 /* Maximum number of rgb mnemonics allowed in rgb text file. */
159 #define MAX_RGBNAMES 1024
161 extern const char *xpmColorKeys[];
163 #define TRANSPARENT_COLOR "None" /* this must be a string! */
165 /* number of xpmColorKeys */
168 /* XPM internal routines */
170 FUNC(xpmParseData, int, (xpmData *data, XpmImage *image, XpmInfo *info));
171 FUNC(xpmParseDataAndCreate, int, (Display *display, xpmData *data,
172 XImage **image_return,
173 XImage **shapeimage_return,
174 XpmImage *image, XpmInfo *info,
175 XpmAttributes *attributes));
177 FUNC(xpmFreeColorTable, void, (XpmColor *colorTable, int ncolors));
179 FUNC(xpmInitAttributes, void, (XpmAttributes *attributes));
181 FUNC(xpmInitXpmImage, void, (XpmImage *image));
183 FUNC(xpmInitXpmInfo, void, (XpmInfo *info));
185 FUNC(xpmSetInfoMask, void, (XpmInfo *info, XpmAttributes *attributes));
186 FUNC(xpmSetInfo, void, (XpmInfo *info, XpmAttributes *attributes));
187 FUNC(xpmSetAttributes, void, (XpmAttributes *attributes, XpmImage *image,
190 #if !defined(FOR_MSW) && !defined(AMIGA)
191 FUNC(xpmCreatePixmapFromImage, void, (Display *display, Drawable d,
192 XImage *ximage, Pixmap *pixmap_return));
194 FUNC(xpmCreateImageFromPixmap, void, (Display *display, Pixmap pixmap,
195 XImage **ximage_return,
197 unsigned int *height));
200 /* structures and functions related to hastable code */
202 typedef struct _xpmHashAtom {
211 xpmHashAtom *atomTable;
214 FUNC(xpmHashTableInit, int, (xpmHashTable *table));
215 FUNC(xpmHashTableFree, void, (xpmHashTable *table));
216 FUNC(xpmHashSlot, xpmHashAtom *, (xpmHashTable *table, char *s));
217 FUNC(xpmHashIntern, int, (xpmHashTable *table, char *tag, void *data));
219 #define HashAtomData(i) ((void *)(long)i)
220 #define HashColorIndex(slot) ((unsigned long)((*slot)->data))
221 #define USE_HASHTABLE (cpp > 2 && ncolors > 4)
225 FUNC(xpmNextString, int, (xpmData *mdata));
226 FUNC(xpmNextUI, int, (xpmData *mdata, unsigned int *ui_return));
227 FUNC(xpmGetString, int, (xpmData *mdata, char **sptr, unsigned int *l));
229 #define xpmGetC(mdata) \
230 ((!mdata->type || mdata->type == XPMBUFFER) ? \
231 (*mdata->cptr++) : (getc(mdata->stream.file)))
233 FUNC(xpmNextWord, unsigned int,
234 (xpmData *mdata, char *buf, unsigned int buflen));
235 FUNC(xpmGetCmt, int, (xpmData *mdata, char **cmt));
236 FUNC(xpmParseHeader, int, (xpmData *mdata));
237 FUNC(xpmParseValues, int, (xpmData *data, unsigned int *width,
238 unsigned int *height, unsigned int *ncolors,
239 unsigned int *cpp, unsigned int *x_hotspot,
240 unsigned int *y_hotspot, unsigned int *hotspot,
241 unsigned int *extensions));
243 FUNC(xpmParseColors, int, (xpmData *data, unsigned int ncolors,
244 unsigned int cpp, XpmColor **colorTablePtr,
245 xpmHashTable *hashtable));
247 FUNC(xpmParseExtensions, int, (xpmData *data, XpmExtension **extensions,
248 unsigned int *nextensions));
252 FUNC(xpmReadRgbNames, int, (char *rgb_fname, xpmRgbName *rgbn));
253 FUNC(xpmGetRgbName, char *, (xpmRgbName *rgbn, int rgbn_max,
254 int red, int green, int blue));
255 FUNC(xpmFreeRgbNames, void, (xpmRgbName *rgbn, int rgbn_max));
257 FUNC(xpmGetRGBfromName,int, (char *name, int *r, int *g, int *b));
261 FUNC(xpm_xynormalizeimagebits, void, (register unsigned char *bp,
262 register XImage *img));
263 FUNC(xpm_znormalizeimagebits, void, (register unsigned char *bp,
264 register XImage *img));
269 * The XYNORMALIZE macro determines whether XY format data requires
270 * normalization and calls a routine to do so if needed. The logic in
271 * this module is designed for LSBFirst byte and bit order, so
272 * normalization is done as required to present the data in this order.
274 * The ZNORMALIZE macro performs byte and nibble order normalization if
275 * required for Z format data.
277 * The XYINDEX macro computes the index to the starting byte (char) boundary
278 * for a bitmap_unit containing a pixel with coordinates x and y for image
281 * The ZINDEX* macros compute the index to the starting byte (char) boundary
282 * for a pixel with coordinates x and y for image data in ZPixmap format.
286 #define XYNORMALIZE(bp, img) \
287 if ((img->byte_order == MSBFirst) || (img->bitmap_bit_order == MSBFirst)) \
288 xpm_xynormalizeimagebits((unsigned char *)(bp), img)
290 #define ZNORMALIZE(bp, img) \
291 if (img->byte_order == MSBFirst) \
292 xpm_znormalizeimagebits((unsigned char *)(bp), img)
294 #define XYINDEX(x, y, img) \
295 ((y) * img->bytes_per_line) + \
296 (((x) + img->xoffset) / img->bitmap_unit) * (img->bitmap_unit >> 3)
298 #define ZINDEX(x, y, img) ((y) * img->bytes_per_line) + \
299 (((x) * img->bits_per_pixel) >> 3)
301 #define ZINDEX32(x, y, img) ((y) * img->bytes_per_line) + ((x) << 2)
303 #define ZINDEX16(x, y, img) ((y) * img->bytes_per_line) + ((x) << 1)
305 #define ZINDEX8(x, y, img) ((y) * img->bytes_per_line) + (x)
307 #define ZINDEX1(x, y, img) ((y) * img->bytes_per_line) + ((x) >> 3)
308 #endif /* not AMIGA */
311 FUNC(xpmstrdup, char *, (char *s1));
314 #define xpmstrdup strdup
318 #ifdef NEED_STRCASECMP
319 FUNC(xpmstrcasecmp, int, (char *s1, char *s2));
322 #define xpmstrcasecmp strcasecmp
326 FUNC(xpmatoui, unsigned int,
327 (char *p, unsigned int l, unsigned int *ui_return));