Chromium Code Reviews| OLD | NEW |
|---|---|
| 1 /* | 1 /* |
| 2 * Copyright 2006 The Android Open Source Project | 2 * Copyright 2006 The Android Open Source Project |
| 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 "SkFontHost.h" | 8 #include "SkFontHost.h" |
| 9 #include "SkFontHost_FreeType_common.h" | 9 #include "SkFontHost_FreeType_common.h" |
| 10 #include "SkFontDescriptor.h" | 10 #include "SkFontDescriptor.h" |
| (...skipping 298 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 309 remove_from_names(family); | 309 remove_from_names(family); |
| 310 detach_and_delete_family(family); | 310 detach_and_delete_family(family); |
| 311 } | 311 } |
| 312 } | 312 } |
| 313 | 313 |
| 314 bool isSysFont() const { return fIsSysFont; } | 314 bool isSysFont() const { return fIsSysFont; } |
| 315 | 315 |
| 316 virtual const char* getUniqueString() const = 0; | 316 virtual const char* getUniqueString() const = 0; |
| 317 virtual const char* getFilePath() const = 0; | 317 virtual const char* getFilePath() const = 0; |
| 318 | 318 |
| 319 protected: | |
| 320 virtual void onGetFontDescriptor(SkFontDescriptor*, bool*) const SK_OVERRIDE ; | |
| 321 | |
| 319 private: | 322 private: |
| 320 bool fIsSysFont; | 323 bool fIsSysFont; |
| 321 | 324 |
| 322 typedef SkTypeface_FreeType INHERITED; | 325 typedef SkTypeface_FreeType INHERITED; |
| 323 }; | 326 }; |
| 324 | 327 |
| 325 /////////////////////////////////////////////////////////////////////////////// | 328 /////////////////////////////////////////////////////////////////////////////// |
| 326 | 329 |
| 327 class StreamTypeface : public FamilyTypeface { | 330 class StreamTypeface : public FamilyTypeface { |
| 328 public: | 331 public: |
| (...skipping 401 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 730 init_system_fonts(); | 733 init_system_fonts(); |
| 731 } else if (strncmp(locale.language, prevLocale.language, 2) || | 734 } else if (strncmp(locale.language, prevLocale.language, 2) || |
| 732 strncmp(locale.region, prevLocale.region, 2)) { | 735 strncmp(locale.region, prevLocale.region, 2)) { |
| 733 prevLocale = locale; | 736 prevLocale = locale; |
| 734 reload_fallback_fonts(); | 737 reload_fallback_fonts(); |
| 735 } | 738 } |
| 736 } | 739 } |
| 737 | 740 |
| 738 /////////////////////////////////////////////////////////////////////////////// | 741 /////////////////////////////////////////////////////////////////////////////// |
| 739 | 742 |
| 740 void SkFontHost::Serialize(const SkTypeface* face, SkWStream* stream) { | 743 void FamilyTypeface::onGetFontDescriptor(SkFontDescriptor* desc, |
| 741 | 744 bool* isLocalStream) const { |
| 742 SkFontDescriptor descriptor; | |
| 743 { | 745 { |
| 744 SkAutoMutexAcquire ac(gFamilyHeadAndNameListMutex); | 746 SkAutoMutexAcquire ac(gFamilyHeadAndNameListMutex); |
| 745 descriptor.setFamilyName(find_family_name(face)); | 747 desc->setFamilyName(find_family_name(this)); |
| 746 descriptor.setStyle(face->style()); | 748 desc->setFontFileName(this->getUniqueString()); |
| 747 descriptor.setFontFileName(((FamilyTypeface*)face)->getUniqueString()); | |
| 748 } | 749 } |
| 749 | 750 *isLocalStream = !this->isSysFont(); |
| 750 descriptor.serialize(stream); | |
| 751 | |
| 752 const bool isCustomFont = !((FamilyTypeface*)face)->isSysFont(); | |
| 753 if (isCustomFont) { | |
| 754 // store the entire font in the fontData | |
| 755 SkStream* fontStream = face->openStream(NULL); | |
| 756 const uint32_t length = fontStream->getLength(); | |
| 757 | |
| 758 stream->writePackedUInt(length); | |
| 759 stream->writeStream(fontStream, length); | |
| 760 | |
| 761 fontStream->unref(); | |
| 762 } else { | |
| 763 stream->writePackedUInt(0); | |
| 764 } | |
| 765 } | 751 } |
| 766 | 752 |
| 753 #if 0 // do we need this different name lookup for Deserialize? | |
|
bungeman-skia
2013/03/22 21:04:05
Should we ask djsollen about this?
reed1
2013/03/25 12:26:27
Done.
| |
| 767 SkTypeface* SkFontHost::Deserialize(SkStream* stream) { | 754 SkTypeface* SkFontHost::Deserialize(SkStream* stream) { |
| 768 { | 755 ... |
| 769 SkAutoMutexAcquire ac(gFamilyHeadAndNameListMutex); | |
| 770 load_system_fonts(); | |
| 771 } | |
| 772 | |
| 773 SkFontDescriptor descriptor(stream); | |
| 774 const char* familyName = descriptor.getFamilyName(); | |
| 775 const char* fontFileName = descriptor.getFontFileName(); | |
| 776 const SkTypeface::Style style = descriptor.getStyle(); | |
| 777 | |
| 778 const uint32_t customFontDataLength = stream->readPackedUInt(); | |
| 779 if (customFontDataLength > 0) { | |
| 780 | |
| 781 // generate a new stream to store the custom typeface | |
| 782 SkMemoryStream* fontStream = new SkMemoryStream(customFontDataLength - 1 ); | |
| 783 stream->read((void*)fontStream->getMemoryBase(), customFontDataLength - 1); | |
| 784 | |
| 785 SkTypeface* face = CreateTypefaceFromStream(fontStream); | |
| 786 | |
| 787 fontStream->unref(); | |
| 788 return face; | |
| 789 } | |
| 790 | |
| 791 if (NULL != fontFileName && 0 != *fontFileName) { | 756 if (NULL != fontFileName && 0 != *fontFileName) { |
| 792 const FontInitRec* rec = gSystemFonts; | 757 const FontInitRec* rec = gSystemFonts; |
| 793 for (size_t i = 0; i < gNumSystemFonts; i++) { | 758 for (size_t i = 0; i < gNumSystemFonts; i++) { |
| 794 if (strcmp(rec[i].fFileName, fontFileName) == 0) { | 759 if (strcmp(rec[i].fFileName, fontFileName) == 0) { |
| 795 // backup until we hit the fNames | 760 // backup until we hit the fNames |
| 796 for (int j = i; j >= 0; --j) { | 761 for (int j = i; j >= 0; --j) { |
| 797 if (rec[j].fNames != NULL) { | 762 if (rec[j].fNames != NULL) { |
| 798 return SkFontHost::CreateTypeface(NULL, | 763 return SkFontHost::CreateTypeface(NULL, |
| 799 rec[j].fNames[0], style); | 764 rec[j].fNames[0], style); |
| 800 } | 765 } |
| 801 } | 766 } |
| 802 } | 767 } |
| 803 } | 768 } |
| 804 } | 769 } |
| 805 | 770 ... |
| 806 return SkFontHost::CreateTypeface(NULL, familyName, style); | |
| 807 } | 771 } |
| 772 #endif | |
| 808 | 773 |
| 809 /////////////////////////////////////////////////////////////////////////////// | 774 /////////////////////////////////////////////////////////////////////////////// |
| 810 | 775 |
| 811 SkTypeface* SkFontHost::CreateTypeface(const SkTypeface* familyFace, | 776 SkTypeface* SkFontHost::CreateTypeface(const SkTypeface* familyFace, |
| 812 const char familyName[], | 777 const char familyName[], |
| 813 SkTypeface::Style style) { | 778 SkTypeface::Style style) { |
| 814 SkAutoMutexAcquire ac(gFamilyHeadAndNameListMutex); | 779 SkAutoMutexAcquire ac(gFamilyHeadAndNameListMutex); |
| 815 | 780 |
| 816 load_system_fonts(); | 781 load_system_fonts(); |
| 817 | 782 |
| (...skipping 273 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1091 const char* fontsdir) { | 1056 const char* fontsdir) { |
| 1092 gTestMainConfigFile = mainconf; | 1057 gTestMainConfigFile = mainconf; |
| 1093 gTestFallbackConfigFile = fallbackconf; | 1058 gTestFallbackConfigFile = fallbackconf; |
| 1094 gTestFontFilePrefix = fontsdir; | 1059 gTestFontFilePrefix = fontsdir; |
| 1095 SkASSERT(gTestMainConfigFile); | 1060 SkASSERT(gTestMainConfigFile); |
| 1096 SkASSERT(gTestFallbackConfigFile); | 1061 SkASSERT(gTestFallbackConfigFile); |
| 1097 SkASSERT(gTestFontFilePrefix); | 1062 SkASSERT(gTestFontFilePrefix); |
| 1098 SkDEBUGF(("Use Test Config File Main %s, Fallback %s, Font Dir %s", | 1063 SkDEBUGF(("Use Test Config File Main %s, Fallback %s, Font Dir %s", |
| 1099 gTestMainConfigFile, gTestFallbackConfigFile, gTestFontFilePrefix) ); | 1064 gTestMainConfigFile, gTestFallbackConfigFile, gTestFontFilePrefix) ); |
| 1100 } | 1065 } |
| OLD | NEW |