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
);
93 D(bug("ReadFontDescr: No OTagList for outlined font\n"));
95 #warning "stegerg: CHECKME!! Prevent OTAG_ functions from being called on NULL/non existing otag / taglist"
96 fdh
->ContentsID
= TFCH_ID
;
100 if (!(numentries
+ numoutlineentries
)) goto failure
;
102 /* Allocate mem for array of TTextAttrs */
103 fdh
->TAttrArray
= AllocVec((fdh
->NumEntries
+ numoutlineentries
) * sizeof(struct TTextAttr
), MEMF_ANY
|MEMF_CLEAR
);
104 if (!fdh
->TAttrArray
) goto failure
;
106 tattr
= fdh
->TAttrArray
;
111 /* Read the fontname */
114 UWORD len
= 0; /* Length of fontname in file including null-termination */
120 if (!ReadByte( &DFB(DiskfontBase
)->dsh
, strptr
, (void *)fh
))
127 /* We set tattr->tta_Name to the real font name, for
128 example FONTS:helvetica/15 */
130 if (!(tattr
->tta_Name
= AllocVec(len
+ 1, MEMF_ANY
)))
133 strcpy(tattr
->tta_Name
, strbuf
);
135 D(bug("ReadFontDescr: tta_Name \"%s\"\n", tattr
->tta_Name
));
137 /* Seek to the end of the fontnamebuffer ( - 2 if tagged) */
142 MAXFONTPATH
- ( len
+ (fdh
->Tagged
? 2 : 0) ),
147 /* Do special stuff for files with tags in them */
151 /* Next thing up is the tagcount */
152 if (!ReadWord(&DFB(DiskfontBase
)->dsh
, &numtags
, (void *)fh
))
158 /* Seek back and read the tags. Note, that the TAG_DONE
159 tagitem "goes over" the numtags, ie. it's ti_Data will
160 contain the numtags in the lower WORD:
164 00000000 80000008 00370000 80000001
165 003F003F 80000002 00640064 00000000
166 00000004 00378022 \TAG_DONE
179 -(numtags
* 8), /* sizeof (struct TagItem) = 8 */
183 if (!(tattr
->tta_Tags
= ReadTags(fh
, numtags
, DFB(DiskfontBase
) )))
188 tattr
->tta_Tags
= NULL
;
190 } /* if (fdh->Tagged) */
192 tattr
->tta_Tags
= NULL
;
194 D(bug("ReadFontDescr: font \"%s\" tags %p\n", tattr
->tta_Name
, tattr
->tta_Tags
));
196 /* Read the rest of the info */
197 if (!ReadWord( &DFB(DiskfontBase
)->dsh
, &(tattr
->tta_YSize
), (void *)fh
))
200 if (!ReadByte(&DFB(DiskfontBase
)->dsh
, &(tattr
->tta_Style
), (void *)fh
))
203 if (!ReadByte( &DFB(DiskfontBase
)->dsh
, &(tattr
->tta_Flags
), (void *)fh
))
208 } /* while (numentries--) */
212 if (numoutlineentries
)
214 UBYTE flags
= OTAG_GetFontFlags(fdh
->OTagList
, DiskfontBase
);
215 UBYTE style
= OTAG_GetFontStyle(fdh
->OTagList
, DiskfontBase
);
217 while(numoutlineentries
--)
223 size
= AROS_BE2WORD(*availsizes
);
226 /* Check if this size already exists as bitmap
227 font. If it does, then ignore it */
229 for(i
= 0; i
< fdh
->NumEntries
; i
++)
231 if (fdh
->TAttrArray
[i
].tta_YSize
== size
)
238 if (exists
) continue;
240 /* NumEntries contains the total number of entries, ie.
241 bitmap fonts and outline fonts included. NumOutlineEntries
242 tells how many among these (at the end of the array) are
246 fdh
->NumOutlineEntries
++;
248 tattr
->tta_Name
= fdh
->OTagList
->filename
;
249 tattr
->tta_YSize
= size
;
250 tattr
->tta_Flags
= flags
;
251 tattr
->tta_Style
= style
;
252 tattr
->tta_Tags
= NULL
;
254 D(bug("ReadFontDescr: font \"%s\" tags %p\n", tattr
->tta_Name
, tattr
->tta_Tags
));
257 } /* while(numoutlineentries--) */
259 } /* if (numoutlineentries) */
261 ReturnPtr ("ReadFontDescr", struct FontDescrHeader
*, fdh
);
264 /* Free all allocated memory */
269 FreeFontDescr(fdh
, DFB(DiskfontBase
) );
271 ReturnPtr ("ReadFontDescr", struct FontDescrHeader
*, FALSE
);
275 /****************************************************************************************/
281 /****************************************************************************************/
283 VOID
FreeFontDescr(struct FontDescrHeader
*fdh
, struct DiskfontBase_intern
*DiskfontBase
)
285 struct TTextAttr
*tattr
;
289 D(bug("FreeFontDescr(fdh=%p\n", fdh
));
293 tattr
= fdh
->TAttrArray
;
294 numentries
= fdh
->NumEntries
- fdh
->NumOutlineEntries
;
298 /* Go through the whole array of bitmap font entries
299 freeing strings and tags. Outline font entries
300 always have the tta_Name pointing to the otag file
301 and must not get the tta_Name freed. They also have
302 tta_Tags always being NULL. Therefore the loop below
303 goes only through the bitmap font entries */
308 FreeVec(tattr
->tta_Name
);
311 FreeVec(tattr
->tta_Tags
);
316 FreeVec(fdh
->TAttrArray
);
319 if (fdh
->OTagList
) OTAG_KillFile(fdh
->OTagList
, DiskfontBase
);
321 FreeMem(fdh
, sizeof (struct FontDescrHeader
));
324 ReturnVoid("FreeFontDescr");
327 /****************************************************************************************/