1 # include "bitmapConfig.h"
2
3 # include "bmintern.h"
4 # include <string.h>
5 # include <appSystem.h>
6 # include <appDebugon.h>
7
8 # if USE_LIBTIFF
9 # include <tiffio.h>
10
11 static BitmapFileType bmTiffFile=
12 {
13 bmWriteTiffFile,
14 bmCanWriteTiffFile,
15 bmReadTiffFile,
16 "tiff",
17 "*.tiff",
18 "tiffFile",
19 "Tagged Image Format ( *.tiff )",
20 };
21
22 static BitmapFileType bmTifFile=
23 {
24 bmWriteTiffFile,
25 bmCanWriteTiffFile,
26 bmReadTiffFile,
27 "tif",
28 "*.tif",
29 "tifFile",
30 "Tagged Image Format ( *.tif )",
31 };
32
33 # endif /* TIFF_FOUND */
34
35 static BitmapFileType bmBmpFile=
36 {
37 bmWriteBmpFile,
38 bmCanWriteBmpFile,
39 bmReadBmpFile,
40 "bmp",
41 "*.bmp",
42 "bmpFile",
43 "Microsoft Bitmap ( *.bmp )",
44 };
45
46 static BitmapFileType bmIcoFile=
47 {
48 bmWriteIcoFile,
49 bmCanWriteIcoFile,
50 bmReadIcoFile,
51 "ico",
52 "*.ico",
53 "icoFile",
54 "Microsoft Icon ( *.ico )",
55 };
56
57 static BitmapFileType bmXwdFile=
58 {
59 NULL, /* bmWriteXwdFile, */
60 NULL, /* bmCanWriteXwdFile, */
61 bmReadXwdFile,
62 "xwd",
63 "*.xwd",
64 "xwdFile",
65 "X-Window Dump ( *.xwd )",
66 };
67
68 static BitmapFileType bmJpgFile=
69 {
70 bmWriteJpegFile,
71 bmCanWriteJpegFile,
72 bmReadJpegFile,
73 "jpg",
74 "*.jpg",
75 "jpgFile",
76 "JPEG ( *.jpg )",
77 };
78
79 static BitmapFileType bmJpegFile=
80 {
81 bmWriteJpegFile,
82 bmCanWriteJpegFile,
83 bmReadJpegFile,
84 "jpeg",
85 "*.jpeg",
86 "jpegFile",
87 "JPEG ( *.jpeg )",
88 };
89
90 static BitmapFileType bmGifFile=
91 {
92 bmWriteGifFile,
93 bmCanWriteGifFile,
94 bmReadGifFile,
95 "gif",
96 "*.gif",
97 "gifFile",
98 "Compuserve GIF ( *.gif )",
99 };
100
101 static BitmapFileType bmEpsFile=
102 {
103 bmWriteEpsFile,
104 bmCanWriteEpsFile,
105 NULL, /* bmReadEpsFile, */
106 "eps",
107 "*.eps",
108 "epsFile",
109 "Encapsulated Postscript ( *.eps )",
110 };
111
112 static BitmapFileType bmPdfFile=
113 {
114 bmWritePdfFile,
115 bmCanWritePdfFile,
116 NULL, /* bmReadPdfFile, */
117 "pdf",
118 "*.pdf",
119 "pdfFile",
120 "Acrobat PDF ( *.pdf )",
121 };
122
123 static BitmapFileType bmRtfFile=
124 {
125 bmWriteRtfFile,
126 bmCanWriteRtfFile,
127 NULL, /* bmReadRtfFile, */
128 "rtf",
129 "*.rtf",
130 "rtfFile",
131 "Rich Text Format ( *.rtf )",
132 };
133
134 static BitmapFileType bmXbmFile=
135 {
136 bmWriteXbmFile,
137 bmCanWriteXbmFile,
138 bmReadXbmFile,
139 "xbm",
140 "*.xbm",
141 "xbmFile",
142 "X-Windows bitmap ( *.xbm )",
143 };
144
145 static BitmapFileType bmWmfFile=
146 {
147 bmWriteWmfFile,
148 bmCanWriteWmfFile,
149 NULL, /* bmReadWmfFile, */
150 "wmf",
151 "*.wmf",
152 "wmfFile",
153 "Windows Meta File ( *.wmf )",
154 };
155
156 static BitmapFileType bmPngFile=
157 {
158 bmWritePngFile,
159 bmCanWritePngFile,
160 bmReadPngFile,
161 "png",
162 "*.png",
163 "pngFile",
164 "Portable Network Graphics ( *.png )",
165 };
166
167 # if USE_LIBXPM
168 static BitmapFileType bmXpmFile=
169 {
170 bmWriteXpmFile,
171 bmCanWriteXpmFile,
172 bmReadXpmFile,
173 "xpm",
174 "*.xpm",
175 "xpmFile",
176 "X11 Pixmap ( *.xpm )",
177 };
178 # endif /* USE_XPM */
179
180 static BitmapFileType bmPgmFile=
181 {
182 bmWritePbmFile,
183 bmCanWritePbmFile,
184 bmReadPbmFile,
185 "pgm",
186 "*.pgm",
187 "pgmFile",
188 "Portable Gray Map ( *.pgm )",
189 };
190
191 static BitmapFileType bmPbmFile=
192 {
193 bmWritePbmFile,
194 bmCanWritePbmFile,
195 bmReadPbmFile,
196 "pbm",
197 "*.pbm",
198 "pbmFile",
199 "Portable Bitmap ( *.pbm )",
200 };
201
202 static BitmapFileType bmPpmFile=
203 {
204 bmWritePbmFile,
205 bmCanWritePbmFile,
206 bmReadPbmFile,
207 "ppm",
208 "*.ppm",
209 "ppmFile",
210 "Portable Pixmap ( *.ppm )",
211 };
212
213 static BitmapFileType bmPnmFile=
214 {
215 NULL,
216 NULL,
217 bmReadPbmFile,
218 "pnm",
219 "*.pnm",
220 "pnmFile",
221 "Portable Anymap ( *.pnm )",
222 };
223
224 static BitmapFileType bmWbmpFile=
225 {
226 bmWriteWbmpFile,
227 bmCanWriteWbmpFile,
228 bmReadWbmpFile,
229 "wbmp",
230 "*.wbmp",
231 "wbmpFile",
232 "WAP Wireless Bitmap Format ( *.wbmp )",
233 };
234
235 BitmapFileType * bmFileTypes[]=
236 {
237 &bmPngFile,
238 &bmJpegFile,
239 &bmJpgFile,
240 &bmBmpFile,
241 &bmGifFile,
242 &bmXwdFile,
243 &bmEpsFile,
244 &bmPdfFile,
245 &bmRtfFile,
246 &bmXbmFile,
247 &bmIcoFile,
248 # if USE_LIBTIFF
249 &bmTiffFile,
250 &bmTifFile,
251 # endif
252 # if USE_LIBXPM
253 &bmXpmFile,
254 # endif
255 &bmPgmFile,
256 &bmPbmFile,
257 &bmPpmFile,
258 &bmPnmFile,
259 &bmWbmpFile,
260 &bmWmfFile,
261 };
262
263 BitmapFileFormat bmFileFormats[]=
264 {
265 { "PNG Portable Network Graphics", "png1File",
266 0, &bmPngFile },
267 { "JPG Independent JPEG Group (.jpg)", "jpg1File",
268 1, &bmJpgFile },
269 { "JPEG Independent JPEG Group (.jpeg)", "jpeg1File",
270 1, &bmJpegFile },
271 { "BMP Microsoft Windows 3.x bitmap", "bmp3File",
272 40, &bmBmpFile },
273 { "GIF Compuserve GIF", "gif87File",
274 87, &bmGifFile },
275 { "XWD X/11 Window dump", "xwd11File",
276 11, &bmXwdFile },
277 { "XWD X/10 Window dump", "xwd10File",
278 10, &bmXwdFile },
279 { "EPS Encapsulated Postscript", "eps1File",
280 1, &bmEpsFile },
281 { "EPS Encapsulated Postscript (Level 2)", "eps2File",
282 2, &bmEpsFile },
283 { "PDF Acrobat Portable Document Format", "pdf2File",
284 12, &bmPdfFile },
285 { "XBM X/11 Bitmap File", "xbm11File",
286 11, &bmXbmFile },
287 { "ICO Microsoft 3.x Windows Icon", "ico3File",
288 40, &bmIcoFile },
289 # if USE_LIBTIFF
290 { "TIFF No compression", "tiffPlainFile",
291 COMPRESSION_NONE, &bmTiffFile },
292 { "TIFF CCITT run length", "tiffCcittRleFile",
293 COMPRESSION_CCITTRLE, &bmTiffFile },
294 { "TIFF Fax 3 format", "tiffFax3File",
295 COMPRESSION_CCITTFAX3, &bmTiffFile },
296 { "TIFF Fax 4 format", "tiffFax4File",
297 COMPRESSION_CCITTFAX4, &bmTiffFile },
298 { "TIFF Lempel-Ziv & Welch", "tiffLzwFile",
299 COMPRESSION_LZW, &bmTiffFile },
300 { "TIFF NeXT 2-bit RLE", "tiffNextFile",
301 COMPRESSION_NEXT, &bmTiffFile },
302 { "TIFF Run length, aligned", "tiffRleFile",
303 COMPRESSION_CCITTRLEW, &bmTiffFile },
304 { "TIFF Packbits", "tiffPackbitsFile",
305 COMPRESSION_PACKBITS, &bmTiffFile },
306 { "TIFF Thunderscan", "tiffThunderFile",
307 COMPRESSION_THUNDERSCAN, &bmTiffFile },
308 { "TIFF JPEG", "tiffJpegFile",
309 COMPRESSION_JPEG, &bmTiffFile },
310 # endif /* TIFF_FOUND */
311 # if USE_LIBXPM
312 { "XPM X11 Pixmap File", "xpm1File",
313 0, &bmXpmFile },
314 # endif /* USE_XPM */
315 { "PGM Gray Map (Text)", "pgm2File",
316 2, &bmPgmFile },
317 { "PGM Gray Map (Raw)", "pgm5File",
318 5, &bmPgmFile },
319 { "PBM Bitmap (Text)", "pgm1File",
320 1, &bmPbmFile },
321 { "PBM Bitmap (Raw)", "pgm4File",
322 4, &bmPbmFile },
323 { "PPM Pixmap (Text)", "pgm3File",
324 3, &bmPbmFile },
325 { "PPM Pixmap (Raw)", "pgm6File",
326 6, &bmPbmFile },
327 { "WBMP Wireless Bitmap", "wbmp0File",
328 0, &bmWbmpFile },
329 { "WMF Windows Meta File", "wmfFile",
330 0, &bmWmfFile },
331 { "RTF Rich Text Format (\\pngblip)", "rtfPngFile",
332 0, &bmRtfFile },
333 { "RTF Rich Text Format (\\jpegblip)", "rtfJpegFile",
334 1, &bmRtfFile },
335 { "RTF Rich Text Format (\\wmetafile)", "rtfWmfFile",
336 2, &bmRtfFile },
337 };
338
339 const int bmNumberOfFileFormats= sizeof(bmFileFormats)/sizeof(BitmapFileFormat);
340 const int bmNumberOfFileTypes= sizeof(bmFileTypes)/sizeof(BitmapFileType *);
341
342
bmTestWrite(const BitmapDescription * bd,const MemoryBuffer * ext,const BitmapFileFormat * bff)343 static int bmTestWrite( const BitmapDescription * bd,
344 const MemoryBuffer * ext,
345 const BitmapFileFormat * bff )
346 {
347 if ( ! utilMemoryBufferIsEmpty( ext ) &&
348 strcmp( bff->bffFileType->bftFileExtension, utilMemoryBufferGetString( ext ) ) )
349 { return -1; }
350 if ( ! bff->bffFileType->bftWrite )
351 { return -1; }
352 if ( (*bff->bffFileType->bftCanWrite) ( bd, bff->bffPrivate ) )
353 { return -1; }
354
355 return 0;
356 }
357
bmSuggestFormat(const MemoryBuffer * filename,int suggestedFormat,const BitmapDescription * bd)358 int bmSuggestFormat( const MemoryBuffer * filename,
359 int suggestedFormat,
360 const BitmapDescription * bd )
361 {
362 int format= suggestedFormat;
363
364 MemoryBuffer ext;
365
366 if ( format >= bmNumberOfFileFormats )
367 { LLDEB(format,bmNumberOfFileFormats); format= -1; goto ready; }
368
369 utilInitMemoryBuffer( &ext );
370
371 if ( appFileGetFileExtension( &ext, filename ) )
372 { LDEB(1); format= -1; goto ready; }
373
374 if ( utilMemoryBufferIsEmpty( &ext ) ||
375 format < 0 ||
376 bmTestWrite( bd, &ext, bmFileFormats+ format ) )
377 {
378 int i;
379 BitmapFileFormat * bff;
380
381 bff= bmFileFormats;
382 for ( i= 0; i < bmNumberOfFileFormats; bff++, i++ )
383 {
384 if ( ! bmTestWrite( bd, &ext, bff ) )
385 { format= i; break; }
386 }
387
388 if ( i == bmNumberOfFileFormats )
389 { SLLDEB(utilMemoryBufferGetString(&ext),i,bmNumberOfFileFormats); }
390 }
391
392 ready:
393
394 utilCleanMemoryBuffer( &ext );
395
396 return format;
397 }
398
399