XpmI.h revision edce3322
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 57extern 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 107typedef 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 135typedef 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 147extern 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 */ 153typedef 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 161extern 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 170FUNC(xpmParseData, int, (xpmData *data, XpmImage *image, XpmInfo *info)); 171FUNC(xpmParseDataAndCreate, int, (Display *display, xpmData *data, 172 XImage **image_return, 173 XImage **shapeimage_return, 174 XpmImage *image, XpmInfo *info, 175 XpmAttributes *attributes)); 176 177FUNC(xpmFreeColorTable, void, (XpmColor *colorTable, int ncolors)); 178 179FUNC(xpmInitAttributes, void, (XpmAttributes *attributes)); 180 181FUNC(xpmInitXpmImage, void, (XpmImage *image)); 182 183FUNC(xpmInitXpmInfo, void, (XpmInfo *info)); 184 185FUNC(xpmSetInfoMask, void, (XpmInfo *info, XpmAttributes *attributes)); 186FUNC(xpmSetInfo, void, (XpmInfo *info, XpmAttributes *attributes)); 187FUNC(xpmSetAttributes, void, (XpmAttributes *attributes, XpmImage *image, 188 XpmInfo *info)); 189 190#if !defined(FOR_MSW) && !defined(AMIGA) 191FUNC(xpmCreatePixmapFromImage, void, (Display *display, Drawable d, 192 XImage *ximage, Pixmap *pixmap_return)); 193 194FUNC(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 202typedef struct _xpmHashAtom { 203 char *name; 204 void *data; 205} *xpmHashAtom; 206 207typedef struct { 208 unsigned int size; 209 unsigned int limit; 210 unsigned int used; 211 xpmHashAtom *atomTable; 212} xpmHashTable; 213 214FUNC(xpmHashTableInit, int, (xpmHashTable *table)); 215FUNC(xpmHashTableFree, void, (xpmHashTable *table)); 216FUNC(xpmHashSlot, xpmHashAtom *, (xpmHashTable *table, char *s)); 217FUNC(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 230FUNC(xpmNextString, int, (xpmData *mdata)); 231FUNC(xpmNextUI, int, (xpmData *mdata, unsigned int *ui_return)); 232FUNC(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 238FUNC(xpmNextWord, unsigned int, 239 (xpmData *mdata, char *buf, unsigned int buflen)); 240FUNC(xpmGetCmt, int, (xpmData *mdata, char **cmt)); 241FUNC(xpmParseHeader, int, (xpmData *mdata)); 242FUNC(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 248FUNC(xpmParseColors, int, (xpmData *data, unsigned int ncolors, 249 unsigned int cpp, XpmColor **colorTablePtr, 250 xpmHashTable *hashtable)); 251 252FUNC(xpmParseExtensions, int, (xpmData *data, XpmExtension **extensions, 253 unsigned int *nextensions)); 254 255/* RGB utility */ 256 257FUNC(xpmReadRgbNames, int, (char *rgb_fname, xpmRgbName *rgbn)); 258FUNC(xpmGetRgbName, char *, (xpmRgbName *rgbn, int rgbn_max, 259 int red, int green, int blue)); 260FUNC(xpmFreeRgbNames, void, (xpmRgbName *rgbn, int rgbn_max)); 261#ifdef FOR_MSW 262FUNC(xpmGetRGBfromName,int, (char *name, int *r, int *g, int *b)); 263#endif 264 265#ifndef AMIGA 266FUNC(xpm_xynormalizeimagebits, void, (register unsigned char *bp, 267 register XImage *img)); 268FUNC(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 316FUNC(xpmstrdup, char *, (char *s1)); 317#else 318#undef xpmstrdup 319#define xpmstrdup strdup 320#include <string.h> 321#endif 322 323#ifdef NEED_STRCASECMP 324FUNC(xpmstrcasecmp, int, (char *s1, char *s2)); 325#else 326#undef xpmstrcasecmp 327#define xpmstrcasecmp strcasecmp 328#include <strings.h> 329#endif 330 331FUNC(xpmatoui, unsigned int, 332 (char *p, unsigned int l, unsigned int *ui_return)); 333 334#endif 335