summaryrefslogtreecommitdiff
path: root/bitmapfont.mod/bitmapfont.bmx
blob: 56a36adbaf51116a67189638a915ec42012206e3 (plain)
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
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 BitmapFont

	Const NOCHR=95
	
	Field img:TImage[NOCHR]
	Field height:Int[NOCHR]
	Field width:Int[NOCHR]
	Field is_fixed:Int

	Function Load:BitmapFont(path:String)
		Local fnt:BitmapFont
		Local str:TStream
		Local magic:String
		Local f,x,y
		Local r,g,b
		
		str=ReadStream(path)

		If (Not str) Then Return Null
		
		fnt=New BitmapFont
		
		magic=ReadString(str,4)
		
		If (magic<>"BMF1")
			CloseStream(str)
			Return Null
		EndIf
		
		fnt.is_fixed=Readint(str)
		
		GetMaskColor(r,g,b)
		SetMaskColor(0,0,0)
		
		For f=0 Until NOCHR
			fnt.width[f]=Readint(str)
			fnt.height[f]=Readint(str)

			fnt.img[f]=CreateImage(fnt.width[f],fnt.height[f],1,MASKEDIMAGE)'FILTEREDIMAGE|MASKEDIMAGE)

			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
		
		SetMaskColor(r,g,b)
		
		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

End Type