' 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 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