diff options
| -rw-r--r-- | bitmapfont.mod/bitmapfont.bmx | 384 | 
1 files changed, 188 insertions, 196 deletions
| diff --git a/bitmapfont.mod/bitmapfont.bmx b/bitmapfont.mod/bitmapfont.bmx index fd70671..6e9b5a0 100644 --- a/bitmapfont.mod/bitmapfont.bmx +++ b/bitmapfont.mod/bitmapfont.bmx @@ -1,196 +1,188 @@ -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: <a href="http://www.noddybox.demon.co.uk/free/index-csharp.html">http://www.noddybox.demon.co.uk/free/index-csharp.html</a><br> -about: Note that when colours are referenced they simply modify the colours in the font images as @SetColor() would do on a norml image.<br> -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 +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
 +<a href="http://www.noddybox.demon.co.uk/free/index-csharp.html">http://www.noddybox.demon.co.uk/free/index-csharp.html</a><br>
 +Note that when colours are referenced they simply modify the colours in the font images as @SetColor() would do on a norml image.<br>
 +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: 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
 | 
