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