XpmI.h revision a966c04f
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/* $XFree86: xc/extras/Xpm/lib/XpmI.h,v 1.7 2001/11/01 23:35:25 dawes Exp $ */ 26 27/*****************************************************************************\ 28* XpmI.h: * 29* * 30* XPM library * 31* Internal Include file * 32* * 33* ** Everything defined here is subject to changes any time. ** * 34* * 35* Developed by Arnaud Le Hors * 36\*****************************************************************************/ 37 38/* 39 * The code related to FOR_MSW has been added by 40 * HeDu (hedu@cul-ipn.uni-kiel.de) 4/94 41 */ 42 43#ifndef XPMI_h 44#define XPMI_h 45 46#include "xpm.h" 47 48/* 49 * lets try to solve include files 50 */ 51 52#include <sys/types.h> 53#include <stdio.h> 54#include <stdlib.h> 55#include <limits.h> 56/* stdio.h doesn't declare popen on a Sequent DYNIX OS */ 57#ifdef sequent 58extern FILE *popen(); 59#endif 60 61#ifdef FOR_MSW 62#include "simx.h" 63#else 64#include <X11/Xos.h> 65#include <X11/Xfuncs.h> 66#include <X11/Xmd.h> 67#endif 68 69#ifdef VMS 70#include <unixio.h> 71#include <file.h> 72#endif 73 74/* The following should help people wanting to use their own memory allocation 75 * functions. To avoid the overhead of a function call when the standard 76 * functions are used these are all macros, even the XpmFree function which 77 * needs to be a real function for the outside world though. 78 * So if change these be sure to change the XpmFree function in misc.c 79 * accordingly. 80 */ 81#define XpmFree(ptr) free(ptr) 82 83#ifndef FOR_MSW 84#define XpmMalloc(size) malloc((size)) 85#define XpmRealloc(ptr, size) realloc((ptr), (size)) 86#define XpmCalloc(nelem, elsize) calloc((nelem), (elsize)) 87#else 88/* checks for mallocs bigger than 64K */ 89#define XpmMalloc(size) boundCheckingMalloc((long)(size))/* in simx.[ch] */ 90#define XpmRealloc(ptr, size) boundCheckingRealloc((ptr),(long)(size)) 91#define XpmCalloc(nelem, elsize) \ 92 boundCheckingCalloc((long)(nelem),(long) (elsize)) 93#endif 94 95#if defined(SCO) || defined(__USLC__) 96#include <stdint.h> /* For SIZE_MAX */ 97#endif 98#include <limits.h> 99#ifndef SIZE_MAX 100# ifdef ULONG_MAX 101# define SIZE_MAX ULONG_MAX 102# else 103# define SIZE_MAX UINT_MAX 104# endif 105#endif 106 107#define XPMMAXCMTLEN BUFSIZ 108typedef struct { 109 unsigned int type; 110 union { 111 FILE *file; 112 char **data; 113 } stream; 114 char *cptr; 115 unsigned int line; 116 int CommentLength; 117 char Comment[XPMMAXCMTLEN]; 118 char *Bcmt, *Ecmt, 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 char *type; /* key word */ 137 char *Bcmt; /* string beginning comments */ 138 char *Ecmt; /* string ending comments */ 139 char Bos; /* character beginning strings */ 140 char Eos; /* character ending strings */ 141 char *Strs; /* strings separator */ 142 char *Dec; /* data declaration string */ 143 char *Boa; /* string beginning assignment */ 144 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 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#define HashAtomData(i) ((void *)(long)i) 220#define HashColorIndex(slot) ((unsigned long)((*slot)->data)) 221#define USE_HASHTABLE (cpp > 2 && ncolors > 4) 222 223/* I/O utility */ 224 225FUNC(xpmNextString, int, (xpmData *mdata)); 226FUNC(xpmNextUI, int, (xpmData *mdata, unsigned int *ui_return)); 227FUNC(xpmGetString, int, (xpmData *mdata, char **sptr, unsigned int *l)); 228 229#define xpmGetC(mdata) \ 230 ((!mdata->type || mdata->type == XPMBUFFER) ? \ 231 (*mdata->cptr++) : (getc(mdata->stream.file))) 232 233FUNC(xpmNextWord, unsigned int, 234 (xpmData *mdata, char *buf, unsigned int buflen)); 235FUNC(xpmGetCmt, int, (xpmData *mdata, char **cmt)); 236FUNC(xpmParseHeader, int, (xpmData *mdata)); 237FUNC(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)); 242 243FUNC(xpmParseColors, int, (xpmData *data, unsigned int ncolors, 244 unsigned int cpp, XpmColor **colorTablePtr, 245 xpmHashTable *hashtable)); 246 247FUNC(xpmParseExtensions, int, (xpmData *data, XpmExtension **extensions, 248 unsigned int *nextensions)); 249 250/* RGB utility */ 251 252FUNC(xpmReadRgbNames, int, (char *rgb_fname, xpmRgbName *rgbn)); 253FUNC(xpmGetRgbName, char *, (xpmRgbName *rgbn, int rgbn_max, 254 int red, int green, int blue)); 255FUNC(xpmFreeRgbNames, void, (xpmRgbName *rgbn, int rgbn_max)); 256#ifdef FOR_MSW 257FUNC(xpmGetRGBfromName,int, (char *name, int *r, int *g, int *b)); 258#endif 259 260#ifndef AMIGA 261FUNC(xpm_xynormalizeimagebits, void, (register unsigned char *bp, 262 register XImage *img)); 263FUNC(xpm_znormalizeimagebits, void, (register unsigned char *bp, 264 register XImage *img)); 265 266/* 267 * Macros 268 * 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. 273 * 274 * The ZNORMALIZE macro performs byte and nibble order normalization if 275 * required for Z format data. 276 * 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 279 * data in XY format. 280 * 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. 283 * 284 */ 285 286#define XYNORMALIZE(bp, img) \ 287 if ((img->byte_order == MSBFirst) || (img->bitmap_bit_order == MSBFirst)) \ 288 xpm_xynormalizeimagebits((unsigned char *)(bp), img) 289 290#define ZNORMALIZE(bp, img) \ 291 if (img->byte_order == MSBFirst) \ 292 xpm_znormalizeimagebits((unsigned char *)(bp), img) 293 294#define XYINDEX(x, y, img) \ 295 ((y) * img->bytes_per_line) + \ 296 (((x) + img->xoffset) / img->bitmap_unit) * (img->bitmap_unit >> 3) 297 298#define ZINDEX(x, y, img) ((y) * img->bytes_per_line) + \ 299 (((x) * img->bits_per_pixel) >> 3) 300 301#define ZINDEX32(x, y, img) ((y) * img->bytes_per_line) + ((x) << 2) 302 303#define ZINDEX16(x, y, img) ((y) * img->bytes_per_line) + ((x) << 1) 304 305#define ZINDEX8(x, y, img) ((y) * img->bytes_per_line) + (x) 306 307#define ZINDEX1(x, y, img) ((y) * img->bytes_per_line) + ((x) >> 3) 308#endif /* not AMIGA */ 309 310#ifdef __STDC__ 311#define Const const 312#else 313#define Const /**/ 314#endif 315 316#ifdef NEED_STRDUP 317FUNC(xpmstrdup, char *, (char *s1)); 318#else 319#undef xpmstrdup 320#define xpmstrdup strdup 321#endif 322 323#ifdef NEED_STRCASECMP 324FUNC(xpmstrcasecmp, int, (char *s1, char *s2)); 325#else 326#undef xpmstrcasecmp 327#define xpmstrcasecmp strcasecmp 328#endif 329 330FUNC(xpmatoui, unsigned int, 331 (char *p, unsigned int l, unsigned int *ui_return)); 332 333#endif 334