Aplicación Android local-first de dibujo, pintura e ilustración digital, diseñada principalmente para tablets y lápices sensibles a presión como el S Pen.
Canvas Studio combina una interfaz adaptativa creada con Jetpack Compose con un motor raster propio basado en tiles. El objetivo del proyecto es ofrecer una experiencia de dibujo profesional, rápida y sin dependencia de cuentas, servidores ni conexión permanente a Internet. La interfaz está diseñada exclusivamente para tablets: requiere un ancho disponible mínimo de 600dp y no se distribuye para teléfonos.
Estado del proyecto: Beta para tablets / fase 5 Versión incluida en este repositorio:
2.0.0-beta01Formato de documento actual: v7
Plataforma: tablets Android 8.0 o superior (mínimosw600dp)
Las siguientes capturas fueron obtenidas de la variante de depuración ejecutada en una Samsung Galaxy Tab S8 (SM-X700). Muestran la interfaz de tablet y el lienzo con trazos reales; no son renders promocionales.
- Visión general
- Principios del producto
- Funciones disponibles
- Flujo de uso
- Herramientas de dibujo
- Motor de pinceles
- Capas, grupos y máscaras
- Selección y transformación
- Guías y asistencias
- Documentos, guardado y exportación
- Arquitectura técnica
- Formato interno de los proyectos
- Requisitos de desarrollo
- Abrir y ejecutar el proyecto
- Compilar desde terminal
- Actualizar sin perder proyectos
- Atajos de teclado
- Rendimiento y memoria
- Privacidad y almacenamiento
- Compatibilidad y migraciones
- Estructura del repositorio
- Pruebas recomendadas
- Limitaciones actuales
- Solución de problemas
- Hoja de ruta
- Documentación adicional
- Licencia
Canvas Studio permite crear, organizar y editar ilustraciones raster directamente en el dispositivo. Está pensado para funcionar bien en orientación horizontal o vertical, con controles adaptados a pantallas grandes y soporte para entrada táctil, lápiz, presión, inclinación y teclado físico.
La aplicación se divide en dos espacios principales:
- Galería: creación, búsqueda, apertura, duplicación y eliminación de proyectos locales.
- Editor: lienzo, herramientas, pinceles, capas, selección, transformación, guías y exportación.
Los documentos se almacenan dentro del espacio privado de la aplicación. El usuario puede exportar resultados mediante el selector de archivos de Android, sin conceder acceso general al almacenamiento.
- No requiere cuenta.
- No depende de un backend.
- No incorpora sincronización propietaria en la nube.
- Los proyectos permanecen disponibles sin conexión.
- El guardado se realiza en el almacenamiento privado de la aplicación.
- Diseño adaptable para orientación horizontal y vertical.
- Paneles laterales y barra superior reorganizables según el ancho disponible.
- Modo compacto y modo zen para priorizar el lienzo.
- Compatibilidad con entrada táctil, S Pen y teclado.
- Capas independientes.
- Máscaras raster por capa.
- Bloqueo alfa.
- Clipping.
- Grupos de capas.
- Historial de deshacer y rehacer durante la sesión.
- Selección y transformación mediante comandos de sesión.
- Superficies raster dispersas.
- Tiles de
512 × 512 px. - Caché LRU.
- Carga bajo demanda.
- Renderizado prioritario de la zona visible.
- Guardado incremental de tiles modificados.
| Área | Implementación actual |
|---|---|
| Galería | Proyectos locales, búsqueda, duplicado, eliminación y tarjetas de demostración |
| Creación de lienzo | Presets, medidas personalizadas, orientación, DPI y límites defensivos |
| Navegación | Zoom, desplazamiento, rotación, restablecimiento y modo zen |
| Dibujo | Pincel, borrador, línea, rectángulo, elipse, relleno, degradado y cuentagotas |
| Pinceles | Presión, inclinación, estabilización, flujo, espaciado, taper, grano, dispersión y velocidad |
| Capas | Crear, duplicar, borrar, limpiar, renombrar, reordenar, ocultar y cambiar opacidad |
| Composición | Siete modos de fusión, bloqueo alfa y clipping |
| Grupos | Grupos de un nivel con visibilidad, opacidad y colapso |
| Máscaras | Máscara raster por capa, activación, edición, eliminación e historial separado |
| Selección | Rectangular, elíptica, lazo y seleccionar todo |
| Transformación | Mover, escalar, rotar, voltear y borrar contenido seleccionado |
| Asistencias | Cuadrícula, simetría vertical, simetría radial y perspectiva editable |
| Importación | Imágenes compatibles con Android como una capa nueva |
| Exportación | PNG aplanado y OpenRaster .ora con capas |
| Persistencia | Autoguardado incremental, metadata transaccional y recuperación de respaldo |
| Documentos grandes | Hasta 64 millones de píxeles y 16.384 px por lado |
El detalle de lo implementado y lo pendiente se mantiene en docs/FEATURE_MATRIX.md.
Al iniciar, Canvas Studio muestra la biblioteca de proyectos.
Desde esta pantalla se puede:
- crear un lienzo;
- buscar por nombre o dimensiones;
- abrir un proyecto local;
- duplicar un proyecto;
- eliminarlo del dispositivo;
- abrir una tarjeta de ejemplo y convertirla en un proyecto local;
- consultar información básica de la aplicación.
Las tarjetas de demostración no representan archivos editables preinstalados. Al abrir una de ellas se crea una copia local con sus dimensiones y estilo de referencia.
El diálogo de creación incluye presets profesionales:
- Pantalla 4K:
3840 × 2160; - Concept art 8K:
7680 × 4320; - Ilustración:
4096 × 2732; - Cómic vertical A4:
2480 × 3508; - Cuadrado:
3000 × 3000.
También admite ancho, alto, nombre y DPI personalizados.
El tamaño se restringe defensivamente a:
- mínimo de
256 pxpor lado; - máximo de
16.384 pxpor lado; - máximo total de
64.000.000de píxeles.
Cuando una combinación supera el máximo total, se reduce proporcionalmente.
El editor organiza las funciones en:
- barra superior del documento;
- barra de herramientas;
- panel de pinceles y ajustes;
- panel de capas;
- superficie central del lienzo;
- barra de estado del motor y guardado.
Los paneles cambian de distribución según el tamaño y la orientación de la pantalla.
Dibuja trazos raster usando el preset y la configuración activos. Puede responder a presión, inclinación, velocidad y estabilización.
Elimina contenido de la capa activa. Al editar una máscara, el borrador revela las zonas ocultas por esa máscara.
Crea líneas rectas con el color, tamaño y opacidad activos.
Crean formas raster delimitadas por el gesto entre el punto inicial y el final.
Realiza un relleno contiguo con tolerancia de color. Puede respetar una selección activa.
Para proteger la memoria, una operación de relleno se limita actualmente a 12 millones de píxeles.
Aplica un degradado lineal desde el color activo hacia transparencia. El inicio y la dirección se definen mediante el gesto sobre el lienzo.
Muestrea el color de un único píxel en la composición visible sin generar una copia completa del lienzo.
Desplaza el lienzo sin modificar el contenido.
Canvas Studio incluye un motor de pinceles configurable y doce presets base.
- Lápiz HB
- Lápiz 6B
- Portaminas
- Tinta técnica
- Tinta con presión
- Plumilla cómic
- Marcador
- Gouache opaco
- Pintura suave
- Aerógrafo suave
- Carboncillo
- Tiza seca
- tamaño;
- opacidad;
- color;
- dureza;
- espaciado;
- estabilización;
- flujo;
- tamaño mínimo;
- respuesta de tamaño a presión;
- respuesta de opacidad a presión;
- respuesta a inclinación;
- afinado inicial y final (
taper); - dispersión;
- grano;
- variación por velocidad;
- tipo de punta raster.
La configuración actual puede guardarse con un nombre personalizado. Los presets personalizados se almacenan mediante SharedPreferences y se conservan entre sesiones.
El límite actual es de 40 pinceles personalizados. Todavía no existe importación de puntas o texturas externas ni un administrador completo para editar, ordenar o eliminar presets.
Los pinceles de pintura y textura generan más trabajo que los lápices simples. Para reducir latencia:
- los puntos recibidos se agrupan por frame;
- el muestreo se adapta a tamaño y espaciado;
- se evita crear objetos gráficos repetidos por cada stamp;
- se limita defensivamente la densidad de partículas;
- el guardado espera un periodo de inactividad antes de comprimir tiles.
La corrección crítica que evita el desbordamiento de capacidad al finalizar un trazo forma parte de esta base y no debe eliminarse al modificar el procesamiento por lotes.
Cada capa posee:
- identificador;
- nombre;
- visibilidad;
- opacidad;
- modo de fusión;
- bloqueo alfa;
- estado de clipping;
- grupo opcional;
- superficie raster por tiles;
- máscara raster opcional.
Operaciones disponibles:
- crear;
- duplicar;
- eliminar;
- limpiar;
- renombrar;
- subir y bajar;
- ocultar y mostrar;
- modificar opacidad;
- cambiar modo de fusión.
- Normal
- Multiplicar
- Trama
- Superponer
- Añadir
- Oscurecer
- Aclarar
La suite de modos todavía no pretende reproducir toda la precisión o variedad de aplicaciones de escritorio especializadas.
Restringe el dibujo a los píxeles que ya contienen transparencia parcial o color en la capa activa.
Recorta la capa usando el alfa de la capa inferior. La composición también considera la máscara de la capa base.
Los grupos actuales son de un solo nivel y permiten:
- agrupar la capa activa;
- hacer que capas nuevas o duplicadas hereden el grupo activo;
- ocultar o mostrar el grupo;
- modificar la opacidad del grupo;
- colapsar su presentación en el panel;
- sacar una capa del grupo;
- persistir la estructura al guardar.
La opacidad se aplica a los miembros del grupo. Todavía no existe composición aislada ni grupos anidados.
Cada capa puede tener una máscara independiente.
- La máscara vacía deja visible toda la capa.
- Dibujar con Pincel en modo máscara oculta contenido.
- Dibujar con Borrador revela contenido.
- La máscara puede activarse o desactivarse sin eliminarse.
- Puede eliminarse sin destruir los píxeles originales de la capa.
- Su historial se mantiene separado del historial de contenido durante la sesión.
- Se guarda como una superficie tiled dispersa.
No se incluyen todavía feather configurable, inversión, niveles, máscaras vectoriales ni máscaras de grupo.
- Rectangular
- Elíptica
- Lazo libre
- Seleccionar todo
- Deseleccionar
Una selección activa puede limitar:
- pincel;
- borrador;
- línea;
- rectángulo;
- elipse;
- relleno;
- degradado.
La herramienta Transformar permite:
- mover con un dedo;
- escalar con gesto de dos dedos;
- rotar con gesto de dos dedos;
- voltear horizontalmente;
- voltear verticalmente;
- borrar el contenido seleccionado;
- deshacer y rehacer la operación durante la sesión.
La transformación trabaja con un parche raster temporal. No están disponibles todavía transformación en perspectiva del contenido, deformación libre, warp ni valores numéricos exactos.
Muestra una cuadrícula sobre el lienzo. La densidad visual se adapta al zoom para evitar saturar la pantalla.
- Vertical
- Radial de 4 segmentos
- Radial de 8 segmentos
Los comandos simétricos se agrupan en el historial para que una operación de deshacer afecte el trazo completo y no cada copia por separado.
- Guía de un punto.
- Guía de dos puntos.
- Puntos de fuga arrastrables.
- Restablecimiento de posiciones.
- Persistencia dentro del documento.
Durante el modo de edición de perspectiva se bloquea temporalmente el dibujo para evitar trazos accidentales.
No existe todavía snapping de trazos a las guías, reglas graduadas ni rejillas de perspectiva personalizadas.
El documento se guarda en el directorio privado de la aplicación mediante:
- metadata en
project.properties; - tiles PNG por capa;
- tiles PNG por máscara;
- vista previa de galería;
- respaldo temporal de metadata durante una actualización.
El autoguardado:
- espera aproximadamente tres segundos de inactividad;
- guarda solo los tiles modificados o eliminados;
- evita regenerar la miniatura en cada ciclo automático;
- serializa las operaciones de guardado para que no compitan entre sí;
- codifica PNG fuera del bloqueo principal de la superficie cuando es seguro hacerlo;
- descarta generaciones antiguas si ya existe una solicitud de guardado más reciente.
El guardado manual incluye una vista previa actualizada.
El selector de Android permite importar una imagen compatible con el decodificador del sistema. La imagen se añade como una nueva capa raster.
Formatos habituales como PNG y JPEG dependen del soporte de Android y del proveedor de archivos utilizado.
Genera una imagen aplanada mediante ActivityResultContracts.CreateDocument("image/png") y permite escoger la ubicación con el selector del sistema.
Genera un archivo .ora con:
- capas;
- orden;
- visibilidad;
- opacidad;
- composición combinada;
- miniatura.
La exportación OpenRaster está pensada para interoperar con editores como Krita, aunque algunas propiedades avanzadas propias de Canvas Studio pueden aplanarse o representarse de forma limitada.
Durante esta etapa, OpenRaster limita defensivamente la exportación a 24 millones de píxeles por capa.
La importación y exportación PSD no están implementadas en esta versión.
flowchart TD
A[MainActivity] --> B[StudioApp]
B --> C[GalleryScreen]
B --> D[EditorScreen]
C --> E[ProjectRepository]
D --> F[DrawingView]
D --> G[BrushRepository]
F --> H[Capas y grupos]
H --> I[SparseTileSurface]
I --> J[TileStorage]
J --> K[Almacenamiento interno]
F --> E
F --> L[PNG / OpenRaster]
- Jetpack Compose: galería, diálogos, paneles, controles y navegación.
- Material 3: componentes y estructura visual.
- DrawingView: vista Android personalizada para interacción y render raster de baja latencia.
- Pointer interop: conecta eventos de Compose con la vista de dibujo.
DrawingView coordina:
- herramientas;
- entrada táctil y S Pen;
- presión e inclinación;
- zoom, desplazamiento y rotación;
- historial de comandos;
- composición de capas;
- selección y transformación;
- guardado y exportación;
- precarga de tiles.
SparseTileSurface representa una capa sin reservar un bitmap del tamaño completo del documento.
Responsabilidades principales:
- cargar tiles existentes bajo demanda;
- crear tiles solo cuando se dibuja sobre ellos;
- mantener una caché LRU ordenada por uso;
- marcar tiles modificados;
- escribir tiles antes de expulsarlos cuando corresponde;
- eliminar archivos de tiles totalmente transparentes;
- exponer estadísticas de memoria, carga y pendientes;
- dibujar únicamente tiles residentes dentro del área visible.
TileStorage define:
- tamaño de tile de
512 px; - cálculo de tiles afectados por un rectángulo;
- lectura y escritura PNG;
- nombres
<columna>_<fila>.png; - guardado atómico mediante archivos
.tmp; - eliminación de tiles transparentes;
- copia de directorios tiled;
- migración desde imágenes raster completas.
ProjectRepository administra:
- directorio raíz de proyectos;
- lectura de tarjetas locales;
- recuperación de metadata desde respaldo;
- duplicación de directorios;
- eliminación local;
- rutas de vista previa.
BrushRepository serializa los presets personalizados como JSON dentro de SharedPreferences.
- La interacción principal y el render visible ocurren en el hilo de interfaz.
- La precarga utiliza un ejecutor de un solo hilo.
- El guardado se realiza en un trabajador separado.
- Los guardados se serializan para evitar conflictos sobre archivos temporales.
- La lectura desde disco se excluye de la ruta crítica de render cuando un tile todavía no está residente.
Los proyectos se almacenan bajo una estructura equivalente a:
<filesDir>/canvasstudio/projects/<project-id>/
├── project.properties
├── project.properties.bak # solo durante recuperación o reemplazo
├── preview.png
└── layers/
└── <layer-id>/
├── tiles/
│ ├── 0_0.png
│ ├── 1_0.png
│ └── ...
└── mask/
├── 0_0.png
└── ...
project.properties contiene, entre otros:
- versión del formato;
- identificador y título;
- ancho, alto y DPI;
- fecha de modificación;
- modo de almacenamiento;
- tamaño de tile;
- renderer declarado;
- grupos y sus propiedades;
- modo y puntos de perspectiva;
- orden y propiedades de capas;
- rutas relativas de contenido y máscara.
La metadata se escribe primero en project.properties.tmp. El archivo anterior se copia temporalmente a project.properties.bak; solo después se reemplaza la metadata principal. Si el reemplazo falla, se intenta restaurar el respaldo.
Un tile completamente transparente no se conserva como PNG. Esto mantiene dispersos los documentos con grandes áreas vacías y reduce el uso de almacenamiento.
- Android Studio reciente compatible con AGP 8.10.1.
- Android SDK Platform 36 instalado.
- JDK 17.
- Gradle Wrapper incluido: 8.11.1.
- Conexión a Internet para la primera resolución de dependencias, salvo que estén en caché.
minSdk: 26 — Android 8.0.targetSdk: 36.compileSdk: 36.- Java/Kotlin JVM target: 17.
applicationId:com.orbyte.canvasstudio.
- Kotlin 2.2.21.
- Jetpack Compose.
- Compose Material 3.
- Compose Foundation.
- Material Icons Extended.
- Activity Compose 1.11.0.
- Lifecycle Runtime Compose 2.9.2.
No existen dependencias runtime de red, analítica, autenticación ni base de datos externa.
- Descomprime el archivo fuente.
- Abre Android Studio.
- Selecciona Open.
- Elige la carpeta raíz del proyecto, la que contiene
settings.gradle.kts. - Configura Gradle JDK como JDK 17, Embedded JDK o
GRADLE_LOCAL_JAVA_HOMEcompatible. - Instala Android SDK Platform 36 si Android Studio lo solicita.
- Espera que finalice Gradle Sync.
- Conecta una tablet o inicia un emulador con Android 8.0 o superior.
- Selecciona la configuración
app. - Pulsa Run.
- Activa Opciones de desarrollador.
- Activa Depuración inalámbrica.
- En Android Studio abre Device Manager.
- Selecciona Pair Devices Using Wi-Fi.
- Empareja mediante código o QR.
- Escoge la tablet como destino y ejecuta
app.
./gradlew assembleDebuggradlew.bat assembleDebugEl APK de depuración se genera normalmente en:
app/build/outputs/apk/debug/app-debug.apk
Para instalarlo mediante ADB:
./gradlew installDebugPara revisar el proyecto sin instalar:
./gradlew checkEl repositorio incluye configuración opcional de firma mediante keystore.properties;
consulta docs/BETA_RELEASE.md. Las credenciales y el keystore
real no se versionan.
Canvas Studio conserva el mismo applicationId entre estas entregas.
Para mantener los documentos locales:
- no desinstales la aplicación existente;
- compila la nueva versión con el mismo
applicationIdy una firma compatible; - instala o ejecuta la nueva build encima de la anterior;
- abre primero una copia de un proyecto importante y comprueba el resultado;
- guarda para migrarlo al formato actual solo cuando la versión nueva esté estable.
Desinstalar la aplicación puede eliminar su almacenamiento privado y, por tanto, los proyectos que no se hayan exportado o respaldado.
No se recomienda volver a guardar con una versión antigua un documento que ya haya sido migrado al formato v7.
| Atajo | Acción |
|---|---|
Ctrl + Z |
Deshacer |
Ctrl + Shift + Z |
Rehacer |
Ctrl + A |
Seleccionar todo |
Ctrl + D |
Deseleccionar |
Esc |
Deseleccionar |
Delete |
Borrar selección |
B |
Pincel |
E |
Borrador |
F |
Relleno |
G |
Degradado |
M |
Selección rectangular |
Shift + M |
Selección elíptica |
V |
Transformar |
H |
Mano / mover lienzo |
I |
Cuentagotas |
L |
Línea |
[ |
Reducir tamaño del pincel |
] |
Aumentar tamaño del pincel |
Los atajos pueden variar según la distribución física del teclado. Todavía no existe una pantalla para reasignarlos.
Un documento de 7680 × 4320 no se mantiene como un bitmap completo por cada capa. Cada capa utiliza tiles dispersos, y la caché conserva principalmente:
- tiles visibles;
- tiles próximos al viewport;
- tiles editados recientemente;
- tiles sucios pendientes de guardado.
Esto reduce el consumo base, pero algunas operaciones todavía necesitan buffers temporales.
- pinceles con grano y dispersión;
- tamaños de pincel muy grandes;
- muchas capas visibles con máscaras y clipping;
- rellenos extensos;
- transformaciones de selecciones grandes;
- exportación de documentos 8K;
- OpenRaster con muchas capas;
- cadenas largas de deshacer sobre regiones superpuestas.
En una tablet de gama alta como la Galaxy Tab S8:
- comenzar con
4096 × 4096o menos; - usar de 4 a 8 capas para pruebas generales;
- comprobar estabilidad antes de aumentar a 8K;
- evitar cientos de trazos texturizados sin pausas durante pruebas diagnósticas;
- observar el indicador de tiles residentes, almacenados y pendientes;
- guardar manualmente antes de exportaciones grandes.
El almacenamiento de 128 GB ayuda a conservar documentos, pero la fluidez depende principalmente de RAM, CPU/GPU, tamaño del viewport, cantidad de tiles residentes y complejidad de composición.
Al desplazarse rápidamente hacia una zona no residente puede aparecer brevemente el fondo mientras se cargan tiles. La prioridad es no bloquear la entrada del lápiz por una lectura de disco en el hilo visual.
El manifiesto actual:
- no solicita permiso
INTERNET; - no solicita acceso general al almacenamiento;
- no incluye servicios de analítica;
- no incluye autenticación;
- no incluye publicidad;
- no incluye sincronización en segundo plano.
La importación y exportación usan el selector de documentos de Android, que concede acceso solamente al URI elegido por el usuario.
La aplicación tiene android:allowBackup="true". Según la versión de Android, fabricante y configuración del dispositivo, el sistema operativo podría incluir datos de la aplicación en sus mecanismos de copia de seguridad. Canvas Studio no implementa por sí mismo una nube o servidor de respaldo.
Para una publicación definitiva conviene revisar la política de backups, definir reglas de extracción de datos y documentar el tratamiento de archivos locales.
La versión actual escribe documentos en formato v7 y puede leer proyectos anteriores desde v2 hasta v6.
- Formatos iniciales: capas raster completas.
- Formatos intermedios: almacenamiento tiled e incremental.
- v6: renderer de baja latencia y cambios de autoguardado.
- v7: grupos, máscaras raster y perspectiva editable.
Al guardar un proyecto antiguo con la versión actual, este se migra al formato v7.
Las versiones antiguas pueden desconocer:
- grupos;
- máscaras;
- nuevos campos de composición;
- rutas tiled actuales;
- metadata de perspectiva.
Por ello, no deben utilizarse para sobrescribir un proyecto ya migrado.
CanvasStudio/
├── app/
│ ├── build.gradle.kts
│ └── src/main/
│ ├── AndroidManifest.xml
│ ├── java/com/orbyte/canvasstudio/
│ │ ├── MainActivity.kt
│ │ ├── drawing/
│ │ │ ├── BrushRepository.kt
│ │ │ ├── DrawingModels.kt
│ │ │ ├── DrawingView.kt
│ │ │ ├── SparseTileSurface.kt
│ │ │ └── TileStorage.kt
│ │ ├── model/
│ │ │ ├── ProjectRepository.kt
│ │ │ └── StudioModels.kt
│ │ └── ui/
│ │ ├── StudioApp.kt
│ │ ├── screens/
│ │ │ ├── EditorScreen.kt
│ │ │ └── GalleryScreen.kt
│ │ └── theme/Theme.kt
│ └── res/
├── docs/
├── gradle/wrapper/
├── build.gradle.kts
├── settings.gradle.kts
└── README.md
| Archivo | Responsabilidad principal |
|---|---|
MainActivity.kt |
Punto de entrada, edge-to-edge y tema Compose |
StudioApp.kt |
Navegación simple entre galería y editor |
GalleryScreen.kt |
Biblioteca y creación de documentos |
EditorScreen.kt |
Interfaz del editor, paneles, importación y launchers de exportación |
DrawingView.kt |
Motor de interacción, dibujo, composición, historial y persistencia |
DrawingModels.kt |
Herramientas, pinceles, comandos, capas y modelos de UI |
SparseTileSurface.kt |
Superficie raster dispersa y caché LRU |
TileStorage.kt |
Geometría y persistencia PNG de tiles |
ProjectRepository.kt |
Biblioteca local de proyectos |
BrushRepository.kt |
Pinceles personalizados persistentes |
StudioModels.kt |
Documentos, presets, límites y paleta del producto |
La aplicación sigue en etapa Alpha, por lo que cada entrega debe verificarse en hardware real.
- Crear un lienzo
2048 × 2048. - Dibujar con Lápiz HB.
- Dibujar con Gouache y Carboncillo.
- Levantar el lápiz tras cada trazo y comprobar que la app no se cierra.
- Deshacer y rehacer.
- Añadir, duplicar y eliminar una capa.
- Guardar y volver a la galería.
- Reabrir el proyecto.
- Exportar PNG.
- Crear un lienzo
4096 × 4096. - Realizar un trazo corto y uno largo con:
- Gouache opaco;
- Pintura suave;
- Carboncillo;
- Tiza seca.
- Realizar 100 trazos consecutivos.
- Ejecutar 20 operaciones de deshacer y rehacer.
- Seguir dibujando durante el autoguardado.
- Confirmar que no aparece
Illegal Capacity: -2147483648.
scripts/test-tablet-stress.ps1 compila e instala la variante debug, abre el proyecto de prueba, realiza trazos distribuidos, espera el autoguardado, reinicia la app y guarda métricas de rendimiento, memoria y Logcat.
No borra datos ni modifica la aplicación de producción: usa exclusivamente com.orbyte.canvasstudio.debug. Los trazos sí se añaden al proyecto debug seleccionado, así que debe usarse con una copia de prueba.
Con la depuración inalámbrica activa:
Set-ExecutionPolicy -Scope Process Bypass
.\scripts\test-tablet-stress.ps1Para reutilizar el APK y ejecutar 200 trazos únicos:
.\scripts\test-tablet-stress.ps1 -SkipBuild -SkipInstall -StrokeCount 200Para cubrir pinceles de textura y tamaños gruesos (cada incremento añade 16% al diámetro):
.\scripts\test-tablet-stress.ps1 -SkipBuild -SkipInstall -StrokeCount 90 `
-BrushPresets "Gouache opaco","Carboncillo","Tiza seca" -BrushSizeIncrements 7Los reportes se guardan en build/reports/tablet-stress/, junto a una captura base, otra tras dibujar y una final después de reabrir el proyecto. El script detecta cierres, errores fatales, recuperación tras reinicio y verifica automáticamente cada celda de la matriz de trazos contra la captura base.
- Abrir un documento de una versión anterior.
- Guardarlo como v7.
- Reabrirlo y revisar capas, máscaras, grupos y guías.
- Duplicarlo desde la galería.
- Eliminar la copia y confirmar que el original permanece.
- Cambiar todos los modos de fusión.
- Combinar máscara, clipping y bloqueo alfa.
- Ocultar y mostrar grupos.
- Modificar opacidad de capa y grupo.
- Exportar PNG y OpenRaster.
Incluir:
- versión de Canvas Studio;
- modelo de dispositivo y versión de Android;
- tamaño del lienzo y DPI;
- cantidad de capas, grupos y máscaras;
- pincel y tamaño utilizados;
- acción exacta que produjo el problema;
- si el proyecto fue creado en una versión anterior;
- captura o grabación;
- bloque completo de Logcat desde
FATAL EXCEPTIONhasta la última líneaCaused by.
El checklist detallado está en docs/TEST_CHECKLIST.md.
Canvas Studio todavía no es una versión final de producción.
- No existe backend Vulkan dedicado.
- No hay front buffer especializado para S Pen.
- Algunas composiciones con máscara o clipping requieren superficies temporales.
- Deshacer muchos trazos complejos y superpuestos puede ser más lento que dibujar.
- Los tiles no residentes pueden aparecer con un pequeño retraso al mover rápidamente el lienzo.
- No hay gestión ICC.
- No hay CMYK.
- No hay advertencia de gamut.
- No hay documentos de 16 bits por canal.
- La edición se realiza en raster ARGB de 8 bits por canal.
- Grupos de un solo nivel.
- Sin composición aislada de grupo.
- Sin selección múltiple de capas.
- Sin máscaras vectoriales.
- Sin feather, niveles o inversión de máscara.
- Sin clipping avanzado encadenado.
- Sin expandir, contraer, invertir o suavizar selección.
- Sin perspectiva, deformación o warp de contenido.
- Sin transformación numérica exacta.
- Sin PSD.
- Sin TIFF.
- Sin PDF.
- Sin importación OpenRaster.
- La exportación OpenRaster tiene límites de tamaño defensivos.
- Sin papelera recuperable.
- Sin sincronización entre dispositivos.
- Sin configuración de ficha ni publicación en Play Store.
En Android Studio:
- abre Settings;
- ve a Build, Execution, Deployment → Build Tools → Gradle;
- selecciona JDK 17, Embedded JDK o
GRADLE_LOCAL_JAVA_HOMEcompatible; - sincroniza de nuevo.
Comprueba por terminal:
java -versionAbre SDK Manager, instala Android SDK Platform 36 y vuelve a ejecutar Gradle Sync.
La actualización debe usar:
- el mismo
applicationId; - una firma compatible;
- instalación sobre la aplicación existente.
Una desinstalación elimina normalmente el directorio privado de proyectos.
- reduce temporalmente el tamaño del pincel;
- aumenta ligeramente el espaciado;
- reduce dispersión o grano;
- oculta capas que no necesites ver;
- prueba primero en
4096 × 4096; - espera a que termine el autoguardado antes de una exportación grande;
- revisa el contador de tiles pendientes.
- abre Logcat;
- filtra por
com.orbyte.canvasstudio; - reproduce el problema una sola vez;
- busca
FATAL EXCEPTION; - guarda desde esa línea hasta el último
Caused by; - registra también tamaño de lienzo, pincel y cantidad de capas.
Comprueba:
- que el nombre termine en
.ora; - que la exportación haya finalizado;
- que exista espacio libre suficiente;
- que el editor receptor admita OpenRaster;
- que el documento no supere los límites temporales de exportación.
- mejorar grupos y máscaras;
- selección con feather, invertir, expandir y contraer;
- perspectiva con snapping;
- herramientas de reglas;
- importación y exportación PSD básica;
- mayor precisión en modos de fusión.
- corrección sistemática de errores;
- recuperación después de cierres inesperados;
- diario de autoguardado y versiones locales;
- optimización en Samsung, Lenovo, Xiaomi y otras tablets;
- mejor integración con S Pen y stylus compatibles;
- tutorial inicial;
- ayuda contextual;
- accesibilidad;
- atajos configurables;
- revisión definitiva de almacenamiento y backups;
- pruebas automatizadas e instrumentadas;
- identidad visual final;
- iconos y pantallas de lanzamiento definitivas;
- configuración de firma;
- generación de APK y AAB de producción.
- gestión de color avanzada;
- documentos de mayor profundidad;
- motor gráfico especializado;
- sincronización opcional;
- formatos profesionales adicionales;
- pinceles importables;
- reglas y perspectiva avanzada;
- historial visual y snapshots.
La hoja de ruta no garantiza fechas ni que todas las funciones se implementen con el mismo alcance.
| Documento | Contenido |
|---|---|
docs/FEATURE_MATRIX.md |
Estado funcional por área |
docs/PHASE_3B_SPARSE_RENDERER.md |
Renderer disperso y tiles |
docs/PHASE_4_TEST_BUILD.md |
Alcance de la primera build de fase 4 |
docs/PHASE_4_1.md |
Grupos, máscaras y perspectiva editable |
docs/PERFORMANCE_HOTFIX_1.5.1.md |
Primer hotfix de rendimiento |
docs/PERFORMANCE_HOTFIX_1.5.2.md |
Procesamiento de pinceles texturizados |
docs/CRASH_HOTFIX_1.5.3.md |
Corrección del cierre por desbordamiento |
docs/TEST_CHECKLIST.md |
Pruebas manuales recomendadas |
docs/TEST_AUTOMATION.md |
Automatización ADB, alcance y límites actuales |
docs/CHANGELOG.md |
Evolución de versiones |
Al extender el proyecto:
- mantener el guardado local y compatible hacia atrás;
- no realizar lectura de disco dentro de la ruta crítica de un frame;
- no comprimir PNG mientras se mantiene el bloqueo principal de dibujo;
- acotar tamaños, capacidades y conversiones numéricas;
- evitar usar valores centinela como
Int.MAX_VALUEen cálculos de índices; - reciclar bitmaps temporales cuando ya no se utilicen;
- preservar la separación entre UI Compose y motor raster;
- agregar una migración explícita al cambiar el formato de documento;
- mantener controles visibles funcionales;
- probar cada cambio con pinceles texturizados y S Pen;
- no modificar el
applicationIdsi se requiere conservar instalaciones existentes.
MAJOR: cambio incompatible de producto o formato.MINOR: nueva capacidad funcional compatible.PATCH: corrección de errores o rendimiento sin cambiar el flujo principal.
El formato del documento debe versionarse de manera independiente dentro de project.properties.
Este repositorio no incluye actualmente un archivo LICENSE.
Mientras no se añada una licencia explícita, no debe asumirse permiso automático para redistribuir, publicar, sublicenciar o reutilizar el código fuera de los términos definidos por su propietario.
Antes de abrir el proyecto a contribuciones o distribuirlo públicamente, se recomienda escoger y añadir una licencia adecuada, además de documentar:
- autoría y titularidad;
- uso comercial permitido o restringido;
- tratamiento de contribuciones;
- licencias de iconos y recursos visuales;
- compatibilidad de dependencias;
- política de privacidad para una eventual publicación.
Canvas Studio busca convertirse en un editor de ilustración Android serio, local y optimizado para tablets, construido de manera incremental sobre una base raster auditable y compatible con documentos grandes.


