November 28, 2020, 02:38:26 PM

Author Topic: [bb] Simple Proportional Font Routine by WildCat [ 1+ years ago ]  (Read 721 times)

Offline BlitzBot

  • Jr. Member
  • **
  • Posts: 1
Title : Simple Proportional Font Routine
Author : WildCat
Posted : 1+ years ago

Description : This routine was based on the proportional bitmap font format by Adreas Jonsson (www.AngelCode.com, as he reffers). Maybe I invented a bicycle, but this is really usable in many ways. It works in 2D modes and features string divisioning at space [aka chr$(32) :)]. Global variable 'fontDir$' may be used to place your fonts somewhere else. This code needs optimization in a couple of places, so let's improve it together, 'cause as I said it's usable widely. One little example will be posted very soon...

Code :
Code: BlitzBasic
  1. Type WSymbol
  2.         Field x
  3.         Field y
  4.         Field w
  5.         Field h
  6.         Field ox
  7.         Field oy
  8.         Field xa
  9.         Field page
  10. End Type
  11.  
  12. Type WFont
  13.         Field pages[10]
  14.         Field symbols[256]
  15.         Field name$
  16. End Type
  17.  
  18. Function WSymbolNew.WSymbol (x, y, w, h, ox, oy, xa, page)
  19.         sym.WSymbol= New WSymbol
  20.         symx = x
  21.         symy = y
  22.         symw = w
  23.         symh = h
  24.         symox = ox
  25.         symoy = oy
  26.         symxa = xa
  27.         sympage = page
  28.        
  29.         Return (sym)
  30. End Function
  31.  
  32. Function WFontNew.WFont (filename$)
  33.         font.WFont = New WFont
  34.        
  35.         font
  36. ame$ = filename$
  37.        
  38.         If fontDir$ <> "" Then
  39.                 filename$ = fontDir$ + filename$
  40.         EndIf
  41.        
  42.         file = ReadFile (filename$)
  43.         a$ = ReadLine (file)
  44.         a$ = ReadLine (file)
  45.        
  46.        
  47.         b = Instr (a$, "pages=")
  48.         pages = Mid (a$, b+6)
  49.        
  50.         If Left$(filename$,2) = ".." Then
  51.                 beginFrom = 3
  52.         Else
  53.                 beginFrom = 1
  54.         EndIf
  55.        
  56.         c = Instr (filename$, ".", beginfrom)
  57.         basename$ = Mid (filename$, 1, c-1)
  58.        
  59.         For b = 1 To pages
  60.                 nam$ = b-1
  61.                 While Len(nam$) < 2
  62.                         nam$ = "0"+nam$
  63.                 Wend
  64.                 nam$ = basename$+"_"+nam$+".png"
  65.                
  66.                 ;If fontDir$ <> "" Then nam$ = fontDir$ + nam$
  67.                
  68.                 fontpages[b] = LoadImage (nam$)
  69.                 DebLog("Page Load: "+nam$+": handle="+fontpages[b])
  70.         Next
  71.        
  72.         While Eof (file) = 0
  73.                 a$ = ReadLine (file)
  74.                
  75.                 sp = Instr (a$, " ")
  76.                 If sp Then
  77.                         fw$ = Mid (a$, 1, sp-1)
  78.                         If fw$ = "kerning" Then Goto wfontcycend
  79.                         If fw$ = "mask" Then
  80.                                 sp2 = Instr (a$, " ", sp+1)
  81.                                 sp3 = Instr (a$, " ", sp2+1)
  82.                                
  83.                                 red = Mid (a$, sp+1, sp2-sp)
  84.                                 green = Mid (a$, sp2+1, sp3-sp2)
  85.                                 blue = Mid (a$, sp3+1)
  86.                                
  87.                                 For b = 1 To pages
  88.                                         MaskImage (fontpages[b], red, green, blue)
  89.                                 Next
  90.                                
  91.                                 Goto wfontcycend
  92.                         EndIf
  93.                 EndIf
  94.                
  95.                 b = Instr (a$, "id=")
  96.                 If b = 0 Then Goto wfontcycend
  97.                
  98.                 c = Instr (a$, " ", b)
  99.                 id = Mid (a$, b+3, c-b-3)
  100.                
  101.                 b = Instr (a$, "x=",c)
  102.                 c = Instr (a$, " ", b)
  103.                 x = Mid (a$, b+2, c-b-2)
  104.                
  105.                 b = Instr (a$, "y=",c)
  106.                 c = Instr (a$, " ", b)
  107.                 y = Mid (a$, b+2, c-b-2)               
  108.                
  109.                 b = Instr (a$, "width=",c)
  110.                 c = Instr (a$, " ", b)
  111.                 w = Mid (a$, b+6, c-b-6)               
  112.                
  113.                 b = Instr (a$, "height=",c)
  114.                 c = Instr (a$, " ", b)
  115.                 h = Mid (a$, b+7, c-b-7)               
  116.                
  117.                 b = Instr (a$, "xoffset=",c)
  118.                 c = Instr (a$, " ", b)
  119.                 ox = Mid (a$, b+8, c-b-8)              
  120.                
  121.                 b = Instr (a$, "yoffset=",c)
  122.                 c = Instr (a$, " ", b)
  123.                 oy = Mid (a$, b+8, c-b-8)              
  124.                
  125.                 b = Instr (a$, "xadvance=",c)
  126.                 c = Instr (a$, " ", b)
  127.                 xa = Mid (a$, b+9, c-b-9)              
  128.                
  129.                 b = Instr (a$, "page=",c)
  130.                 page = Mid (a$, b+5)           
  131.                
  132.                 fontsymbols[id+1] = Handle (WSymbolNew(x, y, w, h, ox, oy, xa, page))
  133.                
  134.                 .wfontcycend
  135.         Wend
  136.        
  137.         Return (font)
  138. End Function
  139.  
  140. Function WFontText (font.WFont, s$, x, y)
  141.         For a = 1 To Len(s$)
  142.                 b = Asc (Mid(s$, a, 1))
  143.                 If fontsymbols[b+1] Then
  144.                         sym.WSymbol = Object.WSymbol(fontsymbols[b+1])
  145.                         DrawImageRect (fontpages[sympage+1], x+symox, y+symoy, symx, symy, symw, symh)                 
  146.                         x = x + symxa
  147.                 EndIf
  148.         Next
  149. End Function
  150.  
  151. Function WFontWidth (font.WFont, s$)
  152.         w = 0
  153.         For a = 1 To Len(s$)
  154.                 b = Asc (Mid(s$, a, 1))
  155.                 If fontsymbols[b+1] Then
  156.                         sym.WSymbol = Object.WSymbol(fontsymbols[b+1])
  157.                         w = w + symxa
  158.                 EndIf
  159.         Next
  160.         Return w
  161. End Function
  162.  
  163. Function WFontHeight (font.WFont, s$)
  164.         h = 0
  165.         For a = 1 To Len(s$)
  166.                 b = Asc (Mid(s$, a, 1))
  167.                 If fontsymbols[b+1] Then
  168.                         sym.WSymbol = Object.WSymbol(fontsymbols[b+1])
  169.                         If symoy+symh > h Then h = symoy+symh
  170.                 EndIf
  171.         Next
  172.         Return h               
  173. End Function
  174.  
  175. Function WFontByName.WFont (name$)
  176.         For font.WFont = Each WFont
  177.                 If font
  178. ame$ = name$ Then Return font
  179.         Next
  180.         Return Null
  181. End Function
  182.  
  183. Function WFontSpare (font.WFont, s$, width, atSpace = True)
  184.         w = 0
  185.         For a = 1 To Len(s$)
  186.                 b = Asc (Mid(s$, a, 1))
  187.                 If fontsymbols[b+1] Then
  188.                         sym.WSymbol = Object.WSymbol(fontsymbols[b+1])
  189.                         wc = w + symox + symw + symxa ;strange formula, but everything is clear this way :)
  190.                         w = w + symxa
  191.                         If wc > width Then
  192.                                 If atSpace Then
  193.                                         b = a
  194.                                         Repeat
  195.                                                 If Mid(s$, b, 1) = " " Then Return b+1
  196.                                                 b = b - 1
  197.                                                 If b = 0 Then Return WFontSpare (font, s$, width, False)
  198.                                         Forever
  199.                                         Return a
  200.                                 Else
  201.                                         Return a
  202.                                 EndIf
  203.                         EndIf
  204.                 EndIf
  205.         Next   
  206.        
  207.         Return 0
  208. End Function
  209.  
  210. Function WFontFree (font.WFont)
  211.         For page = 1 To 10
  212.                 If fontpages[page] Then FreeImage (fontpages[page])
  213.         Next
  214.        
  215.         For a = 1 To 256
  216.                 If fontsymbols[a] Then
  217.                         sym.WSymbol = Object.WSymbol(fontsymbols[b+1])
  218.                         Delete sym     
  219.                 EndIf
  220.         Next
  221.        
  222.         Delete font
  223. End Function
  224.  
  225. Function WFontsFree ()
  226.         For font.WFont = Each WFont
  227.                 WFontFree(font)
  228.         Next
  229. End Function


Comments :


WildCat(Posted 1+ years ago)

 Here goes the example:
Code: [Select]
Include "wfont.bb"

Function DebLog (s$)
;this belongs to 'service.bb', but cut out of there to reduce code
If debMode = 1 Then
fname$ = "debug.log"
If FileSize(fname$) = 0 Then
file = WriteFile (fname$)
Else
file = OpenFile (fname$)
EndIf
SeekFile (file, FileSize(fname$))
WriteLine (file, s$)
CloseFile (file)
DebugLog (s$)
Else
DebugLog (s$)
EndIf
End Function

Graphics 200,140,32,2
ClsColor 255, 255, 255
Cls

tahoma24black.WFont = WFontNew ("tahoma24black.fnt")
WFontText (tahoma24black, "Hello World!", 45, 55)

Flip
WaitKey
End
And here goes media: <a href="http://project-a.ru/files/tahoma24black.zip" target="_blank">http://project-a.ru/files/tahoma24black.zip[/url] [/i]

 

SimplePortal 2.3.6 © 2008-2014, SimplePortal