aboutsummaryrefslogtreecommitdiffhomepage
path: root/src
diff options
context:
space:
mode:
authorGravatar agl@chromium.org <agl@chromium.org@2bbb7eff-a529-9590-31e7-b0007b416f81>2010-05-10 14:15:50 +0000
committerGravatar agl@chromium.org <agl@chromium.org@2bbb7eff-a529-9590-31e7-b0007b416f81>2010-05-10 14:15:50 +0000
commit70a303f3c949707ce36ed2847701571cd047f14e (patch)
treeab85dd507032eda933c42fcb15719df7c02ba91a /src
parent652807bbc8c57e5fa9622126b51fd369f5c67935 (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.cpp47
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)