Rem bbdoc: noddybox.bitmapfont EndRem 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 Rem bbdoc: Defines a bitmap font about: The @TBitmapFont object works from BMF Files, which are created using a tool called BitmapFontEd available at about: http://www.noddybox.demon.co.uk/free/index-csharp.html
about: Note that when colours are referenced they simply modify the colours in the font images as @SetColor() would do on a norml image.
about: 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 coloured text. about: Draws @txt at the supplied @x,@y co-ordinates. @red,@green and @blue control the colour. EndRem 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 Rem bbdoc: Draws white text. about: Draws @txt at the supplied @x,@y co-ordinates in white. EndRem Method Draw(txt:String, x:Int, y:Int) DrawColoured(txt,x,y,255,255,255) End Method Rem bbdoc: Draws centred, coloured text. about: Draws @txt centred at the supplied @y co-ordinate. @red,@green and @blue control the colour. EndRem 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 Rem bbdoc: Draws centred, white text. about: Draws @txt centred at the supplied @y co-ordinate in white. EndRem 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 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