1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
|
Module noddybox.bitmapfont
ModuleInfo "Framework: Simple Bitmap Font Routines"
ModuleInfo "Copyright: Public Domain"
ModuleInfo "Author: Ian Cowburn"
ModuleInfo "Version: $Revision$"
' $Id$
Import brl.Max2D
Import brl.Basic
Strict
Type TBitmapFont
Const NOCHR=95
Field img:TImage[NOCHR]
Field height:Int[NOCHR]
Field width:Int[NOCHR]
Field is_fixed:Int
Field max_width:Int
Field max_height:Int
Function Load:TBitmapFont(path:String, image_flags:Int)
Local fnt:TBitmapFont
Local str:TStream
Local magic:String
Local f,x,y
str=ReadStream(path)
If (Not str) Then Return Null
fnt=New TBitmapFont
magic=ReadString(str,4)
If (magic<>"BMF1")
CloseStream(str)
Return Null
EndIf
fnt.max_width=-1
fnt.max_height=-1
fnt.is_fixed=Readint(str)
For f=0 Until NOCHR
fnt.width[f]=Readint(str)
fnt.height[f]=Readint(str)
fnt.max_width=Max(fnt.max_width,fnt.width[f])
fnt.max_height=Max(fnt.max_height,fnt.height[f])
fnt.img[f]=CreateImage(fnt.width[f],fnt.height[f],1,image_flags)
Local pm:TPixmap=LockImage(fnt.img[f])
For x=0 Until fnt.width[f]
For y=0 Until fnt.height[f]
WritePixel(pm,x,y,Readint(str))
Next
Next
UnlockImage(fnt.img[f])
Next
CloseStream(str)
Return fnt
End Function
Method DrawColoured(txt:String, x:Int, y:Int, red:Int, green:Int, blue:Int)
Local f,r,g,b,c
Local xs#,ys#
GetScale(xs,ys)
GetColor(r,g,b)
SetColor(red,green,blue)
For f=0 Until Len(txt)
c=txt[f]-32
DrawImage(img[c],x,y)
x:+width[c]*xs
Next
SetColor(r,g,b)
End Method
Method Draw(txt:String, x:Int, y:Int)
DrawColoured(txt,x,y,255,255,255)
End Method
Method CentreColoured(txt:String, y:Int, red:Int, green:Int, blue:Int)
If is_fixed
DrawColoured(txt,GraphicsWidth()/2-Len(txt)*width[0]/2,y,red,green,blue)
Else
DrawColoured(txt,GraphicsWidth()/2-TextWidth(txt)/2,y,red,green,blue)
EndIf
End Method
Method Centre(txt:String, y:Int)
If is_fixed
DrawColoured(txt,GraphicsWidth()/2-Len(txt)*width[0]/2,y,255,255,255)
Else
DrawColoured(txt,GraphicsWidth()/2-TextWidth(txt)/2,y,255,255,255)
EndIf
End Method
Method TextWidth:Int(txt:String)
Local w
Local xs#,ys#
GetScale(xs,ys)
For Local f=0 Until Len(txt)
w:+width[txt[f]-32]*xs
Next
Return w
End Method
Method TextHeight:Int(txt:String)
Local h:Int=0
Local xs#,ys#
GetScale(xs,ys)
For Local f=0 Until Len(txt)
h=Max(h,height[txt[f]-32]*ys)
Next
Return h
End Method
Method MaxWidth:Int()
Return max_width
End Method
Method MaxHeight:Int()
Return max_height
End Method
End Type
|