@ Sherlok und TiGü: Den Thread hatte ich sogar in großen Teilen mitgelesen, den Tipp von Uwe allerdings irgendwie übersehen. Wobei das allerdings (leider "nur") eine Lösung für
VCL ist, ich entwickle aber fast nur noch mit FMX... (jedenfalls jedes neue Projekt, und bisherige Sachen stelle ich ja schon seit einiger Zeit nach und nach auf FMX um).
Die Lösung ist auch für FMX auf Windows gültig, hier muss man aber ein bisschen aufwendiger werden beim Patchen.
Das FMX-Framework ist leider so designet, dass viele Klassen im Implementation-Teil versteckt sind und man sie dadurch nicht ableiten/verbessern/patchen kann.
Wenn du dir aber die
Unit FMX.Canvas.D2D.pas ins Projekt kopierst und entsprechend anpasst, kannst du ohne weiteres die fehlende Konstante im Aufruf von ID2D1RenderTarget.DrawTextLayout anwenden.
Anbei findest du als ZIP-Archiv noch ein Beispielprojekt.
Durch dieses Vorgehen müsste eigentlich auch deine
HTML-Editor-Komponente den veränderten Canvas bzw. das angepasste TTextLayoutD2D verwenden.
Selbstverständlich ist das nur gültig, wenn ein Direct2D-Canvas verwendet wird/verwendet werden kann.
Auf anderen Plattformen musst du dich mit den anderen Canvas-Typen bzw. Grafik-APIs auseinander setzen.
Hier gilt zu klären, ob diese APIs Color Fonts unterstützen und wie man das erreicht.
Ich vermute, dass ist aber nur eine Fleiß- und Rechercheübung.
Delphi-Quellcode:
const
D2D1_DRAW_TEXT_OPTIONS_ENABLE_COLOR_FONT = $00000004; // die entscheidende Konstante
procedure TTextLayoutD2D.DoDrawLayout(const ACanvas: TCanvas);
var
Target: ID2D1RenderTarget;
DrawOptions: D2D1_DRAW_TEXT_OPTIONS;
Origin: D2D1_POINT_2F;
function IsSameColor: Boolean;
var
LColor: TD2D1ColorF;
begin
ID2D1SolidColorBrush(FBrush).GetColor(LColor);
Result := SameValue(LColor.r, TAlphaColorRec(Color).R / $FF, TEpsilon.Vector) and
SameValue(LColor.b, TAlphaColorRec(Color).B / $FF, TEpsilon.Vector) and
SameValue(LColor.g, TAlphaColorRec(Color).G / $FF, TEpsilon.Vector) and
SameValue(LColor.a, TAlphaColorRec(Color).A / $FF * Opacity, TEpsilon.Vector);
end;
begin
if (ACanvas = nil) or not(ACanvas is TCanvasD2D) or Text.IsEmpty or (FLayout = nil) then
Exit;
Target := TCanvasD2D(ACanvas).FTarget;
if ((FBrush = nil) or not SameValue(FBrush.GetOpacity, Opacity, TEpsilon.Vector) or not IsSameColor) then
begin
FBrush := nil;
Target.CreateSolidColorBrush(D2Color(Color, Opacity), nil, ID2D1SolidColorBrush(FBrush));
end;
if (FBrush <> nil) then
begin
Origin := D2Point(TopLeft.X + Padding.Left, TopLeft.Y + Padding.Top);
DrawOptions := D2D1_DRAW_TEXT_OPTIONS_CLIP or D2D1_DRAW_TEXT_OPTIONS_ENABLE_COLOR_FONT; // das Setzen der Konstante
Target.DrawTextLayout(Origin, FLayout, FBrush, DrawOptions); // Anwenden der Konstante in den Zeichen-Optionen
end;
end;