| OLD | NEW |
| 1 /* | 1 /* |
| 2 * Copyright 2014 Google Inc. | 2 * Copyright 2014 Google Inc. |
| 3 * | 3 * |
| 4 * Use of this source code is governed by a BSD-style license that can be | 4 * Use of this source code is governed by a BSD-style license that can be |
| 5 * found in the LICENSE file. | 5 * found in the LICENSE file. |
| 6 */ | 6 */ |
| 7 | 7 |
| 8 #include "SkDataTable.h" | 8 #include "SkDataTable.h" |
| 9 #include "SkFontDescriptor.h" | 9 #include "SkFontDescriptor.h" |
| 10 #include "SkFontHost_FreeType_common.h" | 10 #include "SkFontHost_FreeType_common.h" |
| (...skipping 355 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 366 { SkTFixed<SkFS::kExtraExpanded_Width>::value, SkTFixed<FC_WIDTH_EXTRAE
XPANDED>::value }, | 366 { SkTFixed<SkFS::kExtraExpanded_Width>::value, SkTFixed<FC_WIDTH_EXTRAE
XPANDED>::value }, |
| 367 { SkTFixed<SkFS::kUltaExpanded_Width>::value, SkTFixed<FC_WIDTH_ULTRAE
XPANDED>::value }, | 367 { SkTFixed<SkFS::kUltaExpanded_Width>::value, SkTFixed<FC_WIDTH_ULTRAE
XPANDED>::value }, |
| 368 }; | 368 }; |
| 369 int width = map_ranges(style.width(), widthRanges, SK_ARRAY_COUNT(widthRange
s)); | 369 int width = map_ranges(style.width(), widthRanges, SK_ARRAY_COUNT(widthRange
s)); |
| 370 | 370 |
| 371 FcPatternAddInteger(pattern, FC_WEIGHT, weight); | 371 FcPatternAddInteger(pattern, FC_WEIGHT, weight); |
| 372 FcPatternAddInteger(pattern, FC_WIDTH, width); | 372 FcPatternAddInteger(pattern, FC_WIDTH, width); |
| 373 FcPatternAddInteger(pattern, FC_SLANT, style.isItalic() ? FC_SLANT_ITALIC :
FC_SLANT_ROMAN); | 373 FcPatternAddInteger(pattern, FC_SLANT, style.isItalic() ? FC_SLANT_ITALIC :
FC_SLANT_ROMAN); |
| 374 } | 374 } |
| 375 | 375 |
| 376 static SkTypeface::Style sktypefacestyle_from_fcpattern(FcPattern* pattern) { | |
| 377 int fcweight = get_int(pattern, FC_WEIGHT, FC_WEIGHT_REGULAR); | |
| 378 int fcslant = get_int(pattern, FC_SLANT, FC_SLANT_ROMAN); | |
| 379 return (SkTypeface::Style)((fcweight >= FC_WEIGHT_BOLD ? SkTypeface::kBold :
0) | | |
| 380 (fcslant > FC_SLANT_ROMAN ? SkTypeface::kItalic
: 0)); | |
| 381 } | |
| 382 | |
| 383 class SkTypeface_stream : public SkTypeface_FreeType { | 376 class SkTypeface_stream : public SkTypeface_FreeType { |
| 384 public: | 377 public: |
| 385 /** @param stream does not take ownership of the reference, does take owners
hip of the stream.*/ | 378 /** @param stream does not take ownership of the reference, does take owners
hip of the stream.*/ |
| 386 SkTypeface_stream(SkTypeface::Style style, bool fixedWidth, int ttcIndex, Sk
StreamAsset* stream) | 379 SkTypeface_stream(const SkFontStyle& style, bool fixedWidth, int index, SkSt
reamAsset* stream) |
| 387 : INHERITED(style, SkTypefaceCache::NewFontID(), fixedWidth) | 380 : INHERITED(style, SkTypefaceCache::NewFontID(), fixedWidth) |
| 388 , fStream(SkRef(stream)) | 381 , fStream(SkRef(stream)) |
| 389 , fIndex(ttcIndex) | 382 , fIndex(index) |
| 390 { }; | 383 { }; |
| 391 | 384 |
| 392 virtual void onGetFamilyName(SkString* familyName) const SK_OVERRIDE { | 385 virtual void onGetFamilyName(SkString* familyName) const SK_OVERRIDE { |
| 393 familyName->reset(); | 386 familyName->reset(); |
| 394 } | 387 } |
| 395 | 388 |
| 396 virtual void onGetFontDescriptor(SkFontDescriptor* desc, bool* serialize) co
nst SK_OVERRIDE { | 389 virtual void onGetFontDescriptor(SkFontDescriptor* desc, bool* serialize) co
nst SK_OVERRIDE { |
| 397 desc->setFontIndex(fIndex); | 390 desc->setFontIndex(fIndex); |
| 398 *serialize = true; | 391 *serialize = true; |
| 399 } | 392 } |
| (...skipping 40 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 440 | 433 |
| 441 virtual ~SkTypeface_fontconfig() { | 434 virtual ~SkTypeface_fontconfig() { |
| 442 // Hold the lock while unrefing the pattern. | 435 // Hold the lock while unrefing the pattern. |
| 443 FCLocker lock; | 436 FCLocker lock; |
| 444 fPattern.reset(); | 437 fPattern.reset(); |
| 445 } | 438 } |
| 446 | 439 |
| 447 private: | 440 private: |
| 448 /** @param pattern takes ownership of the reference. */ | 441 /** @param pattern takes ownership of the reference. */ |
| 449 SkTypeface_fontconfig(FcPattern* pattern) | 442 SkTypeface_fontconfig(FcPattern* pattern) |
| 450 : INHERITED(sktypefacestyle_from_fcpattern(pattern), | 443 : INHERITED(skfontstyle_from_fcpattern(pattern), |
| 451 SkTypefaceCache::NewFontID(), | 444 SkTypefaceCache::NewFontID(), |
| 452 FC_PROPORTIONAL != get_int(pattern, FC_SPACING, FC_PROPORTIO
NAL)) | 445 FC_PROPORTIONAL != get_int(pattern, FC_SPACING, FC_PROPORTIO
NAL)) |
| 453 , fPattern(pattern) | 446 , fPattern(pattern) |
| 454 { }; | 447 { }; |
| 455 | 448 |
| 456 typedef SkTypeface_FreeType INHERITED; | 449 typedef SkTypeface_FreeType INHERITED; |
| 457 }; | 450 }; |
| 458 | 451 |
| 459 class SkFontMgr_fontconfig : public SkFontMgr { | 452 class SkFontMgr_fontconfig : public SkFontMgr { |
| 460 mutable SkAutoFcConfig fFC; | 453 mutable SkAutoFcConfig fFC; |
| (...skipping 103 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 564 *sizes.append() = strlen(familyName) + 1; | 557 *sizes.append() = strlen(familyName) + 1; |
| 565 } | 558 } |
| 566 } | 559 } |
| 567 } | 560 } |
| 568 } | 561 } |
| 569 | 562 |
| 570 return SkDataTable::NewCopyArrays((void const *const *)names.begin(), | 563 return SkDataTable::NewCopyArrays((void const *const *)names.begin(), |
| 571 sizes.begin(), names.count()); | 564 sizes.begin(), names.count()); |
| 572 } | 565 } |
| 573 | 566 |
| 574 static bool FindByFcPattern(SkTypeface* cached, SkTypeface::Style, void* ctx
) { | 567 static bool FindByFcPattern(SkTypeface* cached, const SkFontStyle&, void* ct
x) { |
| 575 SkTypeface_fontconfig* cshFace = static_cast<SkTypeface_fontconfig*>(cac
hed); | 568 SkTypeface_fontconfig* cshFace = static_cast<SkTypeface_fontconfig*>(cac
hed); |
| 576 FcPattern* ctxPattern = static_cast<FcPattern*>(ctx); | 569 FcPattern* ctxPattern = static_cast<FcPattern*>(ctx); |
| 577 return FcTrue == FcPatternEqual(cshFace->fPattern, ctxPattern); | 570 return FcTrue == FcPatternEqual(cshFace->fPattern, ctxPattern); |
| 578 } | 571 } |
| 579 | 572 |
| 580 mutable SkMutex fTFCacheMutex; | 573 mutable SkMutex fTFCacheMutex; |
| 581 mutable SkTypefaceCache fTFCache; | 574 mutable SkTypefaceCache fTFCache; |
| 582 /** Creates a typeface using a typeface cache. | 575 /** Creates a typeface using a typeface cache. |
| 583 * @param pattern a complete pattern from FcFontRenderPrepare. | 576 * @param pattern a complete pattern from FcFontRenderPrepare. |
| 584 */ | 577 */ |
| 585 SkTypeface* createTypefaceFromFcPattern(FcPattern* pattern) const { | 578 SkTypeface* createTypefaceFromFcPattern(FcPattern* pattern) const { |
| 586 FCLocker::AssertHeld(); | 579 FCLocker::AssertHeld(); |
| 587 SkAutoMutexAcquire ama(fTFCacheMutex); | 580 SkAutoMutexAcquire ama(fTFCacheMutex); |
| 588 SkTypeface* face = fTFCache.findByProcAndRef(FindByFcPattern, pattern); | 581 SkTypeface* face = fTFCache.findByProcAndRef(FindByFcPattern, pattern); |
| 589 if (NULL == face) { | 582 if (NULL == face) { |
| 590 FcPatternReference(pattern); | 583 FcPatternReference(pattern); |
| 591 face = SkTypeface_fontconfig::Create(pattern); | 584 face = SkTypeface_fontconfig::Create(pattern); |
| 592 if (face) { | 585 if (face) { |
| 593 fTFCache.add(face, SkTypeface::kNormal, true); | 586 fTFCache.add(face, SkFontStyle(), true); |
| 594 } | 587 } |
| 595 } | 588 } |
| 596 return face; | 589 return face; |
| 597 } | 590 } |
| 598 | 591 |
| 599 public: | 592 public: |
| 600 SkFontMgr_fontconfig() | 593 SkFontMgr_fontconfig() |
| 601 : fFC(FcInitLoadConfigAndFonts()) | 594 : fFC(FcInitLoadConfigAndFonts()) |
| 602 , fFamilyNames(GetFamilyNames(fFC)) { } | 595 , fFamilyNames(GetFamilyNames(fFC)) { } |
| 603 | 596 |
| (...skipping 207 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 811 return this->matchFamilyStyle(get_string(fcTypeface->fPattern, FC_FAMILY
), style); | 804 return this->matchFamilyStyle(get_string(fcTypeface->fPattern, FC_FAMILY
), style); |
| 812 } | 805 } |
| 813 | 806 |
| 814 /** @param stream does not take ownership of the reference. */ | 807 /** @param stream does not take ownership of the reference. */ |
| 815 virtual SkTypeface* onCreateFromStream(SkStream* stream, int ttcIndex) const
SK_OVERRIDE { | 808 virtual SkTypeface* onCreateFromStream(SkStream* stream, int ttcIndex) const
SK_OVERRIDE { |
| 816 const size_t length = stream->getLength(); | 809 const size_t length = stream->getLength(); |
| 817 if (length <= 0 || (1u << 30) < length) { | 810 if (length <= 0 || (1u << 30) < length) { |
| 818 return NULL; | 811 return NULL; |
| 819 } | 812 } |
| 820 | 813 |
| 821 SkTypeface::Style style = SkTypeface::kNormal; | 814 SkFontStyle style; |
| 822 bool isFixedWidth = false; | 815 bool isFixedWidth = false; |
| 823 if (!SkTypeface_FreeType::ScanFont(stream, ttcIndex, NULL, &style, &isFi
xedWidth)) { | 816 if (!SkTypeface_FreeType::ScanFont(stream, ttcIndex, NULL, &style, &isFi
xedWidth)) { |
| 824 return NULL; | 817 return NULL; |
| 825 } | 818 } |
| 826 | 819 |
| 827 return SkNEW_ARGS(SkTypeface_stream, (style, isFixedWidth, ttcIndex, | 820 return SkNEW_ARGS(SkTypeface_stream, (style, isFixedWidth, ttcIndex, |
| 828 static_cast<SkStreamAsset*>(stream
))); | 821 static_cast<SkStreamAsset*>(stream
))); |
| 829 } | 822 } |
| 830 | 823 |
| 831 virtual SkTypeface* onCreateFromData(SkData* data, int ttcIndex) const SK_OV
ERRIDE { | 824 virtual SkTypeface* onCreateFromData(SkData* data, int ttcIndex) const SK_OV
ERRIDE { |
| (...skipping 20 matching lines...) Expand all Loading... |
| 852 return typeface.detach(); | 845 return typeface.detach(); |
| 853 } | 846 } |
| 854 | 847 |
| 855 return this->matchFamilyStyle(NULL, style); | 848 return this->matchFamilyStyle(NULL, style); |
| 856 } | 849 } |
| 857 }; | 850 }; |
| 858 | 851 |
| 859 SkFontMgr* SkFontMgr::Factory() { | 852 SkFontMgr* SkFontMgr::Factory() { |
| 860 return SkNEW(SkFontMgr_fontconfig); | 853 return SkNEW(SkFontMgr_fontconfig); |
| 861 } | 854 } |
| OLD | NEW |