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) schreibt x=„0./“ y=„0./“ — negative Gleitkommazahlen werden in der ganzen Unit falsch ausgegeben (#1686). Bis zur Behebung mit 0.0 beginnen oder den fertigen SvgDropShadow nehmen, 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.