The v0.6.0
Release primarily targets adding support for SmartObject layers and warps. Additionally, we refactored large parts of the internal and public API.
To check out how to use SmartObjects please have a look here for an example, here for the documentation (c++) and here for the documentation (python)
Warning
This is a breaking release, please proceed with caution and read both the changelogs and documentation carefully as large parts of the API were overhauled.
Features:
- Add support for SmartObject layers
SmartObjectLayer<T>
,psapi.SmartObjectLayer_*bit
- add support for SmartObject warps (Exceptions being "smart" perspective warp and puppet warp)
Python
- Expose all mask parameters that were previously hidden. This includes
mask_disabled
,mask_relative_to_layer
,mask_default_color
,mask_density
,mask_feather
,mask_position
,mask_width
andmask_height
Bugfixes:
- Masks on layers now are better supported and have their width and height decoupled from the layers' width and height (except for during construction of image layers).
- Internal: Harden file section write to be less error prone using scoped section markers
C++
- Harden template requirements to only allow
uint8_t
,uint16_t
,float
for all Photoshop related templates
Python
- Add missing
is_visible
andis_locked
arguments to constructor of layers
Breaking Changes:
- Layer coordinates are no longer expressed relative to the canvas center but rather relative to canvas top left to be more in line with photoshop
- Example: if previously for a 64x64 canvas a centered layer was at (0, 0), now it would be at (32, 32)
- Layer opacity is now expressed as a float (but still backed by a
uint8_t
C++
- Drop C++17 support
- Public facing API was changed from
camelCase
tosnake_case
to be more in line and equal to python bindings - All previously public member variables are now private with appropriate getters and setters to allow the API to implement more logic on them in the future
Python
- All image data is no longer expressed as a property but instead as method as these are potentially quite expensive to compute
ImageLayer_*bit.channels
property is nowImageLayer_*bit.channel_indices()
Miscellaneous:
- Add Compositing Framework to prepare for eventual layer stack compositing
- Internal: Add basic 2D rendering framework
- Internal: Add Geometry Framework to allow for parsing of Quad Meshes and Bezier Surfaces
- Internal: Add Parsing of Descriptors
- Internal: Simplify endian functions to work more generically
- Refactor large parts of the internal API.
- Refactor inheritance structure of Image Based layers and extract mask logic to mixin
Dependencies:
- Add
OpenImageIO
as dependency (via vcpkg) - Add
fmt
as dependency (via vcpkg) - Add
stduiid
as dependency (via vcpkg) - Add
eigen3
as dependency (via vcpkg) - Add
json
as a submodule - Move
libdeflate
from submodule to vcpkg - Add
vcpkg
submodule - Bump c-blosc2 to 2.15.2
Documentation
- Link in examples directly to hosted docs for easier access
CI:
- Add Clang ubuntu build target
- Add ASAN to all tests (that support it)
- Add Clang ubuntu valgrind target