| 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 <ctype.h> | 8 #include <ctype.h> |
| 9 | 9 |
| 10 #include "SkData.h" | 10 #include "SkData.h" |
| (...skipping 1033 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1044 SkPDFCIDFont::~SkPDFCIDFont() {} | 1044 SkPDFCIDFont::~SkPDFCIDFont() {} |
| 1045 | 1045 |
| 1046 bool SkPDFCIDFont::addFontDescriptor(int16_t defaultWidth, | 1046 bool SkPDFCIDFont::addFontDescriptor(int16_t defaultWidth, |
| 1047 const SkTDArray<uint32_t>* subset) { | 1047 const SkTDArray<uint32_t>* subset) { |
| 1048 SkAutoTUnref<SkPDFDict> descriptor(new SkPDFDict("FontDescriptor")); | 1048 SkAutoTUnref<SkPDFDict> descriptor(new SkPDFDict("FontDescriptor")); |
| 1049 setFontDescriptor(descriptor.get()); | 1049 setFontDescriptor(descriptor.get()); |
| 1050 if (!addCommonFontDescriptorEntries(defaultWidth)) { | 1050 if (!addCommonFontDescriptorEntries(defaultWidth)) { |
| 1051 this->insertObjRef("FontDescriptor", descriptor.detach()); | 1051 this->insertObjRef("FontDescriptor", descriptor.detach()); |
| 1052 return false; | 1052 return false; |
| 1053 } | 1053 } |
| 1054 if (!canEmbed()) { | 1054 SkASSERT(this->canEmbed()); |
| 1055 this->insertObjRef("FontDescriptor", descriptor.detach()); | |
| 1056 return true; | |
| 1057 } | |
| 1058 | 1055 |
| 1059 switch (getType()) { | 1056 switch (getType()) { |
| 1060 case SkAdvancedTypefaceMetrics::kTrueType_Font: { | 1057 case SkAdvancedTypefaceMetrics::kTrueType_Font: { |
| 1061 size_t fontSize = 0; | 1058 size_t fontSize = 0; |
| 1062 #if defined(SK_SFNTLY_SUBSETTER) | 1059 #if defined(SK_SFNTLY_SUBSETTER) |
| 1063 if (this->canSubset()) { | 1060 if (this->canSubset()) { |
| 1064 SkAutoTUnref<SkPDFStream> fontStream; | 1061 SkAutoTUnref<SkPDFStream> fontStream; |
| 1065 SkPDFStream* rawStream = nullptr; | 1062 SkPDFStream* rawStream = nullptr; |
| 1066 fontSize = get_subset_font_stream(fontInfo()->fFontName.c_str(), | 1063 fontSize = get_subset_font_stream(fontInfo()->fFontName.c_str(), |
| 1067 typeface(), | 1064 typeface(), |
| (...skipping 147 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1215 int ttcIndex; | 1212 int ttcIndex; |
| 1216 size_t header SK_INIT_TO_AVOID_WARNING; | 1213 size_t header SK_INIT_TO_AVOID_WARNING; |
| 1217 size_t data SK_INIT_TO_AVOID_WARNING; | 1214 size_t data SK_INIT_TO_AVOID_WARNING; |
| 1218 size_t trailer SK_INIT_TO_AVOID_WARNING; | 1215 size_t trailer SK_INIT_TO_AVOID_WARNING; |
| 1219 SkAutoTDelete<SkStream> rawFontData(typeface()->openStream(&ttcIndex)); | 1216 SkAutoTDelete<SkStream> rawFontData(typeface()->openStream(&ttcIndex)); |
| 1220 SkAutoTUnref<SkData> fontData(handle_type1_stream(rawFontData.get(), &header
, | 1217 SkAutoTUnref<SkData> fontData(handle_type1_stream(rawFontData.get(), &header
, |
| 1221 &data, &trailer)); | 1218 &data, &trailer)); |
| 1222 if (fontData.get() == nullptr) { | 1219 if (fontData.get() == nullptr) { |
| 1223 return false; | 1220 return false; |
| 1224 } | 1221 } |
| 1225 if (canEmbed()) { | 1222 SkASSERT(this->canEmbed()); |
| 1226 SkAutoTUnref<SkPDFStream> fontStream(new SkPDFStream(fontData.get())); | 1223 SkAutoTUnref<SkPDFStream> fontStream(new SkPDFStream(fontData.get())); |
| 1227 fontStream->insertInt("Length1", header); | 1224 fontStream->insertInt("Length1", header); |
| 1228 fontStream->insertInt("Length2", data); | 1225 fontStream->insertInt("Length2", data); |
| 1229 fontStream->insertInt("Length3", trailer); | 1226 fontStream->insertInt("Length3", trailer); |
| 1230 descriptor->insertObjRef("FontFile", fontStream.detach()); | 1227 descriptor->insertObjRef("FontFile", fontStream.detach()); |
| 1231 } | |
| 1232 | 1228 |
| 1233 this->insertObjRef("FontDescriptor", descriptor.detach()); | 1229 this->insertObjRef("FontDescriptor", descriptor.detach()); |
| 1234 | 1230 |
| 1235 return addCommonFontDescriptorEntries(defaultWidth); | 1231 return addCommonFontDescriptorEntries(defaultWidth); |
| 1236 } | 1232 } |
| 1237 | 1233 |
| 1238 bool SkPDFType1Font::populate(int16_t glyphID) { | 1234 bool SkPDFType1Font::populate(int16_t glyphID) { |
| 1239 SkASSERT(!fontInfo()->fVerticalMetrics.get()); | 1235 SkASSERT(!fontInfo()->fVerticalMetrics.get()); |
| 1240 SkASSERT(fontInfo()->fGlyphWidths.get()); | 1236 SkASSERT(fontInfo()->fGlyphWidths.get()); |
| 1241 | 1237 |
| (...skipping 169 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1411 } | 1407 } |
| 1412 if (existingFont != nullptr) { | 1408 if (existingFont != nullptr) { |
| 1413 return (existingFont->fFirstGlyphID <= searchGlyphID && | 1409 return (existingFont->fFirstGlyphID <= searchGlyphID && |
| 1414 searchGlyphID <= existingFont->fLastGlyphID) | 1410 searchGlyphID <= existingFont->fLastGlyphID) |
| 1415 ? SkPDFFont::kExact_Match | 1411 ? SkPDFFont::kExact_Match |
| 1416 : SkPDFFont::kRelated_Match; | 1412 : SkPDFFont::kRelated_Match; |
| 1417 } | 1413 } |
| 1418 return (existingGlyphID == searchGlyphID) ? SkPDFFont::kExact_Match | 1414 return (existingGlyphID == searchGlyphID) ? SkPDFFont::kExact_Match |
| 1419 : SkPDFFont::kRelated_Match; | 1415 : SkPDFFont::kRelated_Match; |
| 1420 } | 1416 } |
| 1417 |
| 1418 // Since getAdvancedTypefaceMetrics is expensive, cache the result. |
| 1419 bool SkPDFFont::CanEmbedTypeface(SkTypeface* typeface, SkPDFCanon* canon) { |
| 1420 SkAutoResolveDefaultTypeface face(typeface); |
| 1421 uint32_t id = face->uniqueID(); |
| 1422 if (bool* value = canon->fCanEmbedTypeface.find(id)) { |
| 1423 return *value; |
| 1424 } |
| 1425 bool canEmbed = true; |
| 1426 SkAutoTUnref<const SkAdvancedTypefaceMetrics> fontMetrics( |
| 1427 face->getAdvancedTypefaceMetrics( |
| 1428 SkTypeface::kNo_PerGlyphInfo, nullptr, 0)); |
| 1429 if (fontMetrics) { |
| 1430 canEmbed = !SkToBool( |
| 1431 fontMetrics->fFlags & |
| 1432 SkAdvancedTypefaceMetrics::kNotEmbeddable_FontFlag); |
| 1433 } |
| 1434 return *canon->fCanEmbedTypeface.set(id, canEmbed); |
| 1435 } |
| OLD | NEW |