- Now we have a view::RealRange (with real frames, fr_t) and a
view::VirtualRange (with virtual frames, columns, col_t). The timeline
uses a virtual range internally and makes the conversion to a real
range when it's appropiated (e.g. to execute an old DocRange operation
using ranges with real frames).
- Added Context::range() to access to the real selected range
instead of accessing directly to the timeline. In this way commands
that were using the DocRange can access to the real range using the
context, instead of the timeline's virtual range.
- Added a new ShowTagTimelineAdapter that can show just one tag in the
timeline filtering out/hiding all other frames/tags.
Introduced Key::isListed() and Command::isListed() to customize when a
command should be displayed in the list of shortcuts.
Removed commands:
'Launch'
'OpenBrowser'
And removed unnecessary commands:
'Change Color Mode: Indexed'
'Contract Selection'
'Export Sprite Sheet'
'Flip Canvas Horizontally'
'Frame Properties'
'Load Palette'
'Open Sprite'
'Playback Speed 1x'
'Run Script'
'Save Palette'
'Select Used Colors'
'Set Palette Entry Size'
'Tileset Mode: Auto'
Maintain hierarchical structure of sprite groups instead of flattening.
Allows opacity and blend mode to be applied correctly to groups.
Sets the foundation for future features like mask layers.
Note:
Requires full image rendering and impacts performance in some scenarios.
Avoids complex code changes for minor performance gains.
Co-authored-by: Guilherme Marcondes <guilherme.marcondes@tecnico.ulisboa.pt>
This already fixes a lot of possible problems that can happen when a
script is running and modifying some part of a sprite that is being
backed up in a background thread.
We still need some work to being able to lock a sprite two or more
times in the same thread to write it. E.g. an app.transaction() should
lock the sprite for write access, but the script transaction function
could call a command, and that command could use a ContextWriter to
lock the sprite again. At the moment this is not possible because we
need a re-entrant RWLock implementation.
By default Aseprite will not try to match flipped versions of the
tiles (as it requires more CPU), but when we create a tileset we can
specify which flips can be matched automatically (new
Tileset::matchFlags() property).
These flags are just for the Auto mode, if we manually insert a
flipped tile, that is always supported, even when the matchFlags() are
not specified.
So now we can have access to Skia SkPaint instance directly from
Aseprite UI code (and set the shader, and other properties that are
not yet well-wrapped in laf-os).
We've simplified ui::CheckeredDrawMode with
ui::set_checkered_paint_mode() function, as now the checkered
background shader is stored in ui::Paint (SkPaint) instead of
ui::Graphics state.
Changes:
* Added SeparatorInView() to add separators inside a ListBox or ComboBox.
* Added BlendModeItem() to represent each item in the blending modes
ComboBox.
* Now a ComboBox can contain any kind of widgets as children (not just
ListItem). This is required to add separators in the blending modes
ComboBox.
Feature request:
https://community.aseprite.org/t/additive-blending-feature/121