10910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project/*
20910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project * Copyright (C) 2008 The Android Open Source Project
30910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project *
40910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project * Licensed under the Apache License, Version 2.0 (the "License");
50910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project * you may not use this file except in compliance with the License.
60910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project * You may obtain a copy of the License at
70910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project *
80910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project *      http://www.apache.org/licenses/LICENSE-2.0
90910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project *
100910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project * Unless required by applicable law or agreed to in writing, software
110910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project * distributed under the License is distributed on an "AS IS" BASIS,
120910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
130910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project * See the License for the specific language governing permissions and
140910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project * limitations under the License.
150910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project */
160910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
170910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#ifndef SkDrawLooper_DEFINED
180910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#define SkDrawLooper_DEFINED
190910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
200910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#include "SkFlattenable.h"
210910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
220910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project////////////////// EXPERIMENTAL //////////////////////////
230910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
240910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Projectclass SkCanvas;
250910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Projectclass SkPaint;
260910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
270910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project/** \class SkDrawLooper
280910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    Subclasses of SkDrawLooper can be attached to a SkPaint. Where they are,
290910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    and something is drawn to a canvas with that paint, the looper subclass will
300910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    be called, allowing it to modify the canvas and/or paint for that draw call.
310910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    More than that, via the next() method, the looper can modify the draw to be
320910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    invoked multiple times (hence the name loop-er), allow it to perform effects
330910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    like shadows or frame/fills, that require more than one pass.
340910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project*/
350910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Projectclass SkDrawLooper : public SkFlattenable {
360910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Projectpublic:
370910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    /** Called right before something is being drawn to the specified canvas
380910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        with the specified paint. Subclass that want to modify either parameter
390910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        can do so now.
400910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    */
410910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    virtual void init(SkCanvas*, SkPaint*) {}
420910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    /** Called in a loop (after init()). Each time true is returned, the object
430910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        is drawn (possibly with a modified canvas and/or paint). When false is
440910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        finally returned, drawing for the object stops.
450910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    */
460910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    virtual bool next() { return false; }
470910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    /** Called after the looper has finally returned false from next(), allowing
480910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        the looper to restore the canvas/paint to their original states.
490910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        is this required, since the subclass knows when it is done???
500910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        should we pass the canvas/paint here, and/or to the next call
510910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        so that subclasses don't need to retain pointers to them during the
520910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        loop?
530910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    */
540910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    virtual void restore() {}
550910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
560910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Projectprotected:
570910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    SkDrawLooper() {}
580910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    SkDrawLooper(SkFlattenableReadBuffer& buffer) : INHERITED(buffer) {}
590910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
600910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Projectprivate:
610910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    typedef SkFlattenable INHERITED;
620910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project};
630910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
640910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#endif
65