Re: W32: Drawing globally-transparent stuff with cairo

Uli Schlachter <[email protected]>
Newsgroups gmane.comp.lib.cairo
Message-ID <[email protected]>
On 06.04.2014 14:19, LRN wrote:
> On 06.04.2014 13:43, LRN wrote:
>> On 30.03.2014 2:29, LRN wrote:
>>> On 27.03.2014 19:54, LRN wrote:
>>>> I've been trying to somehow hack GTK to have RGBA GdkWindows,
>>>> with mixed results so far (i either get massive alpha
>>>> corruption, or crash pixman inside bitblt).
> 
>>>> Decided to take a step back and see if i can make it work 100%
>>>>  correctly with just GDI & cairo. Turns out, i can't.
> 
>>>> I've attached an example, compile with gcc main.c -o main.exe
>>>> -I/mingw/include/cairo -lcairo -lgdi32 -ldwmapi
> 
>>>> It draws two gradients - one transparent, and one opaque.
>>>> Transparency only works when window is invalidated and
>>>> repainted (such as when it is obscured by another window and
>>>> later shown again).
> 
>>>> The problem is most likely W32-specific, and not directly
>>>> related to cairo, but i simply can't find what is wrong :(
> 
> 
>>> I'd like to thank everyone for the help.
> 
>>> The problem was mostly in W32 display config (glass transparency
>>> not enabled).
> 
>>> I'm now convinced that the rest of my problems are due to a bug
>>> in cairo/pixman.
> 
>>> GTK bug tracking this is:
>>> https://bugzilla.gnome.org/show_bug.cgi?id=727316
> 
> 
> 
>> Traced inaccessible memory to _cairo_image_surface_map_to_image(),
>> which gives pixman a pointer and claims that it points to image
>> data of *width*, *height* with a *stride* - which turns out to be
>> false.
> 
> 
> Tried to clamp width and height of the image that
> _cairo_image_surface_map_to_image() creates (i.e. instead of
> extents->width i tried to give it MIN(other->width - extents->x,
> extents->width), same for height). Cairo stopped crashing, but GTK
> windows are not drawn completely (they are cut on the bottom and on
> the right edge; and since there are still pixels out there, which
> don't get re-drawn, they retain old data, making it obvious that this
> clamping is too strict).
> 
> This led me to believe that cairo misinforming pixman about image size
> is on purpose, and drawing procedures do rely on such behaviour. The
> question is, why this only blows for this particular case, and
> otherwise worked for everyone just fine?
> 
> I couldn't find where to get actual, correct information about true
> extents of the memory area to which images point, and without that
> this kind of correction can't be implemented.

I have no clue about cairo-win32, but you might want to look at these:

https://bugs.freedesktop.org/show_bug.cgi?id=53121
https://bugs.freedesktop.org/page.cgi?id=splinter.html&bug=53121&attachment=85688
http://lists.cairographics.org/archives/cairo/2013-September/024626.html

Uli
-- 
Happiness can't be found -- it finds you.
 - Majic
-- 
cairo mailing list
[email protected]
http://lists.cairographics.org/mailman/listinfo/cairo
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.