OLD | NEW |
1 /* | 1 /* |
2 * Copyright 2011 Google Inc. | 2 * Copyright 2011 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 "SkTypes.h" | 8 #include "SkTypes.h" |
9 #undef GetGlyphIndices | 9 #undef GetGlyphIndices |
10 | 10 |
(...skipping 467 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
478 HRV(factory->UnregisterFontFileLoader(fDWriteFontFileLoader.get())); | 478 HRV(factory->UnregisterFontFileLoader(fDWriteFontFileLoader.get())); |
479 } | 479 } |
480 | 480 |
481 protected: | 481 protected: |
482 virtual SkStream* onOpenStream(int* ttcIndex) const SK_OVERRIDE; | 482 virtual SkStream* onOpenStream(int* ttcIndex) const SK_OVERRIDE; |
483 virtual SkScalerContext* onCreateScalerContext(const SkDescriptor*) const SK
_OVERRIDE; | 483 virtual SkScalerContext* onCreateScalerContext(const SkDescriptor*) const SK
_OVERRIDE; |
484 virtual void onFilterRec(SkScalerContextRec*) const SK_OVERRIDE; | 484 virtual void onFilterRec(SkScalerContextRec*) const SK_OVERRIDE; |
485 virtual SkAdvancedTypefaceMetrics* onGetAdvancedTypefaceMetrics( | 485 virtual SkAdvancedTypefaceMetrics* onGetAdvancedTypefaceMetrics( |
486 SkAdvancedTypefaceMetrics::PerGlyphInfo, | 486 SkAdvancedTypefaceMetrics::PerGlyphInfo, |
487 const uint32_t*, uint32_t) const SK_OVERRIDE; | 487 const uint32_t*, uint32_t) const SK_OVERRIDE; |
| 488 virtual void onGetFontDescriptor(SkFontDescriptor*, bool*) const SK_OVERRIDE
; |
488 }; | 489 }; |
489 | 490 |
490 class SkScalerContext_Windows : public SkScalerContext { | 491 class SkScalerContext_Windows : public SkScalerContext { |
491 public: | 492 public: |
492 SkScalerContext_Windows(DWriteFontTypeface*, const SkDescriptor* desc); | 493 SkScalerContext_Windows(DWriteFontTypeface*, const SkDescriptor* desc); |
493 virtual ~SkScalerContext_Windows(); | 494 virtual ~SkScalerContext_Windows(); |
494 | 495 |
495 protected: | 496 protected: |
496 virtual unsigned generateGlyphCount() SK_OVERRIDE; | 497 virtual unsigned generateGlyphCount() SK_OVERRIDE; |
497 virtual uint16_t generateCharToGlyph(SkUnichar uni) SK_OVERRIDE; | 498 virtual uint16_t generateCharToGlyph(SkUnichar uni) SK_OVERRIDE; |
(...skipping 541 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1039 FALSE, //sideways | 1040 FALSE, //sideways |
1040 FALSE, //rtl | 1041 FALSE, //rtl |
1041 geometryToPath.get()), | 1042 geometryToPath.get()), |
1042 "Could not create glyph outline."); | 1043 "Could not create glyph outline."); |
1043 | 1044 |
1044 SkMatrix mat; | 1045 SkMatrix mat; |
1045 fRec.getMatrixFrom2x2(&mat); | 1046 fRec.getMatrixFrom2x2(&mat); |
1046 path->transform(mat); | 1047 path->transform(mat); |
1047 } | 1048 } |
1048 | 1049 |
1049 void SkFontHost::Serialize(const SkTypeface* rawFace, SkWStream* stream) { | 1050 void DWriteFontTypeface::onGetFontDescriptor(SkFontDescriptor* desc, |
1050 const DWriteFontTypeface* face = static_cast<const DWriteFontTypeface*>(rawF
ace); | 1051 bool* isLocalStream) const { |
1051 SkFontDescriptor descriptor(face->style()); | |
1052 | |
1053 // Get the family name. | 1052 // Get the family name. |
1054 SkTScopedComPtr<IDWriteLocalizedStrings> dwFamilyNames; | 1053 SkTScopedComPtr<IDWriteLocalizedStrings> dwFamilyNames; |
1055 HRV(face->fDWriteFontFamily->GetFamilyNames(&dwFamilyNames)); | 1054 HRV(fDWriteFontFamily->GetFamilyNames(&dwFamilyNames)); |
1056 | 1055 |
1057 UINT32 dwFamilyNamesLength; | 1056 UINT32 dwFamilyNamesLength; |
1058 HRV(dwFamilyNames->GetStringLength(0, &dwFamilyNamesLength)); | 1057 HRV(dwFamilyNames->GetStringLength(0, &dwFamilyNamesLength)); |
1059 | 1058 |
1060 SkTDArray<wchar_t> dwFamilyNameChar(new wchar_t[dwFamilyNamesLength+1], dwFa
milyNamesLength+1); | 1059 SkTDArray<wchar_t> dwFamilyNameChar(new wchar_t[dwFamilyNamesLength+1], dwFa
milyNamesLength+1); |
1061 HRV(dwFamilyNames->GetString(0, dwFamilyNameChar.begin(), dwFamilyNameChar.c
ount())); | 1060 HRV(dwFamilyNames->GetString(0, dwFamilyNameChar.begin(), dwFamilyNameChar.c
ount())); |
1062 | 1061 |
1063 // Convert the family name to utf8. | 1062 // Convert the family name to utf8. |
1064 // Get the buffer size needed first. | 1063 // Get the buffer size needed first. |
1065 int str_len = WideCharToMultiByte(CP_UTF8, 0, dwFamilyNameChar.begin(), -1, | 1064 int str_len = WideCharToMultiByte(CP_UTF8, 0, dwFamilyNameChar.begin(), -1, |
1066 NULL, 0, NULL, NULL); | 1065 NULL, 0, NULL, NULL); |
1067 // Allocate a buffer (str_len already has terminating null accounted for). | 1066 // Allocate a buffer (str_len already has terminating null accounted for). |
1068 SkTDArray<char> utf8FamilyName(new char[str_len], str_len); | 1067 SkTDArray<char> utf8FamilyName(new char[str_len], str_len); |
1069 // Now actually convert the string. | 1068 // Now actually convert the string. |
1070 str_len = WideCharToMultiByte(CP_UTF8, 0, dwFamilyNameChar.begin(), -1, | 1069 str_len = WideCharToMultiByte(CP_UTF8, 0, dwFamilyNameChar.begin(), -1, |
1071 utf8FamilyName.begin(), str_len, NULL, NULL); | 1070 utf8FamilyName.begin(), str_len, NULL, NULL); |
1072 | 1071 |
1073 descriptor.setFamilyName(utf8FamilyName.begin()); | 1072 desc->setFamilyName(utf8FamilyName.begin()); |
1074 //TODO: FileName and PostScriptName currently unsupported. | 1073 *isLocalStream = SkToBool(fDWriteFontFileLoader.get()); |
1075 | |
1076 descriptor.serialize(stream); | |
1077 | |
1078 if (NULL != face->fDWriteFontFileLoader.get()) { | |
1079 // store the entire font in the fontData | |
1080 SkStream* fontStream = face->fDWriteFontFileLoader->fStream.get(); | |
1081 const uint32_t length = fontStream->getLength(); | |
1082 | |
1083 stream->writePackedUInt(length); | |
1084 stream->writeStream(fontStream, length); | |
1085 } else { | |
1086 stream->writePackedUInt(0); | |
1087 } | |
1088 } | |
1089 | |
1090 SkTypeface* SkFontHost::Deserialize(SkStream* stream) { | |
1091 SkFontDescriptor descriptor(stream); | |
1092 | |
1093 const uint32_t customFontDataLength = stream->readPackedUInt(); | |
1094 if (customFontDataLength > 0) { | |
1095 // generate a new stream to store the custom typeface | |
1096 SkAutoTUnref<SkMemoryStream> fontStream(SkNEW_ARGS(SkMemoryStream, (cust
omFontDataLength - 1))); | |
1097 stream->read((void*)fontStream->getMemoryBase(), customFontDataLength -
1); | |
1098 | |
1099 return CreateTypefaceFromStream(fontStream.get()); | |
1100 } | |
1101 | |
1102 return SkFontHost::CreateTypeface(NULL, descriptor.getFamilyName(), descript
or.getStyle()); | |
1103 } | 1074 } |
1104 | 1075 |
1105 SkTypeface* SkFontHost::CreateTypefaceFromStream(SkStream* stream) { | 1076 SkTypeface* SkFontHost::CreateTypefaceFromStream(SkStream* stream) { |
1106 IDWriteFactory* factory; | 1077 IDWriteFactory* factory; |
1107 HRN(get_dwrite_factory(&factory)); | 1078 HRN(get_dwrite_factory(&factory)); |
1108 | 1079 |
1109 SkTScopedComPtr<StreamFontFileLoader> fontFileLoader; | 1080 SkTScopedComPtr<StreamFontFileLoader> fontFileLoader; |
1110 HRN(StreamFontFileLoader::Create(stream, &fontFileLoader)); | 1081 HRN(StreamFontFileLoader::Create(stream, &fontFileLoader)); |
1111 HRN(factory->RegisterFontFileLoader(fontFileLoader.get())); | 1082 HRN(factory->RegisterFontFileLoader(fontFileLoader.get())); |
1112 | 1083 |
(...skipping 434 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1547 getAdvanceData(fDWriteFontFace.get(), | 1518 getAdvanceData(fDWriteFontFace.get(), |
1548 glyphCount, | 1519 glyphCount, |
1549 glyphIDs, | 1520 glyphIDs, |
1550 glyphIDsCount, | 1521 glyphIDsCount, |
1551 getWidthAdvance)); | 1522 getWidthAdvance)); |
1552 } | 1523 } |
1553 } | 1524 } |
1554 | 1525 |
1555 return info; | 1526 return info; |
1556 } | 1527 } |
OLD | NEW |