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