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 | 9 |
10 #include "SkBlurMaskFilter.h" | 10 #include "SkBlurMaskFilter.h" |
11 #include "SkDashPathEffect.h" | 11 #include "SkDashPathEffect.h" |
12 #include "SkJSONCanvas.h" | 12 #include "SkJSONCanvas.h" |
13 #include "SkJSONCPP.h" | 13 #include "SkJSONCPP.h" |
14 #include "SkPath.h" | 14 #include "SkPath.h" |
15 #include "SkValidatingReadBuffer.h" | 15 #include "SkValidatingReadBuffer.h" |
16 | 16 |
17 namespace SkJSONRenderer { | 17 namespace SkJSONRenderer { |
18 | 18 |
19 class Renderer { | 19 class Renderer { |
20 public: | 20 public: |
21 void getPaint(Json::Value& command, SkPaint* paint); | 21 void getPaint(Json::Value& paint, SkPaint* result); |
22 | 22 |
23 void getRect(Json::Value& command, const char* name, SkRect* rect); | 23 void getRect(Json::Value& rect, SkRect* result); |
24 | 24 |
25 void getRRect(Json::Value& command, const char* name, SkRRect* rrect); | 25 void getRRect(Json::Value& rrect, SkRRect* result); |
26 | 26 |
27 void getPath(Json::Value& command, SkPath* path); | 27 void getPath(Json::Value& path, SkPath* result); |
28 | 28 |
29 SkRegion::Op getRegionOp(Json::Value& command); | 29 void getMatrix(Json::Value& matrix, SkMatrix* result); |
| 30 |
| 31 SkRegion::Op getRegionOp(Json::Value& op); |
30 | 32 |
31 void processCommand(Json::Value& command, SkCanvas* target); | 33 void processCommand(Json::Value& command, SkCanvas* target); |
32 | 34 |
| 35 void processTranslate(Json::Value& command, SkCanvas* target); |
| 36 |
| 37 void processScale(Json::Value& command, SkCanvas* target); |
| 38 |
33 void processMatrix(Json::Value& command, SkCanvas* target); | 39 void processMatrix(Json::Value& command, SkCanvas* target); |
34 | 40 |
35 void processSave(Json::Value& command, SkCanvas* target); | 41 void processSave(Json::Value& command, SkCanvas* target); |
36 | 42 |
37 void processRestore(Json::Value& command, SkCanvas* target); | 43 void processRestore(Json::Value& command, SkCanvas* target); |
38 | 44 |
39 void processSaveLayer(Json::Value& command, SkCanvas* target); | 45 void processSaveLayer(Json::Value& command, SkCanvas* target); |
40 | 46 |
41 void processPaint(Json::Value& command, SkCanvas* target); | 47 void processPaint(Json::Value& command, SkCanvas* target); |
42 | 48 |
43 void processRect(Json::Value& command, SkCanvas* target); | 49 void processRect(Json::Value& command, SkCanvas* target); |
44 | 50 |
45 void processRRect(Json::Value& command, SkCanvas* target); | 51 void processRRect(Json::Value& command, SkCanvas* target); |
46 | 52 |
47 void processOval(Json::Value& command, SkCanvas* target); | 53 void processOval(Json::Value& command, SkCanvas* target); |
48 | 54 |
49 void processPath(Json::Value& command, SkCanvas* target); | 55 void processPath(Json::Value& command, SkCanvas* target); |
50 | 56 |
51 void processText(Json::Value& command, SkCanvas* target); | 57 void processText(Json::Value& command, SkCanvas* target); |
52 | 58 |
53 void processPosText(Json::Value& command, SkCanvas* target); | 59 void processPosText(Json::Value& command, SkCanvas* target); |
54 | 60 |
| 61 void processTextOnPath(Json::Value& command, SkCanvas* target); |
| 62 |
55 void processPoints(Json::Value& command, SkCanvas* target); | 63 void processPoints(Json::Value& command, SkCanvas* target); |
56 | 64 |
57 void processImage(Json::Value& command, SkCanvas* target); | 65 void processImage(Json::Value& command, SkCanvas* target); |
58 | 66 |
59 void processImageRect(Json::Value& command, SkCanvas* target); | 67 void processImageRect(Json::Value& command, SkCanvas* target); |
60 | 68 |
61 void processBitmap(Json::Value& command, SkCanvas* target); | 69 void processBitmap(Json::Value& command, SkCanvas* target); |
62 | 70 |
63 void processBitmapRect(Json::Value& command, SkCanvas* target); | 71 void processBitmapRect(Json::Value& command, SkCanvas* target); |
64 | 72 |
65 void processClipRect(Json::Value& command, SkCanvas* target); | 73 void processClipRect(Json::Value& command, SkCanvas* target); |
66 | 74 |
67 void processClipRRect(Json::Value& command, SkCanvas* target); | 75 void processClipRRect(Json::Value& command, SkCanvas* target); |
68 | 76 |
69 void processClipPath(Json::Value& command, SkCanvas* target); | 77 void processClipPath(Json::Value& command, SkCanvas* target); |
70 }; | 78 }; |
71 | 79 |
72 void Renderer::processCommand(Json::Value& command, SkCanvas* target) { | 80 void Renderer::processCommand(Json::Value& command, SkCanvas* target) { |
73 const char* name = command[SKJSONCANVAS_COMMAND].asCString(); | 81 const char* name = command[SKJSONCANVAS_COMMAND].asCString(); |
74 // TODO speed this up with a hash | 82 // TODO speed this up with a hash |
75 if (!strcmp(name, SKJSONCANVAS_COMMAND_MATRIX)) { | 83 if (!strcmp(name, SKJSONCANVAS_COMMAND_TRANSLATE)) { |
| 84 this->processTranslate(command, target); |
| 85 } |
| 86 else if (!strcmp(name, SKJSONCANVAS_COMMAND_SCALE)) { |
| 87 this->processScale(command, target); |
| 88 } |
| 89 else if (!strcmp(name, SKJSONCANVAS_COMMAND_MATRIX)) { |
76 this->processMatrix(command, target); | 90 this->processMatrix(command, target); |
77 } | 91 } |
78 else if (!strcmp(name, SKJSONCANVAS_COMMAND_SAVE)) { | 92 else if (!strcmp(name, SKJSONCANVAS_COMMAND_SAVE)) { |
79 this->processSave(command, target); | 93 this->processSave(command, target); |
80 } | 94 } |
81 else if (!strcmp(name, SKJSONCANVAS_COMMAND_RESTORE)) { | 95 else if (!strcmp(name, SKJSONCANVAS_COMMAND_RESTORE)) { |
82 this->processRestore(command, target); | 96 this->processRestore(command, target); |
83 } | 97 } |
84 else if (!strcmp(name, SKJSONCANVAS_COMMAND_SAVELAYER)) { | 98 else if (!strcmp(name, SKJSONCANVAS_COMMAND_SAVELAYER)) { |
85 this->processSaveLayer(command, target); | 99 this->processSaveLayer(command, target); |
(...skipping 12 matching lines...) Expand all Loading... |
98 } | 112 } |
99 else if (!strcmp(name, SKJSONCANVAS_COMMAND_PATH)) { | 113 else if (!strcmp(name, SKJSONCANVAS_COMMAND_PATH)) { |
100 this->processPath(command, target); | 114 this->processPath(command, target); |
101 } | 115 } |
102 else if (!strcmp(name, SKJSONCANVAS_COMMAND_TEXT)) { | 116 else if (!strcmp(name, SKJSONCANVAS_COMMAND_TEXT)) { |
103 this->processText(command, target); | 117 this->processText(command, target); |
104 } | 118 } |
105 else if (!strcmp(name, SKJSONCANVAS_COMMAND_POSTEXT)) { | 119 else if (!strcmp(name, SKJSONCANVAS_COMMAND_POSTEXT)) { |
106 this->processPosText(command, target); | 120 this->processPosText(command, target); |
107 } | 121 } |
| 122 else if (!strcmp(name, SKJSONCANVAS_COMMAND_TEXTONPATH)) { |
| 123 this->processTextOnPath(command, target); |
| 124 } |
108 else if (!strcmp(name, SKJSONCANVAS_COMMAND_POINTS)) { | 125 else if (!strcmp(name, SKJSONCANVAS_COMMAND_POINTS)) { |
109 this->processPoints(command, target); | 126 this->processPoints(command, target); |
110 } | 127 } |
111 else if (!strcmp(name, SKJSONCANVAS_COMMAND_IMAGE)) { | 128 else if (!strcmp(name, SKJSONCANVAS_COMMAND_IMAGE)) { |
112 this->processImage(command, target); | 129 this->processImage(command, target); |
113 } | 130 } |
114 else if (!strcmp(name, SKJSONCANVAS_COMMAND_IMAGERECT)) { | 131 else if (!strcmp(name, SKJSONCANVAS_COMMAND_IMAGERECT)) { |
115 this->processImageRect(command, target); | 132 this->processImageRect(command, target); |
116 } | 133 } |
117 else if (!strcmp(name, SKJSONCANVAS_COMMAND_BITMAP)) { | 134 else if (!strcmp(name, SKJSONCANVAS_COMMAND_BITMAP)) { |
(...skipping 329 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
447 } | 464 } |
448 } | 465 } |
449 | 466 |
450 static void apply_paint_textskewx(Json::Value& jsonPaint, SkPaint* target) { | 467 static void apply_paint_textskewx(Json::Value& jsonPaint, SkPaint* target) { |
451 if (jsonPaint.isMember(SKJSONCANVAS_ATTRIBUTE_TEXTSKEWX)) { | 468 if (jsonPaint.isMember(SKJSONCANVAS_ATTRIBUTE_TEXTSKEWX)) { |
452 float textSkewX = jsonPaint[SKJSONCANVAS_ATTRIBUTE_TEXTSKEWX].asFloat(); | 469 float textSkewX = jsonPaint[SKJSONCANVAS_ATTRIBUTE_TEXTSKEWX].asFloat(); |
453 target->setTextSkewX(textSkewX); | 470 target->setTextSkewX(textSkewX); |
454 } | 471 } |
455 } | 472 } |
456 | 473 |
457 void Renderer::getPaint(Json::Value& command, SkPaint* result) { | 474 void Renderer::getPaint(Json::Value& paint, SkPaint* result) { |
458 Json::Value jsonPaint = command[SKJSONCANVAS_ATTRIBUTE_PAINT]; | 475 apply_paint_color(paint, result); |
459 apply_paint_color(jsonPaint, result); | 476 apply_paint_shader(paint, result); |
460 apply_paint_shader(jsonPaint, result); | 477 apply_paint_patheffect(paint, result); |
461 apply_paint_patheffect(jsonPaint, result); | 478 apply_paint_maskfilter(paint, result); |
462 apply_paint_maskfilter(jsonPaint, result); | 479 apply_paint_xfermode(paint, result); |
463 apply_paint_xfermode(jsonPaint, result); | 480 apply_paint_imagefilter(paint, result); |
464 apply_paint_imagefilter(jsonPaint, result); | 481 apply_paint_style(paint, result); |
465 apply_paint_style(jsonPaint, result); | 482 apply_paint_strokewidth(paint, result); |
466 apply_paint_strokewidth(jsonPaint, result); | 483 apply_paint_strokemiter(paint, result); |
467 apply_paint_strokemiter(jsonPaint, result); | 484 apply_paint_cap(paint, result); |
468 apply_paint_cap(jsonPaint, result); | 485 apply_paint_antialias(paint, result); |
469 apply_paint_antialias(jsonPaint, result); | 486 apply_paint_blur(paint, result); |
470 apply_paint_blur(jsonPaint, result); | 487 apply_paint_dashing(paint, result); |
471 apply_paint_dashing(jsonPaint, result); | 488 apply_paint_textalign(paint, result); |
472 apply_paint_textalign(jsonPaint, result); | 489 apply_paint_textsize(paint, result); |
473 apply_paint_textsize(jsonPaint, result); | 490 apply_paint_textscalex(paint, result); |
474 apply_paint_textscalex(jsonPaint, result); | 491 apply_paint_textskewx(paint, result); |
475 apply_paint_textskewx(jsonPaint, result); | |
476 } | 492 } |
477 | 493 |
478 void Renderer::getRect(Json::Value& command, const char* name, SkRect* result) { | 494 void Renderer::getRect(Json::Value& rect, SkRect* result) { |
479 Json::Value rect = command[name]; | |
480 result->set(rect[0].asFloat(), rect[1].asFloat(), rect[2].asFloat(), rect[3]
.asFloat()); | 495 result->set(rect[0].asFloat(), rect[1].asFloat(), rect[2].asFloat(), rect[3]
.asFloat()); |
481 } | 496 } |
482 | 497 |
483 void Renderer::getRRect(Json::Value& command, const char* name, SkRRect* result)
{ | 498 void Renderer::getRRect(Json::Value& rrect, SkRRect* result) { |
484 Json::Value rrect = command[name]; | |
485 SkVector radii[4] = { | 499 SkVector radii[4] = { |
486 { rrect[1][0].asFloat(), rrect[1][1].asFloat() }, | 500 { rrect[1][0].asFloat(), rrect[1][1].asFloat() }, |
487 { rrect[2][0].asFloat(), rrect[2][1].asFloat() }, | 501 { rrect[2][0].asFloat(), rrect[2][1].asFloat() }, |
488 { rrect[3][0].asFloat(), rrect[3][1].asFloat() }, | 502 { rrect[3][0].asFloat(), rrect[3][1].asFloat() }, |
489 { rrect[4][0].asFloat(), rrect[4][1].asFloat() } | 503 { rrect[4][0].asFloat(), rrect[4][1].asFloat() } |
490 }; | 504 }; |
491 result->setRectRadii(SkRect::MakeLTRB(rrect[0][0].asFloat(), rrect[0][1].asF
loat(), | 505 result->setRectRadii(SkRect::MakeLTRB(rrect[0][0].asFloat(), rrect[0][1].asF
loat(), |
492 rrect[0][2].asFloat(), rrect[0][3].asF
loat()), | 506 rrect[0][2].asFloat(), rrect[0][3].asF
loat()), |
493 radii); | 507 radii); |
494 } | 508 } |
495 | 509 |
496 void Renderer::getPath(Json::Value& command, SkPath* result) { | 510 void Renderer::getMatrix(Json::Value& matrix, SkMatrix* result) { |
497 Json::Value path = command[SKJSONCANVAS_ATTRIBUTE_PATH]; | 511 SkScalar values[] = { |
| 512 matrix[0][0].asFloat(), matrix[0][1].asFloat(), matrix[0][2].asFloat(), |
| 513 matrix[1][0].asFloat(), matrix[1][1].asFloat(), matrix[1][2].asFloat(), |
| 514 matrix[2][0].asFloat(), matrix[2][1].asFloat(), matrix[2][2].asFloat() |
| 515 }; |
| 516 result->set9(values); |
| 517 } |
| 518 |
| 519 void Renderer::getPath(Json::Value& path, SkPath* result) { |
498 const char* fillType = path[SKJSONCANVAS_ATTRIBUTE_FILLTYPE].asCString(); | 520 const char* fillType = path[SKJSONCANVAS_ATTRIBUTE_FILLTYPE].asCString(); |
499 if (!strcmp(fillType, SKJSONCANVAS_FILLTYPE_WINDING)) { | 521 if (!strcmp(fillType, SKJSONCANVAS_FILLTYPE_WINDING)) { |
500 result->setFillType(SkPath::kWinding_FillType); | 522 result->setFillType(SkPath::kWinding_FillType); |
501 } | 523 } |
502 else if (!strcmp(fillType, SKJSONCANVAS_FILLTYPE_EVENODD)) { | 524 else if (!strcmp(fillType, SKJSONCANVAS_FILLTYPE_EVENODD)) { |
503 result->setFillType(SkPath::kEvenOdd_FillType); | 525 result->setFillType(SkPath::kEvenOdd_FillType); |
504 } | 526 } |
505 else if (!strcmp(fillType, SKJSONCANVAS_FILLTYPE_INVERSEWINDING)) { | 527 else if (!strcmp(fillType, SKJSONCANVAS_FILLTYPE_INVERSEWINDING)) { |
506 result->setFillType(SkPath::kInverseWinding_FillType); | 528 result->setFillType(SkPath::kInverseWinding_FillType); |
507 } | 529 } |
(...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
541 conic[1][0].asFloat(), conic[1][1].asFloat(), | 563 conic[1][0].asFloat(), conic[1][1].asFloat(), |
542 conic[2].asFloat()); | 564 conic[2].asFloat()); |
543 } | 565 } |
544 else { | 566 else { |
545 SkASSERT(false); | 567 SkASSERT(false); |
546 } | 568 } |
547 } | 569 } |
548 } | 570 } |
549 } | 571 } |
550 | 572 |
551 SkRegion::Op Renderer::getRegionOp(Json::Value& command) { | 573 SkRegion::Op Renderer::getRegionOp(Json::Value& jsonOp) { |
552 const char* op = command[SKJSONCANVAS_ATTRIBUTE_REGIONOP].asCString(); | 574 const char* op = jsonOp.asCString(); |
553 if (!strcmp(op, SKJSONCANVAS_REGIONOP_DIFFERENCE)) { | 575 if (!strcmp(op, SKJSONCANVAS_REGIONOP_DIFFERENCE)) { |
554 return SkRegion::kDifference_Op; | 576 return SkRegion::kDifference_Op; |
555 } | 577 } |
556 else if (!strcmp(op, SKJSONCANVAS_REGIONOP_INTERSECT)) { | 578 else if (!strcmp(op, SKJSONCANVAS_REGIONOP_INTERSECT)) { |
557 return SkRegion::kIntersect_Op; | 579 return SkRegion::kIntersect_Op; |
558 } | 580 } |
559 else if (!strcmp(op, SKJSONCANVAS_REGIONOP_UNION)) { | 581 else if (!strcmp(op, SKJSONCANVAS_REGIONOP_UNION)) { |
560 return SkRegion::kUnion_Op; | 582 return SkRegion::kUnion_Op; |
561 } | 583 } |
562 else if (!strcmp(op, SKJSONCANVAS_REGIONOP_XOR)) { | 584 else if (!strcmp(op, SKJSONCANVAS_REGIONOP_XOR)) { |
563 return SkRegion::kXOR_Op; | 585 return SkRegion::kXOR_Op; |
564 } | 586 } |
565 else if (!strcmp(op, SKJSONCANVAS_REGIONOP_REVERSE_DIFFERENCE)) { | 587 else if (!strcmp(op, SKJSONCANVAS_REGIONOP_REVERSE_DIFFERENCE)) { |
566 return SkRegion::kReverseDifference_Op; | 588 return SkRegion::kReverseDifference_Op; |
567 } | 589 } |
568 else if (!strcmp(op, SKJSONCANVAS_REGIONOP_REPLACE)) { | 590 else if (!strcmp(op, SKJSONCANVAS_REGIONOP_REPLACE)) { |
569 return SkRegion::kReplace_Op; | 591 return SkRegion::kReplace_Op; |
570 } | 592 } |
571 SkASSERT(false); | 593 SkASSERT(false); |
572 return SkRegion::kIntersect_Op; | 594 return SkRegion::kIntersect_Op; |
573 } | 595 } |
574 | 596 |
| 597 void Renderer::processTranslate(Json::Value& command, SkCanvas* target) { |
| 598 target->translate(command[SKJSONCANVAS_ATTRIBUTE_X].asFloat(), |
| 599 command[SKJSONCANVAS_ATTRIBUTE_Y].asFloat()); |
| 600 } |
| 601 |
| 602 void Renderer::processScale(Json::Value& command, SkCanvas* target) { |
| 603 target->scale(command[SKJSONCANVAS_ATTRIBUTE_X].asFloat(), |
| 604 command[SKJSONCANVAS_ATTRIBUTE_Y].asFloat()); |
| 605 } |
| 606 |
575 void Renderer::processMatrix(Json::Value& command, SkCanvas* target) { | 607 void Renderer::processMatrix(Json::Value& command, SkCanvas* target) { |
576 Json::Value jsonMatrix = command[SKJSONCANVAS_ATTRIBUTE_MATRIX]; | |
577 SkMatrix matrix; | 608 SkMatrix matrix; |
578 SkScalar values[] = { | 609 this->getMatrix(command[SKJSONCANVAS_ATTRIBUTE_MATRIX], &matrix); |
579 jsonMatrix[0][0].asFloat(), jsonMatrix[0][1].asFloat(), jsonMatrix[0][2]
.asFloat(), | |
580 jsonMatrix[1][0].asFloat(), jsonMatrix[1][1].asFloat(), jsonMatrix[1][2]
.asFloat(), | |
581 jsonMatrix[2][0].asFloat(), jsonMatrix[2][1].asFloat(), jsonMatrix[2][2]
.asFloat() | |
582 }; | |
583 matrix.set9(values); | |
584 target->setMatrix(matrix); | 610 target->setMatrix(matrix); |
585 } | 611 } |
586 | 612 |
587 void Renderer::processSave(Json::Value& command, SkCanvas* target) { | 613 void Renderer::processSave(Json::Value& command, SkCanvas* target) { |
588 target->save(); | 614 target->save(); |
589 } | 615 } |
590 | 616 |
591 void Renderer::processRestore(Json::Value& command, SkCanvas* target) { | 617 void Renderer::processRestore(Json::Value& command, SkCanvas* target) { |
592 target->restore(); | 618 target->restore(); |
593 } | 619 } |
594 | 620 |
595 void Renderer::processSaveLayer(Json::Value& command, SkCanvas* target) { | 621 void Renderer::processSaveLayer(Json::Value& command, SkCanvas* target) { |
596 SkCanvas::SaveLayerRec rec; | 622 SkCanvas::SaveLayerRec rec; |
597 SkRect bounds; | 623 SkRect bounds; |
598 if (command.isMember(SKJSONCANVAS_ATTRIBUTE_BOUNDS)) { | 624 if (command.isMember(SKJSONCANVAS_ATTRIBUTE_BOUNDS)) { |
599 this->getRect(command, SKJSONCANVAS_ATTRIBUTE_BOUNDS, &bounds); | 625 this->getRect(command[SKJSONCANVAS_ATTRIBUTE_BOUNDS], &bounds); |
600 rec.fBounds = &bounds; | 626 rec.fBounds = &bounds; |
601 } | 627 } |
602 SkPaint paint; | 628 SkPaint paint; |
603 if (command.isMember(SKJSONCANVAS_ATTRIBUTE_PAINT)) { | 629 if (command.isMember(SKJSONCANVAS_ATTRIBUTE_PAINT)) { |
604 this->getPaint(command, &paint); | 630 this->getPaint(command[SKJSONCANVAS_ATTRIBUTE_PAINT], &paint); |
605 rec.fPaint = &paint; | 631 rec.fPaint = &paint; |
606 } | 632 } |
607 if (command.isMember(SKJSONCANVAS_ATTRIBUTE_BACKDROP)) { | 633 if (command.isMember(SKJSONCANVAS_ATTRIBUTE_BACKDROP)) { |
608 rec.fBackdrop = (SkImageFilter*) load_flattenable(command[SKJSONCANVAS_A
TTRIBUTE_BACKDROP]); | 634 rec.fBackdrop = (SkImageFilter*) load_flattenable(command[SKJSONCANVAS_A
TTRIBUTE_BACKDROP]); |
609 } | 635 } |
610 target->saveLayer(rec); | 636 target->saveLayer(rec); |
611 if (rec.fBackdrop != nullptr) { | 637 if (rec.fBackdrop != nullptr) { |
612 rec.fBackdrop->unref(); | 638 rec.fBackdrop->unref(); |
613 } | 639 } |
614 } | 640 } |
615 | 641 |
616 void Renderer::processPaint(Json::Value& command, SkCanvas* target) { | 642 void Renderer::processPaint(Json::Value& command, SkCanvas* target) { |
617 SkPaint paint; | 643 SkPaint paint; |
618 this->getPaint(command, &paint); | 644 this->getPaint(command[SKJSONCANVAS_ATTRIBUTE_PAINT], &paint); |
619 target->drawPaint(paint); | 645 target->drawPaint(paint); |
620 } | 646 } |
621 | 647 |
622 void Renderer::processRect(Json::Value& command, SkCanvas* target) { | 648 void Renderer::processRect(Json::Value& command, SkCanvas* target) { |
623 SkRect rect; | 649 SkRect rect; |
624 this->getRect(command, SKJSONCANVAS_ATTRIBUTE_COORDS, &rect); | 650 this->getRect(command[SKJSONCANVAS_ATTRIBUTE_COORDS], &rect); |
625 SkPaint paint; | 651 SkPaint paint; |
626 this->getPaint(command, &paint); | 652 this->getPaint(command[SKJSONCANVAS_ATTRIBUTE_PAINT], &paint); |
627 target->drawRect(rect, paint); | 653 target->drawRect(rect, paint); |
628 } | 654 } |
629 | 655 |
630 void Renderer::processRRect(Json::Value& command, SkCanvas* target) { | 656 void Renderer::processRRect(Json::Value& command, SkCanvas* target) { |
631 SkRRect rrect; | 657 SkRRect rrect; |
632 this->getRRect(command, SKJSONCANVAS_ATTRIBUTE_COORDS, &rrect); | 658 this->getRRect(command[SKJSONCANVAS_ATTRIBUTE_COORDS], &rrect); |
633 SkPaint paint; | 659 SkPaint paint; |
634 this->getPaint(command, &paint); | 660 this->getPaint(command[SKJSONCANVAS_ATTRIBUTE_PAINT], &paint); |
635 target->drawRRect(rrect, paint); | 661 target->drawRRect(rrect, paint); |
636 } | 662 } |
637 | 663 |
638 void Renderer::processOval(Json::Value& command, SkCanvas* target) { | 664 void Renderer::processOval(Json::Value& command, SkCanvas* target) { |
639 SkRect rect; | 665 SkRect rect; |
640 this->getRect(command, SKJSONCANVAS_ATTRIBUTE_COORDS, &rect); | 666 this->getRect(command[SKJSONCANVAS_ATTRIBUTE_COORDS], &rect); |
641 SkPaint paint; | 667 SkPaint paint; |
642 this->getPaint(command, &paint); | 668 this->getPaint(command[SKJSONCANVAS_ATTRIBUTE_PAINT], &paint); |
643 target->drawOval(rect, paint); | 669 target->drawOval(rect, paint); |
644 } | 670 } |
645 | 671 |
646 void Renderer::processPath(Json::Value& command, SkCanvas* target) { | 672 void Renderer::processPath(Json::Value& command, SkCanvas* target) { |
647 Json::Value jsonPath = command[SKJSONCANVAS_ATTRIBUTE_PATH]; | |
648 SkPath path; | 673 SkPath path; |
649 this->getPath(command, &path); | 674 this->getPath(command[SKJSONCANVAS_ATTRIBUTE_PATH], &path); |
650 SkPaint paint; | 675 SkPaint paint; |
651 this->getPaint(command, &paint); | 676 this->getPaint(command[SKJSONCANVAS_ATTRIBUTE_PAINT], &paint); |
652 target->drawPath(path, paint); | 677 target->drawPath(path, paint); |
653 } | 678 } |
654 | 679 |
655 void Renderer::processText(Json::Value& command, SkCanvas* target) { | 680 void Renderer::processText(Json::Value& command, SkCanvas* target) { |
656 const char* text = command[SKJSONCANVAS_ATTRIBUTE_TEXT].asCString(); | 681 const char* text = command[SKJSONCANVAS_ATTRIBUTE_TEXT].asCString(); |
657 SkPaint paint; | 682 SkPaint paint; |
658 this->getPaint(command, &paint); | 683 this->getPaint(command[SKJSONCANVAS_ATTRIBUTE_PAINT], &paint); |
659 Json::Value coords = command[SKJSONCANVAS_ATTRIBUTE_COORDS]; | 684 Json::Value coords = command[SKJSONCANVAS_ATTRIBUTE_COORDS]; |
660 target->drawText(text, strlen(text), coords[0].asFloat(), coords[1].asFloat(
), paint); | 685 target->drawText(text, strlen(text), coords[0].asFloat(), coords[1].asFloat(
), paint); |
661 } | 686 } |
662 | 687 |
663 void Renderer::processPosText(Json::Value& command, SkCanvas* target) { | 688 void Renderer::processPosText(Json::Value& command, SkCanvas* target) { |
664 const char* text = command[SKJSONCANVAS_ATTRIBUTE_TEXT].asCString(); | 689 const char* text = command[SKJSONCANVAS_ATTRIBUTE_TEXT].asCString(); |
665 SkPaint paint; | 690 SkPaint paint; |
666 this->getPaint(command, &paint); | 691 this->getPaint(command[SKJSONCANVAS_ATTRIBUTE_PAINT], &paint); |
667 Json::Value coords = command[SKJSONCANVAS_ATTRIBUTE_COORDS]; | 692 Json::Value coords = command[SKJSONCANVAS_ATTRIBUTE_COORDS]; |
668 int count = (int) coords.size(); | 693 int count = (int) coords.size(); |
669 SkPoint* points = (SkPoint*) sk_malloc_throw(count * sizeof(SkPoint)); | 694 SkPoint* points = (SkPoint*) sk_malloc_throw(count * sizeof(SkPoint)); |
670 for (int i = 0; i < count; i++) { | 695 for (int i = 0; i < count; i++) { |
671 points[i] = SkPoint::Make(coords[i][0].asFloat(), coords[i][1].asFloat()
); | 696 points[i] = SkPoint::Make(coords[i][0].asFloat(), coords[i][1].asFloat()
); |
672 } | 697 } |
673 target->drawPosText(text, strlen(text), points, paint); | 698 target->drawPosText(text, strlen(text), points, paint); |
674 free(points); | 699 free(points); |
675 } | 700 } |
676 | 701 |
| 702 void Renderer::processTextOnPath(Json::Value& command, SkCanvas* target) { |
| 703 const char* text = command[SKJSONCANVAS_ATTRIBUTE_TEXT].asCString(); |
| 704 SkPath path; |
| 705 this->getPath(command[SKJSONCANVAS_ATTRIBUTE_PATH], &path); |
| 706 SkMatrix* matrixPtr; |
| 707 SkMatrix matrix; |
| 708 if (command.isMember(SKJSONCANVAS_ATTRIBUTE_MATRIX)) { |
| 709 this->getMatrix(command[SKJSONCANVAS_ATTRIBUTE_MATRIX], &matrix); |
| 710 matrixPtr = &matrix; |
| 711 } |
| 712 else { |
| 713 matrixPtr = nullptr; |
| 714 } |
| 715 SkPaint paint; |
| 716 this->getPaint(command[SKJSONCANVAS_ATTRIBUTE_PAINT], &paint); |
| 717 target->drawTextOnPath(text, strlen(text), path, matrixPtr, paint); |
| 718 } |
| 719 |
677 void Renderer::processPoints(Json::Value& command, SkCanvas* target) { | 720 void Renderer::processPoints(Json::Value& command, SkCanvas* target) { |
678 SkCanvas::PointMode mode; | 721 SkCanvas::PointMode mode; |
679 const char* jsonMode = command[SKJSONCANVAS_ATTRIBUTE_MODE].asCString(); | 722 const char* jsonMode = command[SKJSONCANVAS_ATTRIBUTE_MODE].asCString(); |
680 if (!strcmp(jsonMode, SKJSONCANVAS_POINTMODE_POINTS)) { | 723 if (!strcmp(jsonMode, SKJSONCANVAS_POINTMODE_POINTS)) { |
681 mode = SkCanvas::kPoints_PointMode; | 724 mode = SkCanvas::kPoints_PointMode; |
682 } | 725 } |
683 else if (!strcmp(jsonMode, SKJSONCANVAS_POINTMODE_LINES)) { | 726 else if (!strcmp(jsonMode, SKJSONCANVAS_POINTMODE_LINES)) { |
684 mode = SkCanvas::kLines_PointMode; | 727 mode = SkCanvas::kLines_PointMode; |
685 } | 728 } |
686 else if (!strcmp(jsonMode, SKJSONCANVAS_POINTMODE_POLYGON)) { | 729 else if (!strcmp(jsonMode, SKJSONCANVAS_POINTMODE_POLYGON)) { |
687 mode = SkCanvas::kPolygon_PointMode; | 730 mode = SkCanvas::kPolygon_PointMode; |
688 } | 731 } |
689 else { | 732 else { |
690 SkASSERT(false); | 733 SkASSERT(false); |
691 return; | 734 return; |
692 } | 735 } |
693 Json::Value jsonPoints = command[SKJSONCANVAS_ATTRIBUTE_POINTS]; | 736 Json::Value jsonPoints = command[SKJSONCANVAS_ATTRIBUTE_POINTS]; |
694 int count = (int) jsonPoints.size(); | 737 int count = (int) jsonPoints.size(); |
695 SkPoint* points = (SkPoint*) sk_malloc_throw(count * sizeof(SkPoint)); | 738 SkPoint* points = (SkPoint*) sk_malloc_throw(count * sizeof(SkPoint)); |
696 for (int i = 0; i < count; i++) { | 739 for (int i = 0; i < count; i++) { |
697 points[i] = SkPoint::Make(jsonPoints[i][0].asFloat(), jsonPoints[i][1].a
sFloat()); | 740 points[i] = SkPoint::Make(jsonPoints[i][0].asFloat(), jsonPoints[i][1].a
sFloat()); |
698 } | 741 } |
699 SkPaint paint; | 742 SkPaint paint; |
700 this->getPaint(command, &paint); | 743 this->getPaint(command[SKJSONCANVAS_ATTRIBUTE_PAINT], &paint); |
701 target->drawPoints(mode, count, points, paint); | 744 target->drawPoints(mode, count, points, paint); |
702 free(points); | 745 free(points); |
703 } | 746 } |
704 | 747 |
705 void Renderer::processClipRect(Json::Value& command, SkCanvas* target) { | 748 void Renderer::processClipRect(Json::Value& command, SkCanvas* target) { |
706 SkRect rect; | 749 SkRect rect; |
707 this->getRect(command, SKJSONCANVAS_ATTRIBUTE_COORDS, &rect); | 750 this->getRect(command[SKJSONCANVAS_ATTRIBUTE_COORDS], &rect); |
708 target->clipRect(rect, this->getRegionOp(command), | 751 target->clipRect(rect, this->getRegionOp(command[SKJSONCANVAS_ATTRIBUTE_REGI
ONOP]), |
709 command[SKJSONCANVAS_ATTRIBUTE_ANTIALIAS].asBool()); | 752 command[SKJSONCANVAS_ATTRIBUTE_ANTIALIAS].asBool()); |
710 } | 753 } |
711 | 754 |
712 void Renderer::processClipRRect(Json::Value& command, SkCanvas* target) { | 755 void Renderer::processClipRRect(Json::Value& command, SkCanvas* target) { |
713 SkRRect rrect; | 756 SkRRect rrect; |
714 this->getRRect(command, SKJSONCANVAS_ATTRIBUTE_COORDS, &rrect); | 757 this->getRRect(command[SKJSONCANVAS_ATTRIBUTE_COORDS], &rrect); |
715 target->clipRRect(rrect, this->getRegionOp(command), | 758 target->clipRRect(rrect, this->getRegionOp(command[SKJSONCANVAS_ATTRIBUTE_RE
GIONOP]), |
716 command[SKJSONCANVAS_ATTRIBUTE_ANTIALIAS].asBool()); | 759 command[SKJSONCANVAS_ATTRIBUTE_ANTIALIAS].asBool()); |
717 } | 760 } |
718 | 761 |
719 void Renderer::processClipPath(Json::Value& command, SkCanvas* target) { | 762 void Renderer::processClipPath(Json::Value& command, SkCanvas* target) { |
720 SkPath path; | 763 SkPath path; |
721 this->getPath(command, &path); | 764 this->getPath(command[SKJSONCANVAS_ATTRIBUTE_PATH], &path); |
722 target->clipPath(path, this->getRegionOp(command), | 765 target->clipPath(path, this->getRegionOp(command[SKJSONCANVAS_ATTRIBUTE_REGI
ONOP]), |
723 command[SKJSONCANVAS_ATTRIBUTE_ANTIALIAS].asBool()); | 766 command[SKJSONCANVAS_ATTRIBUTE_ANTIALIAS].asBool()); |
724 } | 767 } |
725 | 768 |
726 void Renderer::processImage(Json::Value& command, SkCanvas* target) { | 769 void Renderer::processImage(Json::Value& command, SkCanvas* target) { |
727 SkImage* image = load_image(command[SKJSONCANVAS_ATTRIBUTE_IMAGE]); | 770 SkImage* image = load_image(command[SKJSONCANVAS_ATTRIBUTE_IMAGE]); |
728 if (image == nullptr) { | 771 if (image == nullptr) { |
729 return; | 772 return; |
730 } | 773 } |
731 Json::Value point = command[SKJSONCANVAS_ATTRIBUTE_COORDS]; | 774 Json::Value point = command[SKJSONCANVAS_ATTRIBUTE_COORDS]; |
732 SkPaint* paintPtr; | 775 SkPaint* paintPtr; |
733 SkPaint paint; | 776 SkPaint paint; |
734 if (command.isMember(SKJSONCANVAS_ATTRIBUTE_PAINT)) { | 777 if (command.isMember(SKJSONCANVAS_ATTRIBUTE_PAINT)) { |
735 this->getPaint(command, &paint); | 778 this->getPaint(command[SKJSONCANVAS_ATTRIBUTE_PAINT], &paint); |
736 paintPtr = &paint; | 779 paintPtr = &paint; |
737 } | 780 } |
738 else { | 781 else { |
739 paintPtr = nullptr; | 782 paintPtr = nullptr; |
740 } | 783 } |
741 target->drawImage(image, point[0].asFloat(), point[1].asFloat(), paintPtr); | 784 target->drawImage(image, point[0].asFloat(), point[1].asFloat(), paintPtr); |
742 image->unref(); | 785 image->unref(); |
743 } | 786 } |
744 | 787 |
745 void Renderer::processImageRect(Json::Value& command, SkCanvas* target) { | 788 void Renderer::processImageRect(Json::Value& command, SkCanvas* target) { |
746 SkImage* image = load_image(command[SKJSONCANVAS_ATTRIBUTE_IMAGE]); | 789 SkImage* image = load_image(command[SKJSONCANVAS_ATTRIBUTE_IMAGE]); |
747 if (image == nullptr) { | 790 if (image == nullptr) { |
748 return; | 791 return; |
749 } | 792 } |
750 SkRect dst; | 793 SkRect dst; |
751 this->getRect(command, SKJSONCANVAS_ATTRIBUTE_DST, &dst); | 794 this->getRect(command[SKJSONCANVAS_ATTRIBUTE_DST], &dst); |
752 SkPaint* paintPtr; | 795 SkPaint* paintPtr; |
753 SkPaint paint; | 796 SkPaint paint; |
754 if (command.isMember(SKJSONCANVAS_ATTRIBUTE_PAINT)) { | 797 if (command.isMember(SKJSONCANVAS_ATTRIBUTE_PAINT)) { |
755 this->getPaint(command, &paint); | 798 this->getPaint(command[SKJSONCANVAS_ATTRIBUTE_PAINT], &paint); |
756 paintPtr = &paint; | 799 paintPtr = &paint; |
757 } | 800 } |
758 else { | 801 else { |
759 paintPtr = nullptr; | 802 paintPtr = nullptr; |
760 } | 803 } |
761 SkCanvas::SrcRectConstraint constraint; | 804 SkCanvas::SrcRectConstraint constraint; |
762 if (command.isMember(SKJSONCANVAS_ATTRIBUTE_STRICT) && | 805 if (command.isMember(SKJSONCANVAS_ATTRIBUTE_STRICT) && |
763 command[SKJSONCANVAS_ATTRIBUTE_STRICT].asBool()) { | 806 command[SKJSONCANVAS_ATTRIBUTE_STRICT].asBool()) { |
764 constraint = SkCanvas::kStrict_SrcRectConstraint; | 807 constraint = SkCanvas::kStrict_SrcRectConstraint; |
765 } | 808 } |
766 else { | 809 else { |
767 constraint = SkCanvas::kFast_SrcRectConstraint; | 810 constraint = SkCanvas::kFast_SrcRectConstraint; |
768 } | 811 } |
769 if (command.isMember(SKJSONCANVAS_ATTRIBUTE_SRC)) { | 812 if (command.isMember(SKJSONCANVAS_ATTRIBUTE_SRC)) { |
770 SkRect src; | 813 SkRect src; |
771 this->getRect(command, SKJSONCANVAS_ATTRIBUTE_SRC, &src); | 814 this->getRect(command[SKJSONCANVAS_ATTRIBUTE_SRC], &src); |
772 target->drawImageRect(image, src, dst, paintPtr, constraint); | 815 target->drawImageRect(image, src, dst, paintPtr, constraint); |
773 } | 816 } |
774 else { | 817 else { |
775 target->drawImageRect(image, dst, paintPtr, constraint); | 818 target->drawImageRect(image, dst, paintPtr, constraint); |
776 } | 819 } |
777 image->unref(); | 820 image->unref(); |
778 } | 821 } |
779 | 822 |
780 void Renderer::processBitmap(Json::Value& command, SkCanvas* target) { | 823 void Renderer::processBitmap(Json::Value& command, SkCanvas* target) { |
781 SkImage* image = load_image(command[SKJSONCANVAS_ATTRIBUTE_BITMAP]); | 824 SkImage* image = load_image(command[SKJSONCANVAS_ATTRIBUTE_BITMAP]); |
782 if (image == nullptr) { | 825 if (image == nullptr) { |
783 return; | 826 return; |
784 } | 827 } |
785 Json::Value point = command[SKJSONCANVAS_ATTRIBUTE_COORDS]; | 828 Json::Value point = command[SKJSONCANVAS_ATTRIBUTE_COORDS]; |
786 SkPaint* paintPtr; | 829 SkPaint* paintPtr; |
787 SkPaint paint; | 830 SkPaint paint; |
788 if (command.isMember(SKJSONCANVAS_ATTRIBUTE_PAINT)) { | 831 if (command.isMember(SKJSONCANVAS_ATTRIBUTE_PAINT)) { |
789 this->getPaint(command, &paint); | 832 this->getPaint(command[SKJSONCANVAS_ATTRIBUTE_PAINT], &paint); |
790 paintPtr = &paint; | 833 paintPtr = &paint; |
791 } | 834 } |
792 else { | 835 else { |
793 paintPtr = nullptr; | 836 paintPtr = nullptr; |
794 } | 837 } |
795 target->drawImage(image, point[0].asFloat(), point[1].asFloat(), paintPtr); | 838 target->drawImage(image, point[0].asFloat(), point[1].asFloat(), paintPtr); |
796 image->unref(); | 839 image->unref(); |
797 } | 840 } |
798 | 841 |
799 void Renderer::processBitmapRect(Json::Value& command, SkCanvas* target) { | 842 void Renderer::processBitmapRect(Json::Value& command, SkCanvas* target) { |
800 SkBitmap* bitmap = load_bitmap(command[SKJSONCANVAS_ATTRIBUTE_BITMAP]); | 843 SkBitmap* bitmap = load_bitmap(command[SKJSONCANVAS_ATTRIBUTE_BITMAP]); |
801 if (bitmap == nullptr) { | 844 if (bitmap == nullptr) { |
802 return; | 845 return; |
803 } | 846 } |
804 SkRect dst; | 847 SkRect dst; |
805 this->getRect(command, SKJSONCANVAS_ATTRIBUTE_DST, &dst); | 848 this->getRect(command[SKJSONCANVAS_ATTRIBUTE_DST], &dst); |
806 SkPaint* paintPtr; | 849 SkPaint* paintPtr; |
807 SkPaint paint; | 850 SkPaint paint; |
808 if (command.isMember(SKJSONCANVAS_ATTRIBUTE_PAINT)) { | 851 if (command.isMember(SKJSONCANVAS_ATTRIBUTE_PAINT)) { |
809 this->getPaint(command, &paint); | 852 this->getPaint(command[SKJSONCANVAS_ATTRIBUTE_PAINT], &paint); |
810 paintPtr = &paint; | 853 paintPtr = &paint; |
811 } | 854 } |
812 else { | 855 else { |
813 paintPtr = nullptr; | 856 paintPtr = nullptr; |
814 } | 857 } |
815 SkCanvas::SrcRectConstraint constraint; | 858 SkCanvas::SrcRectConstraint constraint; |
816 if (command.isMember(SKJSONCANVAS_ATTRIBUTE_STRICT) && | 859 if (command.isMember(SKJSONCANVAS_ATTRIBUTE_STRICT) && |
817 command[SKJSONCANVAS_ATTRIBUTE_STRICT].asBool()) { | 860 command[SKJSONCANVAS_ATTRIBUTE_STRICT].asBool()) { |
818 constraint = SkCanvas::kStrict_SrcRectConstraint; | 861 constraint = SkCanvas::kStrict_SrcRectConstraint; |
819 } | 862 } |
820 else { | 863 else { |
821 constraint = SkCanvas::kFast_SrcRectConstraint; | 864 constraint = SkCanvas::kFast_SrcRectConstraint; |
822 } | 865 } |
823 if (command.isMember(SKJSONCANVAS_ATTRIBUTE_SRC)) { | 866 if (command.isMember(SKJSONCANVAS_ATTRIBUTE_SRC)) { |
824 SkRect src; | 867 SkRect src; |
825 this->getRect(command, SKJSONCANVAS_ATTRIBUTE_SRC, &src); | 868 this->getRect(command[SKJSONCANVAS_ATTRIBUTE_SRC], &src); |
826 target->drawBitmapRect(*bitmap, src, dst, paintPtr, constraint); | 869 target->drawBitmapRect(*bitmap, src, dst, paintPtr, constraint); |
827 } | 870 } |
828 else { | 871 else { |
829 target->drawBitmapRect(*bitmap, dst, paintPtr, constraint); | 872 target->drawBitmapRect(*bitmap, dst, paintPtr, constraint); |
830 } | 873 } |
831 free(bitmap); | 874 free(bitmap); |
832 } | 875 } |
833 | 876 |
834 void render(const char* json, SkCanvas* target) { | 877 void render(const char* json, SkCanvas* target) { |
835 Renderer renderer; | 878 Renderer renderer; |
836 Json::Reader reader; | 879 Json::Reader reader; |
837 Json::Value root; | 880 Json::Value root; |
838 if (reader.parse(std::string(json), root)) { | 881 if (reader.parse(std::string(json), root)) { |
839 SkASSERT(root[SKJSONCANVAS_VERSION].asInt() == 1); | 882 SkASSERT(root[SKJSONCANVAS_VERSION].asInt() == 1); |
840 Json::Value commands = root[SKJSONCANVAS_COMMANDS]; | 883 Json::Value commands = root[SKJSONCANVAS_COMMANDS]; |
841 for (Json::ArrayIndex i = 0; i < commands.size(); i++) { | 884 for (Json::ArrayIndex i = 0; i < commands.size(); i++) { |
842 renderer.processCommand(commands[i], target); | 885 renderer.processCommand(commands[i], target); |
843 } | 886 } |
844 } | 887 } |
845 else { | 888 else { |
846 SkDebugf(json); | 889 SkDebugf(json); |
847 SkFAIL("json parse failure"); | 890 SkFAIL("json parse failure"); |
848 } | 891 } |
849 } | 892 } |
850 | 893 |
851 } // namespace | 894 } // namespace |
OLD | NEW |