December 04, 2020, 10:47:50 AM

Author Topic: [bmx] Bitmap Font by Ked [ 1+ years ago ]  (Read 747 times)

Offline BlitzBot

  • Jr. Member
  • **
  • Posts: 1
[bmx] Bitmap Font by Ked [ 1+ years ago ]
« on: June 29, 2017, 12:28:43 AM »
Title : Bitmap Font
Author : Ked
Posted : 1+ years ago

Description : Uses BlitzMax's DrawSubImageRect, so it's faster than AnimImage. Have fun!

Code :
Code: BlitzMax
  1. SuperStrict
  2.  
  3. Type TBitmapFontViewer
  4.         Field img:TImage
  5.         Field x:Float,y:Float
  6.         Field w:Int,h:Int
  7.         Field holding:Int=False
  8.         Field holdx:Float,holdy:Float
  9.        
  10.         Field path:String="n/a"
  11.         Field chardata:TBitmapCharData[96]
  12.        
  13.         Method Open:TBitmapFontViewer(url:Object)
  14.                 img=LoadImage(String(url)+"_img.png")
  15.                 If img=Null Return Null
  16.                
  17.                 x=0
  18.                 y=0
  19.                 w=ImageWidth(img)
  20.                 h=ImageHeight(img)
  21.                
  22.                 path=String(url)
  23.                
  24.                 Return Self
  25.         EndMethod
  26.        
  27.         Method CreateNew:TBitmapFontViewer(furl:Object,size:Int)
  28.                 Local imgfont:TImageFont=LoadImageFont(furl,size)
  29.                 If imgfont=Null Return Null
  30.                 SetImageFont(imgfont)
  31.                
  32.                 x=0
  33.                 y=0
  34.                
  35.                 path="n/a"
  36.                
  37.                 Local spacing:Int=(size*2)
  38.                 Local dx:Int=0,dy:Int=0
  39.                
  40.                 Cls()
  41.                 SetBlend ALPHABLEND
  42.                
  43.                 For Local i:Int=32 To 127
  44.                         DrawText(Chr(i),dx,dy)
  45.                        
  46.                         Local c:TBitmapCharData=New TBitmapCharData
  47.                         c.ind=i
  48.                         c.x=dx
  49.                         c.y=dy
  50.                         c.w=TextWidth(Chr(i))
  51.                         c.h=TextHeight(Chr(i))
  52.                        
  53.                         chardata[(i-32)]=c
  54.                        
  55.                         dx:+spacing
  56.                         If dx=(16*spacing)
  57.                                 dx=0
  58.                                 dy:+spacing
  59.                         EndIf
  60.                 Next
  61.                
  62.                 Flip()
  63.                
  64.                 dy:+spacing
  65.                
  66.                 w=(16*spacing)
  67.                 h=dy
  68.                
  69.                 img=CreateImage(w,h,1,DYNAMICIMAGE|FILTEREDIMAGE)
  70.                 GrabImage(img,0,0)
  71.                
  72.                 Return Self
  73.         EndMethod
  74.        
  75.         Method Save(name:String)
  76.                 If path<>"n/a" Return
  77.                 If img=Null Return
  78.                
  79.                 Local pix:TPixmap=img.pixmaps[0]
  80.                 SavePixmapPNG(pix,name+"_img.png")
  81.                 pix=Null
  82.                
  83.                 Local dat:TStream=WriteStream(name+"_data.dat")
  84.                 For Local i:Int=0 To 94
  85.                         Local c:TBitmapCharData=chardata[i]
  86.                         WriteInt(dat,c.ind)
  87.                         WriteInt(dat,c.x)
  88.                         WriteInt(dat,c.y)
  89.                         WriteInt(dat,c.w)
  90.                         WriteInt(dat,c.h)
  91.                 Next
  92.                 CloseStream(dat)
  93.                
  94.                 path=name
  95.         EndMethod
  96.        
  97.         Method Update()
  98.                 Local md:Int=MouseDown(MOUSE_LEFT)
  99.                 Local mx:Int=MouseX()
  100.                 Local my:Int=MouseY()
  101.                
  102.                 If (mx>x And my>y And mx<(x+w) And my<(y+h))=False
  103.                         If md=True md=False
  104.                 EndIf
  105.                
  106.                 If md=True
  107.                         If holding=False
  108.                                 holding=True
  109.                                 holdx=MouseX()
  110.                                 holdy=MouseY()
  111.                         EndIf
  112.                        
  113.                         If holding=True
  114.                                 Local xdist:Float=(MouseX()-holdx)
  115.                                 Local ydist:Float=(MouseY()-holdy)
  116.                                
  117.                                 x:+xdist
  118.                                 y:+ydist
  119.                                
  120.                                 holdx:+xdist
  121.                                 holdy:+ydist
  122.                         EndIf
  123.                 Else
  124.                         If holding=True
  125.                                 holding=False
  126.                                 holdx=0
  127.                                 holdy=0
  128.                         EndIf
  129.                 EndIf
  130.         EndMethod
  131.        
  132.         Method Draw()
  133.                 SetBlend ALPHABLEND
  134.                 SetScale 1,1
  135.                 SetAlpha 1.0
  136.                 SetRotation 0
  137.                 SetColor 255,255,255
  138.                
  139.                 DrawImage img,x,y
  140.         EndMethod
  141. EndType
  142.  
  143. Type TBitmapCharData
  144.         Field ind:Int
  145.         Field x:Int
  146.         Field y:Int
  147.         Field w:Int
  148.         Field h:Int
  149. EndType
  150.  
  151. Type TBitmapFont
  152.         Field img:TImage
  153.         Field chardata:TBitmapCharData[96]
  154.        
  155.         Method Load:TBitmapFont(url:Object)
  156.                 img=LoadImage(String(url)+"_img.png")
  157.                 If img=Null Return Null
  158.                
  159.                 Local dat:TStream=ReadStream(String(url)+"_data.dat")
  160.                 If dat=Null Return Null
  161.                
  162.                 For Local i:Int=0 To 94
  163.                         Local c:TBitmapCharData=New TBitmapCharData
  164.                         c.ind=ReadInt(dat)
  165.                         c.x=ReadInt(dat)
  166.                         c.y=ReadInt(dat)
  167.                         c.w=ReadInt(dat)
  168.                         c.h=ReadInt(dat)
  169.                         chardata[i]=c
  170.                 Next
  171.                 CloseStream(dat)
  172.                
  173.                 Return Self
  174.         EndMethod
  175.        
  176.         Method Draw(t:String,x:Float,y:Float)
  177.                 Local dx:Float=x,dy:Float=y
  178.                 Local h:Float=GetHeight(" ")
  179.                 Local xscale:Float,yscale:Float
  180.                 Local rot:Float
  181.                
  182.                 GetScale(xscale,yscale)
  183.                 rot=GetRotation()
  184.                 SetRotation 0
  185.                
  186.                 For Local i:Int=0 To t.length-1
  187.                         Local ind:Int=t[i]
  188.                         If Chr(ind)="~n"
  189.                                 dx=x
  190.                                 dy:+(h*yscale)
  191.                         Else
  192.                                 Local c:TBitmapCharData=chardata[ind-32]
  193.                                 DrawSubImageRect(img,dx,dy,c.w,c.h,c.x,c.y,c.w,c.h)
  194.                                 dx:+(c.w*xscale)
  195.                         EndIf
  196.                 Next
  197.                
  198.                 SetRotation rot
  199.         EndMethod
  200.        
  201.         Method GetHeight:Int(t:String)
  202.                 Local h:Int=0
  203.                
  204.                 For Local i:Int=0 To t.length-1
  205.                         Local ind:Int=t[i]
  206.                         If Chr(ind)="~n" Continue
  207.                        
  208.                         Local c:TBitmapCharData=chardata[ind-32]
  209.                         If c.h>h h=c.h
  210.                 Next
  211.                
  212.                 Return h
  213.         EndMethod
  214.        
  215.         Method GetWidth:Int(t:String)
  216.                 Local w:Int=0
  217.                
  218.                 For Local i:Int=0 To t.length-1
  219.                         Local ind:Int=t[i]
  220.                         If Chr(ind)="~n" Continue
  221.                        
  222.                         Local c:TBitmapCharData=chardata[ind-32]
  223.                         If c.w>w w=c.w
  224.                 Next
  225.                
  226.                 Return w
  227.         EndMethod
  228.        
  229.         Method Delete()
  230.                 chardata=Null
  231.                 img=Null
  232.         EndMethod
  233. EndType
  234.  
  235. Rem
  236. 'Example 1 : Create a bitmap font
  237. Graphics 800,600
  238.  
  239. Global fview:TBitmapFontViewer=New TBitmapFontViewer.CreateNew(GetEnv_("systemroot")+"/fonts/trebuc.ttf",16)
  240. fview.Save("TrebuchetMS16")
  241.  
  242. Repeat
  243.         If AppTerminate() End
  244.         If KeyHit(KEY_ESCAPE) End
  245.        
  246.         fview.Update()
  247.        
  248.         Cls
  249.        
  250.         fview.Draw()
  251.        
  252.         Flip
  253. Forever
  254. EndRem
  255.  
  256. Rem
  257. 'Example 2 : Use a bitmap font
  258. Graphics 800,600
  259.  
  260. Global f:TBitmapFont=New TBitmapFont.Load("TrebuchetMS16")
  261.  
  262. Repeat
  263.         If AppTerminate() End
  264.         If KeyHit(KEY_ESCAPE) End
  265.        
  266.         Cls
  267.        
  268.         SetScale 1,1
  269.         SetRotation 90
  270.         f.Draw("Hello! This is a bitmap font routine for BlitzMax.~nI hope you enjoy it.~n~nOr else...",MouseX(),MouseY())
  271.        
  272.         Flip()
  273. Forever
  274. EndRem


Comments :


rs22(Posted 1+ years ago)

 Very nice. :)


Ked(Posted 1+ years ago)

 Thanks! I have a bugfix but won't be able to update the above code until I can get to my computer. (I'm on my iPod right now.)


 

SimplePortal 2.3.6 © 2008-2014, SimplePortal