Einzelnen Beitrag anzeigen

TiGü

Registriert seit: 6. Apr 2011
Ort: Berlin
3.070 Beiträge
 
Delphi 10.4 Sydney
 
#18

AW: Emoticon-Icon-Sammlung gesucht

  Alt 19. Jul 2018, 10:31
@ 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;
Angehängte Dateien
Dateityp: zip PatchDirect2DCanvasTest_2018-07-19_10-23-50.zip (26,6 KB, 7x aufgerufen)
  Mit Zitat antworten Zitat