There are several problems and one good solution. The problems are:
The result of certain filters is different if the image is scaled (to a different canvas size in pixels) before applying the filter than after applying the filter. Scaling should be an intermediate step in non-destructive editing, due to all the advantages of non-destructive editing.
Some modern filters have two images as input. These images don’t necessarily have the same size in pixels. Examples of such filters are:
- Many variants of artistic style transfer
- Color transfer
- Certain variants of image-to-image translation
- and so on.
So if a “stack” of layers can have only one canvas size in pixels, we need several stacks that can cross-talk (all layers forming a directed acyclic graph or even a more general graph for recursion/fractals). The several stacks can be either all within one file, or each in a separate file but still with cross-talk. Here’s an example:
One of the possibilities to implement the cross-talk is through layers that send and receive image data. The above graph would then look like this in the layers list:
Stack 300x300: Filter layer Rescale (receiver layer) Stack 500x500: Sender layer for rescale Multi-image filter 2 (receiver layer) Sender layer A for multi-image filter 2 Filter layer Multi-image filter 1 (receiver layer) Sender layer A for multi-image filter 1 Filter layer Sender layer B for multi-image filter 2 File layer Stack 200x200: Sender layer B for multi-image filter 1 Filter layer File layer
Important note: The philosophy here is based on the advantages of non-destructive editing.