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