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., 675 Mass Ave, Cambridge, MA 02139, USA.
36
RGetImageFromXPMData(RContext *context, char **xpmData)
38
Display *dpy = context->dpy;
39
Colormap cmap = context->cmap;
42
unsigned char *color_table[4];
47
i = XpmCreateXpmImageFromData(xpmData, &xpm, (XpmInfo *)NULL);
51
RErrorCode = RERR_OPEN;
54
RErrorCode = RERR_BADIMAGEFILE;
57
RErrorCode = RERR_NOMEMORY;
60
RErrorCode = RERR_BADIMAGEFILE;
65
if (xpm.height<1 || xpm.width < 1) {
66
RErrorCode = RERR_BADIMAGEFILE;
67
XpmFreeXpmImage(&xpm);
71
if (xpm.colorTable==NULL) {
72
RErrorCode = RERR_BADIMAGEFILE;
73
XpmFreeXpmImage(&xpm);
76
image = RCreateImage(xpm.width, xpm.height, True);
78
XpmFreeXpmImage(&xpm);
82
/* make color table */
84
color_table[i] = malloc(xpm.ncolors*sizeof(char));
85
if (!color_table[i]) {
86
for (i=i-1;i>=0; i--) {
91
RErrorCode = RERR_NOMEMORY;
92
XpmFreeXpmImage(&xpm);
97
for (i=0; i<xpm.ncolors; i++) {
101
if (xpm.colorTable[i].c_color)
102
color = xpm.colorTable[i].c_color;
103
else if (xpm.colorTable[i].g_color)
104
color = xpm.colorTable[i].g_color;
105
else if (xpm.colorTable[i].g4_color)
106
color = xpm.colorTable[i].g4_color;
107
else if (xpm.colorTable[i].m_color)
108
color = xpm.colorTable[i].m_color;
109
else if (xpm.colorTable[i].symbolic)
110
color = xpm.colorTable[i].symbolic;
113
color_table[0][i] = 0xbe;
114
color_table[1][i] = 0xbe;
115
color_table[2][i] = 0xbe;
116
color_table[3][i] = 0xff;
120
if (strncmp(color,"None",4)==0) {
127
if (XParseColor(dpy, cmap, color, &xcolor)) {
128
color_table[0][i] = xcolor.red>>8;
129
color_table[1][i] = xcolor.green>>8;
130
color_table[2][i] = xcolor.blue>>8;
131
color_table[3][i] = 0xff;
133
color_table[0][i] = 0xbe;
134
color_table[1][i] = 0xbe;
135
color_table[2][i] = 0xbe;
136
color_table[3][i] = 0xff;
139
/* convert pixmap to RImage */
142
for (i=0; i<xpm.width*xpm.height; i++) {
143
*(data++)=color_table[0][*p];
144
*(data++)=color_table[1][*p];
145
*(data++)=color_table[2][*p];
146
*(data++)=color_table[3][*p];
150
free(color_table[i]);
152
XpmFreeXpmImage(&xpm);
159
RLoadXPM(RContext *context, char *file, int index)
161
Display *dpy = context->dpy;
162
Colormap cmap = context->cmap;
165
unsigned char *color_table[4];
170
i = XpmReadFileToXpmImage(file, &xpm, (XpmInfo *)NULL);
174
RErrorCode = RERR_OPEN;
177
RErrorCode = RERR_BADIMAGEFILE;
180
RErrorCode = RERR_NOMEMORY;
183
RErrorCode = RERR_BADIMAGEFILE;
188
if (xpm.height<1 || xpm.width < 1) {
189
RErrorCode = RERR_BADIMAGEFILE;
190
XpmFreeXpmImage(&xpm);
194
if (xpm.colorTable==NULL) {
195
RErrorCode = RERR_BADIMAGEFILE;
196
XpmFreeXpmImage(&xpm);
199
image = RCreateImage(xpm.width, xpm.height, True);
201
XpmFreeXpmImage(&xpm);
205
/* make color table */
206
for (i=0; i<4; i++) {
207
color_table[i] = malloc(xpm.ncolors*sizeof(char));
208
if (!color_table[i]) {
209
for (i=i-1;i>=0; i--) {
211
free(color_table[i]);
213
RReleaseImage(image);
214
RErrorCode = RERR_NOMEMORY;
215
XpmFreeXpmImage(&xpm);
220
for (i=0; i<xpm.ncolors; i++) {
224
if (xpm.colorTable[i].c_color)
225
color = xpm.colorTable[i].c_color;
226
else if (xpm.colorTable[i].g_color)
227
color = xpm.colorTable[i].g_color;
228
else if (xpm.colorTable[i].g4_color)
229
color = xpm.colorTable[i].g4_color;
230
else if (xpm.colorTable[i].m_color)
231
color = xpm.colorTable[i].m_color;
232
else if (xpm.colorTable[i].symbolic)
233
color = xpm.colorTable[i].symbolic;
236
color_table[0][i] = 0xbe;
237
color_table[1][i] = 0xbe;
238
color_table[2][i] = 0xbe;
239
color_table[3][i] = 0xff;
243
if (strncmp(color,"None",4)==0) {
250
if (XParseColor(dpy, cmap, color, &xcolor)) {
251
color_table[0][i] = xcolor.red>>8;
252
color_table[1][i] = xcolor.green>>8;
253
color_table[2][i] = xcolor.blue>>8;
254
color_table[3][i] = 0xff;
256
color_table[0][i] = 0xbe;
257
color_table[1][i] = 0xbe;
258
color_table[2][i] = 0xbe;
259
color_table[3][i] = 0xff;
262
/* convert pixmap to RImage */
265
for (i=0; i<xpm.width*xpm.height; i++, p++) {
266
*(data++)=color_table[0][*p];
267
*(data++)=color_table[1][*p];
268
*(data++)=color_table[2][*p];
269
*(data++)=color_table[3][*p];
272
free(color_table[i]);
274
XpmFreeXpmImage(&xpm);