Index: skia/animator/SkDisplayPost.cpp |
=================================================================== |
--- skia/animator/SkDisplayPost.cpp (revision 16859) |
+++ skia/animator/SkDisplayPost.cpp (working copy) |
@@ -1,315 +0,0 @@ |
-/* libs/graphics/animator/SkDisplayPost.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 "SkDisplayPost.h" |
-#include "SkAnimateMaker.h" |
-#include "SkAnimator.h" |
-#include "SkDisplayMovie.h" |
-#include "SkPostParts.h" |
-#include "SkScript.h" |
-#ifdef SK_DEBUG |
-#include "SkDump.h" |
-#include "SkTime.h" |
-#endif |
- |
-enum SkPost_Properties { |
- SK_PROPERTY(target), |
- SK_PROPERTY(type) |
-}; |
- |
-#if SK_USE_CONDENSED_INFO == 0 |
- |
-const SkMemberInfo SkPost::fInfo[] = { |
- SK_MEMBER(delay, MSec), |
-// SK_MEMBER(initialized, Boolean), |
- SK_MEMBER(mode, EventMode), |
- SK_MEMBER(sink, String), |
- SK_MEMBER_PROPERTY(target, String), |
- SK_MEMBER_PROPERTY(type, String) |
-}; |
- |
-#endif |
- |
-DEFINE_GET_MEMBER(SkPost); |
- |
-SkPost::SkPost() : delay(0), /*initialized(SkBool(-1)), */ mode(kImmediate), fMaker(NULL), |
- fSinkID(0), fTargetMaker(NULL), fChildHasID(false), fDirty(false) { |
-} |
- |
-SkPost::~SkPost() { |
- for (SkData** part = fParts.begin(); part < fParts.end(); part++) |
- delete *part; |
-} |
- |
-bool SkPost::add(SkAnimateMaker& , SkDisplayable* child) { |
- SkASSERT(child && child->isData()); |
- SkData* part = (SkData*) child; |
- *fParts.append() = part; |
- return true; |
-} |
- |
-bool SkPost::childrenNeedDisposing() const { |
- return false; |
-} |
- |
-void SkPost::dirty() { |
- fDirty = true; |
-} |
- |
-#ifdef SK_DUMP_ENABLED |
-void SkPost::dump(SkAnimateMaker* maker) { |
- dumpBase(maker); |
- SkString* eventType = new SkString(); |
- fEvent.getType(eventType); |
- if (eventType->equals("user")) { |
- const char* target = fEvent.findString("id"); |
- SkDebugf("target=\"%s\" ", target); |
- } |
- else |
- SkDebugf("type=\"%s\" ", eventType->c_str()); |
- delete eventType; |
- |
- if (delay > 0) { |
-#ifdef SK_CAN_USE_FLOAT |
- SkDebugf("delay=\"%g\" ", SkScalarToFloat(SkScalarDiv(delay, 1000))); |
-#else |
- SkDebugf("delay=\"%x\" ", SkScalarDiv(delay, 1000)); |
-#endif |
- } |
-// if (initialized == false) |
-// SkDebugf("(uninitialized) "); |
- SkString string; |
- SkDump::GetEnumString(SkType_EventMode, mode, &string); |
- if (!string.equals("immediate")) |
- SkDebugf("mode=\"%s\" ", string.c_str()); |
- // !!! could enhance this to search through make hierarchy to show name of sink |
- if (sink.size() > 0) { |
- SkDebugf("sink=\"%s\" sinkID=\"%d\" ", sink.c_str(), fSinkID); |
- } else if (fSinkID != maker->getAnimator()->getSinkID() && fSinkID != 0) { |
- SkDebugf("sinkID=\"%d\" ", fSinkID); |
- } |
- const SkMetaData& meta = fEvent.getMetaData(); |
- SkMetaData::Iter iter(meta); |
- SkMetaData::Type type; |
- int number; |
- const char* name; |
- bool closedYet = false; |
- SkDisplayList::fIndent += 4; |
- //this seems to work, but kinda hacky |
- //for some reason the last part is id, which i don't want |
- //and the parts seem to be in the reverse order from the one in which we find the |
- //data itself |
- //SkData** ptr = fParts.end(); |
- //SkData* data; |
- //const char* ID; |
- while ((name = iter.next(&type, &number)) != NULL) { |
- //ptr--; |
- if (strcmp(name, "id") == 0) |
- continue; |
- if (closedYet == false) { |
- SkDebugf(">\n"); |
- closedYet = true; |
- } |
- //data = *ptr; |
- //if (data->id) |
- // ID = data->id; |
- //else |
- // ID = ""; |
- SkDebugf("%*s<data name=\"%s\" ", SkDisplayList::fIndent, "", name); |
- switch (type) { |
- case SkMetaData::kS32_Type: { |
- int32_t s32; |
- meta.findS32(name, &s32); |
- SkDebugf("int=\"%d\" ", s32); |
- } break; |
- case SkMetaData::kScalar_Type: { |
- SkScalar scalar; |
- meta.findScalar(name, &scalar); |
-#ifdef SK_CAN_USE_FLOAT |
- SkDebugf("float=\"%g\" ", SkScalarToFloat(scalar)); |
-#else |
- SkDebugf("float=\"%x\" ", scalar); |
-#endif |
- } break; |
- case SkMetaData::kString_Type: |
- SkDebugf("string=\"%s\" ", meta.findString(name)); |
- break; |
- case SkMetaData::kPtr_Type: {//when do we have a pointer |
- void* ptr; |
- meta.findPtr(name, &ptr); |
- SkDebugf("0x%08x ", ptr); |
- } break; |
- case SkMetaData::kBool_Type: { |
- bool boolean; |
- meta.findBool(name, &boolean); |
- SkDebugf("boolean=\"%s\" ", boolean ? "true " : "false "); |
- } break; |
- default: |
- break; |
- } |
- SkDebugf("/>\n"); |
- //ptr++; |
-/* perhaps this should only be done in the case of a pointer? |
- SkDisplayable* displayable; |
- if (maker->find(name, &displayable)) |
- displayable->dump(maker); |
- else |
- SkDebugf("\n");*/ |
- } |
- SkDisplayList::fIndent -= 4; |
- if (closedYet) |
- dumpEnd(maker); |
- else |
- SkDebugf("/>\n"); |
- |
-} |
-#endif |
- |
-bool SkPost::enable(SkAnimateMaker& maker ) { |
- if (maker.hasError()) |
- return true; |
- if (fDirty) { |
- if (sink.size() > 0) |
- findSinkID(); |
- if (fChildHasID) { |
- SkString preserveID(fEvent.findString("id")); |
- fEvent.getMetaData().reset(); |
- if (preserveID.size() > 0) |
- fEvent.setString("id", preserveID); |
- for (SkData** part = fParts.begin(); part < fParts.end(); part++) { |
- if ((*part)->add()) |
- maker.setErrorCode(SkDisplayXMLParserError::kErrorAddingDataToPost); |
- } |
- } |
- fDirty = false; |
- } |
-#ifdef SK_DUMP_ENABLED |
- if (maker.fDumpPosts) { |
- SkDebugf("post enable: "); |
- dump(&maker); |
- } |
-#if defined SK_DEBUG_ANIMATION_TIMING |
- SkString debugOut; |
- SkMSec time = maker.getAppTime(); |
- debugOut.appendS32(time - maker.fDebugTimeBase); |
- debugOut.append(" post id="); |
- debugOut.append(_id); |
- debugOut.append(" enable="); |
- debugOut.appendS32(maker.fEnableTime - maker.fDebugTimeBase); |
- debugOut.append(" delay="); |
- debugOut.appendS32(delay); |
-#endif |
-#endif |
-// SkMSec adjustedDelay = maker.adjustDelay(maker.fEnableTime, delay); |
- SkMSec futureTime = maker.fEnableTime + delay; |
- fEvent.setFast32(futureTime); |
-#if defined SK_DEBUG && defined SK_DEBUG_ANIMATION_TIMING |
- debugOut.append(" future="); |
- debugOut.appendS32(futureTime - maker.fDebugTimeBase); |
- SkDebugf("%s\n", debugOut.c_str()); |
-#endif |
- SkEventSinkID targetID = fSinkID; |
- bool isAnimatorEvent = true; |
- SkAnimator* anim = maker.getAnimator(); |
- if (targetID == 0) { |
- isAnimatorEvent = fEvent.findString("id") != NULL; |
- if (isAnimatorEvent) |
- targetID = anim->getSinkID(); |
- else if (maker.fHostEventSinkID) |
- targetID = maker.fHostEventSinkID; |
- else |
- return true; |
- } else |
- anim = fTargetMaker->getAnimator(); |
- if (delay == 0) { |
- if (isAnimatorEvent && mode == kImmediate) |
- fTargetMaker->doEvent(fEvent); |
- else |
- anim->onEventPost(new SkEvent(fEvent), targetID); |
- } else |
- anim->onEventPostTime(new SkEvent(fEvent), targetID, futureTime); |
- return true; |
-} |
- |
-void SkPost::findSinkID() { |
- // get the next delimiter '.' if any |
- fTargetMaker = fMaker; |
- const char* ch = sink.c_str(); |
- do { |
- const char* end = strchr(ch, '.'); |
- size_t len = end ? end - ch : strlen(ch); |
- SkDisplayable* displayable = NULL; |
- if (SK_LITERAL_STR_EQUAL("parent", ch, len)) { |
- if (fTargetMaker->fParentMaker) |
- fTargetMaker = fTargetMaker->fParentMaker; |
- else { |
- fTargetMaker->setErrorCode(SkDisplayXMLParserError::kNoParentAvailable); |
- return; |
- } |
- } else { |
- fTargetMaker->find(ch, len, &displayable); |
- if (displayable == NULL || displayable->getType() != SkType_Movie) { |
- fTargetMaker->setErrorCode(SkDisplayXMLParserError::kExpectedMovie); |
- return; |
- } |
- SkDisplayMovie* movie = (SkDisplayMovie*) displayable; |
- fTargetMaker = movie->fMovie.fMaker; |
- } |
- if (end == NULL) |
- break; |
- ch = ++end; |
- } while (true); |
- SkAnimator* anim = fTargetMaker->getAnimator(); |
- fSinkID = anim->getSinkID(); |
-} |
- |
-bool SkPost::hasEnable() const { |
- return true; |
-} |
- |
-void SkPost::onEndElement(SkAnimateMaker& maker) { |
- fTargetMaker = fMaker = &maker; |
- if (fChildHasID == false) { |
- for (SkData** part = fParts.begin(); part < fParts.end(); part++) |
- delete *part; |
- fParts.reset(); |
- } |
-} |
- |
-void SkPost::setChildHasID() { |
- fChildHasID = true; |
-} |
- |
-bool SkPost::setProperty(int index, SkScriptValue& value) { |
- SkASSERT(value.fType == SkType_String); |
- SkString* string = value.fOperand.fString; |
- switch(index) { |
- case SK_PROPERTY(target): { |
- fEvent.setType("user"); |
- fEvent.setString("id", *string); |
- mode = kImmediate; |
- } break; |
- case SK_PROPERTY(type): |
- fEvent.setType(*string); |
- break; |
- default: |
- SkASSERT(0); |
- return false; |
- } |
- return true; |
-} |
- |