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

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

Issue 83183004: Simplify SkPdfTokenLooper behavior. (Closed) Base URL: https://skia.googlecode.com/svn/trunk
Patch Set: Respond to comment (FIXME) Created 7 years 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/src/SkPdfOps.h ('k') | no next file » | 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 "SkPdfRenderer.h" 8 #include "SkPdfRenderer.h"
9 9
10 #include "SkBitmapDevice.h" 10 #include "SkBitmapDevice.h"
(...skipping 190 matching lines...) Expand 10 before | Expand all | Expand 10 after
201 NotOwnedString::init(&strings_DeviceCMYK, "DeviceCMYK"); 201 NotOwnedString::init(&strings_DeviceCMYK, "DeviceCMYK");
202 } 202 }
203 }; 203 };
204 204
205 // TODO(edisonn): this will not work in chrome! Find another solution! 205 // TODO(edisonn): this will not work in chrome! Find another solution!
206 StringsInit gStringsInit; 206 StringsInit gStringsInit;
207 207
208 // TODO(edisonn): Document SkPdfTokenLooper and subclasses. 208 // TODO(edisonn): Document SkPdfTokenLooper and subclasses.
209 class PdfInlineImageLooper : public SkPdfTokenLooper { 209 class PdfInlineImageLooper : public SkPdfTokenLooper {
210 public: 210 public:
211 PdfInlineImageLooper() 211 explicit PdfInlineImageLooper(SkPdfTokenLooper* parent)
212 : SkPdfTokenLooper(NULL, NULL, NULL, NULL) {} 212 : INHERITED(parent) {}
213 213
214 virtual SkPdfResult consumeToken(PdfToken& token); 214 virtual SkPdfResult consumeToken(PdfToken& token) SK_OVERRIDE;
215 virtual void loop(); 215 virtual void loop() SK_OVERRIDE;
216 SkPdfResult done(); 216
217 private:
218 typedef SkPdfTokenLooper INHERITED;
217 }; 219 };
218 220
219 class PdfCompatibilitySectionLooper : public SkPdfTokenLooper { 221 class PdfCompatibilitySectionLooper : public SkPdfTokenLooper {
220 public: 222 public:
221 PdfCompatibilitySectionLooper() 223 explicit PdfCompatibilitySectionLooper(SkPdfTokenLooper* parent)
222 : SkPdfTokenLooper(NULL, NULL, NULL, NULL) {} 224 : INHERITED (parent) {}
223 225
224 virtual SkPdfResult consumeToken(PdfToken& token); 226 virtual SkPdfResult consumeToken(PdfToken& token) SK_OVERRIDE;
225 virtual void loop(); 227 virtual void loop() SK_OVERRIDE;
228
229 private:
230 typedef SkPdfTokenLooper INHERITED;
226 }; 231 };
227 232
228 // Utilities 233 // Utilities
229 static void setup_bitmap(SkBitmap* bitmap, int width, int height, SkColor color = SK_ColorWHITE) { 234 static void setup_bitmap(SkBitmap* bitmap, int width, int height, SkColor color = SK_ColorWHITE) {
230 bitmap->setConfig(SkBitmap::kARGB_8888_Config, width, height); 235 bitmap->setConfig(SkBitmap::kARGB_8888_Config, width, height);
231 236
232 bitmap->allocPixels(); 237 bitmap->allocPixels();
233 bitmap->eraseColor(color); 238 bitmap->eraseColor(color);
234 } 239 }
235 240
(...skipping 104 matching lines...) Expand 10 before | Expand all | Expand 10 after
340 // } 345 // }
341 346
342 pdfContext->fGraphicsState.applyGraphicsState(&paint, false); 347 pdfContext->fGraphicsState.applyGraphicsState(&paint, false);
343 348
344 skfont->drawText(decoded, &paint, pdfContext, canvas); 349 skfont->drawText(decoded, &paint, pdfContext, canvas);
345 350
346 return kOK_SkPdfResult; 351 return kOK_SkPdfResult;
347 } 352 }
348 353
349 // TODO(edisonn): create header files with declarations! 354 // TODO(edisonn): create header files with declarations!
350 SkPdfResult PdfOp_q(SkPdfContext* pdfContext, SkCanvas* canvas, SkPdfTokenLooper ** looper); 355 SkPdfResult PdfOp_q(SkPdfContext* pdfContext, SkCanvas* canvas, SkPdfTokenLooper * parentLooper);
351 SkPdfResult PdfOp_Q(SkPdfContext* pdfContext, SkCanvas* canvas, SkPdfTokenLooper ** looper); 356 SkPdfResult PdfOp_Q(SkPdfContext* pdfContext, SkCanvas* canvas, SkPdfTokenLooper * parentLooper);
352 SkPdfResult PdfOp_Tw(SkPdfContext* pdfContext, SkCanvas* canvas, SkPdfTokenLoope r** looper); 357 SkPdfResult PdfOp_Tw(SkPdfContext* pdfContext, SkCanvas* canvas, SkPdfTokenLoope r* parentLooper);
353 SkPdfResult PdfOp_Tc(SkPdfContext* pdfContext, SkCanvas* canvas, SkPdfTokenLoope r** looper); 358 SkPdfResult PdfOp_Tc(SkPdfContext* pdfContext, SkCanvas* canvas, SkPdfTokenLoope r* parentLooper);
354 359
355 // TODO(edisonn): perf!!! 360 // TODO(edisonn): perf!!!
356 static SkColorTable* getGrayColortable() { 361 static SkColorTable* getGrayColortable() {
357 static SkColorTable* grayColortable = NULL; 362 static SkColorTable* grayColortable = NULL;
358 if (grayColortable == NULL) { 363 if (grayColortable == NULL) {
359 SkPMColor* colors = new SkPMColor[256]; 364 SkPMColor* colors = new SkPMColor[256];
360 for (int i = 0 ; i < 256; i++) { 365 for (int i = 0 ; i < 256; i++) {
361 colors[i] = SkPreMultiplyARGB(255, i, i, i); 366 colors[i] = SkPreMultiplyARGB(255, i, i, i);
362 } 367 }
363 grayColortable = new SkColorTable(colors, 256); 368 grayColortable = new SkColorTable(colors, 256);
(...skipping 544 matching lines...) Expand 10 before | Expand all | Expand 10 after
908 canvas->save(); 913 canvas->save();
909 } 914 }
910 915
911 pdfContext->parseStream(stream, canvas); 916 pdfContext->parseStream(stream, canvas);
912 917
913 canvas->restore(); 918 canvas->restore();
914 PdfOp_Q(pdfContext, canvas, NULL); 919 PdfOp_Q(pdfContext, canvas, NULL);
915 return kPartial_SkPdfResult; 920 return kPartial_SkPdfResult;
916 } 921 }
917 922
918 SkPdfResult PdfOp_q(SkPdfContext* pdfContext, SkCanvas* canvas, SkPdfTokenLooper ** looper) { 923 SkPdfResult PdfOp_q(SkPdfContext* pdfContext, SkCanvas* canvas, SkPdfTokenLooper *) {
919 pdfContext->fStateStack.push(pdfContext->fGraphicsState); 924 pdfContext->fStateStack.push(pdfContext->fGraphicsState);
920 canvas->save(); 925 canvas->save();
921 pdfContext->fObjectStack.nest(); 926 pdfContext->fObjectStack.nest();
922 return kOK_SkPdfResult; 927 return kOK_SkPdfResult;
923 } 928 }
924 929
925 SkPdfResult PdfOp_Q(SkPdfContext* pdfContext, SkCanvas* canvas, SkPdfTokenLooper ** looper) { 930 SkPdfResult PdfOp_Q(SkPdfContext* pdfContext, SkCanvas* canvas, SkPdfTokenLooper *) {
926 if (pdfContext->fStateStack.count() > 0) { 931 if (pdfContext->fStateStack.count() > 0) {
927 pdfContext->fGraphicsState = pdfContext->fStateStack.top(); 932 pdfContext->fGraphicsState = pdfContext->fStateStack.top();
928 pdfContext->fStateStack.pop(); 933 pdfContext->fStateStack.pop();
929 canvas->restore(); 934 canvas->restore();
930 935
931 if (pdfContext->fObjectStack.nestingLevel() == 0) { 936 if (pdfContext->fObjectStack.nestingLevel() == 0) {
932 SkPdfReport(kIgnoreError_SkPdfIssueSeverity, kStackNestingOverflow_S kPdfIssue, 937 SkPdfReport(kIgnoreError_SkPdfIssueSeverity, kStackNestingOverflow_S kPdfIssue,
933 "stack nesting overflow (q/Q)", NULL, pdfContext); 938 "stack nesting overflow (q/Q)", NULL, pdfContext);
934 return kIgnoreError_SkPdfResult; 939 return kIgnoreError_SkPdfResult;
935 } else { 940 } else {
936 pdfContext->fObjectStack.unnest(); 941 pdfContext->fObjectStack.unnest();
937 } 942 }
938 } else { 943 } else {
939 SkPdfReport(kIgnoreError_SkPdfIssueSeverity, kStackOverflow_SkPdfIssue, 944 SkPdfReport(kIgnoreError_SkPdfIssueSeverity, kStackOverflow_SkPdfIssue,
940 "stack overflow (q/Q)", NULL, pdfContext); 945 "stack overflow (q/Q)", NULL, pdfContext);
941 return kIgnoreError_SkPdfResult; 946 return kIgnoreError_SkPdfResult;
942 } 947 }
943 948
944 return kOK_SkPdfResult; 949 return kOK_SkPdfResult;
945 } 950 }
946 951
947 static SkPdfResult PdfOp_cm(SkPdfContext* pdfContext, SkCanvas* canvas, SkPdfTok enLooper** looper) { 952 static SkPdfResult PdfOp_cm(SkPdfContext* pdfContext, SkCanvas* canvas, SkPdfTok enLooper*) {
948 EXPECT_OPERANDS("cm", pdfContext, 6); 953 EXPECT_OPERANDS("cm", pdfContext, 6);
949 POP_NUMBER(pdfContext, f); 954 POP_NUMBER(pdfContext, f);
950 POP_NUMBER(pdfContext, e); 955 POP_NUMBER(pdfContext, e);
951 POP_NUMBER(pdfContext, d); 956 POP_NUMBER(pdfContext, d);
952 POP_NUMBER(pdfContext, c); 957 POP_NUMBER(pdfContext, c);
953 POP_NUMBER(pdfContext, b); 958 POP_NUMBER(pdfContext, b);
954 POP_NUMBER(pdfContext, a); 959 POP_NUMBER(pdfContext, a);
955 CHECK_PARAMETERS(); 960 CHECK_PARAMETERS();
956 double array[6] = {a, b, c, d, e, f}; 961 double array[6] = {a, b, c, d, e, f};
957 962
(...skipping 20 matching lines...) Expand all
978 printf("\n"); 983 printf("\n");
979 SkTraceMatrix(pdfContext->fGraphicsState.fCTM, "cm"); 984 SkTraceMatrix(pdfContext->fGraphicsState.fCTM, "cm");
980 #endif 985 #endif
981 986
982 return kOK_SkPdfResult; 987 return kOK_SkPdfResult;
983 } 988 }
984 989
985 //leading TL Set the text leading, Tl 990 //leading TL Set the text leading, Tl
986 //, to leading, which is a number expressed in unscaled text 991 //, to leading, which is a number expressed in unscaled text
987 //space units. Text leading is used only by the T*, ', and " operators. Initial value: 0. 992 //space units. Text leading is used only by the T*, ', and " operators. Initial value: 0.
988 static SkPdfResult PdfOp_TL(SkPdfContext* pdfContext, SkCanvas* canvas, SkPdfTok enLooper** looper) { 993 static SkPdfResult PdfOp_TL(SkPdfContext* pdfContext, SkCanvas* canvas, SkPdfTok enLooper*) {
989 EXPECT_OPERANDS("TL", pdfContext, 1); 994 EXPECT_OPERANDS("TL", pdfContext, 1);
990 POP_NUMBER(pdfContext, ty); 995 POP_NUMBER(pdfContext, ty);
991 CHECK_PARAMETERS(); 996 CHECK_PARAMETERS();
992 997
993 pdfContext->fGraphicsState.fTextLeading = ty; 998 pdfContext->fGraphicsState.fTextLeading = ty;
994 999
995 return kOK_SkPdfResult; 1000 return kOK_SkPdfResult;
996 } 1001 }
997 1002
998 static SkPdfResult PdfOp_Td(SkPdfContext* pdfContext, SkCanvas* canvas, SkPdfTok enLooper** looper) { 1003 static SkPdfResult PdfOp_Td(SkPdfContext* pdfContext, SkCanvas* canvas, SkPdfTok enLooper*) {
999 EXPECT_OPERANDS("Td", pdfContext, 2); 1004 EXPECT_OPERANDS("Td", pdfContext, 2);
1000 POP_NUMBER(pdfContext, ty); 1005 POP_NUMBER(pdfContext, ty);
1001 POP_NUMBER(pdfContext, tx); 1006 POP_NUMBER(pdfContext, tx);
1002 CHECK_PARAMETERS(); 1007 CHECK_PARAMETERS();
1003 1008
1004 double array[6] = {1, 0, 0, 1, tx, -ty}; 1009 double array[6] = {1, 0, 0, 1, tx, -ty};
1005 SkMatrix matrix = SkMatrixFromPdfMatrix(array); 1010 SkMatrix matrix = SkMatrixFromPdfMatrix(array);
1006 1011
1007 pdfContext->fGraphicsState.fMatrixTm.preConcat(matrix); 1012 pdfContext->fGraphicsState.fMatrixTm.preConcat(matrix);
1008 pdfContext->fGraphicsState.fMatrixTlm.preConcat(matrix); 1013 pdfContext->fGraphicsState.fMatrixTlm.preConcat(matrix);
1009 1014
1010 return kPartial_SkPdfResult; 1015 return kPartial_SkPdfResult;
1011 } 1016 }
1012 1017
1013 static SkPdfResult PdfOp_TD(SkPdfContext* pdfContext, SkCanvas* canvas, SkPdfTok enLooper** looper) { 1018 static SkPdfResult PdfOp_TD(SkPdfContext* pdfContext, SkCanvas* canvas,
1019 SkPdfTokenLooper* parentLooper) {
1014 EXPECT_OPERANDS("TD", pdfContext, 2) 1020 EXPECT_OPERANDS("TD", pdfContext, 2)
1015 POP_NUMBER(pdfContext, ty); 1021 POP_NUMBER(pdfContext, ty);
1016 POP_NUMBER(pdfContext, tx); 1022 POP_NUMBER(pdfContext, tx);
1017 CHECK_PARAMETERS(); 1023 CHECK_PARAMETERS();
1018 1024
1019 // TODO(edisonn): Create factory methods or constructors so native is hidden 1025 // TODO(edisonn): Create factory methods or constructors so native is hidden
1020 SkPdfReal* _ty = pdfContext->fPdfDoc->createReal(-ty); 1026 SkPdfReal* _ty = pdfContext->fPdfDoc->createReal(-ty);
1021 pdfContext->fObjectStack.push(_ty); 1027 pdfContext->fObjectStack.push(_ty);
1022 1028
1023 PdfOp_TL(pdfContext, canvas, looper); 1029 PdfOp_TL(pdfContext, canvas, parentLooper);
1024 1030
1025 SkPdfReal* vtx = pdfContext->fPdfDoc->createReal(tx); 1031 SkPdfReal* vtx = pdfContext->fPdfDoc->createReal(tx);
1026 pdfContext->fObjectStack.push(vtx); 1032 pdfContext->fObjectStack.push(vtx);
1027 1033
1028 SkPdfReal* vty = pdfContext->fPdfDoc->createReal(ty); 1034 SkPdfReal* vty = pdfContext->fPdfDoc->createReal(ty);
1029 pdfContext->fObjectStack.push(vty); 1035 pdfContext->fObjectStack.push(vty);
1030 1036
1031 SkPdfResult ret = PdfOp_Td(pdfContext, canvas, looper); 1037 SkPdfResult ret = PdfOp_Td(pdfContext, canvas, parentLooper);
1032 1038
1033 return ret; 1039 return ret;
1034 } 1040 }
1035 1041
1036 static SkPdfResult PdfOp_Tm(SkPdfContext* pdfContext, SkCanvas* canvas, SkPdfTok enLooper** looper) { 1042 static SkPdfResult PdfOp_Tm(SkPdfContext* pdfContext, SkCanvas* canvas, SkPdfTok enLooper*) {
1037 EXPECT_OPERANDS("Tm", pdfContext, 6); 1043 EXPECT_OPERANDS("Tm", pdfContext, 6);
1038 POP_NUMBER(pdfContext, f); 1044 POP_NUMBER(pdfContext, f);
1039 POP_NUMBER(pdfContext, e); 1045 POP_NUMBER(pdfContext, e);
1040 POP_NUMBER(pdfContext, d); 1046 POP_NUMBER(pdfContext, d);
1041 POP_NUMBER(pdfContext, c); 1047 POP_NUMBER(pdfContext, c);
1042 POP_NUMBER(pdfContext, b); 1048 POP_NUMBER(pdfContext, b);
1043 POP_NUMBER(pdfContext, a); 1049 POP_NUMBER(pdfContext, a);
1044 CHECK_PARAMETERS(); 1050 CHECK_PARAMETERS();
1045 1051
1046 double array[6]; 1052 double array[6];
(...skipping 15 matching lines...) Expand all
1062 pdfContext->fGraphicsState.fMatrixTm = matrix; 1068 pdfContext->fGraphicsState.fMatrixTm = matrix;
1063 pdfContext->fGraphicsState.fMatrixTlm = matrix;; 1069 pdfContext->fGraphicsState.fMatrixTlm = matrix;;
1064 1070
1065 return kPartial_SkPdfResult; 1071 return kPartial_SkPdfResult;
1066 } 1072 }
1067 1073
1068 //— T* Move to the start of the next line. This operator has the same effect as the code 1074 //— T* Move to the start of the next line. This operator has the same effect as the code
1069 //0 Tl Td 1075 //0 Tl Td
1070 //where Tl is the current leading parameter in the text state 1076 //where Tl is the current leading parameter in the text state
1071 static SkPdfResult PdfOp_T_star(SkPdfContext* pdfContext, SkCanvas* canvas, 1077 static SkPdfResult PdfOp_T_star(SkPdfContext* pdfContext, SkCanvas* canvas,
1072 SkPdfTokenLooper** looper) { 1078 SkPdfTokenLooper* parentLooper) {
1073 SkPdfReal* zero = pdfContext->fPdfDoc->createReal(0.0); 1079 SkPdfReal* zero = pdfContext->fPdfDoc->createReal(0.0);
1074 SkPdfReal* tl = pdfContext->fPdfDoc->createReal(pdfContext->fGraphicsState.f TextLeading); 1080 SkPdfReal* tl = pdfContext->fPdfDoc->createReal(pdfContext->fGraphicsState.f TextLeading);
1075 1081
1076 pdfContext->fObjectStack.push(zero); 1082 pdfContext->fObjectStack.push(zero);
1077 pdfContext->fObjectStack.push(tl); 1083 pdfContext->fObjectStack.push(tl);
1078 1084
1079 SkPdfResult ret = PdfOp_Td(pdfContext, canvas, looper); 1085 SkPdfResult ret = PdfOp_Td(pdfContext, canvas, parentLooper);
1080 1086
1081 return ret; 1087 return ret;
1082 } 1088 }
1083 1089
1084 static SkPdfResult PdfOp_m(SkPdfContext* pdfContext, SkCanvas* canvas, SkPdfToke nLooper** looper) { 1090 static SkPdfResult PdfOp_m(SkPdfContext* pdfContext, SkCanvas* canvas, SkPdfToke nLooper*) {
1085 if (pdfContext->fGraphicsState.fPathClosed) { 1091 if (pdfContext->fGraphicsState.fPathClosed) {
1086 pdfContext->fGraphicsState.fPath.reset(); 1092 pdfContext->fGraphicsState.fPath.reset();
1087 pdfContext->fGraphicsState.fPathClosed = false; 1093 pdfContext->fGraphicsState.fPathClosed = false;
1088 } 1094 }
1089 1095
1090 EXPECT_OPERANDS("m", pdfContext, 2); 1096 EXPECT_OPERANDS("m", pdfContext, 2);
1091 POP_NUMBER(pdfContext, y); 1097 POP_NUMBER(pdfContext, y);
1092 POP_NUMBER(pdfContext, x); 1098 POP_NUMBER(pdfContext, x);
1093 CHECK_PARAMETERS(); 1099 CHECK_PARAMETERS();
1094 1100
1095 pdfContext->fGraphicsState.fCurPosY = y; 1101 pdfContext->fGraphicsState.fCurPosY = y;
1096 pdfContext->fGraphicsState.fCurPosX = x; 1102 pdfContext->fGraphicsState.fCurPosX = x;
1097 1103
1098 pdfContext->fGraphicsState.fPath.moveTo(SkDoubleToScalar(pdfContext->fGraphi csState.fCurPosX), 1104 pdfContext->fGraphicsState.fPath.moveTo(SkDoubleToScalar(pdfContext->fGraphi csState.fCurPosX),
1099 SkDoubleToScalar(pdfContext->fGraphi csState.fCurPosY)); 1105 SkDoubleToScalar(pdfContext->fGraphi csState.fCurPosY));
1100 1106
1101 return kOK_SkPdfResult; 1107 return kOK_SkPdfResult;
1102 } 1108 }
1103 1109
1104 static SkPdfResult PdfOp_l(SkPdfContext* pdfContext, SkCanvas* canvas, SkPdfToke nLooper** looper) { 1110 static SkPdfResult PdfOp_l(SkPdfContext* pdfContext, SkCanvas* canvas, SkPdfToke nLooper*) {
1105 if (pdfContext->fGraphicsState.fPathClosed) { 1111 if (pdfContext->fGraphicsState.fPathClosed) {
1106 pdfContext->fGraphicsState.fPath.reset(); 1112 pdfContext->fGraphicsState.fPath.reset();
1107 pdfContext->fGraphicsState.fPathClosed = false; 1113 pdfContext->fGraphicsState.fPathClosed = false;
1108 } 1114 }
1109 1115
1110 EXPECT_OPERANDS("l", pdfContext, 2); 1116 EXPECT_OPERANDS("l", pdfContext, 2);
1111 POP_NUMBER(pdfContext, y); 1117 POP_NUMBER(pdfContext, y);
1112 POP_NUMBER(pdfContext, x); 1118 POP_NUMBER(pdfContext, x);
1113 CHECK_PARAMETERS(); 1119 CHECK_PARAMETERS();
1114 1120
1115 pdfContext->fGraphicsState.fCurPosY = y; 1121 pdfContext->fGraphicsState.fCurPosY = y;
1116 pdfContext->fGraphicsState.fCurPosX = x; 1122 pdfContext->fGraphicsState.fCurPosX = x;
1117 1123
1118 pdfContext->fGraphicsState.fPath.lineTo(SkDoubleToScalar(pdfContext->fGraphi csState.fCurPosX), 1124 pdfContext->fGraphicsState.fPath.lineTo(SkDoubleToScalar(pdfContext->fGraphi csState.fCurPosX),
1119 SkDoubleToScalar(pdfContext->fGraphi csState.fCurPosY)); 1125 SkDoubleToScalar(pdfContext->fGraphi csState.fCurPosY));
1120 1126
1121 return kOK_SkPdfResult; 1127 return kOK_SkPdfResult;
1122 } 1128 }
1123 1129
1124 static SkPdfResult PdfOp_c(SkPdfContext* pdfContext, SkCanvas* canvas, SkPdfToke nLooper** looper) { 1130 static SkPdfResult PdfOp_c(SkPdfContext* pdfContext, SkCanvas* canvas, SkPdfToke nLooper*) {
1125 if (pdfContext->fGraphicsState.fPathClosed) { 1131 if (pdfContext->fGraphicsState.fPathClosed) {
1126 pdfContext->fGraphicsState.fPath.reset(); 1132 pdfContext->fGraphicsState.fPath.reset();
1127 pdfContext->fGraphicsState.fPathClosed = false; 1133 pdfContext->fGraphicsState.fPathClosed = false;
1128 } 1134 }
1129 1135
1130 EXPECT_OPERANDS("c", pdfContext, 6); 1136 EXPECT_OPERANDS("c", pdfContext, 6);
1131 POP_NUMBER(pdfContext, y3); 1137 POP_NUMBER(pdfContext, y3);
1132 POP_NUMBER(pdfContext, x3); 1138 POP_NUMBER(pdfContext, x3);
1133 POP_NUMBER(pdfContext, y2); 1139 POP_NUMBER(pdfContext, y2);
1134 POP_NUMBER(pdfContext, x2); 1140 POP_NUMBER(pdfContext, x2);
1135 POP_NUMBER(pdfContext, y1); 1141 POP_NUMBER(pdfContext, y1);
1136 POP_NUMBER(pdfContext, x1); 1142 POP_NUMBER(pdfContext, x1);
1137 CHECK_PARAMETERS(); 1143 CHECK_PARAMETERS();
1138 1144
1139 pdfContext->fGraphicsState.fPath.cubicTo(SkDoubleToScalar(x1), SkDoubleToSca lar(y1), 1145 pdfContext->fGraphicsState.fPath.cubicTo(SkDoubleToScalar(x1), SkDoubleToSca lar(y1),
1140 SkDoubleToScalar(x2), SkDoubleToSca lar(y2), 1146 SkDoubleToScalar(x2), SkDoubleToSca lar(y2),
1141 SkDoubleToScalar(x3), SkDoubleToSca lar(y3)); 1147 SkDoubleToScalar(x3), SkDoubleToSca lar(y3));
1142 1148
1143 pdfContext->fGraphicsState.fCurPosX = x3; 1149 pdfContext->fGraphicsState.fCurPosX = x3;
1144 pdfContext->fGraphicsState.fCurPosY = y3; 1150 pdfContext->fGraphicsState.fCurPosY = y3;
1145 1151
1146 return kOK_SkPdfResult; 1152 return kOK_SkPdfResult;
1147 } 1153 }
1148 1154
1149 static SkPdfResult PdfOp_v(SkPdfContext* pdfContext, SkCanvas* canvas, SkPdfToke nLooper** looper) { 1155 static SkPdfResult PdfOp_v(SkPdfContext* pdfContext, SkCanvas* canvas, SkPdfToke nLooper*) {
1150 if (pdfContext->fGraphicsState.fPathClosed) { 1156 if (pdfContext->fGraphicsState.fPathClosed) {
1151 pdfContext->fGraphicsState.fPath.reset(); 1157 pdfContext->fGraphicsState.fPath.reset();
1152 pdfContext->fGraphicsState.fPathClosed = false; 1158 pdfContext->fGraphicsState.fPathClosed = false;
1153 } 1159 }
1154 1160
1155 EXPECT_OPERANDS("v", pdfContext, 4); 1161 EXPECT_OPERANDS("v", pdfContext, 4);
1156 POP_NUMBER(pdfContext, y3); 1162 POP_NUMBER(pdfContext, y3);
1157 POP_NUMBER(pdfContext, x3); 1163 POP_NUMBER(pdfContext, x3);
1158 POP_NUMBER(pdfContext, y2); 1164 POP_NUMBER(pdfContext, y2);
1159 POP_NUMBER(pdfContext, x2); 1165 POP_NUMBER(pdfContext, x2);
1160 CHECK_PARAMETERS(); 1166 CHECK_PARAMETERS();
1161 1167
1162 double y1 = pdfContext->fGraphicsState.fCurPosY; 1168 double y1 = pdfContext->fGraphicsState.fCurPosY;
1163 double x1 = pdfContext->fGraphicsState.fCurPosX; 1169 double x1 = pdfContext->fGraphicsState.fCurPosX;
1164 1170
1165 pdfContext->fGraphicsState.fPath.cubicTo(SkDoubleToScalar(x1), SkDoubleToSca lar(y1), 1171 pdfContext->fGraphicsState.fPath.cubicTo(SkDoubleToScalar(x1), SkDoubleToSca lar(y1),
1166 SkDoubleToScalar(x2), SkDoubleToSca lar(y2), 1172 SkDoubleToScalar(x2), SkDoubleToSca lar(y2),
1167 SkDoubleToScalar(x3), SkDoubleToSca lar(y3)); 1173 SkDoubleToScalar(x3), SkDoubleToSca lar(y3));
1168 1174
1169 pdfContext->fGraphicsState.fCurPosX = x3; 1175 pdfContext->fGraphicsState.fCurPosX = x3;
1170 pdfContext->fGraphicsState.fCurPosY = y3; 1176 pdfContext->fGraphicsState.fCurPosY = y3;
1171 1177
1172 return kOK_SkPdfResult; 1178 return kOK_SkPdfResult;
1173 } 1179 }
1174 1180
1175 static SkPdfResult PdfOp_y(SkPdfContext* pdfContext, SkCanvas* canvas, SkPdfToke nLooper** looper) { 1181 static SkPdfResult PdfOp_y(SkPdfContext* pdfContext, SkCanvas* canvas, SkPdfToke nLooper*) {
1176 if (pdfContext->fGraphicsState.fPathClosed) { 1182 if (pdfContext->fGraphicsState.fPathClosed) {
1177 pdfContext->fGraphicsState.fPath.reset(); 1183 pdfContext->fGraphicsState.fPath.reset();
1178 pdfContext->fGraphicsState.fPathClosed = false; 1184 pdfContext->fGraphicsState.fPathClosed = false;
1179 } 1185 }
1180 1186
1181 EXPECT_OPERANDS("y", pdfContext, 4); 1187 EXPECT_OPERANDS("y", pdfContext, 4);
1182 POP_NUMBER(pdfContext, y3); 1188 POP_NUMBER(pdfContext, y3);
1183 POP_NUMBER(pdfContext, x3); 1189 POP_NUMBER(pdfContext, x3);
1184 POP_NUMBER(pdfContext, y1); 1190 POP_NUMBER(pdfContext, y1);
1185 POP_NUMBER(pdfContext, x1); 1191 POP_NUMBER(pdfContext, x1);
1186 CHECK_PARAMETERS(); 1192 CHECK_PARAMETERS();
1187 1193
1188 double y2 = pdfContext->fGraphicsState.fCurPosY; 1194 double y2 = pdfContext->fGraphicsState.fCurPosY;
1189 double x2 = pdfContext->fGraphicsState.fCurPosX; 1195 double x2 = pdfContext->fGraphicsState.fCurPosX;
1190 1196
1191 pdfContext->fGraphicsState.fPath.cubicTo(SkDoubleToScalar(x1), SkDoubleToSca lar(y1), 1197 pdfContext->fGraphicsState.fPath.cubicTo(SkDoubleToScalar(x1), SkDoubleToSca lar(y1),
1192 SkDoubleToScalar(x2), SkDoubleToSca lar(y2), 1198 SkDoubleToScalar(x2), SkDoubleToSca lar(y2),
1193 SkDoubleToScalar(x3), SkDoubleToSca lar(y3)); 1199 SkDoubleToScalar(x3), SkDoubleToSca lar(y3));
1194 1200
1195 pdfContext->fGraphicsState.fCurPosX = x3; 1201 pdfContext->fGraphicsState.fCurPosX = x3;
1196 pdfContext->fGraphicsState.fCurPosY = y3; 1202 pdfContext->fGraphicsState.fCurPosY = y3;
1197 1203
1198 return kOK_SkPdfResult; 1204 return kOK_SkPdfResult;
1199 } 1205 }
1200 1206
1201 static SkPdfResult PdfOp_re(SkPdfContext* pdfContext, SkCanvas* canvas, SkPdfTok enLooper** looper) { 1207 static SkPdfResult PdfOp_re(SkPdfContext* pdfContext, SkCanvas* canvas, SkPdfTok enLooper*) {
1202 if (pdfContext->fGraphicsState.fPathClosed) { 1208 if (pdfContext->fGraphicsState.fPathClosed) {
1203 pdfContext->fGraphicsState.fPath.reset(); 1209 pdfContext->fGraphicsState.fPath.reset();
1204 pdfContext->fGraphicsState.fPathClosed = false; 1210 pdfContext->fGraphicsState.fPathClosed = false;
1205 } 1211 }
1206 1212
1207 EXPECT_OPERANDS("re", pdfContext, 4); 1213 EXPECT_OPERANDS("re", pdfContext, 4);
1208 POP_NUMBER(pdfContext, height); 1214 POP_NUMBER(pdfContext, height);
1209 POP_NUMBER(pdfContext, width); 1215 POP_NUMBER(pdfContext, width);
1210 POP_NUMBER(pdfContext, y); 1216 POP_NUMBER(pdfContext, y);
1211 POP_NUMBER(pdfContext, x); 1217 POP_NUMBER(pdfContext, x);
1212 CHECK_PARAMETERS(); 1218 CHECK_PARAMETERS();
1213 1219
1214 pdfContext->fGraphicsState.fPath.addRect(SkDoubleToScalar(x), 1220 pdfContext->fGraphicsState.fPath.addRect(SkDoubleToScalar(x),
1215 SkDoubleToScalar(y), 1221 SkDoubleToScalar(y),
1216 SkDoubleToScalar(x + width), 1222 SkDoubleToScalar(x + width),
1217 SkDoubleToScalar(y + height)); 1223 SkDoubleToScalar(y + height));
1218 1224
1219 pdfContext->fGraphicsState.fCurPosX = x; 1225 pdfContext->fGraphicsState.fCurPosX = x;
1220 pdfContext->fGraphicsState.fCurPosY = y + height; 1226 pdfContext->fGraphicsState.fCurPosY = y + height;
1221 1227
1222 return kOK_SkPdfResult; 1228 return kOK_SkPdfResult;
1223 } 1229 }
1224 1230
1225 static SkPdfResult PdfOp_h(SkPdfContext* pdfContext, SkCanvas* canvas, SkPdfToke nLooper** looper) { 1231 static SkPdfResult PdfOp_h(SkPdfContext* pdfContext, SkCanvas* canvas, SkPdfToke nLooper*) {
1226 pdfContext->fGraphicsState.fPath.close(); 1232 pdfContext->fGraphicsState.fPath.close();
1227 return kOK_SkPdfResult; 1233 return kOK_SkPdfResult;
1228 } 1234 }
1229 1235
1230 static SkPdfResult PdfOp_fillAndStroke(SkPdfContext* pdfContext, SkCanvas* canva s, 1236 static SkPdfResult PdfOp_fillAndStroke(SkPdfContext* pdfContext, SkCanvas* canva s,
1231 bool fill, bool stroke, bool close, bool evenOdd) { 1237 bool fill, bool stroke, bool close, bool evenOdd) {
1232 SkPath path = pdfContext->fGraphicsState.fPath; 1238 SkPath path = pdfContext->fGraphicsState.fPath;
1233 1239
1234 if (close) { 1240 if (close) {
1235 path.close(); 1241 path.close();
(...skipping 129 matching lines...) Expand 10 before | Expand all | Expand 10 after
1365 #endif 1371 #endif
1366 } 1372 }
1367 1373
1368 //pdfContext->fGraphicsState.fClipPath.reset(); 1374 //pdfContext->fGraphicsState.fClipPath.reset();
1369 pdfContext->fGraphicsState.fHasClipPathToApply = false; 1375 pdfContext->fGraphicsState.fHasClipPathToApply = false;
1370 1376
1371 return kOK_SkPdfResult; 1377 return kOK_SkPdfResult;
1372 1378
1373 } 1379 }
1374 1380
1375 static SkPdfResult PdfOp_S(SkPdfContext* pdfContext, SkCanvas* canvas, SkPdfToke nLooper** looper) { 1381 static SkPdfResult PdfOp_S(SkPdfContext* pdfContext, SkCanvas* canvas, SkPdfToke nLooper*) {
1376 return PdfOp_fillAndStroke(pdfContext, canvas, false, true, false, false); 1382 return PdfOp_fillAndStroke(pdfContext, canvas, false, true, false, false);
1377 } 1383 }
1378 1384
1379 static SkPdfResult PdfOp_s(SkPdfContext* pdfContext, SkCanvas* canvas, SkPdfToke nLooper** looper) { 1385 static SkPdfResult PdfOp_s(SkPdfContext* pdfContext, SkCanvas* canvas, SkPdfToke nLooper*) {
1380 return PdfOp_fillAndStroke(pdfContext, canvas, false, true, true, false); 1386 return PdfOp_fillAndStroke(pdfContext, canvas, false, true, true, false);
1381 } 1387 }
1382 1388
1383 static SkPdfResult PdfOp_F(SkPdfContext* pdfContext, SkCanvas* canvas, SkPdfToke nLooper** looper) { 1389 static SkPdfResult PdfOp_F(SkPdfContext* pdfContext, SkCanvas* canvas, SkPdfToke nLooper*) {
1384 return PdfOp_fillAndStroke(pdfContext, canvas, true, false, false, false); 1390 return PdfOp_fillAndStroke(pdfContext, canvas, true, false, false, false);
1385 } 1391 }
1386 1392
1387 static SkPdfResult PdfOp_f(SkPdfContext* pdfContext, SkCanvas* canvas, SkPdfToke nLooper** looper) { 1393 static SkPdfResult PdfOp_f(SkPdfContext* pdfContext, SkCanvas* canvas, SkPdfToke nLooper*) {
1388 return PdfOp_fillAndStroke(pdfContext, canvas, true, false, false, false); 1394 return PdfOp_fillAndStroke(pdfContext, canvas, true, false, false, false);
1389 } 1395 }
1390 1396
1391 static SkPdfResult PdfOp_f_star(SkPdfContext* pdfContext, SkCanvas* canvas, 1397 static SkPdfResult PdfOp_f_star(SkPdfContext* pdfContext, SkCanvas* canvas,
1392 SkPdfTokenLooper** looper) { 1398 SkPdfTokenLooper*) {
1393 return PdfOp_fillAndStroke(pdfContext, canvas, true, false, false, true); 1399 return PdfOp_fillAndStroke(pdfContext, canvas, true, false, false, true);
1394 } 1400 }
1395 1401
1396 static SkPdfResult PdfOp_B(SkPdfContext* pdfContext, SkCanvas* canvas, SkPdfToke nLooper** looper) { 1402 static SkPdfResult PdfOp_B(SkPdfContext* pdfContext, SkCanvas* canvas, SkPdfToke nLooper*) {
1397 return PdfOp_fillAndStroke(pdfContext, canvas, true, true, false, false); 1403 return PdfOp_fillAndStroke(pdfContext, canvas, true, true, false, false);
1398 } 1404 }
1399 1405
1400 static SkPdfResult PdfOp_B_star(SkPdfContext* pdfContext, SkCanvas* canvas, 1406 static SkPdfResult PdfOp_B_star(SkPdfContext* pdfContext, SkCanvas* canvas,
1401 SkPdfTokenLooper** looper) { 1407 SkPdfTokenLooper*) {
1402 return PdfOp_fillAndStroke(pdfContext, canvas, true, true, false, true); 1408 return PdfOp_fillAndStroke(pdfContext, canvas, true, true, false, true);
1403 } 1409 }
1404 1410
1405 static SkPdfResult PdfOp_b(SkPdfContext* pdfContext, SkCanvas* canvas, SkPdfToke nLooper** looper) { 1411 static SkPdfResult PdfOp_b(SkPdfContext* pdfContext, SkCanvas* canvas, SkPdfToke nLooper*) {
1406 return PdfOp_fillAndStroke(pdfContext, canvas, true, true, true, false); 1412 return PdfOp_fillAndStroke(pdfContext, canvas, true, true, true, false);
1407 } 1413 }
1408 1414
1409 static SkPdfResult PdfOp_b_star(SkPdfContext* pdfContext, SkCanvas* canvas, 1415 static SkPdfResult PdfOp_b_star(SkPdfContext* pdfContext, SkCanvas* canvas,
1410 SkPdfTokenLooper** looper) { 1416 SkPdfTokenLooper*) {
1411 return PdfOp_fillAndStroke(pdfContext, canvas, true, true, true, true); 1417 return PdfOp_fillAndStroke(pdfContext, canvas, true, true, true, true);
1412 } 1418 }
1413 1419
1414 static SkPdfResult PdfOp_n(SkPdfContext* pdfContext, SkCanvas* canvas, SkPdfToke nLooper** looper) { 1420 static SkPdfResult PdfOp_n(SkPdfContext* pdfContext, SkCanvas* canvas, SkPdfToke nLooper*) {
1415 canvas->setMatrix(pdfContext->fGraphicsState.fCTM); 1421 canvas->setMatrix(pdfContext->fGraphicsState.fCTM);
1416 if (pdfContext->fGraphicsState.fHasClipPathToApply) { 1422 if (pdfContext->fGraphicsState.fHasClipPathToApply) {
1417 #ifndef PDF_DEBUG_NO_CLIPING 1423 #ifndef PDF_DEBUG_NO_CLIPING
1418 canvas->clipPath(pdfContext->fGraphicsState.fClipPath, SkRegion::kInters ect_Op, true); 1424 canvas->clipPath(pdfContext->fGraphicsState.fClipPath, SkRegion::kInters ect_Op, true);
1419 #endif 1425 #endif
1420 } 1426 }
1421 1427
1422 pdfContext->fGraphicsState.fHasClipPathToApply = false; 1428 pdfContext->fGraphicsState.fHasClipPathToApply = false;
1423 1429
1424 pdfContext->fGraphicsState.fPathClosed = true; 1430 pdfContext->fGraphicsState.fPathClosed = true;
1425 1431
1426 return kOK_SkPdfResult; 1432 return kOK_SkPdfResult;
1427 } 1433 }
1428 1434
1429 static SkPdfResult PdfOp_BT(SkPdfContext* pdfContext, SkCanvas* canvas, SkPdfTok enLooper** looper) { 1435 static SkPdfResult PdfOp_BT(SkPdfContext* pdfContext, SkCanvas* canvas, SkPdfTok enLooper*) {
1430 pdfContext->fGraphicsState.fTextBlock = true; 1436 pdfContext->fGraphicsState.fTextBlock = true;
1431 SkMatrix matrix = pdfContext->fGraphicsState.fCTM; 1437 SkMatrix matrix = pdfContext->fGraphicsState.fCTM;
1432 matrix.preScale(SkDoubleToScalar(1), SkDoubleToScalar(-1)); 1438 matrix.preScale(SkDoubleToScalar(1), SkDoubleToScalar(-1));
1433 pdfContext->fGraphicsState.fMatrixTm = matrix; 1439 pdfContext->fGraphicsState.fMatrixTm = matrix;
1434 pdfContext->fGraphicsState.fMatrixTlm = matrix; 1440 pdfContext->fGraphicsState.fMatrixTlm = matrix;
1435 1441
1436 return kPartial_SkPdfResult; 1442 return kPartial_SkPdfResult;
1437 } 1443 }
1438 1444
1439 static SkPdfResult PdfOp_ET(SkPdfContext* pdfContext, SkCanvas* canvas, SkPdfTok enLooper** looper) { 1445 static SkPdfResult PdfOp_ET(SkPdfContext* pdfContext, SkCanvas* canvas, SkPdfTok enLooper*) {
1440 if (!pdfContext->fGraphicsState.fTextBlock) { 1446 if (!pdfContext->fGraphicsState.fTextBlock) {
1441 SkPdfReport(kIgnoreError_SkPdfIssueSeverity, kMissingBT_SkPdfIssue, "ET without BT", NULL, 1447 SkPdfReport(kIgnoreError_SkPdfIssueSeverity, kMissingBT_SkPdfIssue, "ET without BT", NULL,
1442 pdfContext); 1448 pdfContext);
1443 1449
1444 return kIgnoreError_SkPdfResult; 1450 return kIgnoreError_SkPdfResult;
1445 } 1451 }
1446 1452
1447 pdfContext->fGraphicsState.fTextBlock = false; 1453 pdfContext->fGraphicsState.fTextBlock = false;
1448 1454
1449 // TODO(edisonn): anything else to be done once we are done with draw text? Like restore stack? 1455 // TODO(edisonn): anything else to be done once we are done with draw text? Like restore stack?
(...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after
1482 } 1488 }
1483 pdfContext->fGraphicsState.fCurFontSize = fontSize; 1489 pdfContext->fGraphicsState.fCurFontSize = fontSize;
1484 return kOK_SkPdfResult; 1490 return kOK_SkPdfResult;
1485 } 1491 }
1486 1492
1487 //font size Tf Set the text font, Tf 1493 //font size Tf Set the text font, Tf
1488 //, to font and the text font size, Tfs, to size. font is the name of a 1494 //, to font and the text font size, Tfs, to size. font is the name of a
1489 //font resource in the Fontsubdictionary of the current resource dictionary; siz e is 1495 //font resource in the Fontsubdictionary of the current resource dictionary; siz e is
1490 //a number representing a scale factor. There is no initial value for either fon t or 1496 //a number representing a scale factor. There is no initial value for either fon t or
1491 //size; they must be specified explicitly using Tf before any text is shown. 1497 //size; they must be specified explicitly using Tf before any text is shown.
1492 static SkPdfResult PdfOp_Tf(SkPdfContext* pdfContext, SkCanvas* canvas, SkPdfTok enLooper** looper) { 1498 static SkPdfResult PdfOp_Tf(SkPdfContext* pdfContext, SkCanvas* canvas, SkPdfTok enLooper*) {
1493 EXPECT_OPERANDS("Tf", pdfContext, 2); 1499 EXPECT_OPERANDS("Tf", pdfContext, 2);
1494 POP_NUMBER(pdfContext, fontSize); 1500 POP_NUMBER(pdfContext, fontSize);
1495 POP_NAME(pdfContext, fontName); 1501 POP_NAME(pdfContext, fontName);
1496 CHECK_PARAMETERS(); 1502 CHECK_PARAMETERS();
1497 1503
1498 return skpdfGraphicsStateApplyFontCore(pdfContext, fontName, fontSize); 1504 return skpdfGraphicsStateApplyFontCore(pdfContext, fontName, fontSize);
1499 } 1505 }
1500 1506
1501 static SkPdfResult PdfOp_Tj(SkPdfContext* pdfContext, SkCanvas* canvas, SkPdfTok enLooper** looper) { 1507 static SkPdfResult PdfOp_Tj(SkPdfContext* pdfContext, SkCanvas* canvas, SkPdfTok enLooper*) {
1502 EXPECT_OPERANDS("Tj", pdfContext, 1); 1508 EXPECT_OPERANDS("Tj", pdfContext, 1);
1503 POP_STRING(pdfContext, str); 1509 POP_STRING(pdfContext, str);
1504 CHECK_PARAMETERS(); 1510 CHECK_PARAMETERS();
1505 1511
1506 if (!pdfContext->fGraphicsState.fTextBlock) { 1512 if (!pdfContext->fGraphicsState.fTextBlock) {
1507 // TODO(edisonn): try to recover and draw it any way? 1513 // TODO(edisonn): try to recover and draw it any way?
1508 SkPdfReport(kIgnoreError_SkPdfIssueSeverity, kMissingBT_SkPdfIssue, "Tj without BT", NULL, 1514 SkPdfReport(kIgnoreError_SkPdfIssueSeverity, kMissingBT_SkPdfIssue, "Tj without BT", NULL,
1509 pdfContext); 1515 pdfContext);
1510 return kIgnoreError_SkPdfResult; 1516 return kIgnoreError_SkPdfResult;
1511 } 1517 }
1512 1518
1513 SkPdfResult ret = DrawText(pdfContext, str, canvas); 1519 SkPdfResult ret = DrawText(pdfContext, str, canvas);
1514 1520
1515 return ret; 1521 return ret;
1516 } 1522 }
1517 1523
1518 static SkPdfResult PdfOp_quote(SkPdfContext* pdfContext, SkCanvas* canvas, 1524 static SkPdfResult PdfOp_quote(SkPdfContext* pdfContext, SkCanvas* canvas,
1519 SkPdfTokenLooper** looper) { 1525 SkPdfTokenLooper* parentLooper) {
1520 if (!pdfContext->fGraphicsState.fTextBlock) { 1526 if (!pdfContext->fGraphicsState.fTextBlock) {
1521 // TODO(edisonn): try to recover and draw it any way? 1527 // TODO(edisonn): try to recover and draw it any way?
1522 SkPdfReport(kIgnoreError_SkPdfIssueSeverity, kMissingBT_SkPdfIssue, 1528 SkPdfReport(kIgnoreError_SkPdfIssueSeverity, kMissingBT_SkPdfIssue,
1523 "' without BT", NULL, pdfContext); 1529 "' without BT", NULL, pdfContext);
1524 return kIgnoreError_SkPdfResult; 1530 return kIgnoreError_SkPdfResult;
1525 } 1531 }
1526 1532
1527 PdfOp_T_star(pdfContext, canvas, looper); 1533 PdfOp_T_star(pdfContext, canvas, parentLooper);
1528 // Do not pop, and push, just transfer the param to Tj 1534 // Do not pop, and push, just transfer the param to Tj
1529 return PdfOp_Tj(pdfContext, canvas, looper); 1535 return PdfOp_Tj(pdfContext, canvas, parentLooper);
1530 } 1536 }
1531 1537
1532 static SkPdfResult PdfOp_doublequote(SkPdfContext* pdfContext, SkCanvas* canvas, 1538 static SkPdfResult PdfOp_doublequote(SkPdfContext* pdfContext, SkCanvas* canvas,
1533 SkPdfTokenLooper** looper) { 1539 SkPdfTokenLooper* parentLooper) {
1534 if (!pdfContext->fGraphicsState.fTextBlock) { 1540 if (!pdfContext->fGraphicsState.fTextBlock) {
1535 // TODO(edisonn): try to recover and draw it any way? 1541 // TODO(edisonn): try to recover and draw it any way?
1536 SkPdfReport(kIgnoreError_SkPdfIssueSeverity, kMissingBT_SkPdfIssue, 1542 SkPdfReport(kIgnoreError_SkPdfIssueSeverity, kMissingBT_SkPdfIssue,
1537 "\" without BT", NULL, pdfContext); 1543 "\" without BT", NULL, pdfContext);
1538 return kIgnoreError_SkPdfResult; 1544 return kIgnoreError_SkPdfResult;
1539 } 1545 }
1540 1546
1541 EXPECT_OPERANDS("\"", pdfContext, 3); 1547 EXPECT_OPERANDS("\"", pdfContext, 3);
1542 POP_OBJ(pdfContext, str); 1548 POP_OBJ(pdfContext, str);
1543 POP_OBJ(pdfContext, ac); 1549 POP_OBJ(pdfContext, ac);
1544 POP_OBJ(pdfContext, aw); 1550 POP_OBJ(pdfContext, aw);
1545 CHECK_PARAMETERS(); 1551 CHECK_PARAMETERS();
1546 1552
1547 pdfContext->fObjectStack.push(aw); 1553 pdfContext->fObjectStack.push(aw);
1548 PdfOp_Tw(pdfContext, canvas, looper); 1554 PdfOp_Tw(pdfContext, canvas, parentLooper);
1549 1555
1550 pdfContext->fObjectStack.push(ac); 1556 pdfContext->fObjectStack.push(ac);
1551 PdfOp_Tc(pdfContext, canvas, looper); 1557 PdfOp_Tc(pdfContext, canvas, parentLooper);
1552 1558
1553 pdfContext->fObjectStack.push(str); 1559 pdfContext->fObjectStack.push(str);
1554 PdfOp_quote(pdfContext, canvas, looper); 1560 PdfOp_quote(pdfContext, canvas, parentLooper);
1555 1561
1556 return kPartial_SkPdfResult; 1562 return kPartial_SkPdfResult;
1557 } 1563 }
1558 1564
1559 static SkPdfResult PdfOp_TJ(SkPdfContext* pdfContext, SkCanvas* canvas, SkPdfTok enLooper** looper) { 1565 static SkPdfResult PdfOp_TJ(SkPdfContext* pdfContext, SkCanvas* canvas, SkPdfTok enLooper*) {
1560 EXPECT_OPERANDS("Tf", pdfContext, 1); 1566 EXPECT_OPERANDS("Tf", pdfContext, 1);
1561 POP_ARRAY(pdfContext, array); 1567 POP_ARRAY(pdfContext, array);
1562 CHECK_PARAMETERS(); 1568 CHECK_PARAMETERS();
1563 1569
1564 if (!pdfContext->fGraphicsState.fTextBlock) { 1570 if (!pdfContext->fGraphicsState.fTextBlock) {
1565 // TODO(edisonn): try to recover and draw it any way? 1571 // TODO(edisonn): try to recover and draw it any way?
1566 SkPdfReport(kIgnoreError_SkPdfIssueSeverity, kMissingBT_SkPdfIssue, "TJ without BT", NULL, 1572 SkPdfReport(kIgnoreError_SkPdfIssueSeverity, kMissingBT_SkPdfIssue, "TJ without BT", NULL,
1567 pdfContext); 1573 pdfContext);
1568 return kIgnoreError_SkPdfResult; 1574 return kIgnoreError_SkPdfResult;
1569 } 1575 }
(...skipping 93 matching lines...) Expand 10 before | Expand all | Expand 10 after
1663 return kPartial_SkPdfResult; 1669 return kPartial_SkPdfResult;
1664 } 1670 }
1665 return kNYI_SkPdfResult; 1671 return kNYI_SkPdfResult;
1666 } 1672 }
1667 } 1673 }
1668 } 1674 }
1669 1675
1670 return kPartial_SkPdfResult; 1676 return kPartial_SkPdfResult;
1671 } 1677 }
1672 1678
1673 static SkPdfResult PdfOp_CS(SkPdfContext* pdfContext, SkCanvas* canvas, SkPdfTok enLooper** looper) { 1679 static SkPdfResult PdfOp_CS(SkPdfContext* pdfContext, SkCanvas* canvas, SkPdfTok enLooper*) {
1674 return PdfOp_CS_cs(pdfContext, canvas, &pdfContext->fGraphicsState.fStroking ); 1680 return PdfOp_CS_cs(pdfContext, canvas, &pdfContext->fGraphicsState.fStroking );
1675 } 1681 }
1676 1682
1677 static SkPdfResult PdfOp_cs(SkPdfContext* pdfContext, SkCanvas* canvas, SkPdfTok enLooper** looper) { 1683 static SkPdfResult PdfOp_cs(SkPdfContext* pdfContext, SkCanvas* canvas, SkPdfTok enLooper*) {
1678 return PdfOp_CS_cs(pdfContext, canvas, &pdfContext->fGraphicsState.fNonStrok ing); 1684 return PdfOp_CS_cs(pdfContext, canvas, &pdfContext->fGraphicsState.fNonStrok ing);
1679 } 1685 }
1680 1686
1681 static SkPdfResult PdfOp_SC_sc(SkPdfContext* pdfContext, SkCanvas* canvas, 1687 static SkPdfResult PdfOp_SC_sc(SkPdfContext* pdfContext, SkCanvas* canvas,
1682 SkPdfColorOperator* colorOperator) { 1688 SkPdfColorOperator* colorOperator) {
1683 double c[4]; 1689 double c[4];
1684 // int64_t v[4]; 1690 // int64_t v[4];
1685 1691
1686 int n = GetColorSpaceComponents(colorOperator->fColorSpace); 1692 int n = GetColorSpaceComponents(colorOperator->fColorSpace);
1687 1693
(...skipping 22 matching lines...) Expand all
1710 // TODO(edisonn): support also abbreviations /DeviceRGB == /RGB 1716 // TODO(edisonn): support also abbreviations /DeviceRGB == /RGB
1711 if (colorOperator->fColorSpace.equals("DeviceRGB") || 1717 if (colorOperator->fColorSpace.equals("DeviceRGB") ||
1712 colorOperator->fColorSpace.equals("RGB")) { 1718 colorOperator->fColorSpace.equals("RGB")) {
1713 colorOperator->setRGBColor(SkColorSetRGB((U8CPU)(255*c[0]), 1719 colorOperator->setRGBColor(SkColorSetRGB((U8CPU)(255*c[0]),
1714 (U8CPU)(255*c[1]), 1720 (U8CPU)(255*c[1]),
1715 (U8CPU)(255*c[2]))); 1721 (U8CPU)(255*c[2])));
1716 } 1722 }
1717 return kPartial_SkPdfResult; 1723 return kPartial_SkPdfResult;
1718 } 1724 }
1719 1725
1720 static SkPdfResult PdfOp_SC(SkPdfContext* pdfContext, SkCanvas* canvas, SkPdfTok enLooper** looper) { 1726 static SkPdfResult PdfOp_SC(SkPdfContext* pdfContext, SkCanvas* canvas, SkPdfTok enLooper*) {
1721 return PdfOp_SC_sc(pdfContext, canvas, &pdfContext->fGraphicsState.fStroking ); 1727 return PdfOp_SC_sc(pdfContext, canvas, &pdfContext->fGraphicsState.fStroking );
1722 } 1728 }
1723 1729
1724 static SkPdfResult PdfOp_sc(SkPdfContext* pdfContext, SkCanvas* canvas, SkPdfTok enLooper** looper) { 1730 static SkPdfResult PdfOp_sc(SkPdfContext* pdfContext, SkCanvas* canvas, SkPdfTok enLooper*) {
1725 return PdfOp_SC_sc(pdfContext, canvas, &pdfContext->fGraphicsState.fNonStrok ing); 1731 return PdfOp_SC_sc(pdfContext, canvas, &pdfContext->fGraphicsState.fNonStrok ing);
1726 } 1732 }
1727 1733
1728 static SkPdfResult PdfOp_SCN_scn(SkPdfContext* pdfContext, SkCanvas* canvas, 1734 static SkPdfResult PdfOp_SCN_scn(SkPdfContext* pdfContext, SkCanvas* canvas,
1729 SkPdfColorOperator* colorOperator) { 1735 SkPdfColorOperator* colorOperator) {
1730 if (pdfContext->fObjectStack.count() > 0 && pdfContext->fObjectStack.top()-> isName()) { 1736 if (pdfContext->fObjectStack.count() > 0 && pdfContext->fObjectStack.top()-> isName()) {
1731 SkPdfNativeObject* name = pdfContext->fObjectStack.top(); pdfContext- >fObjectStack.pop(); 1737 SkPdfNativeObject* name = pdfContext->fObjectStack.top(); pdfContext- >fObjectStack.pop();
1732 1738
1733 SkPdfDictionary* patternResources 1739 SkPdfDictionary* patternResources
1734 = pdfContext->fGraphicsState.fResources->Pattern(pdfContext->fPd fDoc); 1740 = pdfContext->fGraphicsState.fResources->Pattern(pdfContext->fPd fDoc);
1735 1741
1736 if (patternResources == NULL) { 1742 if (patternResources == NULL) {
1737 #ifdef PDF_TRACE 1743 #ifdef PDF_TRACE
1738 printf("ExtGState is NULL!\n"); 1744 printf("ExtGState is NULL!\n");
1739 #endif 1745 #endif
1740 return kIgnoreError_SkPdfResult; 1746 return kIgnoreError_SkPdfResult;
1741 } 1747 }
1742 1748
1743 colorOperator->setPatternColorSpace( 1749 colorOperator->setPatternColorSpace(
1744 pdfContext->fPdfDoc->resolveReference(patternResources->get(name ))); 1750 pdfContext->fPdfDoc->resolveReference(patternResources->get(name )));
1745 } 1751 }
1746 1752
1747 // TODO(edisonn): SCN supports more color spaces than SCN. Read and implemen t spec. 1753 // TODO(edisonn): SCN supports more color spaces than SCN. Read and implemen t spec.
1748 PdfOp_SC_sc(pdfContext, canvas, colorOperator); 1754 PdfOp_SC_sc(pdfContext, canvas, colorOperator);
1749 1755
1750 return kPartial_SkPdfResult; 1756 return kPartial_SkPdfResult;
1751 } 1757 }
1752 1758
1753 static SkPdfResult PdfOp_SCN(SkPdfContext* pdfContext, SkCanvas* canvas, SkPdfTo kenLooper** looper) { 1759 static SkPdfResult PdfOp_SCN(SkPdfContext* pdfContext, SkCanvas* canvas, SkPdfTo kenLooper*) {
1754 return PdfOp_SCN_scn(pdfContext, canvas, &pdfContext->fGraphicsState.fStroki ng); 1760 return PdfOp_SCN_scn(pdfContext, canvas, &pdfContext->fGraphicsState.fStroki ng);
1755 } 1761 }
1756 1762
1757 static SkPdfResult PdfOp_scn(SkPdfContext* pdfContext, SkCanvas* canvas, SkPdfTo kenLooper** looper) { 1763 static SkPdfResult PdfOp_scn(SkPdfContext* pdfContext, SkCanvas* canvas, SkPdfTo kenLooper*) {
1758 return PdfOp_SCN_scn(pdfContext, canvas, &pdfContext->fGraphicsState.fNonStr oking); 1764 return PdfOp_SCN_scn(pdfContext, canvas, &pdfContext->fGraphicsState.fNonStr oking);
1759 } 1765 }
1760 1766
1761 static SkPdfResult PdfOp_G_g(SkPdfContext* pdfContext, SkCanvas* canvas, 1767 static SkPdfResult PdfOp_G_g(SkPdfContext* pdfContext, SkCanvas* canvas,
1762 SkPdfColorOperator* colorOperator) { 1768 SkPdfColorOperator* colorOperator) {
1763 EXPECT_OPERANDS("G/g", pdfContext, 1); 1769 EXPECT_OPERANDS("G/g", pdfContext, 1);
1764 POP_NUMBER(pdfContext, gray); 1770 POP_NUMBER(pdfContext, gray);
1765 CHECK_PARAMETERS(); 1771 CHECK_PARAMETERS();
1766 1772
1767 // TODO(edisonn): limit gray in [0, 1] 1773 // TODO(edisonn): limit gray in [0, 1]
1768 1774
1769 // TODO(edisonn): HACK - it should be device gray, but not suported right no w 1775 // TODO(edisonn): HACK - it should be device gray, but not suported right no w
1770 colorOperator->fColorSpace = strings_DeviceRGB; 1776 colorOperator->fColorSpace = strings_DeviceRGB;
1771 colorOperator->setRGBColor(SkColorSetRGB((U8CPU)(255 * gray), 1777 colorOperator->setRGBColor(SkColorSetRGB((U8CPU)(255 * gray),
1772 (U8CPU)(255 * gray), 1778 (U8CPU)(255 * gray),
1773 (U8CPU)(255 * gray))); 1779 (U8CPU)(255 * gray)));
1774 1780
1775 return kPartial_SkPdfResult; 1781 return kPartial_SkPdfResult;
1776 } 1782 }
1777 1783
1778 static SkPdfResult PdfOp_G(SkPdfContext* pdfContext, SkCanvas* canvas, SkPdfToke nLooper** looper) { 1784 static SkPdfResult PdfOp_G(SkPdfContext* pdfContext, SkCanvas* canvas, SkPdfToke nLooper*) {
1779 return PdfOp_G_g(pdfContext, canvas, &pdfContext->fGraphicsState.fStroking); 1785 return PdfOp_G_g(pdfContext, canvas, &pdfContext->fGraphicsState.fStroking);
1780 } 1786 }
1781 1787
1782 static SkPdfResult PdfOp_g(SkPdfContext* pdfContext, SkCanvas* canvas, SkPdfToke nLooper** looper) { 1788 static SkPdfResult PdfOp_g(SkPdfContext* pdfContext, SkCanvas* canvas, SkPdfToke nLooper*) {
1783 return PdfOp_G_g(pdfContext, canvas, &pdfContext->fGraphicsState.fNonStrokin g); 1789 return PdfOp_G_g(pdfContext, canvas, &pdfContext->fGraphicsState.fNonStrokin g);
1784 } 1790 }
1785 1791
1786 static SkPdfResult PdfOp_RG_rg(SkPdfContext* pdfContext, SkCanvas* canvas, 1792 static SkPdfResult PdfOp_RG_rg(SkPdfContext* pdfContext, SkCanvas* canvas,
1787 SkPdfColorOperator* colorOperator) { 1793 SkPdfColorOperator* colorOperator) {
1788 EXPECT_OPERANDS("RG/rg", pdfContext, 3); 1794 EXPECT_OPERANDS("RG/rg", pdfContext, 3);
1789 POP_NUMBER(pdfContext, b); 1795 POP_NUMBER(pdfContext, b);
1790 POP_NUMBER(pdfContext, g); 1796 POP_NUMBER(pdfContext, g);
1791 POP_NUMBER(pdfContext, r); 1797 POP_NUMBER(pdfContext, r);
1792 CHECK_PARAMETERS(); 1798 CHECK_PARAMETERS();
1793 1799
1794 colorOperator->fColorSpace = strings_DeviceRGB; 1800 colorOperator->fColorSpace = strings_DeviceRGB;
1795 colorOperator->setRGBColor(SkColorSetRGB((U8CPU)(255*r), (U8CPU)(255*g), (U8 CPU)(255*b))); 1801 colorOperator->setRGBColor(SkColorSetRGB((U8CPU)(255*r), (U8CPU)(255*g), (U8 CPU)(255*b)));
1796 return kOK_SkPdfResult; 1802 return kOK_SkPdfResult;
1797 } 1803 }
1798 1804
1799 static SkPdfResult PdfOp_RG(SkPdfContext* pdfContext, SkCanvas* canvas, SkPdfTok enLooper** looper) { 1805 static SkPdfResult PdfOp_RG(SkPdfContext* pdfContext, SkCanvas* canvas, SkPdfTok enLooper*) {
1800 return PdfOp_RG_rg(pdfContext, canvas, &pdfContext->fGraphicsState.fStroking ); 1806 return PdfOp_RG_rg(pdfContext, canvas, &pdfContext->fGraphicsState.fStroking );
1801 } 1807 }
1802 1808
1803 static SkPdfResult PdfOp_rg(SkPdfContext* pdfContext, SkCanvas* canvas, SkPdfTok enLooper** looper) { 1809 static SkPdfResult PdfOp_rg(SkPdfContext* pdfContext, SkCanvas* canvas, SkPdfTok enLooper*) {
1804 return PdfOp_RG_rg(pdfContext, canvas, &pdfContext->fGraphicsState.fNonStrok ing); 1810 return PdfOp_RG_rg(pdfContext, canvas, &pdfContext->fGraphicsState.fNonStrok ing);
1805 } 1811 }
1806 1812
1807 static SkPdfResult PdfOp_K_k(SkPdfContext* pdfContext, SkCanvas* canvas, 1813 static SkPdfResult PdfOp_K_k(SkPdfContext* pdfContext, SkCanvas* canvas,
1808 SkPdfColorOperator* colorOperator) { 1814 SkPdfColorOperator* colorOperator) {
1809 // TODO(edisonn): spec has some rules about overprint, implement them. 1815 // TODO(edisonn): spec has some rules about overprint, implement them.
1810 EXPECT_OPERANDS("K/k", pdfContext, 4); 1816 EXPECT_OPERANDS("K/k", pdfContext, 4);
1811 POP_NUMBER(pdfContext, k); 1817 POP_NUMBER(pdfContext, k);
1812 POP_NUMBER(pdfContext, y); 1818 POP_NUMBER(pdfContext, y);
1813 POP_NUMBER(pdfContext, m); 1819 POP_NUMBER(pdfContext, m);
1814 POP_NUMBER(pdfContext, c); 1820 POP_NUMBER(pdfContext, c);
1815 CHECK_PARAMETERS(); 1821 CHECK_PARAMETERS();
1816 1822
1817 // TODO(edisonn): really silly quick way to remove compiler warning 1823 // TODO(edisonn): really silly quick way to remove compiler warning
1818 if (k + y + m + c == 0) { 1824 if (k + y + m + c == 0) {
1819 return kNYI_SkPdfResult; 1825 return kNYI_SkPdfResult;
1820 } 1826 }
1821 1827
1822 //colorOperator->fColorSpace = strings_DeviceCMYK; 1828 //colorOperator->fColorSpace = strings_DeviceCMYK;
1823 // TODO(edisonn): Set color. 1829 // TODO(edisonn): Set color.
1824 return kNYI_SkPdfResult; 1830 return kNYI_SkPdfResult;
1825 } 1831 }
1826 1832
1827 static SkPdfResult PdfOp_K(SkPdfContext* pdfContext, SkCanvas* canvas, SkPdfToke nLooper** looper) { 1833 static SkPdfResult PdfOp_K(SkPdfContext* pdfContext, SkCanvas* canvas, SkPdfToke nLooper*) {
1828 return PdfOp_K_k(pdfContext, canvas, &pdfContext->fGraphicsState.fStroking); 1834 return PdfOp_K_k(pdfContext, canvas, &pdfContext->fGraphicsState.fStroking);
1829 } 1835 }
1830 1836
1831 static SkPdfResult PdfOp_k(SkPdfContext* pdfContext, SkCanvas* canvas, SkPdfToke nLooper** looper) { 1837 static SkPdfResult PdfOp_k(SkPdfContext* pdfContext, SkCanvas* canvas, SkPdfToke nLooper*) {
1832 return PdfOp_K_k(pdfContext, canvas, &pdfContext->fGraphicsState.fNonStrokin g); 1838 return PdfOp_K_k(pdfContext, canvas, &pdfContext->fGraphicsState.fNonStrokin g);
1833 } 1839 }
1834 1840
1835 static SkPdfResult PdfOp_W(SkPdfContext* pdfContext, SkCanvas* canvas, SkPdfToke nLooper** looper) { 1841 static SkPdfResult PdfOp_W(SkPdfContext* pdfContext, SkCanvas* canvas, SkPdfToke nLooper*) {
1836 pdfContext->fGraphicsState.fClipPath = pdfContext->fGraphicsState.fPath; 1842 pdfContext->fGraphicsState.fClipPath = pdfContext->fGraphicsState.fPath;
1837 pdfContext->fGraphicsState.fHasClipPathToApply = true; 1843 pdfContext->fGraphicsState.fHasClipPathToApply = true;
1838 1844
1839 return kOK_SkPdfResult; 1845 return kOK_SkPdfResult;
1840 } 1846 }
1841 1847
1842 static SkPdfResult PdfOp_W_star(SkPdfContext* pdfContext, SkCanvas* canvas, 1848 static SkPdfResult PdfOp_W_star(SkPdfContext* pdfContext, SkCanvas* canvas, SkPd fTokenLooper*) {
1843 SkPdfTokenLooper** looper) {
1844 pdfContext->fGraphicsState.fClipPath = pdfContext->fGraphicsState.fPath; 1849 pdfContext->fGraphicsState.fClipPath = pdfContext->fGraphicsState.fPath;
1845 1850
1846 pdfContext->fGraphicsState.fClipPath.setFillType(SkPath::kEvenOdd_FillType); 1851 pdfContext->fGraphicsState.fClipPath.setFillType(SkPath::kEvenOdd_FillType);
1847 pdfContext->fGraphicsState.fHasClipPathToApply = true; 1852 pdfContext->fGraphicsState.fHasClipPathToApply = true;
1848 1853
1849 return kOK_SkPdfResult; 1854 return kOK_SkPdfResult;
1850 } 1855 }
1851 1856
1852 static SkPdfResult PdfOp_BX(SkPdfContext* pdfContext, SkCanvas* canvas, SkPdfTok enLooper** looper) { 1857 static SkPdfResult PdfOp_BX(SkPdfContext* pdfContext, SkCanvas* canvas,
1853 *looper = new PdfCompatibilitySectionLooper(); 1858 SkPdfTokenLooper* parentLooper) {
1859 PdfCompatibilitySectionLooper looper(parentLooper);
1860 looper.loop();
1854 return kOK_SkPdfResult; 1861 return kOK_SkPdfResult;
1855 } 1862 }
1856 1863
1857 static SkPdfResult PdfOp_EX(SkPdfContext* pdfContext, SkCanvas* canvas, SkPdfTok enLooper** looper) { 1864 static SkPdfResult PdfOp_EX(SkPdfContext* pdfContext, SkCanvas* canvas, SkPdfTok enLooper*) {
1858 SkPdfReport(kIgnoreError_SkPdfIssueSeverity, kNullObject_SkPdfIssue, 1865 SkPdfReport(kIgnoreError_SkPdfIssueSeverity, kNullObject_SkPdfIssue,
1859 "EX operator should not be called, it is handled in a looper, " 1866 "EX operator should not be called, it is handled in a looper, "
1860 "unless the file is corrupted, we should assert", 1867 "unless the file is corrupted, we should assert",
1861 NULL, pdfContext); 1868 NULL, pdfContext);
1862 1869
1863 return kIgnoreError_SkPdfResult; 1870 return kIgnoreError_SkPdfResult;
1864 } 1871 }
1865 1872
1866 static SkPdfResult PdfOp_BI(SkPdfContext* pdfContext, SkCanvas* canvas, SkPdfTok enLooper** looper) { 1873 static SkPdfResult PdfOp_BI(SkPdfContext* pdfContext, SkCanvas* canvas,
1867 *looper = new PdfInlineImageLooper(); 1874 SkPdfTokenLooper* parentLooper) {
1875 PdfInlineImageLooper looper(parentLooper);
1876 looper.loop();
1868 return kOK_SkPdfResult; 1877 return kOK_SkPdfResult;
1869 } 1878 }
1870 1879
1871 static SkPdfResult PdfOp_ID(SkPdfContext* pdfContext, SkCanvas* canvas, SkPdfTok enLooper** looper) { 1880 static SkPdfResult PdfOp_ID(SkPdfContext* pdfContext, SkCanvas* canvas, SkPdfTok enLooper*) {
1872 SkPdfReport(kIgnoreError_SkPdfIssueSeverity, kNullObject_SkPdfIssue, 1881 SkPdfReport(kIgnoreError_SkPdfIssueSeverity, kNullObject_SkPdfIssue,
1873 "ID operator should not be called, it is habdled in a looper, " 1882 "ID operator should not be called, it is habdled in a looper, "
1874 "unless the file is corrupted, we should assert", 1883 "unless the file is corrupted, we should assert",
1875 NULL, pdfContext); 1884 NULL, pdfContext);
1876 return kIgnoreError_SkPdfResult; 1885 return kIgnoreError_SkPdfResult;
1877 } 1886 }
1878 1887
1879 static SkPdfResult PdfOp_EI(SkPdfContext* pdfContext, SkCanvas* canvas, SkPdfTok enLooper** looper) { 1888 static SkPdfResult PdfOp_EI(SkPdfContext* pdfContext, SkCanvas* canvas, SkPdfTok enLooper*) {
1880 SkPdfReport(kIgnoreError_SkPdfIssueSeverity, kNullObject_SkPdfIssue, 1889 SkPdfReport(kIgnoreError_SkPdfIssueSeverity, kNullObject_SkPdfIssue,
1881 "EI operator should not be called, it is habdled in a looper, " 1890 "EI operator should not be called, it is habdled in a looper, "
1882 "unless the file is corrupted, we should assert", 1891 "unless the file is corrupted, we should assert",
1883 NULL, pdfContext); 1892 NULL, pdfContext);
1884 return kIgnoreError_SkPdfResult; 1893 return kIgnoreError_SkPdfResult;
1885 } 1894 }
1886 1895
1887 static SkPdfResult skpdfGraphicsStateApply_ca(SkPdfContext* pdfContext, double c a) { 1896 static SkPdfResult skpdfGraphicsStateApply_ca(SkPdfContext* pdfContext, double c a) {
1888 pdfContext->fGraphicsState.fNonStroking.fOpacity = ca; 1897 pdfContext->fGraphicsState.fNonStroking.fOpacity = ca;
1889 return kOK_SkPdfResult; 1898 return kOK_SkPdfResult;
(...skipping 144 matching lines...) Expand 10 before | Expand all | Expand 10 after
2034 SkPdfNativeObject::_kNumber_PdfObjectType, pdf Context); 2043 SkPdfNativeObject::_kNumber_PdfObjectType, pdf Context);
2035 return; 2044 return;
2036 } 2045 }
2037 2046
2038 skpdfGraphicsStateApplyFontCore(pdfContext, fontAndSize->objAtAIndex(0), 2047 skpdfGraphicsStateApplyFontCore(pdfContext, fontAndSize->objAtAIndex(0),
2039 fontAndSize->objAtAIndex(1)->numberValue()); 2048 fontAndSize->objAtAIndex(1)->numberValue());
2040 } 2049 }
2041 2050
2042 2051
2043 //lineWidth w Set the line width in the graphics state (see “Line Width” on page 152). 2052 //lineWidth w Set the line width in the graphics state (see “Line Width” on page 152).
2044 static SkPdfResult PdfOp_w(SkPdfContext* pdfContext, SkCanvas* canvas, SkPdfToke nLooper** looper) { 2053 static SkPdfResult PdfOp_w(SkPdfContext* pdfContext, SkCanvas* canvas, SkPdfToke nLooper*) {
2045 EXPECT_OPERANDS("w", pdfContext, 1); 2054 EXPECT_OPERANDS("w", pdfContext, 1);
2046 POP_NUMBER(pdfContext, lw); 2055 POP_NUMBER(pdfContext, lw);
2047 CHECK_PARAMETERS(); 2056 CHECK_PARAMETERS();
2048 2057
2049 return skpdfGraphicsStateApplyLW(pdfContext, lw); 2058 return skpdfGraphicsStateApplyLW(pdfContext, lw);
2050 } 2059 }
2051 2060
2052 //lineCap J Set the line cap style in the graphics state (see “Line Cap Style” o n page 153). 2061 //lineCap J Set the line cap style in the graphics state (see “Line Cap Style” o n page 153).
2053 static SkPdfResult PdfOp_J(SkPdfContext* pdfContext, SkCanvas* canvas, SkPdfToke nLooper** looper) { 2062 static SkPdfResult PdfOp_J(SkPdfContext* pdfContext, SkCanvas* canvas, SkPdfToke nLooper*) {
2054 // TODO(edisonn): round/ceil to int? 2063 // TODO(edisonn): round/ceil to int?
2055 EXPECT_OPERANDS("J", pdfContext, 1); 2064 EXPECT_OPERANDS("J", pdfContext, 1);
2056 POP_NUMBER(pdfContext, lc); 2065 POP_NUMBER(pdfContext, lc);
2057 CHECK_PARAMETERS(); 2066 CHECK_PARAMETERS();
2058 2067
2059 return skpdfGraphicsStateApplyLC(pdfContext, (int)lc); 2068 return skpdfGraphicsStateApplyLC(pdfContext, (int)lc);
2060 } 2069 }
2061 2070
2062 //lineJoin j Set the line join style in the graphics state (see “Line Join Style ” on page 153). 2071 //lineJoin j Set the line join style in the graphics state (see “Line Join Style ” on page 153).
2063 static SkPdfResult PdfOp_j(SkPdfContext* pdfContext, SkCanvas* canvas, SkPdfToke nLooper** looper) { 2072 static SkPdfResult PdfOp_j(SkPdfContext* pdfContext, SkCanvas* canvas, SkPdfToke nLooper*) {
2064 // TODO(edisonn): round/ceil to int? 2073 // TODO(edisonn): round/ceil to int?
2065 EXPECT_OPERANDS("j", pdfContext, 1); 2074 EXPECT_OPERANDS("j", pdfContext, 1);
2066 POP_NUMBER(pdfContext, lj); 2075 POP_NUMBER(pdfContext, lj);
2067 CHECK_PARAMETERS(); 2076 CHECK_PARAMETERS();
2068 2077
2069 return skpdfGraphicsStateApplyLJ(pdfContext, (int)lj); 2078 return skpdfGraphicsStateApplyLJ(pdfContext, (int)lj);
2070 } 2079 }
2071 2080
2072 //miterLimit M Set the miter limit in the graphics state (see “Miter Limit” on p age 153). 2081 //miterLimit M Set the miter limit in the graphics state (see “Miter Limit” on p age 153).
2073 static SkPdfResult PdfOp_M(SkPdfContext* pdfContext, SkCanvas* canvas, SkPdfToke nLooper** looper) { 2082 static SkPdfResult PdfOp_M(SkPdfContext* pdfContext, SkCanvas* canvas, SkPdfToke nLooper*) {
2074 EXPECT_OPERANDS("M", pdfContext, 1); 2083 EXPECT_OPERANDS("M", pdfContext, 1);
2075 POP_NUMBER(pdfContext, ml); 2084 POP_NUMBER(pdfContext, ml);
2076 CHECK_PARAMETERS(); 2085 CHECK_PARAMETERS();
2077 return skpdfGraphicsStateApplyML(pdfContext, ml); 2086 return skpdfGraphicsStateApplyML(pdfContext, ml);
2078 } 2087 }
2079 2088
2080 //dashArray dashPhase d Set the line dash pattern in the graphics state (see “Li ne Dash Pattern” on 2089 //dashArray dashPhase d Set the line dash pattern in the graphics state (see “Li ne Dash Pattern” on
2081 //page 155). 2090 //page 155).
2082 static SkPdfResult PdfOp_d(SkPdfContext* pdfContext, SkCanvas* canvas, SkPdfToke nLooper** looper) { 2091 static SkPdfResult PdfOp_d(SkPdfContext* pdfContext, SkCanvas* canvas, SkPdfToke nLooper*) {
2083 EXPECT_OPERANDS("d", pdfContext, 2); 2092 EXPECT_OPERANDS("d", pdfContext, 2);
2084 POP_OBJ(pdfContext, phase); 2093 POP_OBJ(pdfContext, phase);
2085 POP_ARRAY(pdfContext, array); 2094 POP_ARRAY(pdfContext, array);
2086 CHECK_PARAMETERS(); 2095 CHECK_PARAMETERS();
2087 2096
2088 return skpdfGraphicsStateApplyD(pdfContext, array, phase); 2097 return skpdfGraphicsStateApplyD(pdfContext, array, phase);
2089 } 2098 }
2090 2099
2091 //intent ri (PDF 1.1) Set the color rendering intent in the graphics state (see “Rendering Intents” 2100 //intent ri (PDF 1.1) Set the color rendering intent in the graphics state (see “Rendering Intents”
2092 // on page 197). 2101 // on page 197).
2093 static SkPdfResult PdfOp_ri(SkPdfContext* pdfContext, SkCanvas* canvas, SkPdfTok enLooper** looper) { 2102 static SkPdfResult PdfOp_ri(SkPdfContext* pdfContext, SkCanvas* canvas, SkPdfTok enLooper*) {
2094 pdfContext->fObjectStack.pop(); 2103 pdfContext->fObjectStack.pop();
2095 2104
2096 SkPdfReport(kCodeWarning_SkPdfIssueSeverity, kNYI_SkPdfIssue, "render intent NYI", NULL, 2105 SkPdfReport(kCodeWarning_SkPdfIssueSeverity, kNYI_SkPdfIssue, "render intent NYI", NULL,
2097 pdfContext); 2106 pdfContext);
2098 2107
2099 return kNYI_SkPdfResult; 2108 return kNYI_SkPdfResult;
2100 } 2109 }
2101 2110
2102 //flatness i Set the flatness tolerance in the graphics state (see Section 6.5.1, “Flatness 2111 //flatness i Set the flatness tolerance in the graphics state (see Section 6.5.1, “Flatness
2103 //Tolerance”). flatness is a number in the range 0 to 100; a value of 0 speci- 2112 //Tolerance”). flatness is a number in the range 0 to 100; a value of 0 speci-
2104 //fies the output device’s default flatness tolerance. 2113 //fies the output device’s default flatness tolerance.
2105 static SkPdfResult PdfOp_i(SkPdfContext* pdfContext, SkCanvas* canvas, SkPdfToke nLooper** looper) { 2114 static SkPdfResult PdfOp_i(SkPdfContext* pdfContext, SkCanvas* canvas, SkPdfToke nLooper*) {
2106 EXPECT_OPERANDS("i", pdfContext, 1); 2115 EXPECT_OPERANDS("i", pdfContext, 1);
2107 POP_NUMBER(pdfContext, flatness); 2116 POP_NUMBER(pdfContext, flatness);
2108 CHECK_PARAMETERS(); 2117 CHECK_PARAMETERS();
2109 2118
2110 if (flatness < 0 || flatness > 100) { 2119 if (flatness < 0 || flatness > 100) {
2111 SkPdfReport(kIgnoreError_SkPdfIssueSeverity, kOutOfRange_SkPdfIssue, 2120 SkPdfReport(kIgnoreError_SkPdfIssueSeverity, kOutOfRange_SkPdfIssue,
2112 "flatness must be a real in [0, 100] range", flatness_obj, p dfContext); 2121 "flatness must be a real in [0, 100] range", flatness_obj, p dfContext);
2113 return kIgnoreError_SkPdfResult; 2122 return kIgnoreError_SkPdfResult;
2114 } 2123 }
2115 2124
(...skipping 136 matching lines...) Expand 10 before | Expand all | Expand 10 after
2252 } 2261 }
2253 2262
2254 static void skpdfGraphicsStateApplyAIS(SkPdfContext* pdfContext, bool alphaSourc e) { 2263 static void skpdfGraphicsStateApplyAIS(SkPdfContext* pdfContext, bool alphaSourc e) {
2255 pdfContext->fGraphicsState.fAlphaSource = alphaSource; 2264 pdfContext->fGraphicsState.fAlphaSource = alphaSource;
2256 } 2265 }
2257 2266
2258 2267
2259 //dictName gs (PDF 1.2) Set the specified parameters in the graphics state. dictN ame is 2268 //dictName gs (PDF 1.2) Set the specified parameters in the graphics state. dictN ame is
2260 //the name of a graphics state parameter dictionary in the ExtGState subdictiona ry of the current 2269 //the name of a graphics state parameter dictionary in the ExtGState subdictiona ry of the current
2261 //resource dictionary (see the next section). 2270 //resource dictionary (see the next section).
2262 static SkPdfResult PdfOp_gs(SkPdfContext* pdfContext, SkCanvas* canvas, SkPdfTok enLooper** looper) { 2271 static SkPdfResult PdfOp_gs(SkPdfContext* pdfContext, SkCanvas* canvas, SkPdfTok enLooper*) {
2263 EXPECT_OPERANDS("gs", pdfContext, 1); 2272 EXPECT_OPERANDS("gs", pdfContext, 1);
2264 POP_NAME(pdfContext, name); 2273 POP_NAME(pdfContext, name);
2265 CHECK_PARAMETERS(); 2274 CHECK_PARAMETERS();
2266 2275
2267 SkPdfDictionary* extGStateDictionary 2276 SkPdfDictionary* extGStateDictionary
2268 = pdfContext->fGraphicsState.fResources->ExtGState(pdfContext->fPdfD oc); 2277 = pdfContext->fGraphicsState.fResources->ExtGState(pdfContext->fPdfD oc);
2269 2278
2270 if (extGStateDictionary == NULL) { 2279 if (extGStateDictionary == NULL) {
2271 SkPdfReport(kIgnoreError_SkPdfIssueSeverity, kMissingExtGState_SkPdfIssu e, NULL, 2280 SkPdfReport(kIgnoreError_SkPdfIssueSeverity, kMissingExtGState_SkPdfIssu e, NULL,
2272 pdfContext->fGraphicsState.fResources, pdfContext); 2281 pdfContext->fGraphicsState.fResources, pdfContext);
(...skipping 81 matching lines...) Expand 10 before | Expand all | Expand 10 after
2354 2363
2355 // TODO(edisonn): make sure we loaded all those properties in graphic state. 2364 // TODO(edisonn): make sure we loaded all those properties in graphic state.
2356 2365
2357 return kOK_SkPdfResult; 2366 return kOK_SkPdfResult;
2358 } 2367 }
2359 2368
2360 //charSpace Tc Set the character spacing, Tc 2369 //charSpace Tc Set the character spacing, Tc
2361 //, to charSpace, which is a number expressed in unscaled text space units. 2370 //, to charSpace, which is a number expressed in unscaled text space units.
2362 // Character spacing is used by the Tj, TJ, and ' operators. 2371 // Character spacing is used by the Tj, TJ, and ' operators.
2363 //Initial value: 0. 2372 //Initial value: 0.
2364 SkPdfResult PdfOp_Tc(SkPdfContext* pdfContext, SkCanvas* canvas, SkPdfTokenLoope r** looper) { 2373 SkPdfResult PdfOp_Tc(SkPdfContext* pdfContext, SkCanvas* canvas, SkPdfTokenLoope r*) {
2365 EXPECT_OPERANDS("Tc", pdfContext, 1); 2374 EXPECT_OPERANDS("Tc", pdfContext, 1);
2366 POP_NUMBER(pdfContext, charSpace); 2375 POP_NUMBER(pdfContext, charSpace);
2367 CHECK_PARAMETERS(); 2376 CHECK_PARAMETERS();
2368 2377
2369 pdfContext->fGraphicsState.fCharSpace = charSpace; 2378 pdfContext->fGraphicsState.fCharSpace = charSpace;
2370 2379
2371 return kOK_SkPdfResult; 2380 return kOK_SkPdfResult;
2372 } 2381 }
2373 2382
2374 //wordSpace Tw Set the word spacing, T 2383 //wordSpace Tw Set the word spacing, T
2375 //w 2384 //w
2376 //, to wordSpace, which is a number expressed in unscaled 2385 //, to wordSpace, which is a number expressed in unscaled
2377 //text space units. Word spacing is used by the Tj, TJ, and ' operators. Initial 2386 //text space units. Word spacing is used by the Tj, TJ, and ' operators. Initial
2378 //value: 0. 2387 //value: 0.
2379 SkPdfResult PdfOp_Tw(SkPdfContext* pdfContext, SkCanvas* canvas, SkPdfTokenLoope r** looper) { 2388 SkPdfResult PdfOp_Tw(SkPdfContext* pdfContext, SkCanvas* canvas, SkPdfTokenLoope r*) {
2380 EXPECT_OPERANDS("Tw", pdfContext, 1); 2389 EXPECT_OPERANDS("Tw", pdfContext, 1);
2381 POP_NUMBER(pdfContext, wordSpace); 2390 POP_NUMBER(pdfContext, wordSpace);
2382 CHECK_PARAMETERS(); 2391 CHECK_PARAMETERS();
2383 2392
2384 pdfContext->fGraphicsState.fWordSpace = wordSpace; 2393 pdfContext->fGraphicsState.fWordSpace = wordSpace;
2385 2394
2386 return kOK_SkPdfResult; 2395 return kOK_SkPdfResult;
2387 } 2396 }
2388 2397
2389 //scale Tz Set the horizontal scaling, Th 2398 //scale Tz Set the horizontal scaling, Th
2390 //, to (scale ˜ 100). scale is a number specifying the 2399 //, to (scale ˜ 100). scale is a number specifying the
2391 //percentage of the normal width. Initial value: 100 (normal width). 2400 //percentage of the normal width. Initial value: 100 (normal width).
2392 static SkPdfResult PdfOp_Tz(SkPdfContext* pdfContext, SkCanvas* canvas, SkPdfTok enLooper** looper) { 2401 static SkPdfResult PdfOp_Tz(SkPdfContext* pdfContext, SkCanvas* canvas, SkPdfTok enLooper*) {
2393 EXPECT_OPERANDS("Tz", pdfContext, 1); 2402 EXPECT_OPERANDS("Tz", pdfContext, 1);
2394 POP_NUMBER(pdfContext, scale); 2403 POP_NUMBER(pdfContext, scale);
2395 CHECK_PARAMETERS(); 2404 CHECK_PARAMETERS();
2396 2405
2397 if (scale < 0) { 2406 if (scale < 0) {
2398 SkPdfReport(kIgnoreError_SkPdfIssueSeverity, kOutOfRange_SkPdfIssue, 2407 SkPdfReport(kIgnoreError_SkPdfIssueSeverity, kOutOfRange_SkPdfIssue,
2399 "scale must a positive real number", scale_obj, pdfContext); 2408 "scale must a positive real number", scale_obj, pdfContext);
2400 return kError_SkPdfResult; 2409 return kError_SkPdfResult;
2401 } 2410 }
2402 2411
2403 return kNYI_SkPdfResult; 2412 return kNYI_SkPdfResult;
2404 } 2413 }
2405 2414
2406 //render Tr Set the text rendering mode, T 2415 //render Tr Set the text rendering mode, T
2407 //mode, to render, which is an integer. Initial value: 0. 2416 //mode, to render, which is an integer. Initial value: 0.
2408 static SkPdfResult PdfOp_Tr(SkPdfContext* pdfContext, SkCanvas* canvas, SkPdfTok enLooper** looper) { 2417 static SkPdfResult PdfOp_Tr(SkPdfContext* pdfContext, SkCanvas* canvas, SkPdfTok enLooper*) {
2409 EXPECT_OPERANDS("Tr", pdfContext, 1); 2418 EXPECT_OPERANDS("Tr", pdfContext, 1);
2410 POP_INTEGER(pdfContext, mode); 2419 POP_INTEGER(pdfContext, mode);
2411 CHECK_PARAMETERS(); 2420 CHECK_PARAMETERS();
2412 2421
2413 if (mode < 0) { // TODO(edisonn): function/enums with supported modes 2422 if (mode < 0) { // TODO(edisonn): function/enums with supported modes
2414 SkPdfReport(kIgnoreError_SkPdfIssueSeverity, kOutOfRange_SkPdfIssue, 2423 SkPdfReport(kIgnoreError_SkPdfIssueSeverity, kOutOfRange_SkPdfIssue,
2415 "mode must a positive integer or 0", mode_obj, pdfContext); 2424 "mode must a positive integer or 0", mode_obj, pdfContext);
2416 return kError_SkPdfResult; 2425 return kError_SkPdfResult;
2417 } 2426 }
2418 2427
2419 return kNYI_SkPdfResult; 2428 return kNYI_SkPdfResult;
2420 } 2429 }
2421 //rise Ts Set the text rise, Trise, to rise, which is a number expressed in unsc aled text space 2430 //rise Ts Set the text rise, Trise, to rise, which is a number expressed in unsc aled text space
2422 //units. Initial value: 0. 2431 //units. Initial value: 0.
2423 static SkPdfResult PdfOp_Ts(SkPdfContext* pdfContext, SkCanvas* canvas, SkPdfTok enLooper** looper) { 2432 static SkPdfResult PdfOp_Ts(SkPdfContext* pdfContext, SkCanvas* canvas, SkPdfTok enLooper*) {
2424 EXPECT_OPERANDS("Ts", pdfContext, 1); 2433 EXPECT_OPERANDS("Ts", pdfContext, 1);
2425 POP_NUMBER(pdfContext, rise); 2434 POP_NUMBER(pdfContext, rise);
2426 CHECK_PARAMETERS(); 2435 CHECK_PARAMETERS();
2427 2436
2428 if (rise < 0) { 2437 if (rise < 0) {
2429 SkPdfReport(kIgnoreError_SkPdfIssueSeverity, kOutOfRange_SkPdfIssue, 2438 SkPdfReport(kIgnoreError_SkPdfIssueSeverity, kOutOfRange_SkPdfIssue,
2430 "rise must a positive real number", rise_obj, pdfContext); 2439 "rise must a positive real number", rise_obj, pdfContext);
2431 return kNYI_SkPdfResult; 2440 return kNYI_SkPdfResult;
2432 } 2441 }
2433 2442
2434 return kNYI_SkPdfResult; 2443 return kNYI_SkPdfResult;
2435 } 2444 }
2436 2445
2437 //wx wy d0 2446 //wx wy d0
2438 static SkPdfResult PdfOp_d0(SkPdfContext* pdfContext, SkCanvas* canvas, SkPdfTok enLooper** looper) { 2447 static SkPdfResult PdfOp_d0(SkPdfContext* pdfContext, SkCanvas* canvas, SkPdfTok enLooper*) {
2439 EXPECT_OPERANDS("d0", pdfContext, 2); 2448 EXPECT_OPERANDS("d0", pdfContext, 2);
2440 POP_NUMBER(pdfContext, wy); 2449 POP_NUMBER(pdfContext, wy);
2441 POP_NUMBER(pdfContext, wx); 2450 POP_NUMBER(pdfContext, wx);
2442 CHECK_PARAMETERS(); 2451 CHECK_PARAMETERS();
2443 2452
2444 if (wx < 0) { 2453 if (wx < 0) {
2445 SkPdfReport(kIgnoreError_SkPdfIssueSeverity, kOutOfRange_SkPdfIssue, 2454 SkPdfReport(kIgnoreError_SkPdfIssueSeverity, kOutOfRange_SkPdfIssue,
2446 "wx must a positive real number", wx_obj, pdfContext); 2455 "wx must a positive real number", wx_obj, pdfContext);
2447 return kError_SkPdfResult; 2456 return kError_SkPdfResult;
2448 } 2457 }
2449 2458
2450 if (wy < 0) { 2459 if (wy < 0) {
2451 SkPdfReport(kIgnoreError_SkPdfIssueSeverity, kOutOfRange_SkPdfIssue, 2460 SkPdfReport(kIgnoreError_SkPdfIssueSeverity, kOutOfRange_SkPdfIssue,
2452 "wy must a positive real number", wy_obj, pdfContext); 2461 "wy must a positive real number", wy_obj, pdfContext);
2453 return kError_SkPdfResult; 2462 return kError_SkPdfResult;
2454 } 2463 }
2455 2464
2456 return kNYI_SkPdfResult; 2465 return kNYI_SkPdfResult;
2457 } 2466 }
2458 2467
2459 //wx wy llx lly urx ury d1 2468 //wx wy llx lly urx ury d1
2460 static SkPdfResult PdfOp_d1(SkPdfContext* pdfContext, SkCanvas* canvas, SkPdfTok enLooper** looper) { 2469 static SkPdfResult PdfOp_d1(SkPdfContext* pdfContext, SkCanvas* canvas, SkPdfTok enLooper*) {
2461 EXPECT_OPERANDS("d1", pdfContext, 6); 2470 EXPECT_OPERANDS("d1", pdfContext, 6);
2462 POP_NUMBER(pdfContext, ury); 2471 POP_NUMBER(pdfContext, ury);
2463 POP_NUMBER(pdfContext, urx); 2472 POP_NUMBER(pdfContext, urx);
2464 POP_NUMBER(pdfContext, lly); 2473 POP_NUMBER(pdfContext, lly);
2465 POP_NUMBER(pdfContext, llx); 2474 POP_NUMBER(pdfContext, llx);
2466 POP_NUMBER(pdfContext, wy); 2475 POP_NUMBER(pdfContext, wy);
2467 POP_NUMBER(pdfContext, wx); 2476 POP_NUMBER(pdfContext, wx);
2468 CHECK_PARAMETERS(); 2477 CHECK_PARAMETERS();
2469 2478
2470 // TODO(edisonn): really silly quick way to remove warning 2479 // TODO(edisonn): really silly quick way to remove warning
2471 if (wx + wy + llx + lly + urx + ury) { 2480 if (wx + wy + llx + lly + urx + ury) {
2472 return kNYI_SkPdfResult; 2481 return kNYI_SkPdfResult;
2473 } 2482 }
2474 2483
2475 return kNYI_SkPdfResult; 2484 return kNYI_SkPdfResult;
2476 } 2485 }
2477 2486
2478 //name sh 2487 //name sh
2479 static SkPdfResult PdfOp_sh(SkPdfContext* pdfContext, SkCanvas* canvas, SkPdfTok enLooper** looper) { 2488 static SkPdfResult PdfOp_sh(SkPdfContext* pdfContext, SkCanvas* canvas, SkPdfTok enLooper*) {
2480 EXPECT_OPERANDS("sh", pdfContext, 1); 2489 EXPECT_OPERANDS("sh", pdfContext, 1);
2481 POP_NAME(pdfContext, name); 2490 POP_NAME(pdfContext, name);
2482 CHECK_PARAMETERS(); 2491 CHECK_PARAMETERS();
2483 2492
2484 if (name == NULL) { 2493 if (name == NULL) {
2485 SkPdfReportUnexpectedType(kIgnoreError_SkPdfIssueSeverity, NULL, name, 2494 SkPdfReportUnexpectedType(kIgnoreError_SkPdfIssueSeverity, NULL, name,
2486 SkPdfNativeObject::kName_PdfObjectType, pdfCon text); 2495 SkPdfNativeObject::kName_PdfObjectType, pdfCon text);
2487 return kError_SkPdfResult; 2496 return kError_SkPdfResult;
2488 } 2497 }
2489 2498
2490 return kNYI_SkPdfResult; 2499 return kNYI_SkPdfResult;
2491 } 2500 }
2492 2501
2493 //name Do 2502 //name Do
2494 static SkPdfResult PdfOp_Do(SkPdfContext* pdfContext, SkCanvas* canvas, SkPdfTok enLooper** looper) { 2503 static SkPdfResult PdfOp_Do(SkPdfContext* pdfContext, SkCanvas* canvas, SkPdfTok enLooper*) {
2495 EXPECT_OPERANDS("Do", pdfContext, 1); 2504 EXPECT_OPERANDS("Do", pdfContext, 1);
2496 POP_NAME(pdfContext, name); 2505 POP_NAME(pdfContext, name);
2497 CHECK_PARAMETERS(); 2506 CHECK_PARAMETERS();
2498 2507
2499 SkPdfDictionary* xObject = pdfContext->fGraphicsState.fResources->XObject(p dfContext->fPdfDoc); 2508 SkPdfDictionary* xObject = pdfContext->fGraphicsState.fResources->XObject(p dfContext->fPdfDoc);
2500 2509
2501 if (xObject == NULL) { 2510 if (xObject == NULL) {
2502 SkPdfReport(kIgnoreError_SkPdfIssueSeverity, kMissingXObject_SkPdfIssue, NULL, 2511 SkPdfReport(kIgnoreError_SkPdfIssueSeverity, kMissingXObject_SkPdfIssue, NULL,
2503 pdfContext->fGraphicsState.fResources, pdfContext); 2512 pdfContext->fGraphicsState.fResources, pdfContext);
2504 return kIgnoreError_SkPdfResult; 2513 return kIgnoreError_SkPdfResult;
2505 } 2514 }
2506 2515
2507 SkPdfNativeObject* value = xObject->get(name); 2516 SkPdfNativeObject* value = xObject->get(name);
2508 value = pdfContext->fPdfDoc->resolveReference(value); 2517 value = pdfContext->fPdfDoc->resolveReference(value);
2509 2518
2510 return doXObject(pdfContext, canvas, value); 2519 return doXObject(pdfContext, canvas, value);
2511 } 2520 }
2512 2521
2513 //tag MP Designate a marked-content point. tag is a name object indicating the r ole or 2522 //tag MP Designate a marked-content point. tag is a name object indicating the r ole or
2514 //significance of the point. 2523 //significance of the point.
2515 static SkPdfResult PdfOp_MP(SkPdfContext* pdfContext, SkCanvas* canvas, SkPdfTok enLooper** looper) { 2524 static SkPdfResult PdfOp_MP(SkPdfContext* pdfContext, SkCanvas* canvas, SkPdfTok enLooper*) {
2516 EXPECT_OPERANDS("MP", pdfContext, 1); 2525 EXPECT_OPERANDS("MP", pdfContext, 1);
2517 POP_OBJ(pdfContext, tag); 2526 POP_OBJ(pdfContext, tag);
2518 CHECK_PARAMETERS(); 2527 CHECK_PARAMETERS();
2519 2528
2520 if (tag == NULL) { 2529 if (tag == NULL) {
2521 SkPdfReportUnexpectedType(kIgnoreError_SkPdfIssueSeverity, NULL, tag, 2530 SkPdfReportUnexpectedType(kIgnoreError_SkPdfIssueSeverity, NULL, tag,
2522 SkPdfNativeObject::_kObject_PdfObjectType, pdf Context); 2531 SkPdfNativeObject::_kObject_PdfObjectType, pdf Context);
2523 return kNYI_SkPdfResult; 2532 return kNYI_SkPdfResult;
2524 } 2533 }
2525 2534
2526 SkPdfReport(kCodeWarning_SkPdfIssueSeverity, kNYI_SkPdfIssue, "MP NYI", NULL , NULL); 2535 SkPdfReport(kCodeWarning_SkPdfIssueSeverity, kNYI_SkPdfIssue, "MP NYI", NULL , NULL);
2527 return kNYI_SkPdfResult; 2536 return kNYI_SkPdfResult;
2528 } 2537 }
2529 2538
2530 //tag properties DP Designate a marked-content point with an associated property list. tag is a 2539 //tag properties DP Designate a marked-content point with an associated property list. tag is a
2531 //name object indicating the role or significance of the point; properties is 2540 //name object indicating the role or significance of the point; properties is
2532 //either an inline dictionary containing the property list or a name object 2541 //either an inline dictionary containing the property list or a name object
2533 //associated with it in the Properties subdictionary of the current resource 2542 //associated with it in the Properties subdictionary of the current resource
2534 //dictionary (see Section 9.5.1, “Property Lists”). 2543 //dictionary (see Section 9.5.1, “Property Lists”).
2535 static SkPdfResult PdfOp_DP(SkPdfContext* pdfContext, SkCanvas* canvas, SkPdfTok enLooper** looper) { 2544 static SkPdfResult PdfOp_DP(SkPdfContext* pdfContext, SkCanvas* canvas, SkPdfTok enLooper*) {
2536 EXPECT_OPERANDS("DP", pdfContext, 2); 2545 EXPECT_OPERANDS("DP", pdfContext, 2);
2537 POP_OBJ(pdfContext, properties); 2546 POP_OBJ(pdfContext, properties);
2538 POP_OBJ(pdfContext, tag); 2547 POP_OBJ(pdfContext, tag);
2539 CHECK_PARAMETERS(); 2548 CHECK_PARAMETERS();
2540 2549
2541 if (tag == NULL) { 2550 if (tag == NULL) {
2542 SkPdfReportUnexpectedType(kIgnoreError_SkPdfIssueSeverity, NULL, tag, 2551 SkPdfReportUnexpectedType(kIgnoreError_SkPdfIssueSeverity, NULL, tag,
2543 SkPdfNativeObject::_kObject_PdfObjectType, pdf Context); 2552 SkPdfNativeObject::_kObject_PdfObjectType, pdf Context);
2544 return kNYI_SkPdfResult; 2553 return kNYI_SkPdfResult;
2545 } 2554 }
2546 2555
2547 if (properties == NULL) { 2556 if (properties == NULL) {
2548 SkPdfReportUnexpectedType(kIgnoreError_SkPdfIssueSeverity, NULL, propert ies, 2557 SkPdfReportUnexpectedType(kIgnoreError_SkPdfIssueSeverity, NULL, propert ies,
2549 SkPdfNativeObject::_kObject_PdfObjectType, pdf Context); 2558 SkPdfNativeObject::_kObject_PdfObjectType, pdf Context);
2550 return kNYI_SkPdfResult; 2559 return kNYI_SkPdfResult;
2551 } 2560 }
2552 2561
2553 SkPdfReport(kCodeWarning_SkPdfIssueSeverity, kNYI_SkPdfIssue, "DP NYI", NULL , NULL); 2562 SkPdfReport(kCodeWarning_SkPdfIssueSeverity, kNYI_SkPdfIssue, "DP NYI", NULL , NULL);
2554 return kNYI_SkPdfResult; 2563 return kNYI_SkPdfResult;
2555 } 2564 }
2556 2565
2557 //tag BMC Begin a marked-content sequence terminated by a balancing EMC operator . 2566 //tag BMC Begin a marked-content sequence terminated by a balancing EMC operator .
2558 //tag is a name object indicating the role or significance of the sequence. 2567 //tag is a name object indicating the role or significance of the sequence.
2559 static SkPdfResult PdfOp_BMC(SkPdfContext* pdfContext, SkCanvas* canvas, SkPdfTo kenLooper** looper) { 2568 static SkPdfResult PdfOp_BMC(SkPdfContext* pdfContext, SkCanvas* canvas, SkPdfTo kenLooper*) {
2560 EXPECT_OPERANDS("BMC", pdfContext, 1); 2569 EXPECT_OPERANDS("BMC", pdfContext, 1);
2561 POP_OBJ(pdfContext, tag); 2570 POP_OBJ(pdfContext, tag);
2562 CHECK_PARAMETERS(); 2571 CHECK_PARAMETERS();
2563 2572
2564 if (tag == NULL) { 2573 if (tag == NULL) {
2565 SkPdfReportUnexpectedType(kIgnoreError_SkPdfIssueSeverity, NULL, tag, 2574 SkPdfReportUnexpectedType(kIgnoreError_SkPdfIssueSeverity, NULL, tag,
2566 SkPdfNativeObject::_kObject_PdfObjectType, pdf Context); 2575 SkPdfNativeObject::_kObject_PdfObjectType, pdf Context);
2567 return kNYI_SkPdfResult; 2576 return kNYI_SkPdfResult;
2568 } 2577 }
2569 2578
2570 SkPdfReport(kCodeWarning_SkPdfIssueSeverity, kNYI_SkPdfIssue, "BMC NYI", NUL L, NULL); 2579 SkPdfReport(kCodeWarning_SkPdfIssueSeverity, kNYI_SkPdfIssue, "BMC NYI", NUL L, NULL);
2571 return kNYI_SkPdfResult; 2580 return kNYI_SkPdfResult;
2572 } 2581 }
2573 2582
2574 //tag properties BDC Begin a marked-content sequence with an associated property list, terminated 2583 //tag properties BDC Begin a marked-content sequence with an associated property list, terminated
2575 //by a balancing EMCoperator. tag is a name object indicating the role or signif icance of the 2584 //by a balancing EMCoperator. tag is a name object indicating the role or signif icance of the
2576 // sequence; propertiesis either an inline dictionary containing the 2585 // sequence; propertiesis either an inline dictionary containing the
2577 //property list or a name object associated with it in the Properties subdiction ary of the current 2586 //property list or a name object associated with it in the Properties subdiction ary of the current
2578 //resource dictionary (see Section 9.5.1, “Property Lists”). 2587 //resource dictionary (see Section 9.5.1, “Property Lists”).
2579 static SkPdfResult PdfOp_BDC(SkPdfContext* pdfContext, SkCanvas* canvas, SkPdfTo kenLooper** looper) { 2588 static SkPdfResult PdfOp_BDC(SkPdfContext* pdfContext, SkCanvas* canvas, SkPdfTo kenLooper*) {
2580 EXPECT_OPERANDS("BDC", pdfContext, 2); 2589 EXPECT_OPERANDS("BDC", pdfContext, 2);
2581 POP_OBJ(pdfContext, properties); 2590 POP_OBJ(pdfContext, properties);
2582 POP_OBJ(pdfContext, tag); 2591 POP_OBJ(pdfContext, tag);
2583 CHECK_PARAMETERS(); 2592 CHECK_PARAMETERS();
2584 2593
2585 if (tag == NULL) { 2594 if (tag == NULL) {
2586 SkPdfReportUnexpectedType(kIgnoreError_SkPdfIssueSeverity, NULL, tag, 2595 SkPdfReportUnexpectedType(kIgnoreError_SkPdfIssueSeverity, NULL, tag,
2587 SkPdfNativeObject::_kObject_PdfObjectType, pdf Context); 2596 SkPdfNativeObject::_kObject_PdfObjectType, pdf Context);
2588 return kNYI_SkPdfResult; 2597 return kNYI_SkPdfResult;
2589 } 2598 }
2590 2599
2591 if (properties == NULL) { 2600 if (properties == NULL) {
2592 SkPdfReportUnexpectedType(kIgnoreError_SkPdfIssueSeverity, NULL, propert ies, 2601 SkPdfReportUnexpectedType(kIgnoreError_SkPdfIssueSeverity, NULL, propert ies,
2593 SkPdfNativeObject::_kObject_PdfObjectType, pdf Context); 2602 SkPdfNativeObject::_kObject_PdfObjectType, pdf Context);
2594 return kNYI_SkPdfResult; 2603 return kNYI_SkPdfResult;
2595 } 2604 }
2596 2605
2597 SkPdfReport(kCodeWarning_SkPdfIssueSeverity, kNYI_SkPdfIssue, "BDC NYI", NUL L, NULL); 2606 SkPdfReport(kCodeWarning_SkPdfIssueSeverity, kNYI_SkPdfIssue, "BDC NYI", NUL L, NULL);
2598 return kNYI_SkPdfResult; 2607 return kNYI_SkPdfResult;
2599 } 2608 }
2600 2609
2601 //— EMC End a marked-content sequence begun by a BMC or BDC operator. 2610 //— EMC End a marked-content sequence begun by a BMC or BDC operator.
2602 static SkPdfResult PdfOp_EMC(SkPdfContext* pdfContext, SkCanvas* canvas, SkPdfTo kenLooper** looper) { 2611 static SkPdfResult PdfOp_EMC(SkPdfContext* pdfContext, SkCanvas* canvas, SkPdfTo kenLooper*) {
2603 SkPdfReport(kCodeWarning_SkPdfIssueSeverity, kNYI_SkPdfIssue, "EMC NYI", NUL L, NULL); 2612 SkPdfReport(kCodeWarning_SkPdfIssueSeverity, kNYI_SkPdfIssue, "EMC NYI", NUL L, NULL);
2604 return kNYI_SkPdfResult; 2613 return kNYI_SkPdfResult;
2605 } 2614 }
2606 2615
2607 #include "SkPdfOps.h" 2616 #include "SkPdfOps.h"
2608 2617
2609 SkTDict<PdfOperatorRenderer> gPdfOps(100); 2618 SkTDict<PdfOperatorRenderer> gPdfOps(100);
2610 2619
2611 static void initPdfOperatorRenderes() { 2620 static void initPdfOperatorRenderes() {
2612 static bool gInitialized = false; 2621 static bool gInitialized = false;
(...skipping 101 matching lines...) Expand 10 before | Expand all | Expand 10 after
2714 }; 2723 };
2715 2724
2716 InitPdfOps gInitPdfOps; 2725 InitPdfOps gInitPdfOps;
2717 2726
2718 SkPdfResult PdfInlineImageLooper::consumeToken(PdfToken& token) { 2727 SkPdfResult PdfInlineImageLooper::consumeToken(PdfToken& token) {
2719 SkASSERT(false); 2728 SkASSERT(false);
2720 return kIgnoreError_SkPdfResult; 2729 return kIgnoreError_SkPdfResult;
2721 } 2730 }
2722 2731
2723 void PdfInlineImageLooper::loop() { 2732 void PdfInlineImageLooper::loop() {
2733 // FIXME (scroggo): Does this need to be looper? It does not consumeTokens,
2734 // nor does it loop. The one thing it does is provide access to the
2735 // protected members of SkPdfTokenLooper.
2724 doXObject_Image(fPdfContext, fCanvas, fTokenizer->readInlineImage()); 2736 doXObject_Image(fPdfContext, fCanvas, fTokenizer->readInlineImage());
2725 } 2737 }
2726 2738
2727 SkPdfResult PdfInlineImageLooper::done() {
2728 return kNYI_SkPdfResult;
2729 }
2730
2731 SkPdfResult PdfCompatibilitySectionLooper::consumeToken(PdfToken& token) { 2739 SkPdfResult PdfCompatibilitySectionLooper::consumeToken(PdfToken& token) {
2732 return fParent->consumeToken(token); 2740 return fParent->consumeToken(token);
2733 } 2741 }
2734 2742
2735 void PdfCompatibilitySectionLooper::loop() { 2743 void PdfCompatibilitySectionLooper::loop() {
2736 PdfOp_q(fPdfContext, fCanvas, NULL); 2744 PdfOp_q(fPdfContext, fCanvas, NULL);
2737 2745
2738 PdfToken token; 2746 PdfToken token;
2739 while (fTokenizer->readToken(&token)) { 2747 while (fTokenizer->readToken(&token)) {
2740 if (token.fType == kKeyword_TokenType && strcmp(token.fKeyword, "BX") == 0) { 2748 if (token.fType == kKeyword_TokenType && strcmp(token.fKeyword, "BX") == 0) {
2741 SkPdfTokenLooper* looper = new PdfCompatibilitySectionLooper(); 2749 PdfCompatibilitySectionLooper looper(this);
2742 looper->setUp(this); 2750 looper.loop();
2743 looper->loop();
2744 delete looper;
2745 } else { 2751 } else {
2746 if (token.fType == kKeyword_TokenType && strcmp(token.fKeyword, "EX" ) == 0) break; 2752 if (token.fType == kKeyword_TokenType && strcmp(token.fKeyword, "EX" ) == 0) {
2753 break;
2754 }
2747 fParent->consumeToken(token); 2755 fParent->consumeToken(token);
2748 } 2756 }
2749 } 2757 }
2750 2758
2751 PdfOp_Q(fPdfContext, fCanvas, NULL); 2759 PdfOp_Q(fPdfContext, fCanvas, NULL);
2752 } 2760 }
2753 2761
2754 // TODO(edisonn): for debugging - remove or put it in a #ifdef 2762 // TODO(edisonn): for debugging - remove or put it in a #ifdef
2755 SkPdfContext* gPdfContext = NULL; 2763 SkPdfContext* gPdfContext = NULL;
2756 2764
(...skipping 140 matching lines...) Expand 10 before | Expand all | Expand 10 after
2897 2905
2898 rect = SkRect::MakeWH(width, height); 2906 rect = SkRect::MakeWH(width, height);
2899 2907
2900 setup_bitmap(output, SkScalarCeilToInt(width), SkScalarCeilToInt(height)); 2908 setup_bitmap(output, SkScalarCeilToInt(width), SkScalarCeilToInt(height));
2901 2909
2902 SkAutoTUnref<SkBaseDevice> device(SkNEW_ARGS(SkBitmapDevice, (*output))); 2910 SkAutoTUnref<SkBaseDevice> device(SkNEW_ARGS(SkBitmapDevice, (*output)));
2903 SkCanvas canvas(device); 2911 SkCanvas canvas(device);
2904 2912
2905 return renderer->renderPage(page, &canvas, rect); 2913 return renderer->renderPage(page, &canvas, rect);
2906 } 2914 }
OLDNEW
« no previous file with comments | « experimental/PdfViewer/src/SkPdfOps.h ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698