FormatText 1.00 : Texte formatieren leicht gemacht...

Übersicht BlitzMax, BlitzMax NG Codearchiv & Module

Neue Antwort erstellen

d-bug

Betreff: FormatText 1.00 : Texte formatieren leicht gemacht...

BeitragMi, Apr 11, 2007 21:58
Antworten mit Zitat
Benutzer-Profile anzeigen
Wofür?
FormatText dient dem leichten formatieren von Texten. Es können diverse Tags im Text angegeben werden, die dem folgenden Text z.B. eine andere Farbe geben oder dessen Transparenz ändern. Außerdem sorgt FormatText endlich dafür, dass auch Zeilenumbrüche mit DrawText dargestellt werden können.

Das ganze funktioniert über einen Trick, den ich auch schon bei meinem BitmapFont Modul anwendete. Der komplette Text wird einfach gesagt, in einen Font konvertiert. Also ist eigentlich nicht der resultierende Text das wichtigste, sondern der resultierende Font. Natürlich wird auch der resultierende Text benötigt um die richtige Anzahl an Zeichen für DrawText anzugeben, aber jede Formatierung wird am Font vorgenommen.


Limitierungen
Da Mark Sibley in seiner göttlichen Vorraussicht ja nicht vorgesehen hat, das man Texte mit Linefeeds versieht, gibt es leider kleine Mankos.

  • TextWidth() kann nur bei einzeiligen Texten verwendet werden
  • TextHeight() ebenfalls. (Wobei dieser Befehl eh Quatsch ist)

Von der Texterstellung während der Laufzeit des Programmes (Realtime) würde ich bei längeren Texten auch absehen. Die Initialisierungszeit für dieses Workaround ist schon beachtlich. Schließlich muss ja erst noch der ganze Font erstellt werden.


Welches OS?
FormatText sollte plattformunabhängig sein, also auf Win32, MacOS und Linux lauffähig. Allerdings konnte ich das noch nicht testen, da ich weder MacOSX noch Linux installiert habe. Ich würde mich da sehr freuen, wenn mir jemand da mal ein Feedback geben könnte.


Wie?
Es ist eigentlich garnicht so schwierig, einen Text zu formatieren. Aber erstmal einen Beispielcode, der alle gültigen Formatierungen enthält.
Code: [AUSKLAPPEN]
'-- benötigte Module importieren --
Import brl.freetypefont
Import chaos.formattext

'-- Grundinitialisierung --
SuperStrict
Graphics (640,480,0,32)
SetClsColor (100,100,100)
SetBlend ALPHABLEND

'-- Fonts laden (Pfade für Linux und MacOS bitte selbst anpassen) --
Local Verdana12:TImageFont = LoadImageFont ("c:\windows\fonts\verdana.ttf", 12, SMOOTHFONT)

'-- Image laden (test.png ist im Download enthalten) --
Local image:TImage = LoadImage ("test.png")

'-- Handles für Textformatierung ermitteln --
Local Verdana12handle:Int = HandleFromObject (Verdana12)
Local ImageHandle:Int = HandleFromObject (image)

'-- Text erstellen --
Local FormText:String = "<AC>" 'Text horizontal zentrieren (kann beliebig im Text gesetzt werden)
FormText:+"Herzlich willkommen bei chaos.formattext!~n~n"
FormText:+"Mit FormatText() koennen folgende Formatierungen vorgenommen werden:~n"
FormText:+"<IMG="+ImageHandle+"> : Bilder in den Text einbinden...~n"
FormText:+"<COLOR=255,0,0>Verschiedene</COLOR> <COLOR=0,255,0>Farben</COLOR> setzen...~n"
FormText:+"<ALPHA=0.5>Transparenz</ALPHA> setzen...~n"
FormText:+"<FONT="+Verdana12Handle+">verschiedene Fonts</FONT> setzen...~n"
FormText:+"Zeilenumbrueche...~n~n"
FormText:+"... und das alles wird nur mit einem DrawText-Aufruf gezeichnet!!!!1eins"

'-- Formatierung vorbereiten --
Local FormFont:TImageFont
Local FormTextHalfWidth:Int
Local FormTextHalfHeight:Int

'-- Text formatieren --
'Hier könnte jetzt auch ein Grundfont gesetzt werden
FormatText (FormText, FormFont)
FormTextHalfWidth = FormatTextWidth (FormText) / 2
FormTextHalfHeight = FormatTextHeight (FormText) / 2

'-- Hauptschleife --
Repeat

   SetHandle (FormTextHalfWidth, FormTextHalfHeight)
   
   'Jetzt der wichtigste Befehl zum korrekten darstellen der Texte
   SetImageFont (FormFont)

   'Formatierten Text zeichnen
   DrawText (FormText, GraphicsWidth() / 2, GraphicsHeight() / 2)
   
   SetHandle (0,0)
   
   Flip
   Cls

Until KeyHit(KEY_ESCAPE) Or AppTerminate()
End

Diese Beispiel zeigt eigentlich ganz gut, welche neuen Funktionen FormatText zur verfügung stellt, aber wir wollen mal nicht kniepig sein und die Befehle nochmal einzeln aufschlüsseln:

Code: [AUSKLAPPEN]
'Einen Text formatieren...
Local FormText:String = "Ein tolles <COLOR=255,0,0>rotes</COLOR> Wort"
Local FormFont:TImageFont
FormatText (FormText, FormFont)

Code: [AUSKLAPPEN]
'Breite eines formatierten Textes ermitteln
Local FormTextWidth = FormatTextWidth (FormText)

Code: [AUSKLAPPEN]
'Höhe eines formatierten Textes ermitteln
Local FormTextHeight = FormatTextHeight (FormText)


Gültige Formatierungen:
Code: [AUSKLAPPEN]
~n = Zeilenumbruch
<AC> = Gesamten Text zentriert darstellen
<AR> = Gesamten Text rechtsbündig darstellen
<AJ> = Gesamten Text als Blocksatz darstellen
<ALPHA=a> = Transparenz des folgenden Textes setzen
</ALPHA> = Transparenz aufheben
<COLOR=r,g,b> = Farbe des folgenden Textes setzen
</COLOR> = Farbe aufheben
<FONT=handle> = Font des folgenden Textes setzen
</FONT> = Font aufheben
<IMG=handle> = Image als Zeichen setzen


Known Bugs
Der Blocksatz Tag (<AJ>) hat noch einen Fehler, wenn man einen Text mit mehreren Leerzeilen (z.B. ~n~n~n) erstellt. Da bedarf es noch ein wenig des nachdenkens.

Download
FormatText 1.00 als *.zip inklusive aller benötigten Module (natürlich ohne brl o. pub)

Abschließend bleibt mir nurnoch zu sagen, dass ich mich über Feedback und Bugreports freuen würde.

cheers

~edit~
Achtung
Fast alle BMX-Dateien hatten bis eben eine große Dateiendung. Das kommt durch einen Fehler in meiner UEStudio Konfiguration. Bitte downloadet das Archiv erneut, oder benennt alle BMX-Dateien um und gebt ihnen eine kleine Dateiendung. Anscheinend hat BMax Probleme beim Kompilieren, wenn die Endung groß ist. Auch hierfür noch mal meinen heißesten Dank an Mark Sibley Very Happy ...
  • Zuletzt bearbeitet von d-bug am Fr, Dez 04, 2009 21:40, insgesamt einmal bearbeitet
 

E. Urbach

ehemals "Basicprogger"

BeitragDo, Apr 12, 2007 13:23
Antworten mit Zitat
Benutzer-Profile anzeigen
Spitze!
Genau das was ich brauche, ich werd mal einen speed-test machen, ob es sich für "TextArea-Wrapper-Highlighting" über Canvas eignet.

Der Beispielcode sieht schonmal recht gut aus Smile

EDIT: Mein Algorithmus war wohl doch etwas schneller. Trotzdem ein recht brauchbares Modul, wenn man schnell mal formatierten Text braucht.
The box said, "Requires Windows XP or better", so I installed Ubuntu | Linux is NOT Windows
Flua :: Profiler für BB und BMax :: Partikel-Engine für BMax :: Lyphia-Projekt Quellcode (BMax) :: Automatische Parallelisierung :: Meine Musik

d-bug

BeitragSa, Apr 21, 2007 12:17
Antworten mit Zitat
Benutzer-Profile anzeigen
Huch, hatte nicht mitbekommen, dass du noch mal etwas geschrieben hattest...

Nun, wie ich oben bereits erwähnte, ist von realtime Manipulationen des Textes abzusehen, da dann jedes mal ein neuer Font erstellt werden muss. Also, wenn man z.B. ein Zeichen anhängt, oder entfernt. Das macht es eben für eine Textarea oder ein anderes Input unbrauchbar. Wenn man aber einen Text in verschiedenen Farben nur darstellen will, dann sollte es doch um einiges schneller sein, als Char by Char Routinen.

Neue Antwort erstellen


Übersicht BlitzMax, BlitzMax NG Codearchiv & Module

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group