# Lua-Skript-API von pxstud.io — Bearbeitungskontext

> Teil der Lua-Skript-Referenz von pxstud.io, deren Übersicht (https://pxstud.io/de/docs/scripting.md) die Konventionen erklärt. Die Optionsgruppen und Typen, auf die sie verweist, stehen in https://pxstud.io/de/docs/scripting/option-groups.md und https://pxstud.io/de/docs/scripting/types.md. Alles in einer Datei (auf Englisch): https://pxstud.io/llms-full.txt. Das Verzeichnis der ganzen Website (auf Englisch): https://pxstud.io/llms.txt.

### Bearbeitungskontext
Die aktuellen Farben, der Pinsel, die Symmetrie und die Werkzeugoptionen – geteilt mit der Werkzeugleiste des Editors. Zeichenbefehle nutzen sie für Farben, Pinsel und Werkzeugoptionen, die ihnen nicht übergeben werden; die Symmetrie ist nur eine Information und wird nur angewendet, wenn du sie übergibst.

#### `app.getContext()` — liest
Der Bearbeitungskontext – die Einstellungen, die Zeichenbefehle für Farben, Pinsel und Werkzeugoptionen verwenden, die du nicht übergibst, geteilt mit der Werkzeugleiste der Oberfläche. symmetry ist der Symmetrie-Schalter der Werkzeugleiste, hier lesbar, aber NICHT implizit auf Befehle angewendet – übergib symmetry = app.getContext().symmetry an einen Zeichenbefehl, um ihm zu folgen. Felder: { foregroundColor, backgroundColor, brushSize, brushShape, brushAngle, customBrush, pixelPerfect, eraserRightClick, ink, shades, stabilizer, pressureSize, pressureAngle, pressureGradient, pressureMin, pressureMax, velocitySize, velocityAngle, velocityGradient, velocityMin, velocityMax, dynamicsMinSize, dynamicsMinAngle, dynamicsMaxAngle, dynamicsDither, dynamicsCurve, symmetry, symmetryX, symmetryY, tilemapMode, shapeFillMode, cornerRadius, selectionCornerRadius, cornerRadiusLinked, lineWidth, curvePixelPerfect, bucketFillMode, bucketTolerance, bucketCloseGap, bucketDiagonal, bucketStopAtGrid, bucketPattern, wandFillMode, wandTolerance, wandDiagonal, wandStopAtGrid, sprayRate, scatterX, scatterY, scatterCount, blurStrength, jumbleStrength, dodgeBurnStrength, dodgeBurnHueShift, ditherPattern, ditherDensity, gradientType, gradientDithering, gradientSnap, gradientColors, gradientStops, eyedropperSource, tileIndex, tileFlipH, tileFlipV, tileRotate90, tilePlace, isoShape, isoWidth, isoDepth, isoHeight, isoBevel, isoCap, isoStyle, isoHiddenEdges, isoDirection, isoAutoShade, isoColors }. Farben sind { r, g, b, a }-Tabellen; symmetry ist ein Array von Achsen; customBrush ist { width, height, mask (flache 0/1-Liste) } oder nil. Ändere ihn mit app.setContext.

Gibt zurück (table): Kontext-Tabelle.

#### `app.setContext(props)` — ändert
Ändert den Bearbeitungskontext – die aktuellen Farben, den Pinsel, die Symmetrie, den Tilemap-Modus und die Werkzeugoptionen. Zeichenbefehle nutzen sie für Optionen, die ihnen nicht übergeben werden, außer der Symmetrie, die nur für die Oberfläche gespeichert wird (und über app.getContext lesbar ist) und nie auf einen Befehl angewendet wird, wenn du sie nicht übergibst. Mit der Oberfläche geteilt: Die Werkzeugleiste zeigt die Änderung, und sie bleibt nach dem Ende des Skripts bestehen. Keine rückgängig zu machende Bearbeitung.

- `props` (table) — Weggelassene Schlüssel bleiben unverändert.
  - `foregroundColor` (color ("#rgb", "#rrggbb[aa]" or { r, g, b, a })) — Die Malfarbe: das `color` jedes Zeichenbefehls und die Startfarbe des Verlaufs.
  - `backgroundColor` (color ("#rgb", "#rrggbb[aa]" or { r, g, b, a })) — Die Zweitfarbe: die Endfarbe des Verlaufs und das, was swapColors tauscht.
  - `brushSize` (integer 1–64) — Pinselgröße in Pixeln für die eingebauten Formen (von einem eigenen Pinsel ignoriert). Setzt auch den Spray-Radius (2x die Größe).
  - `brushShape` (BrushShape: "circle" | "square" | "line" | "diamond" | "cross" | "x" | "star" | "horizontal" | "custom") — "line" ist eine 1-px-Linie, geneigt um `brushAngle`; "square" wird dadurch gedreht; "circle", "diamond", "cross", "x" und "star" ignorieren ihn; "horizontal" ist eine Linie bei Winkel 0, die ihn ignoriert; "custom" malt `customBrush`.
  - `brushAngle` (integer 0–180) — Pinselwinkel in Grad (0-180): neigt den Pinsel "line" und dreht den Pinsel "square". Von anderen Formen ignoriert.
  - `customBrush` ({ width, height, mask } with mask a flat list of 0/1, or false to clear) — Die Maske, die ein eigener Pinsel malt: { rows = { ".#.", "###", ".#." } } oder { width, height, mask } mit mask als flacher 0/1-Liste. Wird normalerweise mit app.useBrush(name) für einen mit app.defineBrush definierten Pinsel gesetzt. Ohne Maske malt ein eigener Pinsel einen 1-px-Punkt.
  - `pixelPerfect` (boolean) — Entfernt doppelte Eckschritte aus Freihandstrichen (bei jeder Pinselgröße); der Pinsel wird entlang des korrigierten Pfads gestempelt.
  - `eraserRightClick` (EraserRightClick: "background" | "replace") — Rechte Taste des Radierers: "background" malt überall, wo er berührt, die Hintergrundfarbe, "replace" macht nur Pixel in der Vordergrundfarbe zur Hintergrundfarbe (Aseprite).
  - `ink` (Ink: "copy" | "simple" | "lock-alpha" | "shading") — Wie sich Farbe (Striche, Spray, Formen, Linien, Polygon, Kontur, Farbeimer, Verlauf, fillSelection) mit vorhandenen Pixeln verbindet: "copy" ersetzt sie (der Standard), "simple" mischt per Alpha-Compositing, "lock-alpha" färbt nur sichtbare Pixel um, "shading" schaltet Pixel entlang `shades` weiter.
  - `shades` (a list of colors ("#rrggbb[aa]" or { r, g, b, a }), in order) — Die Farbreihe, entlang der die Tinte shading der Reihe nach weiterschaltet: das Feld Abstufungen des Editors (oder der ausgewählte Palettenbereich). Zeichenbefehle nutzen sie, wenn ink shading ist.
  - `stabilizer` (integer 0–64) — Stärke des Stabilisators für Freihandstriche: Jeder Punkt wird mit den vorherigen N Punkten gemittelt, was Wackeln glättet (der Strich hinkt dem Cursor hinterher). 0 = aus.
  - `pressureSize` (boolean) — Lässt den Stiftdruck (eine Maus zählt als voller Druck) die Pinselgröße steuern, von dynamicsMinSize bis brushSize.
  - `pressureAngle` (boolean) — Lässt den Stiftdruck (eine Maus zählt als voller Druck) den Pinselwinkel steuern, von dynamicsMinAngle bis dynamicsMaxAngle.
  - `pressureGradient` (boolean) — Lässt den Stiftdruck (eine Maus zählt als voller Druck) die Farbe entlang des Strichs von foregroundColor zu backgroundColor überblenden.
  - `pressureMin` (integer 0–100) — Messwert (in Prozent) des Drucksensors, der dem unteren Ende zugeordnet wird. Größer als pressureMax kehrt die Zuordnung um.
  - `pressureMax` (integer 0–100) — Messwert (in Prozent) des Drucksensors, der dem oberen Ende zugeordnet wird.
  - `velocitySize` (boolean) — Lässt die Zeigergeschwindigkeit die Pinselgröße steuern, von dynamicsMinSize bis brushSize.
  - `velocityAngle` (boolean) — Lässt die Zeigergeschwindigkeit den Pinselwinkel steuern, von dynamicsMinAngle bis dynamicsMaxAngle.
  - `velocityGradient` (boolean) — Lässt die Zeigergeschwindigkeit die Farbe entlang des Strichs von foregroundColor zu backgroundColor überblenden.
  - `velocityMin` (integer 0–100) — Messwert (in Prozent) des Geschwindigkeitssensors, der dem unteren Ende zugeordnet wird. Größer als velocityMax kehrt die Zuordnung um.
  - `velocityMax` (integer 0–100) — Messwert (in Prozent) des Geschwindigkeitssensors, der dem oberen Ende zugeordnet wird.
  - `dynamicsMinSize` (integer 1–64) — Pinselgröße am unteren Ende eines Sensors, der der Größe zugeordnet ist (das obere Ende ist brushSize).
  - `dynamicsMinAngle` (integer 0–180) — Pinselwinkel am unteren Ende eines Sensors, der dem Winkel zugeordnet ist.
  - `dynamicsMaxAngle` (integer 0–180) — Pinselwinkel am oberen Ende eines Sensors, der dem Winkel zugeordnet ist.
  - `dynamicsDither` (boolean) — Verlaufsdynamik wählt pro Pixel foregroundColor oder backgroundColor (geordnetes Dithering), statt zu überblenden. Bei indizierten Sprites rasten Mischungen auf die nächste Palettenfarbe ein.
  - `dynamicsCurve` (integer 25–400) — Empfindlichkeitskurve in Prozent: Der Sensorwert wird mit curve/100 potenziert (100 = linear, über 100 braucht es mehr Druck/Geschwindigkeit, damit er wirkt).
  - `symmetry` (Liste von SymmetryAxis: "horizontal" | "vertical" | "diagonal" | "antidiagonal") — Die Symmetrieeinstellung des aktiven Sprites (jeder Sprite behält seine eigene, wie die Lage seiner Achse): Spiegelachsen durch die Symmetriemitte. Nur lesbare Information – Zeichenbefehle wenden sie nicht an, wenn du nicht symmetry = app.getContext().symmetry übergibst. Leer = aus; mehrere Achsen kombinieren sich (horizontal + vertikal = vierfach).
  - `symmetryX` (a number (multiple of 0.5), or false to re-center) — Wo die vertikale Symmetrieachse (und der Punkt, an dem sich beide Diagonalen kreuzen) liegt: Pixel vom linken Rand der Leinwand, ein Vielfaches von 0,5 (ganzzahlig = zwischen Pixeln, x,5 = durch die Mitte eines Pixels). nil = zentriert. Wie symmetry nur lesbare Information: Übergib symmetryX = app.getContext().symmetryX an einen Zeichenbefehl, um ihr zu folgen. Setz false, um neu zu zentrieren.
  - `symmetryY` (a number (multiple of 0.5), or false to re-center) — Wo die horizontale Symmetrieachse (und der Kreuzungspunkt der Diagonalen) liegt: Pixel vom oberen Rand der Leinwand, ein Vielfaches von 0,5. nil = zentriert. Setz false, um neu zu zentrieren.
  - `tilemapMode` (TilemapEditMode: "tiles" | "pixels-edit" | "pixels-auto") — Wie Pixelfarbe eine Tilemap-Ebene behandelt: "pixels-auto" gibt jeder bemalten Zelle ein eigenes Tile, "pixels-edit" bearbeitet das gemeinsame Tile an Ort und Stelle (jede Platzierung wird aktualisiert), "tiles" erlaubt nur das Stempeln ganzer Tiles.
  - `shapeFillMode` (FillMode: "outline" | "filled") — Rechtecke, Ellipsen, Polygone und geschlossene Kurven: Umriss oder gefüllt.
  - `cornerRadius` (an integer 0–1024 for every corner, or a list of four { topLeft, topRight, bottomRight, bottomLeft }) — Rechteck: Eckenradien in Pixeln, im Uhrzeigersinn von links oben (0 = eine eckige Ecke), jeweils auf die Hälfte der kleineren Seite begrenzt.
  - `selectionCornerRadius` (an integer 0–1024 for every corner, or a list of four { topLeft, topRight, bottomRight, bottomLeft }) — Rechteckauswahl: Eckenradien in Pixeln, im Uhrzeigersinn von links oben (0 = eine eckige Ecke).
  - `cornerRadiusLinked` (boolean) — Die Optionsleiste des Werkzeugs bearbeitet alle vier Eckenradien gemeinsam (ein Feld Radius) statt eines Felds pro Ecke.
  - `lineWidth` (integer 1–64) — Linien- und Kurvenwerkzeug: Stärke in Pixeln (1 = eine harte 1-px-Linie); breitere Linien bekommen runde Enden.
  - `curvePixelPerfect` (boolean) — Kurvenwerkzeug: entfernt die L-förmigen Ecken, die eine 1-px-Kurve bekommt, für saubere Pixel-Art-Linien.
  - `bucketFillMode` (BucketFillMode: "contiguous" | "global") — Füllen: nur der zusammenhängende Bereich oder jedes passende Pixel.
  - `bucketTolerance` (integer 0–255) — Füllen: der größte Unterschied pro Kanal, der noch als dieselbe Farbe gilt.
  - `bucketCloseGap` (integer 0–5) — Farbeimer (zusammenhängend): behandelt Lücken in der Umrisslinie bis zu dieser Breite in Pixeln als geschlossen, sodass die Füllung nicht hindurchläuft. 0 = aus.
  - `bucketDiagonal` (boolean) — Füllen (zusammenhängend): breitet sich auch auf diagonale Nachbarn aus (8er-Nachbarschaft), sodass der Bereich durch 1px-Diagonallinien durchläuft.
  - `bucketStopAtGrid` (boolean) — Füllen: begrenzt den Bereich auf die Rasterzelle, in die der Klick fällt.
  - `bucketPattern` (FillPattern: "solid" | "checker" | "dither25" | "dither75" | "hstripes" | "vstripes" | "diagonal" | "grid" | "dots" | "bricks") — Farbeimer: malt ein sich wiederholendes zweifarbiges Muster (die Füllfarbe und die andere von Vordergrund/Hintergrund) statt einer einfarbigen Fläche. "solid" = kein Muster.
  - `wandFillMode` (BucketFillMode: "contiguous" | "global") — Zauberstab: nur der zusammenhängende Bereich oder jedes passende Pixel. Getrennt von bucketFillMode des Füllens.
  - `wandTolerance` (integer 0–255) — Zauberstab: der größte Unterschied pro Kanal, der noch als dieselbe Farbe gilt. Getrennt von bucketTolerance des Füllens.
  - `wandDiagonal` (boolean) — Zauberstab (zusammenhängend): breitet sich auch auf diagonale Nachbarn aus (8er-Nachbarschaft), sodass der Bereich durch 1px-Diagonallinien durchläuft.
  - `wandStopAtGrid` (boolean) — Zauberstab: begrenzt den Bereich auf die Rasterzelle, in die der Klick fällt.
  - `sprayRate` (integer 1–64) — Spray: Punkte pro Punkt des Strichs.
  - `scatterX` (integer 0–64) — Streuen: wie weit jeder Stempel links oder rechts vom Pfad landen kann, in Pixeln.
  - `scatterY` (integer 0–64) — Streuen: wie weit jeder Stempel über oder unter dem Pfad landen kann, in Pixeln.
  - `scatterCount` (integer 1–16) — Streuen: Stempel, die bei jedem Schritt entlang des Pfads gesetzt werden.
  - `blurStrength` (integer 1–4) — Weichzeichnen: Radius der Nachbarschaft in Pixeln.
  - `jumbleStrength` (integer 0–100) — Jumble: Wahrscheinlichkeit in Prozent, dass jedes berührte Pixel durcheinandergewürfelt wird.
  - `dodgeBurnStrength` (integer 1–100) — Abwedeln/Nachbelichten: wie weit sich die OKLCH-Helligkeit jedes berührten Pixels verschiebt (100 = die Hälfte von Schwarz bis Weiß).
  - `dodgeBurnHueShift` (integer 0–60) — Abwedeln/Nachbelichten: Grad, um die sich der OKLCH-Farbton jedes berührten Pixels zu warmem Gelb (Abwedeln) oder kühlem Blau (Nachbelichten) dreht, nie darüber hinaus; 0 behält den Farbton.
  - `ditherPattern` (DitherPattern: "bayer2" | "bayer4" | "bayer8" | "dots" | "lines-h" | "lines-v" | "diagonal" | "noise") — Dither-Pinsel: das geordnete Muster, durch das er malt. Muster kacheln von der linken oberen Ecke des Sprites aus, sodass Striche zueinander passen.
  - `ditherDensity` (integer 0–100) — Dither-Pinsel: der Anteil der Musterpixel, die er malt, in Prozent (50 mit bayer2 ist ein Schachbrett).
  - `gradientType` (GradientType: "linear" | "radial") — Verlauf: ein gerader Übergang zwischen den Punkten oder strahlenförmig vom Startpunkt aus.
  - `gradientDithering` (GradientDithering: "none" | "bayer2" | "bayer4" | "bayer8" | "dots" | "lines-h" | "lines-v" | "diagonal" | "noise") — Verlauf: das geordnete Dithering-Muster (none = ein glatter Übergang).
  - `gradientSnap` (GradientSnap: "free" | "palette") — Verlauf: freie Mischungen oder nur Palettenfarben (jedes Pixel die nächste Palettenfarbe; Dithering stuft zwischen benachbarten Palettenfarben ab).
  - `gradientColors` (GradientColors: "fg-bg" | "stops") — Verlauf: von der Vordergrund- zur Hintergrundfarbe oder entlang gradientStops ("stops"; bei weniger als zwei Stopps gilt wieder Vordergrund zu Hintergrund).
  - `gradientStops` (a list of { color, position } (position 0-1, in order), or a list of colors spread evenly) — Verlauf: der mehrstufige Übergang vom Startpunkt aus, als Einträge { color, position } (position 0-1, in Reihenfolge; zwei an derselben Position ergeben eine harte Kante). Eine einfache Farbliste wird gleichmäßig verteilt. Wird verwendet, wenn gradientColors "stops" ist; die Stopp-Leiste des Editors bearbeitet ihn.
  - `eyedropperSource` (EyedropperSource: "composite" | "layer") — Pipette: nimmt auf, was die Leinwand zeigt, oder nur die aktive Ebene.
  - `tileIndex` (integer ≥ 0) — Tile-Stempel: das zu platzierende Tile, 1-basiert (0 = das leere Tile).
  - `tileFlipH` (boolean) — Tile-Stempel: spiegelt platzierte Tiles horizontal.
  - `tileFlipV` (boolean) — Tile-Stempel: spiegelt platzierte Tiles vertikal.
  - `tileRotate90` (boolean) — Tile-Stempel: dreht platzierte Tiles um 90° im Uhrzeigersinn.
  - `tilePlace` (boolean) — Tiles platzieren: Auf einer Tilemap-Ebene platzieren Stift, Radierer, Linien- und Formwerkzeuge und Farbeimer das Tile des Tile-Stempels (beim Radierer: löschen es) auf den Zellen, die sie abdecken, statt Pixel zu malen.
  - `isoShape` (IsoShape: "box" | "ramp" | "stairs" | "pyramid" | "prism" | "cylinder" | "cone" | "sphere" | "dome") — Werkzeug Iso-Form: der Körper, den es zeichnet.
  - `isoWidth` (integer 1–1024) — Werkzeug Iso-Form: Grundfläche entlang x (nach rechts unten), in Iso-Einheiten (jeweils eine Zeile der Kantentreppe).
  - `isoDepth` (integer 1–1024) — Werkzeug Iso-Form: Grundfläche entlang y (nach links unten), in Iso-Einheiten.
  - `isoHeight` (integer 0–1024) — Werkzeug Iso-Form: Höhe in Pixeln (0 = flach).
  - `isoBevel` (integer 0–1024) — Werkzeug Iso-Form: nur bei Quadern, um wie viele Pixel die oberen Kanten abgeschrägt werden (0 = eckig).
  - `isoCap` (integer 2–4) — Werkzeug Iso-Form: der flache Abschnitt an den oberen und unteren Eckpunkten, 2 (gerade), 3 (ungerade) oder 4 (Vielfache von vier). Auch der Ziehschritt von W / D (2 Einheiten bei cap 4).
  - `isoStyle` (IsoShapeStyle: "filled" | "outline" | "filled-outline") — Werkzeug Iso-Form: Flächen, Umriss oder beides.
  - `isoHiddenEdges` (boolean) — Werkzeug Iso-Form: zeichnet auch die Kanten hinter dem Körper.
  - `isoDirection` (IsoDirection: "+x" | "-x" | "+y" | "-y") — Werkzeug Iso-Form: in welche Richtung eine Rampe oder Treppe abfällt oder die Schrägen eines Prismas zeigen.
  - `isoAutoShade` (boolean) — Werkzeug Iso-Form: leitet die fünf Farben entlang `shades` aus der Vordergrundfarbe ab (true) oder verwendet isoColors (false).
  - `isoColors` (a list of colors ("#rrggbb[aa]" or { r, g, b, a }), in order) — Werkzeug Iso-Form: die Farben, die verwendet werden, wenn isoAutoShade aus ist, in der Reihenfolge Umriss, Innenkante, oben, links, rechts.

Gibt nichts zurück.

#### `app.swapColors()` — ändert
Tauscht Vordergrund- und Hintergrundfarbe (das X der Oberfläche).

Gibt nichts zurück.
