| Index: skia/animator/SkDrawGroup.cpp
|
| ===================================================================
|
| --- skia/animator/SkDrawGroup.cpp (revision 16859)
|
| +++ skia/animator/SkDrawGroup.cpp (working copy)
|
| @@ -1,331 +0,0 @@
|
| -/* libs/graphics/animator/SkDrawGroup.cpp
|
| -**
|
| -** Copyright 2006, The Android Open Source Project
|
| -**
|
| -** Licensed under the Apache License, Version 2.0 (the "License");
|
| -** you may not use this file except in compliance with the License.
|
| -** You may obtain a copy of the License at
|
| -**
|
| -** http://www.apache.org/licenses/LICENSE-2.0
|
| -**
|
| -** Unless required by applicable law or agreed to in writing, software
|
| -** distributed under the License is distributed on an "AS IS" BASIS,
|
| -** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
| -** See the License for the specific language governing permissions and
|
| -** limitations under the License.
|
| -*/
|
| -
|
| -#include "SkDrawGroup.h"
|
| -#include "SkAnimateMaker.h"
|
| -#include "SkAnimatorScript.h"
|
| -#include "SkCanvas.h"
|
| -#include "SkDisplayApply.h"
|
| -#include "SkPaint.h"
|
| -#ifdef SK_DEBUG
|
| -#include "SkDisplayList.h"
|
| -#endif
|
| -
|
| -#if SK_USE_CONDENSED_INFO == 0
|
| -
|
| -const SkMemberInfo SkGroup::fInfo[] = {
|
| - SK_MEMBER(condition, String),
|
| - SK_MEMBER(enableCondition, String)
|
| -};
|
| -
|
| -#endif
|
| -
|
| -DEFINE_GET_MEMBER(SkGroup);
|
| -
|
| -SkGroup::SkGroup() : fParentList(NULL), fOriginal(NULL) {
|
| -}
|
| -
|
| -SkGroup::~SkGroup() {
|
| - if (fOriginal) // has been copied
|
| - return;
|
| - int index = 0;
|
| - int max = fCopies.count() << 5;
|
| - for (SkDrawable** ptr = fChildren.begin(); ptr < fChildren.end(); ptr++) {
|
| - if (index >= max || markedForDelete(index))
|
| - delete *ptr;
|
| -// else {
|
| -// SkApply* apply = (SkApply*) *ptr;
|
| -// SkASSERT(apply->isApply());
|
| -// SkASSERT(apply->getScope());
|
| -// delete apply->getScope();
|
| -// }
|
| - index++;
|
| - }
|
| -}
|
| -
|
| -bool SkGroup::add(SkAnimateMaker& , SkDisplayable* child) {
|
| - SkASSERT(child);
|
| -// SkASSERT(child->isDrawable());
|
| - *fChildren.append() = (SkDrawable*) child;
|
| - if (child->isGroup()) {
|
| - SkGroup* groupie = (SkGroup*) child;
|
| - SkASSERT(groupie->fParentList == NULL);
|
| - groupie->fParentList = &fChildren;
|
| - }
|
| - return true;
|
| -}
|
| -
|
| -bool SkGroup::contains(SkDisplayable* match) {
|
| - for (SkDrawable** ptr = fChildren.begin(); ptr < fChildren.end(); ptr++) {
|
| - SkDrawable* drawable = *ptr;
|
| - if (drawable == match || drawable->contains(match))
|
| - return true;
|
| - }
|
| - return false;
|
| -}
|
| -
|
| -SkGroup* SkGroup::copy() {
|
| - SkGroup* result = new SkGroup();
|
| - result->fOriginal = this;
|
| - result->fChildren = fChildren;
|
| - return result;
|
| -}
|
| -
|
| -SkBool SkGroup::copySet(int index) {
|
| - return (fCopies[index >> 5] & 1 << (index & 0x1f)) != 0;
|
| -}
|
| -
|
| -SkDisplayable* SkGroup::deepCopy(SkAnimateMaker* maker) {
|
| - SkDisplayable* copy = INHERITED::deepCopy(maker);
|
| - for (SkDrawable** ptr = fChildren.begin(); ptr < fChildren.end(); ptr++) {
|
| - SkDisplayable* displayable = (SkDisplayable*)*ptr;
|
| - SkDisplayable* deeperCopy = displayable->deepCopy(maker);
|
| - ((SkGroup*)copy)->add(*maker, deeperCopy);
|
| - }
|
| - return copy;
|
| -}
|
| -
|
| -bool SkGroup::doEvent(SkDisplayEvent::Kind kind, SkEventState* state) {
|
| - bool handled = false;
|
| - for (SkDrawable** ptr = fChildren.begin(); ptr < fChildren.end(); ptr++) {
|
| - SkDrawable* drawable = *ptr;
|
| - if (drawable->isDrawable() == false)
|
| - continue;
|
| - handled |= drawable->doEvent(kind, state);
|
| - }
|
| - return handled;
|
| -}
|
| -
|
| -bool SkGroup::draw(SkAnimateMaker& maker) {
|
| - bool conditionTrue = ifCondition(maker, this, condition);
|
| - bool result = false;
|
| - for (SkDrawable** ptr = fChildren.begin(); ptr < fChildren.end(); ptr++) {
|
| - SkDrawable* drawable = *ptr;
|
| - if (drawable->isDrawable() == false)
|
| - continue;
|
| - if (conditionTrue == false) {
|
| - if (drawable->isApply())
|
| - ((SkApply*) drawable)->disable();
|
| - continue;
|
| - }
|
| - maker.validate();
|
| - result |= drawable->draw(maker);
|
| - maker.validate();
|
| - }
|
| - return result;
|
| -}
|
| -
|
| -#ifdef SK_DUMP_ENABLED
|
| -void SkGroup::dump(SkAnimateMaker* maker) {
|
| - dumpBase(maker);
|
| - if (condition.size() > 0)
|
| - SkDebugf("condition=\"%s\" ", condition.c_str());
|
| - if (enableCondition.size() > 0)
|
| - SkDebugf("enableCondition=\"%s\" ", enableCondition.c_str());
|
| - dumpDrawables(maker);
|
| -}
|
| -
|
| -void SkGroup::dumpDrawables(SkAnimateMaker* maker) {
|
| - SkDisplayList::fIndent += 4;
|
| - int save = SkDisplayList::fDumpIndex;
|
| - SkDisplayList::fDumpIndex = 0;
|
| - bool closedYet = false;
|
| - for (SkDrawable** ptr = fChildren.begin(); ptr < fChildren.end(); ptr++) {
|
| - if (closedYet == false) {
|
| - closedYet = true;
|
| - SkDebugf(">\n");
|
| - }
|
| - SkDrawable* drawable = *ptr;
|
| - drawable->dump(maker);
|
| - SkDisplayList::fDumpIndex++;
|
| - }
|
| - SkDisplayList::fIndent -= 4;
|
| - SkDisplayList::fDumpIndex = save;
|
| - if (closedYet) //we had children, now it's time to close the group
|
| - dumpEnd(maker);
|
| - else //no children
|
| - SkDebugf("/>\n");
|
| -}
|
| -
|
| -void SkGroup::dumpEvents() {
|
| - for (SkDrawable** ptr = fChildren.begin(); ptr < fChildren.end(); ptr++) {
|
| - SkDrawable* drawable = *ptr;
|
| - drawable->dumpEvents();
|
| - }
|
| -}
|
| -#endif
|
| -
|
| -bool SkGroup::enable(SkAnimateMaker& maker ) {
|
| - reset();
|
| - for (SkDrawable** ptr = fChildren.begin(); ptr < fChildren.end(); ptr++) {
|
| - SkDrawable* drawable = *ptr;
|
| - if (ifCondition(maker, drawable, enableCondition) == false)
|
| - continue;
|
| - drawable->enable(maker);
|
| - }
|
| - return true; // skip add; already added so that scope is findable by children
|
| -}
|
| -
|
| -int SkGroup::findGroup(SkDrawable* match, SkTDDrawableArray** list,
|
| - SkGroup** parent, SkGroup** found, SkTDDrawableArray** grandList) {
|
| - *list = &fChildren;
|
| - for (SkDrawable** ptr = fChildren.begin(); ptr < fChildren.end(); ptr++) {
|
| - SkDrawable* drawable = *ptr;
|
| - if (drawable->isGroup()) {
|
| - SkGroup* childGroup = (SkGroup*) drawable;
|
| - if (childGroup->fOriginal == match)
|
| - goto foundMatch;
|
| - }
|
| - if (drawable == match) {
|
| -foundMatch:
|
| - *parent = this;
|
| - return (int) (ptr - fChildren.begin());
|
| - }
|
| - }
|
| - *grandList = &fChildren;
|
| - return SkDisplayList::SearchForMatch(match, list, parent, found, grandList);
|
| -}
|
| -
|
| -bool SkGroup::hasEnable() const {
|
| - return true;
|
| -}
|
| -
|
| -bool SkGroup::ifCondition(SkAnimateMaker& maker, SkDrawable* drawable,
|
| - SkString& conditionString) {
|
| - if (conditionString.size() == 0)
|
| - return true;
|
| - int32_t result;
|
| - bool success = SkAnimatorScript::EvaluateInt(maker, this, conditionString.c_str(), &result);
|
| -#ifdef SK_DUMP_ENABLED
|
| - if (maker.fDumpGConditions) {
|
| - SkDebugf("group: ");
|
| - dumpBase(&maker);
|
| - SkDebugf("condition=%s ", conditionString.c_str());
|
| - if (success == false)
|
| - SkDebugf("(script failed)\n");
|
| - else
|
| - SkDebugf("success=%s\n", result != 0 ? "true" : "false");
|
| - }
|
| -#endif
|
| - return success && result != 0;
|
| -}
|
| -
|
| -void SkGroup::initialize() {
|
| - for (SkDrawable** ptr = fChildren.begin(); ptr < fChildren.end(); ptr++) {
|
| - SkDrawable* drawable = *ptr;
|
| - if (drawable->isDrawable() == false)
|
| - continue;
|
| - drawable->initialize();
|
| - }
|
| -}
|
| -
|
| -void SkGroup::markCopyClear(int index) {
|
| - if (index < 0)
|
| - index = fChildren.count();
|
| - fCopies[index >> 5] &= ~(1 << (index & 0x1f));
|
| -}
|
| -
|
| -void SkGroup::markCopySet(int index) {
|
| - if (index < 0)
|
| - index = fChildren.count();
|
| - fCopies[index >> 5] |= 1 << (index & 0x1f);
|
| -}
|
| -
|
| -void SkGroup::markCopySize(int index) {
|
| - if (index < 0)
|
| - index = fChildren.count() + 1;
|
| - int oldLongs = fCopies.count();
|
| - int newLongs = (index >> 5) + 1;
|
| - if (oldLongs < newLongs) {
|
| - fCopies.setCount(newLongs);
|
| - memset(&fCopies[oldLongs], 0, (newLongs - oldLongs) << 2);
|
| - }
|
| -}
|
| -
|
| -void SkGroup::reset() {
|
| - if (fOriginal) // has been copied
|
| - return;
|
| - int index = 0;
|
| - int max = fCopies.count() << 5;
|
| - for (SkDrawable** ptr = fChildren.begin(); ptr < fChildren.end(); ptr++) {
|
| - if (index >= max || copySet(index) == false)
|
| - continue;
|
| - SkApply* apply = (SkApply*) *ptr;
|
| - SkASSERT(apply->isApply());
|
| - SkASSERT(apply->getScope());
|
| - *ptr = apply->getScope();
|
| - markCopyClear(index);
|
| - index++;
|
| - }
|
| -}
|
| -
|
| -bool SkGroup::resolveIDs(SkAnimateMaker& maker, SkDisplayable* orig, SkApply* apply) {
|
| - SkGroup* original = (SkGroup*) orig;
|
| - SkTDDrawableArray& originalChildren = original->fChildren;
|
| - SkDrawable** originalPtr = originalChildren.begin();
|
| - SkDrawable** ptr = fChildren.begin();
|
| - SkDrawable** end = fChildren.end();
|
| - SkDrawable** origChild = ((SkGroup*) orig)->fChildren.begin();
|
| - while (ptr < end) {
|
| - SkDrawable* drawable = *ptr++;
|
| - maker.resolveID(drawable, *origChild++);
|
| - if (drawable->resolveIDs(maker, *originalPtr++, apply) == true)
|
| - return true; // failed
|
| - }
|
| - return false;
|
| -}
|
| -
|
| -void SkGroup::setSteps(int steps) {
|
| - for (SkDrawable** ptr = fChildren.begin(); ptr < fChildren.end(); ptr++) {
|
| - SkDrawable* drawable = *ptr;
|
| - if (drawable->isDrawable() == false)
|
| - continue;
|
| - drawable->setSteps(steps);
|
| - }
|
| -}
|
| -
|
| -#ifdef SK_DEBUG
|
| -void SkGroup::validate() {
|
| - for (SkDrawable** ptr = fChildren.begin(); ptr < fChildren.end(); ptr++) {
|
| - SkDrawable* drawable = *ptr;
|
| - drawable->validate();
|
| - }
|
| -}
|
| -#endif
|
| -
|
| -#if SK_USE_CONDENSED_INFO == 0
|
| -
|
| -const SkMemberInfo SkSave::fInfo[] = {
|
| - SK_MEMBER_INHERITED
|
| -};
|
| -
|
| -#endif
|
| -
|
| -DEFINE_GET_MEMBER(SkSave);
|
| -
|
| -bool SkSave::draw(SkAnimateMaker& maker) {
|
| - maker.fCanvas->save();
|
| - SkPaint* save = maker.fPaint;
|
| - SkPaint local = SkPaint(*maker.fPaint);
|
| - maker.fPaint = &local;
|
| - bool result = INHERITED::draw(maker);
|
| - maker.fPaint = save;
|
| - maker.fCanvas->restore();
|
| - return result;
|
| -}
|
| -
|
| -
|
|
|