Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(341)

Side by Side Diff: experimental/PdfViewer/SkPdfRenderer.cpp

Issue 23020003: pdfviewer: debug code for drawText (show magenta background for text, to show text even when we fai… (Closed) Base URL: http://skia.googlecode.com/svn/trunk/
Patch Set: Created 7 years, 4 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
« no previous file with comments | « experimental/PdfViewer/SkPdfRenderer.h ('k') | experimental/PdfViewer/SkPdfUtils.h » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
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 "SkForceLinking.h" 10 #include "SkForceLinking.h"
11 #include "SkGraphics.h" 11 #include "SkGraphics.h"
12 #include "SkImageDecoder.h" 12 #include "SkImageDecoder.h"
13 #include "SkImageEncoder.h" 13 #include "SkImageEncoder.h"
14 #include "SkOSFile.h" 14 #include "SkOSFile.h"
15 #include "SkPicture.h" 15 #include "SkPicture.h"
16 #include "SkStream.h" 16 #include "SkStream.h"
17 #include "SkTypeface.h" 17 #include "SkTypeface.h"
18 #include "SkTArray.h" 18 #include "SkTArray.h"
19 #include "SkTDict.h" 19 #include "SkTDict.h"
20 20
21 #include "SkPdfBasics.h" 21 #include "SkPdfGraphicsState.h"
22 #include "SkPdfNativeTokenizer.h" 22 #include "SkPdfNativeTokenizer.h"
23 #include <cstdio> 23 #include <cstdio>
24 #include <stack> 24 #include <stack>
25 #include <set> 25 #include <set>
26 26
27 extern "C" PdfContext* gPdfContext; 27 extern "C" SkPdfContext* gPdfContext;
28 extern "C" SkBitmap* gDumpBitmap; 28 extern "C" SkBitmap* gDumpBitmap;
29 extern "C" SkCanvas* gDumpCanvas; 29 extern "C" SkCanvas* gDumpCanvas;
30 30
31 __SK_FORCE_IMAGE_DECODER_LINKING; 31 __SK_FORCE_IMAGE_DECODER_LINKING;
32 32
33 // TODO(edisonn): tool, show what objects were read at least, show the ones not even read 33 // TODO(edisonn): tool, show what objects were read at least, show the ones not even read
34 // keep for each object pos in file 34 // keep for each object pos in file
35 // plug in for VS? syntax coloring, show selected object ... from the text, or f rom rendered x,y 35 // plug in for VS? syntax coloring, show selected object ... from the text, or f rom rendered x,y
36 36
37 // TODO(edisonn): security - validate all the user input, all pdf! 37 // TODO(edisonn): security - validate all the user input, all pdf!
38 38
39 // TODO(edisonn): put drawtext in #ifdefs, so comparations will ignore minor cha nges in text positioning and font 39 // TODO(edisonn): put drawtext in #ifdefs, so comparations will ignore minor cha nges in text positioning and font
40 // this way, we look more at other features and layout in diffs 40 // this way, we look more at other features and layout in diffs
41 41
42 // TODO(edisonn): move trace dump in the get functions, and mapper ones too so i t ghappens automatically 42 // TODO(edisonn): move trace dump in the get functions, and mapper ones too so i t ghappens automatically
43 /* 43 /*
44 #ifdef PDF_TRACE 44 #ifdef PDF_TRACE
45 std::string str; 45 std::string str;
46 pdfContext->fGraphicsState.fResources->native()->ToString(str); 46 pdfContext->fGraphicsState.fResources->native()->ToString(str);
47 printf("Print Tf Resources: %s\n", str.c_str()); 47 printf("Print Tf Resources: %s\n", str.c_str());
48 #endif 48 #endif
49 */ 49 */
50 50
51 #include "SkPdfHeaders_autogen.h" 51 #include "SkPdfHeaders_autogen.h"
52 #include "SkPdfMapper_autogen.h" 52 #include "SkPdfMapper_autogen.h"
53 #include "SkPdfRenderer.h" 53 #include "SkPdfRenderer.h"
54 54
55 #include "SkPdfBasics.h"
56 #include "SkPdfUtils.h" 55 #include "SkPdfUtils.h"
57 56
58 #include "SkPdfFont.h" 57 #include "SkPdfFont.h"
59 58
60 /* 59 /*
61 * TODO(edisonn): 60 * TODO(edisonn):
62 * - all font types and all ppdf font features 61 * - all font types and all ppdf font features
63 * - word spacing 62 * - word spacing
64 * - load font for baidu.pdf 63 * - load font for baidu.pdf
65 * - load font for youtube.pdf 64 * - load font for youtube.pdf
(...skipping 22 matching lines...) Expand all
88 } 87 }
89 }; 88 };
90 89
91 StringsInit gStringsInit; 90 StringsInit gStringsInit;
92 91
93 // TODO(edisonn): Document PdfTokenLooper and subclasses. 92 // TODO(edisonn): Document PdfTokenLooper and subclasses.
94 class PdfTokenLooper { 93 class PdfTokenLooper {
95 protected: 94 protected:
96 PdfTokenLooper* fParent; 95 PdfTokenLooper* fParent;
97 SkPdfNativeTokenizer* fTokenizer; 96 SkPdfNativeTokenizer* fTokenizer;
98 PdfContext* fPdfContext; 97 SkPdfContext* fPdfContext;
99 SkCanvas* fCanvas; 98 SkCanvas* fCanvas;
100 99
101 public: 100 public:
102 PdfTokenLooper(PdfTokenLooper* parent, 101 PdfTokenLooper(PdfTokenLooper* parent,
103 SkPdfNativeTokenizer* tokenizer, 102 SkPdfNativeTokenizer* tokenizer,
104 PdfContext* pdfContext, 103 SkPdfContext* pdfContext,
105 SkCanvas* canvas) 104 SkCanvas* canvas)
106 : fParent(parent), fTokenizer(tokenizer), fPdfContext(pdfContext), fCanv as(canvas) {} 105 : fParent(parent), fTokenizer(tokenizer), fPdfContext(pdfContext), fCanv as(canvas) {}
107 106
108 virtual ~PdfTokenLooper() {} 107 virtual ~PdfTokenLooper() {}
109 108
110 virtual PdfResult consumeToken(PdfToken& token) = 0; 109 virtual SkPdfResult consumeToken(PdfToken& token) = 0;
111 virtual void loop() = 0; 110 virtual void loop() = 0;
112 111
113 void setUp(PdfTokenLooper* parent) { 112 void setUp(PdfTokenLooper* parent) {
114 fParent = parent; 113 fParent = parent;
115 fTokenizer = parent->fTokenizer; 114 fTokenizer = parent->fTokenizer;
116 fPdfContext = parent->fPdfContext; 115 fPdfContext = parent->fPdfContext;
117 fCanvas = parent->fCanvas; 116 fCanvas = parent->fCanvas;
118 } 117 }
119 118
120 SkPdfNativeTokenizer* tokenizer() { return fTokenizer; } 119 SkPdfNativeTokenizer* tokenizer() { return fTokenizer; }
121 }; 120 };
122 121
123 class PdfMainLooper : public PdfTokenLooper { 122 class PdfMainLooper : public PdfTokenLooper {
124 public: 123 public:
125 PdfMainLooper(PdfTokenLooper* parent, 124 PdfMainLooper(PdfTokenLooper* parent,
126 SkPdfNativeTokenizer* tokenizer, 125 SkPdfNativeTokenizer* tokenizer,
127 PdfContext* pdfContext, 126 SkPdfContext* pdfContext,
128 SkCanvas* canvas) 127 SkCanvas* canvas)
129 : PdfTokenLooper(parent, tokenizer, pdfContext, canvas) {} 128 : PdfTokenLooper(parent, tokenizer, pdfContext, canvas) {}
130 129
131 virtual PdfResult consumeToken(PdfToken& token); 130 virtual SkPdfResult consumeToken(PdfToken& token);
132 virtual void loop(); 131 virtual void loop();
133 }; 132 };
134 133
135 class PdfInlineImageLooper : public PdfTokenLooper { 134 class PdfInlineImageLooper : public PdfTokenLooper {
136 public: 135 public:
137 PdfInlineImageLooper() 136 PdfInlineImageLooper()
138 : PdfTokenLooper(NULL, NULL, NULL, NULL) {} 137 : PdfTokenLooper(NULL, NULL, NULL, NULL) {}
139 138
140 virtual PdfResult consumeToken(PdfToken& token); 139 virtual SkPdfResult consumeToken(PdfToken& token);
141 virtual void loop(); 140 virtual void loop();
142 PdfResult done(); 141 SkPdfResult done();
143 }; 142 };
144 143
145 class PdfCompatibilitySectionLooper : public PdfTokenLooper { 144 class PdfCompatibilitySectionLooper : public PdfTokenLooper {
146 public: 145 public:
147 PdfCompatibilitySectionLooper() 146 PdfCompatibilitySectionLooper()
148 : PdfTokenLooper(NULL, NULL, NULL, NULL) {} 147 : PdfTokenLooper(NULL, NULL, NULL, NULL) {}
149 148
150 virtual PdfResult consumeToken(PdfToken& token); 149 virtual SkPdfResult consumeToken(PdfToken& token);
151 virtual void loop(); 150 virtual void loop();
152 }; 151 };
153 152
154 // Utilities 153 // Utilities
155 static void setup_bitmap(SkBitmap* bitmap, int width, int height, SkColor color = SK_ColorWHITE) { 154 static void setup_bitmap(SkBitmap* bitmap, int width, int height, SkColor color = SK_ColorWHITE) {
156 bitmap->setConfig(SkBitmap::kARGB_8888_Config, width, height); 155 bitmap->setConfig(SkBitmap::kARGB_8888_Config, width, height);
157 156
158 bitmap->allocPixels(); 157 bitmap->allocPixels();
159 bitmap->eraseColor(color); 158 bitmap->eraseColor(color);
160 } 159 }
(...skipping 28 matching lines...) Expand all
189 SkDoubleToScalar(1)); 188 SkDoubleToScalar(1));
190 189
191 return matrix; 190 return matrix;
192 } 191 }
193 192
194 SkMatrix SkMatrixFromPdfArray(SkPdfArray* pdfArray) { 193 SkMatrix SkMatrixFromPdfArray(SkPdfArray* pdfArray) {
195 double array[6]; 194 double array[6];
196 195
197 // TODO(edisonn): security issue, ret if size() != 6 196 // TODO(edisonn): security issue, ret if size() != 6
198 for (int i = 0; i < 6; i++) { 197 for (int i = 0; i < 6; i++) {
199 const SkPdfObject* elem = pdfArray->operator [](i); 198 const SkPdfNativeObject* elem = pdfArray->operator [](i);
200 if (elem == NULL || !elem->isNumber()) { 199 if (elem == NULL || !elem->isNumber()) {
201 return SkMatrix::I(); // TODO(edisonn): report issue 200 return SkMatrix::I(); // TODO(edisonn): report issue
202 } 201 }
203 array[i] = elem->numberValue(); 202 array[i] = elem->numberValue();
204 } 203 }
205 204
206 return SkMatrixFromPdfMatrix(array); 205 return SkMatrixFromPdfMatrix(array);
207 } 206 }
208 207
209 208
210 extern "C" SkNativeParsedPDF* gDoc; 209 extern "C" SkPdfNativeDoc* gDoc;
211 SkBitmap* gDumpBitmap = NULL; 210 SkBitmap* gDumpBitmap = NULL;
212 SkCanvas* gDumpCanvas = NULL; 211 SkCanvas* gDumpCanvas = NULL;
213 char gLastKeyword[100] = ""; 212 char gLastKeyword[100] = "";
214 int gLastOpKeyword = -1; 213 int gLastOpKeyword = -1;
215 char allOpWithVisualEffects[100] = ",S,s,f,F,f*,B,B*,b,b*,n,Tj,TJ,\',\",d0,d1,sh ,EI,Do,EX,"; 214 char allOpWithVisualEffects[100] = ",S,s,f,F,f*,B,B*,b,b*,n,Tj,TJ,\',\",d0,d1,sh ,EI,Do,EX,";
216 int gReadOp = 0; 215 int gReadOp = 0;
217 216
218 217
219 #ifdef PDF_TRACE_DIFF_IN_PNG 218 #ifdef PDF_TRACE_DIFF_IN_PNG
220 static bool hasVisualEffect(const char* pdfOp) { 219 static bool hasVisualEffect(const char* pdfOp) {
221 return true; 220 return true;
222 if (*pdfOp == '\0') return false; 221 if (*pdfOp == '\0') return false;
223 222
224 char markedPdfOp[100] = ","; 223 char markedPdfOp[100] = ",";
225 strcat(markedPdfOp, pdfOp); 224 strcat(markedPdfOp, pdfOp);
226 strcat(markedPdfOp, ","); 225 strcat(markedPdfOp, ",");
227 226
228 return (strstr(allOpWithVisualEffects, markedPdfOp) != NULL); 227 return (strstr(allOpWithVisualEffects, markedPdfOp) != NULL);
229 } 228 }
230 #endif // PDF_TRACE_DIFF_IN_PNG 229 #endif // PDF_TRACE_DIFF_IN_PNG
231 230
232 231
233 232
234 // TODO(edisonn): Pass PdfContext and SkCanvasd only with the define for instrum entation. 233 // TODO(edisonn): Pass SkPdfContext and SkCanvasd only with the define for instr umentation.
235 static bool readToken(SkPdfNativeTokenizer* fTokenizer, PdfToken* token) { 234 static bool readToken(SkPdfNativeTokenizer* fTokenizer, PdfToken* token) {
236 bool ret = fTokenizer->readToken(token); 235 bool ret = fTokenizer->readToken(token);
237 236
238 gReadOp++; 237 gReadOp++;
239 gLastOpKeyword++; 238 gLastOpKeyword++;
240 #ifdef PDF_TRACE_DIFF_IN_PNG 239 #ifdef PDF_TRACE_DIFF_IN_PNG
241 // TODO(edisonn): compare with old bitmap, and save only new bits are availa ble, and save 240 // TODO(edisonn): compare with old bitmap, and save only new bits are availa ble, and save
242 // the numbar and name of last operation, so the file name will reflect op t hat changed. 241 // the numbar and name of last operation, so the file name will reflect op t hat changed.
243 if (gLastKeyword[0] && hasVisualEffect(gLastKeyword)) { // TODO(edisonn): a nd has dirty bits. 242 if (gLastKeyword[0] && hasVisualEffect(gLastKeyword)) { // TODO(edisonn): a nd has dirty bits.
244 gDumpCanvas->flush(); 243 gDumpCanvas->flush();
(...skipping 74 matching lines...) Expand 10 before | Expand all | Expand 10 after
319 gLastKeyword[0] = '\0'; 318 gLastKeyword[0] = '\0';
320 } 319 }
321 320
322 #endif 321 #endif
323 322
324 return ret; 323 return ret;
325 } 324 }
326 325
327 326
328 327
329 typedef PdfResult (*PdfOperatorRenderer)(PdfContext*, SkCanvas*, PdfTokenLooper* *); 328 typedef SkPdfResult (*PdfOperatorRenderer)(SkPdfContext*, SkCanvas*, PdfTokenLoo per**);
330 329
331 SkTDict<PdfOperatorRenderer> gPdfOps(100); 330 SkTDict<PdfOperatorRenderer> gPdfOps(100);
332 331
333 332
334 template <typename T> class SkTDictWithDefaultConstructor : public SkTDict<T> { 333 template <typename T> class SkTDictWithDefaultConstructor : public SkTDict<T> {
335 public: 334 public:
336 SkTDictWithDefaultConstructor() : SkTDict<T>(10) {} 335 SkTDictWithDefaultConstructor() : SkTDict<T>(10) {}
337 }; 336 };
338 337
339 SkTDictWithDefaultConstructor<int> gRenderStats[kCount_PdfResult]; 338 SkTDictWithDefaultConstructor<int> gRenderStats[kCount_SkPdfResult];
340 339
341 const char* gRenderStatsNames[kCount_PdfResult] = { 340 const char* gRenderStatsNames[kCount_SkPdfResult] = {
342 "Success", 341 "Success",
343 "Partially implemented", 342 "Partially implemented",
344 "Not yet implemented", 343 "Not yet implemented",
345 "Ignore Error", 344 "Ignore Error",
346 "Error", 345 "Error",
347 "Unsupported/Unknown" 346 "Unsupported/Unknown"
348 }; 347 };
349 348
350 static PdfResult DrawText(PdfContext* pdfContext, 349 static SkPdfResult DrawText(SkPdfContext* pdfContext,
351 const SkPdfObject* _str, 350 const SkPdfNativeObject* _str,
352 SkCanvas* canvas) 351 SkCanvas* canvas)
353 { 352 {
354 353
355 SkPdfFont* skfont = pdfContext->fGraphicsState.fSkFont; 354 SkPdfFont* skfont = pdfContext->fGraphicsState.fSkFont;
356 if (skfont == NULL) { 355 if (skfont == NULL) {
357 skfont = SkPdfFont::Default(); 356 skfont = SkPdfFont::Default();
358 } 357 }
359 358
360 359
361 if (_str == NULL || !_str->isAnyString()) { 360 if (_str == NULL || !_str->isAnyString()) {
362 // TODO(edisonn): report warning 361 // TODO(edisonn): report warning
363 return kIgnoreError_PdfResult; 362 return kIgnoreError_SkPdfResult;
364 } 363 }
365 const SkPdfString* str = (const SkPdfString*)_str; 364 const SkPdfString* str = (const SkPdfString*)_str;
366 365
367 SkUnencodedText binary(str); 366 SkUnencodedText binary(str);
368 367
369 SkDecodedText decoded; 368 SkDecodedText decoded;
370 369
371 if (skfont->encoding() == NULL) { 370 if (skfont->encoding() == NULL) {
372 // TODO(edisonn): report warning 371 // TODO(edisonn): report warning
373 return kNYI_PdfResult; 372 return kNYI_SkPdfResult;
374 } 373 }
375 374
376 skfont->encoding()->decodeText(binary, &decoded); 375 skfont->encoding()->decodeText(binary, &decoded);
377 376
378 SkPaint paint; 377 SkPaint paint;
379 // TODO(edisonn): when should fCurFont->GetFontSize() used? When cur is fCur FontSize == 0? 378 // TODO(edisonn): when should fCurFont->GetFontSize() used? When cur is fCur FontSize == 0?
380 // Or maybe just not call setTextSize at all? 379 // Or maybe just not call setTextSize at all?
381 if (pdfContext->fGraphicsState.fCurFontSize != 0) { 380 if (pdfContext->fGraphicsState.fCurFontSize != 0) {
382 paint.setTextSize(SkDoubleToScalar(pdfContext->fGraphicsState.fCurFontSi ze)); 381 paint.setTextSize(SkDoubleToScalar(pdfContext->fGraphicsState.fCurFontSi ze));
383 } 382 }
384 383
385 // if (fCurFont && fCurFont->GetFontScale() != 0) { 384 // if (fCurFont && fCurFont->GetFontScale() != 0) {
386 // paint.setTextScaleX(SkFloatToScalar(fCurFont->GetFontScale() / 100.0)) ; 385 // paint.setTextScaleX(SkFloatToScalar(fCurFont->GetFontScale() / 100.0)) ;
387 // } 386 // }
388 387
389 pdfContext->fGraphicsState.applyGraphicsState(&paint, false); 388 pdfContext->fGraphicsState.applyGraphicsState(&paint, false);
390 389
391 skfont->drawText(decoded, &paint, pdfContext, canvas); 390 skfont->drawText(decoded, &paint, pdfContext, canvas);
392 391
393 return kOK_PdfResult; 392 return kOK_SkPdfResult;
394 } 393 }
395 394
396 // TODO(edisonn): create header files with declarations! 395 // TODO(edisonn): create header files with declarations!
397 PdfResult PdfOp_q(PdfContext* pdfContext, SkCanvas* canvas, PdfTokenLooper** loo per); 396 SkPdfResult PdfOp_q(SkPdfContext* pdfContext, SkCanvas* canvas, PdfTokenLooper** looper);
398 PdfResult PdfOp_Q(PdfContext* pdfContext, SkCanvas* canvas, PdfTokenLooper** loo per); 397 SkPdfResult PdfOp_Q(SkPdfContext* pdfContext, SkCanvas* canvas, PdfTokenLooper** looper);
399 PdfResult PdfOp_Tw(PdfContext* pdfContext, SkCanvas* canvas, PdfTokenLooper** lo oper); 398 SkPdfResult PdfOp_Tw(SkPdfContext* pdfContext, SkCanvas* canvas, PdfTokenLooper* * looper);
400 PdfResult PdfOp_Tc(PdfContext* pdfContext, SkCanvas* canvas, PdfTokenLooper** lo oper); 399 SkPdfResult PdfOp_Tc(SkPdfContext* pdfContext, SkCanvas* canvas, PdfTokenLooper* * looper);
401 400
402 // TODO(edisonn): perf!!! 401 // TODO(edisonn): perf!!!
403 402
404 static SkColorTable* getGrayColortable() { 403 static SkColorTable* getGrayColortable() {
405 static SkColorTable* grayColortable = NULL; 404 static SkColorTable* grayColortable = NULL;
406 if (grayColortable == NULL) { 405 if (grayColortable == NULL) {
407 SkPMColor* colors = new SkPMColor[256]; 406 SkPMColor* colors = new SkPMColor[256];
408 for (int i = 0 ; i < 256; i++) { 407 for (int i = 0 ; i < 256; i++) {
409 colors[i] = SkPreMultiplyARGB(255, i, i, i); 408 colors[i] = SkPreMultiplyARGB(255, i, i, i);
410 } 409 }
(...skipping 56 matching lines...) Expand 10 before | Expand all | Expand 10 after
467 466
468 // utils 467 // utils
469 468
470 // TODO(edisonn): add cache, or put the bitmap property directly on the PdfObjec t 469 // TODO(edisonn): add cache, or put the bitmap property directly on the PdfObjec t
471 // TODO(edisonn): deal with colorSpaces, we could add them to SkBitmap::Config 470 // TODO(edisonn): deal with colorSpaces, we could add them to SkBitmap::Config
472 // TODO(edisonn): preserve A1 format that skia knows, + fast convert from 111, 2 22, 444 to closest 471 // TODO(edisonn): preserve A1 format that skia knows, + fast convert from 111, 2 22, 444 to closest
473 // skia format, through a table 472 // skia format, through a table
474 473
475 // this functions returns the image, it does not look at the smask. 474 // this functions returns the image, it does not look at the smask.
476 475
477 static SkBitmap* getImageFromObjectCore(PdfContext* pdfContext, SkPdfImageDictio nary* image, bool transparencyMask) { 476 static SkBitmap* getImageFromObjectCore(SkPdfContext* pdfContext, SkPdfImageDict ionary* image, bool transparencyMask) {
478 if (image == NULL || !image->hasStream()) { 477 if (image == NULL || !image->hasStream()) {
479 // TODO(edisonn): report warning to be used in testing. 478 // TODO(edisonn): report warning to be used in testing.
480 return NULL; 479 return NULL;
481 } 480 }
482 481
483 int64_t bpc = image->BitsPerComponent(pdfContext->fPdfDoc); 482 int64_t bpc = image->BitsPerComponent(pdfContext->fPdfDoc);
484 int64_t width = image->Width(pdfContext->fPdfDoc); 483 int64_t width = image->Width(pdfContext->fPdfDoc);
485 int64_t height = image->Height(pdfContext->fPdfDoc); 484 int64_t height = image->Height(pdfContext->fPdfDoc);
486 std::string colorSpace = "DeviceRGB"; 485 std::string colorSpace = "DeviceRGB";
487 486
(...skipping 98 matching lines...) Expand 10 before | Expand all | Expand 10 after
586 585
587 SkBitmap* bitmap = transferImageStreamToBitmap( 586 SkBitmap* bitmap = transferImageStreamToBitmap(
588 (unsigned char*)uncompressedStream, uncompressedStreamLength, 587 (unsigned char*)uncompressedStream, uncompressedStreamLength,
589 (int)width, (int)height, bytesPerLine, 588 (int)width, (int)height, bytesPerLine,
590 (int)bpc, colorSpace, 589 (int)bpc, colorSpace,
591 transparencyMask); 590 transparencyMask);
592 591
593 return bitmap; 592 return bitmap;
594 } 593 }
595 594
596 static SkBitmap* getImageFromObject(PdfContext* pdfContext, SkPdfImageDictionary * image, bool transparencyMask) { 595 static SkBitmap* getImageFromObject(SkPdfContext* pdfContext, SkPdfImageDictiona ry* image, bool transparencyMask) {
597 if (!transparencyMask) { 596 if (!transparencyMask) {
598 if (!image->hasData(SkPdfObject::kBitmap_Data)) { 597 if (!image->hasData(SkPdfNativeObject::kBitmap_Data)) {
599 SkBitmap* bitmap = getImageFromObjectCore(pdfContext, image, transpa rencyMask); 598 SkBitmap* bitmap = getImageFromObjectCore(pdfContext, image, transpa rencyMask);
600 image->setData(bitmap, SkPdfObject::kBitmap_Data); 599 image->setData(bitmap, SkPdfNativeObject::kBitmap_Data);
601 } 600 }
602 return (SkBitmap*) image->data(SkPdfObject::kBitmap_Data); 601 return (SkBitmap*) image->data(SkPdfNativeObject::kBitmap_Data);
603 } else { 602 } else {
604 return getImageFromObjectCore(pdfContext, image, transparencyMask); 603 return getImageFromObjectCore(pdfContext, image, transparencyMask);
605 } 604 }
606 } 605 }
607 606
608 static SkBitmap* getSmaskFromObject(PdfContext* pdfContext, SkPdfImageDictionary * obj) { 607 static SkBitmap* getSmaskFromObject(SkPdfContext* pdfContext, SkPdfImageDictiona ry* obj) {
609 SkPdfImageDictionary* sMask = obj->SMask(pdfContext->fPdfDoc); 608 SkPdfImageDictionary* sMask = obj->SMask(pdfContext->fPdfDoc);
610 609
611 if (sMask) { 610 if (sMask) {
612 return getImageFromObject(pdfContext, sMask, true); 611 return getImageFromObject(pdfContext, sMask, true);
613 } 612 }
614 613
615 // TODO(edisonn): implement GS SMask. Default to empty right now. 614 // TODO(edisonn): implement GS SMask. Default to empty right now.
616 return pdfContext->fGraphicsState.fSMask; 615 return pdfContext->fGraphicsState.fSMask;
617 } 616 }
618 617
619 static PdfResult doXObject_Image(PdfContext* pdfContext, SkCanvas* canvas, SkPdf ImageDictionary* skpdfimage) { 618 static SkPdfResult doXObject_Image(SkPdfContext* pdfContext, SkCanvas* canvas, S kPdfImageDictionary* skpdfimage) {
620 if (skpdfimage == NULL) { 619 if (skpdfimage == NULL) {
621 return kIgnoreError_PdfResult; 620 return kIgnoreError_SkPdfResult;
622 } 621 }
623 622
624 SkBitmap* image = getImageFromObject(pdfContext, skpdfimage, false); 623 SkBitmap* image = getImageFromObject(pdfContext, skpdfimage, false);
625 SkBitmap* sMask = getSmaskFromObject(pdfContext, skpdfimage); 624 SkBitmap* sMask = getSmaskFromObject(pdfContext, skpdfimage);
626 625
627 canvas->save(); 626 canvas->save();
628 canvas->setMatrix(pdfContext->fGraphicsState.fCTM); 627 canvas->setMatrix(pdfContext->fGraphicsState.fCTM);
629 628
630 SkScalar z = SkIntToScalar(0); 629 SkScalar z = SkIntToScalar(0);
631 SkScalar one = SkIntToScalar(1); 630 SkScalar one = SkIntToScalar(1);
(...skipping 29 matching lines...) Expand all
661 canvas->drawBitmapRect(*image, dst, NULL); 660 canvas->drawBitmapRect(*image, dst, NULL);
662 SkPaint xfer; 661 SkPaint xfer;
663 // TODO(edisonn): is the blend mode specified already implicitly/explici tly in pdf? 662 // TODO(edisonn): is the blend mode specified already implicitly/explici tly in pdf?
664 xfer.setXfermodeMode(SkXfermode::kSrcOut_Mode); // SkXfermode::kSdtOut_M ode 663 xfer.setXfermodeMode(SkXfermode::kSrcOut_Mode); // SkXfermode::kSdtOut_M ode
665 canvas->drawBitmapRect(*sMask, dst, &xfer); 664 canvas->drawBitmapRect(*sMask, dst, &xfer);
666 canvas->restore(); 665 canvas->restore();
667 } 666 }
668 667
669 canvas->restore(); 668 canvas->restore();
670 669
671 return kPartial_PdfResult; 670 return kPartial_SkPdfResult;
672 } 671 }
673 672
674 //TODO(edisonn): options for implementing isolation and knockout 673 //TODO(edisonn): options for implementing isolation and knockout
675 // 1) emulate them (current solution) 674 // 1) emulate them (current solution)
676 // PRO: simple 675 // PRO: simple
677 // CON: will need to use readPixels, which means serious perf issues 676 // CON: will need to use readPixels, which means serious perf issues
678 // 2) Compile a plan for an array of matrixes, compose the result at the end 677 // 2) Compile a plan for an array of matrixes, compose the result at the end
679 // PRO: might be faster then 1, no need to readPixels 678 // PRO: might be faster then 1, no need to readPixels
680 // CON: multiple drawings (but on smaller areas), pay a price at loading pdf to compute a pdf draw plan 679 // CON: multiple drawings (but on smaller areas), pay a price at loading pdf to compute a pdf draw plan
681 // on average, a load with empty draw is 100ms on all the skps we have, for complete sites 680 // on average, a load with empty draw is 100ms on all the skps we have, for complete sites
682 // 3) support them natively in SkCanvas 681 // 3) support them natively in SkCanvas
683 // PRO: simple 682 // PRO: simple
684 // CON: we would still need to use a form of readPixels anyway, so perf migh t be the same as 1) 683 // CON: we would still need to use a form of readPixels anyway, so perf migh t be the same as 1)
685 // 4) compile a plan using pathops, and render once without any fancy rules with backdrop 684 // 4) compile a plan using pathops, and render once without any fancy rules with backdrop
686 // PRO: simple, fast 685 // PRO: simple, fast
687 // CON: pathops must be bug free first + time to compute new paths 686 // CON: pathops must be bug free first + time to compute new paths
688 // pay a price at loading pdf to compute a pdf draw plan 687 // pay a price at loading pdf to compute a pdf draw plan
689 // on average, a load with empty draw is 100ms on all the skps we have, for complete sites 688 // on average, a load with empty draw is 100ms on all the skps we have, for complete sites
690 // 5) for knockout, render the objects in reverse order, and add every object to the clip, and any new draw will be cliped 689 // 5) for knockout, render the objects in reverse order, and add every object to the clip, and any new draw will be cliped
691 690
692 691
693 // TODO(edisonn): draw plan from point! - list of draw ops of a point, like a tr ee! 692 // TODO(edisonn): draw plan from point! - list of draw ops of a point, like a tr ee!
694 // TODO(edisonn): Minimal PDF to draw some points - remove everything that it is not needed, save pdf uncompressed 693 // TODO(edisonn): Minimal PDF to draw some points - remove everything that it is not needed, save pdf uncompressed
695 694
696 695
697 696
698 static void doGroup_before(PdfContext* pdfContext, SkCanvas* canvas, SkRect bbox , SkPdfTransparencyGroupDictionary* tgroup, bool page) { 697 static void doGroup_before(SkPdfContext* pdfContext, SkCanvas* canvas, SkRect bb ox, SkPdfTransparencyGroupDictionary* tgroup, bool page) {
699 SkRect bboxOrig = bbox; 698 SkRect bboxOrig = bbox;
700 SkBitmap backdrop; 699 SkBitmap backdrop;
701 bool isolatedGroup = tgroup->I(pdfContext->fPdfDoc); 700 bool isolatedGroup = tgroup->I(pdfContext->fPdfDoc);
702 // bool knockoutGroup = tgroup->K(pdfContext->fPdfDoc); 701 // bool knockoutGroup = tgroup->K(pdfContext->fPdfDoc);
703 SkPaint paint; 702 SkPaint paint;
704 pdfContext->fGraphicsState.applyGraphicsState(&paint, false); 703 pdfContext->fGraphicsState.applyGraphicsState(&paint, false);
705 canvas->saveLayer(&bboxOrig, isolatedGroup ? &paint : NULL); 704 canvas->saveLayer(&bboxOrig, isolatedGroup ? &paint : NULL);
706 } 705 }
707 706
708 // TODO(edisonn): non isolation implemented in skia 707 // TODO(edisonn): non isolation implemented in skia
709 //static void doGroup_after(PdfContext* pdfContext, SkCanvas* canvas, SkRect bbo x, SkPdfTransparencyGroupDictionary* tgroup) { 708 //static void doGroup_after(SkPdfContext* pdfContext, SkCanvas* canvas, SkRect b box, SkPdfTransparencyGroupDictionary* tgroup) {
710 // if not isolated 709 // if not isolated
711 // canvas->drawBitmapRect(backdrop, bboxOrig, NULL); 710 // canvas->drawBitmapRect(backdrop, bboxOrig, NULL);
712 //} 711 //}
713 712
714 static PdfResult doXObject_Form(PdfContext* pdfContext, SkCanvas* canvas, SkPdfT ype1FormDictionary* skobj) { 713 static SkPdfResult doXObject_Form(SkPdfContext* pdfContext, SkCanvas* canvas, Sk PdfType1FormDictionary* skobj) {
715 if (!skobj || !skobj->hasStream()) { 714 if (!skobj || !skobj->hasStream()) {
716 return kIgnoreError_PdfResult; 715 return kIgnoreError_SkPdfResult;
717 } 716 }
718 717
719 if (!skobj->has_BBox()) { 718 if (!skobj->has_BBox()) {
720 return kIgnoreError_PdfResult; 719 return kIgnoreError_SkPdfResult;
721 } 720 }
722 721
723 PdfOp_q(pdfContext, canvas, NULL); 722 PdfOp_q(pdfContext, canvas, NULL);
724 723
725 724
726 if (skobj->Resources(pdfContext->fPdfDoc)) { 725 if (skobj->Resources(pdfContext->fPdfDoc)) {
727 pdfContext->fGraphicsState.fResources = skobj->Resources(pdfContext->fPd fDoc); 726 pdfContext->fGraphicsState.fResources = skobj->Resources(pdfContext->fPd fDoc);
728 } 727 }
729 728
730 SkTraceMatrix(pdfContext->fGraphicsState.fCTM, "Current matrix"); 729 SkTraceMatrix(pdfContext->fGraphicsState.fCTM, "Current matrix");
(...skipping 35 matching lines...) Expand 10 before | Expand all | Expand 10 after
766 } 765 }
767 766
768 // TODO(edisonn): should we restore the variable stack at the same state? 767 // TODO(edisonn): should we restore the variable stack at the same state?
769 // There could be operands left, that could be consumed by a parent tokenize r when we pop. 768 // There could be operands left, that could be consumed by a parent tokenize r when we pop.
770 769
771 if (skobj->has_Group()) { 770 if (skobj->has_Group()) {
772 canvas->restore(); 771 canvas->restore();
773 } 772 }
774 773
775 PdfOp_Q(pdfContext, canvas, NULL); 774 PdfOp_Q(pdfContext, canvas, NULL);
776 return kPartial_PdfResult; 775 return kPartial_SkPdfResult;
777 } 776 }
778 777
779 778
780 // TODO(edisonn): Extract a class like ObjWithStream 779 // TODO(edisonn): Extract a class like ObjWithStream
781 static PdfResult doXObject_Pattern(PdfContext* pdfContext, SkCanvas* canvas, SkP dfType1PatternDictionary* skobj) { 780 static SkPdfResult doXObject_Pattern(SkPdfContext* pdfContext, SkCanvas* canvas, SkPdfType1PatternDictionary* skobj) {
782 if (!skobj || !skobj->hasStream()) { 781 if (!skobj || !skobj->hasStream()) {
783 return kIgnoreError_PdfResult; 782 return kIgnoreError_SkPdfResult;
784 } 783 }
785 784
786 if (!skobj->has_BBox()) { 785 if (!skobj->has_BBox()) {
787 return kIgnoreError_PdfResult; 786 return kIgnoreError_SkPdfResult;
788 } 787 }
789 788
790 PdfOp_q(pdfContext, canvas, NULL); 789 PdfOp_q(pdfContext, canvas, NULL);
791 790
792 791
793 if (skobj->Resources(pdfContext->fPdfDoc)) { 792 if (skobj->Resources(pdfContext->fPdfDoc)) {
794 pdfContext->fGraphicsState.fResources = skobj->Resources(pdfContext->fPd fDoc); 793 pdfContext->fGraphicsState.fResources = skobj->Resources(pdfContext->fPd fDoc);
795 } 794 }
796 795
797 SkTraceMatrix(pdfContext->fGraphicsState.fContentStreamMatrix, "Current Cont ent stream matrix"); 796 SkTraceMatrix(pdfContext->fGraphicsState.fContentStreamMatrix, "Current Cont ent stream matrix");
(...skipping 20 matching lines...) Expand all
818 if (tokenizer != NULL) { 817 if (tokenizer != NULL) {
819 PdfMainLooper looper(NULL, tokenizer, pdfContext, canvas); 818 PdfMainLooper looper(NULL, tokenizer, pdfContext, canvas);
820 looper.loop(); 819 looper.loop();
821 delete tokenizer; 820 delete tokenizer;
822 } 821 }
823 822
824 // TODO(edisonn): should we restore the variable stack at the same state? 823 // TODO(edisonn): should we restore the variable stack at the same state?
825 // There could be operands left, that could be consumed by a parent tokenize r when we pop. 824 // There could be operands left, that could be consumed by a parent tokenize r when we pop.
826 825
827 PdfOp_Q(pdfContext, canvas, NULL); 826 PdfOp_Q(pdfContext, canvas, NULL);
828 return kPartial_PdfResult; 827 return kPartial_SkPdfResult;
829 } 828 }
830 829
831 830
832 //static PdfResult doXObject_PS(PdfContext* pdfContext, SkCanvas* canvas, const SkPdfObject* obj) { 831 //static SkPdfResult doXObject_PS(SkPdfContext* pdfContext, SkCanvas* canvas, co nst SkPdfNativeObject* obj) {
833 // return kNYI_PdfResult; 832 // return kNYI_SkPdfResult;
834 //} 833 //}
835 834
836 PdfResult doType3Char(PdfContext* pdfContext, SkCanvas* canvas, const SkPdfObjec t* skobj, SkRect bBox, SkMatrix matrix, double textSize) { 835 SkPdfResult doType3Char(SkPdfContext* pdfContext, SkCanvas* canvas, const SkPdfN ativeObject* skobj, SkRect bBox, SkMatrix matrix, double textSize) {
837 if (!skobj || !skobj->hasStream()) { 836 if (!skobj || !skobj->hasStream()) {
838 return kIgnoreError_PdfResult; 837 return kIgnoreError_SkPdfResult;
839 } 838 }
840 839
841 PdfOp_q(pdfContext, canvas, NULL); 840 PdfOp_q(pdfContext, canvas, NULL);
842 841
843 pdfContext->fGraphicsState.fMatrixTm.preConcat(matrix); 842 pdfContext->fGraphicsState.fMatrixTm.preConcat(matrix);
844 pdfContext->fGraphicsState.fMatrixTm.preScale(SkDoubleToScalar(textSize), Sk DoubleToScalar(textSize)); 843 pdfContext->fGraphicsState.fMatrixTm.preScale(SkDoubleToScalar(textSize), Sk DoubleToScalar(textSize));
845 pdfContext->fGraphicsState.fMatrixTlm = pdfContext->fGraphicsState.fMatrixTm ; 844 pdfContext->fGraphicsState.fMatrixTlm = pdfContext->fGraphicsState.fMatrixTm ;
846 845
847 pdfContext->fGraphicsState.fCTM = pdfContext->fGraphicsState.fMatrixTm; 846 pdfContext->fGraphicsState.fCTM = pdfContext->fGraphicsState.fMatrixTm;
848 pdfContext->fGraphicsState.fCTM.preScale(SkDoubleToScalar(1), SkDoubleToScal ar(-1)); 847 pdfContext->fGraphicsState.fCTM.preScale(SkDoubleToScalar(1), SkDoubleToScal ar(-1));
(...skipping 19 matching lines...) Expand all
868 if (tokenizer != NULL) { 867 if (tokenizer != NULL) {
869 PdfMainLooper looper(NULL, tokenizer, pdfContext, canvas); 868 PdfMainLooper looper(NULL, tokenizer, pdfContext, canvas);
870 looper.loop(); 869 looper.loop();
871 delete tokenizer; 870 delete tokenizer;
872 } 871 }
873 872
874 // TODO(edisonn): should we restore the variable stack at the same state? 873 // TODO(edisonn): should we restore the variable stack at the same state?
875 // There could be operands left, that could be consumed by a parent tokenize r when we pop. 874 // There could be operands left, that could be consumed by a parent tokenize r when we pop.
876 PdfOp_Q(pdfContext, canvas, NULL); 875 PdfOp_Q(pdfContext, canvas, NULL);
877 876
878 return kPartial_PdfResult; 877 return kPartial_SkPdfResult;
879 } 878 }
880 879
881 880
882 // TODO(edisonn): make sure the pointer is unique 881 // TODO(edisonn): make sure the pointer is unique
883 std::set<const SkPdfObject*> gInRendering; 882 std::set<const SkPdfNativeObject*> gInRendering;
884 883
885 class CheckRecursiveRendering { 884 class CheckRecursiveRendering {
886 const SkPdfObject* fUniqueData; 885 const SkPdfNativeObject* fUniqueData;
887 public: 886 public:
888 CheckRecursiveRendering(const SkPdfObject* obj) : fUniqueData(obj) { 887 CheckRecursiveRendering(const SkPdfNativeObject* obj) : fUniqueData(obj) {
889 gInRendering.insert(obj); 888 gInRendering.insert(obj);
890 } 889 }
891 890
892 ~CheckRecursiveRendering() { 891 ~CheckRecursiveRendering() {
893 //SkASSERT(fObj.fInRendering); 892 //SkASSERT(fObj.fInRendering);
894 gInRendering.erase(fUniqueData); 893 gInRendering.erase(fUniqueData);
895 } 894 }
896 895
897 static bool IsInRendering(const SkPdfObject* obj) { 896 static bool IsInRendering(const SkPdfNativeObject* obj) {
898 return gInRendering.find(obj) != gInRendering.end(); 897 return gInRendering.find(obj) != gInRendering.end();
899 } 898 }
900 }; 899 };
901 900
902 static PdfResult doXObject(PdfContext* pdfContext, SkCanvas* canvas, const SkPdf Object* obj) { 901 static SkPdfResult doXObject(SkPdfContext* pdfContext, SkCanvas* canvas, const S kPdfNativeObject* obj) {
903 if (CheckRecursiveRendering::IsInRendering(obj)) { 902 if (CheckRecursiveRendering::IsInRendering(obj)) {
904 // Oops, corrupt PDF! 903 // Oops, corrupt PDF!
905 return kIgnoreError_PdfResult; 904 return kIgnoreError_SkPdfResult;
906 } 905 }
907 906
908 CheckRecursiveRendering checkRecursion(obj); 907 CheckRecursiveRendering checkRecursion(obj);
909 908
910 switch (pdfContext->fPdfDoc->mapper()->mapXObjectDictionary(obj)) 909 switch (pdfContext->fPdfDoc->mapper()->mapXObjectDictionary(obj))
911 { 910 {
912 case kImageDictionary_SkPdfObjectType: 911 case kImageDictionary_SkPdfNativeObjectType:
913 return doXObject_Image(pdfContext, canvas, (SkPdfImageDictionary*)ob j); 912 return doXObject_Image(pdfContext, canvas, (SkPdfImageDictionary*)ob j);
914 case kType1FormDictionary_SkPdfObjectType: 913 case kType1FormDictionary_SkPdfNativeObjectType:
915 return doXObject_Form(pdfContext, canvas, (SkPdfType1FormDictionary* )obj); 914 return doXObject_Form(pdfContext, canvas, (SkPdfType1FormDictionary* )obj);
916 //case kObjectDictionaryXObjectPS_SkPdfObjectType: 915 //case kObjectDictionaryXObjectPS_SkPdfNativeObjectType:
917 //return doXObject_PS(skxobj.asPS()); 916 //return doXObject_PS(skxobj.asPS());
918 default: { 917 default: {
919 if (pdfContext->fPdfDoc->mapper()->mapType1PatternDictionary(obj) != kNone_SkPdfObjectType) { 918 if (pdfContext->fPdfDoc->mapper()->mapType1PatternDictionary(obj) != kNone_SkPdfNativeObjectType) {
920 SkPdfType1PatternDictionary* pattern = (SkPdfType1PatternDiction ary*)obj; 919 SkPdfType1PatternDictionary* pattern = (SkPdfType1PatternDiction ary*)obj;
921 return doXObject_Pattern(pdfContext, canvas, pattern); 920 return doXObject_Pattern(pdfContext, canvas, pattern);
922 } 921 }
923 } 922 }
924 } 923 }
925 return kIgnoreError_PdfResult; 924 return kIgnoreError_SkPdfResult;
926 } 925 }
927 926
928 static PdfResult doPage(PdfContext* pdfContext, SkCanvas* canvas, SkPdfPageObjec tDictionary* skobj) { 927 static SkPdfResult doPage(SkPdfContext* pdfContext, SkCanvas* canvas, SkPdfPageO bjectDictionary* skobj) {
929 if (!skobj) { 928 if (!skobj) {
930 return kIgnoreError_PdfResult; 929 return kIgnoreError_SkPdfResult;
931 } 930 }
932 931
933 if (!skobj->isContentsAStream(pdfContext->fPdfDoc)) { 932 if (!skobj->isContentsAStream(pdfContext->fPdfDoc)) {
934 return kNYI_PdfResult; 933 return kNYI_SkPdfResult;
935 } 934 }
936 935
937 SkPdfStream* stream = skobj->getContentsAsStream(pdfContext->fPdfDoc); 936 SkPdfStream* stream = skobj->getContentsAsStream(pdfContext->fPdfDoc);
938 937
939 if (!stream) { 938 if (!stream) {
940 return kIgnoreError_PdfResult; 939 return kIgnoreError_SkPdfResult;
941 } 940 }
942 941
943 if (CheckRecursiveRendering::IsInRendering(skobj)) { 942 if (CheckRecursiveRendering::IsInRendering(skobj)) {
944 // Oops, corrupt PDF! 943 // Oops, corrupt PDF!
945 return kIgnoreError_PdfResult; 944 return kIgnoreError_SkPdfResult;
946 } 945 }
947 CheckRecursiveRendering checkRecursion(skobj); 946 CheckRecursiveRendering checkRecursion(skobj);
948 947
949 948
950 PdfOp_q(pdfContext, canvas, NULL); 949 PdfOp_q(pdfContext, canvas, NULL);
951 950
952 951
953 if (skobj->Resources(pdfContext->fPdfDoc)) { 952 if (skobj->Resources(pdfContext->fPdfDoc)) {
954 pdfContext->fGraphicsState.fResources = skobj->Resources(pdfContext->fPd fDoc); 953 pdfContext->fGraphicsState.fResources = skobj->Resources(pdfContext->fPd fDoc);
955 } 954 }
(...skipping 13 matching lines...) Expand all
969 if (tokenizer != NULL) { 968 if (tokenizer != NULL) {
970 PdfMainLooper looper(NULL, tokenizer, pdfContext, canvas); 969 PdfMainLooper looper(NULL, tokenizer, pdfContext, canvas);
971 looper.loop(); 970 looper.loop();
972 delete tokenizer; 971 delete tokenizer;
973 } 972 }
974 973
975 // TODO(edisonn): should we restore the variable stack at the same state? 974 // TODO(edisonn): should we restore the variable stack at the same state?
976 // There could be operands left, that could be consumed by a parent tokenize r when we pop. 975 // There could be operands left, that could be consumed by a parent tokenize r when we pop.
977 canvas->restore(); 976 canvas->restore();
978 PdfOp_Q(pdfContext, canvas, NULL); 977 PdfOp_Q(pdfContext, canvas, NULL);
979 return kPartial_PdfResult; 978 return kPartial_SkPdfResult;
980 } 979 }
981 980
982 PdfResult PdfOp_q(PdfContext* pdfContext, SkCanvas* canvas, PdfTokenLooper** loo per) { 981 SkPdfResult PdfOp_q(SkPdfContext* pdfContext, SkCanvas* canvas, PdfTokenLooper** looper) {
983 pdfContext->fStateStack.push(pdfContext->fGraphicsState); 982 pdfContext->fStateStack.push(pdfContext->fGraphicsState);
984 canvas->save(); 983 canvas->save();
985 return kOK_PdfResult; 984 return kOK_SkPdfResult;
986 } 985 }
987 986
988 PdfResult PdfOp_Q(PdfContext* pdfContext, SkCanvas* canvas, PdfTokenLooper** loo per) { 987 SkPdfResult PdfOp_Q(SkPdfContext* pdfContext, SkCanvas* canvas, PdfTokenLooper** looper) {
989 pdfContext->fGraphicsState = pdfContext->fStateStack.top(); 988 pdfContext->fGraphicsState = pdfContext->fStateStack.top();
990 pdfContext->fStateStack.pop(); 989 pdfContext->fStateStack.pop();
991 canvas->restore(); 990 canvas->restore();
992 return kOK_PdfResult; 991 return kOK_SkPdfResult;
993 } 992 }
994 993
995 static PdfResult PdfOp_cm(PdfContext* pdfContext, SkCanvas* canvas, PdfTokenLoop er** looper) { 994 static SkPdfResult PdfOp_cm(SkPdfContext* pdfContext, SkCanvas* canvas, PdfToken Looper** looper) {
996 double array[6]; 995 double array[6];
997 for (int i = 0 ; i < 6 ; i++) { 996 for (int i = 0 ; i < 6 ; i++) {
998 array[5 - i] = pdfContext->fObjectStack.top()->numberValue(); 997 array[5 - i] = pdfContext->fObjectStack.top()->numberValue();
999 pdfContext->fObjectStack.pop(); 998 pdfContext->fObjectStack.pop();
1000 } 999 }
1001 1000
1002 // a b 1001 // a b
1003 // c d 1002 // c d
1004 // e f 1003 // e f
1005 1004
(...skipping 10 matching lines...) Expand all
1016 1015
1017 #ifdef PDF_TRACE 1016 #ifdef PDF_TRACE
1018 printf("cm "); 1017 printf("cm ");
1019 for (int i = 0 ; i < 6 ; i++) { 1018 for (int i = 0 ; i < 6 ; i++) {
1020 printf("%f ", array[i]); 1019 printf("%f ", array[i]);
1021 } 1020 }
1022 printf("\n"); 1021 printf("\n");
1023 SkTraceMatrix(pdfContext->fGraphicsState.fCTM, "cm"); 1022 SkTraceMatrix(pdfContext->fGraphicsState.fCTM, "cm");
1024 #endif 1023 #endif
1025 1024
1026 return kOK_PdfResult; 1025 return kOK_SkPdfResult;
1027 } 1026 }
1028 1027
1029 //leading TL Set the text leading, Tl 1028 //leading TL Set the text leading, Tl
1030 //, to leading, which is a number expressed in unscaled text 1029 //, to leading, which is a number expressed in unscaled text
1031 //space units. Text leading is used only by the T*, ', and " operators. Initial value: 0. 1030 //space units. Text leading is used only by the T*, ', and " operators. Initial value: 0.
1032 static PdfResult PdfOp_TL(PdfContext* pdfContext, SkCanvas* canvas, PdfTokenLoop er** looper) { 1031 static SkPdfResult PdfOp_TL(SkPdfContext* pdfContext, SkCanvas* canvas, PdfToken Looper** looper) {
1033 double ty = pdfContext->fObjectStack.top()->numberValue(); pdfContext->fOb jectStack.pop(); 1032 double ty = pdfContext->fObjectStack.top()->numberValue(); pdfContext->fOb jectStack.pop();
1034 1033
1035 pdfContext->fGraphicsState.fTextLeading = ty; 1034 pdfContext->fGraphicsState.fTextLeading = ty;
1036 1035
1037 return kOK_PdfResult; 1036 return kOK_SkPdfResult;
1038 } 1037 }
1039 1038
1040 static PdfResult PdfOp_Td(PdfContext* pdfContext, SkCanvas* canvas, PdfTokenLoop er** looper) { 1039 static SkPdfResult PdfOp_Td(SkPdfContext* pdfContext, SkCanvas* canvas, PdfToken Looper** looper) {
1041 #ifdef PDF_TRACE 1040 #ifdef PDF_TRACE
1042 printf("stack size = %i\n", (int)pdfContext->fObjectStack.size()); 1041 printf("stack size = %i\n", (int)pdfContext->fObjectStack.size());
1043 #endif 1042 #endif
1044 double ty = pdfContext->fObjectStack.top()->numberValue(); pdfContext->fObje ctStack.pop(); 1043 double ty = pdfContext->fObjectStack.top()->numberValue(); pdfContext->fObje ctStack.pop();
1045 SkPdfObject* obj = pdfContext->fObjectStack.top(); 1044 SkPdfNativeObject* obj = pdfContext->fObjectStack.top();
1046 obj = obj; 1045 obj = obj;
1047 double tx = pdfContext->fObjectStack.top()->numberValue(); pdfContext->fObje ctStack.pop(); 1046 double tx = pdfContext->fObjectStack.top()->numberValue(); pdfContext->fObje ctStack.pop();
1048 1047
1049 double array[6] = {1, 0, 0, 1, tx, -ty}; 1048 double array[6] = {1, 0, 0, 1, tx, -ty};
1050 SkMatrix matrix = SkMatrixFromPdfMatrix(array); 1049 SkMatrix matrix = SkMatrixFromPdfMatrix(array);
1051 1050
1052 pdfContext->fGraphicsState.fMatrixTm.preConcat(matrix); 1051 pdfContext->fGraphicsState.fMatrixTm.preConcat(matrix);
1053 pdfContext->fGraphicsState.fMatrixTlm.preConcat(matrix); 1052 pdfContext->fGraphicsState.fMatrixTlm.preConcat(matrix);
1054 1053
1055 return kPartial_PdfResult; 1054 return kPartial_SkPdfResult;
1056 } 1055 }
1057 1056
1058 static PdfResult PdfOp_TD(PdfContext* pdfContext, SkCanvas* canvas, PdfTokenLoop er** looper) { 1057 static SkPdfResult PdfOp_TD(SkPdfContext* pdfContext, SkCanvas* canvas, PdfToken Looper** looper) {
1059 double ty = pdfContext->fObjectStack.top()->numberValue(); pdfContext->fObje ctStack.pop(); 1058 double ty = pdfContext->fObjectStack.top()->numberValue(); pdfContext->fObje ctStack.pop();
1060 double tx = pdfContext->fObjectStack.top()->numberValue(); pdfContext->fObje ctStack.pop(); 1059 double tx = pdfContext->fObjectStack.top()->numberValue(); pdfContext->fObje ctStack.pop();
1061 1060
1062 // TODO(edisonn): Create factory methods or constructors so native is hidden 1061 // TODO(edisonn): Create factory methods or constructors so native is hidden
1063 SkPdfReal* _ty = pdfContext->fPdfDoc->createReal(-ty); 1062 SkPdfReal* _ty = pdfContext->fPdfDoc->createReal(-ty);
1064 pdfContext->fObjectStack.push(_ty); 1063 pdfContext->fObjectStack.push(_ty);
1065 1064
1066 PdfOp_TL(pdfContext, canvas, looper); 1065 PdfOp_TL(pdfContext, canvas, looper);
1067 1066
1068 SkPdfReal* vtx = pdfContext->fPdfDoc->createReal(tx); 1067 SkPdfReal* vtx = pdfContext->fPdfDoc->createReal(tx);
1069 pdfContext->fObjectStack.push(vtx); 1068 pdfContext->fObjectStack.push(vtx);
1070 1069
1071 SkPdfReal* vty = pdfContext->fPdfDoc->createReal(ty); 1070 SkPdfReal* vty = pdfContext->fPdfDoc->createReal(ty);
1072 pdfContext->fObjectStack.push(vty); 1071 pdfContext->fObjectStack.push(vty);
1073 1072
1074 PdfResult ret = PdfOp_Td(pdfContext, canvas, looper); 1073 SkPdfResult ret = PdfOp_Td(pdfContext, canvas, looper);
1075 1074
1076 // TODO(edisonn): delete all the objects after rendering was complete, in th is way pdf is rendered faster 1075 // TODO(edisonn): delete all the objects after rendering was complete, in th is way pdf is rendered faster
1077 // and the cleanup can happen while the user looks at the image 1076 // and the cleanup can happen while the user looks at the image
1078 1077
1079 return ret; 1078 return ret;
1080 } 1079 }
1081 1080
1082 static PdfResult PdfOp_Tm(PdfContext* pdfContext, SkCanvas* canvas, PdfTokenLoop er** looper) { 1081 static SkPdfResult PdfOp_Tm(SkPdfContext* pdfContext, SkCanvas* canvas, PdfToken Looper** looper) {
1083 double f = pdfContext->fObjectStack.top()->numberValue(); pdfContext->fObjec tStack.pop(); 1082 double f = pdfContext->fObjectStack.top()->numberValue(); pdfContext->fObjec tStack.pop();
1084 double e = pdfContext->fObjectStack.top()->numberValue(); pdfContext->fObjec tStack.pop(); 1083 double e = pdfContext->fObjectStack.top()->numberValue(); pdfContext->fObjec tStack.pop();
1085 double d = pdfContext->fObjectStack.top()->numberValue(); pdfContext->fObjec tStack.pop(); 1084 double d = pdfContext->fObjectStack.top()->numberValue(); pdfContext->fObjec tStack.pop();
1086 double c = pdfContext->fObjectStack.top()->numberValue(); pdfContext->fObjec tStack.pop(); 1085 double c = pdfContext->fObjectStack.top()->numberValue(); pdfContext->fObjec tStack.pop();
1087 double b = pdfContext->fObjectStack.top()->numberValue(); pdfContext->fObjec tStack.pop(); 1086 double b = pdfContext->fObjectStack.top()->numberValue(); pdfContext->fObjec tStack.pop();
1088 double a = pdfContext->fObjectStack.top()->numberValue(); pdfContext->fObjec tStack.pop(); 1087 double a = pdfContext->fObjectStack.top()->numberValue(); pdfContext->fObjec tStack.pop();
1089 1088
1090 double array[6]; 1089 double array[6];
1091 array[0] = a; 1090 array[0] = a;
1092 array[1] = b; 1091 array[1] = b;
1093 array[2] = c; 1092 array[2] = c;
1094 array[3] = d; 1093 array[3] = d;
1095 array[4] = e; 1094 array[4] = e;
1096 array[5] = f; 1095 array[5] = f;
1097 1096
1098 SkMatrix matrix = SkMatrixFromPdfMatrix(array); 1097 SkMatrix matrix = SkMatrixFromPdfMatrix(array);
1099 matrix.postConcat(pdfContext->fGraphicsState.fCTM); 1098 matrix.postConcat(pdfContext->fGraphicsState.fCTM);
1100 matrix.preScale(SkDoubleToScalar(1), SkDoubleToScalar(-1)); 1099 matrix.preScale(SkDoubleToScalar(1), SkDoubleToScalar(-1));
1101 1100
1102 // TODO(edisonn): Text positioning. 1101 // TODO(edisonn): Text positioning.
1103 pdfContext->fGraphicsState.fMatrixTm = matrix; 1102 pdfContext->fGraphicsState.fMatrixTm = matrix;
1104 pdfContext->fGraphicsState.fMatrixTlm = matrix;; 1103 pdfContext->fGraphicsState.fMatrixTlm = matrix;;
1105 1104
1106 return kPartial_PdfResult; 1105 return kPartial_SkPdfResult;
1107 } 1106 }
1108 1107
1109 //— T* Move to the start of the next line. This operator has the same effect as the code 1108 //— T* Move to the start of the next line. This operator has the same effect as the code
1110 //0 Tl Td 1109 //0 Tl Td
1111 //where Tl is the current leading parameter in the text state 1110 //where Tl is the current leading parameter in the text state
1112 static PdfResult PdfOp_T_star(PdfContext* pdfContext, SkCanvas* canvas, PdfToken Looper** looper) { 1111 static SkPdfResult PdfOp_T_star(SkPdfContext* pdfContext, SkCanvas* canvas, PdfT okenLooper** looper) {
1113 SkPdfReal* zero = pdfContext->fPdfDoc->createReal(0.0); 1112 SkPdfReal* zero = pdfContext->fPdfDoc->createReal(0.0);
1114 SkPdfReal* tl = pdfContext->fPdfDoc->createReal(pdfContext->fGraphicsState.f TextLeading); 1113 SkPdfReal* tl = pdfContext->fPdfDoc->createReal(pdfContext->fGraphicsState.f TextLeading);
1115 1114
1116 pdfContext->fObjectStack.push(zero); 1115 pdfContext->fObjectStack.push(zero);
1117 pdfContext->fObjectStack.push(tl); 1116 pdfContext->fObjectStack.push(tl);
1118 1117
1119 PdfResult ret = PdfOp_Td(pdfContext, canvas, looper); 1118 SkPdfResult ret = PdfOp_Td(pdfContext, canvas, looper);
1120 1119
1121 return ret; 1120 return ret;
1122 } 1121 }
1123 1122
1124 static PdfResult PdfOp_m(PdfContext* pdfContext, SkCanvas* canvas, PdfTokenLoope r** looper) { 1123 static SkPdfResult PdfOp_m(SkPdfContext* pdfContext, SkCanvas* canvas, PdfTokenL ooper** looper) {
1125 if (pdfContext->fGraphicsState.fPathClosed) { 1124 if (pdfContext->fGraphicsState.fPathClosed) {
1126 pdfContext->fGraphicsState.fPath.reset(); 1125 pdfContext->fGraphicsState.fPath.reset();
1127 pdfContext->fGraphicsState.fPathClosed = false; 1126 pdfContext->fGraphicsState.fPathClosed = false;
1128 } 1127 }
1129 1128
1130 pdfContext->fGraphicsState.fCurPosY = pdfContext->fObjectStack.top()->number Value(); pdfContext->fObjectStack.pop(); 1129 pdfContext->fGraphicsState.fCurPosY = pdfContext->fObjectStack.top()->number Value(); pdfContext->fObjectStack.pop();
1131 pdfContext->fGraphicsState.fCurPosX = pdfContext->fObjectStack.top()->number Value(); pdfContext->fObjectStack.pop(); 1130 pdfContext->fGraphicsState.fCurPosX = pdfContext->fObjectStack.top()->number Value(); pdfContext->fObjectStack.pop();
1132 1131
1133 pdfContext->fGraphicsState.fPath.moveTo(SkDoubleToScalar(pdfContext->fGraphi csState.fCurPosX), 1132 pdfContext->fGraphicsState.fPath.moveTo(SkDoubleToScalar(pdfContext->fGraphi csState.fCurPosX),
1134 SkDoubleToScalar(pdfContext->fGraphics State.fCurPosY)); 1133 SkDoubleToScalar(pdfContext->fGraphics State.fCurPosY));
1135 1134
1136 return kOK_PdfResult; 1135 return kOK_SkPdfResult;
1137 } 1136 }
1138 1137
1139 static PdfResult PdfOp_l(PdfContext* pdfContext, SkCanvas* canvas, PdfTokenLoope r** looper) { 1138 static SkPdfResult PdfOp_l(SkPdfContext* pdfContext, SkCanvas* canvas, PdfTokenL ooper** looper) {
1140 if (pdfContext->fGraphicsState.fPathClosed) { 1139 if (pdfContext->fGraphicsState.fPathClosed) {
1141 pdfContext->fGraphicsState.fPath.reset(); 1140 pdfContext->fGraphicsState.fPath.reset();
1142 pdfContext->fGraphicsState.fPathClosed = false; 1141 pdfContext->fGraphicsState.fPathClosed = false;
1143 } 1142 }
1144 1143
1145 pdfContext->fGraphicsState.fCurPosY = pdfContext->fObjectStack.top()->number Value(); pdfContext->fObjectStack.pop(); 1144 pdfContext->fGraphicsState.fCurPosY = pdfContext->fObjectStack.top()->number Value(); pdfContext->fObjectStack.pop();
1146 pdfContext->fGraphicsState.fCurPosX = pdfContext->fObjectStack.top()->number Value(); pdfContext->fObjectStack.pop(); 1145 pdfContext->fGraphicsState.fCurPosX = pdfContext->fObjectStack.top()->number Value(); pdfContext->fObjectStack.pop();
1147 1146
1148 pdfContext->fGraphicsState.fPath.lineTo(SkDoubleToScalar(pdfContext->fGraphi csState.fCurPosX), 1147 pdfContext->fGraphicsState.fPath.lineTo(SkDoubleToScalar(pdfContext->fGraphi csState.fCurPosX),
1149 SkDoubleToScalar(pdfContext->fGraphics State.fCurPosY)); 1148 SkDoubleToScalar(pdfContext->fGraphics State.fCurPosY));
1150 1149
1151 return kOK_PdfResult; 1150 return kOK_SkPdfResult;
1152 } 1151 }
1153 1152
1154 static PdfResult PdfOp_c(PdfContext* pdfContext, SkCanvas* canvas, PdfTokenLoope r** looper) { 1153 static SkPdfResult PdfOp_c(SkPdfContext* pdfContext, SkCanvas* canvas, PdfTokenL ooper** looper) {
1155 if (pdfContext->fGraphicsState.fPathClosed) { 1154 if (pdfContext->fGraphicsState.fPathClosed) {
1156 pdfContext->fGraphicsState.fPath.reset(); 1155 pdfContext->fGraphicsState.fPath.reset();
1157 pdfContext->fGraphicsState.fPathClosed = false; 1156 pdfContext->fGraphicsState.fPathClosed = false;
1158 } 1157 }
1159 1158
1160 double y3 = pdfContext->fObjectStack.top()->numberValue(); pdfContext->fO bjectStack.pop(); 1159 double y3 = pdfContext->fObjectStack.top()->numberValue(); pdfContext->fO bjectStack.pop();
1161 double x3 = pdfContext->fObjectStack.top()->numberValue(); pdfContext->fO bjectStack.pop(); 1160 double x3 = pdfContext->fObjectStack.top()->numberValue(); pdfContext->fO bjectStack.pop();
1162 double y2 = pdfContext->fObjectStack.top()->numberValue(); pdfContext->fO bjectStack.pop(); 1161 double y2 = pdfContext->fObjectStack.top()->numberValue(); pdfContext->fO bjectStack.pop();
1163 double x2 = pdfContext->fObjectStack.top()->numberValue(); pdfContext->fO bjectStack.pop(); 1162 double x2 = pdfContext->fObjectStack.top()->numberValue(); pdfContext->fO bjectStack.pop();
1164 double y1 = pdfContext->fObjectStack.top()->numberValue(); pdfContext->fO bjectStack.pop(); 1163 double y1 = pdfContext->fObjectStack.top()->numberValue(); pdfContext->fO bjectStack.pop();
1165 double x1 = pdfContext->fObjectStack.top()->numberValue(); pdfContext->fO bjectStack.pop(); 1164 double x1 = pdfContext->fObjectStack.top()->numberValue(); pdfContext->fO bjectStack.pop();
1166 1165
1167 pdfContext->fGraphicsState.fPath.cubicTo(SkDoubleToScalar(x1), SkDoubleToSca lar(y1), 1166 pdfContext->fGraphicsState.fPath.cubicTo(SkDoubleToScalar(x1), SkDoubleToSca lar(y1),
1168 SkDoubleToScalar(x2), SkDoubleToScal ar(y2), 1167 SkDoubleToScalar(x2), SkDoubleToScal ar(y2),
1169 SkDoubleToScalar(x3), SkDoubleToScal ar(y3)); 1168 SkDoubleToScalar(x3), SkDoubleToScal ar(y3));
1170 1169
1171 pdfContext->fGraphicsState.fCurPosX = x3; 1170 pdfContext->fGraphicsState.fCurPosX = x3;
1172 pdfContext->fGraphicsState.fCurPosY = y3; 1171 pdfContext->fGraphicsState.fCurPosY = y3;
1173 1172
1174 return kOK_PdfResult; 1173 return kOK_SkPdfResult;
1175 } 1174 }
1176 1175
1177 static PdfResult PdfOp_v(PdfContext* pdfContext, SkCanvas* canvas, PdfTokenLoope r** looper) { 1176 static SkPdfResult PdfOp_v(SkPdfContext* pdfContext, SkCanvas* canvas, PdfTokenL ooper** looper) {
1178 if (pdfContext->fGraphicsState.fPathClosed) { 1177 if (pdfContext->fGraphicsState.fPathClosed) {
1179 pdfContext->fGraphicsState.fPath.reset(); 1178 pdfContext->fGraphicsState.fPath.reset();
1180 pdfContext->fGraphicsState.fPathClosed = false; 1179 pdfContext->fGraphicsState.fPathClosed = false;
1181 } 1180 }
1182 1181
1183 double y3 = pdfContext->fObjectStack.top()->numberValue(); pdfContext->fO bjectStack.pop(); 1182 double y3 = pdfContext->fObjectStack.top()->numberValue(); pdfContext->fO bjectStack.pop();
1184 double x3 = pdfContext->fObjectStack.top()->numberValue(); pdfContext->fO bjectStack.pop(); 1183 double x3 = pdfContext->fObjectStack.top()->numberValue(); pdfContext->fO bjectStack.pop();
1185 double y2 = pdfContext->fObjectStack.top()->numberValue(); pdfContext->fO bjectStack.pop(); 1184 double y2 = pdfContext->fObjectStack.top()->numberValue(); pdfContext->fO bjectStack.pop();
1186 double x2 = pdfContext->fObjectStack.top()->numberValue(); pdfContext->fO bjectStack.pop(); 1185 double x2 = pdfContext->fObjectStack.top()->numberValue(); pdfContext->fO bjectStack.pop();
1187 double y1 = pdfContext->fGraphicsState.fCurPosY; 1186 double y1 = pdfContext->fGraphicsState.fCurPosY;
1188 double x1 = pdfContext->fGraphicsState.fCurPosX; 1187 double x1 = pdfContext->fGraphicsState.fCurPosX;
1189 1188
1190 pdfContext->fGraphicsState.fPath.cubicTo(SkDoubleToScalar(x1), SkDoubleToSca lar(y1), 1189 pdfContext->fGraphicsState.fPath.cubicTo(SkDoubleToScalar(x1), SkDoubleToSca lar(y1),
1191 SkDoubleToScalar(x2), SkDoubleToScal ar(y2), 1190 SkDoubleToScalar(x2), SkDoubleToScal ar(y2),
1192 SkDoubleToScalar(x3), SkDoubleToScal ar(y3)); 1191 SkDoubleToScalar(x3), SkDoubleToScal ar(y3));
1193 1192
1194 pdfContext->fGraphicsState.fCurPosX = x3; 1193 pdfContext->fGraphicsState.fCurPosX = x3;
1195 pdfContext->fGraphicsState.fCurPosY = y3; 1194 pdfContext->fGraphicsState.fCurPosY = y3;
1196 1195
1197 return kOK_PdfResult; 1196 return kOK_SkPdfResult;
1198 } 1197 }
1199 1198
1200 static PdfResult PdfOp_y(PdfContext* pdfContext, SkCanvas* canvas, PdfTokenLoope r** looper) { 1199 static SkPdfResult PdfOp_y(SkPdfContext* pdfContext, SkCanvas* canvas, PdfTokenL ooper** looper) {
1201 if (pdfContext->fGraphicsState.fPathClosed) { 1200 if (pdfContext->fGraphicsState.fPathClosed) {
1202 pdfContext->fGraphicsState.fPath.reset(); 1201 pdfContext->fGraphicsState.fPath.reset();
1203 pdfContext->fGraphicsState.fPathClosed = false; 1202 pdfContext->fGraphicsState.fPathClosed = false;
1204 } 1203 }
1205 1204
1206 double y3 = pdfContext->fObjectStack.top()->numberValue(); pdfContext->fO bjectStack.pop(); 1205 double y3 = pdfContext->fObjectStack.top()->numberValue(); pdfContext->fO bjectStack.pop();
1207 double x3 = pdfContext->fObjectStack.top()->numberValue(); pdfContext->fO bjectStack.pop(); 1206 double x3 = pdfContext->fObjectStack.top()->numberValue(); pdfContext->fO bjectStack.pop();
1208 double y2 = pdfContext->fGraphicsState.fCurPosY; 1207 double y2 = pdfContext->fGraphicsState.fCurPosY;
1209 double x2 = pdfContext->fGraphicsState.fCurPosX; 1208 double x2 = pdfContext->fGraphicsState.fCurPosX;
1210 double y1 = pdfContext->fObjectStack.top()->numberValue(); pdfContext->fO bjectStack.pop(); 1209 double y1 = pdfContext->fObjectStack.top()->numberValue(); pdfContext->fO bjectStack.pop();
1211 double x1 = pdfContext->fObjectStack.top()->numberValue(); pdfContext->fO bjectStack.pop(); 1210 double x1 = pdfContext->fObjectStack.top()->numberValue(); pdfContext->fO bjectStack.pop();
1212 1211
1213 pdfContext->fGraphicsState.fPath.cubicTo(SkDoubleToScalar(x1), SkDoubleToSca lar(y1), 1212 pdfContext->fGraphicsState.fPath.cubicTo(SkDoubleToScalar(x1), SkDoubleToSca lar(y1),
1214 SkDoubleToScalar(x2), SkDoubleToScal ar(y2), 1213 SkDoubleToScalar(x2), SkDoubleToScal ar(y2),
1215 SkDoubleToScalar(x3), SkDoubleToScal ar(y3)); 1214 SkDoubleToScalar(x3), SkDoubleToScal ar(y3));
1216 1215
1217 pdfContext->fGraphicsState.fCurPosX = x3; 1216 pdfContext->fGraphicsState.fCurPosX = x3;
1218 pdfContext->fGraphicsState.fCurPosY = y3; 1217 pdfContext->fGraphicsState.fCurPosY = y3;
1219 1218
1220 return kOK_PdfResult; 1219 return kOK_SkPdfResult;
1221 } 1220 }
1222 1221
1223 static PdfResult PdfOp_re(PdfContext* pdfContext, SkCanvas* canvas, PdfTokenLoop er** looper) { 1222 static SkPdfResult PdfOp_re(SkPdfContext* pdfContext, SkCanvas* canvas, PdfToken Looper** looper) {
1224 if (pdfContext->fGraphicsState.fPathClosed) { 1223 if (pdfContext->fGraphicsState.fPathClosed) {
1225 pdfContext->fGraphicsState.fPath.reset(); 1224 pdfContext->fGraphicsState.fPath.reset();
1226 pdfContext->fGraphicsState.fPathClosed = false; 1225 pdfContext->fGraphicsState.fPathClosed = false;
1227 } 1226 }
1228 1227
1229 double height = pdfContext->fObjectStack.top()->numberValue(); pdfConte xt->fObjectStack.pop(); 1228 double height = pdfContext->fObjectStack.top()->numberValue(); pdfConte xt->fObjectStack.pop();
1230 double width = pdfContext->fObjectStack.top()->numberValue(); pdfConte xt->fObjectStack.pop(); 1229 double width = pdfContext->fObjectStack.top()->numberValue(); pdfConte xt->fObjectStack.pop();
1231 double y = pdfContext->fObjectStack.top()->numberValue(); pdfConte xt->fObjectStack.pop(); 1230 double y = pdfContext->fObjectStack.top()->numberValue(); pdfConte xt->fObjectStack.pop();
1232 double x = pdfContext->fObjectStack.top()->numberValue(); pdfConte xt->fObjectStack.pop(); 1231 double x = pdfContext->fObjectStack.top()->numberValue(); pdfConte xt->fObjectStack.pop();
1233 1232
1234 pdfContext->fGraphicsState.fPath.addRect(SkDoubleToScalar(x), SkDoubleToScal ar(y), 1233 pdfContext->fGraphicsState.fPath.addRect(SkDoubleToScalar(x), SkDoubleToScal ar(y),
1235 SkDoubleToScalar(x + width), SkDouble ToScalar(y + height)); 1234 SkDoubleToScalar(x + width), SkDouble ToScalar(y + height));
1236 1235
1237 pdfContext->fGraphicsState.fCurPosX = x; 1236 pdfContext->fGraphicsState.fCurPosX = x;
1238 pdfContext->fGraphicsState.fCurPosY = y + height; 1237 pdfContext->fGraphicsState.fCurPosY = y + height;
1239 1238
1240 return kOK_PdfResult; 1239 return kOK_SkPdfResult;
1241 } 1240 }
1242 1241
1243 static PdfResult PdfOp_h(PdfContext* pdfContext, SkCanvas* canvas, PdfTokenLoope r** looper) { 1242 static SkPdfResult PdfOp_h(SkPdfContext* pdfContext, SkCanvas* canvas, PdfTokenL ooper** looper) {
1244 pdfContext->fGraphicsState.fPath.close(); 1243 pdfContext->fGraphicsState.fPath.close();
1245 return kOK_PdfResult; 1244 return kOK_SkPdfResult;
1246 } 1245 }
1247 1246
1248 static PdfResult PdfOp_fillAndStroke(PdfContext* pdfContext, SkCanvas* canvas, b ool fill, bool stroke, bool close, bool evenOdd) { 1247 static SkPdfResult PdfOp_fillAndStroke(SkPdfContext* pdfContext, SkCanvas* canva s, bool fill, bool stroke, bool close, bool evenOdd) {
1249 SkPath path = pdfContext->fGraphicsState.fPath; 1248 SkPath path = pdfContext->fGraphicsState.fPath;
1250 1249
1251 if (close) { 1250 if (close) {
1252 path.close(); 1251 path.close();
1253 } 1252 }
1254 1253
1255 canvas->setMatrix(pdfContext->fGraphicsState.fCTM); 1254 canvas->setMatrix(pdfContext->fGraphicsState.fCTM);
1256 1255
1257 SkPaint paint; 1256 SkPaint paint;
1258 1257
(...skipping 14 matching lines...) Expand all
1273 // TODO(edisonn): we can use a shader here, like imageshader to draw fast. ultimately, 1272 // TODO(edisonn): we can use a shader here, like imageshader to draw fast. ultimately,
1274 // if this is not possible, and we are in rasper mode, and the c ells don't intersect, we could even have multiple cpus. 1273 // if this is not possible, and we are in rasper mode, and the c ells don't intersect, we could even have multiple cpus.
1275 1274
1276 PdfOp_q(pdfContext, canvas, NULL); 1275 PdfOp_q(pdfContext, canvas, NULL);
1277 1276
1278 if (evenOdd) { 1277 if (evenOdd) {
1279 path.setFillType(SkPath::kEvenOdd_FillType); 1278 path.setFillType(SkPath::kEvenOdd_FillType);
1280 } 1279 }
1281 canvas->clipPath(path); 1280 canvas->clipPath(path);
1282 1281
1283 if (pdfContext->fPdfDoc->mapper()->mapType1PatternDictionary(pdf Context->fGraphicsState.fNonStroking.fPattern) != kNone_SkPdfObjectType) { 1282 if (pdfContext->fPdfDoc->mapper()->mapType1PatternDictionary(pdf Context->fGraphicsState.fNonStroking.fPattern) != kNone_SkPdfNativeObjectType) {
1284 SkPdfType1PatternDictionary* pattern = (SkPdfType1PatternDic tionary*)pdfContext->fGraphicsState.fNonStroking.fPattern; 1283 SkPdfType1PatternDictionary* pattern = (SkPdfType1PatternDic tionary*)pdfContext->fGraphicsState.fNonStroking.fPattern;
1285 1284
1286 // TODO(edisonn): constants 1285 // TODO(edisonn): constants
1287 // TODO(edisonn): colored 1286 // TODO(edisonn): colored
1288 if (pattern->PaintType(pdfContext->fPdfDoc) == 1) { 1287 if (pattern->PaintType(pdfContext->fPdfDoc) == 1) {
1289 // TODO(edisonn): don't use abs, iterate as asked, if th e cells intersect 1288 // TODO(edisonn): don't use abs, iterate as asked, if th e cells intersect
1290 // it will change the result iterating in reverse 1289 // it will change the result iterating in reverse
1291 int xStep = abs((int)pattern->XStep(pdfContext->fPdfDoc) ); 1290 int xStep = abs((int)pattern->XStep(pdfContext->fPdfDoc) );
1292 int yStep = abs((int)pattern->YStep(pdfContext->fPdfDoc) ); 1291 int yStep = abs((int)pattern->YStep(pdfContext->fPdfDoc) );
1293 1292
(...skipping 71 matching lines...) Expand 10 before | Expand all | Expand 10 after
1365 1364
1366 if (pdfContext->fGraphicsState.fHasClipPathToApply) { 1365 if (pdfContext->fGraphicsState.fHasClipPathToApply) {
1367 #ifndef PDF_DEBUG_NO_CLIPING 1366 #ifndef PDF_DEBUG_NO_CLIPING
1368 canvas->clipPath(pdfContext->fGraphicsState.fClipPath, SkRegion::kInters ect_Op, true); 1367 canvas->clipPath(pdfContext->fGraphicsState.fClipPath, SkRegion::kInters ect_Op, true);
1369 #endif 1368 #endif
1370 } 1369 }
1371 1370
1372 //pdfContext->fGraphicsState.fClipPath.reset(); 1371 //pdfContext->fGraphicsState.fClipPath.reset();
1373 pdfContext->fGraphicsState.fHasClipPathToApply = false; 1372 pdfContext->fGraphicsState.fHasClipPathToApply = false;
1374 1373
1375 return kOK_PdfResult; 1374 return kOK_SkPdfResult;
1376 1375
1377 } 1376 }
1378 1377
1379 static PdfResult PdfOp_S(PdfContext* pdfContext, SkCanvas* canvas, PdfTokenLoope r** looper) { 1378 static SkPdfResult PdfOp_S(SkPdfContext* pdfContext, SkCanvas* canvas, PdfTokenL ooper** looper) {
1380 return PdfOp_fillAndStroke(pdfContext, canvas, false, true, false, false); 1379 return PdfOp_fillAndStroke(pdfContext, canvas, false, true, false, false);
1381 } 1380 }
1382 1381
1383 static PdfResult PdfOp_s(PdfContext* pdfContext, SkCanvas* canvas, PdfTokenLoope r** looper) { 1382 static SkPdfResult PdfOp_s(SkPdfContext* pdfContext, SkCanvas* canvas, PdfTokenL ooper** looper) {
1384 return PdfOp_fillAndStroke(pdfContext, canvas, false, true, true, false); 1383 return PdfOp_fillAndStroke(pdfContext, canvas, false, true, true, false);
1385 } 1384 }
1386 1385
1387 static PdfResult PdfOp_F(PdfContext* pdfContext, SkCanvas* canvas, PdfTokenLoope r** looper) { 1386 static SkPdfResult PdfOp_F(SkPdfContext* pdfContext, SkCanvas* canvas, PdfTokenL ooper** looper) {
1388 return PdfOp_fillAndStroke(pdfContext, canvas, true, false, false, false); 1387 return PdfOp_fillAndStroke(pdfContext, canvas, true, false, false, false);
1389 } 1388 }
1390 1389
1391 static PdfResult PdfOp_f(PdfContext* pdfContext, SkCanvas* canvas, PdfTokenLoope r** looper) { 1390 static SkPdfResult PdfOp_f(SkPdfContext* pdfContext, SkCanvas* canvas, PdfTokenL ooper** looper) {
1392 return PdfOp_fillAndStroke(pdfContext, canvas, true, false, false, false); 1391 return PdfOp_fillAndStroke(pdfContext, canvas, true, false, false, false);
1393 } 1392 }
1394 1393
1395 static PdfResult PdfOp_f_star(PdfContext* pdfContext, SkCanvas* canvas, PdfToken Looper** looper) { 1394 static SkPdfResult PdfOp_f_star(SkPdfContext* pdfContext, SkCanvas* canvas, PdfT okenLooper** looper) {
1396 return PdfOp_fillAndStroke(pdfContext, canvas, true, false, false, true); 1395 return PdfOp_fillAndStroke(pdfContext, canvas, true, false, false, true);
1397 } 1396 }
1398 1397
1399 static PdfResult PdfOp_B(PdfContext* pdfContext, SkCanvas* canvas, PdfTokenLoope r** looper) { 1398 static SkPdfResult PdfOp_B(SkPdfContext* pdfContext, SkCanvas* canvas, PdfTokenL ooper** looper) {
1400 return PdfOp_fillAndStroke(pdfContext, canvas, true, true, false, false); 1399 return PdfOp_fillAndStroke(pdfContext, canvas, true, true, false, false);
1401 } 1400 }
1402 1401
1403 static PdfResult PdfOp_B_star(PdfContext* pdfContext, SkCanvas* canvas, PdfToken Looper** looper) { 1402 static SkPdfResult PdfOp_B_star(SkPdfContext* pdfContext, SkCanvas* canvas, PdfT okenLooper** looper) {
1404 return PdfOp_fillAndStroke(pdfContext, canvas, true, true, false, true); 1403 return PdfOp_fillAndStroke(pdfContext, canvas, true, true, false, true);
1405 } 1404 }
1406 1405
1407 static PdfResult PdfOp_b(PdfContext* pdfContext, SkCanvas* canvas, PdfTokenLoope r** looper) { 1406 static SkPdfResult PdfOp_b(SkPdfContext* pdfContext, SkCanvas* canvas, PdfTokenL ooper** looper) {
1408 return PdfOp_fillAndStroke(pdfContext, canvas, true, true, true, false); 1407 return PdfOp_fillAndStroke(pdfContext, canvas, true, true, true, false);
1409 } 1408 }
1410 1409
1411 static PdfResult PdfOp_b_star(PdfContext* pdfContext, SkCanvas* canvas, PdfToken Looper** looper) { 1410 static SkPdfResult PdfOp_b_star(SkPdfContext* pdfContext, SkCanvas* canvas, PdfT okenLooper** looper) {
1412 return PdfOp_fillAndStroke(pdfContext, canvas, true, true, true, true); 1411 return PdfOp_fillAndStroke(pdfContext, canvas, true, true, true, true);
1413 } 1412 }
1414 1413
1415 static PdfResult PdfOp_n(PdfContext* pdfContext, SkCanvas* canvas, PdfTokenLoope r** looper) { 1414 static SkPdfResult PdfOp_n(SkPdfContext* pdfContext, SkCanvas* canvas, PdfTokenL ooper** looper) {
1416 canvas->setMatrix(pdfContext->fGraphicsState.fCTM); 1415 canvas->setMatrix(pdfContext->fGraphicsState.fCTM);
1417 if (pdfContext->fGraphicsState.fHasClipPathToApply) { 1416 if (pdfContext->fGraphicsState.fHasClipPathToApply) {
1418 #ifndef PDF_DEBUG_NO_CLIPING 1417 #ifndef PDF_DEBUG_NO_CLIPING
1419 canvas->clipPath(pdfContext->fGraphicsState.fClipPath, SkRegion::kInters ect_Op, true); 1418 canvas->clipPath(pdfContext->fGraphicsState.fClipPath, SkRegion::kInters ect_Op, true);
1420 #endif 1419 #endif
1421 } 1420 }
1422 1421
1423 //pdfContext->fGraphicsState.fClipPath.reset(); 1422 //pdfContext->fGraphicsState.fClipPath.reset();
1424 pdfContext->fGraphicsState.fHasClipPathToApply = false; 1423 pdfContext->fGraphicsState.fHasClipPathToApply = false;
1425 1424
1426 pdfContext->fGraphicsState.fPathClosed = true; 1425 pdfContext->fGraphicsState.fPathClosed = true;
1427 1426
1428 return kOK_PdfResult; 1427 return kOK_SkPdfResult;
1429 } 1428 }
1430 1429
1431 static PdfResult PdfOp_BT(PdfContext* pdfContext, SkCanvas* canvas, PdfTokenLoop er** looper) { 1430 static SkPdfResult PdfOp_BT(SkPdfContext* pdfContext, SkCanvas* canvas, PdfToken Looper** looper) {
1432 pdfContext->fGraphicsState.fTextBlock = true; 1431 pdfContext->fGraphicsState.fTextBlock = true;
1433 SkMatrix matrix = pdfContext->fGraphicsState.fCTM; 1432 SkMatrix matrix = pdfContext->fGraphicsState.fCTM;
1434 matrix.preScale(SkDoubleToScalar(1), SkDoubleToScalar(-1)); 1433 matrix.preScale(SkDoubleToScalar(1), SkDoubleToScalar(-1));
1435 pdfContext->fGraphicsState.fMatrixTm = matrix; 1434 pdfContext->fGraphicsState.fMatrixTm = matrix;
1436 pdfContext->fGraphicsState.fMatrixTlm = matrix; 1435 pdfContext->fGraphicsState.fMatrixTlm = matrix;
1437 1436
1438 return kPartial_PdfResult; 1437 return kPartial_SkPdfResult;
1439 } 1438 }
1440 1439
1441 static PdfResult PdfOp_ET(PdfContext* pdfContext, SkCanvas* canvas, PdfTokenLoop er** looper) { 1440 static SkPdfResult PdfOp_ET(SkPdfContext* pdfContext, SkCanvas* canvas, PdfToken Looper** looper) {
1442 if (!pdfContext->fGraphicsState.fTextBlock) { 1441 if (!pdfContext->fGraphicsState.fTextBlock) {
1443 return kIgnoreError_PdfResult; 1442 return kIgnoreError_SkPdfResult;
1444 } 1443 }
1445 // TODO(edisonn): anything else to be done once we are done with draw text? Like restore stack? 1444 // TODO(edisonn): anything else to be done once we are done with draw text? Like restore stack?
1446 return kOK_PdfResult; 1445 return kOK_SkPdfResult;
1447 } 1446 }
1448 1447
1449 PdfResult skpdfGraphicsStateApplyFontCore(PdfContext* pdfContext, const SkPdfObj ect* fontName, double fontSize) { 1448 SkPdfResult skpdfGraphicsStateApplyFontCore(SkPdfContext* pdfContext, const SkPd fNativeObject* fontName, double fontSize) {
1450 #ifdef PDF_TRACE 1449 #ifdef PDF_TRACE
1451 printf("font name: %s\n", fontName->nameValue2().c_str()); 1450 printf("font name: %s\n", fontName->nameValue2().c_str());
1452 #endif 1451 #endif
1453 1452
1454 if (!pdfContext->fGraphicsState.fResources->Font(pdfContext->fPdfDoc)) { 1453 if (!pdfContext->fGraphicsState.fResources->Font(pdfContext->fPdfDoc)) {
1455 // TODO(edisonn): try to recover and draw it any way? 1454 // TODO(edisonn): try to recover and draw it any way?
1456 return kIgnoreError_PdfResult; 1455 return kIgnoreError_SkPdfResult;
1457 } 1456 }
1458 1457
1459 SkPdfObject* objFont = pdfContext->fGraphicsState.fResources->Font(pdfContex t->fPdfDoc)->get(fontName); 1458 SkPdfNativeObject* objFont = pdfContext->fGraphicsState.fResources->Font(pdf Context->fPdfDoc)->get(fontName);
1460 objFont = pdfContext->fPdfDoc->resolveReference(objFont); 1459 objFont = pdfContext->fPdfDoc->resolveReference(objFont);
1461 if (kNone_SkPdfObjectType == pdfContext->fPdfDoc->mapper()->mapFontDictionar y(objFont)) { 1460 if (kNone_SkPdfNativeObjectType == pdfContext->fPdfDoc->mapper()->mapFontDic tionary(objFont)) {
1462 // TODO(edisonn): try to recover and draw it any way? 1461 // TODO(edisonn): try to recover and draw it any way?
1463 return kIgnoreError_PdfResult; 1462 return kIgnoreError_SkPdfResult;
1464 } 1463 }
1465 1464
1466 SkPdfFontDictionary* fd = (SkPdfFontDictionary*)objFont; 1465 SkPdfFontDictionary* fd = (SkPdfFontDictionary*)objFont;
1467 1466
1468 SkPdfFont* skfont = SkPdfFont::fontFromPdfDictionary(pdfContext->fPdfDoc, fd ); 1467 SkPdfFont* skfont = SkPdfFont::fontFromPdfDictionary(pdfContext->fPdfDoc, fd );
1469 1468
1470 if (skfont) { 1469 if (skfont) {
1471 pdfContext->fGraphicsState.fSkFont = skfont; 1470 pdfContext->fGraphicsState.fSkFont = skfont;
1472 } 1471 }
1473 pdfContext->fGraphicsState.fCurFontSize = fontSize; 1472 pdfContext->fGraphicsState.fCurFontSize = fontSize;
1474 return kOK_PdfResult; 1473 return kOK_SkPdfResult;
1475 } 1474 }
1476 1475
1477 //font size Tf Set the text font, Tf 1476 //font size Tf Set the text font, Tf
1478 //, to font and the text font size, Tfs, to size. font is the name of a 1477 //, to font and the text font size, Tfs, to size. font is the name of a
1479 //font resource in the Fontsubdictionary of the current resource dictionary; siz e is 1478 //font resource in the Fontsubdictionary of the current resource dictionary; siz e is
1480 //a number representing a scale factor. There is no initial value for either fon t or 1479 //a number representing a scale factor. There is no initial value for either fon t or
1481 //size; they must be specified explicitly using Tf before any text is shown. 1480 //size; they must be specified explicitly using Tf before any text is shown.
1482 static PdfResult PdfOp_Tf(PdfContext* pdfContext, SkCanvas* canvas, PdfTokenLoop er** looper) { 1481 static SkPdfResult PdfOp_Tf(SkPdfContext* pdfContext, SkCanvas* canvas, PdfToken Looper** looper) {
1483 double fontSize = pdfContext->fObjectStack.top()->numberValue(); pdfCont ext->fObjectStack.pop(); 1482 double fontSize = pdfContext->fObjectStack.top()->numberValue(); pdfCont ext->fObjectStack.pop();
1484 SkPdfObject* fontName = pdfContext->fObjectStack.top(); pdfContext->fObjectStack.pop(); 1483 SkPdfNativeObject* fontName = pdfContext->fObjectStack.top(); pdfContext->fObjectStack.pop();
1485 return skpdfGraphicsStateApplyFontCore(pdfContext, fontName, fontSize); 1484 return skpdfGraphicsStateApplyFontCore(pdfContext, fontName, fontSize);
1486 } 1485 }
1487 1486
1488 static PdfResult PdfOp_Tj(PdfContext* pdfContext, SkCanvas* canvas, PdfTokenLoop er** looper) { 1487 static SkPdfResult PdfOp_Tj(SkPdfContext* pdfContext, SkCanvas* canvas, PdfToken Looper** looper) {
1489 if (!pdfContext->fGraphicsState.fTextBlock) { 1488 if (!pdfContext->fGraphicsState.fTextBlock) {
1490 // TODO(edisonn): try to recover and draw it any way? 1489 // TODO(edisonn): try to recover and draw it any way?
1491 return kIgnoreError_PdfResult; 1490 return kIgnoreError_SkPdfResult;
1492 } 1491 }
1493 1492
1494 PdfResult ret = DrawText(pdfContext, 1493 SkPdfResult ret = DrawText(pdfContext,
1495 pdfContext->fObjectStack.top(), 1494 pdfContext->fObjectStack.top(),
1496 canvas); 1495 canvas);
1497 pdfContext->fObjectStack.pop(); 1496 pdfContext->fObjectStack.pop();
1498 1497
1499 return ret; 1498 return ret;
1500 } 1499 }
1501 1500
1502 static PdfResult PdfOp_quote(PdfContext* pdfContext, SkCanvas* canvas, PdfTokenL ooper** looper) { 1501 static SkPdfResult PdfOp_quote(SkPdfContext* pdfContext, SkCanvas* canvas, PdfTo kenLooper** looper) {
1503 if (!pdfContext->fGraphicsState.fTextBlock) { 1502 if (!pdfContext->fGraphicsState.fTextBlock) {
1504 // TODO(edisonn): try to recover and draw it any way? 1503 // TODO(edisonn): try to recover and draw it any way?
1505 return kIgnoreError_PdfResult; 1504 return kIgnoreError_SkPdfResult;
1506 } 1505 }
1507 1506
1508 PdfOp_T_star(pdfContext, canvas, looper); 1507 PdfOp_T_star(pdfContext, canvas, looper);
1509 // Do not pop, and push, just transfer the param to Tj 1508 // Do not pop, and push, just transfer the param to Tj
1510 return PdfOp_Tj(pdfContext, canvas, looper); 1509 return PdfOp_Tj(pdfContext, canvas, looper);
1511 } 1510 }
1512 1511
1513 static PdfResult PdfOp_doublequote(PdfContext* pdfContext, SkCanvas* canvas, Pdf TokenLooper** looper) { 1512 static SkPdfResult PdfOp_doublequote(SkPdfContext* pdfContext, SkCanvas* canvas, PdfTokenLooper** looper) {
1514 if (!pdfContext->fGraphicsState.fTextBlock) { 1513 if (!pdfContext->fGraphicsState.fTextBlock) {
1515 // TODO(edisonn): try to recover and draw it any way? 1514 // TODO(edisonn): try to recover and draw it any way?
1516 return kIgnoreError_PdfResult; 1515 return kIgnoreError_SkPdfResult;
1517 } 1516 }
1518 1517
1519 SkPdfObject* str = pdfContext->fObjectStack.top(); pdfContext->fObject Stack.pop(); 1518 SkPdfNativeObject* str = pdfContext->fObjectStack.top(); pdfContext->f ObjectStack.pop();
1520 SkPdfObject* ac = pdfContext->fObjectStack.top(); pdfContext->fObject Stack.pop(); 1519 SkPdfNativeObject* ac = pdfContext->fObjectStack.top(); pdfContext->f ObjectStack.pop();
1521 SkPdfObject* aw = pdfContext->fObjectStack.top(); pdfContext->fObject Stack.pop(); 1520 SkPdfNativeObject* aw = pdfContext->fObjectStack.top(); pdfContext->f ObjectStack.pop();
1522 1521
1523 pdfContext->fObjectStack.push(aw); 1522 pdfContext->fObjectStack.push(aw);
1524 PdfOp_Tw(pdfContext, canvas, looper); 1523 PdfOp_Tw(pdfContext, canvas, looper);
1525 1524
1526 pdfContext->fObjectStack.push(ac); 1525 pdfContext->fObjectStack.push(ac);
1527 PdfOp_Tc(pdfContext, canvas, looper); 1526 PdfOp_Tc(pdfContext, canvas, looper);
1528 1527
1529 pdfContext->fObjectStack.push(str); 1528 pdfContext->fObjectStack.push(str);
1530 PdfOp_quote(pdfContext, canvas, looper); 1529 PdfOp_quote(pdfContext, canvas, looper);
1531 1530
1532 return kPartial_PdfResult; 1531 return kPartial_SkPdfResult;
1533 } 1532 }
1534 1533
1535 static PdfResult PdfOp_TJ(PdfContext* pdfContext, SkCanvas* canvas, PdfTokenLoop er** looper) { 1534 static SkPdfResult PdfOp_TJ(SkPdfContext* pdfContext, SkCanvas* canvas, PdfToken Looper** looper) {
1536 if (!pdfContext->fGraphicsState.fTextBlock) { 1535 if (!pdfContext->fGraphicsState.fTextBlock) {
1537 // TODO(edisonn): try to recover and draw it any way? 1536 // TODO(edisonn): try to recover and draw it any way?
1538 return kIgnoreError_PdfResult; 1537 return kIgnoreError_SkPdfResult;
1539 } 1538 }
1540 1539
1541 SkPdfArray* array = (SkPdfArray*)pdfContext->fObjectStack.top(); 1540 SkPdfArray* array = (SkPdfArray*)pdfContext->fObjectStack.top();
1542 pdfContext->fObjectStack.pop(); 1541 pdfContext->fObjectStack.pop();
1543 1542
1544 if (!array->isArray()) { 1543 if (!array->isArray()) {
1545 return kIgnoreError_PdfResult; 1544 return kIgnoreError_SkPdfResult;
1546 } 1545 }
1547 1546
1548 for( int i=0; i<static_cast<int>(array->size()); i++ ) 1547 for( int i=0; i<static_cast<int>(array->size()); i++ )
1549 { 1548 {
1550 if( (*array)[i]->isAnyString()) { 1549 if( (*array)[i]->isAnyString()) {
1551 SkPdfObject* obj = (*array)[i]; 1550 SkPdfNativeObject* obj = (*array)[i];
1552 DrawText(pdfContext, 1551 DrawText(pdfContext,
1553 obj, 1552 obj,
1554 canvas); 1553 canvas);
1555 } else if ((*array)[i]->isNumber()) { 1554 } else if ((*array)[i]->isNumber()) {
1556 double dx = (*array)[i]->numberValue(); 1555 double dx = (*array)[i]->numberValue();
1557 SkMatrix matrix; 1556 SkMatrix matrix;
1558 matrix.setAll(SkDoubleToScalar(1), 1557 matrix.setAll(SkDoubleToScalar(1),
1559 SkDoubleToScalar(0), 1558 SkDoubleToScalar(0),
1560 // TODO(edisonn): use writing mode, vertical/horizonta l. 1559 // TODO(edisonn): use writing mode, vertical/horizonta l.
1561 SkDoubleToScalar(-dx), // amount is substracted!!! 1560 SkDoubleToScalar(-dx), // amount is substracted!!!
1562 SkDoubleToScalar(0), 1561 SkDoubleToScalar(0),
1563 SkDoubleToScalar(1), 1562 SkDoubleToScalar(1),
1564 SkDoubleToScalar(0), 1563 SkDoubleToScalar(0),
1565 SkDoubleToScalar(0), 1564 SkDoubleToScalar(0),
1566 SkDoubleToScalar(0), 1565 SkDoubleToScalar(0),
1567 SkDoubleToScalar(1)); 1566 SkDoubleToScalar(1));
1568 1567
1569 pdfContext->fGraphicsState.fMatrixTm.preConcat(matrix); 1568 pdfContext->fGraphicsState.fMatrixTm.preConcat(matrix);
1570 } 1569 }
1571 } 1570 }
1572 return kPartial_PdfResult; // TODO(edisonn): Implement fully DrawText befor e returing OK. 1571 return kPartial_SkPdfResult; // TODO(edisonn): Implement fully DrawText bef ore returing OK.
1573 } 1572 }
1574 1573
1575 static PdfResult PdfOp_CS_cs(PdfContext* pdfContext, SkCanvas* canvas, SkPdfColo rOperator* colorOperator) { 1574 static SkPdfResult PdfOp_CS_cs(SkPdfContext* pdfContext, SkCanvas* canvas, SkPdf ColorOperator* colorOperator) {
1576 SkPdfObject* name = pdfContext->fObjectStack.top(); pdfContext->fObjectSt ack.pop(); 1575 SkPdfNativeObject* name = pdfContext->fObjectStack.top(); pdfContext->fOb jectStack.pop();
1577 1576
1578 //Next, get the ColorSpace Dictionary from the Resource Dictionary: 1577 //Next, get the ColorSpace Dictionary from the Resource Dictionary:
1579 SkPdfDictionary* colorSpaceResource = pdfContext->fGraphicsState.fResources- >ColorSpace(pdfContext->fPdfDoc); 1578 SkPdfDictionary* colorSpaceResource = pdfContext->fGraphicsState.fResources- >ColorSpace(pdfContext->fPdfDoc);
1580 1579
1581 SkPdfObject* colorSpace = colorSpaceResource ? pdfContext->fPdfDoc->resolveR eference(colorSpaceResource->get(name)) : name; 1580 SkPdfNativeObject* colorSpace = colorSpaceResource ? pdfContext->fPdfDoc->re solveReference(colorSpaceResource->get(name)) : name;
1582 1581
1583 if (colorSpace == NULL) { 1582 if (colorSpace == NULL) {
1584 colorOperator->fColorSpace = name->strRef(); 1583 colorOperator->fColorSpace = name->strRef();
1585 } else { 1584 } else {
1586 #ifdef PDF_TRACE 1585 #ifdef PDF_TRACE
1587 printf("CS = %s\n", colorSpace->toString(0, 0).c_str()); 1586 printf("CS = %s\n", colorSpace->toString(0, 0).c_str());
1588 #endif // PDF_TRACE 1587 #endif // PDF_TRACE
1589 if (colorSpace->isName()) { 1588 if (colorSpace->isName()) {
1590 colorOperator->fColorSpace = colorSpace->strRef(); 1589 colorOperator->fColorSpace = colorSpace->strRef();
1591 } else if (colorSpace->isArray()) { 1590 } else if (colorSpace->isArray()) {
1592 int cnt = colorSpace->size(); 1591 int cnt = colorSpace->size();
1593 if (cnt == 0) { 1592 if (cnt == 0) {
1594 return kIgnoreError_PdfResult; 1593 return kIgnoreError_SkPdfResult;
1595 } 1594 }
1596 SkPdfObject* type = colorSpace->objAtAIndex(0); 1595 SkPdfNativeObject* type = colorSpace->objAtAIndex(0);
1597 type = pdfContext->fPdfDoc->resolveReference(type); 1596 type = pdfContext->fPdfDoc->resolveReference(type);
1598 1597
1599 if (type->isName("ICCBased")) { 1598 if (type->isName("ICCBased")) {
1600 if (cnt != 2) { 1599 if (cnt != 2) {
1601 return kIgnoreError_PdfResult; 1600 return kIgnoreError_SkPdfResult;
1602 } 1601 }
1603 SkPdfObject* prop = colorSpace->objAtAIndex(1); 1602 SkPdfNativeObject* prop = colorSpace->objAtAIndex(1);
1604 prop = pdfContext->fPdfDoc->resolveReference(prop); 1603 prop = pdfContext->fPdfDoc->resolveReference(prop);
1605 #ifdef PDF_TRACE 1604 #ifdef PDF_TRACE
1606 printf("ICCBased prop = %s\n", prop->toString(0, 0).c_str()); 1605 printf("ICCBased prop = %s\n", prop->toString(0, 0).c_str());
1607 #endif // PDF_TRACE 1606 #endif // PDF_TRACE
1608 // TODO(edisonn): hack 1607 // TODO(edisonn): hack
1609 if (prop && prop->isDictionary() && prop->get("N") && prop->get ("N")->isInteger() && prop->get("N")->intValue() == 3) { 1608 if (prop && prop->isDictionary() && prop->get("N") && prop->get ("N")->isInteger() && prop->get("N")->intValue() == 3) {
1610 colorOperator->setColorSpace(&strings_DeviceRGB); 1609 colorOperator->setColorSpace(&strings_DeviceRGB);
1611 return kPartial_PdfResult; 1610 return kPartial_SkPdfResult;
1612 } 1611 }
1613 return kNYI_PdfResult; 1612 return kNYI_SkPdfResult;
1614 } 1613 }
1615 } 1614 }
1616 } 1615 }
1617 1616
1618 return kPartial_PdfResult; 1617 return kPartial_SkPdfResult;
1619 } 1618 }
1620 1619
1621 static PdfResult PdfOp_CS(PdfContext* pdfContext, SkCanvas* canvas, PdfTokenLoop er** looper) { 1620 static SkPdfResult PdfOp_CS(SkPdfContext* pdfContext, SkCanvas* canvas, PdfToken Looper** looper) {
1622 return PdfOp_CS_cs(pdfContext, canvas, &pdfContext->fGraphicsState.fStroking ); 1621 return PdfOp_CS_cs(pdfContext, canvas, &pdfContext->fGraphicsState.fStroking );
1623 } 1622 }
1624 1623
1625 static PdfResult PdfOp_cs(PdfContext* pdfContext, SkCanvas* canvas, PdfTokenLoop er** looper) { 1624 static SkPdfResult PdfOp_cs(SkPdfContext* pdfContext, SkCanvas* canvas, PdfToken Looper** looper) {
1626 return PdfOp_CS_cs(pdfContext, canvas, &pdfContext->fGraphicsState.fNonStrok ing); 1625 return PdfOp_CS_cs(pdfContext, canvas, &pdfContext->fGraphicsState.fNonStrok ing);
1627 } 1626 }
1628 1627
1629 static PdfResult PdfOp_SC_sc(PdfContext* pdfContext, SkCanvas* canvas, SkPdfColo rOperator* colorOperator) { 1628 static SkPdfResult PdfOp_SC_sc(SkPdfContext* pdfContext, SkCanvas* canvas, SkPdf ColorOperator* colorOperator) {
1630 double c[4]; 1629 double c[4];
1631 // int64_t v[4]; 1630 // int64_t v[4];
1632 1631
1633 int n = GetColorSpaceComponents(colorOperator->fColorSpace); 1632 int n = GetColorSpaceComponents(colorOperator->fColorSpace);
1634 1633
1635 bool doubles = true; 1634 bool doubles = true;
1636 if (colorOperator->fColorSpace.equals("Indexed")) { 1635 if (colorOperator->fColorSpace.equals("Indexed")) {
1637 doubles = false; 1636 doubles = false;
1638 } 1637 }
1639 1638
1640 #ifdef PDF_TRACE 1639 #ifdef PDF_TRACE
1641 printf("color space = %s, N = %i\n", colorOperator->fColorSpace.fBuffer, n); 1640 printf("color space = %s, N = %i\n", colorOperator->fColorSpace.fBuffer, n);
1642 #endif 1641 #endif
1643 1642
1644 for (int i = n - 1; i >= 0 ; i--) { 1643 for (int i = n - 1; i >= 0 ; i--) {
1645 if (doubles) { 1644 if (doubles) {
1646 c[i] = pdfContext->fObjectStack.top()->numberValue(); pdfCon text->fObjectStack.pop(); 1645 c[i] = pdfContext->fObjectStack.top()->numberValue(); pdfCon text->fObjectStack.pop();
1647 // } else { 1646 // } else {
1648 // v[i] = pdfContext->fObjectStack.top()->intValue(); pdfConte xt->fObjectStack.pop(); 1647 // v[i] = pdfContext->fObjectStack.top()->intValue(); pdfConte xt->fObjectStack.pop();
1649 } 1648 }
1650 } 1649 }
1651 1650
1652 // TODO(edisonn): Now, set that color. Only DeviceRGB supported. 1651 // TODO(edisonn): Now, set that color. Only DeviceRGB supported.
1653 // TODO(edisonn): do possible field values to enum at parsing time! 1652 // TODO(edisonn): do possible field values to enum at parsing time!
1654 // TODO(edisonn): support also abreviations /DeviceRGB == /RGB 1653 // TODO(edisonn): support also abreviations /DeviceRGB == /RGB
1655 if (colorOperator->fColorSpace.equals("DeviceRGB") || colorOperator->fColorS pace.equals("RGB")) { 1654 if (colorOperator->fColorSpace.equals("DeviceRGB") || colorOperator->fColorS pace.equals("RGB")) {
1656 colorOperator->setRGBColor(SkColorSetRGB((U8CPU)(255*c[0]), (U8CPU)(255* c[1]), (U8CPU)(255*c[2]))); 1655 colorOperator->setRGBColor(SkColorSetRGB((U8CPU)(255*c[0]), (U8CPU)(255* c[1]), (U8CPU)(255*c[2])));
1657 } 1656 }
1658 return kPartial_PdfResult; 1657 return kPartial_SkPdfResult;
1659 } 1658 }
1660 1659
1661 static PdfResult PdfOp_SC(PdfContext* pdfContext, SkCanvas* canvas, PdfTokenLoop er** looper) { 1660 static SkPdfResult PdfOp_SC(SkPdfContext* pdfContext, SkCanvas* canvas, PdfToken Looper** looper) {
1662 return PdfOp_SC_sc(pdfContext, canvas, &pdfContext->fGraphicsState.fStroking ); 1661 return PdfOp_SC_sc(pdfContext, canvas, &pdfContext->fGraphicsState.fStroking );
1663 } 1662 }
1664 1663
1665 static PdfResult PdfOp_sc(PdfContext* pdfContext, SkCanvas* canvas, PdfTokenLoop er** looper) { 1664 static SkPdfResult PdfOp_sc(SkPdfContext* pdfContext, SkCanvas* canvas, PdfToken Looper** looper) {
1666 return PdfOp_SC_sc(pdfContext, canvas, &pdfContext->fGraphicsState.fNonStrok ing); 1665 return PdfOp_SC_sc(pdfContext, canvas, &pdfContext->fGraphicsState.fNonStrok ing);
1667 } 1666 }
1668 1667
1669 static PdfResult PdfOp_SCN_scn(PdfContext* pdfContext, SkCanvas* canvas, SkPdfCo lorOperator* colorOperator) { 1668 static SkPdfResult PdfOp_SCN_scn(SkPdfContext* pdfContext, SkCanvas* canvas, SkP dfColorOperator* colorOperator) {
1670 if (pdfContext->fObjectStack.top()->isName()) { 1669 if (pdfContext->fObjectStack.top()->isName()) {
1671 SkPdfObject* name = pdfContext->fObjectStack.top(); pdfContext->fObje ctStack.pop(); 1670 SkPdfNativeObject* name = pdfContext->fObjectStack.top(); pdfContext- >fObjectStack.pop();
1672 1671
1673 //Next, get the ExtGState Dictionary from the Resource Dictionary: 1672 //Next, get the ExtGState Dictionary from the Resource Dictionary:
1674 SkPdfDictionary* patternResources = pdfContext->fGraphicsState.fResource s->Pattern(pdfContext->fPdfDoc); 1673 SkPdfDictionary* patternResources = pdfContext->fGraphicsState.fResource s->Pattern(pdfContext->fPdfDoc);
1675 1674
1676 if (patternResources == NULL) { 1675 if (patternResources == NULL) {
1677 #ifdef PDF_TRACE 1676 #ifdef PDF_TRACE
1678 printf("ExtGState is NULL!\n"); 1677 printf("ExtGState is NULL!\n");
1679 #endif 1678 #endif
1680 return kIgnoreError_PdfResult; 1679 return kIgnoreError_SkPdfResult;
1681 } 1680 }
1682 1681
1683 colorOperator->setPatternColorSpace(pdfContext->fPdfDoc->resolveReferenc e(patternResources->get(name))); 1682 colorOperator->setPatternColorSpace(pdfContext->fPdfDoc->resolveReferenc e(patternResources->get(name)));
1684 } 1683 }
1685 1684
1686 // TODO(edisonn): SCN supports more color spaces than SCN. Read and implemen t spec. 1685 // TODO(edisonn): SCN supports more color spaces than SCN. Read and implemen t spec.
1687 PdfOp_SC_sc(pdfContext, canvas, colorOperator); 1686 PdfOp_SC_sc(pdfContext, canvas, colorOperator);
1688 1687
1689 return kPartial_PdfResult; 1688 return kPartial_SkPdfResult;
1690 } 1689 }
1691 1690
1692 static PdfResult PdfOp_SCN(PdfContext* pdfContext, SkCanvas* canvas, PdfTokenLoo per** looper) { 1691 static SkPdfResult PdfOp_SCN(SkPdfContext* pdfContext, SkCanvas* canvas, PdfToke nLooper** looper) {
1693 return PdfOp_SCN_scn(pdfContext, canvas, &pdfContext->fGraphicsState.fStroki ng); 1692 return PdfOp_SCN_scn(pdfContext, canvas, &pdfContext->fGraphicsState.fStroki ng);
1694 } 1693 }
1695 1694
1696 static PdfResult PdfOp_scn(PdfContext* pdfContext, SkCanvas* canvas, PdfTokenLoo per** looper) { 1695 static SkPdfResult PdfOp_scn(SkPdfContext* pdfContext, SkCanvas* canvas, PdfToke nLooper** looper) {
1697 return PdfOp_SCN_scn(pdfContext, canvas, &pdfContext->fGraphicsState.fNonStr oking); 1696 return PdfOp_SCN_scn(pdfContext, canvas, &pdfContext->fGraphicsState.fNonStr oking);
1698 } 1697 }
1699 1698
1700 static PdfResult PdfOp_G_g(PdfContext* pdfContext, SkCanvas* canvas, SkPdfColorO perator* colorOperator) { 1699 static SkPdfResult PdfOp_G_g(SkPdfContext* pdfContext, SkCanvas* canvas, SkPdfCo lorOperator* colorOperator) {
1701 /*double gray = */pdfContext->fObjectStack.top()->numberValue(); pdfCont ext->fObjectStack.pop(); 1700 /*double gray = */pdfContext->fObjectStack.top()->numberValue(); pdfCont ext->fObjectStack.pop();
1702 return kNYI_PdfResult; 1701 return kNYI_SkPdfResult;
1703 } 1702 }
1704 1703
1705 static PdfResult PdfOp_G(PdfContext* pdfContext, SkCanvas* canvas, PdfTokenLoope r** looper) { 1704 static SkPdfResult PdfOp_G(SkPdfContext* pdfContext, SkCanvas* canvas, PdfTokenL ooper** looper) {
1706 return PdfOp_G_g(pdfContext, canvas, &pdfContext->fGraphicsState.fStroking); 1705 return PdfOp_G_g(pdfContext, canvas, &pdfContext->fGraphicsState.fStroking);
1707 } 1706 }
1708 1707
1709 static PdfResult PdfOp_g(PdfContext* pdfContext, SkCanvas* canvas, PdfTokenLoope r** looper) { 1708 static SkPdfResult PdfOp_g(SkPdfContext* pdfContext, SkCanvas* canvas, PdfTokenL ooper** looper) {
1710 return PdfOp_G_g(pdfContext, canvas, &pdfContext->fGraphicsState.fNonStrokin g); 1709 return PdfOp_G_g(pdfContext, canvas, &pdfContext->fGraphicsState.fNonStrokin g);
1711 } 1710 }
1712 1711
1713 static PdfResult PdfOp_RG_rg(PdfContext* pdfContext, SkCanvas* canvas, SkPdfColo rOperator* colorOperator) { 1712 static SkPdfResult PdfOp_RG_rg(SkPdfContext* pdfContext, SkCanvas* canvas, SkPdf ColorOperator* colorOperator) {
1714 double b = pdfContext->fObjectStack.top()->numberValue(); pdfContext->fO bjectStack.pop(); 1713 double b = pdfContext->fObjectStack.top()->numberValue(); pdfContext->fO bjectStack.pop();
1715 double g = pdfContext->fObjectStack.top()->numberValue(); pdfContext->fO bjectStack.pop(); 1714 double g = pdfContext->fObjectStack.top()->numberValue(); pdfContext->fO bjectStack.pop();
1716 double r = pdfContext->fObjectStack.top()->numberValue(); pdfContext->fO bjectStack.pop(); 1715 double r = pdfContext->fObjectStack.top()->numberValue(); pdfContext->fO bjectStack.pop();
1717 1716
1718 colorOperator->fColorSpace = strings_DeviceRGB; 1717 colorOperator->fColorSpace = strings_DeviceRGB;
1719 colorOperator->setRGBColor(SkColorSetRGB((U8CPU)(255*r), (U8CPU)(255*g), (U8 CPU)(255*b))); 1718 colorOperator->setRGBColor(SkColorSetRGB((U8CPU)(255*r), (U8CPU)(255*g), (U8 CPU)(255*b)));
1720 return kOK_PdfResult; 1719 return kOK_SkPdfResult;
1721 } 1720 }
1722 1721
1723 static PdfResult PdfOp_RG(PdfContext* pdfContext, SkCanvas* canvas, PdfTokenLoop er** looper) { 1722 static SkPdfResult PdfOp_RG(SkPdfContext* pdfContext, SkCanvas* canvas, PdfToken Looper** looper) {
1724 return PdfOp_RG_rg(pdfContext, canvas, &pdfContext->fGraphicsState.fStroking ); 1723 return PdfOp_RG_rg(pdfContext, canvas, &pdfContext->fGraphicsState.fStroking );
1725 } 1724 }
1726 1725
1727 static PdfResult PdfOp_rg(PdfContext* pdfContext, SkCanvas* canvas, PdfTokenLoop er** looper) { 1726 static SkPdfResult PdfOp_rg(SkPdfContext* pdfContext, SkCanvas* canvas, PdfToken Looper** looper) {
1728 return PdfOp_RG_rg(pdfContext, canvas, &pdfContext->fGraphicsState.fNonStrok ing); 1727 return PdfOp_RG_rg(pdfContext, canvas, &pdfContext->fGraphicsState.fNonStrok ing);
1729 } 1728 }
1730 1729
1731 static PdfResult PdfOp_K_k(PdfContext* pdfContext, SkCanvas* canvas, SkPdfColorO perator* colorOperator) { 1730 static SkPdfResult PdfOp_K_k(SkPdfContext* pdfContext, SkCanvas* canvas, SkPdfCo lorOperator* colorOperator) {
1732 // TODO(edisonn): spec has some rules about overprint, implement them. 1731 // TODO(edisonn): spec has some rules about overprint, implement them.
1733 /*double k = */pdfContext->fObjectStack.top()->numberValue(); pdfContext ->fObjectStack.pop(); 1732 /*double k = */pdfContext->fObjectStack.top()->numberValue(); pdfContext ->fObjectStack.pop();
1734 /*double y = */pdfContext->fObjectStack.top()->numberValue(); pdfContext ->fObjectStack.pop(); 1733 /*double y = */pdfContext->fObjectStack.top()->numberValue(); pdfContext ->fObjectStack.pop();
1735 /*double m = */pdfContext->fObjectStack.top()->numberValue(); pdfContext ->fObjectStack.pop(); 1734 /*double m = */pdfContext->fObjectStack.top()->numberValue(); pdfContext ->fObjectStack.pop();
1736 /*double c = */pdfContext->fObjectStack.top()->numberValue(); pdfContext ->fObjectStack.pop(); 1735 /*double c = */pdfContext->fObjectStack.top()->numberValue(); pdfContext ->fObjectStack.pop();
1737 1736
1738 colorOperator->fColorSpace = strings_DeviceCMYK; 1737 colorOperator->fColorSpace = strings_DeviceCMYK;
1739 // TODO(edisonn): Set color. 1738 // TODO(edisonn): Set color.
1740 return kNYI_PdfResult; 1739 return kNYI_SkPdfResult;
1741 } 1740 }
1742 1741
1743 static PdfResult PdfOp_K(PdfContext* pdfContext, SkCanvas* canvas, PdfTokenLoope r** looper) { 1742 static SkPdfResult PdfOp_K(SkPdfContext* pdfContext, SkCanvas* canvas, PdfTokenL ooper** looper) {
1744 return PdfOp_K_k(pdfContext, canvas, &pdfContext->fGraphicsState.fStroking); 1743 return PdfOp_K_k(pdfContext, canvas, &pdfContext->fGraphicsState.fStroking);
1745 } 1744 }
1746 1745
1747 static PdfResult PdfOp_k(PdfContext* pdfContext, SkCanvas* canvas, PdfTokenLoope r** looper) { 1746 static SkPdfResult PdfOp_k(SkPdfContext* pdfContext, SkCanvas* canvas, PdfTokenL ooper** looper) {
1748 return PdfOp_K_k(pdfContext, canvas, &pdfContext->fGraphicsState.fNonStrokin g); 1747 return PdfOp_K_k(pdfContext, canvas, &pdfContext->fGraphicsState.fNonStrokin g);
1749 } 1748 }
1750 1749
1751 static PdfResult PdfOp_W(PdfContext* pdfContext, SkCanvas* canvas, PdfTokenLoope r** looper) { 1750 static SkPdfResult PdfOp_W(SkPdfContext* pdfContext, SkCanvas* canvas, PdfTokenL ooper** looper) {
1752 pdfContext->fGraphicsState.fClipPath = pdfContext->fGraphicsState.fPath; 1751 pdfContext->fGraphicsState.fClipPath = pdfContext->fGraphicsState.fPath;
1753 pdfContext->fGraphicsState.fHasClipPathToApply = true; 1752 pdfContext->fGraphicsState.fHasClipPathToApply = true;
1754 1753
1755 return kOK_PdfResult; 1754 return kOK_SkPdfResult;
1756 } 1755 }
1757 1756
1758 static PdfResult PdfOp_W_star(PdfContext* pdfContext, SkCanvas* canvas, PdfToken Looper** looper) { 1757 static SkPdfResult PdfOp_W_star(SkPdfContext* pdfContext, SkCanvas* canvas, PdfT okenLooper** looper) {
1759 pdfContext->fGraphicsState.fClipPath = pdfContext->fGraphicsState.fPath; 1758 pdfContext->fGraphicsState.fClipPath = pdfContext->fGraphicsState.fPath;
1760 1759
1761 pdfContext->fGraphicsState.fClipPath.setFillType(SkPath::kEvenOdd_FillType); 1760 pdfContext->fGraphicsState.fClipPath.setFillType(SkPath::kEvenOdd_FillType);
1762 pdfContext->fGraphicsState.fHasClipPathToApply = true; 1761 pdfContext->fGraphicsState.fHasClipPathToApply = true;
1763 1762
1764 return kOK_PdfResult; 1763 return kOK_SkPdfResult;
1765 } 1764 }
1766 1765
1767 static PdfResult PdfOp_BX(PdfContext* pdfContext, SkCanvas* canvas, PdfTokenLoop er** looper) { 1766 static SkPdfResult PdfOp_BX(SkPdfContext* pdfContext, SkCanvas* canvas, PdfToken Looper** looper) {
1768 *looper = new PdfCompatibilitySectionLooper(); 1767 *looper = new PdfCompatibilitySectionLooper();
1769 return kOK_PdfResult; 1768 return kOK_SkPdfResult;
1770 } 1769 }
1771 1770
1772 static PdfResult PdfOp_EX(PdfContext* pdfContext, SkCanvas* canvas, PdfTokenLoop er** looper) { 1771 static SkPdfResult PdfOp_EX(SkPdfContext* pdfContext, SkCanvas* canvas, PdfToken Looper** looper) {
1773 #ifdef ASSERT_BAD_PDF_OPS 1772 #ifdef ASSERT_BAD_PDF_OPS
1774 SkASSERT(false); // EX must be consumed by PdfCompatibilitySectionLooper, b ut let's 1773 SkASSERT(false); // EX must be consumed by PdfCompatibilitySectionLooper, b ut let's
1775 // have the assert when testing good pdfs. 1774 // have the assert when testing good pdfs.
1776 #endif 1775 #endif
1777 return kIgnoreError_PdfResult; 1776 return kIgnoreError_SkPdfResult;
1778 } 1777 }
1779 1778
1780 static PdfResult PdfOp_BI(PdfContext* pdfContext, SkCanvas* canvas, PdfTokenLoop er** looper) { 1779 static SkPdfResult PdfOp_BI(SkPdfContext* pdfContext, SkCanvas* canvas, PdfToken Looper** looper) {
1781 *looper = new PdfInlineImageLooper(); 1780 *looper = new PdfInlineImageLooper();
1782 return kOK_PdfResult; 1781 return kOK_SkPdfResult;
1783 } 1782 }
1784 1783
1785 static PdfResult PdfOp_ID(PdfContext* pdfContext, SkCanvas* canvas, PdfTokenLoop er** looper) { 1784 static SkPdfResult PdfOp_ID(SkPdfContext* pdfContext, SkCanvas* canvas, PdfToken Looper** looper) {
1786 #ifdef ASSERT_BAD_PDF_OPS 1785 #ifdef ASSERT_BAD_PDF_OPS
1787 SkASSERT(false); // must be processed in inline image looper, but let's 1786 SkASSERT(false); // must be processed in inline image looper, but let's
1788 // have the assert when testing good pdfs. 1787 // have the assert when testing good pdfs.
1789 #endif 1788 #endif
1790 return kIgnoreError_PdfResult; 1789 return kIgnoreError_SkPdfResult;
1791 } 1790 }
1792 1791
1793 static PdfResult PdfOp_EI(PdfContext* pdfContext, SkCanvas* canvas, PdfTokenLoop er** looper) { 1792 static SkPdfResult PdfOp_EI(SkPdfContext* pdfContext, SkCanvas* canvas, PdfToken Looper** looper) {
1794 #ifdef ASSERT_BAD_PDF_OPS 1793 #ifdef ASSERT_BAD_PDF_OPS
1795 SkASSERT(false); // must be processed in inline image looper, but let's 1794 SkASSERT(false); // must be processed in inline image looper, but let's
1796 // have the assert when testing good pdfs. 1795 // have the assert when testing good pdfs.
1797 #endif 1796 #endif
1798 return kIgnoreError_PdfResult; 1797 return kIgnoreError_SkPdfResult;
1799 } 1798 }
1800 1799
1801 1800
1802 // TODO(edisonn): security review here, make sure all parameters are valid, and safe. 1801 // TODO(edisonn): security review here, make sure all parameters are valid, and safe.
1803 PdfResult skpdfGraphicsStateApply_ca(PdfContext* pdfContext, double ca) { 1802 SkPdfResult skpdfGraphicsStateApply_ca(SkPdfContext* pdfContext, double ca) {
1804 pdfContext->fGraphicsState.fNonStroking.fOpacity = ca; 1803 pdfContext->fGraphicsState.fNonStroking.fOpacity = ca;
1805 return kOK_PdfResult; 1804 return kOK_SkPdfResult;
1806 } 1805 }
1807 1806
1808 PdfResult skpdfGraphicsStateApply_CA(PdfContext* pdfContext, double CA) { 1807 SkPdfResult skpdfGraphicsStateApply_CA(SkPdfContext* pdfContext, double CA) {
1809 pdfContext->fGraphicsState.fStroking.fOpacity = CA; 1808 pdfContext->fGraphicsState.fStroking.fOpacity = CA;
1810 return kOK_PdfResult; 1809 return kOK_SkPdfResult;
1811 } 1810 }
1812 1811
1813 PdfResult skpdfGraphicsStateApplyLW(PdfContext* pdfContext, double lineWidth) { 1812 SkPdfResult skpdfGraphicsStateApplyLW(SkPdfContext* pdfContext, double lineWidth ) {
1814 pdfContext->fGraphicsState.fLineWidth = lineWidth; 1813 pdfContext->fGraphicsState.fLineWidth = lineWidth;
1815 return kOK_PdfResult; 1814 return kOK_SkPdfResult;
1816 } 1815 }
1817 1816
1818 PdfResult skpdfGraphicsStateApplyLC(PdfContext* pdfContext, int64_t lineCap) { 1817 SkPdfResult skpdfGraphicsStateApplyLC(SkPdfContext* pdfContext, int64_t lineCap) {
1819 pdfContext->fGraphicsState.fLineCap = (int)lineCap; 1818 pdfContext->fGraphicsState.fLineCap = (int)lineCap;
1820 return kOK_PdfResult; 1819 return kOK_SkPdfResult;
1821 } 1820 }
1822 1821
1823 PdfResult skpdfGraphicsStateApplyLJ(PdfContext* pdfContext, int64_t lineJoin) { 1822 SkPdfResult skpdfGraphicsStateApplyLJ(SkPdfContext* pdfContext, int64_t lineJoin ) {
1824 pdfContext->fGraphicsState.fLineJoin = (int)lineJoin; 1823 pdfContext->fGraphicsState.fLineJoin = (int)lineJoin;
1825 return kOK_PdfResult; 1824 return kOK_SkPdfResult;
1826 } 1825 }
1827 1826
1828 PdfResult skpdfGraphicsStateApplyML(PdfContext* pdfContext, double miterLimit) { 1827 SkPdfResult skpdfGraphicsStateApplyML(SkPdfContext* pdfContext, double miterLimi t) {
1829 pdfContext->fGraphicsState.fMiterLimit = miterLimit; 1828 pdfContext->fGraphicsState.fMiterLimit = miterLimit;
1830 return kOK_PdfResult; 1829 return kOK_SkPdfResult;
1831 } 1830 }
1832 1831
1833 // TODO(edisonn): implement all rules, as of now 3) and 5) and 6) do not seem su ported by skia, but I am not sure 1832 // TODO(edisonn): implement all rules, as of now 3) and 5) and 6) do not seem su ported by skia, but I am not sure
1834 /* 1833 /*
1835 1) [ ] 0 No dash; solid, unbroken lines 1834 1) [ ] 0 No dash; solid, unbroken lines
1836 2) [3] 0 3 units on, 3 units off, … 1835 2) [3] 0 3 units on, 3 units off, …
1837 3) [2] 1 1 on, 2 off, 2 on, 2 off, … 1836 3) [2] 1 1 on, 2 off, 2 on, 2 off, …
1838 4) [2 1] 0 2 on, 1 off, 2 on, 1 off, … 1837 4) [2 1] 0 2 on, 1 off, 2 on, 1 off, …
1839 5) [3 5] 6 2 off, 3 on, 5 off, 3 on, 5 off, … 1838 5) [3 5] 6 2 off, 3 on, 5 off, 3 on, 5 off, …
1840 6) [2 3] 11 1 on, 3 off, 2 on, 3 off, 2 on, … 1839 6) [2 3] 11 1 on, 3 off, 2 on, 3 off, 2 on, …
1841 */ 1840 */
1842 1841
1843 PdfResult skpdfGraphicsStateApplyD(PdfContext* pdfContext, SkPdfArray* intervals , SkPdfObject* phase) { 1842 SkPdfResult skpdfGraphicsStateApplyD(SkPdfContext* pdfContext, SkPdfArray* inter vals, SkPdfNativeObject* phase) {
1844 int cnt = intervals->size(); 1843 int cnt = intervals->size();
1845 if (cnt >= 256) { 1844 if (cnt >= 256) {
1846 // TODO(edisonn): report error/warning, unsuported; 1845 // TODO(edisonn): report error/warning, unsuported;
1847 // TODO(edisonn): alloc memory 1846 // TODO(edisonn): alloc memory
1848 return kIgnoreError_PdfResult; 1847 return kIgnoreError_SkPdfResult;
1849 } 1848 }
1850 for (int i = 0; i < cnt; i++) { 1849 for (int i = 0; i < cnt; i++) {
1851 if (!intervals->objAtAIndex(i)->isNumber()) { 1850 if (!intervals->objAtAIndex(i)->isNumber()) {
1852 // TODO(edisonn): report error/warning 1851 // TODO(edisonn): report error/warning
1853 return kIgnoreError_PdfResult; 1852 return kIgnoreError_SkPdfResult;
1854 } 1853 }
1855 } 1854 }
1856 1855
1857 double total = 0; 1856 double total = 0;
1858 for (int i = 0 ; i < cnt; i++) { 1857 for (int i = 0 ; i < cnt; i++) {
1859 pdfContext->fGraphicsState.fDashArray[i] = intervals->objAtAIndex(i)->sc alarValue(); 1858 pdfContext->fGraphicsState.fDashArray[i] = intervals->objAtAIndex(i)->sc alarValue();
1860 total += pdfContext->fGraphicsState.fDashArray[i]; 1859 total += pdfContext->fGraphicsState.fDashArray[i];
1861 } 1860 }
1862 if (cnt & 1) { 1861 if (cnt & 1) {
1863 if (cnt == 1) { 1862 if (cnt == 1) {
1864 pdfContext->fGraphicsState.fDashArray[1] = pdfContext->fGraphicsStat e.fDashArray[0]; 1863 pdfContext->fGraphicsState.fDashArray[1] = pdfContext->fGraphicsStat e.fDashArray[0];
1865 cnt++; 1864 cnt++;
1866 } else { 1865 } else {
1867 // TODO(edisonn): report error/warning 1866 // TODO(edisonn): report error/warning
1868 return kNYI_PdfResult; 1867 return kNYI_SkPdfResult;
1869 } 1868 }
1870 } 1869 }
1871 pdfContext->fGraphicsState.fDashArrayLength = cnt; 1870 pdfContext->fGraphicsState.fDashArrayLength = cnt;
1872 pdfContext->fGraphicsState.fDashPhase = phase->scalarValue(); 1871 pdfContext->fGraphicsState.fDashPhase = phase->scalarValue();
1873 if (pdfContext->fGraphicsState.fDashPhase == 0) { 1872 if (pdfContext->fGraphicsState.fDashPhase == 0) {
1874 // other rules, changes? 1873 // other rules, changes?
1875 pdfContext->fGraphicsState.fDashPhase = total; 1874 pdfContext->fGraphicsState.fDashPhase = total;
1876 } 1875 }
1877 1876
1878 return kOK_PdfResult; 1877 return kOK_SkPdfResult;
1879 } 1878 }
1880 1879
1881 PdfResult skpdfGraphicsStateApplyD(PdfContext* pdfContext, SkPdfArray* dash) { 1880 SkPdfResult skpdfGraphicsStateApplyD(SkPdfContext* pdfContext, SkPdfArray* dash) {
1882 // TODO(edisonn): verify input 1881 // TODO(edisonn): verify input
1883 if (!dash || dash->isArray() || dash->size() != 2 || !dash->objAtAIndex(0)-> isArray() || !dash->objAtAIndex(1)->isNumber()) { 1882 if (!dash || dash->isArray() || dash->size() != 2 || !dash->objAtAIndex(0)-> isArray() || !dash->objAtAIndex(1)->isNumber()) {
1884 // TODO(edisonn): report error/warning 1883 // TODO(edisonn): report error/warning
1885 return kIgnoreError_PdfResult; 1884 return kIgnoreError_SkPdfResult;
1886 } 1885 }
1887 return skpdfGraphicsStateApplyD(pdfContext, (SkPdfArray*)dash->objAtAIndex(0 ), dash->objAtAIndex(1)); 1886 return skpdfGraphicsStateApplyD(pdfContext, (SkPdfArray*)dash->objAtAIndex(0 ), dash->objAtAIndex(1));
1888 } 1887 }
1889 1888
1890 void skpdfGraphicsStateApplyFont(PdfContext* pdfContext, SkPdfArray* fontAndSize ) { 1889 void skpdfGraphicsStateApplyFont(SkPdfContext* pdfContext, SkPdfArray* fontAndSi ze) {
1891 if (!fontAndSize || fontAndSize->isArray() || fontAndSize->size() != 2 || !f ontAndSize->objAtAIndex(0)->isName() || !fontAndSize->objAtAIndex(1)->isNumber() ) { 1890 if (!fontAndSize || fontAndSize->isArray() || fontAndSize->size() != 2 || !f ontAndSize->objAtAIndex(0)->isName() || !fontAndSize->objAtAIndex(1)->isNumber() ) {
1892 // TODO(edisonn): report error/warning 1891 // TODO(edisonn): report error/warning
1893 return; 1892 return;
1894 } 1893 }
1895 skpdfGraphicsStateApplyFontCore(pdfContext, fontAndSize->objAtAIndex(0), fon tAndSize->objAtAIndex(1)->numberValue()); 1894 skpdfGraphicsStateApplyFontCore(pdfContext, fontAndSize->objAtAIndex(0), fon tAndSize->objAtAIndex(1)->numberValue());
1896 } 1895 }
1897 1896
1898 1897
1899 //lineWidth w Set the line width in the graphics state (see “Line Width” on page 152). 1898 //lineWidth w Set the line width in the graphics state (see “Line Width” on page 152).
1900 static PdfResult PdfOp_w(PdfContext* pdfContext, SkCanvas* canvas, PdfTokenLoope r** looper) { 1899 static SkPdfResult PdfOp_w(SkPdfContext* pdfContext, SkCanvas* canvas, PdfTokenL ooper** looper) {
1901 double lw = pdfContext->fObjectStack.top()->numberValue(); pdfContext->fO bjectStack.pop(); 1900 double lw = pdfContext->fObjectStack.top()->numberValue(); pdfContext->fO bjectStack.pop();
1902 return skpdfGraphicsStateApplyLW(pdfContext, lw); 1901 return skpdfGraphicsStateApplyLW(pdfContext, lw);
1903 } 1902 }
1904 1903
1905 //lineCap J Set the line cap style in the graphics state (see “Line Cap Style” o n page 153). 1904 //lineCap J Set the line cap style in the graphics state (see “Line Cap Style” o n page 153).
1906 static PdfResult PdfOp_J(PdfContext* pdfContext, SkCanvas* canvas, PdfTokenLoope r** looper) { 1905 static SkPdfResult PdfOp_J(SkPdfContext* pdfContext, SkCanvas* canvas, PdfTokenL ooper** looper) {
1907 int64_t lc = pdfContext->fObjectStack.top()->numberValue(); pdfContext->f ObjectStack.pop(); 1906 int64_t lc = pdfContext->fObjectStack.top()->numberValue(); pdfContext->f ObjectStack.pop();
1908 return skpdfGraphicsStateApplyLC(pdfContext, lc); 1907 return skpdfGraphicsStateApplyLC(pdfContext, lc);
1909 } 1908 }
1910 1909
1911 //lineJoin j Set the line join style in the graphics state (see “Line Join Style ” on page 153). 1910 //lineJoin j Set the line join style in the graphics state (see “Line Join Style ” on page 153).
1912 static PdfResult PdfOp_j(PdfContext* pdfContext, SkCanvas* canvas, PdfTokenLoope r** looper) { 1911 static SkPdfResult PdfOp_j(SkPdfContext* pdfContext, SkCanvas* canvas, PdfTokenL ooper** looper) {
1913 double lj = pdfContext->fObjectStack.top()->numberValue(); pdfContext->fO bjectStack.pop(); 1912 double lj = pdfContext->fObjectStack.top()->numberValue(); pdfContext->fO bjectStack.pop();
1914 return skpdfGraphicsStateApplyLJ(pdfContext, lj); 1913 return skpdfGraphicsStateApplyLJ(pdfContext, lj);
1915 } 1914 }
1916 1915
1917 //miterLimit M Set the miter limit in the graphics state (see “Miter Limit” on p age 153). 1916 //miterLimit M Set the miter limit in the graphics state (see “Miter Limit” on p age 153).
1918 static PdfResult PdfOp_M(PdfContext* pdfContext, SkCanvas* canvas, PdfTokenLoope r** looper) { 1917 static SkPdfResult PdfOp_M(SkPdfContext* pdfContext, SkCanvas* canvas, PdfTokenL ooper** looper) {
1919 double ml = pdfContext->fObjectStack.top()->numberValue(); pdfContext->fO bjectStack.pop(); 1918 double ml = pdfContext->fObjectStack.top()->numberValue(); pdfContext->fO bjectStack.pop();
1920 return skpdfGraphicsStateApplyML(pdfContext, ml); 1919 return skpdfGraphicsStateApplyML(pdfContext, ml);
1921 } 1920 }
1922 1921
1923 //dashArray dashPhase d Set the line dash pattern in the graphics state (see “Li ne Dash Pattern” on 1922 //dashArray dashPhase d Set the line dash pattern in the graphics state (see “Li ne Dash Pattern” on
1924 //page 155). 1923 //page 155).
1925 static PdfResult PdfOp_d(PdfContext* pdfContext, SkCanvas* canvas, PdfTokenLoope r** looper) { 1924 static SkPdfResult PdfOp_d(SkPdfContext* pdfContext, SkCanvas* canvas, PdfTokenL ooper** looper) {
1926 SkPdfObject* phase = pdfContext->fObjectStack.top(); pdfContext->fO bjectStack.pop(); 1925 SkPdfNativeObject* phase = pdfContext->fObjectStack.top(); pdfConte xt->fObjectStack.pop();
1927 SkPdfObject* array = pdfContext->fObjectStack.top(); pdfContext->fO bjectStack.pop(); 1926 SkPdfNativeObject* array = pdfContext->fObjectStack.top(); pdfConte xt->fObjectStack.pop();
1928 1927
1929 if (!array->isArray()) { 1928 if (!array->isArray()) {
1930 return kIgnoreError_PdfResult; 1929 return kIgnoreError_SkPdfResult;
1931 } 1930 }
1932 1931
1933 return skpdfGraphicsStateApplyD(pdfContext, (SkPdfArray*)array, phase); 1932 return skpdfGraphicsStateApplyD(pdfContext, (SkPdfArray*)array, phase);
1934 } 1933 }
1935 1934
1936 //intent ri (PDF 1.1) Set the color rendering intent in the graphics state (see “Rendering Intents” on page 197). 1935 //intent ri (PDF 1.1) Set the color rendering intent in the graphics state (see “Rendering Intents” on page 197).
1937 static PdfResult PdfOp_ri(PdfContext* pdfContext, SkCanvas* canvas, PdfTokenLoop er** looper) { 1936 static SkPdfResult PdfOp_ri(SkPdfContext* pdfContext, SkCanvas* canvas, PdfToken Looper** looper) {
1938 pdfContext->fObjectStack.pop(); 1937 pdfContext->fObjectStack.pop();
1939 1938
1940 return kNYI_PdfResult; 1939 return kNYI_SkPdfResult;
1941 } 1940 }
1942 1941
1943 //flatness i Set the flatness tolerance in the graphics state (see Section 6.5.1, “Flatness 1942 //flatness i Set the flatness tolerance in the graphics state (see Section 6.5.1, “Flatness
1944 //Tolerance”). flatness is a number in the range 0 to 100; a value of 0 speci- 1943 //Tolerance”). flatness is a number in the range 0 to 100; a value of 0 speci-
1945 //fies the output device’s default flatness tolerance. 1944 //fies the output device’s default flatness tolerance.
1946 static PdfResult PdfOp_i(PdfContext* pdfContext, SkCanvas* canvas, PdfTokenLoope r** looper) { 1945 static SkPdfResult PdfOp_i(SkPdfContext* pdfContext, SkCanvas* canvas, PdfTokenL ooper** looper) {
1947 pdfContext->fObjectStack.pop(); 1946 pdfContext->fObjectStack.pop();
1948 1947
1949 return kNYI_PdfResult; 1948 return kNYI_SkPdfResult;
1950 } 1949 }
1951 1950
1952 SkTDict<SkXfermode::Mode> gPdfBlendModes(20); 1951 SkTDict<SkXfermode::Mode> gPdfBlendModes(20);
1953 1952
1954 class InitBlendModes { 1953 class InitBlendModes {
1955 public: 1954 public:
1956 InitBlendModes() { 1955 InitBlendModes() {
1957 // TODO(edisonn): use the python code generator? 1956 // TODO(edisonn): use the python code generator?
1958 // TABLE 7.2 Standard separable blend modes 1957 // TABLE 7.2 Standard separable blend modes
1959 gPdfBlendModes.set("Normal", SkXfermode::kSrc_Mode); 1958 gPdfBlendModes.set("Normal", SkXfermode::kSrc_Mode);
(...skipping 21 matching lines...) Expand all
1981 1980
1982 SkXfermode::Mode xferModeFromBlendMode(const char* blendMode, size_t len) { 1981 SkXfermode::Mode xferModeFromBlendMode(const char* blendMode, size_t len) {
1983 SkXfermode::Mode mode = (SkXfermode::Mode)(SkXfermode::kLastMode + 1); 1982 SkXfermode::Mode mode = (SkXfermode::Mode)(SkXfermode::kLastMode + 1);
1984 if (gPdfBlendModes.find(blendMode, len, &mode)) { 1983 if (gPdfBlendModes.find(blendMode, len, &mode)) {
1985 return mode; 1984 return mode;
1986 } 1985 }
1987 1986
1988 return (SkXfermode::Mode)(SkXfermode::kLastMode + 1); 1987 return (SkXfermode::Mode)(SkXfermode::kLastMode + 1);
1989 } 1988 }
1990 1989
1991 void skpdfGraphicsStateApplyBM_name(PdfContext* pdfContext, const std::string& b lendMode) { 1990 void skpdfGraphicsStateApplyBM_name(SkPdfContext* pdfContext, const std::string& blendMode) {
1992 SkXfermode::Mode mode = xferModeFromBlendMode(blendMode.c_str(), blendMode.l ength()); 1991 SkXfermode::Mode mode = xferModeFromBlendMode(blendMode.c_str(), blendMode.l ength());
1993 if (mode <= SkXfermode::kLastMode) { 1992 if (mode <= SkXfermode::kLastMode) {
1994 pdfContext->fGraphicsState.fBlendModesLength = 1; 1993 pdfContext->fGraphicsState.fBlendModesLength = 1;
1995 pdfContext->fGraphicsState.fBlendModes[0] = mode; 1994 pdfContext->fGraphicsState.fBlendModes[0] = mode;
1996 } else { 1995 } else {
1997 // TODO(edisonn): report unknown blend mode 1996 // TODO(edisonn): report unknown blend mode
1998 } 1997 }
1999 } 1998 }
2000 1999
2001 void skpdfGraphicsStateApplyBM_array(PdfContext* pdfContext, SkPdfArray* blendMo des) { 2000 void skpdfGraphicsStateApplyBM_array(SkPdfContext* pdfContext, SkPdfArray* blend Modes) {
2002 if (!blendModes || blendModes->isArray() || blendModes->size() == 0 || blend Modes->size() > 256) { 2001 if (!blendModes || blendModes->isArray() || blendModes->size() == 0 || blend Modes->size() > 256) {
2003 // TODO(edisonn): report error/warning 2002 // TODO(edisonn): report error/warning
2004 return; 2003 return;
2005 } 2004 }
2006 SkXfermode::Mode modes[256]; 2005 SkXfermode::Mode modes[256];
2007 int cnt = blendModes->size(); 2006 int cnt = blendModes->size();
2008 for (int i = 0; i < cnt; i++) { 2007 for (int i = 0; i < cnt; i++) {
2009 SkPdfObject* name = blendModes->objAtAIndex(i); 2008 SkPdfNativeObject* name = blendModes->objAtAIndex(i);
2010 if (!name->isName()) { 2009 if (!name->isName()) {
2011 // TODO(edisonn): report error/warning 2010 // TODO(edisonn): report error/warning
2012 return; 2011 return;
2013 } 2012 }
2014 SkXfermode::Mode mode = xferModeFromBlendMode(name->c_str(), name->lenst r()); 2013 SkXfermode::Mode mode = xferModeFromBlendMode(name->c_str(), name->lenst r());
2015 if (mode > SkXfermode::kLastMode) { 2014 if (mode > SkXfermode::kLastMode) {
2016 // TODO(edisonn): report error/warning 2015 // TODO(edisonn): report error/warning
2017 return; 2016 return;
2018 } 2017 }
2019 } 2018 }
2020 2019
2021 pdfContext->fGraphicsState.fBlendModesLength = cnt; 2020 pdfContext->fGraphicsState.fBlendModesLength = cnt;
2022 for (int i = 0; i < cnt; i++) { 2021 for (int i = 0; i < cnt; i++) {
2023 pdfContext->fGraphicsState.fBlendModes[i] = modes[i]; 2022 pdfContext->fGraphicsState.fBlendModes[i] = modes[i];
2024 } 2023 }
2025 } 2024 }
2026 2025
2027 void skpdfGraphicsStateApplySMask_dict(PdfContext* pdfContext, SkPdfDictionary* sMask) { 2026 void skpdfGraphicsStateApplySMask_dict(SkPdfContext* pdfContext, SkPdfDictionary * sMask) {
2028 // TODO(edisonn): verify input 2027 // TODO(edisonn): verify input
2029 if (pdfContext->fPdfDoc->mapper()->mapSoftMaskDictionary(sMask)) { 2028 if (pdfContext->fPdfDoc->mapper()->mapSoftMaskDictionary(sMask)) {
2030 pdfContext->fGraphicsState.fSoftMaskDictionary = (SkPdfSoftMaskDictionar y*)sMask; 2029 pdfContext->fGraphicsState.fSoftMaskDictionary = (SkPdfSoftMaskDictionar y*)sMask;
2031 } else if (pdfContext->fPdfDoc->mapper()->mapSoftMaskImageDictionary(sMask)) { 2030 } else if (pdfContext->fPdfDoc->mapper()->mapSoftMaskImageDictionary(sMask)) {
2032 SkPdfSoftMaskImageDictionary* smid = (SkPdfSoftMaskImageDictionary*)sMas k; 2031 SkPdfSoftMaskImageDictionary* smid = (SkPdfSoftMaskImageDictionary*)sMas k;
2033 pdfContext->fGraphicsState.fSMask = getImageFromObject(pdfContext, smid, true); 2032 pdfContext->fGraphicsState.fSMask = getImageFromObject(pdfContext, smid, true);
2034 } else { 2033 } else {
2035 // TODO (edisonn): report error/warning 2034 // TODO (edisonn): report error/warning
2036 } 2035 }
2037 } 2036 }
2038 2037
2039 void skpdfGraphicsStateApplySMask_name(PdfContext* pdfContext, const std::string & sMask) { 2038 void skpdfGraphicsStateApplySMask_name(SkPdfContext* pdfContext, const std::stri ng& sMask) {
2040 if (sMask == "None") { 2039 if (sMask == "None") {
2041 pdfContext->fGraphicsState.fSoftMaskDictionary = NULL; 2040 pdfContext->fGraphicsState.fSoftMaskDictionary = NULL;
2042 pdfContext->fGraphicsState.fSMask = NULL; 2041 pdfContext->fGraphicsState.fSMask = NULL;
2043 return; 2042 return;
2044 } 2043 }
2045 2044
2046 //Next, get the ExtGState Dictionary from the Resource Dictionary: 2045 //Next, get the ExtGState Dictionary from the Resource Dictionary:
2047 SkPdfDictionary* extGStateDictionary = pdfContext->fGraphicsState.fResources ->ExtGState(pdfContext->fPdfDoc); 2046 SkPdfDictionary* extGStateDictionary = pdfContext->fGraphicsState.fResources ->ExtGState(pdfContext->fPdfDoc);
2048 2047
2049 if (extGStateDictionary == NULL) { 2048 if (extGStateDictionary == NULL) {
2050 #ifdef PDF_TRACE 2049 #ifdef PDF_TRACE
2051 printf("ExtGState is NULL!\n"); 2050 printf("ExtGState is NULL!\n");
2052 #endif 2051 #endif
2053 // TODO (edisonn): report error/warning 2052 // TODO (edisonn): report error/warning
2054 return; 2053 return;
2055 } 2054 }
2056 2055
2057 SkPdfObject* obj = pdfContext->fPdfDoc->resolveReference(extGStateDictionary ->get(sMask.c_str())); 2056 SkPdfNativeObject* obj = pdfContext->fPdfDoc->resolveReference(extGStateDict ionary->get(sMask.c_str()));
2058 if (!obj || !obj->isDictionary()) { 2057 if (!obj || !obj->isDictionary()) {
2059 // TODO (edisonn): report error/warning 2058 // TODO (edisonn): report error/warning
2060 return; 2059 return;
2061 } 2060 }
2062 2061
2063 pdfContext->fGraphicsState.fSoftMaskDictionary = NULL; 2062 pdfContext->fGraphicsState.fSoftMaskDictionary = NULL;
2064 pdfContext->fGraphicsState.fSMask = NULL; 2063 pdfContext->fGraphicsState.fSMask = NULL;
2065 2064
2066 skpdfGraphicsStateApplySMask_dict(pdfContext, obj->asDictionary()); 2065 skpdfGraphicsStateApplySMask_dict(pdfContext, obj->asDictionary());
2067 } 2066 }
2068 2067
2069 void skpdfGraphicsStateApplyAIS(PdfContext* pdfContext, bool alphaSource) { 2068 void skpdfGraphicsStateApplyAIS(SkPdfContext* pdfContext, bool alphaSource) {
2070 pdfContext->fGraphicsState.fAlphaSource = alphaSource; 2069 pdfContext->fGraphicsState.fAlphaSource = alphaSource;
2071 } 2070 }
2072 2071
2073 2072
2074 //dictName gs (PDF 1.2) Set the specified parameters in the graphics state. dictN ame is 2073 //dictName gs (PDF 1.2) Set the specified parameters in the graphics state. dictN ame is
2075 //the name of a graphics state parameter dictionary in the ExtGState subdictiona ry of the current resource dictionary (see the next section). 2074 //the name of a graphics state parameter dictionary in the ExtGState subdictiona ry of the current resource dictionary (see the next section).
2076 static PdfResult PdfOp_gs(PdfContext* pdfContext, SkCanvas* canvas, PdfTokenLoop er** looper) { 2075 static SkPdfResult PdfOp_gs(SkPdfContext* pdfContext, SkCanvas* canvas, PdfToken Looper** looper) {
2077 SkPdfObject* name = pdfContext->fObjectStack.top(); pdfContext->fObjectSt ack.pop(); 2076 SkPdfNativeObject* name = pdfContext->fObjectStack.top(); pdfContext->fOb jectStack.pop();
2078 2077
2079 #ifdef PDF_TRACE 2078 #ifdef PDF_TRACE
2080 std::string str; 2079 std::string str;
2081 #endif 2080 #endif
2082 2081
2083 //Next, get the ExtGState Dictionary from the Resource Dictionary: 2082 //Next, get the ExtGState Dictionary from the Resource Dictionary:
2084 SkPdfDictionary* extGStateDictionary = pdfContext->fGraphicsState.fResources ->ExtGState(pdfContext->fPdfDoc); 2083 SkPdfDictionary* extGStateDictionary = pdfContext->fGraphicsState.fResources ->ExtGState(pdfContext->fPdfDoc);
2085 2084
2086 if (extGStateDictionary == NULL) { 2085 if (extGStateDictionary == NULL) {
2087 #ifdef PDF_TRACE 2086 #ifdef PDF_TRACE
2088 printf("ExtGState is NULL!\n"); 2087 printf("ExtGState is NULL!\n");
2089 #endif 2088 #endif
2090 return kIgnoreError_PdfResult; 2089 return kIgnoreError_SkPdfResult;
2091 } 2090 }
2092 2091
2093 SkPdfObject* value = pdfContext->fPdfDoc->resolveReference(extGStateDictiona ry->get(name)); 2092 SkPdfNativeObject* value = pdfContext->fPdfDoc->resolveReference(extGStateDi ctionary->get(name));
2094 2093
2095 if (kNone_SkPdfObjectType == pdfContext->fPdfDoc->mapper()->mapGraphicsState Dictionary(value)) { 2094 if (kNone_SkPdfNativeObjectType == pdfContext->fPdfDoc->mapper()->mapGraphic sStateDictionary(value)) {
2096 return kIgnoreError_PdfResult; 2095 return kIgnoreError_SkPdfResult;
2097 } 2096 }
2098 SkPdfGraphicsStateDictionary* gs = (SkPdfGraphicsStateDictionary*)value; 2097 SkPdfGraphicsStateDictionary* gs = (SkPdfGraphicsStateDictionary*)value;
2099 2098
2100 // TODO(edisonn): now load all those properties in graphic state. 2099 // TODO(edisonn): now load all those properties in graphic state.
2101 if (gs == NULL) { 2100 if (gs == NULL) {
2102 return kIgnoreError_PdfResult; 2101 return kIgnoreError_SkPdfResult;
2103 } 2102 }
2104 2103
2105 if (gs->has_LW()) { 2104 if (gs->has_LW()) {
2106 skpdfGraphicsStateApplyLW(pdfContext, gs->LW(pdfContext->fPdfDoc)); 2105 skpdfGraphicsStateApplyLW(pdfContext, gs->LW(pdfContext->fPdfDoc));
2107 } 2106 }
2108 2107
2109 if (gs->has_LC()) { 2108 if (gs->has_LC()) {
2110 skpdfGraphicsStateApplyLC(pdfContext, gs->LC(pdfContext->fPdfDoc)); 2109 skpdfGraphicsStateApplyLC(pdfContext, gs->LC(pdfContext->fPdfDoc));
2111 } 2110 }
2112 2111
(...skipping 38 matching lines...) Expand 10 before | Expand all | Expand 10 after
2151 } 2150 }
2152 2151
2153 if (gs->has_CA()) { 2152 if (gs->has_CA()) {
2154 skpdfGraphicsStateApply_CA(pdfContext, gs->CA(pdfContext->fPdfDoc)); 2153 skpdfGraphicsStateApply_CA(pdfContext, gs->CA(pdfContext->fPdfDoc));
2155 } 2154 }
2156 2155
2157 if (gs->has_AIS()) { 2156 if (gs->has_AIS()) {
2158 skpdfGraphicsStateApplyAIS(pdfContext, gs->AIS(pdfContext->fPdfDoc)); 2157 skpdfGraphicsStateApplyAIS(pdfContext, gs->AIS(pdfContext->fPdfDoc));
2159 } 2158 }
2160 2159
2161 return kOK_PdfResult; 2160 return kOK_SkPdfResult;
2162 } 2161 }
2163 2162
2164 //charSpace Tc Set the character spacing, Tc 2163 //charSpace Tc Set the character spacing, Tc
2165 //, to charSpace, which is a number expressed in unscaled text space units. Char acter spacing is used by the Tj, TJ, and ' operators. 2164 //, to charSpace, which is a number expressed in unscaled text space units. Char acter spacing is used by the Tj, TJ, and ' operators.
2166 //Initial value: 0. 2165 //Initial value: 0.
2167 PdfResult PdfOp_Tc(PdfContext* pdfContext, SkCanvas* canvas, PdfTokenLooper** lo oper) { 2166 SkPdfResult PdfOp_Tc(SkPdfContext* pdfContext, SkCanvas* canvas, PdfTokenLooper* * looper) {
2168 double charSpace = pdfContext->fObjectStack.top()->numberValue(); pdfCon text->fObjectStack.pop(); 2167 double charSpace = pdfContext->fObjectStack.top()->numberValue(); pdfCon text->fObjectStack.pop();
2169 pdfContext->fGraphicsState.fCharSpace = charSpace; 2168 pdfContext->fGraphicsState.fCharSpace = charSpace;
2170 2169
2171 return kOK_PdfResult; 2170 return kOK_SkPdfResult;
2172 } 2171 }
2173 2172
2174 //wordSpace Tw Set the word spacing, T 2173 //wordSpace Tw Set the word spacing, T
2175 //w 2174 //w
2176 //, to wordSpace, which is a number expressed in unscaled 2175 //, to wordSpace, which is a number expressed in unscaled
2177 //text space units. Word spacing is used by the Tj, TJ, and ' operators. Initial 2176 //text space units. Word spacing is used by the Tj, TJ, and ' operators. Initial
2178 //value: 0. 2177 //value: 0.
2179 PdfResult PdfOp_Tw(PdfContext* pdfContext, SkCanvas* canvas, PdfTokenLooper** lo oper) { 2178 SkPdfResult PdfOp_Tw(SkPdfContext* pdfContext, SkCanvas* canvas, PdfTokenLooper* * looper) {
2180 double wordSpace = pdfContext->fObjectStack.top()->numberValue(); pdfCon text->fObjectStack.pop(); 2179 double wordSpace = pdfContext->fObjectStack.top()->numberValue(); pdfCon text->fObjectStack.pop();
2181 pdfContext->fGraphicsState.fWordSpace = wordSpace; 2180 pdfContext->fGraphicsState.fWordSpace = wordSpace;
2182 2181
2183 return kOK_PdfResult; 2182 return kOK_SkPdfResult;
2184 } 2183 }
2185 2184
2186 //scale Tz Set the horizontal scaling, Th 2185 //scale Tz Set the horizontal scaling, Th
2187 //, to (scale ˜ 100). scale is a number specifying the 2186 //, to (scale ˜ 100). scale is a number specifying the
2188 //percentage of the normal width. Initial value: 100 (normal width). 2187 //percentage of the normal width. Initial value: 100 (normal width).
2189 static PdfResult PdfOp_Tz(PdfContext* pdfContext, SkCanvas* canvas, PdfTokenLoop er** looper) { 2188 static SkPdfResult PdfOp_Tz(SkPdfContext* pdfContext, SkCanvas* canvas, PdfToken Looper** looper) {
2190 /*double scale = */pdfContext->fObjectStack.top()->numberValue(); pdfCon text->fObjectStack.pop(); 2189 /*double scale = */pdfContext->fObjectStack.top()->numberValue(); pdfCon text->fObjectStack.pop();
2191 2190
2192 return kNYI_PdfResult; 2191 return kNYI_SkPdfResult;
2193 } 2192 }
2194 2193
2195 //render Tr Set the text rendering mode, T 2194 //render Tr Set the text rendering mode, T
2196 //mode, to render, which is an integer. Initial value: 0. 2195 //mode, to render, which is an integer. Initial value: 0.
2197 static PdfResult PdfOp_Tr(PdfContext* pdfContext, SkCanvas* canvas, PdfTokenLoop er** looper) { 2196 static SkPdfResult PdfOp_Tr(SkPdfContext* pdfContext, SkCanvas* canvas, PdfToken Looper** looper) {
2198 /*double render = */pdfContext->fObjectStack.top()->numberValue(); pdfCo ntext->fObjectStack.pop(); 2197 /*double render = */pdfContext->fObjectStack.top()->numberValue(); pdfCo ntext->fObjectStack.pop();
2199 2198
2200 return kNYI_PdfResult; 2199 return kNYI_SkPdfResult;
2201 } 2200 }
2202 //rise Ts Set the text rise, Trise, to rise, which is a number expressed in unsc aled text space 2201 //rise Ts Set the text rise, Trise, to rise, which is a number expressed in unsc aled text space
2203 //units. Initial value: 0. 2202 //units. Initial value: 0.
2204 static PdfResult PdfOp_Ts(PdfContext* pdfContext, SkCanvas* canvas, PdfTokenLoop er** looper) { 2203 static SkPdfResult PdfOp_Ts(SkPdfContext* pdfContext, SkCanvas* canvas, PdfToken Looper** looper) {
2205 /*double rise = */pdfContext->fObjectStack.top()->numberValue(); pdfCont ext->fObjectStack.pop(); 2204 /*double rise = */pdfContext->fObjectStack.top()->numberValue(); pdfCont ext->fObjectStack.pop();
2206 2205
2207 return kNYI_PdfResult; 2206 return kNYI_SkPdfResult;
2208 } 2207 }
2209 2208
2210 //wx wy d0 2209 //wx wy d0
2211 static PdfResult PdfOp_d0(PdfContext* pdfContext, SkCanvas* canvas, PdfTokenLoop er** looper) { 2210 static SkPdfResult PdfOp_d0(SkPdfContext* pdfContext, SkCanvas* canvas, PdfToken Looper** looper) {
2212 pdfContext->fObjectStack.pop(); 2211 pdfContext->fObjectStack.pop();
2213 pdfContext->fObjectStack.pop(); 2212 pdfContext->fObjectStack.pop();
2214 2213
2215 return kNYI_PdfResult; 2214 return kNYI_SkPdfResult;
2216 } 2215 }
2217 2216
2218 //wx wy llx lly urx ury d1 2217 //wx wy llx lly urx ury d1
2219 static PdfResult PdfOp_d1(PdfContext* pdfContext, SkCanvas* canvas, PdfTokenLoop er** looper) { 2218 static SkPdfResult PdfOp_d1(SkPdfContext* pdfContext, SkCanvas* canvas, PdfToken Looper** looper) {
2220 pdfContext->fObjectStack.pop(); 2219 pdfContext->fObjectStack.pop();
2221 pdfContext->fObjectStack.pop(); 2220 pdfContext->fObjectStack.pop();
2222 pdfContext->fObjectStack.pop(); 2221 pdfContext->fObjectStack.pop();
2223 pdfContext->fObjectStack.pop(); 2222 pdfContext->fObjectStack.pop();
2224 pdfContext->fObjectStack.pop(); 2223 pdfContext->fObjectStack.pop();
2225 pdfContext->fObjectStack.pop(); 2224 pdfContext->fObjectStack.pop();
2226 2225
2227 return kNYI_PdfResult; 2226 return kNYI_SkPdfResult;
2228 } 2227 }
2229 2228
2230 //name sh 2229 //name sh
2231 static PdfResult PdfOp_sh(PdfContext* pdfContext, SkCanvas* canvas, PdfTokenLoop er** looper) { 2230 static SkPdfResult PdfOp_sh(SkPdfContext* pdfContext, SkCanvas* canvas, PdfToken Looper** looper) {
2232 pdfContext->fObjectStack.pop(); 2231 pdfContext->fObjectStack.pop();
2233 2232
2234 return kNYI_PdfResult; 2233 return kNYI_SkPdfResult;
2235 } 2234 }
2236 2235
2237 //name Do 2236 //name Do
2238 static PdfResult PdfOp_Do(PdfContext* pdfContext, SkCanvas* canvas, PdfTokenLoop er** looper) { 2237 static SkPdfResult PdfOp_Do(SkPdfContext* pdfContext, SkCanvas* canvas, PdfToken Looper** looper) {
2239 SkPdfObject* name = pdfContext->fObjectStack.top(); pdfContext->fObjectSt ack.pop(); 2238 SkPdfNativeObject* name = pdfContext->fObjectStack.top(); pdfContext->fOb jectStack.pop();
2240 2239
2241 SkPdfDictionary* xObject = pdfContext->fGraphicsState.fResources->XObject(p dfContext->fPdfDoc); 2240 SkPdfDictionary* xObject = pdfContext->fGraphicsState.fResources->XObject(p dfContext->fPdfDoc);
2242 2241
2243 if (xObject == NULL) { 2242 if (xObject == NULL) {
2244 #ifdef PDF_TRACE 2243 #ifdef PDF_TRACE
2245 printf("XObject is NULL!\n"); 2244 printf("XObject is NULL!\n");
2246 #endif 2245 #endif
2247 return kIgnoreError_PdfResult; 2246 return kIgnoreError_SkPdfResult;
2248 } 2247 }
2249 2248
2250 SkPdfObject* value = xObject->get(name); 2249 SkPdfNativeObject* value = xObject->get(name);
2251 value = pdfContext->fPdfDoc->resolveReference(value); 2250 value = pdfContext->fPdfDoc->resolveReference(value);
2252 2251
2253 #ifdef PDF_TRACE 2252 #ifdef PDF_TRACE
2254 // value->ToString(str); 2253 // value->ToString(str);
2255 // printf("Do object value: %s\n", str); 2254 // printf("Do object value: %s\n", str);
2256 #endif 2255 #endif
2257 2256
2258 return doXObject(pdfContext, canvas, value); 2257 return doXObject(pdfContext, canvas, value);
2259 } 2258 }
2260 2259
2261 //tag MP Designate a marked-content point. tag is a name object indicating the r ole or 2260 //tag MP Designate a marked-content point. tag is a name object indicating the r ole or
2262 //significance of the point. 2261 //significance of the point.
2263 static PdfResult PdfOp_MP(PdfContext* pdfContext, SkCanvas* canvas, PdfTokenLoop er** looper) { 2262 static SkPdfResult PdfOp_MP(SkPdfContext* pdfContext, SkCanvas* canvas, PdfToken Looper** looper) {
2264 pdfContext->fObjectStack.pop(); 2263 pdfContext->fObjectStack.pop();
2265 2264
2266 return kNYI_PdfResult; 2265 return kNYI_SkPdfResult;
2267 } 2266 }
2268 2267
2269 //tag properties DP Designate a marked-content point with an associated property list. tag is a 2268 //tag properties DP Designate a marked-content point with an associated property list. tag is a
2270 //name object indicating the role or significance of the point; properties is 2269 //name object indicating the role or significance of the point; properties is
2271 //either an inline dictionary containing the property list or a name object 2270 //either an inline dictionary containing the property list or a name object
2272 //associated with it in the Properties subdictionary of the current resource 2271 //associated with it in the Properties subdictionary of the current resource
2273 //dictionary (see Section 9.5.1, “Property Lists”). 2272 //dictionary (see Section 9.5.1, “Property Lists”).
2274 static PdfResult PdfOp_DP(PdfContext* pdfContext, SkCanvas* canvas, PdfTokenLoop er** looper) { 2273 static SkPdfResult PdfOp_DP(SkPdfContext* pdfContext, SkCanvas* canvas, PdfToken Looper** looper) {
2275 pdfContext->fObjectStack.pop(); 2274 pdfContext->fObjectStack.pop();
2276 pdfContext->fObjectStack.pop(); 2275 pdfContext->fObjectStack.pop();
2277 2276
2278 return kNYI_PdfResult; 2277 return kNYI_SkPdfResult;
2279 } 2278 }
2280 2279
2281 //tag BMC Begin a marked-content sequence terminated by a balancing EMC operator . 2280 //tag BMC Begin a marked-content sequence terminated by a balancing EMC operator .
2282 //tag is a name object indicating the role or significance of the sequence. 2281 //tag is a name object indicating the role or significance of the sequence.
2283 static PdfResult PdfOp_BMC(PdfContext* pdfContext, SkCanvas* canvas, PdfTokenLoo per** looper) { 2282 static SkPdfResult PdfOp_BMC(SkPdfContext* pdfContext, SkCanvas* canvas, PdfToke nLooper** looper) {
2284 pdfContext->fObjectStack.pop(); 2283 pdfContext->fObjectStack.pop();
2285 2284
2286 return kNYI_PdfResult; 2285 return kNYI_SkPdfResult;
2287 } 2286 }
2288 2287
2289 //tag properties BDC Begin a marked-content sequence with an associated property list, terminated 2288 //tag properties BDC Begin a marked-content sequence with an associated property list, terminated
2290 //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 2289 //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
2291 //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”). 2290 //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”).
2292 static PdfResult PdfOp_BDC(PdfContext* pdfContext, SkCanvas* canvas, PdfTokenLoo per** looper) { 2291 static SkPdfResult PdfOp_BDC(SkPdfContext* pdfContext, SkCanvas* canvas, PdfToke nLooper** looper) {
2293 pdfContext->fObjectStack.pop(); 2292 pdfContext->fObjectStack.pop();
2294 pdfContext->fObjectStack.pop(); 2293 pdfContext->fObjectStack.pop();
2295 2294
2296 return kNYI_PdfResult; 2295 return kNYI_SkPdfResult;
2297 } 2296 }
2298 2297
2299 //— EMC End a marked-content sequence begun by a BMC or BDC operator. 2298 //— EMC End a marked-content sequence begun by a BMC or BDC operator.
2300 static PdfResult PdfOp_EMC(PdfContext* pdfContext, SkCanvas* canvas, PdfTokenLoo per** looper) { 2299 static SkPdfResult PdfOp_EMC(SkPdfContext* pdfContext, SkCanvas* canvas, PdfToke nLooper** looper) {
2301 return kNYI_PdfResult; 2300 return kNYI_SkPdfResult;
2302 } 2301 }
2303 2302
2304 static void initPdfOperatorRenderes() { 2303 static void initPdfOperatorRenderes() {
2305 static bool gInitialized = false; 2304 static bool gInitialized = false;
2306 if (gInitialized) { 2305 if (gInitialized) {
2307 return; 2306 return;
2308 } 2307 }
2309 2308
2310 gPdfOps.set("q", PdfOp_q); 2309 gPdfOps.set("q", PdfOp_q);
2311 gPdfOps.set("Q", PdfOp_Q); 2310 gPdfOps.set("Q", PdfOp_Q);
(...skipping 92 matching lines...) Expand 10 before | Expand all | Expand 10 after
2404 InitPdfOps() { 2403 InitPdfOps() {
2405 initPdfOperatorRenderes(); 2404 initPdfOperatorRenderes();
2406 } 2405 }
2407 }; 2406 };
2408 2407
2409 InitPdfOps gInitPdfOps; 2408 InitPdfOps gInitPdfOps;
2410 2409
2411 void reportPdfRenderStats() { 2410 void reportPdfRenderStats() {
2412 std::map<std::string, int>::iterator iter; 2411 std::map<std::string, int>::iterator iter;
2413 2412
2414 for (int i = 0 ; i < kCount_PdfResult; i++) { 2413 for (int i = 0 ; i < kCount_SkPdfResult; i++) {
2415 SkTDict<int>::Iter iter(gRenderStats[i]); 2414 SkTDict<int>::Iter iter(gRenderStats[i]);
2416 const char* key; 2415 const char* key;
2417 int value = 0; 2416 int value = 0;
2418 while ((key = iter.next(&value)) != NULL) { 2417 while ((key = iter.next(&value)) != NULL) {
2419 printf("%s: %s -> count %i\n", gRenderStatsNames[i], key, value); 2418 printf("%s: %s -> count %i\n", gRenderStatsNames[i], key, value);
2420 } 2419 }
2421 } 2420 }
2422 } 2421 }
2423 2422
2424 PdfResult PdfMainLooper::consumeToken(PdfToken& token) { 2423 SkPdfResult PdfMainLooper::consumeToken(PdfToken& token) {
2425 if (token.fType == kKeyword_TokenType && token.fKeywordLength < 256) 2424 if (token.fType == kKeyword_TokenType && token.fKeywordLength < 256)
2426 { 2425 {
2427 // TODO(edisonn): log trace flag (verbose, error, info, warning, ...) 2426 // TODO(edisonn): log trace flag (verbose, error, info, warning, ...)
2428 PdfOperatorRenderer pdfOperatorRenderer = NULL; 2427 PdfOperatorRenderer pdfOperatorRenderer = NULL;
2429 if (gPdfOps.find(token.fKeyword, token.fKeywordLength, &pdfOperatorRende rer) && pdfOperatorRenderer) { 2428 if (gPdfOps.find(token.fKeyword, token.fKeywordLength, &pdfOperatorRende rer) && pdfOperatorRenderer) {
2430 // caller, main work is done by pdfOperatorRenderer(...) 2429 // caller, main work is done by pdfOperatorRenderer(...)
2431 PdfTokenLooper* childLooper = NULL; 2430 PdfTokenLooper* childLooper = NULL;
2432 PdfResult result = pdfOperatorRenderer(fPdfContext, fCanvas, &childL ooper); 2431 SkPdfResult result = pdfOperatorRenderer(fPdfContext, fCanvas, &chil dLooper);
2433 2432
2434 int cnt = 0; 2433 int cnt = 0;
2435 gRenderStats[result].find(token.fKeyword, token.fKeywordLength, &cnt ); 2434 gRenderStats[result].find(token.fKeyword, token.fKeywordLength, &cnt );
2436 gRenderStats[result].set(token.fKeyword, token.fKeywordLength, cnt + 1); 2435 gRenderStats[result].set(token.fKeyword, token.fKeywordLength, cnt + 1);
2437 2436
2438 if (childLooper) { 2437 if (childLooper) {
2439 childLooper->setUp(this); 2438 childLooper->setUp(this);
2440 childLooper->loop(); 2439 childLooper->loop();
2441 delete childLooper; 2440 delete childLooper;
2442 } 2441 }
2443 } else { 2442 } else {
2444 int cnt = 0; 2443 int cnt = 0;
2445 gRenderStats[kUnsupported_PdfResult].find(token.fKeyword, token.fKey wordLength, &cnt); 2444 gRenderStats[kUnsupported_SkPdfResult].find(token.fKeyword, token.fK eywordLength, &cnt);
2446 gRenderStats[kUnsupported_PdfResult].set(token.fKeyword, token.fKeyw ordLength, cnt + 1); 2445 gRenderStats[kUnsupported_SkPdfResult].set(token.fKeyword, token.fKe ywordLength, cnt + 1);
2447 } 2446 }
2448 } 2447 }
2449 else if (token.fType == kObject_TokenType) 2448 else if (token.fType == kObject_TokenType)
2450 { 2449 {
2451 fPdfContext->fObjectStack.push( token.fObject ); 2450 fPdfContext->fObjectStack.push( token.fObject );
2452 } 2451 }
2453 else { 2452 else {
2454 // TODO(edisonn): deine or use assert not reached 2453 // TODO(edisonn): deine or use assert not reached
2455 return kIgnoreError_PdfResult; 2454 return kIgnoreError_SkPdfResult;
2456 } 2455 }
2457 return kOK_PdfResult; 2456 return kOK_SkPdfResult;
2458 } 2457 }
2459 2458
2460 void PdfMainLooper::loop() { 2459 void PdfMainLooper::loop() {
2461 PdfToken token; 2460 PdfToken token;
2462 while (readToken(fTokenizer, &token)) { 2461 while (readToken(fTokenizer, &token)) {
2463 consumeToken(token); 2462 consumeToken(token);
2464 } 2463 }
2465 } 2464 }
2466 2465
2467 PdfResult PdfInlineImageLooper::consumeToken(PdfToken& token) { 2466 SkPdfResult PdfInlineImageLooper::consumeToken(PdfToken& token) {
2468 SkASSERT(false); 2467 SkASSERT(false);
2469 return kIgnoreError_PdfResult; 2468 return kIgnoreError_SkPdfResult;
2470 } 2469 }
2471 2470
2472 void PdfInlineImageLooper::loop() { 2471 void PdfInlineImageLooper::loop() {
2473 doXObject_Image(fPdfContext, fCanvas, fTokenizer->readInlineImage()); 2472 doXObject_Image(fPdfContext, fCanvas, fTokenizer->readInlineImage());
2474 } 2473 }
2475 2474
2476 PdfResult PdfInlineImageLooper::done() { 2475 SkPdfResult PdfInlineImageLooper::done() {
2477 return kNYI_PdfResult; 2476 return kNYI_SkPdfResult;
2478 } 2477 }
2479 2478
2480 PdfResult PdfCompatibilitySectionLooper::consumeToken(PdfToken& token) { 2479 SkPdfResult PdfCompatibilitySectionLooper::consumeToken(PdfToken& token) {
2481 return fParent->consumeToken(token); 2480 return fParent->consumeToken(token);
2482 } 2481 }
2483 2482
2484 void PdfCompatibilitySectionLooper::loop() { 2483 void PdfCompatibilitySectionLooper::loop() {
2485 // TODO(edisonn): save stacks position, or create a new stack? 2484 // TODO(edisonn): save stacks position, or create a new stack?
2486 // TODO(edisonn): what happens if we pop out more variables then when we sta rted? 2485 // TODO(edisonn): what happens if we pop out more variables then when we sta rted?
2487 // restore them? fail? We could create a new operands stack for every new BX /EX section, 2486 // restore them? fail? We could create a new operands stack for every new BX /EX section,
2488 // pop-ing too much will not affect outside the section. 2487 // pop-ing too much will not affect outside the section.
2489 PdfToken token; 2488 PdfToken token;
2490 while (readToken(fTokenizer, &token)) { 2489 while (readToken(fTokenizer, &token)) {
(...skipping 14 matching lines...) Expand all
2505 // TODO(edisonn): Add API for Forms viewing and editing 2504 // TODO(edisonn): Add API for Forms viewing and editing
2506 // e.g. SkBitmap getPage(int page); 2505 // e.g. SkBitmap getPage(int page);
2507 // int formsCount(); 2506 // int formsCount();
2508 // SkForm getForm(int formID); // SkForm(SkRect, .. other data) 2507 // SkForm getForm(int formID); // SkForm(SkRect, .. other data)
2509 // TODO (edisonn): Add intend when loading pdf, for example: for viewing, parsin g all content, ... 2508 // TODO (edisonn): Add intend when loading pdf, for example: for viewing, parsin g all content, ...
2510 // if we load the first page, and we zoom to fit to screen horizontally, then lo ad only those 2509 // if we load the first page, and we zoom to fit to screen horizontally, then lo ad only those
2511 // resources needed, so the preview is fast. 2510 // resources needed, so the preview is fast.
2512 // TODO (edisonn): hide parser/tokenizer behind and interface and a query langua ge, and resolve 2511 // TODO (edisonn): hide parser/tokenizer behind and interface and a query langua ge, and resolve
2513 // references automatically. 2512 // references automatically.
2514 2513
2515 PdfContext* gPdfContext = NULL; 2514 SkPdfContext* gPdfContext = NULL;
2516 2515
2517 bool SkPdfRenderer::renderPage(int page, SkCanvas* canvas, const SkRect& dst) co nst { 2516 bool SkPdfRenderer::renderPage(int page, SkCanvas* canvas, const SkRect& dst) co nst {
2518 if (!fPdfDoc) { 2517 if (!fPdfDoc) {
2519 return false; 2518 return false;
2520 } 2519 }
2521 2520
2522 if (page < 0 || page >= pages()) { 2521 if (page < 0 || page >= pages()) {
2523 return false; 2522 return false;
2524 } 2523 }
2525 2524
2526 PdfContext pdfContext(fPdfDoc); 2525 SkPdfContext pdfContext(fPdfDoc);
2527 2526
2528 pdfContext.fOriginalMatrix = SkMatrix::I(); 2527 pdfContext.fOriginalMatrix = SkMatrix::I();
2529 pdfContext.fGraphicsState.fResources = fPdfDoc->pageResources(page); 2528 pdfContext.fGraphicsState.fResources = fPdfDoc->pageResources(page);
2530 2529
2531 gPdfContext = &pdfContext; 2530 gPdfContext = &pdfContext;
2532 2531
2533 // TODO(edisonn): get matrix stuff right. 2532 // TODO(edisonn): get matrix stuff right.
2534 SkScalar z = SkIntToScalar(0); 2533 SkScalar z = SkIntToScalar(0);
2535 SkScalar w = dst.width(); 2534 SkScalar w = dst.width();
2536 SkScalar h = dst.height(); 2535 SkScalar h = dst.height();
(...skipping 46 matching lines...) Expand 10 before | Expand all | Expand 10 after
2583 2582
2584 2583
2585 canvas->flush(); 2584 canvas->flush();
2586 return true; 2585 return true;
2587 } 2586 }
2588 2587
2589 bool SkPdfRenderer::load(const SkString inputFileName) { 2588 bool SkPdfRenderer::load(const SkString inputFileName) {
2590 unload(); 2589 unload();
2591 2590
2592 // TODO(edisonn): create static function that could return NULL if there are errors 2591 // TODO(edisonn): create static function that could return NULL if there are errors
2593 fPdfDoc = new SkNativeParsedPDF(inputFileName.c_str()); 2592 fPdfDoc = new SkPdfNativeDoc(inputFileName.c_str());
2594 if (fPdfDoc->pages() == 0) { 2593 if (fPdfDoc->pages() == 0) {
2595 delete fPdfDoc; 2594 delete fPdfDoc;
2596 fPdfDoc = NULL; 2595 fPdfDoc = NULL;
2597 } 2596 }
2598 2597
2599 return fPdfDoc != NULL; 2598 return fPdfDoc != NULL;
2600 } 2599 }
2601 2600
2602 bool SkPdfRenderer::load(SkStream* stream) { 2601 bool SkPdfRenderer::load(SkStream* stream) {
2603 unload(); 2602 unload();
2604 2603
2605 // TODO(edisonn): create static function that could return NULL if there are errors 2604 // TODO(edisonn): create static function that could return NULL if there are errors
2606 fPdfDoc = new SkNativeParsedPDF(stream); 2605 fPdfDoc = new SkPdfNativeDoc(stream);
2607 if (fPdfDoc->pages() == 0) { 2606 if (fPdfDoc->pages() == 0) {
2608 delete fPdfDoc; 2607 delete fPdfDoc;
2609 fPdfDoc = NULL; 2608 fPdfDoc = NULL;
2610 } 2609 }
2611 2610
2612 return fPdfDoc != NULL; 2611 return fPdfDoc != NULL;
2613 } 2612 }
2614 2613
2615 2614
2616 int SkPdfRenderer::pages() const { 2615 int SkPdfRenderer::pages() const {
(...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after
2650 2649
2651 rect = SkRect::MakeWH(width, height); 2650 rect = SkRect::MakeWH(width, height);
2652 2651
2653 setup_bitmap(output, (int)SkScalarToDouble(width), (int)SkScalarToDouble(hei ght)); 2652 setup_bitmap(output, (int)SkScalarToDouble(width), (int)SkScalarToDouble(hei ght));
2654 2653
2655 SkAutoTUnref<SkDevice> device(SkNEW_ARGS(SkDevice, (*output))); 2654 SkAutoTUnref<SkDevice> device(SkNEW_ARGS(SkDevice, (*output)));
2656 SkCanvas canvas(device); 2655 SkCanvas canvas(device);
2657 2656
2658 return renderer.renderPage(page, &canvas, rect); 2657 return renderer.renderPage(page, &canvas, rect);
2659 } 2658 }
OLDNEW
« no previous file with comments | « experimental/PdfViewer/SkPdfRenderer.h ('k') | experimental/PdfViewer/SkPdfUtils.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698