diff options
author | 2017-01-12 16:20:50 -0500 | |
---|---|---|
committer | 2017-01-12 21:55:35 +0000 | |
commit | ac42aebb7b49ef3d916da1e5a75b4c7cd4cfb119 (patch) | |
tree | f7826078a58bc8c046f5e1852ffa6d331bd64271 /tools | |
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')
-rw-r--r-- | tools/debugger/SkDebugCanvas.cpp | 5 | ||||
-rw-r--r-- | tools/debugger/SkDebugCanvas.h | 2 | ||||
-rw-r--r-- | tools/debugger/SkDrawCommand.cpp | 94 | ||||
-rw-r--r-- | tools/debugger/SkDrawCommand.h | 19 | ||||
-rw-r--r-- | tools/debugger/SkObjectParser.cpp | 17 | ||||
-rw-r--r-- | tools/debugger/SkObjectParser.h | 6 |
6 files changed, 143 insertions, 0 deletions
diff --git a/tools/debugger/SkDebugCanvas.cpp b/tools/debugger/SkDebugCanvas.cpp index 0a28bdcd0c..04e8341f87 100644 --- a/tools/debugger/SkDebugCanvas.cpp +++ b/tools/debugger/SkDebugCanvas.cpp @@ -562,6 +562,11 @@ void SkDebugCanvas::onDrawImage(const SkImage* image, SkScalar left, SkScalar to this->addDrawCommand(new SkDrawImageCommand(image, left, top, paint)); } +void SkDebugCanvas::onDrawImageLattice(const SkImage* image, const Lattice& lattice, + const SkRect& dst, const SkPaint* paint) { + this->addDrawCommand(new SkDrawImageLatticeCommand(image, lattice, dst, paint)); +} + void SkDebugCanvas::onDrawImageRect(const SkImage* image, const SkRect* src, const SkRect& dst, const SkPaint* paint, SrcRectConstraint constraint) { this->addDrawCommand(new SkDrawImageRectCommand(image, src, dst, paint, constraint)); diff --git a/tools/debugger/SkDebugCanvas.h b/tools/debugger/SkDebugCanvas.h index 312141ba8a..4a81e26dd9 100644 --- a/tools/debugger/SkDebugCanvas.h +++ b/tools/debugger/SkDebugCanvas.h @@ -242,6 +242,8 @@ protected: void onDrawBitmapRect(const SkBitmap&, const SkRect* src, const SkRect& dst, const SkPaint*, SrcRectConstraint) override; void onDrawImage(const SkImage*, SkScalar left, SkScalar top, const SkPaint*) override; + void onDrawImageLattice(const SkImage* image, const Lattice& lattice, + const SkRect& dst, const SkPaint* paint) override; void onDrawImageRect(const SkImage*, const SkRect* src, const SkRect& dst, const SkPaint*, SrcRectConstraint) override; void onDrawBitmapNine(const SkBitmap&, const SkIRect& center, const SkRect& dst, 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) diff --git a/tools/debugger/SkDrawCommand.h b/tools/debugger/SkDrawCommand.h index 880c2aa086..266fc99fad 100644 --- a/tools/debugger/SkDrawCommand.h +++ b/tools/debugger/SkDrawCommand.h @@ -35,6 +35,7 @@ public: kDrawClear_OpType, kDrawDRRect_OpType, kDrawImage_OpType, + kDrawImageLattice_OpType, kDrawImageRect_OpType, kDrawOval_OpType, kDrawPaint_OpType, @@ -131,6 +132,7 @@ public: static Json::Value MakeJsonPath(const SkPath& path); static Json::Value MakeJsonRegion(const SkRegion& region); static Json::Value MakeJsonPaint(const SkPaint& paint, UrlDataManager& urlDataManager); + static Json::Value MakeJsonLattice(const SkCanvas::Lattice& lattice); static void flatten(const SkFlattenable* flattenable, Json::Value* target, UrlDataManager& urlDataManager); @@ -364,6 +366,23 @@ private: typedef SkDrawCommand INHERITED; }; +class SkDrawImageLatticeCommand : public SkDrawCommand { +public: + SkDrawImageLatticeCommand(const SkImage* image, const SkCanvas::Lattice& lattice, + const SkRect& dst, const SkPaint* paint); + void execute(SkCanvas* canvas) const override; + bool render(SkCanvas* canvas) const override; + Json::Value toJSON(UrlDataManager& urlDataManager) const override; + +private: + sk_sp<const SkImage> fImage; + SkCanvas::Lattice fLattice; + SkRect fDst; + SkTLazy<SkPaint> fPaint; + + typedef SkDrawCommand INHERITED; +}; + class SkDrawImageRectCommand : public SkDrawCommand { public: SkDrawImageRectCommand(const SkImage* image, const SkRect* src, const SkRect& dst, diff --git a/tools/debugger/SkObjectParser.cpp b/tools/debugger/SkObjectParser.cpp index e89e8c5e10..227532a6f4 100644 --- a/tools/debugger/SkObjectParser.cpp +++ b/tools/debugger/SkObjectParser.cpp @@ -404,3 +404,20 @@ SkString* SkObjectParser::TextToString(const void* text, size_t byteLength, return decodedText; } + +SkString* SkObjectParser::LatticeToString(const SkCanvas::Lattice& lattice) { + SkString* mLattice = new SkString; + mLattice->append("Lattice: "); + mLattice->append("(X: "); + mLattice->appendS32(lattice.fXCount); + mLattice->append(", Y:"); + mLattice->appendS32(lattice.fYCount); + mLattice->append(", Bounds:"); + if (nullptr != lattice.fBounds) { + mLattice->append(*IRectToString(*lattice.fBounds)); + } else { + mLattice->append("null"); + } + mLattice->append(")"); + return mLattice; +} diff --git a/tools/debugger/SkObjectParser.h b/tools/debugger/SkObjectParser.h index 48051792cb..2532c5c493 100644 --- a/tools/debugger/SkObjectParser.h +++ b/tools/debugger/SkObjectParser.h @@ -129,6 +129,12 @@ public: */ static SkString* TextToString(const void* text, size_t byteLength, SkPaint::TextEncoding encoding); + + /** + Returns a string representation of the SkCanvas::Lattice. + @param lattice SkCanvas::Lattice + */ + static SkString* LatticeToString(const SkCanvas::Lattice& lattice); }; #endif |