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 * XpmI.h: * 28 * * 29 * XPM library * 30 * Internal Include file * 31 * * 32 * ** Everything defined here is subject to changes any time. ** * 33 * * 34 * Developed by Arnaud Le Hors * 35 \*****************************************************************************/ 36 37 /* 38 * The code related to FOR_MSW has been added by 39 * HeDu (hedu@cul-ipn.uni-kiel.de) 4/94 40 */ 41 42 #ifndef XPMI_h 43 #define XPMI_h 44 45 #include "xpm.h" 46 47 /* 48 * lets try to solve include files 49 */ 50 51 #include <sys/types.h> 52 #include <stdio.h> 53 #include <stdlib.h> 54 #include <limits.h> 55 /* stdio.h doesn't declare popen on a Sequent DYNIX OS */ 56 #ifdef sequent 57 extern FILE *popen(); 58 #endif 59 60 #ifdef FOR_MSW 61 #include "simx.h" 62 #else 63 #include <X11/Xos.h> 64 #include <X11/Xfuncs.h> 65 #include <X11/Xmd.h> 66 #endif 67 68 #ifdef VMS 69 #include <unixio.h> 70 #include <file.h> 71 #endif 72 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 78 * accordingly. 79 */ 80 #define XpmFree(ptr) free(ptr) 81 82 #ifndef FOR_MSW 83 #define XpmMalloc(size) malloc((size)) 84 #define XpmRealloc(ptr, size) realloc((ptr), (size)) 85 #define XpmCalloc(nelem, elsize) calloc((nelem), (elsize)) 86 #else 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)) 92 #endif 93 94 #if defined(SCO) || defined(__USLC__) 95 #include <stdint.h> /* For SIZE_MAX */ 96 #endif 97 #include <limits.h> 98 #ifndef SIZE_MAX 99 # ifdef ULONG_MAX 100 # define SIZE_MAX ULONG_MAX 101 # else 102 # define SIZE_MAX UINT_MAX 103 # endif 104 #endif 105 106 #define XPMMAXCMTLEN BUFSIZ 107 typedef struct { 108 unsigned int type; 109 union { 110 FILE *file; 111 char **data; 112 } stream; 113 char *cptr; 114 unsigned int line; 115 int CommentLength; 116 char Comment[XPMMAXCMTLEN]; 117 const char *Bcmt, *Ecmt; 118 char Bos, Eos; 119 int format; /* 1 if XPM1, 0 otherwise */ 120 #ifdef CXPMPROG 121 int lineNum; 122 int charNum; 123 #endif 124 } xpmData; 125 126 #define XPMARRAY 0 127 #define XPMFILE 1 128 #define XPMPIPE 2 129 #define XPMBUFFER 3 130 131 #define EOL '\n' 132 #define TAB '\t' 133 #define SPC ' ' 134 135 typedef struct { 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 */ 145 } xpmDataType; 146 147 extern xpmDataType xpmDataTypes[]; 148 149 /* 150 * rgb values and ascii names (from rgb text file) rgb values, 151 * range of 0 -> 65535 color mnemonic of rgb value 152 */ 153 typedef struct { 154 int r, g, b; 155 char *name; 156 } xpmRgbName; 157 158 /* Maximum number of rgb mnemonics allowed in rgb text file. */ 159 #define MAX_RGBNAMES 1024 160 161 extern const char *xpmColorKeys[]; 162 163 #define TRANSPARENT_COLOR "None" /* this must be a string! */ 164 165 /* number of xpmColorKeys */ 166 #define NKEYS 5 167 168 /* XPM internal routines */ 169 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)); 176 177 FUNC(xpmFreeColorTable, void, (XpmColor *colorTable, int ncolors)); 178 179 FUNC(xpmInitAttributes, void, (XpmAttributes *attributes)); 180 181 FUNC(xpmInitXpmImage, void, (XpmImage *image)); 182 183 FUNC(xpmInitXpmInfo, void, (XpmInfo *info)); 184 185 FUNC(xpmSetInfoMask, void, (XpmInfo *info, XpmAttributes *attributes)); 186 FUNC(xpmSetInfo, void, (XpmInfo *info, XpmAttributes *attributes)); 187 FUNC(xpmSetAttributes, void, (XpmAttributes *attributes, XpmImage *image, 188 XpmInfo *info)); 189 190 #if !defined(FOR_MSW) && !defined(AMIGA) 191 FUNC(xpmCreatePixmapFromImage, void, (Display *display, Drawable d, 192 XImage *ximage, Pixmap *pixmap_return)); 193 194 FUNC(xpmCreateImageFromPixmap, void, (Display *display, Pixmap pixmap, 195 XImage **ximage_return, 196 unsigned int *width, 197 unsigned int *height)); 198 #endif 199 200 /* structures and functions related to hastable code */ 201 202 typedef struct _xpmHashAtom { 203 char *name; 204 void *data; 205 } *xpmHashAtom; 206 207 typedef struct { 208 unsigned int size; 209 unsigned int limit; 210 unsigned int used; 211 xpmHashAtom *atomTable; 212 } xpmHashTable; 213 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)); 218 219 #if defined(_MSC_VER) && defined(_M_X64) 220 #define HashAtomData(i) ((void *)(long long)i) 221 #define HashColorIndex(slot) ((unsigned long long)((*slot)->data)) 222 #else 223 #define HashAtomData(i) ((void *)(long)i) 224 #define HashColorIndex(slot) ((unsigned long)((*slot)->data)) 225 #endif 226 #define USE_HASHTABLE (cpp > 2 && ncolors > 4) 227 228 /* I/O utility */ 229 230 FUNC(xpmNextString, int, (xpmData *mdata)); 231 FUNC(xpmNextUI, int, (xpmData *mdata, unsigned int *ui_return)); 232 FUNC(xpmGetString, int, (xpmData *mdata, char **sptr, unsigned int *l)); 233 234 #define xpmGetC(mdata) \ 235 ((!mdata->type || mdata->type == XPMBUFFER) ? \ 236 (*mdata->cptr++) : (getc(mdata->stream.file))) 237 238 FUNC(xpmNextWord, unsigned int, 239 (xpmData *mdata, char *buf, unsigned int buflen)); 240 FUNC(xpmGetCmt, int, (xpmData *mdata, char **cmt)); 241 FUNC(xpmParseHeader, int, (xpmData *mdata)); 242 FUNC(xpmParseValues, int, (xpmData *data, unsigned int *width, 243 unsigned int *height, unsigned int *ncolors, 244 unsigned int *cpp, unsigned int *x_hotspot, 245 unsigned int *y_hotspot, unsigned int *hotspot, 246 unsigned int *extensions)); 247 248 FUNC(xpmParseColors, int, (xpmData *data, unsigned int ncolors, 249 unsigned int cpp, XpmColor **colorTablePtr, 250 xpmHashTable *hashtable)); 251 252 FUNC(xpmParseExtensions, int, (xpmData *data, XpmExtension **extensions, 253 unsigned int *nextensions)); 254 255 /* RGB utility */ 256 257 FUNC(xpmReadRgbNames, int, (char *rgb_fname, xpmRgbName *rgbn)); 258 FUNC(xpmGetRgbName, char *, (xpmRgbName *rgbn, int rgbn_max, 259 int red, int green, int blue)); 260 FUNC(xpmFreeRgbNames, void, (xpmRgbName *rgbn, int rgbn_max)); 261 #ifdef FOR_MSW 262 FUNC(xpmGetRGBfromName,int, (char *name, int *r, int *g, int *b)); 263 #endif 264 265 #ifndef AMIGA 266 FUNC(xpm_xynormalizeimagebits, void, (register unsigned char *bp, 267 register XImage *img)); 268 FUNC(xpm_znormalizeimagebits, void, (register unsigned char *bp, 269 register XImage *img)); 270 271 /* 272 * Macros 273 * 274 * The XYNORMALIZE macro determines whether XY format data requires 275 * normalization and calls a routine to do so if needed. The logic in 276 * this module is designed for LSBFirst byte and bit order, so 277 * normalization is done as required to present the data in this order. 278 * 279 * The ZNORMALIZE macro performs byte and nibble order normalization if 280 * required for Z format data. 281 * 282 * The XYINDEX macro computes the index to the starting byte (char) boundary 283 * for a bitmap_unit containing a pixel with coordinates x and y for image 284 * data in XY format. 285 * 286 * The ZINDEX* macros compute the index to the starting byte (char) boundary 287 * for a pixel with coordinates x and y for image data in ZPixmap format. 288 * 289 */ 290 291 #define XYNORMALIZE(bp, img) \ 292 if ((img->byte_order == MSBFirst) || (img->bitmap_bit_order == MSBFirst)) \ 293 xpm_xynormalizeimagebits((unsigned char *)(bp), img) 294 295 #define ZNORMALIZE(bp, img) \ 296 if (img->byte_order == MSBFirst) \ 297 xpm_znormalizeimagebits((unsigned char *)(bp), img) 298 299 #define XYINDEX(x, y, img) \ 300 ((y) * img->bytes_per_line) + \ 301 (((x) + img->xoffset) / img->bitmap_unit) * (img->bitmap_unit >> 3) 302 303 #define ZINDEX(x, y, img) ((y) * img->bytes_per_line) + \ 304 (((x) * img->bits_per_pixel) >> 3) 305 306 #define ZINDEX32(x, y, img) ((y) * img->bytes_per_line) + ((x) << 2) 307 308 #define ZINDEX16(x, y, img) ((y) * img->bytes_per_line) + ((x) << 1) 309 310 #define ZINDEX8(x, y, img) ((y) * img->bytes_per_line) + (x) 311 312 #define ZINDEX1(x, y, img) ((y) * img->bytes_per_line) + ((x) >> 3) 313 #endif /* not AMIGA */ 314 315 #ifdef NEED_STRDUP 316 FUNC(xpmstrdup, char *, (char *s1)); 317 #else 318 #undef xpmstrdup 319 #define xpmstrdup strdup 320 #include <string.h> 321 #endif 322 323 #ifdef NEED_STRCASECMP 324 FUNC(xpmstrcasecmp, int, (char *s1, char *s2)); 325 #else 326 #undef xpmstrcasecmp 327 #define xpmstrcasecmp strcasecmp 328 #include <strings.h> 329 #endif 330 331 FUNC(xpmatoui, unsigned int, 332 (char *p, unsigned int l, unsigned int *ui_return)); 333 334 #endif 335