AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Projekte RedeemerSVG.TSVGImage - Kleine SVG-Unit für Delphi mit GDI
Thema durchsuchen
Ansicht
Themen-Optionen

RedeemerSVG.TSVGImage - Kleine SVG-Unit für Delphi mit GDI

Ein Thema von Redeemer · begonnen am 23. Aug 2017 · letzter Beitrag vom 30. Okt 2018
Antwort Antwort
TiGü

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

AW: RedeemerSVG.TSVGImage - Kleine SVG-Unit für Delphi mit GDI

  Alt 1. Nov 2017, 12:12
Der Context muss kopiert werden. In den Handle-Methoden werden Stile geladen, die nur den aktuellen Context (und Unteraufrufe) betreffen und danach wieder rückgängig gemacht werden müssen.
Kannst du das etwas ausführen? So sehr stehe ich im SVG parsen und verarbeiten ja nicht drin.

Könnte man - jetzt mal nur so theoretisch ins Blaue philosophiert - nicht einfach für jeden Style und/oder Figur (Text, Rect, Circle...) sich den passenden Context vorhalten?
Oder wie muss man sich die Zusammenhänge vorstellen?
Wenn der Context der in HandleTag übergeben wird und für die einzelnen verschiedenen CurrentTags eh verschieden ist, wäre ein Dictionary mit TSVGContext als class (4 Byte versus 184 Byte) nicht eine Überlegung wert?
  Mit Zitat antworten Zitat
Redeemer

Registriert seit: 19. Jan 2009
Ort: Kirchlinteln (LK Verden)
1.119 Beiträge
 
Delphi 2009 Professional
 
#2

AW: RedeemerSVG.TSVGImage - Kleine SVG-Unit für Delphi mit GDI

  Alt 1. Nov 2017, 12:42
HTML-Code:
<svg width="28" height="28">
  <g fill="yellow" stroke="black">
    <rect fill="red" x="3" y="3" width="10" height="10" />
    <g fill="blue">
      <rect fill="green" x="15" y="3" width="10" height="10" />
      <rect x="3" y="15" width="10" height="10" />
    </g>
    <rect x="15" y="15" width="10" height="10" />
  </g>
</svg>
(Ergibt das bunte Windows-Logo.)

Die Standardfüllung von SVG ist schwarz. Die erste Gruppe (g) setzt die Füllung für alle Kindelemente auf gelb und die Kontur auf schwarz. Das erste Rechteck setzt die Füllung auf rot, behält aber die Kontur bei. Nachdem das Rechteck gezeichnet ist, müssen alle Eigenschaften zurückgesetzt werden, die das Rechteck gesetzt hat. Die zweite Gruppe (g) setzt die Füllung für alle Kindelemente auf blau und behält die Kontur bei. Das erste Rechteck setzt die Füllung auf rot, behält aber die Kontur bei. Nachdem das Rechteck gezeichnet ist, müssen alle Eigenschaften zurückgesetzt werden, die das Rechteck gesetzt hat. Das dritte Rechteck (zweites der zweiten Gruppe) wird nun mit der Füllung der Gruppe gezeichnet. Diese wird allerdings sofort danach ebenfalls zurückgesetzt auf die Farbe Gelb der Elterngruppe. Diese wird für das letzte Rechteck benötigt. Nach dem Ende der Gruppe ist die Füllung wieder zurück auf Standard, also schwarz.

Der Kontext muss deshalb natürlich auf dem Stapel abgelegt werden. Soweit ich den Vortrag auf den Delphi-Tagen dieses Jahr richtig verstanden habe, wird da von Delphi optimiert, damit keine Dinge kopiert werden, die man nicht schreibt.
Janni
2005 PE, 2009 PA, XE2 PA
  Mit Zitat antworten Zitat
TiGü

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

AW: RedeemerSVG.TSVGImage - Kleine SVG-Unit für Delphi mit GDI

  Alt 1. Nov 2017, 13:20
Verstehe...hm hm hm.
Man könnte so ein Recall-Ansatz versuchen und TSVGContext zur Klasse machen.

http://docwiki.embarcadero.com/Libra...hRecall.Create

Ob das ständige erzeugen und freigeben der Context-Recall-Klasse aber dann weniger zeitintensiv ist als das Kopieren des records...wer weiß?!
  Mit Zitat antworten Zitat
Redeemer

Registriert seit: 19. Jan 2009
Ort: Kirchlinteln (LK Verden)
1.119 Beiträge
 
Delphi 2009 Professional
 
#4

AW: RedeemerSVG.TSVGImage - Kleine SVG-Unit für Delphi mit GDI

  Alt 1. Nov 2017, 13:59
Wieso sollte ich etwas in TRecall speichern, was ich exakt ein einziges Mal verwende?
Janni
2005 PE, 2009 PA, XE2 PA
  Mit Zitat antworten Zitat
TiGü

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

AW: RedeemerSVG.TSVGImage - Kleine SVG-Unit für Delphi mit GDI

  Alt 1. Nov 2017, 14:24
Recall würde die Werte der Klasseninstanz von TSVGContext (wenn es dann eine Klasse wird) wieder zurück schreiben, wenn sie in ReadStyle geändert wurden.
Ähnlich wie dem Verwerfen der Änderung auf der lokalen Record-Kopie.
Ob das dann am Ende schneller ist als mit record muss natürlich geprüft werden, dass kann ich so auch nicht sehen.
  Mit Zitat antworten Zitat
TiGü

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

AW: RedeemerSVG.TSVGImage - Kleine SVG-Unit für Delphi mit GDI

  Alt 4. Jun 2018, 14:38
Übrigens an der Stelle nochmal Respekt an Redeemer. Ich hatte spaßeshalber mal versucht die DX-Header auf ID2D1DeviceContext5 (https://msdn.microsoft.com/en-us/lib...(v=vs.85).aspx) anzuheben, um die Methoden CreateSvgDocument und DrawSvgDocument zur Verfügung zu haben.
Damit wird zwar die Karte vom Landshut.svg gezeichnet, aber die Texte fehlen. So ganz fertig ist die Microsoft-Implementierung also nicht.
  Mit Zitat antworten Zitat
berens

Registriert seit: 3. Sep 2004
441 Beiträge
 
Delphi 10.4 Sydney
 
#7

AW: RedeemerSVG.TSVGImage - Kleine SVG-Unit für Delphi mit GDI

  Alt 7. Jun 2018, 15:10
Ich probiere gerade die Komponente aus.

Mir ist mit einer .svg-Datei passiert, dass die Angaben in "mm" waren. Entsprechender Fehler korrigiert:

Delphi-Quellcode:
unit RedeemerSVGHelpers;
// Zeile 93
if EndsText('px', temp) then
  Delete(temp, Length(temp) - 1, 2) // Standardeinheit, ignorieren
else if EndsText('pt', temp) then
Unterstützung für "mm" hinzugefügt. Schaut normal aus.
Delphi-Quellcode:
unit RedeemerSVGHelpers;
// Zeile 93
if EndsText('px', temp) then
  Delete(temp, Length(temp) - 1, 2) // Standardeinheit, ignorieren
else if EndsText('mm', temp) then
  Delete(temp, Length(temp) - 1, 2) // Standardeinheit, ignorieren
else
  if EndsText('pt', temp) then

Evtl. sollte die Prozedur so angepasst werden, dass der Text ist "temp" so bereinigt wird, dass wirklich nur Zahlen 0-9, "." und "," drin stehen dürfen, falls andere Einheiten hiermit immer noch nicht abgedeckt sind? Zumindest Incscape bietet neben "mm" noch "pc", "in" und "cm" an...
Delphi-Quellcode:
  // Zeile 113
  Value := ReadFloat(temp) * Factor;
Frage 1
Ein tatsächliches Problem was ich habe: Die andere Datei (siehe Anhang) wird nur hier nur als schwarzes Rechteck angezeigt, lässt sich in anderen Programmen aber ganz normal öffnen...

Frage 2
Delphi-Quellcode:
  SVG := TSVGImage.Create;
  SVG.LoadFromFile('c:\temp\svg.svg');
  SVG.SetSize(1000,900);
  Image1.Picture.Assign(SVG);
Das Bild wird leider nur ganz klein oben links dargestellt (ca. 32x32 px), des Rest des Bildes (1000x900 px) ist schwarz? Wie vergrößert man die SVG Graphik korrekt? Ich habe keine Ahnung wie ich das Callback-Event
type TSizeCallbackEvent = procedure (const Viewport: TRealRect; var Dimensions: TRealPoint) of object; innerhalb einer Prozedur (bzw. überhaupt) verwenden soll, hier fehlt mir komplett sowohl Grundlagenwissen wie Beispiel...
Angehängte Dateien
Dateityp: zip 01d.zip (1.005 Bytes, 7x aufgerufen)
Delphi 10.4 32-Bit auf Windows 10 Pro 64-Bit, ehem. Delphi 2010 32-Bit auf Windows 10 Pro 64-Bit

Geändert von berens ( 7. Jun 2018 um 15:27 Uhr)
  Mit Zitat antworten Zitat
Antwort Antwort


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 08:54 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