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