aboutsummaryrefslogtreecommitdiffhomepage
path: root/src/ports
diff options
context:
space:
mode:
authorGravatar bungeman <bungeman@google.com>2014-11-25 08:08:09 -0800
committerGravatar Commit bot <commit-bot@chromium.org>2014-11-25 08:08:09 -0800
commitbe2284de556e7ec29489693093d42dc86b762645 (patch)
treec550bb4c56d47491784960ea1c9bd54a22f6ed94 /src/ports
parenta2c2323005fb22e564426f4ed86adaa6d213aba1 (diff)
Use text size on Mac.
The current code assumes that text on Mac is freely scalable, or at least that the text size is just a part of the transform. However, it appears that application of the 'trak' table, as well as other optical adjustments, may rely on the text size directly. This change passes the text size requested directly to CoreText. BUG=chromium:427528 Review URL: https://codereview.chromium.org/752183002
Diffstat (limited to 'src/ports')
-rwxr-xr-xsrc/ports/SkFontHost_mac.cpp25
1 files changed, 19 insertions, 6 deletions
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,