]>
git.saurik.com Git - wxWidgets.git/blob - src/xpm/simx.c
2 * Copyright (C) 1989-94 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 /*****************************************************************************\
29 * This emulates some Xlib functionality for MSW. It's not a general solution, *
30 * it is close related to XPM-lib. It is only intended to satisfy what is need *
31 * there. Thus allowing to read XPM files under MS windows. *
33 * Developed by HeDu 3/94 (hedu@cul-ipn.uni-kiel.de) *
34 \*****************************************************************************/
40 #include "xpm34p.h" /* for XpmMalloc */
43 * On DOS size_t is only 2 bytes, thus malloc(size_t s) can only malloc
44 * 64K. BUT an expression data=malloc(width*height) may result in an
45 * overflow. So this function takes a long as input, and returns NULL if the
46 * request is larger than 64K, is size_t is only 2 bytes.
48 * This requires casts like XpmMalloc( (long)width*(long(height)), else it
49 * might have no effect at all.
53 boundCheckingMalloc(long s
)
55 if (sizeof(size_t) == sizeof(long)) { /* same size, just do it */
56 return (malloc((size_t) s
));
58 if (sizeof(size_t) == 2) {
60 return (NULL
); /* to large, size_t with 2 bytes
61 * only allows 16 bits */
63 return (malloc((size_t) s
));
64 } else { /* it's not a long, not 2 bytes,
66 return (malloc((size_t) s
));
71 boundCheckingCalloc(long num
, long s
)
73 if (sizeof(size_t) == sizeof(long)) { /* same size, just do it */
74 return (calloc((size_t) num
, (size_t) s
));
76 if (sizeof(size_t) == 2) {
77 if (s
> 0xFFFF || num
* s
> 0xFFFF)
78 return (NULL
); /* to large, size_t with 2 bytes
79 * only allows 16 bits */
81 return (calloc((size_t) num
, (size_t) s
));
82 } else { /* it's not a long, not 2 bytes,
84 return (calloc((size_t) num
, (size_t) s
));
89 boundCheckingRealloc(void *p
, long s
)
91 if (sizeof(size_t) == sizeof(long)) { /* same size, just do it */
92 return (realloc(p
, (size_t) s
));
94 if (sizeof(size_t) == 2) {
96 return (NULL
); /* to large, size_t with 2 bytes
97 * only allows 16 bits */
99 return (realloc(p
, (size_t) s
));
100 } else { /* it's not a long, not 2 bytes,
102 return (realloc(p
, (size_t) s
));
107 /* static Visual theVisual = { 0 }; */
109 XDefaultVisual(Display
*display
, Screen
*screen
)
111 return (NULL
); /* struct could contain info about
112 * MONO, GRAY, COLOR */
116 XDefaultScreen(Display
*d
)
121 /* I get only 1 plane but 8 bits per pixel,
122 so I think BITSPIXEL should be depth */
124 XDefaultDepth(Display
*display
, Screen
*screen
)
128 #if !defined(__VISAGECPP__) /* fisme for OS/2 */
129 b
= GetDeviceCaps(*display
, BITSPIXEL
);
130 d
= GetDeviceCaps(*display
, PLANES
);
136 XDefaultColormap(Display
*display
, Screen
*screen
)
141 /* convert hex color names,
142 wrong digits (not a-f,A-F,0-9) are treated as zero */
148 if (c
>= '0' && c
<= '9')
150 else if (c
>= 'a' && c
<= 'f')
152 else if (c
>= 'A' && c
<= 'F')
161 rgbFromHex(char *hex
, int *r
, int *g
, int *b
)
165 if (hex
== NULL
|| hex
[0] != '#')
170 *r
= hexCharToInt(hex
[1]);
171 *g
= hexCharToInt(hex
[2]);
172 *b
= hexCharToInt(hex
[3]);
173 } else if (len
== 6 + 1) {
174 *r
= hexCharToInt(hex
[1]) * 16 + hexCharToInt(hex
[2]);
175 *g
= hexCharToInt(hex
[3]) * 16 + hexCharToInt(hex
[4]);
176 *b
= hexCharToInt(hex
[5]) * 16 + hexCharToInt(hex
[6]);
177 } else if (len
== 12 + 1) {
178 /* it's like c #32329999CCCC */
179 /* so for now only take two digits */
180 *r
= hexCharToInt(hex
[1]) * 16 + hexCharToInt(hex
[2]);
181 *g
= hexCharToInt(hex
[5]) * 16 + hexCharToInt(hex
[6]);
182 *b
= hexCharToInt(hex
[9]) * 16 + hexCharToInt(hex
[10]);
189 /* Color related functions */
191 XParseColor(Display
*d
, Colormap
*cmap
, char *name
, XColor
*color
)
193 int r
, g
, b
; /* only 8 bit values used */
196 /* TODO: use colormap via PALETTE */
197 /* parse name either in table or #RRGGBB #RGB */
201 if (name
[0] == '#') { /* a hex string */
202 okay
= rgbFromHex(name
, &r
, &g
, &b
);
204 okay
= xpmGetRGBfromName(name
, &r
, &g
, &b
);
208 #if !defined(__VISAGECPP__) /* fixme for OS/2 */
209 color
->pixel
= RGB(r
, g
, b
);
211 color
->red
= (BYTE
) r
;
212 color
->green
= (BYTE
) g
;
213 color
->blue
= (BYTE
) b
;
216 return (0); /* --> ColorError */
221 XAllocColor(Display
*d
, Colormap
*cmap
, XColor
*color
)
223 /* colormap not used yet so color->pixel is the real COLORREF (RBG) and not an
224 index in some colormap as in X */
228 XQueryColors(Display
*display
, Colormap
*colormap
,
229 XColor
*xcolors
, int ncolors
)
231 /* under X this fills the rgb values to given .pixel */
232 /* since there no colormap use FOR_MSW (not yet!!), rgb is plain encoded */
233 XColor
*xc
= xcolors
;
236 #if !defined(__VISAGECPP__) /* fixme for OS/2 */
237 for (i
= 0; i
< ncolors
; i
++, xc
++) {
238 xc
->red
= GetRValue(xc
->pixel
);
239 xc
->green
= GetGValue(xc
->pixel
);
240 xc
->blue
= GetBValue(xc
->pixel
);
246 XFreeColors(Display
*d
, Colormap cmap
,
247 unsigned long pixels
[], int npixels
, unsigned long planes
)
249 /* no colormap yet */
250 return (0); /* correct ??? */
253 /* XImage functions */
255 XCreateImage(Display
*d
, Visual
*v
,
256 int depth
, int format
,
257 int x
, int y
, int width
, int height
,
260 XImage
*img
= (XImage
*) XpmMalloc(sizeof(XImage
));
263 /* *img = CreateCompatibleBitmap(*d, width, height); */
264 #if !defined(__VISAGECPP__) /* fixme for OS/2 */
265 img
->bitmap
= CreateBitmap(width
, height
, 1 /* plane */ ,
266 depth
/* bits per pixel */ , NULL
);
269 img
->height
= height
;
277 XImageFree(XImage
*img
)
284 XDestroyImage(XImage
*img
)
287 #if !defined(__VISAGECPP__) /* fixme for OS/2 */
288 DeleteObject(img
->bitmap
); /* check return ??? */