# API de scripting Lua de pxstud.io — Documento

> Parte de la referencia de scripting Lua de pxstud.io, cuya introducción (https://pxstud.io/es/docs/scripting.md) explica sus convenciones. Los grupos de opciones y los tipos a los que remite están en https://pxstud.io/es/docs/scripting/option-groups.md y https://pxstud.io/es/docs/scripting/types.md. Todo en un solo archivo (en inglés): https://pxstud.io/llms-full.txt. El índice de todo el sitio (en inglés): https://pxstud.io/llms.txt.

### Documento
El sprite en conjunto: empieza aquí con app.describe(), y luego tamaño, recorte, rotación y modo de color.

#### `app.convertColorMode(colorMode, opts?)` — modifica, deshacible
Convierte el sprite entre modos de color (rgba, grayscale, indexed), con tramado opcional y generación de una paleta al pasar a indexed.

- `colorMode` (ColorMode: "rgba" | "grayscale" | "indexed") — Las conversiones desde rgba (y hacia grayscale) pierden información: el color se cuantiza a su entrada de paleta más cercana o a su luma Rec. 709 (la de Aseprite, truncada: el rojo es 54). Al pasar a grayscale la paleta se convierte en 256 grises, de negro a blanco (se pierden las paletas por fotograma y los grupos de paleta, y el índice transparente pasa a ser 0). No hace nada si el sprite ya está en ese modo.
- `opts` (table, opcional)
  - `dithering` (DitherMethod: "none" | "bayer2" | "bayer4" | "bayer8" | "floydSteinberg" | "atkinson"; predeterminado "none") — Solo al pasar a indexed: cómo se aproximan los colores intermedios entre las entradas de la paleta.
  - `ditherAmount` (integer 0–100; predeterminado 100) — Solo al pasar a indexed: intensidad del tramado (0 = solo el color más cercano).
  - `paletteColors` (integer 1–256; predeterminado keep the current palette) — Solo al pasar a indexed: reemplaza la paleta por esta cantidad de colores generados a partir del sprite (más una entrada transparente en el índice 0, salvo que Fondo sea la única capa; se descartan las paletas por fotograma).

No devuelve nada.

#### `app.cropToSelection()` — modifica, deshacible
Recorta el lienzo a los límites de la selección actual; si la selección sobrepasa el lienzo, este crece hasta ahí. No hace nada si no hay nada seleccionado.

No devuelve nada.

#### `app.describe()` — lee
Todo sobre la estructura del documento en una sola llamada (sin datos de píxeles): { sprite, activeLayerId, activeFrameId, layers, frames, cels, tags, slices, selection (límites o nil), context }, cada parte con la forma de su propia consulta (app.getSprite, app.getLayers, ...). Empieza aquí para ver con qué estás trabajando.

Devuelve (table): Tabla del documento.

#### `app.flip(axis, layerId?)` — modifica, deshacible, se rechaza en una capa bloqueada
Refleja todo el lienzo, o una capa (también los descendientes de un grupo) en todos los fotogramas: píxeles y posiciones de las celdas, tiles de tilemap, imágenes de referencia. A diferencia de app.flipCelRegion, ignora la selección.

- `axis` (FlipAxis: "horizontal" | "vertical")
- `layerId` (string, opcional) — La capa (o grupo) que se voltea en todos los fotogramas. Omítela para voltear todo el lienzo: todas las capas, todos los fotogramas, los slices y la selección.

No devuelve nada.

#### `app.getCanvasHeight()` — lee
El alto del lienzo del sprite en píxeles.

Devuelve (number): Alto en píxeles.

#### `app.getCanvasWidth()` — lee
El ancho del lienzo del sprite en píxeles.

Devuelve (number): Ancho en píxeles.

#### `app.getColorMode()` — lee
El modo de color del sprite: "rgba", "grayscale" o "indexed".

Devuelve (string): "rgba", "grayscale" o "indexed".

#### `app.getSprite()` — lee
El sprite: { id, width, height, colorMode ("rgba" | "grayscale" | "indexed"), palette (cadenas hex), transparentIndex (sprites indexados: el índice de la paleta cuyos píxeles son transparentes), pixelRatio ({ w, h }; 1:1 = píxeles cuadrados), colorDepth (niveles por canal: { kind = "rgb", red, green, blue } o { kind = "gray", gray }, con profile; nil para color completo), layerCount, frameCount }.

Devuelve (table): Tabla del sprite.

#### `app.newSprite(width, height, background?)` — modifica, deshacible
Reemplaza todo el documento por un sprite nuevo (una capa, un fotograma; una capa Fondo cuando se indica un color de fondo). Descarta el contenido del documento actual.

- `width` (number) — Ancho del lienzo en píxeles.
- `height` (number) — Alto del lienzo en píxeles.
- `background` (color, opcional) — Color de relleno de una capa Fondo. Si se omite, se crea en su lugar una "Layer 1" transparente.

Devuelve (table): { layerId, frameId } de la única capa y el único fotograma del sprite nuevo.

#### `app.rotateCanvas(degrees)` — modifica, deshacible
Rota todo el lienzo (todas las capas, todos los fotogramas) en sentido horario (90), antihorario (-90) o 180 grados.

- `degrees` (number) — 90, -90 o 180.

No devuelve nada.

#### `app.setCanvasSize(width, height, anchor)` — modifica, deshacible
Cambia el tamaño del lienzo, reposicionando (sin remuestrear) el contenido existente respecto a `anchor`. El contenido que queda más allá del nuevo borde se conserva ahí (solo se corta la capa Fondo), así que al volver a agrandar se recupera.

- `width` (number)
- `height` (number)
- `anchor` (CanvasAnchor: "top-left" | "top" | "top-right" | "left" | "center" | "right" | "bottom-left" | "bottom" | "bottom-right")

No devuelve nada.

#### `app.setPixelRatio(w, h)` — modifica, deshacible
Establece la proporción de píxel del sprite (Propiedades del sprite > Proporción de píxel, en Aseprite), p. ej. 2, 1 para píxeles el doble de anchos que de altos. Solo cambian la visualización y las exportaciones que tienen en cuenta la proporción, no los píxeles.

- `w` (number) — Ancho del píxel, un entero positivo (1:1 = cuadrado).
- `h` (number) — Alto del píxel, un entero positivo.

No devuelve nada.

#### `app.setSpriteSize(width, height)` — modifica, deshacible
Remuestrea cada celda (vecino más cercano) para ajustarla al nuevo tamaño del sprite.

- `width` (number)
- `height` (number)

No devuelve nada.

#### `app.setUserData(target, userData?)` — modifica, deshacible
Establece los datos de usuario (etiqueta de color, texto y propiedades personalizadas, como en Aseprite) de un sprite, capa, celda, etiqueta, slice o tileset. El destino de tipo celda puede ser un fotograma de tilemap. Las celdas vinculadas comparten unos mismos datos de usuario, igual que su imagen. Cambia solo lo que indiques, así que establecer el texto conserva el color, y escribir el espacio de nombres properties de tu extensión conserva los de los demás (como en Aseprite, donde layer.data, layer.color y layer.properties(ns) son independientes). Léelos de nuevo con app.getSprite, getLayers, getCels, getTags, getSlices o getTileset (el campo userData). Se permite en capas bloqueadas.

- `target` (table) — Qué anotar: { kind = "sprite" }, { kind = "layer", layerId }, { kind = "cel", layerId, frameId }, { kind = "tag", tagId }, { kind = "slice", sliceId } o { kind = "tileset", layerId }.
  - `kind` (UserDataKind: "sprite" | "layer" | "cel" | "tag" | "slice" | "tileset") — Qué tipo de elemento.
  - `layerId` (string) — Para los destinos layer, cel y tileset.
  - `frameId` (string) — Para los destinos cel.
  - `tagId` (string) — Para los destinos tag.
  - `sliceId` (string) — Para los destinos slice.
- `userData` (table, opcional) — Qué cambiar: solo las partes que indiques. text = "" o color = "" borra esa parte; en properties, cada espacio de nombres que nombres se reemplaza y uno puesto en {} se elimina, mientras que los demás se quedan. nil elimina todos los datos de usuario.
  - `color` (string) — La etiqueta de color como "#rrggbb" o "#rrggbbaa". No se acepta para las etiquetas (su color es Tag.color).
  - `text` (string) — Texto libre (el texto de los datos de usuario de Aseprite).
  - `properties` (namespaces to properties: { [""] = { score = 3 }, ["my-extension"] = { ... } }. Values are plain JSON: nil-free, finite numbers, strings, booleans, lists and tables. properties[""] is your own namespace (Aseprite's user properties).) — Propiedades personalizadas por espacio de nombres. Los valores con tipo de Aseprite (uuid, fixed, point, ...) aparecen como tablas con una clave $type, p. ej. { ["$type"] = "uuid", value = "..." }, y se vuelven a escribir como el tipo de Aseprite.

No devuelve nada.

#### `app.trim()` — modifica, deshacible
Recorta el lienzo a lo que está dibujado en todos los fotogramas, como Recortar de Aseprite: las capas visibles tal como se muestran, reducidas frente a la transparencia o a un color de borde sólido (como un Fondo opaco). No hace nada si no queda nada que cortar.

No devuelve nada.
