xref: /plan9-contrib/sys/src/cmd/aux/antiword/fonts.c (revision 25b329d522281a8cdd35da0dcc08c3fc621059a9)
1f5736e95SDavid du Colombier /*
2f5736e95SDavid du Colombier  * fonts.c
3*25b329d5SDavid du Colombier  * Copyright (C) 1998-2004 A.J. van Os; Released under GNU GPL
4f5736e95SDavid du Colombier  *
5f5736e95SDavid du Colombier  * Description:
6f5736e95SDavid du Colombier  * Functions to deal with fonts (generic)
7f5736e95SDavid du Colombier  */
8f5736e95SDavid du Colombier 
9f5736e95SDavid du Colombier #include <ctype.h>
10f5736e95SDavid du Colombier #include <string.h>
11f5736e95SDavid du Colombier #include "antiword.h"
12f5736e95SDavid du Colombier 
13f5736e95SDavid du Colombier /* Maximum line length in the font file */
14f5736e95SDavid du Colombier #define FONT_LINE_LENGTH	81
15f5736e95SDavid du Colombier 
16f5736e95SDavid du Colombier /* Pitch */
17f5736e95SDavid du Colombier #define PITCH_UNKNOWN		0
18f5736e95SDavid du Colombier #define PITCH_FIXED		1
19f5736e95SDavid du Colombier #define PITCH_VARIABLE		2
20f5736e95SDavid du Colombier 
21f5736e95SDavid du Colombier /* Font Family */
22f5736e95SDavid du Colombier #define FAMILY_UNKNOWN		0
23f5736e95SDavid du Colombier #define FAMILY_ROMAN		1
24f5736e95SDavid du Colombier #define FAMILY_SWISS		2
25f5736e95SDavid du Colombier #define FAMILY_MODERN		3
26f5736e95SDavid du Colombier #define FAMILY_SCRIPT		4
27f5736e95SDavid du Colombier #define FAMILY_DECORATIVE	5
28f5736e95SDavid du Colombier 
29f5736e95SDavid du Colombier /* Font Translation Table */
30f5736e95SDavid du Colombier static size_t		tFontTableRecords = 0;
31f5736e95SDavid du Colombier static font_table_type	*pFontTable = NULL;
32f5736e95SDavid du Colombier 
33f5736e95SDavid du Colombier /*
34f5736e95SDavid du Colombier  * Find the given font in the font table
35f5736e95SDavid du Colombier  *
36f5736e95SDavid du Colombier  * returns the index into the FontTable, -1 if not found
37f5736e95SDavid du Colombier  */
38f5736e95SDavid du Colombier int
iGetFontByNumber(UCHAR ucWordFontNumber,USHORT usFontStyle)39f5736e95SDavid du Colombier iGetFontByNumber(UCHAR ucWordFontNumber, USHORT usFontStyle)
40f5736e95SDavid du Colombier {
41f5736e95SDavid du Colombier 	int	iIndex;
42f5736e95SDavid du Colombier 
43f5736e95SDavid du Colombier 	for (iIndex = 0; iIndex < (int)tFontTableRecords; iIndex++) {
44f5736e95SDavid du Colombier 		if (ucWordFontNumber == pFontTable[iIndex].ucWordFontNumber &&
45f5736e95SDavid du Colombier 		    usFontStyle == pFontTable[iIndex].usFontStyle &&
46f5736e95SDavid du Colombier 		    pFontTable[iIndex].szOurFontname[0] != '\0') {
47f5736e95SDavid du Colombier 			return iIndex;
48f5736e95SDavid du Colombier 		}
49f5736e95SDavid du Colombier 	}
50f5736e95SDavid du Colombier 	DBG_DEC(ucWordFontNumber);
51f5736e95SDavid du Colombier 	DBG_HEX(usFontStyle);
52f5736e95SDavid du Colombier 	return -1;
53f5736e95SDavid du Colombier } /* end of iGetFontByNumber */
54f5736e95SDavid du Colombier 
55f5736e95SDavid du Colombier /*
56f5736e95SDavid du Colombier  * szGetOurFontname - Get our font name
57f5736e95SDavid du Colombier  *
58f5736e95SDavid du Colombier  * return our font name from the given index, NULL if not found
59f5736e95SDavid du Colombier  */
60f5736e95SDavid du Colombier const char *
szGetOurFontname(int iIndex)61f5736e95SDavid du Colombier szGetOurFontname(int iIndex)
62f5736e95SDavid du Colombier {
63f5736e95SDavid du Colombier 	if (iIndex < 0 || iIndex >= (int)tFontTableRecords) {
64f5736e95SDavid du Colombier 		return NULL;
65f5736e95SDavid du Colombier 	}
66f5736e95SDavid du Colombier 	return pFontTable[iIndex].szOurFontname;
67f5736e95SDavid du Colombier } /* end of szGetOurFontname */
68f5736e95SDavid du Colombier 
69f5736e95SDavid du Colombier /*
70f5736e95SDavid du Colombier  * Find the given font in the font table
71f5736e95SDavid du Colombier  *
72f5736e95SDavid du Colombier  * returns the Word font number, -1 if not found
73f5736e95SDavid du Colombier  */
74f5736e95SDavid du Colombier int
iFontname2Fontnumber(const char * szOurFontname,USHORT usFontStyle)75f5736e95SDavid du Colombier iFontname2Fontnumber(const char *szOurFontname, USHORT usFontStyle)
76f5736e95SDavid du Colombier {
77f5736e95SDavid du Colombier 	int	iIndex;
78f5736e95SDavid du Colombier 
79f5736e95SDavid du Colombier 	for (iIndex = 0; iIndex < (int)tFontTableRecords; iIndex++) {
80f5736e95SDavid du Colombier 		if (pFontTable[iIndex].usFontStyle == usFontStyle &&
81f5736e95SDavid du Colombier 		    STREQ(pFontTable[iIndex].szOurFontname, szOurFontname)) {
82f5736e95SDavid du Colombier 			return (int)pFontTable[iIndex].ucWordFontNumber;
83f5736e95SDavid du Colombier 		}
84f5736e95SDavid du Colombier 	}
85f5736e95SDavid du Colombier 	return -1;
86f5736e95SDavid du Colombier } /* end of iFontname2Fontnumber */
87f5736e95SDavid du Colombier 
88f5736e95SDavid du Colombier /*
89*25b329d5SDavid du Colombier  * szGetDefaultFont - get the default font that matches the parameters
90*25b329d5SDavid du Colombier  */
91*25b329d5SDavid du Colombier static const char *
szGetDefaultFont(UCHAR ucFFN,int iEmphasis)92*25b329d5SDavid du Colombier szGetDefaultFont(UCHAR ucFFN, int iEmphasis)
93*25b329d5SDavid du Colombier {
94*25b329d5SDavid du Colombier 	UCHAR	ucPrq, ucFf;
95*25b329d5SDavid du Colombier 
96*25b329d5SDavid du Colombier 	fail(iEmphasis < 0 || iEmphasis > 3);
97*25b329d5SDavid du Colombier 
98*25b329d5SDavid du Colombier 	ucPrq = ucFFN & 0x03;
99*25b329d5SDavid du Colombier 	ucFf = (ucFFN & 0x70) >> 4;
100*25b329d5SDavid du Colombier 	NO_DBG_DEC(ucPrq);
101*25b329d5SDavid du Colombier 	NO_DBG_DEC(ucFf);
102*25b329d5SDavid du Colombier 	if (ucPrq == PITCH_FIXED) {
103*25b329d5SDavid du Colombier 		/* Set to the default monospaced font */
104*25b329d5SDavid du Colombier 		switch (iEmphasis) {
105*25b329d5SDavid du Colombier 		case 1: return FONT_MONOSPACED_BOLD;
106*25b329d5SDavid du Colombier 		case 2: return FONT_MONOSPACED_ITALIC;
107*25b329d5SDavid du Colombier 		case 3: return FONT_MONOSPACED_BOLDITALIC;
108*25b329d5SDavid du Colombier 		default: return FONT_MONOSPACED_PLAIN;
109*25b329d5SDavid du Colombier 		}
110*25b329d5SDavid du Colombier 	} else if (ucFf == FAMILY_ROMAN) {
111*25b329d5SDavid du Colombier 		/* Set to the default serif font */
112*25b329d5SDavid du Colombier 		switch (iEmphasis) {
113*25b329d5SDavid du Colombier 		case 1: return FONT_SERIF_BOLD;
114*25b329d5SDavid du Colombier 		case 2: return FONT_SERIF_ITALIC;
115*25b329d5SDavid du Colombier 		case 3: return FONT_SERIF_BOLDITALIC;
116*25b329d5SDavid du Colombier 		default: return FONT_SERIF_PLAIN;
117*25b329d5SDavid du Colombier 		}
118*25b329d5SDavid du Colombier 	} else if (ucFf == FAMILY_SWISS) {
119*25b329d5SDavid du Colombier 		/* Set to the default sans serif font */
120*25b329d5SDavid du Colombier 		switch (iEmphasis) {
121*25b329d5SDavid du Colombier 		case 1: return FONT_SANS_SERIF_BOLD;
122*25b329d5SDavid du Colombier 		case 2: return FONT_SANS_SERIF_ITALIC;
123*25b329d5SDavid du Colombier 		case 3: return FONT_SANS_SERIF_BOLDITALIC;
124*25b329d5SDavid du Colombier 		default: return FONT_SANS_SERIF_PLAIN;
125*25b329d5SDavid du Colombier 		}
126*25b329d5SDavid du Colombier 	} else {
127*25b329d5SDavid du Colombier 		/* Set to the default default font */
128*25b329d5SDavid du Colombier 		switch (iEmphasis) {
129*25b329d5SDavid du Colombier 		case 1: return FONT_SERIF_BOLD;
130*25b329d5SDavid du Colombier 		case 2: return FONT_SERIF_ITALIC;
131*25b329d5SDavid du Colombier 		case 3: return FONT_SERIF_BOLDITALIC;
132*25b329d5SDavid du Colombier 		default: return FONT_SERIF_PLAIN;
133*25b329d5SDavid du Colombier 		}
134*25b329d5SDavid du Colombier 	}
135*25b329d5SDavid du Colombier } /* end of szGetDefaultFont */
136*25b329d5SDavid du Colombier 
137*25b329d5SDavid du Colombier /*
138f5736e95SDavid du Colombier  * See if the fontname from the Word file matches the fontname from the
139f5736e95SDavid du Colombier  * font translation file.
140f5736e95SDavid du Colombier  * If iBytesPerChar is one than aucWord is in ISO-8859-x (Word 2/6/7),
141f5736e95SDavid du Colombier  * if iBytesPerChar is two than aucWord is in Unicode (Word 8/9/10).
142f5736e95SDavid du Colombier  */
143f5736e95SDavid du Colombier static BOOL
bFontEqual(const UCHAR * aucWord,const char * szTable,int iBytesPerChar)144f5736e95SDavid du Colombier bFontEqual(const UCHAR *aucWord, const char *szTable, int iBytesPerChar)
145f5736e95SDavid du Colombier {
146f5736e95SDavid du Colombier 	const UCHAR	*pucTmp;
147f5736e95SDavid du Colombier 	const char	*pcTmp;
148f5736e95SDavid du Colombier 
149f5736e95SDavid du Colombier 	fail(aucWord == NULL || szTable == NULL);
150f5736e95SDavid du Colombier 	fail(iBytesPerChar != 1 && iBytesPerChar != 2);
151f5736e95SDavid du Colombier 
152f5736e95SDavid du Colombier 	for (pucTmp = aucWord, pcTmp = szTable;
153f5736e95SDavid du Colombier 	     *pucTmp != 0;
154f5736e95SDavid du Colombier 	     pucTmp += iBytesPerChar, pcTmp++) {
155f5736e95SDavid du Colombier 		if (ulToUpper((ULONG)*pucTmp) !=
156f5736e95SDavid du Colombier 		    ulToUpper((ULONG)(UCHAR)*pcTmp)) {
157f5736e95SDavid du Colombier 			return FALSE;
158f5736e95SDavid du Colombier 		}
159f5736e95SDavid du Colombier 	}
160f5736e95SDavid du Colombier 	return *pcTmp == '\0';
161f5736e95SDavid du Colombier } /* end of bFontEqual */
162f5736e95SDavid du Colombier 
163f5736e95SDavid du Colombier /*
164*25b329d5SDavid du Colombier  * vFontname2Table - add fontnames to the font table
165f5736e95SDavid du Colombier  */
166f5736e95SDavid du Colombier static void
vFontname2Table(const UCHAR * aucFont,const UCHAR * aucAltFont,int iBytesPerChar,int iEmphasis,UCHAR ucFFN,const char * szWordFont,const char * szOurFont,font_table_type * pFontTableRecord)167f5736e95SDavid du Colombier vFontname2Table(const UCHAR *aucFont, const UCHAR *aucAltFont,
168f5736e95SDavid du Colombier 	int iBytesPerChar, int iEmphasis, UCHAR ucFFN,
169f5736e95SDavid du Colombier 	const char *szWordFont, const char *szOurFont,
170f5736e95SDavid du Colombier 	font_table_type *pFontTableRecord)
171f5736e95SDavid du Colombier {
172f5736e95SDavid du Colombier 	BOOL	bMatchFound;
173f5736e95SDavid du Colombier 
174f5736e95SDavid du Colombier 	fail(aucFont == NULL || aucFont[0] == 0);
175f5736e95SDavid du Colombier 	fail(aucAltFont != NULL && aucAltFont[0] == 0);
176f5736e95SDavid du Colombier 	fail(iBytesPerChar != 1 && iBytesPerChar != 2);
177f5736e95SDavid du Colombier 	fail(iEmphasis < 0 || iEmphasis > 3);
178f5736e95SDavid du Colombier 	fail(szWordFont == NULL || szWordFont[0] == '\0');
179f5736e95SDavid du Colombier 	fail(szOurFont == NULL || szOurFont[0] == '\0');
180f5736e95SDavid du Colombier 	fail(pFontTableRecord == NULL);
181f5736e95SDavid du Colombier 
182f5736e95SDavid du Colombier 	bMatchFound = bFontEqual(aucFont, szWordFont, iBytesPerChar);
183f5736e95SDavid du Colombier 
184f5736e95SDavid du Colombier 	if (!bMatchFound && aucAltFont != NULL) {
185f5736e95SDavid du Colombier 		bMatchFound = bFontEqual(aucAltFont, szWordFont, iBytesPerChar);
186f5736e95SDavid du Colombier 	}
187f5736e95SDavid du Colombier 
188f5736e95SDavid du Colombier 	if (!bMatchFound &&
189f5736e95SDavid du Colombier 	    pFontTableRecord->szWordFontname[0] == '\0' &&
190f5736e95SDavid du Colombier 	    szWordFont[0] == '*' &&
191f5736e95SDavid du Colombier 	    szWordFont[1] == '\0') {
192f5736e95SDavid du Colombier 		/*
193f5736e95SDavid du Colombier 		 * szWordFont contains a "*", so szOurFont will contain the
194f5736e95SDavid du Colombier 		 * "default default" font. See if we can do better than that.
195f5736e95SDavid du Colombier 		 */
196*25b329d5SDavid du Colombier 		szOurFont = szGetDefaultFont(ucFFN, iEmphasis);
197f5736e95SDavid du Colombier 		bMatchFound = TRUE;
198f5736e95SDavid du Colombier 	}
199f5736e95SDavid du Colombier 
200f5736e95SDavid du Colombier 	if (bMatchFound) {
201f5736e95SDavid du Colombier 		switch (iBytesPerChar) {
202f5736e95SDavid du Colombier 		case 1:
203f5736e95SDavid du Colombier 			(void)strncpy(pFontTableRecord->szWordFontname,
204f5736e95SDavid du Colombier 				(const char *)aucFont,
205f5736e95SDavid du Colombier 				sizeof(pFontTableRecord->szWordFontname) - 1);
206f5736e95SDavid du Colombier 			break;
207f5736e95SDavid du Colombier 		case 2:
208f5736e95SDavid du Colombier 			(void)unincpy(pFontTableRecord->szWordFontname,
209f5736e95SDavid du Colombier 				aucFont,
210f5736e95SDavid du Colombier 				sizeof(pFontTableRecord->szWordFontname) - 1);
211f5736e95SDavid du Colombier 			break;
212f5736e95SDavid du Colombier 		default:
213f5736e95SDavid du Colombier 			DBG_FIXME();
214f5736e95SDavid du Colombier 			pFontTableRecord->szWordFontname[0] = '\0';
215f5736e95SDavid du Colombier 			break;
216f5736e95SDavid du Colombier 		}
217f5736e95SDavid du Colombier 		pFontTableRecord->szWordFontname[
218f5736e95SDavid du Colombier 			sizeof(pFontTableRecord->szWordFontname) - 1] = '\0';
219f5736e95SDavid du Colombier 		(void)strncpy(pFontTableRecord->szOurFontname, szOurFont,
220f5736e95SDavid du Colombier 			sizeof(pFontTableRecord->szOurFontname) - 1);
221f5736e95SDavid du Colombier 		pFontTableRecord->szOurFontname[
222f5736e95SDavid du Colombier 			sizeof(pFontTableRecord->szOurFontname) - 1] = '\0';
223f5736e95SDavid du Colombier 		NO_DBG_MSG(pFontTableRecord->szWordFontname);
224f5736e95SDavid du Colombier 		NO_DBG_MSG(pFontTableRecord->szOurFontname);
225*25b329d5SDavid du Colombier 		pFontTableRecord->ucFFN = ucFFN;
226*25b329d5SDavid du Colombier 		pFontTableRecord->ucEmphasis = (UCHAR)iEmphasis;
227f5736e95SDavid du Colombier 	}
228f5736e95SDavid du Colombier } /* end of vFontname2Table */
229f5736e95SDavid du Colombier 
230f5736e95SDavid du Colombier /*
231f5736e95SDavid du Colombier  * vCreateFontTable - Create and initialize the internal font table
232f5736e95SDavid du Colombier  */
233f5736e95SDavid du Colombier static void
vCreateFontTable(void)234f5736e95SDavid du Colombier vCreateFontTable(void)
235f5736e95SDavid du Colombier {
236f5736e95SDavid du Colombier 	font_table_type	*pTmp;
237f5736e95SDavid du Colombier 	int	iNbr;
238f5736e95SDavid du Colombier 
239f5736e95SDavid du Colombier 	if (tFontTableRecords == 0) {
240f5736e95SDavid du Colombier 		pFontTable = xfree(pFontTable);
241f5736e95SDavid du Colombier 		return;
242f5736e95SDavid du Colombier 	}
243f5736e95SDavid du Colombier 
244f5736e95SDavid du Colombier 	/* Create the font table */
245f5736e95SDavid du Colombier 	pFontTable = xcalloc(tFontTableRecords, sizeof(*pFontTable));
246f5736e95SDavid du Colombier 
247f5736e95SDavid du Colombier 	/* Initialize the font table */
248f5736e95SDavid du Colombier 	for (iNbr = 0, pTmp = pFontTable;
249f5736e95SDavid du Colombier 	     pTmp < pFontTable + tFontTableRecords;
250f5736e95SDavid du Colombier 	     iNbr++, pTmp++) {
251f5736e95SDavid du Colombier 		pTmp->ucWordFontNumber = (UCHAR)(iNbr / 4);
252f5736e95SDavid du Colombier 		switch (iNbr % 4) {
253f5736e95SDavid du Colombier 		case 0:
254f5736e95SDavid du Colombier 			pTmp->usFontStyle = FONT_REGULAR;
255f5736e95SDavid du Colombier 			break;
256f5736e95SDavid du Colombier 		case 1:
257f5736e95SDavid du Colombier 			pTmp->usFontStyle = FONT_BOLD;
258f5736e95SDavid du Colombier 			break;
259f5736e95SDavid du Colombier 		case 2:
260f5736e95SDavid du Colombier 			pTmp->usFontStyle = FONT_ITALIC;
261f5736e95SDavid du Colombier 			break;
262f5736e95SDavid du Colombier 		case 3:
263f5736e95SDavid du Colombier 			pTmp->usFontStyle = FONT_BOLD|FONT_ITALIC;
264f5736e95SDavid du Colombier 			break;
265f5736e95SDavid du Colombier 		default:
266f5736e95SDavid du Colombier 			DBG_DEC(iNbr);
267f5736e95SDavid du Colombier 			break;
268f5736e95SDavid du Colombier 		}
269f5736e95SDavid du Colombier 	}
270f5736e95SDavid du Colombier } /* end of vCreateFontTable */
271f5736e95SDavid du Colombier 
272f5736e95SDavid du Colombier /*
273f5736e95SDavid du Colombier  * vMinimizeFontTable - make the font table as small as possible
274f5736e95SDavid du Colombier  */
275f5736e95SDavid du Colombier static void
vMinimizeFontTable(void)276f5736e95SDavid du Colombier vMinimizeFontTable(void)
277f5736e95SDavid du Colombier {
278f5736e95SDavid du Colombier 	font_block_type		tFontNext;
279f5736e95SDavid du Colombier 	const style_block_type	*pStyle;
280f5736e95SDavid du Colombier 	const font_block_type	*pFont;
281f5736e95SDavid du Colombier 	font_table_type		*pTmp;
282f5736e95SDavid du Colombier 	int	iUnUsed;
283f5736e95SDavid du Colombier 	BOOL	bMustAddTableFont;
284f5736e95SDavid du Colombier 
285f5736e95SDavid du Colombier 	NO_DBG_MSG("vMinimizeFontTable");
286f5736e95SDavid du Colombier 
287f5736e95SDavid du Colombier 	if (tFontTableRecords == 0) {
288f5736e95SDavid du Colombier 		pFontTable = xfree(pFontTable);
289f5736e95SDavid du Colombier 		return;
290f5736e95SDavid du Colombier 	}
291f5736e95SDavid du Colombier 
292*25b329d5SDavid du Colombier 	/* See if we must add a font for our tables */
293*25b329d5SDavid du Colombier 	bMustAddTableFont = TRUE;
294*25b329d5SDavid du Colombier 
295f5736e95SDavid du Colombier #if 0
296f5736e95SDavid du Colombier 	DBG_MSG("Before");
297f5736e95SDavid du Colombier 	DBG_DEC(tFontTableRecords);
298f5736e95SDavid du Colombier 	for (pTmp = pFontTable;
299f5736e95SDavid du Colombier 	     pTmp < pFontTable + tFontTableRecords;
300f5736e95SDavid du Colombier 	     pTmp++) {
301f5736e95SDavid du Colombier 		DBG_DEC(pTmp->ucWordFontNumber);
302f5736e95SDavid du Colombier 		DBG_HEX(pTmp->usFontStyle);
303f5736e95SDavid du Colombier 		DBG_MSG(pTmp->szWordFontname);
304f5736e95SDavid du Colombier 		DBG_MSG(pTmp->szOurFontname);
305f5736e95SDavid du Colombier 	}
306f5736e95SDavid du Colombier #endif /* DEBUG */
307f5736e95SDavid du Colombier 
308*25b329d5SDavid du Colombier 	/* See which fonts/styles we really need */
309*25b329d5SDavid du Colombier 
310f5736e95SDavid du Colombier 	/* Default font/style is by definition in use */
311f5736e95SDavid du Colombier 	pFontTable[0].ucInUse = 1;
312f5736e95SDavid du Colombier 
313*25b329d5SDavid du Colombier 	/* Make InUse 1 for all the fonts/styles that WILL be used */
314f5736e95SDavid du Colombier 	pFont = NULL;
315f5736e95SDavid du Colombier 	while((pFont = pGetNextFontInfoListItem(pFont)) != NULL) {
316f5736e95SDavid du Colombier 		pTmp = pFontTable + 4 * (int)pFont->ucFontNumber;
317f5736e95SDavid du Colombier 		if (bIsBold(pFont->usFontStyle)) {
318f5736e95SDavid du Colombier 			pTmp++;
319f5736e95SDavid du Colombier 		}
320f5736e95SDavid du Colombier 		if (bIsItalic(pFont->usFontStyle)) {
321f5736e95SDavid du Colombier 			pTmp += 2;
322f5736e95SDavid du Colombier 		}
323f5736e95SDavid du Colombier 		if (pTmp >= pFontTable + tFontTableRecords) {
324f5736e95SDavid du Colombier 			continue;
325f5736e95SDavid du Colombier 		}
326f5736e95SDavid du Colombier 		if (STREQ(pTmp->szOurFontname, TABLE_FONT)) {
327f5736e95SDavid du Colombier 			/* The table font is already present */
328f5736e95SDavid du Colombier 			bMustAddTableFont = FALSE;
329f5736e95SDavid du Colombier 		}
330f5736e95SDavid du Colombier 		pTmp->ucInUse = 1;
331f5736e95SDavid du Colombier 	}
332f5736e95SDavid du Colombier 
333*25b329d5SDavid du Colombier 	/* Make InUse 1 for all the fonts/styles that MIGHT be used */
334f5736e95SDavid du Colombier 	pStyle = NULL;
335f5736e95SDavid du Colombier 	while((pStyle = pGetNextStyleInfoListItem(pStyle)) != NULL) {
336f5736e95SDavid du Colombier 		vFillFontFromStylesheet(pStyle->usIstdNext, &tFontNext);
337f5736e95SDavid du Colombier 		vCorrectFontValues(&tFontNext);
338f5736e95SDavid du Colombier 		pTmp = pFontTable + 4 * (int)tFontNext.ucFontNumber;
339f5736e95SDavid du Colombier 		if (bIsBold(tFontNext.usFontStyle)) {
340f5736e95SDavid du Colombier 			pTmp++;
341f5736e95SDavid du Colombier 		}
342f5736e95SDavid du Colombier 		if (bIsItalic(tFontNext.usFontStyle)) {
343f5736e95SDavid du Colombier 			pTmp += 2;
344f5736e95SDavid du Colombier 		}
345f5736e95SDavid du Colombier 		if (pTmp >= pFontTable + tFontTableRecords) {
346f5736e95SDavid du Colombier 			continue;
347f5736e95SDavid du Colombier 		}
348f5736e95SDavid du Colombier 		if (STREQ(pTmp->szOurFontname, TABLE_FONT)) {
349f5736e95SDavid du Colombier 			/* The table font is already present */
350f5736e95SDavid du Colombier 			bMustAddTableFont = FALSE;
351f5736e95SDavid du Colombier 		}
352f5736e95SDavid du Colombier 		pTmp->ucInUse = 1;
353f5736e95SDavid du Colombier 	}
354f5736e95SDavid du Colombier 
355f5736e95SDavid du Colombier 	/* Remove the unused font entries from the font table */
356f5736e95SDavid du Colombier 	iUnUsed = 0;
357f5736e95SDavid du Colombier 	for (pTmp = pFontTable;
358f5736e95SDavid du Colombier 	     pTmp < pFontTable + tFontTableRecords;
359f5736e95SDavid du Colombier 	     pTmp++) {
360f5736e95SDavid du Colombier 		if (pTmp->ucInUse == 0) {
361f5736e95SDavid du Colombier 			iUnUsed++;
362f5736e95SDavid du Colombier 			continue;
363f5736e95SDavid du Colombier 		}
364f5736e95SDavid du Colombier 		if (iUnUsed > 0) {
365f5736e95SDavid du Colombier 			fail(pTmp - iUnUsed <= pFontTable);
366f5736e95SDavid du Colombier 			*(pTmp - iUnUsed) = *pTmp;
367f5736e95SDavid du Colombier 		}
368f5736e95SDavid du Colombier 	}
369*25b329d5SDavid du Colombier 	fail(iUnUsed < 0);
370*25b329d5SDavid du Colombier 	fail(tFontTableRecords <= (size_t)iUnUsed);
371f5736e95SDavid du Colombier 	tFontTableRecords -= (size_t)iUnUsed;
372f5736e95SDavid du Colombier 
373f5736e95SDavid du Colombier 	if (bMustAddTableFont) {
374f5736e95SDavid du Colombier 		pTmp = pFontTable + tFontTableRecords;
375*25b329d5SDavid du Colombier 		fail(pTmp <= pFontTable);
376f5736e95SDavid du Colombier 		pTmp->ucWordFontNumber = (pTmp - 1)->ucWordFontNumber + 1;
377f5736e95SDavid du Colombier 		pTmp->usFontStyle = FONT_REGULAR;
378f5736e95SDavid du Colombier 		pTmp->ucInUse = 1;
379f5736e95SDavid du Colombier 		strcpy(pTmp->szWordFontname, "Extra Table Font");
380f5736e95SDavid du Colombier 		strcpy(pTmp->szOurFontname, TABLE_FONT);
381f5736e95SDavid du Colombier 		tFontTableRecords++;
382f5736e95SDavid du Colombier 		iUnUsed--;
383f5736e95SDavid du Colombier 	}
384f5736e95SDavid du Colombier 	if (iUnUsed > 0) {
385f5736e95SDavid du Colombier 		/* Resize the font table */
386f5736e95SDavid du Colombier 		pFontTable = xrealloc(pFontTable,
387f5736e95SDavid du Colombier 				tFontTableRecords * sizeof(*pFontTable));
388f5736e95SDavid du Colombier 	}
389f5736e95SDavid du Colombier #if defined(DEBUG)
390f5736e95SDavid du Colombier 	DBG_MSG("After");
391f5736e95SDavid du Colombier 	DBG_DEC(tFontTableRecords);
392f5736e95SDavid du Colombier 	for (pTmp = pFontTable;
393f5736e95SDavid du Colombier 	     pTmp < pFontTable + tFontTableRecords;
394f5736e95SDavid du Colombier 	     pTmp++) {
395f5736e95SDavid du Colombier 		DBG_DEC(pTmp->ucWordFontNumber);
396f5736e95SDavid du Colombier 		DBG_HEX(pTmp->usFontStyle);
397f5736e95SDavid du Colombier 		DBG_MSG(pTmp->szWordFontname);
398f5736e95SDavid du Colombier 		DBG_MSG(pTmp->szOurFontname);
399f5736e95SDavid du Colombier 	}
400f5736e95SDavid du Colombier #endif /* DEBUG */
401f5736e95SDavid du Colombier } /* end of vMinimizeFontTable */
402f5736e95SDavid du Colombier 
403f5736e95SDavid du Colombier /*
404f5736e95SDavid du Colombier  * bReadFontFile - read and check a line from the font translation file
405f5736e95SDavid du Colombier  *
406f5736e95SDavid du Colombier  * returns TRUE when a correct line has been read, otherwise FALSE
407f5736e95SDavid du Colombier  */
408f5736e95SDavid du Colombier static BOOL
bReadFontFile(FILE * pFontTableFile,char * szWordFont,int * piItalic,int * piBold,char * szOurFont,int * piSpecial)409f5736e95SDavid du Colombier bReadFontFile(FILE *pFontTableFile, char *szWordFont,
410f5736e95SDavid du Colombier 	int *piItalic, int *piBold, char *szOurFont, int *piSpecial)
411f5736e95SDavid du Colombier {
412f5736e95SDavid du Colombier 	char	*pcTmp;
413f5736e95SDavid du Colombier 	int	iFields;
414f5736e95SDavid du Colombier 	char	szLine[FONT_LINE_LENGTH];
415f5736e95SDavid du Colombier 
416f5736e95SDavid du Colombier 	fail(szWordFont == NULL || szOurFont == NULL);
417f5736e95SDavid du Colombier 	fail(piItalic == NULL || piBold == NULL || piSpecial == NULL);
418f5736e95SDavid du Colombier 
419f5736e95SDavid du Colombier 	while (fgets(szLine, (int)sizeof(szLine), pFontTableFile) != NULL) {
420f5736e95SDavid du Colombier 		if (szLine[0] == '#' ||
421f5736e95SDavid du Colombier 		    szLine[0] == '\n' ||
422f5736e95SDavid du Colombier 		    szLine[0] == '\r') {
423f5736e95SDavid du Colombier 			continue;
424f5736e95SDavid du Colombier 		}
425f5736e95SDavid du Colombier 		iFields = sscanf(szLine, "%[^,],%d,%d,%1s%[^,],%d",
426f5736e95SDavid du Colombier 			szWordFont, piItalic, piBold,
427f5736e95SDavid du Colombier 			&szOurFont[0], &szOurFont[1], piSpecial);
428f5736e95SDavid du Colombier 		if (iFields != 6) {
429f5736e95SDavid du Colombier 			pcTmp = strchr(szLine, '\r');
430f5736e95SDavid du Colombier 			if (pcTmp != NULL) {
431f5736e95SDavid du Colombier 				*pcTmp = '\0';
432f5736e95SDavid du Colombier 			}
433f5736e95SDavid du Colombier 			pcTmp = strchr(szLine, '\n');
434f5736e95SDavid du Colombier 			if (pcTmp != NULL) {
435f5736e95SDavid du Colombier 				*pcTmp = '\0';
436f5736e95SDavid du Colombier 			}
437f5736e95SDavid du Colombier 			DBG_DEC(iFields);
438f5736e95SDavid du Colombier 			werr(0, "Syntax error in: '%s'", szLine);
439f5736e95SDavid du Colombier 			continue;
440f5736e95SDavid du Colombier 		}
441f5736e95SDavid du Colombier 		if (strlen(szWordFont) >=
442f5736e95SDavid du Colombier 				sizeof(pFontTable[0].szWordFontname)) {
443f5736e95SDavid du Colombier 			werr(0, "Word fontname too long: '%s'", szWordFont);
444f5736e95SDavid du Colombier 			continue;
445f5736e95SDavid du Colombier 		}
446f5736e95SDavid du Colombier 		if (strlen(szOurFont) >=
447f5736e95SDavid du Colombier 				sizeof(pFontTable[0].szOurFontname)) {
448f5736e95SDavid du Colombier 			werr(0, "Local fontname too long: '%s'", szOurFont);
449f5736e95SDavid du Colombier 			continue;
450f5736e95SDavid du Colombier 		}
451f5736e95SDavid du Colombier 		/* The current line passed all the tests */
452f5736e95SDavid du Colombier 		return TRUE;
453f5736e95SDavid du Colombier 	}
454f5736e95SDavid du Colombier 	return FALSE;
455f5736e95SDavid du Colombier } /* end of bReadFontFile */
456f5736e95SDavid du Colombier 
457f5736e95SDavid du Colombier /*
458f5736e95SDavid du Colombier  * vCreate0FontTable - create a font table from Word for DOS
459f5736e95SDavid du Colombier  */
460f5736e95SDavid du Colombier void
vCreate0FontTable(void)461f5736e95SDavid du Colombier vCreate0FontTable(void)
462f5736e95SDavid du Colombier {
463f5736e95SDavid du Colombier 	FILE	*pFontTableFile;
464f5736e95SDavid du Colombier 	font_table_type	*pTmp;
465f5736e95SDavid du Colombier 	UCHAR	*aucFont;
466f5736e95SDavid du Colombier 	int	iBold, iItalic, iSpecial, iEmphasis, iFtc;
467f5736e95SDavid du Colombier 	UCHAR	ucPrq, ucFf, ucFFN;
468f5736e95SDavid du Colombier 	char	szWordFont[FONT_LINE_LENGTH], szOurFont[FONT_LINE_LENGTH];
469f5736e95SDavid du Colombier 
470f5736e95SDavid du Colombier 	tFontTableRecords = 0;
471f5736e95SDavid du Colombier 	pFontTable = xfree(pFontTable);
472f5736e95SDavid du Colombier 
473f5736e95SDavid du Colombier 	pFontTableFile = pOpenFontTableFile();
474f5736e95SDavid du Colombier 	if (pFontTableFile == NULL) {
475f5736e95SDavid du Colombier 		/* No translation table file, no translation table */
476f5736e95SDavid du Colombier 		return;
477f5736e95SDavid du Colombier 	}
478f5736e95SDavid du Colombier 
479f5736e95SDavid du Colombier 	/* Get the maximum number of entries in the font table */
480f5736e95SDavid du Colombier 	tFontTableRecords = 64;
481f5736e95SDavid du Colombier 	tFontTableRecords *= 4;	/* Plain, Bold, Italic and Bold/italic */
482f5736e95SDavid du Colombier 	tFontTableRecords++;	/* One extra for the table-font */
483f5736e95SDavid du Colombier 	vCreateFontTable();
484f5736e95SDavid du Colombier 
485f5736e95SDavid du Colombier 	/* Read the font translation file */
486*25b329d5SDavid du Colombier 	iItalic = 0;
487*25b329d5SDavid du Colombier 	iBold = 0;
488*25b329d5SDavid du Colombier 	iSpecial = 0;
489f5736e95SDavid du Colombier 	while (bReadFontFile(pFontTableFile, szWordFont,
490f5736e95SDavid du Colombier 			&iItalic, &iBold, szOurFont, &iSpecial)) {
491f5736e95SDavid du Colombier 		iEmphasis = 0;
492f5736e95SDavid du Colombier 		if (iBold != 0) {
493f5736e95SDavid du Colombier 			iEmphasis++;
494f5736e95SDavid du Colombier 		}
495f5736e95SDavid du Colombier 		if (iItalic != 0) {
496f5736e95SDavid du Colombier 			iEmphasis += 2;
497f5736e95SDavid du Colombier 		}
498f5736e95SDavid du Colombier 		for (iFtc = 0, pTmp = pFontTable + iEmphasis;
499f5736e95SDavid du Colombier 		     pTmp < pFontTable + tFontTableRecords;
500f5736e95SDavid du Colombier 		     iFtc++, pTmp += 4) {
501f5736e95SDavid du Colombier 			if (iFtc >= 16 && iFtc <= 55) {
502f5736e95SDavid du Colombier 				ucPrq = PITCH_VARIABLE;
503f5736e95SDavid du Colombier 				ucFf = FAMILY_ROMAN;
504f5736e95SDavid du Colombier 				aucFont = (UCHAR *)"Times";
505f5736e95SDavid du Colombier 			} else {
506f5736e95SDavid du Colombier 				ucPrq = PITCH_FIXED;
507f5736e95SDavid du Colombier 				ucFf = FAMILY_MODERN;
508f5736e95SDavid du Colombier 				aucFont = (UCHAR *)"Courier";
509f5736e95SDavid du Colombier 			}
510f5736e95SDavid du Colombier 			ucFFN = (ucFf << 4) | ucPrq;
511f5736e95SDavid du Colombier 			vFontname2Table(aucFont, NULL, 1, iEmphasis,
512f5736e95SDavid du Colombier 					ucFFN, szWordFont, szOurFont, pTmp);
513f5736e95SDavid du Colombier 		}
514f5736e95SDavid du Colombier 	}
515f5736e95SDavid du Colombier 	(void)fclose(pFontTableFile);
516f5736e95SDavid du Colombier 	vMinimizeFontTable();
517f5736e95SDavid du Colombier } /* end of vCreate0FontTable */
518f5736e95SDavid du Colombier 
519f5736e95SDavid du Colombier /*
520f5736e95SDavid du Colombier  * vCreate2FontTable - create a font table from WinWord 1/2
521f5736e95SDavid du Colombier  */
522f5736e95SDavid du Colombier void
vCreate2FontTable(FILE * pFile,int iWordVersion,const UCHAR * aucHeader)523*25b329d5SDavid du Colombier vCreate2FontTable(FILE *pFile, int iWordVersion, const UCHAR *aucHeader)
524f5736e95SDavid du Colombier {
525f5736e95SDavid du Colombier 	FILE	*pFontTableFile;
526f5736e95SDavid du Colombier 	font_table_type	*pTmp;
527f5736e95SDavid du Colombier 	UCHAR	*aucFont;
528f5736e95SDavid du Colombier 	UCHAR	*aucBuffer;
529f5736e95SDavid du Colombier 	ULONG	ulBeginFontInfo;
530f5736e95SDavid du Colombier 	size_t	tFontInfoLen;
531*25b329d5SDavid du Colombier 	int	iPos, iOff, iRecLen;
532f5736e95SDavid du Colombier 	int	iBold, iItalic, iSpecial, iEmphasis;
533f5736e95SDavid du Colombier 	UCHAR	ucFFN;
534f5736e95SDavid du Colombier 	char	szWordFont[FONT_LINE_LENGTH], szOurFont[FONT_LINE_LENGTH];
535f5736e95SDavid du Colombier 
536f5736e95SDavid du Colombier 	fail(pFile == NULL || aucHeader == NULL);
537*25b329d5SDavid du Colombier 	fail(iWordVersion != 1 && iWordVersion != 2);
538f5736e95SDavid du Colombier 
539f5736e95SDavid du Colombier 	tFontTableRecords = 0;
540f5736e95SDavid du Colombier 	pFontTable = xfree(pFontTable);
541f5736e95SDavid du Colombier 
542f5736e95SDavid du Colombier 	pFontTableFile = pOpenFontTableFile();
543f5736e95SDavid du Colombier 	if (pFontTableFile == NULL) {
544f5736e95SDavid du Colombier 		/* No translation table file, no translation table */
545f5736e95SDavid du Colombier 		return;
546f5736e95SDavid du Colombier 	}
547f5736e95SDavid du Colombier 
548f5736e95SDavid du Colombier 	ulBeginFontInfo = ulGetLong(0xb2, aucHeader); /* fcSttbfffn */
549f5736e95SDavid du Colombier 	DBG_HEX(ulBeginFontInfo);
550f5736e95SDavid du Colombier 	tFontInfoLen = (size_t)usGetWord(0xb6, aucHeader); /* cbSttbfffn */
551f5736e95SDavid du Colombier 	DBG_DEC(tFontInfoLen);
552f5736e95SDavid du Colombier 
553*25b329d5SDavid du Colombier 	if (ulBeginFontInfo > (ULONG)LONG_MAX || tFontInfoLen == 0) {
554f5736e95SDavid du Colombier 		/* Don't ask me why this is needed */
555*25b329d5SDavid du Colombier 		DBG_HEX_C(tFontInfoLen != 0, ulBeginFontInfo);
556f5736e95SDavid du Colombier 		(void)fclose(pFontTableFile);
557f5736e95SDavid du Colombier 		return;
558f5736e95SDavid du Colombier 	}
559f5736e95SDavid du Colombier 
560f5736e95SDavid du Colombier 	aucBuffer = xmalloc(tFontInfoLen);
561f5736e95SDavid du Colombier 	if (!bReadBytes(aucBuffer, tFontInfoLen, ulBeginFontInfo, pFile)) {
562f5736e95SDavid du Colombier 		aucBuffer = xfree(aucBuffer);
563f5736e95SDavid du Colombier 		(void)fclose(pFontTableFile);
564f5736e95SDavid du Colombier 		return;
565f5736e95SDavid du Colombier 	}
566f5736e95SDavid du Colombier 	NO_DBG_PRINT_BLOCK(aucBuffer, tFontInfoLen);
567f5736e95SDavid du Colombier 	DBG_DEC(usGetWord(0, aucBuffer));
568f5736e95SDavid du Colombier 
569f5736e95SDavid du Colombier 	/* Compute the maximum number of entries in the font table */
570*25b329d5SDavid du Colombier 	if (iWordVersion == 1) {
571*25b329d5SDavid du Colombier 		fail(tFontInfoLen < 2);
572*25b329d5SDavid du Colombier 		/* WinWord 1 has three implicit fonts */
573*25b329d5SDavid du Colombier 		tFontTableRecords = 3;
574*25b329d5SDavid du Colombier 		iOff = 2;
575*25b329d5SDavid du Colombier 	} else {
576*25b329d5SDavid du Colombier 		fail(tFontInfoLen < 6);
577*25b329d5SDavid du Colombier 		/* WinWord 2 and up have no implicit fonts */
578f5736e95SDavid du Colombier 		tFontTableRecords = 0;
579*25b329d5SDavid du Colombier 		iOff = 3;
580*25b329d5SDavid du Colombier 	}
581f5736e95SDavid du Colombier 	iPos = 2;
582*25b329d5SDavid du Colombier 	while (iPos + iOff < (int)tFontInfoLen) {
583f5736e95SDavid du Colombier 		iRecLen = (int)ucGetByte(iPos, aucBuffer);
584f5736e95SDavid du Colombier 		NO_DBG_DEC(iRecLen);
585*25b329d5SDavid du Colombier 		NO_DBG_MSG(aucBuffer + iPos + iOff);
586f5736e95SDavid du Colombier 		iPos += iRecLen + 1;
587f5736e95SDavid du Colombier 		tFontTableRecords++;
588f5736e95SDavid du Colombier 	}
589*25b329d5SDavid du Colombier 	tFontTableRecords *= 4;	/* Plain, Bold, Italic and Bold/Italic */
590f5736e95SDavid du Colombier 	tFontTableRecords++;	/* One extra for the table-font */
591f5736e95SDavid du Colombier 	vCreateFontTable();
592f5736e95SDavid du Colombier 
593*25b329d5SDavid du Colombier 	/* Add the tree implicit fonts (in four variations) */
594*25b329d5SDavid du Colombier 	if (iWordVersion == 1) {
595*25b329d5SDavid du Colombier 		fail(tFontTableRecords < 13);
596*25b329d5SDavid du Colombier 		vFontname2Table((UCHAR *)"Tms Rmn", NULL, 1, 0,
597*25b329d5SDavid du Colombier 			(UCHAR)((FAMILY_ROMAN << 4) | PITCH_VARIABLE),
598*25b329d5SDavid du Colombier 			"*", "Times-Roman", pFontTable + 0);
599*25b329d5SDavid du Colombier 		vFontname2Table((UCHAR *)"Tms Rmn", NULL, 1, 1,
600*25b329d5SDavid du Colombier 			(UCHAR)((FAMILY_ROMAN << 4) | PITCH_VARIABLE),
601*25b329d5SDavid du Colombier 			"*", "Times-Bold", pFontTable + 1);
602*25b329d5SDavid du Colombier 		vFontname2Table((UCHAR *)"Tms Rmn", NULL, 1, 2,
603*25b329d5SDavid du Colombier 			(UCHAR)((FAMILY_ROMAN << 4) | PITCH_VARIABLE),
604*25b329d5SDavid du Colombier 			"*", "Times-Italic", pFontTable + 2);
605*25b329d5SDavid du Colombier 		vFontname2Table((UCHAR *)"Tms Rmn", NULL, 1, 3,
606*25b329d5SDavid du Colombier 			(UCHAR)((FAMILY_ROMAN << 4) | PITCH_VARIABLE),
607*25b329d5SDavid du Colombier 			"*", "Times-BoldItalic", pFontTable + 3);
608*25b329d5SDavid du Colombier 		vFontname2Table((UCHAR *)"Symbol", NULL, 1, 0,
609*25b329d5SDavid du Colombier 			(UCHAR)((FAMILY_ROMAN << 4) | PITCH_VARIABLE),
610*25b329d5SDavid du Colombier 			"*", "Times-Roman", pFontTable + 4);
611*25b329d5SDavid du Colombier 		vFontname2Table((UCHAR *)"Symbol", NULL, 1, 1,
612*25b329d5SDavid du Colombier 			(UCHAR)((FAMILY_ROMAN << 4) | PITCH_VARIABLE),
613*25b329d5SDavid du Colombier 			"*", "Times-Bold", pFontTable + 5);
614*25b329d5SDavid du Colombier 		vFontname2Table((UCHAR *)"Symbol", NULL, 1, 2,
615*25b329d5SDavid du Colombier 			(UCHAR)((FAMILY_ROMAN << 4) | PITCH_VARIABLE),
616*25b329d5SDavid du Colombier 			"*", "Times-Italic", pFontTable + 6);
617*25b329d5SDavid du Colombier 		vFontname2Table((UCHAR *)"Symbol", NULL, 1, 3,
618*25b329d5SDavid du Colombier 			(UCHAR)((FAMILY_ROMAN << 4) | PITCH_VARIABLE),
619*25b329d5SDavid du Colombier 			"*", "Times-BoldItalic", pFontTable + 7);
620*25b329d5SDavid du Colombier 		vFontname2Table((UCHAR *)"Helv", NULL, 1, 0,
621*25b329d5SDavid du Colombier 			(UCHAR)((FAMILY_SWISS << 4) | PITCH_VARIABLE),
622*25b329d5SDavid du Colombier 			"*", "Helvetica", pFontTable + 8);
623*25b329d5SDavid du Colombier 		vFontname2Table((UCHAR *)"Helv", NULL, 1, 1,
624*25b329d5SDavid du Colombier 			(UCHAR)((FAMILY_SWISS << 4) | PITCH_VARIABLE),
625*25b329d5SDavid du Colombier 			"*", "Helvetica-Bold", pFontTable + 9);
626*25b329d5SDavid du Colombier 		vFontname2Table((UCHAR *)"Helv", NULL, 1, 2,
627*25b329d5SDavid du Colombier 			(UCHAR)((FAMILY_SWISS << 4) | PITCH_VARIABLE),
628*25b329d5SDavid du Colombier 			"*", "Helvetica-Oblique", pFontTable + 10);
629*25b329d5SDavid du Colombier 		vFontname2Table((UCHAR *)"Helv", NULL, 1, 3,
630*25b329d5SDavid du Colombier 			(UCHAR)((FAMILY_SWISS << 4) | PITCH_VARIABLE),
631*25b329d5SDavid du Colombier 			"*", "Helvetica-BoldOblique", pFontTable + 11);
632*25b329d5SDavid du Colombier 	}
633*25b329d5SDavid du Colombier 
634f5736e95SDavid du Colombier 	/* Read the font translation file */
635*25b329d5SDavid du Colombier 	iItalic = 0;
636*25b329d5SDavid du Colombier 	iBold = 0;
637*25b329d5SDavid du Colombier 	iSpecial = 0;
638f5736e95SDavid du Colombier 	while (bReadFontFile(pFontTableFile, szWordFont,
639f5736e95SDavid du Colombier 			&iItalic, &iBold, szOurFont, &iSpecial)) {
640f5736e95SDavid du Colombier 		iEmphasis = 0;
641f5736e95SDavid du Colombier 		if (iBold != 0) {
642f5736e95SDavid du Colombier 			iEmphasis++;
643f5736e95SDavid du Colombier 		}
644f5736e95SDavid du Colombier 		if (iItalic != 0) {
645f5736e95SDavid du Colombier 			iEmphasis += 2;
646f5736e95SDavid du Colombier 		}
647f5736e95SDavid du Colombier 		pTmp = pFontTable + iEmphasis;
648f5736e95SDavid du Colombier 		iPos = 2;
649*25b329d5SDavid du Colombier 		while (iPos + iOff < (int)tFontInfoLen) {
650f5736e95SDavid du Colombier 			iRecLen = (int)ucGetByte(iPos, aucBuffer);
651f5736e95SDavid du Colombier 			ucFFN = ucGetByte(iPos + 1, aucBuffer);
652*25b329d5SDavid du Colombier 			aucFont = aucBuffer + iPos + iOff;
653f5736e95SDavid du Colombier 			vFontname2Table(aucFont, NULL, 1, iEmphasis,
654f5736e95SDavid du Colombier 					ucFFN, szWordFont, szOurFont, pTmp);
655f5736e95SDavid du Colombier 			pTmp += 4;
656f5736e95SDavid du Colombier 			iPos += iRecLen + 1;
657f5736e95SDavid du Colombier 		}
658f5736e95SDavid du Colombier 	}
659f5736e95SDavid du Colombier 	(void)fclose(pFontTableFile);
660f5736e95SDavid du Colombier 	aucBuffer = xfree(aucBuffer);
661f5736e95SDavid du Colombier 	vMinimizeFontTable();
662f5736e95SDavid du Colombier } /* end of vCreate2FontTable */
663f5736e95SDavid du Colombier 
664f5736e95SDavid du Colombier /*
665f5736e95SDavid du Colombier  * vCreate6FontTable - create a font table from Word 6/7
666f5736e95SDavid du Colombier  */
667f5736e95SDavid du Colombier void
vCreate6FontTable(FILE * pFile,ULONG ulStartBlock,const ULONG * aulBBD,size_t tBBDLen,const UCHAR * aucHeader)668f5736e95SDavid du Colombier vCreate6FontTable(FILE *pFile, ULONG ulStartBlock,
669f5736e95SDavid du Colombier 	const ULONG *aulBBD, size_t tBBDLen,
670f5736e95SDavid du Colombier 	const UCHAR *aucHeader)
671f5736e95SDavid du Colombier {
672f5736e95SDavid du Colombier 	FILE	*pFontTableFile;
673f5736e95SDavid du Colombier 	font_table_type	*pTmp;
674f5736e95SDavid du Colombier 	UCHAR	*aucFont, *aucAltFont;
675f5736e95SDavid du Colombier 	UCHAR	*aucBuffer;
676f5736e95SDavid du Colombier 	ULONG	ulBeginFontInfo;
677f5736e95SDavid du Colombier 	size_t	tFontInfoLen;
678f5736e95SDavid du Colombier 	int	iPos, iRecLen, iOffsetAltName;
679f5736e95SDavid du Colombier 	int	iBold, iItalic, iSpecial, iEmphasis;
680f5736e95SDavid du Colombier 	UCHAR	ucFFN;
681f5736e95SDavid du Colombier 	char	szWordFont[FONT_LINE_LENGTH], szOurFont[FONT_LINE_LENGTH];
682f5736e95SDavid du Colombier 
683f5736e95SDavid du Colombier 	fail(pFile == NULL || aucHeader == NULL);
684f5736e95SDavid du Colombier 	fail(ulStartBlock > MAX_BLOCKNUMBER && ulStartBlock != END_OF_CHAIN);
685f5736e95SDavid du Colombier 	fail(aulBBD == NULL);
686f5736e95SDavid du Colombier 
687f5736e95SDavid du Colombier 	tFontTableRecords = 0;
688f5736e95SDavid du Colombier 	pFontTable = xfree(pFontTable);
689f5736e95SDavid du Colombier 
690f5736e95SDavid du Colombier 	pFontTableFile = pOpenFontTableFile();
691f5736e95SDavid du Colombier 	if (pFontTableFile == NULL) {
692f5736e95SDavid du Colombier 		/* No translation table file, no translation table */
693f5736e95SDavid du Colombier 		return;
694f5736e95SDavid du Colombier 	}
695f5736e95SDavid du Colombier 
696f5736e95SDavid du Colombier 	ulBeginFontInfo = ulGetLong(0xd0, aucHeader); /* fcSttbfffn */
697f5736e95SDavid du Colombier 	DBG_HEX(ulBeginFontInfo);
698f5736e95SDavid du Colombier 	tFontInfoLen = (size_t)ulGetLong(0xd4, aucHeader); /* lcbSttbfffn */
699f5736e95SDavid du Colombier 	DBG_DEC(tFontInfoLen);
700f5736e95SDavid du Colombier 	fail(tFontInfoLen < 9);
701f5736e95SDavid du Colombier 
702f5736e95SDavid du Colombier 	aucBuffer = xmalloc(tFontInfoLen);
703f5736e95SDavid du Colombier 	if (!bReadBuffer(pFile, ulStartBlock,
704f5736e95SDavid du Colombier 			aulBBD, tBBDLen, BIG_BLOCK_SIZE,
705f5736e95SDavid du Colombier 			aucBuffer, ulBeginFontInfo, tFontInfoLen)) {
706f5736e95SDavid du Colombier 		aucBuffer = xfree(aucBuffer);
707f5736e95SDavid du Colombier 		(void)fclose(pFontTableFile);
708f5736e95SDavid du Colombier 		return;
709f5736e95SDavid du Colombier 	}
710f5736e95SDavid du Colombier 	DBG_DEC(usGetWord(0, aucBuffer));
711f5736e95SDavid du Colombier 
712f5736e95SDavid du Colombier 	/* Compute the maximum number of entries in the font table */
713f5736e95SDavid du Colombier 	tFontTableRecords = 0;
714f5736e95SDavid du Colombier 	iPos = 2;
715f5736e95SDavid du Colombier 	while (iPos + 6 < (int)tFontInfoLen) {
716f5736e95SDavid du Colombier 		iRecLen = (int)ucGetByte(iPos, aucBuffer);
717f5736e95SDavid du Colombier 		NO_DBG_DEC(iRecLen);
718f5736e95SDavid du Colombier 		iOffsetAltName = (int)ucGetByte(iPos + 5, aucBuffer);
719f5736e95SDavid du Colombier 		NO_DBG_MSG(aucBuffer + iPos + 6);
720f5736e95SDavid du Colombier 		NO_DBG_MSG_C(iOffsetAltName > 0,
721f5736e95SDavid du Colombier 				aucBuffer + iPos + 6 + iOffsetAltName);
722f5736e95SDavid du Colombier 		iPos += iRecLen + 1;
723f5736e95SDavid du Colombier 		tFontTableRecords++;
724f5736e95SDavid du Colombier 	}
725f5736e95SDavid du Colombier 	tFontTableRecords *= 4;	/* Plain, Bold, Italic and Bold/italic */
726f5736e95SDavid du Colombier 	tFontTableRecords++;	/* One extra for the table-font */
727f5736e95SDavid du Colombier 	vCreateFontTable();
728f5736e95SDavid du Colombier 
729f5736e95SDavid du Colombier 	/* Read the font translation file */
730*25b329d5SDavid du Colombier 	iItalic = 0;
731*25b329d5SDavid du Colombier 	iBold = 0;
732*25b329d5SDavid du Colombier 	iSpecial = 0;
733f5736e95SDavid du Colombier 	while (bReadFontFile(pFontTableFile, szWordFont,
734f5736e95SDavid du Colombier 			&iItalic, &iBold, szOurFont, &iSpecial)) {
735f5736e95SDavid du Colombier 		iEmphasis = 0;
736f5736e95SDavid du Colombier 		if (iBold != 0) {
737f5736e95SDavid du Colombier 			iEmphasis++;
738f5736e95SDavid du Colombier 		}
739f5736e95SDavid du Colombier 		if (iItalic != 0) {
740f5736e95SDavid du Colombier 			iEmphasis += 2;
741f5736e95SDavid du Colombier 		}
742f5736e95SDavid du Colombier 		pTmp = pFontTable + iEmphasis;
743f5736e95SDavid du Colombier 		iPos = 2;
744f5736e95SDavid du Colombier 		while (iPos + 6 < (int)tFontInfoLen) {
745f5736e95SDavid du Colombier 			iRecLen = (int)ucGetByte(iPos, aucBuffer);
746f5736e95SDavid du Colombier 			ucFFN = ucGetByte(iPos + 1, aucBuffer);
747f5736e95SDavid du Colombier 			aucFont = aucBuffer + iPos + 6;
748f5736e95SDavid du Colombier 			iOffsetAltName = (int)ucGetByte(iPos + 5, aucBuffer);
749f5736e95SDavid du Colombier 			if (iOffsetAltName <= 0) {
750f5736e95SDavid du Colombier 				aucAltFont = NULL;
751f5736e95SDavid du Colombier 			} else {
752f5736e95SDavid du Colombier 				aucAltFont = aucFont + iOffsetAltName;
753f5736e95SDavid du Colombier 				NO_DBG_MSG(aucFont);
754f5736e95SDavid du Colombier 				NO_DBG_MSG(aucAltFont);
755f5736e95SDavid du Colombier 			}
756f5736e95SDavid du Colombier 			vFontname2Table(aucFont, aucAltFont, 1, iEmphasis,
757f5736e95SDavid du Colombier 					ucFFN, szWordFont, szOurFont, pTmp);
758f5736e95SDavid du Colombier 			pTmp += 4;
759f5736e95SDavid du Colombier 			iPos += iRecLen + 1;
760f5736e95SDavid du Colombier 		}
761f5736e95SDavid du Colombier 	}
762f5736e95SDavid du Colombier 	(void)fclose(pFontTableFile);
763f5736e95SDavid du Colombier 	aucBuffer = xfree(aucBuffer);
764f5736e95SDavid du Colombier 	vMinimizeFontTable();
765f5736e95SDavid du Colombier } /* end of vCreate6FontTable */
766f5736e95SDavid du Colombier 
767f5736e95SDavid du Colombier /*
768f5736e95SDavid du Colombier  * vCreate8FontTable - create a font table from Word 8/9/10
769f5736e95SDavid du Colombier  */
770f5736e95SDavid du Colombier void
vCreate8FontTable(FILE * pFile,const pps_info_type * pPPS,const ULONG * aulBBD,size_t tBBDLen,const ULONG * aulSBD,size_t tSBDLen,const UCHAR * aucHeader)771f5736e95SDavid du Colombier vCreate8FontTable(FILE *pFile, const pps_info_type *pPPS,
772f5736e95SDavid du Colombier 	const ULONG *aulBBD, size_t tBBDLen,
773f5736e95SDavid du Colombier 	const ULONG *aulSBD, size_t tSBDLen,
774f5736e95SDavid du Colombier 	const UCHAR *aucHeader)
775f5736e95SDavid du Colombier {
776f5736e95SDavid du Colombier 	FILE	*pFontTableFile;
777f5736e95SDavid du Colombier 	font_table_type	*pTmp;
778f5736e95SDavid du Colombier 	const ULONG	*aulBlockDepot;
779f5736e95SDavid du Colombier 	UCHAR	*aucFont, *aucAltFont;
780f5736e95SDavid du Colombier 	UCHAR	*aucBuffer;
781f5736e95SDavid du Colombier 	ULONG	ulBeginFontInfo;
782f5736e95SDavid du Colombier 	size_t	tFontInfoLen, tBlockDepotLen, tBlockSize;
783f5736e95SDavid du Colombier 	int	iPos, iRecLen, iOffsetAltName;
784f5736e95SDavid du Colombier 	int	iBold, iItalic, iSpecial, iEmphasis;
785f5736e95SDavid du Colombier 	UCHAR	ucFFN;
786f5736e95SDavid du Colombier 	char	szWordFont[FONT_LINE_LENGTH], szOurFont[FONT_LINE_LENGTH];
787f5736e95SDavid du Colombier 
788f5736e95SDavid du Colombier 	fail(pFile == NULL || pPPS == NULL || aucHeader == NULL);
789f5736e95SDavid du Colombier 	fail(aulBBD == NULL || aulSBD == NULL);
790f5736e95SDavid du Colombier 
791f5736e95SDavid du Colombier 	tFontTableRecords = 0;
792f5736e95SDavid du Colombier 	pFontTable = xfree(pFontTable);
793f5736e95SDavid du Colombier 
794f5736e95SDavid du Colombier 	pFontTableFile = pOpenFontTableFile();
795f5736e95SDavid du Colombier 	if (pFontTableFile == NULL) {
796f5736e95SDavid du Colombier 		/* No translation table file, no translation table */
797f5736e95SDavid du Colombier 		return;
798f5736e95SDavid du Colombier 	}
799f5736e95SDavid du Colombier 
800f5736e95SDavid du Colombier 	ulBeginFontInfo = ulGetLong(0x112, aucHeader); /* fcSttbfffn */
801f5736e95SDavid du Colombier 	DBG_HEX(ulBeginFontInfo);
802f5736e95SDavid du Colombier 	tFontInfoLen = (size_t)ulGetLong(0x116, aucHeader); /* lcbSttbfffn */
803f5736e95SDavid du Colombier 	DBG_DEC(tFontInfoLen);
804f5736e95SDavid du Colombier 	fail(tFontInfoLen < 46);
805f5736e95SDavid du Colombier 
806*25b329d5SDavid du Colombier 	DBG_DEC(pPPS->tTable.ulSB);
807*25b329d5SDavid du Colombier 	DBG_HEX(pPPS->tTable.ulSize);
808*25b329d5SDavid du Colombier 	if (pPPS->tTable.ulSize == 0) {
809f5736e95SDavid du Colombier 		DBG_MSG("No fontname table");
810f5736e95SDavid du Colombier 		(void)fclose(pFontTableFile);
811f5736e95SDavid du Colombier 		return;
812f5736e95SDavid du Colombier 	}
813*25b329d5SDavid du Colombier 
814*25b329d5SDavid du Colombier 	if (pPPS->tTable.ulSize < MIN_SIZE_FOR_BBD_USE) {
815f5736e95SDavid du Colombier 		/* Use the Small Block Depot */
816f5736e95SDavid du Colombier 		aulBlockDepot = aulSBD;
817f5736e95SDavid du Colombier 		tBlockDepotLen = tSBDLen;
818f5736e95SDavid du Colombier 		tBlockSize = SMALL_BLOCK_SIZE;
819f5736e95SDavid du Colombier 	} else {
820f5736e95SDavid du Colombier 		/* Use the Big Block Depot */
821f5736e95SDavid du Colombier 		aulBlockDepot = aulBBD;
822f5736e95SDavid du Colombier 		tBlockDepotLen = tBBDLen;
823f5736e95SDavid du Colombier 		tBlockSize = BIG_BLOCK_SIZE;
824f5736e95SDavid du Colombier 	}
825f5736e95SDavid du Colombier 	aucBuffer = xmalloc(tFontInfoLen);
826*25b329d5SDavid du Colombier 	if (!bReadBuffer(pFile, pPPS->tTable.ulSB,
827f5736e95SDavid du Colombier 			aulBlockDepot, tBlockDepotLen, tBlockSize,
828f5736e95SDavid du Colombier 			aucBuffer, ulBeginFontInfo, tFontInfoLen)) {
829f5736e95SDavid du Colombier 		aucBuffer = xfree(aucBuffer);
830f5736e95SDavid du Colombier 		(void)fclose(pFontTableFile);
831f5736e95SDavid du Colombier 		return;
832f5736e95SDavid du Colombier 	}
833f5736e95SDavid du Colombier 	NO_DBG_PRINT_BLOCK(aucBuffer, tFontInfoLen);
834f5736e95SDavid du Colombier 
835f5736e95SDavid du Colombier 	/* Get the maximum number of entries in the font table */
836f5736e95SDavid du Colombier 	tFontTableRecords = (size_t)usGetWord(0, aucBuffer);
837f5736e95SDavid du Colombier 	tFontTableRecords *= 4;	/* Plain, Bold, Italic and Bold/italic */
838f5736e95SDavid du Colombier 	tFontTableRecords++;	/* One extra for the table-font */
839f5736e95SDavid du Colombier 	vCreateFontTable();
840f5736e95SDavid du Colombier 
841f5736e95SDavid du Colombier 	/* Read the font translation file */
842*25b329d5SDavid du Colombier 	iItalic = 0;
843*25b329d5SDavid du Colombier 	iBold = 0;
844*25b329d5SDavid du Colombier 	iSpecial = 0;
845f5736e95SDavid du Colombier 	while (bReadFontFile(pFontTableFile, szWordFont,
846f5736e95SDavid du Colombier 			&iItalic, &iBold, szOurFont, &iSpecial)) {
847f5736e95SDavid du Colombier 		iEmphasis = 0;
848f5736e95SDavid du Colombier 		if (iBold != 0) {
849f5736e95SDavid du Colombier 			iEmphasis++;
850f5736e95SDavid du Colombier 		}
851f5736e95SDavid du Colombier 		if (iItalic != 0) {
852f5736e95SDavid du Colombier 			iEmphasis += 2;
853f5736e95SDavid du Colombier 		}
854f5736e95SDavid du Colombier 		pTmp = pFontTable + iEmphasis;
855f5736e95SDavid du Colombier 		iPos = 4;
856f5736e95SDavid du Colombier 		while (iPos + 40 < (int)tFontInfoLen) {
857f5736e95SDavid du Colombier 			iRecLen = (int)ucGetByte(iPos, aucBuffer);
858f5736e95SDavid du Colombier 			ucFFN = ucGetByte(iPos + 1, aucBuffer);
859f5736e95SDavid du Colombier 			aucFont = aucBuffer + iPos + 40;
860f5736e95SDavid du Colombier 			iOffsetAltName = (int)unilen(aucFont);
861f5736e95SDavid du Colombier 			if (iPos + 40 + iOffsetAltName + 4 >= iRecLen) {
862f5736e95SDavid du Colombier 				aucAltFont = NULL;
863f5736e95SDavid du Colombier 			} else {
864f5736e95SDavid du Colombier 				aucAltFont = aucFont + iOffsetAltName + 2;
865f5736e95SDavid du Colombier 				NO_DBG_UNICODE(aucFont);
866f5736e95SDavid du Colombier 				NO_DBG_UNICODE(aucAltFont);
867f5736e95SDavid du Colombier 			}
868f5736e95SDavid du Colombier 			vFontname2Table(aucFont, aucAltFont, 2, iEmphasis,
869f5736e95SDavid du Colombier 					ucFFN, szWordFont, szOurFont, pTmp);
870f5736e95SDavid du Colombier 			pTmp += 4;
871f5736e95SDavid du Colombier 			iPos += iRecLen + 1;
872f5736e95SDavid du Colombier 		}
873f5736e95SDavid du Colombier 	}
874f5736e95SDavid du Colombier 	(void)fclose(pFontTableFile);
875f5736e95SDavid du Colombier 	aucBuffer = xfree(aucBuffer);
876f5736e95SDavid du Colombier 	vMinimizeFontTable();
877f5736e95SDavid du Colombier } /* end of vCreate8FontTable */
878f5736e95SDavid du Colombier 
879f5736e95SDavid du Colombier /*
880f5736e95SDavid du Colombier  * Destroy the internal font table by freeing its memory
881f5736e95SDavid du Colombier  */
882f5736e95SDavid du Colombier void
vDestroyFontTable(void)883f5736e95SDavid du Colombier vDestroyFontTable(void)
884f5736e95SDavid du Colombier {
885f5736e95SDavid du Colombier 	DBG_MSG("vDestroyFontTable");
886f5736e95SDavid du Colombier 
887f5736e95SDavid du Colombier 	tFontTableRecords = 0;
888f5736e95SDavid du Colombier 	pFontTable = xfree(pFontTable);
889f5736e95SDavid du Colombier } /* end of vDestroyFontTable */
890f5736e95SDavid du Colombier 
891f5736e95SDavid du Colombier /*
892f5736e95SDavid du Colombier  * pGetNextFontTableRecord
893f5736e95SDavid du Colombier  *
894f5736e95SDavid du Colombier  * returns the next record in the table or NULL if there is no next record
895f5736e95SDavid du Colombier  */
896f5736e95SDavid du Colombier const font_table_type *
pGetNextFontTableRecord(const font_table_type * pRecordCurr)897f5736e95SDavid du Colombier pGetNextFontTableRecord(const font_table_type *pRecordCurr)
898f5736e95SDavid du Colombier {
899*25b329d5SDavid du Colombier 	size_t	tIndexCurr;
900f5736e95SDavid du Colombier 
901f5736e95SDavid du Colombier 	if (pRecordCurr == NULL) {
902*25b329d5SDavid du Colombier 		/* No current record, so start with the first one */
903f5736e95SDavid du Colombier 		return &pFontTable[0];
904f5736e95SDavid du Colombier 	}
905f5736e95SDavid du Colombier 
906*25b329d5SDavid du Colombier 	if (pRecordCurr < pFontTable ||
907*25b329d5SDavid du Colombier 	    pRecordCurr >= pFontTable + tFontTableRecords) {
908*25b329d5SDavid du Colombier 		/* Not a pointer in the array */
909*25b329d5SDavid du Colombier 		DBG_HEX(pRecordCurr);
910*25b329d5SDavid du Colombier 		DBG_HEX(pFontTable);
911*25b329d5SDavid du Colombier 		return NULL;
912*25b329d5SDavid du Colombier 	}
913*25b329d5SDavid du Colombier 
914*25b329d5SDavid du Colombier 	tIndexCurr = (size_t)(pRecordCurr - pFontTable);
915*25b329d5SDavid du Colombier 	if (tIndexCurr + 1 < tFontTableRecords) {
916f5736e95SDavid du Colombier 		/* There is a next record, so return it */
917*25b329d5SDavid du Colombier 		return &pFontTable[tIndexCurr + 1];
918f5736e95SDavid du Colombier 	}
919f5736e95SDavid du Colombier 	/* There is no next record */
920f5736e95SDavid du Colombier 	return NULL;
921f5736e95SDavid du Colombier } /* end of pGetNextFontTableRecord */
922f5736e95SDavid du Colombier 
923f5736e95SDavid du Colombier /*
924f5736e95SDavid du Colombier  * tGetFontTableLength
925f5736e95SDavid du Colombier  *
926f5736e95SDavid du Colombier  * returns the number of records in the internal font table
927f5736e95SDavid du Colombier  */
928f5736e95SDavid du Colombier size_t
tGetFontTableLength(void)929f5736e95SDavid du Colombier tGetFontTableLength(void)
930f5736e95SDavid du Colombier {
931f5736e95SDavid du Colombier 	return tFontTableRecords;
932f5736e95SDavid du Colombier } /* end of tGetFontTableLength */
933*25b329d5SDavid du Colombier 
934*25b329d5SDavid du Colombier #if !defined(__riscos)
935*25b329d5SDavid du Colombier /*
936*25b329d5SDavid du Colombier  * vCorrect4PDF - only include PDF default fonts
937*25b329d5SDavid du Colombier  */
938*25b329d5SDavid du Colombier static void
vCorrect4PDF(void)939*25b329d5SDavid du Colombier vCorrect4PDF(void)
940*25b329d5SDavid du Colombier {
941*25b329d5SDavid du Colombier 	font_table_type	*pTmp;
942*25b329d5SDavid du Colombier 	const char	*szOurFont;
943*25b329d5SDavid du Colombier 
944*25b329d5SDavid du Colombier 	for (pTmp = pFontTable; pTmp < pFontTable + tFontTableRecords; pTmp++) {
945*25b329d5SDavid du Colombier 		if (STRCEQ(pTmp->szOurFontname, FONT_MONOSPACED_PLAIN) ||
946*25b329d5SDavid du Colombier 		    STRCEQ(pTmp->szOurFontname, FONT_MONOSPACED_BOLD) ||
947*25b329d5SDavid du Colombier 		    STRCEQ(pTmp->szOurFontname, FONT_MONOSPACED_ITALIC) ||
948*25b329d5SDavid du Colombier 		    STRCEQ(pTmp->szOurFontname, FONT_MONOSPACED_BOLDITALIC) ||
949*25b329d5SDavid du Colombier 		    STRCEQ(pTmp->szOurFontname, FONT_SERIF_PLAIN) ||
950*25b329d5SDavid du Colombier 		    STRCEQ(pTmp->szOurFontname, FONT_SERIF_BOLD) ||
951*25b329d5SDavid du Colombier 		    STRCEQ(pTmp->szOurFontname, FONT_SERIF_ITALIC) ||
952*25b329d5SDavid du Colombier 		    STRCEQ(pTmp->szOurFontname, FONT_SERIF_BOLDITALIC) ||
953*25b329d5SDavid du Colombier 		    STRCEQ(pTmp->szOurFontname, FONT_SANS_SERIF_PLAIN) ||
954*25b329d5SDavid du Colombier 		    STRCEQ(pTmp->szOurFontname, FONT_SANS_SERIF_BOLD) ||
955*25b329d5SDavid du Colombier 		    STRCEQ(pTmp->szOurFontname, FONT_SANS_SERIF_ITALIC) ||
956*25b329d5SDavid du Colombier 		    STRCEQ(pTmp->szOurFontname, FONT_SANS_SERIF_BOLDITALIC)) {
957*25b329d5SDavid du Colombier 			/* Already a default font */
958*25b329d5SDavid du Colombier 			continue;
959*25b329d5SDavid du Colombier 		}
960*25b329d5SDavid du Colombier 		szOurFont =
961*25b329d5SDavid du Colombier 			szGetDefaultFont(pTmp->ucFFN, (int)pTmp->ucEmphasis);
962*25b329d5SDavid du Colombier 		(void)strncpy(pTmp->szOurFontname, szOurFont,
963*25b329d5SDavid du Colombier 			sizeof(pTmp->szOurFontname) - 1);
964*25b329d5SDavid du Colombier 		pTmp->szOurFontname[sizeof(pTmp->szOurFontname) - 1] = '\0';
965*25b329d5SDavid du Colombier 	}
966*25b329d5SDavid du Colombier } /* end of vCorrect4PDF */
967*25b329d5SDavid du Colombier 
968*25b329d5SDavid du Colombier /*
969*25b329d5SDavid du Colombier  * vCorrect4CyrPS - only include monospaced fonts
970*25b329d5SDavid du Colombier  */
971*25b329d5SDavid du Colombier static void
vCorrect4CyrPS(void)972*25b329d5SDavid du Colombier vCorrect4CyrPS(void)
973*25b329d5SDavid du Colombier {
974*25b329d5SDavid du Colombier 	font_table_type	*pTmp;
975*25b329d5SDavid du Colombier 	const char	*szOurFont;
976*25b329d5SDavid du Colombier 	UCHAR	ucFFN;
977*25b329d5SDavid du Colombier 
978*25b329d5SDavid du Colombier 	ucFFN = (FAMILY_UNKNOWN << 4) | PITCH_FIXED;
979*25b329d5SDavid du Colombier 	for (pTmp = pFontTable; pTmp < pFontTable + tFontTableRecords; pTmp++) {
980*25b329d5SDavid du Colombier 		szOurFont = szGetDefaultFont(ucFFN, (int)pTmp->ucEmphasis);
981*25b329d5SDavid du Colombier 		(void)strncpy(pTmp->szOurFontname, szOurFont,
982*25b329d5SDavid du Colombier 			sizeof(pTmp->szOurFontname) - 1);
983*25b329d5SDavid du Colombier 		pTmp->szOurFontname[sizeof(pTmp->szOurFontname) - 1] = '\0';
984*25b329d5SDavid du Colombier 	}
985*25b329d5SDavid du Colombier } /* end of vCorrect4CyrPS */
986*25b329d5SDavid du Colombier #endif /* __riscos */
987*25b329d5SDavid du Colombier 
988*25b329d5SDavid du Colombier /*
989*25b329d5SDavid du Colombier  * vCorrectFontTable - correct the font table in special cases
990*25b329d5SDavid du Colombier  */
991*25b329d5SDavid du Colombier void
vCorrectFontTable(conversion_type eConversionType,encoding_type eEncoding)992*25b329d5SDavid du Colombier vCorrectFontTable(conversion_type eConversionType, encoding_type eEncoding)
993*25b329d5SDavid du Colombier {
994*25b329d5SDavid du Colombier #if !defined(__riscos)
995*25b329d5SDavid du Colombier 	if (eConversionType == conversion_pdf) {
996*25b329d5SDavid du Colombier 		vCorrect4PDF();
997*25b329d5SDavid du Colombier 	}
998*25b329d5SDavid du Colombier 	if (eConversionType == conversion_ps &&
999*25b329d5SDavid du Colombier 	    eEncoding == encoding_cyrillic) {
1000*25b329d5SDavid du Colombier 		vCorrect4CyrPS();
1001*25b329d5SDavid du Colombier 	}
1002*25b329d5SDavid du Colombier #endif /* __riscos */
1003*25b329d5SDavid du Colombier } /* end of vCorrectFontTable */
1004*25b329d5SDavid du Colombier 
1005*25b329d5SDavid du Colombier /*
1006*25b329d5SDavid du Colombier  * lComputeSpaceWidth - compute the width of a space character
1007*25b329d5SDavid du Colombier  *
1008*25b329d5SDavid du Colombier  * Returns the space width in millipoints
1009*25b329d5SDavid du Colombier  */
1010*25b329d5SDavid du Colombier long
lComputeSpaceWidth(drawfile_fontref tFontRef,USHORT usFontSize)1011*25b329d5SDavid du Colombier lComputeSpaceWidth(drawfile_fontref tFontRef, USHORT usFontSize)
1012*25b329d5SDavid du Colombier {
1013*25b329d5SDavid du Colombier 	char	szSpace[] = " ";
1014*25b329d5SDavid du Colombier 
1015*25b329d5SDavid du Colombier 	fail(usFontSize < MIN_FONT_SIZE || usFontSize > MAX_FONT_SIZE);
1016*25b329d5SDavid du Colombier 
1017*25b329d5SDavid du Colombier         return lComputeStringWidth(szSpace, 1, tFontRef, usFontSize);
1018*25b329d5SDavid du Colombier } /* end of lComputeSpaceWidth */
1019