[ENH]Translucent images in 8 and 16 bit screen resolution

karl karl.ramberg at chello.se
Sat Dec 16 23:13:58 UTC 2006


Andreas Raab skrev:
> karl wrote:
>> Images with alpha translucency will now keep the translucency in 8 
>> and 16 bit screen resolution. (Rotated forms will not, that has to do 
>> with WarpBlt internals I don't really understand yet.) It would be 
>> nice if people could play with this enhancement and report any issues.
>
> Sorry to say that but the proposed fix is incorrect. Form>>blend (the 
> operator used by #translucentImage:at:) computes the blend of source 
> and destination color using:
>
>    srcAlpha*srcColor + (1-srcAlpha)*dstColor
>
> while rule 34 computes it based on the following formula:
>
>    srcColor + (1-srcAlpha)*dstColor
>
> In other words, rule 34 assumes that the input is premultiplied, i.e., 
> the color components for each pixel are in the range of (0..alpha). 
> The difference can be seen in the following:
>
>     "Go to 32 bpp for the demonstration"
>     Display newDepth: 32.
>     World color: Color red.
>
>     "Create a regular alpha (0-255 saturated) form"
>     formA := Form extent: 200 at 200 depth: 32.
>     formA fillColor: (Color white alpha: 0.5).
>     formA displayAt: 0 at 0. "shows as white"
>
>     "Convert formA to pre-multiplied"
>     formB := Form extent: formA extent depth: 32.
>     formA displayOn: formB at: 0 at 0 rule: Form blend.
>     formB displayAt: 200 at 0. "shows as gray since it's premultiplied"
>
>     "Show the both forms using Form>>blend"
>     formA displayOn: Display at: 0 at 200 rule: Form blend.
>     formB displayOn: Display at: 200 at 200 rule: Form blend.
>
>     "Show the both forms using rule 34"
>     formA displayOn: Display at: 0 at 400 rule: 34.
>     formB displayOn: Display at: 200 at 400 rule: 34.
>
> Notice how Form>>blend is the correct combination rule for blending a 
> 50% white with the red background for the regular form and rule 34 is 
> the correct combination rule for the pre-multiplied blend. But neither 
> is correct for the "other" form. In other words, you can't mix the 
> two; you need to know whether to expect pre-multiplied alpha or not, 
> and #translucentImage:at: does NOT expect pre-multiplied alpha.
>
> The way to fix that is by either converting the input form into 
> pre-multiplied form first (as shown in the above) the cost of which is 
> the obvious memory hit or by writing other custom BitBlt methods just 
> like for rule 34 (only for using the regular Form>>blend operator).
>
> Cheers,
>   - Andreas
>
>
I knew it was to easy ;-)
I'll see if I can manage to hack together a new Form>> blend rule...
Karl



More information about the Squeak-dev mailing list