aboutsummaryrefslogtreecommitdiffhomepage
path: root/src/ports
diff options
context:
space:
mode:
authorGravatar reed@android.com <reed@android.com@2bbb7eff-a529-9590-31e7-b0007b416f81>2010-07-22 18:27:53 +0000
committerGravatar reed@android.com <reed@android.com@2bbb7eff-a529-9590-31e7-b0007b416f81>2010-07-22 18:27:53 +0000
commitcb34235f46b6259b612e72c416e850e26803250a (patch)
tree730015db2c1070352ef3f29133c97d1fbf4c9f3e /src/ports
parent0e21ec009a4e2e6343d6a32dfe4c93faf1b01c01 (diff)
fix matrix use in coretext fonthost
update gm images to new baseline git-svn-id: http://skia.googlecode.com/svn/trunk@590 2bbb7eff-a529-9590-31e7-b0007b416f81
Diffstat (limited to 'src/ports')
-rw-r--r--src/ports/SkFontHost_mac_coretext.cpp94
1 files changed, 41 insertions, 53 deletions
diff --git a/src/ports/SkFontHost_mac_coretext.cpp b/src/ports/SkFontHost_mac_coretext.cpp
index 74c14b163e..2fc5c1dbbf 100644
--- a/src/ports/SkFontHost_mac_coretext.cpp
+++ b/src/ports/SkFontHost_mac_coretext.cpp
@@ -28,13 +28,12 @@
//============================================================================
// Constants
//----------------------------------------------------------------------------
-static const SkFontID kSkInvalidFontID = 0;
-
-static const size_t FONT_CACHE_MEMORY_BUDGET = 1024 * 1024;
-static const char *FONT_DEFAULT_NAME = "Lucida Sans";
-
+static const SkFontID kSkInvalidFontID = 0;
+static const size_t FONT_CACHE_MEMORY_BUDGET = 1024 * 1024;
+static const char FONT_DEFAULT_NAME[] = "Lucida Sans";
+static const float FONT_CANONICAL_POINTSIZE = 1.0f;
//============================================================================
@@ -255,7 +254,8 @@ CTFontRef SkNativeFontCache::CreateNativeFont(const SkString &theName, SkTypefac
// Create the font
//
- // Fonts are scaled using the Sk matrix, so we always request a font of size 1.
+ // Fonts are scaled using the Sk matrix, so we always request a font
+ // at a canonical size FONT_CANONICAL_POINTSIZE
if (cfFontName != NULL && cfFontTraits != NULL && cfAttributes != NULL && cfTraits != NULL)
{
CFDictionaryAddValue(cfTraits, kCTFontSymbolicTrait, cfFontTraits);
@@ -265,7 +265,7 @@ CTFontRef SkNativeFontCache::CreateNativeFont(const SkString &theName, SkTypefac
ctFontDesc = CTFontDescriptorCreateWithAttributes(cfAttributes);
if (ctFontDesc != NULL)
- ctFont = CTFontCreateWithFontDescriptor(ctFontDesc, 1.0, NULL);
+ ctFont = CTFontCreateWithFontDescriptor(ctFontDesc, FONT_CANONICAL_POINTSIZE, NULL);
}
@@ -353,12 +353,13 @@ SkScalerContext_Mac::SkScalerContext_Mac(const SkDescriptor* desc)
// Initialise ourselves
mColorSpace = CGColorSpaceCreateDeviceGray();
- mTransform = CGAffineTransformMake(SkScalarToFloat(skMatrix[SkMatrix::kMScaleX]),
- SkScalarToFloat(skMatrix[SkMatrix::kMSkewX]),
- SkScalarToFloat(skMatrix[SkMatrix::kMSkewY]),
- SkScalarToFloat(skMatrix[SkMatrix::kMScaleY]),
- SkScalarToFloat(skMatrix[SkMatrix::kMTransX]),
- SkScalarToFloat(skMatrix[SkMatrix::kMTransY]));
+ const float inv = 1.0f / FONT_CANONICAL_POINTSIZE;
+ mTransform = CGAffineTransformMake(SkScalarToFloat(skMatrix[SkMatrix::kMScaleX]) * inv,
+ -SkScalarToFloat(skMatrix[SkMatrix::kMSkewY]) * inv,
+ -SkScalarToFloat(skMatrix[SkMatrix::kMSkewX]) * inv,
+ SkScalarToFloat(skMatrix[SkMatrix::kMScaleY]) * inv,
+ SkScalarToFloat(skMatrix[SkMatrix::kMTransX]) * inv,
+ SkScalarToFloat(skMatrix[SkMatrix::kMTransY]) * inv);
mFont = CTFontCreateCopyWithAttributes(ctFont, 0.0, &mTransform, NULL);
mGlyphCount = (uint16_t) numGlyphs;
@@ -422,7 +423,6 @@ void SkScalerContext_Mac::generateMetrics(SkGlyph* glyph)
// to transform the bounding box ourselves.
//
// The bounds are also expanded by 1 pixel, to give CG room for anti-aliasing.
- theBounds = CGRectApplyAffineTransform(theBounds, mTransform);
theBounds = CGRectInset(theBounds, -1, -1);
@@ -442,7 +442,6 @@ void SkScalerContext_Mac::generateImage(const SkGlyph& glyph)
CGGlyph cgGlyph;
CGFontRef cgFont;
-
// Get the state we need
sk_bzero(glyph.fImage, glyph.fHeight * glyph.rowBytes());
@@ -451,53 +450,37 @@ void SkScalerContext_Mac::generateImage(const SkGlyph& glyph)
cgContext = CGBitmapContextCreate( glyph.fImage, glyph.fWidth, glyph.fHeight, 8,
glyph.rowBytes(), mColorSpace, kCGImageAlphaNone);
-
// Draw the glyph
- if (cgFont != NULL && cgContext != NULL)
- {
+ if (cgFont != NULL && cgContext != NULL) {
CGContextSetGrayFillColor( cgContext, 1.0, 1.0);
CGContextSetTextDrawingMode(cgContext, kCGTextFill);
CGContextSetFont( cgContext, cgFont);
- CGContextSetFontSize( cgContext, 1.0);
+ CGContextSetFontSize( cgContext, FONT_CANONICAL_POINTSIZE);
CGContextSetTextMatrix( cgContext, mTransform);
CGContextShowGlyphsAtPoint( cgContext, -glyph.fLeft, glyph.fTop + glyph.fHeight, &cgGlyph, 1);
- }
-
+ }
// Clean up
CFSafeRelease(cgFont);
CFSafeRelease(cgContext);
}
-void SkScalerContext_Mac::generatePath(const SkGlyph& glyph, SkPath* path)
-{ CGGlyph cgGlyph;
- CGPathRef cgPath;
-
-
- // Get the state we need
- cgGlyph = (CGGlyph) glyph.getGlyphID(fBaseGlyphCount);
- cgPath = CTFontCreatePathForGlyph(mFont, cgGlyph, NULL);
+void SkScalerContext_Mac::generatePath(const SkGlyph& glyph, SkPath* path) {
+ CGGlyph cgGlyph = (CGGlyph)glyph.getGlyphID(fBaseGlyphCount);
+ CGPathRef cgPath = CTFontCreatePathForGlyph(mFont, cgGlyph, NULL);
-
- // Get the path
path->reset();
-
- if (cgPath != NULL)
+ if (cgPath != NULL) {
CGPathApply(cgPath, path, SkScalerContext_Mac::CTPathElement);
-
- CFSafeRelease(cgPath);
+ CFRelease(cgPath);
+ }
}
-void SkScalerContext_Mac::generateFontMetrics(SkPaint::FontMetrics* mx, SkPaint::FontMetrics* my)
-{ SkPaint::FontMetrics theMetrics;
- CGRect theBounds;
-
-
- // Get the state we need
- theBounds = CTFontGetBoundingBox(mFont);
+void SkScalerContext_Mac::generateFontMetrics(SkPaint::FontMetrics* mx,
+ SkPaint::FontMetrics* my) {
+ CGRect theBounds = CTFontGetBoundingBox(mFont);
-
- // Get the metrics
+ SkPaint::FontMetrics theMetrics;
theMetrics.fTop = -CGRectGetMaxY(theBounds);
theMetrics.fAscent = -CTFontGetAscent(mFont);
theMetrics.fDescent = CTFontGetDescent(mFont);
@@ -508,8 +491,7 @@ void SkScalerContext_Mac::generateFontMetrics(SkPaint::FontMetrics* mx, SkPaint:
theMetrics.fXMax = CGRectGetMaxX(theBounds);
theMetrics.fXHeight = CTFontGetXHeight(mFont);
-
- // Return the metrics
+#if 0
SkASSERT(theMetrics.fTop <= 0.0);
SkASSERT(theMetrics.fAscent <= 0.0);
SkASSERT(theMetrics.fDescent >= 0.0);
@@ -519,12 +501,14 @@ void SkScalerContext_Mac::generateFontMetrics(SkPaint::FontMetrics* mx, SkPaint:
SkASSERT(theMetrics.fXMin <= 0.0);
SkASSERT(theMetrics.fXMax > 0.0);
SkASSERT(theMetrics.fXHeight >= 0.0);
+#endif
- if (mx != NULL)
+ if (mx != NULL) {
*mx = theMetrics;
-
- if (my != NULL)
+ }
+ if (my != NULL) {
*my = theMetrics;
+ }
}
void SkScalerContext_Mac::CTPathElement(void *info, const CGPathElement *element)
@@ -585,6 +569,7 @@ SkTypeface* SkFontHost::CreateTypeface(const SkTypeface* familyFace,
// Clone an existing typeface
+ // TODO: only clone if style matches the familyFace's style...
if (familyName == NULL && familyFace != NULL)
{
familyFace->ref();
@@ -592,6 +577,9 @@ SkTypeface* SkFontHost::CreateTypeface(const SkTypeface* familyFace,
}
+ if (fontName.isEmpty()) {
+ fontName.set(FONT_DEFAULT_NAME);
+ }
// Get the native font
fontInfo = fontTable->GetFontInfo(fontName, style);
if (fontInfo.fontID == kSkInvalidFontID)
@@ -605,14 +593,14 @@ SkTypeface* SkFontHost::CreateTypeface(const SkTypeface* familyFace,
SkTypeface* SkFontHost::CreateTypefaceFromStream(SkStream* stream)
{
- SkASSERT(!"SkFontHost::CreateTypefaceFromStream unimplemented");
- return(NULL);
+// SkASSERT(!"SkFontHost::CreateTypefaceFromStream unimplemented");
+ return SkFontHost::CreateTypeface(NULL, NULL, NULL, NULL, SkTypeface::kNormal);
}
SkTypeface* SkFontHost::CreateTypefaceFromFile(const char path[])
{
- SkASSERT(!"SkFontHost::CreateTypefaceFromFile unimplemented");
- return(NULL);
+// SkASSERT(!"SkFontHost::CreateTypefaceFromFile unimplemented");
+ return SkFontHost::CreateTypeface(NULL, NULL, NULL, NULL, SkTypeface::kNormal);
}
///////////////////////////////////////////////////////////////////////////