Font Dateien Laden und mit ihnen Text ausgeben?

BoT

Mitglied
Ich habe einmal versucht, eine Hardwarebeschleunigte Textengine zu schreiben. (Das war noch zu Zeiten von DirectX 7) Damals musste man sich einen Zeiger auf den Speicher im VRAM von DirectDraw liefern lassen und mit ihm in diesem Arbeitsspeicher schreiben. Man malt also Pixel für Pixel auf den Bildschirm. Da es nun wirklich schwierig (und auch noch sehr unflexibel) ist, einen Buchstaben so in den Speicher zu schreiben, wollte ich gerne wissen wie man Font Dateien mit einem Programm einliest, z.B. mit entsprechenden Windows API Funktionen.

Ich weiss allerdings, dass DirectX 7 praktisch schon ein Opa geworden ist, und die Interfaces sich vollständig verändert haben. Deswegen bin ich mir auch nicht sicher, ob mir das jemand beibringen kann. :)

Danke schon mal im voraus.

BoT, Die Automatisierungsmaschine
 
Es wäre vermutlich klug, die Fonts zuerst in etwas leichter Verdauliches umzuwandeln, bevor man sie (hardwarebeschleunigt) zu Darstellung verwendet.

Ich habe mal bei einem Projekt hauptsächlich die WinAPI-Funktionen benützt, um einen Windowsfont in ein TGA umzuwandeln (okay, ehrlich gesagt hat Endurion die Umwandlungsroutinen geschrieben! :-) ).
Diese TGA-Fontdateien liessen sich dann relativ einfach zur Textdarstellung verwenden (nämlich als Texturen, mit D3D! Cooool!). Mit DirectDraw (falls es das noch gibt) wäre das sicherlich auch einfacher und schneller, als direkt Windowsfonts zu benutzen.

Jedenfalls solltest du es nicht alles auf einmal machen, sondern in mehreren Schritten.
 
Gut aber wie finde ich heraus wie diese Font Dateien "aussehen"?
Zum Beispiel hat eine Bitmap ein BITMAPFILE- und INFOHEADER, dann die farbpalette, eine Audiodateihat Chunks usw..

Wie ist es aber mit FontDateien?

(Und gibt es auch Win-API Funktionen, mit welchen man Fonts laden kann?)
 
Also, der richtige Crack für so was ist wie gesagt Endurion, aber...

Gut aber wie finde ich heraus wie diese Font Dateien "aussehen"?
Zum Beispiel hat eine Bitmap ein BITMAPFILE- und INFOHEADER, dann die farbpalette, eine Audiodateihat Chunks usw..
Das funktioniert mit Fonts ein bischen anders. Schau dir mal das an (in der MSDN Lib): EnumFontFamiliesEx und das:

Code:
int CALLBACK EnumFontProc( const LOGFONT *lpLogFont, const TEXTMETRIC *lpMetrics,
                           unsigned long fontType, CComboBox *wndCombo )
{
  if ( fontType == TRUETYPE_FONTTYPE )
  { 
     ...
und das:
Code:
  EnumFontFamiliesEx( GetDC()->m_hDC, &lfDummy, (FONTENUMPROC)EnumFontProc, (LPARAM)&m_ctlComboFont, 0 );

Die vorhandenen Fonts werden mit Enum...Ex aufgezählt. Die EnumFontProc-behandelt einen einzelnen aufgezählten Font. Du bekommst dort zum Beispiel den (Pointer auf einen) LOGFONT übergeben, der dir mehr über den Font erzählen kann. lpLogFont->lfFaceName ist zum Beispiel der Name des Fonts.

Hilft dir das schonmal weiter?
 
Jetzt schiebt der alles auf mich :)

Also: Diese Umwandelnroutine von Font nach TGA war eigentlich recht billig, klappt aber auch nur mit bereits installierten Fonts. War also nix mit Font selbst laden (obwohl das auch geht, da würde ich Richtung FreeType googlen). Ich habe dann einfach einen grossen DC gebastelt, den Font reinselektiert und die Buchstaben gemalt (also GDI die Arbeit machen lassen). Also wahrscheinlich NICHT die Methode der Wahl für direktes Darstellen.

Die Methode, die ich in DirectDraw ebenso wie in Direct3D verwende: Ich habe ein Font-Surface, wo die einzelnen Buchstaben drauf sind. Ich rechne beim Reinladen aus, wie breit die einzelnen Buchstaben sind (in Direct3D baue ich auch Kerning-Pairs). Beim Darstellen klebe ich eigentlich nur Buchstabe für Buchstabe hintereinander.


Was auch machbar wäre, ich meine auch eins der Samples im DirectX-SDK würde das so machen:

Man kann von einem Font die Glyphen holen (direkt mit der Win-API, auch wieder über GDI) und den Text innerhalb BeginPath/EndPath mit TextOut darzustellen. Wenn man jetzt GetPath aufruft, bekommt man ein Array mit Linien und Kurven zurück, die den Buchstaben darstellen. Die könnte man jetzt in Polygone umwandeln, als richtigen 3d-Font.

MS ist aber nicht doof und hat eine tolle ID3DXFont-Klasse gebaut, die gut optimiert Text ausgeben kann und sich intern um alles kümmert. Ich meine noch im Kopf zu haben, dass ID3DXFont aber noch nicht das Beste ist; es gibt in den Samples eine CD3DFont-Klasse, die noch besser ist.

Wenn das Geschwafel jetzt irgendwie geholfen hat, war's wenigstens zu irgendwas gut.:suspekt:
 
Naja wieder nicht direkt :D

Kannst du mir einfach sagen, wie man aus einer Font Datei, ein Array von Buchstaben macht? (Also ein Array von Arrays von Pixeln, wenn du mich verstehst ^^)

Ungefähr so:

Code:
narrBuchstaben [buchstabe] [zeiger auf einen pixel des buchstabens] = fordere_buchstaben_von_font_datei_an(...)

Wenn ich also einen Buchstaben ausgeben will, dann brauche ich also nur die ID des Buchstabens in der ersten Dimension (sagt man das so?) des Arrays anzugeben, und von der Startadresse aus lesen... Bis das Array der Pixeln seine Maximalgröße erreicht hat... Also brauche ich auch sowas wie ein Nullterminierungszeichen, und ich vergesse das gleich lieber ^^

Trotzdem danke! ^^
 
Also wie gesagt, Font-Dateien (F) habe ich nie direkt gelesen.

Ich habe Windows ein Zeichen nach dem anderen in ein DC malen lassen, und hab mir davon dann die Pixel rausgeholt. (CreateDIBSection, DC davon holen, Font Createn und in DC selektieren, TextOut, und dann den Pointer auf die PixelDaten verwenden um die Zeichendimensionen zu lesen).

Es gibt irgendwo da im Netz auch einen Font-Textur-Generator, der macht einen oder zwei Fonts in einem Raster auf eine quadratische Bitmap. Der kann auch noch Kerning-Daten (Abstandspaare) speichern. Da kann man auch recht einfach an die Pixel ran.
 
Zurück