blob: f1fb5bdcb912279d69c8a9e4ea12a5db6a901858 [file] [log] [blame]
epoger@google.comec3ed6a2011-07-28 14:26:00 +00001
reed@android.com8a1c16f2008-12-17 15:59:43 +00002/*
epoger@google.comec3ed6a2011-07-28 14:26:00 +00003 * Copyright 2011 The Android Open Source Project
reed@android.com8a1c16f2008-12-17 15:59:43 +00004 *
epoger@google.comec3ed6a2011-07-28 14:26:00 +00005 * Use of this source code is governed by a BSD-style license that can be
6 * found in the LICENSE file.
reed@android.com8a1c16f2008-12-17 15:59:43 +00007 */
8
epoger@google.comec3ed6a2011-07-28 14:26:00 +00009
reed@android.com8a1c16f2008-12-17 15:59:43 +000010#ifndef SkDrawLooper_DEFINED
11#define SkDrawLooper_DEFINED
12
13#include "SkFlattenable.h"
14
reed@android.com8a1c16f2008-12-17 15:59:43 +000015class SkCanvas;
16class SkPaint;
djsollen@google.comc73dd5c2012-08-07 15:54:32 +000017struct SkRect;
reed@android.com8a1c16f2008-12-17 15:59:43 +000018
19/** \class SkDrawLooper
20 Subclasses of SkDrawLooper can be attached to a SkPaint. Where they are,
21 and something is drawn to a canvas with that paint, the looper subclass will
22 be called, allowing it to modify the canvas and/or paint for that draw call.
23 More than that, via the next() method, the looper can modify the draw to be
24 invoked multiple times (hence the name loop-er), allow it to perform effects
25 like shadows or frame/fills, that require more than one pass.
26*/
ctguil@chromium.org7ffb1b22011-03-15 21:27:08 +000027class SK_API SkDrawLooper : public SkFlattenable {
reed@android.com8a1c16f2008-12-17 15:59:43 +000028public:
robertphillips@google.com0456e0b2012-06-27 14:03:26 +000029 SK_DECLARE_INST_COUNT(SkDrawLooper)
30
reed@google.com4e2b3d32011-04-07 14:18:59 +000031 /**
32 * Called right before something is being drawn. This will be followed by
33 * calls to next() until next() returns false.
34 */
35 virtual void init(SkCanvas*) = 0;
36
37 /**
38 * Called in a loop (after init()). Each time true is returned, the object
39 * is drawn (possibly with a modified canvas and/or paint). When false is
40 * finally returned, drawing for the object stops.
41 *
42 * On each call, the paint will be in its original state, but the canvas
43 * will be as it was following the previous call to next() or init().
44 *
45 * The implementation must ensure that, when next() finally returns false,
46 * that the canvas has been restored to the state it was initially, before
47 * init() was first called.
48 */
49 virtual bool next(SkCanvas*, SkPaint* paint) = 0;
reed@android.com8a1c16f2008-12-17 15:59:43 +000050
reed@google.com9efd9a02012-01-30 15:41:43 +000051 /**
52 * The fast bounds functions are used to enable the paint to be culled early
53 * in the drawing pipeline. If a subclass can support this feature it must
54 * return true for the canComputeFastBounds() function. If that function
55 * returns false then computeFastBounds behavior is undefined otherwise it
56 * is expected to have the following behavior. Given the parent paint and
57 * the parent's bounding rect the subclass must fill in and return the
58 * storage rect, where the storage rect is with the union of the src rect
59 * and the looper's bounding rect.
60 */
61 virtual bool canComputeFastBounds(const SkPaint& paint);
62 virtual void computeFastBounds(const SkPaint& paint,
63 const SkRect& src, SkRect* dst);
64
reed@android.com8a1c16f2008-12-17 15:59:43 +000065protected:
66 SkDrawLooper() {}
67 SkDrawLooper(SkFlattenableReadBuffer& buffer) : INHERITED(buffer) {}
68
69private:
70 typedef SkFlattenable INHERITED;
71};
72
73#endif