22 Commits

Author SHA1 Message Date
Igor Zinken
3f94cc548b Address issues when filling or stroking out-of-visual-bounds Selections (#99)
When zooming in and panning the Viewport while a Selection is active, if a bucket fill or stroke operation is used, only the visible area of the Selection is filled.

This should be updated to fill the full area, even the out of visual bounds area.

This changeset also fixes an issue where stroke width would be applied differently at different zoom levels.
2026-05-01 21:33:03 +02:00
Igor Zinken
abc5c7f1a3 When dragging a Layer with an active Selection, the Selection content should be cut and dragged as a new Layer (#94)
When the DRAG tool is active while there is an active selection, when dragging starts, the contents of the selection should be cut from the currently active Layer and be pasted as a new Layer, which will continue the drag.
2026-04-22 18:24:07 +02:00
Igor Zinken
b205a553d9 Restructure document model, factories and actions (#93)
Split `definitions/document.ts` into unique files per actor type.
Create `model` folder to store the above types, their factories and the state changing actions.
2026-04-19 20:34:06 +02:00
Igor Zinken
40b66bb21f Rebuild all thumbnails when toggling the thumbnail display on 2026-03-28 15:07:14 +01:00
Igor Zinken
8acf7f4730 Add Document properties edit window 2026-03-27 21:34:59 +01:00
Igor Zinken
3999c018e9 Unified crisp pixel rendering across rendering pipelines 2026-03-27 18:12:28 +01:00
Igor Zinken
baa00dc644 Add timeline mode for animation support (#83)
### Motivation

In order to be more useful as a spritesheet editor, BitMappery now contains a timeline view, a mode where content can be sub grouped into tiles, where each subsequent tile can be traced over the previous one. Each tile can have multiple layers of content for ease of editing.

### Changes

 * Introduced Document types `default` and `timeline`
 * Introduced LayerRef types (allow grouping Layers)
 * Introduced Timeline view for tile based drawing and tracing
 * Introduced Document background color (omits need to create background layer for each tile in a timeline)
 * Cleaned up some legacy overrides made superfluous by newer dependencies
 * Added document presets to document creation flow

### Commits

* Add rel to Layer structure
* Add Document type
* Initial scaffold for timeline view.
* Added initial utility to manage timelines
* Added action to clone all Layers in a tile group
* Moved Layer cloning to layer-util
* Converted zoom tool option panel to TypeScript
* Added action to add a new tile and layer to the Document
* Added action to remove a tile and its layers from the Document
* Added Layer grouping property to Document structure
* Update type check for test
* Initial timeline panel outline
* Created tiles now match Document dimensions
* Added tile cache
* Allow showing a semi transparent carbon copy trace of the previous tile
* Add animation preview window
* Add fps control to animation preview
* Store metadata property inside Documents (allows storing timeline framerate)
* Optimise mobile view for timeline
* Keep thumbnail ratios when previewing tiles and animations
* Button and animation preview window styling
* use RAF-based animation timing in animation preview
* Changes made to layer content now trigger a re-render of the Group tile
* Update Layer reordering logic to also work with subsets
* Optimised animated GIF export, updated pixel art definitions to be more sensible
* Code cleanups
* Added background color to Documents, omitting the need for a background layer on each animation tile
* Removing temp code, updating renderer factory test
* Update layer styling, added tooltip on drag behaviour
* Added document DPI and size unit to meta data
* Refactored deprecated event property from modal key handler
* Remove unused properties from animation preview window
* Update unit test for renderer factory
* Fix bug where closing modals would trigger click on canvas
* Add presets for all Document types
* Added setting to automatically choose appropriate anti-alias setting
* Invalidate tile and thumbnail caches on resize and crop functions. Adjust spritesheet export behaviour
2026-03-26 18:47:05 +01:00
Igor Zinken
712c7abd71 Add layer preview thumbnails to layers panel (#84)
### Motivation

It'd be great if we could see a small thumbnail preview in the layers panel to more easily distinguish between layers visually.

In this changeset we introduce the thumbnail cache. When enabled, each layer is represented by a thumbnail which can be requested from multiple subscribed consumers (currently only the layer panel).

Thumbnail updates are deferred to keep CPU usage low and performance high.
2026-03-21 14:57:28 +01:00
Igor Zinken
bca9aa9145 When erasing content from a drawable layer, underlying layers are now preserved correctly during draw 2025-04-06 09:26:34 +02:00
Igor Zinken
d64ec1ae3e Refactor Layer effects and introduce duotone filter (#64)
* Added Duotone filter to effects
* Renamed Effects actor to Transform
2025-04-04 20:55:34 +02:00
Igor Zinken
e8eb11fd06 Improve performance of dragging Masks on blended, effected Layers 2025-04-02 21:26:28 +02:00
Igor Zinken
b765404704 Update to clipping context while drawing 2025-03-16 12:17:59 +01:00
Igor Zinken
dbafae9984 Clip brush lines while drawing on an offset or transformed Layer 2025-03-16 12:14:31 +01:00
Igor Zinken
630ba35b40 Restructure and rename actor/renderers (#57)
* Restructure and rename actor/renderers
* Rename cache flushing functions to reflect their scope
* Move canvas instance management to dedicated service
* Type resize-canvas-window Vue file
2025-03-16 11:32:42 +01:00
Igor Zinken
5b79291faf Moving some functions out of class instances to more logical utilities 2025-03-16 07:18:18 +01:00
Igor Zinken
cc2ace1719 Restructure test mocks 2025-03-15 22:09:07 +01:00
Igor Zinken
e39317e47a Fix issue where eyedropper tool would lose accuracy on HDPI screens 2025-03-15 22:04:27 +01:00
Igor Zinken
9d2e89bde1 Create blended layer cache minimising rendering overhead on Documents with blended content (#55)
* Create cache for blended layers to speed up rendering on Documents with blended content
* Manage blend mode caching state through layer changes in Document canvas
* Comments updated
* Moving files around
* Omit invisible layers in snapshot rendering
* Add pausing to blend layer cache
* Cleanups and tests for LayerSprite
* Remove logs
* Use actual LayerSprite in test
* Simplify pending check
* Omit flush calls on (un)pausing of cache
* Extend tests for LayerSprite
* Update modifier key tooltip
* Create reusable function for invalidating blend cache
* Updated tests
* Allow partial cache flushes
* Ensure blended layer cache is flushed appropriately on undo
* Pause blend caching while rotating or scaling
* Fix for Safari rendering issues
2025-03-14 22:54:25 +01:00
Igor Zinken
3e3570021f Add strict type checks to unit tests (#48)
* Add strict type checks to unit tests
2025-02-15 14:14:48 +01:00
Igor Zinken
ee6dd0b556 Migrated all unit tests to TypeScript 2023-03-23 21:24:56 +01:00
Igor Zinken
1f74f36eed Migrate build from Webpack to Vite 2023-03-19 11:49:18 +01:00
Igor Zinken
f80e623348 Improved brushing performance on zoomed in documents 2021-01-18 18:08:04 +01:00