| 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 876 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 887 | 887 |
| 888 if (info && (info->fFlags & SkAdvancedTypefaceMetrics::kMultiMaster_FontFlag
)) { | 888 if (info && (info->fFlags & SkAdvancedTypefaceMetrics::kMultiMaster_FontFlag
)) { |
| 889 return new SkPDFType3Font(info, typeface, glyphID); | 889 return new SkPDFType3Font(info, typeface, glyphID); |
| 890 } | 890 } |
| 891 if (type == SkAdvancedTypefaceMetrics::kType1CID_Font || | 891 if (type == SkAdvancedTypefaceMetrics::kType1CID_Font || |
| 892 type == SkAdvancedTypefaceMetrics::kTrueType_Font) { | 892 type == SkAdvancedTypefaceMetrics::kTrueType_Font) { |
| 893 SkASSERT(relatedFontDescriptor == NULL); | 893 SkASSERT(relatedFontDescriptor == NULL); |
| 894 return new SkPDFType0Font(info, typeface); | 894 return new SkPDFType0Font(info, typeface); |
| 895 } | 895 } |
| 896 if (type == SkAdvancedTypefaceMetrics::kType1_Font) { | 896 if (type == SkAdvancedTypefaceMetrics::kType1_Font) { |
| 897 return new SkPDFType1Font(info, typeface, glyphID, | 897 return new SkPDFType1Font(info, typeface, glyphID, relatedFontDescriptor
); |
| 898 relatedFontDescriptor); | |
| 899 } | 898 } |
| 900 | 899 |
| 901 SkASSERT(type == SkAdvancedTypefaceMetrics::kCFF_Font || | 900 SkASSERT(type == SkAdvancedTypefaceMetrics::kCFF_Font || |
| 902 type == SkAdvancedTypefaceMetrics::kOther_Font); | 901 type == SkAdvancedTypefaceMetrics::kOther_Font); |
| 903 | 902 |
| 904 return new SkPDFType3Font(info, typeface, glyphID); | 903 return new SkPDFType3Font(info, typeface, glyphID); |
| 905 } | 904 } |
| 906 | 905 |
| 907 const SkAdvancedTypefaceMetrics* SkPDFFont::fontInfo() { | 906 const SkAdvancedTypefaceMetrics* SkPDFFont::fontInfo() { |
| 908 return fFontInfo.get(); | 907 return fFontInfo.get(); |
| (...skipping 74 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 983 subset, | 982 subset, |
| 984 multiByteGlyphs(), | 983 multiByteGlyphs(), |
| 985 firstGlyphID(), | 984 firstGlyphID(), |
| 986 lastGlyphID())); | 985 lastGlyphID())); |
| 987 } | 986 } |
| 988 | 987 |
| 989 /////////////////////////////////////////////////////////////////////////////// | 988 /////////////////////////////////////////////////////////////////////////////// |
| 990 // class SkPDFType0Font | 989 // class SkPDFType0Font |
| 991 /////////////////////////////////////////////////////////////////////////////// | 990 /////////////////////////////////////////////////////////////////////////////// |
| 992 | 991 |
| 993 SkPDFType0Font::SkPDFType0Font(const SkAdvancedTypefaceMetrics* info, | 992 SkPDFType0Font::SkPDFType0Font(const SkAdvancedTypefaceMetrics* info, SkTypeface
* typeface) |
| 994 SkTypeface* typeface) | |
| 995 : SkPDFFont(info, typeface, NULL) { | 993 : SkPDFFont(info, typeface, NULL) { |
| 996 SkDEBUGCODE(fPopulated = false); | 994 SkDEBUGCODE(fPopulated = false); |
| 997 if (!canSubset()) { | 995 if (!canSubset()) { |
| 998 populate(NULL); | 996 this->populate(NULL); |
| 999 } | 997 } |
| 1000 } | 998 } |
| 1001 | 999 |
| 1002 SkPDFType0Font::~SkPDFType0Font() {} | 1000 SkPDFType0Font::~SkPDFType0Font() {} |
| 1003 | 1001 |
| 1004 SkPDFFont* SkPDFType0Font::getFontSubset(const SkPDFGlyphSet* subset) { | 1002 SkPDFFont* SkPDFType0Font::getFontSubset(const SkPDFGlyphSet* subset) { |
| 1005 if (!canSubset()) { | 1003 if (!canSubset()) { |
| 1006 return NULL; | 1004 return NULL; |
| 1007 } | 1005 } |
| 1008 SkPDFType0Font* newSubset = | 1006 SkPDFType0Font* newSubset = new SkPDFType0Font(fontInfo(), typeface()); |
| 1009 new SkPDFType0Font(fontInfo(), typeface()); | |
| 1010 newSubset->populate(subset); | 1007 newSubset->populate(subset); |
| 1011 return newSubset; | 1008 return newSubset; |
| 1012 } | 1009 } |
| 1013 | 1010 |
| 1014 #ifdef SK_DEBUG | 1011 #ifdef SK_DEBUG |
| 1015 void SkPDFType0Font::emitObject(SkWStream* stream, | 1012 void SkPDFType0Font::emitObject(SkWStream* stream, |
| 1016 const SkPDFObjNumMap& objNumMap, | 1013 const SkPDFObjNumMap& objNumMap, |
| 1017 const SkPDFSubstituteMap& substitutes) { | 1014 const SkPDFSubstituteMap& substitutes) { |
| 1018 SkASSERT(fPopulated); | 1015 SkASSERT(fPopulated); |
| 1019 return INHERITED::emitObject(stream, objNumMap, substitutes); | 1016 return INHERITED::emitObject(stream, objNumMap, substitutes); |
| 1020 } | 1017 } |
| 1021 #endif | 1018 #endif |
| 1022 | 1019 |
| 1023 bool SkPDFType0Font::populate(const SkPDFGlyphSet* subset) { | 1020 bool SkPDFType0Font::populate(const SkPDFGlyphSet* subset) { |
| 1024 insertName("Subtype", "Type0"); | 1021 insertName("Subtype", "Type0"); |
| 1025 insertName("BaseFont", fontInfo()->fFontName); | 1022 insertName("BaseFont", fontInfo()->fFontName); |
| 1026 insertName("Encoding", "Identity-H"); | 1023 insertName("Encoding", "Identity-H"); |
| 1027 | 1024 |
| 1028 SkAutoTUnref<SkPDFCIDFont> newCIDFont( | 1025 SkAutoTUnref<SkPDFCIDFont> newCIDFont( |
| 1029 new SkPDFCIDFont(fontInfo(), typeface(), subset)); | 1026 new SkPDFCIDFont(fontInfo(), typeface(), subset)); |
| 1030 SkAutoTUnref<SkPDFArray> descendantFonts(new SkPDFArray()); | 1027 SkAutoTUnref<SkPDFArray> descendantFonts(new SkPDFArray()); |
| 1031 descendantFonts->appendObjRef(newCIDFont.detach()); | 1028 descendantFonts->appendObjRef(newCIDFont.detach()); |
| 1032 this->insertObject("DescendantFonts", descendantFonts.detach()); | 1029 this->insertObject("DescendantFonts", descendantFonts.detach()); |
| 1033 | 1030 |
| 1034 populateToUnicodeTable(subset); | 1031 this->populateToUnicodeTable(subset); |
| 1035 | 1032 |
| 1036 SkDEBUGCODE(fPopulated = true); | 1033 SkDEBUGCODE(fPopulated = true); |
| 1037 return true; | 1034 return true; |
| 1038 } | 1035 } |
| 1039 | 1036 |
| 1040 /////////////////////////////////////////////////////////////////////////////// | 1037 /////////////////////////////////////////////////////////////////////////////// |
| 1041 // class SkPDFCIDFont | 1038 // class SkPDFCIDFont |
| 1042 /////////////////////////////////////////////////////////////////////////////// | 1039 /////////////////////////////////////////////////////////////////////////////// |
| 1043 | 1040 |
| 1044 SkPDFCIDFont::SkPDFCIDFont(const SkAdvancedTypefaceMetrics* info, | 1041 SkPDFCIDFont::SkPDFCIDFont(const SkAdvancedTypefaceMetrics* info, |
| 1045 SkTypeface* typeface, | 1042 SkTypeface* typeface, |
| 1046 const SkPDFGlyphSet* subset) | 1043 const SkPDFGlyphSet* subset) |
| 1047 : SkPDFFont(info, typeface, NULL) { | 1044 : SkPDFFont(info, typeface, NULL) { |
| 1048 populate(subset); | 1045 this->populate(subset); |
| 1049 } | 1046 } |
| 1050 | 1047 |
| 1051 SkPDFCIDFont::~SkPDFCIDFont() {} | 1048 SkPDFCIDFont::~SkPDFCIDFont() {} |
| 1052 | 1049 |
| 1053 bool SkPDFCIDFont::addFontDescriptor(int16_t defaultWidth, | 1050 bool SkPDFCIDFont::addFontDescriptor(int16_t defaultWidth, |
| 1054 const SkTDArray<uint32_t>* subset) { | 1051 const SkTDArray<uint32_t>* subset) { |
| 1055 SkAutoTUnref<SkPDFDict> descriptor(new SkPDFDict("FontDescriptor")); | 1052 SkAutoTUnref<SkPDFDict> descriptor(new SkPDFDict("FontDescriptor")); |
| 1056 setFontDescriptor(descriptor.get()); | 1053 setFontDescriptor(descriptor.get()); |
| 1057 if (!addCommonFontDescriptorEntries(defaultWidth)) { | 1054 if (!addCommonFontDescriptorEntries(defaultWidth)) { |
| 1058 this->insertObjRef("FontDescriptor", descriptor.detach()); | 1055 this->insertObjRef("FontDescriptor", descriptor.detach()); |
| (...skipping 136 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1195 | 1192 |
| 1196 /////////////////////////////////////////////////////////////////////////////// | 1193 /////////////////////////////////////////////////////////////////////////////// |
| 1197 // class SkPDFType1Font | 1194 // class SkPDFType1Font |
| 1198 /////////////////////////////////////////////////////////////////////////////// | 1195 /////////////////////////////////////////////////////////////////////////////// |
| 1199 | 1196 |
| 1200 SkPDFType1Font::SkPDFType1Font(const SkAdvancedTypefaceMetrics* info, | 1197 SkPDFType1Font::SkPDFType1Font(const SkAdvancedTypefaceMetrics* info, |
| 1201 SkTypeface* typeface, | 1198 SkTypeface* typeface, |
| 1202 uint16_t glyphID, | 1199 uint16_t glyphID, |
| 1203 SkPDFDict* relatedFontDescriptor) | 1200 SkPDFDict* relatedFontDescriptor) |
| 1204 : SkPDFFont(info, typeface, relatedFontDescriptor) { | 1201 : SkPDFFont(info, typeface, relatedFontDescriptor) { |
| 1205 populate(glyphID); | 1202 this->populate(glyphID); |
| 1206 } | 1203 } |
| 1207 | 1204 |
| 1208 SkPDFType1Font::~SkPDFType1Font() {} | 1205 SkPDFType1Font::~SkPDFType1Font() {} |
| 1209 | 1206 |
| 1210 bool SkPDFType1Font::addFontDescriptor(int16_t defaultWidth) { | 1207 bool SkPDFType1Font::addFontDescriptor(int16_t defaultWidth) { |
| 1211 if (SkPDFDict* descriptor = getFontDescriptor()) { | 1208 if (SkPDFDict* descriptor = getFontDescriptor()) { |
| 1212 this->insertObjRef("FontDescriptor", SkRef(descriptor)); | 1209 this->insertObjRef("FontDescriptor", SkRef(descriptor)); |
| 1213 return true; | 1210 return true; |
| 1214 } | 1211 } |
| 1215 | 1212 |
| (...skipping 102 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1318 } | 1315 } |
| 1319 | 1316 |
| 1320 /////////////////////////////////////////////////////////////////////////////// | 1317 /////////////////////////////////////////////////////////////////////////////// |
| 1321 // class SkPDFType3Font | 1318 // class SkPDFType3Font |
| 1322 /////////////////////////////////////////////////////////////////////////////// | 1319 /////////////////////////////////////////////////////////////////////////////// |
| 1323 | 1320 |
| 1324 SkPDFType3Font::SkPDFType3Font(const SkAdvancedTypefaceMetrics* info, | 1321 SkPDFType3Font::SkPDFType3Font(const SkAdvancedTypefaceMetrics* info, |
| 1325 SkTypeface* typeface, | 1322 SkTypeface* typeface, |
| 1326 uint16_t glyphID) | 1323 uint16_t glyphID) |
| 1327 : SkPDFFont(info, typeface, NULL) { | 1324 : SkPDFFont(info, typeface, NULL) { |
| 1328 populate(glyphID); | 1325 this->populate(glyphID); |
| 1329 } | 1326 } |
| 1330 | 1327 |
| 1331 SkPDFType3Font::~SkPDFType3Font() {} | 1328 SkPDFType3Font::~SkPDFType3Font() {} |
| 1332 | 1329 |
| 1333 bool SkPDFType3Font::populate(uint16_t glyphID) { | 1330 bool SkPDFType3Font::populate(uint16_t glyphID) { |
| 1334 SkPaint paint; | 1331 SkPaint paint; |
| 1335 paint.setTypeface(typeface()); | 1332 paint.setTypeface(typeface()); |
| 1336 paint.setTextSize(1000); | 1333 paint.setTextSize(1000); |
| 1337 SkAutoGlyphCache autoCache(paint, NULL, NULL); | 1334 const SkSurfaceProps props(0, kUnknown_SkPixelGeometry); |
| 1335 SkAutoGlyphCache autoCache(paint, &props, NULL); |
| 1338 SkGlyphCache* cache = autoCache.getCache(); | 1336 SkGlyphCache* cache = autoCache.getCache(); |
| 1339 // If fLastGlyphID isn't set (because there is not fFontInfo), look it up. | 1337 // If fLastGlyphID isn't set (because there is not fFontInfo), look it up. |
| 1340 if (lastGlyphID() == 0) { | 1338 if (lastGlyphID() == 0) { |
| 1341 setLastGlyphID(cache->getGlyphCount() - 1); | 1339 setLastGlyphID(cache->getGlyphCount() - 1); |
| 1342 } | 1340 } |
| 1343 | 1341 |
| 1344 adjustGlyphRangeForSingleByteEncoding(glyphID); | 1342 adjustGlyphRangeForSingleByteEncoding(glyphID); |
| 1345 | 1343 |
| 1346 insertName("Subtype", "Type3"); | 1344 insertName("Subtype", "Type3"); |
| 1347 // Flip about the x-axis and scale by 1/1000. | 1345 // Flip about the x-axis and scale by 1/1000. |
| (...skipping 42 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1390 | 1388 |
| 1391 this->insertObject("CharProcs", charProcs.detach()); | 1389 this->insertObject("CharProcs", charProcs.detach()); |
| 1392 this->insertObject("Encoding", encoding.detach()); | 1390 this->insertObject("Encoding", encoding.detach()); |
| 1393 | 1391 |
| 1394 this->insertObject("FontBBox", makeFontBBox(bbox, 1000)); | 1392 this->insertObject("FontBBox", makeFontBBox(bbox, 1000)); |
| 1395 this->insertInt("FirstChar", 1); | 1393 this->insertInt("FirstChar", 1); |
| 1396 this->insertInt("LastChar", lastGlyphID() - firstGlyphID() + 1); | 1394 this->insertInt("LastChar", lastGlyphID() - firstGlyphID() + 1); |
| 1397 this->insertObject("Widths", widthArray.detach()); | 1395 this->insertObject("Widths", widthArray.detach()); |
| 1398 this->insertName("CIDToGIDMap", "Identity"); | 1396 this->insertName("CIDToGIDMap", "Identity"); |
| 1399 | 1397 |
| 1400 populateToUnicodeTable(NULL); | 1398 this->populateToUnicodeTable(NULL); |
| 1401 return true; | 1399 return true; |
| 1402 } | 1400 } |
| 1403 | 1401 |
| 1404 SkPDFFont::Match SkPDFFont::IsMatch(SkPDFFont* existingFont, | 1402 SkPDFFont::Match SkPDFFont::IsMatch(SkPDFFont* existingFont, |
| 1405 uint32_t existingFontID, | 1403 uint32_t existingFontID, |
| 1406 uint16_t existingGlyphID, | 1404 uint16_t existingGlyphID, |
| 1407 uint32_t searchFontID, | 1405 uint32_t searchFontID, |
| 1408 uint16_t searchGlyphID) { | 1406 uint16_t searchGlyphID) { |
| 1409 if (existingFontID != searchFontID) { | 1407 if (existingFontID != searchFontID) { |
| 1410 return SkPDFFont::kNot_Match; | 1408 return SkPDFFont::kNot_Match; |
| 1411 } | 1409 } |
| 1412 if (existingGlyphID == 0 || searchGlyphID == 0) { | 1410 if (existingGlyphID == 0 || searchGlyphID == 0) { |
| 1413 return SkPDFFont::kExact_Match; | 1411 return SkPDFFont::kExact_Match; |
| 1414 } | 1412 } |
| 1415 if (existingFont != NULL) { | 1413 if (existingFont != NULL) { |
| 1416 return (existingFont->fFirstGlyphID <= searchGlyphID && | 1414 return (existingFont->fFirstGlyphID <= searchGlyphID && |
| 1417 searchGlyphID <= existingFont->fLastGlyphID) | 1415 searchGlyphID <= existingFont->fLastGlyphID) |
| 1418 ? SkPDFFont::kExact_Match | 1416 ? SkPDFFont::kExact_Match |
| 1419 : SkPDFFont::kRelated_Match; | 1417 : SkPDFFont::kRelated_Match; |
| 1420 } | 1418 } |
| 1421 return (existingGlyphID == searchGlyphID) ? SkPDFFont::kExact_Match | 1419 return (existingGlyphID == searchGlyphID) ? SkPDFFont::kExact_Match |
| 1422 : SkPDFFont::kRelated_Match; | 1420 : SkPDFFont::kRelated_Match; |
| 1423 } | 1421 } |
| OLD | NEW |