earlybrowserreborn - Blame information for rev 1

Subversion Repositories:
Rev:
Rev Author Line No. Line
1 roytam 1 /* Copyright 1990,91 GROUPE BULL -- See licence conditions in file COPYRIGHT */
2 /*****************************************************************************\
3 * XpmWrFFrI.c:                                                                *
4 *                                                                             *
5 *  XPM library                                                                *
6 *  Write an image and possibly its mask to an XPM file                        *
7 *                                                                             *
8 *  Developed by Arnaud Le Hors                                                *
9 \*****************************************************************************/
10  
11 #include "xpmP.h"
12 #ifdef VMS
13 #include "sys$library:string.h"
14 #else
15 #ifdef SYSV
16 #include <string.h>
17 #else
18 #include <strings.h>
19 #endif
20 #endif
21  
22 LFUNC(WriteData, int, (xpmData * mdata,
23                     xpmInternAttrib * attrib, XpmAttributes * attributes));
24  
25 int
26 XpmWriteFileFromImage(display, filename, image, shapeimage, attributes)
27     Display *display;
28     char *filename;
29     XImage *image;
30     XImage *shapeimage;
31     XpmAttributes *attributes;
32 {
33     xpmData mdata;
34     char *name, *end_name, *begin_name = NULL;
35     int ErrorStatus;
36     xpmInternAttrib attrib;
37  
38     if ((ErrorStatus = xpmWriteFile(filename, &mdata)) != XpmSuccess)
39         return (ErrorStatus);
40  
41     if (filename) {
42 #ifdef VMS
43         name = filename;
44 #else
45         if (!(name = strchr(filename, '/')))
46             name = filename;
47         else
48             name++;
49 #endif
50         if (end_name = strchr(name, '.')) {
51             begin_name = name;
52             name = (char *) malloc((unsigned int) (end_name - begin_name) + 1);
53             if (!name) {
54                 begin_name = NULL;
55                 name = "image_name";
56             } else {
57                 strncpy(name, begin_name,
58                         (unsigned int) (end_name - begin_name));
59                 name[(unsigned int) (end_name - begin_name)] = '\0';
60             }
61         }
62     } else
63         name = "image_name";
64  
65     xpmInitInternAttrib(&attrib);
66  
67     /*
68      * Scan image then write it out
69      */
70     ErrorStatus = xpmScanImage(display, image, shapeimage,
71                                attributes, &attrib);
72  
73     if (ErrorStatus == XpmSuccess) {
74         attrib.name = name;
75         ErrorStatus = WriteData(&mdata, &attrib, attributes);
76     }
77     xpmFreeInternAttrib(&attrib);
78     XpmDataClose(&mdata);
79     if (begin_name)
80         free(name);
81  
82     return (ErrorStatus);
83 }
84  
85  
86 static int
87 WriteData(mdata, attrib, attributes)
88     xpmData *mdata;
89     xpmInternAttrib *attrib;
90     XpmAttributes *attributes;
91 {
92     /* calculation variables */
93     xpmRgbName rgbn[MAX_RGBNAMES];
94     int rgbn_max = 0;
95     char *colorname;
96     unsigned int *iptr;
97     unsigned int a, b, c, x, y, n = 0, key, d, e;
98  
99  
100     /*
101      * read the rgb file if any was specified
102      */
103     if (attributes && (attributes->valuemask & XpmRgbFilename))
104         rgbn_max = xpmReadRgbNames(attributes->rgb_fname, rgbn);
105  
106     /* force output type to the C syntax */
107     n = 1;
108  
109     /*
110      * print the header line
111      */
112     fprintf(mdata->stream.file, "%s XPM %s\n", xpmDataTypes[n].Bcmt,
113             xpmDataTypes[n].Ecmt);
114     if (n != 0)                         /* print the assignment line */
115         fprintf(mdata->stream.file, "%s %s %s",
116                 xpmDataTypes[n].Dec, attrib->name, xpmDataTypes[n].Boa);
117  
118     /*
119      * print the hints line
120      */
121     if (attributes && (attributes->valuemask & XpmInfos)
122         && attributes->hints_cmt)
123         /* print hints comment line */
124         fprintf(mdata->stream.file, "%s%s%s\n",
125         xpmDataTypes[n].Bcmt, attributes->hints_cmt, xpmDataTypes[n].Ecmt);
126  
127     if (xpmDataTypes[n].Bos)
128         fprintf(mdata->stream.file, "%c", xpmDataTypes[n].Bos);
129  
130     fprintf(mdata->stream.file, "%d %d %d %d",
131             attrib->width, attrib->height, attrib->ncolors, attrib->cpp);
132  
133     if (attributes && (attributes->valuemask & XpmHotspot))
134         fprintf(mdata->stream.file, " %d %d",
135                 attributes->x_hotspot, attributes->y_hotspot);
136  
137     if (xpmDataTypes[n].Eos)
138         fprintf(mdata->stream.file, "%c", xpmDataTypes[n].Eos);
139  
140     fprintf(mdata->stream.file, xpmDataTypes[n].Strs);
141  
142     /*
143      * print colors
144      */
145     if (attributes && (attributes->valuemask & XpmInfos)
146         && attributes->colors_cmt)
147         /* print colors comment line */
148         fprintf(mdata->stream.file, "%s%s%s\n",
149         xpmDataTypes[n].Bcmt, attributes->colors_cmt, xpmDataTypes[n].Ecmt);
150  
151     if (attrib->mask_pixel != UNDEF_PIXEL) {    /* transparent pixel */
152         if (xpmDataTypes[n].Bos)
153             fprintf(mdata->stream.file, "%c", xpmDataTypes[n].Bos);
154  
155         for (b = 0; b < attrib->cpp; b++)
156             fprintf(mdata->stream.file, "%c", attrib->colorStrings[0][b]);
157  
158         if (attributes && (attributes->valuemask & XpmInfos)
159             && attributes->mask_pixel != UNDEF_PIXEL) {
160             for (key = 1; key < NKEYS + 1; key++) {
161                 if (attributes->colorTable[attributes->mask_pixel][key])
162                     fprintf(mdata->stream.file, "\t%s %s",
163                             xpmColorKeys[key - 1],
164                         attributes->colorTable[attributes->mask_pixel][key]
165                         );
166             }
167         } else
168             fprintf(mdata->stream.file, "\tc %s", TRANSPARENT_COLOR);
169  
170         if (xpmDataTypes[n].Eos)
171             fprintf(mdata->stream.file, "%c", xpmDataTypes[n].Eos);
172  
173         fprintf(mdata->stream.file, xpmDataTypes[n].Strs);
174         d = 1;
175     } else
176         d = 0;
177  
178     for (a = d; a < attrib->ncolors; a++) {     /* other colors */
179         if (xpmDataTypes[n].Bos)
180             fprintf(mdata->stream.file, "%c", xpmDataTypes[n].Bos);
181  
182         for (b = 0; b < attrib->cpp; b++)
183             fprintf(mdata->stream.file, "%c", attrib->colorStrings[a][b]);
184  
185         c = 1;
186         if (attributes && (attributes->valuemask & XpmInfos)) {
187             e = 0;
188             for (b = 0; b < attributes->ncolors; b++) {
189                 if (b == attributes->mask_pixel) {
190                     e = 1;
191                     continue;
192                 }
193                 if (attributes->pixels[b - e] == attrib->xcolors[a].pixel)
194                     break;
195             }
196             if (b != attributes->ncolors) {
197                 c = 0;
198                 for (key = 1; key < NKEYS + 1; key++) {
199                     if (attributes->colorTable[b][key])
200                         fprintf(mdata->stream.file, "\t%s %s",
201                                 xpmColorKeys[key - 1],
202                                 attributes->colorTable[b][key]);
203                 }
204             }
205         }
206         if (c) {
207             colorname = NULL;
208             if (rgbn_max)
209                 colorname = xpmGetRgbName(rgbn, rgbn_max,
210                                           attrib->xcolors[a].red,
211                                           attrib->xcolors[a].green,
212                                           attrib->xcolors[a].blue);
213             if (colorname)
214                 fprintf(mdata->stream.file, "\tc %s", colorname);
215             else
216                 fprintf(mdata->stream.file, "\tc #%04X%04X%04X",
217                         attrib->xcolors[a].red,
218                         attrib->xcolors[a].green,
219                         attrib->xcolors[a].blue);
220         }
221         if (xpmDataTypes[n].Eos)
222             fprintf(mdata->stream.file, "%c", xpmDataTypes[n].Eos);
223  
224         fprintf(mdata->stream.file, xpmDataTypes[n].Strs);
225     }
226  
227     /*
228      * print pixels
229      */
230     if (attributes && (attributes->valuemask & XpmInfos)
231         && attributes->pixels_cmt)
232         /* print pixels comment line */
233         fprintf(mdata->stream.file, "%s%s%s\n",
234         xpmDataTypes[n].Bcmt, attributes->pixels_cmt, xpmDataTypes[n].Ecmt);
235  
236     iptr = attrib->pixelindex;
237  
238     for (y = 0; y < attrib->height; y++) {
239  
240         if (xpmDataTypes[n].Bos)
241             fprintf(mdata->stream.file, "%c", xpmDataTypes[n].Bos);
242  
243         for (x = 0; x < attrib->width; x++, iptr++)
244             for (b = 0; b < attrib->cpp; b++)
245                 fprintf(mdata->stream.file, "%c",
246                         attrib->colorStrings[*iptr][b]);
247  
248         if (xpmDataTypes[n].Eos)
249             fprintf(mdata->stream.file, "%c", xpmDataTypes[n].Eos);
250  
251         if (y < attrib->height - 1)
252             fprintf(mdata->stream.file, xpmDataTypes[n].Strs);
253     }
254  
255     fprintf(mdata->stream.file, xpmDataTypes[n].Eoa);
256  
257     xpmFreeRgbNames(rgbn, rgbn_max);
258  
259     return (XpmSuccess);
260 }