Ooops
January 20, 2021, 01:36:23 PM

### Author Topic: [bb] Simple Proportional Font Routine by WildCat [ 1+ years ago ]  (Read 741 times)

#### BlitzBot

• Jr. Member
• Posts: 1
##### [bb] Simple Proportional Font Routine by WildCat [ 1+ years ago ]
« on: June 29, 2017, 12:28:43 AM »
Title : Simple Proportional Font Routine
Author : WildCat
Posted : 1+ years ago

Description : This routine was based on the proportional bitmap font format by Adreas Jonsson (www.AngelCode.com, as he reffers). Maybe I invented a bicycle, but this is really usable in many ways. It works in 2D modes and features string divisioning at space [aka chr\$(32) ]. Global variable 'fontDir\$' may be used to place your fonts somewhere else. This code needs optimization in a couple of places, so let's improve it together, 'cause as I said it's usable widely. One little example will be posted very soon...

Code :
Code: BlitzBasic
1. Type WSymbol
2.         Field x
3.         Field y
4.         Field w
5.         Field h
6.         Field ox
7.         Field oy
8.         Field xa
9.         Field page
10. End Type
11.
12. Type WFont
13.         Field pages[10]
14.         Field symbols[256]
15.         Field name\$
16. End Type
17.
18. Function WSymbolNew.WSymbol (x, y, w, h, ox, oy, xa, page)
19.         sym.WSymbol= New WSymbol
20.         symx = x
21.         symy = y
22.         symw = w
23.         symh = h
24.         symox = ox
25.         symoy = oy
26.         symxa = xa
27.         sympage = page
28.
29.         Return (sym)
30. End Function
31.
32. Function WFontNew.WFont (filename\$)
33.         font.WFont = New WFont
34.
35.         font
36. ame\$ = filename\$
37.
38.         If fontDir\$ <> "" Then
39.                 filename\$ = fontDir\$ + filename\$
40.         EndIf
41.
45.
46.
47.         b = Instr (a\$, "pages=")
48.         pages = Mid (a\$, b+6)
49.
50.         If Left\$(filename\$,2) = ".." Then
51.                 beginFrom = 3
52.         Else
53.                 beginFrom = 1
54.         EndIf
55.
56.         c = Instr (filename\$, ".", beginfrom)
57.         basename\$ = Mid (filename\$, 1, c-1)
58.
59.         For b = 1 To pages
60.                 nam\$ = b-1
61.                 While Len(nam\$) < 2
62.                         nam\$ = "0"+nam\$
63.                 Wend
64.                 nam\$ = basename\$+"_"+nam\$+".png"
65.
66.                 ;If fontDir\$ <> "" Then nam\$ = fontDir\$ + nam\$
67.
70.         Next
71.
72.         While Eof (file) = 0
74.
75.                 sp = Instr (a\$, " ")
76.                 If sp Then
77.                         fw\$ = Mid (a\$, 1, sp-1)
78.                         If fw\$ = "kerning" Then Goto wfontcycend
79.                         If fw\$ = "mask" Then
80.                                 sp2 = Instr (a\$, " ", sp+1)
81.                                 sp3 = Instr (a\$, " ", sp2+1)
82.
83.                                 red = Mid (a\$, sp+1, sp2-sp)
84.                                 green = Mid (a\$, sp2+1, sp3-sp2)
85.                                 blue = Mid (a\$, sp3+1)
86.
87.                                 For b = 1 To pages
88.                                         MaskImage (fontpages[b], red, green, blue)
89.                                 Next
90.
91.                                 Goto wfontcycend
92.                         EndIf
93.                 EndIf
94.
95.                 b = Instr (a\$, "id=")
96.                 If b = 0 Then Goto wfontcycend
97.
98.                 c = Instr (a\$, " ", b)
99.                 id = Mid (a\$, b+3, c-b-3)
100.
101.                 b = Instr (a\$, "x=",c)
102.                 c = Instr (a\$, " ", b)
103.                 x = Mid (a\$, b+2, c-b-2)
104.
105.                 b = Instr (a\$, "y=",c)
106.                 c = Instr (a\$, " ", b)
107.                 y = Mid (a\$, b+2, c-b-2)
108.
109.                 b = Instr (a\$, "width=",c)
110.                 c = Instr (a\$, " ", b)
111.                 w = Mid (a\$, b+6, c-b-6)
112.
113.                 b = Instr (a\$, "height=",c)
114.                 c = Instr (a\$, " ", b)
115.                 h = Mid (a\$, b+7, c-b-7)
116.
117.                 b = Instr (a\$, "xoffset=",c)
118.                 c = Instr (a\$, " ", b)
119.                 ox = Mid (a\$, b+8, c-b-8)
120.
121.                 b = Instr (a\$, "yoffset=",c)
122.                 c = Instr (a\$, " ", b)
123.                 oy = Mid (a\$, b+8, c-b-8)
124.
125.                 b = Instr (a\$, "xadvance=",c)
126.                 c = Instr (a\$, " ", b)
127.                 xa = Mid (a\$, b+9, c-b-9)
128.
129.                 b = Instr (a\$, "page=",c)
130.                 page = Mid (a\$, b+5)
131.
132.                 fontsymbols[id+1] = Handle (WSymbolNew(x, y, w, h, ox, oy, xa, page))
133.
134.                 .wfontcycend
135.         Wend
136.
137.         Return (font)
138. End Function
139.
140. Function WFontText (font.WFont, s\$, x, y)
141.         For a = 1 To Len(s\$)
142.                 b = Asc (Mid(s\$, a, 1))
143.                 If fontsymbols[b+1] Then
144.                         sym.WSymbol = Object.WSymbol(fontsymbols[b+1])
145.                         DrawImageRect (fontpages[sympage+1], x+symox, y+symoy, symx, symy, symw, symh)
146.                         x = x + symxa
147.                 EndIf
148.         Next
149. End Function
150.
151. Function WFontWidth (font.WFont, s\$)
152.         w = 0
153.         For a = 1 To Len(s\$)
154.                 b = Asc (Mid(s\$, a, 1))
155.                 If fontsymbols[b+1] Then
156.                         sym.WSymbol = Object.WSymbol(fontsymbols[b+1])
157.                         w = w + symxa
158.                 EndIf
159.         Next
160.         Return w
161. End Function
162.
163. Function WFontHeight (font.WFont, s\$)
164.         h = 0
165.         For a = 1 To Len(s\$)
166.                 b = Asc (Mid(s\$, a, 1))
167.                 If fontsymbols[b+1] Then
168.                         sym.WSymbol = Object.WSymbol(fontsymbols[b+1])
169.                         If symoy+symh > h Then h = symoy+symh
170.                 EndIf
171.         Next
172.         Return h
173. End Function
174.
175. Function WFontByName.WFont (name\$)
176.         For font.WFont = Each WFont
177.                 If font
178. ame\$ = name\$ Then Return font
179.         Next
180.         Return Null
181. End Function
182.
183. Function WFontSpare (font.WFont, s\$, width, atSpace = True)
184.         w = 0
185.         For a = 1 To Len(s\$)
186.                 b = Asc (Mid(s\$, a, 1))
187.                 If fontsymbols[b+1] Then
188.                         sym.WSymbol = Object.WSymbol(fontsymbols[b+1])
189.                         wc = w + symox + symw + symxa ;strange formula, but everything is clear this way :)
190.                         w = w + symxa
191.                         If wc > width Then
192.                                 If atSpace Then
193.                                         b = a
194.                                         Repeat
195.                                                 If Mid(s\$, b, 1) = " " Then Return b+1
196.                                                 b = b - 1
197.                                                 If b = 0 Then Return WFontSpare (font, s\$, width, False)
198.                                         Forever
199.                                         Return a
200.                                 Else
201.                                         Return a
202.                                 EndIf
203.                         EndIf
204.                 EndIf
205.         Next
206.
207.         Return 0
208. End Function
209.
210. Function WFontFree (font.WFont)
211.         For page = 1 To 10
212.                 If fontpages[page] Then FreeImage (fontpages[page])
213.         Next
214.
215.         For a = 1 To 256
216.                 If fontsymbols[a] Then
217.                         sym.WSymbol = Object.WSymbol(fontsymbols[b+1])
218.                         Delete sym
219.                 EndIf
220.         Next
221.
222.         Delete font
223. End Function
224.
225. Function WFontsFree ()
226.         For font.WFont = Each WFont
227.                 WFontFree(font)
228.         Next
229. End Function

`Include "wfont.bb"Function DebLog (s\$) ;this belongs to 'service.bb', but cut out of there to reduce code If debMode = 1 Then fname\$ = "debug.log" If FileSize(fname\$) = 0 Then file = WriteFile (fname\$) Else file = OpenFile (fname\$) EndIf SeekFile (file, FileSize(fname\$)) WriteLine (file, s\$) CloseFile (file) DebugLog (s\$) Else DebugLog (s\$) EndIfEnd FunctionGraphics 200,140,32,2ClsColor 255, 255, 255Clstahoma24black.WFont = WFontNew ("tahoma24black.fnt")WFontText (tahoma24black, "Hello World!", 45, 55)FlipWaitKeyEnd`And here goes media: <a href="http://project-a.ru/files/tahoma24black.zip" target="_blank">http://project-a.ru/files/tahoma24black.zip[/url] [/i]