<div dir="ltr"><div><div><div><div><div><div><div><div>Thank you Benjamin,<br><br></div>This makes sense then, I understand it now.<br></div><div>Thanks for explaining.</div><div><br></div>I must say that PNG then makes for a very poor choice of writing to by Cairo.<br></div>In Python at least, there seems to be no alternative to PNG.<br><br>['__class__', '__delattr__', '__doc__', '__format__', '__getattribute__', '__hash__', '__init__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', 'copy_page', 'create_similar', 'finish', 'flush', 'get_content', 'get_device_offset', 'get_fallback_resolution', 'get_font_options', 'mark_dirty', 'mark_dirty_rectangle', 'set_device_offset', 'set_fallback_resolution', 'show_page', 'write_to_png']<br><br></div>PNG is (by spec) never pre-multiplied.<br></div>Cairo works with pre-multiplied alpha.<br><br></div>So it is impossible to generate colour with zero alpha.<br><br></div>And because OpenGL's linear filtering will sample RGB channels of 100% transparent texels, you will always get black for those, despite that they are invisible due to zero alpha.<br></div><div>TIFF seems a better target for exports then, as it supports pre-multiplied alpha.<br></div><div><br></div>  Bram<br><br><div><br><div><div><div><div><br></div></div></div></div></div></div><div class="gmail_extra"><br><div class="gmail_quote">On Sun, Aug 27, 2017 at 3:41 AM, Benjamin Berg <span dir="ltr"><<a href="mailto:benjamin@sipsolutions.net" target="_blank">benjamin@sipsolutions.net</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">Hi,<br>
<span class=""><br>
On Sat, 2017-08-26 at 17:55 -0700, Bram Stolk wrote:<br>
> Cairo is treating colours with alpha=zero incorrectly.<br>
> If alpha is zero, the red green and blue channels are zeroed by cairo, even<br>
> if they contain non zero r/g/b values.<br>
<br>
</span>Please remember that pixman stores the data premultiplied. Because of<br>
this it should be the expected behaviour that the 1,1,1,0 colour from<br>
the left half of the image becomes 0,0,0,0 (even if you did set the<br>
operator to CAIRO_OPERATOR_SOURCE so that the paint is not a no-op).<br>
<br>
See also the documentation on CAIRO_FORMAT_ARGB32 in<br>
 <a href="https://cairographics.org/manual/cairo-Image-Surfaces.html#cairo-format-t" rel="noreferrer" target="_blank">https://cairographics.org/<wbr>manual/cairo-Image-Surfaces.<wbr>html#cairo-format-t</a><br>
<br>
Regards,<br>
Benjamin<br>
<div class="HOEnZb"><div class="h5"><br>
> To demonstrate this bug, I wrote this python-cairo program that<br>
> creates an<br>
> image with two colours.<br>
> The left half of the image is set to 1,1,1,0.<br>
> The right half of the image is set to 1,1,1,1<br>
><br>
> When cairo writes out the PNG, the left half of the image is<br>
> incorrect.<br>
> The pixels are 0,0,0,0 instead of 1,1,1,0.<br>
><br>
> ---<br>
><br>
> The test program:<br>
><br>
> #! /usr/bin/env python<br>
> import cairo<br>
> from math import pi, sqrt<br>
><br>
> width = 120<br>
> height = 120<br>
> filename = "out"<br>
><br>
> surface = cairo.SVGSurface(filename + '.svg', width, height)<br>
> cr = cairo.Context(surface)<br>
><br>
> cr.scale(width, height)<br>
> cr.set_line_width(0.01)<br>
><br>
> cr.rectangle(0, 0, 0.5, 1)<br>
> cr.set_source_rgba(1, 1, 1, 0/255.0)<br>
> cr.fill()<br>
><br>
> cr.set_source_rgba(1,1,1, 1/255.0)<br>
> cr.rectangle(0.5,0,1,1)<br>
> cr.fill()<br>
><br>
> surface.write_to_png(filename + '.png')<br>
> cr.show_page()<br>
> surface.finish()<br>
><br>
><br>
><br>
</div></div></blockquote></div><br><br clear="all"><br>-- <br><div class="gmail_signature" data-smartmail="gmail_signature"><div dir="ltr"><div>Owner/Director of Game Studio Abraham Stolk Inc.</div><div>Vancouver BC, Canada</div><div><a href="mailto:b.stolk@gmail.com" target="_blank">b.stolk@gmail.com</a></div><div><br></div></div></div>
</div>