Home | History | Annotate | Line # | Download | only in src
      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 #ifndef XPMI_h
     38 #define XPMI_h
     39 
     40 #include "xpm.h"
     41 
     42 /*
     43  * lets try to solve include files
     44  */
     45 
     46 #include <sys/types.h>
     47 #include <stdio.h>
     48 #include <stdlib.h>
     49 #include <limits.h>
     50 #include <string.h>
     51 #if !defined(_MSC_VER)
     52 #include <strings.h>
     53 #endif
     54 
     55 #include <X11/Xos.h>
     56 #include <X11/Xfuncs.h>
     57 #include <X11/Xmd.h>
     58 
     59 #ifdef VMS
     60 #include <unixio.h>
     61 #include <file.h>
     62 #endif
     63 
     64 /* The following should help people wanting to use their own memory allocation
     65  * functions. To avoid the overhead of a function call when the standard
     66  * functions are used these are all macros, even the XpmFree function which
     67  * needs to be a real function for the outside world though.
     68  * So if change these be sure to change the XpmFree function in misc.c
     69  * accordingly.
     70  */
     71 #define XpmFree(ptr) free(ptr)
     72 
     73 #define XpmMalloc(size) malloc((size))
     74 #define XpmRealloc(ptr, size) realloc((ptr), (size))
     75 #define XpmCalloc(nelem, elsize) calloc((nelem), (elsize))
     76 
     77 #include <stdint.h>	/* For SIZE_MAX */
     78 #include <limits.h>
     79 #ifndef SIZE_MAX
     80 # ifdef ULONG_MAX
     81 #  define SIZE_MAX ULONG_MAX
     82 # else
     83 #  define SIZE_MAX UINT_MAX
     84 # endif
     85 #endif
     86 
     87 #ifdef O_CLOEXEC
     88 # define FOPEN_CLOEXEC "e"
     89 #else
     90 # define FOPEN_CLOEXEC ""
     91 # define O_CLOEXEC 0
     92 #endif
     93 
     94 #define XPMMAXCMTLEN BUFSIZ
     95 typedef struct {
     96     unsigned int type;
     97     union {
     98 	FILE *file;
     99 	char **data;
    100     }     stream;
    101     char *cptr;
    102     unsigned int line;
    103     int CommentLength;
    104     char Comment[XPMMAXCMTLEN];
    105     const char *Bcmt, *Ecmt;
    106     char Bos, Eos;
    107     int format;			/* 1 if XPM1, 0 otherwise */
    108 #ifdef CXPMPROG
    109     int lineNum;
    110     int charNum;
    111 #endif
    112 }      xpmData;
    113 
    114 #define XPMARRAY 0
    115 #define XPMFILE  1
    116 #define XPMPIPE  2
    117 #define XPMBUFFER 3
    118 
    119 #define EOL '\n'
    120 #define TAB '\t'
    121 #define SPC ' '
    122 
    123 typedef struct {
    124     const char *type;		/* key word */
    125     const char *Bcmt;		/* string beginning comments */
    126     const char *Ecmt;		/* string ending comments */
    127     char Bos;			/* character beginning strings */
    128     char Eos;			/* character ending strings */
    129     const char *Strs;		/* strings separator */
    130     const char *Dec;		/* data declaration string */
    131     const char *Boa;		/* string beginning assignment */
    132     const char *Eoa;		/* string ending assignment */
    133 }      xpmDataType;
    134 
    135 extern _X_HIDDEN xpmDataType xpmDataTypes[];
    136 
    137 /*
    138  * rgb values and ascii names (from rgb text file) rgb values,
    139  * range of 0 -> 65535 color mnemonic of rgb value
    140  */
    141 typedef struct {
    142     int r, g, b;
    143     char *name;
    144 }      xpmRgbName;
    145 
    146 /* Maximum number of rgb mnemonics allowed in rgb text file. */
    147 #define MAX_RGBNAMES 1024
    148 
    149 extern _X_HIDDEN const char *xpmColorKeys[];
    150 
    151 #define TRANSPARENT_COLOR "None"	/* this must be a string! */
    152 
    153 /* number of xpmColorKeys */
    154 #define NKEYS 5
    155 
    156 /* XPM internal routines */
    157 
    158 HFUNC(xpmParseData, int, (xpmData *data, XpmImage *image, XpmInfo *info));
    159 HFUNC(xpmParseDataAndCreate, int, (Display *display, xpmData *data,
    160 				  XImage **image_return,
    161 				  XImage **shapeimage_return,
    162 				  XpmImage *image, XpmInfo *info,
    163 				  XpmAttributes *attributes));
    164 
    165 HFUNC(xpmFreeColorTable, void, (XpmColor *colorTable, int ncolors));
    166 
    167 HFUNC(xpmInitAttributes, void, (XpmAttributes *attributes));
    168 
    169 HFUNC(xpmInitXpmImage, void, (XpmImage *image));
    170 
    171 HFUNC(xpmInitXpmInfo, void, (XpmInfo *info));
    172 
    173 HFUNC(xpmSetInfoMask, void, (XpmInfo *info, XpmAttributes *attributes));
    174 HFUNC(xpmSetInfo, void, (XpmInfo *info, XpmAttributes *attributes));
    175 HFUNC(xpmSetAttributes, void, (XpmAttributes *attributes, XpmImage *image,
    176 			      XpmInfo *info));
    177 
    178 HFUNC(xpmCreatePixmapFromImage, int, (Display *display, Drawable d,
    179 				      XImage *ximage, Pixmap *pixmap_return));
    180 
    181 HFUNC(xpmCreateImageFromPixmap, void, (Display *display, Pixmap pixmap,
    182 				      XImage **ximage_return,
    183 				      unsigned int *width,
    184 				      unsigned int *height));
    185 
    186 /* structures and functions related to hastable code */
    187 
    188 typedef struct _xpmHashAtom {
    189     char *name;
    190     void *data;
    191 }      *xpmHashAtom;
    192 
    193 typedef struct {
    194     unsigned int size;
    195     unsigned int limit;
    196     unsigned int used;
    197     xpmHashAtom *atomTable;
    198 }      xpmHashTable;
    199 
    200 HFUNC(xpmHashTableInit, int, (xpmHashTable *table));
    201 HFUNC(xpmHashTableFree, void, (xpmHashTable *table));
    202 HFUNC(xpmHashSlot, xpmHashAtom *, (xpmHashTable *table, char *s));
    203 HFUNC(xpmHashIntern, int, (xpmHashTable *table, char *tag, void *data));
    204 
    205 #if defined(_MSC_VER) && defined(_M_X64)
    206 #define HashAtomData(i) ((void *)(long long)i)
    207 #define HashColorIndex(slot) ((unsigned long long)((*slot)->data))
    208 #else
    209 #define HashAtomData(i) ((void *)(long)i)
    210 #define HashColorIndex(slot) ((unsigned long)((*slot)->data))
    211 #endif
    212 #define USE_HASHTABLE (cpp > 2 && ncolors > 4)
    213 
    214 /* I/O utility */
    215 
    216 HFUNC(xpmNextString, int, (xpmData *mdata));
    217 HFUNC(xpmNextUI, int, (xpmData *mdata, unsigned int *ui_return));
    218 HFUNC(xpmGetString, int, (xpmData *mdata, char **sptr, unsigned int *l));
    219 
    220 #define xpmGetC(mdata) \
    221 	((!mdata->type || mdata->type == XPMBUFFER) ? \
    222 	 (*mdata->cptr++) : (getc(mdata->stream.file)))
    223 
    224 HFUNC(xpmNextWord, unsigned int,
    225      (xpmData *mdata, char *buf, unsigned int buflen));
    226 HFUNC(xpmGetCmt, int, (xpmData *mdata, char **cmt));
    227 HFUNC(xpmParseHeader, int, (xpmData *mdata));
    228 HFUNC(xpmParseValues, int, (xpmData *data, unsigned int *width,
    229 			   unsigned int *height, unsigned int *ncolors,
    230 			   unsigned int *cpp, unsigned int *x_hotspot,
    231 			   unsigned int *y_hotspot, unsigned int *hotspot,
    232 			   unsigned int *extensions));
    233 
    234 HFUNC(xpmParseColors, int, (xpmData *data, unsigned int ncolors,
    235 			   unsigned int cpp, XpmColor **colorTablePtr,
    236 			   xpmHashTable *hashtable));
    237 
    238 HFUNC(xpmParseExtensions, int, (xpmData *data, XpmExtension **extensions,
    239 			       unsigned int *nextensions));
    240 
    241 /* RGB utility */
    242 
    243 HFUNC(xpmReadRgbNames, int, (const char *rgb_fname, xpmRgbName *rgbn));
    244 HFUNC(xpmGetRgbName, char *, (xpmRgbName *rgbn, int rgbn_max,
    245 			     int red, int green, int blue));
    246 HFUNC(xpmFreeRgbNames, void, (xpmRgbName *rgbn, int rgbn_max));
    247 
    248 HFUNC(xpm_xynormalizeimagebits, void, (register unsigned char *bp,
    249 				      register XImage *img));
    250 HFUNC(xpm_znormalizeimagebits, void, (register unsigned char *bp,
    251 				     register XImage *img));
    252 
    253 /*
    254  * Macros
    255  *
    256  * The XYNORMALIZE macro determines whether XY format data requires
    257  * normalization and calls a routine to do so if needed. The logic in
    258  * this module is designed for LSBFirst byte and bit order, so
    259  * normalization is done as required to present the data in this order.
    260  *
    261  * The ZNORMALIZE macro performs byte and nibble order normalization if
    262  * required for Z format data.
    263  *
    264  * The XYINDEX macro computes the index to the starting byte (char) boundary
    265  * for a bitmap_unit containing a pixel with coordinates x and y for image
    266  * data in XY format.
    267  *
    268  * The ZINDEX* macros compute the index to the starting byte (char) boundary
    269  * for a pixel with coordinates x and y for image data in ZPixmap format.
    270  *
    271  */
    272 
    273 #define XYNORMALIZE(bp, img) \
    274     if ((img->byte_order == MSBFirst) || (img->bitmap_bit_order == MSBFirst)) \
    275 	xpm_xynormalizeimagebits((unsigned char *)(bp), img)
    276 
    277 #define ZNORMALIZE(bp, img) \
    278     if (img->byte_order == MSBFirst) \
    279 	xpm_znormalizeimagebits((unsigned char *)(bp), img)
    280 
    281 #define XYINDEX(x, y, img) \
    282     ((y) * img->bytes_per_line) + \
    283     (((x) + img->xoffset) / img->bitmap_unit) * (img->bitmap_unit >> 3)
    284 
    285 #define ZINDEX(x, y, img) ((y) * img->bytes_per_line) + \
    286     (((x) * img->bits_per_pixel) >> 3)
    287 
    288 #define ZINDEX32(x, y, img) ((y) * img->bytes_per_line) + ((x) << 2)
    289 
    290 #define ZINDEX16(x, y, img) ((y) * img->bytes_per_line) + ((x) << 1)
    291 
    292 #define ZINDEX8(x, y, img) ((y) * img->bytes_per_line) + (x)
    293 
    294 #define ZINDEX1(x, y, img) ((y) * img->bytes_per_line) + ((x) >> 3)
    295 
    296 HFUNC(xpmatoui, unsigned int,
    297      (char *p, unsigned int l, unsigned int *ui_return));
    298 
    299 #endif
    300