Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   Delphi Gr32 - Unterstrichener Text bei TextToPath geht nicht (https://www.delphipraxis.net/209498-gr32-unterstrichener-text-bei-texttopath-geht-nicht.html)

berens 14. Dez 2021 14:54


Gr32 - Unterstrichener Text bei TextToPath geht nicht
 
Hallo zusammen,
ich verwende folgende Prozedur, die wunderhübschen Text mit Kantenglättung darstellt.

Leider gibt es hier das Problem, dass die verwendete Prozedur das Unterstreichen von Texten nicht beherrscht. Ich nehme dann, das Problem/der Fehler liegt in TextToPath von GR32.

Hat jemand eine Idee, woran das liegen kann?

Delphi-Quellcode:
procedure AntiAlias_DrawText(_Bitmap: TBitmap32; _Text: string; _Font: TFont; _Rect: TRect);
var
  Intf: ITextToPathSupport;
  DestRect: TFloatRect;
  Flag: Integer;
  FPath: TFlattenedPath;
begin
  _Font.Quality := fqAntialiased;
  _Bitmap.Font.Assign(_Font);
  _Bitmap.Canvas.Font.Assign(_Font);

  // Zum Testen: Unterstreichen geht nicht!
  _Bitmap.Font.Style := [fsUnderline];

  if Supports(_Bitmap.Backend, ITextToPathSupport, Intf) then
  begin
    DestRect := FloatRect(_Rect);
    InflateRect(DestRect, -10, -10);

    Flag := DT_TOP or DT_NOPREFIX;
    FPath := TFlattenedPath.Create;
    try
      Intf.TextToPath(FPath, DestRect, _Text, Flag);

      PolyPolygonFS_LCD2(_Bitmap, FPath.Path, clWhite32, pfWinding);
    finally
      FreeAndNil(fpath);
    end;
  end else begin
    raise Exception.Create(RCStrInpropriateBackend);
  end;
end;
Ich habe schon mit dem Gedanken gespielt, den kompletten String durch "_" ersetzen zu lassen, und dann einfach nochmal drüber zu zeichnen. Das Problem ist dann leider, dass ein anderer Zeilenumbruch verwendet wird, und die "Texte" nicht deckungsgleich sind, da z.B. mein vorher gezeichnetes "i" schmaler ist als der Tiefstrich "_" in der selben Schriftgröße...

Dankbar für alle Ideen,
lg

Delphi.Narium 14. Dez 2021 15:04

AW: Gr32
 
Keine Ahnung.

Mein erster Ansatz wäre als Krücke für den Fall: "Es gibt keine Lösung":

Länge des Textes ermitteln und dann einen String "basteln", der soviele _ enthält, dass seinen Länge (annähernd) deckungsgleich mit der Länge des Strings ist. Dadurch werden Längenunterschiede zwar nicht gänzlich eliminiert, aber auf ein (hoffentlich) erträgliches Maß reduziert.

berens 14. Dez 2021 15:22

AW: Gr32
 
Das wäre sehr unglücklich... :/

Ich dachte bei der TextToPath Funktion werden quasi die Glyphen als S/W Bitmap gezeichnet, über Rahmenlinien in einen "Path" verwandelt und dann mit ner richtigen "Vektorgrafik"-Funktion (PolyPolygonFS_LCD2) nochmal später tatsächlich gezeichnet. Da müsste ja dann die Unterstrichlinie dabei sein. Scheinbar ist dem aber nicht so.

Beim selbstzeichnen weiß ich halt auch wegen Zeilenumbrüchen etc, wo -pro Zeile- der Text aufhören würde - zusätzlich erschwert durch die mögliche Ausrichtung von Links-Mitte-Rechts, Oben-Mitte-Unten. Im Prinzip müsste ich mir die "Textrect" funktion komplett neu selbst programmieren, incl. Parsing von Zeilenumbrüchen etc. Ich brech ab... :?

Zitat:

Text1 bla bla Foo
mit Zeilenumbruch
darf dann nicht in ______________________________ ohne Zeilenumbruch enden, aber auch nicht in
Zitat:

Text1 bla bla Foo
_______________________
mit Zeilenumbruch
_____________
Evtl. könnte ich die normale TextRect Funktion von Windows (bzw. Bitmap.Canvas o.ä.) drüberwerfen, das sollte eigentlich -bis auf's Antialiasing- deckungsgleich sein. Gibt es Möglichkeit, unterstrichenen Text auszugeben, und dabei nur den "Unterstrich" zu zeichnen, also die Buchstaben wegzulassen? Ich meine da was im Kopf zu haben...?

Sinspin 14. Dez 2021 16:06

AW: Gr32
 
Hallo, wenn du eh mit GR32 arbeitest zeichnest du doch eh selber? Warum dann nicht auch die Linie einfach selber unter den Text zeichnen? Also nicht aus Zeichen, sondern als Grafik, unterstreichen, durchstreichen, überstreichen, durchkreuzen, alles geht :roll:

berens 14. Dez 2021 19:09

AW: Gr32 - Unterstrichener Text bei TextToPath geht nicht
 
Liste der Anhänge anzeigen (Anzahl: 1)
> Warum dann nicht auch die Linie einfach selber unter den Text zeichnen?
Gerade bei mehrzeiligem Text weiß ich nicht, wo sich gerade die einzelnen Worte befinden. Abhängig von Schriftart, Zeichenhöhe, Kerning, Wordwrap, Ausrichtung (Oben Unten Mitte, Links Rechts Mitte) etc. ist es ab einer gewissen Zeilenzahl sehr unwahrscheinlich, dass ich noch halbs richtig unterstreiche. Bei einzeiligem Text ohne Umbruch - sicher: kein Problem. Bei mehrzeiligem Text müsste ich die komplette TextRect-Prozedur selbst nachprogrammieren um zu wissen, wo Buchstaben stehen und wo nicht - dafür habe ich nicht das Know-How, und auch nicht die Zeit wenn die TextToPath Prozedur das ja im Prinzip schon fertig kann.

Bei Ö und Ä sind die Punkte auch extra und nicht durchgehend als Pfad verbunden. Warum kommt die Unterstreichen-Linie nicht?

Im Anhang kann man sehen, wie sich die Länge der Worte und deren "Unterstreichungen" nicht decken. Woher sollte man also diese Abmessungen nehmen, ohne sie mit exorbitnatem Aufwand selbst zu kalkulieren?

Michael II 14. Dez 2021 20:41

AW: Gr32 - Unterstrichener Text bei TextToPath geht nicht
 
Wenn du nur waagrecht Text ausgeben willst, dann könntest du _BitMap.RenderText() verwenden. Damit klappt es mit dem Unterstreichen - und gerendert wird auch schön.


Alle Zeitangaben in WEZ +1. Es ist jetzt 08:50 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz