Hi Folks,
I found that rule 37 sets alpha to zero if the destination is 32 bit. This affects my antialiased StrikeFonts. The following f1 := Form extent: 8@8 depth: 32. f1 fillColor: (Color r: 1.0 g: 1.0 b: 0.7 alpha: 0.7). f2 := Form extent: 8@8 depth: 32. f2 fillColor: (Color r: 0.5 g: 1.0 b: 0.7 alpha: 0.9). bb :=(BitBlt toForm: f1) sourceForm: f2; combinationRule: 37; copyBits. (f1 colorAt: 2@2) answers Color transparent when it should answer (TranslucentColor r: 0.501 g: 1.0 b: 0.494 alpha: 0.627).
This is related to the stuff I fixed in April, but it is a different bug in a different method, that I didn't find that time: #partitionedMul:with:nBits:nPartitions: ignores the last argument, and acts as if it was always 3.
The fix I propose is as follows:
partitionedMul: word1 with: word2 nBits: nBits nPartitions: nParts "Multiply word1 with word2 as nParts partitions of nBits each. This is useful for packed pixels, or packed colors. Bug in loop version when non-white background"
| sMask product result dMask | sMask := maskTable at: nBits. "partition mask starts at the right" dMask := sMask << nBits. result := (((word1 bitAnd: sMask)+1) * ((word2 bitAnd: sMask)+1) - 1 bitAnd: dMask) >> nBits. "optimized first step" nParts = 1 ifTrue: [ ^result ]. product := (((word1>>nBits bitAnd: sMask)+1) * ((word2>>nBits bitAnd: sMask)+1) - 1 bitAnd: dMask). result := result bitOr: (product bitAnd: dMask). nParts = 2 ifTrue: [ ^result ]. product := (((word1>>(2*nBits) bitAnd: sMask)+1) * ((word2>>(2*nBits) bitAnd: sMask)+1) - 1 bitAnd: dMask). result := result bitOr: (product bitAnd: dMask) << nBits. nParts = 3 ifTrue: [ ^result ]. product := (((word1>>(3*nBits) bitAnd: sMask)+1) * ((word2>>(3*nBits) bitAnd: sMask)+1) - 1 bitAnd: dMask). result := result bitOr: (product bitAnd: dMask) << (2*nBits). ^ result
If you agree, I'll add an issue to Mantis with the proposed fix.
Cheers, Juan Vuletich