1 #include <exec/initializers.h>
3 #include <diskfont/diskfont.h>
4 #include <graphics/text.h>
5 #include <graphics/gfxbase.h>
6 #include <intuition/intuition.h>
7 #include <proto/diskfont.h>
8 #include <proto/exec.h>
10 #include <proto/graphics.h>
11 #include <proto/utility.h>
12 #include <proto/intuition.h>
18 #define ARG_TEMPLATE "FONTNAME/A,FONTSIZE/N/A,XDPI/N,YDPI/N,BOLD/S,ITALIC/S,SHOW/S"
28 struct Library
*DiskfontBase
;
29 struct UtilityBase
*UtilityBase
;
30 struct GfxBase
*GfxBase
;
31 struct IntuitionBase
*IntuitionBase
;
33 struct TextFont
*font
;
35 ULONG fontsize
, xdpi
, ydpi
;
36 struct RDArgs
*myargs
;
40 static void cleanup(char *msg
)
42 if (msg
) printf("fontinfo: %s\n", msg
);
44 if (font
) CloseFont(font
);
46 if (UtilityBase
) CloseLibrary((struct Library
*)UtilityBase
);
47 if (GfxBase
) CloseLibrary((struct Library
*)GfxBase
);
48 if (IntuitionBase
) CloseLibrary((struct Library
*)IntuitionBase
);
49 if (DiskfontBase
) CloseLibrary(DiskfontBase
);
51 if (myargs
) FreeArgs(myargs
);
56 static void getarguments(void)
58 myargs
= ReadArgs(ARG_TEMPLATE
, args
, NULL
);
61 Fault(IoErr(), 0, s
, 255);
65 fontname
= (STRPTR
)args
[ARG_NAME
];
66 fontsize
= *(LONG
*)args
[ARG_SIZE
];
68 xdpi
= args
[ARG_XDPI
] ? *(LONG
*)args
[ARG_XDPI
] : 72;
69 ydpi
= args
[ARG_YDPI
] ? *(LONG
*)args
[ARG_YDPI
] : 72;
73 static void openlibs(void)
75 DiskfontBase
= OpenLibrary("diskfont.library", 38);
76 if (!DiskfontBase
) cleanup("Can't open diskfont.library!");
78 GfxBase
= (struct GfxBase
*)OpenLibrary("graphics.library", 38);
79 if (!GfxBase
) cleanup("Can't open graphics.library!");
81 IntuitionBase
= (struct IntuitionBase
*)OpenLibrary("intuition.library", 38);
82 if (!IntuitionBase
) cleanup("Can't open intuition.library!");
84 UtilityBase
= (struct UtilityBase
*)OpenLibrary("utility.library", 38);
85 if (!UtilityBase
) cleanup("Can't open utility.library!");
88 static void openfont(void)
91 struct TagItem tags
[] =
93 {TA_DeviceDPI
, (xdpi
<< 16) | ydpi
},
97 ta
.tta_Name
= fontname
;
98 ta
.tta_YSize
= fontsize
;
99 ta
.tta_Style
= FSF_TAGGED
;
100 if (args
[ARG_BOLD
]) ta
.tta_Style
|= FSF_BOLD
;
101 if (args
[ARG_ITALIC
]) ta
.tta_Style
|= FSF_ITALIC
;
103 ta
.tta_Flags
= FPF_DESIGNED
;
106 printf("fontname = \"%s\" fontsize = %ld\n", fontname
, fontsize
);
108 font
= OpenDiskFont((struct TextAttr
*)&ta
);
109 if (!font
) cleanup("Could not open font!");
111 printf("Opened font addr = %p\n", font
);
112 printf("Opened font has xsize = %d ysize = %d baseline = %d flags = 0x%x style = 0x%x\n",
118 printf("boldsmear = %d\n", font
->tf_BoldSmear
);
119 printf("tf_CharData = %p\n", font
->tf_CharData
);
121 if (font
->tf_Flags
& FPF_DISKFONT
)
123 struct DiskFontHeader
*dfh
= (struct DiskFontHeader
*)(((UBYTE
*)font
) - (UBYTE
*)OFFSET(DiskFontHeader
, dfh_TF
));
125 printf("DiskFontHeader:\n");
126 printf(" succ %p\n", dfh
->dfh_DF
.ln_Succ
);
127 printf(" pred %p\n", dfh
->dfh_DF
.ln_Pred
);
128 printf(" type %x\n", dfh
->dfh_DF
.ln_Type
);
129 printf(" pri %x\n", dfh
->dfh_DF
.ln_Pri
);
130 printf(" name %p (%s)\n", dfh
->dfh_DF
.ln_Name
, dfh
->dfh_DF
.ln_Name
);
131 printf(" FileID %x\n", dfh
->dfh_FileID
);
132 printf(" Revision %x\n", dfh
->dfh_Revision
);
133 printf(" Segment %p\n", dfh
->dfh_Segment
);
134 printf(" Name %p (%s)\n", dfh
->dfh_Name
, dfh
->dfh_Name
);
137 printf("tf_Message:\n");
138 printf(" succ %p\n", font
->tf_Message
.mn_Node
.ln_Succ
);
139 printf(" pred %p\n", font
->tf_Message
.mn_Node
.ln_Pred
);
140 printf(" type %x\n", font
->tf_Message
.mn_Node
.ln_Type
);
141 printf(" pri %x\n", font
->tf_Message
.mn_Node
.ln_Pri
);
142 printf(" name %p (%s)\n", font
->tf_Message
.mn_Node
.ln_Name
, font
->tf_Message
.mn_Node
.ln_Name
);
143 printf(" replyport %p\n", font
->tf_Message
.mn_ReplyPort
);
144 printf(" length %x\n", font
->tf_Message
.mn_Length
);
146 printf("textfontextension:\n");
147 if (ExtendFont(font
, 0))
149 struct TextFontExtension
*tfe
= ((struct TextFontExtension
*)font
->tf_Extension
);
150 struct TagItem
*extension
= tfe
->tfe_Tags
;
151 struct TagItem
*tag
, *tstate
= extension
;
154 printf(" taglist:\n");
155 while((tag
= NextTagItem((const struct TagItem
**)&tstate
)))
157 printf(" {0x%08lx,0x%08lx}\n", tag
->ti_Tag
, tag
->ti_Data
);
160 dpivalue
= GetTagData(TA_DeviceDPI
, 0, extension
);
162 printf(" ta_devicedpi of opened font is: xdpi %ld ydpi: %ld\n",
163 dpivalue
>> 16, dpivalue
& 0xFFFF);
165 printf(" tfe_MatchWord %x\n", tfe
->tfe_MatchWord
);
166 printf(" tfe_Flags0 %x\n", tfe
->tfe_Flags0
);
167 printf(" tfe_Flags1 %x\n", tfe
->tfe_Flags1
);
168 printf(" tfe_OrigReplyPort %p\n", tfe
->tfe_OrigReplyPort
);
169 printf(" tfe_OFontPatchS %p\n", tfe
->tfe_OFontPatchS
);
170 printf(" tfe_OFontPatchK %p\n", tfe
->tfe_OFontPatchK
);
173 if (font
->tf_Style
& FSF_COLORFONT
)
175 struct ColorTextFont
*ctf
= (struct ColorTextFont
*)font
;
178 printf(" ctf_Flags %x\n", ctf
->ctf_Flags
);
179 printf(" ctf_Depth %x\n", ctf
->ctf_Depth
);
180 printf(" ctf_FgColor %x\n", ctf
->ctf_FgColor
);
181 printf(" ctf_Low %x\n", ctf
->ctf_Low
);
182 printf(" ctf_High %x\n", ctf
->ctf_High
);
183 printf(" ctf_PlanePick %x\n", ctf
->ctf_PlanePick
);
184 printf(" ctf_PlaneOnOff %x\n", ctf
->ctf_PlaneOnOff
);
185 printf(" ctf_colorFontColors %p\n", ctf
->ctf_ColorFontColors
);
187 for(i
= 0; i
<8; i
++)
189 printf(" ctf_CharData[%d] %p\n", i
, ctf
->ctf_CharData
[i
]);
194 struct TextFont
*tf
= (struct TextFont
*)GfxBase
->TextFonts
.lh_Head
;
196 printf("SYSFONTLIST:\n");
197 while(tf
->tf_Message
.mn_Node
.ln_Succ
)
199 printf(" addr %p name %s size %d\n", tf
, tf
->tf_Message
.mn_Node
.ln_Name
, tf
->tf_YSize
);
200 tf
= (struct TextFont
*)tf
->tf_Message
.mn_Node
.ln_Succ
;
205 static void action(void)
208 LONG totcharsize
= 0;
209 LONG totcharkern
= 0;
210 LONG totcharspace
= 0;
211 LONG totsomething
= 0;
212 LONG numsomething
= 0;
213 LONG numcharspace
= 0;
215 printf("lowchar = %d\n", font
->tf_LoChar
);
216 printf("hichar = %d\n", font
->tf_HiChar
);
217 printf("isprop = %s\n", (font
->tf_Flags
& FPF_PROPORTIONAL
) ? "yes" : "no");
218 printf("haskern = %s\n", font
->tf_CharKern
? "yes" : "no");
219 printf("hasspace = %s\n", font
->tf_CharSpace
? "yes" : "no");
222 for(i
= font
->tf_LoChar
; i
<= font
->tf_HiChar
+ 1; i
++)
224 printf("#%03d kerning = %s%4d%s blackwidth = %4ld spacing = %s%4d%s\n",
226 font
->tf_CharKern
? "" : "[",
227 (font
->tf_CharKern
? ((WORD
*)font
->tf_CharKern
)[i
- font
->tf_LoChar
] : 0),
228 font
->tf_CharKern
? "" : "]",
229 ((LONG
*)font
->tf_CharLoc
)[i
- font
->tf_LoChar
] & 0xFFFF,
230 font
->tf_CharSpace
? "" : "[",
231 (font
->tf_CharSpace
? ((WORD
*)font
->tf_CharSpace
)[i
- font
->tf_LoChar
] : 0),
232 font
->tf_CharSpace
? "" : "]");
234 if (font
->tf_CharKern
) totcharkern
+= ((WORD
*)font
->tf_CharKern
)[i
- font
->tf_LoChar
];
235 if (font
->tf_CharSpace
)
237 ULONG old_totcharspace
= totcharspace
;
238 totcharspace
+= ((WORD
*)font
->tf_CharSpace
)[i
- font
->tf_LoChar
];
239 if (totcharspace
!= old_totcharspace
) numcharspace
++;
242 totcharsize
+= ((LONG
*)font
->tf_CharLoc
)[i
- font
->tf_LoChar
] & 0xFFFF;
244 if ((i
>= 110) && (font
->tf_CharKern
&& font
->tf_CharSpace
))
246 ULONG old_totsomething
= totsomething
;
247 totsomething
+= ((WORD
*)font
->tf_CharSpace
)[i
- font
->tf_LoChar
] +
248 ((WORD
*)font
->tf_CharKern
)[i
- font
->tf_LoChar
];
250 if (totsomething
!= old_totsomething
)
256 if (numsomething
) printf("average something = %ld\n", totsomething
/ numsomething
);
257 if (numcharspace
) printf("average charspace = %ld\n", totcharspace
/ numcharspace
);
260 static void showfont(void)
262 static char *text
= "ABCDEFGHabcdefgh1234567890";
263 static struct RastPort temprp
;
264 struct TextExtent te
;
268 InitRastPort(&temprp
);
269 SetFont(&temprp
, font
);
271 TextExtent(&temprp
, text
, strlen(text
), &te
);
273 if ((scr
= LockPubScreen(NULL
)))
275 win
= OpenWindowTags(NULL
, WA_PubScreen
, scr
,
276 WA_InnerWidth
, te
.te_Width
+ 6,
277 WA_InnerHeight
, te
.te_Height
+ 6,
278 WA_CloseGadget
, TRUE
,
280 WA_DepthGadget
, TRUE
,
282 WA_IDCMP
, IDCMP_CLOSEWINDOW
| IDCMP_VANILLAKEY
,
283 WA_Title
, "FontInfo",
288 SetFont(win
->RPort
, font
);
289 SetAPen(win
->RPort
, 1);
290 Move(win
->RPort
, win
->BorderLeft
+ 3 - te
.te_Extent
.MinX
,
291 win
->BorderTop
+ 3 - te
.te_Extent
.MinY
);
292 Text(win
->RPort
, text
, strlen(text
));
293 WaitPort(win
->UserPort
);
296 UnlockPubScreen(NULL
, scr
);
306 if (args
[ARG_SHOW
]) showfont();