diff options
author | 2010-05-10 14:15:50 +0000 | |
---|---|---|
committer | 2010-05-10 14:15:50 +0000 | |
commit | 70a303f3c949707ce36ed2847701571cd047f14e (patch) | |
tree | ab85dd507032eda933c42fcb15719df7c02ba91a /src | |
parent | 652807bbc8c57e5fa9622126b51fd369f5c67935 (diff) |
[FreeType] Always use MONO hinting when hinting in monochrome.
This matches the behaviour of Cairo. It appears to be an undocumented
trick of font rendering on Linux that, in monochrome, all the hinting
modes expect no-hinting are mapped to FreeType's MONO hinting.
http://code.google.com/p/chromium/issues/detail?id=43252
http://codereview.appspot.com/1162041/show
git-svn-id: http://skia.googlecode.com/svn/trunk@562 2bbb7eff-a529-9590-31e7-b0007b416f81
Diffstat (limited to 'src')
-rw-r--r-- | src/ports/SkFontHost_FreeType.cpp | 47 |
1 files changed, 27 insertions, 20 deletions
diff --git a/src/ports/SkFontHost_FreeType.cpp b/src/ports/SkFontHost_FreeType.cpp index d734b8e78e..b0746b6204 100644 --- a/src/ports/SkFontHost_FreeType.cpp +++ b/src/ports/SkFontHost_FreeType.cpp @@ -356,26 +356,33 @@ SkScalerContext_FreeType::SkScalerContext_FreeType(const SkDescriptor* desc) { FT_Int32 loadFlags = FT_LOAD_DEFAULT; - switch (fRec.getHinting()) { - case SkPaint::kNo_Hinting: - loadFlags = FT_LOAD_NO_HINTING; - break; - case SkPaint::kSlight_Hinting: - loadFlags = FT_LOAD_TARGET_LIGHT; // This implies FORCE_AUTOHINT - break; - case SkPaint::kNormal_Hinting: - loadFlags = FT_LOAD_TARGET_NORMAL; - break; - case SkPaint::kFull_Hinting: - loadFlags = FT_LOAD_TARGET_NORMAL; - if (SkMask::kHorizontalLCD_Format == fRec.fMaskFormat) - loadFlags = FT_LOAD_TARGET_LCD; - else if (SkMask::kVerticalLCD_Format == fRec.fMaskFormat) - loadFlags = FT_LOAD_TARGET_LCD_V; - break; - default: - SkDebugf("---------- UNKNOWN hinting %d\n", fRec.getHinting()); - break; + if (SkMask::kBW_Format == fRec.fMaskFormat) { + // See http://code.google.com/p/chromium/issues/detail?id=43252#c24 + loadFlags = FT_LOAD_TARGET_MONO; + if (fRec.getHinting() == SkPaint::kNo_Hinting) + loadFlags = FT_LOAD_NO_HINTING; + } else { + switch (fRec.getHinting()) { + case SkPaint::kNo_Hinting: + loadFlags = FT_LOAD_NO_HINTING; + break; + case SkPaint::kSlight_Hinting: + loadFlags = FT_LOAD_TARGET_LIGHT; // This implies FORCE_AUTOHINT + break; + case SkPaint::kNormal_Hinting: + loadFlags = FT_LOAD_TARGET_NORMAL; + break; + case SkPaint::kFull_Hinting: + loadFlags = FT_LOAD_TARGET_NORMAL; + if (SkMask::kHorizontalLCD_Format == fRec.fMaskFormat) + loadFlags = FT_LOAD_TARGET_LCD; + else if (SkMask::kVerticalLCD_Format == fRec.fMaskFormat) + loadFlags = FT_LOAD_TARGET_LCD_V; + break; + default: + SkDebugf("---------- UNKNOWN hinting %d\n", fRec.getHinting()); + break; + } } if ((fRec.fFlags & SkScalerContext::kEmbeddedBitmapText_Flag) == 0) |