aboutsummaryrefslogtreecommitdiffhomepage
path: root/src/ports
diff options
context:
space:
mode:
authorGravatar reed@android.com <reed@android.com@2bbb7eff-a529-9590-31e7-b0007b416f81>2009-07-24 19:53:20 +0000
committerGravatar reed@android.com <reed@android.com@2bbb7eff-a529-9590-31e7-b0007b416f81>2009-07-24 19:53:20 +0000
commite4d0bc0b57bd2236ed591d2c505556963777156b (patch)
tree9721372c7bca4a8dd9f867b3bb7135b662b12514 /src/ports
parente61238b4f6943097f60a1ad1bf678f6a98613564 (diff)
add filterrec logic for subpixel and slight-hinting
git-svn-id: http://skia.googlecode.com/svn/trunk@289 2bbb7eff-a529-9590-31e7-b0007b416f81
Diffstat (limited to 'src/ports')
-rw-r--r--src/ports/SkFontHost_FreeType.cpp26
1 files changed, 17 insertions, 9 deletions
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