<html><head><meta http-equiv="content-type" content="text/html; charset=utf-8"></head><body dir="auto"><div style="-webkit-text-size-adjust: auto;">Thanks so much. It works perfectly now. </div><div style="-webkit-text-size-adjust: auto;">May I suggest the following modification in pixman.h so that it is clear for all users ?</div><div style="-webkit-text-size-adjust: auto;"><br></div><div><p class="MsoNormal" style="margin: 0cm 0cm 0.0001pt;"><span lang="EN-US" style="-webkit-text-size-adjust: auto; background-color: rgba(255, 255, 255, 0);"><i>/*<o:p></o:p></i></span></p><p class="MsoNormal" style="margin: 0cm 0cm 0.0001pt;"><span lang="EN-US" style="-webkit-text-size-adjust: auto; background-color: rgba(255, 255, 255, 0);"><i>* Important note: pixman colors are alpha-premultiplied<o:p></o:p></i></span></p><p class="MsoNormal" style="margin: 0cm 0cm 0.0001pt;"><span lang="EN-US" style="-webkit-text-size-adjust: auto; background-color: rgba(255, 255, 255, 0);"><i>* and must conform: red <= alpha ; green <= alpha ; blue <= alpha<o:p></o:p></i></span></p><p class="MsoNormal" style="margin: 0cm 0cm 0.0001pt;"><span lang="EN-US" style="-webkit-text-size-adjust: auto; background-color: rgba(255, 255, 255, 0);"><i>* So that for instance pure white with 0x80 alpha should<o:p></o:p></i></span></p><p class="MsoNormal" style="margin: 0cm 0cm 0.0001pt;"><span lang="EN-US" style="-webkit-text-size-adjust: auto; background-color: rgba(255, 255, 255, 0);"><i> * be r=0x80, g=0x80, b=0x80, a=0x80<o:p></o:p></i></span></p><p class="MsoNormal" style="margin: 0cm 0cm 0.0001pt;"><span lang="EN-US" style="-webkit-text-size-adjust: auto; background-color: rgba(255, 255, 255, 0);"><i>*/</i><o:p></o:p></span></p><p class="MsoNormal" style="margin: 0cm 0cm 0.0001pt;"><span lang="EN-US" style="-webkit-text-size-adjust: auto; background-color: rgba(255, 255, 255, 0);">struct pixman_color<o:p></o:p></span></p><p class="MsoNormal" style="margin: 0cm 0cm 0.0001pt;"><span lang="EN-US" style="-webkit-text-size-adjust: auto; background-color: rgba(255, 255, 255, 0);">{<o:p></o:p></span></p><p class="MsoNormal" style="margin: 0cm 0cm 0.0001pt;"><span lang="EN-US" style="-webkit-text-size-adjust: auto; background-color: rgba(255, 255, 255, 0);">    uint16_t          red;<o:p></o:p></span></p><p class="MsoNormal" style="margin: 0cm 0cm 0.0001pt;"><span style="-webkit-text-size-adjust: auto; background-color: rgba(255, 255, 255, 0);"><span lang="EN-US">    </span>uint16_t    green;<o:p></o:p></span></p><p class="MsoNormal" style="margin: 0cm 0cm 0.0001pt;"><span style="-webkit-text-size-adjust: auto; background-color: rgba(255, 255, 255, 0);">    uint16_t    blue;<o:p></o:p></span></p><p class="MsoNormal" style="margin: 0cm 0cm 0.0001pt;"><span style="-webkit-text-size-adjust: auto; background-color: rgba(255, 255, 255, 0);">    uint16_t    alpha;<o:p></o:p></span></p><p class="MsoNormal" style="margin: 0cm 0cm 0.0001pt;"><span style="-webkit-text-size-adjust: auto; background-color: rgba(255, 255, 255, 0);">};</span></p><br><span style="-webkit-text-size-adjust: auto;">Thanks</span></div><div style="-webkit-text-size-adjust: auto;"><br>Le 12 juin 2014 à 17:01, <a href="mailto:soren.sandmann@gmail.com">soren.sandmann@gmail.com</a> (Søren Sandmann) a écrit :<br><br></div><blockquote type="cite" style="-webkit-text-size-adjust: auto;"><div><span>Eric Nicolas <<a href="mailto:erik.nicolas@gmail.com">erik.nicolas@gmail.com</a>> writes:</span><br><span></span><br><blockquote type="cite"><span>Hello, Thanks for your answer.</span><br></blockquote><blockquote type="cite"><span></span><br></blockquote><blockquote type="cite"><span>Below is a small test program (works on little endian machines).</span><br></blockquote><blockquote type="cite"><span></span><br></blockquote><blockquote type="cite"><span>As is the result is already strange to me :</span><br></blockquote><blockquote type="cite"><span>     in: r=20 g=20 b=80 a=FF</span><br></blockquote><blockquote type="cite"><span>     out: r=90 g=90 b=C0 a=FF</span><br></blockquote><blockquote type="cite"><span>Where as I expected the fill color #FFFFFFFF x the mask 0x80 = #FFFFFF80</span><br></blockquote><blockquote type="cite"><span>and so an output of #9090FFFF.</span><br></blockquote><blockquote type="cite"><span></span><br></blockquote><blockquote type="cite"><span>However, if I set the fill color to #FFFFFF80, the result seems really</span><br></blockquote><blockquote type="cite"><span>wrong :</span><br></blockquote><blockquote type="cite"><span>in: r=20 g=20 b=80 a=FF</span><br></blockquote><blockquote type="cite"><span>out: r=98 g=98 b=E0 a=FF</span><br></blockquote><blockquote type="cite"><span></span><br></blockquote><blockquote type="cite"><span>I would expect fill x mask => #FFFFFF40 and thus out: #606060C0FF.</span><br></blockquote><blockquote type="cite"><span></span><br></blockquote><blockquote type="cite"><span>I especially do not understand how a lower alpha input color can end up in</span><br></blockquote><blockquote type="cite"><span>a lighter output on the target image.</span><br></blockquote><blockquote type="cite"><span></span><br></blockquote><blockquote type="cite"><span>What I am doing wrong here ?</span><br></blockquote><span></span><br><span>The thing you are missing is that Pixman works with premultiplied</span><br><span>alpha. That is, if the rgb values are R, G, and B, and the alpha value</span><br><span>is A, then pixman will assume that pixels are stored as</span><br><span></span><br><span>   R * A, G * A, B * A, A</span><br><span></span><br><span>and it will also generate pixels in this format. The reason for doing</span><br><span>this is that it avoids divisions when compositing.</span><br><span></span><br><span>When you set the fill value to 0xffffff80 pixman will interprete it as </span><br><span></span><br><span>     (1.0 / 0.5), (1.0 / 0.5), (1.0 / 0.5), 0.5</span><br><span></span><br><span>   = (2, 2, 2, 0.5)</span><br><span></span><br><span>ie., you get out-of-range color values, which is why the result will be</span><br><span>lighter. Normally, the alpha value in premultiplied pixels should not be</span><br><span>bigger than the color values, though it can occasionally be useful.</span><br><span></span><br><span>Premultiplied alpha also means that when applying an alpha mask, it must</span><br><span>be applied to all four channels, so in this case you get</span><br><span></span><br><span>   0xffffff80 x 0x80 = 0x80808040</span><br><span></span><br><span>when applying the mask.</span><br><span></span><br><span></span><br><span>Søren</span><br></div></blockquote></body></html>