michael@0: michael@0: /* michael@0: * Copyright 2012 Google Inc. michael@0: * michael@0: * Use of this source code is governed by a BSD-style license that can be michael@0: * found in the LICENSE file. michael@0: */ michael@0: michael@0: michael@0: #include "SkDrawCommand.h" michael@0: #include "SkObjectParser.h" michael@0: michael@0: // TODO(chudy): Refactor into non subclass model. michael@0: michael@0: SkDrawCommand::SkDrawCommand(DrawType type) michael@0: : fDrawType(type) michael@0: , fVisible(true) { michael@0: } michael@0: michael@0: SkDrawCommand::SkDrawCommand() { michael@0: fVisible = true; michael@0: } michael@0: michael@0: SkDrawCommand::~SkDrawCommand() { michael@0: fInfo.deleteAll(); michael@0: } michael@0: michael@0: const char* SkDrawCommand::GetCommandString(DrawType type) { michael@0: switch (type) { michael@0: case UNUSED: SkDEBUGFAIL("DrawType UNUSED\n"); break; michael@0: case DRAW_CLEAR: return "Clear"; michael@0: case CLIP_PATH: return "Clip Path"; michael@0: case CLIP_REGION: return "Clip Region"; michael@0: case CLIP_RECT: return "Clip Rect"; michael@0: case CLIP_RRECT: return "Clip RRect"; michael@0: case CONCAT: return "Concat"; michael@0: case DRAW_BITMAP: return "Draw Bitmap"; michael@0: case DRAW_BITMAP_MATRIX: return "Draw Bitmap Matrix"; michael@0: case DRAW_BITMAP_NINE: return "Draw Bitmap Nine"; michael@0: case DRAW_BITMAP_RECT_TO_RECT: return "Draw Bitmap Rect"; michael@0: case DRAW_DATA: return "Draw Data"; michael@0: case DRAW_OVAL: return "Draw Oval"; michael@0: case DRAW_PAINT: return "Draw Paint"; michael@0: case DRAW_PATH: return "Draw Path"; michael@0: case DRAW_PICTURE: return "Draw Picture"; michael@0: case DRAW_POINTS: return "Draw Points"; michael@0: case DRAW_POS_TEXT: return "Draw Pos Text"; michael@0: case DRAW_POS_TEXT_H: return "Draw Pos Text H"; michael@0: case DRAW_RECT: return "Draw Rect"; michael@0: case DRAW_RRECT: return "Draw RRect"; michael@0: case DRAW_SPRITE: return "Draw Sprite"; michael@0: case DRAW_TEXT: return "Draw Text"; michael@0: case DRAW_TEXT_ON_PATH: return "Draw Text On Path"; michael@0: case DRAW_VERTICES: return "Draw Vertices"; michael@0: case RESTORE: return "Restore"; michael@0: case ROTATE: return "Rotate"; michael@0: case SAVE: return "Save"; michael@0: case SAVE_LAYER: return "Save Layer"; michael@0: case SCALE: return "Scale"; michael@0: case SET_MATRIX: return "Set Matrix"; michael@0: case SKEW: return "Skew"; michael@0: case TRANSLATE: return "Translate"; michael@0: case NOOP: return "NoOp"; michael@0: case BEGIN_COMMENT_GROUP: return "BeginCommentGroup"; michael@0: case COMMENT: return "Comment"; michael@0: case END_COMMENT_GROUP: return "EndCommentGroup"; michael@0: case DRAW_DRRECT: return "Draw DRRect"; michael@0: case PUSH_CULL: return "PushCull"; michael@0: case POP_CULL: return "PopCull"; michael@0: default: michael@0: SkDebugf("DrawType error 0x%08x\n", type); michael@0: SkASSERT(0); michael@0: break; michael@0: } michael@0: SkDEBUGFAIL("DrawType UNUSED\n"); michael@0: return NULL; michael@0: } michael@0: michael@0: SkString SkDrawCommand::toString() { michael@0: return SkString(GetCommandString(fDrawType)); michael@0: } michael@0: michael@0: SkClearCommand::SkClearCommand(SkColor color) { michael@0: fColor = color; michael@0: fDrawType = DRAW_CLEAR; michael@0: fInfo.push(SkObjectParser::CustomTextToString("No Parameters")); michael@0: } michael@0: michael@0: void SkClearCommand::execute(SkCanvas* canvas) { michael@0: canvas->clear(fColor); michael@0: } michael@0: michael@0: namespace { michael@0: michael@0: void xlate_and_scale_to_bounds(SkCanvas* canvas, const SkRect& bounds) { michael@0: const SkISize& size = canvas->getDeviceSize(); michael@0: michael@0: static const SkScalar kInsetFrac = 0.9f; // Leave a border around object michael@0: michael@0: canvas->translate(size.fWidth/2.0f, size.fHeight/2.0f); michael@0: if (bounds.width() > bounds.height()) { michael@0: canvas->scale(SkDoubleToScalar((kInsetFrac*size.fWidth)/bounds.width()), michael@0: SkDoubleToScalar((kInsetFrac*size.fHeight)/bounds.width())); michael@0: } else { michael@0: canvas->scale(SkDoubleToScalar((kInsetFrac*size.fWidth)/bounds.height()), michael@0: SkDoubleToScalar((kInsetFrac*size.fHeight)/bounds.height())); michael@0: } michael@0: canvas->translate(-bounds.centerX(), -bounds.centerY()); michael@0: } michael@0: michael@0: michael@0: void render_path(SkCanvas* canvas, const SkPath& path) { michael@0: canvas->clear(0xFFFFFFFF); michael@0: canvas->save(); michael@0: michael@0: const SkRect& bounds = path.getBounds(); michael@0: michael@0: xlate_and_scale_to_bounds(canvas, bounds); michael@0: michael@0: SkPaint p; michael@0: p.setColor(SK_ColorBLACK); michael@0: p.setStyle(SkPaint::kStroke_Style); michael@0: michael@0: canvas->drawPath(path, p); michael@0: canvas->restore(); michael@0: } michael@0: michael@0: void render_bitmap(SkCanvas* canvas, const SkBitmap& input, const SkRect* srcRect = NULL) { michael@0: const SkISize& size = canvas->getDeviceSize(); michael@0: michael@0: SkScalar xScale = SkIntToScalar(size.fWidth-2) / input.width(); michael@0: SkScalar yScale = SkIntToScalar(size.fHeight-2) / input.height(); michael@0: michael@0: if (input.width() > input.height()) { michael@0: yScale *= input.height() / (float) input.width(); michael@0: } else { michael@0: xScale *= input.width() / (float) input.height(); michael@0: } michael@0: michael@0: SkRect dst = SkRect::MakeXYWH(SK_Scalar1, SK_Scalar1, michael@0: xScale * input.width(), michael@0: yScale * input.height()); michael@0: michael@0: canvas->clear(0xFFFFFFFF); michael@0: canvas->drawBitmapRect(input, NULL, dst); michael@0: michael@0: if (NULL != srcRect) { michael@0: SkRect r = SkRect::MakeLTRB(srcRect->fLeft * xScale + SK_Scalar1, michael@0: srcRect->fTop * yScale + SK_Scalar1, michael@0: srcRect->fRight * xScale + SK_Scalar1, michael@0: srcRect->fBottom * yScale + SK_Scalar1); michael@0: SkPaint p; michael@0: p.setColor(SK_ColorRED); michael@0: p.setStyle(SkPaint::kStroke_Style); michael@0: michael@0: canvas->drawRect(r, p); michael@0: } michael@0: } michael@0: michael@0: void render_rrect(SkCanvas* canvas, const SkRRect& rrect) { michael@0: canvas->clear(0xFFFFFFFF); michael@0: canvas->save(); michael@0: michael@0: const SkRect& bounds = rrect.getBounds(); michael@0: michael@0: xlate_and_scale_to_bounds(canvas, bounds); michael@0: michael@0: SkPaint p; michael@0: p.setColor(SK_ColorBLACK); michael@0: p.setStyle(SkPaint::kStroke_Style); michael@0: michael@0: canvas->drawRRect(rrect, p); michael@0: canvas->restore(); michael@0: } michael@0: michael@0: void render_drrect(SkCanvas* canvas, const SkRRect& outer, const SkRRect& inner) { michael@0: canvas->clear(0xFFFFFFFF); michael@0: canvas->save(); michael@0: michael@0: const SkRect& bounds = outer.getBounds(); michael@0: michael@0: xlate_and_scale_to_bounds(canvas, bounds); michael@0: michael@0: SkPaint p; michael@0: p.setColor(SK_ColorBLACK); michael@0: p.setStyle(SkPaint::kStroke_Style); michael@0: michael@0: canvas->drawDRRect(outer, inner, p); michael@0: canvas->restore(); michael@0: } michael@0: michael@0: }; michael@0: michael@0: michael@0: SkClipPathCommand::SkClipPathCommand(const SkPath& path, SkRegion::Op op, bool doAA) { michael@0: fPath = path; michael@0: fOp = op; michael@0: fDoAA = doAA; michael@0: fDrawType = CLIP_PATH; michael@0: michael@0: fInfo.push(SkObjectParser::PathToString(path)); michael@0: fInfo.push(SkObjectParser::RegionOpToString(op)); michael@0: fInfo.push(SkObjectParser::BoolToString(doAA)); michael@0: } michael@0: michael@0: void SkClipPathCommand::execute(SkCanvas* canvas) { michael@0: canvas->clipPath(fPath, fOp, fDoAA); michael@0: } michael@0: michael@0: bool SkClipPathCommand::render(SkCanvas* canvas) const { michael@0: render_path(canvas, fPath); michael@0: return true; michael@0: } michael@0: michael@0: SkClipRegionCommand::SkClipRegionCommand(const SkRegion& region, SkRegion::Op op) { michael@0: fRegion = region; michael@0: fOp = op; michael@0: fDrawType = CLIP_REGION; michael@0: michael@0: fInfo.push(SkObjectParser::RegionToString(region)); michael@0: fInfo.push(SkObjectParser::RegionOpToString(op)); michael@0: } michael@0: michael@0: void SkClipRegionCommand::execute(SkCanvas* canvas) { michael@0: canvas->clipRegion(fRegion, fOp); michael@0: } michael@0: michael@0: SkClipRectCommand::SkClipRectCommand(const SkRect& rect, SkRegion::Op op, bool doAA) { michael@0: fRect = rect; michael@0: fOp = op; michael@0: fDoAA = doAA; michael@0: fDrawType = CLIP_RECT; michael@0: michael@0: fInfo.push(SkObjectParser::RectToString(rect)); michael@0: fInfo.push(SkObjectParser::RegionOpToString(op)); michael@0: fInfo.push(SkObjectParser::BoolToString(doAA)); michael@0: } michael@0: michael@0: void SkClipRectCommand::execute(SkCanvas* canvas) { michael@0: canvas->clipRect(fRect, fOp, fDoAA); michael@0: } michael@0: michael@0: SkClipRRectCommand::SkClipRRectCommand(const SkRRect& rrect, SkRegion::Op op, bool doAA) { michael@0: fRRect = rrect; michael@0: fOp = op; michael@0: fDoAA = doAA; michael@0: fDrawType = CLIP_RRECT; michael@0: michael@0: fInfo.push(SkObjectParser::RRectToString(rrect)); michael@0: fInfo.push(SkObjectParser::RegionOpToString(op)); michael@0: fInfo.push(SkObjectParser::BoolToString(doAA)); michael@0: } michael@0: michael@0: void SkClipRRectCommand::execute(SkCanvas* canvas) { michael@0: canvas->clipRRect(fRRect, fOp, fDoAA); michael@0: } michael@0: michael@0: bool SkClipRRectCommand::render(SkCanvas* canvas) const { michael@0: render_rrect(canvas, fRRect); michael@0: return true; michael@0: } michael@0: michael@0: SkConcatCommand::SkConcatCommand(const SkMatrix& matrix) { michael@0: fMatrix = matrix; michael@0: fDrawType = CONCAT; michael@0: michael@0: fInfo.push(SkObjectParser::MatrixToString(matrix)); michael@0: } michael@0: michael@0: void SkConcatCommand::execute(SkCanvas* canvas) { michael@0: canvas->concat(fMatrix); michael@0: } michael@0: michael@0: SkDrawBitmapCommand::SkDrawBitmapCommand(const SkBitmap& bitmap, SkScalar left, SkScalar top, michael@0: const SkPaint* paint) { michael@0: fBitmap = bitmap; michael@0: fLeft = left; michael@0: fTop = top; michael@0: if (NULL != paint) { michael@0: fPaint = *paint; michael@0: fPaintPtr = &fPaint; michael@0: } else { michael@0: fPaintPtr = NULL; michael@0: } michael@0: fDrawType = DRAW_BITMAP; michael@0: michael@0: fInfo.push(SkObjectParser::BitmapToString(bitmap)); michael@0: fInfo.push(SkObjectParser::ScalarToString(left, "SkScalar left: ")); michael@0: fInfo.push(SkObjectParser::ScalarToString(top, "SkScalar top: ")); michael@0: if (NULL != paint) { michael@0: fInfo.push(SkObjectParser::PaintToString(*paint)); michael@0: } michael@0: } michael@0: michael@0: void SkDrawBitmapCommand::execute(SkCanvas* canvas) { michael@0: canvas->drawBitmap(fBitmap, fLeft, fTop, fPaintPtr); michael@0: } michael@0: michael@0: bool SkDrawBitmapCommand::render(SkCanvas* canvas) const { michael@0: render_bitmap(canvas, fBitmap); michael@0: return true; michael@0: } michael@0: michael@0: SkDrawBitmapMatrixCommand::SkDrawBitmapMatrixCommand(const SkBitmap& bitmap, michael@0: const SkMatrix& matrix, michael@0: const SkPaint* paint) { michael@0: fBitmap = bitmap; michael@0: fMatrix = matrix; michael@0: if (NULL != paint) { michael@0: fPaint = *paint; michael@0: fPaintPtr = &fPaint; michael@0: } else { michael@0: fPaintPtr = NULL; michael@0: } michael@0: fDrawType = DRAW_BITMAP_MATRIX; michael@0: michael@0: fInfo.push(SkObjectParser::BitmapToString(bitmap)); michael@0: fInfo.push(SkObjectParser::MatrixToString(matrix)); michael@0: if (NULL != paint) { michael@0: fInfo.push(SkObjectParser::PaintToString(*paint)); michael@0: } michael@0: } michael@0: michael@0: void SkDrawBitmapMatrixCommand::execute(SkCanvas* canvas) { michael@0: canvas->drawBitmapMatrix(fBitmap, fMatrix, fPaintPtr); michael@0: } michael@0: michael@0: bool SkDrawBitmapMatrixCommand::render(SkCanvas* canvas) const { michael@0: render_bitmap(canvas, fBitmap); michael@0: return true; michael@0: } michael@0: michael@0: SkDrawBitmapNineCommand::SkDrawBitmapNineCommand(const SkBitmap& bitmap, const SkIRect& center, michael@0: const SkRect& dst, const SkPaint* paint) { michael@0: fBitmap = bitmap; michael@0: fCenter = center; michael@0: fDst = dst; michael@0: if (NULL != paint) { michael@0: fPaint = *paint; michael@0: fPaintPtr = &fPaint; michael@0: } else { michael@0: fPaintPtr = NULL; michael@0: } michael@0: fDrawType = DRAW_BITMAP_NINE; michael@0: michael@0: fInfo.push(SkObjectParser::BitmapToString(bitmap)); michael@0: fInfo.push(SkObjectParser::IRectToString(center)); michael@0: fInfo.push(SkObjectParser::RectToString(dst, "Dst: ")); michael@0: if (NULL != paint) { michael@0: fInfo.push(SkObjectParser::PaintToString(*paint)); michael@0: } michael@0: } michael@0: michael@0: void SkDrawBitmapNineCommand::execute(SkCanvas* canvas) { michael@0: canvas->drawBitmapNine(fBitmap, fCenter, fDst, fPaintPtr); michael@0: } michael@0: michael@0: bool SkDrawBitmapNineCommand::render(SkCanvas* canvas) const { michael@0: render_bitmap(canvas, fBitmap); michael@0: return true; michael@0: } michael@0: michael@0: SkDrawBitmapRectCommand::SkDrawBitmapRectCommand(const SkBitmap& bitmap, const SkRect* src, michael@0: const SkRect& dst, const SkPaint* paint, michael@0: SkCanvas::DrawBitmapRectFlags flags) { michael@0: fBitmap = bitmap; michael@0: if (NULL != src) { michael@0: fSrc = *src; michael@0: } else { michael@0: fSrc.setEmpty(); michael@0: } michael@0: fDst = dst; michael@0: michael@0: if (NULL != paint) { michael@0: fPaint = *paint; michael@0: fPaintPtr = &fPaint; michael@0: } else { michael@0: fPaintPtr = NULL; michael@0: } michael@0: fFlags = flags; michael@0: michael@0: fDrawType = DRAW_BITMAP_RECT_TO_RECT; michael@0: michael@0: fInfo.push(SkObjectParser::BitmapToString(bitmap)); michael@0: if (NULL != src) { michael@0: fInfo.push(SkObjectParser::RectToString(*src, "Src: ")); michael@0: } michael@0: fInfo.push(SkObjectParser::RectToString(dst, "Dst: ")); michael@0: if (NULL != paint) { michael@0: fInfo.push(SkObjectParser::PaintToString(*paint)); michael@0: } michael@0: fInfo.push(SkObjectParser::IntToString(fFlags, "Flags: ")); michael@0: } michael@0: michael@0: void SkDrawBitmapRectCommand::execute(SkCanvas* canvas) { michael@0: canvas->drawBitmapRectToRect(fBitmap, this->srcRect(), fDst, fPaintPtr, fFlags); michael@0: } michael@0: michael@0: bool SkDrawBitmapRectCommand::render(SkCanvas* canvas) const { michael@0: render_bitmap(canvas, fBitmap, this->srcRect()); michael@0: return true; michael@0: } michael@0: michael@0: SkDrawDataCommand::SkDrawDataCommand(const void* data, size_t length) { michael@0: fData = new char[length]; michael@0: memcpy(fData, data, length); michael@0: fLength = length; michael@0: fDrawType = DRAW_DATA; michael@0: michael@0: // TODO: add display of actual data? michael@0: SkString* str = new SkString; michael@0: str->appendf("length: %d", (int) length); michael@0: fInfo.push(str); michael@0: } michael@0: michael@0: void SkDrawDataCommand::execute(SkCanvas* canvas) { michael@0: canvas->drawData(fData, fLength); michael@0: } michael@0: michael@0: SkBeginCommentGroupCommand::SkBeginCommentGroupCommand(const char* description) michael@0: : INHERITED(BEGIN_COMMENT_GROUP) michael@0: , fDescription(description) { michael@0: SkString* temp = new SkString; michael@0: temp->appendf("Description: %s", description); michael@0: fInfo.push(temp); michael@0: } michael@0: michael@0: SkCommentCommand::SkCommentCommand(const char* kywd, const char* value) michael@0: : INHERITED(COMMENT) michael@0: , fKywd(kywd) michael@0: , fValue(value) { michael@0: SkString* temp = new SkString; michael@0: temp->appendf("%s: %s", kywd, value); michael@0: fInfo.push(temp); michael@0: } michael@0: michael@0: SkEndCommentGroupCommand::SkEndCommentGroupCommand() : INHERITED(END_COMMENT_GROUP) { michael@0: } michael@0: michael@0: SkDrawOvalCommand::SkDrawOvalCommand(const SkRect& oval, const SkPaint& paint) { michael@0: fOval = oval; michael@0: fPaint = paint; michael@0: fDrawType = DRAW_OVAL; michael@0: michael@0: fInfo.push(SkObjectParser::RectToString(oval)); michael@0: fInfo.push(SkObjectParser::PaintToString(paint)); michael@0: } michael@0: michael@0: void SkDrawOvalCommand::execute(SkCanvas* canvas) { michael@0: canvas->drawOval(fOval, fPaint); michael@0: } michael@0: michael@0: bool SkDrawOvalCommand::render(SkCanvas* canvas) const { michael@0: canvas->clear(0xFFFFFFFF); michael@0: canvas->save(); michael@0: michael@0: xlate_and_scale_to_bounds(canvas, fOval); michael@0: michael@0: SkPaint p; michael@0: p.setColor(SK_ColorBLACK); michael@0: p.setStyle(SkPaint::kStroke_Style); michael@0: michael@0: canvas->drawOval(fOval, p); michael@0: canvas->restore(); michael@0: michael@0: return true; michael@0: } michael@0: michael@0: SkDrawPaintCommand::SkDrawPaintCommand(const SkPaint& paint) { michael@0: fPaint = paint; michael@0: fDrawType = DRAW_PAINT; michael@0: michael@0: fInfo.push(SkObjectParser::PaintToString(paint)); michael@0: } michael@0: michael@0: void SkDrawPaintCommand::execute(SkCanvas* canvas) { michael@0: canvas->drawPaint(fPaint); michael@0: } michael@0: michael@0: bool SkDrawPaintCommand::render(SkCanvas* canvas) const { michael@0: canvas->clear(0xFFFFFFFF); michael@0: canvas->drawPaint(fPaint); michael@0: return true; michael@0: } michael@0: michael@0: SkDrawPathCommand::SkDrawPathCommand(const SkPath& path, const SkPaint& paint) { michael@0: fPath = path; michael@0: fPaint = paint; michael@0: fDrawType = DRAW_PATH; michael@0: michael@0: fInfo.push(SkObjectParser::PathToString(path)); michael@0: fInfo.push(SkObjectParser::PaintToString(paint)); michael@0: } michael@0: michael@0: void SkDrawPathCommand::execute(SkCanvas* canvas) { michael@0: canvas->drawPath(fPath, fPaint); michael@0: } michael@0: michael@0: bool SkDrawPathCommand::render(SkCanvas* canvas) const { michael@0: render_path(canvas, fPath); michael@0: return true; michael@0: } michael@0: michael@0: SkDrawPictureCommand::SkDrawPictureCommand(SkPicture& picture) : michael@0: fPicture(picture) { michael@0: fDrawType = DRAW_PICTURE; michael@0: SkString* temp = new SkString; michael@0: temp->appendf("SkPicture: W: %d H: %d", picture.width(), picture.height()); michael@0: fInfo.push(temp); michael@0: } michael@0: michael@0: void SkDrawPictureCommand::execute(SkCanvas* canvas) { michael@0: canvas->drawPicture(fPicture); michael@0: } michael@0: michael@0: bool SkDrawPictureCommand::render(SkCanvas* canvas) const { michael@0: canvas->clear(0xFFFFFFFF); michael@0: canvas->save(); michael@0: michael@0: SkRect bounds = SkRect::MakeWH(SkIntToScalar(fPicture.width()), michael@0: SkIntToScalar(fPicture.height())); michael@0: xlate_and_scale_to_bounds(canvas, bounds); michael@0: michael@0: canvas->drawPicture(const_cast(fPicture)); michael@0: michael@0: canvas->restore(); michael@0: michael@0: return true; michael@0: } michael@0: michael@0: SkDrawPointsCommand::SkDrawPointsCommand(SkCanvas::PointMode mode, size_t count, michael@0: const SkPoint pts[], const SkPaint& paint) { michael@0: fMode = mode; michael@0: fCount = count; michael@0: fPts = new SkPoint[count]; michael@0: memcpy(fPts, pts, count * sizeof(SkPoint)); michael@0: fPaint = paint; michael@0: fDrawType = DRAW_POINTS; michael@0: michael@0: fInfo.push(SkObjectParser::PointsToString(pts, count)); michael@0: fInfo.push(SkObjectParser::ScalarToString(SkIntToScalar((unsigned int)count), michael@0: "Points: ")); michael@0: fInfo.push(SkObjectParser::PointModeToString(mode)); michael@0: fInfo.push(SkObjectParser::PaintToString(paint)); michael@0: } michael@0: michael@0: void SkDrawPointsCommand::execute(SkCanvas* canvas) { michael@0: canvas->drawPoints(fMode, fCount, fPts, fPaint); michael@0: } michael@0: michael@0: bool SkDrawPointsCommand::render(SkCanvas* canvas) const { michael@0: canvas->clear(0xFFFFFFFF); michael@0: canvas->save(); michael@0: michael@0: SkRect bounds; michael@0: michael@0: bounds.setEmpty(); michael@0: for (unsigned int i = 0; i < fCount; ++i) { michael@0: bounds.growToInclude(fPts[i].fX, fPts[i].fY); michael@0: } michael@0: michael@0: xlate_and_scale_to_bounds(canvas, bounds); michael@0: michael@0: SkPaint p; michael@0: p.setColor(SK_ColorBLACK); michael@0: p.setStyle(SkPaint::kStroke_Style); michael@0: michael@0: canvas->drawPoints(fMode, fCount, fPts, p); michael@0: canvas->restore(); michael@0: michael@0: return true; michael@0: } michael@0: michael@0: SkDrawPosTextCommand::SkDrawPosTextCommand(const void* text, size_t byteLength, michael@0: const SkPoint pos[], const SkPaint& paint) { michael@0: size_t numPts = paint.countText(text, byteLength); michael@0: michael@0: fText = new char[byteLength]; michael@0: memcpy(fText, text, byteLength); michael@0: fByteLength = byteLength; michael@0: michael@0: fPos = new SkPoint[numPts]; michael@0: memcpy(fPos, pos, numPts * sizeof(SkPoint)); michael@0: michael@0: fPaint = paint; michael@0: fDrawType = DRAW_POS_TEXT; michael@0: michael@0: fInfo.push(SkObjectParser::TextToString(text, byteLength, paint.getTextEncoding())); michael@0: // TODO(chudy): Test that this works. michael@0: fInfo.push(SkObjectParser::PointsToString(pos, 1)); michael@0: fInfo.push(SkObjectParser::PaintToString(paint)); michael@0: } michael@0: michael@0: void SkDrawPosTextCommand::execute(SkCanvas* canvas) { michael@0: canvas->drawPosText(fText, fByteLength, fPos, fPaint); michael@0: } michael@0: michael@0: michael@0: SkDrawPosTextHCommand::SkDrawPosTextHCommand(const void* text, size_t byteLength, michael@0: const SkScalar xpos[], SkScalar constY, michael@0: const SkPaint& paint) { michael@0: size_t numPts = paint.countText(text, byteLength); michael@0: michael@0: fText = new char[byteLength]; michael@0: memcpy(fText, text, byteLength); michael@0: fByteLength = byteLength; michael@0: michael@0: fXpos = new SkScalar[numPts]; michael@0: memcpy(fXpos, xpos, numPts * sizeof(SkScalar)); michael@0: michael@0: fConstY = constY; michael@0: fPaint = paint; michael@0: fDrawType = DRAW_POS_TEXT_H; michael@0: michael@0: fInfo.push(SkObjectParser::TextToString(text, byteLength, paint.getTextEncoding())); michael@0: fInfo.push(SkObjectParser::ScalarToString(xpos[0], "XPOS: ")); michael@0: fInfo.push(SkObjectParser::ScalarToString(constY, "SkScalar constY: ")); michael@0: fInfo.push(SkObjectParser::PaintToString(paint)); michael@0: } michael@0: michael@0: void SkDrawPosTextHCommand::execute(SkCanvas* canvas) { michael@0: canvas->drawPosTextH(fText, fByteLength, fXpos, fConstY, fPaint); michael@0: } michael@0: michael@0: SkDrawRectCommand::SkDrawRectCommand(const SkRect& rect, const SkPaint& paint) { michael@0: fRect = rect; michael@0: fPaint = paint; michael@0: fDrawType = DRAW_RECT; michael@0: michael@0: fInfo.push(SkObjectParser::RectToString(rect)); michael@0: fInfo.push(SkObjectParser::PaintToString(paint)); michael@0: } michael@0: michael@0: void SkDrawRectCommand::execute(SkCanvas* canvas) { michael@0: canvas->drawRect(fRect, fPaint); michael@0: } michael@0: michael@0: SkDrawRRectCommand::SkDrawRRectCommand(const SkRRect& rrect, const SkPaint& paint) { michael@0: fRRect = rrect; michael@0: fPaint = paint; michael@0: fDrawType = DRAW_RRECT; michael@0: michael@0: fInfo.push(SkObjectParser::RRectToString(rrect)); michael@0: fInfo.push(SkObjectParser::PaintToString(paint)); michael@0: } michael@0: michael@0: void SkDrawRRectCommand::execute(SkCanvas* canvas) { michael@0: canvas->drawRRect(fRRect, fPaint); michael@0: } michael@0: michael@0: bool SkDrawRRectCommand::render(SkCanvas* canvas) const { michael@0: render_rrect(canvas, fRRect); michael@0: return true; michael@0: } michael@0: michael@0: SkDrawDRRectCommand::SkDrawDRRectCommand(const SkRRect& outer, michael@0: const SkRRect& inner, michael@0: const SkPaint& paint) { michael@0: fOuter = outer; michael@0: fInner = inner; michael@0: fPaint = paint; michael@0: fDrawType = DRAW_DRRECT; michael@0: michael@0: fInfo.push(SkObjectParser::RRectToString(outer)); michael@0: fInfo.push(SkObjectParser::RRectToString(inner)); michael@0: fInfo.push(SkObjectParser::PaintToString(paint)); michael@0: } michael@0: michael@0: void SkDrawDRRectCommand::execute(SkCanvas* canvas) { michael@0: canvas->drawDRRect(fOuter, fInner, fPaint); michael@0: } michael@0: michael@0: bool SkDrawDRRectCommand::render(SkCanvas* canvas) const { michael@0: render_drrect(canvas, fOuter, fInner); michael@0: return true; michael@0: } michael@0: michael@0: SkDrawSpriteCommand::SkDrawSpriteCommand(const SkBitmap& bitmap, int left, int top, michael@0: const SkPaint* paint) { michael@0: fBitmap = bitmap; michael@0: fLeft = left; michael@0: fTop = top; michael@0: if (NULL != paint) { michael@0: fPaint = *paint; michael@0: fPaintPtr = &fPaint; michael@0: } else { michael@0: fPaintPtr = NULL; michael@0: } michael@0: fDrawType = DRAW_SPRITE; michael@0: michael@0: fInfo.push(SkObjectParser::BitmapToString(bitmap)); michael@0: fInfo.push(SkObjectParser::IntToString(left, "Left: ")); michael@0: fInfo.push(SkObjectParser::IntToString(top, "Top: ")); michael@0: if (NULL != paint) { michael@0: fInfo.push(SkObjectParser::PaintToString(*paint)); michael@0: } michael@0: } michael@0: michael@0: void SkDrawSpriteCommand::execute(SkCanvas* canvas) { michael@0: canvas->drawSprite(fBitmap, fLeft, fTop, fPaintPtr); michael@0: } michael@0: michael@0: bool SkDrawSpriteCommand::render(SkCanvas* canvas) const { michael@0: render_bitmap(canvas, fBitmap); michael@0: return true; michael@0: } michael@0: michael@0: SkDrawTextCommand::SkDrawTextCommand(const void* text, size_t byteLength, SkScalar x, SkScalar y, michael@0: const SkPaint& paint) { michael@0: fText = new char[byteLength]; michael@0: memcpy(fText, text, byteLength); michael@0: fByteLength = byteLength; michael@0: fX = x; michael@0: fY = y; michael@0: fPaint = paint; michael@0: fDrawType = DRAW_TEXT; michael@0: michael@0: fInfo.push(SkObjectParser::TextToString(text, byteLength, paint.getTextEncoding())); michael@0: fInfo.push(SkObjectParser::ScalarToString(x, "SkScalar x: ")); michael@0: fInfo.push(SkObjectParser::ScalarToString(y, "SkScalar y: ")); michael@0: fInfo.push(SkObjectParser::PaintToString(paint)); michael@0: } michael@0: michael@0: void SkDrawTextCommand::execute(SkCanvas* canvas) { michael@0: canvas->drawText(fText, fByteLength, fX, fY, fPaint); michael@0: } michael@0: michael@0: SkDrawTextOnPathCommand::SkDrawTextOnPathCommand(const void* text, size_t byteLength, michael@0: const SkPath& path, const SkMatrix* matrix, michael@0: const SkPaint& paint) { michael@0: fText = new char[byteLength]; michael@0: memcpy(fText, text, byteLength); michael@0: fByteLength = byteLength; michael@0: fPath = path; michael@0: if (NULL != matrix) { michael@0: fMatrix = *matrix; michael@0: } else { michael@0: fMatrix.setIdentity(); michael@0: } michael@0: fPaint = paint; michael@0: fDrawType = DRAW_TEXT_ON_PATH; michael@0: michael@0: fInfo.push(SkObjectParser::TextToString(text, byteLength, paint.getTextEncoding())); michael@0: fInfo.push(SkObjectParser::PathToString(path)); michael@0: if (NULL != matrix) { michael@0: fInfo.push(SkObjectParser::MatrixToString(*matrix)); michael@0: } michael@0: fInfo.push(SkObjectParser::PaintToString(paint)); michael@0: } michael@0: michael@0: void SkDrawTextOnPathCommand::execute(SkCanvas* canvas) { michael@0: canvas->drawTextOnPath(fText, fByteLength, fPath, michael@0: fMatrix.isIdentity() ? NULL : &fMatrix, michael@0: fPaint); michael@0: } michael@0: michael@0: SkDrawVerticesCommand::SkDrawVerticesCommand(SkCanvas::VertexMode vmode, int vertexCount, michael@0: const SkPoint vertices[], const SkPoint texs[], michael@0: const SkColor colors[], SkXfermode* xfermode, michael@0: const uint16_t indices[], int indexCount, michael@0: const SkPaint& paint) { michael@0: fVmode = vmode; michael@0: michael@0: fVertexCount = vertexCount; michael@0: michael@0: fVertices = new SkPoint[vertexCount]; michael@0: memcpy(fVertices, vertices, vertexCount * sizeof(SkPoint)); michael@0: michael@0: if (NULL != texs) { michael@0: fTexs = new SkPoint[vertexCount]; michael@0: memcpy(fTexs, texs, vertexCount * sizeof(SkPoint)); michael@0: } else { michael@0: fTexs = NULL; michael@0: } michael@0: michael@0: if (NULL != colors) { michael@0: fColors = new SkColor[vertexCount]; michael@0: memcpy(fColors, colors, vertexCount * sizeof(SkColor)); michael@0: } else { michael@0: fColors = NULL; michael@0: } michael@0: michael@0: fXfermode = xfermode; michael@0: if (NULL != fXfermode) { michael@0: fXfermode->ref(); michael@0: } michael@0: michael@0: if (indexCount > 0) { michael@0: fIndices = new uint16_t[indexCount]; michael@0: memcpy(fIndices, indices, indexCount * sizeof(uint16_t)); michael@0: } else { michael@0: fIndices = NULL; michael@0: } michael@0: michael@0: fIndexCount = indexCount; michael@0: fPaint = paint; michael@0: fDrawType = DRAW_VERTICES; michael@0: michael@0: // TODO(chudy) michael@0: fInfo.push(SkObjectParser::CustomTextToString("To be implemented.")); michael@0: fInfo.push(SkObjectParser::PaintToString(paint)); michael@0: } michael@0: michael@0: SkDrawVerticesCommand::~SkDrawVerticesCommand() { michael@0: delete [] fVertices; michael@0: delete [] fTexs; michael@0: delete [] fColors; michael@0: SkSafeUnref(fXfermode); michael@0: delete [] fIndices; michael@0: } michael@0: michael@0: void SkDrawVerticesCommand::execute(SkCanvas* canvas) { michael@0: canvas->drawVertices(fVmode, fVertexCount, fVertices, michael@0: fTexs, fColors, fXfermode, fIndices, michael@0: fIndexCount, fPaint); michael@0: } michael@0: michael@0: SkRestoreCommand::SkRestoreCommand() { michael@0: fDrawType = RESTORE; michael@0: fInfo.push(SkObjectParser::CustomTextToString("No Parameters")); michael@0: } michael@0: michael@0: void SkRestoreCommand::execute(SkCanvas* canvas) { michael@0: canvas->restore(); michael@0: } michael@0: michael@0: void SkRestoreCommand::trackSaveState(int* state) { michael@0: (*state)--; michael@0: } michael@0: michael@0: SkRotateCommand::SkRotateCommand(SkScalar degrees) { michael@0: fDegrees = degrees; michael@0: fDrawType = ROTATE; michael@0: michael@0: fInfo.push(SkObjectParser::ScalarToString(degrees, "SkScalar degrees: ")); michael@0: } michael@0: michael@0: void SkRotateCommand::execute(SkCanvas* canvas) { michael@0: canvas->rotate(fDegrees); michael@0: } michael@0: michael@0: SkSaveCommand::SkSaveCommand(SkCanvas::SaveFlags flags) { michael@0: fFlags = flags; michael@0: fDrawType = SAVE; michael@0: fInfo.push(SkObjectParser::SaveFlagsToString(flags)); michael@0: } michael@0: michael@0: void SkSaveCommand::execute(SkCanvas* canvas) { michael@0: canvas->save(fFlags); michael@0: } michael@0: michael@0: void SkSaveCommand::trackSaveState(int* state) { michael@0: (*state)++; michael@0: } michael@0: michael@0: SkSaveLayerCommand::SkSaveLayerCommand(const SkRect* bounds, const SkPaint* paint, michael@0: SkCanvas::SaveFlags flags) { michael@0: if (NULL != bounds) { michael@0: fBounds = *bounds; michael@0: } else { michael@0: fBounds.setEmpty(); michael@0: } michael@0: michael@0: if (NULL != paint) { michael@0: fPaint = *paint; michael@0: fPaintPtr = &fPaint; michael@0: } else { michael@0: fPaintPtr = NULL; michael@0: } michael@0: fFlags = flags; michael@0: fDrawType = SAVE_LAYER; michael@0: michael@0: if (NULL != bounds) { michael@0: fInfo.push(SkObjectParser::RectToString(*bounds, "Bounds: ")); michael@0: } michael@0: if (NULL != paint) { michael@0: fInfo.push(SkObjectParser::PaintToString(*paint)); michael@0: } michael@0: fInfo.push(SkObjectParser::SaveFlagsToString(flags)); michael@0: } michael@0: michael@0: void SkSaveLayerCommand::execute(SkCanvas* canvas) { michael@0: canvas->saveLayer(fBounds.isEmpty() ? NULL : &fBounds, michael@0: fPaintPtr, michael@0: fFlags); michael@0: } michael@0: michael@0: void SkSaveLayerCommand::vizExecute(SkCanvas* canvas) { michael@0: canvas->save(); michael@0: } michael@0: michael@0: void SkSaveLayerCommand::trackSaveState(int* state) { michael@0: (*state)++; michael@0: } michael@0: michael@0: SkScaleCommand::SkScaleCommand(SkScalar sx, SkScalar sy) { michael@0: fSx = sx; michael@0: fSy = sy; michael@0: fDrawType = SCALE; michael@0: michael@0: fInfo.push(SkObjectParser::ScalarToString(sx, "SkScalar sx: ")); michael@0: fInfo.push(SkObjectParser::ScalarToString(sy, "SkScalar sy: ")); michael@0: } michael@0: michael@0: void SkScaleCommand::execute(SkCanvas* canvas) { michael@0: canvas->scale(fSx, fSy); michael@0: } michael@0: michael@0: SkSetMatrixCommand::SkSetMatrixCommand(const SkMatrix& matrix) { michael@0: fMatrix = matrix; michael@0: fDrawType = SET_MATRIX; michael@0: michael@0: fInfo.push(SkObjectParser::MatrixToString(matrix)); michael@0: } michael@0: michael@0: void SkSetMatrixCommand::execute(SkCanvas* canvas) { michael@0: canvas->setMatrix(fMatrix); michael@0: } michael@0: michael@0: SkSkewCommand::SkSkewCommand(SkScalar sx, SkScalar sy) { michael@0: fSx = sx; michael@0: fSy = sy; michael@0: fDrawType = SKEW; michael@0: michael@0: fInfo.push(SkObjectParser::ScalarToString(sx, "SkScalar sx: ")); michael@0: fInfo.push(SkObjectParser::ScalarToString(sy, "SkScalar sy: ")); michael@0: } michael@0: michael@0: void SkSkewCommand::execute(SkCanvas* canvas) { michael@0: canvas->skew(fSx, fSy); michael@0: } michael@0: michael@0: SkTranslateCommand::SkTranslateCommand(SkScalar dx, SkScalar dy) { michael@0: fDx = dx; michael@0: fDy = dy; michael@0: fDrawType = TRANSLATE; michael@0: michael@0: fInfo.push(SkObjectParser::ScalarToString(dx, "SkScalar dx: ")); michael@0: fInfo.push(SkObjectParser::ScalarToString(dy, "SkScalar dy: ")); michael@0: } michael@0: michael@0: void SkTranslateCommand::execute(SkCanvas* canvas) { michael@0: canvas->translate(fDx, fDy); michael@0: } michael@0: michael@0: SkPushCullCommand::SkPushCullCommand(const SkRect& cullRect) michael@0: : fCullRect(cullRect) { michael@0: fDrawType = PUSH_CULL; michael@0: fInfo.push(SkObjectParser::RectToString(cullRect)); michael@0: } michael@0: michael@0: void SkPushCullCommand::execute(SkCanvas* canvas) { michael@0: canvas->pushCull(fCullRect); michael@0: } michael@0: michael@0: void SkPushCullCommand::vizExecute(SkCanvas* canvas) { michael@0: canvas->pushCull(fCullRect); michael@0: michael@0: SkPaint p; michael@0: p.setColor(SK_ColorCYAN); michael@0: p.setStyle(SkPaint::kStroke_Style); michael@0: canvas->drawRect(fCullRect, p); michael@0: } michael@0: michael@0: SkPopCullCommand::SkPopCullCommand() { michael@0: fDrawType = POP_CULL; michael@0: } michael@0: michael@0: void SkPopCullCommand::execute(SkCanvas* canvas) { michael@0: canvas->popCull(); michael@0: }