since I can't make GDI's lcd text pretty when we're rotated, detect that

and force us into grayscale.



git-svn-id: http://skia.googlecode.com/svn/trunk@1850 2bbb7eff-a529-9590-31e7-b0007b416f81
This commit is contained in:
reed@google.com 2011-07-13 18:02:28 +00:00
parent b3b8dfa313
commit da44067ec9

View File

@ -939,6 +939,22 @@ SkTypeface* SkFontHost::CreateTypefaceFromFile(const char path[]) {
return NULL;
}
static bool isLCD(const SkScalerContext::Rec& rec) {
return SkMask::kLCD16_Format == rec.fMaskFormat ||
SkMask::kLCD32_Format == rec.fMaskFormat;
}
static bool bothZero(SkScalar a, SkScalar b) {
return 0 == a && 0 == b;
}
// returns false if there is any non-90-rotation or skew
static bool isAxisAligned(const SkScalerContext::Rec& rec) {
return 0 == rec.fPreSkewX &&
(bothZero(rec.fPost2x2[0][1], rec.fPost2x2[1][0]) ||
bothZero(rec.fPost2x2[0][0], rec.fPost2x2[1][1]));
}
void SkFontHost::FilterRec(SkScalerContext::Rec* rec) {
unsigned flagsWeDontSupport = SkScalerContext::kDevKernText_Flag |
SkScalerContext::kAutohinting_Flag |
@ -948,8 +964,11 @@ void SkFontHost::FilterRec(SkScalerContext::Rec* rec) {
SkScalerContext::kLCD_Vertical_Flag;
rec->fFlags &= ~flagsWeDontSupport;
// we only support binary hinting: normal or none
SkPaint::Hinting h = rec->getHinting();
// I think we can support no-hinting, if we get hires outlines and just
// use skia to rasterize into a gray-scale mask...
#if 0
switch (h) {
case SkPaint::kNo_Hinting:
case SkPaint::kSlight_Hinting:
@ -962,7 +981,15 @@ void SkFontHost::FilterRec(SkScalerContext::Rec* rec) {
default:
SkASSERT(!"unknown hinting");
}
#else
h = SkPaint::kNormal_Hinting;
#endif
rec->setHinting(h);
// Disable LCD when rotated, since GDI's output is ugly
if (isLCD(*rec) && !isAxisAligned(*rec)) {
rec->fMaskFormat = SkMask::kA8_Format;
}
}
#endif // WIN32