2 Copyright © 1995-2001, The AROS Development Team. All rights reserved.
5 Desc: Functions for readin .font files
9 /****************************************************************************************/
11 #include <diskfont/diskfonttag.h>
12 #include <aros/macros.h>
14 #include <proto/dos.h>
15 #include <proto/utility.h>
16 #include <proto/arossupport.h>
18 #include "diskfont_intern.h"
20 #include <aros/debug.h>
22 /****************************************************************************************/
28 /****************************************************************************************/
30 struct FontDescrHeader
*ReadFontDescr(CONST_STRPTR filename
, struct DiskfontBase_intern
*DiskfontBase
)
32 struct FontDescrHeader
*fdh
= 0;
33 struct TTextAttr
*tattr
;
35 UWORD aword
, numentries
, numtags
;
36 UWORD
*availsizes
= NULL
;
37 UWORD numoutlineentries
= 0;
38 UBYTE strbuf
[MAXFONTPATH
+ 1];
40 D(bug("ReadFontDescr(filename=%s\n", filename
));
42 /* Allocate the FontDescrHeader */
43 if (!(fh
= Open(filename
, MODE_OLDFILE
)))
46 if (!(fdh
= AllocMem(sizeof (struct FontDescrHeader
), MEMF_ANY
| MEMF_CLEAR
)) )
49 /* First read the file id (FCH_ID or TFCH_ID) */
50 if (!ReadWord( &DFB(DiskfontBase
)->dsh
, &aword
, (void *)fh
))
53 /* Check that this is a .font file */
55 if ( (aword
!= FCH_ID
) && (aword
!= TFCH_ID
) && (aword
!= OFCH_ID
) )
57 D(bug("ReadFontDescr: unsupported file id\n"));
61 fdh
->ContentsID
= aword
;
63 fdh
->Tagged
= ((aword
== TFCH_ID
) || (aword
== OFCH_ID
));
65 /* Read number of (T)FontContents structs in the file */
66 if (!ReadWord( &DFB(DiskfontBase
)->dsh
, &numentries
, (void *)fh
))
68 D(bug("ReadFontDescr: error reading numentries\n"));
72 fdh
->NumEntries
= numentries
;
74 if (fdh
->ContentsID
== OFCH_ID
)
76 fdh
->OTagList
= OTAG_GetFile(filename
, DiskfontBase
);
79 availsizes
= (UWORD
*)GetTagData(OT_AvailSizes
, (IPTR
) NULL
, fdh
->OTagList
->tags
);
82 /* OT_AvailSizes points to an UWORD array, where the first UWORD
83 is the number of entries, and the following <numentry> UWORD's
86 numoutlineentries
= AROS_BE2WORD(*availsizes
);
92 D(bug("ReadFontDescr: No OTagList for outlined font\n"));
95 if (!(numentries
+ numoutlineentries
)) goto failure
;
97 /* Allocate mem for array of TTextAttrs */
98 fdh
->TAttrArray
= AllocVec((fdh
->NumEntries
+ numoutlineentries
) * sizeof(struct TTextAttr
), MEMF_ANY
|MEMF_CLEAR
);
99 if (!fdh
->TAttrArray
) goto failure
;
101 tattr
= fdh
->TAttrArray
;
106 /* Read the fontname */
109 UWORD len
= 0; /* Length of fontname in file including null-termination */
115 if (!ReadByte( &DFB(DiskfontBase
)->dsh
, strptr
, (void *)fh
))
122 /* We set tattr->tta_Name to the real font name, for
123 example FONTS:helvetica/15 */
125 if (!(tattr
->tta_Name
= AllocVec(len
+ 1, MEMF_ANY
)))
128 strcpy(tattr
->tta_Name
, strbuf
);
130 D(bug("ReadFontDescr: tta_Name \"%s\"\n", tattr
->tta_Name
));
132 /* Seek to the end of the fontnamebuffer ( - 2 if tagged) */
137 MAXFONTPATH
- ( len
+ (fdh
->Tagged
? 2 : 0) ),
142 /* Do special stuff for files with tags in them */
146 /* Next thing up is the tagcount */
147 if (!ReadWord(&DFB(DiskfontBase
)->dsh
, &numtags
, (void *)fh
))
153 /* Seek back and read the tags. Note, that the TAG_DONE
154 tagitem "goes over" the numtags, ie. it's ti_Data will
155 contain the numtags in the lower WORD:
159 00000000 80000008 00370000 80000001
160 003F003F 80000002 00640064 00000000
161 00000004 00378022 \TAG_DONE
174 -(numtags
* 8), /* sizeof (struct TagItem) = 8 */
178 if (!(tattr
->tta_Tags
= ReadTags(fh
, numtags
, DFB(DiskfontBase
) )))
183 tattr
->tta_Tags
= NULL
;
185 } /* if (fdh->Tagged) */
187 tattr
->tta_Tags
= NULL
;
189 D(bug("ReadFontDescr: font \"%s\" tags %p\n", tattr
->tta_Name
, tattr
->tta_Tags
));
191 /* Read the rest of the info */
192 if (!ReadWord( &DFB(DiskfontBase
)->dsh
, &(tattr
->tta_YSize
), (void *)fh
))
195 if (!ReadByte(&DFB(DiskfontBase
)->dsh
, &(tattr
->tta_Style
), (void *)fh
))
198 if (!ReadByte( &DFB(DiskfontBase
)->dsh
, &(tattr
->tta_Flags
), (void *)fh
))
203 } /* while (numentries--) */
207 if (numoutlineentries
)
209 UBYTE flags
= OTAG_GetFontFlags(fdh
->OTagList
, DiskfontBase
);
210 UBYTE style
= OTAG_GetFontStyle(fdh
->OTagList
, DiskfontBase
);
212 while(numoutlineentries
--)
218 size
= AROS_BE2WORD(*availsizes
);
221 /* Check if this size already exists as bitmap
222 font. If it does, then ignore it */
224 for(i
= 0; i
< fdh
->NumEntries
; i
++)
226 if (fdh
->TAttrArray
[i
].tta_YSize
== size
)
233 if (exists
) continue;
235 /* NumEntries contains the total number of entries, ie.
236 bitmap fonts and outline fonts included. NumOutlineEntries
237 tells how many among these (at the end of the array) are
241 fdh
->NumOutlineEntries
++;
243 tattr
->tta_Name
= fdh
->OTagList
->filename
;
244 tattr
->tta_YSize
= size
;
245 tattr
->tta_Flags
= flags
;
246 tattr
->tta_Style
= style
;
247 tattr
->tta_Tags
= NULL
;
249 D(bug("ReadFontDescr: font \"%s\" tags %p\n", tattr
->tta_Name
, tattr
->tta_Tags
));
252 } /* while(numoutlineentries--) */
254 } /* if (numoutlineentries) */
256 ReturnPtr ("ReadFontDescr", struct FontDescrHeader
*, fdh
);
259 /* Free all allocated memory */
264 FreeFontDescr(fdh
, DFB(DiskfontBase
) );
266 ReturnPtr ("ReadFontDescr", struct FontDescrHeader
*, FALSE
);
270 /****************************************************************************************/
276 /****************************************************************************************/
278 VOID
FreeFontDescr(struct FontDescrHeader
*fdh
, struct DiskfontBase_intern
*DiskfontBase
)
280 struct TTextAttr
*tattr
;
284 D(bug("FreeFontDescr(fdh=%p\n", fdh
));
288 tattr
= fdh
->TAttrArray
;
289 numentries
= fdh
->NumEntries
- fdh
->NumOutlineEntries
;
293 /* Go through the whole array of bitmap font entries
294 freeing strings and tags. Outline font entries
295 always have the tta_Name pointing to the otag file
296 and must not get the tta_Name freed. They also have
297 tta_Tags always being NULL. Therefore the loop below
298 goes only through the bitmap font entries */
303 FreeVec(tattr
->tta_Name
);
306 FreeVec(tattr
->tta_Tags
);
311 FreeVec(fdh
->TAttrArray
);
314 if (fdh
->OTagList
) OTAG_KillFile(fdh
->OTagList
, DiskfontBase
);
316 FreeMem(fdh
, sizeof (struct FontDescrHeader
));
319 ReturnVoid("FreeFontDescr");
322 /****************************************************************************************/