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

> 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.

### Zeichnen
Die Werkzeuge des Editors als Befehle – die Werkzeuge der Oberfläche rufen genau diese auf. Farb-, Pinsel- und Werkzeugoptionen, die du weglässt, kommen aus dem Bearbeitungskontext. Malen ignoriert Auswahl und Symmetrie, solange du nicht respectSelection = true und symmetry = app.getContext().symmetry übergibst.

#### `app.blur(layerId, frameId, points, opts?)` — ändert, rückgängig machbar, wird auf einer gesperrten Ebene abgelehnt
Weichzeichnet die Pixel unter dem Pinsel entlang der Punkte – genau das Weichzeichnen-Werkzeug der Oberfläche.

- `layerId` (string)
- `frameId` (string)
- `points` (table) — Liste von Punkten { x = n, y = n } (oder { n, n }); Lücken zwischen aufeinanderfolgenden Punkten werden wie bei einem echten Ziehen interpoliert.
- `opts` (table, optional) Akzeptiert außerdem **Malen-Optionen** und **Pinseloptionen** (siehe „Optionsgruppen“) sowie:
  - `strength` (integer 0–8; Standard context.blurStrength) — Weichzeichnerradius in Pixeln.

Gibt nichts zurück.

#### `app.dodgeBurn(layerId, frameId, points, opts?)` — ändert, rückgängig machbar, wird auf einer gesperrten Ebene abgelehnt
Hellt die Pixel unter dem Pinsel entlang der Punkte auf (Abwedeln) oder dunkelt sie ab (Nachbelichten), in OKLCH-Helligkeit – genau das Abwedeln/Nachbelichten-Werkzeug der Oberfläche. Farbton und Chroma bleiben erhalten, solange `hueShift` nicht gesetzt ist. Jedes Pixel ändert sich pro Aufruf nur einmal; transparente Pixel bleiben unberührt.

- `layerId` (string)
- `frameId` (string)
- `points` (table) — Liste von Punkten { x = n, y = n } (oder { n, n }); Lücken zwischen aufeinanderfolgenden Punkten werden wie bei einem echten Ziehen interpoliert.
- `opts` (table, optional) Akzeptiert außerdem **Malen-Optionen** und **Pinseloptionen** (siehe „Optionsgruppen“) sowie:
  - `strength` (integer 1–100; Standard context.dodgeBurnStrength) — Wie weit sich die OKLCH-Helligkeit jedes berührten Pixels verschiebt: 100 = die Hälfte von Schwarz bis Weiß, 25 = 0,125.
  - `hueShift` (integer 0–60; Standard context.dodgeBurnHueShift) — 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, wobei die Chroma pro Grad um 0,5 % verringert (Abwedeln) oder vertieft (Nachbelichten) wird. 0 behält Farbton und Chroma.
  - `burn` (boolean; Standard false) — Abdunkeln (Nachbelichten) statt aufhellen (Abwedeln).

Gibt nichts zurück.

#### `app.drawContour(layerId, frameId, points, opts?)` — ändert, rückgängig machbar, wird auf einer gesperrten Ebene abgelehnt
Füllt den geschlossenen Pfad durch die Punkte, die Pfadpixel eingeschlossen (die Kontur von Aseprite) – genau das Kontur-Werkzeug der Oberfläche.

- `layerId` (string)
- `frameId` (string)
- `points` (table) — Der Freihandpfad als Liste von Punkten { x = n, y = n }; er wird automatisch geschlossen und gefüllt.
- `opts` (table, optional) Akzeptiert außerdem **Malen-Optionen** und **Tintenoptionen** (siehe „Optionsgruppen“) sowie:
  - `color` (color ("#rgb", "#rrggbb[aa]" or { r, g, b, a }); Standard context.foregroundColor) — Die Malfarbe.

Gibt nichts zurück.

#### `app.drawCurve(layerId, frameId, anchors, opts?)` — ändert, rückgängig machbar, wird auf einer gesperrten Ebene abgelehnt
Zeichnet einen Pfad aus kubischen Bézierkurven durch die Ankerpunkte – genau das Kurven-Werkzeug der Oberfläche. Übergib closed = true für eine geschlossene Form (und fill = "filled", um sie zu füllen).

- `layerId` (string)
- `frameId` (string)
- `anchors` (table) — Die Ankerpunkte des Pfads der Reihe nach: { x = n, y = n } (oder { n, n }), jeweils optional mit Bézier-Griffen inX/inY (der Kontrollpunkt des ankommenden Segments) und outX/outY (des abgehenden). Ein Ankerpunkt ohne Griffe ist eine scharfe Ecke; zwei in Folge werden durch eine gerade Linie verbunden.
- `opts` (table, optional) Akzeptiert außerdem **Malen-Optionen** und **Tintenoptionen** (siehe „Optionsgruppen“) sowie:
  - `color` (color ("#rgb", "#rrggbb[aa]" or { r, g, b, a }); Standard context.foregroundColor) — Die Malfarbe.
  - `closed` (boolean; Standard false) — Verbindet den letzten Ankerpunkt wieder mit dem ersten.
  - `fill` (FillMode: "outline" | "filled"; Standard context.shapeFillMode) — Geschlossene Pfade: den Umriss zeichnen oder auch das Innere füllen.
  - `width` (integer 1–64; Standard context.lineWidth) — Strichstärke in Pixeln (1 = eine harte 1px-Kurve); breitere Striche bekommen runde Enden.
  - `pixelPerfect` (boolean; Standard context.curvePixelPerfect) — Entfernt die L-förmigen Ecken, die eine 1px-Kurve aufnimmt, für saubere Pixel-Art-Linien (bei breiteren Strichen ignoriert).

Gibt nichts zurück.

#### `app.drawEllipse(layerId, frameId, x0, y0, x1, y1, opts?)` — ändert, rückgängig machbar, wird auf einer gesperrten Ebene abgelehnt
Zeichnet eine Ellipse, die in das Rechteck zwischen den beiden Ecken einbeschrieben ist – genau das Ellipsen-Werkzeug der Oberfläche.

- `layerId` (string)
- `frameId` (string)
- `x0` (number) — Erste Ecke.
- `y0` (number)
- `x1` (number) — Gegenüberliegende Ecke (einschließlich).
- `y1` (number)
- `opts` (table, optional) Akzeptiert außerdem **Malen-Optionen** und **Tintenoptionen** (siehe „Optionsgruppen“) sowie:
  - `color` (color ("#rgb", "#rrggbb[aa]" or { r, g, b, a }); Standard context.foregroundColor) — Die Malfarbe.
  - `fill` (FillMode: "outline" | "filled"; Standard context.shapeFillMode) — Nur Umriss oder gefüllt.

Gibt nichts zurück.

#### `app.drawGradient(layerId, frameId, x0, y0, x1, y1, opts?)` — ändert, rückgängig machbar, wird auf einer gesperrten Ebene abgelehnt
Füllt die Region, die der Farbeimer ab (x0, y0) füllen würde – die zusammenhängende Fläche seiner Farbe (oder jedes passende Pixel, wenn nicht zusammenhängend), innerhalb der Auswahl – mit einem Verlauf von startColor bei (x0, y0) zu endColor bei (x1, y1) oder entlang von `stops` – genau das Farbverlauf-Werkzeug der Oberfläche. Bei Symmetrie erhalten die gespiegelten Regionen denselben Verlauf. Ein Ziehen der Länge null oder ein Start außerhalb der Leinwand oder der Auswahl bewirkt nichts.

- `layerId` (string)
- `frameId` (string)
- `x0` (number) — Verlaufsstart (wo startColor sitzt).
- `y0` (number)
- `x1` (number) — Verlaufsende (wo endColor sitzt).
- `y1` (number)
- `opts` (table, optional) Akzeptiert außerdem **Malen-Optionen** und **Tintenoptionen** (siehe „Optionsgruppen“) sowie:
  - `startColor` (color ("#rgb", "#rrggbb[aa]" or { r, g, b, a }); Standard context.foregroundColor) — Die Farbe am ersten Punkt.
  - `endColor` (color ("#rgb", "#rrggbb[aa]" or { r, g, b, a }); Standard context.backgroundColor) — Die Farbe am zweiten Punkt.
  - `stops` ({ color, color, ... } or { { color = c, position = 0-1 }, ... }; Standard When gradientColors is "stops" and neither startColor nor endColor is given, the gradientStops list.) — Eine Farbreihe mit mehreren Stopps aus 2-32 Farben vom ersten zum zweiten Punkt, statt startColor und endColor. Einfache Farben werden gleichmäßig verteilt; Positionen laufen der Reihe nach von 0-1, und zwei Stopps an einer Position ergeben eine harte Kante.
  - `gradientType` (GradientType: "linear" | "radial"; Standard context.gradientType) — Eine gerade Farbreihe zwischen den Punkten oder vom ersten ausstrahlend.
  - `dithering` (GradientDithering: "none" | "bayer2" | "bayer4" | "bayer8" | "dots" | "lines-h" | "lines-v" | "diagonal" | "noise"; Standard context.gradientDithering) — Geordnetes Dithering, auf die Farbreihe angewendet (none = weich).
  - `snap` (GradientSnap: "free" | "palette"; Standard context.gradientSnap) — Frei mischen oder nur Palettenfarben (das Dithering springt dann zwischen benachbarten Palettenfarben).
  - `contiguous` (boolean; Standard context.bucketFillMode (true für den zusammenhängenden Modus des Kontexts, false für global)) — Nur die zusammenhängende Region (true) oder jedes passende Pixel auf der Leinwand (false).
  - `tolerance` (integer 0–255; Standard context.bucketTolerance) — Der größte Farbunterschied pro Kanal, der noch als Treffer zählt.
  - `diagonal` (boolean; Standard context.bucketDiagonal) — Nur bei zusammenhängend: breitet sich auch auf diagonale Nachbarn aus (8er-Nachbarschaft), sodass die Region durch diagonale 1px-Linien sickert.
  - `stopAtGrid` (boolean; Standard context.bucketStopAtGrid) — Begrenzt die Region auf die Rasterzelle, in die der Klick fällt (die Zelle eines isometrischen Rasters ist die Raute, die es zeichnet, samt den Linienpixeln ihrer beiden oberen Kanten).
  - `closeGap` (integer 0–5; Standard context.bucketCloseGap) — Zusammenhängende Füllungen: Lücken im Umriss bis zu dieser Breite in Pixeln gelten als geschlossen, sodass die Füllung dort stoppt, statt auszulaufen. 0 = aus.

Gibt nichts zurück.

#### `app.drawHexagon(layerId, frameId, x0, y0, x1, y1, opts?)` — ändert, rückgängig machbar, wird auf einer gesperrten Ebene abgelehnt
Zeichnet ein Sechseck mit flacher Oberseite, das das Rechteck zwischen den beiden Ecken ausfüllt – genau das Sechseck-Werkzeug der Oberfläche.

- `layerId` (string)
- `frameId` (string)
- `x0` (number) — Erste Ecke.
- `y0` (number)
- `x1` (number) — Gegenüberliegende Ecke (einschließlich).
- `y1` (number)
- `opts` (table, optional) Akzeptiert außerdem **Malen-Optionen** und **Tintenoptionen** (siehe „Optionsgruppen“) sowie:
  - `color` (color ("#rgb", "#rrggbb[aa]" or { r, g, b, a }); Standard context.foregroundColor) — Die Malfarbe.
  - `fill` (FillMode: "outline" | "filled"; Standard context.shapeFillMode) — Nur Umriss oder gefüllt.

Gibt nichts zurück.

#### `app.drawIsoShape(layerId, frameId, x, y, width?, depth?, height?, opts?)` — ändert, rückgängig machbar, wird auf einer gesperrten Ebene abgelehnt
Zeichnet einen isometrischen Körper (box, ramp, stairs, pyramid, prism, cylinder, cone, sphere oder dome) in Pixel-Art-Projektion – genau das Iso-Form-Werkzeug der Oberfläche. Kanten sind saubere Treppen (2 px breit pro 1 px nach unten bei 2:1), Flächen werden mit den Farben oben / links / rechts gefüllt, Innenkanten trennen sie, und die Silhouette wird umrandet. Die hintere Ecke der Grundfläche sitzt bei (x, y); x läuft auf dem Bildschirm nach rechts unten und y nach links unten, und height hebt die Oberseite an. Die runden Körper (cylinder, cone, sphere, dome) nehmen width als Durchmesser und ignorieren depth; die sphere ignoriert auch height.

- `layerId` (string)
- `frameId` (string)
- `x` (number) — Anker: das äußerste linke Pixel der Kappe an der hinteren (oberen) Ecke der Grundfläche, auf dem Boden.
- `y` (number)
- `width` (number, optional) — Grundfläche entlang x (nach rechts unten), in Iso-Einheiten: Jede Einheit ist eine Zeile der 2:1-Kantentreppe. nil = isoWidth des Kontexts.
- `depth` (number, optional) — Grundfläche entlang y (nach links unten), in Iso-Einheiten. nil = isoDepth des Kontexts.
- `height` (number, optional) — Höhe in Pixeln (0 = eine flache Raute). nil = isoHeight des Kontexts.
- `opts` (table, optional) Akzeptiert außerdem **Malen-Optionen** und **Tintenoptionen** (siehe „Optionsgruppen“) sowie:
  - `color` (color ("#rgb", "#rrggbb[aa]" or { r, g, b, a }); Standard context.foregroundColor) — Die Basisfarbe: die Oberseite bei automatischer Schattierung.
  - `shape` (IsoShape: "box" | "ramp" | "stairs" | "pyramid" | "prism" | "cylinder" | "cone" | "sphere" | "dome"; Standard context.isoShape) — Welcher Körper gezeichnet wird.
  - `cap` (integer 2–4; Standard context.isoCap) — Der flache Pixelabschnitt an den oberen und unteren Eckpunkten: 2 (gerade Breiten), 3 (ungerade) oder 4 (Vielfache von vier). Verhältnisse über 2 haben eine breitere natürliche Kappe.
  - `bevel` (integer 0–1024; Standard context.isoBevel) — Nur box: fasst die vier oberen Kanten um diese Pixelzahl ab, eine 45-Grad-Schräge zwischen Oberseite und Seiten (0 = eckige Kanten). Begrenzt auf die Höhe und die Hälfte der Grundfläche.
  - `style` (IsoShapeStyle: "filled" | "outline" | "filled-outline"; Standard context.isoStyle) — Flächen, Umriss oder beides.
  - `hiddenEdges` (boolean; Standard context.isoHiddenEdges) — Zeichnet auch die Kanten hinter dem Körper, in der Farbe der Innenkanten (ein durchsichtiges Drahtgitter mit style outline).
  - `direction` (IsoDirection: "+x" | "-x" | "+y" | "-y"; Standard context.isoDirection) — Ramp und stairs: die Richtung, in der sie abfallen. Prism: die Richtung, in die eine Schräge zeigt (+x und -x ergeben dasselbe Dach). Von den anderen Formen ignoriert.
  - `ratio` (integer 1–8; Standard the sprite's isometric grid ratio (run / rise, rounded), else 2) — Pixel in der Breite pro Pixel nach unten entlang der Iso-Achsen.
  - `colors` ({ outline =, innerEdge =, top =, left =, right = } colors; Standard auto-shaded from color, or the context's isoColors when isoAutoShade is off) — Alle fünf Farben auf einmal (left ist die Fläche zu +y, nach links unten; right die Fläche zu +x). Überschreibt die automatische Schattierung.
  - `autoShade` (boolean; Standard context.isoAutoShade) — Leitet die Farben aus `color` ab: Oberseite = color, die Seiten ein und zwei Stufen dunkler entlang `ramp` (oder berechnet), Innenkanten noch dunkler, der Umriss am dunkelsten. false nutzt isoColors des Kontexts. Wird ignoriert, wenn colors angegeben ist.
  - `ramp` (a list of colors ("#rrggbb[aa]" or { r, g, b, a }); Standard context.shades) — Die Farbreihe, entlang der die automatische Schattierung läuft, wenn sie `color` enthält (das dunklere Ende wird über die Helligkeit gefunden). Sonst werden die Schattierungen berechnet und auf einem indizierten Sprite auf die Palette gerundet.

Gibt nichts zurück.

#### `app.drawLine(layerId, frameId, x0, y0, x1, y1, opts?)` — ändert, rückgängig machbar, wird auf einer gesperrten Ebene abgelehnt
Zeichnet eine gerade Linie zwischen den beiden Punkten – genau das Linien-Werkzeug der Oberfläche (width verdickt sie mit runden Enden).

- `layerId` (string)
- `frameId` (string)
- `x0` (number)
- `y0` (number)
- `x1` (number)
- `y1` (number)
- `opts` (table, optional) Akzeptiert außerdem **Malen-Optionen** und **Tintenoptionen** (siehe „Optionsgruppen“) sowie:
  - `color` (color ("#rgb", "#rrggbb[aa]" or { r, g, b, a }); Standard context.foregroundColor) — Die Malfarbe.
  - `width` (integer 1–64; Standard context.lineWidth) — Linienstärke in Pixeln (1 = eine harte 1px-Linie); breitere Linien bekommen runde Enden.

Gibt nichts zurück.

#### `app.drawPolygon(layerId, frameId, vertices, opts?)` — ändert, rückgängig machbar, wird auf einer gesperrten Ebene abgelehnt
Zeichnet ein geschlossenes Polygon durch die Eckpunkte – genau das Polygon-Werkzeug der Oberfläche.

- `layerId` (string)
- `frameId` (string)
- `vertices` (table) — Liste von Eckpunkten { x = n, y = n } (oder { n, n }), mindestens 2; das Polygon schließt sich automatisch zum ersten zurück.
- `opts` (table, optional) Akzeptiert außerdem **Malen-Optionen** und **Tintenoptionen** (siehe „Optionsgruppen“) sowie:
  - `color` (color ("#rgb", "#rrggbb[aa]" or { r, g, b, a }); Standard context.foregroundColor) — Die Malfarbe.
  - `fill` (FillMode: "outline" | "filled"; Standard context.shapeFillMode) — Nur Umriss oder gefüllt.

Gibt nichts zurück.

#### `app.drawRectangle(layerId, frameId, x0, y0, x1, y1, opts?)` — ändert, rückgängig machbar, wird auf einer gesperrten Ebene abgelehnt
Zeichnet ein achsenparalleles Rechteck zwischen den beiden Ecken – genau das Rechteck-Werkzeug der Oberfläche (radius rundet die Ecken, gemeinsam oder einzeln). Ignoriert die Auswahl, solange respectSelection nicht true ist.

- `layerId` (string)
- `frameId` (string)
- `x0` (number) — Erste Ecke.
- `y0` (number)
- `x1` (number) — Gegenüberliegende Ecke (einschließlich).
- `y1` (number)
- `opts` (table, optional) Akzeptiert außerdem **Malen-Optionen** und **Tintenoptionen** (siehe „Optionsgruppen“) sowie:
  - `color` (color ("#rgb", "#rrggbb[aa]" or { r, g, b, a }); Standard context.foregroundColor) — Die Malfarbe.
  - `fill` (FillMode: "outline" | "filled"; Standard context.shapeFillMode) — Nur Umriss oder gefüllt.
  - `radius` (an integer 0–1024 for every corner, or a list of four { topLeft, topRight, bottomRight, bottomLeft }; Standard context.cornerRadius) — Rundet die Ecken, in Pixeln (0 = eckig): ein Radius für alle vier oder einer pro Ecke, im Uhrzeigersinn von links oben. Jeder wird auf die Hälfte der kürzeren Seite begrenzt.

Gibt nichts zurück.

#### `app.drawStar(layerId, frameId, x0, y0, x1, y1, opts?)` — ändert, rückgängig machbar, wird auf einer gesperrten Ebene abgelehnt
Zeichnet einen 5-zackigen Stern (Spitze nach oben), dessen äußere Spitzen jede Seite des Rechtecks zwischen den beiden Ecken berühren – genau das Stern-Werkzeug der Oberfläche.

- `layerId` (string)
- `frameId` (string)
- `x0` (number) — Erste Ecke.
- `y0` (number)
- `x1` (number) — Gegenüberliegende Ecke (einschließlich).
- `y1` (number)
- `opts` (table, optional) Akzeptiert außerdem **Malen-Optionen** und **Tintenoptionen** (siehe „Optionsgruppen“) sowie:
  - `color` (color ("#rgb", "#rrggbb[aa]" or { r, g, b, a }); Standard context.foregroundColor) — Die Malfarbe.
  - `fill` (FillMode: "outline" | "filled"; Standard context.shapeFillMode) — Nur Umriss oder gefüllt.

Gibt nichts zurück.

#### `app.drawStroke(layerId, frameId, points, opts?)` — ändert, rückgängig machbar, wird auf einer gesperrten Ebene abgelehnt
Freihand-Pinselstrich durch die Punkte – genau der Stift der Oberfläche (oder, mit erase = true, der Radierer; mit dither der Dithering-Pinsel).

- `layerId` (string)
- `frameId` (string)
- `points` (table) — Liste von Punkten { x = n, y = n } (oder { n, n }); Lücken zwischen aufeinanderfolgenden Punkten werden wie bei einem echten Ziehen interpoliert.
- `opts` (table, optional) Akzeptiert außerdem **Malen-Optionen**, **Pinseloptionen** und **Tintenoptionen** (siehe „Optionsgruppen“) sowie:
  - `color` (color ("#rgb", "#rrggbb[aa]" or { r, g, b, a }); Standard context.foregroundColor) — Die Malfarbe.
  - `erase` (boolean; Standard false) — Radiert zu transparent, statt zu malen (der Radierer); `color` wird ignoriert.
  - `pixelPerfect` (boolean; Standard context.pixelPerfect) — Entfernt doppelte Eckschritte aus dem Strichpfad (bei jeder Pinselgröße).
  - `matchColor` (color ("#rgb", "#rrggbb[aa]" or { r, g, b, a }); Standard nil (every pixel)) — Malt (oder radiert) nur Pixel, die genau diese Farbe haben; die anderen bleiben unberührt. Mit color = Hintergrundfarbe und matchColor = Vordergrundfarbe ist das der Rechtsklick-Radierer von Aseprite.
  - `dither` ({ pattern = "bayer2" | "bayer4" | "bayer8" | "dots" | "lines-h" | "lines-v" | "diagonal" | "noise", density = 0-100 }; Standard nil (every pixel)) — Malt (oder radiert) nur die Pixel eines geordneten Musters bei einer Dichte in Prozent und lässt den Rest unberührt: der Dithering-Pinsel (50 mit bayer2 ist ein Schachbrett). Das Muster kachelt von der linken oberen Ecke des Sprites aus, sodass sich überlappende Striche ausgerichtet bleiben.
  - `dynamics` ({ stabilizer = 0-64, pressure = { size, angle, gradient (booleans), min, max (0-100) }, velocity = { same }, minSize, minAngle, maxAngle, dither, curve = 25-400 }; Standard built from the context's stabilizer, pressure*/velocity* and dynamics* fields; pass {} for a plain stroke) — Pinseldynamik: ein Stabilisator (gleitender Mittelwert der Punkte) und Druck- / Geschwindigkeitssensoren, die die Stempelgröße (von minSize bis zur Pinselgröße), den Winkel (minAngle bis maxAngle) und einen Farbverlauf von color zu endColor steuern (dither = true wählt pro Pixel das eine oder das andere; indizierte Sprites rasten auf die nächste Palettenfarbe ein). min/max sind der Sensorbereich in Prozent (min > max kehrt um); curve ist die Empfindlichkeit in Prozent (100 = linear). Mit pixelPerfect und wechselnder Größe werden Ellbogen weiterhin entlang des Mittelpfads entfernt. Eigene Pinsel erhalten nur den Stabilisator und den Farbverlauf.
  - `pressures` (list of numbers 0-1, one per point; Standard 1 (full pressure) for every point) — Stiftdruck pro Punkt, vom Drucksensor gelesen. Eine Maus hat keinen, daher zählt er als voll.
  - `velocities` (list of numbers >= 0, one per point; Standard 0 for every point) — Zeigergeschwindigkeit pro Punkt in Sprite-Pixeln pro Millisekunde (0.5 = das Maximum des Sensors), vom Geschwindigkeitssensor gelesen.
  - `endColor` (color ("#rgb", "#rrggbb[aa]" or { r, g, b, a }); Standard context.backgroundColor) — Die Endfarbe des Verlaufs, wenn ein Sensor den Verlauf steuert; `color` ist der Start.

Gibt nichts zurück.

#### `app.drawTriangle(layerId, frameId, x0, y0, x1, y1, opts?)` — ändert, rückgängig machbar, wird auf einer gesperrten Ebene abgelehnt
Zeichnet ein gleichschenkliges Dreieck (Spitze oben in der Mitte, Basis unten), das das Rechteck zwischen den beiden Ecken ausfüllt – genau das Dreieck-Werkzeug der Oberfläche.

- `layerId` (string)
- `frameId` (string)
- `x0` (number) — Erste Ecke.
- `y0` (number)
- `x1` (number) — Gegenüberliegende Ecke (einschließlich).
- `y1` (number)
- `opts` (table, optional) Akzeptiert außerdem **Malen-Optionen** und **Tintenoptionen** (siehe „Optionsgruppen“) sowie:
  - `color` (color ("#rgb", "#rrggbb[aa]" or { r, g, b, a }); Standard context.foregroundColor) — Die Malfarbe.
  - `fill` (FillMode: "outline" | "filled"; Standard context.shapeFillMode) — Nur Umriss oder gefüllt.

Gibt nichts zurück.

#### `app.floodFill(layerId, frameId, x, y, opts?)` — ändert, rückgängig machbar, wird auf einer gesperrten Ebene abgelehnt
Füllung mit dem Farbeimer ab (x, y) – genau das Farbeimer-Werkzeug der Oberfläche.

- `layerId` (string)
- `frameId` (string)
- `x` (number)
- `y` (number)
- `opts` (table, optional) Akzeptiert außerdem **Malen-Optionen** und **Tintenoptionen** (siehe „Optionsgruppen“) sowie:
  - `color` (color ("#rgb", "#rrggbb[aa]" or { r, g, b, a }); Standard context.foregroundColor) — Die Malfarbe.
  - `contiguous` (boolean; Standard context.bucketFillMode (true für den zusammenhängenden Modus des Kontexts, false für global)) — Nur die zusammenhängende Region (true) oder jedes passende Pixel auf der Leinwand (false).
  - `tolerance` (integer 0–255; Standard context.bucketTolerance) — Der größte Farbunterschied pro Kanal, der noch als Treffer zählt.
  - `diagonal` (boolean; Standard context.bucketDiagonal) — Nur bei zusammenhängend: breitet sich auch auf diagonale Nachbarn aus (8er-Nachbarschaft), sodass die Region durch diagonale 1px-Linien sickert.
  - `stopAtGrid` (boolean; Standard context.bucketStopAtGrid) — Begrenzt die Region auf die Rasterzelle, in die der Klick fällt (die Zelle eines isometrischen Rasters ist die Raute, die es zeichnet, samt den Linienpixeln ihrer beiden oberen Kanten).
  - `closeGap` (integer 0–5; Standard context.bucketCloseGap) — Zusammenhängende Füllungen: Lücken im Umriss bis zu dieser Breite in Pixeln gelten als geschlossen, sodass die Füllung dort stoppt, statt auszulaufen. 0 = aus.
  - `pattern` (FillPattern: "solid" | "checker" | "dither25" | "dither75" | "hstripes" | "vstripes" | "diagonal" | "grid" | "dots" | "bricks"; Standard context.bucketPattern) — Füllt mit einem sich wiederholenden Muster aus `color` und `patternColor`, von der linken oberen Ecke der Leinwand aus gekachelt. "solid" = nur `color`.
  - `patternColor` (color ("#rgb", "#rrggbb[aa]" or { r, g, b, a }); Standard context.backgroundColor) — Die zweite Farbe des Musters (ignoriert, wenn `pattern` "solid" ist).

Gibt nichts zurück.

#### `app.isoProject(layerId, frameId, projection, opts?)` — ändert, rückgängig machbar, wird auf einer gesperrten Ebene abgelehnt
Projiziert die ausgewählten Pixel (der Auswahlrahmen folgt) – oder das ganze Cel, wenn nichts ausgewählt ist – auf eine Fläche eines isometrischen Würfels: "left" und "right" scheren die Spalten entlang der Schräge, "floor" macht aus der Region die Oberseite (ein Quadrat wird zur Raute). Pixelgenau: Jede Kante wird eine saubere Treppe (2 breit pro 1 nach unten bei 2:1), und es werden keine Farben gemischt. Inhalt, der außerhalb der Leinwand und der Cel-Grenzen landet, wird abgeschnitten (die Hintergrundebene wird auf die Leinwand beschnitten).

- `layerId` (string)
- `frameId` (string)
- `projection` (IsoProjection: "left" | "right" | "floor")
- `opts` (table, optional)
  - `run` (integer 1–16; Standard The sprite's isometric grid ratio, or 2 (2:1) when the grid is rectangular.) — Pixel in der Breite pro `rise` Pixel nach unten (die Steigung, in niedrigsten Termen). Gib auch rise an.
  - `rise` (integer 1–16; Standard The sprite's isometric grid ratio, or 1 (2:1) when the grid is rectangular.) — Pixel nach unten pro `run` Pixel in der Breite. Gib auch run an.

Gibt nichts zurück.

#### `app.jumble(layerId, frameId, points, opts?)` — ändert, rückgängig machbar, wird auf einer gesperrten Ebene abgelehnt
Zufälliges Verwischen: vermischt Pixel unter dem Pinsel mit zufälligen Nachbarn entlang der Punkte – genau das Durchmischen-Werkzeug der Oberfläche.

- `layerId` (string)
- `frameId` (string)
- `points` (table) — Liste von Punkten { x = n, y = n } (oder { n, n }); Lücken zwischen aufeinanderfolgenden Punkten werden wie bei einem echten Ziehen interpoliert.
- `opts` (table, optional) Akzeptiert außerdem **Malen-Optionen** und **Pinseloptionen** (siehe „Optionsgruppen“) sowie:
  - `strength` (integer 0–100; Standard context.jumbleStrength) — Wahrscheinlichkeit in Prozent, dass jedes berührte Pixel vermischt wird. Ein 1px-Pinsel hat keine Nachbarn zum Vermischen, nimm also brushSize 2 oder mehr.
  - `seed` (integer 0–4294967295; Standard random) — Zufalls-Seed: derselbe Seed und dieselben Punkte ergeben dasselbe Ergebnis.

Gibt nichts zurück.

#### `app.movePixels(layerId, frameId, dx, dy)` — ändert, rückgängig machbar, wird auf einer gesperrten Ebene abgelehnt
Verschiebt die ausgewählten Pixel (gemäß der aktuellen Auswahl; der Auswahlrahmen folgt) – oder das ganze Cel, wenn nichts ausgewählt ist – um (dx, dy). Genau das Verschieben-Werkzeug der Oberfläche. Ohne Auswahl wandert das ganze Cel und behält alles, auch über den Leinwandrand hinaus; verschobene Auswahlpixel bleiben innerhalb von Leinwand und Cel-Grenzen und werden darüber hinaus abgeschnitten. Die Hintergrundebene wird auf die Leinwand beschnitten.

- `layerId` (string)
- `frameId` (string)
- `dx` (number) — Pixel, um die nach rechts verschoben wird (negativ = links).
- `dy` (number) — Pixel, um die nach unten verschoben wird (negativ = oben).

Gibt nichts zurück.

#### `app.outline(layerId, frameIds, opts?)` — ändert, rückgängig machbar, wird auf einer gesperrten Ebene abgelehnt
Filter > Umriss, wie in Aseprite: zeichnet einen Umriss um (oder knapp innerhalb) die Formen auf den Cels einer Ebene, als einen einzigen Rückgängig-Schritt. Ein Pixel gehört zu einer Form, sofern es nicht transparent ist (oder bgColor entspricht). Äußere Umrisse lassen das Cel wachsen, auf die Leinwand beschnitten. Nur Bildebenen.

- `layerId` (string)
- `frameIds` (table) — Array von Frame-IDs, deren Cels auf dieser Ebene umrandet werden (ein Frame für das aktive Cel, jeder Frame für alle).
- `opts` (table, optional)
  - `cels` (Array of { layerId = ..., frameId = ... }) — Umrandet diese Cels, über Ebenen und Frames hinweg, statt layerId/frameIds (übergib nil für beide).
  - `color` (color ("#rgb", "#rrggbb[aa]" or { r, g, b, a }); Standard context.foregroundColor) — Die Umrissfarbe. Auf einem indizierten Sprite rastet sie auf den nächsten Paletteneintrag ein, sofern colorIndex nicht angegeben ist.
  - `colorIndex` (integer 0–255; Standard Taken from color.) — Indizierte Sprites: der zu malende Palettenindex, unverändert verwendet. Nicht der transparente Index.
  - `place` (OutlinePlace: "outside" | "inside"; Standard "outside") — Umriss außerhalb der Form (sie wächst) oder innerhalb (ihre Randpixel werden neu gemalt).
  - `shape` (OutlineShape: "circle" | "square"; Standard "circle") — Preset für die Nachbarschaftsmatrix. Wird ignoriert, wenn matrix angegeben ist.
  - `matrix` (9 booleans, row-major 3x3 (top-left first): which neighbors count as touching. The center entry is ignored.) — Eine eigene Nachbarschaftsmatrix, wie das 3x3-Schalterraster von Aseprite.
  - `bgColor` (color ("#rgb", "#rrggbb[aa]" or { r, g, b, a }); Standard Only transparent pixels are background.) — Eine deckende Farbe, die neben vollständig transparenten Pixeln ebenfalls als Hintergrund zählt.
  - `bgIndex` (integer 0–255) — Indizierte Sprites: ein Palettenindex, der ebenfalls als Hintergrund zählt.
  - `respectSelection` (boolean; Standard false) — Übergib true, um nur innerhalb der aktuellen Auswahl zu umranden. Standardmäßig wird die Auswahl ignoriert.

Gibt nichts zurück.

#### `app.pastePixels(layerId, frameId, image, opts?)` — ändert, rückgängig machbar, wird auf einer gesperrten Ebene abgelehnt
Fügt ein Bild wie das schwebende Einfügen der Oberfläche in das Cel einer Ebene/eines Frames ein: Transparente Pixel lassen das Cel unberührt, teiltransparente werden darüber gemischt, und die eingefügten Pixel werden zur Auswahl. Die optionale Transformation verzerrt es (corners), skaliert, dreht und/oder neigt das Bild dann um seine Mitte (sofern nicht pivotX/pivotY angegeben sind) und verschiebt es danach um dx/dy. Braucht eine bearbeitbare (nicht gesperrte) Bildebene; eine Bewegungssperre gilt nicht. Was außerhalb der Leinwand und der Cel-Grenzen landet, wird abgeschnitten (die Hintergrundebene wird auf die Leinwand beschnitten).

- `layerId` (string)
- `frameId` (string)
- `image` (table) — { x, y, width, height, pixels } – pixels ist eine Liste von width*height Farben ("#rrggbb[aa]" oder { r, g, b, a }), Zeile für Zeile; x, y ist, wo das Pixel links oben landet.
- `opts` (table, optional)
  - `scaleX` (number -256–256; Standard 1) — Horizontale Skalierung um den Pivot; negativ spiegelt. Nicht 0.
  - `scaleY` (number -256–256; Standard 1) — Vertikale Skalierung um den Pivot; negativ spiegelt. Nicht 0.
  - `rotation` (number; Standard 0) — Grad im Uhrzeigersinn um den Pivot.
  - `skewX` (number -80–80; Standard 0) — Grad horizontaler Neigung (die Oberkante neigt sich in die eine Richtung, die Unterkante in die andere, um den Pivot).
  - `skewY` (number -80–80; Standard 0) — Grad vertikaler Neigung.
  - `dx` (number; Standard 0) — Pixel, um die nach dem Transformieren nach rechts verschoben wird.
  - `dy` (number; Standard 0) — Pixel, um die nach dem Transformieren nach unten verschoben wird.
  - `pivotX` (number; Standard The center of the selection (or of the cel when nothing is selected).) — X des Fixpunkts für Drehen/Skalieren/Neigen, in Leinwandpixeln.
  - `pivotY` (number; Standard The center of the selection (or of the cel when nothing is selected).) — Y des Fixpunkts für Drehen/Skalieren/Neigen, in Leinwandpixeln.
  - `interpolation` (TransformInterpolation: "nearest" | "rotsprite" | "bilinear"; Standard "nearest") — Wie Pixel neu abgetastet werden. Nimm rotsprite für saubere Drehungen von Pixel-Art, bilinear für weiche (gemischte) Ergebnisse.
  - `corners` ({ {x=,y=}, {x=,y=}, {x=,y=}, {x=,y=} }; Standard The region's own corners (no distortion).) — Freies Verzerren / Perspektive: wohin die Ecken der Region links oben, rechts oben, rechts unten und links unten fallen, in Leinwandpixeln (Bruchteile erlaubt), vor der obigen Skalierung/Neigung/Drehung/Verschiebung. Muss eine konvexe Form ergeben. Rückt man die beiden oberen Ecken enger zusammen als die unteren, entsteht eine bodenartige Perspektive.

Gibt nichts zurück.

#### `app.scatter(layerId, frameId, points, opts?)` — ändert, rückgängig machbar, wird auf einer gesperrten Ebene abgelehnt
Streu-Pinsel: stempelt den Pinsel entlang der Punkte, ein Schritt pro Pinselbreite, jeder Stempel um einen zufälligen Versatz verschoben – genau das Streuen-Werkzeug der Oberfläche.

- `layerId` (string)
- `frameId` (string)
- `points` (table) — Liste von Punkten { x = n, y = n } (oder { n, n }); Lücken zwischen aufeinanderfolgenden Punkten werden wie bei einem echten Ziehen interpoliert.
- `opts` (table, optional) Akzeptiert außerdem **Malen-Optionen**, **Pinseloptionen** und **Tintenoptionen** (siehe „Optionsgruppen“) sowie:
  - `color` (color ("#rgb", "#rrggbb[aa]" or { r, g, b, a }); Standard context.foregroundColor) — Die Malfarbe.
  - `offsetX` (integer 0–64; Standard context.scatterX) — Wie weit jeder Stempel links oder rechts vom Pfad landen kann, in Pixeln.
  - `offsetY` (integer 0–64; Standard context.scatterY) — Wie weit jeder Stempel über oder unter dem Pfad landen kann, in Pixeln.
  - `count` (integer 1–16; Standard context.scatterCount) — Stempel, die bei jedem Schritt entlang des Pfads gesetzt werden.
  - `seed` (integer 0–4294967295; Standard random) — Zufalls-Seed: derselbe Seed und dieselben Punkte ergeben dasselbe Ergebnis.

Gibt nichts zurück.

#### `app.spray(layerId, frameId, points, opts?)` — ändert, rückgängig machbar, wird auf einer gesperrten Ebene abgelehnt
Airbrush: streut zufällige Punkte um jeden Punkt – genau das Sprühen-Werkzeug der Oberfläche. Jeder Punkt ist ein Tick, wiederhole also einen Punkt, um an Ort und Stelle weiterzusprühen.

- `layerId` (string)
- `frameId` (string)
- `points` (table) — Liste von Punkten { x = n, y = n } (oder { n, n }); Lücken zwischen aufeinanderfolgenden Punkten werden wie bei einem echten Ziehen interpoliert.
- `opts` (table, optional) Akzeptiert außerdem **Malen-Optionen** und **Tintenoptionen** (siehe „Optionsgruppen“) sowie:
  - `color` (color ("#rgb", "#rrggbb[aa]" or { r, g, b, a }); Standard context.foregroundColor) — Die Malfarbe.
  - `radius` (integer 1–128; Standard twice the context's brushSize, at least 2) — Wie weit von jedem Punkt die Punkte streuen, in Pixeln.
  - `rate` (integer 1–64; Standard context.sprayRate) — Pro Punkt gestreute Punkte.
  - `seed` (integer 0–4294967295; Standard random) — Zufalls-Seed: derselbe Seed und dieselben Punkte ergeben dasselbe Ergebnis.

Gibt nichts zurück.

#### `app.strokeSelection(layerId, frameId, width, opts?)` — ändert, rückgängig machbar, wird auf einer gesperrten Ebene abgelehnt
Bearbeiten > Auswahl umranden: malt auf einem Cel eine Linie der angegebenen Breite entlang der Kante der aktuellen Auswahl (innen, zentriert oder außen), als einen einzigen Rückgängig-Schritt. Tut nichts, wenn nichts ausgewählt ist. Nur Bildebenen.

- `layerId` (string)
- `frameId` (string)
- `width` (number) — Pixel, 1 bis 256.
- `opts` (table, optional)
  - `position` (StrokePosition: "inside" | "center" | "outside"; Standard "center") — Wo der Strich relativ zur Kante der Auswahl sitzt.
  - `color` (color ("#rgb", "#rrggbb[aa]" or { r, g, b, a }); Standard context.foregroundColor) — Die Strichfarbe. Auf einem indizierten Sprite rastet sie auf den nächsten Paletteneintrag ein, sofern colorIndex nicht angegeben ist.
  - `colorIndex` (integer 0–255; Standard Taken from color.) — Indizierte Sprites: der zu malende Palettenindex, unverändert verwendet. Nicht der transparente Index.
  - `shape` (SelectionModifyShape: "circle" | "square"; Standard "circle") — Wie der Abstand zur Kante gemessen wird (runde oder eckige Ecken).

Gibt nichts zurück.

#### `app.transformPixels(layerId, frameId, opts?)` — ändert, rückgängig machbar, wird auf einer gesperrten Ebene abgelehnt
Skaliert, dreht, neigt und/oder verzerrt (Perspektive, über corners) die ausgewählten Pixel (der Auswahlrahmen folgt) – oder das ganze Cel, wenn nichts ausgewählt ist – um einen Pivot, genau wie die Transformationsgriffe des Verschieben-Werkzeugs der Oberfläche. Reihenfolge: skalieren, neigen, drehen, dann um dx/dy verschieben. Auf einem Sprite mit nicht quadratischen Pixeln (Sprite.pixelRatio) gelten Winkel und Skalierungen so, wie du sie auf dem Bildschirm siehst, sodass eine 90-Grad-Drehung auch wie eine aussieht. Ohne Auswahl behält das ganze Cel, was innerhalb des Rahmens aus Leinwand und Cel-Grenzen landet, sowohl dort, wo es ist, als auch um dx/dy verschoben (eine einfache Verschiebung verliert also nichts, auch über den Leinwandrand hinaus); transformierte Auswahlpixel bleiben innerhalb von Leinwand und Cel-Grenzen und werden darüber hinaus abgeschnitten. Die Hintergrundebene wird auf die Leinwand beschnitten. Eine wirkungslose Transformation ändert nichts.

- `layerId` (string)
- `frameId` (string)
- `opts` (table, optional)
  - `scaleX` (number -256–256; Standard 1) — Horizontale Skalierung um den Pivot; negativ spiegelt. Nicht 0.
  - `scaleY` (number -256–256; Standard 1) — Vertikale Skalierung um den Pivot; negativ spiegelt. Nicht 0.
  - `rotation` (number; Standard 0) — Grad im Uhrzeigersinn um den Pivot.
  - `skewX` (number -80–80; Standard 0) — Grad horizontaler Neigung (die Oberkante neigt sich in die eine Richtung, die Unterkante in die andere, um den Pivot).
  - `skewY` (number -80–80; Standard 0) — Grad vertikaler Neigung.
  - `dx` (number; Standard 0) — Pixel, um die nach dem Transformieren nach rechts verschoben wird.
  - `dy` (number; Standard 0) — Pixel, um die nach dem Transformieren nach unten verschoben wird.
  - `pivotX` (number; Standard The center of the selection (or of the cel when nothing is selected).) — X des Fixpunkts für Drehen/Skalieren/Neigen, in Leinwandpixeln.
  - `pivotY` (number; Standard The center of the selection (or of the cel when nothing is selected).) — Y des Fixpunkts für Drehen/Skalieren/Neigen, in Leinwandpixeln.
  - `interpolation` (TransformInterpolation: "nearest" | "rotsprite" | "bilinear"; Standard "nearest") — Wie Pixel neu abgetastet werden. Nimm rotsprite für saubere Drehungen von Pixel-Art, bilinear für weiche (gemischte) Ergebnisse.
  - `corners` ({ {x=,y=}, {x=,y=}, {x=,y=}, {x=,y=} }; Standard The region's own corners (no distortion).) — Freies Verzerren / Perspektive: wohin die Ecken der Region links oben, rechts oben, rechts unten und links unten fallen, in Leinwandpixeln (Bruchteile erlaubt), vor der obigen Skalierung/Neigung/Drehung/Verschiebung. Muss eine konvexe Form ergeben. Rückt man die beiden oberen Ecken enger zusammen als die unteren, entsteht eine bodenartige Perspektive.

Gibt nichts zurück.
