
/*
 * Copyright 2006 The Android Open Source Project
 *
 * Use of this source code is governed by a BSD-style license that can be
 * found in the LICENSE file.
 */


#include "SkAnimateSet.h"
#include "SkAnimateMaker.h"
#include "SkAnimateProperties.h"
#include "SkParse.h"

#if SK_USE_CONDENSED_INFO == 0

const SkMemberInfo SkSet::fInfo[] = {
    SK_MEMBER(begin, MSec),
    SK_MEMBER(dur, MSec),
    SK_MEMBER_PROPERTY(dynamic, Boolean),
    SK_MEMBER(field, String),
//  SK_MEMBER(formula, DynamicString),
    SK_MEMBER(lval, DynamicString),
//  SK_MEMBER_PROPERTY(reset, Boolean),
    SK_MEMBER_PROPERTY(step, Int),
    SK_MEMBER(target, DynamicString),
    SK_MEMBER(to, DynamicString)
};

#endif

DEFINE_GET_MEMBER(SkSet);

SkSet::SkSet() {
    dur = 1;
}

#ifdef SK_DUMP_ENABLED
void SkSet::dump(SkAnimateMaker* maker) {
    INHERITED::dump(maker);
    if (dur != 1) {
        SkDebugf("dur=\"%g\" ", SkScalarToFloat(SkScalarDiv(dur,1000)));
    }
    //don't want double />\n's
    SkDebugf("/>\n");

}
#endif

void SkSet::refresh(SkAnimateMaker& maker) {
    fFieldInfo->setValue(maker, &fValues, 0, fFieldInfo->fCount, NULL,
        fFieldInfo->getType(), to);
}

void SkSet::onEndElement(SkAnimateMaker& maker) {
    if (resolveCommon(maker) == false)
        return;
    if (fFieldInfo == NULL) {
        maker.setErrorCode(SkDisplayXMLParserError::kFieldNotInTarget);
        return;
    }
    fReset = dur != 1;
    SkDisplayTypes outType = fFieldInfo->getType();
    int comps = outType == SkType_String || outType == SkType_DynamicString ? 1 :
        (int)fFieldInfo->getSize((const SkDisplayable*) fTarget) / sizeof(int);
    if (fValues.getType() == SkType_Unknown) {
        fValues.setType(outType);
        fValues.setCount(comps);
        if (outType == SkType_String || outType == SkType_DynamicString)
            fValues[0].fString = SkNEW(SkString);
        else
            memset(fValues.begin(), 0, fValues.count() * sizeof(fValues.begin()[0]));
    } else {
        SkASSERT(fValues.getType() == outType);
        if (fFieldInfo->fType == SkType_Array)
            comps = fValues.count();
        else {
            SkASSERT(fValues.count() == comps);
        }
    }
    if (formula.size() > 0) {
        comps = 1;
        outType = SkType_MSec;
    }
    fFieldInfo->setValue(maker, &fValues, fFieldOffset, comps, this, outType, formula.size() > 0 ? formula : to);
    fComponents = fValues.count();
}
