AW: [squeak-dev] The Trunk: Graphics-mt.152.mcz
marcel.taeumel at student.hpi.uni-potsdam.de
Tue Nov 16 13:10:05 UTC 2010
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.
Von: squeak-dev-bounces at lists.squeakfoundation.org
[mailto:squeak-dev-bounces at lists.squeakfoundation.org] Im Auftrag von Juan
Gesendet: Dienstag, 16. November 2010 13:50
An: squeak-dev at lists.squeakfoundation.org
Cc: packages at lists.squeakfoundation.org
Betreff: Re: [squeak-dev] The Trunk: Graphics-mt.152.mcz
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?
commits at source.squeak.org 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
> | 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])
> "Set up color map for a different source depth
> "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)
> "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 - www.avg.com
> Version: 9.0.869 / Virus Database: 271.1.1/3259 - Release Date: 11/15/10
More information about the Squeak-dev