From 6c0b11a6bb632a5c7cd29ad8a92ce31fe929c194 Mon Sep 17 00:00:00 2001 From: Ian C Date: Wed, 8 Apr 2020 21:23:22 +0000 Subject: Removed Strict -- doesn't seem to like it anymore. --- bitmapfont.mod/bitmapfont.bmx | 438 +++++++++++++++++++++--------------------- 1 file changed, 217 insertions(+), 221 deletions(-) (limited to 'bitmapfont.mod') diff --git a/bitmapfont.mod/bitmapfont.bmx b/bitmapfont.mod/bitmapfont.bmx index de7edb2..896346f 100644 --- a/bitmapfont.mod/bitmapfont.bmx +++ b/bitmapfont.mod/bitmapfont.bmx @@ -1,221 +1,217 @@ -' 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 - - -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 -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 +' 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 -- cgit v1.2.3