std.svg
SVG-Bibliothek für Lyx: Vektorgrafiken programmatisch erzeugen, stilisieren und als .svg-Datei speichern. Die Bibliothek deckt den gesamten SVG 1.1-Standard ab — von einfachen Grundformen über Pfade, Texte und Farbverläufe bis hin zu SMIL-Animationen und Filtern. Optionaler Parser zum Einlesen und Traversieren vorhandener SVG-Dateien.
Architektur
Übersicht der internen Schichten und Abhängigkeiten:
┌──────────────────────────────────────────────────────────┐
│ std.svg (Public API) │
├────────────────────────┬─────────────────────────────────┤
│ Inhalt │ Infrastruktur │
│ elements · path │ builder · xml │
│ text · defs │ │
│ filter · image │ │
│ anim │ │
├────────────────────────┴─────────────────────────────────┤
│ Querschnitt: style │
├──────────────────────────────────────────────────────────┤
│ Lesen: parser │
└──────────────────────────────────────────────────────────┘
Minimales Beispiel
Die Bibliothek arbeitet zustandsbehaftet: Stil setzen, Form zeichnen, mit SvgApply abschließen. Style-Strings gibt es nicht.
import std.io;
import std.svg.builder;
import std.svg.elements;
import std.svg.style;
import std.svg.text;
fn main(): int64 {
var doc: int64 := SvgNew(800.0, 600.0);
SvgSetPrettyPrint(doc, 1);
SvgSetFillHex(doc, "blue");
SvgSetStroke(doc, 0.0, 0.0, 0.5);
SvgSetStrokeWidth(doc, 2.0);
SvgCircle(doc, 400.0, 300.0, 100.0);
SvgApply(doc);
SvgSetFillHex(doc, "white");
SvgSetFont(doc, "DejaVu Sans", 24.0);
SvgSetTextAnchor(doc, SVG_ANCHOR_MIDDLE);
SvgTextAt(doc, 400.0, 300.0, "Hallo SVG");
SvgApply(doc);
var rc: int64 := SvgSave(doc, "ausgabe.svg");
PrintLn(IntToStr(rc)); // 0 = geschrieben
SvgFree(doc);
return 0;
}
0
Die erzeugte Datei:
<?xml version="1.0" encoding="UTF-8"?>
<svg xmlns="http://www.w3.org/2000/svg" width="800" height="600">
<circle cx="400" cy="300" r="100" fill="blue" stroke="#000080" stroke-width="2"/>
<text x="400" y="300" font-family="DejaVu Sans" font-size="24" text-anchor="middle" fill="white">Hallo SVG</text>
</svg>
Units
| Unit | Beschreibung |
|---|---|
| std.svg.builder | Dokumentlebenszyklus: SvgNew, SvgSave, SvgFree, Viewport |
| std.svg.xml | XML-Schreiber: Puffer, Zahlenformatierung, Dokumentstruktur |
| std.svg.style | Fill, Stroke, Opacity, Transforms, Dash-Muster |
| std.svg.elements | Grundformen: rect, circle, ellipse, line, polyline, polygon |
| std.svg.path | Pfad-Builder: moveto, lineto, Bezier-Kurven, Bögen |
| std.svg.text | Text: SvgTextAt, tspan, Text auf Pfad, Font-Styling |
| std.svg.defs | Definitionen: Farbverläufe, Muster, Symbole, Marker, Clips |
| std.svg.filter | Filter: Unschärfe, Schatten, Graustufen, feComposite |
| std.svg.image | Bilder: JPEG/PNG einbetten, Base64, RGB→PNG |
| std.svg.anim | SMIL-Animation: animate, animateTransform, Keyframes |
| std.svg.parser | SVG-Reader: SvgOpen, DOM-Traversierung, Attribut-Zugriff |
Hauptfunktionen
| Signatur | Sichtbarkeit | Beschreibung |
|---|---|---|
SvgNew(width: f64, height: f64): int64 | pub | Dokument anlegen; ein eigener Svg-Typ existiert nicht |
SvgNewViewBox(width: f64, height: f64, vbX: f64, vbY: f64, vbW: f64, vbH: f64): int64 | pub | Dokument mit viewBox |
SvgSetPrettyPrint(doc: int64, enabled: int64): void | pub | Einrückung an/aus |
SvgSave(doc: int64, path: pchar): int64 | pub | In eine Datei schreiben; 0 bei Erfolg |
SvgToString(doc: int64): pchar | pub | Dokument als Zeichenkette |
SvgFree(doc: int64): void | pub | Speicher freigeben |
SvgNewViewBoxgibt es inzwischen (#1246 behoben): Die Hülle ruftSvgNewund danachSvgSetViewBox. Beide Wege sind mitlyxc 1.1.3Inachgemessen.
Letzte Aktualisierung: 2026-08-19 — Einstiegsbeispiel und Funktionstabelle gegen die echten Signaturen berichtigt (kein Style-String, kein Svg-Typ, SvgSave mit Rückgabewert, SvgNewViewBox vorhanden). Beispiel mit lyxc 1.1.3I übersetzt, ausgeführt und die erzeugte Datei übernommen.
Vorherige Aktualisierung: 2026-08-10
