diff options
author | reed@google.com <reed@google.com@2bbb7eff-a529-9590-31e7-b0007b416f81> | 2011-05-18 11:58:10 +0000 |
---|---|---|
committer | reed@google.com <reed@google.com@2bbb7eff-a529-9590-31e7-b0007b416f81> | 2011-05-18 11:58:10 +0000 |
commit | e1bf6c5b4040ae1057b2a0438e45fd1e132ee0fd (patch) | |
tree | 3bb06ff51b9bb3da29cf2a61f29c278863affaac | |
parent | 79326d5ec097873757e12b8c5ea62f2a7909b499 (diff) | |
download | src-e1bf6c5b4040ae1057b2a0438e45fd1e132ee0fd.tar.gz |
improve gray approximation for LCD LERP
git-svn-id: http://skia.googlecode.com/svn/trunk/src@1359 2bbb7eff-a529-9590-31e7-b0007b416f81
-rw-r--r-- | ports/SkFontHost_FreeType.cpp | 22 |
1 files changed, 12 insertions, 10 deletions
diff --git a/ports/SkFontHost_FreeType.cpp b/ports/SkFontHost_FreeType.cpp index 8928b1e1..ae437a60 100644 --- a/ports/SkFontHost_FreeType.cpp +++ b/ports/SkFontHost_FreeType.cpp @@ -72,11 +72,12 @@ using namespace skia_advanced_typeface_metrics_utils; -// SK_FREETYPE_LCD_LERP should be 0...256, where 0 means no color reduction -// and 256 means 100% color reduction (e.g. gray) +// SK_FREETYPE_LCD_LERP should be 0...256 +// 0 means no color reduction (e.g. just as returned from FreeType) +// 256 means 100% color reduction (e.g. gray) // #ifndef SK_FREETYPE_LCD_LERP - #define SK_FREETYPE_LCD_LERP 128 + #define SK_FREETYPE_LCD_LERP 96 #endif ////////////////////////////////////////////////////////////////////////// @@ -986,17 +987,18 @@ extern void CopyFreetypeBitmapToVerticalLCDMask(const SkGlyph& dest, const FT_Bi using namespace skia_freetype_support; #endif -static int lerp(int start, int end, int percent) { - return start + ((end - start) * percent >> 8); +static int lerp(int start, int end) { + SkASSERT((unsigned)SK_FREETYPE_LCD_LERP <= 256); + return start + ((end - start) * (SK_FREETYPE_LCD_LERP) >> 8); } static uint16_t packTriple(unsigned r, unsigned g, unsigned b) { if (SK_FREETYPE_LCD_LERP) { - SkASSERT((unsigned)SK_FREETYPE_LCD_LERP <= 256); - unsigned sum = r + 2 * g + b >> 2; - r = lerp(r, sum, SK_FREETYPE_LCD_LERP); - g = lerp(g, sum, SK_FREETYPE_LCD_LERP); - b = lerp(b, sum, SK_FREETYPE_LCD_LERP); + // want (a+b+c)/3, but we approx to avoid the divide + unsigned ave = (5 * (r + g + b) + b) >> 4; + r = lerp(r, ave); + g = lerp(g, ave); + b = lerp(b, ave); } return SkPackRGB16(r >> 3, g >> 2, b >> 3); } |