diff options
author | reed@google.com <reed@google.com@2bbb7eff-a529-9590-31e7-b0007b416f81> | 2012-01-18 17:06:35 +0000 |
---|---|---|
committer | reed@google.com <reed@google.com@2bbb7eff-a529-9590-31e7-b0007b416f81> | 2012-01-18 17:06:35 +0000 |
commit | 8351aabbfe82a76a698fa2bde00d33c1174518cd (patch) | |
tree | 61fd4f195e75889ff3b5b5baf9da53da0b1a8b81 /src | |
parent | 2c1eb6f08d77d85d3d422444fc8f4b0b0fc25037 (diff) |
add GenA8FromLCD as a hack to force GDI to create the A8 mask from the LCD
results, rather than asking GDI directly for A8 (which it sometimes decides
to interpret as BW)
git-svn-id: http://skia.googlecode.com/svn/trunk@3061 2bbb7eff-a529-9590-31e7-b0007b416f81
Diffstat (limited to 'src')
-rw-r--r-- | src/core/SkPaint.cpp | 3 | ||||
-rwxr-xr-x | src/ports/SkFontHost_win.cpp | 14 |
2 files changed, 14 insertions, 3 deletions
diff --git a/src/core/SkPaint.cpp b/src/core/SkPaint.cpp index f7b3ae35fe..cf25dbf9ee 100644 --- a/src/core/SkPaint.cpp +++ b/src/core/SkPaint.cpp @@ -1440,6 +1440,9 @@ void SkScalerContext::MakeRec(const SkPaint& paint, if (paint.isVerticalText()) { flags |= SkScalerContext::kVertical_Flag; } + if (paint.getFlags() & SkPaint::kGenA8FromLCD_Flag) { + flags |= SkScalerContext::kGenA8FromLCD_Flag; + } rec->fFlags = SkToU16(flags); // these modify fFlags, so do them after assigning fFlags diff --git a/src/ports/SkFontHost_win.cpp b/src/ports/SkFontHost_win.cpp index 9d98bcb4e3..156f51cff2 100755 --- a/src/ports/SkFontHost_win.cpp +++ b/src/ports/SkFontHost_win.cpp @@ -468,7 +468,11 @@ static BYTE compute_quality(const SkScalerContext::Rec& rec) { case SkMask::kLCD32_Format: return CLEARTYPE_QUALITY; default: - return ANTIALIASED_QUALITY; + if (rec.fFlags & SkScalerContext::kGenA8FromLCD_Flag) { + return CLEARTYPE_QUALITY; + } else { + return ANTIALIASED_QUALITY; + } } } @@ -713,12 +717,16 @@ static const uint8_t* getInverseGammaTable() { // gdi's bitmap is upside-down, so we reverse dst walking in Y // whenever we copy it into skia's buffer +static int compute_luminance(int r, int g, int b) { +// return (r * 2 + g * 5 + b) >> 3; + return (r * 27 + g * 92 + b * 9) >> 7; +} + static inline uint8_t rgb_to_a8(SkGdiRGB rgb) { int r = (rgb >> 16) & 0xFF; int g = (rgb >> 8) & 0xFF; int b = (rgb >> 0) & 0xFF; - - return (r * 2 + g * 5 + b) >> 3; // luminance + return compute_luminance(r, g, b); } static inline uint16_t rgb_to_lcd16(SkGdiRGB rgb) { |