' Copyright (c) 2006 Ian Cowburn
'
' Permission is hereby granted, free of charge, to any person obtaining a copy of
' this software and associated documentation files (the "Software"), to deal in
' the Software without restriction, including without limitation the rights to
' use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies
' of the Software, and to permit persons to whom the Software is furnished to do
' so, subject to the following conditions:
'
' The above copyright notice and this permission notice shall be included in all
' copies or substantial portions of the Software.
'
' THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
' IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
' FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
' AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
' LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
' OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
' SOFTWARE.
'
' $Id$
'
Rem
bbdoc: noddybox.bitmapfont
EndRem
Module noddybox.bitmapfont
ModuleInfo "Framework: Simple Bitmap Font Routines"
ModuleInfo "Copyright: Ian Cowburn -- released under the MIT License"
ModuleInfo "Author: Ian Cowburn"
ModuleInfo "Version: $Revision$"
Import brl.Max2D
Import brl.Basic
Strict
Rem
bbdoc: Defines a bitmap font
about: The @TBitmapFont object works from BMF Files, which are created using a tool called BitmapFontEd available at
http://www.noddybox.demon.co.uk/free/index-csharp.html
Note that when colours are referenced they simply modify the colours in the font images as @SetColor() would do on a norml image.
When drawing characters the current scale, alpha and rotation settings are applied.
EndRem
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
Rem
bbdoc: Loads a font from the supplied BMF file.
returns: The created font, or null if the BMF file couldn't be loaded.
about: The @image_flags are passed onto @CreateImage() when the images for the font are being created.
EndRem
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
Rem
bbdoc: Draws text.
about: Draws @txt at the supplied @x, @y co-ordinates. @red, @green and @blue control the colour.
EndRem
Method Draw(txt:String, x:Int, y:Int, red:Int=255, green:Int=255, blue:Int=255)
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
Rem
bbdoc: Draws centred text.
about: Draws @txt centred at the supplied @y co-ordinate. @red, @green and @blue control the colour.
EndRem
Method Centre(txt:String, y:Int, red:Int=255, green:Int=255, blue:Int=255)
If is_fixed
Draw(txt,GraphicsWidth()/2-Len(txt)*width[0]/2,y,red,green,blue)
Else
Draw(txt,GraphicsWidth()/2-TextWidth(txt)/2,y,red,green,blue)
EndIf
End Method
Rem
bbdoc: Draws text centred on a position.
about: Draws @txt centred on the supplied @x and @y co-ordinate. @red, @green and @blue control the colour.
EndRem
Method CentreOn(txt:String, x:Int, y:Int, red:Int=255, green:Int=255, blue:Int=255)
If is_fixed
Draw(txt,x-Len(txt)*width[0]/2,y-TextHeight(txt),red,green,blue)
Else
Draw(txt,x-TextWidth(txt)/2,y-TextHeight(txt),red,green,blue)
EndIf
End Method
Rem
bbdoc: Draws text right justified.
about: Draws @txt right justified on the supplied @x and @y co-ordinate. @red, @green and @blue control the colour.
EndRem
Method DrawRight(txt:String, x:Int, y:Int, red:Int=255, green:Int=255, blue:Int=255)
If is_fixed
Draw(txt,x-Len(txt)*width[0],y,red,green,blue)
Else
Draw(txt,x-TextWidth(txt),y,red,green,blue)
EndIf
End Method
Rem
bbdoc: Width of the supplied string.
returns: The length of the string @txt in pixels.
about: The current scale settings are taken into account.
EndRem
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
Rem
bbdoc: Height of the supplied string.
returns: The height of the string @txt in pixels.
about: The current scale settings are taken into account.
EndRem
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
Rem
bbdoc: Width of the largest character.
returns: The width in pixels of the largest character in the font.
EndRem
Method MaxWidth:Int()
Return max_width
End Method
Rem
bbdoc: Height of the largest character.
returns: The height in pixels of the largest character in the font.
EndRem
Method MaxHeight:Int()
Return max_height
End Method
End Type