AW: [squeak-dev] The Trunk: Graphics-mt.152.mcz

Marcel Taeumel marcel.taeumel at
Tue Nov 16 13:19:09 UTC 2010 seems that it actually IS the first place in BitBlt where the
correct combination rule needs to be chosen to render the font.

I will put a fix for this in the inbox.

I did not notice that bug because I needed to avoid that #rgbMul override in
another project, where the correct combination rule was set in another

Sorry for that. =)


-----Ursprüngliche Nachricht-----
Von: squeak-dev-bounces at
[mailto:squeak-dev-bounces at] Im Auftrag von Marcel
Gesendet: Dienstag, 16. November 2010 14:10
An: 'The general-purpose Squeak developers list'
Betreff: AW: [squeak-dev] The Trunk: Graphics-mt.152.mcz


Obviously, using #rgbMul there was kind of an optimization that should
render fonts faster.

Unfortunately nobody seems to use the correct combination rule for font
rendering in the first place, e.g., in the DisplayScanner. With translucent
colors you need #blend (or "Form blend").

I could not find the exactly the point, where the wrong combination rule for
BitBlt was set, but as my fix does not override it with #rgbMul anymore, a
next bugfix should spot the right place where the combination rule is
chosen. It should be in the DisplayScanner. I continue looking for it.

Marcel Taeumel

-----Ursprüngliche Nachricht-----
Von: squeak-dev-bounces at
[mailto:squeak-dev-bounces at] Im Auftrag von Juan
Gesendet: Dienstag, 16. November 2010 13:50
An: squeak-dev at
Cc: packages at
Betreff: Re: [squeak-dev] The Trunk: Graphics-mt.152.mcz

Hi Folks,

Can someone comment on this? I tried

Set desktop color to blue.
Display getCanvas drawString: 'This is a Test' at: 20 at 20 font: TextStyle 
defaultFont color: (Color red alpha: 0.05)

with this code loaded (updated trunk), and I don't think translucent 
colors are working properly... With the old code, translucency was 
ignored, but text was rendered properly. With the new code, translucency 
is also ignored, and the text has an ugly black border...

What's the rationale behind this change? What situations does it fix? 
Maybe a code snippet (or better yet a test) that fails with the old code 
and works ok with this?

Juan Vuletich

commits at wrote:
> Levente Uzonyi uploaded a new version of Graphics to project The Trunk:
> ==================== Summary ====================
> Name: Graphics-mt.152
> Author: mt
> Time: 10 November 2010, 4:14:35.129 pm
> UUID: 04582fa8-3ca1-e440-987a-74483e96950d
> Ancestors: Graphics-dtl.151
> - fixed font rendering to support translucent colors
> =============== Diff against Graphics-dtl.151 ===============
> Item was changed:
>   ----- Method: BitBlt>>installStrikeFont:foregroundColor:backgroundColor:
(in category 'private') -----
>   installStrikeFont: aStrikeFont foregroundColor: foregroundColor
backgroundColor: backgroundColor
>   	| lastSourceDepth targetColor |
>   	sourceForm ifNotNil:[lastSourceDepth := sourceForm depth].
>   	sourceForm := aStrikeFont glyphs.
>   	"Ignore any halftone pattern since we use a color map approach here"
>   	halftoneForm := nil.
>   	sourceY := 0.
>   	height := aStrikeFont height.
>   	sourceForm depth = 1 ifTrue: [
>   		self combinationRule: Form paint.
>   		(colorMap notNil and:[lastSourceDepth = sourceForm depth])
ifFalse: [
>   			"Set up color map for a different source depth
(color font)"
>   			"Uses caching for reasonable efficiency"
>   			colorMap := self cachedFontColormapFrom: sourceForm
depth to: destForm depth.
>   			colorMap at: 1 put: (destForm pixelValueFor:
>   		colorMap at: 2 put: (destForm pixelValueFor:
>   	]
>   	ifFalse: [
>   		(Preferences subPixelRenderFonts and: [ foregroundColor =
Color black or: [ Preferences subPixelRenderColorFonts ]]) ifTrue: [
>   			destForm depth > 8 ifTrue: [
> + 				"Only force #rgbMul if color is not
translucent for better result quality. Alpha values are ignored with
> + 				foregroundColor isTranslucent
> + 					ifFalse: [self combinationRule: Form
> - 				"rgbMul is equivalent to component alpha
blend if text is black (only faster, hehe)"
> - 				self combinationRule: 37.
>   				colorMap := (destForm depth = 32 or: [
(foregroundColor = Color black) not ]) ifTrue: [
>   					"rgbMul / rgbAdd IS component alpha
blend for any color of text (neat trick, eh!!)"
>   					"This colorMap is to be used on the
second pass with rule 20 (rgbAdd)
>   					See
>   					"Note: In 32bpp we always need the
second pass, as the source could have transparent pixels, and we need to add
to the alpha channel"
>   					self colorConvertingMap:
foregroundColor from: sourceForm depth to: destForm depth keepSubPixelAA:
>   			ifFalse: [
>   				self combinationRule: 25.
>   				targetColor := foregroundColor = Color black
ifFalse: [ foregroundColor ].
>   				colorMap := self colorConvertingMap:
targetColor from: sourceForm depth to: destForm depth keepSubPixelAA: true]
>   		]
>   		ifFalse: [
>   			"Do not use rule 34 for 16bpp display. TTCFont uses
it, but it builds a glyphs cache for each color used!!"
>   			self combinationRule: (destForm depth = 32 ifTrue:
[34 "alphaBlendScaled"] ifFalse: [25 "Paint"]).
>   			colorMap := self colorConvertingMap: foregroundColor
from: sourceForm depth to: destForm depth keepSubPixelAA: false
>   		]
>   	].!
> ------------------------------------------------------------------------
> No virus found in this incoming message.
> Checked by AVG - 
> Version: 9.0.869 / Virus Database: 271.1.1/3259 - Release Date: 11/15/10

More information about the Squeak-dev mailing list