1 // Copyright (c) 2013 The Chromium Authors. All rights reserved. 2 // Use of this source code is governed by a BSD-style license that can be 3 // found in the LICENSE file. 4 5 #ifndef SKIA_EXT_ANALYSIS_CANVAS_H_ 6 #define SKIA_EXT_ANALYSIS_CANVAS_H_ 7 8 #include "base/compiler_specific.h" 9 #include "third_party/skia/include/core/SkCanvas.h" 10 #include "third_party/skia/include/core/SkPicture.h" 11 12 namespace skia { 13 14 // Does not render anything, but gathers statistics about a region 15 // (specified as a clip rectangle) of an SkPicture as the picture is 16 // played back through it. 17 // To use: play a picture into the canvas, and then check result. 18 class SK_API AnalysisCanvas : public SkCanvas, public SkDrawPictureCallback { 19 public: 20 AnalysisCanvas(int width, int height); 21 virtual ~AnalysisCanvas(); 22 23 // Returns true when a SkColor can be used to represent result. 24 bool GetColorIfSolid(SkColor* color) const; 25 26 void SetForceNotSolid(bool flag); 27 void SetForceNotTransparent(bool flag); 28 29 // SkDrawPictureCallback override. 30 virtual bool abortDrawing() OVERRIDE; 31 32 // SkCanvas overrides. 33 virtual void clear(SkColor) OVERRIDE; 34 virtual void drawPaint(const SkPaint& paint) OVERRIDE; 35 virtual void drawPoints(PointMode, 36 size_t count, 37 const SkPoint pts[], 38 const SkPaint&) OVERRIDE; 39 virtual void drawOval(const SkRect&, const SkPaint&) OVERRIDE; 40 virtual void drawRect(const SkRect&, const SkPaint&) OVERRIDE; 41 virtual void drawRRect(const SkRRect&, const SkPaint&) OVERRIDE; 42 virtual void drawPath(const SkPath& path, const SkPaint&) OVERRIDE; 43 virtual void drawBitmap(const SkBitmap&, 44 SkScalar left, 45 SkScalar top, 46 const SkPaint* paint = NULL) OVERRIDE; 47 virtual void drawBitmapRectToRect(const SkBitmap&, 48 const SkRect* src, 49 const SkRect& dst, 50 const SkPaint* paint, 51 DrawBitmapRectFlags flags) OVERRIDE; 52 virtual void drawBitmapMatrix(const SkBitmap&, 53 const SkMatrix&, 54 const SkPaint* paint = NULL) OVERRIDE; 55 virtual void drawBitmapNine(const SkBitmap& bitmap, 56 const SkIRect& center, 57 const SkRect& dst, 58 const SkPaint* paint = NULL) OVERRIDE; 59 virtual void drawSprite(const SkBitmap&, int left, int top, 60 const SkPaint* paint = NULL) OVERRIDE; 61 virtual void drawVertices(VertexMode, 62 int vertexCount, 63 const SkPoint vertices[], 64 const SkPoint texs[], 65 const SkColor colors[], 66 SkXfermode*, 67 const uint16_t indices[], 68 int indexCount, 69 const SkPaint&) OVERRIDE; 70 71 protected: 72 virtual void willSave() OVERRIDE; 73 virtual SaveLayerStrategy willSaveLayer(const SkRect*, 74 const SkPaint*, 75 SaveFlags) OVERRIDE; 76 virtual void willRestore() OVERRIDE; 77 78 virtual void onClipRect(const SkRect& rect, 79 SkRegion::Op op, 80 ClipEdgeStyle edge_style) OVERRIDE; 81 virtual void onClipRRect(const SkRRect& rrect, 82 SkRegion::Op op, 83 ClipEdgeStyle edge_style) OVERRIDE; 84 virtual void onClipPath(const SkPath& path, 85 SkRegion::Op op, 86 ClipEdgeStyle edge_style) OVERRIDE; 87 virtual void onClipRegion(const SkRegion& deviceRgn, 88 SkRegion::Op op) OVERRIDE; 89 90 virtual void onDrawText(const void* text, 91 size_t byteLength, 92 SkScalar x, 93 SkScalar y, 94 const SkPaint&) OVERRIDE; 95 virtual void onDrawPosText(const void* text, 96 size_t byteLength, 97 const SkPoint pos[], 98 const SkPaint&) OVERRIDE; 99 virtual void onDrawPosTextH(const void* text, 100 size_t byteLength, 101 const SkScalar xpos[], 102 SkScalar constY, 103 const SkPaint&) OVERRIDE; 104 virtual void onDrawTextOnPath(const void* text, 105 size_t byteLength, 106 const SkPath& path, 107 const SkMatrix* matrix, 108 const SkPaint&) OVERRIDE; 109 virtual void onDrawTextBlob(const SkTextBlob* blob, 110 SkScalar x, 111 SkScalar y, 112 const SkPaint& paint) OVERRIDE; 113 virtual void onDrawDRRect(const SkRRect& outer, 114 const SkRRect& inner, 115 const SkPaint&) OVERRIDE; 116 117 void OnComplexClip(); 118 119 private: 120 typedef SkCanvas INHERITED; 121 122 int saved_stack_size_; 123 int force_not_solid_stack_level_; 124 int force_not_transparent_stack_level_; 125 126 bool is_forced_not_solid_; 127 bool is_forced_not_transparent_; 128 bool is_solid_color_; 129 SkColor color_; 130 bool is_transparent_; 131 int draw_op_count_; 132 }; 133 134 } // namespace skia 135 136 #endif // SKIA_EXT_ANALYSIS_CANVAS_H_ 137 138