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 |