analysis_canvas.h revision 868fa2fe829687343ffae624259930155e16dbd8
15c838251403b0be9a882540f1922577abba4c872ager@chromium.org// Copyright (c) 2013 The Chromium Authors. All rights reserved.
25c838251403b0be9a882540f1922577abba4c872ager@chromium.org// Use of this source code is governed by a BSD-style license that can be
35c838251403b0be9a882540f1922577abba4c872ager@chromium.org// found in the LICENSE file.
45c838251403b0be9a882540f1922577abba4c872ager@chromium.org
55c838251403b0be9a882540f1922577abba4c872ager@chromium.org#ifndef SKIA_EXT_ANALYSIS_CANVAS_H_
65c838251403b0be9a882540f1922577abba4c872ager@chromium.org#define SKIA_EXT_ANALYSIS_CANVAS_H_
75c838251403b0be9a882540f1922577abba4c872ager@chromium.org
85c838251403b0be9a882540f1922577abba4c872ager@chromium.org#include "third_party/skia/include/core/SkCanvas.h"
95c838251403b0be9a882540f1922577abba4c872ager@chromium.org#include "third_party/skia/include/core/SkDevice.h"
105c838251403b0be9a882540f1922577abba4c872ager@chromium.org#include "third_party/skia/include/core/SkPicture.h"
115c838251403b0be9a882540f1922577abba4c872ager@chromium.org
125c838251403b0be9a882540f1922577abba4c872ager@chromium.orgnamespace skia {
135c838251403b0be9a882540f1922577abba4c872ager@chromium.org
145c838251403b0be9a882540f1922577abba4c872ager@chromium.orgclass AnalysisDevice;
155c838251403b0be9a882540f1922577abba4c872ager@chromium.org
165c838251403b0be9a882540f1922577abba4c872ager@chromium.org// Does not render anything, but gathers statistics about a region
175c838251403b0be9a882540f1922577abba4c872ager@chromium.org// (specified as a clip rectangle) of an SkPicture as the picture is
185c838251403b0be9a882540f1922577abba4c872ager@chromium.org// played back through it.
195c838251403b0be9a882540f1922577abba4c872ager@chromium.org// To use: create a SkBitmap with kNo_Config, create an AnalysisDevice
205c838251403b0be9a882540f1922577abba4c872ager@chromium.org// using that bitmap, and create an AnalysisCanvas using the device.
215c838251403b0be9a882540f1922577abba4c872ager@chromium.org// Play a picture into the canvas, and then check result.
225c838251403b0be9a882540f1922577abba4c872ager@chromium.orgclass SK_API AnalysisCanvas : public SkCanvas, public SkDrawPictureCallback {
235c838251403b0be9a882540f1922577abba4c872ager@chromium.org public:
245c838251403b0be9a882540f1922577abba4c872ager@chromium.org  AnalysisCanvas(AnalysisDevice*);
255c838251403b0be9a882540f1922577abba4c872ager@chromium.org  virtual ~AnalysisCanvas();
265c838251403b0be9a882540f1922577abba4c872ager@chromium.org
275c838251403b0be9a882540f1922577abba4c872ager@chromium.org  // Returns true when a SkColor can be used to represent result.
285c838251403b0be9a882540f1922577abba4c872ager@chromium.org  bool GetColorIfSolid(SkColor* color) const;
295c838251403b0be9a882540f1922577abba4c872ager@chromium.org  bool HasText() const;
305c838251403b0be9a882540f1922577abba4c872ager@chromium.org
315c838251403b0be9a882540f1922577abba4c872ager@chromium.org  // SkDrawPictureCallback override.
325c838251403b0be9a882540f1922577abba4c872ager@chromium.org  virtual bool abortDrawing() OVERRIDE;
335c838251403b0be9a882540f1922577abba4c872ager@chromium.org
345c838251403b0be9a882540f1922577abba4c872ager@chromium.org  // SkCanvas overrides.
355c838251403b0be9a882540f1922577abba4c872ager@chromium.org  virtual bool clipRect(const SkRect& rect,
365c838251403b0be9a882540f1922577abba4c872ager@chromium.org                        SkRegion::Op op = SkRegion::kIntersect_Op,
375c838251403b0be9a882540f1922577abba4c872ager@chromium.org                        bool do_anti_alias = false) OVERRIDE;
385c838251403b0be9a882540f1922577abba4c872ager@chromium.org  virtual bool clipPath(const SkPath& path,
395c838251403b0be9a882540f1922577abba4c872ager@chromium.org                        SkRegion::Op op = SkRegion::kIntersect_Op,
405c838251403b0be9a882540f1922577abba4c872ager@chromium.org                        bool do_anti_alias = false) OVERRIDE;
415c838251403b0be9a882540f1922577abba4c872ager@chromium.org  virtual bool clipRRect(const SkRRect& rrect,
425c838251403b0be9a882540f1922577abba4c872ager@chromium.org                         SkRegion::Op op = SkRegion::kIntersect_Op,
435c838251403b0be9a882540f1922577abba4c872ager@chromium.org                         bool do_anti_alias = false) OVERRIDE;
445c838251403b0be9a882540f1922577abba4c872ager@chromium.org
455c838251403b0be9a882540f1922577abba4c872ager@chromium.org  virtual int saveLayer(const SkRect* bounds,
465c838251403b0be9a882540f1922577abba4c872ager@chromium.org                        const SkPaint* paint,
475c838251403b0be9a882540f1922577abba4c872ager@chromium.org                        SkCanvas::SaveFlags flags) OVERRIDE;
485c838251403b0be9a882540f1922577abba4c872ager@chromium.org  virtual int save(SaveFlags flags = kMatrixClip_SaveFlag) OVERRIDE;
495c838251403b0be9a882540f1922577abba4c872ager@chromium.org
505c838251403b0be9a882540f1922577abba4c872ager@chromium.org  virtual void restore() OVERRIDE;
515c838251403b0be9a882540f1922577abba4c872ager@chromium.org
525c838251403b0be9a882540f1922577abba4c872ager@chromium.org private:
535c838251403b0be9a882540f1922577abba4c872ager@chromium.org  typedef SkCanvas INHERITED;
545c838251403b0be9a882540f1922577abba4c872ager@chromium.org
555c838251403b0be9a882540f1922577abba4c872ager@chromium.org  int saved_stack_size_;
565c838251403b0be9a882540f1922577abba4c872ager@chromium.org  int force_not_solid_stack_level_;
575c838251403b0be9a882540f1922577abba4c872ager@chromium.org  int force_not_transparent_stack_level_;
585c838251403b0be9a882540f1922577abba4c872ager@chromium.org};
595c838251403b0be9a882540f1922577abba4c872ager@chromium.org
605c838251403b0be9a882540f1922577abba4c872ager@chromium.orgclass SK_API AnalysisDevice : public SkDevice {
615c838251403b0be9a882540f1922577abba4c872ager@chromium.org public:
625c838251403b0be9a882540f1922577abba4c872ager@chromium.org  AnalysisDevice(const SkBitmap& bitmap);
635c838251403b0be9a882540f1922577abba4c872ager@chromium.org  virtual ~AnalysisDevice();
645c838251403b0be9a882540f1922577abba4c872ager@chromium.org
655c838251403b0be9a882540f1922577abba4c872ager@chromium.org  bool GetColorIfSolid(SkColor* color) const;
665c838251403b0be9a882540f1922577abba4c872ager@chromium.org  bool HasText() const;
675c838251403b0be9a882540f1922577abba4c872ager@chromium.org
685c838251403b0be9a882540f1922577abba4c872ager@chromium.org  void SetForceNotSolid(bool flag);
695c838251403b0be9a882540f1922577abba4c872ager@chromium.org  void SetForceNotTransparent(bool flag);
705c838251403b0be9a882540f1922577abba4c872ager@chromium.org
715c838251403b0be9a882540f1922577abba4c872ager@chromium.org protected:
725c838251403b0be9a882540f1922577abba4c872ager@chromium.org  // SkDevice overrides.
735c838251403b0be9a882540f1922577abba4c872ager@chromium.org  virtual void clear(SkColor color) OVERRIDE;
747516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org  virtual void drawPaint(const SkDraw& draw, const SkPaint& paint) OVERRIDE;
757516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org  virtual void drawPoints(const SkDraw& draw,
767516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org                          SkCanvas::PointMode mode,
777516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org                          size_t count,
787516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org                          const SkPoint points[],
797516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org                          const SkPaint& paint) OVERRIDE;
807516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org  virtual void drawRect(const SkDraw& draw,
817516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org                        const SkRect& rect,
827516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org                        const SkPaint& paint) OVERRIDE;
837516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org  virtual void drawOval(const SkDraw& draw,
847516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org                        const SkRect& oval,
857516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org                        const SkPaint& paint) OVERRIDE;
867516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org  virtual void drawPath(const SkDraw& draw,
877516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org                        const SkPath& path,
887516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org                        const SkPaint& paint,
897516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org                        const SkMatrix* pre_path_matrix = NULL,
907516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org                        bool path_is_mutable = false) OVERRIDE;
917516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org  virtual void drawBitmap(const SkDraw& draw,
927516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org                          const SkBitmap& bitmap,
937516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org                          const SkIRect* src_rect_or_null,
947516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org                          const SkMatrix& matrix,
957516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org                          const SkPaint& paint) OVERRIDE;
967516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org  virtual void drawSprite(const SkDraw& draw,
977516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org                          const SkBitmap& bitmap,
987516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org                          int x,
997516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org                          int y,
1007516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org                          const SkPaint& paint) OVERRIDE;
1017516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org  virtual void drawBitmapRect(const SkDraw& draw,
1027516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org                              const SkBitmap& bitmap,
1037516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org                              const SkRect* src_or_null,
1047516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org                              const SkRect& dst,
1057516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org                              const SkPaint& paint) OVERRIDE;
1067516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org  virtual void drawText(const SkDraw& draw,
1077516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org                        const void* text,
1087516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org                        size_t len,
1097516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org                        SkScalar x,
1107516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org                        SkScalar y,
1117516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org                        const SkPaint& paint) OVERRIDE;
1124a1fe7d5e92fdb673d5f05d5ddf7b1ed703ba18dwhesse@chromium.org  virtual void drawPosText(const SkDraw& draw,
1134a1fe7d5e92fdb673d5f05d5ddf7b1ed703ba18dwhesse@chromium.org                           const void* text,
1144a1fe7d5e92fdb673d5f05d5ddf7b1ed703ba18dwhesse@chromium.org                           size_t len,
1155c838251403b0be9a882540f1922577abba4c872ager@chromium.org                           const SkScalar pos[],
1165c838251403b0be9a882540f1922577abba4c872ager@chromium.org                           SkScalar const_y,
1175c838251403b0be9a882540f1922577abba4c872ager@chromium.org                           int scalars_per_pos,
1184a1fe7d5e92fdb673d5f05d5ddf7b1ed703ba18dwhesse@chromium.org                           const SkPaint& paint) OVERRIDE;
1195c838251403b0be9a882540f1922577abba4c872ager@chromium.org  virtual void drawTextOnPath(const SkDraw& draw,
1205c838251403b0be9a882540f1922577abba4c872ager@chromium.org                              const void* text,
1215c838251403b0be9a882540f1922577abba4c872ager@chromium.org                              size_t len,
1225c838251403b0be9a882540f1922577abba4c872ager@chromium.org                              const SkPath& path,
1235c838251403b0be9a882540f1922577abba4c872ager@chromium.org                              const SkMatrix* matrix,
1245c838251403b0be9a882540f1922577abba4c872ager@chromium.org                              const SkPaint& paint) OVERRIDE;
1255c838251403b0be9a882540f1922577abba4c872ager@chromium.org#ifdef SK_BUILD_FOR_ANDROID
1265c838251403b0be9a882540f1922577abba4c872ager@chromium.org  virtual void drawPosTextOnPath(const SkDraw& draw,
1277516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org                                 const void* text,
1287516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org                                 size_t len,
1297516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org                                 const SkPoint pos[],
1307516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org                                 const SkPaint& paint,
1317516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org                                 const SkPath& path,
1327516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org                                 const SkMatrix* matrix) OVERRIDE;
1337516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org#endif
1347516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org  virtual void drawVertices(const SkDraw& draw,
1357516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org                            SkCanvas::VertexMode vertex_mode,
1367516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org                            int vertex_count,
1377516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org                            const SkPoint verts[],
1387516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org                            const SkPoint texs[],
1397516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org                            const SkColor colors[],
1407516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org                            SkXfermode* xmode,
1417516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org                            const uint16_t indices[],
1427516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org                            int index_count,
1437516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org                            const SkPaint& paint) OVERRIDE;
1447516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org  virtual void drawDevice(const SkDraw& draw,
1457516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org                          SkDevice* device,
1467516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org                          int x,
1477516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org                          int y,
1487516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org                          const SkPaint& paint) OVERRIDE;
1497516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org
1507516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org private:
1517516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org  typedef SkDevice INHERITED;
1527516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org
1537516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org  bool is_forced_not_solid_;
1547516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org  bool is_forced_not_transparent_;
1557516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org  bool is_solid_color_;
1567516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org  SkColor color_;
1577516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org  bool is_transparent_;
1587516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org  bool has_text_;
1597516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org};
1607516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org
1617516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org}  // namespace skia
1625c838251403b0be9a882540f1922577abba4c872ager@chromium.org
1635c838251403b0be9a882540f1922577abba4c872ager@chromium.org#endif  // SKIA_EXT_ANALYSIS_CANVAS_H_
1645c838251403b0be9a882540f1922577abba4c872ager@chromium.org
1655c838251403b0be9a882540f1922577abba4c872ager@chromium.org