Skip to content

Commit 35ceb42

Browse files
committed
QB64PE Code
BMFont Loader
1 parent 75cf7b5 commit 35ceb42

3 files changed

Lines changed: 216 additions & 0 deletions

File tree

Lines changed: 115 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,115 @@
1+
'Quick and dirty QB64PE BMFont Loader
2+
'Use Raster Master to create BMFont font sheets
3+
'
4+
'replace test.fnt and test.png with other generated files
5+
6+
fntFile$ = "test.fnt" 'text-format .fnt
7+
pngFile$ = "test.png" 'texture page 0
8+
9+
10+
Screen _NewImage(800, 600, 32)
11+
LoadBMFont fntFile$, pngFile$
12+
Line (0, 0)-(100, 100), _RGB32(255, 0, 0), BF
13+
14+
PrintBMF 20, 20, "Hello from QB64-PE BMFont!", _RGB32(255, 255, 0)
15+
16+
Print "Press any key to quit"
17+
Sleep
18+
19+
20+
21+
'============ 1. TYPE ===========================
22+
Type BMFchar
23+
x As Integer
24+
y As Integer
25+
w As Integer
26+
h As Integer
27+
xo As Integer
28+
yo As Integer
29+
xadv As Integer
30+
End Type
31+
32+
'============ 2. GLOBALS =======================
33+
Dim Shared fontChar(0 To 255) As BMFchar
34+
Dim Shared fontTex&
35+
Dim Shared fontLineH%, fontBase%
36+
37+
'============ 3. LOADER ========================
38+
Sub LoadBMFont (fnt$, png$)
39+
Open fnt$ For Input As #1
40+
Do Until EOF(1)
41+
Line Input #1, l$
42+
l$ = _Trim$(l$)
43+
44+
If Left$(l$, 5) = "info " Then
45+
fontLineH% = Val(ReadKey$(l$, "lineHeight="))
46+
fontBase% = Val(ReadKey$(l$, "base="))
47+
48+
ElseIf Left$(l$, 5) = "page " Then
49+
fontTex& = _LoadImage(png$)
50+
If fontTex& = 0 Then Print "ERROR: load "; png$: Close: End
51+
52+
ElseIf Left$(l$, 5) = "char " Then
53+
id% = Val(ReadKey$(l$, "id="))
54+
If id% >= 0 And id% <= 255 Then
55+
fontChar(id%).x = Val(ReadKey$(l$, "x="))
56+
fontChar(id%).y = Val(ReadKey$(l$, "y="))
57+
fontChar(id%).w = Val(ReadKey$(l$, "width="))
58+
fontChar(id%).h = Val(ReadKey$(l$, "height="))
59+
fontChar(id%).xo = Val(ReadKey$(l$, "xoffset="))
60+
fontChar(id%).yo = Val(ReadKey$(l$, "yoffset="))
61+
fontChar(id%).xadv = Val(ReadKey$(l$, "xadvance="))
62+
End If
63+
End If
64+
Loop
65+
Close #1
66+
End Sub
67+
68+
'---------- helper ----------
69+
Function ReadKey$ (s$, k$)
70+
p = InStr(s$, k$): If p = 0 Then ReadKey$ = "0": Exit Function
71+
p2 = InStr(p + Len(k$), s$, " "): If p2 = 0 Then p2 = Len(s$) + 1
72+
ReadKey$ = Mid$(s$, p + Len(k$), p2 - p - Len(k$))
73+
End Function
74+
75+
Sub CopyImageRect (srcHandle&, srcx%, srcy%, dstx%, dsty%, w%, h%, col&)
76+
Dim sx, sy, dx, dy As Integer
77+
78+
_Source srcHandle&
79+
For sy = 0 To h% - 1
80+
For sx = 0 To w% - 1
81+
c& = Point(srcx% + sx, srcy% + sy)
82+
If _Red32(c&) > 0 Or _Green32(c&) Or _Blue32(c&) > 0 Then PSet (dstx% + sx, dsty% + sy), col&
83+
Next sx
84+
Next sy
85+
_Source _Dest
86+
End Sub
87+
88+
'============ 4. DRAW ==========================
89+
Sub PrintBMF (x%, y%, txt$, col&)
90+
dstx% = x%
91+
For i% = 1 To Len(txt$)
92+
c% = Asc(Mid$(txt$, i%, 1))
93+
94+
'cache metrics locally (optional, but cleaner)
95+
chX = fontChar(c%).x
96+
chY = fontChar(c%).y
97+
chW = fontChar(c%).w
98+
chH = fontChar(c%).h
99+
chXo = fontChar(c%).xo
100+
chYo = fontChar(c%).yo
101+
chAdv = fontChar(c%).xadv
102+
103+
dstx% = dstx% + chXo
104+
dstY% = y% + chYo
105+
106+
'---- tint-and-blit routine ------------
107+
CopyImageRect fontTex&, chX, chY, dstx%, dstY%, chW, chH, col&
108+
109+
'advance cursor (xadv already includes xo)
110+
dstx% = dstx% + chAdv - chXo
111+
Next
112+
End Sub
113+
114+
115+

QB64PE/BMFont Loader/test.fnt

Lines changed: 101 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,101 @@
1+
info face="Cursive Serif" size=16 bold=0 italic=1 charset="" unicode=1 stretchH=100 smooth=0 aa=1 padding=0,0,0,0 spacing=0,0 outline=0
2+
common lineHeight=26 base=26 scaleW=320 scaleH=200 pages=1 packed=0 alphaChnl=0 redChnl=4 greenChnl=4 blueChnl=4
3+
page id=0 file="test.png"
4+
chars count=96
5+
char id=32 x=0 y=0 width=8 height=26 xoffset=0 yoffset=0 xadvance=9 page=0 chnl=15
6+
char id=33 x=23 y=0 width=7 height=26 xoffset=0 yoffset=0 xadvance=8 page=0 chnl=15
7+
char id=34 x=46 y=0 width=9 height=26 xoffset=0 yoffset=0 xadvance=10 page=0 chnl=15
8+
char id=35 x=69 y=0 width=14 height=26 xoffset=0 yoffset=0 xadvance=15 page=0 chnl=15
9+
char id=36 x=92 y=0 width=14 height=26 xoffset=0 yoffset=0 xadvance=15 page=0 chnl=15
10+
char id=37 x=115 y=0 width=17 height=26 xoffset=0 yoffset=0 xadvance=18 page=0 chnl=15
11+
char id=38 x=138 y=0 width=16 height=26 xoffset=0 yoffset=0 xadvance=17 page=0 chnl=15
12+
char id=39 x=161 y=0 width=6 height=26 xoffset=0 yoffset=0 xadvance=7 page=0 chnl=15
13+
char id=40 x=184 y=0 width=7 height=26 xoffset=0 yoffset=0 xadvance=8 page=0 chnl=15
14+
char id=41 x=207 y=0 width=7 height=26 xoffset=0 yoffset=0 xadvance=8 page=0 chnl=15
15+
char id=42 x=230 y=0 width=14 height=26 xoffset=0 yoffset=0 xadvance=15 page=0 chnl=15
16+
char id=43 x=253 y=0 width=13 height=26 xoffset=0 yoffset=0 xadvance=14 page=0 chnl=15
17+
char id=44 x=276 y=0 width=7 height=26 xoffset=0 yoffset=0 xadvance=8 page=0 chnl=15
18+
char id=45 x=0 y=26 width=13 height=26 xoffset=0 yoffset=0 xadvance=14 page=0 chnl=15
19+
char id=46 x=23 y=26 width=7 height=26 xoffset=0 yoffset=0 xadvance=8 page=0 chnl=15
20+
char id=47 x=46 y=26 width=11 height=26 xoffset=0 yoffset=0 xadvance=12 page=0 chnl=15
21+
char id=48 x=69 y=26 width=15 height=26 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15
22+
char id=49 x=92 y=26 width=7 height=26 xoffset=0 yoffset=0 xadvance=8 page=0 chnl=15
23+
char id=50 x=115 y=26 width=14 height=26 xoffset=0 yoffset=0 xadvance=15 page=0 chnl=15
24+
char id=51 x=138 y=26 width=13 height=26 xoffset=0 yoffset=0 xadvance=14 page=0 chnl=15
25+
char id=52 x=161 y=26 width=12 height=26 xoffset=0 yoffset=0 xadvance=13 page=0 chnl=15
26+
char id=53 x=184 y=26 width=13 height=26 xoffset=0 yoffset=0 xadvance=14 page=0 chnl=15
27+
char id=54 x=207 y=26 width=14 height=26 xoffset=0 yoffset=0 xadvance=15 page=0 chnl=15
28+
char id=55 x=230 y=26 width=10 height=26 xoffset=0 yoffset=0 xadvance=11 page=0 chnl=15
29+
char id=56 x=253 y=26 width=13 height=26 xoffset=0 yoffset=0 xadvance=14 page=0 chnl=15
30+
char id=57 x=276 y=26 width=14 height=26 xoffset=0 yoffset=0 xadvance=15 page=0 chnl=15
31+
char id=58 x=0 y=52 width=7 height=26 xoffset=0 yoffset=0 xadvance=8 page=0 chnl=15
32+
char id=59 x=23 y=52 width=7 height=26 xoffset=0 yoffset=0 xadvance=8 page=0 chnl=15
33+
char id=60 x=46 y=52 width=14 height=26 xoffset=0 yoffset=0 xadvance=15 page=0 chnl=15
34+
char id=61 x=69 y=52 width=13 height=26 xoffset=0 yoffset=0 xadvance=14 page=0 chnl=15
35+
char id=62 x=92 y=52 width=14 height=26 xoffset=0 yoffset=0 xadvance=15 page=0 chnl=15
36+
char id=63 x=115 y=52 width=13 height=26 xoffset=0 yoffset=0 xadvance=14 page=0 chnl=15
37+
char id=64 x=138 y=52 width=14 height=26 xoffset=0 yoffset=0 xadvance=15 page=0 chnl=15
38+
char id=65 x=161 y=52 width=15 height=26 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15
39+
char id=66 x=184 y=52 width=14 height=26 xoffset=0 yoffset=0 xadvance=15 page=0 chnl=15
40+
char id=67 x=207 y=52 width=14 height=26 xoffset=0 yoffset=0 xadvance=15 page=0 chnl=15
41+
char id=68 x=230 y=52 width=16 height=26 xoffset=0 yoffset=0 xadvance=17 page=0 chnl=15
42+
char id=69 x=253 y=52 width=14 height=26 xoffset=0 yoffset=0 xadvance=15 page=0 chnl=15
43+
char id=70 x=276 y=52 width=12 height=26 xoffset=0 yoffset=0 xadvance=13 page=0 chnl=15
44+
char id=71 x=0 y=78 width=15 height=26 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15
45+
char id=72 x=23 y=78 width=15 height=26 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15
46+
char id=73 x=46 y=78 width=7 height=26 xoffset=0 yoffset=0 xadvance=8 page=0 chnl=15
47+
char id=74 x=69 y=78 width=11 height=26 xoffset=0 yoffset=0 xadvance=12 page=0 chnl=15
48+
char id=75 x=92 y=78 width=15 height=26 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15
49+
char id=76 x=115 y=78 width=13 height=26 xoffset=0 yoffset=0 xadvance=14 page=0 chnl=15
50+
char id=77 x=138 y=78 width=20 height=26 xoffset=0 yoffset=0 xadvance=21 page=0 chnl=15
51+
char id=78 x=161 y=78 width=16 height=26 xoffset=0 yoffset=0 xadvance=17 page=0 chnl=15
52+
char id=79 x=184 y=78 width=15 height=26 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15
53+
char id=80 x=207 y=78 width=15 height=26 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15
54+
char id=81 x=230 y=78 width=15 height=26 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15
55+
char id=82 x=253 y=78 width=15 height=26 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15
56+
char id=83 x=276 y=78 width=14 height=26 xoffset=0 yoffset=0 xadvance=15 page=0 chnl=15
57+
char id=84 x=0 y=104 width=13 height=26 xoffset=0 yoffset=0 xadvance=14 page=0 chnl=15
58+
char id=85 x=23 y=104 width=15 height=26 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15
59+
char id=86 x=46 y=104 width=15 height=26 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15
60+
char id=87 x=69 y=104 width=23 height=26 xoffset=0 yoffset=0 xadvance=24 page=0 chnl=15
61+
char id=88 x=92 y=104 width=13 height=26 xoffset=0 yoffset=0 xadvance=14 page=0 chnl=15
62+
char id=89 x=115 y=104 width=15 height=26 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15
63+
char id=90 x=138 y=104 width=14 height=26 xoffset=0 yoffset=0 xadvance=15 page=0 chnl=15
64+
char id=91 x=161 y=104 width=8 height=26 xoffset=0 yoffset=0 xadvance=9 page=0 chnl=15
65+
char id=92 x=184 y=104 width=11 height=26 xoffset=0 yoffset=0 xadvance=12 page=0 chnl=15
66+
char id=93 x=207 y=104 width=8 height=26 xoffset=0 yoffset=0 xadvance=9 page=0 chnl=15
67+
char id=94 x=230 y=104 width=13 height=26 xoffset=0 yoffset=0 xadvance=14 page=0 chnl=15
68+
char id=95 x=253 y=104 width=13 height=26 xoffset=0 yoffset=0 xadvance=14 page=0 chnl=15
69+
char id=96 x=276 y=104 width=8 height=26 xoffset=0 yoffset=0 xadvance=9 page=0 chnl=15
70+
char id=97 x=0 y=130 width=13 height=26 xoffset=0 yoffset=0 xadvance=14 page=0 chnl=15
71+
char id=98 x=23 y=130 width=13 height=26 xoffset=0 yoffset=0 xadvance=14 page=0 chnl=15
72+
char id=99 x=46 y=130 width=12 height=26 xoffset=0 yoffset=0 xadvance=13 page=0 chnl=15
73+
char id=100 x=69 y=130 width=13 height=26 xoffset=0 yoffset=0 xadvance=14 page=0 chnl=15
74+
char id=101 x=92 y=130 width=12 height=26 xoffset=0 yoffset=0 xadvance=13 page=0 chnl=15
75+
char id=102 x=115 y=130 width=10 height=26 xoffset=0 yoffset=0 xadvance=11 page=0 chnl=15
76+
char id=103 x=138 y=130 width=13 height=26 xoffset=0 yoffset=0 xadvance=14 page=0 chnl=15
77+
char id=104 x=161 y=130 width=13 height=26 xoffset=0 yoffset=0 xadvance=14 page=0 chnl=15
78+
char id=105 x=184 y=130 width=7 height=26 xoffset=0 yoffset=0 xadvance=8 page=0 chnl=15
79+
char id=106 x=207 y=130 width=6 height=26 xoffset=0 yoffset=0 xadvance=7 page=0 chnl=15
80+
char id=107 x=230 y=130 width=12 height=26 xoffset=0 yoffset=0 xadvance=13 page=0 chnl=15
81+
char id=108 x=253 y=130 width=6 height=26 xoffset=0 yoffset=0 xadvance=7 page=0 chnl=15
82+
char id=109 x=276 y=130 width=19 height=26 xoffset=0 yoffset=0 xadvance=20 page=0 chnl=15
83+
char id=110 x=0 y=156 width=13 height=26 xoffset=0 yoffset=0 xadvance=14 page=0 chnl=15
84+
char id=111 x=23 y=156 width=12 height=26 xoffset=0 yoffset=0 xadvance=13 page=0 chnl=15
85+
char id=112 x=46 y=156 width=13 height=26 xoffset=0 yoffset=0 xadvance=14 page=0 chnl=15
86+
char id=113 x=69 y=156 width=13 height=26 xoffset=0 yoffset=0 xadvance=14 page=0 chnl=15
87+
char id=114 x=92 y=156 width=11 height=26 xoffset=0 yoffset=0 xadvance=12 page=0 chnl=15
88+
char id=115 x=115 y=156 width=11 height=26 xoffset=0 yoffset=0 xadvance=12 page=0 chnl=15
89+
char id=116 x=138 y=156 width=8 height=26 xoffset=0 yoffset=0 xadvance=9 page=0 chnl=15
90+
char id=117 x=161 y=156 width=13 height=26 xoffset=0 yoffset=0 xadvance=14 page=0 chnl=15
91+
char id=118 x=184 y=156 width=13 height=26 xoffset=0 yoffset=0 xadvance=14 page=0 chnl=15
92+
char id=119 x=207 y=156 width=19 height=26 xoffset=0 yoffset=0 xadvance=20 page=0 chnl=15
93+
char id=120 x=230 y=156 width=10 height=26 xoffset=0 yoffset=0 xadvance=11 page=0 chnl=15
94+
char id=121 x=253 y=156 width=13 height=26 xoffset=0 yoffset=0 xadvance=14 page=0 chnl=15
95+
char id=122 x=276 y=156 width=11 height=26 xoffset=0 yoffset=0 xadvance=12 page=0 chnl=15
96+
char id=123 x=0 y=182 width=8 height=26 xoffset=0 yoffset=0 xadvance=9 page=0 chnl=15
97+
char id=124 x=23 y=182 width=7 height=26 xoffset=0 yoffset=0 xadvance=8 page=0 chnl=15
98+
char id=125 x=46 y=182 width=8 height=26 xoffset=0 yoffset=0 xadvance=9 page=0 chnl=15
99+
char id=126 x=69 y=182 width=15 height=26 xoffset=0 yoffset=0 xadvance=16 page=0 chnl=15
100+
char id=127 x=92 y=182 width=10 height=26 xoffset=0 yoffset=0 xadvance=11 page=0 chnl=15
101+
kernings count=0

QB64PE/BMFont Loader/test.png

4.48 KB
Loading

0 commit comments

Comments
 (0)