analysis_canvas.h revision 2a99a7e74a7f215066514fe81d2bfa6639d9eddd
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)
82a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include <list>
92a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include <set>
102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/hash_tables.h"
122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "skia/ext/lazy_pixel_ref.h"
132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "third_party/skia/include/core/SkCanvas.h"
142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "third_party/skia/include/core/SkDevice.h"
152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)namespace skia {
172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class AnalysisDevice;
192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Does not render anything, but gathers statistics about a region
212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// (specified as a clip rectangle) of an SkPicture as the picture is
222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// played back through it.
232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// To use: create a SkBitmap with kNo_Config, create an AnalysisDevice
242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// using that bitmap, and create an AnalysisCanvas using the device.
252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Play a picture into the canvas, and then check isCheap().
262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class SK_API AnalysisCanvas : public SkCanvas {
272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) public:
282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  typedef std::list<skia::LazyPixelRef*> LazyPixelRefList;
292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  AnalysisCanvas(AnalysisDevice*);
312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual ~AnalysisCanvas();
322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Returns true if the estimated cost of drawing is below an
342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // arbitrary threshold.
352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  bool isCheap() const;
362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  bool getColorIfSolid(SkColor* color) const;
372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  bool isTransparent() const;
382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  void consumeLazyPixelRefs(LazyPixelRefList* pixelRefs);
392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Returns the estimated cost of drawing, in arbitrary units.
412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  int getEstimatedCost() const;
422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual bool clipRect(const SkRect& rect,
442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                        SkRegion::Op op = SkRegion::kIntersect_Op,
452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                        bool doAntiAlias = false) OVERRIDE;
462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual bool clipPath(const SkPath& path,
472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                        SkRegion::Op op = SkRegion::kIntersect_Op,
482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                        bool doAntiAlias = false) OVERRIDE;
492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual bool clipRRect(const SkRRect& rrect,
502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                         SkRegion::Op op = SkRegion::kIntersect_Op,
512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                         bool doAntiAlias = false) OVERRIDE;
522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual int saveLayer(const SkRect* bounds, const SkPaint*,
542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                              SkCanvas::SaveFlags flags) OVERRIDE;
552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual int save(SaveFlags flags = kMatrixClip_SaveFlag) OVERRIDE;
562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual void restore() OVERRIDE;
582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) private:
602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  typedef SkCanvas INHERITED;
612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  static const int kNoLayer;
622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  int savedStackSize_;
642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  int forceNotSolidStackLevel_;
652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  int forceNotTransparentStackLevel_;
662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)};
672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class SK_API AnalysisDevice : public SkDevice {
692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) public:
702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  typedef std::list<skia::LazyPixelRef*> LazyPixelRefList;
712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  typedef base::hash_set<uint32_t> IdSet;
722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  AnalysisDevice(const SkBitmap& bm);
742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual ~AnalysisDevice();
752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  int getEstimatedCost() const;
772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  bool getColorIfSolid(SkColor* color) const;
782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  bool isTransparent() const;
792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  void consumeLazyPixelRefs(LazyPixelRefList* pixelRefs);
802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  void setForceNotSolid(bool flag);
822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  void setForceNotTransparent(bool flag);
832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) protected:
852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual void clear(SkColor color) OVERRIDE;
862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual void drawPaint(const SkDraw&, const SkPaint& paint) OVERRIDE;
872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual void drawPoints(const SkDraw&, SkCanvas::PointMode mode,
882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                          size_t count, const SkPoint[],
892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                          const SkPaint& paint) OVERRIDE;
902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual void drawRect(const SkDraw&, const SkRect& r,
912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                        const SkPaint& paint) OVERRIDE;
922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual void drawOval(const SkDraw&, const SkRect& oval,
932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                        const SkPaint& paint) OVERRIDE;
942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual void drawPath(const SkDraw&, const SkPath& path,
952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                        const SkPaint& paint,
962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                        const SkMatrix* prePathMatrix = NULL,
972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                        bool pathIsMutable = false) OVERRIDE;
982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual void drawBitmap(const SkDraw&, const SkBitmap& bitmap,
992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                          const SkIRect* srcRectOrNull,
1002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                          const SkMatrix& matrix, const SkPaint& paint)
1012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                          OVERRIDE;
1022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual void drawSprite(const SkDraw&, const SkBitmap& bitmap,
1032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                          int x, int y, const SkPaint& paint) OVERRIDE;
1042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual void drawBitmapRect(const SkDraw&, const SkBitmap&,
1052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                              const SkRect* srcOrNull, const SkRect& dst,
1062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                              const SkPaint& paint) OVERRIDE;
1072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual void drawText(const SkDraw&, const void* text, size_t len,
1082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                        SkScalar x, SkScalar y, const SkPaint& paint)
1092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                        OVERRIDE;
1102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual void drawPosText(const SkDraw& draw, const void* text, size_t len,
1112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                           const SkScalar pos[], SkScalar constY,
1122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                           int scalarsPerPos, const SkPaint& paint) OVERRIDE;
1132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual void drawTextOnPath(const SkDraw&, const void* text, size_t len,
1142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                              const SkPath& path, const SkMatrix* matrix,
1152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                              const SkPaint& paint) OVERRIDE;
1162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#ifdef SK_BUILD_FOR_ANDROID
1172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual void drawPosTextOnPath(const SkDraw& draw, const void* text,
1182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                 size_t len,
1192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                 const SkPoint pos[], const SkPaint& paint,
1202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                 const SkPath& path, const SkMatrix* matrix)
1212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                 OVERRIDE;
1222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#endif
1232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual void drawVertices(const SkDraw&, SkCanvas::VertexMode,
1242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                            int vertexCount,
1252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                            const SkPoint verts[], const SkPoint texs[],
1262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                            const SkColor colors[], SkXfermode* xmode,
1272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                            const uint16_t indices[], int indexCount,
1282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                            const SkPaint& paint) OVERRIDE;
1292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual void drawDevice(const SkDraw&, SkDevice*, int x, int y,
1302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                          const SkPaint&) OVERRIDE;
1312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  int estimatedCost_;
1332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) private:
1352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  typedef SkDevice INHERITED;
1372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  void addPixelRefIfLazy(SkPixelRef* pixelRef);
1392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  void addBitmap(const SkBitmap& bitmap);
1402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  void addBitmapFromPaint(const SkPaint& paint);
1412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  bool isForcedNotSolid_;
1432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  bool isForcedNotTransparent_;
1442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  bool isSolidColor_;
1452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  SkColor color_;
1462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  bool isTransparent_;
1472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  IdSet existingPixelRefIDs_;
1482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  LazyPixelRefList lazyPixelRefs_;
1492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)};
1502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}  // namespace skia
1522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#endif  // SKIA_EXT_ANALYSIS_CANVAS_H_
1542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
155