SVG mit Lyx

Die Lyx SVG-Bibliothek erzeugt SVG-Dateien direkt — kein externes Tool, keine Abhängigkeiten. 9 Sub-Units decken Grundformen, Pfade, Stile, Filter, Animationen, Text, Definitionen und Parsing ab.

Guides · std.svg Referenz

import std.svg.builder;    // Pflicht: Dokument-Lifecycle
import std.svg.elements;   // Grundformen
import std.svg.style;      // Farbe, Strich, Transformationen


Architektur

svg/builder   — SvgNew, SvgSave, SvgFree, SvgToString (Dokument-Lifecycle)
svg/elements  — rect, circle, ellipse, line, polyline, polygon, SvgApply, Gruppen
svg/path      — <path d="..."> Builder: M L H V C S Q T A Z
svg/style     — fill, stroke, opacity, dash, linecap/join, Transformationen
svg/text      — SvgText, SvgTextSpan, Schriftart, Anker
svg/image     — SvgImage (eingebettetes Bild oder Verweis)
svg/filter    — Blur, Drop-Shadow, Composite, ColorMatrix
svg/defs      — SvgDefsBegin/End, Gradienten, Muster, clipPath, Symbol
svg/anim      — SMIL-Animationen: SvgAnimate, SvgAnimateTransform, SvgAnimateMotion
svg/parser    — SVG-Datei einlesen und traversieren
svg/xml       — Low-Level XML-Ausgabe (intern)


Minimales Beispiel

import std.svg.builder;
import std.svg.elements;
import std.svg.style;

fn main(): int64 {
  // Dokument anlegen (400×300 px):
  var doc: int64 := SvgNew(400.0, 300.0);

  // Hintergrund:
  SvgSetFill(doc, "lightblue"c);
  SvgRect(doc, 0.0, 0.0, 400.0, 300.0);
  SvgApply(doc);

  // Roter Kreis:
  SvgSetFill(doc, "red"c);
  SvgSetStroke(doc, "darkred"c);
  SvgSetStrokeWidth(doc, 2.0);
  SvgCircle(doc, 200.0, 150.0, 60.0);
  SvgApply(doc);

  // Speichern:
  SvgSave(doc, "output.svg"c);
  SvgFree(doc);
  return 0;
}


Grundformen (svg/elements)

import std.svg.elements;

// Rechteck:
SvgRect(doc, x, y, width, height);

// Abgerundetes Rechteck:
SvgSetRounding(doc, rx, ry);    // vor SvgRoundRect setzen
SvgRoundRect(doc, x, y, w, h);

// Kreis:
SvgCircle(doc, cx, cy, radius);

// Ellipse:
SvgEllipse(doc, cx, cy, rx, ry);

// Linie:
SvgLine(doc, x1, y1, x2, y2);

// Polyline (Punkte als String "x1,y1 x2,y2 ..."):
SvgPolyline(doc, "10,20 30,40 50,20"c);

// Nach jeder Form: SvgApply() — überträgt Style und erzeugt das Element
SvgApply(doc);


Pfade (svg/path)

import std.svg.path;
import std.svg.style;

SvgSetFill(doc, "none"c);
SvgSetStroke(doc, "black"c);

SvgPathBegin(doc);
  SvgMoveTo(doc, 50.0, 100.0);
  SvgLineTo(doc, 150.0, 100.0);
  SvgLineTo(doc, 100.0, 50.0);
  SvgClosePath(doc);
SvgApply(doc);   // <path d="M50,100 L150,100 L100,50 Z" .../>

// Kubische Bézierkurve:
SvgPathBegin(doc);
  SvgMoveTo(doc, 10.0, 80.0);
  SvgCubicTo(doc, 40.0, 10.0, 65.0, 10.0, 95.0, 80.0);  // C
SvgApply(doc);


Stile (svg/style)

import std.svg.style;

// Füllung:
SvgSetFill(doc, "steelblue"c);          // Farb-String
SvgSetFillOpacity(doc, 0.8);            // 0.0–1.0
SvgSetFill(doc, "none"c);               // keine Füllung

// Kontur:
SvgSetStroke(doc, "#FF0000"c);          // Hex-Farbe
SvgSetStrokeWidth(doc, 3.0);
SvgSetStrokeOpacity(doc, 0.5);

// Linienenden und -verbindungen:
SvgSetLineCap(doc, SVG_CAP_ROUND);      // butt | round | square
SvgSetLineJoin(doc, SVG_JOIN_MITER);    // miter | round | bevel

// Gestrichelte Linie:
SvgSetDashArray(doc, "5,3"c);           // "5px Strich, 3px Pause"
SvgSetDashOffset(doc, 0.0);

// Transformation:
SvgTranslate(doc, 100.0, 50.0);
SvgRotate(doc, 45.0);
SvgScale(doc, 2.0, 2.0);
SvgResetTransform(doc);


Text (svg/text)

import std.svg.text;
import std.svg.style;

SvgSetFill(doc, "black"c);
SvgTextSet(doc, "Arial"c, 16.0);         // Schriftart + Größe
SvgText(doc, 50.0, 50.0, "Hallo Lyx"c);
SvgApply(doc);

// Mehrzeiliger Text mit TSpan:
SvgTextBegin(doc, 20.0, 30.0);
  SvgTextSpan(doc, "Zeile 1"c);
  SvgTextSpan(doc, "Zeile 2"c);
SvgTextEnd(doc);
SvgApply(doc);


Gruppen und Layer

import std.svg.elements;

// Gruppe mit ID:
SvgGroupBegin(doc, "layer1"c);
  SvgCircle(doc, 100.0, 100.0, 30.0);
  SvgApply(doc);
  SvgRect(doc, 50.0, 50.0, 40.0, 40.0);
  SvgApply(doc);
SvgGroupEnd(doc);


Animationen (svg/anim)

import std.svg.anim;

// Farb-Animation (fill von rot nach blau, 2 Sekunden):
SvgSetFill(doc, "red"c);
var elem: int64 := SvgCircle(doc, 200.0, 150.0, 50.0);
SvgApply(doc);
SvgAnimate(doc, elem, "fill"c, "red"c, "blue"c, 2.0);

// Rotation (0° → 360°, endlos):
SvgAnimRepeat(doc, 0);   // 0 = indefinite
SvgAnimateTransform(doc, elem, SVG_AT_ROTATE, "0 200 150"c, "360 200 150"c, 3.0);

Transform-Typ Konstante
Verschiebung SVG_AT_TRANSLATE
Skalierung SVG_AT_SCALE
Rotation SVG_AT_ROTATE
Scherung X SVG_AT_SKEWX
Scherung Y SVG_AT_SKEWY

Filter (svg/filter)

import std.svg.filter;

// Unschärfe auf Rechteck:
SvgFilterBegin(doc, "blur1"c);
  SvgFilterBlur(doc, 3.0);
SvgFilterEnd(doc);

SvgSetFilter(doc, "blur1"c);
SvgRect(doc, 50.0, 50.0, 200.0, 100.0);
SvgApply(doc);

// Drop-Shadow:
SvgFilterBegin(doc, "shadow"c);
  SvgFilterDropShadow(doc, 4.0, 4.0, 2.0);
SvgFilterEnd(doc);


Dokument-Ausgabe

import std.svg.builder;

// In Datei speichern:
SvgSave(doc, "chart.svg"c);

// Als String holen (z. B. für HTTP-Response):
var svgStr: pchar := SvgToString(doc);
// ... svgStr verwenden ...

// Pretty-Print aktivieren (Zeilenumbrüche + Einrückung):
SvgSetPrettyPrint(doc, 1);

// ViewBox setzen:
SvgSetViewBox(doc, 0.0, 0.0, 800.0, 600.0);

// Aufräumen:
SvgFree(doc);

Letzte Aktualisierung: 2026-06-08