12a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Copyright (c) 2013 The Chromium Authors. All rights reserved.
22a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
32a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// found in the LICENSE file.
42a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
52a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#ifndef SKIA_EXT_ANALYSIS_CANVAS_H_
62a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#define SKIA_EXT_ANALYSIS_CANVAS_H_
72a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
89ab5563a3196760eb381d102cbb2bc0f7abc6a50Ben Murdoch#include "base/compiler_specific.h"
92a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "third_party/skia/include/core/SkCanvas.h"
102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "third_party/skia/include/core/SkDevice.h"
1190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)#include "third_party/skia/include/core/SkPicture.h"
122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)namespace skia {
142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class AnalysisDevice;
162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Does not render anything, but gathers statistics about a region
182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// (specified as a clip rectangle) of an SkPicture as the picture is
192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// played back through it.
202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// To use: create a SkBitmap with kNo_Config, create an AnalysisDevice
212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// using that bitmap, and create an AnalysisCanvas using the device.
22c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// Play a picture into the canvas, and then check result.
2390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)class SK_API AnalysisCanvas : public SkCanvas, public SkDrawPictureCallback {
242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) public:
252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  AnalysisCanvas(AnalysisDevice*);
262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual ~AnalysisCanvas();
272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
28c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // Returns true when a SkColor can be used to represent result.
29868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  bool GetColorIfSolid(SkColor* color) const;
30868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  bool HasText() const;
312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  // SkDrawPictureCallback override.
3390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  virtual bool abortDrawing() OVERRIDE;
3490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
3590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  // SkCanvas overrides.
362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual bool clipRect(const SkRect& rect,
372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                        SkRegion::Op op = SkRegion::kIntersect_Op,
38868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                        bool do_anti_alias = false) OVERRIDE;
392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual bool clipPath(const SkPath& path,
402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                        SkRegion::Op op = SkRegion::kIntersect_Op,
41868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                        bool do_anti_alias = false) OVERRIDE;
422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual bool clipRRect(const SkRRect& rrect,
432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                         SkRegion::Op op = SkRegion::kIntersect_Op,
44868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                         bool do_anti_alias = false) OVERRIDE;
452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
46868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  virtual int saveLayer(const SkRect* bounds,
47868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                        const SkPaint* paint,
48868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                        SkCanvas::SaveFlags flags) OVERRIDE;
492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual int save(SaveFlags flags = kMatrixClip_SaveFlag) OVERRIDE;
502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual void restore() OVERRIDE;
522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) private:
542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  typedef SkCanvas INHERITED;
552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
56868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  int saved_stack_size_;
57868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  int force_not_solid_stack_level_;
58868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  int force_not_transparent_stack_level_;
592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)};
602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class SK_API AnalysisDevice : public SkDevice {
622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) public:
63868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  AnalysisDevice(const SkBitmap& bitmap);
642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual ~AnalysisDevice();
652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
66868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  bool GetColorIfSolid(SkColor* color) const;
67868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  bool HasText() const;
682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
69868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  void SetForceNotSolid(bool flag);
70868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  void SetForceNotTransparent(bool flag);
712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) protected:
73868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  // SkDevice overrides.
742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual void clear(SkColor color) OVERRIDE;
75868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  virtual void drawPaint(const SkDraw& draw, const SkPaint& paint) OVERRIDE;
76868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  virtual void drawPoints(const SkDraw& draw,
77868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                          SkCanvas::PointMode mode,
78868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                          size_t count,
79868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                          const SkPoint points[],
802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                          const SkPaint& paint) OVERRIDE;
81868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  virtual void drawRect(const SkDraw& draw,
82868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                        const SkRect& rect,
832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                        const SkPaint& paint) OVERRIDE;
84868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  virtual void drawOval(const SkDraw& draw,
85868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                        const SkRect& oval,
862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                        const SkPaint& paint) OVERRIDE;
87868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  virtual void drawPath(const SkDraw& draw,
88868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                        const SkPath& path,
892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                        const SkPaint& paint,
90868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                        const SkMatrix* pre_path_matrix = NULL,
91868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                        bool path_is_mutable = false) OVERRIDE;
92868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  virtual void drawBitmap(const SkDraw& draw,
93868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                          const SkBitmap& bitmap,
94868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                          const SkMatrix& matrix,
95868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                          const SkPaint& paint) OVERRIDE;
96868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  virtual void drawSprite(const SkDraw& draw,
97868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                          const SkBitmap& bitmap,
98868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                          int x,
99868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                          int y,
100868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                          const SkPaint& paint) OVERRIDE;
101868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  virtual void drawBitmapRect(const SkDraw& draw,
102868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                              const SkBitmap& bitmap,
103868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                              const SkRect* src_or_null,
104868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                              const SkRect& dst,
1052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                              const SkPaint& paint) OVERRIDE;
106868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  virtual void drawText(const SkDraw& draw,
107868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                        const void* text,
108868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                        size_t len,
109868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                        SkScalar x,
110868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                        SkScalar y,
111868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                        const SkPaint& paint) OVERRIDE;
112868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  virtual void drawPosText(const SkDraw& draw,
113868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                           const void* text,
114868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                           size_t len,
115868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                           const SkScalar pos[],
116868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                           SkScalar const_y,
117868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                           int scalars_per_pos,
118868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                           const SkPaint& paint) OVERRIDE;
119868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  virtual void drawTextOnPath(const SkDraw& draw,
120868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                              const void* text,
121868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                              size_t len,
122868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                              const SkPath& path,
123868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                              const SkMatrix* matrix,
1242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                              const SkPaint& paint) OVERRIDE;
1252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#ifdef SK_BUILD_FOR_ANDROID
126868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  virtual void drawPosTextOnPath(const SkDraw& draw,
127868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                                 const void* text,
1282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                 size_t len,
129868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                                 const SkPoint pos[],
130868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                                 const SkPaint& paint,
131868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                                 const SkPath& path,
132868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                                 const SkMatrix* matrix) OVERRIDE;
1332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#endif
134868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  virtual void drawVertices(const SkDraw& draw,
135868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                            SkCanvas::VertexMode vertex_mode,
136868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                            int vertex_count,
137868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                            const SkPoint verts[],
138868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                            const SkPoint texs[],
139868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                            const SkColor colors[],
140868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                            SkXfermode* xmode,
141868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                            const uint16_t indices[],
142868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                            int index_count,
1432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                            const SkPaint& paint) OVERRIDE;
144868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  virtual void drawDevice(const SkDraw& draw,
145868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                          SkDevice* device,
146868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                          int x,
147868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                          int y,
148868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                          const SkPaint& paint) OVERRIDE;
1492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) private:
1512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  typedef SkDevice INHERITED;
1522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
153868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  bool is_forced_not_solid_;
154868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  bool is_forced_not_transparent_;
155868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  bool is_solid_color_;
1562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  SkColor color_;
157868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  bool is_transparent_;
158868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  bool has_text_;
1592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)};
1602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}  // namespace skia
1622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#endif  // SKIA_EXT_ANALYSIS_CANVAS_H_
1642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
165