]>
git.saurik.com Git - wxWidgets.git/blob - src/mac/xpm/simx.c
2 * Copyright (C) 1989-95 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 \*****************************************************************************/
37 #include "xpmi.h" /* for XpmMalloc */
42 * On DOS size_t is only 2 bytes, thus malloc(size_t s) can only malloc
43 * 64K. BUT an expression data=malloc(width*height) may result in an
44 * overflow. So this function takes a long as input, and returns NULL if the
45 * request is larger than 64K, is size_t is only 2 bytes.
47 * This requires casts like XpmMalloc( (long)width*(long(height)), else it
48 * might have no effect at all.
52 boundCheckingMalloc(long s
)
54 if (sizeof(size_t) == sizeof(long)) { /* same size, just do it */
55 return (malloc((size_t) s
));
57 if (sizeof(size_t) == 2) {
59 return (NULL
); /* to large, size_t with 2 bytes
60 * only allows 16 bits */
62 return (malloc((size_t) s
));
63 } else { /* it's not a long, not 2 bytes,
65 return (malloc((size_t) s
));
70 boundCheckingCalloc(long num
, long s
)
72 if (sizeof(size_t) == sizeof(long)) { /* same size, just do it */
73 return (calloc((size_t) num
, (size_t) s
));
75 if (sizeof(size_t) == 2) {
76 if (s
> 0xFFFF || num
* s
> 0xFFFF)
77 return (NULL
); /* to large, size_t with 2 bytes
78 * only allows 16 bits */
80 return (calloc((size_t) num
, (size_t) s
));
81 } else { /* it's not a long, not 2 bytes,
83 return (calloc((size_t) num
, (size_t) s
));
88 boundCheckingRealloc(void *p
, long s
)
90 if (sizeof(size_t) == sizeof(long)) { /* same size, just do it */
91 return (realloc(p
, (size_t) s
));
93 if (sizeof(size_t) == 2) {
95 return (NULL
); /* to large, size_t with 2 bytes
96 * only allows 16 bits */
98 return (realloc(p
, (size_t) s
));
99 } else { /* it's not a long, not 2 bytes,
101 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
)
129 b
= GetDeviceCaps(*display
, BITSPIXEL
);
130 d
= GetDeviceCaps(*display
, PLANES
);
133 return (**((*display
)->gdPMap
)).pixelSize
;
138 XDefaultColormap(Display
*display
, Screen
*screen
)
143 /* convert hex color names,
144 wrong digits (not a-f,A-F,0-9) are treated as zero */
150 if (c
>= '0' && c
<= '9')
152 else if (c
>= 'a' && c
<= 'f')
154 else if (c
>= 'A' && c
<= 'F')
163 rgbFromHex(char *hex
, int *r
, int *g
, int *b
)
167 if (hex
== NULL
|| hex
[0] != '#')
173 *r
= hexCharToInt(hex
[1]);
174 *g
= hexCharToInt(hex
[2]);
175 *b
= hexCharToInt(hex
[3]);
181 } else if (len
== 6 + 1)
183 *r
= hexCharToInt(hex
[1]) * 16 + hexCharToInt(hex
[2]);
184 *g
= hexCharToInt(hex
[3]) * 16 + hexCharToInt(hex
[4]);
185 *b
= hexCharToInt(hex
[5]) * 16 + hexCharToInt(hex
[6]);
191 } else if (len
== 12 + 1)
193 /* it's like c #32329999CCCC */
195 *r
= hexCharToInt(hex
[1]) * 0x1000 + hexCharToInt(hex
[2]) *0x0100 + hexCharToInt(hex
[3]) *0x0010 + hexCharToInt(hex
[4]) ;
196 *g
= hexCharToInt(hex
[5]) * 0x1000 + hexCharToInt(hex
[6]) *0x0100 + hexCharToInt(hex
[7]) *0x0010 + hexCharToInt(hex
[8]);
197 *b
=hexCharToInt(hex
[9]) * 0x1000 + hexCharToInt(hex
[10]) *0x0100 + hexCharToInt(hex
[11]) *0x0010 + hexCharToInt(hex
[12]);
199 /* so for now only take two digits */
200 *r
= hexCharToInt(hex
[1]) * 16 + hexCharToInt(hex
[2]);
201 *g
= hexCharToInt(hex
[5]) * 16 + hexCharToInt(hex
[6]);
202 *b
= hexCharToInt(hex
[9]) * 16 + hexCharToInt(hex
[10]);
210 /* Color related functions */
212 XParseColor(Display
*d
, Colormap
*cmap
, char *name
, XColor
*color
)
214 int r
, g
, b
; /* only 8 bit values used */
217 /* TODO: use colormap via PALETTE */
218 /* parse name either in table or #RRGGBB #RGB */
222 if (name
[0] == '#') { /* a hex string */
223 okay
= rgbFromHex(name
, &r
, &g
, &b
);
225 okay
= xpmGetRGBfromName(name
, &r
, &g
, &b
);
231 color
->pixel
= RGB(r
, g
, b
);
232 color
->red
= (BYTE
) r
;
233 color
->green
= (BYTE
) g
;
234 color
->blue
= (BYTE
) b
;
236 color
->pixel
.red
= r
;
237 color
->pixel
.green
= g
;
238 color
->pixel
.blue
= b
;
247 return (0); /* --> ColorError */
252 XAllocColor(Display
*d
, Colormap
*cmap
, XColor
*color
)
254 /* colormap not used yet so color->pixel is the real COLORREF (RBG) and not an
255 index in some colormap as in X */
259 XQueryColors(Display
*display
, Colormap
*colormap
,
260 XColor
*xcolors
, int ncolors
)
262 /* under X this fills the rgb values to given .pixel */
263 /* since there no colormap use FOR_MSW (not yet!!), rgb is plain encoded */
264 XColor
*xc
= xcolors
;
267 for (i
= 0; i
< ncolors
; i
++, xc
++) {
268 xc
->red
= GetRValue(xc
->pixel
);
269 xc
->green
= GetGValue(xc
->pixel
);
270 xc
->blue
= GetBValue(xc
->pixel
);
275 XFreeColors(Display
*d
, Colormap cmap
,
276 unsigned long pixels
[], int npixels
, unsigned long planes
)
278 /* no colormap yet */
279 return (0); /* correct ??? */
282 /* XImage functions */
284 XCreateImage(Display
*d
, Visual
*v
,
285 int depth
, int format
,
286 int x
, int y
, int width
, int height
,
289 XImage
*img
= (XImage
*) XpmMalloc(sizeof(XImage
));
294 /*JW: This is what it should be, but the picture comes out
295 just black!? It appears to be doing monochrome reduction,
296 but I've got no clue why. Using CreateBitmap() is supposed
297 to be slower, but otherwise ok
298 if ( depth == GetDeviceCaps(*d, BITSPIXEL) ) {
299 img->bitmap = CreateCompatibleBitmap(*d, width, height);
302 img
->bitmap
= CreateBitmap(width
, height
, 1 /* plane */ ,
303 depth
/* bits per pixel */ , NULL
);
308 rect
.left
= rect
.top
= 0 ;
310 rect
.bottom
= height
;
312 NewGWorld( &img
->gworldptr
, depth
, &rect
, NULL
, NULL
, 0 ) ;
313 LockPixels( GetGWorldPixMap( img
->gworldptr
) ) ;
314 if (img
->gworldptr
== NULL
)
322 RGBColor gray = { 0xEEEE ,0xEEEE , 0xEEEE } ;
323 RGBBackColor( &gray ) ;
329 img
->height
= height
;
337 XImageFree(XImage
*img
)
344 XDestroyImage(XImage
*img
)
348 DeleteObject(img
->bitmap
); /* check return ??? */
350 if ( img
->gworldptr
)
352 UnlockPixels( GetGWorldPixMap( img
->gworldptr
) ) ;
353 DisposeGWorld( img
->gworldptr
) ;