| // Copyright 2013 The Flutter Authors. All rights reserved. |
| // Use of this source code is governed by a BSD-style license that can be |
| // found in the LICENSE file. |
| |
| #include "flutter/shell/common/canvas_spy.h" |
| |
| namespace flutter { |
| |
| CanvasSpy::CanvasSpy(SkCanvas* target_canvas) { |
| SkISize canvas_size = target_canvas->getBaseLayerSize(); |
| n_way_canvas_ = |
| std::make_unique<SkNWayCanvas>(canvas_size.width(), canvas_size.height()); |
| did_draw_canvas_ = std::make_unique<DidDrawCanvas>(canvas_size.width(), |
| canvas_size.height()); |
| n_way_canvas_->addCanvas(target_canvas); |
| n_way_canvas_->addCanvas(did_draw_canvas_.get()); |
| } |
| |
| SkCanvas* CanvasSpy::GetSpyingCanvas() { |
| return n_way_canvas_.get(); |
| } |
| |
| DidDrawCanvas::DidDrawCanvas(int width, int height) |
| : SkCanvasVirtualEnforcer<SkNoDrawCanvas>(width, height) {} |
| |
| DidDrawCanvas::~DidDrawCanvas() {} |
| |
| void DidDrawCanvas::MarkDrawIfNonTransparentPaint(const SkPaint& paint) { |
| bool isTransparent = paint.getAlpha() == 0; |
| did_draw_ |= !isTransparent; |
| } |
| |
| bool CanvasSpy::DidDrawIntoCanvas() { |
| return did_draw_canvas_->DidDrawIntoCanvas(); |
| } |
| |
| bool DidDrawCanvas::DidDrawIntoCanvas() { |
| return did_draw_; |
| } |
| |
| void DidDrawCanvas::willSave() {} |
| |
| SkCanvas::SaveLayerStrategy DidDrawCanvas::getSaveLayerStrategy( |
| const SaveLayerRec& rec) { |
| return kNoLayer_SaveLayerStrategy; |
| } |
| |
| bool DidDrawCanvas::onDoSaveBehind(const SkRect* bounds) { |
| return false; |
| } |
| |
| void DidDrawCanvas::willRestore() {} |
| |
| void DidDrawCanvas::didConcat44(const SkM44&) {} |
| |
| void DidDrawCanvas::didScale(SkScalar, SkScalar) {} |
| |
| void DidDrawCanvas::didTranslate(SkScalar, SkScalar) {} |
| |
| void DidDrawCanvas::onClipRect(const SkRect& rect, |
| SkClipOp op, |
| ClipEdgeStyle edgeStyle) {} |
| |
| void DidDrawCanvas::onClipRRect(const SkRRect& rrect, |
| SkClipOp op, |
| ClipEdgeStyle edgeStyle) {} |
| |
| void DidDrawCanvas::onClipPath(const SkPath& path, |
| SkClipOp op, |
| ClipEdgeStyle edgeStyle) {} |
| |
| void DidDrawCanvas::onClipRegion(const SkRegion& deviceRgn, SkClipOp op) {} |
| |
| void DidDrawCanvas::onDrawPaint(const SkPaint& paint) { |
| MarkDrawIfNonTransparentPaint(paint); |
| } |
| |
| void DidDrawCanvas::onDrawBehind(const SkPaint& paint) { |
| MarkDrawIfNonTransparentPaint(paint); |
| } |
| |
| void DidDrawCanvas::onDrawPoints(PointMode mode, |
| size_t count, |
| const SkPoint pts[], |
| const SkPaint& paint) { |
| MarkDrawIfNonTransparentPaint(paint); |
| } |
| |
| void DidDrawCanvas::onDrawRect(const SkRect& rect, const SkPaint& paint) { |
| MarkDrawIfNonTransparentPaint(paint); |
| } |
| |
| void DidDrawCanvas::onDrawRegion(const SkRegion& region, const SkPaint& paint) { |
| MarkDrawIfNonTransparentPaint(paint); |
| } |
| |
| void DidDrawCanvas::onDrawOval(const SkRect& rect, const SkPaint& paint) { |
| MarkDrawIfNonTransparentPaint(paint); |
| } |
| |
| void DidDrawCanvas::onDrawArc(const SkRect& rect, |
| SkScalar startAngle, |
| SkScalar sweepAngle, |
| bool useCenter, |
| const SkPaint& paint) { |
| MarkDrawIfNonTransparentPaint(paint); |
| } |
| |
| void DidDrawCanvas::onDrawRRect(const SkRRect& rrect, const SkPaint& paint) { |
| MarkDrawIfNonTransparentPaint(paint); |
| } |
| |
| void DidDrawCanvas::onDrawDRRect(const SkRRect& outer, |
| const SkRRect& inner, |
| const SkPaint& paint) { |
| MarkDrawIfNonTransparentPaint(paint); |
| } |
| |
| void DidDrawCanvas::onDrawPath(const SkPath& path, const SkPaint& paint) { |
| MarkDrawIfNonTransparentPaint(paint); |
| } |
| |
| #ifdef SK_SUPPORT_LEGACY_ONDRAWIMAGERECT |
| void DidDrawCanvas::onDrawImage(const SkImage* image, |
| SkScalar left, |
| SkScalar top, |
| const SkPaint* paint) { |
| did_draw_ = true; |
| } |
| |
| void DidDrawCanvas::onDrawImageRect(const SkImage* image, |
| const SkRect* src, |
| const SkRect& dst, |
| const SkPaint* paint, |
| SrcRectConstraint constraint) { |
| did_draw_ = true; |
| } |
| |
| void DidDrawCanvas::onDrawImageLattice(const SkImage* image, |
| const Lattice& lattice, |
| const SkRect& dst, |
| const SkPaint* paint) { |
| did_draw_ = true; |
| } |
| |
| void DidDrawCanvas::onDrawAtlas(const SkImage* image, |
| const SkRSXform xform[], |
| const SkRect tex[], |
| const SkColor colors[], |
| int count, |
| SkBlendMode bmode, |
| const SkRect* cull, |
| const SkPaint* paint) { |
| did_draw_ = true; |
| } |
| |
| void DidDrawCanvas::onDrawEdgeAAImageSet(const ImageSetEntry set[], |
| int count, |
| const SkPoint dstClips[], |
| const SkMatrix preViewMatrices[], |
| const SkPaint* paint, |
| SrcRectConstraint constraint) { |
| did_draw_ = true; |
| } |
| #endif |
| |
| void DidDrawCanvas::onDrawImage2(const SkImage* image, |
| SkScalar left, |
| SkScalar top, |
| const SkSamplingOptions&, |
| const SkPaint* paint) { |
| did_draw_ = true; |
| } |
| |
| void DidDrawCanvas::onDrawImageRect2(const SkImage* image, |
| const SkRect& src, |
| const SkRect& dst, |
| const SkSamplingOptions&, |
| const SkPaint* paint, |
| SrcRectConstraint constraint) { |
| did_draw_ = true; |
| } |
| |
| void DidDrawCanvas::onDrawImageLattice2(const SkImage* image, |
| const Lattice& lattice, |
| const SkRect& dst, |
| SkFilterMode, |
| const SkPaint* paint) { |
| did_draw_ = true; |
| } |
| |
| void DidDrawCanvas::onDrawTextBlob(const SkTextBlob* blob, |
| SkScalar x, |
| SkScalar y, |
| const SkPaint& paint) { |
| MarkDrawIfNonTransparentPaint(paint); |
| } |
| |
| void DidDrawCanvas::onDrawPicture(const SkPicture* picture, |
| const SkMatrix* matrix, |
| const SkPaint* paint) { |
| did_draw_ = true; |
| } |
| |
| void DidDrawCanvas::onDrawDrawable(SkDrawable* drawable, |
| const SkMatrix* matrix) { |
| did_draw_ = true; |
| } |
| |
| void DidDrawCanvas::onDrawVerticesObject(const SkVertices* vertices, |
| SkBlendMode bmode, |
| const SkPaint& paint) { |
| MarkDrawIfNonTransparentPaint(paint); |
| } |
| |
| void DidDrawCanvas::onDrawPatch(const SkPoint cubics[12], |
| const SkColor colors[4], |
| const SkPoint texCoords[4], |
| SkBlendMode bmode, |
| const SkPaint& paint) { |
| MarkDrawIfNonTransparentPaint(paint); |
| } |
| |
| void DidDrawCanvas::onDrawAtlas2(const SkImage* image, |
| const SkRSXform xform[], |
| const SkRect tex[], |
| const SkColor colors[], |
| int count, |
| SkBlendMode bmode, |
| const SkSamplingOptions&, |
| const SkRect* cull, |
| const SkPaint* paint) { |
| did_draw_ = true; |
| } |
| |
| void DidDrawCanvas::onDrawShadowRec(const SkPath& path, |
| const SkDrawShadowRec& rec) { |
| did_draw_ = true; |
| } |
| |
| void DidDrawCanvas::onDrawAnnotation(const SkRect& rect, |
| const char key[], |
| SkData* data) { |
| did_draw_ = true; |
| } |
| |
| void DidDrawCanvas::onDrawEdgeAAQuad(const SkRect& rect, |
| const SkPoint clip[4], |
| SkCanvas::QuadAAFlags aa, |
| const SkColor4f& color, |
| SkBlendMode mode) { |
| did_draw_ = true; |
| } |
| |
| void DidDrawCanvas::onDrawEdgeAAImageSet2(const ImageSetEntry set[], |
| int count, |
| const SkPoint dstClips[], |
| const SkMatrix preViewMatrices[], |
| const SkSamplingOptions&, |
| const SkPaint* paint, |
| SrcRectConstraint constraint) { |
| did_draw_ = true; |
| } |
| |
| void DidDrawCanvas::onFlush() {} |
| |
| } // namespace flutter |