3 * Copyright 2011 The Android Open Source Project
5 * Use of this source code is governed by a BSD-style license that can be
6 * found in the LICENSE file.
10 #ifndef SkDrawLooper_DEFINED
11 #define SkDrawLooper_DEFINED
13 #include "SkFlattenable.h"
20 /** \class SkDrawLooper
21 Subclasses of SkDrawLooper can be attached to a SkPaint. Where they are,
22 and something is drawn to a canvas with that paint, the looper subclass will
23 be called, allowing it to modify the canvas and/or paint for that draw call.
24 More than that, via the next() method, the looper can modify the draw to be
25 invoked multiple times (hence the name loop-er), allow it to perform effects
26 like shadows or frame/fills, that require more than one pass.
28 class SK_API SkDrawLooper : public SkFlattenable {
30 SK_DECLARE_INST_COUNT(SkDrawLooper)
33 * Called right before something is being drawn. This will be followed by
34 * calls to next() until next() returns false.
36 virtual void init(SkCanvas*) = 0;
39 * Called in a loop (after init()). Each time true is returned, the object
40 * is drawn (possibly with a modified canvas and/or paint). When false is
41 * finally returned, drawing for the object stops.
43 * On each call, the paint will be in its original state, but the canvas
44 * will be as it was following the previous call to next() or init().
46 * The implementation must ensure that, when next() finally returns false,
47 * that the canvas has been restored to the state it was initially, before
48 * init() was first called.
50 virtual bool next(SkCanvas*, SkPaint* paint) = 0;
53 * The fast bounds functions are used to enable the paint to be culled early
54 * in the drawing pipeline. If a subclass can support this feature it must
55 * return true for the canComputeFastBounds() function. If that function
56 * returns false then computeFastBounds behavior is undefined otherwise it
57 * is expected to have the following behavior. Given the parent paint and
58 * the parent's bounding rect the subclass must fill in and return the
59 * storage rect, where the storage rect is with the union of the src rect
60 * and the looper's bounding rect.
62 virtual bool canComputeFastBounds(const SkPaint& paint);
63 virtual void computeFastBounds(const SkPaint& paint,
64 const SkRect& src, SkRect* dst);
66 SkDEVCODE(virtual void toString(SkString* str) const = 0;)
67 SK_DEFINE_FLATTENABLE_TYPE(SkDrawLooper)
71 SkDrawLooper(SkReadBuffer& buffer) : INHERITED(buffer) {}
74 typedef SkFlattenable INHERITED;