1.1 --- /dev/null Thu Jan 01 00:00:00 1970 +0000 1.2 +++ b/gfx/skia/trunk/src/animator/SkDisplayable.cpp Wed Dec 31 06:09:35 2014 +0100 1.3 @@ -0,0 +1,540 @@ 1.4 + 1.5 +/* 1.6 + * Copyright 2006 The Android Open Source Project 1.7 + * 1.8 + * Use of this source code is governed by a BSD-style license that can be 1.9 + * found in the LICENSE file. 1.10 + */ 1.11 + 1.12 + 1.13 +#include "SkDisplayable.h" 1.14 +#include "SkDisplayApply.h" 1.15 +#include "SkParse.h" 1.16 +#ifdef SK_DEBUG 1.17 +#include "SkDisplayList.h" 1.18 +#endif 1.19 +#include "SkDisplayTypes.h" 1.20 + 1.21 +#ifdef SK_FIND_LEAKS 1.22 +// int SkDisplayable::fAllocationCount; 1.23 +SkTDDisplayableArray SkDisplayable::fAllocations; 1.24 +#endif 1.25 + 1.26 +#ifdef SK_DEBUG 1.27 +SkDisplayable::SkDisplayable() { 1.28 + id = _id.c_str(); 1.29 +#ifdef SK_FIND_LEAKS 1.30 + // fAllocationCount++; 1.31 + *fAllocations.append() = this; 1.32 +#endif 1.33 +} 1.34 +#endif 1.35 + 1.36 +SkDisplayable::~SkDisplayable() { 1.37 +#ifdef SK_FIND_LEAKS 1.38 + // fAllocationCount--; 1.39 + int index = fAllocations.find(this); 1.40 + SkASSERT(index >= 0); 1.41 + fAllocations.remove(index); 1.42 +#endif 1.43 +} 1.44 + 1.45 +bool SkDisplayable::addChild(SkAnimateMaker& , SkDisplayable* child) { 1.46 + return false; 1.47 +} 1.48 + 1.49 +//void SkDisplayable::apply(SkAnimateMaker& , const SkMemberInfo* , 1.50 +// SkDisplayable* , SkScalar [], int count) { 1.51 +// SkASSERT(0); 1.52 +//} 1.53 + 1.54 +bool SkDisplayable::canContainDependents() const { 1.55 + return false; 1.56 +} 1.57 + 1.58 +bool SkDisplayable::childrenNeedDisposing() const { 1.59 + return false; 1.60 +} 1.61 + 1.62 +void SkDisplayable::clearBounder() { 1.63 +} 1.64 + 1.65 +bool SkDisplayable::contains(SkDisplayable* ) { 1.66 + return false; 1.67 +} 1.68 + 1.69 +SkDisplayable* SkDisplayable::contains(const SkString& ) { 1.70 + return NULL; 1.71 +} 1.72 + 1.73 +SkDisplayable* SkDisplayable::deepCopy(SkAnimateMaker* maker) { 1.74 + SkDisplayTypes type = getType(); 1.75 + if (type == SkType_Unknown) { 1.76 + SkASSERT(0); 1.77 + return NULL; 1.78 + } 1.79 + SkDisplayable* copy = SkDisplayType::CreateInstance(maker, type); 1.80 + int index = -1; 1.81 + int propIndex = 0; 1.82 + const SkMemberInfo* info; 1.83 + do { 1.84 + info = copy->getMember(++index); 1.85 + if (info == NULL) 1.86 + break; 1.87 + if (info->fType == SkType_MemberProperty) { 1.88 + SkScriptValue value; 1.89 + if (getProperty(propIndex, &value)) 1.90 + copy->setProperty(propIndex, value); 1.91 + propIndex++; 1.92 + continue; 1.93 + } 1.94 + if (info->fType == SkType_MemberFunction) 1.95 + continue; 1.96 + if (info->fType == SkType_Array) { 1.97 + SkTDOperandArray* array = (SkTDOperandArray*) info->memberData(this); 1.98 + int arrayCount; 1.99 + if (array == NULL || (arrayCount = array->count()) == 0) 1.100 + continue; 1.101 + SkTDOperandArray* copyArray = (SkTDOperandArray*) info->memberData(copy); 1.102 + copyArray->setCount(arrayCount); 1.103 + SkDisplayTypes elementType; 1.104 + if (type == SkType_Array) { 1.105 + SkDisplayArray* dispArray = (SkDisplayArray*) this; 1.106 + elementType = dispArray->values.getType(); 1.107 + } else 1.108 + elementType = info->arrayType(); 1.109 + size_t elementSize = SkMemberInfo::GetSize(elementType); 1.110 + size_t byteSize = elementSize * arrayCount; 1.111 + memcpy(copyArray->begin(), array->begin(), byteSize); 1.112 + continue; 1.113 + } 1.114 + if (SkDisplayType::IsDisplayable(maker, info->fType)) { 1.115 + SkDisplayable** displayable = (SkDisplayable**) info->memberData(this); 1.116 + if (*displayable == NULL || *displayable == (SkDisplayable*) -1) 1.117 + continue; 1.118 + SkDisplayable* deeper = (*displayable)->deepCopy(maker); 1.119 + info->setMemberData(copy, deeper, sizeof(deeper)); 1.120 + continue; 1.121 + } 1.122 + if (info->fType == SkType_String || info->fType == SkType_DynamicString) { 1.123 + SkString* string; 1.124 + info->getString(this, &string); 1.125 + info->setString(copy, string); 1.126 + continue; 1.127 + } 1.128 + void* data = info->memberData(this); 1.129 + size_t size = SkMemberInfo::GetSize(info->fType); 1.130 + info->setMemberData(copy, data, size); 1.131 + } while (true); 1.132 + copy->dirty(); 1.133 + return copy; 1.134 +} 1.135 + 1.136 +void SkDisplayable::dirty() { 1.137 +} 1.138 + 1.139 +#ifdef SK_DUMP_ENABLED 1.140 +void SkDisplayable::dump(SkAnimateMaker* maker) { 1.141 + dumpBase(maker); 1.142 +#if SK_USE_CONDENSED_INFO == 0 1.143 + this->dumpAttrs(maker); 1.144 + this->dumpChildren(maker); 1.145 +#endif 1.146 +} 1.147 + 1.148 +void SkDisplayable::dumpAttrs(SkAnimateMaker* maker) { 1.149 + SkDisplayTypes type = getType(); 1.150 + if (type == SkType_Unknown) { 1.151 + //SkDebugf("/>\n"); 1.152 + return; 1.153 + } 1.154 + SkDisplayable* blankCopy = SkDisplayType::CreateInstance(maker, type); 1.155 + 1.156 + int index = -1; 1.157 + int propIndex = 0; 1.158 + const SkMemberInfo* info; 1.159 + const SkMemberInfo* blankInfo; 1.160 + SkScriptValue value; 1.161 + SkScriptValue blankValue; 1.162 + SkOperand values[2]; 1.163 + SkOperand blankValues[2]; 1.164 + do { 1.165 + info = this->getMember(++index); 1.166 + if (NULL == info) { 1.167 + //SkDebugf("\n"); 1.168 + break; 1.169 + } 1.170 + if (SkType_MemberProperty == info->fType) { 1.171 + if (getProperty(propIndex, &value)) { 1.172 + blankCopy->getProperty(propIndex, &blankValue); 1.173 + //last two are dummies 1.174 + dumpValues(info, value.fType, value.fOperand, blankValue.fOperand, value.fOperand, blankValue.fOperand); 1.175 + } 1.176 + 1.177 + propIndex++; 1.178 + continue; 1.179 + } 1.180 + if (SkDisplayType::IsDisplayable(maker, info->fType)) { 1.181 + continue; 1.182 + } 1.183 + 1.184 + if (info->fType == SkType_MemberFunction) 1.185 + continue; 1.186 + 1.187 + 1.188 + if (info->fType == SkType_Array) { 1.189 + SkTDOperandArray* array = (SkTDOperandArray*) info->memberData(this); 1.190 + int arrayCount; 1.191 + if (array == NULL || (arrayCount = array->count()) == 0) 1.192 + continue; 1.193 + SkDisplayTypes elementType; 1.194 + if (type == SkType_Array) { 1.195 + SkDisplayArray* dispArray = (SkDisplayArray*) this; 1.196 + elementType = dispArray->values.getType(); 1.197 + } else 1.198 + elementType = info->arrayType(); 1.199 + bool firstElem = true; 1.200 + SkDebugf("%s=\"[", info->fName); 1.201 + for (SkOperand* op = array->begin(); op < array->end(); op++) { 1.202 + if (!firstElem) SkDebugf(","); 1.203 + switch (elementType) { 1.204 + case SkType_Displayable: 1.205 + SkDebugf("%s", op->fDisplayable->id); 1.206 + break; 1.207 + case SkType_Int: 1.208 + SkDebugf("%d", op->fS32); 1.209 + break; 1.210 + case SkType_Float: 1.211 + SkDebugf("%g", SkScalarToFloat(op->fScalar)); 1.212 + break; 1.213 + case SkType_String: 1.214 + case SkType_DynamicString: 1.215 + SkDebugf("%s", op->fString->c_str()); 1.216 + break; 1.217 + default: 1.218 + break; 1.219 + } 1.220 + firstElem = false; 1.221 + } 1.222 + SkDebugf("]\" "); 1.223 + continue; 1.224 + } 1.225 + 1.226 + if (info->fType == SkType_String || info->fType == SkType_DynamicString) { 1.227 + SkString* string; 1.228 + info->getString(this, &string); 1.229 + if (string->isEmpty() == false) 1.230 + SkDebugf("%s=\"%s\"\t", info->fName, string->c_str()); 1.231 + continue; 1.232 + } 1.233 + 1.234 + 1.235 + blankInfo = blankCopy->getMember(index); 1.236 + int i = info->fCount; 1.237 + info->getValue(this, values, i); 1.238 + blankInfo->getValue(blankCopy, blankValues, i); 1.239 + dumpValues(info, info->fType, values[0], blankValues[0], values[1], blankValues[1]); 1.240 + } while (true); 1.241 + delete blankCopy; 1.242 +} 1.243 + 1.244 +void SkDisplayable::dumpBase(SkAnimateMaker* maker) { 1.245 + SkDisplayTypes type = getType(); 1.246 + const char* elementName = "(unknown)"; 1.247 + if (type != SkType_Unknown && type != SkType_Screenplay) 1.248 + elementName = SkDisplayType::GetName(maker, type); 1.249 + SkDebugf("%*s", SkDisplayList::fIndent, ""); 1.250 + if (SkDisplayList::fDumpIndex != 0 && SkDisplayList::fIndent == 0) 1.251 + SkDebugf("%d: ", SkDisplayList::fDumpIndex); 1.252 + SkDebugf("<%s ", elementName); 1.253 + if (strcmp(id,"") != 0) 1.254 + SkDebugf("id=\"%s\" ", id); 1.255 +} 1.256 + 1.257 +void SkDisplayable::dumpChildren(SkAnimateMaker* maker, bool closedAngle) { 1.258 + 1.259 + int index = -1; 1.260 + const SkMemberInfo* info; 1.261 + index = -1; 1.262 + SkDisplayList::fIndent += 4; 1.263 + do { 1.264 + info = this->getMember(++index); 1.265 + if (NULL == info) { 1.266 + break; 1.267 + } 1.268 + if (SkDisplayType::IsDisplayable(maker, info->fType)) { 1.269 + SkDisplayable** displayable = (SkDisplayable**) info->memberData(this); 1.270 + if (*displayable == NULL || *displayable == (SkDisplayable*) -1) 1.271 + continue; 1.272 + if (closedAngle == false) { 1.273 + SkDebugf(">\n"); 1.274 + closedAngle = true; 1.275 + } 1.276 + (*displayable)->dump(maker); 1.277 + } 1.278 + } while (true); 1.279 + SkDisplayList::fIndent -= 4; 1.280 + if (closedAngle) 1.281 + dumpEnd(maker); 1.282 + else 1.283 + SkDebugf("/>\n"); 1.284 +} 1.285 + 1.286 +void SkDisplayable::dumpEnd(SkAnimateMaker* maker) { 1.287 + SkDisplayTypes type = getType(); 1.288 + const char* elementName = "(unknown)"; 1.289 + if (type != SkType_Unknown && type != SkType_Screenplay) 1.290 + elementName = SkDisplayType::GetName(maker, type); 1.291 + SkDebugf("%*s", SkDisplayList::fIndent, ""); 1.292 + SkDebugf("</%s>\n", elementName); 1.293 +} 1.294 + 1.295 +void SkDisplayable::dumpEvents() { 1.296 +} 1.297 + 1.298 +void SkDisplayable::dumpValues(const SkMemberInfo* info, SkDisplayTypes type, SkOperand op, SkOperand blankOp, 1.299 + SkOperand op2, SkOperand blankOp2) { 1.300 + switch (type) { 1.301 + case SkType_BitmapEncoding: 1.302 + switch (op.fS32) { 1.303 + case 0 : SkDebugf("type=\"jpeg\" "); 1.304 + break; 1.305 + case 1 : SkDebugf("type=\"png\" "); 1.306 + break; 1.307 + default: SkDebugf("type=\"UNDEFINED\" "); 1.308 + } 1.309 + break; 1.310 + //should make this a separate case in dump attrs, rather than make dump values have a larger signature 1.311 + case SkType_Point: 1.312 + if (op.fScalar != blankOp.fScalar || op2.fScalar != blankOp.fScalar) { 1.313 + SkDebugf("%s=\"[%g,%g]\" ", info->fName, SkScalarToFloat(op.fScalar), SkScalarToFloat(op2.fScalar)); 1.314 + } 1.315 + break; 1.316 + case SkType_FromPathMode: 1.317 + switch (op.fS32) { 1.318 + case 0: 1.319 + //don't want to print anything for 0, just adding it to remove it from default: 1.320 + break; 1.321 + case 1: 1.322 + SkDebugf("%s=\"%s\" ", info->fName, "angle"); 1.323 + break; 1.324 + case 2: 1.325 + SkDebugf("%s=\"%s\" ", info->fName, "position"); 1.326 + break; 1.327 + default: 1.328 + SkDebugf("%s=\"INVALID\" ", info->fName); 1.329 + } 1.330 + break; 1.331 + case SkType_MaskFilterBlurStyle: 1.332 + switch (op.fS32) { 1.333 + case 0: 1.334 + break; 1.335 + case 1: 1.336 + SkDebugf("%s=\"%s\" ", info->fName, "solid"); 1.337 + break; 1.338 + case 2: 1.339 + SkDebugf("%s=\"%s\" ", info->fName, "outer"); 1.340 + break; 1.341 + case 3: 1.342 + SkDebugf("%s=\"%s\" ", info->fName, "inner"); 1.343 + break; 1.344 + default: 1.345 + SkDebugf("%s=\"INVALID\" ", info->fName); 1.346 + } 1.347 + break; 1.348 + case SkType_FilterType: 1.349 + if (op.fS32 == 1) 1.350 + SkDebugf("%s=\"%s\" ", info->fName, "bilinear"); 1.351 + break; 1.352 + case SkType_PathDirection: 1.353 + SkDebugf("%s=\"%s\" ", info->fName, op.fS32 == 0 ? "cw" : "ccw"); 1.354 + break; 1.355 + case SkType_FillType: 1.356 + SkDebugf("%s=\"%s\" ", info->fName, op.fS32 == 0 ? "winding" : "evenOdd"); 1.357 + break; 1.358 + case SkType_TileMode: 1.359 + //correct to look at the S32? 1.360 + if (op.fS32 != blankOp.fS32) 1.361 + SkDebugf("%s=\"%s\" ", info->fName, op.fS32 == 0 ? "clamp" : op.fS32 == 1 ? "repeat" : "mirror"); 1.362 + break; 1.363 + case SkType_Boolean: 1.364 + if (op.fS32 != blankOp.fS32) 1.365 + SkDebugf("%s=\"%s\" ", info->fName, op.fS32 == 0 ? "false" : "true"); 1.366 + break; 1.367 + case SkType_Int: 1.368 + if (op.fS32 != blankOp.fS32) 1.369 + SkDebugf(" %s=\"%d\" ", info->fName, op.fS32); 1.370 + break; 1.371 + case SkType_Float: 1.372 + if (op.fScalar != blankOp.fScalar) { //or /65536? 1.373 + SkDebugf("%s=\"%g\" ", info->fName, SkScalarToFloat(op.fScalar)); 1.374 + } 1.375 + break; 1.376 + case SkType_String: 1.377 + case SkType_DynamicString: 1.378 + if (op.fString->size() > 0) 1.379 + SkDebugf("%s=\"%s\" ", info->fName, op.fString->c_str()); 1.380 + break; 1.381 + case SkType_MSec: 1.382 + if (op.fS32 != blankOp.fS32) { 1.383 + SkDebugf(" %s=\"%g\" ", info->fName, SkScalarToFloat(SkScalarDiv(op.fS32, 1000))); 1.384 + } 1.385 + default: 1.386 + SkDebugf(""); 1.387 + } 1.388 +} 1.389 + 1.390 +#endif 1.391 + 1.392 +bool SkDisplayable::enable( SkAnimateMaker& ) { 1.393 + return false; 1.394 +} 1.395 + 1.396 +void SkDisplayable::enableBounder() { 1.397 +} 1.398 + 1.399 +void SkDisplayable::executeFunction(SkDisplayable* , int index, 1.400 + SkTDArray<SkScriptValue>& , SkDisplayTypes, SkScriptValue* ) { 1.401 + SkASSERT(0); 1.402 +} 1.403 + 1.404 +void SkDisplayable::executeFunction(SkDisplayable* target, 1.405 + const SkMemberInfo* info, SkTypedArray* values, SkScriptValue* value) { 1.406 + SkTDArray<SkScriptValue> typedValues; 1.407 + for (SkOperand* op = values->begin(); op < values->end(); op++) { 1.408 + SkScriptValue temp; 1.409 + temp.fType = values->getType(); 1.410 + temp.fOperand = *op; 1.411 + *typedValues.append() = temp; 1.412 + } 1.413 + executeFunction(target, info->functionIndex(), typedValues, info->getType(), value); 1.414 +} 1.415 + 1.416 +void SkDisplayable::executeFunction2(SkDisplayable* , int index, 1.417 + SkOpArray* params, SkDisplayTypes, SkOperand2* ) { 1.418 + SkASSERT(0); 1.419 +} 1.420 + 1.421 +void SkDisplayable::getBounds(SkRect* rect) { 1.422 + SkASSERT(rect); 1.423 + rect->fLeft = rect->fTop = SK_ScalarMax; 1.424 + rect->fRight= rect->fBottom = -SK_ScalarMax; 1.425 +} 1.426 + 1.427 +const SkFunctionParamType* SkDisplayable::getFunctionsParameters() { 1.428 + return NULL; 1.429 +} 1.430 + 1.431 +const SkMemberInfo* SkDisplayable::getMember(int index) { 1.432 + return NULL; 1.433 +} 1.434 + 1.435 +const SkMemberInfo* SkDisplayable::getMember(const char name[]) { 1.436 + return NULL; 1.437 +} 1.438 + 1.439 +const SkFunctionParamType* SkDisplayable::getParameters(const SkMemberInfo* info, 1.440 + int* paramCount) { 1.441 + const SkFunctionParamType* params = getFunctionsParameters(); 1.442 + SkASSERT(params != NULL); 1.443 + int funcIndex = info->functionIndex(); 1.444 + // !!! eventually break traversing params into an external function (maybe this whole function) 1.445 + int index = funcIndex; 1.446 + int offset = 0; 1.447 + while (--index >= 0) { 1.448 + while (params[offset] != 0) 1.449 + offset++; 1.450 + offset++; 1.451 + } 1.452 + int count = 0; 1.453 + while (params[offset] != 0) { 1.454 + count++; 1.455 + offset++; 1.456 + } 1.457 + *paramCount = count; 1.458 + return ¶ms[offset - count]; 1.459 +} 1.460 + 1.461 +SkDisplayable* SkDisplayable::getParent() const { 1.462 + return NULL; 1.463 +} 1.464 + 1.465 +bool SkDisplayable::getProperty(int index, SkScriptValue* ) const { 1.466 +// SkASSERT(0); 1.467 + return false; 1.468 +} 1.469 + 1.470 +bool SkDisplayable::getProperty2(int index, SkOperand2* value) const { 1.471 + SkASSERT(0); 1.472 + return false; 1.473 +} 1.474 + 1.475 +SkDisplayTypes SkDisplayable::getType() const { 1.476 + return SkType_Unknown; 1.477 +} 1.478 + 1.479 +bool SkDisplayable::hasEnable() const { 1.480 + return false; 1.481 +} 1.482 + 1.483 +bool SkDisplayable::isDrawable() const { 1.484 + return false; 1.485 +} 1.486 + 1.487 +void SkDisplayable::onEndElement(SkAnimateMaker& ) {} 1.488 + 1.489 +const SkMemberInfo* SkDisplayable::preferredChild(SkDisplayTypes type) { 1.490 + return NULL; 1.491 +} 1.492 + 1.493 +bool SkDisplayable::resolveIDs(SkAnimateMaker& maker, SkDisplayable* original, SkApply* apply) { 1.494 + return false; 1.495 +} 1.496 + 1.497 +//SkDisplayable* SkDisplayable::resolveTarget(SkAnimateMaker& ) { 1.498 +// return this; 1.499 +//} 1.500 + 1.501 +void SkDisplayable::setChildHasID() { 1.502 +} 1.503 + 1.504 +bool SkDisplayable::setParent(SkDisplayable* ) { 1.505 + return false; 1.506 +} 1.507 + 1.508 +bool SkDisplayable::setProperty(int index, SkScriptValue& ) { 1.509 + //SkASSERT(0); 1.510 + return false; 1.511 +} 1.512 + 1.513 +void SkDisplayable::setReference(const SkMemberInfo* info, SkDisplayable* displayable) { 1.514 + if (info->fType == SkType_MemberProperty) { 1.515 + SkScriptValue scriptValue; 1.516 + scriptValue.fOperand.fDisplayable = displayable; 1.517 + scriptValue.fType = displayable->getType(); 1.518 + setProperty(info->propertyIndex(), scriptValue); 1.519 + } else if (info->fType == SkType_Array) { 1.520 + SkASSERT(displayable->getType() == SkType_Array); 1.521 + SkDisplayArray* dispArray = (SkDisplayArray*) displayable; 1.522 + SkTDScalarArray* array = (SkTDScalarArray* ) info->memberData(this); 1.523 + array->setCount(dispArray->values.count()); 1.524 + memcpy(array->begin(), dispArray->values.begin(), dispArray->values.count() * sizeof(int)); 1.525 + // 1.526 + 1.527 + // !!! need a way for interpreter engine to own array 1.528 + // !!! probably need to replace all scriptable arrays with single bigger array 1.529 + // that has operand and type on every element -- or 1.530 + // when array is dirtied, need to get parent to reparse to local array 1.531 + } else { 1.532 + void* storage = info->memberData(this); 1.533 + memcpy(storage, &displayable, sizeof(SkDisplayable*)); 1.534 + } 1.535 +// !!! unclear why displayable is dirtied here 1.536 +// if this is called, this breaks fromPath.xml 1.537 +// displayable->dirty(); 1.538 +} 1.539 + 1.540 +#ifdef SK_DEBUG 1.541 +void SkDisplayable::validate() { 1.542 +} 1.543 +#endif