Issue 3228 in pharo: fixed font rendering to support translucent colors

Previous Topic Next Topic
 
classic Classic list List threaded Threaded
1 message Options
Reply | Threaded
Open this post in threaded view
|

Issue 3228 in pharo: fixed font rendering to support translucent colors

pharo
Status: FixedWaitingToBePharoed
Owner: stephane.ducasse
Labels: Type-Squeak

New issue 3228 by stephane.ducasse: fixed font rendering to support  
translucent colors
http://code.google.com/p/pharo/issues/detail?id=3228

To be verified

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:  
backgroundColor)].
                colorMap at: 2 put: (destForm pixelValueFor:  
foregroundColor).
        ]
        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  
#rgbMul."
+                               foregroundColor isTranslucent
+                                       ifFalse: [self combinationRule:  
Form rgbMul].
-                               "rgbMul is equivalent to component alpha  
blend if text is black (only faster, hehe)"
-                               self combinationRule:  
37.               "RGBMul"
                                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  
#displayString:from:to:at:strikeFont:kern:"
                                        "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:  
true]]
                        ifFalse: [
                                self combinationRule:  
25.               "Paint"
                                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
                ]
        ].!