Index: src/ports/SkFontHost_mac.cpp |
diff --git a/src/ports/SkFontHost_mac.cpp b/src/ports/SkFontHost_mac.cpp |
index 7fd645bdae6b472edade9c528a2d340657cd1700..dea72c7358a124359d571303a0563f27c316018c 100755 |
--- a/src/ports/SkFontHost_mac.cpp |
+++ b/src/ports/SkFontHost_mac.cpp |
@@ -717,8 +717,9 @@ SkScalerContext_Mac::SkScalerContext_Mac(SkTypeface_Mac* typeface, |
SkASSERT(numGlyphs >= 1 && numGlyphs <= 0xFFFF); |
fGlyphCount = SkToU16(numGlyphs); |
- fRec.getSingleMatrix(&fFUnitMatrix); |
- CGAffineTransform transform = MatrixToCGAffineTransform(fFUnitMatrix); |
+ SkMatrix skTransform; |
+ fRec.getSingleMatrixWithoutTextSize(&skTransform); |
+ CGAffineTransform transform = MatrixToCGAffineTransform(skTransform); |
AutoCFRelease<CTFontDescriptorRef> ctFontDesc; |
if (fVertical) { |
@@ -734,15 +735,27 @@ SkScalerContext_Mac::SkScalerContext_Mac(SkTypeface_Mac* typeface, |
ctFontDesc.reset(CTFontDescriptorCreateWithAttributes(cfAttributes)); |
} |
} |
- // Since our matrix includes everything, we pass 1 for size. |
- fCTFont.reset(CTFontCreateCopyWithAttributes(ctFont, 1, &transform, ctFontDesc)); |
+ |
+ // The transform contains everything except the requested text size. |
+ // Some properties, like 'trak', are based on the text size (before applying the matrix). |
+ CGFloat textSize = ScalarToCG(fRec.fTextSize); |
+ |
+ // If a text size of 0 is requested, CoreGraphics will use 12 instead. |
+ // If the text size is 0, set it to something tiny. |
+ if (textSize < CGFLOAT_MIN) { |
+ textSize = CGFLOAT_MIN; |
+ } |
+ |
+ fCTFont.reset(CTFontCreateCopyWithAttributes(ctFont, textSize, &transform, ctFontDesc)); |
fCGFont.reset(CTFontCopyGraphicsFont(fCTFont, NULL)); |
if (fVertical) { |
CGAffineTransform rotateLeft = CGAffineTransformMake(0, -1, 1, 0, 0, 0); |
transform = CGAffineTransformConcat(rotateLeft, transform); |
- fCTVerticalFont.reset(CTFontCreateCopyWithAttributes(ctFont, 1, &transform, NULL)); |
+ fCTVerticalFont.reset(CTFontCreateCopyWithAttributes(ctFont, textSize, &transform, NULL)); |
} |
+ // The fUnitMatrix includes the text size (and em) as it is used to scale the raw font data. |
+ fRec.getSingleMatrix(&fFUnitMatrix); |
SkScalar emPerFUnit = SkScalarInvert(SkIntToScalar(CGFontGetUnitsPerEm(fCGFont))); |
fFUnitMatrix.preScale(emPerFUnit, -emPerFUnit); |
} |
@@ -793,7 +806,7 @@ CGRGBPixel* Offscreen::getCG(const SkScalerContext_Mac& context, const SkGlyph& |
CGContextSetTextDrawingMode(fCG, kCGTextFill); |
CGContextSetFont(fCG, context.fCGFont); |
- CGContextSetFontSize(fCG, 1 /*CTFontGetSize(context.fCTFont)*/); |
+ CGContextSetFontSize(fCG, CTFontGetSize(context.fCTFont)); |
CGContextSetTextMatrix(fCG, CTFontGetMatrix(context.fCTFont)); |
// Because CG always draws from the horizontal baseline, |