Add OPEN_PLMENU option to parse command generated proplist style menus
[wmaker-crm.git] / wrlib / xpm.c
blob5ce1ea1f781aac7b3793f74bb3c873ab029fb965
1 /* xpm.c - load XPM image from file
3 * Raster graphics library
5 * Copyright (c) 1997-2003 Alfredo K. Kojima
7 * This library is free software; you can redistribute it and/or
8 * modify it under the terms of the GNU Library General Public
9 * License as published by the Free Software Foundation; either
10 * version 2 of the License, or (at your option) any later version.
12 * This library is distributed in the hope that it will be useful,
13 * but WITHOUT ANY WARRANTY; without even the implied warranty of
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
15 * Library General Public License for more details.
17 * You should have received a copy of the GNU Library General Public
18 * License along with this library; if not, write to the Free
19 * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston,
20 * MA 02110-1301, USA.
23 #include <config.h>
25 #ifdef USE_XPM
27 #include <X11/Xlib.h>
28 #include <stdlib.h>
29 #include <stdio.h>
30 #include <string.h>
31 #include <X11/xpm.h>
33 #include "wraster.h"
35 RImage *RGetImageFromXPMData(RContext * context, char **xpmData)
37 Display *dpy = context->dpy;
38 Colormap cmap = context->cmap;
39 RImage *image;
40 XpmImage xpm;
41 unsigned char *color_table[4];
42 unsigned char *data;
43 int *p;
44 int i;
46 i = XpmCreateXpmImageFromData(xpmData, &xpm, (XpmInfo *) NULL);
47 if (i != XpmSuccess) {
48 switch (i) {
49 case XpmOpenFailed:
50 RErrorCode = RERR_OPEN;
51 break;
52 case XpmFileInvalid:
53 RErrorCode = RERR_BADIMAGEFILE;
54 break;
55 case XpmNoMemory:
56 RErrorCode = RERR_NOMEMORY;
57 break;
58 default:
59 RErrorCode = RERR_BADIMAGEFILE;
60 break;
62 return NULL;
64 if (xpm.height < 1 || xpm.width < 1) {
65 RErrorCode = RERR_BADIMAGEFILE;
66 XpmFreeXpmImage(&xpm);
67 return NULL;
70 if (xpm.colorTable == NULL) {
71 RErrorCode = RERR_BADIMAGEFILE;
72 XpmFreeXpmImage(&xpm);
73 return NULL;
75 image = RCreateImage(xpm.width, xpm.height, True);
76 if (!image) {
77 XpmFreeXpmImage(&xpm);
78 return NULL;
81 /* make color table */
82 for (i = 0; i < 4; i++) {
83 color_table[i] = malloc(xpm.ncolors * sizeof(char));
84 if (!color_table[i]) {
85 for (i = i - 1; i >= 0; i--) {
86 if (color_table[i])
87 free(color_table[i]);
89 RReleaseImage(image);
90 RErrorCode = RERR_NOMEMORY;
91 XpmFreeXpmImage(&xpm);
92 return NULL;
96 for (i = 0; i < xpm.ncolors; i++) {
97 XColor xcolor;
98 char *color = NULL;
100 if (xpm.colorTable[i].c_color)
101 color = xpm.colorTable[i].c_color;
102 else if (xpm.colorTable[i].g_color)
103 color = xpm.colorTable[i].g_color;
104 else if (xpm.colorTable[i].g4_color)
105 color = xpm.colorTable[i].g4_color;
106 else if (xpm.colorTable[i].m_color)
107 color = xpm.colorTable[i].m_color;
108 else if (xpm.colorTable[i].symbolic)
109 color = xpm.colorTable[i].symbolic;
111 if (!color) {
112 color_table[0][i] = 0xbe;
113 color_table[1][i] = 0xbe;
114 color_table[2][i] = 0xbe;
115 color_table[3][i] = 0xff;
116 continue;
119 if (strncmp(color, "None", 4) == 0) {
120 color_table[0][i] = 0;
121 color_table[1][i] = 0;
122 color_table[2][i] = 0;
123 color_table[3][i] = 0;
124 continue;
126 if (XParseColor(dpy, cmap, color, &xcolor)) {
127 color_table[0][i] = xcolor.red >> 8;
128 color_table[1][i] = xcolor.green >> 8;
129 color_table[2][i] = xcolor.blue >> 8;
130 color_table[3][i] = 0xff;
131 } else {
132 color_table[0][i] = 0xbe;
133 color_table[1][i] = 0xbe;
134 color_table[2][i] = 0xbe;
135 color_table[3][i] = 0xff;
138 /* convert pixmap to RImage */
139 p = (int *)xpm.data;
140 data = image->data;
141 for (i = 0; i < xpm.width * xpm.height; i++) {
142 *(data++) = color_table[0][*p];
143 *(data++) = color_table[1][*p];
144 *(data++) = color_table[2][*p];
145 *(data++) = color_table[3][*p];
146 p++;
148 for (i = 0; i < 4; i++) {
149 free(color_table[i]);
151 XpmFreeXpmImage(&xpm);
152 return image;
155 RImage *RLoadXPM(RContext * context, char *file)
157 Display *dpy = context->dpy;
158 Colormap cmap = context->cmap;
159 RImage *image;
160 XpmImage xpm;
161 unsigned char *color_table[4];
162 unsigned char *data;
163 int *p;
164 int i;
166 i = XpmReadFileToXpmImage(file, &xpm, (XpmInfo *) NULL);
167 if (i != XpmSuccess) {
168 switch (i) {
169 case XpmOpenFailed:
170 RErrorCode = RERR_OPEN;
171 break;
172 case XpmFileInvalid:
173 RErrorCode = RERR_BADIMAGEFILE;
174 break;
175 case XpmNoMemory:
176 RErrorCode = RERR_NOMEMORY;
177 break;
178 default:
179 RErrorCode = RERR_BADIMAGEFILE;
180 break;
182 return NULL;
184 if (xpm.height < 1 || xpm.width < 1) {
185 RErrorCode = RERR_BADIMAGEFILE;
186 XpmFreeXpmImage(&xpm);
187 return NULL;
190 if (xpm.colorTable == NULL) {
191 RErrorCode = RERR_BADIMAGEFILE;
192 XpmFreeXpmImage(&xpm);
193 return NULL;
195 image = RCreateImage(xpm.width, xpm.height, True);
196 if (!image) {
197 XpmFreeXpmImage(&xpm);
198 return NULL;
201 /* make color table */
202 for (i = 0; i < 4; i++) {
203 color_table[i] = malloc(xpm.ncolors * sizeof(char));
204 if (!color_table[i]) {
205 for (i = i - 1; i >= 0; i--) {
206 if (color_table[i])
207 free(color_table[i]);
209 RReleaseImage(image);
210 RErrorCode = RERR_NOMEMORY;
211 XpmFreeXpmImage(&xpm);
212 return NULL;
216 for (i = 0; i < xpm.ncolors; i++) {
217 XColor xcolor;
218 char *color = NULL;
220 if (xpm.colorTable[i].c_color)
221 color = xpm.colorTable[i].c_color;
222 else if (xpm.colorTable[i].g_color)
223 color = xpm.colorTable[i].g_color;
224 else if (xpm.colorTable[i].g4_color)
225 color = xpm.colorTable[i].g4_color;
226 else if (xpm.colorTable[i].m_color)
227 color = xpm.colorTable[i].m_color;
228 else if (xpm.colorTable[i].symbolic)
229 color = xpm.colorTable[i].symbolic;
231 if (!color) {
232 color_table[0][i] = 0xbe;
233 color_table[1][i] = 0xbe;
234 color_table[2][i] = 0xbe;
235 color_table[3][i] = 0xff;
236 continue;
239 if (strncmp(color, "None", 4) == 0) {
240 color_table[0][i] = 0;
241 color_table[1][i] = 0;
242 color_table[2][i] = 0;
243 color_table[3][i] = 0;
244 continue;
246 if (XParseColor(dpy, cmap, color, &xcolor)) {
247 color_table[0][i] = xcolor.red >> 8;
248 color_table[1][i] = xcolor.green >> 8;
249 color_table[2][i] = xcolor.blue >> 8;
250 color_table[3][i] = 0xff;
251 } else {
252 color_table[0][i] = 0xbe;
253 color_table[1][i] = 0xbe;
254 color_table[2][i] = 0xbe;
255 color_table[3][i] = 0xff;
258 /* convert pixmap to RImage */
259 p = (int *)xpm.data;
260 data = image->data;
261 for (i = 0; i < xpm.width * xpm.height; i++, p++) {
262 *(data++) = color_table[0][*p];
263 *(data++) = color_table[1][*p];
264 *(data++) = color_table[2][*p];
265 *(data++) = color_table[3][*p];
267 for (i = 0; i < 4; i++) {
268 free(color_table[i]);
270 XpmFreeXpmImage(&xpm);
271 return image;
274 #endif /* USE_XPM */