Chromium Code Reviews| Index: src/core/SkPaint.cpp |
| diff --git a/src/core/SkPaint.cpp b/src/core/SkPaint.cpp |
| index 34fdf45bc4093c35352fcc0708554028aa78f6c2..7a23566fece108155231987aeaab4392a85ccb28 100644 |
| --- a/src/core/SkPaint.cpp |
| +++ b/src/core/SkPaint.cpp |
| @@ -1479,11 +1479,16 @@ static SkColor computeLuminanceColor(const SkPaint& paint) { |
| #define SK_MAX_SIZE_FOR_LCDTEXT 48 |
| #endif |
| -static bool tooBigForLCD(const SkScalerContext::Rec& rec) { |
| - SkScalar area = rec.fPost2x2[0][0] * rec.fPost2x2[1][1] - |
| - rec.fPost2x2[1][0] * rec.fPost2x2[0][1]; |
| - SkScalar size = SkScalarSqrt(SkScalarAbs(area)) * rec.fTextSize; |
| - return size > SkIntToScalar(SK_MAX_SIZE_FOR_LCDTEXT); |
| +const SkScalar gMaxSize2ForLCDText = SK_MAX_SIZE_FOR_LCDTEXT * SK_MAX_SIZE_FOR_LCDTEXT; |
| + |
|
robertphillips
2014/10/01 19:58:41
too_big_for_lcd ?
|
| +static bool tooBigForLCD(const SkScalerContext::Rec& rec, bool checkPost2x2) { |
| + SkScalar size = rec.fTextSize; |
| + if (checkPost2x2) { |
| + SkScalar area = rec.fPost2x2[0][0] * rec.fPost2x2[1][1] - |
| + rec.fPost2x2[1][0] * rec.fPost2x2[0][1]; |
| + size *= SkScalarAbs(area); |
| + } |
| + return size > gMaxSize2ForLCDText; |
| } |
| /* |
| @@ -1511,11 +1516,24 @@ void SkScalerContext::MakeRec(const SkPaint& paint, |
| rec->fPreScaleX = paint.getTextScaleX(); |
| rec->fPreSkewX = paint.getTextSkewX(); |
| + bool checkPost2x2 = false; |
| + |
| if (deviceMatrix) { |
| - rec->fPost2x2[0][0] = sk_relax(deviceMatrix->getScaleX()); |
| - rec->fPost2x2[0][1] = sk_relax(deviceMatrix->getSkewX()); |
| - rec->fPost2x2[1][0] = sk_relax(deviceMatrix->getSkewY()); |
| - rec->fPost2x2[1][1] = sk_relax(deviceMatrix->getScaleY()); |
| + const SkMatrix::TypeMask mask = deviceMatrix->getType(); |
| + if (mask & SkMatrix::kScale_Mask) { |
| + rec->fPost2x2[0][0] = sk_relax(deviceMatrix->getScaleX()); |
| + rec->fPost2x2[1][1] = sk_relax(deviceMatrix->getScaleY()); |
| + checkPost2x2 = true; |
| + } else { |
| + rec->fPost2x2[0][0] = rec->fPost2x2[1][1] = SK_Scalar1; |
| + } |
| + if (mask & SkMatrix::kAffine_Mask) { |
| + rec->fPost2x2[0][1] = sk_relax(deviceMatrix->getSkewX()); |
| + rec->fPost2x2[1][0] = sk_relax(deviceMatrix->getSkewY()); |
| + checkPost2x2 = true; |
| + } else { |
| + rec->fPost2x2[0][1] = rec->fPost2x2[1][0] = 0; |
| + } |
| } else { |
| rec->fPost2x2[0][0] = rec->fPost2x2[1][1] = SK_Scalar1; |
| rec->fPost2x2[0][1] = rec->fPost2x2[1][0] = 0; |
| @@ -1566,7 +1584,7 @@ void SkScalerContext::MakeRec(const SkPaint& paint, |
| rec->fMaskFormat = SkToU8(computeMaskFormat(paint)); |
| if (SkMask::kLCD16_Format == rec->fMaskFormat || SkMask::kLCD32_Format == rec->fMaskFormat) { |
| - if (tooBigForLCD(*rec)) { |
| + if (tooBigForLCD(*rec, checkPost2x2)) { |
| rec->fMaskFormat = SkMask::kA8_Format; |
| flags |= SkScalerContext::kGenA8FromLCD_Flag; |
| } else { |