From e4d0bc0b57bd2236ed591d2c505556963777156b Mon Sep 17 00:00:00 2001 From: "reed@android.com" Date: Fri, 24 Jul 2009 19:53:20 +0000 Subject: add filterrec logic for subpixel and slight-hinting git-svn-id: http://skia.googlecode.com/svn/trunk@289 2bbb7eff-a529-9590-31e7-b0007b416f81 --- src/ports/SkFontHost_FreeType.cpp | 26 +++++++++++++++++--------- 1 file changed, 17 insertions(+), 9 deletions(-) (limited to 'src/ports') diff --git a/src/ports/SkFontHost_FreeType.cpp b/src/ports/SkFontHost_FreeType.cpp index 8bf44784c2..dbba1a28a4 100644 --- a/src/ports/SkFontHost_FreeType.cpp +++ b/src/ports/SkFontHost_FreeType.cpp @@ -263,11 +263,15 @@ static void unref_ft_face(FT_Face face) { /////////////////////////////////////////////////////////////////////////// void SkFontHost::FilterRec(SkScalerContext::Rec* rec) { - // collapse full->normaling hinting if we're not doing LCD SkPaint::Hinting h = rec->getHinting(); if (SkPaint::kFull_Hinting == h && !rec->isLCD()) { - rec->setHinting(SkPaint::kNormal_Hinting); + // collapse full->normaling hinting if we're not doing LCD + h = SkPaint::kNormal_Hinting; + } else if (rec->fSubpixelPositioning && SkPaint::kNo_Hinting != h) { + // to do subpixel, we must have at most slight hinting + h = SkPaint::kSlight_Hinting; } + rec->setHinting(h); } SkScalerContext_FreeType::SkScalerContext_FreeType(const SkDescriptor* desc) @@ -333,27 +337,31 @@ SkScalerContext_FreeType::SkScalerContext_FreeType(const SkDescriptor* desc) // compute the flags we send to Load_Glyph { - FT_Int32 hintingFlags = FT_LOAD_DEFAULT; + FT_Int32 loadFlags = FT_LOAD_DEFAULT; switch (fRec.getHinting()) { case SkPaint::kNo_Hinting: - hintingFlags = FT_LOAD_NO_HINTING; + loadFlags = FT_LOAD_NO_HINTING; break; case SkPaint::kSlight_Hinting: - hintingFlags = FT_LOAD_TARGET_LIGHT; // This implies FORCE_AUTOHINT + loadFlags = FT_LOAD_TARGET_LIGHT; // This implies FORCE_AUTOHINT break; case SkPaint::kNormal_Hinting: - hintingFlags |= FT_LOAD_TARGET_NORMAL; + loadFlags = FT_LOAD_TARGET_NORMAL; break; case SkPaint::kFull_Hinting: + loadFlags = FT_LOAD_TARGET_NORMAL; if (SkMask::kHorizontalLCD_Format == fRec.fMaskFormat) - hintingFlags = FT_LOAD_TARGET_LCD; + loadFlags = FT_LOAD_TARGET_LCD; else if (SkMask::kVerticalLCD_Format == fRec.fMaskFormat) - hintingFlags = FT_LOAD_TARGET_LCD_V; + loadFlags = FT_LOAD_TARGET_LCD_V; + break; + default: + SkDebugf("---------- UNKNOWN hinting %d\n", fRec.getHinting()); break; } - fLoadGlyphFlags = hintingFlags; + fLoadGlyphFlags = loadFlags; } // now create the FT_Size -- cgit v1.2.3