Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(529)

Side by Side Diff: src/ports/SkFontHost_mac.cpp

Issue 21142004: support SK_FONTHOST_USES_FONTMGR on mac (Closed) Base URL: https://skia.googlecode.com/svn/trunk
Patch Set: Created 7 years, 4 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
« no previous file with comments | « src/fonts/SkGScalerContext.cpp ('k') | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 1
2 /* 2 /*
3 * Copyright 2006 The Android Open Source Project 3 * Copyright 2006 The Android Open Source Project
4 * 4 *
5 * Use of this source code is governed by a BSD-style license that can be 5 * Use of this source code is governed by a BSD-style license that can be
6 * found in the LICENSE file. 6 * found in the LICENSE file.
7 */ 7 */
8 8
9 #include <vector> 9 #include <vector>
10 #ifdef SK_BUILD_FOR_MAC 10 #ifdef SK_BUILD_FOR_MAC
(...skipping 447 matching lines...) Expand 10 before | Expand all | Expand 10 after
458 size_t length, void* data) const SK_OVERRIDE; 458 size_t length, void* data) const SK_OVERRIDE;
459 virtual SkScalerContext* onCreateScalerContext(const SkDescriptor*) const SK _OVERRIDE; 459 virtual SkScalerContext* onCreateScalerContext(const SkDescriptor*) const SK _OVERRIDE;
460 virtual void onFilterRec(SkScalerContextRec*) const SK_OVERRIDE; 460 virtual void onFilterRec(SkScalerContextRec*) const SK_OVERRIDE;
461 virtual void onGetFontDescriptor(SkFontDescriptor*, bool*) const SK_OVERRIDE ; 461 virtual void onGetFontDescriptor(SkFontDescriptor*, bool*) const SK_OVERRIDE ;
462 virtual SkAdvancedTypefaceMetrics* onGetAdvancedTypefaceMetrics( 462 virtual SkAdvancedTypefaceMetrics* onGetAdvancedTypefaceMetrics(
463 SkAdvancedTypefaceMetrics::PerGlyphInfo, 463 SkAdvancedTypefaceMetrics::PerGlyphInfo,
464 const uint32_t*, uint32_t) const SK_OVERRIDE; 464 const uint32_t*, uint32_t) const SK_OVERRIDE;
465 virtual int onCharsToGlyphs(const void* chars, Encoding, uint16_t glyphs[], 465 virtual int onCharsToGlyphs(const void* chars, Encoding, uint16_t glyphs[],
466 int glyphCount) const SK_OVERRIDE; 466 int glyphCount) const SK_OVERRIDE;
467 virtual int onCountGlyphs() const SK_OVERRIDE; 467 virtual int onCountGlyphs() const SK_OVERRIDE;
468 virtual SkTypeface* onRefMatchingStyle(Style) const SK_OVERRIDE;
468 469
469 private: 470 private:
470 471
471 typedef SkTypeface INHERITED; 472 typedef SkTypeface INHERITED;
472 }; 473 };
473 474
474 static SkTypeface* NewFromFontRef(CTFontRef fontRef, const char name[]) { 475 static SkTypeface* NewFromFontRef(CTFontRef fontRef, const char name[]) {
475 SkASSERT(fontRef); 476 SkASSERT(fontRef);
476 bool isFixedPitch; 477 bool isFixedPitch;
477 SkTypeface::Style style = computeStyleBits(fontRef, &isFixedPitch); 478 SkTypeface::Style style = computeStyleBits(fontRef, &isFixedPitch);
(...skipping 112 matching lines...) Expand 10 before | Expand all | Expand 10 after
590 }; 591 };
591 592
592 for (size_t i = 0; i < SK_ARRAY_COUNT(gPairs); i++) { 593 for (size_t i = 0; i < SK_ARRAY_COUNT(gPairs); i++) {
593 if (strcmp(name, gPairs[i].fFrom) == 0) { 594 if (strcmp(name, gPairs[i].fFrom) == 0) {
594 return gPairs[i].fTo; 595 return gPairs[i].fTo;
595 } 596 }
596 } 597 }
597 return name; // no change 598 return name; // no change
598 } 599 }
599 600
600 SkTypeface* SkFontHost::CreateTypeface(const SkTypeface* familyFace, 601 static SkTypeface* create_typeface(const SkTypeface* familyFace,
601 const char familyName[], 602 const char familyName[],
602 SkTypeface::Style style) { 603 SkTypeface::Style style) {
603 if (familyName) { 604 if (familyName) {
604 familyName = map_css_names(familyName); 605 familyName = map_css_names(familyName);
605 } 606 }
606 607
607 // Clone an existing typeface 608 // Clone an existing typeface
608 // TODO: only clone if style matches the familyFace's style... 609 // TODO: only clone if style matches the familyFace's style...
609 if (familyName == NULL && familyFace != NULL) { 610 if (familyName == NULL && familyFace != NULL) {
610 familyFace->ref(); 611 familyFace->ref();
611 return const_cast<SkTypeface*>(familyFace); 612 return const_cast<SkTypeface*>(familyFace);
612 } 613 }
613 614
614 if (!familyName || !*familyName) { 615 if (!familyName || !*familyName) {
615 familyName = FONT_DEFAULT_NAME; 616 familyName = FONT_DEFAULT_NAME;
616 } 617 }
617 618
618 NameStyleRec rec = { familyName, style }; 619 NameStyleRec rec = { familyName, style };
619 SkTypeface* face = SkTypefaceCache::FindByProcAndRef(FindByNameStyle, &rec); 620 SkTypeface* face = SkTypefaceCache::FindByProcAndRef(FindByNameStyle, &rec);
620 621
621 if (NULL == face) { 622 if (NULL == face) {
622 face = NewFromName(familyName, style); 623 face = NewFromName(familyName, style);
623 if (face) { 624 if (face) {
624 SkTypefaceCache::Add(face, style); 625 SkTypefaceCache::Add(face, style);
625 } else { 626 } else {
626 face = GetDefaultFace(); 627 face = GetDefaultFace();
627 face->ref(); 628 face->ref();
628 } 629 }
629 } 630 }
630 return face; 631 return face;
631 } 632 }
632 633
634 SkTypeface* SkTypeface_Mac::onRefMatchingStyle(Style styleBits) const {
635 return create_typeface(this, NULL, styleBits);
636 }
637
633 /////////////////////////////////////////////////////////////////////////////// 638 ///////////////////////////////////////////////////////////////////////////////
634 639
635 /** GlyphRect is in FUnits (em space, y up). */ 640 /** GlyphRect is in FUnits (em space, y up). */
636 struct GlyphRect { 641 struct GlyphRect {
637 int16_t fMinX; 642 int16_t fMinX;
638 int16_t fMinY; 643 int16_t fMinY;
639 int16_t fMaxX; 644 int16_t fMaxX;
640 int16_t fMaxY; 645 int16_t fMaxY;
641 }; 646 };
642 647
(...skipping 787 matching lines...) Expand 10 before | Expand all | Expand 10 after
1430 // Call must still manage its ownership of provider 1435 // Call must still manage its ownership of provider
1431 static SkTypeface* create_from_dataProvider(CGDataProviderRef provider) { 1436 static SkTypeface* create_from_dataProvider(CGDataProviderRef provider) {
1432 AutoCFRelease<CGFontRef> cg(CGFontCreateWithDataProvider(provider)); 1437 AutoCFRelease<CGFontRef> cg(CGFontCreateWithDataProvider(provider));
1433 if (NULL == cg) { 1438 if (NULL == cg) {
1434 return NULL; 1439 return NULL;
1435 } 1440 }
1436 CTFontRef ct = CTFontCreateWithGraphicsFont(cg, 0, NULL, NULL); 1441 CTFontRef ct = CTFontCreateWithGraphicsFont(cg, 0, NULL, NULL);
1437 return cg ? SkCreateTypefaceFromCTFont(ct) : NULL; 1442 return cg ? SkCreateTypefaceFromCTFont(ct) : NULL;
1438 } 1443 }
1439 1444
1440 SkTypeface* SkFontHost::CreateTypefaceFromStream(SkStream* stream) {
1441 AutoCFRelease<CGDataProviderRef> provider(SkCreateDataProviderFromStream(str eam));
1442 if (NULL == provider) {
1443 return NULL;
1444 }
1445 return create_from_dataProvider(provider);
1446 }
1447
1448 SkTypeface* SkFontHost::CreateTypefaceFromFile(const char path[]) {
1449 AutoCFRelease<CGDataProviderRef> provider(CGDataProviderCreateWithFilename(p ath));
1450 if (NULL == provider) {
1451 return NULL;
1452 }
1453 return create_from_dataProvider(provider);
1454 }
1455
1456 // Web fonts added to the the CTFont registry do not return their character set. 1445 // Web fonts added to the the CTFont registry do not return their character set.
1457 // Iterate through the font in this case. The existing caller caches the result, 1446 // Iterate through the font in this case. The existing caller caches the result,
1458 // so the performance impact isn't too bad. 1447 // so the performance impact isn't too bad.
1459 static void populate_glyph_to_unicode_slow(CTFontRef ctFont, CFIndex glyphCount, 1448 static void populate_glyph_to_unicode_slow(CTFontRef ctFont, CFIndex glyphCount,
1460 SkTDArray<SkUnichar>* glyphToUnicode) { 1449 SkTDArray<SkUnichar>* glyphToUnicode) {
1461 glyphToUnicode->setCount(glyphCount); 1450 glyphToUnicode->setCount(glyphCount);
1462 SkUnichar* out = glyphToUnicode->begin(); 1451 SkUnichar* out = glyphToUnicode->begin();
1463 sk_bzero(out, glyphCount * sizeof(SkUnichar)); 1452 sk_bzero(out, glyphCount * sizeof(SkUnichar));
1464 UniChar unichar = 0; 1453 UniChar unichar = 0;
1465 while (glyphCount > 0) { 1454 while (glyphCount > 0) {
(...skipping 785 matching lines...) Expand 10 before | Expand all | Expand 10 after
2251 } 2240 }
2252 2241
2253 virtual SkTypeface* onCreateFromFile(const char path[], 2242 virtual SkTypeface* onCreateFromFile(const char path[],
2254 int ttcIndex) SK_OVERRIDE { 2243 int ttcIndex) SK_OVERRIDE {
2255 AutoCFRelease<CGDataProviderRef> pr(CGDataProviderCreateWithFilename(pat h)); 2244 AutoCFRelease<CGDataProviderRef> pr(CGDataProviderCreateWithFilename(pat h));
2256 if (NULL == pr) { 2245 if (NULL == pr) {
2257 return NULL; 2246 return NULL;
2258 } 2247 }
2259 return create_from_dataProvider(pr); 2248 return create_from_dataProvider(pr);
2260 } 2249 }
2250
2251 virtual SkTypeface* onLegacyCreateTypeface(const char familyName[],
2252 unsigned styleBits) SK_OVERRIDE {
2253 return create_typeface(NULL, familyName, (SkTypeface::Style)styleBits);
2254 }
2261 }; 2255 };
2262 2256
2257 ///////////////////////////////////////////////////////////////////////////////
2258
2259 #ifndef SK_FONTHOST_USES_FONTMGR
2260
2261 SkTypeface* SkFontHost::CreateTypeface(const SkTypeface* familyFace,
2262 const char familyName[],
2263 SkTypeface::Style style) {
2264 return create_typeface(familyFace, familyName, style);
2265 }
2266
2267 SkTypeface* SkFontHost::CreateTypefaceFromStream(SkStream* stream) {
2268 AutoCFRelease<CGDataProviderRef> provider(SkCreateDataProviderFromStream(str eam));
2269 if (NULL == provider) {
2270 return NULL;
2271 }
2272 return create_from_dataProvider(provider);
2273 }
2274
2275 SkTypeface* SkFontHost::CreateTypefaceFromFile(const char path[]) {
2276 AutoCFRelease<CGDataProviderRef> provider(CGDataProviderCreateWithFilename(p ath));
2277 if (NULL == provider) {
2278 return NULL;
2279 }
2280 return create_from_dataProvider(provider);
2281 }
2282
2283 #endif
2284
2263 SkFontMgr* SkFontMgr::Factory() { 2285 SkFontMgr* SkFontMgr::Factory() {
2264 return SkNEW(SkFontMgr_Mac); 2286 return SkNEW(SkFontMgr_Mac);
2265 } 2287 }
2266 #endif 2288 #endif
OLDNEW
« no previous file with comments | « src/fonts/SkGScalerContext.cpp ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698