| OLD | NEW |
| 1 /* | 1 /* |
| 2 * Copyright 2016 Google Inc. | 2 * Copyright 2016 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 "SkJSONRenderer.h" | 8 #include "SkJSONRenderer.h" |
| 9 |
| 10 #include "SkBlurMaskFilter.h" |
| 11 #include "SkDashPathEffect.h" |
| 9 #include "SkJSONCanvas.h" | 12 #include "SkJSONCanvas.h" |
| 10 #include "SkJSONCPP.h" | 13 #include "SkJSONCPP.h" |
| 11 #include "SkPath.h" | 14 #include "SkPath.h" |
| 12 | 15 |
| 13 namespace SkJSONRenderer { | 16 namespace SkJSONRenderer { |
| 14 | 17 |
| 15 class Renderer { | 18 class Renderer { |
| 16 public: | 19 public: |
| 17 void getPaint(Json::Value& command, SkPaint* paint); | 20 void getPaint(Json::Value& command, SkPaint* paint); |
| 18 | 21 |
| 19 void getRect(Json::Value& command, const char* name, SkRect* rect); | 22 void getRect(Json::Value& command, const char* name, SkRect* rect); |
| 20 | 23 |
| 21 void getRRect(Json::Value& command, const char* name, SkRRect* rrect); | 24 void getRRect(Json::Value& command, const char* name, SkRRect* rrect); |
| 22 | 25 |
| 26 void getPath(Json::Value& command, SkPath* path); |
| 27 |
| 28 SkRegion::Op getRegionOp(Json::Value& command); |
| 29 |
| 23 void processCommand(Json::Value& command, SkCanvas* target); | 30 void processCommand(Json::Value& command, SkCanvas* target); |
| 24 | 31 |
| 25 void processMatrix(Json::Value& command, SkCanvas* target); | 32 void processMatrix(Json::Value& command, SkCanvas* target); |
| 26 | 33 |
| 27 void processSave(Json::Value& command, SkCanvas* target); | 34 void processSave(Json::Value& command, SkCanvas* target); |
| 28 | 35 |
| 29 void processRestore(Json::Value& command, SkCanvas* target); | 36 void processRestore(Json::Value& command, SkCanvas* target); |
| 30 | 37 |
| 31 void processPaint(Json::Value& command, SkCanvas* target); | 38 void processPaint(Json::Value& command, SkCanvas* target); |
| 32 | 39 |
| 33 void processRect(Json::Value& command, SkCanvas* target); | 40 void processRect(Json::Value& command, SkCanvas* target); |
| 34 | 41 |
| 35 void processRRect(Json::Value& command, SkCanvas* target); | 42 void processRRect(Json::Value& command, SkCanvas* target); |
| 36 | 43 |
| 37 void processOval(Json::Value& command, SkCanvas* target); | 44 void processOval(Json::Value& command, SkCanvas* target); |
| 38 | 45 |
| 39 void processPath(Json::Value& command, SkCanvas* target); | 46 void processPath(Json::Value& command, SkCanvas* target); |
| 40 | 47 |
| 41 void processText(Json::Value& command, SkCanvas* target); | 48 void processText(Json::Value& command, SkCanvas* target); |
| 42 | 49 |
| 50 void processPosText(Json::Value& command, SkCanvas* target); |
| 51 |
| 43 void processPoints(Json::Value& command, SkCanvas* target); | 52 void processPoints(Json::Value& command, SkCanvas* target); |
| 44 | 53 |
| 45 void processClipRect(Json::Value& command, SkCanvas* target); | 54 void processClipRect(Json::Value& command, SkCanvas* target); |
| 55 |
| 56 void processClipRRect(Json::Value& command, SkCanvas* target); |
| 57 |
| 58 void processClipPath(Json::Value& command, SkCanvas* target); |
| 46 }; | 59 }; |
| 47 | 60 |
| 48 void Renderer::processCommand(Json::Value& command, SkCanvas* target) { | 61 void Renderer::processCommand(Json::Value& command, SkCanvas* target) { |
| 49 const char* name = command[SKJSONCANVAS_COMMAND].asCString(); | 62 const char* name = command[SKJSONCANVAS_COMMAND].asCString(); |
| 50 // TODO speed this up with a hash | 63 // TODO speed this up with a hash |
| 51 if (!strcmp(name, SKJSONCANVAS_COMMAND_MATRIX)) { | 64 if (!strcmp(name, SKJSONCANVAS_COMMAND_MATRIX)) { |
| 52 this->processMatrix(command, target); | 65 this->processMatrix(command, target); |
| 53 } | 66 } |
| 54 else if (!strcmp(name, SKJSONCANVAS_COMMAND_SAVE)) { | 67 else if (!strcmp(name, SKJSONCANVAS_COMMAND_SAVE)) { |
| 55 this->processSave(command, target); | 68 this->processSave(command, target); |
| (...skipping 12 matching lines...) Expand all Loading... |
| 68 } | 81 } |
| 69 else if (!strcmp(name, SKJSONCANVAS_COMMAND_OVAL)) { | 82 else if (!strcmp(name, SKJSONCANVAS_COMMAND_OVAL)) { |
| 70 this->processOval(command, target); | 83 this->processOval(command, target); |
| 71 } | 84 } |
| 72 else if (!strcmp(name, SKJSONCANVAS_COMMAND_PATH)) { | 85 else if (!strcmp(name, SKJSONCANVAS_COMMAND_PATH)) { |
| 73 this->processPath(command, target); | 86 this->processPath(command, target); |
| 74 } | 87 } |
| 75 else if (!strcmp(name, SKJSONCANVAS_COMMAND_TEXT)) { | 88 else if (!strcmp(name, SKJSONCANVAS_COMMAND_TEXT)) { |
| 76 this->processText(command, target); | 89 this->processText(command, target); |
| 77 } | 90 } |
| 91 else if (!strcmp(name, SKJSONCANVAS_COMMAND_POSTEXT)) { |
| 92 this->processPosText(command, target); |
| 93 } |
| 78 else if (!strcmp(name, SKJSONCANVAS_COMMAND_POINTS)) { | 94 else if (!strcmp(name, SKJSONCANVAS_COMMAND_POINTS)) { |
| 79 this->processPoints(command, target); | 95 this->processPoints(command, target); |
| 80 } | 96 } |
| 81 else if (!strcmp(name, SKJSONCANVAS_COMMAND_CLIPRECT)) { | 97 else if (!strcmp(name, SKJSONCANVAS_COMMAND_CLIPRECT)) { |
| 82 this->processClipRect(command, target); | 98 this->processClipRect(command, target); |
| 83 } | 99 } |
| 100 else if (!strcmp(name, SKJSONCANVAS_COMMAND_CLIPRRECT)) { |
| 101 this->processClipRRect(command, target); |
| 102 } |
| 103 else if (!strcmp(name, SKJSONCANVAS_COMMAND_CLIPPATH)) { |
| 104 this->processClipPath(command, target); |
| 105 } |
| 84 else { | 106 else { |
| 85 SkDebugf("unsupported JSON command: %s\n", name); | 107 SkDebugf("unsupported JSON command: %s\n", name); |
| 86 } | 108 } |
| 87 } | 109 } |
| 88 | 110 |
| 89 void Renderer::getPaint(Json::Value& command, SkPaint* result) { | 111 void Renderer::getPaint(Json::Value& command, SkPaint* result) { |
| 90 Json::Value jsonPaint = command[SKJSONCANVAS_ATTRIBUTE_PAINT]; | 112 Json::Value jsonPaint = command[SKJSONCANVAS_ATTRIBUTE_PAINT]; |
| 91 if (jsonPaint.isMember(SKJSONCANVAS_ATTRIBUTE_COLOR)) { | 113 if (jsonPaint.isMember(SKJSONCANVAS_ATTRIBUTE_COLOR)) { |
| 92 Json::Value color = jsonPaint[SKJSONCANVAS_ATTRIBUTE_COLOR]; | 114 Json::Value color = jsonPaint[SKJSONCANVAS_ATTRIBUTE_COLOR]; |
| 93 result->setColor(SkColorSetARGB(color[0].asInt(), color[1].asInt(), colo
r[2].asInt(), | 115 result->setColor(SkColorSetARGB(color[0].asInt(), color[1].asInt(), colo
r[2].asInt(), |
| (...skipping 11 matching lines...) Expand all Loading... |
| 105 result->setStyle(SkPaint::kStrokeAndFill_Style); | 127 result->setStyle(SkPaint::kStrokeAndFill_Style); |
| 106 } | 128 } |
| 107 } | 129 } |
| 108 if (jsonPaint.isMember(SKJSONCANVAS_ATTRIBUTE_STROKEWIDTH)) { | 130 if (jsonPaint.isMember(SKJSONCANVAS_ATTRIBUTE_STROKEWIDTH)) { |
| 109 float strokeWidth = jsonPaint[SKJSONCANVAS_ATTRIBUTE_STROKEWIDTH].asFloa
t(); | 131 float strokeWidth = jsonPaint[SKJSONCANVAS_ATTRIBUTE_STROKEWIDTH].asFloa
t(); |
| 110 result->setStrokeWidth(strokeWidth); | 132 result->setStrokeWidth(strokeWidth); |
| 111 } | 133 } |
| 112 if (jsonPaint.isMember(SKJSONCANVAS_ATTRIBUTE_ANTIALIAS)) { | 134 if (jsonPaint.isMember(SKJSONCANVAS_ATTRIBUTE_ANTIALIAS)) { |
| 113 result->setAntiAlias(jsonPaint[SKJSONCANVAS_ATTRIBUTE_ANTIALIAS].asBool(
)); | 135 result->setAntiAlias(jsonPaint[SKJSONCANVAS_ATTRIBUTE_ANTIALIAS].asBool(
)); |
| 114 } | 136 } |
| 137 if (jsonPaint.isMember(SKJSONCANVAS_ATTRIBUTE_BLUR)) { |
| 138 Json::Value blur = jsonPaint[SKJSONCANVAS_ATTRIBUTE_BLUR]; |
| 139 SkScalar sigma = blur[SKJSONCANVAS_ATTRIBUTE_SIGMA].asFloat(); |
| 140 SkBlurStyle style; |
| 141 const char* jsonStyle = blur[SKJSONCANVAS_ATTRIBUTE_STYLE].asCString(); |
| 142 if (!strcmp(jsonStyle, SKJSONCANVAS_BLURSTYLE_NORMAL)) { |
| 143 style = SkBlurStyle::kNormal_SkBlurStyle; |
| 144 } |
| 145 else if (!strcmp(jsonStyle, SKJSONCANVAS_BLURSTYLE_SOLID)) { |
| 146 style = SkBlurStyle::kSolid_SkBlurStyle; |
| 147 } |
| 148 else if (!strcmp(jsonStyle, SKJSONCANVAS_BLURSTYLE_OUTER)) { |
| 149 style = SkBlurStyle::kOuter_SkBlurStyle; |
| 150 } |
| 151 else if (!strcmp(jsonStyle, SKJSONCANVAS_BLURSTYLE_INNER)) { |
| 152 style = SkBlurStyle::kInner_SkBlurStyle; |
| 153 } |
| 154 else { |
| 155 SkASSERT(false); |
| 156 style = SkBlurStyle::kNormal_SkBlurStyle; |
| 157 } |
| 158 SkBlurMaskFilter::BlurFlags flags; |
| 159 const char* jsonQuality = blur[SKJSONCANVAS_ATTRIBUTE_QUALITY].asCString
(); |
| 160 if (!strcmp(jsonQuality, SKJSONCANVAS_BLURQUALITY_LOW)) { |
| 161 flags = SkBlurMaskFilter::BlurFlags::kNone_BlurFlag; |
| 162 } |
| 163 else if (!strcmp(jsonQuality, SKJSONCANVAS_BLURQUALITY_HIGH)) { |
| 164 flags = SkBlurMaskFilter::BlurFlags::kHighQuality_BlurFlag; |
| 165 } |
| 166 else { |
| 167 SkASSERT(false); |
| 168 flags = SkBlurMaskFilter::BlurFlags::kNone_BlurFlag; |
| 169 } |
| 170 result->setMaskFilter(SkBlurMaskFilter::Create(style, sigma, flags)); |
| 171 } |
| 172 if (jsonPaint.isMember(SKJSONCANVAS_ATTRIBUTE_DASHING)) { |
| 173 Json::Value dash = jsonPaint[SKJSONCANVAS_ATTRIBUTE_DASHING]; |
| 174 Json::Value jsonIntervals = dash[SKJSONCANVAS_ATTRIBUTE_INTERVALS]; |
| 175 Json::ArrayIndex count = jsonIntervals.size(); |
| 176 SkScalar* intervals = (SkScalar*) sk_malloc_throw(count * sizeof(SkScala
r)); |
| 177 for (Json::ArrayIndex i = 0; i < count; i++) { |
| 178 intervals[i] = jsonIntervals[i].asFloat(); |
| 179 } |
| 180 SkScalar phase = dash[SKJSONCANVAS_ATTRIBUTE_PHASE].asFloat(); |
| 181 result->setPathEffect(SkDashPathEffect::Create(intervals, count, phase))
; |
| 182 free(intervals); |
| 183 } |
| 184 if (jsonPaint.isMember(SKJSONCANVAS_ATTRIBUTE_TEXTALIGN)) { |
| 185 SkPaint::Align textAlign; |
| 186 const char* jsonAlign = jsonPaint[SKJSONCANVAS_ATTRIBUTE_TEXTALIGN].asCS
tring(); |
| 187 if (!strcmp(jsonAlign, SKJSONCANVAS_ALIGN_LEFT)) { |
| 188 textAlign = SkPaint::kLeft_Align; |
| 189 } |
| 190 else if (!strcmp(jsonAlign, SKJSONCANVAS_ALIGN_CENTER)) { |
| 191 textAlign = SkPaint::kCenter_Align; |
| 192 } |
| 193 else if (!strcmp(jsonAlign, SKJSONCANVAS_ALIGN_RIGHT)) { |
| 194 textAlign = SkPaint::kRight_Align; |
| 195 } |
| 196 else { |
| 197 SkASSERT(false); |
| 198 textAlign = SkPaint::kLeft_Align; |
| 199 } |
| 200 } |
| 201 if (jsonPaint.isMember(SKJSONCANVAS_ATTRIBUTE_TEXTSIZE)) { |
| 202 float textSize = jsonPaint[SKJSONCANVAS_ATTRIBUTE_TEXTSIZE].asFloat(); |
| 203 result->setTextSize(textSize); |
| 204 } |
| 205 if (jsonPaint.isMember(SKJSONCANVAS_ATTRIBUTE_TEXTSCALEX)) { |
| 206 float textScaleX = jsonPaint[SKJSONCANVAS_ATTRIBUTE_TEXTSCALEX].asFloat(
); |
| 207 result->setTextScaleX(textScaleX); |
| 208 } |
| 209 if (jsonPaint.isMember(SKJSONCANVAS_ATTRIBUTE_TEXTSKEWX)) { |
| 210 float textSkewX = jsonPaint[SKJSONCANVAS_ATTRIBUTE_TEXTSKEWX].asFloat(); |
| 211 result->setTextSkewX(textSkewX); |
| 212 } |
| 115 } | 213 } |
| 116 | 214 |
| 117 void Renderer::getRect(Json::Value& command, const char* name, SkRect* result) { | 215 void Renderer::getRect(Json::Value& command, const char* name, SkRect* result) { |
| 118 Json::Value rect = command[name]; | 216 Json::Value rect = command[name]; |
| 119 result->set(rect[0].asFloat(), rect[1].asFloat(), rect[2].asFloat(), rect[3]
.asFloat()); | 217 result->set(rect[0].asFloat(), rect[1].asFloat(), rect[2].asFloat(), rect[3]
.asFloat()); |
| 120 } | 218 } |
| 121 | 219 |
| 122 void Renderer::getRRect(Json::Value& command, const char* name, SkRRect* result)
{ | 220 void Renderer::getRRect(Json::Value& command, const char* name, SkRRect* result)
{ |
| 123 Json::Value rrect = command[name]; | 221 Json::Value rrect = command[name]; |
| 124 SkVector radii[4] = { | 222 SkVector radii[4] = { |
| 125 { rrect[1][0].asFloat(), rrect[1][1].asFloat() }, | 223 { rrect[1][0].asFloat(), rrect[1][1].asFloat() }, |
| 126 { rrect[2][0].asFloat(), rrect[2][1].asFloat() }, | 224 { rrect[2][0].asFloat(), rrect[2][1].asFloat() }, |
| 127 { rrect[3][0].asFloat(), rrect[3][1].asFloat() }, | 225 { rrect[3][0].asFloat(), rrect[3][1].asFloat() }, |
| 128 { rrect[4][0].asFloat(), rrect[4][1].asFloat() } | 226 { rrect[4][0].asFloat(), rrect[4][1].asFloat() } |
| 129 }; | 227 }; |
| 130 result->setRectRadii(SkRect::MakeLTRB(rrect[0][0].asFloat(), rrect[0][1].asF
loat(), | 228 result->setRectRadii(SkRect::MakeLTRB(rrect[0][0].asFloat(), rrect[0][1].asF
loat(), |
| 131 rrect[0][2].asFloat(), rrect[0][3].asF
loat()), | 229 rrect[0][2].asFloat(), rrect[0][3].asF
loat()), |
| 132 radii); | 230 radii); |
| 133 } | 231 } |
| 134 | 232 |
| 233 void Renderer::getPath(Json::Value& command, SkPath* result) { |
| 234 Json::Value path = command[SKJSONCANVAS_ATTRIBUTE_PATH]; |
| 235 const char* fillType = path[SKJSONCANVAS_ATTRIBUTE_FILLTYPE].asCString(); |
| 236 if (!strcmp(fillType, SKJSONCANVAS_FILLTYPE_WINDING)) { |
| 237 result->setFillType(SkPath::kWinding_FillType); |
| 238 } |
| 239 else if (!strcmp(fillType, SKJSONCANVAS_FILLTYPE_EVENODD)) { |
| 240 result->setFillType(SkPath::kEvenOdd_FillType); |
| 241 } |
| 242 else if (!strcmp(fillType, SKJSONCANVAS_FILLTYPE_INVERSEWINDING)) { |
| 243 result->setFillType(SkPath::kInverseWinding_FillType); |
| 244 } |
| 245 else if (!strcmp(fillType, SKJSONCANVAS_FILLTYPE_INVERSEEVENODD)) { |
| 246 result->setFillType(SkPath::kInverseEvenOdd_FillType); |
| 247 } |
| 248 Json::Value verbs = path[SKJSONCANVAS_ATTRIBUTE_VERBS]; |
| 249 for (Json::ArrayIndex i = 0; i < verbs.size(); i++) { |
| 250 Json::Value verb = verbs[i]; |
| 251 if (verb.isString()) { |
| 252 SkASSERT(!strcmp(verb.asCString(), SKJSONCANVAS_VERB_CLOSE)); |
| 253 result->close(); |
| 254 } |
| 255 else { |
| 256 if (verb.isMember(SKJSONCANVAS_VERB_MOVE)) { |
| 257 Json::Value move = verb[SKJSONCANVAS_VERB_MOVE]; |
| 258 result->moveTo(move[0].asFloat(), move[1].asFloat()); |
| 259 } |
| 260 else if (verb.isMember(SKJSONCANVAS_VERB_LINE)) { |
| 261 Json::Value line = verb[SKJSONCANVAS_VERB_LINE]; |
| 262 result->lineTo(line[0].asFloat(), line[1].asFloat()); |
| 263 } |
| 264 else if (verb.isMember(SKJSONCANVAS_VERB_QUAD)) { |
| 265 Json::Value quad = verb[SKJSONCANVAS_VERB_QUAD]; |
| 266 result->quadTo(quad[0][0].asFloat(), quad[0][1].asFloat(), |
| 267 quad[1][0].asFloat(), quad[1][1].asFloat()); |
| 268 } |
| 269 else if (verb.isMember(SKJSONCANVAS_VERB_CUBIC)) { |
| 270 Json::Value cubic = verb[SKJSONCANVAS_VERB_CUBIC]; |
| 271 result->cubicTo(cubic[0][0].asFloat(), cubic[0][1].asFloat(), |
| 272 cubic[1][0].asFloat(), cubic[1][1].asFloat(), |
| 273 cubic[2][0].asFloat(), cubic[2][1].asFloat()); |
| 274 } |
| 275 else if (verb.isMember(SKJSONCANVAS_VERB_CONIC)) { |
| 276 Json::Value conic = verb[SKJSONCANVAS_VERB_CONIC]; |
| 277 result->conicTo(conic[0][0].asFloat(), conic[0][1].asFloat(), |
| 278 conic[1][0].asFloat(), conic[1][1].asFloat(), |
| 279 conic[2].asFloat()); |
| 280 } |
| 281 else { |
| 282 SkASSERT(false); |
| 283 } |
| 284 } |
| 285 } |
| 286 } |
| 287 |
| 288 SkRegion::Op Renderer::getRegionOp(Json::Value& command) { |
| 289 const char* op = command[SKJSONCANVAS_ATTRIBUTE_REGIONOP].asCString(); |
| 290 if (!strcmp(op, SKJSONCANVAS_REGIONOP_DIFFERENCE)) { |
| 291 return SkRegion::kDifference_Op; |
| 292 } |
| 293 else if (!strcmp(op, SKJSONCANVAS_REGIONOP_INTERSECT)) { |
| 294 return SkRegion::kIntersect_Op; |
| 295 } |
| 296 else if (!strcmp(op, SKJSONCANVAS_REGIONOP_UNION)) { |
| 297 return SkRegion::kUnion_Op; |
| 298 } |
| 299 else if (!strcmp(op, SKJSONCANVAS_REGIONOP_XOR)) { |
| 300 return SkRegion::kXOR_Op; |
| 301 } |
| 302 else if (!strcmp(op, SKJSONCANVAS_REGIONOP_REVERSE_DIFFERENCE)) { |
| 303 return SkRegion::kReverseDifference_Op; |
| 304 } |
| 305 else if (!strcmp(op, SKJSONCANVAS_REGIONOP_REPLACE)) { |
| 306 return SkRegion::kReplace_Op; |
| 307 } |
| 308 SkASSERT(false); |
| 309 return SkRegion::kIntersect_Op; |
| 310 } |
| 311 |
| 135 void Renderer::processMatrix(Json::Value& command, SkCanvas* target) { | 312 void Renderer::processMatrix(Json::Value& command, SkCanvas* target) { |
| 136 Json::Value jsonMatrix = command[SKJSONCANVAS_ATTRIBUTE_MATRIX]; | 313 Json::Value jsonMatrix = command[SKJSONCANVAS_ATTRIBUTE_MATRIX]; |
| 137 SkMatrix matrix; | 314 SkMatrix matrix; |
| 138 SkScalar values[] = { | 315 SkScalar values[] = { |
| 139 jsonMatrix[0][0].asFloat(), jsonMatrix[0][1].asFloat(), jsonMatrix[0][2]
.asFloat(), | 316 jsonMatrix[0][0].asFloat(), jsonMatrix[0][1].asFloat(), jsonMatrix[0][2]
.asFloat(), |
| 140 jsonMatrix[1][0].asFloat(), jsonMatrix[1][1].asFloat(), jsonMatrix[1][2]
.asFloat(), | 317 jsonMatrix[1][0].asFloat(), jsonMatrix[1][1].asFloat(), jsonMatrix[1][2]
.asFloat(), |
| 141 jsonMatrix[2][0].asFloat(), jsonMatrix[2][1].asFloat(), jsonMatrix[2][2]
.asFloat() | 318 jsonMatrix[2][0].asFloat(), jsonMatrix[2][1].asFloat(), jsonMatrix[2][2]
.asFloat() |
| 142 }; | 319 }; |
| 143 matrix.set9(values); | 320 matrix.set9(values); |
| 144 target->setMatrix(matrix); | 321 target->setMatrix(matrix); |
| (...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 178 SkRect rect; | 355 SkRect rect; |
| 179 this->getRect(command, SKJSONCANVAS_ATTRIBUTE_COORDS, &rect); | 356 this->getRect(command, SKJSONCANVAS_ATTRIBUTE_COORDS, &rect); |
| 180 SkPaint paint; | 357 SkPaint paint; |
| 181 this->getPaint(command, &paint); | 358 this->getPaint(command, &paint); |
| 182 target->drawOval(rect, paint); | 359 target->drawOval(rect, paint); |
| 183 } | 360 } |
| 184 | 361 |
| 185 void Renderer::processPath(Json::Value& command, SkCanvas* target) { | 362 void Renderer::processPath(Json::Value& command, SkCanvas* target) { |
| 186 Json::Value jsonPath = command[SKJSONCANVAS_ATTRIBUTE_PATH]; | 363 Json::Value jsonPath = command[SKJSONCANVAS_ATTRIBUTE_PATH]; |
| 187 SkPath path; | 364 SkPath path; |
| 188 for (Json::ArrayIndex i = 0; i < jsonPath.size(); i++) { | 365 this->getPath(command, &path); |
| 189 Json::Value verb = jsonPath[i]; | |
| 190 if (verb.isString()) { | |
| 191 SkASSERT(!strcmp(verb.asCString(), SKJSONCANVAS_VERB_CLOSE)); | |
| 192 path.close(); | |
| 193 } | |
| 194 else { | |
| 195 if (verb.isMember(SKJSONCANVAS_VERB_MOVE)) { | |
| 196 Json::Value move = verb[SKJSONCANVAS_VERB_MOVE]; | |
| 197 path.moveTo(move[0].asFloat(), move[1].asFloat()); | |
| 198 } | |
| 199 else if (verb.isMember(SKJSONCANVAS_VERB_LINE)) { | |
| 200 Json::Value line = verb[SKJSONCANVAS_VERB_LINE]; | |
| 201 path.lineTo(line[0].asFloat(), line[1].asFloat()); | |
| 202 } | |
| 203 else if (verb.isMember(SKJSONCANVAS_VERB_QUAD)) { | |
| 204 Json::Value quad = verb[SKJSONCANVAS_VERB_QUAD]; | |
| 205 path.quadTo(quad[0][0].asFloat(), quad[0][1].asFloat(), | |
| 206 quad[1][0].asFloat(), quad[1][1].asFloat()); | |
| 207 } | |
| 208 else if (verb.isMember(SKJSONCANVAS_VERB_CUBIC)) { | |
| 209 Json::Value cubic = verb[SKJSONCANVAS_VERB_CUBIC]; | |
| 210 path.cubicTo(cubic[0][0].asFloat(), cubic[0][1].asFloat(), | |
| 211 cubic[1][0].asFloat(), cubic[1][1].asFloat(), | |
| 212 cubic[2][0].asFloat(), cubic[2][1].asFloat()); | |
| 213 } | |
| 214 else if (verb.isMember(SKJSONCANVAS_VERB_CONIC)) { | |
| 215 Json::Value conic = verb[SKJSONCANVAS_VERB_CONIC]; | |
| 216 path.conicTo(conic[0][0].asFloat(), conic[0][1].asFloat(), | |
| 217 conic[1][0].asFloat(), conic[1][1].asFloat(), | |
| 218 conic[2].asFloat()); | |
| 219 } | |
| 220 else { | |
| 221 SkASSERT(false); | |
| 222 } | |
| 223 } | |
| 224 } | |
| 225 SkPaint paint; | 366 SkPaint paint; |
| 226 this->getPaint(command, &paint); | 367 this->getPaint(command, &paint); |
| 227 target->drawPath(path, paint); | 368 target->drawPath(path, paint); |
| 228 } | 369 } |
| 229 | 370 |
| 230 void Renderer::processText(Json::Value& command, SkCanvas* target) { | 371 void Renderer::processText(Json::Value& command, SkCanvas* target) { |
| 231 const char* text = command[SKJSONCANVAS_ATTRIBUTE_TEXT].asCString(); | 372 const char* text = command[SKJSONCANVAS_ATTRIBUTE_TEXT].asCString(); |
| 232 SkPaint paint; | 373 SkPaint paint; |
| 233 this->getPaint(command, &paint); | 374 this->getPaint(command, &paint); |
| 234 Json::Value coords = command[SKJSONCANVAS_ATTRIBUTE_COORDS]; | 375 Json::Value coords = command[SKJSONCANVAS_ATTRIBUTE_COORDS]; |
| 235 target->drawText(text, strlen(text), coords[0].asFloat(), coords[1].asFloat(
), paint); | 376 target->drawText(text, strlen(text), coords[0].asFloat(), coords[1].asFloat(
), paint); |
| 236 } | 377 } |
| 237 | 378 |
| 379 void Renderer::processPosText(Json::Value& command, SkCanvas* target) { |
| 380 const char* text = command[SKJSONCANVAS_ATTRIBUTE_TEXT].asCString(); |
| 381 SkPaint paint; |
| 382 this->getPaint(command, &paint); |
| 383 Json::Value coords = command[SKJSONCANVAS_ATTRIBUTE_COORDS]; |
| 384 int count = (int) coords.size(); |
| 385 SkPoint* points = (SkPoint*) sk_malloc_throw(count * sizeof(SkPoint)); |
| 386 for (int i = 0; i < count; i++) { |
| 387 points[i] = SkPoint::Make(coords[i][0].asFloat(), coords[i][1].asFloat()
); |
| 388 } |
| 389 target->drawPosText(text, strlen(text), points, paint); |
| 390 free(points); |
| 391 } |
| 392 |
| 238 void Renderer::processPoints(Json::Value& command, SkCanvas* target) { | 393 void Renderer::processPoints(Json::Value& command, SkCanvas* target) { |
| 239 SkCanvas::PointMode mode; | 394 SkCanvas::PointMode mode; |
| 240 const char* jsonMode = command[SKJSONCANVAS_ATTRIBUTE_MODE].asCString(); | 395 const char* jsonMode = command[SKJSONCANVAS_ATTRIBUTE_MODE].asCString(); |
| 241 if (!strcmp(jsonMode, SKJSONCANVAS_POINTMODE_POINTS)) { | 396 if (!strcmp(jsonMode, SKJSONCANVAS_POINTMODE_POINTS)) { |
| 242 mode = SkCanvas::kPoints_PointMode; | 397 mode = SkCanvas::kPoints_PointMode; |
| 243 } | 398 } |
| 244 else if (!strcmp(jsonMode, SKJSONCANVAS_POINTMODE_LINES)) { | 399 else if (!strcmp(jsonMode, SKJSONCANVAS_POINTMODE_LINES)) { |
| 245 mode = SkCanvas::kLines_PointMode; | 400 mode = SkCanvas::kLines_PointMode; |
| 246 } | 401 } |
| 247 else if (!strcmp(jsonMode, SKJSONCANVAS_POINTMODE_POLYGON)) { | 402 else if (!strcmp(jsonMode, SKJSONCANVAS_POINTMODE_POLYGON)) { |
| (...skipping 11 matching lines...) Expand all Loading... |
| 259 } | 414 } |
| 260 SkPaint paint; | 415 SkPaint paint; |
| 261 this->getPaint(command, &paint); | 416 this->getPaint(command, &paint); |
| 262 target->drawPoints(mode, count, points, paint); | 417 target->drawPoints(mode, count, points, paint); |
| 263 free(points); | 418 free(points); |
| 264 } | 419 } |
| 265 | 420 |
| 266 void Renderer::processClipRect(Json::Value& command, SkCanvas* target) { | 421 void Renderer::processClipRect(Json::Value& command, SkCanvas* target) { |
| 267 SkRect rect; | 422 SkRect rect; |
| 268 this->getRect(command, SKJSONCANVAS_ATTRIBUTE_COORDS, &rect); | 423 this->getRect(command, SKJSONCANVAS_ATTRIBUTE_COORDS, &rect); |
| 269 target->clipRect(rect); | 424 target->clipRect(rect, this->getRegionOp(command), |
| 425 command[SKJSONCANVAS_ATTRIBUTE_ANTIALIAS].asBool()); |
| 426 } |
| 427 |
| 428 void Renderer::processClipRRect(Json::Value& command, SkCanvas* target) { |
| 429 SkRRect rrect; |
| 430 this->getRRect(command, SKJSONCANVAS_ATTRIBUTE_COORDS, &rrect); |
| 431 target->clipRRect(rrect, this->getRegionOp(command), |
| 432 command[SKJSONCANVAS_ATTRIBUTE_ANTIALIAS].asBool()); |
| 433 } |
| 434 |
| 435 void Renderer::processClipPath(Json::Value& command, SkCanvas* target) { |
| 436 SkPath path; |
| 437 this->getPath(command, &path); |
| 438 target->clipPath(path, this->getRegionOp(command), |
| 439 command[SKJSONCANVAS_ATTRIBUTE_ANTIALIAS].asBool()); |
| 270 } | 440 } |
| 271 | 441 |
| 272 void render(const char* json, SkCanvas* target) { | 442 void render(const char* json, SkCanvas* target) { |
| 273 Renderer renderer; | 443 Renderer renderer; |
| 274 Json::Reader reader; | 444 Json::Reader reader; |
| 275 Json::Value root; | 445 Json::Value root; |
| 276 if (reader.parse(std::string(json), root)) { | 446 if (reader.parse(std::string(json), root)) { |
| 277 SkASSERT(root[SKJSONCANVAS_VERSION].asInt() == 1); | 447 SkASSERT(root[SKJSONCANVAS_VERSION].asInt() == 1); |
| 278 Json::Value commands = root[SKJSONCANVAS_COMMANDS]; | 448 Json::Value commands = root[SKJSONCANVAS_COMMANDS]; |
| 279 for (Json::ArrayIndex i = 0; i < commands.size(); i++) { | 449 for (Json::ArrayIndex i = 0; i < commands.size(); i++) { |
| 280 renderer.processCommand(commands[i], target); | 450 renderer.processCommand(commands[i], target); |
| 281 } | 451 } |
| 282 } | 452 } |
| 283 else { | 453 else { |
| 284 SkDebugf(json); | 454 SkDebugf(json); |
| 285 SkFAIL("json parse failure"); | 455 SkFAIL("json parse failure"); |
| 286 } | 456 } |
| 287 } | 457 } |
| 288 | 458 |
| 289 } // namespace | 459 } // namespace |
| OLD | NEW |