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" |
(...skipping 53 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
64 * - encapsulate native in the pdf api so the skpdf does not know anything about
native ... in progress | 64 * - encapsulate native in the pdf api so the skpdf does not know anything about
native ... in progress |
65 * - load gs/ especially smask and already known prop (skp) ... in progress | 65 * - load gs/ especially smask and already known prop (skp) ... in progress |
66 * - wrapper on classes for customizations? e.g. | 66 * - wrapper on classes for customizations? e.g. |
67 * SkPdfPageObjectVanila - has only the basic loaders/getters | 67 * SkPdfPageObjectVanila - has only the basic loaders/getters |
68 * SkPdfPageObject : public SkPdfPageObjectVanila, extends, and I can add custom
izations here | 68 * SkPdfPageObject : public SkPdfPageObjectVanila, extends, and I can add custom
izations here |
69 * need to find a nice object model for all this with constructors and factories | 69 * need to find a nice object model for all this with constructors and factories |
70 * - deal with inheritable automatically ? | 70 * - deal with inheritable automatically ? |
71 * - deal with specific type in spec directly, add all dictionary types to known
types | 71 * - deal with specific type in spec directly, add all dictionary types to known
types |
72 */ | 72 */ |
73 | 73 |
| 74 #define EXPECT_OPERANDS(pdfContext,n) \ |
| 75 bool __failed = pdfContext->fObjectStack.count() < n; \ |
| 76 SkDEBUGCODE(int __cnt = n); |
| 77 |
| 78 #define POP_OBJ(pdfContext,name) \ |
| 79 SkDEBUGCODE(__cnt--); \ |
| 80 SkASSERT(__cnt >= 0); \ |
| 81 SkPdfNativeObject* name = NULL; \ |
| 82 __failed = __failed || pdfContext->fObjectStack.count() == 0; \ |
| 83 if (pdfContext->fObjectStack.count() > 0) { \ |
| 84 name = pdfContext->fObjectStack.top(); \ |
| 85 pdfContext->fObjectStack.pop(); \ |
| 86 } |
| 87 |
| 88 #define POP_NUMBER(pdfContext,name) \ |
| 89 SkDEBUGCODE(__cnt--); \ |
| 90 SkASSERT(__cnt >= 0); \ |
| 91 double name = 0; \ |
| 92 __failed = __failed || pdfContext->fObjectStack.count() == 0; \ |
| 93 if (pdfContext->fObjectStack.count() > 0) { \ |
| 94 SkPdfNativeObject* tmp = pdfContext->fObjectStack.top(); \ |
| 95 pdfContext->fObjectStack.pop(); \ |
| 96 if (!tmp || !tmp->isNumber()) { \ |
| 97 __failed = true;\ |
| 98 } else { \ |
| 99 name = tmp->numberValue(); \ |
| 100 } \ |
| 101 } |
| 102 |
| 103 #define POP_INTEGER(pdfContext,name) \ |
| 104 SkDEBUGCODE(__cnt--); \ |
| 105 SkASSERT(__cnt >= 0); \ |
| 106 int64_t name = 0; \ |
| 107 __failed = __failed || pdfContext->fObjectStack.count() == 0; \ |
| 108 if (pdfContext->fObjectStack.count() > 0) { \ |
| 109 SkPdfNativeObject* tmp = pdfContext->fObjectStack.top(); \ |
| 110 pdfContext->fObjectStack.pop(); \ |
| 111 if (!tmp || !tmp->isInteger()) { \ |
| 112 __failed = true;\ |
| 113 } else { \ |
| 114 name = tmp->intValue(); \ |
| 115 } \ |
| 116 } |
| 117 |
| 118 #define POP_NUMBER_INTO(pdfContext,var) \ |
| 119 SkDEBUGCODE(__cnt--); \ |
| 120 SkASSERT(__cnt >= 0); \ |
| 121 __failed = __failed || pdfContext->fObjectStack.count() == 0; \ |
| 122 if (pdfContext->fObjectStack.count() > 0) { \ |
| 123 SkPdfNativeObject* tmp = pdfContext->fObjectStack.top(); \ |
| 124 pdfContext->fObjectStack.pop(); \ |
| 125 if (!tmp || !tmp->isNumber()) { \ |
| 126 __failed = true;\ |
| 127 } else { \ |
| 128 var = tmp->numberValue(); \ |
| 129 } \ |
| 130 } |
| 131 |
| 132 |
| 133 #define POP_NAME(pdfContext,name) \ |
| 134 SkDEBUGCODE(__cnt--); \ |
| 135 SkASSERT(__cnt >= 0); \ |
| 136 SkPdfNativeObject* name = NULL; \ |
| 137 __failed = __failed || pdfContext->fObjectStack.count() == 0; \ |
| 138 if (pdfContext->fObjectStack.count() > 0) { \ |
| 139 SkPdfNativeObject* tmp = pdfContext->fObjectStack.top(); \ |
| 140 pdfContext->fObjectStack.pop(); \ |
| 141 if (!tmp || !tmp->isName()) { \ |
| 142 __failed = true;\ |
| 143 } else { \ |
| 144 name = tmp; \ |
| 145 } \ |
| 146 } |
| 147 |
| 148 #define POP_STRING(pdfContext,name) \ |
| 149 SkDEBUGCODE(__cnt--); \ |
| 150 SkASSERT(__cnt >= 0); \ |
| 151 SkPdfNativeObject* name = NULL; \ |
| 152 __failed = __failed || pdfContext->fObjectStack.count() == 0; \ |
| 153 if (pdfContext->fObjectStack.count() > 0) { \ |
| 154 SkPdfNativeObject* tmp = pdfContext->fObjectStack.top(); \ |
| 155 pdfContext->fObjectStack.pop(); \ |
| 156 if (!tmp || !tmp->isAnyString()) { \ |
| 157 __failed = true;\ |
| 158 } else { \ |
| 159 name = tmp; \ |
| 160 } \ |
| 161 } |
| 162 |
| 163 #define POP_ARRAY(pdfContext,name) \ |
| 164 SkDEBUGCODE(__cnt--); \ |
| 165 SkASSERT(__cnt >= 0); \ |
| 166 SkPdfArray* name = NULL; \ |
| 167 __failed = __failed || pdfContext->fObjectStack.count() == 0; \ |
| 168 if (pdfContext->fObjectStack.count() > 0) { \ |
| 169 SkPdfNativeObject* tmp = pdfContext->fObjectStack.top(); \ |
| 170 pdfContext->fObjectStack.pop(); \ |
| 171 if (!tmp || !tmp->isArray()) { \ |
| 172 __failed = true;\ |
| 173 } else { \ |
| 174 name = (SkPdfArray*)tmp; \ |
| 175 } \ |
| 176 } |
| 177 |
| 178 // TODO(edisonn): ability to turn on asserts for known good files |
| 179 // log error - add name of function? location in file? |
| 180 #define CHECK_PARAMETERS() \ |
| 181 SkASSERT(__cnt == 0); \ |
| 182 if (__failed) return kIgnoreError_SkPdfResult; |
| 183 |
74 NotOwnedString strings_DeviceRGB; | 184 NotOwnedString strings_DeviceRGB; |
75 NotOwnedString strings_DeviceCMYK; | 185 NotOwnedString strings_DeviceCMYK; |
76 | 186 |
77 class StringsInit { | 187 class StringsInit { |
78 public: | 188 public: |
79 StringsInit() { | 189 StringsInit() { |
80 NotOwnedString::init(&strings_DeviceRGB, "DeviceRGB"); | 190 NotOwnedString::init(&strings_DeviceRGB, "DeviceRGB"); |
81 NotOwnedString::init(&strings_DeviceCMYK, "DeviceCMYK"); | 191 NotOwnedString::init(&strings_DeviceCMYK, "DeviceCMYK"); |
82 } | 192 } |
83 }; | 193 }; |
(...skipping 880 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
964 } | 1074 } |
965 | 1075 |
966 // TODO(edisonn): should we restore the variable stack at the same state? | 1076 // TODO(edisonn): should we restore the variable stack at the same state? |
967 // There could be operands left, that could be consumed by a parent tokenize
r when we pop. | 1077 // There could be operands left, that could be consumed by a parent tokenize
r when we pop. |
968 canvas->restore(); | 1078 canvas->restore(); |
969 PdfOp_Q(pdfContext, canvas, NULL); | 1079 PdfOp_Q(pdfContext, canvas, NULL); |
970 return kPartial_SkPdfResult; | 1080 return kPartial_SkPdfResult; |
971 } | 1081 } |
972 | 1082 |
973 SkPdfResult PdfOp_q(SkPdfContext* pdfContext, SkCanvas* canvas, PdfTokenLooper**
looper) { | 1083 SkPdfResult PdfOp_q(SkPdfContext* pdfContext, SkCanvas* canvas, PdfTokenLooper**
looper) { |
| 1084 // TODO(edisonn): create a new stack of parameters, so once we start a q, |
| 1085 // it is not possible to see under the previous q? |
974 pdfContext->fStateStack.push(pdfContext->fGraphicsState); | 1086 pdfContext->fStateStack.push(pdfContext->fGraphicsState); |
975 canvas->save(); | 1087 canvas->save(); |
976 return kOK_SkPdfResult; | 1088 return kOK_SkPdfResult; |
977 } | 1089 } |
978 | 1090 |
979 SkPdfResult PdfOp_Q(SkPdfContext* pdfContext, SkCanvas* canvas, PdfTokenLooper**
looper) { | 1091 SkPdfResult PdfOp_Q(SkPdfContext* pdfContext, SkCanvas* canvas, PdfTokenLooper**
looper) { |
980 pdfContext->fGraphicsState = pdfContext->fStateStack.top(); | 1092 pdfContext->fGraphicsState = pdfContext->fStateStack.top(); |
981 pdfContext->fStateStack.pop(); | 1093 pdfContext->fStateStack.pop(); |
982 canvas->restore(); | 1094 canvas->restore(); |
983 return kOK_SkPdfResult; | 1095 return kOK_SkPdfResult; |
984 } | 1096 } |
985 | 1097 |
986 static SkPdfResult PdfOp_cm(SkPdfContext* pdfContext, SkCanvas* canvas, PdfToken
Looper** looper) { | 1098 static SkPdfResult PdfOp_cm(SkPdfContext* pdfContext, SkCanvas* canvas, PdfToken
Looper** looper) { |
987 double array[6]; | 1099 EXPECT_OPERANDS(pdfContext, 6); |
988 for (int i = 0 ; i < 6 ; i++) { | 1100 POP_NUMBER(pdfContext, f); |
989 array[5 - i] = pdfContext->fObjectStack.top()->numberValue(); | 1101 POP_NUMBER(pdfContext, e); |
990 pdfContext->fObjectStack.pop(); | 1102 POP_NUMBER(pdfContext, d); |
991 } | 1103 POP_NUMBER(pdfContext, c); |
| 1104 POP_NUMBER(pdfContext, b); |
| 1105 POP_NUMBER(pdfContext, a); |
| 1106 CHECK_PARAMETERS(); |
| 1107 double array[6] = {a, b, c, d, e, f}; |
992 | 1108 |
993 // a b | 1109 // a b |
994 // c d | 1110 // c d |
995 // e f | 1111 // e f |
996 | 1112 |
997 // 0 1 | 1113 // 0 1 |
998 // 2 3 | 1114 // 2 3 |
999 // 4 5 | 1115 // 4 5 |
1000 | 1116 |
1001 // sx ky | 1117 // sx ky |
(...skipping 12 matching lines...) Expand all Loading... |
1014 SkTraceMatrix(pdfContext->fGraphicsState.fCTM, "cm"); | 1130 SkTraceMatrix(pdfContext->fGraphicsState.fCTM, "cm"); |
1015 #endif | 1131 #endif |
1016 | 1132 |
1017 return kOK_SkPdfResult; | 1133 return kOK_SkPdfResult; |
1018 } | 1134 } |
1019 | 1135 |
1020 //leading TL Set the text leading, Tl | 1136 //leading TL Set the text leading, Tl |
1021 //, to leading, which is a number expressed in unscaled text | 1137 //, to leading, which is a number expressed in unscaled text |
1022 //space units. Text leading is used only by the T*, ', and " operators. Initial
value: 0. | 1138 //space units. Text leading is used only by the T*, ', and " operators. Initial
value: 0. |
1023 static SkPdfResult PdfOp_TL(SkPdfContext* pdfContext, SkCanvas* canvas, PdfToken
Looper** looper) { | 1139 static SkPdfResult PdfOp_TL(SkPdfContext* pdfContext, SkCanvas* canvas, PdfToken
Looper** looper) { |
1024 double ty = pdfContext->fObjectStack.top()->numberValue(); pdfContext->fOb
jectStack.pop(); | 1140 EXPECT_OPERANDS(pdfContext, 1) |
| 1141 POP_NUMBER(pdfContext, ty); |
| 1142 CHECK_PARAMETERS(); |
1025 | 1143 |
1026 pdfContext->fGraphicsState.fTextLeading = ty; | 1144 pdfContext->fGraphicsState.fTextLeading = ty; |
1027 | 1145 |
1028 return kOK_SkPdfResult; | 1146 return kOK_SkPdfResult; |
1029 } | 1147 } |
1030 | 1148 |
1031 static SkPdfResult PdfOp_Td(SkPdfContext* pdfContext, SkCanvas* canvas, PdfToken
Looper** looper) { | 1149 static SkPdfResult PdfOp_Td(SkPdfContext* pdfContext, SkCanvas* canvas, PdfToken
Looper** looper) { |
1032 #ifdef PDF_TRACE | 1150 EXPECT_OPERANDS(pdfContext, 2); |
1033 printf("stack size = %i\n", (int)pdfContext->fObjectStack.size()); | 1151 POP_NUMBER(pdfContext, ty); |
1034 #endif | 1152 POP_NUMBER(pdfContext, tx); |
1035 double ty = pdfContext->fObjectStack.top()->numberValue(); pdfContext->fObje
ctStack.pop(); | 1153 CHECK_PARAMETERS(); |
1036 double tx = pdfContext->fObjectStack.top()->numberValue(); pdfContext->fObje
ctStack.pop(); | |
1037 | 1154 |
1038 double array[6] = {1, 0, 0, 1, tx, -ty}; | 1155 double array[6] = {1, 0, 0, 1, tx, -ty}; |
1039 SkMatrix matrix = SkMatrixFromPdfMatrix(array); | 1156 SkMatrix matrix = SkMatrixFromPdfMatrix(array); |
1040 | 1157 |
1041 pdfContext->fGraphicsState.fMatrixTm.preConcat(matrix); | 1158 pdfContext->fGraphicsState.fMatrixTm.preConcat(matrix); |
1042 pdfContext->fGraphicsState.fMatrixTlm.preConcat(matrix); | 1159 pdfContext->fGraphicsState.fMatrixTlm.preConcat(matrix); |
1043 | 1160 |
1044 return kPartial_SkPdfResult; | 1161 return kPartial_SkPdfResult; |
1045 } | 1162 } |
1046 | 1163 |
1047 static SkPdfResult PdfOp_TD(SkPdfContext* pdfContext, SkCanvas* canvas, PdfToken
Looper** looper) { | 1164 static SkPdfResult PdfOp_TD(SkPdfContext* pdfContext, SkCanvas* canvas, PdfToken
Looper** looper) { |
1048 double ty = pdfContext->fObjectStack.top()->numberValue(); pdfContext->fObje
ctStack.pop(); | 1165 EXPECT_OPERANDS(pdfContext, 2) |
1049 double tx = pdfContext->fObjectStack.top()->numberValue(); pdfContext->fObje
ctStack.pop(); | 1166 POP_NUMBER(pdfContext, ty); |
| 1167 POP_NUMBER(pdfContext, tx); |
| 1168 CHECK_PARAMETERS(); |
1050 | 1169 |
1051 // TODO(edisonn): Create factory methods or constructors so native is hidden | 1170 // TODO(edisonn): Create factory methods or constructors so native is hidden |
1052 SkPdfReal* _ty = pdfContext->fPdfDoc->createReal(-ty); | 1171 SkPdfReal* _ty = pdfContext->fPdfDoc->createReal(-ty); |
1053 pdfContext->fObjectStack.push(_ty); | 1172 pdfContext->fObjectStack.push(_ty); |
1054 | 1173 |
1055 PdfOp_TL(pdfContext, canvas, looper); | 1174 PdfOp_TL(pdfContext, canvas, looper); |
1056 | 1175 |
1057 SkPdfReal* vtx = pdfContext->fPdfDoc->createReal(tx); | 1176 SkPdfReal* vtx = pdfContext->fPdfDoc->createReal(tx); |
1058 pdfContext->fObjectStack.push(vtx); | 1177 pdfContext->fObjectStack.push(vtx); |
1059 | 1178 |
1060 SkPdfReal* vty = pdfContext->fPdfDoc->createReal(ty); | 1179 SkPdfReal* vty = pdfContext->fPdfDoc->createReal(ty); |
1061 pdfContext->fObjectStack.push(vty); | 1180 pdfContext->fObjectStack.push(vty); |
1062 | 1181 |
1063 SkPdfResult ret = PdfOp_Td(pdfContext, canvas, looper); | 1182 SkPdfResult ret = PdfOp_Td(pdfContext, canvas, looper); |
1064 | 1183 |
1065 // TODO(edisonn): delete all the objects after rendering was complete, in th
is way pdf is rendered faster | 1184 // TODO(edisonn): delete all the objects after rendering was complete, in th
is way pdf is rendered faster |
1066 // and the cleanup can happen while the user looks at the image | 1185 // and the cleanup can happen while the user looks at the image |
1067 | 1186 |
1068 return ret; | 1187 return ret; |
1069 } | 1188 } |
1070 | 1189 |
1071 static SkPdfResult PdfOp_Tm(SkPdfContext* pdfContext, SkCanvas* canvas, PdfToken
Looper** looper) { | 1190 static SkPdfResult PdfOp_Tm(SkPdfContext* pdfContext, SkCanvas* canvas, PdfToken
Looper** looper) { |
1072 double f = pdfContext->fObjectStack.top()->numberValue(); pdfContext->fObjec
tStack.pop(); | 1191 EXPECT_OPERANDS(pdfContext, 6); |
1073 double e = pdfContext->fObjectStack.top()->numberValue(); pdfContext->fObjec
tStack.pop(); | 1192 POP_NUMBER(pdfContext, f); |
1074 double d = pdfContext->fObjectStack.top()->numberValue(); pdfContext->fObjec
tStack.pop(); | 1193 POP_NUMBER(pdfContext, e); |
1075 double c = pdfContext->fObjectStack.top()->numberValue(); pdfContext->fObjec
tStack.pop(); | 1194 POP_NUMBER(pdfContext, d); |
1076 double b = pdfContext->fObjectStack.top()->numberValue(); pdfContext->fObjec
tStack.pop(); | 1195 POP_NUMBER(pdfContext, c); |
1077 double a = pdfContext->fObjectStack.top()->numberValue(); pdfContext->fObjec
tStack.pop(); | 1196 POP_NUMBER(pdfContext, b); |
| 1197 POP_NUMBER(pdfContext, a); |
| 1198 CHECK_PARAMETERS(); |
1078 | 1199 |
1079 double array[6]; | 1200 double array[6]; |
1080 array[0] = a; | 1201 array[0] = a; |
1081 array[1] = b; | 1202 array[1] = b; |
1082 array[2] = c; | 1203 array[2] = c; |
1083 array[3] = d; | 1204 array[3] = d; |
1084 array[4] = e; | 1205 array[4] = e; |
1085 array[5] = f; | 1206 array[5] = f; |
1086 | 1207 |
1087 SkMatrix matrix = SkMatrixFromPdfMatrix(array); | 1208 SkMatrix matrix = SkMatrixFromPdfMatrix(array); |
(...skipping 21 matching lines...) Expand all Loading... |
1109 | 1230 |
1110 return ret; | 1231 return ret; |
1111 } | 1232 } |
1112 | 1233 |
1113 static SkPdfResult PdfOp_m(SkPdfContext* pdfContext, SkCanvas* canvas, PdfTokenL
ooper** looper) { | 1234 static SkPdfResult PdfOp_m(SkPdfContext* pdfContext, SkCanvas* canvas, PdfTokenL
ooper** looper) { |
1114 if (pdfContext->fGraphicsState.fPathClosed) { | 1235 if (pdfContext->fGraphicsState.fPathClosed) { |
1115 pdfContext->fGraphicsState.fPath.reset(); | 1236 pdfContext->fGraphicsState.fPath.reset(); |
1116 pdfContext->fGraphicsState.fPathClosed = false; | 1237 pdfContext->fGraphicsState.fPathClosed = false; |
1117 } | 1238 } |
1118 | 1239 |
1119 pdfContext->fGraphicsState.fCurPosY = pdfContext->fObjectStack.top()->number
Value(); pdfContext->fObjectStack.pop(); | 1240 EXPECT_OPERANDS(pdfContext, 2); |
1120 pdfContext->fGraphicsState.fCurPosX = pdfContext->fObjectStack.top()->number
Value(); pdfContext->fObjectStack.pop(); | 1241 POP_NUMBER(pdfContext, y); |
| 1242 POP_NUMBER(pdfContext, x); |
| 1243 CHECK_PARAMETERS(); |
| 1244 |
| 1245 pdfContext->fGraphicsState.fCurPosY = y; |
| 1246 pdfContext->fGraphicsState.fCurPosX = x; |
1121 | 1247 |
1122 pdfContext->fGraphicsState.fPath.moveTo(SkDoubleToScalar(pdfContext->fGraphi
csState.fCurPosX), | 1248 pdfContext->fGraphicsState.fPath.moveTo(SkDoubleToScalar(pdfContext->fGraphi
csState.fCurPosX), |
1123 SkDoubleToScalar(pdfContext->fGraphics
State.fCurPosY)); | 1249 SkDoubleToScalar(pdfContext->fGraphi
csState.fCurPosY)); |
1124 | 1250 |
1125 return kOK_SkPdfResult; | 1251 return kOK_SkPdfResult; |
1126 } | 1252 } |
1127 | 1253 |
1128 static SkPdfResult PdfOp_l(SkPdfContext* pdfContext, SkCanvas* canvas, PdfTokenL
ooper** looper) { | 1254 static SkPdfResult PdfOp_l(SkPdfContext* pdfContext, SkCanvas* canvas, PdfTokenL
ooper** looper) { |
1129 if (pdfContext->fGraphicsState.fPathClosed) { | 1255 if (pdfContext->fGraphicsState.fPathClosed) { |
1130 pdfContext->fGraphicsState.fPath.reset(); | 1256 pdfContext->fGraphicsState.fPath.reset(); |
1131 pdfContext->fGraphicsState.fPathClosed = false; | 1257 pdfContext->fGraphicsState.fPathClosed = false; |
1132 } | 1258 } |
1133 | 1259 |
1134 pdfContext->fGraphicsState.fCurPosY = pdfContext->fObjectStack.top()->number
Value(); pdfContext->fObjectStack.pop(); | 1260 EXPECT_OPERANDS(pdfContext, 2); |
1135 pdfContext->fGraphicsState.fCurPosX = pdfContext->fObjectStack.top()->number
Value(); pdfContext->fObjectStack.pop(); | 1261 POP_NUMBER(pdfContext, y); |
| 1262 POP_NUMBER(pdfContext, x); |
| 1263 CHECK_PARAMETERS(); |
| 1264 |
| 1265 pdfContext->fGraphicsState.fCurPosY = y; |
| 1266 pdfContext->fGraphicsState.fCurPosX = x; |
1136 | 1267 |
1137 pdfContext->fGraphicsState.fPath.lineTo(SkDoubleToScalar(pdfContext->fGraphi
csState.fCurPosX), | 1268 pdfContext->fGraphicsState.fPath.lineTo(SkDoubleToScalar(pdfContext->fGraphi
csState.fCurPosX), |
1138 SkDoubleToScalar(pdfContext->fGraphics
State.fCurPosY)); | 1269 SkDoubleToScalar(pdfContext->fGraphi
csState.fCurPosY)); |
1139 | 1270 |
1140 return kOK_SkPdfResult; | 1271 return kOK_SkPdfResult; |
1141 } | 1272 } |
1142 | 1273 |
1143 static SkPdfResult PdfOp_c(SkPdfContext* pdfContext, SkCanvas* canvas, PdfTokenL
ooper** looper) { | 1274 static SkPdfResult PdfOp_c(SkPdfContext* pdfContext, SkCanvas* canvas, PdfTokenL
ooper** looper) { |
1144 if (pdfContext->fGraphicsState.fPathClosed) { | 1275 if (pdfContext->fGraphicsState.fPathClosed) { |
1145 pdfContext->fGraphicsState.fPath.reset(); | 1276 pdfContext->fGraphicsState.fPath.reset(); |
1146 pdfContext->fGraphicsState.fPathClosed = false; | 1277 pdfContext->fGraphicsState.fPathClosed = false; |
1147 } | 1278 } |
1148 | 1279 |
1149 double y3 = pdfContext->fObjectStack.top()->numberValue(); pdfContext->fO
bjectStack.pop(); | 1280 EXPECT_OPERANDS(pdfContext, 6); |
1150 double x3 = pdfContext->fObjectStack.top()->numberValue(); pdfContext->fO
bjectStack.pop(); | 1281 POP_NUMBER(pdfContext, y3); |
1151 double y2 = pdfContext->fObjectStack.top()->numberValue(); pdfContext->fO
bjectStack.pop(); | 1282 POP_NUMBER(pdfContext, x3); |
1152 double x2 = pdfContext->fObjectStack.top()->numberValue(); pdfContext->fO
bjectStack.pop(); | 1283 POP_NUMBER(pdfContext, y2); |
1153 double y1 = pdfContext->fObjectStack.top()->numberValue(); pdfContext->fO
bjectStack.pop(); | 1284 POP_NUMBER(pdfContext, x2); |
1154 double x1 = pdfContext->fObjectStack.top()->numberValue(); pdfContext->fO
bjectStack.pop(); | 1285 POP_NUMBER(pdfContext, y1); |
| 1286 POP_NUMBER(pdfContext, x1); |
| 1287 CHECK_PARAMETERS(); |
1155 | 1288 |
1156 pdfContext->fGraphicsState.fPath.cubicTo(SkDoubleToScalar(x1), SkDoubleToSca
lar(y1), | 1289 pdfContext->fGraphicsState.fPath.cubicTo(SkDoubleToScalar(x1), SkDoubleToSca
lar(y1), |
1157 SkDoubleToScalar(x2), SkDoubleToScal
ar(y2), | 1290 SkDoubleToScalar(x2), SkDoubleToSca
lar(y2), |
1158 SkDoubleToScalar(x3), SkDoubleToScal
ar(y3)); | 1291 SkDoubleToScalar(x3), SkDoubleToSca
lar(y3)); |
1159 | 1292 |
1160 pdfContext->fGraphicsState.fCurPosX = x3; | 1293 pdfContext->fGraphicsState.fCurPosX = x3; |
1161 pdfContext->fGraphicsState.fCurPosY = y3; | 1294 pdfContext->fGraphicsState.fCurPosY = y3; |
1162 | 1295 |
1163 return kOK_SkPdfResult; | 1296 return kOK_SkPdfResult; |
1164 } | 1297 } |
1165 | 1298 |
1166 static SkPdfResult PdfOp_v(SkPdfContext* pdfContext, SkCanvas* canvas, PdfTokenL
ooper** looper) { | 1299 static SkPdfResult PdfOp_v(SkPdfContext* pdfContext, SkCanvas* canvas, PdfTokenL
ooper** looper) { |
1167 if (pdfContext->fGraphicsState.fPathClosed) { | 1300 if (pdfContext->fGraphicsState.fPathClosed) { |
1168 pdfContext->fGraphicsState.fPath.reset(); | 1301 pdfContext->fGraphicsState.fPath.reset(); |
1169 pdfContext->fGraphicsState.fPathClosed = false; | 1302 pdfContext->fGraphicsState.fPathClosed = false; |
1170 } | 1303 } |
1171 | 1304 |
1172 double y3 = pdfContext->fObjectStack.top()->numberValue(); pdfContext->fO
bjectStack.pop(); | 1305 EXPECT_OPERANDS(pdfContext, 4); |
1173 double x3 = pdfContext->fObjectStack.top()->numberValue(); pdfContext->fO
bjectStack.pop(); | 1306 POP_NUMBER(pdfContext, y3); |
1174 double y2 = pdfContext->fObjectStack.top()->numberValue(); pdfContext->fO
bjectStack.pop(); | 1307 POP_NUMBER(pdfContext, x3); |
1175 double x2 = pdfContext->fObjectStack.top()->numberValue(); pdfContext->fO
bjectStack.pop(); | 1308 POP_NUMBER(pdfContext, y2); |
| 1309 POP_NUMBER(pdfContext, x2); |
| 1310 CHECK_PARAMETERS(); |
| 1311 |
1176 double y1 = pdfContext->fGraphicsState.fCurPosY; | 1312 double y1 = pdfContext->fGraphicsState.fCurPosY; |
1177 double x1 = pdfContext->fGraphicsState.fCurPosX; | 1313 double x1 = pdfContext->fGraphicsState.fCurPosX; |
1178 | 1314 |
1179 pdfContext->fGraphicsState.fPath.cubicTo(SkDoubleToScalar(x1), SkDoubleToSca
lar(y1), | 1315 pdfContext->fGraphicsState.fPath.cubicTo(SkDoubleToScalar(x1), SkDoubleToSca
lar(y1), |
1180 SkDoubleToScalar(x2), SkDoubleToScal
ar(y2), | 1316 SkDoubleToScalar(x2), SkDoubleToSca
lar(y2), |
1181 SkDoubleToScalar(x3), SkDoubleToScal
ar(y3)); | 1317 SkDoubleToScalar(x3), SkDoubleToSca
lar(y3)); |
1182 | 1318 |
1183 pdfContext->fGraphicsState.fCurPosX = x3; | 1319 pdfContext->fGraphicsState.fCurPosX = x3; |
1184 pdfContext->fGraphicsState.fCurPosY = y3; | 1320 pdfContext->fGraphicsState.fCurPosY = y3; |
1185 | 1321 |
1186 return kOK_SkPdfResult; | 1322 return kOK_SkPdfResult; |
1187 } | 1323 } |
1188 | 1324 |
1189 static SkPdfResult PdfOp_y(SkPdfContext* pdfContext, SkCanvas* canvas, PdfTokenL
ooper** looper) { | 1325 static SkPdfResult PdfOp_y(SkPdfContext* pdfContext, SkCanvas* canvas, PdfTokenL
ooper** looper) { |
1190 if (pdfContext->fGraphicsState.fPathClosed) { | 1326 if (pdfContext->fGraphicsState.fPathClosed) { |
1191 pdfContext->fGraphicsState.fPath.reset(); | 1327 pdfContext->fGraphicsState.fPath.reset(); |
1192 pdfContext->fGraphicsState.fPathClosed = false; | 1328 pdfContext->fGraphicsState.fPathClosed = false; |
1193 } | 1329 } |
1194 | 1330 |
1195 double y3 = pdfContext->fObjectStack.top()->numberValue(); pdfContext->fO
bjectStack.pop(); | 1331 EXPECT_OPERANDS(pdfContext, 4); |
1196 double x3 = pdfContext->fObjectStack.top()->numberValue(); pdfContext->fO
bjectStack.pop(); | 1332 POP_NUMBER(pdfContext, y3); |
| 1333 POP_NUMBER(pdfContext, x3); |
| 1334 POP_NUMBER(pdfContext, y1); |
| 1335 POP_NUMBER(pdfContext, x1); |
| 1336 CHECK_PARAMETERS(); |
| 1337 |
1197 double y2 = pdfContext->fGraphicsState.fCurPosY; | 1338 double y2 = pdfContext->fGraphicsState.fCurPosY; |
1198 double x2 = pdfContext->fGraphicsState.fCurPosX; | 1339 double x2 = pdfContext->fGraphicsState.fCurPosX; |
1199 double y1 = pdfContext->fObjectStack.top()->numberValue(); pdfContext->fO
bjectStack.pop(); | |
1200 double x1 = pdfContext->fObjectStack.top()->numberValue(); pdfContext->fO
bjectStack.pop(); | |
1201 | 1340 |
1202 pdfContext->fGraphicsState.fPath.cubicTo(SkDoubleToScalar(x1), SkDoubleToSca
lar(y1), | 1341 pdfContext->fGraphicsState.fPath.cubicTo(SkDoubleToScalar(x1), SkDoubleToSca
lar(y1), |
1203 SkDoubleToScalar(x2), SkDoubleToScal
ar(y2), | 1342 SkDoubleToScalar(x2), SkDoubleToSca
lar(y2), |
1204 SkDoubleToScalar(x3), SkDoubleToScal
ar(y3)); | 1343 SkDoubleToScalar(x3), SkDoubleToSca
lar(y3)); |
1205 | 1344 |
1206 pdfContext->fGraphicsState.fCurPosX = x3; | 1345 pdfContext->fGraphicsState.fCurPosX = x3; |
1207 pdfContext->fGraphicsState.fCurPosY = y3; | 1346 pdfContext->fGraphicsState.fCurPosY = y3; |
1208 | 1347 |
1209 return kOK_SkPdfResult; | 1348 return kOK_SkPdfResult; |
1210 } | 1349 } |
1211 | 1350 |
1212 static SkPdfResult PdfOp_re(SkPdfContext* pdfContext, SkCanvas* canvas, PdfToken
Looper** looper) { | 1351 static SkPdfResult PdfOp_re(SkPdfContext* pdfContext, SkCanvas* canvas, PdfToken
Looper** looper) { |
1213 if (pdfContext->fGraphicsState.fPathClosed) { | 1352 if (pdfContext->fGraphicsState.fPathClosed) { |
1214 pdfContext->fGraphicsState.fPath.reset(); | 1353 pdfContext->fGraphicsState.fPath.reset(); |
1215 pdfContext->fGraphicsState.fPathClosed = false; | 1354 pdfContext->fGraphicsState.fPathClosed = false; |
1216 } | 1355 } |
1217 | 1356 |
1218 double height = pdfContext->fObjectStack.top()->numberValue(); pdfConte
xt->fObjectStack.pop(); | 1357 EXPECT_OPERANDS(pdfContext, 4); |
1219 double width = pdfContext->fObjectStack.top()->numberValue(); pdfConte
xt->fObjectStack.pop(); | 1358 POP_NUMBER(pdfContext, height); |
1220 double y = pdfContext->fObjectStack.top()->numberValue(); pdfConte
xt->fObjectStack.pop(); | 1359 POP_NUMBER(pdfContext, width); |
1221 double x = pdfContext->fObjectStack.top()->numberValue(); pdfConte
xt->fObjectStack.pop(); | 1360 POP_NUMBER(pdfContext, y); |
| 1361 POP_NUMBER(pdfContext, x); |
| 1362 CHECK_PARAMETERS(); |
1222 | 1363 |
1223 pdfContext->fGraphicsState.fPath.addRect(SkDoubleToScalar(x), SkDoubleToScal
ar(y), | 1364 pdfContext->fGraphicsState.fPath.addRect(SkDoubleToScalar(x), SkDoubleToScal
ar(y), |
1224 SkDoubleToScalar(x + width), SkDouble
ToScalar(y + height)); | 1365 SkDoubleToScalar(x + width), SkDoub
leToScalar(y + height)); |
1225 | 1366 |
1226 pdfContext->fGraphicsState.fCurPosX = x; | 1367 pdfContext->fGraphicsState.fCurPosX = x; |
1227 pdfContext->fGraphicsState.fCurPosY = y + height; | 1368 pdfContext->fGraphicsState.fCurPosY = y + height; |
1228 | 1369 |
1229 return kOK_SkPdfResult; | 1370 return kOK_SkPdfResult; |
1230 } | 1371 } |
1231 | 1372 |
1232 static SkPdfResult PdfOp_h(SkPdfContext* pdfContext, SkCanvas* canvas, PdfTokenL
ooper** looper) { | 1373 static SkPdfResult PdfOp_h(SkPdfContext* pdfContext, SkCanvas* canvas, PdfTokenL
ooper** looper) { |
1233 pdfContext->fGraphicsState.fPath.close(); | 1374 pdfContext->fGraphicsState.fPath.close(); |
1234 return kOK_SkPdfResult; | 1375 return kOK_SkPdfResult; |
(...skipping 227 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1462 pdfContext->fGraphicsState.fCurFontSize = fontSize; | 1603 pdfContext->fGraphicsState.fCurFontSize = fontSize; |
1463 return kOK_SkPdfResult; | 1604 return kOK_SkPdfResult; |
1464 } | 1605 } |
1465 | 1606 |
1466 //font size Tf Set the text font, Tf | 1607 //font size Tf Set the text font, Tf |
1467 //, to font and the text font size, Tfs, to size. font is the name of a | 1608 //, to font and the text font size, Tfs, to size. font is the name of a |
1468 //font resource in the Fontsubdictionary of the current resource dictionary; siz
e is | 1609 //font resource in the Fontsubdictionary of the current resource dictionary; siz
e is |
1469 //a number representing a scale factor. There is no initial value for either fon
t or | 1610 //a number representing a scale factor. There is no initial value for either fon
t or |
1470 //size; they must be specified explicitly using Tf before any text is shown. | 1611 //size; they must be specified explicitly using Tf before any text is shown. |
1471 static SkPdfResult PdfOp_Tf(SkPdfContext* pdfContext, SkCanvas* canvas, PdfToken
Looper** looper) { | 1612 static SkPdfResult PdfOp_Tf(SkPdfContext* pdfContext, SkCanvas* canvas, PdfToken
Looper** looper) { |
1472 double fontSize = pdfContext->fObjectStack.top()->numberValue(); pdfCont
ext->fObjectStack.pop(); | 1613 EXPECT_OPERANDS(pdfContext, 2); |
1473 SkPdfNativeObject* fontName = pdfContext->fObjectStack.top();
pdfContext->fObjectStack.pop(); | 1614 POP_NUMBER(pdfContext, fontSize); |
| 1615 POP_NAME(pdfContext, fontName); |
| 1616 CHECK_PARAMETERS(); |
| 1617 |
1474 return skpdfGraphicsStateApplyFontCore(pdfContext, fontName, fontSize); | 1618 return skpdfGraphicsStateApplyFontCore(pdfContext, fontName, fontSize); |
1475 } | 1619 } |
1476 | 1620 |
1477 static SkPdfResult PdfOp_Tj(SkPdfContext* pdfContext, SkCanvas* canvas, PdfToken
Looper** looper) { | 1621 static SkPdfResult PdfOp_Tj(SkPdfContext* pdfContext, SkCanvas* canvas, PdfToken
Looper** looper) { |
| 1622 EXPECT_OPERANDS(pdfContext, 1); |
| 1623 POP_STRING(pdfContext, str); |
| 1624 CHECK_PARAMETERS(); |
| 1625 |
1478 if (!pdfContext->fGraphicsState.fTextBlock) { | 1626 if (!pdfContext->fGraphicsState.fTextBlock) { |
1479 // TODO(edisonn): try to recover and draw it any way? | 1627 // TODO(edisonn): try to recover and draw it any way? |
1480 return kIgnoreError_SkPdfResult; | 1628 return kIgnoreError_SkPdfResult; |
1481 } | 1629 } |
1482 | 1630 |
1483 SkPdfResult ret = DrawText(pdfContext, | 1631 SkPdfResult ret = DrawText(pdfContext, str, canvas); |
1484 pdfContext->fObjectStack.top(), | |
1485 canvas); | |
1486 pdfContext->fObjectStack.pop(); | |
1487 | 1632 |
1488 return ret; | 1633 return ret; |
1489 } | 1634 } |
1490 | 1635 |
1491 static SkPdfResult PdfOp_quote(SkPdfContext* pdfContext, SkCanvas* canvas, PdfTo
kenLooper** looper) { | 1636 static SkPdfResult PdfOp_quote(SkPdfContext* pdfContext, SkCanvas* canvas, PdfTo
kenLooper** looper) { |
1492 if (!pdfContext->fGraphicsState.fTextBlock) { | 1637 if (!pdfContext->fGraphicsState.fTextBlock) { |
1493 // TODO(edisonn): try to recover and draw it any way? | 1638 // TODO(edisonn): try to recover and draw it any way? |
1494 return kIgnoreError_SkPdfResult; | 1639 return kIgnoreError_SkPdfResult; |
1495 } | 1640 } |
1496 | 1641 |
1497 PdfOp_T_star(pdfContext, canvas, looper); | 1642 PdfOp_T_star(pdfContext, canvas, looper); |
1498 // Do not pop, and push, just transfer the param to Tj | 1643 // Do not pop, and push, just transfer the param to Tj |
1499 return PdfOp_Tj(pdfContext, canvas, looper); | 1644 return PdfOp_Tj(pdfContext, canvas, looper); |
1500 } | 1645 } |
1501 | 1646 |
1502 static SkPdfResult PdfOp_doublequote(SkPdfContext* pdfContext, SkCanvas* canvas,
PdfTokenLooper** looper) { | 1647 static SkPdfResult PdfOp_doublequote(SkPdfContext* pdfContext, SkCanvas* canvas,
PdfTokenLooper** looper) { |
1503 if (!pdfContext->fGraphicsState.fTextBlock) { | 1648 if (!pdfContext->fGraphicsState.fTextBlock) { |
1504 // TODO(edisonn): try to recover and draw it any way? | 1649 // TODO(edisonn): try to recover and draw it any way? |
1505 return kIgnoreError_SkPdfResult; | 1650 return kIgnoreError_SkPdfResult; |
1506 } | 1651 } |
1507 | 1652 |
1508 SkPdfNativeObject* str = pdfContext->fObjectStack.top(); pdfContext->f
ObjectStack.pop(); | 1653 EXPECT_OPERANDS(pdfContext, 3); |
1509 SkPdfNativeObject* ac = pdfContext->fObjectStack.top(); pdfContext->f
ObjectStack.pop(); | 1654 POP_OBJ(pdfContext, str); |
1510 SkPdfNativeObject* aw = pdfContext->fObjectStack.top(); pdfContext->f
ObjectStack.pop(); | 1655 POP_OBJ(pdfContext, ac); |
| 1656 POP_OBJ(pdfContext, aw); |
| 1657 CHECK_PARAMETERS(); |
1511 | 1658 |
1512 pdfContext->fObjectStack.push(aw); | 1659 pdfContext->fObjectStack.push(aw); |
1513 PdfOp_Tw(pdfContext, canvas, looper); | 1660 PdfOp_Tw(pdfContext, canvas, looper); |
1514 | 1661 |
1515 pdfContext->fObjectStack.push(ac); | 1662 pdfContext->fObjectStack.push(ac); |
1516 PdfOp_Tc(pdfContext, canvas, looper); | 1663 PdfOp_Tc(pdfContext, canvas, looper); |
1517 | 1664 |
1518 pdfContext->fObjectStack.push(str); | 1665 pdfContext->fObjectStack.push(str); |
1519 PdfOp_quote(pdfContext, canvas, looper); | 1666 PdfOp_quote(pdfContext, canvas, looper); |
1520 | 1667 |
1521 return kPartial_SkPdfResult; | 1668 return kPartial_SkPdfResult; |
1522 } | 1669 } |
1523 | 1670 |
1524 static SkPdfResult PdfOp_TJ(SkPdfContext* pdfContext, SkCanvas* canvas, PdfToken
Looper** looper) { | 1671 static SkPdfResult PdfOp_TJ(SkPdfContext* pdfContext, SkCanvas* canvas, PdfToken
Looper** looper) { |
| 1672 EXPECT_OPERANDS(pdfContext, 1); |
| 1673 POP_ARRAY(pdfContext, array); |
| 1674 CHECK_PARAMETERS(); |
| 1675 |
1525 if (!pdfContext->fGraphicsState.fTextBlock) { | 1676 if (!pdfContext->fGraphicsState.fTextBlock) { |
1526 // TODO(edisonn): try to recover and draw it any way? | 1677 // TODO(edisonn): try to recover and draw it any way? |
1527 return kIgnoreError_SkPdfResult; | 1678 return kIgnoreError_SkPdfResult; |
1528 } | 1679 } |
1529 | 1680 |
1530 SkPdfArray* array = (SkPdfArray*)pdfContext->fObjectStack.top(); | |
1531 pdfContext->fObjectStack.pop(); | |
1532 | |
1533 if (!array->isArray()) { | 1681 if (!array->isArray()) { |
1534 return kIgnoreError_SkPdfResult; | 1682 return kIgnoreError_SkPdfResult; |
1535 } | 1683 } |
1536 | 1684 |
1537 for( int i=0; i<static_cast<int>(array->size()); i++ ) | 1685 for( int i=0; i<static_cast<int>(array->size()); i++ ) |
1538 { | 1686 { |
1539 if( (*array)[i]->isAnyString()) { | 1687 if( (*array)[i]->isAnyString()) { |
1540 SkPdfNativeObject* obj = (*array)[i]; | 1688 SkPdfNativeObject* obj = (*array)[i]; |
1541 DrawText(pdfContext, | 1689 DrawText(pdfContext, obj, canvas); |
1542 obj, | |
1543 canvas); | |
1544 } else if ((*array)[i]->isNumber()) { | 1690 } else if ((*array)[i]->isNumber()) { |
1545 double dx = (*array)[i]->numberValue(); | 1691 double dx = (*array)[i]->numberValue(); |
1546 SkMatrix matrix; | 1692 SkMatrix matrix; |
1547 matrix.setAll(SkDoubleToScalar(1), | 1693 matrix.setAll(SkDoubleToScalar(1), |
1548 SkDoubleToScalar(0), | 1694 SkDoubleToScalar(0), |
1549 // TODO(edisonn): use writing mode, vertical/horizonta
l. | 1695 // TODO(edisonn): use writing mode, vertical/horizonta
l. |
1550 SkDoubleToScalar(-dx), // amount is substracted!!! | 1696 SkDoubleToScalar(-dx), // amount is substracted!!! |
1551 SkDoubleToScalar(0), | 1697 SkDoubleToScalar(0), |
1552 SkDoubleToScalar(1), | 1698 SkDoubleToScalar(1), |
1553 SkDoubleToScalar(0), | 1699 SkDoubleToScalar(0), |
1554 SkDoubleToScalar(0), | 1700 SkDoubleToScalar(0), |
1555 SkDoubleToScalar(0), | 1701 SkDoubleToScalar(0), |
1556 SkDoubleToScalar(1)); | 1702 SkDoubleToScalar(1)); |
1557 | 1703 |
1558 pdfContext->fGraphicsState.fMatrixTm.preConcat(matrix); | 1704 pdfContext->fGraphicsState.fMatrixTm.preConcat(matrix); |
1559 } | 1705 } |
1560 } | 1706 } |
1561 return kPartial_SkPdfResult; // TODO(edisonn): Implement fully DrawText bef
ore returing OK. | 1707 return kPartial_SkPdfResult; // TODO(edisonn): Implement fully DrawText bef
ore returing OK. |
1562 } | 1708 } |
1563 | 1709 |
1564 static SkPdfResult PdfOp_CS_cs(SkPdfContext* pdfContext, SkCanvas* canvas, SkPdf
ColorOperator* colorOperator) { | 1710 static SkPdfResult PdfOp_CS_cs(SkPdfContext* pdfContext, SkCanvas* canvas, SkPdf
ColorOperator* colorOperator) { |
1565 SkPdfNativeObject* name = pdfContext->fObjectStack.top(); pdfContext->fOb
jectStack.pop(); | 1711 EXPECT_OPERANDS(pdfContext, 1); |
| 1712 POP_NAME(pdfContext, name); |
| 1713 CHECK_PARAMETERS(); |
1566 | 1714 |
1567 //Next, get the ColorSpace Dictionary from the Resource Dictionary: | 1715 //Next, get the ColorSpace Dictionary from the Resource Dictionary: |
1568 SkPdfDictionary* colorSpaceResource = pdfContext->fGraphicsState.fResources-
>ColorSpace(pdfContext->fPdfDoc); | 1716 SkPdfDictionary* colorSpaceResource = pdfContext->fGraphicsState.fResources-
>ColorSpace(pdfContext->fPdfDoc); |
1569 | 1717 |
1570 SkPdfNativeObject* colorSpace = colorSpaceResource ? pdfContext->fPdfDoc->re
solveReference(colorSpaceResource->get(name)) : name; | 1718 SkPdfNativeObject* colorSpace = colorSpaceResource ? pdfContext->fPdfDoc->re
solveReference(colorSpaceResource->get(name)) : name; |
1571 | 1719 |
1572 if (colorSpace == NULL) { | 1720 if (colorSpace == NULL) { |
1573 colorOperator->fColorSpace = name->strRef(); | 1721 colorOperator->fColorSpace = name->strRef(); |
1574 } else { | 1722 } else { |
1575 #ifdef PDF_TRACE | 1723 #ifdef PDF_TRACE |
(...skipping 47 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1623 | 1771 |
1624 bool doubles = true; | 1772 bool doubles = true; |
1625 if (colorOperator->fColorSpace.equals("Indexed")) { | 1773 if (colorOperator->fColorSpace.equals("Indexed")) { |
1626 doubles = false; | 1774 doubles = false; |
1627 } | 1775 } |
1628 | 1776 |
1629 #ifdef PDF_TRACE | 1777 #ifdef PDF_TRACE |
1630 printf("color space = %s, N = %i\n", colorOperator->fColorSpace.fBuffer, n); | 1778 printf("color space = %s, N = %i\n", colorOperator->fColorSpace.fBuffer, n); |
1631 #endif | 1779 #endif |
1632 | 1780 |
| 1781 EXPECT_OPERANDS(pdfContext, n); |
| 1782 |
1633 for (int i = n - 1; i >= 0 ; i--) { | 1783 for (int i = n - 1; i >= 0 ; i--) { |
1634 if (doubles) { | 1784 if (doubles) { |
1635 c[i] = pdfContext->fObjectStack.top()->numberValue(); pdfCon
text->fObjectStack.pop(); | 1785 POP_NUMBER_INTO(pdfContext, c[i]); |
1636 // } else { | 1786 // } else { |
1637 // v[i] = pdfContext->fObjectStack.top()->intValue(); pdfConte
xt->fObjectStack.pop(); | 1787 // v[i] = pdfContext->fObjectStack.top()->intValue(); pdfConte
xt->fObjectStack.pop(); |
1638 } | 1788 } |
1639 } | 1789 } |
| 1790 CHECK_PARAMETERS(); |
1640 | 1791 |
1641 // TODO(edisonn): Now, set that color. Only DeviceRGB supported. | 1792 // TODO(edisonn): Now, set that color. Only DeviceRGB supported. |
1642 // TODO(edisonn): do possible field values to enum at parsing time! | 1793 // TODO(edisonn): do possible field values to enum at parsing time! |
1643 // TODO(edisonn): support also abreviations /DeviceRGB == /RGB | 1794 // TODO(edisonn): support also abreviations /DeviceRGB == /RGB |
1644 if (colorOperator->fColorSpace.equals("DeviceRGB") || colorOperator->fColorS
pace.equals("RGB")) { | 1795 if (colorOperator->fColorSpace.equals("DeviceRGB") || colorOperator->fColorS
pace.equals("RGB")) { |
1645 colorOperator->setRGBColor(SkColorSetRGB((U8CPU)(255*c[0]), (U8CPU)(255*
c[1]), (U8CPU)(255*c[2]))); | 1796 colorOperator->setRGBColor(SkColorSetRGB((U8CPU)(255*c[0]), (U8CPU)(255*
c[1]), (U8CPU)(255*c[2]))); |
1646 } | 1797 } |
1647 return kPartial_SkPdfResult; | 1798 return kPartial_SkPdfResult; |
1648 } | 1799 } |
1649 | 1800 |
1650 static SkPdfResult PdfOp_SC(SkPdfContext* pdfContext, SkCanvas* canvas, PdfToken
Looper** looper) { | 1801 static SkPdfResult PdfOp_SC(SkPdfContext* pdfContext, SkCanvas* canvas, PdfToken
Looper** looper) { |
1651 return PdfOp_SC_sc(pdfContext, canvas, &pdfContext->fGraphicsState.fStroking
); | 1802 return PdfOp_SC_sc(pdfContext, canvas, &pdfContext->fGraphicsState.fStroking
); |
1652 } | 1803 } |
1653 | 1804 |
1654 static SkPdfResult PdfOp_sc(SkPdfContext* pdfContext, SkCanvas* canvas, PdfToken
Looper** looper) { | 1805 static SkPdfResult PdfOp_sc(SkPdfContext* pdfContext, SkCanvas* canvas, PdfToken
Looper** looper) { |
1655 return PdfOp_SC_sc(pdfContext, canvas, &pdfContext->fGraphicsState.fNonStrok
ing); | 1806 return PdfOp_SC_sc(pdfContext, canvas, &pdfContext->fGraphicsState.fNonStrok
ing); |
1656 } | 1807 } |
1657 | 1808 |
1658 static SkPdfResult PdfOp_SCN_scn(SkPdfContext* pdfContext, SkCanvas* canvas, SkP
dfColorOperator* colorOperator) { | 1809 static SkPdfResult PdfOp_SCN_scn(SkPdfContext* pdfContext, SkCanvas* canvas, SkP
dfColorOperator* colorOperator) { |
1659 if (pdfContext->fObjectStack.top()->isName()) { | 1810 if (pdfContext->fObjectStack.count() > 0 && pdfContext->fObjectStack.top()->
isName()) { |
1660 SkPdfNativeObject* name = pdfContext->fObjectStack.top(); pdfContext-
>fObjectStack.pop(); | 1811 SkPdfNativeObject* name = pdfContext->fObjectStack.top(); pdfContext-
>fObjectStack.pop(); |
1661 | 1812 |
1662 //Next, get the ExtGState Dictionary from the Resource Dictionary: | 1813 //Next, get the ExtGState Dictionary from the Resource Dictionary: |
1663 SkPdfDictionary* patternResources = pdfContext->fGraphicsState.fResource
s->Pattern(pdfContext->fPdfDoc); | 1814 SkPdfDictionary* patternResources = pdfContext->fGraphicsState.fResource
s->Pattern(pdfContext->fPdfDoc); |
1664 | 1815 |
1665 if (patternResources == NULL) { | 1816 if (patternResources == NULL) { |
1666 #ifdef PDF_TRACE | 1817 #ifdef PDF_TRACE |
1667 printf("ExtGState is NULL!\n"); | 1818 printf("ExtGState is NULL!\n"); |
1668 #endif | 1819 #endif |
1669 return kIgnoreError_SkPdfResult; | 1820 return kIgnoreError_SkPdfResult; |
(...skipping 10 matching lines...) Expand all Loading... |
1680 | 1831 |
1681 static SkPdfResult PdfOp_SCN(SkPdfContext* pdfContext, SkCanvas* canvas, PdfToke
nLooper** looper) { | 1832 static SkPdfResult PdfOp_SCN(SkPdfContext* pdfContext, SkCanvas* canvas, PdfToke
nLooper** looper) { |
1682 return PdfOp_SCN_scn(pdfContext, canvas, &pdfContext->fGraphicsState.fStroki
ng); | 1833 return PdfOp_SCN_scn(pdfContext, canvas, &pdfContext->fGraphicsState.fStroki
ng); |
1683 } | 1834 } |
1684 | 1835 |
1685 static SkPdfResult PdfOp_scn(SkPdfContext* pdfContext, SkCanvas* canvas, PdfToke
nLooper** looper) { | 1836 static SkPdfResult PdfOp_scn(SkPdfContext* pdfContext, SkCanvas* canvas, PdfToke
nLooper** looper) { |
1686 return PdfOp_SCN_scn(pdfContext, canvas, &pdfContext->fGraphicsState.fNonStr
oking); | 1837 return PdfOp_SCN_scn(pdfContext, canvas, &pdfContext->fGraphicsState.fNonStr
oking); |
1687 } | 1838 } |
1688 | 1839 |
1689 static SkPdfResult PdfOp_G_g(SkPdfContext* pdfContext, SkCanvas* canvas, SkPdfCo
lorOperator* colorOperator) { | 1840 static SkPdfResult PdfOp_G_g(SkPdfContext* pdfContext, SkCanvas* canvas, SkPdfCo
lorOperator* colorOperator) { |
1690 /*double gray = */pdfContext->fObjectStack.top()->numberValue(); pdfCont
ext->fObjectStack.pop(); | 1841 EXPECT_OPERANDS(pdfContext, 1); |
1691 return kNYI_SkPdfResult; | 1842 POP_NUMBER(pdfContext, gray); |
| 1843 CHECK_PARAMETERS(); |
| 1844 |
| 1845 colorOperator->fColorSpace = strings_DeviceRGB; // TODO(edisonn): HACK - it
should be device gray, but not suported right now |
| 1846 colorOperator->setRGBColor(SkColorSetRGB((U8CPU)(255*gray), (U8CPU)(255*gray
), (U8CPU)(255*gray))); |
| 1847 |
| 1848 return kPartial_SkPdfResult; |
1692 } | 1849 } |
1693 | 1850 |
1694 static SkPdfResult PdfOp_G(SkPdfContext* pdfContext, SkCanvas* canvas, PdfTokenL
ooper** looper) { | 1851 static SkPdfResult PdfOp_G(SkPdfContext* pdfContext, SkCanvas* canvas, PdfTokenL
ooper** looper) { |
1695 return PdfOp_G_g(pdfContext, canvas, &pdfContext->fGraphicsState.fStroking); | 1852 return PdfOp_G_g(pdfContext, canvas, &pdfContext->fGraphicsState.fStroking); |
1696 } | 1853 } |
1697 | 1854 |
1698 static SkPdfResult PdfOp_g(SkPdfContext* pdfContext, SkCanvas* canvas, PdfTokenL
ooper** looper) { | 1855 static SkPdfResult PdfOp_g(SkPdfContext* pdfContext, SkCanvas* canvas, PdfTokenL
ooper** looper) { |
1699 return PdfOp_G_g(pdfContext, canvas, &pdfContext->fGraphicsState.fNonStrokin
g); | 1856 return PdfOp_G_g(pdfContext, canvas, &pdfContext->fGraphicsState.fNonStrokin
g); |
1700 } | 1857 } |
1701 | 1858 |
1702 static SkPdfResult PdfOp_RG_rg(SkPdfContext* pdfContext, SkCanvas* canvas, SkPdf
ColorOperator* colorOperator) { | 1859 static SkPdfResult PdfOp_RG_rg(SkPdfContext* pdfContext, SkCanvas* canvas, SkPdf
ColorOperator* colorOperator) { |
1703 double b = pdfContext->fObjectStack.top()->numberValue(); pdfContext->fO
bjectStack.pop(); | 1860 EXPECT_OPERANDS(pdfContext, 3); |
1704 double g = pdfContext->fObjectStack.top()->numberValue(); pdfContext->fO
bjectStack.pop(); | 1861 POP_NUMBER(pdfContext, b); |
1705 double r = pdfContext->fObjectStack.top()->numberValue(); pdfContext->fO
bjectStack.pop(); | 1862 POP_NUMBER(pdfContext, g); |
| 1863 POP_NUMBER(pdfContext, r); |
| 1864 CHECK_PARAMETERS(); |
1706 | 1865 |
1707 colorOperator->fColorSpace = strings_DeviceRGB; | 1866 colorOperator->fColorSpace = strings_DeviceRGB; |
1708 colorOperator->setRGBColor(SkColorSetRGB((U8CPU)(255*r), (U8CPU)(255*g), (U8
CPU)(255*b))); | 1867 colorOperator->setRGBColor(SkColorSetRGB((U8CPU)(255*r), (U8CPU)(255*g), (U8
CPU)(255*b))); |
1709 return kOK_SkPdfResult; | 1868 return kOK_SkPdfResult; |
1710 } | 1869 } |
1711 | 1870 |
1712 static SkPdfResult PdfOp_RG(SkPdfContext* pdfContext, SkCanvas* canvas, PdfToken
Looper** looper) { | 1871 static SkPdfResult PdfOp_RG(SkPdfContext* pdfContext, SkCanvas* canvas, PdfToken
Looper** looper) { |
1713 return PdfOp_RG_rg(pdfContext, canvas, &pdfContext->fGraphicsState.fStroking
); | 1872 return PdfOp_RG_rg(pdfContext, canvas, &pdfContext->fGraphicsState.fStroking
); |
1714 } | 1873 } |
1715 | 1874 |
1716 static SkPdfResult PdfOp_rg(SkPdfContext* pdfContext, SkCanvas* canvas, PdfToken
Looper** looper) { | 1875 static SkPdfResult PdfOp_rg(SkPdfContext* pdfContext, SkCanvas* canvas, PdfToken
Looper** looper) { |
1717 return PdfOp_RG_rg(pdfContext, canvas, &pdfContext->fGraphicsState.fNonStrok
ing); | 1876 return PdfOp_RG_rg(pdfContext, canvas, &pdfContext->fGraphicsState.fNonStrok
ing); |
1718 } | 1877 } |
1719 | 1878 |
1720 static SkPdfResult PdfOp_K_k(SkPdfContext* pdfContext, SkCanvas* canvas, SkPdfCo
lorOperator* colorOperator) { | 1879 static SkPdfResult PdfOp_K_k(SkPdfContext* pdfContext, SkCanvas* canvas, SkPdfCo
lorOperator* colorOperator) { |
1721 // TODO(edisonn): spec has some rules about overprint, implement them. | 1880 // TODO(edisonn): spec has some rules about overprint, implement them. |
1722 /*double k = */pdfContext->fObjectStack.top()->numberValue(); pdfContext
->fObjectStack.pop(); | 1881 EXPECT_OPERANDS(pdfContext, 4); |
1723 /*double y = */pdfContext->fObjectStack.top()->numberValue(); pdfContext
->fObjectStack.pop(); | 1882 POP_NUMBER(pdfContext, k); |
1724 /*double m = */pdfContext->fObjectStack.top()->numberValue(); pdfContext
->fObjectStack.pop(); | 1883 POP_NUMBER(pdfContext, y); |
1725 /*double c = */pdfContext->fObjectStack.top()->numberValue(); pdfContext
->fObjectStack.pop(); | 1884 POP_NUMBER(pdfContext, m); |
| 1885 POP_NUMBER(pdfContext, c); |
| 1886 CHECK_PARAMETERS(); |
1726 | 1887 |
1727 colorOperator->fColorSpace = strings_DeviceCMYK; | 1888 // TODO(edisonn): silly way to remove compiler warning |
| 1889 if (k + y + m + c == 0) { |
| 1890 return kNYI_SkPdfResult; |
| 1891 } |
| 1892 |
| 1893 //colorOperator->fColorSpace = strings_DeviceCMYK; |
1728 // TODO(edisonn): Set color. | 1894 // TODO(edisonn): Set color. |
1729 return kNYI_SkPdfResult; | 1895 return kNYI_SkPdfResult; |
1730 } | 1896 } |
1731 | 1897 |
1732 static SkPdfResult PdfOp_K(SkPdfContext* pdfContext, SkCanvas* canvas, PdfTokenL
ooper** looper) { | 1898 static SkPdfResult PdfOp_K(SkPdfContext* pdfContext, SkCanvas* canvas, PdfTokenL
ooper** looper) { |
1733 return PdfOp_K_k(pdfContext, canvas, &pdfContext->fGraphicsState.fStroking); | 1899 return PdfOp_K_k(pdfContext, canvas, &pdfContext->fGraphicsState.fStroking); |
1734 } | 1900 } |
1735 | 1901 |
1736 static SkPdfResult PdfOp_k(SkPdfContext* pdfContext, SkCanvas* canvas, PdfTokenL
ooper** looper) { | 1902 static SkPdfResult PdfOp_k(SkPdfContext* pdfContext, SkCanvas* canvas, PdfTokenL
ooper** looper) { |
1737 return PdfOp_K_k(pdfContext, canvas, &pdfContext->fGraphicsState.fNonStrokin
g); | 1903 return PdfOp_K_k(pdfContext, canvas, &pdfContext->fGraphicsState.fNonStrokin
g); |
(...skipping 142 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1880 if (!fontAndSize || fontAndSize->isArray() || fontAndSize->size() != 2 || !f
ontAndSize->objAtAIndex(0)->isName() || !fontAndSize->objAtAIndex(1)->isNumber()
) { | 2046 if (!fontAndSize || fontAndSize->isArray() || fontAndSize->size() != 2 || !f
ontAndSize->objAtAIndex(0)->isName() || !fontAndSize->objAtAIndex(1)->isNumber()
) { |
1881 // TODO(edisonn): report error/warning | 2047 // TODO(edisonn): report error/warning |
1882 return; | 2048 return; |
1883 } | 2049 } |
1884 skpdfGraphicsStateApplyFontCore(pdfContext, fontAndSize->objAtAIndex(0), fon
tAndSize->objAtAIndex(1)->numberValue()); | 2050 skpdfGraphicsStateApplyFontCore(pdfContext, fontAndSize->objAtAIndex(0), fon
tAndSize->objAtAIndex(1)->numberValue()); |
1885 } | 2051 } |
1886 | 2052 |
1887 | 2053 |
1888 //lineWidth w Set the line width in the graphics state (see “Line Width” on page
152). | 2054 //lineWidth w Set the line width in the graphics state (see “Line Width” on page
152). |
1889 static SkPdfResult PdfOp_w(SkPdfContext* pdfContext, SkCanvas* canvas, PdfTokenL
ooper** looper) { | 2055 static SkPdfResult PdfOp_w(SkPdfContext* pdfContext, SkCanvas* canvas, PdfTokenL
ooper** looper) { |
1890 double lw = pdfContext->fObjectStack.top()->numberValue(); pdfContext->fO
bjectStack.pop(); | 2056 EXPECT_OPERANDS(pdfContext, 1); |
| 2057 POP_NUMBER(pdfContext, lw); |
| 2058 CHECK_PARAMETERS(); |
| 2059 |
1891 return skpdfGraphicsStateApplyLW(pdfContext, lw); | 2060 return skpdfGraphicsStateApplyLW(pdfContext, lw); |
1892 } | 2061 } |
1893 | 2062 |
1894 //lineCap J Set the line cap style in the graphics state (see “Line Cap Style” o
n page 153). | 2063 //lineCap J Set the line cap style in the graphics state (see “Line Cap Style” o
n page 153). |
1895 static SkPdfResult PdfOp_J(SkPdfContext* pdfContext, SkCanvas* canvas, PdfTokenL
ooper** looper) { | 2064 static SkPdfResult PdfOp_J(SkPdfContext* pdfContext, SkCanvas* canvas, PdfTokenL
ooper** looper) { |
1896 // TODO(edisonn): round/ceil to int? | 2065 // TODO(edisonn): round/ceil to int? |
1897 int lc = (int)pdfContext->fObjectStack.top()->numberValue(); pdfContext->
fObjectStack.pop(); | 2066 EXPECT_OPERANDS(pdfContext, 1); |
1898 return skpdfGraphicsStateApplyLC(pdfContext, lc); | 2067 POP_NUMBER(pdfContext, lc); |
| 2068 CHECK_PARAMETERS(); |
| 2069 |
| 2070 return skpdfGraphicsStateApplyLC(pdfContext, (int)lc); |
1899 } | 2071 } |
1900 | 2072 |
1901 //lineJoin j Set the line join style in the graphics state (see “Line Join Style
” on page 153). | 2073 //lineJoin j Set the line join style in the graphics state (see “Line Join Style
” on page 153). |
1902 static SkPdfResult PdfOp_j(SkPdfContext* pdfContext, SkCanvas* canvas, PdfTokenL
ooper** looper) { | 2074 static SkPdfResult PdfOp_j(SkPdfContext* pdfContext, SkCanvas* canvas, PdfTokenL
ooper** looper) { |
1903 // TODO(edisonn): round/ceil to int? | 2075 // TODO(edisonn): round/ceil to int? |
1904 int lj = (int)pdfContext->fObjectStack.top()->numberValue(); pdfContext->
fObjectStack.pop(); | 2076 EXPECT_OPERANDS(pdfContext, 1); |
1905 return skpdfGraphicsStateApplyLJ(pdfContext, lj); | 2077 POP_NUMBER(pdfContext, lj); |
| 2078 CHECK_PARAMETERS(); |
| 2079 |
| 2080 return skpdfGraphicsStateApplyLJ(pdfContext, (int)lj); |
1906 } | 2081 } |
1907 | 2082 |
1908 //miterLimit M Set the miter limit in the graphics state (see “Miter Limit” on p
age 153). | 2083 //miterLimit M Set the miter limit in the graphics state (see “Miter Limit” on p
age 153). |
1909 static SkPdfResult PdfOp_M(SkPdfContext* pdfContext, SkCanvas* canvas, PdfTokenL
ooper** looper) { | 2084 static SkPdfResult PdfOp_M(SkPdfContext* pdfContext, SkCanvas* canvas, PdfTokenL
ooper** looper) { |
1910 double ml = pdfContext->fObjectStack.top()->numberValue(); pdfContext->fO
bjectStack.pop(); | 2085 EXPECT_OPERANDS(pdfContext, 1); |
| 2086 POP_NUMBER(pdfContext, ml); |
| 2087 CHECK_PARAMETERS(); |
1911 return skpdfGraphicsStateApplyML(pdfContext, ml); | 2088 return skpdfGraphicsStateApplyML(pdfContext, ml); |
1912 } | 2089 } |
1913 | 2090 |
1914 //dashArray dashPhase d Set the line dash pattern in the graphics state (see “Li
ne Dash Pattern” on | 2091 //dashArray dashPhase d Set the line dash pattern in the graphics state (see “Li
ne Dash Pattern” on |
1915 //page 155). | 2092 //page 155). |
1916 static SkPdfResult PdfOp_d(SkPdfContext* pdfContext, SkCanvas* canvas, PdfTokenL
ooper** looper) { | 2093 static SkPdfResult PdfOp_d(SkPdfContext* pdfContext, SkCanvas* canvas, PdfTokenL
ooper** looper) { |
1917 SkPdfNativeObject* phase = pdfContext->fObjectStack.top(); pdfConte
xt->fObjectStack.pop(); | 2094 EXPECT_OPERANDS(pdfContext, 2); |
1918 SkPdfNativeObject* array = pdfContext->fObjectStack.top(); pdfConte
xt->fObjectStack.pop(); | 2095 POP_OBJ(pdfContext, phase); |
| 2096 POP_ARRAY(pdfContext, array); |
| 2097 CHECK_PARAMETERS(); |
1919 | 2098 |
1920 if (!array->isArray()) { | 2099 return skpdfGraphicsStateApplyD(pdfContext, array, phase); |
1921 return kIgnoreError_SkPdfResult; | |
1922 } | |
1923 | |
1924 return skpdfGraphicsStateApplyD(pdfContext, (SkPdfArray*)array, phase); | |
1925 } | 2100 } |
1926 | 2101 |
1927 //intent ri (PDF 1.1) Set the color rendering intent in the graphics state (see
“Rendering Intents” on page 197). | 2102 //intent ri (PDF 1.1) Set the color rendering intent in the graphics state (see
“Rendering Intents” on page 197). |
1928 static SkPdfResult PdfOp_ri(SkPdfContext* pdfContext, SkCanvas* canvas, PdfToken
Looper** looper) { | 2103 static SkPdfResult PdfOp_ri(SkPdfContext* pdfContext, SkCanvas* canvas, PdfToken
Looper** looper) { |
1929 pdfContext->fObjectStack.pop(); | 2104 pdfContext->fObjectStack.pop(); |
1930 | 2105 |
1931 return kNYI_SkPdfResult; | 2106 return kNYI_SkPdfResult; |
1932 } | 2107 } |
1933 | 2108 |
1934 //flatness i Set the flatness tolerance in the graphics state (see Section 6.5.1,
“Flatness | 2109 //flatness i Set the flatness tolerance in the graphics state (see Section 6.5.1,
“Flatness |
1935 //Tolerance”). flatness is a number in the range 0 to 100; a value of 0 speci- | 2110 //Tolerance”). flatness is a number in the range 0 to 100; a value of 0 speci- |
1936 //fies the output device’s default flatness tolerance. | 2111 //fies the output device’s default flatness tolerance. |
1937 static SkPdfResult PdfOp_i(SkPdfContext* pdfContext, SkCanvas* canvas, PdfTokenL
ooper** looper) { | 2112 static SkPdfResult PdfOp_i(SkPdfContext* pdfContext, SkCanvas* canvas, PdfTokenL
ooper** looper) { |
1938 pdfContext->fObjectStack.pop(); | 2113 EXPECT_OPERANDS(pdfContext, 1); |
| 2114 POP_NUMBER(pdfContext, flatness); |
| 2115 CHECK_PARAMETERS(); |
| 2116 |
| 2117 if (flatness < 0 || flatness > 100) { |
| 2118 return kError_SkPdfResult; |
| 2119 } |
1939 | 2120 |
1940 return kNYI_SkPdfResult; | 2121 return kNYI_SkPdfResult; |
1941 } | 2122 } |
1942 | 2123 |
1943 SkTDict<SkXfermode::Mode> gPdfBlendModes(20); | 2124 SkTDict<SkXfermode::Mode> gPdfBlendModes(20); |
1944 | 2125 |
1945 class InitBlendModes { | 2126 class InitBlendModes { |
1946 public: | 2127 public: |
1947 InitBlendModes() { | 2128 InitBlendModes() { |
1948 // TODO(edisonn): use the python code generator? | 2129 // TODO(edisonn): use the python code generator? |
(...skipping 109 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2058 } | 2239 } |
2059 | 2240 |
2060 static void skpdfGraphicsStateApplyAIS(SkPdfContext* pdfContext, bool alphaSourc
e) { | 2241 static void skpdfGraphicsStateApplyAIS(SkPdfContext* pdfContext, bool alphaSourc
e) { |
2061 pdfContext->fGraphicsState.fAlphaSource = alphaSource; | 2242 pdfContext->fGraphicsState.fAlphaSource = alphaSource; |
2062 } | 2243 } |
2063 | 2244 |
2064 | 2245 |
2065 //dictName gs (PDF 1.2) Set the specified parameters in the graphics state. dictN
ame is | 2246 //dictName gs (PDF 1.2) Set the specified parameters in the graphics state. dictN
ame is |
2066 //the name of a graphics state parameter dictionary in the ExtGState subdictiona
ry of the current resource dictionary (see the next section). | 2247 //the name of a graphics state parameter dictionary in the ExtGState subdictiona
ry of the current resource dictionary (see the next section). |
2067 static SkPdfResult PdfOp_gs(SkPdfContext* pdfContext, SkCanvas* canvas, PdfToken
Looper** looper) { | 2248 static SkPdfResult PdfOp_gs(SkPdfContext* pdfContext, SkCanvas* canvas, PdfToken
Looper** looper) { |
2068 SkPdfNativeObject* name = pdfContext->fObjectStack.top(); pdfContext->fOb
jectStack.pop(); | 2249 EXPECT_OPERANDS(pdfContext, 1); |
| 2250 POP_NAME(pdfContext, name); |
| 2251 CHECK_PARAMETERS(); |
2069 | 2252 |
2070 #ifdef PDF_TRACE | 2253 #ifdef PDF_TRACE |
2071 SkString str; | 2254 SkString str; |
2072 #endif | 2255 #endif |
2073 | 2256 |
2074 //Next, get the ExtGState Dictionary from the Resource Dictionary: | 2257 //Next, get the ExtGState Dictionary from the Resource Dictionary: |
2075 SkPdfDictionary* extGStateDictionary = pdfContext->fGraphicsState.fResources
->ExtGState(pdfContext->fPdfDoc); | 2258 SkPdfDictionary* extGStateDictionary = pdfContext->fGraphicsState.fResources
->ExtGState(pdfContext->fPdfDoc); |
2076 | 2259 |
2077 if (extGStateDictionary == NULL) { | 2260 if (extGStateDictionary == NULL) { |
2078 #ifdef PDF_TRACE | 2261 #ifdef PDF_TRACE |
(...skipping 70 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2149 skpdfGraphicsStateApplyAIS(pdfContext, gs->AIS(pdfContext->fPdfDoc)); | 2332 skpdfGraphicsStateApplyAIS(pdfContext, gs->AIS(pdfContext->fPdfDoc)); |
2150 } | 2333 } |
2151 | 2334 |
2152 return kOK_SkPdfResult; | 2335 return kOK_SkPdfResult; |
2153 } | 2336 } |
2154 | 2337 |
2155 //charSpace Tc Set the character spacing, Tc | 2338 //charSpace Tc Set the character spacing, Tc |
2156 //, to charSpace, which is a number expressed in unscaled text space units. Char
acter spacing is used by the Tj, TJ, and ' operators. | 2339 //, to charSpace, which is a number expressed in unscaled text space units. Char
acter spacing is used by the Tj, TJ, and ' operators. |
2157 //Initial value: 0. | 2340 //Initial value: 0. |
2158 SkPdfResult PdfOp_Tc(SkPdfContext* pdfContext, SkCanvas* canvas, PdfTokenLooper*
* looper) { | 2341 SkPdfResult PdfOp_Tc(SkPdfContext* pdfContext, SkCanvas* canvas, PdfTokenLooper*
* looper) { |
2159 double charSpace = pdfContext->fObjectStack.top()->numberValue(); pdfCon
text->fObjectStack.pop(); | 2342 EXPECT_OPERANDS(pdfContext, 1); |
| 2343 POP_NUMBER(pdfContext, charSpace); |
| 2344 CHECK_PARAMETERS(); |
| 2345 |
2160 pdfContext->fGraphicsState.fCharSpace = charSpace; | 2346 pdfContext->fGraphicsState.fCharSpace = charSpace; |
2161 | 2347 |
2162 return kOK_SkPdfResult; | 2348 return kOK_SkPdfResult; |
2163 } | 2349 } |
2164 | 2350 |
2165 //wordSpace Tw Set the word spacing, T | 2351 //wordSpace Tw Set the word spacing, T |
2166 //w | 2352 //w |
2167 //, to wordSpace, which is a number expressed in unscaled | 2353 //, to wordSpace, which is a number expressed in unscaled |
2168 //text space units. Word spacing is used by the Tj, TJ, and ' operators. Initial | 2354 //text space units. Word spacing is used by the Tj, TJ, and ' operators. Initial |
2169 //value: 0. | 2355 //value: 0. |
2170 SkPdfResult PdfOp_Tw(SkPdfContext* pdfContext, SkCanvas* canvas, PdfTokenLooper*
* looper) { | 2356 SkPdfResult PdfOp_Tw(SkPdfContext* pdfContext, SkCanvas* canvas, PdfTokenLooper*
* looper) { |
2171 double wordSpace = pdfContext->fObjectStack.top()->numberValue(); pdfCon
text->fObjectStack.pop(); | 2357 EXPECT_OPERANDS(pdfContext, 1); |
| 2358 POP_NUMBER(pdfContext, wordSpace); |
| 2359 CHECK_PARAMETERS(); |
| 2360 |
2172 pdfContext->fGraphicsState.fWordSpace = wordSpace; | 2361 pdfContext->fGraphicsState.fWordSpace = wordSpace; |
2173 | 2362 |
2174 return kOK_SkPdfResult; | 2363 return kOK_SkPdfResult; |
2175 } | 2364 } |
2176 | 2365 |
2177 //scale Tz Set the horizontal scaling, Th | 2366 //scale Tz Set the horizontal scaling, Th |
2178 //, to (scale ˜ 100). scale is a number specifying the | 2367 //, to (scale ˜ 100). scale is a number specifying the |
2179 //percentage of the normal width. Initial value: 100 (normal width). | 2368 //percentage of the normal width. Initial value: 100 (normal width). |
2180 static SkPdfResult PdfOp_Tz(SkPdfContext* pdfContext, SkCanvas* canvas, PdfToken
Looper** looper) { | 2369 static SkPdfResult PdfOp_Tz(SkPdfContext* pdfContext, SkCanvas* canvas, PdfToken
Looper** looper) { |
2181 /*double scale = */pdfContext->fObjectStack.top()->numberValue(); pdfCon
text->fObjectStack.pop(); | 2370 EXPECT_OPERANDS(pdfContext, 1); |
| 2371 POP_NUMBER(pdfContext, scale); |
| 2372 CHECK_PARAMETERS(); |
| 2373 |
| 2374 if (scale < 0) { |
| 2375 return kError_SkPdfResult; |
| 2376 } |
2182 | 2377 |
2183 return kNYI_SkPdfResult; | 2378 return kNYI_SkPdfResult; |
2184 } | 2379 } |
2185 | 2380 |
2186 //render Tr Set the text rendering mode, T | 2381 //render Tr Set the text rendering mode, T |
2187 //mode, to render, which is an integer. Initial value: 0. | 2382 //mode, to render, which is an integer. Initial value: 0. |
2188 static SkPdfResult PdfOp_Tr(SkPdfContext* pdfContext, SkCanvas* canvas, PdfToken
Looper** looper) { | 2383 static SkPdfResult PdfOp_Tr(SkPdfContext* pdfContext, SkCanvas* canvas, PdfToken
Looper** looper) { |
2189 /*double render = */pdfContext->fObjectStack.top()->numberValue(); pdfCo
ntext->fObjectStack.pop(); | 2384 EXPECT_OPERANDS(pdfContext, 1); |
| 2385 POP_INTEGER(pdfContext, mode); |
| 2386 CHECK_PARAMETERS(); |
| 2387 |
| 2388 if (mode < 0) { // TODO(edisonn): function/enums with supported modes |
| 2389 return kError_SkPdfResult; |
| 2390 } |
2190 | 2391 |
2191 return kNYI_SkPdfResult; | 2392 return kNYI_SkPdfResult; |
2192 } | 2393 } |
2193 //rise Ts Set the text rise, Trise, to rise, which is a number expressed in unsc
aled text space | 2394 //rise Ts Set the text rise, Trise, to rise, which is a number expressed in unsc
aled text space |
2194 //units. Initial value: 0. | 2395 //units. Initial value: 0. |
2195 static SkPdfResult PdfOp_Ts(SkPdfContext* pdfContext, SkCanvas* canvas, PdfToken
Looper** looper) { | 2396 static SkPdfResult PdfOp_Ts(SkPdfContext* pdfContext, SkCanvas* canvas, PdfToken
Looper** looper) { |
2196 /*double rise = */pdfContext->fObjectStack.top()->numberValue(); pdfCont
ext->fObjectStack.pop(); | 2397 EXPECT_OPERANDS(pdfContext, 1); |
| 2398 POP_NUMBER(pdfContext, rise); |
| 2399 CHECK_PARAMETERS(); |
| 2400 |
| 2401 if (rise < 0) { |
| 2402 return kNYI_SkPdfResult; |
| 2403 } |
2197 | 2404 |
2198 return kNYI_SkPdfResult; | 2405 return kNYI_SkPdfResult; |
2199 } | 2406 } |
2200 | 2407 |
2201 //wx wy d0 | 2408 //wx wy d0 |
2202 static SkPdfResult PdfOp_d0(SkPdfContext* pdfContext, SkCanvas* canvas, PdfToken
Looper** looper) { | 2409 static SkPdfResult PdfOp_d0(SkPdfContext* pdfContext, SkCanvas* canvas, PdfToken
Looper** looper) { |
2203 pdfContext->fObjectStack.pop(); | 2410 EXPECT_OPERANDS(pdfContext, 2); |
2204 pdfContext->fObjectStack.pop(); | 2411 POP_NUMBER(pdfContext, wy); |
| 2412 POP_NUMBER(pdfContext, wx); |
| 2413 CHECK_PARAMETERS(); |
| 2414 |
| 2415 if (wx < 0 || wy < 0) { |
| 2416 return kError_SkPdfResult; |
| 2417 } |
2205 | 2418 |
2206 return kNYI_SkPdfResult; | 2419 return kNYI_SkPdfResult; |
2207 } | 2420 } |
2208 | 2421 |
2209 //wx wy llx lly urx ury d1 | 2422 //wx wy llx lly urx ury d1 |
2210 static SkPdfResult PdfOp_d1(SkPdfContext* pdfContext, SkCanvas* canvas, PdfToken
Looper** looper) { | 2423 static SkPdfResult PdfOp_d1(SkPdfContext* pdfContext, SkCanvas* canvas, PdfToken
Looper** looper) { |
2211 pdfContext->fObjectStack.pop(); | 2424 EXPECT_OPERANDS(pdfContext, 6); |
2212 pdfContext->fObjectStack.pop(); | 2425 POP_NUMBER(pdfContext, ury); |
2213 pdfContext->fObjectStack.pop(); | 2426 POP_NUMBER(pdfContext, urx); |
2214 pdfContext->fObjectStack.pop(); | 2427 POP_NUMBER(pdfContext, lly); |
2215 pdfContext->fObjectStack.pop(); | 2428 POP_NUMBER(pdfContext, llx); |
2216 pdfContext->fObjectStack.pop(); | 2429 POP_NUMBER(pdfContext, wy); |
| 2430 POP_NUMBER(pdfContext, wx); |
| 2431 CHECK_PARAMETERS(); |
| 2432 |
| 2433 if (wx + wy + llx + lly + urx + ury) { |
| 2434 return kNYI_SkPdfResult; |
| 2435 } |
2217 | 2436 |
2218 return kNYI_SkPdfResult; | 2437 return kNYI_SkPdfResult; |
2219 } | 2438 } |
2220 | 2439 |
2221 //name sh | 2440 //name sh |
2222 static SkPdfResult PdfOp_sh(SkPdfContext* pdfContext, SkCanvas* canvas, PdfToken
Looper** looper) { | 2441 static SkPdfResult PdfOp_sh(SkPdfContext* pdfContext, SkCanvas* canvas, PdfToken
Looper** looper) { |
2223 pdfContext->fObjectStack.pop(); | 2442 EXPECT_OPERANDS(pdfContext, 1); |
| 2443 POP_NAME(pdfContext, name); |
| 2444 CHECK_PARAMETERS(); |
| 2445 |
| 2446 if (name == NULL) { |
| 2447 return kError_SkPdfResult; |
| 2448 } |
2224 | 2449 |
2225 return kNYI_SkPdfResult; | 2450 return kNYI_SkPdfResult; |
2226 } | 2451 } |
2227 | 2452 |
2228 //name Do | 2453 //name Do |
2229 static SkPdfResult PdfOp_Do(SkPdfContext* pdfContext, SkCanvas* canvas, PdfToken
Looper** looper) { | 2454 static SkPdfResult PdfOp_Do(SkPdfContext* pdfContext, SkCanvas* canvas, PdfToken
Looper** looper) { |
2230 SkPdfNativeObject* name = pdfContext->fObjectStack.top(); pdfContext->fOb
jectStack.pop(); | 2455 EXPECT_OPERANDS(pdfContext, 1); |
| 2456 POP_NAME(pdfContext, name); |
| 2457 CHECK_PARAMETERS(); |
2231 | 2458 |
2232 SkPdfDictionary* xObject = pdfContext->fGraphicsState.fResources->XObject(p
dfContext->fPdfDoc); | 2459 SkPdfDictionary* xObject = pdfContext->fGraphicsState.fResources->XObject(p
dfContext->fPdfDoc); |
2233 | 2460 |
2234 if (xObject == NULL) { | 2461 if (xObject == NULL) { |
2235 #ifdef PDF_TRACE | 2462 #ifdef PDF_TRACE |
2236 printf("XObject is NULL!\n"); | 2463 printf("XObject is NULL!\n"); |
2237 #endif | 2464 #endif |
2238 return kIgnoreError_SkPdfResult; | 2465 return kIgnoreError_SkPdfResult; |
2239 } | 2466 } |
2240 | 2467 |
2241 SkPdfNativeObject* value = xObject->get(name); | 2468 SkPdfNativeObject* value = xObject->get(name); |
2242 value = pdfContext->fPdfDoc->resolveReference(value); | 2469 value = pdfContext->fPdfDoc->resolveReference(value); |
2243 | 2470 |
2244 #ifdef PDF_TRACE | 2471 #ifdef PDF_TRACE |
2245 // value->ToString(str); | 2472 // value->ToString(str); |
2246 // printf("Do object value: %s\n", str); | 2473 // printf("Do object value: %s\n", str); |
2247 #endif | 2474 #endif |
2248 | 2475 |
2249 return doXObject(pdfContext, canvas, value); | 2476 return doXObject(pdfContext, canvas, value); |
2250 } | 2477 } |
2251 | 2478 |
2252 //tag MP Designate a marked-content point. tag is a name object indicating the r
ole or | 2479 //tag MP Designate a marked-content point. tag is a name object indicating the r
ole or |
2253 //significance of the point. | 2480 //significance of the point. |
2254 static SkPdfResult PdfOp_MP(SkPdfContext* pdfContext, SkCanvas* canvas, PdfToken
Looper** looper) { | 2481 static SkPdfResult PdfOp_MP(SkPdfContext* pdfContext, SkCanvas* canvas, PdfToken
Looper** looper) { |
2255 pdfContext->fObjectStack.pop(); | 2482 EXPECT_OPERANDS(pdfContext, 1); |
| 2483 POP_OBJ(pdfContext, tag); |
| 2484 CHECK_PARAMETERS(); |
| 2485 |
| 2486 if (tag == NULL) { |
| 2487 return kNYI_SkPdfResult; |
| 2488 } |
2256 | 2489 |
2257 return kNYI_SkPdfResult; | 2490 return kNYI_SkPdfResult; |
2258 } | 2491 } |
2259 | 2492 |
2260 //tag properties DP Designate a marked-content point with an associated property
list. tag is a | 2493 //tag properties DP Designate a marked-content point with an associated property
list. tag is a |
2261 //name object indicating the role or significance of the point; properties is | 2494 //name object indicating the role or significance of the point; properties is |
2262 //either an inline dictionary containing the property list or a name object | 2495 //either an inline dictionary containing the property list or a name object |
2263 //associated with it in the Properties subdictionary of the current resource | 2496 //associated with it in the Properties subdictionary of the current resource |
2264 //dictionary (see Section 9.5.1, “Property Lists”). | 2497 //dictionary (see Section 9.5.1, “Property Lists”). |
2265 static SkPdfResult PdfOp_DP(SkPdfContext* pdfContext, SkCanvas* canvas, PdfToken
Looper** looper) { | 2498 static SkPdfResult PdfOp_DP(SkPdfContext* pdfContext, SkCanvas* canvas, PdfToken
Looper** looper) { |
2266 pdfContext->fObjectStack.pop(); | 2499 EXPECT_OPERANDS(pdfContext, 2); |
2267 pdfContext->fObjectStack.pop(); | 2500 POP_OBJ(pdfContext, properties); |
| 2501 POP_OBJ(pdfContext, tag); |
| 2502 CHECK_PARAMETERS(); |
| 2503 |
| 2504 if (tag == NULL || properties == NULL) { |
| 2505 return kNYI_SkPdfResult; |
| 2506 } |
2268 | 2507 |
2269 return kNYI_SkPdfResult; | 2508 return kNYI_SkPdfResult; |
2270 } | 2509 } |
2271 | 2510 |
2272 //tag BMC Begin a marked-content sequence terminated by a balancing EMC operator
. | 2511 //tag BMC Begin a marked-content sequence terminated by a balancing EMC operator
. |
2273 //tag is a name object indicating the role or significance of the sequence. | 2512 //tag is a name object indicating the role or significance of the sequence. |
2274 static SkPdfResult PdfOp_BMC(SkPdfContext* pdfContext, SkCanvas* canvas, PdfToke
nLooper** looper) { | 2513 static SkPdfResult PdfOp_BMC(SkPdfContext* pdfContext, SkCanvas* canvas, PdfToke
nLooper** looper) { |
2275 pdfContext->fObjectStack.pop(); | 2514 EXPECT_OPERANDS(pdfContext, 1); |
| 2515 POP_OBJ(pdfContext, tag); |
| 2516 CHECK_PARAMETERS(); |
| 2517 |
| 2518 if (tag == NULL) { |
| 2519 return kNYI_SkPdfResult; |
| 2520 } |
2276 | 2521 |
2277 return kNYI_SkPdfResult; | 2522 return kNYI_SkPdfResult; |
2278 } | 2523 } |
2279 | 2524 |
2280 //tag properties BDC Begin a marked-content sequence with an associated property
list, terminated | 2525 //tag properties BDC Begin a marked-content sequence with an associated property
list, terminated |
2281 //by a balancing EMCoperator. tag is a name object indicating the role or signif
icance of the sequence; propertiesis either an inline dictionary containing the | 2526 //by a balancing EMCoperator. tag is a name object indicating the role or signif
icance of the sequence; propertiesis either an inline dictionary containing the |
2282 //property list or a name object associated with it in the Properties subdiction
ary of the current resource dictionary (see Section 9.5.1, “Property Lists”). | 2527 //property list or a name object associated with it in the Properties subdiction
ary of the current resource dictionary (see Section 9.5.1, “Property Lists”). |
2283 static SkPdfResult PdfOp_BDC(SkPdfContext* pdfContext, SkCanvas* canvas, PdfToke
nLooper** looper) { | 2528 static SkPdfResult PdfOp_BDC(SkPdfContext* pdfContext, SkCanvas* canvas, PdfToke
nLooper** looper) { |
2284 pdfContext->fObjectStack.pop(); | 2529 EXPECT_OPERANDS(pdfContext, 2); |
2285 pdfContext->fObjectStack.pop(); | 2530 POP_OBJ(pdfContext, properties); |
| 2531 POP_OBJ(pdfContext, tag); |
| 2532 CHECK_PARAMETERS(); |
| 2533 |
| 2534 if (tag == NULL || properties == NULL) { |
| 2535 return kNYI_SkPdfResult; |
| 2536 } |
2286 | 2537 |
2287 return kNYI_SkPdfResult; | 2538 return kNYI_SkPdfResult; |
2288 } | 2539 } |
2289 | 2540 |
2290 //— EMC End a marked-content sequence begun by a BMC or BDC operator. | 2541 //— EMC End a marked-content sequence begun by a BMC or BDC operator. |
2291 static SkPdfResult PdfOp_EMC(SkPdfContext* pdfContext, SkCanvas* canvas, PdfToke
nLooper** looper) { | 2542 static SkPdfResult PdfOp_EMC(SkPdfContext* pdfContext, SkCanvas* canvas, PdfToke
nLooper** looper) { |
2292 return kNYI_SkPdfResult; | 2543 return kNYI_SkPdfResult; |
2293 } | 2544 } |
2294 | 2545 |
2295 static void initPdfOperatorRenderes() { | 2546 static void initPdfOperatorRenderes() { |
(...skipping 343 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2639 | 2890 |
2640 rect = SkRect::MakeWH(width, height); | 2891 rect = SkRect::MakeWH(width, height); |
2641 | 2892 |
2642 setup_bitmap(output, (int)SkScalarToDouble(width), (int)SkScalarToDouble(hei
ght)); | 2893 setup_bitmap(output, (int)SkScalarToDouble(width), (int)SkScalarToDouble(hei
ght)); |
2643 | 2894 |
2644 SkAutoTUnref<SkDevice> device(SkNEW_ARGS(SkDevice, (*output))); | 2895 SkAutoTUnref<SkDevice> device(SkNEW_ARGS(SkDevice, (*output))); |
2645 SkCanvas canvas(device); | 2896 SkCanvas canvas(device); |
2646 | 2897 |
2647 return renderer.renderPage(page, &canvas, rect); | 2898 return renderer.renderPage(page, &canvas, rect); |
2648 } | 2899 } |
OLD | NEW |