11cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger 20910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project/* 31cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger * Copyright 2011 The Android Open Source Project 40910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project * 51cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger * Use of this source code is governed by a BSD-style license that can be 61cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger * found in the LICENSE file. 70910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project */ 80910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project 91cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger 100910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#ifndef SkDrawLooper_DEFINED 110910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#define SkDrawLooper_DEFINED 120910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project 130910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#include "SkFlattenable.h" 140910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project 150910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Projectclass SkCanvas; 160910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Projectclass SkPaint; 170910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project 180910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project/** \class SkDrawLooper 190910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project Subclasses of SkDrawLooper can be attached to a SkPaint. Where they are, 200910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project and something is drawn to a canvas with that paint, the looper subclass will 210910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project be called, allowing it to modify the canvas and/or paint for that draw call. 220910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project More than that, via the next() method, the looper can modify the draw to be 230910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project invoked multiple times (hence the name loop-er), allow it to perform effects 240910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project like shadows or frame/fills, that require more than one pass. 250910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project*/ 26137a4ca42423bbb6d683067ea544c9a48f18f06cDerek Sollenbergerclass SK_API SkDrawLooper : public SkFlattenable { 270910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Projectpublic: 2887b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenberger /** 2987b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenberger * Called right before something is being drawn. This will be followed by 3087b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenberger * calls to next() until next() returns false. 3187b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenberger */ 3287b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenberger virtual void init(SkCanvas*) = 0; 3387b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenberger 3487b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenberger /** 3587b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenberger * Called in a loop (after init()). Each time true is returned, the object 3687b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenberger * is drawn (possibly with a modified canvas and/or paint). When false is 3787b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenberger * finally returned, drawing for the object stops. 3887b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenberger * 3987b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenberger * On each call, the paint will be in its original state, but the canvas 4087b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenberger * will be as it was following the previous call to next() or init(). 4187b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenberger * 4287b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenberger * The implementation must ensure that, when next() finally returns false, 4387b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenberger * that the canvas has been restored to the state it was initially, before 4487b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenberger * init() was first called. 4587b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenberger */ 4687b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenberger virtual bool next(SkCanvas*, SkPaint* paint) = 0; 470910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project 48717c009190af219a2f9e248d6fa13ad71cfdb0b1Derek Sollenberger /** 49717c009190af219a2f9e248d6fa13ad71cfdb0b1Derek Sollenberger * The fast bounds functions are used to enable the paint to be culled early 50717c009190af219a2f9e248d6fa13ad71cfdb0b1Derek Sollenberger * in the drawing pipeline. If a subclass can support this feature it must 51717c009190af219a2f9e248d6fa13ad71cfdb0b1Derek Sollenberger * return true for the canComputeFastBounds() function. If that function 52717c009190af219a2f9e248d6fa13ad71cfdb0b1Derek Sollenberger * returns false then computeFastBounds behavior is undefined otherwise it 53717c009190af219a2f9e248d6fa13ad71cfdb0b1Derek Sollenberger * is expected to have the following behavior. Given the parent paint and 54717c009190af219a2f9e248d6fa13ad71cfdb0b1Derek Sollenberger * the parent's bounding rect the subclass must fill in and return the 55717c009190af219a2f9e248d6fa13ad71cfdb0b1Derek Sollenberger * storage rect, where the storage rect is with the union of the src rect 56717c009190af219a2f9e248d6fa13ad71cfdb0b1Derek Sollenberger * and the looper's bounding rect. 57717c009190af219a2f9e248d6fa13ad71cfdb0b1Derek Sollenberger */ 58717c009190af219a2f9e248d6fa13ad71cfdb0b1Derek Sollenberger virtual bool canComputeFastBounds(const SkPaint& paint); 59717c009190af219a2f9e248d6fa13ad71cfdb0b1Derek Sollenberger virtual void computeFastBounds(const SkPaint& paint, 60717c009190af219a2f9e248d6fa13ad71cfdb0b1Derek Sollenberger const SkRect& src, SkRect* dst); 61717c009190af219a2f9e248d6fa13ad71cfdb0b1Derek Sollenberger 620910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Projectprotected: 630910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project SkDrawLooper() {} 640910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project SkDrawLooper(SkFlattenableReadBuffer& buffer) : INHERITED(buffer) {} 650910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project 660910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Projectprivate: 670910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project typedef SkFlattenable INHERITED; 680910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project}; 690910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project 700910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#endif 71