[cairo] Color-Tinting a surface with alpha channel

Simon Schneegans code at simonschneegans.de
Thu Dec 24 20:10:14 UTC 2020

Hi Uli,

thank you for the kind reply!
> Could you explain a bit more what exactly you want to achieve? E.g.,
> what should happen when tinting with r=0.5, g=1, b=0, a=0.5 to colors
> such as full red and... basically all the other colors.

I think you understood my issue very well, but I will try to explain it 
with more examples. Here are some example images (the checkerboard 
visualizes the alpha channel). All colors below are given in [r,g,b,a] 
in non-premultiplied form.

  * (a) This is my input image, which I want to colorize. It contains
    two linear gradients, the top from [1, 1, 1, 1] to [1, 1, 1, 0], the
    bottom one from [0, 0, 0, 1] to [0, 0, 0, 0, 0].
  * (b) By colorizing (a) with [1, 0, 0, 1], I want to achieve (b). All
    color components should be multiplied pair-wise; the alpha component
    of the tint-color does not really matter, but would be nice-to-have
    to support this as well.
  * (c) If I use the code I posted earlier (basically first paint input
    image, then paint tint-color with Cairo.Operator.MULTIPLY masked by
    the input image's alpha channel) I get (c). Note how the top
    gradient actually fades to transparent white and the bottom one to
    transparent red.
  * (d) If I paint the tint-color over the entire image and then use
    Cairo.Operator.DEST_IN to restore the input image's alpha channel, I
    get (d). The upper gradient looks good, but the bottom one still fails.
  * (e) If I initialize my surface with [0,0,0,1] before executing the
    code for (d), I get (e). This fixes the bottom gradient but now the
    top one fades to transparent black.

> Do I understand correctly that you want to transform a given (r,g,b,a)
> into (0.5*r, 1*g, 0*b, 0.5*a)? (numbers for my example above)

Exactly that.

> Is the alpha part really needed or could you live with no support for an
> alpha component for the color "to tint with"?
It is not strictly required. The input image has an alpha channel which 
should be preserved if the tint-color is only RGB. However, it would be 
a nice addition if the tint-color could be RGBA as well! In this case a 
tint-alpha of 0.5 would mean that all alpha values of the input image 
are multiplied with 0.5.
> Also, do you know the following page? It explains precisely what each of
> the operators does.
> https://www.cairographics.org/operators/
Yes, I looked into them but failed to figure out a combination which 
could solve my issue.

Does this explain my problem?

Thank you,


-------------- next part --------------
An HTML attachment was scrubbed...
URL: <https://lists.cairographics.org/archives/cairo/attachments/20201224/eabcc6a6/attachment-0001.htm>
-------------- next part --------------
A non-text attachment was scrubbed...
Name: fknjodbniennbolb.jpeg
Type: image/jpeg
Size: 41997 bytes
Desc: not available
URL: <https://lists.cairographics.org/archives/cairo/attachments/20201224/eabcc6a6/attachment-0001.jpeg>

More information about the cairo mailing list