| OLD | NEW |
| 1 #include "SkPdfFont.h" | 1 #include "SkPdfFont.h" |
| 2 | 2 |
| 3 std::map<std::string, SkPdfStandardFontEntry>& getStandardFonts() { | 3 std::map<std::string, SkPdfStandardFontEntry>& getStandardFonts() { |
| 4 static std::map<std::string, SkPdfStandardFontEntry> gPdfStandardFonts; | 4 static std::map<std::string, SkPdfStandardFontEntry> gPdfStandardFonts; |
| 5 | 5 |
| 6 // TODO (edisonn): , vs - ? what does it mean? | 6 // TODO (edisonn): , vs - ? what does it mean? |
| 7 // TODO (edisonn): MT, PS, Oblique=italic?, ... what does it mean? | 7 // TODO (edisonn): MT, PS, Oblique=italic?, ... what does it mean? |
| 8 if (gPdfStandardFonts.empty()) { | 8 if (gPdfStandardFonts.empty()) { |
| 9 gPdfStandardFonts["Arial"] = {"Arial", false, false}; | 9 gPdfStandardFonts["Arial"] = {"Arial", false, false}; |
| 10 gPdfStandardFonts["Arial,Bold"] = {"Arial", true, false}; | 10 gPdfStandardFonts["Arial,Bold"] = {"Arial", true, false}; |
| (...skipping 52 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 63 gPdfStandardFonts["TimesNewRomanPS-Italic"] = {"Times New Roman", false,
true}; | 63 gPdfStandardFonts["TimesNewRomanPS-Italic"] = {"Times New Roman", false,
true}; |
| 64 gPdfStandardFonts["TimesNewRomanPS-ItalicMT"] = {"Times New Roman", fals
e, true}; | 64 gPdfStandardFonts["TimesNewRomanPS-ItalicMT"] = {"Times New Roman", fals
e, true}; |
| 65 gPdfStandardFonts["TimesNewRomanPSMT"] = {"Times New Roman", false, fals
e}; | 65 gPdfStandardFonts["TimesNewRomanPSMT"] = {"Times New Roman", false, fals
e}; |
| 66 gPdfStandardFonts["Symbol"] = {"Symbol", false, false}; | 66 gPdfStandardFonts["Symbol"] = {"Symbol", false, false}; |
| 67 gPdfStandardFonts["ZapfDingbats"] = {"ZapfDingbats", false, false}; | 67 gPdfStandardFonts["ZapfDingbats"] = {"ZapfDingbats", false, false}; |
| 68 | 68 |
| 69 // TODO(edisonn): these are hacks. Load Post Script font name. | 69 // TODO(edisonn): these are hacks. Load Post Script font name. |
| 70 // see FT_Get_Postscript_Name | 70 // see FT_Get_Postscript_Name |
| 71 // Font config is not using it, yet. | 71 // Font config is not using it, yet. |
| 72 //https://bugs.freedesktop.org/show_bug.cgi?id=18095 | 72 //https://bugs.freedesktop.org/show_bug.cgi?id=18095 |
| 73 |
| 73 gPdfStandardFonts["Arial-Black"] = {"Arial", true, false}; | 74 gPdfStandardFonts["Arial-Black"] = {"Arial", true, false}; |
| 74 gPdfStandardFonts["DejaVuSans"] = {"DejaVu Sans", false, false}; | 75 gPdfStandardFonts["DejaVuSans"] = {"DejaVu Sans", false, false}; |
| 75 gPdfStandardFonts["DejaVuSansMono"] = {"DejaVuSans Mono", false, false}; | 76 gPdfStandardFonts["DejaVuSansMono"] = {"DejaVuSans Mono", false, false}; |
| 76 gPdfStandardFonts["DejaVuSansMono-Bold"] = {"DejaVuSans Mono", true, fal
se}; | 77 gPdfStandardFonts["DejaVuSansMono-Bold"] = {"DejaVuSans Mono", true, fal
se}; |
| 77 gPdfStandardFonts["DejaVuSansMono-Oblique"] = {"DejaVuSans Mono", false,
true}; | 78 gPdfStandardFonts["DejaVuSansMono-Oblique"] = {"DejaVuSans Mono", false,
true}; |
| 78 gPdfStandardFonts["Georgia-Bold"] = {"Georgia", true, false}; | 79 gPdfStandardFonts["Georgia-Bold"] = {"Georgia", true, false}; |
| 79 gPdfStandardFonts["Georgia-BoldItalic"] = {"Georgia", true, true}; | 80 gPdfStandardFonts["Georgia-BoldItalic"] = {"Georgia", true, true}; |
| 80 gPdfStandardFonts["Georgia-Italic"] = {"Georgia", false, true}; | 81 gPdfStandardFonts["Georgia-Italic"] = {"Georgia", false, true}; |
| 81 gPdfStandardFonts["TrebuchetMS"] = {"Trebuchet MS", false, false}; | 82 gPdfStandardFonts["TrebuchetMS"] = {"Trebuchet MS", false, false}; |
| 82 gPdfStandardFonts["TrebuchetMS-Bold"] = {"Trebuchet MS", true, false}; | 83 gPdfStandardFonts["TrebuchetMS-Bold"] = {"Trebuchet MS", true, false}; |
| 83 gPdfStandardFonts["Verdana-Bold"] = {"Verdana", true, false}; | 84 gPdfStandardFonts["Verdana-Bold"] = {"Verdana", true, false}; |
| 84 gPdfStandardFonts["WenQuanYiMicroHei"] = {"WenQuanYi Micro Hei", false,
false}; | 85 gPdfStandardFonts["WenQuanYiMicroHei"] = {"WenQuanYi Micro Hei", false,
false}; |
| 86 |
| 87 // TODO(edisonn): list all phonts available, builf post script name as i
n pdf spec |
| 88 /* |
| 89 * The PostScript name for the value of BaseFontis determined in one of
two ways: |
| 90 • Use the PostScript name that is an optional entry in the “name” table of the |
| 91 TrueType font itself. |
| 92 • In the absence of such an entry in the “name” table, derive a PostScript name |
| 93 from the name by which the font is known in the host operating system: on a |
| 94 Windows system, it is based on the lfFaceName field in a LOGFONT structure; in |
| 95 the Mac OS, it is based on the name of the FONDresource. If the name contains |
| 96 any spaces, the spaces are removed. |
| 97 If the font in a source document uses a bold or italic style, but there is no fo
nt |
| 98 data for that style, the host operating system will synthesize the style. In thi
s case, |
| 99 a comma and the style name (one of Bold, Italic, or BoldItalic) are appended to
the |
| 100 font name. For example, for a TrueType font that is a bold variant of the New |
| 101 */ |
| 102 |
| 103 /* |
| 104 * If the value of Subtype is MMType1. |
| 105 • If the PostScript name of the instance contains spaces, the spaces are replace
d |
| 106 by underscores in the value of BaseFont. For instance, as illustrated in Example |
| 107 5.7, the name “MinionMM 366 465 11 ” (which ends with a space character) |
| 108 becomes /MinionMM_366_465_11_. |
| 109 */ |
| 110 |
| 111 // might not work on all oses ? |
| 112 // |
| 113 |
| 85 } | 114 } |
| 86 | 115 |
| 87 return gPdfStandardFonts; | 116 return gPdfStandardFonts; |
| 88 } | 117 } |
| 89 | 118 |
| 90 SkTypeface* SkTypefaceFromPdfStandardFont(const char* fontName, bool bold, bool
italic) { | 119 SkTypeface* SkTypefaceFromPdfStandardFont(const char* fontName, bool bold, bool
italic) { |
| 91 std::map<std::string, SkPdfStandardFontEntry>& standardFontMap = getStandard
Fonts(); | 120 std::map<std::string, SkPdfStandardFontEntry>& standardFontMap = getStandard
Fonts(); |
| 92 | 121 |
| 93 SkTypeface* typeface = NULL; | 122 SkTypeface* typeface = NULL; |
| 94 if (standardFontMap.find(fontName) != standardFontMap.end()) { | 123 if (standardFontMap.find(fontName) != standardFontMap.end()) { |
| (...skipping 76 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 171 } | 200 } |
| 172 | 201 |
| 173 return new SkPdfType1Font(dict); | 202 return new SkPdfType1Font(dict); |
| 174 } | 203 } |
| 175 | 204 |
| 176 SkPdfType3Font* SkPdfFont::fontFromType3FontDictionary(SkPdfType3FontDictionary*
dict) { | 205 SkPdfType3Font* SkPdfFont::fontFromType3FontDictionary(SkPdfType3FontDictionary*
dict) { |
| 177 if (dict == NULL) { | 206 if (dict == NULL) { |
| 178 return NULL; // default one? | 207 return NULL; // default one? |
| 179 } | 208 } |
| 180 | 209 |
| 210 |
| 211 |
| 181 return new SkPdfType3Font(dict); | 212 return new SkPdfType3Font(dict); |
| 182 } | 213 } |
| 183 | 214 |
| 184 SkPdfTrueTypeFont* SkPdfFont::fontFromTrueTypeFontDictionary(SkPdfTrueTypeFontDi
ctionary* dict) { | 215 SkPdfTrueTypeFont* SkPdfFont::fontFromTrueTypeFontDictionary(SkPdfTrueTypeFontDi
ctionary* dict) { |
| 185 if (dict == NULL) { | 216 if (dict == NULL) { |
| 186 return NULL; // default one? | 217 return NULL; // default one? |
| 187 } | 218 } |
| 188 | 219 |
| 189 return new SkPdfTrueTypeFont(dict); | 220 return new SkPdfTrueTypeFont(dict); |
| 190 } | 221 } |
| (...skipping 15 matching lines...) Expand all Loading... |
| 206 } | 237 } |
| 207 | 238 |
| 208 static int skstoi(const SkPdfString* str) { | 239 static int skstoi(const SkPdfString* str) { |
| 209 int ret = 0; | 240 int ret = 0; |
| 210 for (int i = 0 ; i < str->podofo()->GetString().GetLength(); i++) { | 241 for (int i = 0 ; i < str->podofo()->GetString().GetLength(); i++) { |
| 211 ret = (ret << 8) + ((unsigned char*)str->podofo()->GetString().GetString
())[i]; | 242 ret = (ret << 8) + ((unsigned char*)str->podofo()->GetString().GetString
())[i]; |
| 212 } | 243 } |
| 213 return ret; | 244 return ret; |
| 214 } | 245 } |
| 215 | 246 |
| 216 SkPdfType0Font::SkPdfType0Font(SkPdfType0FontDictionary* dict) { | 247 SkPdfToUnicode::SkPdfToUnicode(const SkPdfStream* stream) { |
| 217 fBaseFont = SkPdfFontFromName(dict, dict->BaseFont().c_str()); | |
| 218 | |
| 219 // TODO(edisonn): load encoding, let it now to be Identity-H by default | |
| 220 if (dict->has_Encoding()) { | |
| 221 if (dict->isEncodingAName()) { | |
| 222 //report encoding not supported | |
| 223 //fEncoding = loadEncodingFromName(dict->getEncodingAsName().c_str()
); | |
| 224 } else if (dict->isEncodingAStream()) { | |
| 225 //fEncoding = loadEncodingFromStream(dict->getEncodingAsStream()); | |
| 226 } else { | |
| 227 // error | |
| 228 } | |
| 229 } | |
| 230 | |
| 231 fCMapEncoding = NULL; | 248 fCMapEncoding = NULL; |
| 232 fCMapEncodingFlag = NULL; | 249 fCMapEncodingFlag = NULL; |
| 233 | 250 |
| 234 if (dict->has_ToUnicode()) { | 251 if (stream) { |
| 235 const SkPdfStream* stream = dict->ToUnicode(); | |
| 236 SkPdfTokenizer tokenizer(stream); | 252 SkPdfTokenizer tokenizer(stream); |
| 237 PdfToken token; | 253 PdfToken token; |
| 238 | 254 |
| 239 fCMapEncoding = new unsigned short[256 * 256]; | 255 fCMapEncoding = new unsigned short[256 * 256]; |
| 240 fCMapEncodingFlag = new unsigned char[256 * 256]; | 256 fCMapEncodingFlag = new unsigned char[256 * 256]; |
| 241 for (int i = 0 ; i < 256 * 256; i++) { | 257 for (int i = 0 ; i < 256 * 256; i++) { |
| 242 fCMapEncoding[i] = i; | 258 fCMapEncoding[i] = i; |
| 243 fCMapEncodingFlag[i] = 0; | 259 fCMapEncodingFlag[i] = 0; |
| 244 } | 260 } |
| 245 | 261 |
| (...skipping 65 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 311 // read array | 327 // read array |
| 312 } | 328 } |
| 313 | 329 |
| 314 //fCMapEncodingFlag[from] = 1; | 330 //fCMapEncodingFlag[from] = 1; |
| 315 //fCMapEncoding[from] = to; | 331 //fCMapEncoding[from] = to; |
| 316 } | 332 } |
| 317 } | 333 } |
| 318 } | 334 } |
| 319 } | 335 } |
| 320 } | 336 } |
| 337 |
| 338 |
| 339 SkPdfType0Font::SkPdfType0Font(SkPdfType0FontDictionary* dict) { |
| 340 fBaseFont = SkPdfFontFromName(dict, dict->BaseFont().c_str()); |
| 341 fEncoding = NULL; |
| 342 |
| 343 if (dict->has_Encoding()) { |
| 344 if (dict->isEncodingAName()) { |
| 345 fEncoding = SkPdfEncoding::fromName(dict->getEncodingAsName().c_str(
)); |
| 346 } else if (dict->isEncodingAStream()) { |
| 347 //fEncoding = loadEncodingFromStream(dict->getEncodingAsStream()); |
| 348 } else { |
| 349 // TODO(edisonn): error ... warning .. assert? |
| 350 } |
| 351 } |
| 352 |
| 353 if (dict->has_ToUnicode()) { |
| 354 fToUnicode = new SkPdfToUnicode(dict->ToUnicode()); |
| 355 } |
| 356 } |
| 357 |
| 358 std::map<std::string, SkPdfEncoding*>& getStandardEncodings() { |
| 359 static std::map<std::string, SkPdfEncoding*> encodings; |
| 360 if (encodings.empty()) { |
| 361 encodings["Identity-H"] = SkPdfIdentityHEncoding::instance(); |
| 362 } |
| 363 |
| 364 return encodings; |
| 365 } |
| 366 |
| 367 |
| 368 SkPdfEncoding* SkPdfEncoding::fromName(const char* name) { |
| 369 SkPdfEncoding* encoding = getStandardEncodings()[name]; |
| 370 |
| 371 #ifdef PDF_TRACE |
| 372 if (encoding == NULL) { |
| 373 printf("Encoding not found: %s\n", name); |
| 374 } |
| 375 #endif |
| 376 return encoding; |
| 377 } |
| OLD | NEW |