====== std.pdf.shading ======
PDF-Verlaufsfüllungen (Shading, WP-PDF-22): Axiale (lineare) und radiale Gradienten direkt im PDF-Content-Stream über ''Type 2''- bzw. ''Type 3''-Shading-Dictionaries. Koordinaten und Farben werden als kompakte ''int64''-Packwerte übergeben.
→ [[lyx_-_programmiersprache:units:pdf:builder|std.pdf.builder]] · [[lyx_-_programmiersprache:units:pdf:graphics|std.pdf.graphics]] · [[lyx_-_programmiersprache:units|Standard Library]]
----
===== Packing-Funktionen =====
Koordinaten und Farben werden als gepackte ''int64''-Werte übergeben, um das 6-Argument-Limit von Lyx einzuhalten.
==== PdfPackColor ====
pub fn PdfPackColor(r100: int64, g100: int64, b100: int64): int64
Packt RGB-Komponenten (je ×100, Bereich 0–10 000 entspricht 0 %–100 %) in ein ''int64'':
r100 << 48 | g100 << 32 | b100 << 16
^ Beispiel ^ Farbe ^
| ''PdfPackColor(10000, 0, 0)'' | Reines Rot |
| ''PdfPackColor(0, 0, 10000)'' | Reines Blau |
| ''PdfPackColor(5000, 5000, 5000)'' | Mittelgrau |
| ''PdfPackColor(10000, 10000, 10000)'' | Weiß |
| ''PdfPackColor(0, 0, 0)'' | Schwarz |
==== PdfPackCoords ====
pub fn PdfPackCoords(x100: int64, y100: int64): int64
Packt zwei Koordinaten (je ×100, d. h. 100 entspricht 1,00 Punkt) in ein ''int64'':
x100 << 32 | (y100 & 0xFFFFFFFF)
Wird für Start-/Endpunkte bei ''PdfLinearGradient'' und Mittelpunkt/Radien bei ''PdfRadialGradient'' verwendet.
----
===== Gradient-Funktionen =====
==== PdfLinearGradient ====
pub fn PdfLinearGradient(doc: int64, page: int64, p0: int64, p1: int64, c0: int64, c1: int64): void
Füllt den aktuellen Clipping-Bereich mit einem axialen Verlauf von ''c0'' an ''p0'' bis ''c1'' an ''p1''.
^ Parameter ^ Typ ^ Beschreibung ^
| ''p0'' | ''PdfPackCoords(x100, y100)'' | Startpunkt des Verlaufs |
| ''p1'' | ''PdfPackCoords(x100, y100)'' | Endpunkt des Verlaufs |
| ''c0'' | ''PdfPackColor(r100, g100, b100)'' | Farbe am Startpunkt |
| ''c1'' | ''PdfPackColor(r100, g100, b100)'' | Farbe am Endpunkt |
Der Gradient füllt die gesamte Seite, sofern kein Clipping gesetzt ist. Für einen begrenzten Bereich ''PdfSaveState'' → ''PdfClip'' → ''PdfLinearGradient'' → ''PdfRestoreState'' verwenden.
==== PdfRadialGradient ====
pub fn PdfRadialGradient(doc: int64, page: int64, center: int64, radii: int64, c0: int64, c1: int64): void
Füllt mit einem radialen Verlauf (konzentrische Kreise) von ''c0'' am inneren Kreis bis ''c1'' am äußeren Kreis. Beide Kreise teilen denselben Mittelpunkt.
^ Parameter ^ Typ ^ Beschreibung ^
| ''center'' | ''PdfPackCoords(cx100, cy100)'' | Gemeinsamer Mittelpunkt |
| ''radii'' | ''PdfPackCoords(r0_100, r1_100)'' | Innenradius (''r0'') und Außenradius (''r1'') |
| ''c0'' | ''PdfPackColor(r100, g100, b100)'' | Farbe am Innenkreis |
| ''c1'' | ''PdfPackColor(r100, g100, b100)'' | Farbe am Außenkreis |
----
===== Verwendung =====
==== Horizontaler Farbverlauf ====
import std.pdf.shading;
fn HorizontalGradient(doc: int64, page: int64): void {
// Verlauf von links (Blau) nach rechts (Rot), volle Seitenbreite A4
var p0 := PdfPackCoords(0, 84200); // links, Mitte Y = 421 pt
var p1 := PdfPackCoords(59500, 84200); // rechts (595 pt)
var c0 := PdfPackColor(0, 0, 10000); // Blau
var c1 := PdfPackColor(10000, 0, 0); // Rot
PdfLinearGradient(doc, page, p0, p1, c0, c1);
}
==== Diagonaler Verlauf mit Clipping ====
import std.pdf.shading;
import std.pdf.graphics;
fn ClippedGradient(doc: int64, page: int64): void {
PdfSaveState(doc, page);
// Rechteck als Clipping setzen (in ×100-Einheiten)
PdfRect(doc, page, 5000.0, 60000.0, 20000.0, 10000.0);
PdfClip(doc, page);
var p0 := PdfPackCoords(5000, 70000);
var p1 := PdfPackCoords(25000, 60000);
var c0 := PdfPackColor(10000, 10000, 0); // Gelb
var c1 := PdfPackColor(0, 10000, 0); // Grün
PdfLinearGradient(doc, page, p0, p1, c0, c1);
PdfRestoreState(doc, page);
}
==== Radialer Sonnen-Effekt ====
import std.pdf.shading;
fn SunEffect(doc: int64, page: int64): void {
var cx := 29750; var cy := 42100; // Seitenmitte A4 (×100)
var center := PdfPackCoords(cx, cy);
var radii := PdfPackCoords(0, 15000); // innen r=0, außen r=150 pt
var cInner := PdfPackColor(10000, 10000, 0); // Gelb
var cOuter := PdfPackColor(10000, 0, 0); // Rot
PdfRadialGradient(doc, page, center, radii, cInner, cOuter);
}
----
===== Hinweise =====
* Koordinaten sind in **×100-Einheiten**: 100 entspricht 1,00 PDF-Punkt. A4-Breite = 59 500, A4-Höhe = 84 200.
* Farben sind in **×100-Einheiten**: 10 000 entspricht 100 %. RGB-Bereich: 0–10 000 pro Kanal.
* Ein Gradient ohne vorheriges Clipping füllt die gesamte Seite — immer ''PdfSaveState''/''PdfRestoreState'' um den Aufruf legen, wenn nur ein Teilbereich gefüllt werden soll.
* Jeder ''PdfLinearGradient''- oder ''PdfRadialGradient''-Aufruf erzeugt ein neues Shading-Objekt im PDF; mehrere Aufrufe auf derselben Seite sind möglich.
----
===== Verwandte Units =====
* ''[[lyx_-_programmiersprache:units:pdf:graphics|std.pdf.graphics]]'' — Pfade, Clipping, Farben (PdfSaveState, PdfClip …)
* ''[[lyx_-_programmiersprache:units:pdf:spot|std.pdf.spot]]'' — Spot-Farben (Separation Color Space)
* ''[[lyx_-_programmiersprache:units:pdf:builder|std.pdf.builder]]'' — Dokumenterstellung
Letzte Aktualisierung: 2026-06-05