diff options
author | 2017-01-12 16:20:50 -0500 | |
---|---|---|
committer | 2017-01-12 21:55:35 +0000 | |
commit | ac42aebb7b49ef3d916da1e5a75b4c7cd4cfb119 (patch) | |
tree | f7826078a58bc8c046f5e1852ffa6d331bd64271 /tools/debugger/SkDrawCommand.cpp | |
parent | b46fff60bc82fe6f0c64b2241d854a121f7cb5f9 (diff) |
Add support for drawImageLattice in SKIA debugger
Add support in SKIA debugger for SkCanvas.drawImageLattice calls.
Test: Tested with an SKP from android settings app.
Change-Id: I3f39f353dca8a3a2854241e7ef995d4d8c635f3e
Reviewed-on: https://skia-review.googlesource.com/6882
Commit-Queue: Stan Iliev <stani@google.com>
Reviewed-by: Joe Gregorio <jcgregorio@google.com>
Reviewed-by: Derek Sollenberger <djsollen@google.com>
Diffstat (limited to 'tools/debugger/SkDrawCommand.cpp')
-rw-r--r-- | tools/debugger/SkDrawCommand.cpp | 94 |
1 files changed, 94 insertions, 0 deletions
diff --git a/tools/debugger/SkDrawCommand.cpp b/tools/debugger/SkDrawCommand.cpp index 6dea988831..3bb1b90867 100644 --- a/tools/debugger/SkDrawCommand.cpp +++ b/tools/debugger/SkDrawCommand.cpp @@ -28,6 +28,7 @@ #include "SkWriteBuffer.h" #include "picture_utils.h" #include "SkClipOpPriv.h" +#include <SkLatticeIter.h> #define SKDEBUGCANVAS_ATTRIBUTE_COMMAND "command" #define SKDEBUGCANVAS_ATTRIBUTE_VISIBLE "visible" @@ -105,6 +106,12 @@ #define SKDEBUGCANVAS_ATTRIBUTE_WIDTH "width" #define SKDEBUGCANVAS_ATTRIBUTE_HEIGHT "height" #define SKDEBUGCANVAS_ATTRIBUTE_ALPHA "alpha" +#define SKDEBUGCANVAS_ATTRIBUTE_LATTICE "lattice" +#define SKDEBUGCANVAS_ATTRIBUTE_LATTICEXCOUNT "xCount" +#define SKDEBUGCANVAS_ATTRIBUTE_LATTICEYCOUNT "yCount" +#define SKDEBUGCANVAS_ATTRIBUTE_LATTICEXDIVS "xDivs" +#define SKDEBUGCANVAS_ATTRIBUTE_LATTICEYDIVS "yDivs" +#define SKDEBUGCANVAS_ATTRIBUTE_LATTICEFLAGS "flags" #define SKDEBUGCANVAS_VERB_MOVE "move" #define SKDEBUGCANVAS_VERB_LINE "line" @@ -210,6 +217,7 @@ const char* SkDrawCommand::GetCommandString(OpType type) { case kDrawClear_OpType: return "DrawClear"; case kDrawDRRect_OpType: return "DrawDRRect"; case kDrawImage_OpType: return "DrawImage"; + case kDrawImageLattice_OpType: return "DrawImageLattice"; case kDrawImageRect_OpType: return "DrawImageRect"; case kDrawOval_OpType: return "DrawOval"; case kDrawPaint_OpType: return "DrawPaint"; @@ -1178,6 +1186,38 @@ Json::Value SkDrawCommand::MakeJsonPaint(const SkPaint& paint, UrlDataManager& u return result; } +Json::Value SkDrawCommand::MakeJsonLattice(const SkCanvas::Lattice& lattice) { + Json::Value result(Json::objectValue); + result[SKDEBUGCANVAS_ATTRIBUTE_LATTICEXCOUNT] = Json::Value(lattice.fXCount); + result[SKDEBUGCANVAS_ATTRIBUTE_LATTICEYCOUNT] = Json::Value(lattice.fYCount); + if (nullptr != lattice.fBounds) { + result[SKDEBUGCANVAS_ATTRIBUTE_BOUNDS] = MakeJsonIRect(*lattice.fBounds); + } + Json::Value XDivs(Json::arrayValue); + for (int i = 0; i < lattice.fXCount; i++) { + XDivs.append(Json::Value(lattice.fXDivs[i])); + } + result[SKDEBUGCANVAS_ATTRIBUTE_LATTICEXDIVS] = XDivs; + Json::Value YDivs(Json::arrayValue); + for (int i = 0; i < lattice.fYCount; i++) { + YDivs.append(Json::Value(lattice.fYDivs[i])); + } + result[SKDEBUGCANVAS_ATTRIBUTE_LATTICEYDIVS] = YDivs; + if (nullptr != lattice.fFlags) { + Json::Value flags(Json::arrayValue); + int flagCount = 0; + for (int row = 0; row < lattice.fYCount+1; row++) { + Json::Value flagsRow(Json::arrayValue); + for (int column = 0; column < lattice.fXCount+1; column++) { + flagsRow.append(Json::Value(lattice.fFlags[flagCount++])); + } + flags.append(flagsRow); + } + result[SKDEBUGCANVAS_ATTRIBUTE_LATTICEFLAGS] = flags; + } + return result; +} + static SkPoint get_json_point(Json::Value point) { return SkPoint::Make(point[0].asFloat(), point[1].asFloat()); } @@ -2167,6 +2207,60 @@ SkDrawImageCommand* SkDrawImageCommand::fromJSON(Json::Value& command, return result; } +SkDrawImageLatticeCommand::SkDrawImageLatticeCommand(const SkImage* image, + const SkCanvas::Lattice& lattice, + const SkRect& dst, const SkPaint* paint) + : INHERITED(kDrawImageLattice_OpType) + , fImage(SkRef(image)) + , fLattice(lattice) + , fDst(dst) { + + fInfo.push(SkObjectParser::ImageToString(image)); + fInfo.push(SkObjectParser::LatticeToString(lattice)); + fInfo.push(SkObjectParser::RectToString(dst, "Dst: ")); + if (paint) { + fPaint.set(*paint); + fInfo.push(SkObjectParser::PaintToString(*paint)); + } +} + +void SkDrawImageLatticeCommand::execute(SkCanvas* canvas) const { + SkLatticeIter iter(fLattice, fDst); + SkRect srcR, dstR; + while (iter.next(&srcR, &dstR)) { + canvas->legacy_drawImageRect(fImage.get(), &srcR, dstR, + fPaint.getMaybeNull(), SkCanvas::kStrict_SrcRectConstraint); + } +} + +bool SkDrawImageLatticeCommand::render(SkCanvas* canvas) const { + SkAutoCanvasRestore acr(canvas, true); + canvas->clear(0xFFFFFFFF); + + xlate_and_scale_to_bounds(canvas, fDst); + + this->execute(canvas); + return true; +} + +Json::Value SkDrawImageLatticeCommand::toJSON(UrlDataManager& urlDataManager) const { + Json::Value result = INHERITED::toJSON(urlDataManager); + Json::Value encoded; + if (flatten(*fImage.get(), &encoded, urlDataManager)) { + result[SKDEBUGCANVAS_ATTRIBUTE_BITMAP] = encoded; + result[SKDEBUGCANVAS_ATTRIBUTE_LATTICE] = MakeJsonLattice(fLattice); + result[SKDEBUGCANVAS_ATTRIBUTE_DST] = MakeJsonRect(fDst); + if (fPaint.isValid()) { + result[SKDEBUGCANVAS_ATTRIBUTE_PAINT] = MakeJsonPaint(*fPaint.get(), urlDataManager); + } + } + + SkString desc; + result[SKDEBUGCANVAS_ATTRIBUTE_SHORTDESC] = Json::Value(str_append(&desc, fDst)->c_str()); + + return result; +} + SkDrawImageRectCommand::SkDrawImageRectCommand(const SkImage* image, const SkRect* src, const SkRect& dst, const SkPaint* paint, SkCanvas::SrcRectConstraint constraint) |