OLD | NEW |
1 /* | 1 /* |
2 * Copyright 2013 Google Inc. | 2 * Copyright 2013 Google Inc. |
3 * | 3 * |
4 * Use of this source code is governed by a BSD-style license that can be | 4 * Use of this source code is governed by a BSD-style license that can be |
5 * found in the LICENSE file. | 5 * found in the LICENSE file. |
6 */ | 6 */ |
7 | 7 |
8 #include "SkCanvas.h" | 8 #include "SkCanvas.h" |
9 #include "SkDevice.h" | 9 #include "SkDevice.h" |
10 #include "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 | 20 |
20 #include "SkPdfBasics.h" | 21 #include "SkPdfBasics.h" |
21 #include "SkPdfNativeTokenizer.h" | 22 #include "SkPdfNativeTokenizer.h" |
22 | |
23 #include <iostream> | |
24 #include <cstdio> | 23 #include <cstdio> |
25 #include <stack> | 24 #include <stack> |
26 #include <set> | 25 #include <set> |
27 | 26 |
28 extern "C" PdfContext* gPdfContext; | 27 extern "C" PdfContext* gPdfContext; |
29 extern "C" SkBitmap* gDumpBitmap; | 28 extern "C" SkBitmap* gDumpBitmap; |
30 extern "C" SkCanvas* gDumpCanvas; | 29 extern "C" SkCanvas* gDumpCanvas; |
31 | 30 |
32 __SK_FORCE_IMAGE_DECODER_LINKING; | 31 __SK_FORCE_IMAGE_DECODER_LINKING; |
33 | 32 |
(...skipping 37 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
71 * - wrapper on classes for customizations? e.g. | 70 * - wrapper on classes for customizations? e.g. |
72 * SkPdfPageObjectVanila - has only the basic loaders/getters | 71 * SkPdfPageObjectVanila - has only the basic loaders/getters |
73 * SkPdfPageObject : public SkPdfPageObjectVanila, extends, and I can add custom
izations here | 72 * SkPdfPageObject : public SkPdfPageObjectVanila, extends, and I can add custom
izations here |
74 * need to find a nice object model for all this with constructors and factories | 73 * need to find a nice object model for all this with constructors and factories |
75 * - deal with inheritable automatically ? | 74 * - deal with inheritable automatically ? |
76 * - deal with specific type in spec directly, add all dictionary types to known
types | 75 * - deal with specific type in spec directly, add all dictionary types to known
types |
77 */ | 76 */ |
78 | 77 |
79 using namespace std; | 78 using namespace std; |
80 | 79 |
| 80 NotOwnedString strings_DeviceRGB; |
| 81 NotOwnedString strings_DeviceCMYK; |
81 | 82 |
| 83 class StringsInit { |
| 84 public: |
| 85 StringsInit() { |
| 86 NotOwnedString::init(&strings_DeviceRGB, "DeviceRGB"); |
| 87 NotOwnedString::init(&strings_DeviceCMYK, "DeviceCMYK"); |
| 88 } |
| 89 }; |
| 90 |
| 91 StringsInit gStringsInit; |
82 | 92 |
83 // TODO(edisonn): Document PdfTokenLooper and subclasses. | 93 // TODO(edisonn): Document PdfTokenLooper and subclasses. |
84 class PdfTokenLooper { | 94 class PdfTokenLooper { |
85 protected: | 95 protected: |
86 PdfTokenLooper* fParent; | 96 PdfTokenLooper* fParent; |
87 SkPdfNativeTokenizer* fTokenizer; | 97 SkPdfNativeTokenizer* fTokenizer; |
88 PdfContext* fPdfContext; | 98 PdfContext* fPdfContext; |
89 SkCanvas* fCanvas; | 99 SkCanvas* fCanvas; |
90 | 100 |
91 public: | 101 public: |
(...skipping 51 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
143 | 153 |
144 // Utilities | 154 // Utilities |
145 static void setup_bitmap(SkBitmap* bitmap, int width, int height, SkColor color
= SK_ColorWHITE) { | 155 static void setup_bitmap(SkBitmap* bitmap, int width, int height, SkColor color
= SK_ColorWHITE) { |
146 bitmap->setConfig(SkBitmap::kARGB_8888_Config, width, height); | 156 bitmap->setConfig(SkBitmap::kARGB_8888_Config, width, height); |
147 | 157 |
148 bitmap->allocPixels(); | 158 bitmap->allocPixels(); |
149 bitmap->eraseColor(color); | 159 bitmap->eraseColor(color); |
150 } | 160 } |
151 | 161 |
152 // TODO(edisonn): synonyms? DeviceRGB and RGB ... | 162 // TODO(edisonn): synonyms? DeviceRGB and RGB ... |
153 static int GetColorSpaceComponents(const std::string& colorSpace) { | 163 static int GetColorSpaceComponents(NotOwnedString& colorSpace) { |
154 if (colorSpace == "DeviceCMYK") { | 164 if (colorSpace.equals("DeviceCMYK")) { |
155 return 4; | 165 return 4; |
156 } else if (colorSpace == "DeviceGray" || | 166 } else if (colorSpace.equals("DeviceGray") || |
157 colorSpace == "CalGray" || | 167 colorSpace.equals("CalGray") || |
158 colorSpace == "Indexed") { | 168 colorSpace.equals("Indexed")) { |
159 return 1; | 169 return 1; |
160 } else if (colorSpace == "DeviceRGB" || | 170 } else if (colorSpace.equals("DeviceRGB") || |
161 colorSpace == "CalRGB" || | 171 colorSpace.equals("CalRGB") || |
162 colorSpace == "Lab") { | 172 colorSpace.equals("Lab")) { |
163 return 3; | 173 return 3; |
164 } else { | 174 } else { |
165 return 0; | 175 return 0; |
166 } | 176 } |
167 } | 177 } |
168 | 178 |
169 SkMatrix SkMatrixFromPdfMatrix(double array[6]) { | 179 SkMatrix SkMatrixFromPdfMatrix(double array[6]) { |
170 SkMatrix matrix; | 180 SkMatrix matrix; |
171 matrix.setAll(SkDoubleToScalar(array[0]), | 181 matrix.setAll(SkDoubleToScalar(array[0]), |
172 SkDoubleToScalar(array[2]), | 182 SkDoubleToScalar(array[2]), |
(...skipping 137 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
310 } | 320 } |
311 #endif | 321 #endif |
312 | 322 |
313 return ret; | 323 return ret; |
314 } | 324 } |
315 | 325 |
316 | 326 |
317 | 327 |
318 typedef PdfResult (*PdfOperatorRenderer)(PdfContext*, SkCanvas*, PdfTokenLooper*
*); | 328 typedef PdfResult (*PdfOperatorRenderer)(PdfContext*, SkCanvas*, PdfTokenLooper*
*); |
319 | 329 |
320 map<std::string, PdfOperatorRenderer> gPdfOps; | 330 SkTDict<PdfOperatorRenderer> gPdfOps(100); |
321 | 331 |
322 map<std::string, int> gRenderStats[kCount_PdfResult]; | 332 |
| 333 template <typename T> class SkTDictWithDefaultConstructor : public SkTDict<T> { |
| 334 public: |
| 335 SkTDictWithDefaultConstructor() : SkTDict<T>(10) {} |
| 336 }; |
| 337 |
| 338 SkTDictWithDefaultConstructor<int> gRenderStats[kCount_PdfResult]; |
323 | 339 |
324 const char* gRenderStatsNames[kCount_PdfResult] = { | 340 const char* gRenderStatsNames[kCount_PdfResult] = { |
325 "Success", | 341 "Success", |
326 "Partially implemented", | 342 "Partially implemented", |
327 "Not yet implemented", | 343 "Not yet implemented", |
328 "Ignore Error", | 344 "Ignore Error", |
329 "Error", | 345 "Error", |
330 "Unsupported/Unknown" | 346 "Unsupported/Unknown" |
331 }; | 347 }; |
332 | 348 |
(...skipping 79 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
412 if (grayColortable == NULL) { | 428 if (grayColortable == NULL) { |
413 SkPMColor* colors = new SkPMColor[256]; | 429 SkPMColor* colors = new SkPMColor[256]; |
414 for (int i = 0 ; i < 256; i++) { | 430 for (int i = 0 ; i < 256; i++) { |
415 colors[i] = SkPreMultiplyARGB(255, i, i, i); | 431 colors[i] = SkPreMultiplyARGB(255, i, i, i); |
416 } | 432 } |
417 grayColortable = new SkColorTable(colors, 256); | 433 grayColortable = new SkColorTable(colors, 256); |
418 } | 434 } |
419 return grayColortable; | 435 return grayColortable; |
420 } | 436 } |
421 | 437 |
422 static SkBitmap transferImageStreamToBitmap(unsigned char* uncompressedStream, s
ize_t uncompressedStreamLength, | 438 static SkBitmap transferImageStreamToBitmap(const unsigned char* uncompressedStr
eam, size_t uncompressedStreamLength, |
423 int width, int height, int bytesPerLine, | 439 int width, int height, int bytesPerLine, |
424 int bpc, const std::string& colorSpace, | 440 int bpc, const std::string& colorSpace, |
425 bool transparencyMask) { | 441 bool transparencyMask) { |
426 SkBitmap bitmap; | 442 SkBitmap bitmap; |
427 | 443 |
428 //int components = GetColorSpaceComponents(colorSpace); | 444 //int components = GetColorSpaceComponents(colorSpace); |
429 //#define MAX_COMPONENTS 10 | 445 //#define MAX_COMPONENTS 10 |
430 | 446 |
431 // TODO(edisonn): assume start of lines are aligned at 32 bits? | 447 // TODO(edisonn): assume start of lines are aligned at 32 bits? |
432 // Is there a faster way to load the uncompressed stream into a bitmap? | 448 // Is there a faster way to load the uncompressed stream into a bitmap? |
(...skipping 68 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
501 | 517 |
502 if (imageMask) { | 518 if (imageMask) { |
503 if (bpc != 0 && bpc != 1) { | 519 if (bpc != 0 && bpc != 1) { |
504 // TODO(edisonn): report warning to be used in testing. | 520 // TODO(edisonn): report warning to be used in testing. |
505 return SkBitmap(); | 521 return SkBitmap(); |
506 } | 522 } |
507 bpc = 1; | 523 bpc = 1; |
508 } | 524 } |
509 */ | 525 */ |
510 | 526 |
511 unsigned char* uncompressedStream = NULL; | 527 const unsigned char* uncompressedStream = NULL; |
512 size_t uncompressedStreamLength = 0; | 528 size_t uncompressedStreamLength = 0; |
513 | 529 |
514 SkPdfStream* stream = (SkPdfStream*)image; | 530 SkPdfStream* stream = (SkPdfStream*)image; |
515 | 531 |
516 if (!stream || !stream->GetFilteredStreamRef(&uncompressedStream, &uncompres
sedStreamLength, pdfContext->fPdfDoc->allocator()) || | 532 if (!stream || !stream->GetFilteredStreamRef(&uncompressedStream, &uncompres
sedStreamLength) || |
517 uncompressedStream == NULL || uncompressedStreamLength == 0) { | 533 uncompressedStream == NULL || uncompressedStreamLength == 0) { |
518 // TODO(edisonn): report warning to be used in testing. | 534 // TODO(edisonn): report warning to be used in testing. |
519 return SkBitmap(); | 535 return SkBitmap(); |
520 } | 536 } |
521 | 537 |
522 SkPdfStreamCommonDictionary* streamDict = (SkPdfStreamCommonDictionary*)stre
am; | 538 SkPdfStreamCommonDictionary* streamDict = (SkPdfStreamCommonDictionary*)stre
am; |
523 | 539 |
524 if (streamDict->has_Filter() && ((streamDict->isFilterAName(NULL) && | 540 if (streamDict->has_Filter() && ((streamDict->isFilterAName(NULL) && |
525 streamDict->getFilterAsName(NULL) == "
DCTDecode") || | 541 streamDict->getFilterAsName(NULL) == "
DCTDecode") || |
526 (streamDict->isFilterAArray(NULL) && | 542 (streamDict->isFilterAArray(NULL) && |
(...skipping 120 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
647 | 663 |
648 if (skobj->has_BBox()) { | 664 if (skobj->has_BBox()) { |
649 canvas->clipRect(skobj->BBox(pdfContext->fPdfDoc), SkRegion::kIntersect_
Op, true); // TODO(edisonn): AA from settings. | 665 canvas->clipRect(skobj->BBox(pdfContext->fPdfDoc), SkRegion::kIntersect_
Op, true); // TODO(edisonn): AA from settings. |
650 } | 666 } |
651 | 667 |
652 // TODO(edisonn): iterate smart on the stream even if it is compressed, toke
nize it as we go. | 668 // TODO(edisonn): iterate smart on the stream even if it is compressed, toke
nize it as we go. |
653 // For this PdfContentsTokenizer needs to be extended. | 669 // For this PdfContentsTokenizer needs to be extended. |
654 | 670 |
655 SkPdfStream* stream = (SkPdfStream*)skobj; | 671 SkPdfStream* stream = (SkPdfStream*)skobj; |
656 | 672 |
657 SkPdfNativeTokenizer* tokenizer = pdfContext->fPdfDoc->tokenizerOfStream(str
eam); | 673 SkPdfNativeTokenizer* tokenizer = |
| 674 pdfContext->fPdfDoc->tokenizerOfStream(stream, pdfContext->fTmpPageA
llocator); |
658 if (tokenizer != NULL) { | 675 if (tokenizer != NULL) { |
659 PdfMainLooper looper(NULL, tokenizer, pdfContext, canvas); | 676 PdfMainLooper looper(NULL, tokenizer, pdfContext, canvas); |
660 looper.loop(); | 677 looper.loop(); |
661 delete tokenizer; | 678 delete tokenizer; |
662 } | 679 } |
663 | 680 |
664 // TODO(edisonn): should we restore the variable stack at the same state? | 681 // TODO(edisonn): should we restore the variable stack at the same state? |
665 // There could be operands left, that could be consumed by a parent tokenize
r when we pop. | 682 // There could be operands left, that could be consumed by a parent tokenize
r when we pop. |
666 canvas->restore(); | 683 canvas->restore(); |
667 PdfOp_Q(pdfContext, canvas, NULL); | 684 PdfOp_Q(pdfContext, canvas, NULL); |
(...skipping 27 matching lines...) Expand all Loading... |
695 | 712 |
696 SkTraceRect(rm, "bbox mapped"); | 713 SkTraceRect(rm, "bbox mapped"); |
697 | 714 |
698 canvas->clipRect(bBox, SkRegion::kIntersect_Op, true); // TODO(edisonn): AA
from settings. | 715 canvas->clipRect(bBox, SkRegion::kIntersect_Op, true); // TODO(edisonn): AA
from settings. |
699 | 716 |
700 // TODO(edisonn): iterate smart on the stream even if it is compressed, toke
nize it as we go. | 717 // TODO(edisonn): iterate smart on the stream even if it is compressed, toke
nize it as we go. |
701 // For this PdfContentsTokenizer needs to be extended. | 718 // For this PdfContentsTokenizer needs to be extended. |
702 | 719 |
703 SkPdfStream* stream = (SkPdfStream*)skobj; | 720 SkPdfStream* stream = (SkPdfStream*)skobj; |
704 | 721 |
705 SkPdfNativeTokenizer* tokenizer = pdfContext->fPdfDoc->tokenizerOfStream(str
eam); | 722 SkPdfNativeTokenizer* tokenizer = |
| 723 pdfContext->fPdfDoc->tokenizerOfStream(stream, pdfContext->fTmpPageA
llocator); |
706 if (tokenizer != NULL) { | 724 if (tokenizer != NULL) { |
707 PdfMainLooper looper(NULL, tokenizer, pdfContext, canvas); | 725 PdfMainLooper looper(NULL, tokenizer, pdfContext, canvas); |
708 looper.loop(); | 726 looper.loop(); |
709 delete tokenizer; | 727 delete tokenizer; |
710 } | 728 } |
711 | 729 |
712 // TODO(edisonn): should we restore the variable stack at the same state? | 730 // TODO(edisonn): should we restore the variable stack at the same state? |
713 // There could be operands left, that could be consumed by a parent tokenize
r when we pop. | 731 // There could be operands left, that could be consumed by a parent tokenize
r when we pop. |
714 canvas->restore(); | 732 canvas->restore(); |
715 PdfOp_Q(pdfContext, canvas, NULL); | 733 PdfOp_Q(pdfContext, canvas, NULL); |
(...skipping 428 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1144 return kPartial_PdfResult; | 1162 return kPartial_PdfResult; |
1145 } | 1163 } |
1146 | 1164 |
1147 //font size Tf Set the text font, Tf | 1165 //font size Tf Set the text font, Tf |
1148 //, to font and the text font size, Tfs, to size. font is the name of a | 1166 //, to font and the text font size, Tfs, to size. font is the name of a |
1149 //font resource in the Fontsubdictionary of the current resource dictionary; siz
e is | 1167 //font resource in the Fontsubdictionary of the current resource dictionary; siz
e is |
1150 //a number representing a scale factor. There is no initial value for either fon
t or | 1168 //a number representing a scale factor. There is no initial value for either fon
t or |
1151 //size; they must be specified explicitly using Tf before any text is shown. | 1169 //size; they must be specified explicitly using Tf before any text is shown. |
1152 static PdfResult PdfOp_Tf(PdfContext* pdfContext, SkCanvas* canvas, PdfTokenLoop
er** looper) { | 1170 static PdfResult PdfOp_Tf(PdfContext* pdfContext, SkCanvas* canvas, PdfTokenLoop
er** looper) { |
1153 pdfContext->fGraphicsState.fCurFontSize = pdfContext->fObjectStack.top()->nu
mberValue(); pdfContext->fObjectStack.pop(); | 1171 pdfContext->fGraphicsState.fCurFontSize = pdfContext->fObjectStack.top()->nu
mberValue(); pdfContext->fObjectStack.pop(); |
1154 const char* fontName = pdfContext->fObjectStack.top()->nameValue();
pdfContext->fObjectStack.pop(); | 1172 SkPdfObject* fontName = pdfContext->fObjectStack.top();
pdfContext->fObjectStack.pop(); |
1155 | 1173 |
1156 #ifdef PDF_TRACE | 1174 #ifdef PDF_TRACE |
1157 printf("font name: %s\n", fontName); | 1175 printf("font name: %s\n", fontName->nameValue2().c_str()); |
1158 #endif | 1176 #endif |
1159 | 1177 |
1160 if (pdfContext->fGraphicsState.fResources->Font(pdfContext->fPdfDoc)) { | 1178 if (pdfContext->fGraphicsState.fResources->Font(pdfContext->fPdfDoc)) { |
1161 SkPdfObject* objFont = pdfContext->fGraphicsState.fResources->Font(pdfCo
ntext->fPdfDoc)->get(fontName); | 1179 SkPdfObject* objFont = pdfContext->fGraphicsState.fResources->Font(pdfCo
ntext->fPdfDoc)->get(fontName); |
1162 objFont = pdfContext->fPdfDoc->resolveReference(objFont); | 1180 objFont = pdfContext->fPdfDoc->resolveReference(objFont); |
1163 if (kNone_SkPdfObjectType == pdfContext->fPdfDoc->mapper()->mapFontDicti
onary(objFont)) { | 1181 if (kNone_SkPdfObjectType == pdfContext->fPdfDoc->mapper()->mapFontDicti
onary(objFont)) { |
1164 // TODO(edisonn): try to recover and draw it any way? | 1182 // TODO(edisonn): try to recover and draw it any way? |
1165 return kIgnoreError_PdfResult; | 1183 return kIgnoreError_PdfResult; |
1166 } | 1184 } |
1167 SkPdfFontDictionary* fd = (SkPdfFontDictionary*)objFont; | 1185 SkPdfFontDictionary* fd = (SkPdfFontDictionary*)objFont; |
(...skipping 88 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1256 SkDoubleToScalar(0), | 1274 SkDoubleToScalar(0), |
1257 SkDoubleToScalar(1)); | 1275 SkDoubleToScalar(1)); |
1258 | 1276 |
1259 pdfContext->fGraphicsState.fMatrixTm.preConcat(matrix); | 1277 pdfContext->fGraphicsState.fMatrixTm.preConcat(matrix); |
1260 } | 1278 } |
1261 } | 1279 } |
1262 return kPartial_PdfResult; // TODO(edisonn): Implement fully DrawText befor
e returing OK. | 1280 return kPartial_PdfResult; // TODO(edisonn): Implement fully DrawText befor
e returing OK. |
1263 } | 1281 } |
1264 | 1282 |
1265 static PdfResult PdfOp_CS_cs(PdfContext* pdfContext, SkCanvas* canvas, SkPdfColo
rOperator* colorOperator) { | 1283 static PdfResult PdfOp_CS_cs(PdfContext* pdfContext, SkCanvas* canvas, SkPdfColo
rOperator* colorOperator) { |
1266 colorOperator->fColorSpace = pdfContext->fObjectStack.top()->nameValue();
pdfContext->fObjectStack.pop(); | 1284 colorOperator->fColorSpace = pdfContext->fObjectStack.top()->strRef(); pd
fContext->fObjectStack.pop(); |
1267 return kOK_PdfResult; | 1285 return kOK_PdfResult; |
1268 } | 1286 } |
1269 | 1287 |
1270 static PdfResult PdfOp_CS(PdfContext* pdfContext, SkCanvas* canvas, PdfTokenLoop
er** looper) { | 1288 static PdfResult PdfOp_CS(PdfContext* pdfContext, SkCanvas* canvas, PdfTokenLoop
er** looper) { |
1271 return PdfOp_CS_cs(pdfContext, canvas, &pdfContext->fGraphicsState.fStroking
); | 1289 return PdfOp_CS_cs(pdfContext, canvas, &pdfContext->fGraphicsState.fStroking
); |
1272 } | 1290 } |
1273 | 1291 |
1274 static PdfResult PdfOp_cs(PdfContext* pdfContext, SkCanvas* canvas, PdfTokenLoop
er** looper) { | 1292 static PdfResult PdfOp_cs(PdfContext* pdfContext, SkCanvas* canvas, PdfTokenLoop
er** looper) { |
1275 return PdfOp_CS_cs(pdfContext, canvas, &pdfContext->fGraphicsState.fNonStrok
ing); | 1293 return PdfOp_CS_cs(pdfContext, canvas, &pdfContext->fGraphicsState.fNonStrok
ing); |
1276 } | 1294 } |
1277 | 1295 |
1278 static PdfResult PdfOp_SC_sc(PdfContext* pdfContext, SkCanvas* canvas, SkPdfColo
rOperator* colorOperator) { | 1296 static PdfResult PdfOp_SC_sc(PdfContext* pdfContext, SkCanvas* canvas, SkPdfColo
rOperator* colorOperator) { |
1279 double c[4]; | 1297 double c[4]; |
1280 // int64_t v[4]; | 1298 // int64_t v[4]; |
1281 | 1299 |
1282 int n = GetColorSpaceComponents(colorOperator->fColorSpace); | 1300 int n = GetColorSpaceComponents(colorOperator->fColorSpace); |
1283 | 1301 |
1284 bool doubles = true; | 1302 bool doubles = true; |
1285 if (strcmp(colorOperator->fColorSpace, "Indexed") == 0) { | 1303 if (colorOperator->fColorSpace.equals("Indexed")) { |
1286 doubles = false; | 1304 doubles = false; |
1287 } | 1305 } |
1288 | 1306 |
1289 #ifdef PDF_TRACE | 1307 #ifdef PDF_TRACE |
1290 printf("color space = %s, N = %i\n", colorOperator->fColorSpace, n); | 1308 printf("color space = %s, N = %i\n", colorOperator->fColorSpace.fBuffer, n); |
1291 #endif | 1309 #endif |
1292 | 1310 |
1293 for (int i = n - 1; i >= 0 ; i--) { | 1311 for (int i = n - 1; i >= 0 ; i--) { |
1294 if (doubles) { | 1312 if (doubles) { |
1295 c[i] = pdfContext->fObjectStack.top()->numberValue(); pdfCon
text->fObjectStack.pop(); | 1313 c[i] = pdfContext->fObjectStack.top()->numberValue(); pdfCon
text->fObjectStack.pop(); |
1296 // } else { | 1314 // } else { |
1297 // v[i] = pdfContext->fObjectStack.top()->intValue(); pdfConte
xt->fObjectStack.pop(); | 1315 // v[i] = pdfContext->fObjectStack.top()->intValue(); pdfConte
xt->fObjectStack.pop(); |
1298 } | 1316 } |
1299 } | 1317 } |
1300 | 1318 |
1301 // TODO(edisonn): Now, set that color. Only DeviceRGB supported. | 1319 // TODO(edisonn): Now, set that color. Only DeviceRGB supported. |
1302 // TODO(edisonn): do possible field values to enum at parsing time! | 1320 // TODO(edisonn): do possible field values to enum at parsing time! |
1303 // TODO(edisonn): support also abreviations /DeviceRGB == /RGB | 1321 // TODO(edisonn): support also abreviations /DeviceRGB == /RGB |
1304 if (strcmp(colorOperator->fColorSpace, "DeviceRGB") == 0 || strcmp(colorOper
ator->fColorSpace, "RGB") == 0) { | 1322 if (colorOperator->fColorSpace.equals("DeviceRGB") || colorOperator->fColorS
pace.equals("RGB")) { |
1305 colorOperator->setRGBColor(SkColorSetRGB(255*c[0], 255*c[1], 255*c[2])); | 1323 colorOperator->setRGBColor(SkColorSetRGB(255*c[0], 255*c[1], 255*c[2])); |
1306 } | 1324 } |
1307 return kPartial_PdfResult; | 1325 return kPartial_PdfResult; |
1308 } | 1326 } |
1309 | 1327 |
1310 static PdfResult PdfOp_SC(PdfContext* pdfContext, SkCanvas* canvas, PdfTokenLoop
er** looper) { | 1328 static PdfResult PdfOp_SC(PdfContext* pdfContext, SkCanvas* canvas, PdfTokenLoop
er** looper) { |
1311 return PdfOp_SC_sc(pdfContext, canvas, &pdfContext->fGraphicsState.fStroking
); | 1329 return PdfOp_SC_sc(pdfContext, canvas, &pdfContext->fGraphicsState.fStroking
); |
1312 } | 1330 } |
1313 | 1331 |
1314 static PdfResult PdfOp_sc(PdfContext* pdfContext, SkCanvas* canvas, PdfTokenLoop
er** looper) { | 1332 static PdfResult PdfOp_sc(PdfContext* pdfContext, SkCanvas* canvas, PdfTokenLoop
er** looper) { |
(...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1347 | 1365 |
1348 static PdfResult PdfOp_g(PdfContext* pdfContext, SkCanvas* canvas, PdfTokenLoope
r** looper) { | 1366 static PdfResult PdfOp_g(PdfContext* pdfContext, SkCanvas* canvas, PdfTokenLoope
r** looper) { |
1349 return PdfOp_G_g(pdfContext, canvas, &pdfContext->fGraphicsState.fNonStrokin
g); | 1367 return PdfOp_G_g(pdfContext, canvas, &pdfContext->fGraphicsState.fNonStrokin
g); |
1350 } | 1368 } |
1351 | 1369 |
1352 static PdfResult PdfOp_RG_rg(PdfContext* pdfContext, SkCanvas* canvas, SkPdfColo
rOperator* colorOperator) { | 1370 static PdfResult PdfOp_RG_rg(PdfContext* pdfContext, SkCanvas* canvas, SkPdfColo
rOperator* colorOperator) { |
1353 double b = pdfContext->fObjectStack.top()->numberValue(); pdfContext->fO
bjectStack.pop(); | 1371 double b = pdfContext->fObjectStack.top()->numberValue(); pdfContext->fO
bjectStack.pop(); |
1354 double g = pdfContext->fObjectStack.top()->numberValue(); pdfContext->fO
bjectStack.pop(); | 1372 double g = pdfContext->fObjectStack.top()->numberValue(); pdfContext->fO
bjectStack.pop(); |
1355 double r = pdfContext->fObjectStack.top()->numberValue(); pdfContext->fO
bjectStack.pop(); | 1373 double r = pdfContext->fObjectStack.top()->numberValue(); pdfContext->fO
bjectStack.pop(); |
1356 | 1374 |
1357 colorOperator->fColorSpace = "DeviceRGB"; | 1375 colorOperator->fColorSpace = strings_DeviceRGB; |
1358 colorOperator->setRGBColor(SkColorSetRGB(255*r, 255*g, 255*b)); | 1376 colorOperator->setRGBColor(SkColorSetRGB(255*r, 255*g, 255*b)); |
1359 return kOK_PdfResult; | 1377 return kOK_PdfResult; |
1360 } | 1378 } |
1361 | 1379 |
1362 static PdfResult PdfOp_RG(PdfContext* pdfContext, SkCanvas* canvas, PdfTokenLoop
er** looper) { | 1380 static PdfResult PdfOp_RG(PdfContext* pdfContext, SkCanvas* canvas, PdfTokenLoop
er** looper) { |
1363 return PdfOp_RG_rg(pdfContext, canvas, &pdfContext->fGraphicsState.fStroking
); | 1381 return PdfOp_RG_rg(pdfContext, canvas, &pdfContext->fGraphicsState.fStroking
); |
1364 } | 1382 } |
1365 | 1383 |
1366 static PdfResult PdfOp_rg(PdfContext* pdfContext, SkCanvas* canvas, PdfTokenLoop
er** looper) { | 1384 static PdfResult PdfOp_rg(PdfContext* pdfContext, SkCanvas* canvas, PdfTokenLoop
er** looper) { |
1367 return PdfOp_RG_rg(pdfContext, canvas, &pdfContext->fGraphicsState.fNonStrok
ing); | 1385 return PdfOp_RG_rg(pdfContext, canvas, &pdfContext->fGraphicsState.fNonStrok
ing); |
1368 } | 1386 } |
1369 | 1387 |
1370 static PdfResult PdfOp_K_k(PdfContext* pdfContext, SkCanvas* canvas, SkPdfColorO
perator* colorOperator) { | 1388 static PdfResult PdfOp_K_k(PdfContext* pdfContext, SkCanvas* canvas, SkPdfColorO
perator* colorOperator) { |
1371 // TODO(edisonn): spec has some rules about overprint, implement them. | 1389 // TODO(edisonn): spec has some rules about overprint, implement them. |
1372 /*double k = */pdfContext->fObjectStack.top()->numberValue(); pdfContext
->fObjectStack.pop(); | 1390 /*double k = */pdfContext->fObjectStack.top()->numberValue(); pdfContext
->fObjectStack.pop(); |
1373 /*double y = */pdfContext->fObjectStack.top()->numberValue(); pdfContext
->fObjectStack.pop(); | 1391 /*double y = */pdfContext->fObjectStack.top()->numberValue(); pdfContext
->fObjectStack.pop(); |
1374 /*double m = */pdfContext->fObjectStack.top()->numberValue(); pdfContext
->fObjectStack.pop(); | 1392 /*double m = */pdfContext->fObjectStack.top()->numberValue(); pdfContext
->fObjectStack.pop(); |
1375 /*double c = */pdfContext->fObjectStack.top()->numberValue(); pdfContext
->fObjectStack.pop(); | 1393 /*double c = */pdfContext->fObjectStack.top()->numberValue(); pdfContext
->fObjectStack.pop(); |
1376 | 1394 |
1377 colorOperator->fColorSpace = "DeviceCMYK"; | 1395 colorOperator->fColorSpace = strings_DeviceCMYK; |
1378 // TODO(edisonn): Set color. | 1396 // TODO(edisonn): Set color. |
1379 return kNYI_PdfResult; | 1397 return kNYI_PdfResult; |
1380 } | 1398 } |
1381 | 1399 |
1382 static PdfResult PdfOp_K(PdfContext* pdfContext, SkCanvas* canvas, PdfTokenLoope
r** looper) { | 1400 static PdfResult PdfOp_K(PdfContext* pdfContext, SkCanvas* canvas, PdfTokenLoope
r** looper) { |
1383 return PdfOp_K_k(pdfContext, canvas, &pdfContext->fGraphicsState.fStroking); | 1401 return PdfOp_K_k(pdfContext, canvas, &pdfContext->fGraphicsState.fStroking); |
1384 } | 1402 } |
1385 | 1403 |
1386 static PdfResult PdfOp_k(PdfContext* pdfContext, SkCanvas* canvas, PdfTokenLoope
r** looper) { | 1404 static PdfResult PdfOp_k(PdfContext* pdfContext, SkCanvas* canvas, PdfTokenLoope
r** looper) { |
1387 return PdfOp_K_k(pdfContext, canvas, &pdfContext->fGraphicsState.fNonStrokin
g); | 1405 return PdfOp_K_k(pdfContext, canvas, &pdfContext->fGraphicsState.fNonStrokin
g); |
(...skipping 109 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1497 //fies the output device’s default flatness tolerance. | 1515 //fies the output device’s default flatness tolerance. |
1498 static PdfResult PdfOp_i(PdfContext* pdfContext, SkCanvas* canvas, PdfTokenLoope
r** looper) { | 1516 static PdfResult PdfOp_i(PdfContext* pdfContext, SkCanvas* canvas, PdfTokenLoope
r** looper) { |
1499 pdfContext->fObjectStack.pop(); | 1517 pdfContext->fObjectStack.pop(); |
1500 | 1518 |
1501 return kNYI_PdfResult; | 1519 return kNYI_PdfResult; |
1502 } | 1520 } |
1503 | 1521 |
1504 //dictName gs (PDF 1.2) Set the specified parameters in the graphics state. dictN
ame is | 1522 //dictName gs (PDF 1.2) Set the specified parameters in the graphics state. dictN
ame is |
1505 //the name of a graphics state parameter dictionary in the ExtGState subdictiona
ry of the current resource dictionary (see the next section). | 1523 //the name of a graphics state parameter dictionary in the ExtGState subdictiona
ry of the current resource dictionary (see the next section). |
1506 static PdfResult PdfOp_gs(PdfContext* pdfContext, SkCanvas* canvas, PdfTokenLoop
er** looper) { | 1524 static PdfResult PdfOp_gs(PdfContext* pdfContext, SkCanvas* canvas, PdfTokenLoop
er** looper) { |
1507 const char* name = pdfContext->fObjectStack.top()->nameValue(); pdfContex
t->fObjectStack.pop(); | 1525 SkPdfObject* name = pdfContext->fObjectStack.top(); pdfContext->fObjectSt
ack.pop(); |
1508 | 1526 |
1509 #ifdef PDF_TRACE | 1527 #ifdef PDF_TRACE |
1510 std::string str; | 1528 std::string str; |
1511 #endif | 1529 #endif |
1512 | 1530 |
1513 //Next, get the ExtGState Dictionary from the Resource Dictionary: | 1531 //Next, get the ExtGState Dictionary from the Resource Dictionary: |
1514 SkPdfDictionary* extGStateDictionary = pdfContext->fGraphicsState.fResources
->ExtGState(pdfContext->fPdfDoc); | 1532 SkPdfDictionary* extGStateDictionary = pdfContext->fGraphicsState.fResources
->ExtGState(pdfContext->fPdfDoc); |
1515 | 1533 |
1516 if (extGStateDictionary == NULL) { | 1534 if (extGStateDictionary == NULL) { |
1517 #ifdef PDF_TRACE | 1535 #ifdef PDF_TRACE |
(...skipping 97 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1615 | 1633 |
1616 //name sh | 1634 //name sh |
1617 static PdfResult PdfOp_sh(PdfContext* pdfContext, SkCanvas* canvas, PdfTokenLoop
er** looper) { | 1635 static PdfResult PdfOp_sh(PdfContext* pdfContext, SkCanvas* canvas, PdfTokenLoop
er** looper) { |
1618 pdfContext->fObjectStack.pop(); | 1636 pdfContext->fObjectStack.pop(); |
1619 | 1637 |
1620 return kNYI_PdfResult; | 1638 return kNYI_PdfResult; |
1621 } | 1639 } |
1622 | 1640 |
1623 //name Do | 1641 //name Do |
1624 static PdfResult PdfOp_Do(PdfContext* pdfContext, SkCanvas* canvas, PdfTokenLoop
er** looper) { | 1642 static PdfResult PdfOp_Do(PdfContext* pdfContext, SkCanvas* canvas, PdfTokenLoop
er** looper) { |
1625 const char* name = pdfContext->fObjectStack.top()->nameValue(); pdfContex
t->fObjectStack.pop(); | 1643 SkPdfObject* name = pdfContext->fObjectStack.top(); pdfContext->fObjectSt
ack.pop(); |
1626 | 1644 |
1627 SkPdfDictionary* xObject = pdfContext->fGraphicsState.fResources->XObject(p
dfContext->fPdfDoc); | 1645 SkPdfDictionary* xObject = pdfContext->fGraphicsState.fResources->XObject(p
dfContext->fPdfDoc); |
1628 | 1646 |
1629 if (xObject == NULL) { | 1647 if (xObject == NULL) { |
1630 #ifdef PDF_TRACE | 1648 #ifdef PDF_TRACE |
1631 printf("XObject is NULL!\n"); | 1649 printf("XObject is NULL!\n"); |
1632 #endif | 1650 #endif |
1633 return kIgnoreError_PdfResult; | 1651 return kIgnoreError_PdfResult; |
1634 } | 1652 } |
1635 | 1653 |
(...skipping 50 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1686 static PdfResult PdfOp_EMC(PdfContext* pdfContext, SkCanvas* canvas, PdfTokenLoo
per** looper) { | 1704 static PdfResult PdfOp_EMC(PdfContext* pdfContext, SkCanvas* canvas, PdfTokenLoo
per** looper) { |
1687 return kNYI_PdfResult; | 1705 return kNYI_PdfResult; |
1688 } | 1706 } |
1689 | 1707 |
1690 static void initPdfOperatorRenderes() { | 1708 static void initPdfOperatorRenderes() { |
1691 static bool gInitialized = false; | 1709 static bool gInitialized = false; |
1692 if (gInitialized) { | 1710 if (gInitialized) { |
1693 return; | 1711 return; |
1694 } | 1712 } |
1695 | 1713 |
1696 gPdfOps["q"] = PdfOp_q; | 1714 gPdfOps.set("q", PdfOp_q); |
1697 gPdfOps["Q"] = PdfOp_Q; | 1715 gPdfOps.set("Q", PdfOp_Q); |
1698 gPdfOps["cm"] = PdfOp_cm; | 1716 gPdfOps.set("cm", PdfOp_cm); |
1699 | 1717 |
1700 gPdfOps["TD"] = PdfOp_TD; | 1718 gPdfOps.set("TD", PdfOp_TD); |
1701 gPdfOps["Td"] = PdfOp_Td; | 1719 gPdfOps.set("Td", PdfOp_Td); |
1702 gPdfOps["Tm"] = PdfOp_Tm; | 1720 gPdfOps.set("Tm", PdfOp_Tm); |
1703 gPdfOps["T*"] = PdfOp_T_star; | 1721 gPdfOps.set("T*", PdfOp_T_star); |
1704 | 1722 |
1705 gPdfOps["m"] = PdfOp_m; | 1723 gPdfOps.set("m", PdfOp_m); |
1706 gPdfOps["l"] = PdfOp_l; | 1724 gPdfOps.set("l", PdfOp_l); |
1707 gPdfOps["c"] = PdfOp_c; | 1725 gPdfOps.set("c", PdfOp_c); |
1708 gPdfOps["v"] = PdfOp_v; | 1726 gPdfOps.set("v", PdfOp_v); |
1709 gPdfOps["y"] = PdfOp_y; | 1727 gPdfOps.set("y", PdfOp_y); |
1710 gPdfOps["h"] = PdfOp_h; | 1728 gPdfOps.set("h", PdfOp_h); |
1711 gPdfOps["re"] = PdfOp_re; | 1729 gPdfOps.set("re", PdfOp_re); |
1712 | 1730 |
1713 gPdfOps["S"] = PdfOp_S; | 1731 gPdfOps.set("S", PdfOp_S); |
1714 gPdfOps["s"] = PdfOp_s; | 1732 gPdfOps.set("s", PdfOp_s); |
1715 gPdfOps["f"] = PdfOp_f; | 1733 gPdfOps.set("f", PdfOp_f); |
1716 gPdfOps["F"] = PdfOp_F; | 1734 gPdfOps.set("F", PdfOp_F); |
1717 gPdfOps["f*"] = PdfOp_f_star; | 1735 gPdfOps.set("f*", PdfOp_f_star); |
1718 gPdfOps["B"] = PdfOp_B; | 1736 gPdfOps.set("B", PdfOp_B); |
1719 gPdfOps["B*"] = PdfOp_B_star; | 1737 gPdfOps.set("B*", PdfOp_B_star); |
1720 gPdfOps["b"] = PdfOp_b; | 1738 gPdfOps.set("b", PdfOp_b); |
1721 gPdfOps["b*"] = PdfOp_b_star; | 1739 gPdfOps.set("b*", PdfOp_b_star); |
1722 gPdfOps["n"] = PdfOp_n; | 1740 gPdfOps.set("n", PdfOp_n); |
1723 | 1741 |
1724 gPdfOps["BT"] = PdfOp_BT; | 1742 gPdfOps.set("BT", PdfOp_BT); |
1725 gPdfOps["ET"] = PdfOp_ET; | 1743 gPdfOps.set("ET", PdfOp_ET); |
1726 | 1744 |
1727 gPdfOps["Tj"] = PdfOp_Tj; | 1745 gPdfOps.set("Tj", PdfOp_Tj); |
1728 gPdfOps["'"] = PdfOp_quote; | 1746 gPdfOps.set("'", PdfOp_quote); |
1729 gPdfOps["\""] = PdfOp_doublequote; | 1747 gPdfOps.set("\"", PdfOp_doublequote); |
1730 gPdfOps["TJ"] = PdfOp_TJ; | 1748 gPdfOps.set("TJ", PdfOp_TJ); |
1731 | 1749 |
1732 gPdfOps["CS"] = PdfOp_CS; | 1750 gPdfOps.set("CS", PdfOp_CS); |
1733 gPdfOps["cs"] = PdfOp_cs; | 1751 gPdfOps.set("cs", PdfOp_cs); |
1734 gPdfOps["SC"] = PdfOp_SC; | 1752 gPdfOps.set("SC", PdfOp_SC); |
1735 gPdfOps["SCN"] = PdfOp_SCN; | 1753 gPdfOps.set("SCN", PdfOp_SCN); |
1736 gPdfOps["sc"] = PdfOp_sc; | 1754 gPdfOps.set("sc", PdfOp_sc); |
1737 gPdfOps["scn"] = PdfOp_scn; | 1755 gPdfOps.set("scn", PdfOp_scn); |
1738 gPdfOps["G"] = PdfOp_G; | 1756 gPdfOps.set("G", PdfOp_G); |
1739 gPdfOps["g"] = PdfOp_g; | 1757 gPdfOps.set("g", PdfOp_g); |
1740 gPdfOps["RG"] = PdfOp_RG; | 1758 gPdfOps.set("RG", PdfOp_RG); |
1741 gPdfOps["rg"] = PdfOp_rg; | 1759 gPdfOps.set("rg", PdfOp_rg); |
1742 gPdfOps["K"] = PdfOp_K; | 1760 gPdfOps.set("K", PdfOp_K); |
1743 gPdfOps["k"] = PdfOp_k; | 1761 gPdfOps.set("k", PdfOp_k); |
1744 | 1762 |
1745 gPdfOps["W"] = PdfOp_W; | 1763 gPdfOps.set("W", PdfOp_W); |
1746 gPdfOps["W*"] = PdfOp_W_star; | 1764 gPdfOps.set("W*", PdfOp_W_star); |
1747 | 1765 |
1748 gPdfOps["BX"] = PdfOp_BX; | 1766 gPdfOps.set("BX", PdfOp_BX); |
1749 gPdfOps["EX"] = PdfOp_EX; | 1767 gPdfOps.set("EX", PdfOp_EX); |
1750 | 1768 |
1751 gPdfOps["BI"] = PdfOp_BI; | 1769 gPdfOps.set("BI", PdfOp_BI); |
1752 gPdfOps["ID"] = PdfOp_ID; | 1770 gPdfOps.set("ID", PdfOp_ID); |
1753 gPdfOps["EI"] = PdfOp_EI; | 1771 gPdfOps.set("EI", PdfOp_EI); |
1754 | 1772 |
1755 gPdfOps["w"] = PdfOp_w; | 1773 gPdfOps.set("w", PdfOp_w); |
1756 gPdfOps["J"] = PdfOp_J; | 1774 gPdfOps.set("J", PdfOp_J); |
1757 gPdfOps["j"] = PdfOp_j; | 1775 gPdfOps.set("j", PdfOp_j); |
1758 gPdfOps["M"] = PdfOp_M; | 1776 gPdfOps.set("M", PdfOp_M); |
1759 gPdfOps["d"] = PdfOp_d; | 1777 gPdfOps.set("d", PdfOp_d); |
1760 gPdfOps["ri"] = PdfOp_ri; | 1778 gPdfOps.set("ri", PdfOp_ri); |
1761 gPdfOps["i"] = PdfOp_i; | 1779 gPdfOps.set("i", PdfOp_i); |
1762 gPdfOps["gs"] = PdfOp_gs; | 1780 gPdfOps.set("gs", PdfOp_gs); |
1763 | 1781 |
1764 gPdfOps["Tc"] = PdfOp_Tc; | 1782 gPdfOps.set("Tc", PdfOp_Tc); |
1765 gPdfOps["Tw"] = PdfOp_Tw; | 1783 gPdfOps.set("Tw", PdfOp_Tw); |
1766 gPdfOps["Tz"] = PdfOp_Tz; | 1784 gPdfOps.set("Tz", PdfOp_Tz); |
1767 gPdfOps["TL"] = PdfOp_TL; | 1785 gPdfOps.set("TL", PdfOp_TL); |
1768 gPdfOps["Tf"] = PdfOp_Tf; | 1786 gPdfOps.set("Tf", PdfOp_Tf); |
1769 gPdfOps["Tr"] = PdfOp_Tr; | 1787 gPdfOps.set("Tr", PdfOp_Tr); |
1770 gPdfOps["Ts"] = PdfOp_Ts; | 1788 gPdfOps.set("Ts", PdfOp_Ts); |
1771 | 1789 |
1772 gPdfOps["d0"] = PdfOp_d0; | 1790 gPdfOps.set("d0", PdfOp_d0); |
1773 gPdfOps["d1"] = PdfOp_d1; | 1791 gPdfOps.set("d1", PdfOp_d1); |
1774 | 1792 |
1775 gPdfOps["sh"] = PdfOp_sh; | 1793 gPdfOps.set("sh", PdfOp_sh); |
1776 | 1794 |
1777 gPdfOps["Do"] = PdfOp_Do; | 1795 gPdfOps.set("Do", PdfOp_Do); |
1778 | 1796 |
1779 gPdfOps["MP"] = PdfOp_MP; | 1797 gPdfOps.set("MP", PdfOp_MP); |
1780 gPdfOps["DP"] = PdfOp_DP; | 1798 gPdfOps.set("DP", PdfOp_DP); |
1781 gPdfOps["BMC"] = PdfOp_BMC; | 1799 gPdfOps.set("BMC", PdfOp_BMC); |
1782 gPdfOps["BDC"] = PdfOp_BDC; | 1800 gPdfOps.set("BDC", PdfOp_BDC); |
1783 gPdfOps["EMC"] = PdfOp_EMC; | 1801 gPdfOps.set("EMC", PdfOp_EMC); |
1784 | 1802 |
1785 gInitialized = true; | 1803 gInitialized = true; |
1786 } | 1804 } |
1787 | 1805 |
1788 class InitPdfOps { | 1806 class InitPdfOps { |
1789 public: | 1807 public: |
1790 InitPdfOps() { | 1808 InitPdfOps() { |
1791 initPdfOperatorRenderes(); | 1809 initPdfOperatorRenderes(); |
1792 } | 1810 } |
1793 }; | 1811 }; |
1794 | 1812 |
1795 InitPdfOps gInitPdfOps; | 1813 InitPdfOps gInitPdfOps; |
1796 | 1814 |
1797 void reportPdfRenderStats() { | 1815 void reportPdfRenderStats() { |
1798 std::map<std::string, int>::iterator iter; | 1816 std::map<std::string, int>::iterator iter; |
1799 | 1817 |
1800 for (int i = 0 ; i < kCount_PdfResult; i++) { | 1818 for (int i = 0 ; i < kCount_PdfResult; i++) { |
1801 for (iter = gRenderStats[i].begin(); iter != gRenderStats[i].end(); ++it
er) { | 1819 SkTDict<int>::Iter iter(gRenderStats[i]); |
1802 printf("%s: %s -> count %i\n", gRenderStatsNames[i], iter->first.c_s
tr(), iter->second); | 1820 const char* key; |
| 1821 int value = 0; |
| 1822 while ((key = iter.next(&value)) != NULL) { |
| 1823 printf("%s: %s -> count %i\n", gRenderStatsNames[i], key, value); |
1803 } | 1824 } |
1804 } | 1825 } |
1805 } | 1826 } |
1806 | 1827 |
1807 PdfResult PdfMainLooper::consumeToken(PdfToken& token) { | 1828 PdfResult PdfMainLooper::consumeToken(PdfToken& token) { |
1808 char keyword[256]; | 1829 char keyword[256]; |
1809 | 1830 |
1810 if (token.fType == kKeyword_TokenType && token.fKeywordLength < 256) | 1831 if (token.fType == kKeyword_TokenType && token.fKeywordLength < 256) |
1811 { | 1832 { |
1812 strncpy(keyword, token.fKeyword, token.fKeywordLength); | 1833 strncpy(keyword, token.fKeyword, token.fKeywordLength); |
1813 keyword[token.fKeywordLength] = '\0'; | 1834 keyword[token.fKeywordLength] = '\0'; |
1814 // TODO(edisonn): log trace flag (verbose, error, info, warning, ...) | 1835 // TODO(edisonn): log trace flag (verbose, error, info, warning, ...) |
1815 PdfOperatorRenderer pdfOperatorRenderer = gPdfOps[keyword]; | 1836 PdfOperatorRenderer pdfOperatorRenderer = NULL; |
1816 if (pdfOperatorRenderer) { | 1837 if (gPdfOps.find(keyword, &pdfOperatorRenderer) && pdfOperatorRenderer)
{ |
1817 // caller, main work is done by pdfOperatorRenderer(...) | 1838 // caller, main work is done by pdfOperatorRenderer(...) |
1818 PdfTokenLooper* childLooper = NULL; | 1839 PdfTokenLooper* childLooper = NULL; |
1819 gRenderStats[pdfOperatorRenderer(fPdfContext, fCanvas, &childLooper)
][keyword]++; | 1840 PdfResult result = pdfOperatorRenderer(fPdfContext, fCanvas, &childL
ooper); |
| 1841 |
| 1842 int cnt = 0; |
| 1843 gRenderStats[result].find(keyword, &cnt); |
| 1844 gRenderStats[result].set(keyword, cnt + 1); |
1820 | 1845 |
1821 if (childLooper) { | 1846 if (childLooper) { |
1822 childLooper->setUp(this); | 1847 childLooper->setUp(this); |
1823 childLooper->loop(); | 1848 childLooper->loop(); |
1824 delete childLooper; | 1849 delete childLooper; |
1825 } | 1850 } |
1826 } else { | 1851 } else { |
1827 gRenderStats[kUnsupported_PdfResult][keyword]++; | 1852 int cnt = 0; |
| 1853 gRenderStats[kUnsupported_PdfResult].find(keyword, &cnt); |
| 1854 gRenderStats[kUnsupported_PdfResult].set(keyword, cnt + 1); |
1828 } | 1855 } |
1829 } | 1856 } |
1830 else if (token.fType == kObject_TokenType) | 1857 else if (token.fType == kObject_TokenType) |
1831 { | 1858 { |
1832 fPdfContext->fObjectStack.push( token.fObject ); | 1859 fPdfContext->fObjectStack.push( token.fObject ); |
1833 } | 1860 } |
1834 else { | 1861 else { |
1835 // TODO(edisonn): deine or use assert not reached | 1862 // TODO(edisonn): deine or use assert not reached |
1836 return kIgnoreError_PdfResult; | 1863 return kIgnoreError_PdfResult; |
1837 } | 1864 } |
(...skipping 74 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1912 | 1939 |
1913 bool SkPdfRenderer::renderPage(int page, SkCanvas* canvas, const SkRect& dst) co
nst { | 1940 bool SkPdfRenderer::renderPage(int page, SkCanvas* canvas, const SkRect& dst) co
nst { |
1914 if (!fPdfDoc) { | 1941 if (!fPdfDoc) { |
1915 return false; | 1942 return false; |
1916 } | 1943 } |
1917 | 1944 |
1918 if (page < 0 || page >= pages()) { | 1945 if (page < 0 || page >= pages()) { |
1919 return false; | 1946 return false; |
1920 } | 1947 } |
1921 | 1948 |
1922 SkPdfNativeTokenizer* tokenizer = fPdfDoc->tokenizerOfPage(page); | 1949 PdfContext pdfContext(fPdfDoc); |
1923 | 1950 |
1924 PdfContext pdfContext(fPdfDoc); | 1951 SkPdfNativeTokenizer* tokenizer = fPdfDoc->tokenizerOfPage(page, pdfContext.
fTmpPageAllocator); |
| 1952 |
1925 pdfContext.fOriginalMatrix = SkMatrix::I(); | 1953 pdfContext.fOriginalMatrix = SkMatrix::I(); |
1926 pdfContext.fGraphicsState.fResources = fPdfDoc->pageResources(page); | 1954 pdfContext.fGraphicsState.fResources = fPdfDoc->pageResources(page); |
1927 | 1955 |
1928 gPdfContext = &pdfContext; | 1956 gPdfContext = &pdfContext; |
1929 | 1957 |
1930 // TODO(edisonn): get matrix stuff right. | 1958 // TODO(edisonn): get matrix stuff right. |
1931 SkScalar z = SkIntToScalar(0); | 1959 SkScalar z = SkIntToScalar(0); |
1932 SkScalar w = dst.width(); | 1960 SkScalar w = dst.width(); |
1933 SkScalar h = dst.height(); | 1961 SkScalar h = dst.height(); |
1934 | 1962 |
(...skipping 73 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2008 } | 2036 } |
2009 | 2037 |
2010 SkRect SkPdfRenderer::MediaBox(int page) const { | 2038 SkRect SkPdfRenderer::MediaBox(int page) const { |
2011 SkASSERT(fPdfDoc); | 2039 SkASSERT(fPdfDoc); |
2012 return fPdfDoc->MediaBox(page); | 2040 return fPdfDoc->MediaBox(page); |
2013 } | 2041 } |
2014 | 2042 |
2015 size_t SkPdfRenderer::bytesUsed() const { | 2043 size_t SkPdfRenderer::bytesUsed() const { |
2016 return fPdfDoc ? fPdfDoc->bytesUsed() : 0; | 2044 return fPdfDoc ? fPdfDoc->bytesUsed() : 0; |
2017 } | 2045 } |
OLD | NEW |