std.svg.filter
Filtereffekte: Weichzeichnung, Schlagschatten, Graustufen, Sepia, Invertierung, Helligkeit/Kontrast — dazu eigene Filter aus einzelnen Primitiven und Masken.
Die fertigen Effekte (SvgBlur, SvgDropShadow, …) schreiben eine vollständige Filterdefinition nach <defs> und liefern deren Nummer zurück. Zugewiesen wird sie mit SvgSetFilter(doc, fltId) aus std.svg.elements, bevor die Form gezeichnet und mit SvgApply abgeschlossen wird.
→ std.svg · std.svg.defs · std.svg.elements
Verwendung
import std.io;
import std.svg.builder;
import std.svg.elements;
import std.svg.style;
import std.svg.filter;
fn main(): int64 {
var doc: int64 := SvgNew(400.0, 300.0);
SvgSetPrettyPrint(doc, 1);
var blur: int64 := SvgBlur(doc, 4.0);
SvgSetFillHex(doc, "blue");
SvgSetFilter(doc, blur);
SvgRect(doc, 50.0, 50.0, 200.0, 100.0);
SvgApply(doc);
var shadow: int64 := SvgDropShadow(doc, 4.0, 4.0, 3.0, 0.6);
SvgSetFillHex(doc, "gray");
SvgSetFilter(doc, shadow);
SvgCircle(doc, 320.0, 100.0, 40.0);
SvgApply(doc);
// Eigener Filter aus Primitiven — flt ist die Nummer der Definition
var flt: int64 := SvgFilterBegin(doc, "meinFilter", 0.0, 0.0, 1.2, 1.2);
SvgFeGaussianBlur(doc, flt, "SourceGraphic", 2.0, 2.0);
SvgFeColorMatrix(doc, flt, "SourceGraphic", SVG_CM_SATURATE, 3.0);
SvgFeComposite(doc, flt, "SourceGraphic", "SourceGraphic", SVG_COMP_IN);
SvgFilterEnd(doc);
Print(SvgToString(doc)); Print("\n");
SvgFree(doc);
return 0;
}
<?xml version="1.0" encoding="UTF-8"?>
<svg xmlns="http://www.w3.org/2000/svg" width="400" height="300">
<defs>
<filter id="flt0">
<feGaussianBlur stdDeviation="4"/>
</filter>
<filter id="flt1" x="-20%" y="-20%" width="140%" height="140%">
<feGaussianBlur in="SourceAlpha" stdDeviation="3" result="blur"/>
<feOffset dx="4" dy="4" result="shadow"/>
<feFlood flood-color="#000000" flood-opacity="0.6" result="color"/>
<feComposite in="color" in2="shadow" operator="in" result="shadow2"/>
<feMerge>
<feMergeNode in="shadow2"/>
<feMergeNode in="SourceGraphic"/>
</feMerge>
</filter>
<filter id="flt2" x="0" y="0" width="1.2" height="1.2">
<feGaussianBlur in="SourceGraphic" stdDeviation="2 2"/>
<feColorMatrix type="saturate" values="3"/>
<feComposite in="SourceGraphic" in2="SourceGraphic" operator="in"/>
</filter>
</defs>
<rect x="50" y="50" width="200" height="100" fill="blue" filter="url(#flt0)"/>
<circle cx="320" cy="100" r="40" fill="gray" filter="url(#flt1)"/>
</svg>
SvgDropShadow nimmt keine Farbe — der Schatten ist schwarz mit der angegebenen Deckkraft.
Negative Werte im Filterbereich nicht verwenden.SvgFilterBegin(doc, „f“, -0.1, -0.1, 1.2, 1.2)schreibtx=„0./“ y=„0./“— negative Gleitkommazahlen werden in der ganzen Unit falsch ausgegeben (#1686). Bis zur Behebung mit0.0beginnen oder den fertigenSvgDropShadownehmen, der seinen Bereich selbst in Prozent schreibt.
Konstanten
| Name | Wert | Verwendung |
|---|---|---|
SVG_COMP_OVER / SVG_COMP_IN / SVG_COMP_OUT / SVG_COMP_ATOP / SVG_COMP_XOR | 0–4 | SvgFeComposite |
SVG_CM_MATRIX / SVG_CM_SATURATE / SVG_CM_HUE_ROTATE / SVG_CM_LUM_ALPHA | 0–3 | SvgFeColorMatrix |
Funktionen
| Signatur | Sichtbarkeit | Beschreibung |
|---|---|---|
SvgBlur(doc: int64, stdDeviation: f64): int64 | pub | Weichzeichner, liefert die Filternummer |
SvgDropShadow(doc: int64, dx: f64, dy: f64, blur: f64, opacity: f64): int64 | pub | Schwarzer Schlagschatten |
SvgGrayscale(doc: int64): int64 | pub | Graustufen |
SvgSepia(doc: int64): int64 | pub | Sepia |
SvgInvert(doc: int64): int64 | pub | Invertierung |
SvgBrightnessContrast(doc: int64, brightness: f64, contrast: f64): int64 | pub | Helligkeit und Kontrast |
SvgFilterBegin(doc: int64, id: pchar, x: f64, y: f64, w: f64, h: f64): int64 | pub | Eigenen Filter beginnen |
SvgFilterEnd(doc: int64): void | pub | Eigenen Filter schließen |
SvgFeGaussianBlur(doc: int64, flt: int64, src: pchar, stdX: f64, stdY: f64): void | pub | Primitiv feGaussianBlur |
SvgFeOffset(doc: int64, flt: int64, src: pchar, dx: f64, dy: f64): void | pub | Primitiv feOffset |
SvgFeComposite(doc: int64, flt: int64, in1: pchar, in2: pchar, op: int64): void | pub | Primitiv feComposite, Operation über SVG_COMP_* |
SvgFeColorMatrix(doc: int64, flt: int64, src: pchar, cmType: int64, val: f64): void | pub | Primitiv feColorMatrix, Typ über SVG_CM_* |
SvgMaskBegin(doc: int64, id: pchar): int64 | pub | Maske beginnen |
SvgMaskEnd(doc: int64): void | pub | Maske schließen |
Masken haben dieselbe Einschränkung wie Symbole und Clip-Pfade: zwischen SvgMaskBegin und SvgMaskEnd gezeichnete Formen landen im Rumpf statt in der Definition (#1685).
Letzte Aktualisierung: 2026-08-19 — Seite gegen die echten Signaturen neu geschrieben: die Effekte heißen SvgBlur/SvgDropShadow/SvgGrayscale (ohne Filter-Präfix und ohne id), liefern eine Nummer und werden über SvgSetFilter zugewiesen; die Primitive nehmen die Filternummer und Konstanten statt Zeichenketten. Beispiel mit lyxc 1.1.3I übersetzt und ausgeführt, Ausgabe übernommen.
