aboutsummaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
-rw-r--r--src/core/SkScalerContext.cpp13
-rw-r--r--src/core/SkScalerContext.h2
-rwxr-xr-xsrc/ports/SkFontHost_mac.cpp25
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,