gfx/skia/trunk/src/animator/SkDisplayEvent.cpp

Thu, 15 Jan 2015 15:55:04 +0100

author
Michael Schloh von Bennewitz <michael@schloh.com>
date
Thu, 15 Jan 2015 15:55:04 +0100
branch
TOR_BUG_9701
changeset 9
a63d609f5ebe
permissions
-rw-r--r--

Back out 97036ab72558 which inappropriately compared turds to third parties.

michael@0 1
michael@0 2 /*
michael@0 3 * Copyright 2006 The Android Open Source Project
michael@0 4 *
michael@0 5 * Use of this source code is governed by a BSD-style license that can be
michael@0 6 * found in the LICENSE file.
michael@0 7 */
michael@0 8
michael@0 9
michael@0 10 #include "SkDisplayEvent.h"
michael@0 11 #include "SkAnimateMaker.h"
michael@0 12 #include "SkDisplayApply.h"
michael@0 13 #include "SkDisplayInput.h"
michael@0 14 #include "SkDisplayList.h"
michael@0 15 #ifdef SK_DEBUG
michael@0 16 #include "SkDump.h"
michael@0 17 #endif
michael@0 18 #include "SkEvent.h"
michael@0 19 #include "SkDisplayInput.h"
michael@0 20 #include "SkKey.h"
michael@0 21 #include "SkMetaData.h"
michael@0 22 #include "SkScript.h"
michael@0 23 #include "SkUtils.h"
michael@0 24
michael@0 25 enum SkDisplayEvent_Properties {
michael@0 26 SK_PROPERTY(key),
michael@0 27 SK_PROPERTY(keys)
michael@0 28 };
michael@0 29
michael@0 30 #if SK_USE_CONDENSED_INFO == 0
michael@0 31
michael@0 32 const SkMemberInfo SkDisplayEvent::fInfo[] = {
michael@0 33 SK_MEMBER(code, EventCode),
michael@0 34 SK_MEMBER(disable, Boolean),
michael@0 35 SK_MEMBER_PROPERTY(key, String), // a single key (also last key pressed)
michael@0 36 SK_MEMBER_PROPERTY(keys, String), // a single key or dash-delimited range of keys
michael@0 37 SK_MEMBER(kind, EventKind),
michael@0 38 SK_MEMBER(target, String),
michael@0 39 SK_MEMBER(x, Float),
michael@0 40 SK_MEMBER(y, Float)
michael@0 41 };
michael@0 42
michael@0 43 #endif
michael@0 44
michael@0 45 DEFINE_GET_MEMBER(SkDisplayEvent);
michael@0 46
michael@0 47 SkDisplayEvent::SkDisplayEvent() : code((SkKey) -1), disable(false),
michael@0 48 kind(kUser), x(0), y(0), fLastCode((SkKey) -1), fMax((SkKey) -1), fTarget(NULL) {
michael@0 49 }
michael@0 50
michael@0 51 SkDisplayEvent::~SkDisplayEvent() {
michael@0 52 deleteMembers();
michael@0 53 }
michael@0 54
michael@0 55 bool SkDisplayEvent::addChild(SkAnimateMaker& , SkDisplayable* child) {
michael@0 56 *fChildren.append() = child;
michael@0 57 return true;
michael@0 58 }
michael@0 59
michael@0 60 bool SkDisplayEvent::contains(SkDisplayable* match) {
michael@0 61 for (int index = 0; index < fChildren.count(); index++) {
michael@0 62 if (fChildren[index] == match || fChildren[index]->contains(match))
michael@0 63 return true;
michael@0 64 }
michael@0 65 return false;
michael@0 66 }
michael@0 67
michael@0 68 SkDisplayable* SkDisplayEvent::contains(const SkString& match) {
michael@0 69 for (int index = 0; index < fChildren.count(); index++) {
michael@0 70 SkDisplayable* child = fChildren[index];
michael@0 71 if (child->contains(match))
michael@0 72 return child;
michael@0 73 }
michael@0 74 return NULL;
michael@0 75 }
michael@0 76
michael@0 77 void SkDisplayEvent::deleteMembers() {
michael@0 78 for (int index = 0; index < fChildren.count(); index++) {
michael@0 79 SkDisplayable* evt = fChildren[index];
michael@0 80 delete evt;
michael@0 81 }
michael@0 82 }
michael@0 83
michael@0 84 #ifdef SK_DUMP_ENABLED
michael@0 85 void SkDisplayEvent::dumpEvent(SkAnimateMaker* maker) {
michael@0 86 dumpBase(maker);
michael@0 87 SkString str;
michael@0 88 SkDump::GetEnumString(SkType_EventKind, kind, &str);
michael@0 89 SkDebugf("kind=\"%s\" ", str.c_str());
michael@0 90 if (kind == SkDisplayEvent::kKeyPress || kind == SkDisplayEvent::kKeyPressUp) {
michael@0 91 if (code >= 0)
michael@0 92 SkDump::GetEnumString(SkType_EventCode, code, &str);
michael@0 93 else
michael@0 94 str.set("none");
michael@0 95 SkDebugf("code=\"%s\" ", str.c_str());
michael@0 96 }
michael@0 97 if (kind == SkDisplayEvent::kKeyChar) {
michael@0 98 if (fMax != (SkKey) -1 && fMax != code)
michael@0 99 SkDebugf("keys=\"%c - %c\" ", code, fMax);
michael@0 100 else
michael@0 101 SkDebugf("key=\"%c\" ", code);
michael@0 102 }
michael@0 103 if (fTarget != NULL) {
michael@0 104 SkDebugf("target=\"%s\" ", fTarget->id);
michael@0 105 }
michael@0 106 if (kind >= SkDisplayEvent::kMouseDown && kind <= SkDisplayEvent::kMouseUp) {
michael@0 107 SkDebugf("x=\"%g\" y=\"%g\" ", SkScalarToFloat(x), SkScalarToFloat(y));
michael@0 108 }
michael@0 109 if (disable)
michael@0 110 SkDebugf("disable=\"true\" ");
michael@0 111 SkDebugf("/>\n");
michael@0 112 }
michael@0 113 #endif
michael@0 114
michael@0 115 bool SkDisplayEvent::enableEvent(SkAnimateMaker& maker)
michael@0 116 {
michael@0 117 maker.fActiveEvent = this;
michael@0 118 if (fChildren.count() == 0)
michael@0 119 return false;
michael@0 120 if (disable)
michael@0 121 return false;
michael@0 122 #ifdef SK_DUMP_ENABLED
michael@0 123 if (maker.fDumpEvents) {
michael@0 124 SkDebugf("enable: ");
michael@0 125 dumpEvent(&maker);
michael@0 126 }
michael@0 127 #endif
michael@0 128 SkDisplayList& displayList = maker.fDisplayList;
michael@0 129 for (int index = 0; index < fChildren.count(); index++) {
michael@0 130 SkDisplayable* displayable = fChildren[index];
michael@0 131 if (displayable->isGroup()) {
michael@0 132 SkTDDrawableArray* parentList = displayList.getDrawList();
michael@0 133 *parentList->append() = (SkDrawable*) displayable; // make it findable before children are enabled
michael@0 134 }
michael@0 135 if (displayable->enable(maker))
michael@0 136 continue;
michael@0 137 if (maker.hasError())
michael@0 138 return true;
michael@0 139 if (displayable->isDrawable() == false)
michael@0 140 return true; // error
michael@0 141 SkDrawable* drawable = (SkDrawable*) displayable;
michael@0 142 SkTDDrawableArray* parentList = displayList.getDrawList();
michael@0 143 *parentList->append() = drawable;
michael@0 144 }
michael@0 145 return false;
michael@0 146 }
michael@0 147
michael@0 148 bool SkDisplayEvent::getProperty(int index, SkScriptValue* value) const {
michael@0 149 switch (index) {
michael@0 150 case SK_PROPERTY(key):
michael@0 151 case SK_PROPERTY(keys): {
michael@0 152 value->fType = SkType_String;
michael@0 153 char scratch[8];
michael@0 154 SkKey convert = index == SK_PROPERTY(keys) ? code : fLastCode;
michael@0 155 size_t size = convert > 0 ? SkUTF8_FromUnichar(convert, scratch) : 0;
michael@0 156 fKeyString.set(scratch, size);
michael@0 157 value->fOperand.fString = &fKeyString;
michael@0 158 if (index != SK_PROPERTY(keys) || fMax == (SkKey) -1 || fMax == code)
michael@0 159 break;
michael@0 160 value->fOperand.fString->append("-");
michael@0 161 size = SkUTF8_FromUnichar(fMax, scratch);
michael@0 162 value->fOperand.fString->append(scratch, size);
michael@0 163 } break;
michael@0 164 default:
michael@0 165 SkASSERT(0);
michael@0 166 return false;
michael@0 167 }
michael@0 168 return true;
michael@0 169 }
michael@0 170
michael@0 171 void SkDisplayEvent::onEndElement(SkAnimateMaker& maker)
michael@0 172 {
michael@0 173 if (kind == kUser)
michael@0 174 return;
michael@0 175 maker.fEvents.addEvent(this);
michael@0 176 if (kind == kOnEnd) {
michael@0 177 SkDEBUGCODE(bool found = ) maker.find(target.c_str(), &fTarget);
michael@0 178 SkASSERT(found);
michael@0 179 SkASSERT(fTarget && fTarget->isAnimate());
michael@0 180 SkAnimateBase* animate = (SkAnimateBase*) fTarget;
michael@0 181 animate->setHasEndEvent();
michael@0 182 }
michael@0 183 }
michael@0 184
michael@0 185 void SkDisplayEvent::populateInput(SkAnimateMaker& maker, const SkEvent& fEvent) {
michael@0 186 const SkMetaData& meta = fEvent.getMetaData();
michael@0 187 SkMetaData::Iter iter(meta);
michael@0 188 SkMetaData::Type type;
michael@0 189 int number;
michael@0 190 const char* name;
michael@0 191 while ((name = iter.next(&type, &number)) != NULL) {
michael@0 192 if (name[0] == '\0')
michael@0 193 continue;
michael@0 194 SkDisplayable* displayable;
michael@0 195 SkInput* input;
michael@0 196 for (int index = 0; index < fChildren.count(); index++) {
michael@0 197 displayable = fChildren[index];
michael@0 198 if (displayable->getType() != SkType_Input)
michael@0 199 continue;
michael@0 200 input = (SkInput*) displayable;
michael@0 201 if (input->name.equals(name))
michael@0 202 goto found;
michael@0 203 }
michael@0 204 if (!maker.find(name, &displayable) || displayable->getType() != SkType_Input)
michael@0 205 continue;
michael@0 206 input = (SkInput*) displayable;
michael@0 207 found:
michael@0 208 switch (type) {
michael@0 209 case SkMetaData::kS32_Type:
michael@0 210 meta.findS32(name, &input->fInt);
michael@0 211 break;
michael@0 212 case SkMetaData::kScalar_Type:
michael@0 213 meta.findScalar(name, &input->fFloat);
michael@0 214 break;
michael@0 215 case SkMetaData::kPtr_Type:
michael@0 216 SkASSERT(0);
michael@0 217 break; // !!! not handled for now
michael@0 218 case SkMetaData::kString_Type:
michael@0 219 input->string.set(meta.findString(name));
michael@0 220 break;
michael@0 221 default:
michael@0 222 SkASSERT(0);
michael@0 223 }
michael@0 224 }
michael@0 225 // re-evaluate all animators that may have built their values from input strings
michael@0 226 for (SkDisplayable** childPtr = fChildren.begin(); childPtr < fChildren.end(); childPtr++) {
michael@0 227 SkDisplayable* displayable = *childPtr;
michael@0 228 if (displayable->isApply() == false)
michael@0 229 continue;
michael@0 230 SkApply* apply = (SkApply*) displayable;
michael@0 231 apply->refresh(maker);
michael@0 232 }
michael@0 233 }
michael@0 234
michael@0 235 bool SkDisplayEvent::setProperty(int index, SkScriptValue& value) {
michael@0 236 SkASSERT(index == SK_PROPERTY(key) || index == SK_PROPERTY(keys));
michael@0 237 SkASSERT(value.fType == SkType_String);
michael@0 238 SkString* string = value.fOperand.fString;
michael@0 239 const char* chars = string->c_str();
michael@0 240 int count = SkUTF8_CountUnichars(chars);
michael@0 241 SkASSERT(count >= 1);
michael@0 242 code = (SkKey) SkUTF8_NextUnichar(&chars);
michael@0 243 fMax = code;
michael@0 244 SkASSERT(count == 1 || index == SK_PROPERTY(keys));
michael@0 245 if (--count > 0) {
michael@0 246 SkASSERT(*chars == '-');
michael@0 247 chars++;
michael@0 248 fMax = (SkKey) SkUTF8_NextUnichar(&chars);
michael@0 249 SkASSERT(fMax >= code);
michael@0 250 }
michael@0 251 return true;
michael@0 252 }

mercurial