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