3 * Copyright 2012 Google Inc.
5 * Use of this source code is governed by a BSD-style license that can be
6 * found in the LICENSE file.
10 #include "SkDrawCommand.h"
11 #include "SkObjectParser.h"
13 // TODO(chudy): Refactor into non subclass model.
15 SkDrawCommand::SkDrawCommand(DrawType type)
21 SkDrawCommand::SkDrawCommand() {
26 SkDrawCommand::~SkDrawCommand() {
30 const char* SkDrawCommand::GetCommandString(DrawType type) {
32 case UNUSED: SkDEBUGFAIL("DrawType UNUSED\n"); break;
33 case DRAW_CLEAR: return "Clear";
34 case CLIP_PATH: return "Clip Path";
35 case CLIP_REGION: return "Clip Region";
36 case CLIP_RECT: return "Clip Rect";
37 case CLIP_RRECT: return "Clip RRect";
38 case CONCAT: return "Concat";
39 case DRAW_BITMAP: return "Draw Bitmap";
40 case DRAW_BITMAP_MATRIX: return "Draw Bitmap Matrix";
41 case DRAW_BITMAP_NINE: return "Draw Bitmap Nine";
42 case DRAW_BITMAP_RECT_TO_RECT: return "Draw Bitmap Rect";
43 case DRAW_DATA: return "Draw Data";
44 case DRAW_OVAL: return "Draw Oval";
45 case DRAW_PAINT: return "Draw Paint";
46 case DRAW_PATH: return "Draw Path";
47 case DRAW_PICTURE: return "Draw Picture";
48 case DRAW_POINTS: return "Draw Points";
49 case DRAW_POS_TEXT: return "Draw Pos Text";
50 case DRAW_POS_TEXT_H: return "Draw Pos Text H";
51 case DRAW_RECT: return "Draw Rect";
52 case DRAW_RRECT: return "Draw RRect";
53 case DRAW_SPRITE: return "Draw Sprite";
54 case DRAW_TEXT: return "Draw Text";
55 case DRAW_TEXT_ON_PATH: return "Draw Text On Path";
56 case DRAW_VERTICES: return "Draw Vertices";
57 case RESTORE: return "Restore";
58 case ROTATE: return "Rotate";
59 case SAVE: return "Save";
60 case SAVE_LAYER: return "Save Layer";
61 case SCALE: return "Scale";
62 case SET_MATRIX: return "Set Matrix";
63 case SKEW: return "Skew";
64 case TRANSLATE: return "Translate";
65 case NOOP: return "NoOp";
66 case BEGIN_COMMENT_GROUP: return "BeginCommentGroup";
67 case COMMENT: return "Comment";
68 case END_COMMENT_GROUP: return "EndCommentGroup";
69 case DRAW_DRRECT: return "Draw DRRect";
70 case PUSH_CULL: return "PushCull";
71 case POP_CULL: return "PopCull";
73 SkDebugf("DrawType error 0x%08x\n", type);
77 SkDEBUGFAIL("DrawType UNUSED\n");
81 SkString SkDrawCommand::toString() {
82 return SkString(GetCommandString(fDrawType));
85 SkClearCommand::SkClearCommand(SkColor color) : INHERITED(DRAW_CLEAR) {
87 fInfo.push(SkObjectParser::CustomTextToString("No Parameters"));
90 void SkClearCommand::execute(SkCanvas* canvas) {
91 canvas->clear(fColor);
96 void xlate_and_scale_to_bounds(SkCanvas* canvas, const SkRect& bounds) {
97 const SkISize& size = canvas->getDeviceSize();
99 static const SkScalar kInsetFrac = 0.9f; // Leave a border around object
101 canvas->translate(size.fWidth/2.0f, size.fHeight/2.0f);
102 if (bounds.width() > bounds.height()) {
103 canvas->scale(SkDoubleToScalar((kInsetFrac*size.fWidth)/bounds.width()),
104 SkDoubleToScalar((kInsetFrac*size.fHeight)/bounds.width()));
106 canvas->scale(SkDoubleToScalar((kInsetFrac*size.fWidth)/bounds.height()),
107 SkDoubleToScalar((kInsetFrac*size.fHeight)/bounds.height()));
109 canvas->translate(-bounds.centerX(), -bounds.centerY());
113 void render_path(SkCanvas* canvas, const SkPath& path) {
114 canvas->clear(0xFFFFFFFF);
117 const SkRect& bounds = path.getBounds();
119 xlate_and_scale_to_bounds(canvas, bounds);
122 p.setColor(SK_ColorBLACK);
123 p.setStyle(SkPaint::kStroke_Style);
125 canvas->drawPath(path, p);
129 void render_bitmap(SkCanvas* canvas, const SkBitmap& input, const SkRect* srcRect = NULL) {
130 const SkISize& size = canvas->getDeviceSize();
132 SkScalar xScale = SkIntToScalar(size.fWidth-2) / input.width();
133 SkScalar yScale = SkIntToScalar(size.fHeight-2) / input.height();
135 if (input.width() > input.height()) {
136 yScale *= input.height() / (float) input.width();
138 xScale *= input.width() / (float) input.height();
141 SkRect dst = SkRect::MakeXYWH(SK_Scalar1, SK_Scalar1,
142 xScale * input.width(),
143 yScale * input.height());
145 canvas->clear(0xFFFFFFFF);
146 canvas->drawBitmapRect(input, NULL, dst);
148 if (NULL != srcRect) {
149 SkRect r = SkRect::MakeLTRB(srcRect->fLeft * xScale + SK_Scalar1,
150 srcRect->fTop * yScale + SK_Scalar1,
151 srcRect->fRight * xScale + SK_Scalar1,
152 srcRect->fBottom * yScale + SK_Scalar1);
154 p.setColor(SK_ColorRED);
155 p.setStyle(SkPaint::kStroke_Style);
157 canvas->drawRect(r, p);
161 void render_rrect(SkCanvas* canvas, const SkRRect& rrect) {
162 canvas->clear(0xFFFFFFFF);
165 const SkRect& bounds = rrect.getBounds();
167 xlate_and_scale_to_bounds(canvas, bounds);
170 p.setColor(SK_ColorBLACK);
171 p.setStyle(SkPaint::kStroke_Style);
173 canvas->drawRRect(rrect, p);
177 void render_drrect(SkCanvas* canvas, const SkRRect& outer, const SkRRect& inner) {
178 canvas->clear(0xFFFFFFFF);
181 const SkRect& bounds = outer.getBounds();
183 xlate_and_scale_to_bounds(canvas, bounds);
186 p.setColor(SK_ColorBLACK);
187 p.setStyle(SkPaint::kStroke_Style);
189 canvas->drawDRRect(outer, inner, p);
196 SkClipPathCommand::SkClipPathCommand(const SkPath& path, SkRegion::Op op, bool doAA)
197 : INHERITED(CLIP_PATH) {
202 fInfo.push(SkObjectParser::PathToString(path));
203 fInfo.push(SkObjectParser::RegionOpToString(op));
204 fInfo.push(SkObjectParser::BoolToString(doAA));
207 void SkClipPathCommand::execute(SkCanvas* canvas) {
208 canvas->clipPath(fPath, fOp, fDoAA);
211 bool SkClipPathCommand::render(SkCanvas* canvas) const {
212 render_path(canvas, fPath);
216 SkClipRegionCommand::SkClipRegionCommand(const SkRegion& region, SkRegion::Op op)
217 : INHERITED(CLIP_REGION) {
221 fInfo.push(SkObjectParser::RegionToString(region));
222 fInfo.push(SkObjectParser::RegionOpToString(op));
225 void SkClipRegionCommand::execute(SkCanvas* canvas) {
226 canvas->clipRegion(fRegion, fOp);
229 SkClipRectCommand::SkClipRectCommand(const SkRect& rect, SkRegion::Op op, bool doAA)
230 : INHERITED(CLIP_RECT) {
235 fInfo.push(SkObjectParser::RectToString(rect));
236 fInfo.push(SkObjectParser::RegionOpToString(op));
237 fInfo.push(SkObjectParser::BoolToString(doAA));
240 void SkClipRectCommand::execute(SkCanvas* canvas) {
241 canvas->clipRect(fRect, fOp, fDoAA);
244 SkClipRRectCommand::SkClipRRectCommand(const SkRRect& rrect, SkRegion::Op op, bool doAA)
245 : INHERITED(CLIP_RRECT) {
250 fInfo.push(SkObjectParser::RRectToString(rrect));
251 fInfo.push(SkObjectParser::RegionOpToString(op));
252 fInfo.push(SkObjectParser::BoolToString(doAA));
255 void SkClipRRectCommand::execute(SkCanvas* canvas) {
256 canvas->clipRRect(fRRect, fOp, fDoAA);
259 bool SkClipRRectCommand::render(SkCanvas* canvas) const {
260 render_rrect(canvas, fRRect);
264 SkConcatCommand::SkConcatCommand(const SkMatrix& matrix)
265 : INHERITED(CONCAT) {
268 fInfo.push(SkObjectParser::MatrixToString(matrix));
271 void SkConcatCommand::execute(SkCanvas* canvas) {
272 canvas->concat(fMatrix);
275 SkDrawBitmapCommand::SkDrawBitmapCommand(const SkBitmap& bitmap, SkScalar left, SkScalar top,
276 const SkPaint* paint)
277 : INHERITED(DRAW_BITMAP) {
288 fInfo.push(SkObjectParser::BitmapToString(bitmap));
289 fInfo.push(SkObjectParser::ScalarToString(left, "SkScalar left: "));
290 fInfo.push(SkObjectParser::ScalarToString(top, "SkScalar top: "));
292 fInfo.push(SkObjectParser::PaintToString(*paint));
296 void SkDrawBitmapCommand::execute(SkCanvas* canvas) {
297 canvas->drawBitmap(fBitmap, fLeft, fTop, fPaintPtr);
300 bool SkDrawBitmapCommand::render(SkCanvas* canvas) const {
301 render_bitmap(canvas, fBitmap);
305 SkDrawBitmapMatrixCommand::SkDrawBitmapMatrixCommand(const SkBitmap& bitmap,
306 const SkMatrix& matrix,
307 const SkPaint* paint)
308 : INHERITED(DRAW_BITMAP_MATRIX) {
318 fInfo.push(SkObjectParser::BitmapToString(bitmap));
319 fInfo.push(SkObjectParser::MatrixToString(matrix));
321 fInfo.push(SkObjectParser::PaintToString(*paint));
325 void SkDrawBitmapMatrixCommand::execute(SkCanvas* canvas) {
326 canvas->drawBitmapMatrix(fBitmap, fMatrix, fPaintPtr);
329 bool SkDrawBitmapMatrixCommand::render(SkCanvas* canvas) const {
330 render_bitmap(canvas, fBitmap);
334 SkDrawBitmapNineCommand::SkDrawBitmapNineCommand(const SkBitmap& bitmap, const SkIRect& center,
335 const SkRect& dst, const SkPaint* paint)
336 : INHERITED(DRAW_BITMAP_NINE) {
347 fInfo.push(SkObjectParser::BitmapToString(bitmap));
348 fInfo.push(SkObjectParser::IRectToString(center));
349 fInfo.push(SkObjectParser::RectToString(dst, "Dst: "));
351 fInfo.push(SkObjectParser::PaintToString(*paint));
355 void SkDrawBitmapNineCommand::execute(SkCanvas* canvas) {
356 canvas->drawBitmapNine(fBitmap, fCenter, fDst, fPaintPtr);
359 bool SkDrawBitmapNineCommand::render(SkCanvas* canvas) const {
360 render_bitmap(canvas, fBitmap);
364 SkDrawBitmapRectCommand::SkDrawBitmapRectCommand(const SkBitmap& bitmap, const SkRect* src,
365 const SkRect& dst, const SkPaint* paint,
366 SkCanvas::DrawBitmapRectFlags flags)
367 : INHERITED(DRAW_BITMAP_RECT_TO_RECT) {
384 fInfo.push(SkObjectParser::BitmapToString(bitmap));
386 fInfo.push(SkObjectParser::RectToString(*src, "Src: "));
388 fInfo.push(SkObjectParser::RectToString(dst, "Dst: "));
390 fInfo.push(SkObjectParser::PaintToString(*paint));
392 fInfo.push(SkObjectParser::IntToString(fFlags, "Flags: "));
395 void SkDrawBitmapRectCommand::execute(SkCanvas* canvas) {
396 canvas->drawBitmapRectToRect(fBitmap, this->srcRect(), fDst, fPaintPtr, fFlags);
399 bool SkDrawBitmapRectCommand::render(SkCanvas* canvas) const {
400 render_bitmap(canvas, fBitmap, this->srcRect());
404 SkDrawDataCommand::SkDrawDataCommand(const void* data, size_t length)
405 : INHERITED(DRAW_DATA) {
406 fData = new char[length];
407 memcpy(fData, data, length);
410 // TODO: add display of actual data?
411 SkString* str = new SkString;
412 str->appendf("length: %d", (int) length);
416 void SkDrawDataCommand::execute(SkCanvas* canvas) {
417 canvas->drawData(fData, fLength);
420 SkBeginCommentGroupCommand::SkBeginCommentGroupCommand(const char* description)
421 : INHERITED(BEGIN_COMMENT_GROUP)
422 , fDescription(description) {
423 SkString* temp = new SkString;
424 temp->appendf("Description: %s", description);
428 SkCommentCommand::SkCommentCommand(const char* kywd, const char* value)
432 SkString* temp = new SkString;
433 temp->appendf("%s: %s", kywd, value);
437 SkEndCommentGroupCommand::SkEndCommentGroupCommand()
438 : INHERITED(END_COMMENT_GROUP) {
441 SkDrawOvalCommand::SkDrawOvalCommand(const SkRect& oval, const SkPaint& paint)
442 : INHERITED(DRAW_OVAL) {
446 fInfo.push(SkObjectParser::RectToString(oval));
447 fInfo.push(SkObjectParser::PaintToString(paint));
450 void SkDrawOvalCommand::execute(SkCanvas* canvas) {
451 canvas->drawOval(fOval, fPaint);
454 bool SkDrawOvalCommand::render(SkCanvas* canvas) const {
455 canvas->clear(0xFFFFFFFF);
458 xlate_and_scale_to_bounds(canvas, fOval);
461 p.setColor(SK_ColorBLACK);
462 p.setStyle(SkPaint::kStroke_Style);
464 canvas->drawOval(fOval, p);
470 SkDrawPaintCommand::SkDrawPaintCommand(const SkPaint& paint)
471 : INHERITED(DRAW_PAINT) {
474 fInfo.push(SkObjectParser::PaintToString(paint));
477 void SkDrawPaintCommand::execute(SkCanvas* canvas) {
478 canvas->drawPaint(fPaint);
481 bool SkDrawPaintCommand::render(SkCanvas* canvas) const {
482 canvas->clear(0xFFFFFFFF);
483 canvas->drawPaint(fPaint);
487 SkDrawPathCommand::SkDrawPathCommand(const SkPath& path, const SkPaint& paint)
488 : INHERITED(DRAW_PATH) {
492 fInfo.push(SkObjectParser::PathToString(path));
493 fInfo.push(SkObjectParser::PaintToString(paint));
496 void SkDrawPathCommand::execute(SkCanvas* canvas) {
497 canvas->drawPath(fPath, fPaint);
500 bool SkDrawPathCommand::render(SkCanvas* canvas) const {
501 render_path(canvas, fPath);
505 SkDrawPictureCommand::SkDrawPictureCommand(const SkPicture* picture,
506 const SkMatrix* matrix,
507 const SkPaint* paint)
508 : INHERITED(DRAW_PICTURE)
509 , fPicture(SkRef(picture))
513 if (NULL != matrix) {
515 fMatrixPtr = &fMatrix;
522 SkString* temp = new SkString;
523 temp->appendf("SkPicture: W: %d H: %d", picture->width(), picture->height());
525 if (NULL != matrix) {
526 fInfo.push(SkObjectParser::MatrixToString(*matrix));
529 fInfo.push(SkObjectParser::PaintToString(*paint));
533 void SkDrawPictureCommand::execute(SkCanvas* canvas) {
534 canvas->drawPicture(fPicture, fMatrixPtr, fPaintPtr);
537 bool SkDrawPictureCommand::render(SkCanvas* canvas) const {
538 canvas->clear(0xFFFFFFFF);
541 SkRect bounds = SkRect::MakeWH(SkIntToScalar(fPicture->width()),
542 SkIntToScalar(fPicture->height()));
543 xlate_and_scale_to_bounds(canvas, bounds);
545 canvas->drawPicture(fPicture.get());
552 SkDrawPointsCommand::SkDrawPointsCommand(SkCanvas::PointMode mode, size_t count,
553 const SkPoint pts[], const SkPaint& paint)
554 : INHERITED(DRAW_POINTS) {
557 fPts = new SkPoint[count];
558 memcpy(fPts, pts, count * sizeof(SkPoint));
561 fInfo.push(SkObjectParser::PointsToString(pts, count));
562 fInfo.push(SkObjectParser::ScalarToString(SkIntToScalar((unsigned int)count),
564 fInfo.push(SkObjectParser::PointModeToString(mode));
565 fInfo.push(SkObjectParser::PaintToString(paint));
568 void SkDrawPointsCommand::execute(SkCanvas* canvas) {
569 canvas->drawPoints(fMode, fCount, fPts, fPaint);
572 bool SkDrawPointsCommand::render(SkCanvas* canvas) const {
573 canvas->clear(0xFFFFFFFF);
579 for (unsigned int i = 0; i < fCount; ++i) {
580 bounds.growToInclude(fPts[i].fX, fPts[i].fY);
583 xlate_and_scale_to_bounds(canvas, bounds);
586 p.setColor(SK_ColorBLACK);
587 p.setStyle(SkPaint::kStroke_Style);
589 canvas->drawPoints(fMode, fCount, fPts, p);
595 SkDrawPosTextCommand::SkDrawPosTextCommand(const void* text, size_t byteLength,
596 const SkPoint pos[], const SkPaint& paint)
597 : INHERITED(DRAW_POS_TEXT) {
598 size_t numPts = paint.countText(text, byteLength);
600 fText = new char[byteLength];
601 memcpy(fText, text, byteLength);
602 fByteLength = byteLength;
604 fPos = new SkPoint[numPts];
605 memcpy(fPos, pos, numPts * sizeof(SkPoint));
609 fInfo.push(SkObjectParser::TextToString(text, byteLength, paint.getTextEncoding()));
610 // TODO(chudy): Test that this works.
611 fInfo.push(SkObjectParser::PointsToString(pos, 1));
612 fInfo.push(SkObjectParser::PaintToString(paint));
615 void SkDrawPosTextCommand::execute(SkCanvas* canvas) {
616 canvas->drawPosText(fText, fByteLength, fPos, fPaint);
620 SkDrawPosTextHCommand::SkDrawPosTextHCommand(const void* text, size_t byteLength,
621 const SkScalar xpos[], SkScalar constY,
622 const SkPaint& paint)
623 : INHERITED(DRAW_POS_TEXT_H) {
624 size_t numPts = paint.countText(text, byteLength);
626 fText = new char[byteLength];
627 memcpy(fText, text, byteLength);
628 fByteLength = byteLength;
630 fXpos = new SkScalar[numPts];
631 memcpy(fXpos, xpos, numPts * sizeof(SkScalar));
636 fInfo.push(SkObjectParser::TextToString(text, byteLength, paint.getTextEncoding()));
637 fInfo.push(SkObjectParser::ScalarToString(xpos[0], "XPOS: "));
638 fInfo.push(SkObjectParser::ScalarToString(constY, "SkScalar constY: "));
639 fInfo.push(SkObjectParser::PaintToString(paint));
642 void SkDrawPosTextHCommand::execute(SkCanvas* canvas) {
643 canvas->drawPosTextH(fText, fByteLength, fXpos, fConstY, fPaint);
646 SkDrawRectCommand::SkDrawRectCommand(const SkRect& rect, const SkPaint& paint)
647 : INHERITED(DRAW_RECT) {
651 fInfo.push(SkObjectParser::RectToString(rect));
652 fInfo.push(SkObjectParser::PaintToString(paint));
655 void SkDrawRectCommand::execute(SkCanvas* canvas) {
656 canvas->drawRect(fRect, fPaint);
659 SkDrawRRectCommand::SkDrawRRectCommand(const SkRRect& rrect, const SkPaint& paint)
660 : INHERITED(DRAW_RRECT) {
664 fInfo.push(SkObjectParser::RRectToString(rrect));
665 fInfo.push(SkObjectParser::PaintToString(paint));
668 void SkDrawRRectCommand::execute(SkCanvas* canvas) {
669 canvas->drawRRect(fRRect, fPaint);
672 bool SkDrawRRectCommand::render(SkCanvas* canvas) const {
673 render_rrect(canvas, fRRect);
677 SkDrawDRRectCommand::SkDrawDRRectCommand(const SkRRect& outer,
678 const SkRRect& inner,
679 const SkPaint& paint)
680 : INHERITED(DRAW_DRRECT) {
685 fInfo.push(SkObjectParser::RRectToString(outer));
686 fInfo.push(SkObjectParser::RRectToString(inner));
687 fInfo.push(SkObjectParser::PaintToString(paint));
690 void SkDrawDRRectCommand::execute(SkCanvas* canvas) {
691 canvas->drawDRRect(fOuter, fInner, fPaint);
694 bool SkDrawDRRectCommand::render(SkCanvas* canvas) const {
695 render_drrect(canvas, fOuter, fInner);
699 SkDrawSpriteCommand::SkDrawSpriteCommand(const SkBitmap& bitmap, int left, int top,
700 const SkPaint* paint)
701 : INHERITED(DRAW_SPRITE) {
712 fInfo.push(SkObjectParser::BitmapToString(bitmap));
713 fInfo.push(SkObjectParser::IntToString(left, "Left: "));
714 fInfo.push(SkObjectParser::IntToString(top, "Top: "));
716 fInfo.push(SkObjectParser::PaintToString(*paint));
720 void SkDrawSpriteCommand::execute(SkCanvas* canvas) {
721 canvas->drawSprite(fBitmap, fLeft, fTop, fPaintPtr);
724 bool SkDrawSpriteCommand::render(SkCanvas* canvas) const {
725 render_bitmap(canvas, fBitmap);
729 SkDrawTextCommand::SkDrawTextCommand(const void* text, size_t byteLength, SkScalar x, SkScalar y,
730 const SkPaint& paint)
731 : INHERITED(DRAW_TEXT) {
732 fText = new char[byteLength];
733 memcpy(fText, text, byteLength);
734 fByteLength = byteLength;
739 fInfo.push(SkObjectParser::TextToString(text, byteLength, paint.getTextEncoding()));
740 fInfo.push(SkObjectParser::ScalarToString(x, "SkScalar x: "));
741 fInfo.push(SkObjectParser::ScalarToString(y, "SkScalar y: "));
742 fInfo.push(SkObjectParser::PaintToString(paint));
745 void SkDrawTextCommand::execute(SkCanvas* canvas) {
746 canvas->drawText(fText, fByteLength, fX, fY, fPaint);
749 SkDrawTextOnPathCommand::SkDrawTextOnPathCommand(const void* text, size_t byteLength,
750 const SkPath& path, const SkMatrix* matrix,
751 const SkPaint& paint)
752 : INHERITED(DRAW_TEXT_ON_PATH) {
753 fText = new char[byteLength];
754 memcpy(fText, text, byteLength);
755 fByteLength = byteLength;
757 if (NULL != matrix) {
760 fMatrix.setIdentity();
764 fInfo.push(SkObjectParser::TextToString(text, byteLength, paint.getTextEncoding()));
765 fInfo.push(SkObjectParser::PathToString(path));
766 if (NULL != matrix) {
767 fInfo.push(SkObjectParser::MatrixToString(*matrix));
769 fInfo.push(SkObjectParser::PaintToString(paint));
772 void SkDrawTextOnPathCommand::execute(SkCanvas* canvas) {
773 canvas->drawTextOnPath(fText, fByteLength, fPath,
774 fMatrix.isIdentity() ? NULL : &fMatrix,
778 SkDrawVerticesCommand::SkDrawVerticesCommand(SkCanvas::VertexMode vmode, int vertexCount,
779 const SkPoint vertices[], const SkPoint texs[],
780 const SkColor colors[], SkXfermode* xfermode,
781 const uint16_t indices[], int indexCount,
782 const SkPaint& paint)
783 : INHERITED(DRAW_VERTICES) {
786 fVertexCount = vertexCount;
788 fVertices = new SkPoint[vertexCount];
789 memcpy(fVertices, vertices, vertexCount * sizeof(SkPoint));
792 fTexs = new SkPoint[vertexCount];
793 memcpy(fTexs, texs, vertexCount * sizeof(SkPoint));
798 if (NULL != colors) {
799 fColors = new SkColor[vertexCount];
800 memcpy(fColors, colors, vertexCount * sizeof(SkColor));
805 fXfermode = xfermode;
806 if (NULL != fXfermode) {
810 if (indexCount > 0) {
811 fIndices = new uint16_t[indexCount];
812 memcpy(fIndices, indices, indexCount * sizeof(uint16_t));
817 fIndexCount = indexCount;
821 fInfo.push(SkObjectParser::CustomTextToString("To be implemented."));
822 fInfo.push(SkObjectParser::PaintToString(paint));
825 SkDrawVerticesCommand::~SkDrawVerticesCommand() {
829 SkSafeUnref(fXfermode);
833 void SkDrawVerticesCommand::execute(SkCanvas* canvas) {
834 canvas->drawVertices(fVmode, fVertexCount, fVertices,
835 fTexs, fColors, fXfermode, fIndices,
836 fIndexCount, fPaint);
839 SkRestoreCommand::SkRestoreCommand()
840 : INHERITED(RESTORE) {
841 fInfo.push(SkObjectParser::CustomTextToString("No Parameters"));
844 void SkRestoreCommand::execute(SkCanvas* canvas) {
848 void SkRestoreCommand::trackSaveState(int* state) {
852 SkRotateCommand::SkRotateCommand(SkScalar degrees)
853 : INHERITED(ROTATE) {
856 fInfo.push(SkObjectParser::ScalarToString(degrees, "SkScalar degrees: "));
859 void SkRotateCommand::execute(SkCanvas* canvas) {
860 canvas->rotate(fDegrees);
863 SkSaveCommand::SkSaveCommand()
867 void SkSaveCommand::execute(SkCanvas* canvas) {
871 void SkSaveCommand::trackSaveState(int* state) {
875 SkSaveLayerCommand::SkSaveLayerCommand(const SkRect* bounds, const SkPaint* paint,
876 SkCanvas::SaveFlags flags)
877 : INHERITED(SAVE_LAYER) {
878 if (NULL != bounds) {
892 if (NULL != bounds) {
893 fInfo.push(SkObjectParser::RectToString(*bounds, "Bounds: "));
896 fInfo.push(SkObjectParser::PaintToString(*paint));
898 fInfo.push(SkObjectParser::SaveFlagsToString(flags));
901 void SkSaveLayerCommand::execute(SkCanvas* canvas) {
902 canvas->saveLayer(fBounds.isEmpty() ? NULL : &fBounds,
907 void SkSaveLayerCommand::vizExecute(SkCanvas* canvas) {
911 void SkSaveLayerCommand::trackSaveState(int* state) {
915 SkScaleCommand::SkScaleCommand(SkScalar sx, SkScalar sy)
920 fInfo.push(SkObjectParser::ScalarToString(sx, "SkScalar sx: "));
921 fInfo.push(SkObjectParser::ScalarToString(sy, "SkScalar sy: "));
924 void SkScaleCommand::execute(SkCanvas* canvas) {
925 canvas->scale(fSx, fSy);
928 SkSetMatrixCommand::SkSetMatrixCommand(const SkMatrix& matrix)
929 : INHERITED(SET_MATRIX) {
932 fInfo.push(SkObjectParser::MatrixToString(matrix));
935 void SkSetMatrixCommand::execute(SkCanvas* canvas) {
936 canvas->setMatrix(fMatrix);
939 SkSkewCommand::SkSkewCommand(SkScalar sx, SkScalar sy)
944 fInfo.push(SkObjectParser::ScalarToString(sx, "SkScalar sx: "));
945 fInfo.push(SkObjectParser::ScalarToString(sy, "SkScalar sy: "));
948 void SkSkewCommand::execute(SkCanvas* canvas) {
949 canvas->skew(fSx, fSy);
952 SkTranslateCommand::SkTranslateCommand(SkScalar dx, SkScalar dy)
953 : INHERITED(TRANSLATE) {
957 fInfo.push(SkObjectParser::ScalarToString(dx, "SkScalar dx: "));
958 fInfo.push(SkObjectParser::ScalarToString(dy, "SkScalar dy: "));
961 void SkTranslateCommand::execute(SkCanvas* canvas) {
962 canvas->translate(fDx, fDy);
965 SkPushCullCommand::SkPushCullCommand(const SkRect& cullRect)
966 : INHERITED(PUSH_CULL)
967 , fCullRect(cullRect) {
968 fInfo.push(SkObjectParser::RectToString(cullRect));
971 void SkPushCullCommand::execute(SkCanvas* canvas) {
972 canvas->pushCull(fCullRect);
975 void SkPushCullCommand::vizExecute(SkCanvas* canvas) {
976 canvas->pushCull(fCullRect);
979 p.setColor(SK_ColorCYAN);
980 p.setStyle(SkPaint::kStroke_Style);
981 canvas->drawRect(fCullRect, p);
984 SkPopCullCommand::SkPopCullCommand() : INHERITED(POP_CULL) { }
986 void SkPopCullCommand::execute(SkCanvas* canvas) {