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