| OLD | NEW |
| (Empty) |
| 1 /* libs/graphics/animator/SkDisplayEvent.cpp | |
| 2 ** | |
| 3 ** Copyright 2006, The Android Open Source Project | |
| 4 ** | |
| 5 ** Licensed under the Apache License, Version 2.0 (the "License"); | |
| 6 ** you may not use this file except in compliance with the License. | |
| 7 ** You may obtain a copy of the License at | |
| 8 ** | |
| 9 ** http://www.apache.org/licenses/LICENSE-2.0 | |
| 10 ** | |
| 11 ** Unless required by applicable law or agreed to in writing, software | |
| 12 ** distributed under the License is distributed on an "AS IS" BASIS, | |
| 13 ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | |
| 14 ** See the License for the specific language governing permissions and | |
| 15 ** limitations under the License. | |
| 16 */ | |
| 17 | |
| 18 #include "SkDisplayEvent.h" | |
| 19 #include "SkAnimateMaker.h" | |
| 20 #include "SkDisplayApply.h" | |
| 21 #include "SkDisplayInput.h" | |
| 22 #include "SkDisplayList.h" | |
| 23 #ifdef SK_DEBUG | |
| 24 #include "SkDump.h" | |
| 25 #endif | |
| 26 #include "SkEvent.h" | |
| 27 #include "SkDisplayInput.h" | |
| 28 #include "SkKey.h" | |
| 29 #include "SkMetaData.h" | |
| 30 #include "SkScript.h" | |
| 31 #include "SkUtils.h" | |
| 32 | |
| 33 enum SkDisplayEvent_Properties { | |
| 34 SK_PROPERTY(key), | |
| 35 SK_PROPERTY(keys) | |
| 36 }; | |
| 37 | |
| 38 #if SK_USE_CONDENSED_INFO == 0 | |
| 39 | |
| 40 const SkMemberInfo SkDisplayEvent::fInfo[] = { | |
| 41 SK_MEMBER(code, EventCode), | |
| 42 SK_MEMBER(disable, Boolean), | |
| 43 SK_MEMBER_PROPERTY(key, String), // a single key (also last key pressed) | |
| 44 SK_MEMBER_PROPERTY(keys, String), // a single key or dash-delimited range of
keys | |
| 45 SK_MEMBER(kind, EventKind), | |
| 46 SK_MEMBER(target, String), | |
| 47 SK_MEMBER(x, Float), | |
| 48 SK_MEMBER(y, Float) | |
| 49 }; | |
| 50 | |
| 51 #endif | |
| 52 | |
| 53 DEFINE_GET_MEMBER(SkDisplayEvent); | |
| 54 | |
| 55 SkDisplayEvent::SkDisplayEvent() : code((SkKey) -1), disable(false), | |
| 56 kind(kUser), x(0), y(0), fLastCode((SkKey) -1), fMax((SkKey) -1), fTarget(NU
LL) { | |
| 57 } | |
| 58 | |
| 59 SkDisplayEvent::~SkDisplayEvent() { | |
| 60 deleteMembers(); | |
| 61 } | |
| 62 | |
| 63 bool SkDisplayEvent::add(SkAnimateMaker& , SkDisplayable* child) { | |
| 64 *fChildren.append() = child; | |
| 65 return true; | |
| 66 } | |
| 67 | |
| 68 bool SkDisplayEvent::contains(SkDisplayable* match) { | |
| 69 for (int index = 0; index < fChildren.count(); index++) { | |
| 70 if (fChildren[index] == match || fChildren[index]->contains(match)) | |
| 71 return true; | |
| 72 } | |
| 73 return false; | |
| 74 } | |
| 75 | |
| 76 SkDisplayable* SkDisplayEvent::contains(const SkString& match) { | |
| 77 for (int index = 0; index < fChildren.count(); index++) { | |
| 78 SkDisplayable* child = fChildren[index]; | |
| 79 if (child->contains(match)) | |
| 80 return child; | |
| 81 } | |
| 82 return NULL; | |
| 83 } | |
| 84 | |
| 85 void SkDisplayEvent::deleteMembers() { | |
| 86 for (int index = 0; index < fChildren.count(); index++) { | |
| 87 SkDisplayable* evt = fChildren[index]; | |
| 88 delete evt; | |
| 89 } | |
| 90 } | |
| 91 | |
| 92 #ifdef SK_DUMP_ENABLED | |
| 93 void SkDisplayEvent::dumpEvent(SkAnimateMaker* maker) { | |
| 94 dumpBase(maker); | |
| 95 SkString str; | |
| 96 SkDump::GetEnumString(SkType_EventKind, kind, &str); | |
| 97 SkDebugf("kind=\"%s\" ", str.c_str()); | |
| 98 if (kind == SkDisplayEvent::kKeyPress || kind == SkDisplayEvent::kKeyPressUp
) { | |
| 99 if (code >= 0) | |
| 100 SkDump::GetEnumString(SkType_EventCode, code, &str); | |
| 101 else | |
| 102 str.set("none"); | |
| 103 SkDebugf("code=\"%s\" ", str.c_str()); | |
| 104 } | |
| 105 if (kind == SkDisplayEvent::kKeyChar) { | |
| 106 if (fMax != (SkKey) -1 && fMax != code) | |
| 107 SkDebugf("keys=\"%c - %c\" ", code, fMax); | |
| 108 else | |
| 109 SkDebugf("key=\"%c\" ", code); | |
| 110 } | |
| 111 if (fTarget != NULL) { | |
| 112 SkDebugf("target=\"%s\" ", fTarget->id); | |
| 113 } | |
| 114 if (kind >= SkDisplayEvent::kMouseDown && kind <= SkDisplayEvent::kMouseUp)
{ | |
| 115 #ifdef SK_CAN_USE_FLOAT | |
| 116 SkDebugf("x=\"%g\" y=\"%g\" ", SkScalarToFloat(x), SkScalarToFloat(y)); | |
| 117 #else | |
| 118 SkDebugf("x=\"%x\" y=\"%x\" ", x, y); | |
| 119 #endif | |
| 120 } | |
| 121 if (disable) | |
| 122 SkDebugf("disable=\"true\" "); | |
| 123 SkDebugf("/>\n"); | |
| 124 } | |
| 125 #endif | |
| 126 | |
| 127 bool SkDisplayEvent::enableEvent(SkAnimateMaker& maker) | |
| 128 { | |
| 129 maker.fActiveEvent = this; | |
| 130 if (fChildren.count() == 0) | |
| 131 return false; | |
| 132 if (disable) | |
| 133 return false; | |
| 134 #ifdef SK_DUMP_ENABLED | |
| 135 if (maker.fDumpEvents) { | |
| 136 SkDebugf("enable: "); | |
| 137 dumpEvent(&maker); | |
| 138 } | |
| 139 #endif | |
| 140 SkDisplayList& displayList = maker.fDisplayList; | |
| 141 for (int index = 0; index < fChildren.count(); index++) { | |
| 142 SkDisplayable* displayable = fChildren[index]; | |
| 143 if (displayable->isGroup()) { | |
| 144 SkTDDrawableArray* parentList = displayList.getDrawList(); | |
| 145 *parentList->append() = (SkDrawable*) displayable; // make it finda
ble before children are enabled | |
| 146 } | |
| 147 if (displayable->enable(maker)) | |
| 148 continue; | |
| 149 if (maker.hasError()) | |
| 150 return true; | |
| 151 if (displayable->isDrawable() == false) | |
| 152 return true; // error | |
| 153 SkDrawable* drawable = (SkDrawable*) displayable; | |
| 154 SkTDDrawableArray* parentList = displayList.getDrawList(); | |
| 155 *parentList->append() = drawable; | |
| 156 } | |
| 157 return false; | |
| 158 } | |
| 159 | |
| 160 bool SkDisplayEvent::getProperty(int index, SkScriptValue* value) const { | |
| 161 switch (index) { | |
| 162 case SK_PROPERTY(key): | |
| 163 case SK_PROPERTY(keys): { | |
| 164 value->fType = SkType_String; | |
| 165 char scratch[8]; | |
| 166 SkKey convert = index == SK_PROPERTY(keys) ? code : fLastCode; | |
| 167 size_t size = convert > 0 ? SkUTF8_FromUnichar(convert, scratch) : 0
; | |
| 168 fKeyString.set(scratch, size); | |
| 169 value->fOperand.fString = &fKeyString; | |
| 170 if (index != SK_PROPERTY(keys) || fMax == (SkKey) -1 || fMax == code
) | |
| 171 break; | |
| 172 value->fOperand.fString->append("-"); | |
| 173 size = SkUTF8_FromUnichar(fMax, scratch); | |
| 174 value->fOperand.fString->append(scratch, size); | |
| 175 } break; | |
| 176 default: | |
| 177 SkASSERT(0); | |
| 178 return false; | |
| 179 } | |
| 180 return true; | |
| 181 } | |
| 182 | |
| 183 void SkDisplayEvent::onEndElement(SkAnimateMaker& maker) | |
| 184 { | |
| 185 if (kind == kUser) | |
| 186 return; | |
| 187 maker.fEvents.addEvent(this); | |
| 188 if (kind == kOnEnd) { | |
| 189 bool found = maker.find(target.c_str(), &fTarget); | |
| 190 SkASSERT(found); | |
| 191 SkASSERT(fTarget && fTarget->isAnimate()); | |
| 192 SkAnimateBase* animate = (SkAnimateBase*) fTarget; | |
| 193 animate->setHasEndEvent(); | |
| 194 } | |
| 195 } | |
| 196 | |
| 197 void SkDisplayEvent::populateInput(SkAnimateMaker& maker, const SkEvent& fEvent)
{ | |
| 198 const SkMetaData& meta = fEvent.getMetaData(); | |
| 199 SkMetaData::Iter iter(meta); | |
| 200 SkMetaData::Type type; | |
| 201 int number; | |
| 202 const char* name; | |
| 203 while ((name = iter.next(&type, &number)) != NULL) { | |
| 204 if (name[0] == '\0') | |
| 205 continue; | |
| 206 SkDisplayable* displayable; | |
| 207 SkInput* input; | |
| 208 for (int index = 0; index < fChildren.count(); index++) { | |
| 209 displayable = fChildren[index]; | |
| 210 if (displayable->getType() != SkType_Input) | |
| 211 continue; | |
| 212 input = (SkInput*) displayable; | |
| 213 if (input->name.equals(name)) | |
| 214 goto found; | |
| 215 } | |
| 216 if (!maker.find(name, &displayable) || displayable->getType() != SkType_
Input) | |
| 217 continue; | |
| 218 input = (SkInput*) displayable; | |
| 219 found: | |
| 220 switch (type) { | |
| 221 case SkMetaData::kS32_Type: | |
| 222 meta.findS32(name, &input->fInt); | |
| 223 break; | |
| 224 case SkMetaData::kScalar_Type: | |
| 225 meta.findScalar(name, &input->fFloat); | |
| 226 break; | |
| 227 case SkMetaData::kPtr_Type: | |
| 228 SkASSERT(0); | |
| 229 break; // !!! not handled for now | |
| 230 case SkMetaData::kString_Type: | |
| 231 input->string.set(meta.findString(name)); | |
| 232 break; | |
| 233 default: | |
| 234 SkASSERT(0); | |
| 235 } | |
| 236 } | |
| 237 // re-evaluate all animators that may have built their values from input str
ings | |
| 238 for (SkDisplayable** childPtr = fChildren.begin(); childPtr < fChildren.end(
); childPtr++) { | |
| 239 SkDisplayable* displayable = *childPtr; | |
| 240 if (displayable->isApply() == false) | |
| 241 continue; | |
| 242 SkApply* apply = (SkApply*) displayable; | |
| 243 apply->refresh(maker); | |
| 244 } | |
| 245 } | |
| 246 | |
| 247 bool SkDisplayEvent::setProperty(int index, SkScriptValue& value) { | |
| 248 SkASSERT(index == SK_PROPERTY(key) || index == SK_PROPERTY(keys)); | |
| 249 SkASSERT(value.fType == SkType_String); | |
| 250 SkString* string = value.fOperand.fString; | |
| 251 const char* chars = string->c_str(); | |
| 252 int count = SkUTF8_CountUnichars(chars); | |
| 253 SkASSERT(count >= 1); | |
| 254 code = (SkKey) SkUTF8_NextUnichar(&chars); | |
| 255 fMax = code; | |
| 256 SkASSERT(count == 1 || index == SK_PROPERTY(keys)); | |
| 257 if (--count > 0) { | |
| 258 SkASSERT(*chars == '-'); | |
| 259 chars++; | |
| 260 fMax = (SkKey) SkUTF8_NextUnichar(&chars); | |
| 261 SkASSERT(fMax >= code); | |
| 262 } | |
| 263 return true; | |
| 264 } | |
| 265 | |
| 266 #ifdef ANDROID | |
| 267 | |
| 268 #include "SkMetaData.h" | |
| 269 #include "SkParse.h" | |
| 270 #include "SkTextBox.h" | |
| 271 #include "SkXMLWriter.h" | |
| 272 | |
| 273 void SkMetaData::setPtr(char const*, void* ) {} | |
| 274 void SkMetaData::setS32(char const*, int ) {} | |
| 275 bool SkEventSink::doEvent(SkEvent const& ) { return false; } | |
| 276 bool SkXMLParser::parse(SkStream& ) { return false; } | |
| 277 SkXMLParserError::SkXMLParserError( ) {} | |
| 278 void SkEvent::setType(char const*, unsigned long ) {} | |
| 279 bool SkEvent::PostTime(SkEvent*, unsigned int, unsigned int ) { return false; } | |
| 280 SkEvent::SkEvent(char const* ) {} | |
| 281 SkEvent::SkEvent(SkEvent const& ) {} | |
| 282 SkEvent::SkEvent( ) {} | |
| 283 SkEvent::~SkEvent( ) {} | |
| 284 bool SkEventSink::onQuery(SkEvent* ) { return false; } | |
| 285 SkEventSink::SkEventSink( ) {} | |
| 286 SkEventSink::~SkEventSink( ) {} | |
| 287 bool SkXMLParser::parse(char const*, unsigned long ) { return false; } | |
| 288 bool SkXMLParser::parse(SkDOM const&, SkDOMNode const* ) { return false; } | |
| 289 bool SkEvent::Post(SkEvent*, unsigned int, unsigned int ) { return false; } | |
| 290 void SkParse::UnitTest( ) {} | |
| 291 const char* SkMetaData::findString(char const*) const {return 0;} | |
| 292 bool SkMetaData::findPtr(char const*, void**) const {return false;} | |
| 293 bool SkMetaData::findS32(char const*, int*) const {return false;} | |
| 294 bool SkEvent::isType(char const*, unsigned long) const { return false; } | |
| 295 void SkMetaData::setString(char const*, char const* ) {} | |
| 296 const char* SkParse::FindNamedColor(char const*, unsigned long, unsigned int* )
{return false; } | |
| 297 const char* SkMetaData::Iter::next(SkMetaData::Type*, int* ) { return false; } | |
| 298 SkMetaData::Iter::Iter(SkMetaData const& ) {} | |
| 299 bool SkMetaData::findScalar(char const*, int*) const {return false;} | |
| 300 void SkMetaData::reset( ) {} | |
| 301 void SkEvent::setType(SkString const& ) {} | |
| 302 bool SkMetaData::findBool(char const*, bool*) const {return false;} | |
| 303 void SkEvent::getType(SkString*) const {} | |
| 304 bool SkXMLParser::endElement(char const* ) { return false; } | |
| 305 bool SkXMLParser::addAttribute(char const*, char const* ) { return false;} | |
| 306 bool SkXMLParser::startElement(char const* ) { return false;} | |
| 307 bool SkXMLParser::text(char const*, int ) { return false;} | |
| 308 bool SkXMLParser::onText(char const*, int ) { return false;} | |
| 309 SkXMLParser::SkXMLParser(SkXMLParserError* ) {} | |
| 310 SkXMLParser::~SkXMLParser( ) {} | |
| 311 SkXMLParserError::~SkXMLParserError( ) {} | |
| 312 void SkXMLParserError::getErrorString(SkString*) const {} | |
| 313 void SkTextBox::setSpacing(int, int ) {} | |
| 314 void SkTextBox::setSpacingAlign(SkTextBox::SpacingAlign ) {} | |
| 315 void SkTextBox::draw(SkCanvas*, char const*, unsigned long, SkPaint const& ) {} | |
| 316 void SkTextBox::setBox(SkRect const& ) {} | |
| 317 void SkTextBox::setMode(SkTextBox::Mode ) {} | |
| 318 SkTextBox::SkTextBox( ) {} | |
| 319 void SkMetaData::setScalar(char const*, int ) {} | |
| 320 const char* SkParse::FindScalar(char const*, int* ) {return 0; } | |
| 321 const char* SkParse::FindScalars(char const*, int*, int ) {return 0; } | |
| 322 const char* SkParse::FindHex(char const*, unsigned int* ) {return 0; } | |
| 323 const char* SkParse::FindS32(char const*, int* ) {return 0; } | |
| 324 void SkXMLWriter::addAttribute(char const*, char const* ) {} | |
| 325 void SkXMLWriter::startElement(char const* ) {} | |
| 326 void SkXMLWriter::doEnd(SkXMLWriter::Elem* ) {} | |
| 327 SkXMLWriter::Elem* SkXMLWriter::getEnd( ) { return 0; } | |
| 328 bool SkXMLWriter::doStart(char const*, unsigned long ) { return false; } | |
| 329 SkXMLWriter::SkXMLWriter(bool ) {} | |
| 330 SkXMLWriter::~SkXMLWriter( ) {} | |
| 331 SkMetaData::SkMetaData() {} | |
| 332 SkMetaData::~SkMetaData() {} | |
| 333 bool SkEventSink::onEvent(SkEvent const&) {return false;} | |
| 334 bool SkXMLParser::onEndElement(char const*) {return false;} | |
| 335 bool SkXMLParser::onAddAttribute(char const*, char const*) {return false;} | |
| 336 bool SkXMLParser::onStartElement(char const*) {return false;} | |
| 337 void SkXMLWriter::writeHeader() {} | |
| 338 | |
| 339 #endif | |
| OLD | NEW |