Home | History | Annotate | Download | only in animator
      1 /* libs/graphics/animator/SkDisplayTypes.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 "SkDisplayTypes.h"
     19 #include "SkAnimateBase.h"
     20 
     21 bool SkDisplayDepend::canContainDependents() const {
     22     return true;
     23 }
     24 
     25 void SkDisplayDepend::dirty() {
     26     SkDisplayable** last = fDependents.end();
     27     for (SkDisplayable** depPtr = fDependents.begin(); depPtr < last; depPtr++) {
     28         SkAnimateBase* animate = (SkAnimateBase* ) *depPtr;
     29         animate->setChanged(true);
     30     }
     31 }
     32 
     33 // Boolean
     34 #if SK_USE_CONDENSED_INFO == 0
     35 
     36 const SkMemberInfo SkDisplayBoolean::fInfo[] = {
     37     SK_MEMBER(value, Boolean)
     38 };
     39 
     40 #endif
     41 
     42 DEFINE_GET_MEMBER(SkDisplayBoolean);
     43 
     44 SkDisplayBoolean::SkDisplayBoolean() : value(false) {
     45 }
     46 
     47 #ifdef SK_DUMP_ENABLED
     48 void SkDisplayBoolean::dump(SkAnimateMaker* maker){
     49     dumpBase(maker);
     50     SkDebugf("value=\"%s\" />\n", value ? "true" : "false");
     51 }
     52 #endif
     53 
     54 // int32_t
     55 #if SK_USE_CONDENSED_INFO == 0
     56 
     57 const SkMemberInfo SkDisplayInt::fInfo[] = {
     58     SK_MEMBER(value, Int)
     59 };
     60 
     61 #endif
     62 
     63 DEFINE_GET_MEMBER(SkDisplayInt);
     64 
     65 SkDisplayInt::SkDisplayInt() : value(0) {
     66 }
     67 
     68 #ifdef SK_DUMP_ENABLED
     69 void SkDisplayInt::dump(SkAnimateMaker* maker){
     70     dumpBase(maker);
     71     SkDebugf("value=\"%d\" />\n", value);
     72 }
     73 #endif
     74 
     75 // SkScalar
     76 #if SK_USE_CONDENSED_INFO == 0
     77 
     78 const SkMemberInfo SkDisplayFloat::fInfo[] = {
     79     SK_MEMBER(value, Float)
     80 };
     81 
     82 #endif
     83 
     84 DEFINE_GET_MEMBER(SkDisplayFloat);
     85 
     86 SkDisplayFloat::SkDisplayFloat() : value(0) {
     87 }
     88 
     89 #ifdef SK_DUMP_ENABLED
     90 void SkDisplayFloat::dump(SkAnimateMaker* maker) {
     91     dumpBase(maker);
     92 #ifdef SK_CAN_USE_FLOAT
     93     SkDebugf("value=\"%g\" />\n", SkScalarToFloat(value));
     94 #else
     95     SkDebugf("value=\"%x\" />\n", value);
     96 #endif
     97 }
     98 #endif
     99 
    100 // SkString
    101 enum SkDisplayString_Functions {
    102     SK_FUNCTION(slice)
    103 };
    104 
    105 enum SkDisplayString_Properties {
    106     SK_PROPERTY(length)
    107 };
    108 
    109 const SkFunctionParamType SkDisplayString::fFunctionParameters[] = {
    110     (SkFunctionParamType) SkType_Int,   // slice
    111     (SkFunctionParamType) SkType_Int,
    112     (SkFunctionParamType) 0
    113 };
    114 
    115 #if SK_USE_CONDENSED_INFO == 0
    116 
    117 const SkMemberInfo SkDisplayString::fInfo[] = {
    118     SK_MEMBER_PROPERTY(length, Int),
    119     SK_MEMBER_FUNCTION(slice, String),
    120     SK_MEMBER(value, String)
    121 };
    122 
    123 #endif
    124 
    125 DEFINE_GET_MEMBER(SkDisplayString);
    126 
    127 SkDisplayString::SkDisplayString() {
    128 }
    129 
    130 SkDisplayString::SkDisplayString(SkString& copyFrom) : value(copyFrom) {
    131 }
    132 
    133 void SkDisplayString::executeFunction(SkDisplayable* target, int index,
    134         SkTDArray<SkScriptValue>& parameters, SkDisplayTypes type,
    135         SkScriptValue* scriptValue) {
    136     if (scriptValue == NULL)
    137         return;
    138     SkASSERT(target == this);
    139     switch (index) {
    140         case SK_FUNCTION(slice):
    141             scriptValue->fType = SkType_String;
    142             SkASSERT(parameters[0].fType == SkType_Int);
    143             int start =  parameters[0].fOperand.fS32;
    144             if (start < 0)
    145                 start = (int) (value.size() - start);
    146             int end = (int) value.size();
    147             if (parameters.count() > 1) {
    148                 SkASSERT(parameters[1].fType == SkType_Int);
    149                 end = parameters[1].fOperand.fS32;
    150             }
    151             //if (end >= 0 && end < (int) value.size())
    152             if (end >= 0 && end <= (int) value.size())
    153                 scriptValue->fOperand.fString = new SkString(&value.c_str()[start], end - start);
    154             else
    155                 scriptValue->fOperand.fString = new SkString(value);
    156         break;
    157     }
    158 }
    159 
    160 const SkFunctionParamType* SkDisplayString::getFunctionsParameters() {
    161     return fFunctionParameters;
    162 }
    163 
    164 bool SkDisplayString::getProperty(int index, SkScriptValue* scriptValue) const {
    165     switch (index) {
    166         case SK_PROPERTY(length):
    167             scriptValue->fType = SkType_Int;
    168             scriptValue->fOperand.fS32 = (int32_t) value.size();
    169             break;
    170         default:
    171             SkASSERT(0);
    172             return false;
    173     }
    174     return true;
    175 }
    176 
    177 
    178 // SkArray
    179 #if 0   // !!! reason enough to qualify enum with class name or move typedArray into its own file
    180 enum SkDisplayArray_Properties {
    181     SK_PROPERTY(length)
    182 };
    183 #endif
    184 
    185 #if SK_USE_CONDENSED_INFO == 0
    186 
    187 const SkMemberInfo SkDisplayArray::fInfo[] = {
    188     SK_MEMBER_PROPERTY(length, Int),
    189     SK_MEMBER_ARRAY(values, Unknown)
    190 };
    191 
    192 #endif
    193 
    194 DEFINE_GET_MEMBER(SkDisplayArray);
    195 
    196 SkDisplayArray::SkDisplayArray() {
    197 }
    198 
    199 SkDisplayArray::SkDisplayArray(SkTypedArray& copyFrom) : values(copyFrom) {
    200 
    201 }
    202 
    203 SkDisplayArray::~SkDisplayArray() {
    204     if (values.getType() == SkType_String) {
    205         for (int index = 0; index < values.count(); index++)
    206             delete values[index].fString;
    207         return;
    208     }
    209     if (values.getType() == SkType_Array) {
    210         for (int index = 0; index < values.count(); index++)
    211             delete values[index].fArray;
    212     }
    213 }
    214 
    215 bool SkDisplayArray::getProperty(int index, SkScriptValue* value) const {
    216     switch (index) {
    217         case SK_PROPERTY(length):
    218             value->fType = SkType_Int;
    219             value->fOperand.fS32 = values.count();
    220             break;
    221         default:
    222             SkASSERT(0);
    223             return false;
    224     }
    225     return true;
    226 }
    227 
    228 
    229 
    230