diff options
-rw-r--r-- | src/core/SkScalerContext.cpp | 13 | ||||
-rw-r--r-- | src/core/SkScalerContext.h | 2 | ||||
-rwxr-xr-x | src/ports/SkFontHost_mac.cpp | 25 |
3 files changed, 34 insertions, 6 deletions
diff --git a/src/core/SkScalerContext.cpp b/src/core/SkScalerContext.cpp index 20413a7dd7..b7409ffe9e 100644 --- a/src/core/SkScalerContext.cpp +++ b/src/core/SkScalerContext.cpp @@ -700,6 +700,10 @@ void SkScalerContextRec::getLocalMatrix(SkMatrix* m) const { SkPaint::SetTextMatrix(m, fTextSize, fPreScaleX, fPreSkewX); } +void SkScalerContextRec::getLocalMatrixWithoutTextSize(SkMatrix* m) const { + SkPaint::SetTextMatrix(m, SK_Scalar1, fPreScaleX, fPreSkewX); +} + void SkScalerContextRec::getSingleMatrix(SkMatrix* m) const { this->getLocalMatrix(m); @@ -709,6 +713,15 @@ void SkScalerContextRec::getSingleMatrix(SkMatrix* m) const { m->postConcat(deviceMatrix); } +void SkScalerContextRec::getSingleMatrixWithoutTextSize(SkMatrix* m) const { + this->getLocalMatrixWithoutTextSize(m); + + // now concat the device matrix + SkMatrix deviceMatrix; + this->getMatrixFrom2x2(&deviceMatrix); + m->postConcat(deviceMatrix); +} + SkAxisAlignment SkComputeAxisAlignmentForHText(const SkMatrix& matrix) { SkASSERT(!matrix.hasPerspective()); diff --git a/src/core/SkScalerContext.h b/src/core/SkScalerContext.h index 3ebaa5900d..b78efef9c2 100644 --- a/src/core/SkScalerContext.h +++ b/src/core/SkScalerContext.h @@ -82,7 +82,9 @@ struct SkScalerContextRec { void getMatrixFrom2x2(SkMatrix*) const; void getLocalMatrix(SkMatrix*) const; + void getLocalMatrixWithoutTextSize(SkMatrix*) const; void getSingleMatrix(SkMatrix*) const; + void getSingleMatrixWithoutTextSize(SkMatrix*) const; inline SkPaint::Hinting getHinting() const; inline void setHinting(SkPaint::Hinting); diff --git a/src/ports/SkFontHost_mac.cpp b/src/ports/SkFontHost_mac.cpp index 7fd645bdae..dea72c7358 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, |