• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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