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,SkiaDisplayList & displayList)32 DumpOpsCanvas(std::ostream& output, int level, 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 onDrawPaint(const SkPaint &)55 void onDrawPaint(const SkPaint&) override { mOutput << mIdent << "drawPaint" << std::endl; } 56 onDrawPath(const SkPath &,const SkPaint &)57 void onDrawPath(const SkPath&, const SkPaint&) override { 58 mOutput << mIdent << "drawPath" << std::endl; 59 } 60 onDrawRect(const SkRect &,const SkPaint &)61 void onDrawRect(const SkRect&, const SkPaint&) override { 62 mOutput << mIdent << "drawRect" << std::endl; 63 } 64 onDrawRegion(const SkRegion &,const SkPaint &)65 void onDrawRegion(const SkRegion&, const SkPaint&) override { 66 mOutput << mIdent << "drawRegion" << std::endl; 67 } 68 onDrawOval(const SkRect &,const SkPaint &)69 void onDrawOval(const SkRect&, const SkPaint&) override { 70 mOutput << mIdent << "drawOval" << std::endl; 71 } 72 onDrawArc(const SkRect &,SkScalar,SkScalar,bool,const SkPaint &)73 void onDrawArc(const SkRect&, SkScalar, SkScalar, bool, const SkPaint&) override { 74 mOutput << mIdent << "drawArc" << std::endl; 75 } 76 onDrawRRect(const SkRRect &,const SkPaint &)77 void onDrawRRect(const SkRRect&, const SkPaint&) override { 78 mOutput << mIdent << "drawRRect" << std::endl; 79 } 80 onDrawDRRect(const SkRRect &,const SkRRect &,const SkPaint &)81 void onDrawDRRect(const SkRRect&, const SkRRect&, const SkPaint&) override { 82 mOutput << mIdent << "drawDRRect" << std::endl; 83 } 84 onDrawTextBlob(const SkTextBlob *,SkScalar,SkScalar,const SkPaint &)85 void onDrawTextBlob(const SkTextBlob*, SkScalar, SkScalar, const SkPaint&) override { 86 mOutput << mIdent << "drawTextBlob" << std::endl; 87 } 88 onDrawImage(const SkImage *,SkScalar dx,SkScalar dy,const SkPaint *)89 void onDrawImage(const SkImage*, SkScalar dx, SkScalar dy, const SkPaint*) override { 90 mOutput << mIdent << "drawImage" << std::endl; 91 } 92 onDrawImageNine(const SkImage *,const SkIRect & center,const SkRect & dst,const SkPaint *)93 void onDrawImageNine(const SkImage*, const SkIRect& center, const SkRect& dst, 94 const SkPaint*) override { 95 mOutput << mIdent << "drawImageNine" << std::endl; 96 } 97 onDrawImageRect(const SkImage *,const SkRect *,const SkRect &,const SkPaint *,SrcRectConstraint)98 void onDrawImageRect(const SkImage*, const SkRect*, const SkRect&, const SkPaint*, 99 SrcRectConstraint) override { 100 mOutput << mIdent << "drawImageRect" << std::endl; 101 } 102 onDrawImageLattice(const SkImage *,const Lattice & lattice,const SkRect & dst,const SkPaint *)103 void onDrawImageLattice(const SkImage*, const Lattice& lattice, const SkRect& dst, 104 const SkPaint*) override { 105 mOutput << mIdent << "drawImageLattice" << std::endl; 106 } 107 onDrawPoints(SkCanvas::PointMode,size_t,const SkPoint[],const SkPaint &)108 void onDrawPoints(SkCanvas::PointMode, size_t, const SkPoint[], const SkPaint&) override { 109 mOutput << mIdent << "drawPoints" << std::endl; 110 } 111 onDrawPicture(const SkPicture *,const SkMatrix *,const SkPaint *)112 void onDrawPicture(const SkPicture*, const SkMatrix*, const SkPaint*) override { 113 mOutput << mIdent << "drawPicture" << std::endl; 114 } 115 onDrawDrawable(SkDrawable * drawable,const SkMatrix *)116 void onDrawDrawable(SkDrawable* drawable, const SkMatrix*) override { 117 mOutput << mIdent; 118 auto renderNodeDrawable = getRenderNodeDrawable(drawable); 119 if (nullptr != renderNodeDrawable) { 120 mOutput << std::string(mLevel * 2, ' ') << "drawRenderNode"; 121 renderNodeDrawable->getRenderNode()->output(mOutput, mLevel + 1); 122 return; 123 } 124 auto glFunctorDrawable = getFunctorDrawable(drawable); 125 if (nullptr != glFunctorDrawable) { 126 mOutput << std::string(mLevel * 2, ' ') << "drawGLFunctorDrawable" << std::endl; 127 return; 128 } 129 130 mOutput << std::string(mLevel * 2, ' ') << "drawDrawable" << std::endl; 131 } 132 133 private: getRenderNodeDrawable(SkDrawable * drawable)134 RenderNodeDrawable* getRenderNodeDrawable(SkDrawable* drawable) { 135 for (auto& child : mDisplayList.mChildNodes) { 136 if (drawable == &child) { 137 return &child; 138 } 139 } 140 return nullptr; 141 } 142 getFunctorDrawable(SkDrawable * drawable)143 FunctorDrawable* getFunctorDrawable(SkDrawable* drawable) { 144 for (auto& child : mDisplayList.mChildFunctors) { 145 if (drawable == child) { 146 return child; 147 } 148 } 149 return nullptr; 150 } 151 152 std::ostream& mOutput; 153 int mLevel; 154 SkiaDisplayList& mDisplayList; 155 std::string mIdent; 156 }; 157 158 } // namespace skiapipeline 159 } // namespace uirenderer 160 } // namespace android 161