| OLD | NEW | 
|---|
| 1 #include "SkPdfFont.h" | 1 #include "SkPdfFont.h" | 
| 2 #include "SkPdfParser.h" | 2 #include "SkPdfParser.h" | 
| 3 | 3 | 
| 4 #include "SkStream.h" | 4 #include "SkStream.h" | 
| 5 #include "SkTypeface.h" | 5 #include "SkTypeface.h" | 
| 6 #include "SkPdfPodofoTokenizer.h" | 6 #include "SkPdfNativeTokenizer.h" | 
| 7 | 7 | 
| 8 std::map<std::string, SkPdfStandardFontEntry>& getStandardFonts() { | 8 std::map<std::string, SkPdfStandardFontEntry>& getStandardFonts() { | 
| 9     static std::map<std::string, SkPdfStandardFontEntry> gPdfStandardFonts; | 9     static std::map<std::string, SkPdfStandardFontEntry> gPdfStandardFonts; | 
| 10 | 10 | 
| 11     // TODO (edisonn): , vs - ? what does it mean? | 11     // TODO (edisonn): , vs - ? what does it mean? | 
| 12     // TODO (edisonn): MT, PS, Oblique=italic?, ... what does it mean? | 12     // TODO (edisonn): MT, PS, Oblique=italic?, ... what does it mean? | 
| 13     if (gPdfStandardFonts.empty()) { | 13     if (gPdfStandardFonts.empty()) { | 
| 14         gPdfStandardFonts["Arial"] = {"Arial", false, false}; | 14         gPdfStandardFonts["Arial"] = {"Arial", false, false}; | 
| 15         gPdfStandardFonts["Arial,Bold"] = {"Arial", true, false}; | 15         gPdfStandardFonts["Arial,Bold"] = {"Arial", true, false}; | 
| 16         gPdfStandardFonts["Arial,BoldItalic"] = {"Arial", true, true}; | 16         gPdfStandardFonts["Arial,BoldItalic"] = {"Arial", true, true}; | 
| (...skipping 125 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 142             fontName, | 142             fontName, | 
| 143             SkTypeface::kNormal); | 143             SkTypeface::kNormal); | 
| 144     } | 144     } | 
| 145 | 145 | 
| 146     if (typeface) { | 146     if (typeface) { | 
| 147         typeface->ref(); | 147         typeface->ref(); | 
| 148     } | 148     } | 
| 149     return typeface; | 149     return typeface; | 
| 150 } | 150 } | 
| 151 | 151 | 
| 152 SkPdfFont* SkPdfFont::fontFromFontDescriptor(SkPdfFontDescriptorDictionary* fd, 
     bool loadFromName) { | 152 SkPdfFont* SkPdfFont::fontFromFontDescriptor(SkNativeParsedPDF* doc, SkPdfFontDe
     scriptorDictionary* fd, bool loadFromName) { | 
| 153     // TODO(edisonn): partial implementation | 153     // TODO(edisonn): partial implementation ... also const handling ... | 
| 154     // Only one, at most be available | 154     // Only one, at most be available | 
| 155     SkPdfStream* pdfStream = NULL; | 155     SkPdfStream* pdfStream = NULL; | 
| 156     if (fd->has_FontFile()) { | 156     if (fd->has_FontFile()) { | 
| 157         pdfStream = fd->FontFile(); | 157         pdfStream = fd->FontFile(doc); | 
| 158     } else if (fd->has_FontFile2()) { | 158     } else if (fd->has_FontFile2()) { | 
| 159         pdfStream = fd->FontFile2(); | 159         pdfStream = fd->FontFile2(doc); | 
| 160     } if (fd->has_FontFile3()) { | 160     } if (fd->has_FontFile3()) { | 
| 161         pdfStream = fd->FontFile3(); | 161         pdfStream = fd->FontFile3(doc); | 
| 162     } else { | 162     } else { | 
| 163         if (loadFromName) { | 163         if (loadFromName) { | 
| 164             return fontFromName(fd, fd->FontName().c_str()); | 164             return fontFromName(doc, fd, fd->FontName(doc).c_str()); | 
| 165         } | 165         } | 
| 166     } | 166     } | 
| 167 | 167 | 
| 168     char* uncompressedStream = NULL; | 168     unsigned char* uncompressedStream = NULL; | 
| 169     long uncompressedStreamLength = 0; | 169     size_t uncompressedStreamLength = 0; | 
| 170 | 170 | 
| 171     // TODO(edisonn): report warning to be used in testing. | 171     // TODO(edisonn): report warning to be used in testing. | 
| 172     if (!pdfStream || | 172     if (!pdfStream || | 
| 173             !pdfStream->GetFilteredCopy(&uncompressedStream, &uncompressedStream
     Length) || | 173             !pdfStream->GetFilteredStreamRef(&uncompressedStream, &uncompressedS
     treamLength, doc->allocator()) || | 
| 174             !uncompressedStream || | 174             !uncompressedStream || | 
| 175             !uncompressedStreamLength) { | 175             !uncompressedStreamLength) { | 
| 176         return NULL; | 176         return NULL; | 
| 177     } | 177     } | 
| 178 | 178 | 
| 179     SkMemoryStream* skStream = new SkMemoryStream(uncompressedStream, uncompress
     edStreamLength); | 179     SkMemoryStream* skStream = new SkMemoryStream(uncompressedStream, uncompress
     edStreamLength); | 
| 180     SkTypeface* face = SkTypeface::CreateFromStream(skStream); | 180     SkTypeface* face = SkTypeface::CreateFromStream(skStream); | 
| 181 | 181 | 
| 182     if (face == NULL) { | 182     if (face == NULL) { | 
| 183         // TODO(edisonn): report warning to be used in testing. | 183         // TODO(edisonn): report warning to be used in testing. | 
| 184         return NULL; | 184         return NULL; | 
| 185     } | 185     } | 
| 186 | 186 | 
| 187     face->ref(); | 187     face->ref(); | 
| 188 | 188 | 
| 189     return new SkPdfStandardFont(face); | 189     return new SkPdfStandardFont(face); | 
| 190 } | 190 } | 
| 191 | 191 | 
| 192 SkPdfFont* fontFromName(SkPdfObject* obj, const char* fontName) { | 192 SkPdfFont* fontFromName(SkNativeParsedPDF* doc, SkPdfObject* obj, const char* fo
     ntName) { | 
| 193     SkTypeface* typeface = SkTypefaceFromPdfStandardFont(fontName, false, false)
     ; | 193     SkTypeface* typeface = SkTypefaceFromPdfStandardFont(fontName, false, false)
     ; | 
| 194     if (typeface != NULL) { | 194     if (typeface != NULL) { | 
| 195         return new SkPdfStandardFont(typeface); | 195         return new SkPdfStandardFont(typeface); | 
| 196     } | 196     } | 
| 197 | 197 | 
| 198     // TODO(edisonn): perf - make a map | 198     // TODO(edisonn): perf - make a map | 
| 199     for (int i = 0 ; i < obj->doc()->objects(); i++) { | 199     for (unsigned int i = 0 ; i < doc->objects(); i++) { | 
| 200         const SkPdfObject* podofoFont = obj->doc()->object(i); | 200         SkPdfObject* obj = doc->object(i); | 
| 201         SkPdfFontDescriptorDictionary* fd = NULL; | 201         if (!obj->isDictionary()) { | 
|  | 202             continue; | 
|  | 203         } | 
| 202 | 204 | 
| 203         if (obj->doc()->mapper()->mapFontDescriptorDictionary(podofoFont, &fd)) 
     { | 205         SkPdfFontDescriptorDictionary* fd = obj->asDictionary()->asFontDescripto
     rDictionary(); | 
| 204             if (fd->has_FontName() && fd->FontName() == fontName) { | 206 | 
| 205                 SkPdfFont* font = SkPdfFont::fontFromFontDescriptor(fd, false); | 207         if (!fd->valid()) { | 
| 206                 if (font) { | 208             continue; | 
| 207                     return font; | 209         } | 
| 208                 } else { | 210 | 
| 209                     // failed to load font descriptor | 211         if (fd->has_FontName() && fd->FontName(doc) == fontName) { | 
| 210                     break; | 212             SkPdfFont* font = SkPdfFont::fontFromFontDescriptor(doc, fd, false); | 
| 211                 } | 213             if (font) { | 
|  | 214                 return font; | 
|  | 215             } else { | 
|  | 216                 // failed to load font descriptor | 
|  | 217                 break; | 
| 212             } | 218             } | 
| 213         } | 219         } | 
| 214     } | 220     } | 
| 215 | 221 | 
| 216     // TODO(edisonn): warning/report issue | 222     // TODO(edisonn): warning/report issue | 
| 217     return SkPdfFont::Default(); | 223     return SkPdfFont::Default(); | 
| 218 } | 224 } | 
| 219 | 225 | 
| 220 SkPdfFont* SkPdfFont::fontFromPdfDictionary(SkPdfFontDictionary* dict) { | 226 SkPdfFont* SkPdfFont::fontFromPdfDictionaryOnce(SkNativeParsedPDF* doc, SkPdfFon
     tDictionary* dict) { | 
|  | 227     // TODO(edisonn): keep the type in a smart way in the SkPdfObject | 
|  | 228     // 1) flag, isResolved (1bit): reset at reset, add/remove/update (array) and
      set(dict) | 
|  | 229     // in a tree like structure, 3-4 bits for all the datatypes inheriting from 
     obj (int, real, ...) | 
|  | 230     // if is a dict, reserveve a few bytes to encode type of dict, and so on lik
     e in a tree | 
|  | 231     // issue: type can be determined from context! atribute night be missing/wro
     ng | 
|  | 232     switch (doc->mapper()->mapFontDictionary(dict)) { | 
|  | 233         case kType0FontDictionary_SkPdfObjectType: | 
|  | 234             return fontFromType0FontDictionary(doc, dict->asType0FontDictionary(
     )); | 
|  | 235 | 
|  | 236         case kTrueTypeFontDictionary_SkPdfObjectType: | 
|  | 237             return fontFromTrueTypeFontDictionary(doc, dict->asTrueTypeFontDicti
     onary()); | 
|  | 238 | 
|  | 239         case kType1FontDictionary_SkPdfObjectType: | 
|  | 240             return fontFromType1FontDictionary(doc, dict->asType1FontDictionary(
     )); | 
|  | 241 | 
|  | 242         case kMultiMasterFontDictionary_SkPdfObjectType: | 
|  | 243             return fontFromMultiMasterFontDictionary(doc, dict->asMultiMasterFon
     tDictionary()); | 
|  | 244 | 
|  | 245         case kType3FontDictionary_SkPdfObjectType: | 
|  | 246             return fontFromType3FontDictionary(doc, dict->asType3FontDictionary(
     )); | 
|  | 247 | 
|  | 248         default: | 
|  | 249             // TODO(edisonn): report error? | 
|  | 250             return NULL; | 
|  | 251     } | 
|  | 252 } | 
|  | 253 | 
|  | 254 SkPdfFont* SkPdfFont::fontFromPdfDictionary(SkNativeParsedPDF* doc, SkPdfFontDic
     tionary* dict) { | 
| 221     if (dict == NULL) { | 255     if (dict == NULL) { | 
| 222         return NULL;  // TODO(edisonn): report default one? | 256         return NULL;  // TODO(edisonn): report default one? | 
| 223     } | 257     } | 
| 224 | 258 | 
| 225     switch (dict->getType()) { | 259     if (dict->data() == NULL) { | 
| 226         case kType0FontDictionary_SkPdfObjectType: | 260         dict->setData(fontFromPdfDictionaryOnce(doc, dict)); | 
| 227             return fontFromType0FontDictionary(dict->asType0FontDictionary()); |  | 
| 228 |  | 
| 229         case kTrueTypeFontDictionary_SkPdfObjectType: |  | 
| 230             return fontFromTrueTypeFontDictionary(dict->asTrueTypeFontDictionary
     ()); |  | 
| 231 |  | 
| 232         case kType1FontDictionary_SkPdfObjectType: |  | 
| 233             return fontFromType1FontDictionary(dict->asType1FontDictionary()); |  | 
| 234 |  | 
| 235         case kMultiMasterFontDictionary_SkPdfObjectType: |  | 
| 236             return fontFromMultiMasterFontDictionary(dict->asMultiMasterFontDict
     ionary()); |  | 
| 237 |  | 
| 238         case kType3FontDictionary_SkPdfObjectType: |  | 
| 239             return fontFromType3FontDictionary(dict->asType3FontDictionary()); |  | 
| 240     } | 261     } | 
| 241     return NULL;  // TODO(edisonn): report error? | 262     return (SkPdfFont*)dict->data(); | 
| 242 } | 263 } | 
| 243 | 264 | 
| 244 SkPdfType0Font* SkPdfFont::fontFromType0FontDictionary(SkPdfType0FontDictionary*
      dict) { | 265 | 
|  | 266 | 
|  | 267 SkPdfType0Font* SkPdfFont::fontFromType0FontDictionary(SkNativeParsedPDF* doc, S
     kPdfType0FontDictionary* dict) { | 
| 245     if (dict == NULL) { | 268     if (dict == NULL) { | 
| 246         return NULL;  // default one? | 269         return NULL;  // default one? | 
| 247     } | 270     } | 
| 248 | 271 | 
| 249     return new SkPdfType0Font(dict); | 272     return new SkPdfType0Font(doc, dict); | 
| 250 } | 273 } | 
| 251 | 274 | 
| 252 SkPdfType1Font* SkPdfFont:: fontFromType1FontDictionary(SkPdfType1FontDictionary
     * dict) { | 275 SkPdfType1Font* SkPdfFont:: fontFromType1FontDictionary(SkNativeParsedPDF* doc, 
     SkPdfType1FontDictionary* dict) { | 
| 253     if (dict == NULL) { | 276     if (dict == NULL) { | 
| 254         return NULL;  // default one? | 277         return NULL;  // default one? | 
| 255     } | 278     } | 
| 256 | 279 | 
| 257     return new SkPdfType1Font(dict); | 280     return new SkPdfType1Font(doc, dict); | 
| 258 } | 281 } | 
| 259 | 282 | 
| 260 SkPdfType3Font* SkPdfFont::fontFromType3FontDictionary(SkPdfType3FontDictionary*
      dict) { | 283 SkPdfType3Font* SkPdfFont::fontFromType3FontDictionary(SkNativeParsedPDF* doc, S
     kPdfType3FontDictionary* dict) { | 
| 261     if (dict == NULL) { | 284     if (dict == NULL) { | 
| 262         return NULL;  // default one? | 285         return NULL;  // default one? | 
| 263     } | 286     } | 
| 264 | 287 | 
| 265 | 288 | 
| 266 | 289 | 
| 267     return new SkPdfType3Font(dict); | 290     return new SkPdfType3Font(doc, dict); | 
| 268 } | 291 } | 
| 269 | 292 | 
| 270 SkPdfTrueTypeFont* SkPdfFont::fontFromTrueTypeFontDictionary(SkPdfTrueTypeFontDi
     ctionary* dict) { | 293 SkPdfTrueTypeFont* SkPdfFont::fontFromTrueTypeFontDictionary(SkNativeParsedPDF* 
     doc, SkPdfTrueTypeFontDictionary* dict) { | 
| 271     if (dict == NULL) { | 294     if (dict == NULL) { | 
| 272         return NULL;  // default one? | 295         return NULL;  // default one? | 
| 273     } | 296     } | 
| 274 | 297 | 
| 275     return new SkPdfTrueTypeFont(dict); | 298     return new SkPdfTrueTypeFont(doc, dict); | 
| 276 } | 299 } | 
| 277 | 300 | 
| 278 SkPdfMultiMasterFont* SkPdfFont::fontFromMultiMasterFontDictionary(SkPdfMultiMas
     terFontDictionary* dict) { | 301 SkPdfMultiMasterFont* SkPdfFont::fontFromMultiMasterFontDictionary(SkNativeParse
     dPDF* doc, SkPdfMultiMasterFontDictionary* dict) { | 
| 279     if (dict == NULL) { | 302     if (dict == NULL) { | 
| 280         return NULL;  // default one? | 303         return NULL;  // default one? | 
| 281     } | 304     } | 
| 282 | 305 | 
| 283     return new SkPdfMultiMasterFont(dict); | 306     return new SkPdfMultiMasterFont(doc, dict); | 
| 284 } | 307 } | 
| 285 | 308 | 
| 286 static int skstoi(const SkPdfString* str) { | 309 static int skstoi(const SkPdfObject* str) { | 
|  | 310     // TODO(edisonn): report err of it is not a (hex) string | 
| 287     int ret = 0; | 311     int ret = 0; | 
| 288     for (int i = 0 ; i < str->len(); i++) { | 312     for (unsigned int i = 0 ; i < str->len(); i++) { | 
| 289         ret = (ret << 8) + ((unsigned char*)str->c_str())[i]; | 313         ret = (ret << 8) + ((unsigned char*)str->c_str())[i]; | 
| 290     } | 314     } | 
| 291     return ret; | 315     return ret; | 
| 292 } | 316 } | 
| 293 | 317 | 
| 294 SkPdfToUnicode::SkPdfToUnicode(const SkPdfStream* stream) { | 318 #define tokenIsKeyword(token,keyword) (token.fType == kKeyword_TokenType && toke
     n.fKeywordLength==sizeof(keyword)-1 && strncmp(token.fKeyword, keyword, sizeof(k
     eyword)-1) == 0) | 
|  | 319 | 
|  | 320 SkPdfToUnicode::SkPdfToUnicode(SkNativeParsedPDF* parsed, SkPdfStream* stream) :
      fParsed(parsed) { | 
| 295     fCMapEncoding = NULL; | 321     fCMapEncoding = NULL; | 
| 296     fCMapEncodingFlag = NULL; | 322     fCMapEncodingFlag = NULL; | 
| 297 | 323 | 
| 298     if (stream) { | 324     if (stream) { | 
| 299         SkPdfPodofoTokenizer* tokenizer = stream->doc()->tokenizerOfStream(strea
     m); | 325         SkPdfNativeTokenizer* tokenizer = fParsed->tokenizerOfStream(stream); | 
| 300         PdfToken token; | 326         PdfToken token; | 
| 301 | 327 | 
| 302         fCMapEncoding = new unsigned short[256 * 256]; | 328         fCMapEncoding = new unsigned short[256 * 256]; | 
| 303         fCMapEncodingFlag = new unsigned char[256 * 256]; | 329         fCMapEncodingFlag = new unsigned char[256 * 256]; | 
| 304         for (int i = 0 ; i < 256 * 256; i++) { | 330         for (int i = 0 ; i < 256 * 256; i++) { | 
| 305             fCMapEncoding[i] = i; | 331             fCMapEncoding[i] = i; | 
| 306             fCMapEncodingFlag[i] = 0; | 332             fCMapEncodingFlag[i] = 0; | 
| 307         } | 333         } | 
| 308 | 334 | 
| 309         // TODO(edisonn): deal with multibyte character, or longer strings. | 335         // TODO(edisonn): deal with multibyte character, or longer strings. | 
| 310         // Ritght now we deal with up 2 characters, e.g. <0020> but not longer l
     ike <00660066006C> | 336         // Ritght now we deal with up 2 characters, e.g. <0020> but not longer l
     ike <00660066006C> | 
| 311         //2 beginbfrange | 337         //2 beginbfrange | 
| 312         //<0000> <005E> <0020> | 338         //<0000> <005E> <0020> | 
| 313         //<005F> <0061> [<00660066> <00660069> <00660066006C>] | 339         //<005F> <0061> [<00660066> <00660069> <00660066006C>] | 
| 314 | 340 | 
| 315         while (tokenizer->readToken(&token)) { | 341         while (tokenizer->readToken(&token)) { | 
| 316 | 342 | 
| 317             if (token.fType == kKeyword_TokenType && strcmp(token.fKeyword, "beg
     incodespacerange") == 0) { | 343             // TODO(edisonn): perf, macro that would make equal first for token.
     fKeywordLength with sizeof(keyword), instead od strlen, make sure it is keyword,
      not a char* | 
| 318                 while (tokenizer->readToken(&token) && !(token.fType == kKeyword
     _TokenType && strcmp(token.fKeyword, "endcodespacerange") == 0)) { | 344             if (tokenIsKeyword(token, "begincodespacerange")) { | 
|  | 345                 while (tokenizer->readToken(&token) && !tokenIsKeyword(token, "e
     ndcodespacerange")) { | 
| 319 //                    tokenizer->PutBack(token); | 346 //                    tokenizer->PutBack(token); | 
| 320 //                    tokenizer->readToken(&token); | 347 //                    tokenizer->readToken(&token); | 
| 321                     // TODO(edisonn): check token type! ignore/report errors. | 348                     // TODO(edisonn): check token type! ignore/report errors. | 
| 322                     int start = skstoi(token.fObject->asString()); | 349                     int start = skstoi(token.fObject); | 
| 323                     tokenizer->readToken(&token); | 350                     tokenizer->readToken(&token); | 
| 324                     int end = skstoi(token.fObject->asString()); | 351                     int end = skstoi(token.fObject); | 
| 325                     for (int i = start; i <= end; i++) { | 352                     for (int i = start; i <= end; i++) { | 
| 326                         fCMapEncodingFlag[i] |= 1; | 353                         fCMapEncodingFlag[i] |= 1; | 
| 327                     } | 354                     } | 
| 328                 } | 355                 } | 
| 329             } | 356             } | 
| 330 | 357 | 
| 331             if (token.fType == kKeyword_TokenType && strcmp(token.fKeyword, "beg
     inbfchar") == 0) { | 358             if (tokenIsKeyword(token, "beginbfchar")) { | 
| 332                 while (tokenizer->readToken(&token) && !(token.fType == kKeyword
     _TokenType && strcmp(token.fKeyword, "endbfchar") == 0)) { | 359                 while (tokenizer->readToken(&token) && !tokenIsKeyword(token, "e
     ndbfchar")) { | 
| 333 //                    tokenizer->PutBack(token); | 360 //                    tokenizer->PutBack(token); | 
| 334 //                    tokenizer->readToken(&token); | 361 //                    tokenizer->readToken(&token); | 
| 335                     int from = skstoi(token.fObject->asString()); | 362                     int from = skstoi(token.fObject); | 
| 336                     tokenizer->readToken(&token); | 363                     tokenizer->readToken(&token); | 
| 337                     int to = skstoi(token.fObject->asString()); | 364                     int to = skstoi(token.fObject); | 
| 338 | 365 | 
| 339                     fCMapEncodingFlag[from] |= 2; | 366                     fCMapEncodingFlag[from] |= 2; | 
| 340                     fCMapEncoding[from] = to; | 367                     fCMapEncoding[from] = to; | 
| 341                 } | 368                 } | 
| 342             } | 369             } | 
| 343 | 370 | 
| 344             if (token.fType == kKeyword_TokenType && strcmp(token.fKeyword, "beg
     inbfrange") == 0) { | 371             if (tokenIsKeyword(token, "beginbfrange")) { | 
| 345                 while (tokenizer->readToken(&token) && !(token.fType == kKeyword
     _TokenType && strcmp(token.fKeyword, "endbfrange") == 0)) { | 372                 while (tokenizer->readToken(&token) && !tokenIsKeyword(token, "e
     ndbfrange")) { | 
| 346 //                    tokenizer->PutBack(token); | 373 //                    tokenizer->PutBack(token); | 
| 347 //                    tokenizer->readToken(&token); | 374 //                    tokenizer->readToken(&token); | 
| 348                     int start = skstoi(token.fObject->asString()); | 375                     int start = skstoi(token.fObject); | 
| 349                     tokenizer->readToken(&token); | 376                     tokenizer->readToken(&token); | 
| 350                     int end = skstoi(token.fObject->asString()); | 377                     int end = skstoi(token.fObject); | 
| 351 | 378 | 
| 352 | 379 | 
| 353                     tokenizer->readToken(&token); // [ or just an array directly
     ? | 380                     tokenizer->readToken(&token); // [ or just an array directly
     ? | 
| 354 //                    tokenizer->PutBack(token); | 381 //                    tokenizer->PutBack(token); | 
| 355 | 382 | 
| 356                     if (token.fType == kObject_TokenType && token.fObject->asStr
     ing()) { | 383                     // TODO(edisonn): read spec: any string or only hex string? | 
|  | 384                     if (token.fType == kObject_TokenType && token.fObject->isAny
     String()) { | 
| 357 //                        tokenizer->readToken(&token); | 385 //                        tokenizer->readToken(&token); | 
| 358                         int value = skstoi(token.fObject->asString()); | 386                         int value = skstoi(token.fObject); | 
| 359 | 387 | 
| 360                         for (int i = start; i <= end; i++) { | 388                         for (int i = start; i <= end; i++) { | 
| 361                             fCMapEncodingFlag[i] |= 2; | 389                             fCMapEncodingFlag[i] |= 2; | 
| 362                             fCMapEncoding[i] = value; | 390                             fCMapEncoding[i] = value; | 
| 363                             value++; | 391                             value++; | 
| 364                             // if i != end, verify last byte id not if, ignore/r
     eport error | 392                             // if i != end, verify last byte id not if, ignore/r
     eport error | 
| 365                         } | 393                         } | 
| 366 | 394 | 
| 367                         // read one string | 395                         // read one string | 
| 368                     } else if (token.fType == kObject_TokenType && token.fObject
     ->asArray()) { | 396                     } else if (token.fType == kObject_TokenType && token.fObject
     ->isArray()) { | 
| 369 //                        tokenizer->readToken(&token); | 397 //                        tokenizer->readToken(&token); | 
| 370                         for (int i = 0; i < token.fObject->asArray()->size(); i+
     +) { | 398                         for (unsigned int i = 0; i < token.fObject->size(); i++)
      { | 
| 371                             fCMapEncodingFlag[start + i] |= 2; | 399                             fCMapEncodingFlag[start + i] |= 2; | 
| 372                             fCMapEncoding[start + i] = skstoi((*token.fObject->a
     sArray())[i]->asString()); | 400                             fCMapEncoding[start + i] = skstoi((*token.fObject)[i
     ]); | 
| 373                         } | 401                         } | 
| 374                         // read array | 402                         // read array | 
| 375                     } | 403                     } | 
| 376 | 404 | 
| 377                     //fCMapEncodingFlag[from] = 1; | 405                     //fCMapEncodingFlag[from] = 1; | 
| 378                     //fCMapEncoding[from] = to; | 406                     //fCMapEncoding[from] = to; | 
| 379                 } | 407                 } | 
| 380             } | 408             } | 
| 381         } | 409         } | 
| 382     } | 410     } | 
| 383 } | 411 } | 
| 384 | 412 | 
| 385 | 413 | 
| 386 SkPdfType0Font::SkPdfType0Font(SkPdfType0FontDictionary* dict) { | 414 SkPdfType0Font::SkPdfType0Font(SkNativeParsedPDF* doc, SkPdfType0FontDictionary*
      dict) { | 
| 387     fBaseFont = fontFromName(dict, dict->BaseFont().c_str()); | 415     fBaseFont = fontFromName(doc, dict, dict->BaseFont(doc).c_str()); | 
| 388     fEncoding = NULL; | 416     fEncoding = NULL; | 
| 389 | 417 | 
| 390     if (dict->has_Encoding()) { | 418     if (dict->has_Encoding()) { | 
| 391         if (dict->isEncodingAName()) { | 419         if (dict->isEncodingAName(doc)) { | 
| 392             fEncoding = SkPdfEncoding::fromName(dict->getEncodingAsName().c_str(
     )); | 420             fEncoding = SkPdfEncoding::fromName(dict->getEncodingAsName(doc).c_s
     tr()); | 
| 393         } else if (dict->isEncodingAStream()) { | 421         } else if (dict->isEncodingAStream(doc)) { | 
| 394             //fEncoding = loadEncodingFromStream(dict->getEncodingAsStream()); | 422             //fEncoding = loadEncodingFromStream(dict->getEncodingAsStream()); | 
| 395         } else { | 423         } else { | 
| 396             // TODO(edisonn): error ... warning .. assert? | 424             // TODO(edisonn): error ... warning .. assert? | 
| 397         } | 425         } | 
| 398     } | 426     } | 
| 399 | 427 | 
| 400     if (dict->has_ToUnicode()) { | 428     if (dict->has_ToUnicode()) { | 
| 401         fToUnicode = new SkPdfToUnicode(dict->ToUnicode()); | 429         fToUnicode = new SkPdfToUnicode(doc, dict->ToUnicode(doc)); | 
| 402     } | 430     } | 
| 403 } | 431 } | 
| 404 | 432 | 
| 405 std::map<std::string, SkPdfEncoding*>& getStandardEncodings() { | 433 std::map<std::string, SkPdfEncoding*>& getStandardEncodings() { | 
| 406     static std::map<std::string, SkPdfEncoding*> encodings; | 434     static std::map<std::string, SkPdfEncoding*> encodings; | 
| 407     if (encodings.empty()) { | 435     if (encodings.empty()) { | 
| 408         encodings["Identity-H"] = SkPdfIdentityHEncoding::instance(); | 436         encodings["Identity-H"] = SkPdfIdentityHEncoding::instance(); | 
| 409     } | 437     } | 
| 410 | 438 | 
| 411     return encodings; | 439     return encodings; | 
| 412 } | 440 } | 
| 413 | 441 | 
| 414 | 442 | 
| 415 SkPdfEncoding* SkPdfEncoding::fromName(const char* name) { | 443 SkPdfEncoding* SkPdfEncoding::fromName(const char* name) { | 
| 416     SkPdfEncoding* encoding = getStandardEncodings()[name]; | 444     SkPdfEncoding* encoding = getStandardEncodings()[name]; | 
| 417 | 445 | 
| 418 #ifdef PDF_TRACE | 446 #ifdef PDF_TRACE | 
| 419     if (encoding == NULL) { | 447     if (encoding == NULL) { | 
| 420         printf("Encoding not found: %s\n", name); | 448         printf("Encoding not found: %s\n", name); | 
| 421     } | 449     } | 
| 422 #endif | 450 #endif | 
| 423     return encoding; | 451     return encoding; | 
| 424 } | 452 } | 
| OLD | NEW | 
|---|