You might need to change some stuff to work on the latest version of BMAX but here is my module that you are more than welcome to include in your framework as long as you make reference to me. Oh and it works on all platforms.
Compiled example :
http://www.pjio.com/temp/bmaptext.zipModule:
Strict
Rem
bbdoc: BitMap Text Lib - Single Surface
End Rem
Module Indiepath.bmaptext
ModuleInfo "Version: 1.0"
ModuleInfo "Author: Tim Fisher"
ModuleInfo "License: Indiepath License for non warranted software"
ModuleInfo "Modserver:indiepath"
?Win32
Import BRL.D3D7Max2D
?
Import BRL.GLMax2D
Import BRL.PNGLoader
Import BRL.Retro
Type bMapText
Field Image :TImage
Field Texturesize :Double
Field ScaleFactor :Double
Field NumChars :Short
Field ID :Byte[96]
Field xPos :Double[96]
Field yPos :Double[96]
Field width :Double[96]
Field height :Double[96]
Field xOffset :Double[96]
Field yOffset :Double[96]
Field xAdvance :Double[96]
Rem
bbdoc: Free the Object
End Rem
Function Destroy(b:bMapText)
b = Null
End Function
'-----------------------------------------------------------------
Rem
bbdoc: Create a New bitMapped Text object by loading info from file
returns: Handle to new Bit Map Text Object
about: Use this command exactly as you would the Standard BLitz Command
End Rem
Function Create:bMapText(url:Object,flags:Int=-1)
Local b:bMapText
b:bMapText = New bMapText
b.Image = LoadImage(String(url)+".png",flags)
b.NumChars = 0
Local myfile:TStream = ReadStream("littleendian::" + String(url)+".fnt")
Local temp:String = ReadLine(myfile)
Local pos1:Byte = temp.Find("scaleF=")
b.ScaleFactor = Double(Mid(temp,pos1+8,4))
temp:String = ReadLine(myfile)
pos1:Byte = temp.Find("scaleW=")
b.TextureSize = Double(Mid(temp,pos1+8,4))
While Not Eof(myfile)
temp:String = ReadLine(myfile)
pos1:Byte = temp.Find("id=")
b.ID[b.NumChars] = Byte(Mid(temp,pos1+4,3))
pos1:Byte = temp.find("x=")
b.xPos[b.NumChars] = Double(Mid(temp,pos1+3,3)) / b.TextureSize
pos1:Byte = temp.find("y=")
b.yPos[b.NumChars] = Double(Mid(temp,pos1+3,3)) / b.TextureSize
pos1:Byte = temp.find("width=")
b.Width[b.NumChars] = Double(Mid(temp,pos1+7,3)) / b.TextureSize
pos1:Byte = temp.find("height=")
b.Height[b.NumChars] = Double(Mid(temp,pos1+8,3)) / b.TextureSize
pos1:Byte = temp.find("xoffset=")
b.xOffset[b.NumChars] = Double(Mid(temp,pos1+9,3))
pos1:Byte = temp.find("yoffset=")
b.yOffset[b.NumChars] = Double(Mid(temp,pos1+9,3))
pos1:Byte = temp.find("xadvance=")
b.xadvance[b.NumChars] = Double(Mid(temp,pos1+10,3))
b.Numchars:+1
Wend
CloseStream(myfile)
Return b
End Function
'----------------------------------------------------------------
Rem
bbdoc: Get width of a string
returns: Width of String as Double
End Rem
Method StringWidth:Double(text:String)
Local a:Int
Local char:Byte
Local width1:Double
For a = 0 To Len(text) -1
char = FindChar(Mid(text,a+1,1))
width1:+ self.xAdvance[char]
Next
Return width1
End Method
'----------------------------------------------------------------
Rem
bbdoc:Get height of a string
returns: Returns height of string as Double
End Rem
Method StringHeight:Double(text:String)
Local a:Int
Local char:Byte
Local Height1:Double
For a = 0 To Len(text) -1
char = FindChar(Mid(text,a+1,1))
Height1:+ self.height[char] * self.TextureSize
Next
Return (height1 / Double (Len(text)-1))
End Method
'----------------------------------------------------------------
Rem
bbdoc: Draw string to Screen using BmapText object
about: Pass text, positon and justification.
End Rem
Method Draw(text:String,x:Double,y:Double,center:Byte=False,rght:Byte=False)
' SetBlend(SOLIDBLEND)
Local char:Int
Local scale_x:Float
Local scale_y:Float
GetScale(scale_x,scale_y)
scale_x :* self.ScaleFactor
scale_y :* self.ScaleFactor
If center Then x = x - (Self.StringWidth(text) / 2 * scale_x)
If Rght Then x = x - (Self.StringWidth(text) * scale_x)
If Len(text) < 1 Then Return
Local a:Byte
For a = 0 To Len(text) -1
char = FindChar(Mid(text,a+1,1))
If char >= 0 Then
Local xpos :Double = self.xPos[char]
Local ypos :Double = self.yPos[char]
Local width :Double = self.width[char]
Local height :Double = self.height[char]
?Win32
Local DXFrame:TD3D7ImageFrame = TD3D7ImageFrame (self.Image.frame(0))
If DXFrame
DXFrame.setUV(xpos,ypos,xpos + width,ypos + height)
Else
?
Local GLFrame:TGLImageFrame = TGLImageFrame(self.Image.frame(0))
GLFrame.u0 = xpos
GLFrame.v0 = ypos
GLFrame.u1 = xpos + width
GLFrame.v1 = ypos + height
?Win32
EndIf
?
Local x1:Double = x + self.xOffset[char] * scale_x
Local y1:Double = y + self.yOffset[char] * scale_y
' SetBlend(ALPHABLEND)
DrawImageRect(self.Image,x1,y1,width * self.TextureSize * self.scalefactor,height * self.TextureSize * self.scalefactor)
x :+ (self.xAdvance[char] * scale_x)
EndIf
Next
End Method
'----------------------------------------------------------------
Method FindChar(digit:String)
Local b:Int
For b = 0 To self.NumChars
If Asc(digit) = self.ID[b] Then Return b
Next
EndMethod
End Type
This is how you would use it:
Strict
Import Indiepath.bMapText
Graphics 640,480,0
SetClsColor(80,80,80)
Cls
SetBlend(alphablend)
Local text1:bMapText = bMapText.Create("fatbot",FILTEREDIMAGE|MIPMAPPEDIMAGE)
SetScale(0.4,0.4)
text1.Draw("Indiepath Ltd",320,280,True,False)
SetScale(0.35,0.35)
SetColor(255,255,155)
text1.Draw("Hit ESC to Exit",320,330,True,False)
Flip
WaitKey()
And here is some stuff you really do need to read:
Generate Fonts using the BitMap Font Editor from www.AngelCode.com
You Must do the following to the generated .fnt file!
1) Replace the very first line with a Scale Factor, this is the scale factor that the module will reference
The First line will look something like :-
info face="Arial" size=32 bold=0 italic=0 charset="ANSI" stretchH=100 smooth=1 aa=1 padding=0,0,0,0 spacing=1,1
Replace it with :-
scaleF=1.3
It will now look something like :-
scaleF=1.3
common lineHeight=64 base=57 scaleW=512 scaleH=512 pages=1
char id=32 x=0 y=0 width=1 height=0 xoffset=0 yoffset=64 xadvance=14 page=0
2) Delete All references to Kerning, they appear after char id=255 ( we don't need these)
Finally *********************************************
***THE FONT IMAGE FILE MUST BE A .PNG**********
That's all folks.