Antialiased Text

Übersicht BlitzBasic Codearchiv

Neue Antwort erstellen

 

Edlothiol

Betreff: Antialiased Text

BeitragFr, Feb 27, 2004 22:07
Antworten mit Zitat
Benutzer-Profile anzeigen
BlitzBasic: [AUSKLAPPEN]


Type AAFont
Field start,ende
Field aadata
Field widths[255]
Field width
Field height
End Type


Function SaveAAFont(fnt,filename$)
f.AAFont = Object.AAFont(fnt)
fi = WriteFile(filename)
WriteByte fi,f\start
WriteByte fi,f\ende
WriteInt fi,f\width
WriteInt fi,f\height
For i = 0 To f\ende - f\start
WriteInt fi, f\widths[i]
Next
WriteInt fi, BankSize(f\aadata)
WriteBytes(f\aadata,fi,0,BankSize(f\aadata))
CloseFile fi
End Function

Function LoadAAFont(filename$)
f.AAFont = New AAFont
fi = ReadFile(filename)
f\start = ReadByte(fi)
f\ende = ReadByte(fi)
f\width = ReadInt(fi)
f\height = ReadInt(fi)
For i = 0 To f\ende - f\start
f\widths[i] = ReadInt(fi)
Next
l = ReadInt(fi)
f\aadata = CreateBank(l)
ReadBytes f\aadata, fi, 0, BankSize(f\aadata)
Return Handle(f)
End Function

Function CreateAAFont(name$,h,bold=False,italic=False,underline=False,samplesize=2,start=0,ende=255)

gbuf = GraphicsBuffer()

f.AAFont = New AAFont
f\start = start : f\ende = ende
f\height=h

tempfnt = LoadFont(name,h,bold,False,underline)
SetFont tempfnt
For i = 0 To ende-start
f\widths[i] = StringWidth(Chr(i))
Next
f\width = FontWidth()

FreeFont tempfnt

f\AAData = CreateBank(h*f\width*(ende-start+1))

pmul# = (255 / samplesize^2)
tempfnt = LoadFont(name,h*samplesize,bold,italic,underline)
SetFont tempfnt
Color 0,0,255
AAS = CreateImage(FontWidth() + FontWidth() Mod samplesize,h*samplesize)
iw = ImageWidth(AAS) : ih = ImageHeight(AAS)
SetBuffer ImageBuffer(AAS)
For i = 0 To ende-start
Text 0,0,Chr(i)
actpos = i*f\width*h
LockBuffer
For y = 0 To h-1
For x = 0 To f\width-1
count = 0
For iy = y*samplesize To y*samplesize+samplesize-1
For ix = x*samplesize To x*samplesize+samplesize-1
If (ReadPixelFast(ix,iy) And $FFFFFF) <> 0 Then
count = count + 1
End If
Next
Next
percent = pmul * count
PokeByte f\AAData, actpos + y*f\width + x, percent
Next
Next
UnlockBuffer
Color 0,0,0
Rect 0,0,iw,ih
Color 0,0,255
Next

FreeImage AAS


SetBuffer gbuf

Return Handle(f)

End Function

Function AAStringWidth(s$)
f.AAfont = First AAFont
For i = 1 To Len(s)
If (Asc(Mid(s,i,1)) >= f\start) And (Asc(Mid(s,i,1)) <= f\ende) Then
w = w + f\widths[Asc(Mid(s,i,1))-f\start]
End If
Next
End Function
Function AAStringHeight(s$)
f.AAFont = First AAFont
Return f\height
End Function

Function AAFontWidth()
f.AAFont = First AAFont
Return f\width
End Function
Function AAFontHeight()
f.AAFont = First AAFont
Return f\height
End Function

Function FreeAAFont(fnt)
f.AAFont = Object.AAFont(fnt)
FreeBank f\AAData
Delete f
End Function

Function SetAAFont(fnt)
f.AAFont = Object.AAFont(fnt)
Insert f Before First AAFont
End Function

Function AAText(tx,ty,txt$,cx=False,cy=False)
f.AAfont = First AAfont

If cy Then
ty = ty - f\height*0.5
End If
If cx Then
For i = 1 To Len(txt)
If (Asc(Mid(txt,i,1)) >= f\start) And (Asc(Mid(txt,i,1)) <= f\ende) Then
w = w + f\widths[Asc(Mid(txt,i,1))-f\start]
End If
Next
DebugLog w
tx = tx - w*0.5
End If

chh = f\height
cr = ColorRed()
cg = ColorGreen()
cb = ColorBlue()
clr = cr*$10000 + cg*$100 + cb
gw = GraphicsWidth() : gh = GraphicsHeight()

LockBuffer

For i = 1 To Len(txt)
If (Asc(Mid(txt,i,1)) >= f\start) And (Asc(Mid(txt,i,1)) <= f\ende) Then
chw = f\widths[ch]
pos = ch * f\width * f\height
For y = 0 To chh-1
For x = 0 To chw+1 ; Warum +1? Ich kapiers nicht, aber es scheint so zu stimmen
If ((tx+x) < gw) And ((tx+x)>=0) And ((ty+y)<gh) And ((ty+y)>=0) Then

perc = PeekByte(f\AAData,(Asc(Mid(txt,i))-f\start)*f\width*f\height + y*f\width + x)

If perc = 255 Then
WritePixelFast tx+x,ty+y,clr
ElseIf perc <> 0 Then
src = ReadPixelFast(tx+x,ty+y)

RB1=src And $FF00FF : RB2=clr And $FF00FF
G1=src And $FF00 : G2=clr And $FF00

RB=(((perc*(RB2-RB1))Shr 8)+RB1) And $FF00FF
G=(((perc*(G2-G1))Shr 8)+G1) And $FF00

dest = (RB Or G)

WritePixelFast tx+x,ty+y,dest
End If
End If

pos = pos + 1
Next
Next
tx = tx + f\widths[Asc(Mid(txt,i,1))-f\start]
End If
Next


UnlockBuffer

End Function

; DEMO
Graphics 640,480

fnt = createaafont("Tahoma",40,True)

Print "Berechnung fertig"
WaitKey
Cls

SetAAFont fnt

Color 255,255,255

AAText 20,20,"Text"

WaitKey


Das sind meine Routinen für geantialiasten Text. Um das Laden zu beschleunigen (Es ist schon ziieemlich langwierig, vor allem bei größeren Schriften...) könnte man die AAData - Bank in eine Datei speichern und wieder laden. Das werd ich wohl auch noch implementieren. Ansonsten sind die Funktionen zu benutzen wie die normalen Text - Funktionen. Eben CreateAAFont statt LoadFont, SetAAFont statt SetFont, und AAText statt Text. Optimierungen sind natürlich auch willkommen Wink
Bei CreateAAFont kann man am Ende eine SampleSize einstellen. Am Anfang hatte ich 4, aber 2 gibt (fast) genau die gleichen Ergebnisse und ist viel schneller. Einstellbar sind Werte bis 8. Nur steigt die Rechendauer eben quadratisch an.
Ach ja, die start und ende Parameter sind dazu da, die Anzahl der Zeichen zu verringern. Ich hab das nur mit 0 und 255 getestet. Würde aber die Geschwindigkeit verbessern, wenn man nur meinetwegen 32-127 nehmen würde.

Edit: Jetzt ist der Text auch zentrierbar, hatte das völlig vergessen Embarassed
Ausserdem gibts jetzt alle Font - Befehle (Ausser Print,Locate etc.) auch für AAFonts.

Edit 2: Ich habe zwei Funktionen LoadAAFont() und SaveAAFont() hinzugefügt. Damit können die Schriften gespeichert werden. Wenn man die Schriften aus einer Datei lädt, anstatt sie dynamisch zu erstellen, verkürzt das die Ladezeiten ungemein 8) Jedoch sind die Dateien recht groß (Tahoma 40 fett = über 750 kb).

Edit 3: Der Fehler mit den komischen Linien auf der anderen Seite des Bildschirms ist gefixt.

Edit 4: Jetzt werden keine Buchstaben mehr abgeschnitten. Aber ich verstehe nicht, warum das so sein muss wie es jetzt ist Confused
 

cavebird

BeitragFr, Aug 20, 2004 13:29
Antworten mit Zitat
Benutzer-Profile anzeigen
Ist das auch wirklich schnell genug für Spiele?
MegaUpload.de -- Uploade bis zu 2MB pro Bild !!DEIN PARTNER IN SACHEN UPLOAD --bitte weiterempfehlen, nur so können wir bekannt werden...
 

OJay

BeitragFr, Aug 20, 2004 13:43
Antworten mit Zitat
Benutzer-Profile anzeigen
das kann man vergessen! schon bei einer zeile text fallen die fps ins bodenlose...

außerdem verstehe ich nicht, wozu du diese funktionen brauchst...bei mir werden schriftarten auch so geglättet, ohne das ich FSAA aktiviert habe...du solltest mal deine windowseinstellungen überprüfen.

Neue Antwort erstellen


Übersicht BlitzBasic Codearchiv

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group