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"
1090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)#include "third_party/skia/include/core/SkPicture.h"
112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)namespace skia {
132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Does not render anything, but gathers statistics about a region
152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// (specified as a clip rectangle) of an SkPicture as the picture is
162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// played back through it.
17a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)// To use: play a picture into the canvas, and then check result.
1890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)class SK_API AnalysisCanvas : public SkCanvas, public SkDrawPictureCallback {
192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) public:
20a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  AnalysisCanvas(int width, int height);
212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual ~AnalysisCanvas();
222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
23c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // Returns true when a SkColor can be used to represent result.
24868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  bool GetColorIfSolid(SkColor* color) const;
252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
26a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  void SetForceNotSolid(bool flag);
27a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  void SetForceNotTransparent(bool flag);
28a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
2990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  // SkDrawPictureCallback override.
3090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  virtual bool abortDrawing() OVERRIDE;
3190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
3290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  // SkCanvas overrides.
33a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  virtual void clear(SkColor) OVERRIDE;
34a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  virtual void drawPaint(const SkPaint& paint) OVERRIDE;
35a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  virtual void drawPoints(PointMode,
36868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                          size_t count,
37a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                          const SkPoint pts[],
38a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                          const SkPaint&) OVERRIDE;
39a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  virtual void drawOval(const SkRect&, const SkPaint&) OVERRIDE;
40a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  virtual void drawRect(const SkRect&, const SkPaint&) OVERRIDE;
41a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  virtual void drawRRect(const SkRRect&, const SkPaint&) OVERRIDE;
42a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  virtual void drawPath(const SkPath& path, const SkPaint&) OVERRIDE;
43a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  virtual void drawBitmap(const SkBitmap&,
44a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                          SkScalar left,
45a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                          SkScalar top,
46a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                          const SkPaint* paint = NULL) OVERRIDE;
47a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  virtual void drawBitmapRectToRect(const SkBitmap&,
48a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                                    const SkRect* src,
49a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                                    const SkRect& dst,
50a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                                    const SkPaint* paint,
51a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                                    DrawBitmapRectFlags flags) OVERRIDE;
52a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  virtual void drawBitmapMatrix(const SkBitmap&,
53a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                                const SkMatrix&,
54a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                                const SkPaint* paint = NULL) OVERRIDE;
55a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  virtual void drawBitmapNine(const SkBitmap& bitmap,
56a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                              const SkIRect& center,
57868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                              const SkRect& dst,
58a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                              const SkPaint* paint = NULL) OVERRIDE;
59a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  virtual void drawSprite(const SkBitmap&, int left, int top,
60a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                          const SkPaint* paint = NULL) OVERRIDE;
61a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  virtual void drawVertices(VertexMode,
62a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                            int vertexCount,
63a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                            const SkPoint vertices[],
64868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                            const SkPoint texs[],
65868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                            const SkColor colors[],
66a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                            SkXfermode*,
67868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                            const uint16_t indices[],
68a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                            int indexCount,
69a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                            const SkPaint&) OVERRIDE;
70a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
71a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) protected:
726d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)  virtual void willSave() OVERRIDE;
73a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  virtual SaveLayerStrategy willSaveLayer(const SkRect*,
74a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                                          const SkPaint*,
75a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                                          SaveFlags) OVERRIDE;
76a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  virtual void willRestore() OVERRIDE;
77a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
78a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  virtual void onClipRect(const SkRect& rect,
79a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                          SkRegion::Op op,
80a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                          ClipEdgeStyle edge_style) OVERRIDE;
81a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  virtual void onClipRRect(const SkRRect& rrect,
82a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                           SkRegion::Op op,
83a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                           ClipEdgeStyle edge_style) OVERRIDE;
84a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  virtual void onClipPath(const SkPath& path,
85a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                          SkRegion::Op op,
86a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                          ClipEdgeStyle edge_style) OVERRIDE;
8703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  virtual void onClipRegion(const SkRegion& deviceRgn,
8803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)                            SkRegion::Op op) OVERRIDE;
892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
900529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  virtual void onDrawText(const void* text,
910529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch                          size_t byteLength,
920529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch                          SkScalar x,
930529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch                          SkScalar y,
940529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch                          const SkPaint&) OVERRIDE;
950529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  virtual void onDrawPosText(const void* text,
960529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch                             size_t byteLength,
970529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch                             const SkPoint pos[],
980529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch                             const SkPaint&) OVERRIDE;
990529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  virtual void onDrawPosTextH(const void* text,
1000529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch                              size_t byteLength,
1010529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch                              const SkScalar xpos[],
1020529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch                              SkScalar constY,
1030529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch                              const SkPaint&) OVERRIDE;
1040529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  virtual void onDrawTextOnPath(const void* text,
1050529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch                                size_t byteLength,
1060529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch                                const SkPath& path,
1070529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch                                const SkMatrix* matrix,
1080529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch                                const SkPaint&) OVERRIDE;
1091320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  virtual void onDrawTextBlob(const SkTextBlob* blob,
1101320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                              SkScalar x,
1111320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                              SkScalar y,
1121320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                              const SkPaint& paint) OVERRIDE;
113010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  virtual void onDrawDRRect(const SkRRect& outer,
114010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                            const SkRRect& inner,
115010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                            const SkPaint&) OVERRIDE;
1160529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch
11703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  void OnComplexClip();
11803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)
11903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) private:
120a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  typedef SkCanvas INHERITED;
121a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
122a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  int saved_stack_size_;
123a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  int force_not_solid_stack_level_;
124a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  int force_not_transparent_stack_level_;
1252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
126868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  bool is_forced_not_solid_;
127868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  bool is_forced_not_transparent_;
128868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  bool is_solid_color_;
1292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  SkColor color_;
130868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  bool is_transparent_;
1315f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  int draw_op_count_;
1322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)};
1332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}  // namespace skia
1352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#endif  // SKIA_EXT_ANALYSIS_CANVAS_H_
1372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
138