diff options
author | Konstantin Ritt <ritt.ks@gmail.com> | 2015-11-09 01:21:24 +0400 |
---|---|---|
committer | Konstantin Ritt <ritt.ks@gmail.com> | 2015-11-16 14:33:37 +0000 |
commit | 6a7155997bfbc909c9875198a93dc2a6cba75795 (patch) | |
tree | 801fe83c1b72156a36d98352130869569e77d223 /src/gui/text | |
parent | a856c4a902816a7d691ca50e6f556521287be441 (diff) |
QFontEngineFT: Revise the legacy LCD filter implementation
Use an optimized version of the intra-pixel filter found
in FreeType's _ft_lcd_filter_legacy().
Gives us somewhat better accuracy and better performance.
Change-Id: Id4200b67e6ff55f605037c3e5464fef8bb03fbde
Reviewed-by: Friedemann Kleint <Friedemann.Kleint@theqtcompany.com>
Reviewed-by: Lars Knoll <lars.knoll@theqtcompany.com>
Reviewed-by: Eskil Abrahamsen Blomfeldt <eskil.abrahamsen-blomfeldt@theqtcompany.com>
Diffstat (limited to 'src/gui/text')
-rw-r--r-- | src/gui/text/qfontengine_ft.cpp | 37 |
1 files changed, 15 insertions, 22 deletions
diff --git a/src/gui/text/qfontengine_ft.cpp b/src/gui/text/qfontengine_ft.cpp index 162f409acd..242dd84096 100644 --- a/src/gui/text/qfontengine_ft.cpp +++ b/src/gui/text/qfontengine_ft.cpp @@ -534,25 +534,18 @@ QFontEngineFT::Glyph::~Glyph() delete [] data; } -static const uint subpixel_filter[3][3] = { - { 180, 60, 16 }, - { 38, 180, 38 }, - { 16, 60, 180 } -}; - -static inline uint filterPixel(uint red, uint green, uint blue, bool legacyFilter) +static inline uint filterPixel(uchar red, uchar green, uchar blue, bool legacyFilter) { - uint res; if (legacyFilter) { - uint high = (red*subpixel_filter[0][0] + green*subpixel_filter[0][1] + blue*subpixel_filter[0][2]) >> 8; - uint mid = (red*subpixel_filter[1][0] + green*subpixel_filter[1][1] + blue*subpixel_filter[1][2]) >> 8; - uint low = (red*subpixel_filter[2][0] + green*subpixel_filter[2][1] + blue*subpixel_filter[2][2]) >> 8; - res = (mid << 24) + (high << 16) + (mid << 8) + low; - } else { - uint alpha = green; - res = (alpha << 24) + (red << 16) + (green << 8) + blue; + uint r = red, g = green, b = blue; + // intra-pixel filter used by the legacy filter (adopted from _ft_lcd_filter_legacy) + red = (r * uint(65538 * 9/13) + g * uint(65538 * 1/6) + b * uint(65538 * 1/13)) / 65536; + green = (r * uint(65538 * 3/13) + g * uint(65538 * 4/6) + b * uint(65538 * 3/13)) / 65536; + blue = (r * uint(65538 * 1/13) + g * uint(65538 * 1/6) + b * uint(65538 * 9/13)) / 65536; } - return res; + + // alpha = green + return (green << 24) + (red << 16) + (green << 8) + blue; } static void convertRGBToARGB(const uchar *src, uint *dst, int width, int height, int src_pitch, bool bgr, bool legacyFilter) @@ -563,9 +556,9 @@ static void convertRGBToARGB(const uchar *src, uint *dst, int width, int height, while (h--) { uint *dd = dst; for (int x = 0; x < w; x += 3) { - uint red = src[x+1-offs]; - uint green = src[x+1]; - uint blue = src[x+1+offs]; + uchar red = src[x + 1 - offs]; + uchar green = src[x + 1]; + uchar blue = src[x + 1 + offs]; *dd = filterPixel(red, green, blue, legacyFilter); ++dd; } @@ -580,9 +573,9 @@ static void convertRGBToARGB_V(const uchar *src, uint *dst, int width, int heigh const int offs = bgr ? -src_pitch : src_pitch; while (h--) { for (int x = 0; x < width; x++) { - uint red = src[x+src_pitch-offs]; - uint green = src[x+src_pitch]; - uint blue = src[x+src_pitch+offs]; + uchar red = src[x + src_pitch - offs]; + uchar green = src[x + src_pitch]; + uchar blue = src[x + src_pitch + offs]; dst[x] = filterPixel(red, green, blue, legacyFilter); } dst += width; |