Registriert: Do Sep 02, 2004 19:42 Beiträge: 4158
Programmiersprache: FreePascal, C++
Halloo,
Ich hab auch mal wieder ne Frage. Und zwar bin ich gerade verzweifelt auf der Suche nach einer Methode, wie ich herausfinden kann, welche Zeichen von einer Schriftart unterstützt werden, also welche nicht in so einem "hübschen" Block oder Fragezeichen enden. Hat da jemand eine Idee? Muss ich da iwas mit den Codepages drehen oder so? Dazu sollte ich vielleicht noch anmerken, dass ich mich nur in den ersten 256 Zeichen bewege, also kein Unicode und auch kein UTF-8
Gruß Lord Horazont
_________________ If you find any deadlinks, please send me a notification – Wenn du tote Links findest, sende mir eine Benachrichtigung. current projects: ManiacLab; aioxmpp zombofant network • my photostream „Writing code is like writing poetry“ - source unknown
„Give a man a fish, and you feed him for a day. Teach a man to fish and you feed him for a lifetime. “ ~ A Chinese Proverb
Registriert: Do Dez 05, 2002 10:35 Beiträge: 4234 Wohnort: Dortmund
Was benutzt du denn für eine Fontbibliothek? GDI, SDL_ttf, FreeType?
Für die GDI gibt es verschiedene Möglichkeiten. GetGlyphIndices berechnet die Indizes. Aber wird nur ab NT4 unterstützt. Alternativ benutze ich bei meinen Fonts die Methode GetCharacterPlacementW. Leider brauch ich die W Variante und die wird auch erst ab NT4 unterstützt. Die A Variante gibt es aber schon seit 95. Poste hier einfach mal den Code aus meiner TextSuite. Dürfte recht verständlich sein.
Code:
var
DC: HDC;
GCPRes: TGCPResultsW;
begin
Result :=0;
DC := CreateCompatibleDC(0);
try
SelectObject(DC, fFontHandle);
FillChar(GCPRes,SizeOf(TGCPResultsW),0);
GetMem(GCPRes.lpGlyphs,SizeOf(Cardinal));
try
GCPRes.lpGlyphs^:=0;
GCPRes.nGlyphs:=1;
if GetCharacterPlacementW(DC,@CharCode,1, GCP_MAXEXTENT, GCPRes,0) <> GDI_ERROR thenbegin
Wenn das Zeichen nicht existiert wird 0 zurück gegeben. Ich will meine Hand aber auch nicht ins feuer dafür legen ob das auch wirklich 100%tig so richtig ist. Bei meiner Library gehts zwar aber das hat nicht immer was zu heißen.
Bei 256 Zeichen mag dieser Ansatz gerade noch so okay sein. Wobei man bei Massenabfragen das ein oder andere zusammen erledigen kann/sollte. Aber solltest du irgendwann mal mehr Zeichen abfragen müssen sollte man vermutlich einen anderen Weg gehen.
Registriert: Do Sep 02, 2004 19:42 Beiträge: 4158
Programmiersprache: FreePascal, C++
Hmm... Da ich mit Lazarus arbeite und in diesem Falle Plattformunabhängig bleiben will, hilft mir dieser Ansatz leider nicht weiter. Zwischenzeitlich habe ich mal ein wenig weiter Recherchiert und bin da bei Charsets gelandet, die Fonts unterstützen oder auch nicht. Hat das was damit zu tun? Kann ich feststellen, ob ein Font Latin-1 oder Latin-9 vollständig belegt?
Gruß Lord Horazont
_________________ If you find any deadlinks, please send me a notification – Wenn du tote Links findest, sende mir eine Benachrichtigung. current projects: ManiacLab; aioxmpp zombofant network • my photostream „Writing code is like writing poetry“ - source unknown
„Give a man a fish, and you feed him for a day. Teach a man to fish and you feed him for a lifetime. “ ~ A Chinese Proverb
Registriert: Do Dez 05, 2002 10:35 Beiträge: 4234 Wohnort: Dortmund
Das war eben genau das was ich mit meiner ersten Frage meinte.
Die Charsets/Codepages sind für deinen Fall nur Schall und Rauch. Die Codepages geben nur an für welches Gebietsschema die Fonts verwendet werden können. Und das wird nicht automatisch ermittelt sondern wird (meine ich) von den Fonts gesetzt. Es kann also sein, dass ein Font Zeichen unterstützt aber das Schema nicht angibt oder aber auch, dass ein Schema unterstützt wird aber die Hälfte der Zeichen fehlen. Also das ist nicht brauchbar.
Das Lazarus TFont ist ähnlich beschränkt wie das von Delphi. Allerdings für normale Anwendungen genügt es. Und jedes Feature was da mehr hinzukommt benötigt natürlich auch dann eine entsprechende Unterstützung auf allen Platformen.
Deswegen denke ich wirst du um eine Platformspezifische Lösung nicht herum kommen. Also, dass du per define unterscheiden musst auf welcher Platform du dich befindest und dann für die Platformen jeweils eine Lösung einbaust. Du bekommst ja ein Handle. Unter windows sollte das eigentlich ein HFONT sein (in meinem Beispiel fFontHandle). Wie das unter Linux aber aussieht habe ich keine Ahnung.
PS: Das Defaultzeichen muss auch nicht nur ein Viereck sein. Das kann vom Font auch vollkommen frei designed werden. Also es könnte sich dabei um sonst etwas handeln.
Registriert: Do Sep 02, 2004 19:42 Beiträge: 4158
Programmiersprache: FreePascal, C++
Gut... (oder auch nicht ). Dann werde ich mich diesbezüglich mal umschauen müssen. Entweder gehe ich bei sdl_ttf im Source spionieren oder ich quäle google. Oder hat hier jemand Kenntnisse, wie man sowas unter Linux und eventuell auch Mac macht?
Gruß Lord Horazont
_________________ If you find any deadlinks, please send me a notification – Wenn du tote Links findest, sende mir eine Benachrichtigung. current projects: ManiacLab; aioxmpp zombofant network • my photostream „Writing code is like writing poetry“ - source unknown
„Give a man a fish, and you feed him for a day. Teach a man to fish and you feed him for a lifetime. “ ~ A Chinese Proverb
Registriert: Do Dez 05, 2002 10:35 Beiträge: 4234 Wohnort: Dortmund
SDL_ttf wird dir nicht helfen, da die nur auf FreeType aufsetzen. FreeType arbeitet aber wieder direkt binär in den Fontdateien. Linux arbeitet zwar auch mit FreeType aber ich könnte mir gut vorstellen, dass das evtl. noch in irgendeiner Form gekappselt ist. Das weiß ich aber nicht genau.
Aber ich denke so weit brauchst du gar nicht in die Ferne schweifen, denn schließlich kann dein Lazarus ja bereits Fonts sowohl unter Win32, Linux als auch Mac, oder? Da sollte es genügen, wenn du bei Lazarus etwas schnüffeln gehst. Besonders so in Verbindung mit TBitmap.Canvas (die passende Canvasinstanz wird vermutlich im konstruktor erstellt). Dann siehst du zu mindest schon mal wie es aufgebaut ist. Das sollte dann die Suche dann erheblich einschränken können.
Registriert: Do Sep 02, 2004 19:42 Beiträge: 4158
Programmiersprache: FreePascal, C++
Lazarus hat da ganz unterschiedliche Codes für jedes Widgetset (GTK, QT, Win32...). Da ich meine Anwendung wegen UTF8 auf GTK2 laufen lasse, liegt da für die Fonts Pango drunter... Der Header setzt sich aus einem Stapel includes zusammen, mir bleibt wohl erstmal nichts anderes übrig, als mich durch die Pango Manual durchzuwühlen.
Gruß Lord Horazont
_________________ If you find any deadlinks, please send me a notification – Wenn du tote Links findest, sende mir eine Benachrichtigung. current projects: ManiacLab; aioxmpp zombofant network • my photostream „Writing code is like writing poetry“ - source unknown
„Give a man a fish, and you feed him for a day. Teach a man to fish and you feed him for a lifetime. “ ~ A Chinese Proverb
Mitglieder in diesem Forum: 0 Mitglieder und 1 Gast
Du darfst keine neuen Themen in diesem Forum erstellen. Du darfst keine Antworten zu Themen in diesem Forum erstellen. Du darfst deine Beiträge in diesem Forum nicht ändern. Du darfst deine Beiträge in diesem Forum nicht löschen. Du darfst keine Dateianhänge in diesem Forum erstellen.