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