1 /* 2 * Copyright (C) 2017 The Android Open Source Project 3 * 4 * Licensed under the Apache License, Version 2.0 (the "License"); 5 * you may not use this file except in compliance with the License. 6 * You may obtain a copy of the License at 7 * 8 * http://www.apache.org/licenses/LICENSE-2.0 9 * 10 * Unless required by applicable law or agreed to in writing, software 11 * distributed under the License is distributed on an "AS IS" BASIS, 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 * See the License for the specific language governing permissions and 14 * limitations under the License. 15 */ 16 17 #pragma once 18 19 #include "RenderNode.h" 20 #include "SkiaDisplayList.h" 21 22 namespace android { 23 namespace uirenderer { 24 namespace skiapipeline { 25 26 /** 27 * DumpOpsCanvas prints drawing ops from a SkiaDisplayList into a std::ostream. Children render 28 * nodes are walked recursively and their drawing ops are printed as well. 29 */ 30 class DumpOpsCanvas : public SkCanvas { 31 public: DumpOpsCanvas(std::ostream & output,int level,const SkiaDisplayList & displayList)32 DumpOpsCanvas(std::ostream& output, int level, const SkiaDisplayList& displayList) 33 : mOutput(output) 34 , mLevel(level) 35 , mDisplayList(displayList) 36 , mIdent((level + 1) * 2, ' ') {} 37 38 protected: onClipRect(const SkRect & rect,SkClipOp,ClipEdgeStyle)39 void onClipRect(const SkRect& rect, SkClipOp, ClipEdgeStyle) override { 40 mOutput << mIdent << "clipRect" << std::endl; 41 } 42 onClipRRect(const SkRRect & rrect,SkClipOp,ClipEdgeStyle)43 void onClipRRect(const SkRRect& rrect, SkClipOp, ClipEdgeStyle) override { 44 mOutput << mIdent << "clipRRect" << std::endl; 45 } 46 onClipPath(const SkPath & path,SkClipOp,ClipEdgeStyle)47 void onClipPath(const SkPath& path, SkClipOp, ClipEdgeStyle) override { 48 mOutput << mIdent << "clipPath" << std::endl; 49 } 50 onClipRegion(const SkRegion & deviceRgn,SkClipOp)51 void onClipRegion(const SkRegion& deviceRgn, SkClipOp) override { 52 mOutput << mIdent << "clipRegion" << std::endl; 53 } 54 onResetClip()55 void onResetClip() override { mOutput << mIdent << "resetClip" << std::endl; } 56 onDrawPaint(const SkPaint &)57 void onDrawPaint(const SkPaint&) override { mOutput << mIdent << "drawPaint" << std::endl; } 58 onDrawPath(const SkPath &,const SkPaint &)59 void onDrawPath(const SkPath&, const SkPaint&) override { 60 mOutput << mIdent << "drawPath" << std::endl; 61 } 62 onDrawRect(const SkRect &,const SkPaint &)63 void onDrawRect(const SkRect&, const SkPaint&) override { 64 mOutput << mIdent << "drawRect" << std::endl; 65 } 66 onDrawRegion(const SkRegion &,const SkPaint &)67 void onDrawRegion(const SkRegion&, const SkPaint&) override { 68 mOutput << mIdent << "drawRegion" << std::endl; 69 } 70 onDrawOval(const SkRect &,const SkPaint &)71 void onDrawOval(const SkRect&, const SkPaint&) override { 72 mOutput << mIdent << "drawOval" << std::endl; 73 } 74 onDrawArc(const SkRect &,SkScalar,SkScalar,bool,const SkPaint &)75 void onDrawArc(const SkRect&, SkScalar, SkScalar, bool, const SkPaint&) override { 76 mOutput << mIdent << "drawArc" << std::endl; 77 } 78 onDrawRRect(const SkRRect &,const SkPaint &)79 void onDrawRRect(const SkRRect&, const SkPaint&) override { 80 mOutput << mIdent << "drawRRect" << std::endl; 81 } 82 onDrawDRRect(const SkRRect &,const SkRRect &,const SkPaint &)83 void onDrawDRRect(const SkRRect&, const SkRRect&, const SkPaint&) override { 84 mOutput << mIdent << "drawDRRect" << std::endl; 85 } 86 onDrawTextBlob(const SkTextBlob *,SkScalar,SkScalar,const SkPaint &)87 void onDrawTextBlob(const SkTextBlob*, SkScalar, SkScalar, const SkPaint&) override { 88 mOutput << mIdent << "drawTextBlob" << std::endl; 89 } 90 onDrawImage2(const SkImage *,SkScalar dx,SkScalar dy,const SkSamplingOptions &,const SkPaint *)91 void onDrawImage2(const SkImage*, SkScalar dx, SkScalar dy, const SkSamplingOptions&, 92 const SkPaint*) override { 93 mOutput << mIdent << "drawImage" << std::endl; 94 } 95 onDrawImageRect2(const SkImage *,const SkRect &,const SkRect &,const SkSamplingOptions &,const SkPaint *,SrcRectConstraint)96 void onDrawImageRect2(const SkImage*, const SkRect&, const SkRect&, const SkSamplingOptions&, 97 const SkPaint*, SrcRectConstraint) override { 98 mOutput << mIdent << "drawImageRect" << std::endl; 99 } 100 onDrawImageLattice2(const SkImage *,const Lattice & lattice,const SkRect & dst,SkFilterMode,const SkPaint *)101 void onDrawImageLattice2(const SkImage*, const Lattice& lattice, const SkRect& dst, 102 SkFilterMode, const SkPaint*) override { 103 mOutput << mIdent << "drawImageLattice" << std::endl; 104 } 105 onDrawPoints(SkCanvas::PointMode,size_t,const SkPoint[],const SkPaint &)106 void onDrawPoints(SkCanvas::PointMode, size_t, const SkPoint[], const SkPaint&) override { 107 mOutput << mIdent << "drawPoints" << std::endl; 108 } 109 onDrawPicture(const SkPicture *,const SkMatrix *,const SkPaint *)110 void onDrawPicture(const SkPicture*, const SkMatrix*, const SkPaint*) override { 111 mOutput << mIdent << "drawPicture" << std::endl; 112 } 113 onDrawDrawable(SkDrawable * drawable,const SkMatrix *)114 void onDrawDrawable(SkDrawable* drawable, const SkMatrix*) override { 115 mOutput << mIdent; 116 auto renderNodeDrawable = getRenderNodeDrawable(drawable); 117 if (nullptr != renderNodeDrawable) { 118 mOutput << std::string(mLevel * 2, ' ') << "drawRenderNode"; 119 renderNodeDrawable->getRenderNode()->output(mOutput, mLevel + 1); 120 return; 121 } 122 auto glFunctorDrawable = getFunctorDrawable(drawable); 123 if (nullptr != glFunctorDrawable) { 124 mOutput << std::string(mLevel * 2, ' ') << "drawGLFunctorDrawable" << std::endl; 125 return; 126 } 127 128 mOutput << std::string(mLevel * 2, ' ') << "drawDrawable" << std::endl; 129 } 130 131 private: getRenderNodeDrawable(SkDrawable * drawable)132 const RenderNodeDrawable* getRenderNodeDrawable(SkDrawable* drawable) { 133 for (auto& child : mDisplayList.mChildNodes) { 134 if (drawable == &child) { 135 return &child; 136 } 137 } 138 return nullptr; 139 } 140 getFunctorDrawable(SkDrawable * drawable)141 FunctorDrawable* getFunctorDrawable(SkDrawable* drawable) { 142 for (auto& child : mDisplayList.mChildFunctors) { 143 if (drawable == child) { 144 return child; 145 } 146 } 147 return nullptr; 148 } 149 150 std::ostream& mOutput; 151 int mLevel; 152 const SkiaDisplayList& mDisplayList; 153 std::string mIdent; 154 }; 155 156 } // namespace skiapipeline 157 } // namespace uirenderer 158 } // namespace android 159