AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Emoticon-Icon-Sammlung gesucht

Ein Thema von Harry Stahl · begonnen am 17. Jul 2018 · letzter Beitrag vom 23. Jul 2018
 
TiGü

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

AW: Emoticon-Icon-Sammlung gesucht

  Alt 19. Jul 2018, 09: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
 


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 01:10 Uhr.
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz