Levente Uzonyi uploaded a new version of Graphics to project The Trunk:
http://source.squeak.org/trunk/Graphics-mt.152.mcz ==================== 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: 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 ] ].! |
Hi Folks,
Can someone comment on this? I tried Set desktop color to blue. Display getCanvas drawString: 'This is a Test' at: 20@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? Thanks, Juan Vuletich [hidden email] wrote: > Levente Uzonyi uploaded a new version of Graphics to project The Trunk: > http://source.squeak.org/trunk/Graphics-mt.152.mcz > > ==================== 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: 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 > ] > ].! > > > ------------------------------------------------------------------------ > > > 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 16:34:00 > > |
Hi.
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. Bye, Marcel Taeumel -----Ursprüngliche Nachricht----- Von: [hidden email] [mailto:[hidden email]] Im Auftrag von Juan Vuletich Gesendet: Dienstag, 16. November 2010 13:50 An: [hidden email] Cc: [hidden email] 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@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? Thanks, Juan Vuletich [hidden email] wrote: > Levente Uzonyi uploaded a new version of Graphics to project The Trunk: > http://source.squeak.org/trunk/Graphics-mt.152.mcz > > ==================== 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: > 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]) > "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 > ] > ].! > > > ------------------------------------------------------------------------ > > > 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 > > |
Hmmm...it 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 place. Sorry for that. =) Marcel -----Ursprüngliche Nachricht----- Von: [hidden email] [mailto:[hidden email]] Im Auftrag von Marcel Taeumel Gesendet: Dienstag, 16. November 2010 14:10 An: 'The general-purpose Squeak developers list' Betreff: AW: [squeak-dev] The Trunk: Graphics-mt.152.mcz Hi. 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. Bye, Marcel Taeumel -----Ursprüngliche Nachricht----- Von: [hidden email] [mailto:[hidden email]] Im Auftrag von Juan Vuletich Gesendet: Dienstag, 16. November 2010 13:50 An: [hidden email] Cc: [hidden email] 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@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? Thanks, Juan Vuletich [hidden email] wrote: > Levente Uzonyi uploaded a new version of Graphics to project The Trunk: > http://source.squeak.org/trunk/Graphics-mt.152.mcz > > ==================== 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: > 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]) > "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 > ] > ].! > > > ------------------------------------------------------------------------ > > > 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 > > |
In reply to this post by marcel.taeumel (old)
Hi Marcel,
I see. Then I suggest putting this change on hold until it is complete enough to really fix the issue. WRT the fix itself, I don't thing that DisplayScanner should set combination rules. It should be done in #installStrikeFont:foregroundColor:backgroundColor: . If the color has translucency, you'll need a specific colormap and combination rules. Good luck with it! Cheers, Juan Vuletich Marcel Taeumel wrote: > Hi. > > 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. > > Bye, > Marcel Taeumel > > -----Ursprüngliche Nachricht----- > Von: [hidden email] > [mailto:[hidden email]] Im Auftrag von Juan > Vuletich > Gesendet: Dienstag, 16. November 2010 13:50 > An: [hidden email] > Cc: [hidden email] > 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@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? > > Thanks, > Juan Vuletich > |
So "The Inbox: Graphics-mt.157.mcz" includes that missing detail now.
Both code snippets just work fine then: ('Hello, World' asText addAttribute: (TextColor color: (Color blue alpha: 0.5))) asMorph openInHand Display getCanvas drawString: 'This is a Test' at: 20@20 font: TextStyle defaultFont color: (Color red alpha: 0.5) Bye, Marcel Taeumel -----Ursprüngliche Nachricht----- Von: [hidden email] [mailto:[hidden email]] Im Auftrag von Juan Vuletich Gesendet: Dienstag, 16. November 2010 14:25 An: The general-purpose Squeak developers list Betreff: Re: AW: [squeak-dev] The Trunk: Graphics-mt.152.mcz Hi Marcel, I see. Then I suggest putting this change on hold until it is complete enough to really fix the issue. WRT the fix itself, I don't thing that DisplayScanner should set combination rules. It should be done in #installStrikeFont:foregroundColor:backgroundColor: . If the color has translucency, you'll need a specific colormap and combination rules. Good luck with it! Cheers, Juan Vuletich Marcel Taeumel wrote: > Hi. > > 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. > > Bye, > Marcel Taeumel > > -----Ursprüngliche Nachricht----- > Von: [hidden email] > [mailto:[hidden email]] Im Auftrag von Juan > Vuletich > Gesendet: Dienstag, 16. November 2010 13:50 > An: [hidden email] > Cc: [hidden email] > 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@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? > > Thanks, > Juan Vuletich > |
In reply to this post by marcel.taeumel (old)
Hi Marcel,
Marcel Taeumel wrote: > Hmmm...it 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 > place. > > Sorry for that. =) > > Marcel > Just saw your new fix in Graphics-mt.157 . This is much better! It is still not perfect, though. If you only use blend even for opaque colors (and not rgbMul) you'll see that the anti-aliasing is not subpixel rendered anymore... Maybe some tweaking of the colormaps could fix this. Cheers, Juan Vuletich |
In reply to this post by marcel.taeumel (old)
Hi Marcel,
Marcel Taeumel wrote: > So "The Inbox: Graphics-mt.157.mcz" includes that missing detail now. > > Both code snippets just work fine then: > > ('Hello, World' asText addAttribute: (TextColor color: (Color blue alpha: > 0.5))) asMorph openInHand > > Display getCanvas drawString: 'This is a Test' at: 20@20 font: TextStyle > defaultFont color: (Color red alpha: 0.5) > > Bye, > Marcel Taeumel > I played a little bit more with it, and I think the best solution is to completely disable subpixel rendering for translucent text. To do this, go back to the old version of the method, (dated on 2009) and replace this : (Preferences subPixelRenderFonts and: [ foregroundColor = Color black or: [ Preferences subPixelRenderColorFonts ]]) ifTrue: [ by this: (Preferences subPixelRenderFonts and: [ foregroundColor = Color black or: [ Preferences subPixelRenderColorFonts and: [foregroundColor isOpaque]]]) ifTrue: [ This makes almost opaque colors (alpha > 0.9) look much better. Cheers, Juan Vuletich |
Hi.
Great idea! As I use that at the moment for text fading animations I noticed some ugly transition. Maybe it was that subpixel rendering. Bye, Marcel -----Ursprüngliche Nachricht----- Von: [hidden email] [mailto:[hidden email]] Im Auftrag von Juan Vuletich Gesendet: Dienstag, 16. November 2010 14:54 An: The general-purpose Squeak developers list Betreff: Re: AW: [squeak-dev] The Trunk: Graphics-mt.152.mcz Hi Marcel, Marcel Taeumel wrote: > So "The Inbox: Graphics-mt.157.mcz" includes that missing detail now. > > Both code snippets just work fine then: > > ('Hello, World' asText addAttribute: (TextColor color: (Color blue alpha: > 0.5))) asMorph openInHand > > Display getCanvas drawString: 'This is a Test' at: 20@20 font: TextStyle > defaultFont color: (Color red alpha: 0.5) > > Bye, > Marcel Taeumel > I played a little bit more with it, and I think the best solution is to completely disable subpixel rendering for translucent text. To do this, go back to the old version of the method, (dated on 2009) and replace this : (Preferences subPixelRenderFonts and: [ foregroundColor = Color black or: [ Preferences subPixelRenderColorFonts ]]) ifTrue: [ by this: (Preferences subPixelRenderFonts and: [ foregroundColor = Color black or: [ Preferences subPixelRenderColorFonts and: [foregroundColor isOpaque]]]) ifTrue: [ This makes almost opaque colors (alpha > 0.9) look much better. Cheers, Juan Vuletich |
Free forum by Nabble | Edit this page |