<div id="geary-body" dir="auto"><div>Hi there!</div><div><br></div><div>I searched the internet and played around some more but didn't come any closer to a solution. Is it possible to separate / combine RGBA channels in cairo? This would help as well! Something like cairo_mask() but not only for the alpha channel but for all RGBA channels. I also stumbled upon this sentence:</div><div><br></div><div><pre>I believe Cairo can do non-premultiplied, by setting the source pattern 
and the mask to the same image, then doing a copy operation. So you 
actually have both anyway.</pre></div><div>(<a href="https://lists.cairographics.org/archives/cairo/2005-September/005355.html">https://lists.cairographics.org/archives/cairo/2005-September/005355.html</a>)</div><div><br></div><div>Which I do not really understand - might this help solve the problem?</div><div><br></div><div>If not, it's really a pity that such a thing seems to be impossible with cairo as there are no alternative (image processing) libraries available for me in GJS. And looping through the pixels is not an option as it's too slow in GJS.</div><div><br></div><div>If anybody has another idea how this could be approached, I would be very grateful!</div><div><br></div><div>Regards,</div><div>Simon</div></div><div id="geary-quote" dir="auto"><br>On Sa, Dez 26, 2020 at 09:09, Uli Schlachter <psychon@znc.in> wrote:<br><blockquote type="cite"><div class="plaintext" style="white-space: pre-wrap;">Hi,

Am 25.12.20 um 21:09 schrieb Simon Schneegans:
<blockquote> But I am afraid your method does not yet accomplish my goal.
</blockquote>[...]
<blockquote> But if you replace the checkerboard with a white
 background you receive this image:
</blockquote>[...]
<blockquote> If you use e.g. Gimp to look at the color channels you see that there is
 a darkening in the red channel which shouldn't be there:
</blockquote>[...]

well... [/me investigates for a moment]... my copy_with_content()
function does not actually do what it is supposed to do. Copying the
original ARGB32 surface to an RGB24 surface behaves "as if" the ARGB32
surface is drawn on a black background. Put differently, this just
copies out the pre-multiplied pixel values, but we want/need the
unmultiplied pixel values. Something needs to divide the color
components by the alpha value for this approach to work.

A first idea would be to fill the color-components surface with white
and then drawing the ARGB32 to_tint-surface with OVER. That makes the
red gradient work (it ends up as all-white in the color-components
surface), but of course it breaks the black gradient, because that one
now also gets some white "mixed in" which is then tinted red.

Hm... division by the alpha value is needed. Looking through the list
over compositing operators, OVER, DEST_OVER, XOR, SATURATE, and the
blend modes contain division by the alpha value, but all of these
multiply with the alpha value first. Thus, that cannot do what we need here.

I think my approach cannot work correctly, sorry. :-(

Cheers,
Uli
<div>-- 
</div>This can be a, a little complicated. Listen, my advice is... ask
somebody else for advice, at least someone who's... got more experience
at...  giving advice.
</div></blockquote></div>