Bug 432967 - 4.4.2 onwards: Flatten Layer does not work on animated layers
Summary: 4.4.2 onwards: Flatten Layer does not work on animated layers
Status: RESOLVED INTENTIONAL
Alias: None
Product: krita
Classification: Applications
Component: Animation (show other bugs)
Version: nightly build (please specify the git hash!)
Platform: Debian stable Linux
: NOR normal
Target Milestone: ---
Assignee: Krita Bugs
URL:
Keywords: regression, release_blocker
Depends on:
Blocks:
 
Reported: 2021-02-15 11:54 UTC by Ahab Greybeard
Modified: 2021-02-22 18:43 UTC (History)
3 users (show)

See Also:
Latest Commit:
Version Fixed In:
Sentry Crash Report:


Attachments
Simple test file (471.74 KB, application/zip)
2021-02-15 14:49 UTC, Tiar
Details

Note You need to log in before you can comment on or make changes to this bug.
Description Ahab Greybeard 2021-02-15 11:54:33 UTC
SUMMARY
This is seen in the 4.4.2 appinage and the latest Feb 14 4.4.3-alpha (git 212236c) and 5.0.0-prealpha (git 5d76047).
The 4.4.1 and previous appimages do not have this behaviour.

An animated layer can not be 'de-animated' by using Flatten Layer.

STEPS TO REPRODUCE
1. Create a new image, make a transparent layer animated with content.
2. In the Layers docker, do Flatten layer on that animated layer.
3. In the Edit menu, look at the Undo action.

OBSERVED RESULT
2. The layer is not converted to a static paint layer.
3. The Undo item is 'Undo Convert to a Paint Layer'.

EXPECTED RESULT
2. The animated layer should be converted to a paint layer with whatever content was on the selected frame of the animation.

SOFTWARE/OS VERSIONS
Krita

 Version: 5.0.0-prealpha (git 5d76047)
 Languages: en_GB, en, en, en_GB, en
 Hidpi: false

Qt

  Version (compiled): 5.12.9
  Version (loaded): 5.12.9

OS Information

  Build ABI: x86_64-little_endian-lp64
  Build CPU: x86_64
  CPU: x86_64
  Kernel Type: linux
  Kernel Version: 4.19.0-13-amd64
  Pretty Productname: Debian GNU/Linux 10 (buster)
  Product Type: debian
  Product Version: 10
  Desktop: MATE

OpenGL Info
 
  Vendor:  "NVIDIA Corporation" 
  Renderer:  "GeForce GTX 750 Ti/PCIe/SSE2" 
  Version:  "4.6.0 NVIDIA 450.80.02" 
  Shading language:  "4.60 NVIDIA" 
  Requested format:  QSurfaceFormat(version 3.0, options QFlags<QSurfaceFormat::FormatOption>(DeprecatedFunctions), depthBufferSize 24, redBufferSize 8, greenBufferSize 8, blueBufferSize 8, alphaBufferSize 8, stencilBufferSize 8, samples -1, swapBehavior QSurfaceFormat::DoubleBuffer, swapInterval 0, colorSpace QSurfaceFormat::DefaultColorSpace, profile  QSurfaceFormat::CompatibilityProfile) 
  Current format:    QSurfaceFormat(version 4.6, options QFlags<QSurfaceFormat::FormatOption>(DeprecatedFunctions), depthBufferSize 24, redBufferSize 8, greenBufferSize 8, blueBufferSize 8, alphaBufferSize 8, stencilBufferSize 8, samples -1, swapBehavior QSurfaceFormat::DoubleBuffer, swapInterval 0, colorSpace QSurfaceFormat::DefaultColorSpace, profile  QSurfaceFormat::CompatibilityProfile) 
     Version: 4.6
     Supports deprecated functions true 
     is OpenGL ES: false 

QPA OpenGL Detection Info 
  supportsDesktopGL: true 
  supportsOpenGLES: true 
  isQtPreferOpenGLES: false
Comment 1 Tiar 2021-02-15 14:49:38 UTC
Created attachment 135700 [details]
Simple test file

I'm not sure about this.

Before 4.4.2, the behaviour was as follows:
- if the layer has a mask, flattening will merge the masks into the layer, but won't deanimate it.
- if the layer doesn't have a mask, flattening will make it into a static layer.

And now the behaviour is:
- flattening will merge the masks into the layer (if there are any) without deanimating it.

So now it looks more consistent.

However in my opinion, the context menu is confusing anyway. The user doesn't know without making the action what would be the result. The "Merge layer..." doesn't work with just a layer and its masks anymore (I think it worked at some point...), so it cannot be used for this.

Please note that it's important for animation creators (or at least beginners?) to be able to merge a layer with its masks without deanimating it. This is the only way to apply a filter or "move a whole animation" (multiple frames instead of just one). Especially in case of transform mask, it's easier to paint when it's merged. Right now it can be only done with "Flatten layer" or if you add an empty layer and merge with it...

So to sum up:
- either the person fixing need to ensure that it won't be deanimating in case when the layer has masks (even though I'm not a fan of contextual behaviour, it should be fine enough here),
- or better, figure out some way to allow the user to choose between those two behaviours and make it clear which one does what?
Comment 2 Ahab Greybeard 2021-02-15 15:21:17 UTC
For 'background context', what happened was:
I accidentally animated the wrong paint layer image by right-click then Duplicate layer.
Then I was unable to undo this action by any means.

In 4.4.1, Flatten Layer will convert it back into a paint layer but the Undo will not, which is also the case going back to 4.3.0.

If you animate a layer by right-click then Create Blank Frame and paint on it, then create another blank frame and paint on it, no amount of Undo will get you back to a clean image.

Is there some kind of 'disconnect' of Undo functionality with animated layers beyond a certain number of animation actions?
Comment 3 Eoin O'Neill 2021-02-22 18:43:18 UTC
We've talked about this during the meeting and the verdict is that this is the desired behavior. Flattening a layer should not result in any data loss, including animated content. 

If you really need to keep the contents of the layer on a specific animation frame, the appropriate thing to do here would be to copy the contents of the layer using select all > copy, and then paste into a new layer. This will give you just the desired content without any other keyframe data. 

We can revisit the idea of completely removing a channel later, as some of that might be nice to have in the scalar channel at some point.