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