Code archives/Graphics/Bitmap Font Library
This code has been declared by its author to be Public Domain code.
Download source code
| |||||
This is a bitmap font library that will load and display bitmap fonts. It's designed for the fonts found here, but should work with any bitmap font image that's layed out the same way. The library is very flexible and allows you to scale and rotate text. | |||||
'*********************************************************************************************************************************** ' B I T M A P F O N T L I B R A R Y '*********************************************************************************************************************************** Rem This library will allow you To draw bitmap fonts obtained from bitmap font image. How To use it: -First, Load a font like so: Local Font:TBitmapFont = TBitmapFont.Load(FileName) where FileName is the filename of a bitmap font image. -Then draw text with the Draw() method: Font.Draw("Hello, world!", 100, 100) You can change the scale and rotation of the font as well, using SetScale() and SetAngle(). You can also change the spacing of the font using SetSpacing(). You may need to set the spacing to a negative value in order to obtain the appearance you desire. You can also change the handle of the font with SetHandle(). The handle of the font is the center at which the font is rotated and scaled. Additionally you can center the font using SetCentered() and setting it to 1, which will automatically set the handle in the center of any text you draw. EndRem ''*********************************************************************************************************************************** Type TBitmapFont Field Image:TImage Field Offset:Int[190] Field Spacing:Float Field CellWidth:Int Field CellHeight:Int Field HandleX:Float Field HandleY:Float Field Angle:Float Field ScaleX:Float Field ScaleY:Float Field Centered:Int Method GetWidth:Int(Text:String) Local CurIndex:Int Local CurWidth:Int For Local I:Int = 1 To Len(Text) CurIndex = Asc(Mid(Text, I, 1)) - 32 CurWidth :+ (Offset[CurIndex * 2 + 1] - Offset[CurIndex * 2]) + Spacing Next Return CurWidth EndMethod Method GetHeight:Int() Return ImageHeight(Image) EndMethod Method SetSpacing(Space:Float) Spacing = Space EndMethod Method GetSpacing:Int() Return Spacing EndMethod Method SetHandle(X:Float, Y:Float) HandleX = X HandleY = Y EndMethod Method GetHandle(X:Float Var, Y:Float Var) X = HandleX Y = HandleY EndMethod Method SetCentered(IsCentered:Int) Centered = IsCentered EndMethod Method SetAngle(Ang:Float) Angle = Ang EndMethod Method GetAngle:Float() Return Angle EndMethod Method SetScale(X:Float, Y:Float) ScaleX = X ScaleY = Y EndMethod Method GetScale(X:Float Var, Y:Float Var) X = ScaleX Y = ScaleY EndMethod Method Draw(Text:String, X:Int, Y:Int) SetTransform(Angle, ScaleX, ScaleY) Local CurIndex:Int Local OrigX:Int = X Local OldHX:Float Local OldHY:Float If Centered OldHX = HandleX OldHY = HandleY HandleX = GetWidth(Text) / 2 HandleY = GetHeight() / 2 EndIf For Local I:Int = 1 To Len(Text) CurIndex = Asc(Mid(Text, I, 1)) - 32 SetImageHandle(Image, -((X - Offset[CurIndex * 2]) - (OrigX + HandleX)), HandleY) DrawImage(Image, OrigX, Y, CurIndex) X :+ Offset[CurIndex * 2 + 1] - Offset[CurIndex * 2] X :+ Spacing Next HandleX = OldHX HandleY = OldHY EndMethod Method Trim() Local Pixmap:TPixmap Pixmap = Pixmap.Convert(PF_RGBA8888) For Local I:Int = 0 To 94 Pixmap = LockImage(Image, I) Pixmap = Pixmap.Convert(PF_RGBA8888) Local LeftMax:Int = CellHeight - 1 Local RightMax:Int = 0 For Local Y:Int = 0 To CellHeight - 1 For Local X:Int = 0 To CellWidth - 1 Local Color:Int = Pixmap.ReadPixel(X, Y) If Color Shr 24 & $000000FF > 128 If X < LeftMax LeftMax = X EndIf Exit EndIf Next Next For Local Y:Int = 0 To CellHeight - 1 For Local X:Int = CellWidth - 1 To 0 Step -1 Local Color:Int = Pixmap.ReadPixel(X, Y) If Color Shr 24 & $000000FF > 128 If X > RightMax RightMax = X EndIf Exit EndIf Next Next If RightMax = 0 RightMax = CellWidth - CellWidth / 3 EndIf If LeftMax = CellWidth - 1 LeftMax = CellWidth / 3 EndIf LeftMax = LeftMax - Spacing / 2 RightMax = RightMax + Spacing / 2 If RightMax > CellWidth - 1 RightMax = CellWidth - 1 EndIf If LeftMax < 0 LeftMax = 0 EndIf Offset[I * 2] = LeftMax Offset[I * 2 + 1] = RightMax UnlockImage(Image, I) Next EndMethod Function Load:TBitmapFont(FileName:String) Local Font:TBitmapFont = New TBitmapFont Local FontImage:TImage = LoadImage(LoadBank(FileName)) Local CellWidth:Int = ImageWidth(FontImage) / 10 Local CellHeight:Int = ImageHeight(FontImage) / 10 FontImage = LoadAnimImage(LoadBank(FileName), CellWidth, CellHeight, 0, 95) If Not FontImage Notify("The bitmap font image you specified does not exist, or is not of a supported file format.", True) End EndIf Font.Image = FontImage Font.CellWidth = CellWidth Font.CellHeight = CellHeight Font.ScaleX = 1.0 Font.ScaleY = 1.0 Font.Trim() Return Font EndFunction EndType |
Comments
| ||
Fontext can be used to make fonts for this code. You need the following settings: Font tab Untick 'Pack' Select 'No Trim' You will probably want to tick 'Autosize' Canvas tab Set Block size to 32x32, set Canvas size to 320x320 =OR= Set Block size to 51x51, set Canvas size to 512x512 Characters tab Untick all boxes, and then tick: Full (seems like current Fontext won't remember this on exit) Space Skip 0-32 Export as PNG (with alpha). Say 'yes' to alpha, 'no' to INI. And that's it! |
| ||
Updated version that works with newer versions of BlitzMax. Also added blendmode Alphablend for the draw method.'*********************************************************************************************************************************** ' B I T M A P F O N T L I B R A R Y '*********************************************************************************************************************************** Rem This library will allow you To draw bitmap fonts obtained from bitmap font image. How To use it: -First, Load a font like so: Local Font:TBitmapFont = TBitmapFont.Load(FileName) where FileName is the filename of a bitmap font image. -Then draw text with the Draw() method: Font.Draw("Hello, world!", 100, 100) You can change the scale and rotation of the font as well, using SetScale() and SetAngle(). You can also change the spacing of the font using SetSpacing(). You may need to set the spacing to a negative value in order to obtain the appearance you desire. You can also change the handle of the font with SetHandle(). The handle of the font is the center at which the font is rotated and scaled. Additionally you can center the font using SetCentered() and setting it to 1, which will automatically set the handle in the center of any text you draw. EndRem ''*********************************************************************************************************************************** Type TBitmapFont Field Image:TImage Field Offset:Int[190] Field Spacing:Float Field CellWidth:Int Field CellHeight:Int Field HandleX:Float Field HandleY:Float Field Angle:Float Field ScaleX:Float Field ScaleY:Float Field Centered:Int Method GetWidth:Int(Text:String) Local CurIndex:Int Local CurWidth:Int For Local I:Int = 1 To Len(Text) CurIndex = Asc(Mid(Text, I, 1)) - 32 CurWidth :+ (Offset[CurIndex * 2 + 1] - Offset[CurIndex * 2]) + Spacing Next Return CurWidth EndMethod Method GetHeight:Int() Return ImageHeight(Image) EndMethod Method SetSpacing(Space:Float) Spacing = Space EndMethod Method GetSpacing:Int() Return Spacing EndMethod Method SetHandle(X:Float, Y:Float) HandleX = X HandleY = Y EndMethod Method GetHandle(X:Float Var, Y:Float Var) X = HandleX Y = HandleY EndMethod Method SetCentered(IsCentered:Int) Centered = IsCentered EndMethod Method SetAngle(Ang:Float) Angle = Ang EndMethod Method GetAngle:Float() Return Angle EndMethod Method SetScale(X:Float, Y:Float) ScaleX = X ScaleY = Y EndMethod Method GetScale(X:Float Var, Y:Float Var) X = ScaleX Y = ScaleY EndMethod Method Draw(Text:String, X:Int, Y:Int) SetBlend ALPHABLEND SetTransform(Angle, ScaleX, ScaleY) Local CurIndex:Int Local OrigX:Int = X Local OldHX:Float Local OldHY:Float If Centered OldHX = HandleX OldHY = HandleY HandleX = GetWidth(Text) / 2 HandleY = GetHeight() / 2 EndIf For Local I:Int = 1 To Len(Text) CurIndex = Asc(Mid(Text, I, 1)) - 32 SetImageHandle(Image, -((X - Offset[CurIndex * 2]) - (OrigX + HandleX)), HandleY) DrawImage(Image, OrigX, Y, CurIndex) X :+ Offset[CurIndex * 2 + 1] - Offset[CurIndex * 2] X :+ Spacing Next HandleX = OldHX HandleY = OldHY EndMethod Method Trim() Local Y:Int Local X:Int Local Color:Int Local Pixmap:TPixmap = New TPixmap Pixmap = ConvertPixmap(Pixmap, PF_RGBA8888) For Local I:Int = 0 To 94 Pixmap = LockImage(Image, I) Pixmap = Pixmap.Convert(PF_RGBA8888) Local LeftMax:Int = CellHeight - 1 Local RightMax:Int = 0 For Y = 0 To CellHeight - 1 For X = 0 To CellWidth - 1 Color = Pixmap.ReadPixel(X, Y) If Color Shr 24 & $000000FF > 128 If X < LeftMax LeftMax = X EndIf Exit EndIf Next Next For Y = 0 To CellHeight - 1 For X = CellWidth - 1 To 0 Step -1 Color = Pixmap.ReadPixel(X, Y) If Color Shr 24 & $000000FF > 128 If X > RightMax RightMax = X EndIf Exit EndIf Next Next If RightMax = 0 RightMax = CellWidth - CellWidth / 3 EndIf If LeftMax = CellWidth - 1 LeftMax = CellWidth / 3 EndIf LeftMax = LeftMax - Spacing / 2 RightMax = RightMax + Spacing / 2 If RightMax > CellWidth - 1 RightMax = CellWidth - 1 EndIf If LeftMax < 0 LeftMax = 0 EndIf Offset[I * 2] = LeftMax Offset[I * 2 + 1] = RightMax UnlockImage(Image, I) Next EndMethod Function Load:TBitmapFont(FileName:String) Local Font:TBitmapFont = New TBitmapFont Local FontImage:TImage = LoadImage(LoadBank(FileName)) Local CellWidth:Int = ImageWidth(FontImage) / 10 Local CellHeight:Int = ImageHeight(FontImage) / 10 FontImage = LoadAnimImage(LoadBank(FileName), CellWidth, CellHeight, 0, 95) If Not FontImage Notify("The bitmap font image you specified does not exist, or is not of a supported file format.", True) End EndIf Font.Image = FontImage Font.CellWidth = CellWidth Font.CellHeight = CellHeight Font.ScaleX = 1.0 Font.ScaleY = 1.0 Font.Trim() Return Font EndFunction EndType |
| ||
Thanks for updating it Imphenzia =]. I must have left the SetBlend(ALPHABLEND) in the source of my program rather than in the include file posted here. |
Code Archives Forum