OLD | NEW |
1 /* | 1 /* |
2 * Copyright 2013 Google Inc. | 2 * Copyright 2013 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 "SkCanvas.h" | 8 #include "SkCanvas.h" |
9 #include "SkDevice.h" | 9 #include "SkDevice.h" |
10 #include "SkGraphics.h" | 10 #include "SkGraphics.h" |
11 #include "SkImageDecoder.h" | 11 #include "SkImageDecoder.h" |
12 #include "SkImageEncoder.h" | 12 #include "SkImageEncoder.h" |
13 #include "SkOSFile.h" | 13 #include "SkOSFile.h" |
14 #include "SkPicture.h" | 14 #include "SkPicture.h" |
15 #include "SkStream.h" | 15 #include "SkStream.h" |
16 #include "SkTypeface.h" | 16 #include "SkTypeface.h" |
17 #include "SkTArray.h" | 17 #include "SkTArray.h" |
18 #include "picture_utils.h" | 18 #include "picture_utils.h" |
19 | 19 |
20 #include <iostream> | 20 #include <iostream> |
21 #include <cstdio> | 21 #include <cstdio> |
22 #include <stack> | 22 #include <stack> |
23 | 23 |
24 #include "podofo.h" | 24 #include "podofo.h" |
25 using namespace PoDoFo; | 25 using namespace PoDoFo; |
26 | 26 |
| 27 const PdfObject* resolveReferenceObject(const PdfMemDocument* pdfDoc, |
| 28 const PdfObject* obj, |
| 29 bool resolveOneElementArrays = false); |
| 30 |
27 bool LongFromDictionary(const PdfMemDocument* pdfDoc, | 31 bool LongFromDictionary(const PdfMemDocument* pdfDoc, |
28 const PdfDictionary& dict, | 32 const PdfDictionary& dict, |
29 const char* key, | 33 const char* key, |
30 const char* abr, | 34 const char* abr, |
31 long* data); | 35 long* data); |
32 | 36 |
33 bool DoubleFromDictionary(const PdfMemDocument* pdfDoc, | 37 bool DoubleFromDictionary(const PdfMemDocument* pdfDoc, |
34 const PdfDictionary& dict, | 38 const PdfDictionary& dict, |
35 const char* key, | 39 const char* key, |
36 const char* abr, | 40 const char* abr, |
(...skipping 84 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
121 const char* abr, | 125 const char* abr, |
122 SkRect* data); | 126 SkRect* data); |
123 | 127 |
124 bool FunctionFromDictionary(const PdfMemDocument* pdfDoc, | 128 bool FunctionFromDictionary(const PdfMemDocument* pdfDoc, |
125 const PdfDictionary& dict, | 129 const PdfDictionary& dict, |
126 const char* key, | 130 const char* key, |
127 const char* abr, | 131 const char* abr, |
128 SkPdfFunction* data); | 132 SkPdfFunction* data); |
129 | 133 |
130 | 134 |
131 #include "pdf_auto_gen.h" | 135 #include "SkPdfHeaders_autogen.h" |
| 136 #include "SkPdfPodofoMapper_autogen.h" |
| 137 #include "SkPdfParser.h" |
132 | 138 |
133 bool ArrayFromDictionary(const PdfMemDocument* pdfDoc, | 139 bool ArrayFromDictionary(const PdfMemDocument* pdfDoc, |
134 const PdfDictionary& dict, | 140 const PdfDictionary& dict, |
135 const char* key, | 141 const char* key, |
136 const char* abr, | 142 const char* abr, |
137 SkPdfArray* data) {return false;} | 143 SkPdfArray* data) {return false;} |
138 | 144 |
139 bool FileSpecFromDictionary(const PdfMemDocument* pdfDoc, | 145 bool FileSpecFromDictionary(const PdfMemDocument* pdfDoc, |
140 const PdfDictionary& dict, | 146 const PdfDictionary& dict, |
141 const char* key, | 147 const char* key, |
(...skipping 11 matching lines...) Expand all Loading... |
153 const char* key, | 159 const char* key, |
154 const char* abr, | 160 const char* abr, |
155 SkPdfTree** data) {return false;} | 161 SkPdfTree** data) {return false;} |
156 | 162 |
157 bool DateFromDictionary(const PdfMemDocument* pdfDoc, | 163 bool DateFromDictionary(const PdfMemDocument* pdfDoc, |
158 const PdfDictionary& dict, | 164 const PdfDictionary& dict, |
159 const char* key, | 165 const char* key, |
160 const char* abr, | 166 const char* abr, |
161 SkPdfDate* data) {return false;} | 167 SkPdfDate* data) {return false;} |
162 | 168 |
163 bool SkRectFromDictionary(const PdfMemDocument* pdfDoc, | |
164 const PdfDictionary& dict, | |
165 const char* key, | |
166 const char* abr, | |
167 SkRect* data) {return false;} | |
168 | |
169 bool FunctionFromDictionary(const PdfMemDocument* pdfDoc, | 169 bool FunctionFromDictionary(const PdfMemDocument* pdfDoc, |
170 const PdfDictionary& dict, | 170 const PdfDictionary& dict, |
171 const char* key, | 171 const char* key, |
172 const char* abr, | 172 const char* abr, |
173 SkPdfFunction* data) {return false;} | 173 SkPdfFunction* data) {return false;} |
174 | 174 |
175 | 175 |
176 | 176 |
177 /* | 177 /* |
178 * TODO(edisonn): | 178 * TODO(edisonn): |
(...skipping 49 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
228 colorSpace == "CalRGB" || | 228 colorSpace == "CalRGB" || |
229 colorSpace == "Lab") { | 229 colorSpace == "Lab") { |
230 return 3; | 230 return 3; |
231 } else { | 231 } else { |
232 return 0; | 232 return 0; |
233 } | 233 } |
234 } | 234 } |
235 | 235 |
236 const PdfObject* resolveReferenceObject(const PdfMemDocument* pdfDoc, | 236 const PdfObject* resolveReferenceObject(const PdfMemDocument* pdfDoc, |
237 const PdfObject* obj, | 237 const PdfObject* obj, |
238 bool resolveOneElementArrays = false) { | 238 bool resolveOneElementArrays) { |
239 while (obj && (obj->IsReference() || (resolveOneElementArrays && | 239 while (obj && (obj->IsReference() || (resolveOneElementArrays && |
240 obj->IsArray() && | 240 obj->IsArray() && |
241 obj->GetArray().GetSize() == 1))) { | 241 obj->GetArray().GetSize() == 1))) { |
242 if (obj->IsReference()) { | 242 if (obj->IsReference()) { |
243 // We need to force the non const, the only update we will do is for
recurssion checks. | 243 // We need to force the non const, the only update we will do is for
recurssion checks. |
244 PdfReference& ref = (PdfReference&)obj->GetReference(); | 244 PdfReference& ref = (PdfReference&)obj->GetReference(); |
245 obj = pdfDoc->GetObjects().GetObject(ref); | 245 obj = pdfDoc->GetObjects().GetObject(ref); |
246 } else { | 246 } else { |
247 obj = &obj->GetArray()[0]; | 247 obj = &obj->GetArray()[0]; |
248 } | 248 } |
(...skipping 51 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
300 SkPath fClipPath; | 300 SkPath fClipPath; |
301 | 301 |
302 PdfColorOperator fStroking; | 302 PdfColorOperator fStroking; |
303 PdfColorOperator fNonStroking; | 303 PdfColorOperator fNonStroking; |
304 | 304 |
305 double fLineWidth; | 305 double fLineWidth; |
306 double fTextLeading; | 306 double fTextLeading; |
307 double fWordSpace; | 307 double fWordSpace; |
308 double fCharSpace; | 308 double fCharSpace; |
309 | 309 |
310 SkPdfResourceDictionary fResources; | 310 SkPdfResourceDictionary* fResources; |
311 | 311 |
312 SkBitmap fSMask; | 312 SkBitmap fSMask; |
313 | 313 |
314 PdfGraphicsState() { | 314 PdfGraphicsState() { |
315 fCurPosX = 0.0; | 315 fCurPosX = 0.0; |
316 fCurPosY = 0.0; | 316 fCurPosY = 0.0; |
317 fCurFontSize = 0.0; | 317 fCurFontSize = 0.0; |
318 fTextBlock = false; | 318 fTextBlock = false; |
319 fCurFont = NULL; | 319 fCurFont = NULL; |
320 fMatrix = SkMatrix::I(); | 320 fMatrix = SkMatrix::I(); |
321 fMatrixTm = SkMatrix::I(); | 321 fMatrixTm = SkMatrix::I(); |
322 fMatrixTlm = SkMatrix::I(); | 322 fMatrixTlm = SkMatrix::I(); |
323 fPathClosed = true; | 323 fPathClosed = true; |
324 fLineWidth = 0; | 324 fLineWidth = 0; |
325 fTextLeading = 0; | 325 fTextLeading = 0; |
326 fWordSpace = 0; | 326 fWordSpace = 0; |
327 fCharSpace = 0; | 327 fCharSpace = 0; |
328 fHasClipPathToApply = false; | 328 fHasClipPathToApply = false; |
| 329 fResources = NULL; |
329 } | 330 } |
330 }; | 331 }; |
331 | 332 |
332 // TODO(edisonn): better class design. | 333 // TODO(edisonn): better class design. |
333 struct PdfInlineImage { | 334 struct PdfInlineImage { |
334 std::map<std::string, std::string> fKeyValuePairs; | 335 std::map<std::string, std::string> fKeyValuePairs; |
335 std::string fImageData; | 336 std::string fImageData; |
336 | 337 |
337 }; | 338 }; |
338 | 339 |
339 // TODO(edisonn): better class design. | 340 // TODO(edisonn): better class design. |
340 struct PdfContext { | 341 struct PdfContext { |
341 std::stack<PdfVariant> fVarStack; | 342 std::stack<SkPdfObject*> fObjectStack; |
342 std::stack<PdfGraphicsState> fStateStack; | 343 std::stack<PdfGraphicsState> fStateStack; |
343 PdfGraphicsState fGraphicsState; | 344 PdfGraphicsState fGraphicsState; |
344 PoDoFo::PdfPage* fPdfPage; | 345 SkPdfDoc& fPdfDoc; |
345 PdfMemDocument* fPdfDoc; | |
346 SkMatrix fOriginalMatrix; | 346 SkMatrix fOriginalMatrix; |
347 | 347 |
348 PdfInlineImage fInlineImage; | 348 PdfInlineImage fInlineImage; |
349 | 349 |
350 PdfContext() : fPdfPage(NULL), | 350 PdfContext(SkPdfDoc& doc) : fPdfDoc(doc) {} |
351 fPdfDoc(NULL) {} | |
352 | 351 |
353 }; | 352 }; |
354 | 353 |
355 // TODO(edisonn): temporary code, to report how much of the PDF we actually thi
nk we rendered. | 354 // TODO(edisonn): temporary code, to report how much of the PDF we actually thi
nk we rendered. |
356 enum PdfResult { | 355 enum PdfResult { |
357 kOK_PdfResult, | 356 kOK_PdfResult, |
358 kPartial_PdfResult, | 357 kPartial_PdfResult, |
359 kNYI_PdfResult, | 358 kNYI_PdfResult, |
360 kIgnoreError_PdfResult, | 359 kIgnoreError_PdfResult, |
361 kError_PdfResult, | 360 kError_PdfResult, |
362 kUnsupported_PdfResult, | 361 kUnsupported_PdfResult, |
363 | 362 |
364 kCount_PdfResult | 363 kCount_PdfResult |
365 }; | 364 }; |
366 | 365 |
367 struct PdfToken { | |
368 const char* pszToken; | |
369 PdfVariant var; | |
370 EPdfContentsType eType; | |
371 | |
372 PdfToken() : pszToken(NULL) {} | |
373 }; | |
374 | |
375 PdfContext* gPdfContext = NULL; | 366 PdfContext* gPdfContext = NULL; |
376 SkBitmap* gDumpBitmap = NULL; | 367 SkBitmap* gDumpBitmap = NULL; |
377 SkCanvas* gDumpCanvas = NULL; | 368 SkCanvas* gDumpCanvas = NULL; |
378 char gLastKeyword[100] = ""; | 369 char gLastKeyword[100] = ""; |
379 int gLastOpKeyword = -1; | 370 int gLastOpKeyword = -1; |
380 char allOpWithVisualEffects[100] = ",S,s,f,F,f*,B,B*,b,b*,n,Tj,TJ,\',\",d0,d1,sh
,EI,Do,EX"; | 371 char allOpWithVisualEffects[100] = ",S,s,f,F,f*,B,B*,b,b*,n,Tj,TJ,\',\",d0,d1,sh
,EI,Do,EX,"; |
381 int gReadOp = 0; | 372 int gReadOp = 0; |
382 | 373 |
383 | 374 |
384 | 375 |
385 bool hasVisualEffect(const char* pdfOp) { | 376 bool hasVisualEffect(const char* pdfOp) { |
386 return true; | 377 return true; |
387 if (*pdfOp == '\0') return false; | 378 if (*pdfOp == '\0') return false; |
388 | 379 |
389 char markedPdfOp[100] = ","; | 380 char markedPdfOp[100] = ","; |
390 strcat(markedPdfOp, pdfOp); | 381 strcat(markedPdfOp, pdfOp); |
391 strcat(markedPdfOp, ","); | 382 strcat(markedPdfOp, ","); |
392 | 383 |
393 return (strstr(allOpWithVisualEffects, markedPdfOp) != NULL); | 384 return (strstr(allOpWithVisualEffects, markedPdfOp) != NULL); |
394 } | 385 } |
395 | 386 |
396 // TODO(edisonn): Pass PdfContext and SkCanvasd only with the define for instrum
entation. | 387 // TODO(edisonn): Pass PdfContext and SkCanvasd only with the define for instrum
entation. |
397 static bool readToken(PdfContentsTokenizer* fTokenizer, PdfToken* token) { | 388 static bool readToken(SkPdfTokenizer fTokenizer, PdfToken* token) { |
398 bool ret = fTokenizer->ReadNext(token->eType, token->pszToken, token->var); | 389 bool ret = fTokenizer.readToken(token); |
399 | 390 |
400 gReadOp++; | 391 gReadOp++; |
401 | 392 |
402 #ifdef PDF_TRACE_DIFF_IN_PNG | 393 #ifdef PDF_TRACE_DIFF_IN_PNG |
403 // TODO(edisonn): compare with old bitmap, and save only new bits are availa
ble, and save | 394 // TODO(edisonn): compare with old bitmap, and save only new bits are availa
ble, and save |
404 // the numbar and name of last operation, so the file name will reflect op t
hat changed. | 395 // the numbar and name of last operation, so the file name will reflect op t
hat changed. |
405 if (hasVisualEffect(gLastKeyword)) { // TODO(edisonn): and has dirty bits. | 396 if (hasVisualEffect(gLastKeyword)) { // TODO(edisonn): and has dirty bits. |
406 gDumpCanvas->flush(); | 397 gDumpCanvas->flush(); |
407 | 398 |
408 SkBitmap bitmap; | 399 SkBitmap bitmap; |
(...skipping 58 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
467 | 458 |
468 SkString out; | 459 SkString out; |
469 | 460 |
470 // TODO(edisonn): get the image, and overlay on top of it, the clip , gr
afic state, teh stack, | 461 // TODO(edisonn): get the image, and overlay on top of it, the clip , gr
afic state, teh stack, |
471 // ... and other properties, to be able to debug th code easily | 462 // ... and other properties, to be able to debug th code easily |
472 | 463 |
473 out.appendf("/usr/local/google/home/edisonn/log_view2/step-%i-%s.png", g
LastOpKeyword, gLastKeyword); | 464 out.appendf("/usr/local/google/home/edisonn/log_view2/step-%i-%s.png", g
LastOpKeyword, gLastKeyword); |
474 SkImageEncoder::EncodeFile(out.c_str(), bitmap, SkImageEncoder::kPNG_Typ
e, 100); | 465 SkImageEncoder::EncodeFile(out.c_str(), bitmap, SkImageEncoder::kPNG_Typ
e, 100); |
475 } | 466 } |
476 | 467 |
477 if (token->eType == ePdfContentsType_Keyword) { | 468 if (token->fType == kKeyword_TokenType) { |
478 strcpy(gLastKeyword, token->pszToken); | 469 strcpy(gLastKeyword, token->fKeyword); |
479 gLastOpKeyword = gReadOp; | 470 gLastOpKeyword = gReadOp; |
480 } else { | 471 } else { |
481 strcpy(gLastKeyword, ""); | 472 strcpy(gLastKeyword, ""); |
482 } | 473 } |
483 #endif | 474 #endif |
484 | 475 |
485 return ret; | 476 return ret; |
486 } | 477 } |
487 | 478 |
488 // TODO(edisonn): Document PdfTokenLooper and subclasses. | 479 // TODO(edisonn): Document PdfTokenLooper and subclasses. |
489 class PdfTokenLooper { | 480 class PdfTokenLooper { |
490 protected: | 481 protected: |
491 PdfTokenLooper* fParent; | 482 PdfTokenLooper* fParent; |
492 PdfContentsTokenizer* fTokenizer; | 483 SkPdfTokenizer fTokenizer; |
493 PdfContext* fPdfContext; | 484 PdfContext* fPdfContext; |
494 SkCanvas* fCanvas; | 485 SkCanvas* fCanvas; |
495 | 486 |
496 public: | 487 public: |
497 PdfTokenLooper(PdfTokenLooper* parent, | 488 PdfTokenLooper(PdfTokenLooper* parent, |
498 PdfContentsTokenizer* tokenizer, | 489 SkPdfTokenizer tokenizer, |
499 PdfContext* pdfContext, | 490 PdfContext* pdfContext, |
500 SkCanvas* canvas) | 491 SkCanvas* canvas) |
501 : fParent(parent), fTokenizer(tokenizer), fPdfContext(pdfContext), fCanv
as(canvas) {} | 492 : fParent(parent), fTokenizer(tokenizer), fPdfContext(pdfContext), fCanv
as(canvas) {} |
502 | 493 |
503 virtual PdfResult consumeToken(PdfToken& token) = 0; | 494 virtual PdfResult consumeToken(PdfToken& token) = 0; |
504 virtual void loop() = 0; | 495 virtual void loop() = 0; |
505 | 496 |
506 void setUp(PdfTokenLooper* parent) { | 497 void setUp(PdfTokenLooper* parent) { |
507 fParent = parent; | 498 fParent = parent; |
508 fTokenizer = parent->fTokenizer; | 499 fTokenizer = parent->fTokenizer; |
509 fPdfContext = parent->fPdfContext; | 500 fPdfContext = parent->fPdfContext; |
510 fCanvas = parent->fCanvas; | 501 fCanvas = parent->fCanvas; |
511 } | 502 } |
512 }; | 503 }; |
513 | 504 |
514 class PdfMainLooper : public PdfTokenLooper { | 505 class PdfMainLooper : public PdfTokenLooper { |
515 public: | 506 public: |
516 PdfMainLooper(PdfTokenLooper* parent, | 507 PdfMainLooper(PdfTokenLooper* parent, |
517 PdfContentsTokenizer* tokenizer, | 508 SkPdfTokenizer tokenizer, |
518 PdfContext* pdfContext, | 509 PdfContext* pdfContext, |
519 SkCanvas* canvas) | 510 SkCanvas* canvas) |
520 : PdfTokenLooper(parent, tokenizer, pdfContext, canvas) {} | 511 : PdfTokenLooper(parent, tokenizer, pdfContext, canvas) {} |
521 | 512 |
522 virtual PdfResult consumeToken(PdfToken& token); | 513 virtual PdfResult consumeToken(PdfToken& token); |
523 virtual void loop(); | 514 virtual void loop(); |
524 }; | 515 }; |
525 | 516 |
526 class PdfInlineImageLooper : public PdfTokenLooper { | 517 class PdfInlineImageLooper : public PdfTokenLooper { |
527 public: | 518 public: |
528 PdfInlineImageLooper() | 519 PdfInlineImageLooper() |
529 : PdfTokenLooper(NULL, NULL, NULL, NULL) {} | 520 : PdfTokenLooper(NULL, SkPdfTokenizer(), NULL, NULL) {} |
530 | 521 |
531 virtual PdfResult consumeToken(PdfToken& token); | 522 virtual PdfResult consumeToken(PdfToken& token); |
532 virtual void loop(); | 523 virtual void loop(); |
533 PdfResult done(); | 524 PdfResult done(); |
534 }; | 525 }; |
535 | 526 |
536 class PdfCompatibilitySectionLooper : public PdfTokenLooper { | 527 class PdfCompatibilitySectionLooper : public PdfTokenLooper { |
537 public: | 528 public: |
538 PdfCompatibilitySectionLooper() | 529 PdfCompatibilitySectionLooper() |
539 : PdfTokenLooper(NULL, NULL, NULL, NULL) {} | 530 : PdfTokenLooper(NULL, SkPdfTokenizer(), NULL, NULL) {} |
540 | 531 |
541 virtual PdfResult consumeToken(PdfToken& token); | 532 virtual PdfResult consumeToken(PdfToken& token); |
542 virtual void loop(); | 533 virtual void loop(); |
543 }; | 534 }; |
544 | 535 |
545 typedef PdfResult (*PdfOperatorRenderer)(PdfContext*, SkCanvas*, PdfTokenLooper*
*); | 536 typedef PdfResult (*PdfOperatorRenderer)(PdfContext*, SkCanvas*, PdfTokenLooper*
*); |
546 | 537 |
547 map<std::string, PdfOperatorRenderer> gPdfOps; | 538 map<std::string, PdfOperatorRenderer> gPdfOps; |
548 | 539 |
549 map<std::string, int> gRenderStats[kCount_PdfResult]; | 540 map<std::string, int> gRenderStats[kCount_PdfResult]; |
(...skipping 159 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
709 | 700 |
710 // TODO(edisonn): move this code in podofo, so we don't have to fix the font. | 701 // TODO(edisonn): move this code in podofo, so we don't have to fix the font. |
711 // This logic needs to be moved in PdfEncodingObjectFactory::CreateEncoding | 702 // This logic needs to be moved in PdfEncodingObjectFactory::CreateEncoding |
712 std::map<PdfFont*, PdfCMapEncoding*> gFontsFixed; | 703 std::map<PdfFont*, PdfCMapEncoding*> gFontsFixed; |
713 PdfEncoding* FixPdfFont(PdfContext* pdfContext, PdfFont* fCurFont) { | 704 PdfEncoding* FixPdfFont(PdfContext* pdfContext, PdfFont* fCurFont) { |
714 // TODO(edisonn): and is Identity-H | 705 // TODO(edisonn): and is Identity-H |
715 if (gFontsFixed.find(fCurFont) == gFontsFixed.end()) { | 706 if (gFontsFixed.find(fCurFont) == gFontsFixed.end()) { |
716 if (fCurFont->GetObject()->IsDictionary() && fCurFont->GetObject()->GetD
ictionary().HasKey(PdfName("ToUnicode"))) { | 707 if (fCurFont->GetObject()->IsDictionary() && fCurFont->GetObject()->GetD
ictionary().HasKey(PdfName("ToUnicode"))) { |
717 PdfCMapEncoding* enc = new PdfCMapEncoding( | 708 PdfCMapEncoding* enc = new PdfCMapEncoding( |
718 fCurFont->GetObject(), | 709 fCurFont->GetObject(), |
719 (PdfObject*)resolveReferenceObject(pdfContext->fPdfDoc, | 710 (PdfObject*)resolveReferenceObject(&pdfContext->fPdfDoc.podo
fo(), |
720 fCurFont->GetObject()->GetDictionary(
).GetKey(PdfName("ToUnicode"))), | 711 fCurFont->GetObject()->GetDictionary(
).GetKey(PdfName("ToUnicode"))), |
721 PdfCMapEncoding::eBaseEncoding_Identity); // todo, read the
base encoding | 712 PdfCMapEncoding::eBaseEncoding_Identity); // todo, read the
base encoding |
722 gFontsFixed[fCurFont] = enc; | 713 gFontsFixed[fCurFont] = enc; |
723 return enc; | 714 return enc; |
724 } | 715 } |
725 | 716 |
726 return NULL; | 717 return NULL; |
727 } | 718 } |
728 | 719 |
729 return gFontsFixed[fCurFont]; | 720 return gFontsFixed[fCurFont]; |
(...skipping 545 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1275 width, height, bytesPerLine, | 1266 width, height, bytesPerLine, |
1276 bpc, colorSpace, | 1267 bpc, colorSpace, |
1277 transparencyMask); | 1268 transparencyMask); |
1278 | 1269 |
1279 free(uncompressedStream); | 1270 free(uncompressedStream); |
1280 | 1271 |
1281 return bitmap; | 1272 return bitmap; |
1282 } | 1273 } |
1283 | 1274 |
1284 SkBitmap getSmaskFromObject(PdfContext* pdfContext, const SkPdfImageDictionary*
obj) { | 1275 SkBitmap getSmaskFromObject(PdfContext* pdfContext, const SkPdfImageDictionary*
obj) { |
1285 const PdfObject* sMask = resolveReferenceObject(pdfContext->fPdfDoc, | 1276 const PdfObject* sMask = resolveReferenceObject(&pdfContext->fPdfDoc.podofo(
), |
1286 obj->podofo()->GetDictionary().Get
Key(PdfName("SMask"))); | 1277 obj->podofo()->GetDictionary().Get
Key(PdfName("SMask"))); |
1287 | 1278 |
1288 #ifdef PDF_TRACE | 1279 #ifdef PDF_TRACE |
1289 std::string str; | 1280 std::string str; |
1290 if (sMask) { | 1281 if (sMask) { |
1291 sMask->ToString(str); | 1282 sMask->ToString(str); |
1292 printf("/SMask of /Subtype /Image: %s\n", str.c_str()); | 1283 printf("/SMask of /Subtype /Image: %s\n", str.c_str()); |
1293 } | 1284 } |
1294 #endif | 1285 #endif |
1295 | 1286 |
1296 if (sMask) { | 1287 if (sMask) { |
1297 SkPdfImageDictionary skxobjmask(pdfContext->fPdfDoc, sMask); | 1288 SkPdfImageDictionary skxobjmask(&pdfContext->fPdfDoc.podofo(), sMask); |
1298 return getImageFromObject(pdfContext, &skxobjmask, true); | 1289 return getImageFromObject(pdfContext, &skxobjmask, true); |
1299 } | 1290 } |
1300 | 1291 |
1301 // TODO(edisonn): implement GS SMask. Default to empty right now. | 1292 // TODO(edisonn): implement GS SMask. Default to empty right now. |
1302 return pdfContext->fGraphicsState.fSMask; | 1293 return pdfContext->fGraphicsState.fSMask; |
1303 } | 1294 } |
1304 | 1295 |
1305 PdfResult doXObject_Image(PdfContext* pdfContext, SkCanvas* canvas, const SkPdfI
mageDictionary* skpdfimage) { | 1296 PdfResult doXObject_Image(PdfContext* pdfContext, SkCanvas* canvas, const SkPdfI
mageDictionary* skpdfimage) { |
1306 if (skpdfimage == NULL || !skpdfimage->valid()) { | 1297 if (skpdfimage == NULL || !skpdfimage->valid()) { |
1307 return kIgnoreError_PdfResult; | 1298 return kIgnoreError_PdfResult; |
(...skipping 19 matching lines...) Expand all Loading... |
1327 | 1318 |
1328 canvas->restore(); | 1319 canvas->restore(); |
1329 | 1320 |
1330 return kPartial_PdfResult; | 1321 return kPartial_PdfResult; |
1331 } | 1322 } |
1332 | 1323 |
1333 bool SkMatrixFromDictionary(PdfContext* pdfContext, | 1324 bool SkMatrixFromDictionary(PdfContext* pdfContext, |
1334 const PdfDictionary& dict, | 1325 const PdfDictionary& dict, |
1335 const char* key, | 1326 const char* key, |
1336 SkMatrix* matrix) { | 1327 SkMatrix* matrix) { |
1337 const PdfObject* value = resolveReferenceObject(pdfContext->fPdfDoc, | 1328 const PdfObject* value = resolveReferenceObject(&pdfContext->fPdfDoc.podofo(
), |
1338 dict.GetKey(PdfName(key))); | 1329 dict.GetKey(PdfName(key))); |
1339 | 1330 |
1340 if (value == NULL || !value->IsArray()) { | 1331 if (value == NULL || !value->IsArray()) { |
1341 return false; | 1332 return false; |
1342 } | 1333 } |
1343 | 1334 |
1344 if (value->GetArray().GetSize() != 6) { | 1335 if (value->GetArray().GetSize() != 6) { |
1345 return false; | 1336 return false; |
1346 } | 1337 } |
1347 | 1338 |
1348 double array[6]; | 1339 double array[6]; |
1349 for (int i = 0; i < 6; i++) { | 1340 for (int i = 0; i < 6; i++) { |
1350 const PdfObject* elem = resolveReferenceObject(pdfContext->fPdfDoc, &val
ue->GetArray()[i]); | 1341 const PdfObject* elem = resolveReferenceObject(&pdfContext->fPdfDoc.podo
fo(), &value->GetArray()[i]); |
1351 if (elem == NULL || (!elem->IsReal() && !elem->IsNumber())) { | 1342 if (elem == NULL || (!elem->IsReal() && !elem->IsNumber())) { |
1352 return false; | 1343 return false; |
1353 } | 1344 } |
1354 array[i] = elem->GetReal(); | 1345 array[i] = elem->GetReal(); |
1355 } | 1346 } |
1356 | 1347 |
1357 *matrix = SkMatrixFromPdfMatrix(array); | 1348 *matrix = SkMatrixFromPdfMatrix(array); |
1358 return true; | 1349 return true; |
1359 } | 1350 } |
1360 | 1351 |
1361 bool SkRectFromDictionary(PdfContext* pdfContext, | 1352 bool SkRectFromDictionary(const PdfMemDocument* pdfDoc, |
1362 const PdfDictionary& dict, | 1353 const PdfDictionary& dict, |
1363 const char* key, | 1354 const char* key, |
1364 SkRect* rect) { | 1355 SkRect* rect) { |
1365 const PdfObject* value = resolveReferenceObject(pdfContext->fPdfDoc, | 1356 const PdfObject* value = resolveReferenceObject(pdfDoc, |
1366 dict.GetKey(PdfName(key))); | 1357 dict.GetKey(PdfName(key))); |
1367 | 1358 |
1368 if (value == NULL || !value->IsArray()) { | 1359 if (value == NULL || !value->IsArray()) { |
1369 return false; | 1360 return false; |
1370 } | 1361 } |
1371 | 1362 |
1372 if (value->GetArray().GetSize() != 4) { | 1363 if (value->GetArray().GetSize() != 4) { |
1373 return false; | 1364 return false; |
1374 } | 1365 } |
1375 | 1366 |
1376 double array[4]; | 1367 double array[4]; |
1377 for (int i = 0; i < 4; i++) { | 1368 for (int i = 0; i < 4; i++) { |
1378 const PdfObject* elem = resolveReferenceObject(pdfContext->fPdfDoc, &val
ue->GetArray()[i]); | 1369 const PdfObject* elem = resolveReferenceObject(pdfDoc, &value->GetArray(
)[i]); |
1379 if (elem == NULL || (!elem->IsReal() && !elem->IsNumber())) { | 1370 if (elem == NULL || (!elem->IsReal() && !elem->IsNumber())) { |
1380 return false; | 1371 return false; |
1381 } | 1372 } |
1382 array[i] = elem->GetReal(); | 1373 array[i] = elem->GetReal(); |
1383 } | 1374 } |
1384 | 1375 |
1385 *rect = SkRect::MakeLTRB(SkDoubleToScalar(array[0]), | 1376 *rect = SkRect::MakeLTRB(SkDoubleToScalar(array[0]), |
1386 SkDoubleToScalar(array[1]), | 1377 SkDoubleToScalar(array[1]), |
1387 SkDoubleToScalar(array[2]), | 1378 SkDoubleToScalar(array[2]), |
1388 SkDoubleToScalar(array[3])); | 1379 SkDoubleToScalar(array[3])); |
1389 return true; | 1380 return true; |
1390 } | 1381 } |
1391 | 1382 |
| 1383 bool SkRectFromDictionary(const PdfMemDocument* pdfDoc, |
| 1384 const PdfDictionary& dict, |
| 1385 const char* key, |
| 1386 const char* abr, |
| 1387 SkRect* data) { |
| 1388 if (SkRectFromDictionary(pdfDoc, dict, key, data)) return true; |
| 1389 if (abr == NULL || *abr == '\0') return false; |
| 1390 return SkRectFromDictionary(pdfDoc, dict, abr, data); |
| 1391 |
| 1392 } |
| 1393 |
| 1394 |
1392 SkPdfObject* get(const SkPdfObject* obj, const char* key, const char* abr = "")
{ | 1395 SkPdfObject* get(const SkPdfObject* obj, const char* key, const char* abr = "")
{ |
1393 SkPdfObject* ret = NULL; | 1396 SkPdfObject* ret = NULL; |
1394 if (obj == NULL) return NULL; | 1397 if (obj == NULL) return NULL; |
1395 const SkPdfDictionary* dict = obj->asDictionary(); | 1398 const SkPdfDictionary* dict = obj->asDictionary(); |
1396 if (dict == NULL) return NULL; | 1399 if (dict == NULL) return NULL; |
1397 if (!dict->podofo()->IsDictionary()) return NULL; | 1400 if (!dict->podofo()->IsDictionary()) return NULL; |
1398 ObjectFromDictionary(dict->doc(), dict->podofo()->GetDictionary(), key, abr,
&ret); | 1401 ObjectFromDictionary(dict->doc(), dict->podofo()->GetDictionary(), key, abr,
&ret); |
1399 return ret; | 1402 return ret; |
1400 } | 1403 } |
1401 | 1404 |
1402 PdfResult doXObject_Form(PdfContext* pdfContext, SkCanvas* canvas, SkPdfType1For
mDictionary* skobj) { | 1405 PdfResult doXObject_Form(PdfContext* pdfContext, SkCanvas* canvas, SkPdfType1For
mDictionary* skobj) { |
1403 if (!skobj || !skobj->podofo() || !skobj->podofo()->HasStream() || skobj->po
dofo()->GetStream() == NULL || skobj->podofo()->GetStream()->GetLength() == 0) { | 1406 if (!skobj || !skobj->podofo() || !skobj->podofo()->HasStream() || skobj->po
dofo()->GetStream() == NULL || skobj->podofo()->GetStream()->GetLength() == 0) { |
1404 return kOK_PdfResult; | 1407 return kOK_PdfResult; |
1405 } | 1408 } |
1406 | 1409 |
1407 PdfOp_q(pdfContext, canvas, NULL); | 1410 PdfOp_q(pdfContext, canvas, NULL); |
1408 canvas->save(); | 1411 canvas->save(); |
1409 | 1412 |
1410 if (get(skobj, "Resources")) { | 1413 if (get(skobj, "Resources")) { |
1411 SkPdfResourceDictionary* res = NULL; | 1414 SkPdfResourceDictionary* res = NULL; |
1412 | 1415 |
1413 PodofoMapper::map(*get(skobj, "Resources"), &res); | 1416 PodofoMapper::map(*get(skobj, "Resources"), &res); |
1414 | 1417 |
1415 if (res) { | 1418 if (res) { |
1416 pdfContext->fGraphicsState.fResources = *res; | 1419 pdfContext->fGraphicsState.fResources = res; |
1417 delete res; | |
1418 } | 1420 } |
1419 } | 1421 } |
1420 | 1422 |
1421 SkTraceMatrix(pdfContext->fGraphicsState.fMatrix, "Current matrix"); | 1423 SkTraceMatrix(pdfContext->fGraphicsState.fMatrix, "Current matrix"); |
1422 | 1424 |
1423 SkMatrix matrix; | 1425 SkMatrix matrix; |
1424 if (SkMatrixFromDictionary(pdfContext, skobj->podofo()->GetDictionary(), "Ma
trix", &matrix)) { | 1426 if (SkMatrixFromDictionary(pdfContext, skobj->podofo()->GetDictionary(), "Ma
trix", &matrix)) { |
1425 pdfContext->fGraphicsState.fMatrix.preConcat(matrix); | 1427 pdfContext->fGraphicsState.fMatrix.preConcat(matrix); |
1426 pdfContext->fGraphicsState.fMatrixTm = pdfContext->fGraphicsState.fMatri
x; | 1428 pdfContext->fGraphicsState.fMatrixTm = pdfContext->fGraphicsState.fMatri
x; |
1427 pdfContext->fGraphicsState.fMatrixTlm = pdfContext->fGraphicsState.fMatr
ix; | 1429 pdfContext->fGraphicsState.fMatrixTlm = pdfContext->fGraphicsState.fMatr
ix; |
1428 // TODO(edisonn) reset matrixTm and matricTlm also? | 1430 // TODO(edisonn) reset matrixTm and matricTlm also? |
1429 } | 1431 } |
1430 | 1432 |
1431 SkTraceMatrix(pdfContext->fGraphicsState.fMatrix, "Total matrix"); | 1433 SkTraceMatrix(pdfContext->fGraphicsState.fMatrix, "Total matrix"); |
1432 | 1434 |
1433 canvas->setMatrix(pdfContext->fGraphicsState.fMatrix); | 1435 canvas->setMatrix(pdfContext->fGraphicsState.fMatrix); |
1434 | 1436 |
1435 SkRect bbox; | 1437 SkRect bbox; |
1436 if (SkRectFromDictionary(pdfContext, skobj->podofo()->GetDictionary(), "BBox
", &bbox)) { | 1438 if (SkRectFromDictionary(&pdfContext->fPdfDoc.podofo(), skobj->podofo()->Get
Dictionary(), "BBox", &bbox)) { |
1437 canvas->clipRect(bbox, SkRegion::kIntersect_Op, true); // TODO(edisonn)
: AA from settings. | 1439 canvas->clipRect(bbox, SkRegion::kIntersect_Op, true); // TODO(edisonn)
: AA from settings. |
1438 } | 1440 } |
1439 | 1441 |
1440 // TODO(edisonn): iterate smart on the stream even if it is compressed, toke
nize it as we go. | 1442 // TODO(edisonn): iterate smart on the stream even if it is compressed, toke
nize it as we go. |
1441 // For this PdfContentsTokenizer needs to be extended. | 1443 // For this PdfContentsTokenizer needs to be extended. |
1442 | 1444 |
1443 char* uncompressedStream = NULL; | 1445 char* uncompressedStream = NULL; |
1444 pdf_long uncompressedStreamLength = 0; | 1446 pdf_long uncompressedStreamLength = 0; |
1445 | 1447 |
1446 PdfResult ret = kPartial_PdfResult; | 1448 PdfResult ret = kPartial_PdfResult; |
1447 | 1449 |
1448 // TODO(edisonn): get rid of try/catch exceptions! We should not throw on us
er data! | 1450 // TODO(edisonn): get rid of try/catch exceptions! We should not throw on us
er data! |
1449 try { | 1451 try { |
1450 skobj->podofo()->GetStream()->GetFilteredCopy(&uncompressedStream, &unco
mpressedStreamLength); | 1452 skobj->podofo()->GetStream()->GetFilteredCopy(&uncompressedStream, &unco
mpressedStreamLength); |
1451 if (uncompressedStream != NULL && uncompressedStreamLength != 0) { | 1453 if (uncompressedStream != NULL && uncompressedStreamLength != 0) { |
1452 PdfContentsTokenizer tokenizer(uncompressedStream, uncompressedStrea
mLength); | 1454 SkPdfTokenizer tokenizer = pdfContext->fPdfDoc.tokenizerOfStream(unc
ompressedStream, uncompressedStreamLength); |
1453 PdfMainLooper looper(NULL, &tokenizer, pdfContext, canvas); | 1455 PdfMainLooper looper(NULL, tokenizer, pdfContext, canvas); |
1454 looper.loop(); | 1456 looper.loop(); |
1455 } | 1457 } |
1456 free(uncompressedStream); | 1458 free(uncompressedStream); |
1457 } catch (PdfError& e) { | 1459 } catch (PdfError& e) { |
1458 ret = kIgnoreError_PdfResult; | 1460 ret = kIgnoreError_PdfResult; |
1459 } | 1461 } |
1460 | 1462 |
1461 // TODO(edisonn): should we restore the variable stack at the same state? | 1463 // TODO(edisonn): should we restore the variable stack at the same state? |
1462 // There could be operands left, that could be consumed by a parent tokenize
r when we pop. | 1464 // There could be operands left, that could be consumed by a parent tokenize
r when we pop. |
1463 canvas->restore(); | 1465 canvas->restore(); |
1464 PdfOp_Q(pdfContext, canvas, NULL); | 1466 PdfOp_Q(pdfContext, canvas, NULL); |
1465 return ret; | 1467 return ret; |
1466 } | 1468 } |
1467 | 1469 |
1468 PdfResult doXObject_PS(PdfContext* pdfContext, SkCanvas* canvas, const PdfObject
& obj) { | 1470 PdfResult doXObject_PS(PdfContext* pdfContext, SkCanvas* canvas, const PdfObject
& obj) { |
1469 return kNYI_PdfResult; | 1471 return kNYI_PdfResult; |
1470 } | 1472 } |
1471 | 1473 |
1472 // TODO(edisonn): faster, have the property on the PdfObject itself. | 1474 // TODO(edisonn): faster, have the property on the SkPdfObject itself? |
1473 std::set<const PdfObject*> gInRendering; | 1475 std::set<const PdfObject*> gInRendering; |
1474 | 1476 |
1475 class CheckRecursiveRendering { | 1477 class CheckRecursiveRendering { |
1476 const PdfObject& fObj; | 1478 const PdfObject& fObj; |
1477 public: | 1479 public: |
1478 CheckRecursiveRendering(const PdfObject& obj) : fObj(obj) { | 1480 CheckRecursiveRendering(const PdfObject& obj) : fObj(obj) { |
1479 gInRendering.insert(&obj); | 1481 gInRendering.insert(&obj); |
1480 } | 1482 } |
1481 | 1483 |
1482 ~CheckRecursiveRendering() { | 1484 ~CheckRecursiveRendering() { |
1483 //SkASSERT(fObj.fInRendering); | 1485 //SkASSERT(fObj.fInRendering); |
1484 gInRendering.erase(&fObj); | 1486 gInRendering.erase(&fObj); |
1485 } | 1487 } |
1486 | 1488 |
1487 static bool IsInRendering(const PdfObject& obj) { | 1489 static bool IsInRendering(const PdfObject& obj) { |
1488 return gInRendering.find(&obj) != gInRendering.end(); | 1490 return gInRendering.find(&obj) != gInRendering.end(); |
1489 } | 1491 } |
1490 }; | 1492 }; |
1491 | 1493 |
1492 PdfResult doXObject(PdfContext* pdfContext, SkCanvas* canvas, const PdfObject& o
bj) { | 1494 PdfResult doXObject(PdfContext* pdfContext, SkCanvas* canvas, const SkPdfObject&
obj) { |
1493 if (CheckRecursiveRendering::IsInRendering(obj)) { | 1495 if (CheckRecursiveRendering::IsInRendering(*obj.podofo())) { |
1494 // Oops, corrupt PDF! | 1496 // Oops, corrupt PDF! |
1495 return kIgnoreError_PdfResult; | 1497 return kIgnoreError_PdfResult; |
1496 } | 1498 } |
1497 | 1499 |
1498 CheckRecursiveRendering checkRecursion(obj); | 1500 CheckRecursiveRendering checkRecursion(*obj.podofo()); |
1499 | 1501 |
1500 // TODO(edisonn): check type | 1502 // TODO(edisonn): check type |
1501 SkPdfXObjectDictionary* skobj = NULL; | 1503 SkPdfXObjectDictionary* skobj = NULL; |
1502 if (!PodofoMapper::map(*pdfContext->fPdfDoc, obj, &skobj)) return kIgnoreErr
or_PdfResult; | 1504 if (!PodofoMapper::map(obj, &skobj)) return kIgnoreError_PdfResult; |
1503 | 1505 |
1504 if (!skobj || !skobj->valid()) return kIgnoreError_PdfResult; | 1506 if (!skobj || !skobj->valid()) return kIgnoreError_PdfResult; |
1505 | 1507 |
1506 PdfResult ret = kIgnoreError_PdfResult; | 1508 PdfResult ret = kIgnoreError_PdfResult; |
1507 switch (skobj->getType()) | 1509 switch (skobj->getType()) |
1508 { | 1510 { |
1509 case kObjectDictionaryXObjectDictionaryImageDictionary_SkPdfObjectType: | 1511 case kImageDictionary_SkPdfObjectType: |
1510 ret = doXObject_Image(pdfContext, canvas, skobj->asImageDictionary()
); | 1512 ret = doXObject_Image(pdfContext, canvas, skobj->asImageDictionary()
); |
1511 break; | 1513 break; |
1512 case kObjectDictionaryXObjectDictionaryType1FormDictionary_SkPdfObjectTy
pe: | 1514 case kType1FormDictionary_SkPdfObjectType: |
1513 ret = doXObject_Form(pdfContext, canvas, skobj->asType1FormDictionar
y()); | 1515 ret = doXObject_Form(pdfContext, canvas, skobj->asType1FormDictionar
y()); |
1514 break; | 1516 break; |
1515 //case kObjectDictionaryXObjectPS_SkPdfObjectType: | 1517 //case kObjectDictionaryXObjectPS_SkPdfObjectType: |
1516 //return doXObject_PS(skxobj.asPS()); | 1518 //return doXObject_PS(skxobj.asPS()); |
1517 } | 1519 } |
1518 | 1520 |
1519 delete skobj; | 1521 delete skobj; |
1520 return ret; | 1522 return ret; |
1521 } | 1523 } |
1522 | 1524 |
1523 PdfResult PdfOp_q(PdfContext* pdfContext, SkCanvas* canvas, PdfTokenLooper** loo
per) { | 1525 PdfResult PdfOp_q(PdfContext* pdfContext, SkCanvas* canvas, PdfTokenLooper** loo
per) { |
1524 pdfContext->fStateStack.push(pdfContext->fGraphicsState); | 1526 pdfContext->fStateStack.push(pdfContext->fGraphicsState); |
1525 canvas->save(); | 1527 canvas->save(); |
1526 return kOK_PdfResult; | 1528 return kOK_PdfResult; |
1527 } | 1529 } |
1528 | 1530 |
1529 PdfResult PdfOp_Q(PdfContext* pdfContext, SkCanvas* canvas, PdfTokenLooper** loo
per) { | 1531 PdfResult PdfOp_Q(PdfContext* pdfContext, SkCanvas* canvas, PdfTokenLooper** loo
per) { |
1530 pdfContext->fGraphicsState = pdfContext->fStateStack.top(); | 1532 pdfContext->fGraphicsState = pdfContext->fStateStack.top(); |
1531 pdfContext->fStateStack.pop(); | 1533 pdfContext->fStateStack.pop(); |
1532 canvas->restore(); | 1534 canvas->restore(); |
1533 return kOK_PdfResult; | 1535 return kOK_PdfResult; |
1534 } | 1536 } |
1535 | 1537 |
1536 PdfResult PdfOp_cm(PdfContext* pdfContext, SkCanvas* canvas, PdfTokenLooper** lo
oper) { | 1538 PdfResult PdfOp_cm(PdfContext* pdfContext, SkCanvas* canvas, PdfTokenLooper** lo
oper) { |
1537 double array[6]; | 1539 double array[6]; |
1538 for (int i = 0 ; i < 6 ; i++) { | 1540 for (int i = 0 ; i < 6 ; i++) { |
1539 array[5 - i] = pdfContext->fVarStack.top().GetReal(); | 1541 array[5 - i] = pdfContext->fObjectStack.top()->asNumber()->value(); |
1540 pdfContext->fVarStack.pop(); | 1542 pdfContext->fObjectStack.pop(); |
1541 } | 1543 } |
1542 | 1544 |
1543 // a b | 1545 // a b |
1544 // c d | 1546 // c d |
1545 // e f | 1547 // e f |
1546 | 1548 |
1547 // 0 1 | 1549 // 0 1 |
1548 // 2 3 | 1550 // 2 3 |
1549 // 4 5 | 1551 // 4 5 |
1550 | 1552 |
(...skipping 13 matching lines...) Expand all Loading... |
1564 SkTraceMatrix(pdfContext->fGraphicsState.fMatrix); | 1566 SkTraceMatrix(pdfContext->fGraphicsState.fMatrix); |
1565 #endif | 1567 #endif |
1566 | 1568 |
1567 return kOK_PdfResult; | 1569 return kOK_PdfResult; |
1568 } | 1570 } |
1569 | 1571 |
1570 //leading TL Set the text leading, Tl | 1572 //leading TL Set the text leading, Tl |
1571 //, to leading, which is a number expressed in unscaled text | 1573 //, to leading, which is a number expressed in unscaled text |
1572 //space units. Text leading is used only by the T*, ', and " operators. Initial
value: 0. | 1574 //space units. Text leading is used only by the T*, ', and " operators. Initial
value: 0. |
1573 PdfResult PdfOp_TL(PdfContext* pdfContext, SkCanvas* canvas, PdfTokenLooper** lo
oper) { | 1575 PdfResult PdfOp_TL(PdfContext* pdfContext, SkCanvas* canvas, PdfTokenLooper** lo
oper) { |
1574 double ty = pdfContext->fVarStack.top().GetReal(); pdfContext->fVarStack.pop
(); | 1576 double ty = pdfContext->fObjectStack.top()->asNumber()->value(); pdfContext-
>fObjectStack.pop(); |
1575 | 1577 |
1576 pdfContext->fGraphicsState.fTextLeading = ty; | 1578 pdfContext->fGraphicsState.fTextLeading = ty; |
1577 | 1579 |
1578 return kOK_PdfResult; | 1580 return kOK_PdfResult; |
1579 } | 1581 } |
1580 | 1582 |
1581 PdfResult PdfOp_Td(PdfContext* pdfContext, SkCanvas* canvas, PdfTokenLooper** lo
oper) { | 1583 PdfResult PdfOp_Td(PdfContext* pdfContext, SkCanvas* canvas, PdfTokenLooper** lo
oper) { |
1582 double ty = pdfContext->fVarStack.top().GetReal(); pdfContext->fVarStack.pop
(); | 1584 double ty = pdfContext->fObjectStack.top()->asNumber()->value(); pdfContext-
>fObjectStack.pop(); |
1583 double tx = pdfContext->fVarStack.top().GetReal(); pdfContext->fVarStack.pop
(); | 1585 double tx = pdfContext->fObjectStack.top()->asNumber()->value(); pdfContext-
>fObjectStack.pop(); |
1584 | 1586 |
1585 double array[6] = {1, 0, 0, 1, tx, ty}; | 1587 double array[6] = {1, 0, 0, 1, tx, ty}; |
1586 SkMatrix matrix = SkMatrixFromPdfMatrix(array); | 1588 SkMatrix matrix = SkMatrixFromPdfMatrix(array); |
1587 | 1589 |
1588 pdfContext->fGraphicsState.fMatrixTm.preConcat(matrix); | 1590 pdfContext->fGraphicsState.fMatrixTm.preConcat(matrix); |
1589 pdfContext->fGraphicsState.fMatrixTlm.preConcat(matrix); | 1591 pdfContext->fGraphicsState.fMatrixTlm.preConcat(matrix); |
1590 | 1592 |
1591 return kPartial_PdfResult; | 1593 return kPartial_PdfResult; |
1592 } | 1594 } |
1593 | 1595 |
1594 PdfResult PdfOp_TD(PdfContext* pdfContext, SkCanvas* canvas, PdfTokenLooper** lo
oper) { | 1596 PdfResult PdfOp_TD(PdfContext* pdfContext, SkCanvas* canvas, PdfTokenLooper** lo
oper) { |
1595 double ty = pdfContext->fVarStack.top().GetReal(); pdfContext->fVarStack.pop
(); | 1597 double ty = pdfContext->fObjectStack.top()->asNumber()->value(); pdfContext-
>fObjectStack.pop(); |
1596 double tx = pdfContext->fVarStack.top().GetReal(); pdfContext->fVarStack.pop
(); | 1598 double tx = pdfContext->fObjectStack.top()->asNumber()->value(); pdfContext-
>fObjectStack.pop(); |
1597 | 1599 |
1598 PdfVariant _ty(-ty); | 1600 PdfObject _ty(PdfVariant(-ty)); |
1599 pdfContext->fVarStack.push(_ty); | 1601 pdfContext->fObjectStack.push(new SkPdfNumber(&pdfContext->fPdfDoc.podofo(),
&_ty)); |
| 1602 |
1600 PdfOp_TL(pdfContext, canvas, looper); | 1603 PdfOp_TL(pdfContext, canvas, looper); |
1601 | 1604 |
1602 PdfVariant vtx(tx); | 1605 PdfObject vtx(PdfVariant(-(-tx))); // TODO(edisonn) Hmm, the compiler think
s I have here a function pointer if we use (tx), but not -(-tx) |
1603 PdfVariant vty(ty); | 1606 pdfContext->fObjectStack.push(new SkPdfNumber(&pdfContext->fPdfDoc.podofo(),
&vtx)); |
1604 pdfContext->fVarStack.push(vtx); | 1607 |
1605 pdfContext->fVarStack.push(vty); | 1608 PdfObject vty(PdfVariant(-(-ty))); |
| 1609 pdfContext->fObjectStack.push(new SkPdfNumber(&pdfContext->fPdfDoc.podofo(),
&vty)); |
| 1610 |
1606 return PdfOp_Td(pdfContext, canvas, looper); | 1611 return PdfOp_Td(pdfContext, canvas, looper); |
1607 } | 1612 } |
1608 | 1613 |
1609 PdfResult PdfOp_Tm(PdfContext* pdfContext, SkCanvas* canvas, PdfTokenLooper** lo
oper) { | 1614 PdfResult PdfOp_Tm(PdfContext* pdfContext, SkCanvas* canvas, PdfTokenLooper** lo
oper) { |
1610 double f = pdfContext->fVarStack.top().GetReal(); pdfContext->fVarStack.pop(
); | 1615 double f = pdfContext->fObjectStack.top()->asNumber()->value(); pdfContext->
fObjectStack.pop(); |
1611 double e = pdfContext->fVarStack.top().GetReal(); pdfContext->fVarStack.pop(
); | 1616 double e = pdfContext->fObjectStack.top()->asNumber()->value(); pdfContext->
fObjectStack.pop(); |
1612 double d = pdfContext->fVarStack.top().GetReal(); pdfContext->fVarStack.pop(
); | 1617 double d = pdfContext->fObjectStack.top()->asNumber()->value(); pdfContext->
fObjectStack.pop(); |
1613 double c = pdfContext->fVarStack.top().GetReal(); pdfContext->fVarStack.pop(
); | 1618 double c = pdfContext->fObjectStack.top()->asNumber()->value(); pdfContext->
fObjectStack.pop(); |
1614 double b = pdfContext->fVarStack.top().GetReal(); pdfContext->fVarStack.pop(
); | 1619 double b = pdfContext->fObjectStack.top()->asNumber()->value(); pdfContext->
fObjectStack.pop(); |
1615 double a = pdfContext->fVarStack.top().GetReal(); pdfContext->fVarStack.pop(
); | 1620 double a = pdfContext->fObjectStack.top()->asNumber()->value(); pdfContext->
fObjectStack.pop(); |
1616 | 1621 |
1617 double array[6]; | 1622 double array[6]; |
1618 array[0] = a; | 1623 array[0] = a; |
1619 array[1] = b; | 1624 array[1] = b; |
1620 array[2] = c; | 1625 array[2] = c; |
1621 array[3] = d; | 1626 array[3] = d; |
1622 array[4] = e; | 1627 array[4] = e; |
1623 array[5] = f; | 1628 array[5] = f; |
1624 | 1629 |
1625 SkMatrix matrix = SkMatrixFromPdfMatrix(array); | 1630 SkMatrix matrix = SkMatrixFromPdfMatrix(array); |
1626 matrix.postConcat(pdfContext->fGraphicsState.fMatrix); | 1631 matrix.postConcat(pdfContext->fGraphicsState.fMatrix); |
1627 | 1632 |
1628 // TODO(edisonn): Text positioning. | 1633 // TODO(edisonn): Text positioning. |
1629 pdfContext->fGraphicsState.fMatrixTm = matrix; | 1634 pdfContext->fGraphicsState.fMatrixTm = matrix; |
1630 pdfContext->fGraphicsState.fMatrixTlm = matrix;; | 1635 pdfContext->fGraphicsState.fMatrixTlm = matrix;; |
1631 | 1636 |
1632 return kPartial_PdfResult; | 1637 return kPartial_PdfResult; |
1633 } | 1638 } |
1634 | 1639 |
1635 //— T* Move to the start of the next line. This operator has the same effect as
the code | 1640 //— T* Move to the start of the next line. This operator has the same effect as
the code |
1636 //0 Tl Td | 1641 //0 Tl Td |
1637 //where Tl is the current leading parameter in the text state | 1642 //where Tl is the current leading parameter in the text state |
1638 PdfResult PdfOp_T_star(PdfContext* pdfContext, SkCanvas* canvas, PdfTokenLooper*
* looper) { | 1643 PdfResult PdfOp_T_star(PdfContext* pdfContext, SkCanvas* canvas, PdfTokenLooper*
* looper) { |
1639 PdfVariant zero(0.0); | 1644 PdfObject zero(PdfVariant(0.0)); |
1640 PdfVariant tl(pdfContext->fGraphicsState.fTextLeading); | 1645 PdfObject tl(PdfVariant(-(-pdfContext->fGraphicsState.fTextLeading))); |
1641 | 1646 |
1642 pdfContext->fVarStack.push(zero); | 1647 pdfContext->fObjectStack.push(new SkPdfNumber(&pdfContext->fPdfDoc.podofo(),
&zero)); |
1643 pdfContext->fVarStack.push(tl); | 1648 pdfContext->fObjectStack.push(new SkPdfNumber(&pdfContext->fPdfDoc.podofo(),
&tl)); |
1644 return PdfOp_Td(pdfContext, canvas, looper); | 1649 return PdfOp_Td(pdfContext, canvas, looper); |
1645 } | 1650 } |
1646 | 1651 |
1647 PdfResult PdfOp_m(PdfContext* pdfContext, SkCanvas* canvas, PdfTokenLooper** loo
per) { | 1652 PdfResult PdfOp_m(PdfContext* pdfContext, SkCanvas* canvas, PdfTokenLooper** loo
per) { |
1648 if (pdfContext->fGraphicsState.fPathClosed) { | 1653 if (pdfContext->fGraphicsState.fPathClosed) { |
1649 pdfContext->fGraphicsState.fPath.reset(); | 1654 pdfContext->fGraphicsState.fPath.reset(); |
1650 pdfContext->fGraphicsState.fPathClosed = false; | 1655 pdfContext->fGraphicsState.fPathClosed = false; |
1651 } | 1656 } |
1652 | 1657 |
1653 pdfContext->fGraphicsState.fCurPosY = pdfContext->fVarStack.top().GetReal();
pdfContext->fVarStack.pop(); | 1658 pdfContext->fGraphicsState.fCurPosY = pdfContext->fObjectStack.top()->asNumb
er()->value(); pdfContext->fObjectStack.pop(); |
1654 pdfContext->fGraphicsState.fCurPosX = pdfContext->fVarStack.top().GetReal();
pdfContext->fVarStack.pop(); | 1659 pdfContext->fGraphicsState.fCurPosX = pdfContext->fObjectStack.top()->asNumb
er()->value(); pdfContext->fObjectStack.pop(); |
1655 | 1660 |
1656 pdfContext->fGraphicsState.fPath.moveTo(SkDoubleToScalar(pdfContext->fGraphi
csState.fCurPosX), | 1661 pdfContext->fGraphicsState.fPath.moveTo(SkDoubleToScalar(pdfContext->fGraphi
csState.fCurPosX), |
1657 SkDoubleToScalar(pdfContext->fGraphics
State.fCurPosY)); | 1662 SkDoubleToScalar(pdfContext->fGraphics
State.fCurPosY)); |
1658 | 1663 |
1659 return kOK_PdfResult; | 1664 return kOK_PdfResult; |
1660 } | 1665 } |
1661 | 1666 |
1662 PdfResult PdfOp_l(PdfContext* pdfContext, SkCanvas* canvas, PdfTokenLooper** loo
per) { | 1667 PdfResult PdfOp_l(PdfContext* pdfContext, SkCanvas* canvas, PdfTokenLooper** loo
per) { |
1663 if (pdfContext->fGraphicsState.fPathClosed) { | 1668 if (pdfContext->fGraphicsState.fPathClosed) { |
1664 pdfContext->fGraphicsState.fPath.reset(); | 1669 pdfContext->fGraphicsState.fPath.reset(); |
1665 pdfContext->fGraphicsState.fPathClosed = false; | 1670 pdfContext->fGraphicsState.fPathClosed = false; |
1666 } | 1671 } |
1667 | 1672 |
1668 pdfContext->fGraphicsState.fCurPosY = pdfContext->fVarStack.top().GetReal();
pdfContext->fVarStack.pop(); | 1673 pdfContext->fGraphicsState.fCurPosY = pdfContext->fObjectStack.top()->asNumb
er()->value(); pdfContext->fObjectStack.pop(); |
1669 pdfContext->fGraphicsState.fCurPosX = pdfContext->fVarStack.top().GetReal();
pdfContext->fVarStack.pop(); | 1674 pdfContext->fGraphicsState.fCurPosX = pdfContext->fObjectStack.top()->asNumb
er()->value(); pdfContext->fObjectStack.pop(); |
1670 | 1675 |
1671 pdfContext->fGraphicsState.fPath.lineTo(SkDoubleToScalar(pdfContext->fGraphi
csState.fCurPosX), | 1676 pdfContext->fGraphicsState.fPath.lineTo(SkDoubleToScalar(pdfContext->fGraphi
csState.fCurPosX), |
1672 SkDoubleToScalar(pdfContext->fGraphics
State.fCurPosY)); | 1677 SkDoubleToScalar(pdfContext->fGraphics
State.fCurPosY)); |
1673 | 1678 |
1674 return kOK_PdfResult; | 1679 return kOK_PdfResult; |
1675 } | 1680 } |
1676 | 1681 |
1677 PdfResult PdfOp_c(PdfContext* pdfContext, SkCanvas* canvas, PdfTokenLooper** loo
per) { | 1682 PdfResult PdfOp_c(PdfContext* pdfContext, SkCanvas* canvas, PdfTokenLooper** loo
per) { |
1678 if (pdfContext->fGraphicsState.fPathClosed) { | 1683 if (pdfContext->fGraphicsState.fPathClosed) { |
1679 pdfContext->fGraphicsState.fPath.reset(); | 1684 pdfContext->fGraphicsState.fPath.reset(); |
1680 pdfContext->fGraphicsState.fPathClosed = false; | 1685 pdfContext->fGraphicsState.fPathClosed = false; |
1681 } | 1686 } |
1682 | 1687 |
1683 double y3 = pdfContext->fVarStack.top().GetReal(); pdfContext->fVarStack.
pop(); | 1688 double y3 = pdfContext->fObjectStack.top()->asNumber()->value(); pdfConte
xt->fObjectStack.pop(); |
1684 double x3 = pdfContext->fVarStack.top().GetReal(); pdfContext->fVarStack.
pop(); | 1689 double x3 = pdfContext->fObjectStack.top()->asNumber()->value(); pdfConte
xt->fObjectStack.pop(); |
1685 double y2 = pdfContext->fVarStack.top().GetReal(); pdfContext->fVarStack.
pop(); | 1690 double y2 = pdfContext->fObjectStack.top()->asNumber()->value(); pdfConte
xt->fObjectStack.pop(); |
1686 double x2 = pdfContext->fVarStack.top().GetReal(); pdfContext->fVarStack.
pop(); | 1691 double x2 = pdfContext->fObjectStack.top()->asNumber()->value(); pdfConte
xt->fObjectStack.pop(); |
1687 double y1 = pdfContext->fVarStack.top().GetReal(); pdfContext->fVarStack.
pop(); | 1692 double y1 = pdfContext->fObjectStack.top()->asNumber()->value(); pdfConte
xt->fObjectStack.pop(); |
1688 double x1 = pdfContext->fVarStack.top().GetReal(); pdfContext->fVarStack.
pop(); | 1693 double x1 = pdfContext->fObjectStack.top()->asNumber()->value(); pdfConte
xt->fObjectStack.pop(); |
1689 | 1694 |
1690 pdfContext->fGraphicsState.fPath.cubicTo(SkDoubleToScalar(x1), SkDoubleToSca
lar(y1), | 1695 pdfContext->fGraphicsState.fPath.cubicTo(SkDoubleToScalar(x1), SkDoubleToSca
lar(y1), |
1691 SkDoubleToScalar(x2), SkDoubleToScal
ar(y2), | 1696 SkDoubleToScalar(x2), SkDoubleToScal
ar(y2), |
1692 SkDoubleToScalar(x3), SkDoubleToScal
ar(y3)); | 1697 SkDoubleToScalar(x3), SkDoubleToScal
ar(y3)); |
1693 | 1698 |
1694 pdfContext->fGraphicsState.fCurPosX = x3; | 1699 pdfContext->fGraphicsState.fCurPosX = x3; |
1695 pdfContext->fGraphicsState.fCurPosY = y3; | 1700 pdfContext->fGraphicsState.fCurPosY = y3; |
1696 | 1701 |
1697 return kOK_PdfResult; | 1702 return kOK_PdfResult; |
1698 } | 1703 } |
1699 | 1704 |
1700 PdfResult PdfOp_v(PdfContext* pdfContext, SkCanvas* canvas, PdfTokenLooper** loo
per) { | 1705 PdfResult PdfOp_v(PdfContext* pdfContext, SkCanvas* canvas, PdfTokenLooper** loo
per) { |
1701 if (pdfContext->fGraphicsState.fPathClosed) { | 1706 if (pdfContext->fGraphicsState.fPathClosed) { |
1702 pdfContext->fGraphicsState.fPath.reset(); | 1707 pdfContext->fGraphicsState.fPath.reset(); |
1703 pdfContext->fGraphicsState.fPathClosed = false; | 1708 pdfContext->fGraphicsState.fPathClosed = false; |
1704 } | 1709 } |
1705 | 1710 |
1706 double y3 = pdfContext->fVarStack.top().GetReal(); pdfContext->fVarStack.
pop(); | 1711 double y3 = pdfContext->fObjectStack.top()->asNumber()->value(); pdfConte
xt->fObjectStack.pop(); |
1707 double x3 = pdfContext->fVarStack.top().GetReal(); pdfContext->fVarStack.
pop(); | 1712 double x3 = pdfContext->fObjectStack.top()->asNumber()->value(); pdfConte
xt->fObjectStack.pop(); |
1708 double y2 = pdfContext->fVarStack.top().GetReal(); pdfContext->fVarStack.
pop(); | 1713 double y2 = pdfContext->fObjectStack.top()->asNumber()->value(); pdfConte
xt->fObjectStack.pop(); |
1709 double x2 = pdfContext->fVarStack.top().GetReal(); pdfContext->fVarStack.
pop(); | 1714 double x2 = pdfContext->fObjectStack.top()->asNumber()->value(); pdfConte
xt->fObjectStack.pop(); |
1710 double y1 = pdfContext->fGraphicsState.fCurPosY; | 1715 double y1 = pdfContext->fGraphicsState.fCurPosY; |
1711 double x1 = pdfContext->fGraphicsState.fCurPosX; | 1716 double x1 = pdfContext->fGraphicsState.fCurPosX; |
1712 | 1717 |
1713 pdfContext->fGraphicsState.fPath.cubicTo(SkDoubleToScalar(x1), SkDoubleToSca
lar(y1), | 1718 pdfContext->fGraphicsState.fPath.cubicTo(SkDoubleToScalar(x1), SkDoubleToSca
lar(y1), |
1714 SkDoubleToScalar(x2), SkDoubleToScal
ar(y2), | 1719 SkDoubleToScalar(x2), SkDoubleToScal
ar(y2), |
1715 SkDoubleToScalar(x3), SkDoubleToScal
ar(y3)); | 1720 SkDoubleToScalar(x3), SkDoubleToScal
ar(y3)); |
1716 | 1721 |
1717 pdfContext->fGraphicsState.fCurPosX = x3; | 1722 pdfContext->fGraphicsState.fCurPosX = x3; |
1718 pdfContext->fGraphicsState.fCurPosY = y3; | 1723 pdfContext->fGraphicsState.fCurPosY = y3; |
1719 | 1724 |
1720 return kOK_PdfResult; | 1725 return kOK_PdfResult; |
1721 } | 1726 } |
1722 | 1727 |
1723 PdfResult PdfOp_y(PdfContext* pdfContext, SkCanvas* canvas, PdfTokenLooper** loo
per) { | 1728 PdfResult PdfOp_y(PdfContext* pdfContext, SkCanvas* canvas, PdfTokenLooper** loo
per) { |
1724 if (pdfContext->fGraphicsState.fPathClosed) { | 1729 if (pdfContext->fGraphicsState.fPathClosed) { |
1725 pdfContext->fGraphicsState.fPath.reset(); | 1730 pdfContext->fGraphicsState.fPath.reset(); |
1726 pdfContext->fGraphicsState.fPathClosed = false; | 1731 pdfContext->fGraphicsState.fPathClosed = false; |
1727 } | 1732 } |
1728 | 1733 |
1729 double y3 = pdfContext->fVarStack.top().GetReal(); pdfContext->fVarStack.
pop(); | 1734 double y3 = pdfContext->fObjectStack.top()->asNumber()->value(); pdfConte
xt->fObjectStack.pop(); |
1730 double x3 = pdfContext->fVarStack.top().GetReal(); pdfContext->fVarStack.
pop(); | 1735 double x3 = pdfContext->fObjectStack.top()->asNumber()->value(); pdfConte
xt->fObjectStack.pop(); |
1731 double y2 = pdfContext->fGraphicsState.fCurPosY; | 1736 double y2 = pdfContext->fGraphicsState.fCurPosY; |
1732 double x2 = pdfContext->fGraphicsState.fCurPosX; | 1737 double x2 = pdfContext->fGraphicsState.fCurPosX; |
1733 double y1 = pdfContext->fVarStack.top().GetReal(); pdfContext->fVarStack.
pop(); | 1738 double y1 = pdfContext->fObjectStack.top()->asNumber()->value(); pdfConte
xt->fObjectStack.pop(); |
1734 double x1 = pdfContext->fVarStack.top().GetReal(); pdfContext->fVarStack.
pop(); | 1739 double x1 = pdfContext->fObjectStack.top()->asNumber()->value(); pdfConte
xt->fObjectStack.pop(); |
1735 | 1740 |
1736 pdfContext->fGraphicsState.fPath.cubicTo(SkDoubleToScalar(x1), SkDoubleToSca
lar(y1), | 1741 pdfContext->fGraphicsState.fPath.cubicTo(SkDoubleToScalar(x1), SkDoubleToSca
lar(y1), |
1737 SkDoubleToScalar(x2), SkDoubleToScal
ar(y2), | 1742 SkDoubleToScalar(x2), SkDoubleToScal
ar(y2), |
1738 SkDoubleToScalar(x3), SkDoubleToScal
ar(y3)); | 1743 SkDoubleToScalar(x3), SkDoubleToScal
ar(y3)); |
1739 | 1744 |
1740 pdfContext->fGraphicsState.fCurPosX = x3; | 1745 pdfContext->fGraphicsState.fCurPosX = x3; |
1741 pdfContext->fGraphicsState.fCurPosY = y3; | 1746 pdfContext->fGraphicsState.fCurPosY = y3; |
1742 | 1747 |
1743 return kOK_PdfResult; | 1748 return kOK_PdfResult; |
1744 } | 1749 } |
1745 | 1750 |
1746 PdfResult PdfOp_re(PdfContext* pdfContext, SkCanvas* canvas, PdfTokenLooper** lo
oper) { | 1751 PdfResult PdfOp_re(PdfContext* pdfContext, SkCanvas* canvas, PdfTokenLooper** lo
oper) { |
1747 if (pdfContext->fGraphicsState.fPathClosed) { | 1752 if (pdfContext->fGraphicsState.fPathClosed) { |
1748 pdfContext->fGraphicsState.fPath.reset(); | 1753 pdfContext->fGraphicsState.fPath.reset(); |
1749 pdfContext->fGraphicsState.fPathClosed = false; | 1754 pdfContext->fGraphicsState.fPathClosed = false; |
1750 } | 1755 } |
1751 | 1756 |
1752 double height = pdfContext->fVarStack.top().GetReal(); pdfContext->fVar
Stack.pop(); | 1757 double height = pdfContext->fObjectStack.top()->asNumber()->value(); pd
fContext->fObjectStack.pop(); |
1753 double width = pdfContext->fVarStack.top().GetReal(); pdfContext->fVar
Stack.pop(); | 1758 double width = pdfContext->fObjectStack.top()->asNumber()->value(); pd
fContext->fObjectStack.pop(); |
1754 double y = pdfContext->fVarStack.top().GetReal(); pdfContext->fVar
Stack.pop(); | 1759 double y = pdfContext->fObjectStack.top()->asNumber()->value(); pd
fContext->fObjectStack.pop(); |
1755 double x = pdfContext->fVarStack.top().GetReal(); pdfContext->fVar
Stack.pop(); | 1760 double x = pdfContext->fObjectStack.top()->asNumber()->value(); pd
fContext->fObjectStack.pop(); |
1756 | 1761 |
1757 pdfContext->fGraphicsState.fPath.addRect(SkDoubleToScalar(x), SkDoubleToScal
ar(y), | 1762 pdfContext->fGraphicsState.fPath.addRect(SkDoubleToScalar(x), SkDoubleToScal
ar(y), |
1758 SkDoubleToScalar(x + width), SkDouble
ToScalar(y + height)); | 1763 SkDoubleToScalar(x + width), SkDouble
ToScalar(y + height)); |
1759 | 1764 |
1760 pdfContext->fGraphicsState.fCurPosX = x; | 1765 pdfContext->fGraphicsState.fCurPosX = x; |
1761 pdfContext->fGraphicsState.fCurPosY = y + height; | 1766 pdfContext->fGraphicsState.fCurPosY = y + height; |
1762 | 1767 |
1763 return kOK_PdfResult; | 1768 return kOK_PdfResult; |
1764 } | 1769 } |
1765 | 1770 |
(...skipping 131 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1897 // TODO(edisonn): anything else to be done once we are done with draw text?
Like restore stack? | 1902 // TODO(edisonn): anything else to be done once we are done with draw text?
Like restore stack? |
1898 return kPartial_PdfResult; | 1903 return kPartial_PdfResult; |
1899 } | 1904 } |
1900 | 1905 |
1901 //font size Tf Set the text font, Tf | 1906 //font size Tf Set the text font, Tf |
1902 //, to font and the text font size, Tfs, to size. font is the name of a | 1907 //, to font and the text font size, Tfs, to size. font is the name of a |
1903 //font resource in the Fontsubdictionary of the current resource dictionary; siz
e is | 1908 //font resource in the Fontsubdictionary of the current resource dictionary; siz
e is |
1904 //a number representing a scale factor. There is no initial value for either fon
t or | 1909 //a number representing a scale factor. There is no initial value for either fon
t or |
1905 //size; they must be specified explicitly using Tf before any text is shown. | 1910 //size; they must be specified explicitly using Tf before any text is shown. |
1906 PdfResult PdfOp_Tf(PdfContext* pdfContext, SkCanvas* canvas, PdfTokenLooper** lo
oper) { | 1911 PdfResult PdfOp_Tf(PdfContext* pdfContext, SkCanvas* canvas, PdfTokenLooper** lo
oper) { |
1907 pdfContext->fGraphicsState.fCurFontSize = pdfContext->fVarStack.top().GetRea
l(); pdfContext->fVarStack.pop(); | 1912 pdfContext->fGraphicsState.fCurFontSize = pdfContext->fObjectStack.top()->as
Number()->value(); pdfContext->fObjectStack.pop(); |
1908 PdfName fontName = pdfContext->fVarStack.top().GetName();
pdfContext->fVarStack.pop(); | 1913 std::string fontName = pdfContext->fObjectStack.top()->asName()->value();
pdfContext->fObjectStack.pop(); |
| 1914 |
| 1915 #ifdef PDF_TRACE |
| 1916 printf("font name: %s\n", fontName.c_str()); |
| 1917 std::string str; |
| 1918 pdfContext->fGraphicsState.fResources->podofo()->ToString(str); |
| 1919 printf("Print Tf font Resources: %s\n", str.c_str()); |
| 1920 #endif |
1909 | 1921 |
1910 // TODO(edisonn): Load font from pdfContext->fGraphicsState.fObjectWithResou
rces ? | 1922 // TODO(edisonn): Load font from pdfContext->fGraphicsState.fObjectWithResou
rces ? |
1911 PdfObject* pFont = pdfContext->fPdfPage->GetFromResources( PdfName("Font"),
fontName ); | 1923 const PdfObject* pFont = resolveReferenceObject(&pdfContext->fPdfDoc.podofo(
), |
| 1924 pdfContext->fGraphicsState.f
Resources->Font()->get(fontName.c_str()).podofo()); |
1912 if( !pFont ) | 1925 if( !pFont ) |
1913 { | 1926 { |
1914 // TODO(edisonn): try to ignore the error, make sure we do not crash. | 1927 // TODO(edisonn): try to ignore the error, make sure we do not crash. |
1915 return kIgnoreError_PdfResult; | 1928 return kIgnoreError_PdfResult; |
1916 } | 1929 } |
1917 | 1930 |
1918 pdfContext->fGraphicsState.fCurFont = pdfContext->fPdfDoc->GetFont( pFont ); | 1931 pdfContext->fGraphicsState.fCurFont = pdfContext->fPdfDoc.podofo().GetFont(
(PdfObject*)pFont ); |
1919 if( !pdfContext->fGraphicsState.fCurFont ) | 1932 if( !pdfContext->fGraphicsState.fCurFont ) |
1920 { | 1933 { |
1921 // TODO(edisonn): check ~/crasing, for one of the files PoDoFo throws ex
ception | 1934 // TODO(edisonn): check ~/crasing, for one of the files PoDoFo throws ex
ception |
1922 // when calling pFont->Reference(), with Linked list corruption. | 1935 // when calling pFont->Reference(), with Linked list corruption. |
1923 return kIgnoreError_PdfResult; | 1936 return kIgnoreError_PdfResult; |
1924 } | 1937 } |
1925 | 1938 |
1926 return kPartial_PdfResult; | 1939 return kPartial_PdfResult; |
1927 } | 1940 } |
1928 | 1941 |
1929 PdfResult PdfOp_Tj(PdfContext* pdfContext, SkCanvas* canvas, PdfTokenLooper** lo
oper) { | 1942 PdfResult PdfOp_Tj(PdfContext* pdfContext, SkCanvas* canvas, PdfTokenLooper** lo
oper) { |
1930 if (!pdfContext->fGraphicsState.fTextBlock) { | 1943 if (!pdfContext->fGraphicsState.fTextBlock) { |
1931 // TODO(edisonn): try to recover and draw it any way? | 1944 // TODO(edisonn): try to recover and draw it any way? |
1932 return kIgnoreError_PdfResult; | 1945 return kIgnoreError_PdfResult; |
1933 } | 1946 } |
1934 | 1947 |
1935 PdfResult ret = DrawText(pdfContext, | 1948 PdfResult ret = DrawText(pdfContext, |
1936 pdfContext->fGraphicsState.fCurFont, | 1949 pdfContext->fGraphicsState.fCurFont, |
1937 pdfContext->fVarStack.top().GetString(), | 1950 pdfContext->fObjectStack.top()->podofo()->GetString
(), |
1938 canvas); | 1951 canvas); |
1939 pdfContext->fVarStack.pop(); | 1952 pdfContext->fObjectStack.pop(); |
1940 | 1953 |
1941 return ret; | 1954 return ret; |
1942 } | 1955 } |
1943 | 1956 |
1944 PdfResult PdfOp_quote(PdfContext* pdfContext, SkCanvas* canvas, PdfTokenLooper**
looper) { | 1957 PdfResult PdfOp_quote(PdfContext* pdfContext, SkCanvas* canvas, PdfTokenLooper**
looper) { |
1945 if (!pdfContext->fGraphicsState.fTextBlock) { | 1958 if (!pdfContext->fGraphicsState.fTextBlock) { |
1946 // TODO(edisonn): try to recover and draw it any way? | 1959 // TODO(edisonn): try to recover and draw it any way? |
1947 return kIgnoreError_PdfResult; | 1960 return kIgnoreError_PdfResult; |
1948 } | 1961 } |
1949 | 1962 |
1950 PdfOp_T_star(pdfContext, canvas, looper); | 1963 PdfOp_T_star(pdfContext, canvas, looper); |
1951 // Do not pop, and push, just transfer the param to Tj | 1964 // Do not pop, and push, just transfer the param to Tj |
1952 return PdfOp_Tj(pdfContext, canvas, looper); | 1965 return PdfOp_Tj(pdfContext, canvas, looper); |
1953 } | 1966 } |
1954 | 1967 |
1955 PdfResult PdfOp_doublequote(PdfContext* pdfContext, SkCanvas* canvas, PdfTokenLo
oper** looper) { | 1968 PdfResult PdfOp_doublequote(PdfContext* pdfContext, SkCanvas* canvas, PdfTokenLo
oper** looper) { |
1956 if (!pdfContext->fGraphicsState.fTextBlock) { | 1969 if (!pdfContext->fGraphicsState.fTextBlock) { |
1957 // TODO(edisonn): try to recover and draw it any way? | 1970 // TODO(edisonn): try to recover and draw it any way? |
1958 return kIgnoreError_PdfResult; | 1971 return kIgnoreError_PdfResult; |
1959 } | 1972 } |
1960 | 1973 |
1961 PdfVariant str = pdfContext->fVarStack.top(); pdfContext->fVarStack.po
p(); | 1974 SkPdfObject* str = pdfContext->fObjectStack.top(); pdfContext->fObject
Stack.pop(); |
1962 PdfVariant ac = pdfContext->fVarStack.top(); pdfContext->fVarStack.po
p(); | 1975 SkPdfObject* ac = pdfContext->fObjectStack.top(); pdfContext->fObject
Stack.pop(); |
1963 PdfVariant aw = pdfContext->fVarStack.top(); pdfContext->fVarStack.po
p(); | 1976 SkPdfObject* aw = pdfContext->fObjectStack.top(); pdfContext->fObject
Stack.pop(); |
1964 | 1977 |
1965 pdfContext->fVarStack.push(aw); | 1978 pdfContext->fObjectStack.push(aw); |
1966 PdfOp_Tw(pdfContext, canvas, looper); | 1979 PdfOp_Tw(pdfContext, canvas, looper); |
1967 | 1980 |
1968 pdfContext->fVarStack.push(ac); | 1981 pdfContext->fObjectStack.push(ac); |
1969 PdfOp_Tc(pdfContext, canvas, looper); | 1982 PdfOp_Tc(pdfContext, canvas, looper); |
1970 | 1983 |
1971 pdfContext->fVarStack.push(str); | 1984 pdfContext->fObjectStack.push(str); |
1972 PdfOp_quote(pdfContext, canvas, looper); | 1985 PdfOp_quote(pdfContext, canvas, looper); |
1973 | 1986 |
1974 return kPartial_PdfResult; | 1987 return kPartial_PdfResult; |
1975 } | 1988 } |
1976 | 1989 |
1977 PdfResult PdfOp_TJ(PdfContext* pdfContext, SkCanvas* canvas, PdfTokenLooper** lo
oper) { | 1990 PdfResult PdfOp_TJ(PdfContext* pdfContext, SkCanvas* canvas, PdfTokenLooper** lo
oper) { |
1978 if (!pdfContext->fGraphicsState.fTextBlock) { | 1991 if (!pdfContext->fGraphicsState.fTextBlock) { |
1979 // TODO(edisonn): try to recover and draw it any way? | 1992 // TODO(edisonn): try to recover and draw it any way? |
1980 return kIgnoreError_PdfResult; | 1993 return kIgnoreError_PdfResult; |
1981 } | 1994 } |
1982 | 1995 |
1983 PdfArray array = pdfContext->fVarStack.top().GetArray(); | 1996 SkPdfArray* array = pdfContext->fObjectStack.top()->asArray(); |
1984 pdfContext->fVarStack.pop(); | 1997 pdfContext->fObjectStack.pop(); |
1985 | 1998 |
1986 for( int i=0; i<static_cast<int>(array.GetSize()); i++ ) | 1999 for( int i=0; i<static_cast<int>(array->size()); i++ ) |
1987 { | 2000 { |
1988 if( array[i].IsString() || array[i].IsHexString() ) { | 2001 if( (*array)[i].asString()) { |
1989 DrawText(pdfContext, | 2002 DrawText(pdfContext, |
1990 pdfContext->fGraphicsState.fCurFont, | 2003 pdfContext->fGraphicsState.fCurFont, |
1991 array[i].GetString(), | 2004 (*array)[i].podofo()->GetString(), |
1992 canvas); | 2005 canvas); |
1993 } else if (array[i].IsReal() || array[i].IsNumber()) { | 2006 } else if ((*array)[i].asInteger() || (*array)[i].asNumber()) { |
1994 double dx = array[i].GetReal(); | 2007 double dx = (*array)[i].asNumber()->value(); |
1995 SkMatrix matrix; | 2008 SkMatrix matrix; |
1996 matrix.setAll(SkDoubleToScalar(1), | 2009 matrix.setAll(SkDoubleToScalar(1), |
1997 SkDoubleToScalar(0), | 2010 SkDoubleToScalar(0), |
1998 // TODO(edisonn): use writing mode, vertical/horizonta
l. | 2011 // TODO(edisonn): use writing mode, vertical/horizonta
l. |
1999 SkDoubleToScalar(-dx), // amount is substracted!!! | 2012 SkDoubleToScalar(-dx), // amount is substracted!!! |
2000 SkDoubleToScalar(0), | 2013 SkDoubleToScalar(0), |
2001 SkDoubleToScalar(1), | 2014 SkDoubleToScalar(1), |
2002 SkDoubleToScalar(0), | 2015 SkDoubleToScalar(0), |
2003 SkDoubleToScalar(0), | 2016 SkDoubleToScalar(0), |
2004 SkDoubleToScalar(0), | 2017 SkDoubleToScalar(0), |
2005 SkDoubleToScalar(1)); | 2018 SkDoubleToScalar(1)); |
2006 | 2019 |
2007 pdfContext->fGraphicsState.fMatrixTm.preConcat(matrix); | 2020 pdfContext->fGraphicsState.fMatrixTm.preConcat(matrix); |
2008 } | 2021 } |
2009 } | 2022 } |
2010 return kPartial_PdfResult; // TODO(edisonn): Implement fully DrawText befor
e returing OK. | 2023 return kPartial_PdfResult; // TODO(edisonn): Implement fully DrawText befor
e returing OK. |
2011 } | 2024 } |
2012 | 2025 |
2013 PdfResult PdfOp_CS_cs(PdfContext* pdfContext, SkCanvas* canvas, PdfColorOperator
* colorOperator) { | 2026 PdfResult PdfOp_CS_cs(PdfContext* pdfContext, SkCanvas* canvas, PdfColorOperator
* colorOperator) { |
2014 colorOperator->fColorSpace = pdfContext->fVarStack.top().GetName().GetName()
; pdfContext->fVarStack.pop(); | 2027 colorOperator->fColorSpace = pdfContext->fObjectStack.top()->asName()->value
(); pdfContext->fObjectStack.pop(); |
2015 return kOK_PdfResult; | 2028 return kOK_PdfResult; |
2016 } | 2029 } |
2017 | 2030 |
2018 PdfResult PdfOp_CS(PdfContext* pdfContext, SkCanvas* canvas, PdfTokenLooper** lo
oper) { | 2031 PdfResult PdfOp_CS(PdfContext* pdfContext, SkCanvas* canvas, PdfTokenLooper** lo
oper) { |
2019 return PdfOp_CS_cs(pdfContext, canvas, &pdfContext->fGraphicsState.fStroking
); | 2032 return PdfOp_CS_cs(pdfContext, canvas, &pdfContext->fGraphicsState.fStroking
); |
2020 } | 2033 } |
2021 | 2034 |
2022 PdfResult PdfOp_cs(PdfContext* pdfContext, SkCanvas* canvas, PdfTokenLooper** lo
oper) { | 2035 PdfResult PdfOp_cs(PdfContext* pdfContext, SkCanvas* canvas, PdfTokenLooper** lo
oper) { |
2023 return PdfOp_CS_cs(pdfContext, canvas, &pdfContext->fGraphicsState.fNonStrok
ing); | 2036 return PdfOp_CS_cs(pdfContext, canvas, &pdfContext->fGraphicsState.fNonStrok
ing); |
2024 } | 2037 } |
2025 | 2038 |
2026 PdfResult PdfOp_SC_sc(PdfContext* pdfContext, SkCanvas* canvas, PdfColorOperator
* colorOperator) { | 2039 PdfResult PdfOp_SC_sc(PdfContext* pdfContext, SkCanvas* canvas, PdfColorOperator
* colorOperator) { |
2027 double c[4]; | 2040 double c[4]; |
2028 pdf_int64 v[4]; | 2041 pdf_int64 v[4]; |
2029 | 2042 |
2030 int n = GetColorSpaceComponents(colorOperator->fColorSpace); | 2043 int n = GetColorSpaceComponents(colorOperator->fColorSpace); |
2031 | 2044 |
2032 bool doubles = true; | 2045 bool doubles = true; |
2033 if (colorOperator->fColorSpace == "Indexed") { | 2046 if (colorOperator->fColorSpace == "Indexed") { |
2034 doubles = false; | 2047 doubles = false; |
2035 } | 2048 } |
2036 | 2049 |
2037 #ifdef PDF_TRACE | 2050 #ifdef PDF_TRACE |
2038 printf("color space = %s, N = %i\n", colorOperator->fColorSpace.c_str(), n); | 2051 printf("color space = %s, N = %i\n", colorOperator->fColorSpace.c_str(), n); |
2039 #endif | 2052 #endif |
2040 | 2053 |
2041 for (int i = n - 1; i >= 0 ; i--) { | 2054 for (int i = n - 1; i >= 0 ; i--) { |
2042 if (doubles) { | 2055 if (doubles) { |
2043 c[i] = pdfContext->fVarStack.top().GetReal(); pdfContext->fVarSt
ack.pop(); | 2056 c[i] = pdfContext->fObjectStack.top()->asNumber()->value(); pdfC
ontext->fObjectStack.pop(); |
2044 } else { | 2057 } else { |
2045 v[i] = pdfContext->fVarStack.top().GetNumber(); pdfContext->fVarSt
ack.pop(); | 2058 v[i] = pdfContext->fObjectStack.top()->asInteger()->value(); pdfCo
ntext->fObjectStack.pop(); |
2046 } | 2059 } |
2047 } | 2060 } |
2048 | 2061 |
2049 // TODO(edisonn): Now, set that color. Only DeviceRGB supported. | 2062 // TODO(edisonn): Now, set that color. Only DeviceRGB supported. |
2050 if (colorOperator->fColorSpace == "DeviceRGB") { | 2063 if (colorOperator->fColorSpace == "DeviceRGB") { |
2051 colorOperator->setRGBColor(SkColorSetRGB(255*c[0], 255*c[1], 255*c[2])); | 2064 colorOperator->setRGBColor(SkColorSetRGB(255*c[0], 255*c[1], 255*c[2])); |
2052 } | 2065 } |
2053 return kPartial_PdfResult; | 2066 return kPartial_PdfResult; |
2054 } | 2067 } |
2055 | 2068 |
2056 PdfResult PdfOp_SC(PdfContext* pdfContext, SkCanvas* canvas, PdfTokenLooper** lo
oper) { | 2069 PdfResult PdfOp_SC(PdfContext* pdfContext, SkCanvas* canvas, PdfTokenLooper** lo
oper) { |
2057 return PdfOp_SC_sc(pdfContext, canvas, &pdfContext->fGraphicsState.fStroking
); | 2070 return PdfOp_SC_sc(pdfContext, canvas, &pdfContext->fGraphicsState.fStroking
); |
2058 } | 2071 } |
2059 | 2072 |
2060 PdfResult PdfOp_sc(PdfContext* pdfContext, SkCanvas* canvas, PdfTokenLooper** lo
oper) { | 2073 PdfResult PdfOp_sc(PdfContext* pdfContext, SkCanvas* canvas, PdfTokenLooper** lo
oper) { |
2061 return PdfOp_SC_sc(pdfContext, canvas, &pdfContext->fGraphicsState.fNonStrok
ing); | 2074 return PdfOp_SC_sc(pdfContext, canvas, &pdfContext->fGraphicsState.fNonStrok
ing); |
2062 } | 2075 } |
2063 | 2076 |
2064 PdfResult PdfOp_SCN_scn(PdfContext* pdfContext, SkCanvas* canvas, PdfColorOperat
or* colorOperator) { | 2077 PdfResult PdfOp_SCN_scn(PdfContext* pdfContext, SkCanvas* canvas, PdfColorOperat
or* colorOperator) { |
2065 PdfString name; | 2078 PdfString name; |
2066 | 2079 |
2067 if (pdfContext->fVarStack.top().IsName()) { | 2080 if (pdfContext->fObjectStack.top()->asName()) { |
2068 pdfContext->fVarStack.pop(); | 2081 pdfContext->fObjectStack.pop(); |
2069 } | 2082 } |
2070 | 2083 |
2071 // TODO(edisonn): SCN supports more color spaces than SCN. Read and implemen
t spec. | 2084 // TODO(edisonn): SCN supports more color spaces than SCN. Read and implemen
t spec. |
2072 PdfOp_SC_sc(pdfContext, canvas, colorOperator); | 2085 PdfOp_SC_sc(pdfContext, canvas, colorOperator); |
2073 | 2086 |
2074 return kPartial_PdfResult; | 2087 return kPartial_PdfResult; |
2075 } | 2088 } |
2076 | 2089 |
2077 PdfResult PdfOp_SCN(PdfContext* pdfContext, SkCanvas* canvas, PdfTokenLooper** l
ooper) { | 2090 PdfResult PdfOp_SCN(PdfContext* pdfContext, SkCanvas* canvas, PdfTokenLooper** l
ooper) { |
2078 return PdfOp_SCN_scn(pdfContext, canvas, &pdfContext->fGraphicsState.fStroki
ng); | 2091 return PdfOp_SCN_scn(pdfContext, canvas, &pdfContext->fGraphicsState.fStroki
ng); |
2079 } | 2092 } |
2080 | 2093 |
2081 PdfResult PdfOp_scn(PdfContext* pdfContext, SkCanvas* canvas, PdfTokenLooper** l
ooper) { | 2094 PdfResult PdfOp_scn(PdfContext* pdfContext, SkCanvas* canvas, PdfTokenLooper** l
ooper) { |
2082 return PdfOp_SCN_scn(pdfContext, canvas, &pdfContext->fGraphicsState.fNonStr
oking); | 2095 return PdfOp_SCN_scn(pdfContext, canvas, &pdfContext->fGraphicsState.fNonStr
oking); |
2083 } | 2096 } |
2084 | 2097 |
2085 PdfResult PdfOp_G_g(PdfContext* pdfContext, SkCanvas* canvas, PdfColorOperator*
colorOperator) { | 2098 PdfResult PdfOp_G_g(PdfContext* pdfContext, SkCanvas* canvas, PdfColorOperator*
colorOperator) { |
2086 double gray = pdfContext->fVarStack.top().GetReal(); pdfContext->fVarSta
ck.pop(); | 2099 double gray = pdfContext->fObjectStack.top()->asNumber()->value(); pdfCo
ntext->fObjectStack.pop(); |
2087 return kNYI_PdfResult; | 2100 return kNYI_PdfResult; |
2088 } | 2101 } |
2089 | 2102 |
2090 PdfResult PdfOp_G(PdfContext* pdfContext, SkCanvas* canvas, PdfTokenLooper** loo
per) { | 2103 PdfResult PdfOp_G(PdfContext* pdfContext, SkCanvas* canvas, PdfTokenLooper** loo
per) { |
2091 return PdfOp_G_g(pdfContext, canvas, &pdfContext->fGraphicsState.fStroking); | 2104 return PdfOp_G_g(pdfContext, canvas, &pdfContext->fGraphicsState.fStroking); |
2092 } | 2105 } |
2093 | 2106 |
2094 PdfResult PdfOp_g(PdfContext* pdfContext, SkCanvas* canvas, PdfTokenLooper** loo
per) { | 2107 PdfResult PdfOp_g(PdfContext* pdfContext, SkCanvas* canvas, PdfTokenLooper** loo
per) { |
2095 return PdfOp_G_g(pdfContext, canvas, &pdfContext->fGraphicsState.fNonStrokin
g); | 2108 return PdfOp_G_g(pdfContext, canvas, &pdfContext->fGraphicsState.fNonStrokin
g); |
2096 } | 2109 } |
2097 | 2110 |
2098 PdfResult PdfOp_RG_rg(PdfContext* pdfContext, SkCanvas* canvas, PdfColorOperator
* colorOperator) { | 2111 PdfResult PdfOp_RG_rg(PdfContext* pdfContext, SkCanvas* canvas, PdfColorOperator
* colorOperator) { |
2099 double b = pdfContext->fVarStack.top().GetReal(); pdfContext->fVarStack.
pop(); | 2112 double b = pdfContext->fObjectStack.top()->asNumber()->value(); pdfConte
xt->fObjectStack.pop(); |
2100 double g = pdfContext->fVarStack.top().GetReal(); pdfContext->fVarStack.
pop(); | 2113 double g = pdfContext->fObjectStack.top()->asNumber()->value(); pdfConte
xt->fObjectStack.pop(); |
2101 double r = pdfContext->fVarStack.top().GetReal(); pdfContext->fVarStack.
pop(); | 2114 double r = pdfContext->fObjectStack.top()->asNumber()->value(); pdfConte
xt->fObjectStack.pop(); |
2102 | 2115 |
2103 colorOperator->fColorSpace = "DeviceRGB"; | 2116 colorOperator->fColorSpace = "DeviceRGB"; |
2104 colorOperator->setRGBColor(SkColorSetRGB(255*r, 255*g, 255*b)); | 2117 colorOperator->setRGBColor(SkColorSetRGB(255*r, 255*g, 255*b)); |
2105 return kOK_PdfResult; | 2118 return kOK_PdfResult; |
2106 } | 2119 } |
2107 | 2120 |
2108 PdfResult PdfOp_RG(PdfContext* pdfContext, SkCanvas* canvas, PdfTokenLooper** lo
oper) { | 2121 PdfResult PdfOp_RG(PdfContext* pdfContext, SkCanvas* canvas, PdfTokenLooper** lo
oper) { |
2109 return PdfOp_RG_rg(pdfContext, canvas, &pdfContext->fGraphicsState.fStroking
); | 2122 return PdfOp_RG_rg(pdfContext, canvas, &pdfContext->fGraphicsState.fStroking
); |
2110 } | 2123 } |
2111 | 2124 |
2112 PdfResult PdfOp_rg(PdfContext* pdfContext, SkCanvas* canvas, PdfTokenLooper** lo
oper) { | 2125 PdfResult PdfOp_rg(PdfContext* pdfContext, SkCanvas* canvas, PdfTokenLooper** lo
oper) { |
2113 return PdfOp_RG_rg(pdfContext, canvas, &pdfContext->fGraphicsState.fNonStrok
ing); | 2126 return PdfOp_RG_rg(pdfContext, canvas, &pdfContext->fGraphicsState.fNonStrok
ing); |
2114 } | 2127 } |
2115 | 2128 |
2116 PdfResult PdfOp_K_k(PdfContext* pdfContext, SkCanvas* canvas, PdfColorOperator*
colorOperator) { | 2129 PdfResult PdfOp_K_k(PdfContext* pdfContext, SkCanvas* canvas, PdfColorOperator*
colorOperator) { |
2117 // TODO(edisonn): spec has some rules about overprint, implement them. | 2130 // TODO(edisonn): spec has some rules about overprint, implement them. |
2118 double k = pdfContext->fVarStack.top().GetReal(); pdfContext->fVarStack.
pop(); | 2131 double k = pdfContext->fObjectStack.top()->asNumber()->value(); pdfConte
xt->fObjectStack.pop(); |
2119 double y = pdfContext->fVarStack.top().GetReal(); pdfContext->fVarStack.
pop(); | 2132 double y = pdfContext->fObjectStack.top()->asNumber()->value(); pdfConte
xt->fObjectStack.pop(); |
2120 double m = pdfContext->fVarStack.top().GetReal(); pdfContext->fVarStack.
pop(); | 2133 double m = pdfContext->fObjectStack.top()->asNumber()->value(); pdfConte
xt->fObjectStack.pop(); |
2121 double c = pdfContext->fVarStack.top().GetReal(); pdfContext->fVarStack.
pop(); | 2134 double c = pdfContext->fObjectStack.top()->asNumber()->value(); pdfConte
xt->fObjectStack.pop(); |
2122 | 2135 |
2123 colorOperator->fColorSpace = "DeviceCMYK"; | 2136 colorOperator->fColorSpace = "DeviceCMYK"; |
2124 // TODO(edisonn): Set color. | 2137 // TODO(edisonn): Set color. |
2125 return kNYI_PdfResult; | 2138 return kNYI_PdfResult; |
2126 } | 2139 } |
2127 | 2140 |
2128 PdfResult PdfOp_K(PdfContext* pdfContext, SkCanvas* canvas, PdfTokenLooper** loo
per) { | 2141 PdfResult PdfOp_K(PdfContext* pdfContext, SkCanvas* canvas, PdfTokenLooper** loo
per) { |
2129 return PdfOp_K_k(pdfContext, canvas, &pdfContext->fGraphicsState.fStroking); | 2142 return PdfOp_K_k(pdfContext, canvas, &pdfContext->fGraphicsState.fStroking); |
2130 } | 2143 } |
2131 | 2144 |
(...skipping 53 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2185 PdfResult PdfOp_EI(PdfContext* pdfContext, SkCanvas* canvas, PdfTokenLooper** lo
oper) { | 2198 PdfResult PdfOp_EI(PdfContext* pdfContext, SkCanvas* canvas, PdfTokenLooper** lo
oper) { |
2186 #ifdef ASSERT_BAD_PDF_OPS | 2199 #ifdef ASSERT_BAD_PDF_OPS |
2187 SkASSERT(false); // must be processed in inline image looper, but let's | 2200 SkASSERT(false); // must be processed in inline image looper, but let's |
2188 // have the assert when testing good pdfs. | 2201 // have the assert when testing good pdfs. |
2189 #endif | 2202 #endif |
2190 return kIgnoreError_PdfResult; | 2203 return kIgnoreError_PdfResult; |
2191 } | 2204 } |
2192 | 2205 |
2193 //lineWidth w Set the line width in the graphics state (see “Line Width” on page
152). | 2206 //lineWidth w Set the line width in the graphics state (see “Line Width” on page
152). |
2194 PdfResult PdfOp_w(PdfContext* pdfContext, SkCanvas* canvas, PdfTokenLooper** loo
per) { | 2207 PdfResult PdfOp_w(PdfContext* pdfContext, SkCanvas* canvas, PdfTokenLooper** loo
per) { |
2195 double lineWidth = pdfContext->fVarStack.top().GetReal(); pdfContext->fV
arStack.pop(); | 2208 double lineWidth = pdfContext->fObjectStack.top()->asNumber()->value();
pdfContext->fObjectStack.pop(); |
2196 pdfContext->fGraphicsState.fLineWidth = lineWidth; | 2209 pdfContext->fGraphicsState.fLineWidth = lineWidth; |
2197 | 2210 |
2198 return kOK_PdfResult; | 2211 return kOK_PdfResult; |
2199 } | 2212 } |
2200 | 2213 |
2201 //lineCap J Set the line cap style in the graphics state (see “Line Cap Style” o
n page 153). | 2214 //lineCap J Set the line cap style in the graphics state (see “Line Cap Style” o
n page 153). |
2202 PdfResult PdfOp_J(PdfContext* pdfContext, SkCanvas* canvas, PdfTokenLooper** loo
per) { | 2215 PdfResult PdfOp_J(PdfContext* pdfContext, SkCanvas* canvas, PdfTokenLooper** loo
per) { |
2203 pdfContext->fVarStack.pop(); | 2216 pdfContext->fObjectStack.pop(); |
2204 //double lineCap = pdfContext->fVarStack.top().GetReal(); pdfContext->fV
arStack.pop(); | 2217 //double lineCap = pdfContext->fObjectStack.top()->asNumber()->value();
pdfContext->fObjectStack.pop(); |
2205 | 2218 |
2206 return kNYI_PdfResult; | 2219 return kNYI_PdfResult; |
2207 } | 2220 } |
2208 | 2221 |
2209 //lineJoin j Set the line join style in the graphics state (see “Line Join Style
” on page 153). | 2222 //lineJoin j Set the line join style in the graphics state (see “Line Join Style
” on page 153). |
2210 PdfResult PdfOp_j(PdfContext* pdfContext, SkCanvas* canvas, PdfTokenLooper** loo
per) { | 2223 PdfResult PdfOp_j(PdfContext* pdfContext, SkCanvas* canvas, PdfTokenLooper** loo
per) { |
2211 pdfContext->fVarStack.pop(); | 2224 pdfContext->fObjectStack.pop(); |
2212 //double lineJoin = pdfContext->fVarStack.top().GetReal(); pdfContext->f
VarStack.pop(); | 2225 //double lineJoin = pdfContext->fObjectStack.top()->asNumber()->value();
pdfContext->fObjectStack.pop(); |
2213 | 2226 |
2214 return kNYI_PdfResult; | 2227 return kNYI_PdfResult; |
2215 } | 2228 } |
2216 | 2229 |
2217 //miterLimit M Set the miter limit in the graphics state (see “Miter Limit” on p
age 153). | 2230 //miterLimit M Set the miter limit in the graphics state (see “Miter Limit” on p
age 153). |
2218 PdfResult PdfOp_M(PdfContext* pdfContext, SkCanvas* canvas, PdfTokenLooper** loo
per) { | 2231 PdfResult PdfOp_M(PdfContext* pdfContext, SkCanvas* canvas, PdfTokenLooper** loo
per) { |
2219 pdfContext->fVarStack.pop(); | 2232 pdfContext->fObjectStack.pop(); |
2220 //double miterLimit = pdfContext->fVarStack.top().GetReal(); pdfContext-
>fVarStack.pop(); | 2233 //double miterLimit = pdfContext->fObjectStack.top()->asNumber()->value();
pdfContext->fObjectStack.pop(); |
2221 | 2234 |
2222 return kNYI_PdfResult; | 2235 return kNYI_PdfResult; |
2223 } | 2236 } |
2224 | 2237 |
2225 //dashArray dashPhase d Set the line dash pattern in the graphics state (see “Li
ne Dash Pattern” on | 2238 //dashArray dashPhase d Set the line dash pattern in the graphics state (see “Li
ne Dash Pattern” on |
2226 //page 155). | 2239 //page 155). |
2227 PdfResult PdfOp_d(PdfContext* pdfContext, SkCanvas* canvas, PdfTokenLooper** loo
per) { | 2240 PdfResult PdfOp_d(PdfContext* pdfContext, SkCanvas* canvas, PdfTokenLooper** loo
per) { |
2228 pdfContext->fVarStack.pop(); | 2241 pdfContext->fObjectStack.pop(); |
2229 pdfContext->fVarStack.pop(); | 2242 pdfContext->fObjectStack.pop(); |
2230 | 2243 |
2231 return kNYI_PdfResult; | 2244 return kNYI_PdfResult; |
2232 } | 2245 } |
2233 | 2246 |
2234 //intent ri (PDF 1.1) Set the color rendering intent in the graphics state (see
“Rendering Intents” on page 197). | 2247 //intent ri (PDF 1.1) Set the color rendering intent in the graphics state (see
“Rendering Intents” on page 197). |
2235 PdfResult PdfOp_ri(PdfContext* pdfContext, SkCanvas* canvas, PdfTokenLooper** lo
oper) { | 2248 PdfResult PdfOp_ri(PdfContext* pdfContext, SkCanvas* canvas, PdfTokenLooper** lo
oper) { |
2236 pdfContext->fVarStack.pop(); | 2249 pdfContext->fObjectStack.pop(); |
2237 | 2250 |
2238 return kNYI_PdfResult; | 2251 return kNYI_PdfResult; |
2239 } | 2252 } |
2240 | 2253 |
2241 //flatness i Set the flatness tolerance in the graphics state (see Section 6.5.1,
“Flatness | 2254 //flatness i Set the flatness tolerance in the graphics state (see Section 6.5.1,
“Flatness |
2242 //Tolerance”). flatness is a number in the range 0 to 100; a value of 0 speci- | 2255 //Tolerance”). flatness is a number in the range 0 to 100; a value of 0 speci- |
2243 //fies the output device’s default flatness tolerance. | 2256 //fies the output device’s default flatness tolerance. |
2244 PdfResult PdfOp_i(PdfContext* pdfContext, SkCanvas* canvas, PdfTokenLooper** loo
per) { | 2257 PdfResult PdfOp_i(PdfContext* pdfContext, SkCanvas* canvas, PdfTokenLooper** loo
per) { |
2245 pdfContext->fVarStack.pop(); | 2258 pdfContext->fObjectStack.pop(); |
2246 | 2259 |
2247 return kNYI_PdfResult; | 2260 return kNYI_PdfResult; |
2248 } | 2261 } |
2249 | 2262 |
2250 //dictName gs (PDF 1.2) Set the specified parameters in the graphics state. dictN
ame is | 2263 //dictName gs (PDF 1.2) Set the specified parameters in the graphics state. dictN
ame is |
2251 //the name of a graphics state parameter dictionary in the ExtGState subdictiona
ry of the current resource dictionary (see the next section). | 2264 //the name of a graphics state parameter dictionary in the ExtGState subdictiona
ry of the current resource dictionary (see the next section). |
2252 PdfResult PdfOp_gs(PdfContext* pdfContext, SkCanvas* canvas, PdfTokenLooper** lo
oper) { | 2265 PdfResult PdfOp_gs(PdfContext* pdfContext, SkCanvas* canvas, PdfTokenLooper** lo
oper) { |
2253 PdfName name = pdfContext->fVarStack.top().GetName(); pdfContext->fVarSta
ck.pop(); | 2266 std::string name = pdfContext->fObjectStack.top()->asName()->value(); pdf
Context->fObjectStack.pop(); |
2254 | 2267 |
2255 #ifdef PDF_TRACE | 2268 #ifdef PDF_TRACE |
2256 std::string str; | 2269 std::string str; |
2257 #endif | 2270 #endif |
2258 | 2271 |
2259 const PdfObject* resources = pdfContext->fGraphicsState.fResources.podofo(); | |
2260 | |
2261 if (resources == NULL) { | |
2262 #ifdef PDF_TRACE | |
2263 printf("WARNING: No Resources for a page with 'gs' operator!\n"); | |
2264 #endif | |
2265 return kIgnoreError_PdfResult; | |
2266 } | |
2267 | |
2268 #ifdef PDF_TRACE | |
2269 resources->ToString(str); | |
2270 printf("Print gs Page Resources: %s\n", str.c_str()); | |
2271 #endif | |
2272 | |
2273 if (!resources->IsDictionary()) { | |
2274 #ifdef PDF_TRACE | |
2275 printf("Resources is not a dictionary!\n"); | |
2276 #endif | |
2277 return kIgnoreError_PdfResult; | |
2278 } | |
2279 | |
2280 const PdfDictionary& resourceDict = resources->GetDictionary(); | |
2281 //Next, get the ExtGState Dictionary from the Resource Dictionary: | 2272 //Next, get the ExtGState Dictionary from the Resource Dictionary: |
2282 const PdfObject* extGStateDictionary = resolveReferenceObject(pdfContext->fP
dfDoc, | 2273 const SkPdfDictionary* extGStateDictionary = pdfContext->fGraphicsState.fRes
ources->ExtGState(); |
2283 resourceDict.Get
Key("ExtGState")); | |
2284 | 2274 |
2285 if (extGStateDictionary == NULL) { | 2275 if (extGStateDictionary == NULL) { |
2286 #ifdef PDF_TRACE | 2276 #ifdef PDF_TRACE |
2287 printf("ExtGState is NULL!\n"); | 2277 printf("ExtGState is NULL!\n"); |
2288 #endif | 2278 #endif |
2289 return kIgnoreError_PdfResult; | 2279 return kIgnoreError_PdfResult; |
2290 } | 2280 } |
2291 | 2281 |
2292 if (!extGStateDictionary->IsDictionary()) { | 2282 SkPdfObject value = extGStateDictionary->get(name.c_str()); |
2293 #ifdef PDF_TRACE | |
2294 printf("extGStateDictionary is not a dictionary!\n"); | |
2295 #endif | |
2296 return kIgnoreError_PdfResult; | |
2297 } | |
2298 | |
2299 const PdfObject* value = | |
2300 resolveReferenceObject(pdfContext->fPdfDoc, | |
2301 extGStateDictionary->GetDictionary().GetKey(n
ame)); | |
2302 | |
2303 if (value == NULL) { | |
2304 #ifdef PDF_TRACE | |
2305 printf("Named object not found!\n"); | |
2306 #endif | |
2307 return kIgnoreError_PdfResult; | |
2308 } | |
2309 | 2283 |
2310 #ifdef PDF_TRACE | 2284 #ifdef PDF_TRACE |
2311 value->ToString(str); | 2285 // value->ToString(str); |
2312 printf("gs object value: %s\n", str.c_str()); | 2286 // printf("gs object value: %s\n", str.c_str()); |
2313 #endif | 2287 #endif |
2314 | 2288 |
2315 SkPdfGraphicsStateDictionary gs(pdfContext->fPdfDoc, value); | 2289 SkPdfGraphicsStateDictionary* gs = NULL; |
| 2290 PodofoMapper::map(value, &gs); |
2316 | 2291 |
2317 // TODO(edisonn): now load all those properties in graphic state. | 2292 // TODO(edisonn): now load all those properties in graphic state. |
2318 | 2293 |
2319 return kNYI_PdfResult; | 2294 return kNYI_PdfResult; |
2320 } | 2295 } |
2321 | 2296 |
2322 //charSpace Tc Set the character spacing, Tc | 2297 //charSpace Tc Set the character spacing, Tc |
2323 //, to charSpace, which is a number expressed in unscaled text space units. Char
acter spacing is used by the Tj, TJ, and ' operators. | 2298 //, to charSpace, which is a number expressed in unscaled text space units. Char
acter spacing is used by the Tj, TJ, and ' operators. |
2324 //Initial value: 0. | 2299 //Initial value: 0. |
2325 PdfResult PdfOp_Tc(PdfContext* pdfContext, SkCanvas* canvas, PdfTokenLooper** lo
oper) { | 2300 PdfResult PdfOp_Tc(PdfContext* pdfContext, SkCanvas* canvas, PdfTokenLooper** lo
oper) { |
2326 double charSpace = pdfContext->fVarStack.top().GetReal(); pdfContext->fV
arStack.pop(); | 2301 double charSpace = pdfContext->fObjectStack.top()->asNumber()->value();
pdfContext->fObjectStack.pop(); |
2327 pdfContext->fGraphicsState.fCharSpace = charSpace; | 2302 pdfContext->fGraphicsState.fCharSpace = charSpace; |
2328 | 2303 |
2329 return kOK_PdfResult; | 2304 return kOK_PdfResult; |
2330 } | 2305 } |
2331 | 2306 |
2332 //wordSpace Tw Set the word spacing, T | 2307 //wordSpace Tw Set the word spacing, T |
2333 //w | 2308 //w |
2334 //, to wordSpace, which is a number expressed in unscaled | 2309 //, to wordSpace, which is a number expressed in unscaled |
2335 //text space units. Word spacing is used by the Tj, TJ, and ' operators. Initial | 2310 //text space units. Word spacing is used by the Tj, TJ, and ' operators. Initial |
2336 //value: 0. | 2311 //value: 0. |
2337 PdfResult PdfOp_Tw(PdfContext* pdfContext, SkCanvas* canvas, PdfTokenLooper** lo
oper) { | 2312 PdfResult PdfOp_Tw(PdfContext* pdfContext, SkCanvas* canvas, PdfTokenLooper** lo
oper) { |
2338 double wordSpace = pdfContext->fVarStack.top().GetReal(); pdfContext->fV
arStack.pop(); | 2313 double wordSpace = pdfContext->fObjectStack.top()->asNumber()->value();
pdfContext->fObjectStack.pop(); |
2339 pdfContext->fGraphicsState.fWordSpace = wordSpace; | 2314 pdfContext->fGraphicsState.fWordSpace = wordSpace; |
2340 | 2315 |
2341 return kOK_PdfResult; | 2316 return kOK_PdfResult; |
2342 } | 2317 } |
2343 | 2318 |
2344 //scale Tz Set the horizontal scaling, Th | 2319 //scale Tz Set the horizontal scaling, Th |
2345 //, to (scale ˜ 100). scale is a number specifying the | 2320 //, to (scale ˜ 100). scale is a number specifying the |
2346 //percentage of the normal width. Initial value: 100 (normal width). | 2321 //percentage of the normal width. Initial value: 100 (normal width). |
2347 PdfResult PdfOp_Tz(PdfContext* pdfContext, SkCanvas* canvas, PdfTokenLooper** lo
oper) { | 2322 PdfResult PdfOp_Tz(PdfContext* pdfContext, SkCanvas* canvas, PdfTokenLooper** lo
oper) { |
2348 double scale = pdfContext->fVarStack.top().GetReal(); pdfContext->fVarSt
ack.pop(); | 2323 double scale = pdfContext->fObjectStack.top()->asNumber()->value(); pdfC
ontext->fObjectStack.pop(); |
2349 | 2324 |
2350 return kNYI_PdfResult; | 2325 return kNYI_PdfResult; |
2351 } | 2326 } |
2352 | 2327 |
2353 //render Tr Set the text rendering mode, T | 2328 //render Tr Set the text rendering mode, T |
2354 //mode, to render, which is an integer. Initial value: 0. | 2329 //mode, to render, which is an integer. Initial value: 0. |
2355 PdfResult PdfOp_Tr(PdfContext* pdfContext, SkCanvas* canvas, PdfTokenLooper** lo
oper) { | 2330 PdfResult PdfOp_Tr(PdfContext* pdfContext, SkCanvas* canvas, PdfTokenLooper** lo
oper) { |
2356 double render = pdfContext->fVarStack.top().GetReal(); pdfContext->fVarS
tack.pop(); | 2331 double render = pdfContext->fObjectStack.top()->asNumber()->value(); pdf
Context->fObjectStack.pop(); |
2357 | 2332 |
2358 return kNYI_PdfResult; | 2333 return kNYI_PdfResult; |
2359 } | 2334 } |
2360 | 2335 |
2361 //rise Ts Set the text rise, Trise, to rise, which is a number expressed in unsc
aled text space | 2336 //rise Ts Set the text rise, Trise, to rise, which is a number expressed in unsc
aled text space |
2362 //units. Initial value: 0. | 2337 //units. Initial value: 0. |
2363 PdfResult PdfOp_Ts(PdfContext* pdfContext, SkCanvas* canvas, PdfTokenLooper** lo
oper) { | 2338 PdfResult PdfOp_Ts(PdfContext* pdfContext, SkCanvas* canvas, PdfTokenLooper** lo
oper) { |
2364 double rise = pdfContext->fVarStack.top().GetReal(); pdfContext->fVarSta
ck.pop(); | 2339 double rise = pdfContext->fObjectStack.top()->asNumber()->value(); pdfCo
ntext->fObjectStack.pop(); |
2365 | 2340 |
2366 return kNYI_PdfResult; | 2341 return kNYI_PdfResult; |
2367 } | 2342 } |
2368 | 2343 |
2369 //wx wy d0 | 2344 //wx wy d0 |
2370 PdfResult PdfOp_d0(PdfContext* pdfContext, SkCanvas* canvas, PdfTokenLooper** lo
oper) { | 2345 PdfResult PdfOp_d0(PdfContext* pdfContext, SkCanvas* canvas, PdfTokenLooper** lo
oper) { |
2371 pdfContext->fVarStack.pop(); | 2346 pdfContext->fObjectStack.pop(); |
2372 pdfContext->fVarStack.pop(); | 2347 pdfContext->fObjectStack.pop(); |
2373 | 2348 |
2374 return kNYI_PdfResult; | 2349 return kNYI_PdfResult; |
2375 } | 2350 } |
2376 | 2351 |
2377 //wx wy llx lly urx ury d1 | 2352 //wx wy llx lly urx ury d1 |
2378 PdfResult PdfOp_d1(PdfContext* pdfContext, SkCanvas* canvas, PdfTokenLooper** lo
oper) { | 2353 PdfResult PdfOp_d1(PdfContext* pdfContext, SkCanvas* canvas, PdfTokenLooper** lo
oper) { |
2379 pdfContext->fVarStack.pop(); | 2354 pdfContext->fObjectStack.pop(); |
2380 pdfContext->fVarStack.pop(); | 2355 pdfContext->fObjectStack.pop(); |
2381 pdfContext->fVarStack.pop(); | 2356 pdfContext->fObjectStack.pop(); |
2382 pdfContext->fVarStack.pop(); | 2357 pdfContext->fObjectStack.pop(); |
2383 pdfContext->fVarStack.pop(); | 2358 pdfContext->fObjectStack.pop(); |
2384 pdfContext->fVarStack.pop(); | 2359 pdfContext->fObjectStack.pop(); |
2385 | 2360 |
2386 return kNYI_PdfResult; | 2361 return kNYI_PdfResult; |
2387 } | 2362 } |
2388 | 2363 |
2389 //name sh | 2364 //name sh |
2390 PdfResult PdfOp_sh(PdfContext* pdfContext, SkCanvas* canvas, PdfTokenLooper** lo
oper) { | 2365 PdfResult PdfOp_sh(PdfContext* pdfContext, SkCanvas* canvas, PdfTokenLooper** lo
oper) { |
2391 pdfContext->fVarStack.pop(); | 2366 pdfContext->fObjectStack.pop(); |
2392 | 2367 |
2393 return kNYI_PdfResult; | 2368 return kNYI_PdfResult; |
2394 } | 2369 } |
2395 | 2370 |
2396 //name Do | 2371 //name Do |
2397 PdfResult PdfOp_Do(PdfContext* pdfContext, SkCanvas* canvas, PdfTokenLooper** lo
oper) { | 2372 PdfResult PdfOp_Do(PdfContext* pdfContext, SkCanvas* canvas, PdfTokenLooper** lo
oper) { |
2398 PdfName name = pdfContext->fVarStack.top().GetName(); pdfContext->fVarSta
ck.pop(); | 2373 std::string name = pdfContext->fObjectStack.top()->asName()->value(); pdf
Context->fObjectStack.pop(); |
2399 | 2374 |
2400 const PdfObject* resources = pdfContext->fGraphicsState.fResources.podofo(); | 2375 SkPdfDictionary* xObject = pdfContext->fGraphicsState.fResources->XObject()
; |
2401 | 2376 |
2402 if (resources == NULL) { | 2377 if (xObject == NULL) { |
2403 #ifdef PDF_TRACE | |
2404 printf("WARNING: No Resources for a page with 'Do' operator!s\n"); | |
2405 #endif | |
2406 return kIgnoreError_PdfResult; | |
2407 } | |
2408 | |
2409 #ifdef PDF_TRACE | |
2410 std::string str; | |
2411 resources->ToString(str); | |
2412 printf("Print Do Page Resources: %s\n", str.c_str()); | |
2413 #endif | |
2414 | |
2415 if (!resources->IsDictionary()) { | |
2416 #ifdef PDF_TRACE | |
2417 printf("Resources is not a dictionary!\n"); | |
2418 #endif | |
2419 return kIgnoreError_PdfResult; | |
2420 } | |
2421 | |
2422 const PdfDictionary& resourceDict = resources->GetDictionary(); | |
2423 //Next, get the XObject Dictionary from the Resource Dictionary: | |
2424 const PdfObject* xObjectDictionary = resolveReferenceObject(pdfContext->fPdf
Doc, | |
2425 resourceDict.Get
Key("XObject")); | |
2426 | |
2427 if (xObjectDictionary == NULL) { | |
2428 #ifdef PDF_TRACE | 2378 #ifdef PDF_TRACE |
2429 printf("XObject is NULL!\n"); | 2379 printf("XObject is NULL!\n"); |
2430 #endif | 2380 #endif |
2431 return kIgnoreError_PdfResult; | 2381 return kIgnoreError_PdfResult; |
2432 } | 2382 } |
2433 | 2383 |
2434 if (!xObjectDictionary->IsDictionary()) { | 2384 SkPdfObject value = xObject->get(name.c_str()); |
2435 #ifdef PDF_TRACE | |
2436 printf("xObjectDictionary is not a dictionary!\n"); | |
2437 #endif | |
2438 return kIgnoreError_PdfResult; | |
2439 } | |
2440 | |
2441 const PdfObject* value = | |
2442 resolveReferenceObject(pdfContext->fPdfDoc, | |
2443 xObjectDictionary->GetDictionary().GetKey(nam
e)); | |
2444 | |
2445 if (value == NULL) { | |
2446 #ifdef PDF_TRACE | |
2447 printf("Named object not found!\n"); | |
2448 #endif | |
2449 return kIgnoreError_PdfResult; | |
2450 } | |
2451 | 2385 |
2452 #ifdef PDF_TRACE | 2386 #ifdef PDF_TRACE |
2453 value->ToString(str); | 2387 // value->ToString(str); |
2454 printf("Do object value: %s\n", str.c_str()); | 2388 // printf("Do object value: %s\n", str.c_str()); |
2455 #endif | 2389 #endif |
2456 | 2390 |
2457 return doXObject(pdfContext, canvas, *value); | 2391 return doXObject(pdfContext, canvas, value); |
2458 } | 2392 } |
2459 | 2393 |
2460 | |
2461 //tag MP Designate a marked-content point. tag is a name object indicating the r
ole or | 2394 //tag MP Designate a marked-content point. tag is a name object indicating the r
ole or |
2462 //significance of the point. | 2395 //significance of the point. |
2463 PdfResult PdfOp_MP(PdfContext* pdfContext, SkCanvas* canvas, PdfTokenLooper** lo
oper) { | 2396 PdfResult PdfOp_MP(PdfContext* pdfContext, SkCanvas* canvas, PdfTokenLooper** lo
oper) { |
2464 pdfContext->fVarStack.pop(); | 2397 pdfContext->fObjectStack.pop(); |
2465 | 2398 |
2466 return kNYI_PdfResult; | 2399 return kNYI_PdfResult; |
2467 } | 2400 } |
2468 | 2401 |
2469 //tag properties DP Designate a marked-content point with an associated property
list. tag is a | 2402 //tag properties DP Designate a marked-content point with an associated property
list. tag is a |
2470 //name object indicating the role or significance of the point; properties is | 2403 //name object indicating the role or significance of the point; properties is |
2471 //either an inline dictionary containing the property list or a name object | 2404 //either an inline dictionary containing the property list or a name object |
2472 //associated with it in the Properties subdictionary of the current resource | 2405 //associated with it in the Properties subdictionary of the current resource |
2473 //dictionary (see Section 9.5.1, “Property Lists”). | 2406 //dictionary (see Section 9.5.1, “Property Lists”). |
2474 PdfResult PdfOp_DP(PdfContext* pdfContext, SkCanvas* canvas, PdfTokenLooper** lo
oper) { | 2407 PdfResult PdfOp_DP(PdfContext* pdfContext, SkCanvas* canvas, PdfTokenLooper** lo
oper) { |
2475 pdfContext->fVarStack.pop(); | 2408 pdfContext->fObjectStack.pop(); |
2476 pdfContext->fVarStack.pop(); | 2409 pdfContext->fObjectStack.pop(); |
2477 | 2410 |
2478 return kNYI_PdfResult; | 2411 return kNYI_PdfResult; |
2479 } | 2412 } |
2480 | 2413 |
2481 //tag BMC Begin a marked-content sequence terminated by a balancing EMC operator
. | 2414 //tag BMC Begin a marked-content sequence terminated by a balancing EMC operator
. |
2482 //tag is a name object indicating the role or significance of the sequence. | 2415 //tag is a name object indicating the role or significance of the sequence. |
2483 PdfResult PdfOp_BMC(PdfContext* pdfContext, SkCanvas* canvas, PdfTokenLooper** l
ooper) { | 2416 PdfResult PdfOp_BMC(PdfContext* pdfContext, SkCanvas* canvas, PdfTokenLooper** l
ooper) { |
2484 pdfContext->fVarStack.pop(); | 2417 pdfContext->fObjectStack.pop(); |
2485 | 2418 |
2486 return kNYI_PdfResult; | 2419 return kNYI_PdfResult; |
2487 } | 2420 } |
2488 | 2421 |
2489 //tag properties BDC Begin a marked-content sequence with an associated property
list, terminated | 2422 //tag properties BDC Begin a marked-content sequence with an associated property
list, terminated |
2490 //by a balancing EMCoperator. tag is a name object indicating the role or signif
icance of the sequence; propertiesis either an inline dictionary containing the | 2423 //by a balancing EMCoperator. tag is a name object indicating the role or signif
icance of the sequence; propertiesis either an inline dictionary containing the |
2491 //property list or a name object associated with it in the Properties subdiction
ary of the current resource dictionary (see Section 9.5.1, “Property Lists”). | 2424 //property list or a name object associated with it in the Properties subdiction
ary of the current resource dictionary (see Section 9.5.1, “Property Lists”). |
2492 PdfResult PdfOp_BDC(PdfContext* pdfContext, SkCanvas* canvas, PdfTokenLooper** l
ooper) { | 2425 PdfResult PdfOp_BDC(PdfContext* pdfContext, SkCanvas* canvas, PdfTokenLooper** l
ooper) { |
2493 pdfContext->fVarStack.pop(); | 2426 pdfContext->fObjectStack.pop(); |
2494 pdfContext->fVarStack.pop(); | 2427 pdfContext->fObjectStack.pop(); |
2495 | 2428 |
2496 return kNYI_PdfResult; | 2429 return kNYI_PdfResult; |
2497 } | 2430 } |
2498 | 2431 |
2499 //— EMC End a marked-content sequence begun by a BMC or BDC operator. | 2432 //— EMC End a marked-content sequence begun by a BMC or BDC operator. |
2500 PdfResult PdfOp_EMC(PdfContext* pdfContext, SkCanvas* canvas, PdfTokenLooper** l
ooper) { | 2433 PdfResult PdfOp_EMC(PdfContext* pdfContext, SkCanvas* canvas, PdfTokenLooper** l
ooper) { |
2501 return kNYI_PdfResult; | 2434 return kNYI_PdfResult; |
2502 } | 2435 } |
2503 | 2436 |
2504 void initPdfOperatorRenderes() { | 2437 void initPdfOperatorRenderes() { |
(...skipping 98 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2603 std::map<std::string, int>::iterator iter; | 2536 std::map<std::string, int>::iterator iter; |
2604 | 2537 |
2605 for (int i = 0 ; i < kCount_PdfResult; i++) { | 2538 for (int i = 0 ; i < kCount_PdfResult; i++) { |
2606 for (iter = gRenderStats[i].begin(); iter != gRenderStats[i].end(); ++it
er) { | 2539 for (iter = gRenderStats[i].begin(); iter != gRenderStats[i].end(); ++it
er) { |
2607 printf("%s: %s -> count %i\n", gRenderStatsNames[i], iter->first.c_s
tr(), iter->second); | 2540 printf("%s: %s -> count %i\n", gRenderStatsNames[i], iter->first.c_s
tr(), iter->second); |
2608 } | 2541 } |
2609 } | 2542 } |
2610 } | 2543 } |
2611 | 2544 |
2612 PdfResult PdfMainLooper::consumeToken(PdfToken& token) { | 2545 PdfResult PdfMainLooper::consumeToken(PdfToken& token) { |
2613 if( token.eType == ePdfContentsType_Keyword ) | 2546 if (token.fType == kKeyword_TokenType) |
2614 { | 2547 { |
2615 // TODO(edisonn): log trace flag (verbose, error, info, warning, ...) | 2548 // TODO(edisonn): log trace flag (verbose, error, info, warning, ...) |
2616 #ifdef PDF_TRACE | 2549 #ifdef PDF_TRACE |
2617 printf("KEYWORD: %s\n", token.pszToken); | 2550 printf("KEYWORD: %s\n", token.fKeyword); |
2618 #endif | 2551 #endif |
2619 PdfOperatorRenderer pdfOperatorRenderer = gPdfOps[token.pszToken]; | 2552 PdfOperatorRenderer pdfOperatorRenderer = gPdfOps[token.fKeyword]; |
2620 if (pdfOperatorRenderer) { | 2553 if (pdfOperatorRenderer) { |
2621 // caller, main work is done by pdfOperatorRenderer(...) | 2554 // caller, main work is done by pdfOperatorRenderer(...) |
2622 PdfTokenLooper* childLooper = NULL; | 2555 PdfTokenLooper* childLooper = NULL; |
2623 gRenderStats[pdfOperatorRenderer(fPdfContext, fCanvas, &childLooper)
][token.pszToken]++; | 2556 gRenderStats[pdfOperatorRenderer(fPdfContext, fCanvas, &childLooper)
][token.fKeyword]++; |
2624 | 2557 |
2625 if (childLooper) { | 2558 if (childLooper) { |
2626 childLooper->setUp(this); | 2559 childLooper->setUp(this); |
2627 childLooper->loop(); | 2560 childLooper->loop(); |
2628 delete childLooper; | 2561 delete childLooper; |
2629 } | 2562 } |
2630 } else { | 2563 } else { |
2631 gRenderStats[kUnsupported_PdfResult][token.pszToken]++; | 2564 gRenderStats[kUnsupported_PdfResult][token.fKeyword]++; |
2632 } | 2565 } |
2633 } | 2566 } |
2634 else if ( token.eType == ePdfContentsType_Variant ) | 2567 else if (token.fType == kObject_TokenType) |
2635 { | 2568 { |
2636 #ifdef PDF_TRACE | 2569 #ifdef PDF_TRACE |
2637 std::string _var; | 2570 std::string _var; |
2638 token.var.ToString(_var); | 2571 token.fObject->podofo()->ToString(_var); |
2639 printf("var: %s\n", _var.c_str()); | 2572 printf("var: %s\n", _var.c_str()); |
2640 #endif | 2573 #endif |
2641 fPdfContext->fVarStack.push( token.var ); | 2574 fPdfContext->fObjectStack.push( token.fObject ); |
2642 } | 2575 } |
2643 else if ( token.eType == ePdfContentsType_ImageData) { | 2576 else if ( token.fType == kImageData_TokenType) { |
2644 // TODO(edisonn): implement inline image. | 2577 // TODO(edisonn): implement inline image. |
2645 } | 2578 } |
2646 else { | 2579 else { |
2647 return kIgnoreError_PdfResult; | 2580 return kIgnoreError_PdfResult; |
2648 } | 2581 } |
2649 return kOK_PdfResult; | 2582 return kOK_PdfResult; |
2650 } | 2583 } |
2651 | 2584 |
2652 void PdfMainLooper::loop() { | 2585 void PdfMainLooper::loop() { |
2653 PdfToken token; | 2586 PdfToken token; |
2654 while (readToken(fTokenizer, &token)) { | 2587 while (readToken(fTokenizer, &token)) { |
2655 consumeToken(token); | 2588 consumeToken(token); |
2656 } | 2589 } |
2657 } | 2590 } |
2658 | 2591 |
2659 PdfResult PdfInlineImageLooper::consumeToken(PdfToken& token) { | 2592 PdfResult PdfInlineImageLooper::consumeToken(PdfToken& token) { |
2660 //pdfContext.fInlineImage.fKeyValuePairs[key] = value; | 2593 //pdfContext.fInlineImage.fKeyValuePairs[key] = value; |
2661 return kNYI_PdfResult; | 2594 return kNYI_PdfResult; |
2662 } | 2595 } |
2663 | 2596 |
2664 void PdfInlineImageLooper::loop() { | 2597 void PdfInlineImageLooper::loop() { |
2665 PdfToken token; | 2598 PdfToken token; |
2666 while (readToken(fTokenizer, &token)) { | 2599 while (readToken(fTokenizer, &token)) { |
2667 if (token.eType == ePdfContentsType_Keyword && strcmp(token.pszToken, "B
X") == 0) { | 2600 if (token.fType == kKeyword_TokenType && strcmp(token.fKeyword, "BX") ==
0) { |
2668 PdfTokenLooper* looper = new PdfCompatibilitySectionLooper(); | 2601 PdfTokenLooper* looper = new PdfCompatibilitySectionLooper(); |
2669 looper->setUp(this); | 2602 looper->setUp(this); |
2670 looper->loop(); | 2603 looper->loop(); |
2671 } else { | 2604 } else { |
2672 if (token.eType == ePdfContentsType_Keyword && strcmp(token.pszToken
, "EI") == 0) { | 2605 if (token.fType == kKeyword_TokenType && strcmp(token.fKeyword, "EI"
) == 0) { |
2673 done(); | 2606 done(); |
2674 return; | 2607 return; |
2675 } | 2608 } |
2676 | 2609 |
2677 consumeToken(token); | 2610 consumeToken(token); |
2678 } | 2611 } |
2679 } | 2612 } |
2680 // TODO(edisonn): report error/warning, EOF without EI. | 2613 // TODO(edisonn): report error/warning, EOF without EI. |
2681 } | 2614 } |
2682 | 2615 |
(...skipping 20 matching lines...) Expand all Loading... |
2703 return fParent->consumeToken(token); | 2636 return fParent->consumeToken(token); |
2704 } | 2637 } |
2705 | 2638 |
2706 void PdfCompatibilitySectionLooper::loop() { | 2639 void PdfCompatibilitySectionLooper::loop() { |
2707 // TODO(edisonn): save stacks position, or create a new stack? | 2640 // TODO(edisonn): save stacks position, or create a new stack? |
2708 // TODO(edisonn): what happens if we pop out more variables then when we sta
rted? | 2641 // TODO(edisonn): what happens if we pop out more variables then when we sta
rted? |
2709 // restore them? fail? We could create a new operands stack for every new BX
/EX section, | 2642 // restore them? fail? We could create a new operands stack for every new BX
/EX section, |
2710 // pop-ing too much will not affect outside the section. | 2643 // pop-ing too much will not affect outside the section. |
2711 PdfToken token; | 2644 PdfToken token; |
2712 while (readToken(fTokenizer, &token)) { | 2645 while (readToken(fTokenizer, &token)) { |
2713 if (token.eType == ePdfContentsType_Keyword && strcmp(token.pszToken, "B
X") == 0) { | 2646 if (token.fType == kKeyword_TokenType && strcmp(token.fKeyword, "BX") ==
0) { |
2714 PdfTokenLooper* looper = new PdfCompatibilitySectionLooper(); | 2647 PdfTokenLooper* looper = new PdfCompatibilitySectionLooper(); |
2715 looper->setUp(this); | 2648 looper->setUp(this); |
2716 looper->loop(); | 2649 looper->loop(); |
2717 delete looper; | 2650 delete looper; |
2718 } else { | 2651 } else { |
2719 if (token.eType == ePdfContentsType_Keyword && strcmp(token.pszToken
, "EX") == 0) break; | 2652 if (token.fType == kKeyword_TokenType && strcmp(token.fKeyword, "EX"
) == 0) break; |
2720 fParent->consumeToken(token); | 2653 fParent->consumeToken(token); |
2721 } | 2654 } |
2722 } | 2655 } |
2723 // TODO(edisonn): restore stack. | 2656 // TODO(edisonn): restore stack. |
2724 } | 2657 } |
2725 | 2658 |
2726 // TODO(edisonn): fix PoDoFo load ~/crashing/Shading.pdf | 2659 // TODO(edisonn): fix PoDoFo load ~/crashing/Shading.pdf |
2727 // TODO(edisonn): Add API for Forms viewing and editing | 2660 // TODO(edisonn): Add API for Forms viewing and editing |
2728 // e.g. SkBitmap getPage(int page); | 2661 // e.g. SkBitmap getPage(int page); |
2729 // int formsCount(); | 2662 // int formsCount(); |
2730 // SkForm getForm(int formID); // SkForm(SkRect, .. other data) | 2663 // SkForm getForm(int formID); // SkForm(SkRect, .. other data) |
2731 // TODO (edisonn): Add intend when loading pdf, for example: for viewing, parsin
g all content, ... | 2664 // TODO (edisonn): Add intend when loading pdf, for example: for viewing, parsin
g all content, ... |
2732 // if we load the first page, and we zoom to fit to screen horizontally, then lo
ad only those | 2665 // if we load the first page, and we zoom to fit to screen horizontally, then lo
ad only those |
2733 // resources needed, so the preview is fast. | 2666 // resources needed, so the preview is fast. |
2734 // TODO (edisonn): hide parser/tokenizer behind and interface and a query langua
ge, and resolve | 2667 // TODO (edisonn): hide parser/tokenizer behind and interface and a query langua
ge, and resolve |
2735 // references automatically. | 2668 // references automatically. |
2736 class SkPdfViewer : public SkRefCnt { | 2669 class SkPdfViewer : public SkRefCnt { |
2737 public: | 2670 public: |
2738 | 2671 |
2739 bool load(const SkString inputFileName, SkPicture* out) { | 2672 bool load(const SkString inputFileName, SkPicture* out) { |
2740 | 2673 |
2741 initPdfOperatorRenderes(); | 2674 initPdfOperatorRenderes(); |
2742 | 2675 |
2743 try | 2676 try |
2744 { | 2677 { |
2745 std::cout << "Init: " << inputFileName.c_str() << std::endl; | 2678 std::cout << "Init: " << inputFileName.c_str() << std::endl; |
2746 | 2679 |
2747 PdfMemDocument doc(inputFileName.c_str()); | 2680 SkPdfDoc doc(inputFileName.c_str()); |
2748 if( !doc.GetPageCount() ) | 2681 if( !doc.pages() ) |
2749 { | 2682 { |
2750 std::cout << "ERROR: Empty Document" << inputFileName.c_str() << std
::endl; | 2683 std::cout << "ERROR: Empty Document" << inputFileName.c_str() << std
::endl; |
2751 return false; | 2684 return false; |
2752 } else { | 2685 } else { |
2753 | 2686 |
2754 for (int pn = 0; pn < doc.GetPageCount(); ++pn) { | 2687 for (int pn = 0; pn < doc.pages(); ++pn) { |
2755 PoDoFo::PdfPage* page = doc.GetPage(pn); | 2688 SkPdfPageObjectDictionary* page = doc.page(pn); |
2756 PdfRect rect = page->GetMediaBox(); | 2689 |
| 2690 // TODO(edisonn): implement inheritance properties as per PDF sp
ec |
| 2691 //SkRect rect = page->MediaBox(); |
| 2692 SkRect rect = doc.MediaBox(pn); |
| 2693 |
2757 #ifdef PDF_TRACE | 2694 #ifdef PDF_TRACE |
2758 printf("Page Width: %f, Page Height: %f\n", rect.GetWidth(), rec
t.GetHeight()); | 2695 printf("Page Width: %f, Page Height: %f\n", SkScalarToDouble(rec
t.width()), SkScalarToDouble(rect.height())); |
2759 #endif | 2696 #endif |
2760 | 2697 |
2761 // TODO(edisonn): page->GetCropBox(), page->GetTrimBox() ... how
to use? | 2698 // TODO(edisonn): page->GetCropBox(), page->GetTrimBox() ... how
to use? |
2762 | 2699 |
2763 SkBitmap bitmap; | 2700 SkBitmap bitmap; |
2764 #ifdef PDF_DEBUG_3X | 2701 #ifdef PDF_DEBUG_3X |
2765 setup_bitmap(&bitmap, 3*rect.GetWidth(), 3*rect.GetHeight()); | 2702 setup_bitmap(&bitmap, 3 * (int)SkScalarToDouble(rect.width()), 3
* (int)SkScalarToDouble(rect.height())) |
2766 #else | 2703 #else |
2767 setup_bitmap(&bitmap, rect.GetWidth(), rect.GetHeight()); | 2704 setup_bitmap(&bitmap, (int)SkScalarToDouble(rect.width()), (int)
SkScalarToDouble(rect.height())); |
2768 #endif | 2705 #endif |
2769 SkAutoTUnref<SkDevice> device(SkNEW_ARGS(SkDevice, (bitmap))); | 2706 SkAutoTUnref<SkDevice> device(SkNEW_ARGS(SkDevice, (bitmap))); |
2770 SkCanvas canvas(device); | 2707 SkCanvas canvas(device); |
2771 | 2708 |
| 2709 SkPdfTokenizer tokenizer = doc.tokenizerOfPage(pn); |
2772 | 2710 |
2773 const char* pszToken = NULL; | 2711 PdfContext pdfContext(doc); |
2774 PdfVariant var; | |
2775 EPdfContentsType eType; | |
2776 | |
2777 PdfContentsTokenizer tokenizer( page ); | |
2778 | |
2779 PdfContext pdfContext; | |
2780 pdfContext.fPdfPage = page; | |
2781 pdfContext.fPdfDoc = &doc; | |
2782 pdfContext.fOriginalMatrix = SkMatrix::I(); | 2712 pdfContext.fOriginalMatrix = SkMatrix::I(); |
2783 pdfContext.fGraphicsState.fResources = SkPdfResourceDictionary(p
dfContext.fPdfDoc, resolveReferenceObject(pdfContext.fPdfDoc, | 2713 pdfContext.fGraphicsState.fResources = NULL; |
2784
pdfContext.fPdfPage->GetResources())); | 2714 PodofoMapper::map(*page->Resources(), &pdfContext.fGraphicsState
.fResources); |
2785 | 2715 |
2786 gPdfContext = &pdfContext; | 2716 gPdfContext = &pdfContext; |
2787 gDumpBitmap = &bitmap; | 2717 gDumpBitmap = &bitmap; |
2788 gDumpCanvas = &canvas; | 2718 gDumpCanvas = &canvas; |
2789 | 2719 |
2790 | 2720 |
2791 // TODO(edisonn): get matrix stuff right. | 2721 // TODO(edisonn): get matrix stuff right. |
2792 // TODO(edisonn): add DPI/scale/zoom. | 2722 // TODO(edisonn): add DPI/scale/zoom. |
2793 SkScalar z = SkIntToScalar(0); | 2723 SkScalar z = SkIntToScalar(0); |
2794 SkScalar w = SkDoubleToScalar(rect.GetWidth()); | 2724 SkScalar w = rect.width(); |
2795 SkScalar h = SkDoubleToScalar(rect.GetHeight()); | 2725 SkScalar h = rect.height(); |
2796 | 2726 |
2797 SkPoint pdfSpace[4] = {SkPoint::Make(z, z), SkPoint::Make(w, z),
SkPoint::Make(w, h), SkPoint::Make(z, h)}; | 2727 SkPoint pdfSpace[4] = {SkPoint::Make(z, z), SkPoint::Make(w, z),
SkPoint::Make(w, h), SkPoint::Make(z, h)}; |
2798 // SkPoint skiaSpace[4] = {SkPoint::Make(z, h), SkPoint::Make(w,
h), SkPoint::Make(w, z), SkPoint::Make(z, z)}; | 2728 // SkPoint skiaSpace[4] = {SkPoint::Make(z, h), SkPoint::Make(w,
h), SkPoint::Make(w, z), SkPoint::Make(z, z)}; |
2799 | 2729 |
2800 // TODO(edisonn): add flag for this app to create sourunding buf
fer zone | 2730 // TODO(edisonn): add flag for this app to create sourunding buf
fer zone |
2801 // TODO(edisonn): add flagg for no clipping. | 2731 // TODO(edisonn): add flagg for no clipping. |
2802 // Use larger image to make sure we do not draw anything outside
of page | 2732 // Use larger image to make sure we do not draw anything outside
of page |
2803 // could be used in tests. | 2733 // could be used in tests. |
2804 | 2734 |
2805 #ifdef PDF_DEBUG_3X | 2735 #ifdef PDF_DEBUG_3X |
(...skipping 17 matching lines...) Expand all Loading... |
2823 pdfContext.fGraphicsState.fMatrix = pdfContext.fOriginalMatrix; | 2753 pdfContext.fGraphicsState.fMatrix = pdfContext.fOriginalMatrix; |
2824 pdfContext.fGraphicsState.fMatrixTm = pdfContext.fGraphicsState.
fMatrix; | 2754 pdfContext.fGraphicsState.fMatrixTm = pdfContext.fGraphicsState.
fMatrix; |
2825 pdfContext.fGraphicsState.fMatrixTlm = pdfContext.fGraphicsState
.fMatrix; | 2755 pdfContext.fGraphicsState.fMatrixTlm = pdfContext.fGraphicsState
.fMatrix; |
2826 | 2756 |
2827 canvas.setMatrix(pdfContext.fOriginalMatrix); | 2757 canvas.setMatrix(pdfContext.fOriginalMatrix); |
2828 | 2758 |
2829 #ifndef PDF_DEBUG_NO_PAGE_CLIPING | 2759 #ifndef PDF_DEBUG_NO_PAGE_CLIPING |
2830 canvas.clipRect(SkRect::MakeXYWH(z, z, w, h), SkRegion::kInterse
ct_Op, true); | 2760 canvas.clipRect(SkRect::MakeXYWH(z, z, w, h), SkRegion::kInterse
ct_Op, true); |
2831 #endif | 2761 #endif |
2832 | 2762 |
2833 PdfMainLooper looper(NULL, &tokenizer, &pdfContext, &canvas); | 2763 PdfMainLooper looper(NULL, tokenizer, &pdfContext, &canvas); |
2834 looper.loop(); | 2764 looper.loop(); |
2835 | 2765 |
2836 canvas.flush(); | 2766 canvas.flush(); |
2837 | 2767 |
2838 SkString out; | 2768 SkString out; |
2839 out.appendf("%s-%i.png", inputFileName.c_str(), pn); | 2769 out.appendf("%s-%i.png", inputFileName.c_str(), pn); |
2840 SkImageEncoder::EncodeFile(out.c_str(), bitmap, SkImageEncoder::
kPNG_Type, 100); | 2770 SkImageEncoder::EncodeFile(out.c_str(), bitmap, SkImageEncoder::
kPNG_Type, 100); |
2841 } | 2771 } |
2842 return true; | 2772 return true; |
2843 } | 2773 } |
(...skipping 215 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3059 } | 2989 } |
3060 | 2990 |
3061 return 0; | 2991 return 0; |
3062 } | 2992 } |
3063 | 2993 |
3064 #if !defined SK_BUILD_FOR_IOS | 2994 #if !defined SK_BUILD_FOR_IOS |
3065 int main(int argc, char * const argv[]) { | 2995 int main(int argc, char * const argv[]) { |
3066 return tool_main(argc, (char**) argv); | 2996 return tool_main(argc, (char**) argv); |
3067 } | 2997 } |
3068 #endif | 2998 #endif |
OLD | NEW |