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/SkBitmapDevice.h" 10 #include "third_party/skia/include/core/SkCanvas.h" 11 #include "third_party/skia/include/core/SkPicture.h" 12 13 namespace skia { 14 15 class AnalysisDevice; 16 17 // Does not render anything, but gathers statistics about a region 18 // (specified as a clip rectangle) of an SkPicture as the picture is 19 // played back through it. 20 // To use: create a SkBitmap with kNo_Config, create an AnalysisDevice 21 // using that bitmap, and create an AnalysisCanvas using the device. 22 // Play a picture into the canvas, and then check result. 23 class SK_API AnalysisCanvas : public SkCanvas, public SkDrawPictureCallback { 24 public: 25 AnalysisCanvas(AnalysisDevice*); 26 virtual ~AnalysisCanvas(); 27 28 // Returns true when a SkColor can be used to represent result. 29 bool GetColorIfSolid(SkColor* color) const; 30 bool HasText() const; 31 32 // SkDrawPictureCallback override. 33 virtual bool abortDrawing() OVERRIDE; 34 35 // SkCanvas overrides. 36 virtual bool clipRect(const SkRect& rect, 37 SkRegion::Op op = SkRegion::kIntersect_Op, 38 bool do_anti_alias = false) OVERRIDE; 39 virtual bool clipPath(const SkPath& path, 40 SkRegion::Op op = SkRegion::kIntersect_Op, 41 bool do_anti_alias = false) OVERRIDE; 42 virtual bool clipRRect(const SkRRect& rrect, 43 SkRegion::Op op = SkRegion::kIntersect_Op, 44 bool do_anti_alias = false) OVERRIDE; 45 46 virtual int saveLayer(const SkRect* bounds, 47 const SkPaint* paint, 48 SkCanvas::SaveFlags flags) OVERRIDE; 49 virtual int save(SaveFlags flags = kMatrixClip_SaveFlag) OVERRIDE; 50 51 virtual void restore() OVERRIDE; 52 53 private: 54 typedef SkCanvas INHERITED; 55 56 int saved_stack_size_; 57 int force_not_solid_stack_level_; 58 int force_not_transparent_stack_level_; 59 }; 60 61 // TODO(robertphillips): Once Skia's SkBaseDevice API is refactored to 62 // remove the bitmap-specific entry points, it might make sense for this 63 // to be derived from SkBaseDevice (rather than SkBitmapDevice) 64 class SK_API AnalysisDevice : public SkBitmapDevice { 65 public: 66 AnalysisDevice(const SkBitmap& bitmap); 67 virtual ~AnalysisDevice(); 68 69 bool GetColorIfSolid(SkColor* color) const; 70 bool HasText() const; 71 72 void SetForceNotSolid(bool flag); 73 void SetForceNotTransparent(bool flag); 74 75 protected: 76 // SkBaseDevice overrides. 77 virtual void clear(SkColor color) OVERRIDE; 78 virtual void drawPaint(const SkDraw& draw, const SkPaint& paint) OVERRIDE; 79 virtual void drawPoints(const SkDraw& draw, 80 SkCanvas::PointMode mode, 81 size_t count, 82 const SkPoint points[], 83 const SkPaint& paint) OVERRIDE; 84 virtual void drawRect(const SkDraw& draw, 85 const SkRect& rect, 86 const SkPaint& paint) OVERRIDE; 87 virtual void drawRRect(const SkDraw& draw, 88 const SkRRect& rr, 89 const SkPaint& paint) OVERRIDE; 90 virtual void drawOval(const SkDraw& draw, 91 const SkRect& oval, 92 const SkPaint& paint) OVERRIDE; 93 virtual void drawPath(const SkDraw& draw, 94 const SkPath& path, 95 const SkPaint& paint, 96 const SkMatrix* pre_path_matrix = NULL, 97 bool path_is_mutable = false) OVERRIDE; 98 virtual void drawBitmap(const SkDraw& draw, 99 const SkBitmap& bitmap, 100 const SkMatrix& matrix, 101 const SkPaint& paint) OVERRIDE; 102 virtual void drawSprite(const SkDraw& draw, 103 const SkBitmap& bitmap, 104 int x, 105 int y, 106 const SkPaint& paint) OVERRIDE; 107 virtual void drawBitmapRect(const SkDraw& draw, 108 const SkBitmap& bitmap, 109 const SkRect* src_or_null, 110 const SkRect& dst, 111 const SkPaint& paint, 112 SkCanvas::DrawBitmapRectFlags flags) OVERRIDE; 113 virtual void drawText(const SkDraw& draw, 114 const void* text, 115 size_t len, 116 SkScalar x, 117 SkScalar y, 118 const SkPaint& paint) OVERRIDE; 119 virtual void drawPosText(const SkDraw& draw, 120 const void* text, 121 size_t len, 122 const SkScalar pos[], 123 SkScalar const_y, 124 int scalars_per_pos, 125 const SkPaint& paint) OVERRIDE; 126 virtual void drawTextOnPath(const SkDraw& draw, 127 const void* text, 128 size_t len, 129 const SkPath& path, 130 const SkMatrix* matrix, 131 const SkPaint& paint) OVERRIDE; 132 #ifdef SK_BUILD_FOR_ANDROID 133 virtual void drawPosTextOnPath(const SkDraw& draw, 134 const void* text, 135 size_t len, 136 const SkPoint pos[], 137 const SkPaint& paint, 138 const SkPath& path, 139 const SkMatrix* matrix) OVERRIDE; 140 #endif 141 virtual void drawVertices(const SkDraw& draw, 142 SkCanvas::VertexMode vertex_mode, 143 int vertex_count, 144 const SkPoint verts[], 145 const SkPoint texs[], 146 const SkColor colors[], 147 SkXfermode* xmode, 148 const uint16_t indices[], 149 int index_count, 150 const SkPaint& paint) OVERRIDE; 151 virtual void drawDevice(const SkDraw& draw, 152 SkBaseDevice* device, 153 int x, 154 int y, 155 const SkPaint& paint) OVERRIDE; 156 157 private: 158 typedef SkBitmapDevice INHERITED; 159 160 bool is_forced_not_solid_; 161 bool is_forced_not_transparent_; 162 bool is_solid_color_; 163 SkColor color_; 164 bool is_transparent_; 165 bool has_text_; 166 }; 167 168 } // namespace skia 169 170 #endif // SKIA_EXT_ANALYSIS_CANVAS_H_ 171 172