Ich werde nie auch nur halbwegs an die korrekte breite jedes einzelnen Chars herankommen.
Hört sich ja fast so an, als ob
OpenGL = Quanten-Physik ist.
Wenn man die Breite nicht bestimmen kann, dann kann man das auch nicht zeichnen, weil der Bildschirm hat einfach nur Pixel und die müssen mit Farbe gefüllt werden
Ausserdem machst du das doch genau hier:
Delphi-Quellcode:
// Parse width of Glyph
for I := 0 to High(Char) do
begin
Char[I] := WideChar(SongNameTmp[I]);
// .......... vvvvvvvvvvvvvvvvvvvvvvv
CharLength := tsFontGetCharParameteri(Char[I], TS_CHAR_GLYPHRECT_RIGHT);
CharLen := CharLen + CharLength;
end;
Irgendwann läufst du aus dem Maximalbereich heraus und musst jetzt den Text soweit kürzen, dass aber auch der Suffix noch dargestellt werden kann.
Nehmen wir mal eine feste Breite von 20 (das Verfahren ist genau wie bei der varaiblen Laufweite, nur einfacher darzustellen) und als Suffix
... (more)
:
Original | gekürzt | Kommentar |
---|
12345678901234567890 | 12345678901234567890 | Original passt, da brauchen wir nichts zu kürzen |
123456789012345678901 | 1234567890... (more) | hier müssen wir kürzen |
Beim Kürzen des Textes muss man also wieder ein paar Zeichen zurück gehen ... oder sich diesen speziellen Zustand einfach merken.
Du musst also nichts anderes machen als
- Die Breite des Suffixs zu bestimmen
Delphi-Quellcode:
lSuffixLength := 0;
for lChar
in ShortenSuffix
do
begin
lSuffixLength := lSuffixLength + CharMeasurement( lChar );
// <- das könnte auch eine OpenGL-Zeichenbreiteermittlungsfunktion sein
end;
- Jetzt den Text Zeichen für Zeichen durcharbeiten
Delphi-Quellcode:
Result := '
';
lText := TrimRight( Text );
lTextLength := 0;
lShortendWithSuffixFound := False;
for lChar
in lText
do
begin
lCharLength := CharMeasurement( lChar );
// <- das könnte auch eine OpenGL-Zeichenbreiteermittlungsfunktion sein
- dabei aber den Zeitpunkt abpassen, wenn die bisher ermittelte Textlänge mit der Suffixlänge und dem aktuellen Zeichen über die Maximallänge hinausgeht. Denn den Text solltest du dir für den Fall der Fälle merken, wenn du den Text kürzen musst. Das ist bei dir aktuell diese ominöse 58
Delphi-Quellcode:
if not lShortendWithSuffixFound and ( lTextLength + lCharLength + lSuffixLength > MaxLength )
then
begin
lShortenedWithSuffix := Result + ShortenSuffix;
lShortendWithSuffixFound := True;
end;
- Wenn man dann über die Maximallänge kommt gibt man einfach diesen eben gemerkten Text zurück
Delphi-Quellcode:
if lTextLength + lCharLength > MaxLength
then
begin
Result := lShortenedWithSuffix; // <- das ist das gesuchte Ergebnis
Exit;
end;
- ansonsten einfach mal zusammenzählen und zum nächsten Zeichen
Delphi-Quellcode:
Result := Result + lChar;
Inc( lTextLength, lCharLength );
end;