180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru
280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru/*
380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru * Copyright 2006 The Android Open Source Project
480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru *
580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru * Use of this source code is governed by a BSD-style license that can be
680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru * found in the LICENSE file.
780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru */
880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru
980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru
1080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru#include "SkDisplayList.h"
1180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru#include "SkAnimateActive.h"
1280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru#include "SkAnimateBase.h"
1380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru#include "SkAnimateMaker.h"
1480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru#include "SkDisplayApply.h"
1580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru#include "SkDrawable.h"
1680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru#include "SkDrawGroup.h"
1780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru#include "SkDrawMatrix.h"
1880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru#include "SkInterpolator.h"
1980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru#include "SkTime.h"
2080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru
2180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste QueruSkDisplayList::SkDisplayList() : fDrawBounds(true), fUnionBounds(false), fInTime(0) {
2280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru}
2380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru
2480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste QueruSkDisplayList::~SkDisplayList() {
2580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru}
2680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru
2780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queruvoid SkDisplayList::append(SkActive* active) {
2880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    *fActiveList.append() = active;
2980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru}
3080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru
3180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Querubool SkDisplayList::draw(SkAnimateMaker& maker, SkMSec inTime) {
3280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    validate();
3380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    fInTime = inTime;
3480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    bool result = false;
3580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    fInvalBounds.setEmpty();
3680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    if (fDrawList.count()) {
3780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru        for (SkActive** activePtr = fActiveList.begin(); activePtr < fActiveList.end(); activePtr++) {
3880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru            SkActive* active = *activePtr;
3980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru            active->reset();
4080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru        }
4180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru        for (int index = 0; index < fDrawList.count(); index++) {
4280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru            SkDrawable* draw = fDrawList[index];
4380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru            draw->initialize(); // allow matrices to reset themselves
4480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru            SkASSERT(draw->isDrawable());
4580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru            validate();
4680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru            result |= draw->draw(maker);
4780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru        }
4880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    }
4980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    validate();
5080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    return result;
5180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru}
5280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru
5380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queruint SkDisplayList::findGroup(SkDrawable* match, SkTDDrawableArray** list,
5480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru        SkGroup** parent, SkGroup** found, SkTDDrawableArray**grandList) {
5580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    *parent = NULL;
5680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    *list = &fDrawList;
5780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    *grandList = &fDrawList;
5880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    return SearchForMatch(match, list, parent, found, grandList);
5980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru}
6080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru
6180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queruvoid SkDisplayList::hardReset() {
6280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    fDrawList.reset();
6380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    fActiveList.reset();
6480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru}
6580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru
6680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Querubool SkDisplayList::onIRect(const SkIRect& r) {
6780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    fBounds = r;
6880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    return fDrawBounds;
6980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru}
7080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru
7180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queruint SkDisplayList::SearchForMatch(SkDrawable* match, SkTDDrawableArray** list,
7280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru        SkGroup** parent, SkGroup** found, SkTDDrawableArray**grandList) {
7380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    *found = NULL;
7480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    for (int index = 0; index < (*list)->count(); index++) {
7580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru        SkDrawable* draw = (**list)[index];
7680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru        if (draw == match)
7780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru            return index;
7880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru        if (draw->isApply()) {
7980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru            SkApply* apply = (SkApply*) draw;
8080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru            if (apply->scope == match)
8180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru                return index;
8280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru            if (apply->scope->isGroup() && SearchGroupForMatch(apply->scope, match, list, parent, found, grandList, index))
8380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru                return index;
8480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru            if (apply->mode == SkApply::kMode_create) {
8580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru                for (SkDrawable** ptr = apply->fScopes.begin(); ptr < apply->fScopes.end(); ptr++) {
8680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru                    SkDrawable* scope = *ptr;
8780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru                    if (scope == match)
8880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru                        return index;
8980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru                    //perhaps should call SearchGroupForMatch here as well (on scope)
9080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru                }
9180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru            }
9280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru        }
9380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru        if (draw->isGroup() && SearchGroupForMatch(draw, match, list, parent, found, grandList, index))
9480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru            return index;
9580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru
9680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    }
9780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    return -1;
9880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru}
9980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru
10080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Querubool SkDisplayList::SearchGroupForMatch(SkDrawable* draw, SkDrawable* match, SkTDDrawableArray** list,
10180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru        SkGroup** parent, SkGroup** found, SkTDDrawableArray** grandList, int &index) {
10280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru            SkGroup* group = (SkGroup*) draw;
10380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru            if (group->getOriginal() == match)
10480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru                return true;
10580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru            SkTDDrawableArray* saveList = *list;
10680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru            int groupIndex = group->findGroup(match, list, parent, found, grandList);
10780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru            if (groupIndex >= 0) {
10880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru                *found = group;
10980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru                index = groupIndex;
11080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru                return true;
11180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru            }
11280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru            *list = saveList;
11380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru            return false;
11480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru        }
11580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru
11680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queruvoid SkDisplayList::reset() {
11780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    for (int index = 0; index < fDrawList.count(); index++) {
11880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru        SkDrawable* draw = fDrawList[index];
11980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru        if (draw->isApply() == false)
12080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru            continue;
12180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru        SkApply* apply = (SkApply*) draw;
12280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru        apply->reset();
12380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    }
12480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru}
12580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru
12680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queruvoid SkDisplayList::remove(SkActive* active) {
12780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    int index = fActiveList.find(active);
12880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    SkASSERT(index >= 0);
12980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    fActiveList.remove(index);  // !!! could use shuffle instead
13080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    SkASSERT(fActiveList.find(active) < 0);
13180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru}
13280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru
13380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru#ifdef SK_DUMP_ENABLED
13480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queruint SkDisplayList::fDumpIndex;
13580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queruint SkDisplayList::fIndent;
13680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru
13780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queruvoid SkDisplayList::dump(SkAnimateMaker* maker) {
13880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    fIndent = 0;
13980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    dumpInner(maker);
14080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru}
14180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru
14280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queruvoid SkDisplayList::dumpInner(SkAnimateMaker* maker) {
14380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    for (int index = 0; index < fDrawList.count(); index++) {
14480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru        fDumpIndex = index;
14580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru        fDrawList[fDumpIndex]->dump(maker);
14680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    }
14780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru}
14880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru
14980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru#endif
15080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru
15180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru#ifdef SK_DEBUG
15280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queruvoid SkDisplayList::validate() {
15380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    for (int index = 0; index < fDrawList.count(); index++) {
15480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru        SkDrawable* draw = fDrawList[index];
15580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru        draw->validate();
15680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    }
15780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru}
15880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru#endif
159