
/*
 * Copyright 2011 Google Inc.
 *
 * Use of this source code is governed by a BSD-style license that can be
 * found in the LICENSE file.
 */
#ifndef SkAnimatorScript2_DEFINED
#define SkAnimatorScript2_DEFINED

#include "SkDisplayable.h"
#include "SkScript2.h"
#include "SkTypedArray.h"

class SkAnimateMaker;
struct SkMemberInfo;

#ifndef SkAnimatorScript_DEFINED
struct SkDisplayEnumMap {
    SkDisplayTypes fType;
    const char* fValues;
};
#endif

class SkAnimatorScript2 : public SkScriptEngine2 {
public:
    SkAnimatorScript2(SkAnimateMaker& , SkDisplayable* working, SkDisplayTypes type);
    ~SkAnimatorScript2();
    bool evalMemberCommon(const SkMemberInfo* info,
        SkDisplayable* displayable, SkOperand2* value);
    SkAnimateMaker& getMaker() { return fMaker; }
    SkDisplayable* getWorking() { return fWorking; }
    static bool MapEnums(const char* ptr, const char* match, size_t len, int* value);
    static const SkDisplayEnumMap& GetEnumValues(SkDisplayTypes type);
    static SkDisplayTypes ToDisplayType(SkOperand2::OpType type);
    static SkOperand2::OpType ToOpType(SkDisplayTypes type);
private:
    SkAnimateMaker& fMaker;
    SkDisplayable* fWorking;
    friend class SkDump;
    friend struct SkScriptNAnswer;
    // illegal
    SkAnimatorScript2& operator=(const SkAnimatorScript2&);
#ifdef SK_DEBUG
public:
    static void UnitTest();
#endif
};

#endif // SkAnimatorScript2_DEFINED
