Also take a look at my sprite font prerender snippet. Works with variable-width fonts, maybe it might come in handy.
Code: Select all
;Prerendering specific characters to sprites for fast display
;using variable-width fonts, works with 2d/3d screens
;To ensure font/characters exists, you might want to use fonts added with registerfontfile
EnableExplicit
#FONTNAME = "Arial"
#FONTSIZE = 24
#BASIC_NUMERICS="0123456789"
#BASIC_SYMBOLS="!@#$%^&*()-_=+[{]};:',<.>/?"+Chr(34)
#BASIC_CHARACTERS="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz "
#EXTRA_HUN = "ÁÉÓÖŐŰÚÜÍáéóíöőúüű"
#EXTRA_GER = "Ääß"
#EXTRA_CYRILLIC ="ФИСВУАПРШОЛДЬТЩЗЙКЫЕГМЦЧНЯфисвуапршолдьтщзйкыегмцчнябБжЖхХъЪэЭюЮĆĘęąŁćłĄŚśźżŻŹŃńĂăȘȚșțČĎĚŇŘŠŤŮŽčďěňřšťůžЄєŒœіІїЇøØĞŞİğşı"
#EXTRA_GREEK="ΑΒΓΔΕΖΗΘΙΚΛΜΝΞΟΠΡΣΤΥΦΧΨΩαβγδεζηθικλμνξοπρστυφχψωΆΈΉΊΌΎΏ"
#EXTRA_EXTRA = "ÀÂÃÅÆÇÈÊËÌÎÏÐÑÒÔÕÙÛÝÞŸàâãåæçèêëìîïðñòóôõùûýþÿάέήίόύώςΐϊĹĽŔĺľŕ∞ЁёĐđ"
#EXTRA_SYMBOLS = "\`|~¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿"
#JP_HIRAGANA = "ぁあぃいぅうぇえぉおかがきぎくぐけげこごさざしじすずせぜそぞただちぢっつづてでがとどなにぬねのはばぱひびぴふぶぷへべぺほぼぽまみむめもゃやゅゆょよらりるれろゎわゐゑをん"
#JP_KATAKANA = "ァアィイゥウェエォオカガキギクグケゲコゴサザシジスズセゼソゾタダチヂッツヅテデトドナニヌネノハバパヒビピフブプヘベペホボポマミムメモャヤュユョヨラリルレロヮワヰヱヲンヴヵヶ"
#JP_SYMBOLS = "゛゜ゝゞ"
#JP_KANJI_TEST = "中主乂九了争亊事二于云互五井亘亙些亜亞亟亠亡亢交亥亦亨享京亭亮亰亳亶人什仁仂仄仆仇今介仍从仏仔仕他仗付大学小少尓尖尚屯山"
Structure myfontstructure
spr.i
width.i
height.i
EndStructure
Global Dim font.myfontstructure(0)
Global font.i = LoadFont(#PB_Any,#FONTNAME,#FONTSIZE)
Global usedcharacters.s = #BASIC_NUMERICS+#BASIC_SYMBOLS+#BASIC_CHARACTERS+#EXTRA_HUN+#EXTRA_GER+#EXTRA_GREEK+#JP_HIRAGANA+#JP_KATAKANA+#JP_KANJI_TEST+#JP_SYMBOLS+#EXTRA_CYRILLIC
;********************************************************************
;This procedure prerenders the lettes you want to use in your program
;********************************************************************
Procedure prerenderfont(characters.s)
Protected characters_length.i = Len(characters.s)
Protected i.i, itemp.i, icount.i
StartDrawing(ScreenOutput())
DrawingFont(FontID(font.i))
For i = 1 To characters_length
itemp = Asc(Mid(characters.s,i,1))
If itemp>icount
icount = itemp
ReDim font(icount)
EndIf
font(itemp)\SPR = -1
font(itemp)\width = TextWidth(Mid(characters.s,i,1))
font(itemp)\height = TextHeight(Mid(characters.s,i,1))
Next i
StopDrawing()
For i = 1 To characters_length
With font(Asc(Mid(characters.s,i)))
If \SPR = -1
\SPR = CreateSprite(#PB_Any,\width,\height,#PB_Sprite_AlphaBlending)
If IsSprite(\SPR)
StartDrawing(SpriteOutput(\SPR))
DrawingMode(#PB_2DDrawing_AllChannels)
DrawingFont(FontID(font.i))
Box(0,0,OutputWidth(),OutputHeight(),RGBA(0,0,0,0))
DrawText(0,0,Mid(characters.s,i,1),RGBA(255,255,255,255),RGBA(0,0,0,0))
StopDrawing()
Else
EndIf
EndIf
EndWith
Next i
EndProcedure
;*****************************************
;This procedure can display text on screen
;*****************************************
Procedure put(x.i,y.i,t$)
Protected i.i,pos.i,cc.i
Protected length.i = Len(t$)
For i = 1 To length.i
cc=Asc(Mid(t$,i,1))
If cc>ArraySize(font()) : cc=0 :EndIf
If cc = 9
pos = pos+#FONTSIZE
ElseIf IsSprite(font(cc)\SPR)
DisplayTransparentSprite(font(cc)\SPR,x+pos,y,255,RGBA(255,255,255,255))
pos+font(cc)\width
EndIf
Next i
EndProcedure
ExamineDesktops()
InitSprite()
InitKeyboard()
InitMouse()
OpenWindow(0,0,0,DesktopUnscaledX(DesktopWidth(0)),DesktopUnscaledY(DesktopHeight(0)),"Variable-width sprite font prerender", #PB_Window_BorderLess)
OpenWindowedScreen(WindowID(0),0,0,WindowWidth(0),WindowHeight(0),1,0,0,#PB_Screen_SmartSynchronization)
SetFrameRate(60)
prerenderfont(usedcharacters.s)
Repeat
Repeat: Until Not WindowEvent()
ExamineKeyboard() : ExamineMouse() : ClearScreen(RGB(50,20,20))
put(10,10+(5+#FONTSIZE)*1,#BASIC_NUMERICS)
put(10,10+(5+#FONTSIZE)*2,#BASIC_CHARACTERS)
put(10,10+(5+#FONTSIZE)*3,#BASIC_SYMBOLS)
put(10,10+(5+#FONTSIZE)*4,#EXTRA_CYRILLIC)
put(10,10+(5+#FONTSIZE)*5,#EXTRA_GER)
put(10,10+(5+#FONTSIZE)*6,#EXTRA_GREEK)
put(10,10+(5+#FONTSIZE)*7,#EXTRA_HUN)
put(10,10+(5+#FONTSIZE)*8,#JP_HIRAGANA)
put(10,10+(5+#FONTSIZE)*9,#JP_KATAKANA)
put(10,10+(5+#FONTSIZE)*10,#JP_KANJI_TEST)
put(10,10+(5+#FONTSIZE)*11,#JP_SYMBOLS)
put(10,10+(5+#FONTSIZE)*13,"Hello World!!!")
FlipBuffers()
Until KeyboardPushed(#PB_Key_Escape)