[Gambas-user] Pb with transparency?

Simonart Dominique simonart.dominique at ...11...
Mon Apr 27 13:05:44 CEST 2009


Benoît Minisini a écrit :
>> Hi,
>>
>> Gambas 2.12 with QT
>>
>> I had a prog that worked well in Gambas 2.11 but now it
>> doesn't work correctly for all the images with transparent
>> areas.
>> Here is a very short illustration of the problem
>>
>> DIM PicSac AS Picture
>> DIM PicCase AS Object[]
>> Dim i AS Integer
>>
>> PicCase.Resize(2)
>> FOR i = 0 TO 1
>>     PicCase[i] = NEW Picture(14, 14, TRUE)
>> NEXT
>> PicCase[0] = Picture.Load(image with some transparent part)
>> PicCase[1] = Picture.Load(image without transparent area)
>>
>> PicSac = NEW Picture(14, 14, TRUE)
>> i = 0
>> Draw.Begin(PicSac)
>> Draw.Picture(PicCase[i], 0, 0, 14, 14, 0, 0, 14, 14)
>> Draw.End
>>
>> PictureBox1.Picture = PicSac
>>
>> i = 0 => nothing displayed
>> i = 1 => correct display
>> (I know that Gambas 2.12 changed the Draw routine)
>> Is it a bug?
>>
>> regards,
>> Dominique Simonart
>>
> 
> I will look at that.
> 
> Beware that the Picture class is not really transparent. It has no alpha 
> channel but a bitmap mask.
> 
> Creating a "transparent" Picture internally creates an X11 pixmap and a X11 
> bitmap mask. Drawing on it the must update both the pixmap and the mask. I 
> think that the mask update is buggy for the Draw.Picture() method.
> 
> Anyway, you should use the Image class and its Draw method to draw an image on 
> top another one with real alpha transparency.
> 
> To add to the complexity, converting an Image to a Picture keeps the alpha 
> information with gb.qt, but not with gb.gtk. This is a Qt feature, that uses 
> the XRender extension for that. But GTK+ don't, and just removes all pixels 
> whose alpha component is lower than 128. But you should not take that into 
> account as it is really toolkit specific.
> 
> Regards,
> 
Thanks Benoit,
I replaced PicCase[] and PicSac by Image and used Draw 
method instead of Draw.Begin(...).
The last instruction is now:
PictureBox1.Picture = PicSac.Picture

Here are the results:
1) i=0 now display correctly the image with transparent part
2) If I use 2 buttons to draw with i=0 (button1) and i=1 
(button2)
*   button1 then button2 display correctly the two images 
successively
* button2 then button1 display only the image without 
transparent part (button1 didn't change the display)
* if I replace Image1 with another image without transparent 
part I could see the images associated with their buttons

In conclusion, as soon as there is a transparent part in my 
image, it could never override another image

Hope this helps
Dominique Simonart







More information about the User mailing list