Index: trunk/src/ports/SkFontHost_FreeType.cpp |
=================================================================== |
--- trunk/src/ports/SkFontHost_FreeType.cpp (revision 8986) |
+++ trunk/src/ports/SkFontHost_FreeType.cpp (working copy) |
@@ -189,6 +189,10 @@ |
bool fDoLinearMetrics; |
bool fLCDIsVert; |
+ // Need scalar versions for generateFontMetrics |
+ SkVector fScale; |
+ SkMatrix fMatrix22Scalar; |
+ |
FT_Error setupSize(); |
void getBBoxForCurrentGlyph(SkGlyph* glyph, FT_BBox* bbox, |
bool snapToPixelBoundary = false); |
@@ -756,6 +760,8 @@ |
SkScalar sx = m.getScaleX(); |
SkScalar sy = m.getScaleY(); |
+ fMatrix22Scalar.reset(); |
+ |
if (m.getSkewX() || m.getSkewY() || sx < 0 || sy < 0) { |
// sort of give up on hinting |
sx = SkMaxScalar(SkScalarAbs(sx), SkScalarAbs(m.getSkewX())); |
@@ -769,6 +775,11 @@ |
fMatrix22.xy = -SkScalarToFixed(SkScalarMul(m.getSkewX(), inv)); |
fMatrix22.yx = -SkScalarToFixed(SkScalarMul(m.getSkewY(), inv)); |
fMatrix22.yy = SkScalarToFixed(SkScalarMul(m.getScaleY(), inv)); |
+ |
+ fMatrix22Scalar.setScaleX(SkScalarMul(m.getScaleX(), inv)); |
+ fMatrix22Scalar.setSkewX(-SkScalarMul(m.getSkewX(), inv)); |
+ fMatrix22Scalar.setSkewY(-SkScalarMul(m.getSkewY(), inv)); |
+ fMatrix22Scalar.setScaleY(SkScalarMul(m.getScaleY(), inv)); |
} else { |
fMatrix22.xx = fMatrix22.yy = SK_Fixed1; |
fMatrix22.xy = fMatrix22.yx = 0; |
@@ -776,20 +787,28 @@ |
#ifdef SK_SUPPORT_HINTING_SCALE_FACTOR |
if (fRec.getHinting() == SkPaint::kNo_Hinting) { |
+ fScale.set(sx, sy); |
fScaleX = SkScalarToFixed(sx); |
fScaleY = SkScalarToFixed(sy); |
} else { |
SkScalar hintingScaleFactor = fRec.fHintingScaleFactor; |
- fScaleX = SkScalarToFixed(sx / hintingScaleFactor); |
- fScaleY = SkScalarToFixed(sy / hintingScaleFactor); |
+ fScale.set(sx / hintingScaleFactor, sy / hintingScaleFactor); |
+ fScaleX = SkScalarToFixed(fScale.fX); |
+ fScaleY = SkScalarToFixed(fScale.fY); |
fMatrix22.xx *= hintingScaleFactor; |
fMatrix22.xy *= hintingScaleFactor; |
fMatrix22.yx *= hintingScaleFactor; |
fMatrix22.yy *= hintingScaleFactor; |
+ |
+ fMatrix22Scalar.setScaleX(fMatrix22Scalar.getScaleX() * hintingScaleFactor); |
+ fMatrix22Scalar.setSkewX(fMatrix22Scalar..getSkewX() * hintingScaleFactor); |
+ fMatrix22Scalar.setSkewY(fMatrix22Scalar..getSkewY() * hintingScaleFactor); |
+ fMatrix22Scalar.setScaleY(fMatrix22Scalar..getScaleY() * hintingScaleFactor); |
} |
#else |
+ fScale.set(sx, sy); |
fScaleX = SkScalarToFixed(sx); |
fScaleY = SkScalarToFixed(sy); |
#endif |
@@ -1231,9 +1250,9 @@ |
SkPoint pts[6]; |
SkFixed ys[6]; |
- SkFixed scaleY = fScaleY; |
- SkFixed mxy = fMatrix22.xy; |
- SkFixed myy = fMatrix22.yy; |
+ SkScalar scaleY = fScale.y(); |
+ SkScalar mxy = fMatrix22Scalar.getSkewX(); |
+ SkScalar myy = fMatrix22Scalar.getScaleY(); |
SkScalar xmin = SkIntToScalar(face->bbox.xMin) / upem; |
SkScalar xmax = SkIntToScalar(face->bbox.xMax) / upem; |
@@ -1255,7 +1274,7 @@ |
SkScalar x_height; |
if (os2 && os2->sxHeight) { |
- x_height = SkFixedToScalar(SkMulDiv(fScaleX, os2->sxHeight, upem)); |
+ x_height = fScale.x() * os2->sxHeight / upem; |
} else { |
const FT_UInt x_glyph = FT_Get_Char_Index(fFace, 'x'); |
if (x_glyph) { |
@@ -1265,7 +1284,7 @@ |
emboldenOutline(fFace, &fFace->glyph->outline); |
} |
FT_Outline_Get_CBox(&fFace->glyph->outline, &bbox); |
- x_height = SkFixedToScalar(SkFDot6ToFixed(bbox.yMax)); |
+ x_height = bbox.yMax / 64.0f; |
} else { |
x_height = 0; |
} |
@@ -1273,10 +1292,8 @@ |
// convert upem-y values into scalar points |
for (int i = 0; i < 6; i++) { |
- SkFixed y = SkMulDiv(scaleY, ys[i], upem); |
- SkFixed x = SkFixedMul(mxy, y); |
- y = SkFixedMul(myy, y); |
- pts[i].set(SkFixedToScalar(x), SkFixedToScalar(y)); |
+ SkScalar y = scaleY * ys[i] / upem; |
+ pts[i].set(y * mxy, y * myy); |
} |
if (mx) { |