xref: /plan9/sys/src/cmd/aux/antiword/imgexam.c (revision 25b329d522281a8cdd35da0dcc08c3fc621059a9)
1f5736e95SDavid du Colombier /*
2f5736e95SDavid du Colombier  * imgexam.c
3*25b329d5SDavid du Colombier  * Copyright (C) 2000-2004 A.J. van Os; Released under GNU GPL
4f5736e95SDavid du Colombier  *
5f5736e95SDavid du Colombier  * Description:
6f5736e95SDavid du Colombier  * Functions to examine image headers
7f5736e95SDavid du Colombier  *
8f5736e95SDavid du Colombier  *================================================================
9f5736e95SDavid du Colombier  * Part of this software is based on:
10f5736e95SDavid du Colombier  * jpeg2ps - convert JPEG compressed images to PostScript Level 2
11f5736e95SDavid du Colombier  * Copyright (C) 1994-99 Thomas Merz (tm@muc.de)
12f5736e95SDavid du Colombier  *================================================================
13f5736e95SDavid du Colombier  * The credit should go to him, but all the bugs are mine.
14f5736e95SDavid du Colombier  */
15f5736e95SDavid du Colombier 
16f5736e95SDavid du Colombier #include <stdio.h>
17f5736e95SDavid du Colombier #include <string.h>
18f5736e95SDavid du Colombier #include <ctype.h>
19f5736e95SDavid du Colombier #include "antiword.h"
20f5736e95SDavid du Colombier 
21f5736e95SDavid du Colombier /* BMP compression types */
22f5736e95SDavid du Colombier #define BI_RGB		0
23f5736e95SDavid du Colombier #define BI_RLE8		1
24f5736e95SDavid du Colombier #define BI_RLE4		2
25f5736e95SDavid du Colombier 
26f5736e95SDavid du Colombier /* PNG colortype bits */
27f5736e95SDavid du Colombier #define PNG_CB_PALETTE		0x01
28f5736e95SDavid du Colombier #define PNG_CB_COLOR		0x02
29f5736e95SDavid du Colombier #define PNG_CB_ALPHA		0x04
30f5736e95SDavid du Colombier 
31*25b329d5SDavid du Colombier /* Instance signature */
32*25b329d5SDavid du Colombier #define MSOBI_WMF	0x0216
33*25b329d5SDavid du Colombier #define MSOBI_EMF	0x03d4
34*25b329d5SDavid du Colombier #define MSOBI_PICT	0x0542
35*25b329d5SDavid du Colombier #define MSOBI_PNG	0x06e0
36*25b329d5SDavid du Colombier #define MSOBI_JPEG	0x046a
37*25b329d5SDavid du Colombier #define MSOBI_DIB	0x07a8
38*25b329d5SDavid du Colombier 
39f5736e95SDavid du Colombier /* The following enum is stolen from the IJG JPEG library */
40f5736e95SDavid du Colombier typedef enum {		/* JPEG marker codes			*/
41f5736e95SDavid du Colombier 	M_SOF0	= 0xc0,	/* baseline DCT				*/
42f5736e95SDavid du Colombier 	M_SOF1	= 0xc1,	/* extended sequential DCT		*/
43f5736e95SDavid du Colombier 	M_SOF2	= 0xc2,	/* progressive DCT			*/
44f5736e95SDavid du Colombier 	M_SOF3	= 0xc3,	/* lossless (sequential)		*/
45f5736e95SDavid du Colombier 
46f5736e95SDavid du Colombier 	M_SOF5	= 0xc5,	/* differential sequential DCT		*/
47f5736e95SDavid du Colombier 	M_SOF6	= 0xc6,	/* differential progressive DCT		*/
48f5736e95SDavid du Colombier 	M_SOF7	= 0xc7,	/* differential lossless		*/
49f5736e95SDavid du Colombier 
50f5736e95SDavid du Colombier 	M_JPG	= 0xc8,	/* JPEG extensions			*/
51f5736e95SDavid du Colombier 	M_SOF9	= 0xc9,	/* extended sequential DCT		*/
52f5736e95SDavid du Colombier 	M_SOF10	= 0xca,	/* progressive DCT			*/
53f5736e95SDavid du Colombier 	M_SOF11	= 0xcb,	/* lossless (sequential)		*/
54f5736e95SDavid du Colombier 
55f5736e95SDavid du Colombier 	M_SOF13	= 0xcd,	/* differential sequential DCT		*/
56f5736e95SDavid du Colombier 	M_SOF14	= 0xce,	/* differential progressive DCT		*/
57f5736e95SDavid du Colombier 	M_SOF15	= 0xcf,	/* differential lossless		*/
58f5736e95SDavid du Colombier 
59f5736e95SDavid du Colombier 	M_DHT	= 0xc4,	/* define Huffman tables		*/
60f5736e95SDavid du Colombier 
61f5736e95SDavid du Colombier 	M_DAC	= 0xcc,	/* define arithmetic conditioning table	*/
62f5736e95SDavid du Colombier 
63f5736e95SDavid du Colombier 	M_RST0	= 0xd0,	/* restart				*/
64f5736e95SDavid du Colombier 	M_RST1	= 0xd1,	/* restart				*/
65f5736e95SDavid du Colombier 	M_RST2	= 0xd2,	/* restart				*/
66f5736e95SDavid du Colombier 	M_RST3	= 0xd3,	/* restart				*/
67f5736e95SDavid du Colombier 	M_RST4	= 0xd4,	/* restart				*/
68f5736e95SDavid du Colombier 	M_RST5	= 0xd5,	/* restart				*/
69f5736e95SDavid du Colombier 	M_RST6	= 0xd6,	/* restart				*/
70f5736e95SDavid du Colombier 	M_RST7	= 0xd7,	/* restart				*/
71f5736e95SDavid du Colombier 
72f5736e95SDavid du Colombier 	M_SOI	= 0xd8,	/* start of image			*/
73f5736e95SDavid du Colombier 	M_EOI	= 0xd9,	/* end of image				*/
74f5736e95SDavid du Colombier 	M_SOS	= 0xda,	/* start of scan			*/
75f5736e95SDavid du Colombier 	M_DQT	= 0xdb,	/* define quantization tables		*/
76f5736e95SDavid du Colombier 	M_DNL	= 0xdc,	/* define number of lines		*/
77f5736e95SDavid du Colombier 	M_DRI	= 0xdd,	/* define restart interval		*/
78f5736e95SDavid du Colombier 	M_DHP	= 0xde,	/* define hierarchical progression	*/
79f5736e95SDavid du Colombier 	M_EXP	= 0xdf,	/* expand reference image(s)		*/
80f5736e95SDavid du Colombier 
81f5736e95SDavid du Colombier 	M_APP0	= 0xe0,	/* application marker, used for JFIF	*/
82f5736e95SDavid du Colombier 	M_APP1	= 0xe1,	/* application marker			*/
83f5736e95SDavid du Colombier 	M_APP2	= 0xe2,	/* application marker			*/
84f5736e95SDavid du Colombier 	M_APP3	= 0xe3,	/* application marker			*/
85f5736e95SDavid du Colombier 	M_APP4	= 0xe4,	/* application marker			*/
86f5736e95SDavid du Colombier 	M_APP5	= 0xe5,	/* application marker			*/
87f5736e95SDavid du Colombier 	M_APP6	= 0xe6,	/* application marker			*/
88f5736e95SDavid du Colombier 	M_APP7	= 0xe7,	/* application marker			*/
89f5736e95SDavid du Colombier 	M_APP8	= 0xe8,	/* application marker			*/
90f5736e95SDavid du Colombier 	M_APP9	= 0xe9,	/* application marker			*/
91f5736e95SDavid du Colombier 	M_APP10	= 0xea,	/* application marker			*/
92f5736e95SDavid du Colombier 	M_APP11	= 0xeb,	/* application marker			*/
93f5736e95SDavid du Colombier 	M_APP12	= 0xec,	/* application marker			*/
94f5736e95SDavid du Colombier 	M_APP13	= 0xed,	/* application marker			*/
95f5736e95SDavid du Colombier 	M_APP14	= 0xee,	/* application marker, used by Adobe	*/
96f5736e95SDavid du Colombier 	M_APP15	= 0xef,	/* application marker			*/
97f5736e95SDavid du Colombier 
98f5736e95SDavid du Colombier 	M_JPG0	= 0xf0,	/* reserved for JPEG extensions		*/
99f5736e95SDavid du Colombier 	M_JPG13	= 0xfd,	/* reserved for JPEG extensions		*/
100f5736e95SDavid du Colombier 	M_COM	= 0xfe,	/* comment				*/
101f5736e95SDavid du Colombier 
102f5736e95SDavid du Colombier 	M_TEM	= 0x01	/* temporary use			*/
103f5736e95SDavid du Colombier } JPEG_MARKER;
104f5736e95SDavid du Colombier 
105f5736e95SDavid du Colombier 
106f5736e95SDavid du Colombier /*
107f5736e95SDavid du Colombier  * bFillPaletteDIB - fill the palette part of the imagesdata
108f5736e95SDavid du Colombier  *
109f5736e95SDavid du Colombier  * returns TRUE if the images must be a color image, otherwise FALSE;
110f5736e95SDavid du Colombier  */
111f5736e95SDavid du Colombier static BOOL
bFillPaletteDIB(FILE * pFile,imagedata_type * pImg,BOOL bNewFormat)112f5736e95SDavid du Colombier bFillPaletteDIB(FILE *pFile, imagedata_type *pImg, BOOL bNewFormat)
113f5736e95SDavid du Colombier {
114f5736e95SDavid du Colombier 	int	iIndex;
115f5736e95SDavid du Colombier 	BOOL	bIsColorPalette;
116f5736e95SDavid du Colombier 
117f5736e95SDavid du Colombier 	fail(pFile == NULL);
118f5736e95SDavid du Colombier 	fail(pImg == NULL);
119f5736e95SDavid du Colombier 
120f5736e95SDavid du Colombier 	if (pImg->uiBitsPerComponent > 8) {
121f5736e95SDavid du Colombier 		/* No palette, image uses more than 256 colors */
122f5736e95SDavid du Colombier 		return TRUE;
123f5736e95SDavid du Colombier 	}
124f5736e95SDavid du Colombier 
125f5736e95SDavid du Colombier 	if (pImg->iColorsUsed <= 0) {
126f5736e95SDavid du Colombier 		/* Not specified, so compute the number of colors used */
127f5736e95SDavid du Colombier 		pImg->iColorsUsed = 1 << pImg->uiBitsPerComponent;
128f5736e95SDavid du Colombier 	}
129f5736e95SDavid du Colombier 
130f5736e95SDavid du Colombier 	fail(pImg->iColorsUsed > 256);
131f5736e95SDavid du Colombier 	if (pImg->iColorsUsed > 256) {
132f5736e95SDavid du Colombier 		pImg->iColorsUsed = 256;
133f5736e95SDavid du Colombier 	}
134f5736e95SDavid du Colombier 
135f5736e95SDavid du Colombier 	bIsColorPalette = FALSE;
136f5736e95SDavid du Colombier 	for (iIndex = 0; iIndex < pImg->iColorsUsed; iIndex++) {
137f5736e95SDavid du Colombier 		/* From BGR order to RGB order */
138f5736e95SDavid du Colombier 		pImg->aucPalette[iIndex][2] = (UCHAR)iNextByte(pFile);
139f5736e95SDavid du Colombier 		pImg->aucPalette[iIndex][1] = (UCHAR)iNextByte(pFile);
140f5736e95SDavid du Colombier 		pImg->aucPalette[iIndex][0] = (UCHAR)iNextByte(pFile);
141f5736e95SDavid du Colombier 		if (bNewFormat) {
142f5736e95SDavid du Colombier 			(void)iNextByte(pFile);
143f5736e95SDavid du Colombier 		}
144f5736e95SDavid du Colombier 		NO_DBG_PRINT_BLOCK(pImg->aucPalette[iIndex], 3);
145f5736e95SDavid du Colombier 		if (pImg->aucPalette[iIndex][0] !=
146f5736e95SDavid du Colombier 		     pImg->aucPalette[iIndex][1] ||
147f5736e95SDavid du Colombier 		    pImg->aucPalette[iIndex][1] !=
148f5736e95SDavid du Colombier 		     pImg->aucPalette[iIndex][2]) {
149f5736e95SDavid du Colombier 			bIsColorPalette = TRUE;
150f5736e95SDavid du Colombier 		}
151f5736e95SDavid du Colombier 	}
152f5736e95SDavid du Colombier 
153f5736e95SDavid du Colombier 	return bIsColorPalette;
154f5736e95SDavid du Colombier } /* end of bFillPaletteDIB */
155f5736e95SDavid du Colombier 
156f5736e95SDavid du Colombier /*
157f5736e95SDavid du Colombier  * bExamineDIB - Examine a DIB header
158f5736e95SDavid du Colombier  *
159f5736e95SDavid du Colombier  * return TRUE if successful, otherwise FALSE
160f5736e95SDavid du Colombier  */
161f5736e95SDavid du Colombier static BOOL
bExamineDIB(FILE * pFile,imagedata_type * pImg)162f5736e95SDavid du Colombier bExamineDIB(FILE *pFile, imagedata_type *pImg)
163f5736e95SDavid du Colombier {
164f5736e95SDavid du Colombier 	size_t	tHeaderSize;
165f5736e95SDavid du Colombier 	int	iPlanes, iCompression;
166f5736e95SDavid du Colombier 
167f5736e95SDavid du Colombier 	tHeaderSize = (size_t)ulNextLong(pFile);
168f5736e95SDavid du Colombier 	switch (tHeaderSize) {
169f5736e95SDavid du Colombier 	case 12:
170f5736e95SDavid du Colombier 		pImg->iWidth = (int)usNextWord(pFile);
171f5736e95SDavid du Colombier 		pImg->iHeight = (int)usNextWord(pFile);
172f5736e95SDavid du Colombier 		iPlanes = (int)usNextWord(pFile);
173f5736e95SDavid du Colombier 		pImg->uiBitsPerComponent = (UINT)usNextWord(pFile);
174f5736e95SDavid du Colombier 		iCompression = BI_RGB;
175f5736e95SDavid du Colombier 		pImg->iColorsUsed = 0;
176f5736e95SDavid du Colombier 		break;
177f5736e95SDavid du Colombier 	case 40:
178f5736e95SDavid du Colombier 	case 64:
179f5736e95SDavid du Colombier 		pImg->iWidth = (int)ulNextLong(pFile);
180f5736e95SDavid du Colombier 		pImg->iHeight = (int)ulNextLong(pFile);
181f5736e95SDavid du Colombier 		iPlanes = (int)usNextWord(pFile);
182f5736e95SDavid du Colombier 		pImg->uiBitsPerComponent = (UINT)usNextWord(pFile);
183f5736e95SDavid du Colombier 		iCompression = (int)ulNextLong(pFile);
184f5736e95SDavid du Colombier 		(void)tSkipBytes(pFile, 12);
185f5736e95SDavid du Colombier 		pImg->iColorsUsed = (int)ulNextLong(pFile);
186f5736e95SDavid du Colombier 		(void)tSkipBytes(pFile, tHeaderSize - 36);
187f5736e95SDavid du Colombier 		break;
188f5736e95SDavid du Colombier 	default:
189f5736e95SDavid du Colombier 		DBG_DEC(tHeaderSize);
190f5736e95SDavid du Colombier 		return FALSE;
191f5736e95SDavid du Colombier 	}
192f5736e95SDavid du Colombier 	DBG_DEC(pImg->iWidth);
193f5736e95SDavid du Colombier 	DBG_DEC(pImg->iHeight);
194f5736e95SDavid du Colombier 	DBG_DEC(pImg->uiBitsPerComponent);
195f5736e95SDavid du Colombier 	DBG_DEC(iCompression);
196f5736e95SDavid du Colombier 	DBG_DEC(pImg->iColorsUsed);
197f5736e95SDavid du Colombier 
198f5736e95SDavid du Colombier 	/* Do some sanity checks with the parameters */
199f5736e95SDavid du Colombier 	if (iPlanes != 1) {
200f5736e95SDavid du Colombier 		DBG_DEC(iPlanes);
201f5736e95SDavid du Colombier 		return FALSE;
202f5736e95SDavid du Colombier 	}
203f5736e95SDavid du Colombier 	if (pImg->iWidth <= 0 || pImg->iHeight <= 0) {
204f5736e95SDavid du Colombier 		DBG_DEC(pImg->iWidth);
205f5736e95SDavid du Colombier 		DBG_DEC(pImg->iHeight);
206f5736e95SDavid du Colombier 		return FALSE;
207f5736e95SDavid du Colombier 	}
208f5736e95SDavid du Colombier 	if (pImg->uiBitsPerComponent != 1 && pImg->uiBitsPerComponent != 4 &&
209f5736e95SDavid du Colombier 	    pImg->uiBitsPerComponent != 8 && pImg->uiBitsPerComponent != 24) {
210f5736e95SDavid du Colombier 		DBG_DEC(pImg->uiBitsPerComponent);
211f5736e95SDavid du Colombier 		return FALSE;
212f5736e95SDavid du Colombier 	}
213f5736e95SDavid du Colombier 	if (iCompression != BI_RGB &&
214f5736e95SDavid du Colombier 	    (pImg->uiBitsPerComponent == 1 || pImg->uiBitsPerComponent == 24)) {
215f5736e95SDavid du Colombier 		return FALSE;
216f5736e95SDavid du Colombier 	}
217f5736e95SDavid du Colombier 	if (iCompression == BI_RLE8 && pImg->uiBitsPerComponent == 4) {
218f5736e95SDavid du Colombier 		return FALSE;
219f5736e95SDavid du Colombier 	}
220f5736e95SDavid du Colombier 	if (iCompression == BI_RLE4 && pImg->uiBitsPerComponent == 8) {
221f5736e95SDavid du Colombier 		return FALSE;
222f5736e95SDavid du Colombier 	}
223f5736e95SDavid du Colombier 
224f5736e95SDavid du Colombier 	switch (iCompression) {
225f5736e95SDavid du Colombier 	case BI_RGB:
226f5736e95SDavid du Colombier 		pImg->eCompression = compression_none;
227f5736e95SDavid du Colombier 		break;
228f5736e95SDavid du Colombier 	case BI_RLE4:
229f5736e95SDavid du Colombier 		pImg->eCompression = compression_rle4;
230f5736e95SDavid du Colombier 		break;
231f5736e95SDavid du Colombier 	case BI_RLE8:
232f5736e95SDavid du Colombier 		pImg->eCompression = compression_rle8;
233f5736e95SDavid du Colombier 		break;
234f5736e95SDavid du Colombier 	default:
235f5736e95SDavid du Colombier 		DBG_DEC(iCompression);
236f5736e95SDavid du Colombier 		return FALSE;
237f5736e95SDavid du Colombier 	}
238f5736e95SDavid du Colombier 
239f5736e95SDavid du Colombier 	pImg->bColorImage = bFillPaletteDIB(pFile, pImg, tHeaderSize > 12);
240f5736e95SDavid du Colombier 
241f5736e95SDavid du Colombier 	if (pImg->uiBitsPerComponent <= 8) {
242f5736e95SDavid du Colombier 		pImg->iComponents = 1;
243f5736e95SDavid du Colombier 	} else {
244f5736e95SDavid du Colombier 		pImg->iComponents = (int)(pImg->uiBitsPerComponent / 8);
245f5736e95SDavid du Colombier 	}
246f5736e95SDavid du Colombier 
247f5736e95SDavid du Colombier 	return TRUE;
248f5736e95SDavid du Colombier } /* end of bExamineDIB */
249f5736e95SDavid du Colombier 
250f5736e95SDavid du Colombier /*
251f5736e95SDavid du Colombier  * iNextMarker - read the next JPEG marker
252f5736e95SDavid du Colombier  */
253f5736e95SDavid du Colombier static int
iNextMarker(FILE * pFile)254f5736e95SDavid du Colombier iNextMarker(FILE *pFile)
255f5736e95SDavid du Colombier {
256f5736e95SDavid du Colombier 	int	iMarker;
257f5736e95SDavid du Colombier 
258f5736e95SDavid du Colombier 	do {
259f5736e95SDavid du Colombier 		do {
260f5736e95SDavid du Colombier 			iMarker = iNextByte(pFile);
261f5736e95SDavid du Colombier 		} while (iMarker != 0xff && iMarker != EOF);
262f5736e95SDavid du Colombier 		if (iMarker == EOF) {
263f5736e95SDavid du Colombier 			return EOF;
264f5736e95SDavid du Colombier 		}
265f5736e95SDavid du Colombier 		do {
266f5736e95SDavid du Colombier 			iMarker = iNextByte(pFile);
267f5736e95SDavid du Colombier 		} while (iMarker == 0xff);
268f5736e95SDavid du Colombier 	} while (iMarker == 0x00);			/* repeat if ff/00 */
269f5736e95SDavid du Colombier 
270f5736e95SDavid du Colombier 	return iMarker;
271f5736e95SDavid du Colombier } /* end of iNextMarker */
272f5736e95SDavid du Colombier 
273f5736e95SDavid du Colombier /*
274f5736e95SDavid du Colombier  * bExamineJPEG - Examine a JPEG header
275f5736e95SDavid du Colombier  *
276f5736e95SDavid du Colombier  * return TRUE if successful, otherwise FALSE
277f5736e95SDavid du Colombier  */
278f5736e95SDavid du Colombier static BOOL
bExamineJPEG(FILE * pFile,imagedata_type * pImg)279f5736e95SDavid du Colombier bExamineJPEG(FILE *pFile, imagedata_type *pImg)
280f5736e95SDavid du Colombier {
281f5736e95SDavid du Colombier 	size_t	tLength;
282f5736e95SDavid du Colombier 	int	iMarker, iIndex;
283f5736e95SDavid du Colombier 	char	appstring[10];
284f5736e95SDavid du Colombier 	BOOL	bSOFDone;
285f5736e95SDavid du Colombier 
286f5736e95SDavid du Colombier 	tLength = 0;
287f5736e95SDavid du Colombier 	bSOFDone = FALSE;
288f5736e95SDavid du Colombier 
289f5736e95SDavid du Colombier 	/* process JPEG markers */
290f5736e95SDavid du Colombier 	while (!bSOFDone && (iMarker = iNextMarker(pFile)) != (int)M_EOI) {
291f5736e95SDavid du Colombier 		switch (iMarker) {
292f5736e95SDavid du Colombier 		case EOF:
293f5736e95SDavid du Colombier 			DBG_MSG("Error: unexpected end of JPEG file");
294f5736e95SDavid du Colombier 			return FALSE;
295f5736e95SDavid du Colombier 	/* The following are not officially supported in PostScript level 2 */
296f5736e95SDavid du Colombier 		case M_SOF2:
297f5736e95SDavid du Colombier 		case M_SOF3:
298f5736e95SDavid du Colombier 		case M_SOF5:
299f5736e95SDavid du Colombier 		case M_SOF6:
300f5736e95SDavid du Colombier 		case M_SOF7:
301f5736e95SDavid du Colombier 		case M_SOF9:
302f5736e95SDavid du Colombier 		case M_SOF10:
303f5736e95SDavid du Colombier 		case M_SOF11:
304f5736e95SDavid du Colombier 		case M_SOF13:
305f5736e95SDavid du Colombier 		case M_SOF14:
306f5736e95SDavid du Colombier 		case M_SOF15:
307f5736e95SDavid du Colombier 			DBG_HEX(iMarker);
308f5736e95SDavid du Colombier 			return FALSE;
309f5736e95SDavid du Colombier 		case M_SOF0:
310f5736e95SDavid du Colombier 		case M_SOF1:
311f5736e95SDavid du Colombier 			tLength = (size_t)usNextWordBE(pFile);
312f5736e95SDavid du Colombier 			pImg->uiBitsPerComponent = (UINT)iNextByte(pFile);
313f5736e95SDavid du Colombier 			pImg->iHeight = (int)usNextWordBE(pFile);
314f5736e95SDavid du Colombier 			pImg->iWidth = (int)usNextWordBE(pFile);
315f5736e95SDavid du Colombier 			pImg->iComponents = iNextByte(pFile);
316f5736e95SDavid du Colombier 			bSOFDone = TRUE;
317f5736e95SDavid du Colombier 			break;
318f5736e95SDavid du Colombier 		case M_APP14:
319f5736e95SDavid du Colombier 		/*
320f5736e95SDavid du Colombier 		 * Check for Adobe application marker. It is known (per Adobe's
321f5736e95SDavid du Colombier 		 * TN5116) to contain the string "Adobe" at the start of the
322f5736e95SDavid du Colombier 		 * APP14 marker.
323f5736e95SDavid du Colombier 		 */
324f5736e95SDavid du Colombier 			tLength = (size_t)usNextWordBE(pFile);
325f5736e95SDavid du Colombier 			if (tLength < 12) {
326f5736e95SDavid du Colombier 				(void)tSkipBytes(pFile, tLength - 2);
327f5736e95SDavid du Colombier 			} else {
328f5736e95SDavid du Colombier 				for (iIndex = 0; iIndex < 5; iIndex++) {
329f5736e95SDavid du Colombier 					appstring[iIndex] =
330f5736e95SDavid du Colombier 							(char)iNextByte(pFile);
331f5736e95SDavid du Colombier 				}
332f5736e95SDavid du Colombier 				appstring[5] = '\0';
333f5736e95SDavid du Colombier 				if (STREQ(appstring, "Adobe")) {
334f5736e95SDavid du Colombier 					pImg->bAdobe = TRUE;
335f5736e95SDavid du Colombier 				}
336f5736e95SDavid du Colombier 				(void)tSkipBytes(pFile, tLength - 7);
337f5736e95SDavid du Colombier 			}
338f5736e95SDavid du Colombier 			break;
339f5736e95SDavid du Colombier 		case M_SOI:		/* ignore markers without parameters */
340f5736e95SDavid du Colombier 		case M_EOI:
341f5736e95SDavid du Colombier 		case M_TEM:
342f5736e95SDavid du Colombier 		case M_RST0:
343f5736e95SDavid du Colombier 		case M_RST1:
344f5736e95SDavid du Colombier 		case M_RST2:
345f5736e95SDavid du Colombier 		case M_RST3:
346f5736e95SDavid du Colombier 		case M_RST4:
347f5736e95SDavid du Colombier 		case M_RST5:
348f5736e95SDavid du Colombier 		case M_RST6:
349f5736e95SDavid du Colombier 		case M_RST7:
350f5736e95SDavid du Colombier 			break;
351f5736e95SDavid du Colombier 		default:		/* skip variable length markers */
352f5736e95SDavid du Colombier 			tLength = (size_t)usNextWordBE(pFile);
353f5736e95SDavid du Colombier 			(void)tSkipBytes(pFile, tLength - 2);
354f5736e95SDavid du Colombier 			break;
355f5736e95SDavid du Colombier 		}
356f5736e95SDavid du Colombier 	}
357f5736e95SDavid du Colombier 
358f5736e95SDavid du Colombier 	DBG_DEC(pImg->iWidth);
359f5736e95SDavid du Colombier 	DBG_DEC(pImg->iHeight);
360f5736e95SDavid du Colombier 	DBG_DEC(pImg->uiBitsPerComponent);
361f5736e95SDavid du Colombier 	DBG_DEC(pImg->iComponents);
362f5736e95SDavid du Colombier 
363f5736e95SDavid du Colombier 	/* Do some sanity checks with the parameters */
364f5736e95SDavid du Colombier 	if (pImg->iHeight <= 0 ||
365f5736e95SDavid du Colombier 	    pImg->iWidth <= 0 ||
366f5736e95SDavid du Colombier 	    pImg->iComponents <= 0) {
367f5736e95SDavid du Colombier 		DBG_DEC(pImg->iHeight);
368f5736e95SDavid du Colombier 		DBG_DEC(pImg->iWidth);
369f5736e95SDavid du Colombier 		DBG_DEC(pImg->iComponents);
370f5736e95SDavid du Colombier 		return FALSE;
371f5736e95SDavid du Colombier 	}
372f5736e95SDavid du Colombier 
373f5736e95SDavid du Colombier 	/* Some broken JPEG files have this but they print anyway... */
374f5736e95SDavid du Colombier 	if (pImg->iComponents * 3 + 8 != (int)tLength) {
375f5736e95SDavid du Colombier 		DBG_MSG("Warning: SOF marker has incorrect length - ignored");
376f5736e95SDavid du Colombier 	}
377f5736e95SDavid du Colombier 
378f5736e95SDavid du Colombier 	if (pImg->uiBitsPerComponent != 8) {
379f5736e95SDavid du Colombier 		DBG_DEC(pImg->uiBitsPerComponent);
380f5736e95SDavid du Colombier 		DBG_MSG("Not supported in PostScript level 2");
381f5736e95SDavid du Colombier 		return FALSE;
382f5736e95SDavid du Colombier 	}
383f5736e95SDavid du Colombier 
384f5736e95SDavid du Colombier 	if (pImg->iComponents != 1 &&
385f5736e95SDavid du Colombier 	    pImg->iComponents != 3 &&
386f5736e95SDavid du Colombier 	    pImg->iComponents != 4) {
387f5736e95SDavid du Colombier 		DBG_DEC(pImg->iComponents);
388f5736e95SDavid du Colombier 		return FALSE;
389f5736e95SDavid du Colombier 	}
390f5736e95SDavid du Colombier 
391f5736e95SDavid du Colombier 	pImg->bColorImage = pImg->iComponents >= 3;
392f5736e95SDavid du Colombier 	pImg->iColorsUsed = 0;
393f5736e95SDavid du Colombier 	pImg->eCompression = compression_jpeg;
394f5736e95SDavid du Colombier 
395f5736e95SDavid du Colombier 	return TRUE;
396f5736e95SDavid du Colombier } /* end of bExamineJPEG */
397f5736e95SDavid du Colombier 
398f5736e95SDavid du Colombier /*
399f5736e95SDavid du Colombier  * bFillPalettePNG - fill the palette part of the imagesdata
400f5736e95SDavid du Colombier  *
401f5736e95SDavid du Colombier  * returns TRUE if sucessful, otherwise FALSE;
402f5736e95SDavid du Colombier  */
403f5736e95SDavid du Colombier static BOOL
bFillPalettePNG(FILE * pFile,imagedata_type * pImg,size_t tLength)404f5736e95SDavid du Colombier bFillPalettePNG(FILE *pFile, imagedata_type *pImg, size_t tLength)
405f5736e95SDavid du Colombier {
406f5736e95SDavid du Colombier 	int	iIndex, iEntries;
407f5736e95SDavid du Colombier 
408f5736e95SDavid du Colombier 	fail(pFile == NULL);
409f5736e95SDavid du Colombier 	fail(pImg == NULL);
410f5736e95SDavid du Colombier 
411f5736e95SDavid du Colombier 	if (pImg->uiBitsPerComponent > 8) {
412f5736e95SDavid du Colombier 		/* No palette, image uses more than 256 colors */
413f5736e95SDavid du Colombier 		return TRUE;
414f5736e95SDavid du Colombier 	}
415f5736e95SDavid du Colombier 
416f5736e95SDavid du Colombier 	if (!pImg->bColorImage) {
417f5736e95SDavid du Colombier 		/* Only color images can have a palette */
418f5736e95SDavid du Colombier 		return FALSE;
419f5736e95SDavid du Colombier 	}
420f5736e95SDavid du Colombier 
421f5736e95SDavid du Colombier 	if (tLength % 3 != 0) {
422f5736e95SDavid du Colombier 		/* Each palette entry takes three bytes */
423f5736e95SDavid du Colombier 		DBG_DEC(tLength);
424f5736e95SDavid du Colombier 		return FALSE;
425f5736e95SDavid du Colombier 	}
426f5736e95SDavid du Colombier 
427f5736e95SDavid du Colombier 	iEntries = (int)(tLength / 3);
428f5736e95SDavid du Colombier 	DBG_DEC(iEntries);
429f5736e95SDavid du Colombier 	pImg->iColorsUsed = 1 << pImg->uiBitsPerComponent;
430f5736e95SDavid du Colombier 	DBG_DEC(pImg->iColorsUsed);
431f5736e95SDavid du Colombier 
432f5736e95SDavid du Colombier 	if (iEntries > 256) {
433f5736e95SDavid du Colombier 		DBG_DEC(iEntries);
434f5736e95SDavid du Colombier 		return FALSE;
435f5736e95SDavid du Colombier 	}
436f5736e95SDavid du Colombier 
437f5736e95SDavid du Colombier 	for (iIndex = 0; iIndex < iEntries; iIndex++) {
438f5736e95SDavid du Colombier 		pImg->aucPalette[iIndex][0] = (UCHAR)iNextByte(pFile);
439f5736e95SDavid du Colombier 		pImg->aucPalette[iIndex][1] = (UCHAR)iNextByte(pFile);
440f5736e95SDavid du Colombier 		pImg->aucPalette[iIndex][2] = (UCHAR)iNextByte(pFile);
441f5736e95SDavid du Colombier 		NO_DBG_PRINT_BLOCK(pImg->aucPalette[iIndex], 3);
442f5736e95SDavid du Colombier 	}
443f5736e95SDavid du Colombier 	for (;iIndex < pImg->iColorsUsed; iIndex++) {
444f5736e95SDavid du Colombier 		pImg->aucPalette[iIndex][0] = 0;
445f5736e95SDavid du Colombier 		pImg->aucPalette[iIndex][1] = 0;
446f5736e95SDavid du Colombier 		pImg->aucPalette[iIndex][2] = 0;
447f5736e95SDavid du Colombier 	}
448f5736e95SDavid du Colombier 
449f5736e95SDavid du Colombier 	return TRUE;
450f5736e95SDavid du Colombier } /* end of bFillPalettePNG */
451f5736e95SDavid du Colombier 
452f5736e95SDavid du Colombier /*
453f5736e95SDavid du Colombier  * bExaminePNG - Examine a PNG header
454f5736e95SDavid du Colombier  *
455f5736e95SDavid du Colombier  * return TRUE if successful, otherwise FALSE
456f5736e95SDavid du Colombier  */
457f5736e95SDavid du Colombier static BOOL
bExaminePNG(FILE * pFile,imagedata_type * pImg)458f5736e95SDavid du Colombier bExaminePNG(FILE *pFile, imagedata_type *pImg)
459f5736e95SDavid du Colombier {
460f5736e95SDavid du Colombier 	size_t		tLength;
461f5736e95SDavid du Colombier 	ULONG		ulLong1, ulLong2, ulName;
462f5736e95SDavid du Colombier 	int		iIndex, iTmp;
463f5736e95SDavid du Colombier 	int		iCompressionMethod, iFilterMethod, iInterlaceMethod;
464f5736e95SDavid du Colombier 	int		iColor, iIncrement;
465f5736e95SDavid du Colombier 	BOOL		bHasPalette, bHasAlpha;
466f5736e95SDavid du Colombier 	UCHAR	aucBuf[4];
467f5736e95SDavid du Colombier 
468f5736e95SDavid du Colombier 	/* Check signature */
469f5736e95SDavid du Colombier 	ulLong1 = ulNextLongBE(pFile);
470f5736e95SDavid du Colombier 	ulLong2 = ulNextLongBE(pFile);
471f5736e95SDavid du Colombier 	if (ulLong1 != 0x89504e47UL || ulLong2 != 0x0d0a1a0aUL) {
472f5736e95SDavid du Colombier 		DBG_HEX(ulLong1);
473f5736e95SDavid du Colombier 		DBG_HEX(ulLong2);
474f5736e95SDavid du Colombier 		return FALSE;
475f5736e95SDavid du Colombier 	}
476f5736e95SDavid du Colombier 
477f5736e95SDavid du Colombier 	ulName = 0x00;
478f5736e95SDavid du Colombier 	bHasPalette = FALSE;
479f5736e95SDavid du Colombier 
480f5736e95SDavid du Colombier 	/* Examine chunks */
481f5736e95SDavid du Colombier 	while (ulName != PNG_CN_IEND) {
482f5736e95SDavid du Colombier 		tLength = (size_t)ulNextLongBE(pFile);
483f5736e95SDavid du Colombier 		ulName = 0x00;
484f5736e95SDavid du Colombier 		for (iIndex = 0; iIndex < (int)elementsof(aucBuf); iIndex++) {
485f5736e95SDavid du Colombier 			aucBuf[iIndex] = (UCHAR)iNextByte(pFile);
486f5736e95SDavid du Colombier 			if (!isalpha(aucBuf[iIndex])) {
487f5736e95SDavid du Colombier 				DBG_HEX(aucBuf[iIndex]);
488f5736e95SDavid du Colombier 				return FALSE;
489f5736e95SDavid du Colombier 			}
490f5736e95SDavid du Colombier 			ulName <<= 8;
491f5736e95SDavid du Colombier 			ulName |= aucBuf[iIndex];
492f5736e95SDavid du Colombier 		}
493f5736e95SDavid du Colombier 
494f5736e95SDavid du Colombier 		switch (ulName) {
495f5736e95SDavid du Colombier 		case PNG_CN_IHDR:
496f5736e95SDavid du Colombier 			/* Header chunck */
497f5736e95SDavid du Colombier 			if (tLength < 13) {
498f5736e95SDavid du Colombier 				DBG_DEC(tLength);
499f5736e95SDavid du Colombier 				return FALSE;
500f5736e95SDavid du Colombier 			}
501f5736e95SDavid du Colombier 			pImg->iWidth = (int)ulNextLongBE(pFile);
502f5736e95SDavid du Colombier 			pImg->iHeight = (int)ulNextLongBE(pFile);
503f5736e95SDavid du Colombier 			pImg->uiBitsPerComponent = (UINT)iNextByte(pFile);
504f5736e95SDavid du Colombier 			iTmp = iNextByte(pFile);
505f5736e95SDavid du Colombier 			NO_DBG_HEX(iTmp);
506f5736e95SDavid du Colombier 			pImg->bColorImage = (iTmp & PNG_CB_COLOR) != 0;
507f5736e95SDavid du Colombier 			bHasPalette = (iTmp & PNG_CB_PALETTE) != 0;
508f5736e95SDavid du Colombier 			bHasAlpha = (iTmp & PNG_CB_ALPHA) != 0;
509f5736e95SDavid du Colombier 			if (bHasPalette && pImg->uiBitsPerComponent > 8) {
510f5736e95SDavid du Colombier 				/* This should not happen */
511f5736e95SDavid du Colombier 				return FALSE;
512f5736e95SDavid du Colombier 			}
513f5736e95SDavid du Colombier 			pImg->iComponents =
514f5736e95SDavid du Colombier 				(bHasPalette || !pImg->bColorImage) ? 1 : 3;
515f5736e95SDavid du Colombier 			if (bHasAlpha) {
516f5736e95SDavid du Colombier 				pImg->iComponents++;
517f5736e95SDavid du Colombier 			}
518f5736e95SDavid du Colombier 			iCompressionMethod = iNextByte(pFile);
519f5736e95SDavid du Colombier 			if (iCompressionMethod != 0) {
520f5736e95SDavid du Colombier 				DBG_DEC(iCompressionMethod);
521f5736e95SDavid du Colombier 				return FALSE;
522f5736e95SDavid du Colombier 			}
523f5736e95SDavid du Colombier 			iFilterMethod = iNextByte(pFile);
524f5736e95SDavid du Colombier 			if (iFilterMethod != 0) {
525f5736e95SDavid du Colombier 				DBG_DEC(iFilterMethod);
526f5736e95SDavid du Colombier 				return FALSE;
527f5736e95SDavid du Colombier 			}
528f5736e95SDavid du Colombier 			iInterlaceMethod = iNextByte(pFile);
529f5736e95SDavid du Colombier 			if (iInterlaceMethod != 0) {
530f5736e95SDavid du Colombier 				DBG_DEC(iInterlaceMethod);
531f5736e95SDavid du Colombier 				return FALSE;
532f5736e95SDavid du Colombier 			}
533f5736e95SDavid du Colombier 			pImg->iColorsUsed = 0;
534f5736e95SDavid du Colombier 			(void)tSkipBytes(pFile, tLength - 13 + 4);
535f5736e95SDavid du Colombier 			break;
536f5736e95SDavid du Colombier 		case PNG_CN_PLTE:
537f5736e95SDavid du Colombier 			if (!bHasPalette) {
538f5736e95SDavid du Colombier 				return FALSE;
539f5736e95SDavid du Colombier 			}
540f5736e95SDavid du Colombier 			if (!bFillPalettePNG(pFile, pImg, tLength)) {
541f5736e95SDavid du Colombier 				return FALSE;
542f5736e95SDavid du Colombier 			}
543f5736e95SDavid du Colombier 			(void)tSkipBytes(pFile, 4);
544f5736e95SDavid du Colombier 			break;
545f5736e95SDavid du Colombier 		default:
546f5736e95SDavid du Colombier 			(void)tSkipBytes(pFile, tLength + 4);
547f5736e95SDavid du Colombier 			break;
548f5736e95SDavid du Colombier 		}
549f5736e95SDavid du Colombier 	}
550f5736e95SDavid du Colombier 
551f5736e95SDavid du Colombier 	DBG_DEC(pImg->iWidth);
552f5736e95SDavid du Colombier 	DBG_DEC(pImg->iHeight);
553f5736e95SDavid du Colombier 	DBG_DEC(pImg->uiBitsPerComponent);
554f5736e95SDavid du Colombier 	DBG_DEC(pImg->iColorsUsed);
555f5736e95SDavid du Colombier 	DBG_DEC(pImg->iComponents);
556f5736e95SDavid du Colombier 
557f5736e95SDavid du Colombier 	/* Do some sanity checks with the parameters */
558f5736e95SDavid du Colombier 	if (pImg->iWidth <= 0 || pImg->iHeight <= 0) {
559f5736e95SDavid du Colombier 		return FALSE;
560f5736e95SDavid du Colombier 	}
561f5736e95SDavid du Colombier 
562f5736e95SDavid du Colombier 	if (pImg->uiBitsPerComponent != 1 && pImg->uiBitsPerComponent != 2 &&
563f5736e95SDavid du Colombier 	    pImg->uiBitsPerComponent != 4 && pImg->uiBitsPerComponent != 8 &&
564f5736e95SDavid du Colombier 	    pImg->uiBitsPerComponent != 16) {
565f5736e95SDavid du Colombier 		DBG_DEC(pImg->uiBitsPerComponent);
566f5736e95SDavid du Colombier 		return  FALSE;
567f5736e95SDavid du Colombier 	}
568f5736e95SDavid du Colombier 
569f5736e95SDavid du Colombier 	if (pImg->iComponents != 1 && pImg->iComponents != 3) {
570f5736e95SDavid du Colombier 		/* Not supported */
571f5736e95SDavid du Colombier 		DBG_DEC(pImg->iComponents);
572f5736e95SDavid du Colombier 		return FALSE;
573f5736e95SDavid du Colombier 	}
574f5736e95SDavid du Colombier 
575f5736e95SDavid du Colombier 	if (pImg->uiBitsPerComponent > 8) {
576f5736e95SDavid du Colombier 		/* Not supported */
577f5736e95SDavid du Colombier 		DBG_DEC(pImg->uiBitsPerComponent);
578f5736e95SDavid du Colombier 		return FALSE;
579f5736e95SDavid du Colombier 	}
580f5736e95SDavid du Colombier 
581f5736e95SDavid du Colombier 	if (pImg->iColorsUsed == 0 &&
582f5736e95SDavid du Colombier 	    pImg->iComponents == 1 &&
583f5736e95SDavid du Colombier 	    pImg->uiBitsPerComponent <= 4) {
584f5736e95SDavid du Colombier 		/*
585f5736e95SDavid du Colombier 		 * No palette is supplied, but PostScript needs one in these
586f5736e95SDavid du Colombier 		 * cases, so we add a default palette here
587f5736e95SDavid du Colombier 		 */
588f5736e95SDavid du Colombier 		pImg->iColorsUsed = 1 << pImg->uiBitsPerComponent;
589f5736e95SDavid du Colombier 		iIncrement = 0xff / (pImg->iColorsUsed - 1);
590f5736e95SDavid du Colombier 		for (iIndex = 0, iColor = 0x00;
591f5736e95SDavid du Colombier 		     iIndex < pImg->iColorsUsed;
592f5736e95SDavid du Colombier 		     iIndex++, iColor += iIncrement) {
593f5736e95SDavid du Colombier 			pImg->aucPalette[iIndex][0] = (UCHAR)iColor;
594f5736e95SDavid du Colombier 			pImg->aucPalette[iIndex][1] = (UCHAR)iColor;
595f5736e95SDavid du Colombier 			pImg->aucPalette[iIndex][2] = (UCHAR)iColor;
596f5736e95SDavid du Colombier 		}
597f5736e95SDavid du Colombier 		/* Just to be sure */
598f5736e95SDavid du Colombier 		pImg->bColorImage = FALSE;
599f5736e95SDavid du Colombier 	}
600f5736e95SDavid du Colombier 
601f5736e95SDavid du Colombier 	pImg->eCompression = compression_zlib;
602f5736e95SDavid du Colombier 
603f5736e95SDavid du Colombier 	return TRUE;
604f5736e95SDavid du Colombier } /* end of bExaminePNG */
605f5736e95SDavid du Colombier 
606f5736e95SDavid du Colombier /*
607f5736e95SDavid du Colombier  * bExamineWMF - Examine a WMF header
608f5736e95SDavid du Colombier  *
609f5736e95SDavid du Colombier  * return TRUE if successful, otherwise FALSE
610f5736e95SDavid du Colombier  */
611f5736e95SDavid du Colombier static BOOL
bExamineWMF(FILE * pFile,imagedata_type * pImg)612f5736e95SDavid du Colombier bExamineWMF(FILE *pFile, imagedata_type *pImg)
613f5736e95SDavid du Colombier {
614f5736e95SDavid du Colombier 	ULONG	ulFileSize, ulMaxRecord, ulMagic;
615f5736e95SDavid du Colombier 	USHORT	usType, usHeaderSize, usVersion, usNoObjects;
616f5736e95SDavid du Colombier 
617f5736e95SDavid du Colombier 	usType = usNextWord(pFile);
618f5736e95SDavid du Colombier 	usHeaderSize = usNextWord(pFile);
619f5736e95SDavid du Colombier 	ulMagic = ((ULONG)usHeaderSize << 16) | (ULONG)usType;
620f5736e95SDavid du Colombier 	usVersion = usNextWord(pFile);
621f5736e95SDavid du Colombier 	ulFileSize = ulNextLong(pFile);
622f5736e95SDavid du Colombier 	usNoObjects = usNextWord(pFile);
623f5736e95SDavid du Colombier 	ulMaxRecord = ulNextLong(pFile);
624f5736e95SDavid du Colombier 
625f5736e95SDavid du Colombier 	DBG_HEX(ulMagic);
626f5736e95SDavid du Colombier 	DBG_DEC(usType);
627f5736e95SDavid du Colombier 	DBG_DEC(usHeaderSize);
628f5736e95SDavid du Colombier 	DBG_HEX(usVersion);
629f5736e95SDavid du Colombier 	DBG_DEC(ulFileSize);
630f5736e95SDavid du Colombier 	DBG_DEC(usNoObjects);
631f5736e95SDavid du Colombier 	DBG_DEC(ulMaxRecord);
632f5736e95SDavid du Colombier 
633f5736e95SDavid du Colombier 	return FALSE;
634f5736e95SDavid du Colombier } /* end of bExamineWMF */
635f5736e95SDavid du Colombier 
636f5736e95SDavid du Colombier #if !defined(__riscos)
637f5736e95SDavid du Colombier /*
638f5736e95SDavid du Colombier  * vImage2Papersize - make sure the image fits on the paper
639f5736e95SDavid du Colombier  *
640f5736e95SDavid du Colombier  * This function should not be needed if Word would do a proper job
641f5736e95SDavid du Colombier  */
642f5736e95SDavid du Colombier static void
vImage2Papersize(imagedata_type * pImg)643f5736e95SDavid du Colombier vImage2Papersize(imagedata_type *pImg)
644f5736e95SDavid du Colombier {
645f5736e95SDavid du Colombier 	static int	iNetPageHeight = -1;
646f5736e95SDavid du Colombier 	static int	iNetPageWidth = -1;
647f5736e95SDavid du Colombier 	options_type	tOptions;
648f5736e95SDavid du Colombier         double  dVerFactor, dHorFactor, dFactor;
649f5736e95SDavid du Colombier 
650f5736e95SDavid du Colombier 	DBG_MSG("vImage2Papersize");
651f5736e95SDavid du Colombier 
652f5736e95SDavid du Colombier 	fail(pImg == NULL);
653f5736e95SDavid du Colombier 
654f5736e95SDavid du Colombier 	if (iNetPageHeight < 0 || iNetPageWidth < 0) {
655f5736e95SDavid du Colombier 		/* Get the page dimensions from the options */
656f5736e95SDavid du Colombier 		vGetOptions(&tOptions);
657f5736e95SDavid du Colombier 		/* Add 999 to err on the save side */
658f5736e95SDavid du Colombier 		iNetPageHeight = tOptions.iPageHeight -
659f5736e95SDavid du Colombier 				(lDrawUnits2MilliPoints(
660f5736e95SDavid du Colombier 					PS_TOP_MARGIN + PS_BOTTOM_MARGIN) +
661f5736e95SDavid du Colombier 					999) / 1000;
662f5736e95SDavid du Colombier 		iNetPageWidth = tOptions.iPageWidth -
663f5736e95SDavid du Colombier 				(lDrawUnits2MilliPoints(
664f5736e95SDavid du Colombier 					PS_LEFT_MARGIN + PS_RIGHT_MARGIN) +
665f5736e95SDavid du Colombier 					999) / 1000;
666f5736e95SDavid du Colombier 		DBG_DEC(iNetPageHeight);
667f5736e95SDavid du Colombier 		DBG_DEC(iNetPageWidth);
668f5736e95SDavid du Colombier 	}
669f5736e95SDavid du Colombier 
670f5736e95SDavid du Colombier 	if (pImg->iVerSizeScaled < iNetPageHeight &&
671f5736e95SDavid du Colombier 	    pImg->iHorSizeScaled < iNetPageWidth) {
672f5736e95SDavid du Colombier 		/* The image fits on the paper */
673f5736e95SDavid du Colombier 		return;
674f5736e95SDavid du Colombier 	}
675f5736e95SDavid du Colombier 
676f5736e95SDavid du Colombier 	dVerFactor = (double)iNetPageHeight / (double)pImg->iVerSizeScaled;
677f5736e95SDavid du Colombier 	dHorFactor = (double)iNetPageWidth / (double)pImg->iHorSizeScaled;
678f5736e95SDavid du Colombier         dFactor = min(dVerFactor, dHorFactor);
679f5736e95SDavid du Colombier         DBG_FLT(dFactor);
680f5736e95SDavid du Colombier         /* Round down, just to be on the save side */
681f5736e95SDavid du Colombier         pImg->iVerSizeScaled = (int)(pImg->iVerSizeScaled * dFactor);
682f5736e95SDavid du Colombier         pImg->iHorSizeScaled = (int)(pImg->iHorSizeScaled * dFactor);
683f5736e95SDavid du Colombier } /* end of vImage2Papersize */
684f5736e95SDavid du Colombier #endif /* !__riscos */
685f5736e95SDavid du Colombier 
686f5736e95SDavid du Colombier /*
687f5736e95SDavid du Colombier  * tFind6Image - skip until the image is found
688f5736e95SDavid du Colombier  *
689f5736e95SDavid du Colombier  * Find the image in Word 6/7 files
690f5736e95SDavid du Colombier  *
691f5736e95SDavid du Colombier  * returns the new position when a image is found, otherwise -1
692f5736e95SDavid du Colombier  */
693f5736e95SDavid du Colombier static size_t
tFind6Image(FILE * pFile,size_t tPosition,size_t tLength,imagetype_enum * peImageType)694f5736e95SDavid du Colombier tFind6Image(FILE *pFile, size_t tPosition, size_t tLength,
695f5736e95SDavid du Colombier 	imagetype_enum *peImageType)
696f5736e95SDavid du Colombier {
697f5736e95SDavid du Colombier 	ULONG	ulMarker;
698*25b329d5SDavid du Colombier 	size_t	tRecordLength, tToSkip;
699f5736e95SDavid du Colombier 	USHORT	usMarker;
700f5736e95SDavid du Colombier 
701f5736e95SDavid du Colombier 	fail(pFile == NULL);
702f5736e95SDavid du Colombier 	fail(peImageType == NULL);
703f5736e95SDavid du Colombier 
704f5736e95SDavid du Colombier 	*peImageType = imagetype_is_unknown;
705f5736e95SDavid du Colombier 	if (tPosition + 18 >= tLength) {
706f5736e95SDavid du Colombier 		return (size_t)-1;
707f5736e95SDavid du Colombier 	}
708f5736e95SDavid du Colombier 
709f5736e95SDavid du Colombier 	ulMarker = ulNextLong(pFile);
710f5736e95SDavid du Colombier 	if (ulMarker != 0x00090001) {
711f5736e95SDavid du Colombier 		DBG_HEX(ulMarker);
712f5736e95SDavid du Colombier 		return (size_t)-1;
713f5736e95SDavid du Colombier 	}
714f5736e95SDavid du Colombier 	usMarker = usNextWord(pFile);
715f5736e95SDavid du Colombier 	if (usMarker != 0x0300) {
716f5736e95SDavid du Colombier 		DBG_HEX(usMarker);
717f5736e95SDavid du Colombier 		return (size_t)-1;
718f5736e95SDavid du Colombier 	}
719f5736e95SDavid du Colombier 	(void)tSkipBytes(pFile, 10);
720f5736e95SDavid du Colombier 	usMarker = usNextWord(pFile);
721f5736e95SDavid du Colombier 	if (usMarker != 0x0000) {
722f5736e95SDavid du Colombier 		DBG_HEX(usMarker);
723f5736e95SDavid du Colombier 		return (size_t)-1;
724f5736e95SDavid du Colombier 	}
725f5736e95SDavid du Colombier 	tPosition += 18;
726f5736e95SDavid du Colombier 
727f5736e95SDavid du Colombier 	while (tPosition + 6 <= tLength) {
728*25b329d5SDavid du Colombier 		tRecordLength = (size_t)ulNextLong(pFile);
729f5736e95SDavid du Colombier 		usMarker = usNextWord(pFile);
730f5736e95SDavid du Colombier 		tPosition += 6;
731*25b329d5SDavid du Colombier 		NO_DBG_DEC(tRecordLength);
732f5736e95SDavid du Colombier 		NO_DBG_HEX(usMarker);
733f5736e95SDavid du Colombier 		switch (usMarker) {
734f5736e95SDavid du Colombier 		case 0x0000:
735f5736e95SDavid du Colombier 			DBG_HEX(ulGetDataOffset(pFile));
736f5736e95SDavid du Colombier 			return (size_t)-1;
737f5736e95SDavid du Colombier 		case 0x0b41:
738f5736e95SDavid du Colombier 			DBG_MSG("DIB");
739f5736e95SDavid du Colombier 			*peImageType = imagetype_is_dib;
740f5736e95SDavid du Colombier 			tPosition += tSkipBytes(pFile, 20);
741f5736e95SDavid du Colombier 			return tPosition;
742f5736e95SDavid du Colombier 		case 0x0f43:
743f5736e95SDavid du Colombier 			DBG_MSG("DIB");
744f5736e95SDavid du Colombier 			*peImageType = imagetype_is_dib;
745f5736e95SDavid du Colombier 			tPosition += tSkipBytes(pFile, 22);
746f5736e95SDavid du Colombier 			return tPosition;
747f5736e95SDavid du Colombier 		default:
748*25b329d5SDavid du Colombier 			if (tRecordLength < 3) {
749f5736e95SDavid du Colombier 				break;
750f5736e95SDavid du Colombier 			}
751*25b329d5SDavid du Colombier 			if (tRecordLength > SIZE_T_MAX / 2) {
752f5736e95SDavid du Colombier 				/*
753f5736e95SDavid du Colombier 				 * No need to compute the number of bytes
754f5736e95SDavid du Colombier 				 * to skip
755f5736e95SDavid du Colombier 				 */
756*25b329d5SDavid du Colombier 				DBG_DEC(tRecordLength);
757*25b329d5SDavid du Colombier 				DBG_HEX(tRecordLength);
758f5736e95SDavid du Colombier 				DBG_FIXME();
759f5736e95SDavid du Colombier 				return (size_t)-1;
760f5736e95SDavid du Colombier 			}
761*25b329d5SDavid du Colombier 			tToSkip = tRecordLength * 2 - 6;
762f5736e95SDavid du Colombier 			if (tToSkip > tLength - tPosition) {
763f5736e95SDavid du Colombier 				/* You can't skip this number of bytes */
764f5736e95SDavid du Colombier 				DBG_DEC(tToSkip);
765f5736e95SDavid du Colombier 				DBG_DEC(tLength - tPosition);
766f5736e95SDavid du Colombier 				return (size_t)-1;
767f5736e95SDavid du Colombier 			}
768f5736e95SDavid du Colombier 			tPosition += tSkipBytes(pFile, tToSkip);
769f5736e95SDavid du Colombier 			break;
770f5736e95SDavid du Colombier 		}
771f5736e95SDavid du Colombier 	}
772f5736e95SDavid du Colombier 
773f5736e95SDavid du Colombier 	return (size_t)-1;
774f5736e95SDavid du Colombier } /* end of tFind6Image */
775f5736e95SDavid du Colombier 
776f5736e95SDavid du Colombier /*
777f5736e95SDavid du Colombier  * tFind8Image - skip until the image is found
778f5736e95SDavid du Colombier  *
779f5736e95SDavid du Colombier  * Find the image in Word 8/9/10 files
780f5736e95SDavid du Colombier  *
781f5736e95SDavid du Colombier  * returns the new position when a image is found, otherwise -1
782f5736e95SDavid du Colombier  */
783f5736e95SDavid du Colombier static size_t
tFind8Image(FILE * pFile,size_t tPosition,size_t tLength,imagetype_enum * peImageType)784f5736e95SDavid du Colombier tFind8Image(FILE *pFile, size_t tPosition, size_t tLength,
785f5736e95SDavid du Colombier 	imagetype_enum *peImageType)
786f5736e95SDavid du Colombier {
787*25b329d5SDavid du Colombier 	size_t	tRecordLength, tNameLen;
788*25b329d5SDavid du Colombier 	USHORT	usRecordVersion, usRecordType, usRecordInstance;
789*25b329d5SDavid du Colombier 	USHORT	usTmp;
790f5736e95SDavid du Colombier 
791f5736e95SDavid du Colombier 	fail(pFile == NULL);
792f5736e95SDavid du Colombier 	fail(peImageType == NULL);
793f5736e95SDavid du Colombier 
794f5736e95SDavid du Colombier 	*peImageType = imagetype_is_unknown;
795f5736e95SDavid du Colombier 	while (tPosition + 8 <= tLength) {
796*25b329d5SDavid du Colombier 		usTmp = usNextWord(pFile);
797*25b329d5SDavid du Colombier 		usRecordVersion = usTmp & 0x000f;
798*25b329d5SDavid du Colombier 		usRecordInstance = usTmp >> 4;
799*25b329d5SDavid du Colombier 		usRecordType = usNextWord(pFile);
800*25b329d5SDavid du Colombier 		tRecordLength = (size_t)ulNextLong(pFile);
801f5736e95SDavid du Colombier 		tPosition += 8;
802*25b329d5SDavid du Colombier 		NO_DBG_HEX(usRecordVersion);
803*25b329d5SDavid du Colombier 		NO_DBG_HEX(usRecordInstance);
804*25b329d5SDavid du Colombier 		NO_DBG_HEX(usRecordType);
805*25b329d5SDavid du Colombier 		NO_DBG_DEC(tRecordLength);
806*25b329d5SDavid du Colombier 		switch (usRecordType) {
807f5736e95SDavid du Colombier 		case 0xf000: case 0xf001: case 0xf002: case 0xf003:
808f5736e95SDavid du Colombier 		case 0xf004: case 0xf005:
809f5736e95SDavid du Colombier 			break;
810f5736e95SDavid du Colombier 		case 0xf007:
811f5736e95SDavid du Colombier 			tPosition += tSkipBytes(pFile, 33);
812f5736e95SDavid du Colombier 			tNameLen = (size_t)iNextByte(pFile);
813f5736e95SDavid du Colombier 			tPosition++;
814f5736e95SDavid du Colombier 			DBG_DEC_C(tNameLen != 0, tNameLen);
815f5736e95SDavid du Colombier 			tPosition += tSkipBytes(pFile, 2 + tNameLen * 2);
816f5736e95SDavid du Colombier 			break;
817f5736e95SDavid du Colombier 		case 0xf008:
818f5736e95SDavid du Colombier 			tPosition += tSkipBytes(pFile, 8);
819f5736e95SDavid du Colombier 			break;
820f5736e95SDavid du Colombier 		case 0xf009:
821f5736e95SDavid du Colombier 			tPosition += tSkipBytes(pFile, 16);
822f5736e95SDavid du Colombier 			break;
823f5736e95SDavid du Colombier 		case 0xf006: case 0xf00a: case 0xf00b: case 0xf00d:
824f5736e95SDavid du Colombier 		case 0xf00e: case 0xf00f: case 0xf010: case 0xf011:
825f5736e95SDavid du Colombier 		case 0xf122:
826*25b329d5SDavid du Colombier 			tPosition += tSkipBytes(pFile, tRecordLength);
827f5736e95SDavid du Colombier 			break;
828f5736e95SDavid du Colombier 		case 0xf01a:
829f5736e95SDavid du Colombier 			DBG_MSG("EMF");
830f5736e95SDavid du Colombier 			*peImageType = imagetype_is_emf;
831*25b329d5SDavid du Colombier 			tPosition += tSkipBytes(pFile, 50);
832*25b329d5SDavid du Colombier 			if ((usRecordInstance ^ MSOBI_EMF) == 1) {
833*25b329d5SDavid du Colombier 				tPosition += tSkipBytes(pFile, 16);
834*25b329d5SDavid du Colombier 			}
835f5736e95SDavid du Colombier 			return tPosition;
836f5736e95SDavid du Colombier 		case 0xf01b:
837f5736e95SDavid du Colombier 			DBG_MSG("WMF");
838f5736e95SDavid du Colombier 			*peImageType = imagetype_is_wmf;
839*25b329d5SDavid du Colombier 			tPosition += tSkipBytes(pFile, 50);
840*25b329d5SDavid du Colombier 			if ((usRecordInstance ^ MSOBI_WMF) == 1) {
841*25b329d5SDavid du Colombier 				tPosition += tSkipBytes(pFile, 16);
842*25b329d5SDavid du Colombier 			}
843f5736e95SDavid du Colombier 			return tPosition;
844f5736e95SDavid du Colombier 		case 0xf01c:
845f5736e95SDavid du Colombier 			DBG_MSG("PICT");
846f5736e95SDavid du Colombier 			*peImageType = imagetype_is_pict;
847*25b329d5SDavid du Colombier 			tPosition += tSkipBytes(pFile, 50);
848*25b329d5SDavid du Colombier 			if ((usRecordInstance ^ MSOBI_PICT) == 1) {
849*25b329d5SDavid du Colombier 				tPosition += tSkipBytes(pFile, 16);
850*25b329d5SDavid du Colombier 			}
851f5736e95SDavid du Colombier 			return tPosition;
852f5736e95SDavid du Colombier 		case 0xf01d:
853f5736e95SDavid du Colombier 			DBG_MSG("JPEG");
854f5736e95SDavid du Colombier 			*peImageType = imagetype_is_jpeg;
855*25b329d5SDavid du Colombier 			tPosition += tSkipBytes(pFile, 17);
856*25b329d5SDavid du Colombier 			if ((usRecordInstance ^ MSOBI_JPEG) == 1) {
857*25b329d5SDavid du Colombier 				tPosition += tSkipBytes(pFile, 16);
858*25b329d5SDavid du Colombier 			}
859f5736e95SDavid du Colombier 			return tPosition;
860f5736e95SDavid du Colombier 		case 0xf01e:
861f5736e95SDavid du Colombier 			DBG_MSG("PNG");
862f5736e95SDavid du Colombier 			*peImageType = imagetype_is_png;
863*25b329d5SDavid du Colombier 			tPosition += tSkipBytes(pFile, 17);
864*25b329d5SDavid du Colombier 			if ((usRecordInstance ^ MSOBI_PNG) == 1) {
865*25b329d5SDavid du Colombier 				tPosition += tSkipBytes(pFile, 16);
866*25b329d5SDavid du Colombier 			}
867f5736e95SDavid du Colombier 			return tPosition;
868f5736e95SDavid du Colombier 		case 0xf01f:
869f5736e95SDavid du Colombier 			DBG_MSG("DIB");
870f5736e95SDavid du Colombier 			/* DIB is a BMP minus its 14 byte header */
871f5736e95SDavid du Colombier 			*peImageType = imagetype_is_dib;
872*25b329d5SDavid du Colombier 			tPosition += tSkipBytes(pFile, 17);
873*25b329d5SDavid du Colombier 			if ((usRecordInstance ^ MSOBI_DIB) == 1) {
874*25b329d5SDavid du Colombier 				tPosition += tSkipBytes(pFile, 16);
875*25b329d5SDavid du Colombier 			}
876f5736e95SDavid du Colombier 			return tPosition;
877f5736e95SDavid du Colombier 		case 0xf00c:
878f5736e95SDavid du Colombier 		default:
879*25b329d5SDavid du Colombier 			DBG_HEX(usRecordType);
880*25b329d5SDavid du Colombier 			DBG_DEC_C(tRecordLength % 4 != 0, tRecordLength);
881f5736e95SDavid du Colombier 			DBG_FIXME();
882f5736e95SDavid du Colombier 			return (size_t)-1;
883f5736e95SDavid du Colombier 		}
884f5736e95SDavid du Colombier 	}
885f5736e95SDavid du Colombier 
886f5736e95SDavid du Colombier 	return (size_t)-1;
887f5736e95SDavid du Colombier } /* end of tFind8Image */
888f5736e95SDavid du Colombier 
889f5736e95SDavid du Colombier /*
890f5736e95SDavid du Colombier  * eExamineImage - Examine the image
891f5736e95SDavid du Colombier  *
892f5736e95SDavid du Colombier  * Returns an indication of the amount of information found
893f5736e95SDavid du Colombier  */
894f5736e95SDavid du Colombier image_info_enum
eExamineImage(FILE * pFile,ULONG ulFileOffsetImage,imagedata_type * pImg)895f5736e95SDavid du Colombier eExamineImage(FILE *pFile, ULONG ulFileOffsetImage, imagedata_type *pImg)
896f5736e95SDavid du Colombier {
897f5736e95SDavid du Colombier 	long	lTmp;
898f5736e95SDavid du Colombier 	size_t	tWordHeaderLen, tLength, tPos;
899f5736e95SDavid du Colombier 	int	iType, iHorSize, iVerSize;
900f5736e95SDavid du Colombier 	USHORT	usHorScalingFactor, usVerScalingFactor;
901f5736e95SDavid du Colombier 
902f5736e95SDavid du Colombier 	if (ulFileOffsetImage == FC_INVALID) {
903f5736e95SDavid du Colombier 		return image_no_information;
904f5736e95SDavid du Colombier 	}
905f5736e95SDavid du Colombier 	DBG_HEX(ulFileOffsetImage);
906f5736e95SDavid du Colombier 
907f5736e95SDavid du Colombier 	if (!bSetDataOffset(pFile, ulFileOffsetImage)) {
908f5736e95SDavid du Colombier 		return image_no_information;
909f5736e95SDavid du Colombier 	}
910f5736e95SDavid du Colombier 
911f5736e95SDavid du Colombier 	tLength = (size_t)ulNextLong(pFile);
912f5736e95SDavid du Colombier 	DBG_DEC(tLength);
913f5736e95SDavid du Colombier 	if (tLength < 46) {
914f5736e95SDavid du Colombier 		/* Smaller than the smallest known header */
915f5736e95SDavid du Colombier 		DBG_FIXME();
916f5736e95SDavid du Colombier 		return image_no_information;
917f5736e95SDavid du Colombier 	}
918f5736e95SDavid du Colombier 	tWordHeaderLen = (size_t)usNextWord(pFile);
919f5736e95SDavid du Colombier 	DBG_DEC(tWordHeaderLen);
920f5736e95SDavid du Colombier 	fail(tWordHeaderLen != 46 &&
921f5736e95SDavid du Colombier 		tWordHeaderLen != 58 &&
922f5736e95SDavid du Colombier 		tWordHeaderLen != 68);
923f5736e95SDavid du Colombier 
924f5736e95SDavid du Colombier 	if (tLength < tWordHeaderLen) {
925f5736e95SDavid du Colombier 		/* Smaller than the current header */
926f5736e95SDavid du Colombier 		return image_no_information;
927f5736e95SDavid du Colombier 	}
928f5736e95SDavid du Colombier 	iType = (int)usNextWord(pFile);
929f5736e95SDavid du Colombier 	DBG_DEC(iType);
930f5736e95SDavid du Colombier 	(void)tSkipBytes(pFile, 28 - 8);
931f5736e95SDavid du Colombier 
932f5736e95SDavid du Colombier 	lTmp = lTwips2MilliPoints(usNextWord(pFile));
933f5736e95SDavid du Colombier 	iHorSize = (int)(lTmp / 1000);
934f5736e95SDavid du Colombier 	if (lTmp % 1000 != 0) {
935f5736e95SDavid du Colombier 		iHorSize++;
936f5736e95SDavid du Colombier 	}
937f5736e95SDavid du Colombier 	DBG_DEC(iHorSize);
938f5736e95SDavid du Colombier 	lTmp = lTwips2MilliPoints(usNextWord(pFile));
939f5736e95SDavid du Colombier 	iVerSize = (int)(lTmp / 1000);
940f5736e95SDavid du Colombier 	if (lTmp % 1000 != 0) {
941f5736e95SDavid du Colombier 		iVerSize++;
942f5736e95SDavid du Colombier 	}
943f5736e95SDavid du Colombier 	DBG_DEC(iVerSize);
944f5736e95SDavid du Colombier 
945f5736e95SDavid du Colombier 	usHorScalingFactor = usNextWord(pFile);
946f5736e95SDavid du Colombier 	DBG_DEC(usHorScalingFactor);
947f5736e95SDavid du Colombier 	usVerScalingFactor = usNextWord(pFile);
948f5736e95SDavid du Colombier 	DBG_DEC(usVerScalingFactor);
949f5736e95SDavid du Colombier 
950f5736e95SDavid du Colombier 	/* Sanity checks */
951f5736e95SDavid du Colombier 	lTmp = (long)iHorSize * (long)usHorScalingFactor;
952f5736e95SDavid du Colombier 	if (lTmp < 2835) {
953f5736e95SDavid du Colombier 		/* This image would be less than 1 millimeter wide */
954f5736e95SDavid du Colombier 		DBG_DEC(lTmp);
955f5736e95SDavid du Colombier 		return image_no_information;
956f5736e95SDavid du Colombier 	}
957f5736e95SDavid du Colombier 	lTmp = (long)iVerSize * (long)usVerScalingFactor;
958f5736e95SDavid du Colombier 	if (lTmp < 2835) {
959f5736e95SDavid du Colombier 		/* This image would be less than 1 millimeter high */
960f5736e95SDavid du Colombier 		DBG_DEC(lTmp);
961f5736e95SDavid du Colombier 		return image_no_information;
962f5736e95SDavid du Colombier 	}
963f5736e95SDavid du Colombier 
964f5736e95SDavid du Colombier 	/* Skip the rest of the header */
965f5736e95SDavid du Colombier 	(void)tSkipBytes(pFile, tWordHeaderLen - 36);
966f5736e95SDavid du Colombier 	tPos = tWordHeaderLen;
967f5736e95SDavid du Colombier 
968f5736e95SDavid du Colombier 	(void)memset(pImg, 0, sizeof(*pImg));
969f5736e95SDavid du Colombier 
970f5736e95SDavid du Colombier 	switch (iType) {
971f5736e95SDavid du Colombier 	case   7:
972f5736e95SDavid du Colombier 	case   8:
973f5736e95SDavid du Colombier 		tPos = tFind6Image(pFile, tPos, tLength, &pImg->eImageType);
974f5736e95SDavid du Colombier 		if (tPos == (size_t)-1) {
975f5736e95SDavid du Colombier 			/* No image found */
976f5736e95SDavid du Colombier 			return image_no_information;
977f5736e95SDavid du Colombier 		}
978f5736e95SDavid du Colombier 		DBG_HEX(tPos);
979f5736e95SDavid du Colombier 		break;
980f5736e95SDavid du Colombier 	case  94:	/* Word 6/7, no image just a pathname */
981f5736e95SDavid du Colombier 		pImg->eImageType = imagetype_is_external;
982f5736e95SDavid du Colombier 		DBG_HEX(ulFileOffsetImage + tPos);
983f5736e95SDavid du Colombier 		break;
984f5736e95SDavid du Colombier 	case 100:
985f5736e95SDavid du Colombier 		tPos = tFind8Image(pFile, tPos, tLength, &pImg->eImageType);
986f5736e95SDavid du Colombier 		if (tPos == (size_t)-1) {
987f5736e95SDavid du Colombier 			/* No image found */
988f5736e95SDavid du Colombier 			return image_no_information;
989f5736e95SDavid du Colombier 		}
990f5736e95SDavid du Colombier 		DBG_HEX(tPos);
991f5736e95SDavid du Colombier 		break;
992f5736e95SDavid du Colombier 	case 102:	/* Word 8/9/10, no image just a pathname or URL */
993f5736e95SDavid du Colombier 		pImg->eImageType = imagetype_is_external;
994f5736e95SDavid du Colombier 		DBG_HEX(ulFileOffsetImage + tPos);
995f5736e95SDavid du Colombier 		break;
996f5736e95SDavid du Colombier 	default:
997f5736e95SDavid du Colombier 		DBG_DEC(iType);
998f5736e95SDavid du Colombier 		DBG_HEX(ulFileOffsetImage + tPos);
999f5736e95SDavid du Colombier 		DBG_FIXME();
1000f5736e95SDavid du Colombier 		return image_no_information;
1001f5736e95SDavid du Colombier 	}
1002f5736e95SDavid du Colombier 
1003f5736e95SDavid du Colombier 	/* Minimal information is now available */
1004f5736e95SDavid du Colombier 	pImg->tLength = tLength;
1005f5736e95SDavid du Colombier 	pImg->tPosition = tPos;
1006f5736e95SDavid du Colombier 	pImg->iHorSizeScaled =
1007f5736e95SDavid du Colombier 		(int)(((long)iHorSize * (long)usHorScalingFactor + 500) / 1000);
1008f5736e95SDavid du Colombier 	pImg->iVerSizeScaled =
1009f5736e95SDavid du Colombier 		(int)(((long)iVerSize * (long)usVerScalingFactor + 500) / 1000);
1010f5736e95SDavid du Colombier #if !defined(__riscos)
1011f5736e95SDavid du Colombier 	vImage2Papersize(pImg);
1012f5736e95SDavid du Colombier #endif /* !__riscos */
1013f5736e95SDavid du Colombier 
1014f5736e95SDavid du Colombier 	/* Image type specific examinations */
1015f5736e95SDavid du Colombier 	switch (pImg->eImageType) {
1016f5736e95SDavid du Colombier 	case imagetype_is_dib:
1017f5736e95SDavid du Colombier 		if (bExamineDIB(pFile, pImg)) {
1018f5736e95SDavid du Colombier 			return image_full_information;
1019f5736e95SDavid du Colombier 		}
1020f5736e95SDavid du Colombier 		return image_minimal_information;
1021f5736e95SDavid du Colombier 	case imagetype_is_jpeg:
1022f5736e95SDavid du Colombier 		if (bExamineJPEG(pFile, pImg)) {
1023f5736e95SDavid du Colombier 			return image_full_information;
1024f5736e95SDavid du Colombier 		}
1025f5736e95SDavid du Colombier 		return image_minimal_information;
1026f5736e95SDavid du Colombier 	case imagetype_is_png:
1027f5736e95SDavid du Colombier 		if (bExaminePNG(pFile, pImg)) {
1028f5736e95SDavid du Colombier 			return image_full_information;
1029f5736e95SDavid du Colombier 		}
1030f5736e95SDavid du Colombier 		return image_minimal_information;
1031f5736e95SDavid du Colombier 	case imagetype_is_wmf:
1032f5736e95SDavid du Colombier 		if (bExamineWMF(pFile, pImg)) {
1033f5736e95SDavid du Colombier 			return image_full_information;
1034f5736e95SDavid du Colombier 		}
1035f5736e95SDavid du Colombier 		return image_minimal_information;
1036f5736e95SDavid du Colombier 	case imagetype_is_emf:
1037f5736e95SDavid du Colombier 	case imagetype_is_pict:
1038f5736e95SDavid du Colombier 	case imagetype_is_external:
1039f5736e95SDavid du Colombier 		return image_minimal_information;
1040f5736e95SDavid du Colombier 	case imagetype_is_unknown:
1041f5736e95SDavid du Colombier 	default:
1042f5736e95SDavid du Colombier 		return image_no_information;
1043f5736e95SDavid du Colombier 	}
1044f5736e95SDavid du Colombier } /* end of eExamineImage */
1045