In ClipStudio and Firealpaca/Medibang, it’s possible to create layers that have only one single color. These work similar to Krita’s fill layers, except they start blank like a normal paint layer. Their main purpose is to be used with artists’ workflows that make use of dozens of flat-color or single-color layers, as opposed to those that prefer to paint everything with fewer layers.
ClipStudio also has a separate fill layer like Krita’s. Unlike Krita’s, ClipStudio’s fill layer comes with a mask that you can delete completely.
After trying to use fill layers in Krita, I’ve come to the conclusion that they’re really poorly optimized compared to normal paint layers, which is ironic considering that using a 32bit layer to draw in a single color is what should be the poorly optimized choice here.
The main problem is that fill layers have a built-in 8 bit mask that begins opaque and fills the entire layer. It’s not possible to delete the mask, which means Krita ALWAYS uses the mask when filling, always stores it in memory, and always saves it to disk. If you could delete the mask to mean “fill EVERYTHING with a color, unmaskedly,” performance could be improved when a fill layer is placed on top of a drawing with “inherit alpha” enabled. You wouldn’t need a mask in this case because it’s supposed to fill over the alpha you already drew, so Krita wouldn’t need to create a temporary image the size of the entire canvas with the fill applied before blending it on the layer stack.
With normal paint layers, Krita seems to be optimized to “clip” the layer to non-transparent pixels. If you drew one tiny red circle in a huge canvas, most of the layer is transparent, so Krita doesn’t store, save, or tries to render the transparent pixels. It treats the layer as a small image placed at a position on a huge canvas rather than a huge image that’s mostly transparent but covers the entire canvas. This doesn’t seem to be the case with fill layers for some reason. I assume it’s because the mask is internally grayscale, and black isn’t clipped like alpha is. I drew a tiny dot on a 1000x1000px layer on a normal layer. The memory usage meter says 128KiB. I click select → select from opaque → replace, create a fill layer, same color, it looks literally the same thing, and I delete the normal layer. The memory usage meter says 4.2MiB now. It doesn’t make sense for something 1/4th of the color channels take 40 times the memory. In fact, 4MiB means 1 megapixel (1000x1000) times 4 color channels, which means Krita just created a canvas-sized full-color buffer from the tiny dot to render it. There’s nothing optimized here at all.
I don’t know if Krita compresses a normal paint layer that happens to be single-color paint for storage. It doesn’t matter much, though, because the main reason artists use such 8bit paint layers is because you don’t have to remember what color the layer you’re painting on is supposed to be. If you draw black on a skin layer, it draws the skin color, on the hair layer, it draws the hair color, and so on, and you can easily change the colors without having to lock alpha, and it avoid situations such as having the skin color selected and accidentally drawing with that color in the hair layer, because with 8 bit it would draw the hair color and you’d realized you made a mistake right away.
For reference, this sort of workflow ends up looking like this (in Japanese: one layer for skin, one for skin shadow, etc., all set to 1bit depth and colorized with a separate setting. The black spots over the drawing is saying you just draw with black and it changes color automatically.): https://pbs.twimg.com/media/D0JagqAVAAA2zKt.jpg
The fact Krita lacks support for such workflow is unfortunate, but more unfortunate is the fact that fill layers can’t seem to even fill an area with a single color better than a normal paint layer. And before 5.0 they were a hassle to just set a color for. They probably only make sense with patterns or something more complex at this point in time.