/*** Autogenerated by WIDL 3.1 from include/uianimation.idl - Do not edit ***/

#ifndef __REQUIRED_RPCNDR_H_VERSION__
#define __REQUIRED_RPCNDR_H_VERSION__ 475
#endif

#include <rpc.h>
#include <rpcndr.h>

#ifndef COM_NO_WINDOWS_H
#include <windows.h>
#include <ole2.h>
#endif

#ifndef __uianimation_h__
#define __uianimation_h__

/* Forward declarations */

#ifndef __UIAnimationManager_FWD_DEFINED__
#define __UIAnimationManager_FWD_DEFINED__
#ifdef __cplusplus
typedef class UIAnimationManager UIAnimationManager;
#else
typedef struct UIAnimationManager UIAnimationManager;
#endif /* defined __cplusplus */
#endif /* defined __UIAnimationManager_FWD_DEFINED__ */

#ifndef __UIAnimationManager2_FWD_DEFINED__
#define __UIAnimationManager2_FWD_DEFINED__
#ifdef __cplusplus
typedef class UIAnimationManager2 UIAnimationManager2;
#else
typedef struct UIAnimationManager2 UIAnimationManager2;
#endif /* defined __cplusplus */
#endif /* defined __UIAnimationManager2_FWD_DEFINED__ */

#ifndef __UIAnimationTransitionLibrary_FWD_DEFINED__
#define __UIAnimationTransitionLibrary_FWD_DEFINED__
#ifdef __cplusplus
typedef class UIAnimationTransitionLibrary UIAnimationTransitionLibrary;
#else
typedef struct UIAnimationTransitionLibrary UIAnimationTransitionLibrary;
#endif /* defined __cplusplus */
#endif /* defined __UIAnimationTransitionLibrary_FWD_DEFINED__ */

#ifndef __UIAnimationTransitionLibrary2_FWD_DEFINED__
#define __UIAnimationTransitionLibrary2_FWD_DEFINED__
#ifdef __cplusplus
typedef class UIAnimationTransitionLibrary2 UIAnimationTransitionLibrary2;
#else
typedef struct UIAnimationTransitionLibrary2 UIAnimationTransitionLibrary2;
#endif /* defined __cplusplus */
#endif /* defined __UIAnimationTransitionLibrary2_FWD_DEFINED__ */

#ifndef __UIAnimationTransitionFactory_FWD_DEFINED__
#define __UIAnimationTransitionFactory_FWD_DEFINED__
#ifdef __cplusplus
typedef class UIAnimationTransitionFactory UIAnimationTransitionFactory;
#else
typedef struct UIAnimationTransitionFactory UIAnimationTransitionFactory;
#endif /* defined __cplusplus */
#endif /* defined __UIAnimationTransitionFactory_FWD_DEFINED__ */

#ifndef __UIAnimationTransitionFactory2_FWD_DEFINED__
#define __UIAnimationTransitionFactory2_FWD_DEFINED__
#ifdef __cplusplus
typedef class UIAnimationTransitionFactory2 UIAnimationTransitionFactory2;
#else
typedef struct UIAnimationTransitionFactory2 UIAnimationTransitionFactory2;
#endif /* defined __cplusplus */
#endif /* defined __UIAnimationTransitionFactory2_FWD_DEFINED__ */

#ifndef __UIAnimationTimer_FWD_DEFINED__
#define __UIAnimationTimer_FWD_DEFINED__
#ifdef __cplusplus
typedef class UIAnimationTimer UIAnimationTimer;
#else
typedef struct UIAnimationTimer UIAnimationTimer;
#endif /* defined __cplusplus */
#endif /* defined __UIAnimationTimer_FWD_DEFINED__ */

#ifndef __IUIAnimationManager_FWD_DEFINED__
#define __IUIAnimationManager_FWD_DEFINED__
typedef interface IUIAnimationManager IUIAnimationManager;
#ifdef __cplusplus
interface IUIAnimationManager;
#endif /* __cplusplus */
#endif

#ifndef __IUIAnimationVariable_FWD_DEFINED__
#define __IUIAnimationVariable_FWD_DEFINED__
typedef interface IUIAnimationVariable IUIAnimationVariable;
#ifdef __cplusplus
interface IUIAnimationVariable;
#endif /* __cplusplus */
#endif

#ifndef __IUIAnimationStoryboard_FWD_DEFINED__
#define __IUIAnimationStoryboard_FWD_DEFINED__
typedef interface IUIAnimationStoryboard IUIAnimationStoryboard;
#ifdef __cplusplus
interface IUIAnimationStoryboard;
#endif /* __cplusplus */
#endif

#ifndef __IUIAnimationTransition_FWD_DEFINED__
#define __IUIAnimationTransition_FWD_DEFINED__
typedef interface IUIAnimationTransition IUIAnimationTransition;
#ifdef __cplusplus
interface IUIAnimationTransition;
#endif /* __cplusplus */
#endif

#ifndef __IUIAnimationStoryboardEventHandler_FWD_DEFINED__
#define __IUIAnimationStoryboardEventHandler_FWD_DEFINED__
typedef interface IUIAnimationStoryboardEventHandler IUIAnimationStoryboardEventHandler;
#ifdef __cplusplus
interface IUIAnimationStoryboardEventHandler;
#endif /* __cplusplus */
#endif

#ifndef __IUIAnimationVariableChangeHandler_FWD_DEFINED__
#define __IUIAnimationVariableChangeHandler_FWD_DEFINED__
typedef interface IUIAnimationVariableChangeHandler IUIAnimationVariableChangeHandler;
#ifdef __cplusplus
interface IUIAnimationVariableChangeHandler;
#endif /* __cplusplus */
#endif

#ifndef __IUIAnimationVariableIntegerChangeHandler_FWD_DEFINED__
#define __IUIAnimationVariableIntegerChangeHandler_FWD_DEFINED__
typedef interface IUIAnimationVariableIntegerChangeHandler IUIAnimationVariableIntegerChangeHandler;
#ifdef __cplusplus
interface IUIAnimationVariableIntegerChangeHandler;
#endif /* __cplusplus */
#endif

#ifndef __IUIAnimationManagerEventHandler_FWD_DEFINED__
#define __IUIAnimationManagerEventHandler_FWD_DEFINED__
typedef interface IUIAnimationManagerEventHandler IUIAnimationManagerEventHandler;
#ifdef __cplusplus
interface IUIAnimationManagerEventHandler;
#endif /* __cplusplus */
#endif

#ifndef __IUIAnimationPriorityComparison_FWD_DEFINED__
#define __IUIAnimationPriorityComparison_FWD_DEFINED__
typedef interface IUIAnimationPriorityComparison IUIAnimationPriorityComparison;
#ifdef __cplusplus
interface IUIAnimationPriorityComparison;
#endif /* __cplusplus */
#endif

#ifndef __IUIAnimationManager2_FWD_DEFINED__
#define __IUIAnimationManager2_FWD_DEFINED__
typedef interface IUIAnimationManager2 IUIAnimationManager2;
#ifdef __cplusplus
interface IUIAnimationManager2;
#endif /* __cplusplus */
#endif

#ifndef __IUIAnimationVariable2_FWD_DEFINED__
#define __IUIAnimationVariable2_FWD_DEFINED__
typedef interface IUIAnimationVariable2 IUIAnimationVariable2;
#ifdef __cplusplus
interface IUIAnimationVariable2;
#endif /* __cplusplus */
#endif

#ifndef __IDCompositionAnimation_FWD_DEFINED__
#define __IDCompositionAnimation_FWD_DEFINED__
typedef interface IDCompositionAnimation IDCompositionAnimation;
#ifdef __cplusplus
interface IDCompositionAnimation;
#endif /* __cplusplus */
#endif

#ifndef __IUIAnimationStoryboard2_FWD_DEFINED__
#define __IUIAnimationStoryboard2_FWD_DEFINED__
typedef interface IUIAnimationStoryboard2 IUIAnimationStoryboard2;
#ifdef __cplusplus
interface IUIAnimationStoryboard2;
#endif /* __cplusplus */
#endif

#ifndef __IUIAnimationTransition2_FWD_DEFINED__
#define __IUIAnimationTransition2_FWD_DEFINED__
typedef interface IUIAnimationTransition2 IUIAnimationTransition2;
#ifdef __cplusplus
interface IUIAnimationTransition2;
#endif /* __cplusplus */
#endif

#ifndef __IUIAnimationLoopIterationChangeHandler2_FWD_DEFINED__
#define __IUIAnimationLoopIterationChangeHandler2_FWD_DEFINED__
typedef interface IUIAnimationLoopIterationChangeHandler2 IUIAnimationLoopIterationChangeHandler2;
#ifdef __cplusplus
interface IUIAnimationLoopIterationChangeHandler2;
#endif /* __cplusplus */
#endif

#ifndef __IUIAnimationStoryboardEventHandler2_FWD_DEFINED__
#define __IUIAnimationStoryboardEventHandler2_FWD_DEFINED__
typedef interface IUIAnimationStoryboardEventHandler2 IUIAnimationStoryboardEventHandler2;
#ifdef __cplusplus
interface IUIAnimationStoryboardEventHandler2;
#endif /* __cplusplus */
#endif

#ifndef __IUIAnimationVariableChangeHandler2_FWD_DEFINED__
#define __IUIAnimationVariableChangeHandler2_FWD_DEFINED__
typedef interface IUIAnimationVariableChangeHandler2 IUIAnimationVariableChangeHandler2;
#ifdef __cplusplus
interface IUIAnimationVariableChangeHandler2;
#endif /* __cplusplus */
#endif

#ifndef __IUIAnimationVariableIntegerChangeHandler2_FWD_DEFINED__
#define __IUIAnimationVariableIntegerChangeHandler2_FWD_DEFINED__
typedef interface IUIAnimationVariableIntegerChangeHandler2 IUIAnimationVariableIntegerChangeHandler2;
#ifdef __cplusplus
interface IUIAnimationVariableIntegerChangeHandler2;
#endif /* __cplusplus */
#endif

#ifndef __IUIAnimationVariableCurveChangeHandler2_FWD_DEFINED__
#define __IUIAnimationVariableCurveChangeHandler2_FWD_DEFINED__
typedef interface IUIAnimationVariableCurveChangeHandler2 IUIAnimationVariableCurveChangeHandler2;
#ifdef __cplusplus
interface IUIAnimationVariableCurveChangeHandler2;
#endif /* __cplusplus */
#endif

#ifndef __IUIAnimationManagerEventHandler2_FWD_DEFINED__
#define __IUIAnimationManagerEventHandler2_FWD_DEFINED__
typedef interface IUIAnimationManagerEventHandler2 IUIAnimationManagerEventHandler2;
#ifdef __cplusplus
interface IUIAnimationManagerEventHandler2;
#endif /* __cplusplus */
#endif

#ifndef __IUIAnimationPriorityComparison2_FWD_DEFINED__
#define __IUIAnimationPriorityComparison2_FWD_DEFINED__
typedef interface IUIAnimationPriorityComparison2 IUIAnimationPriorityComparison2;
#ifdef __cplusplus
interface IUIAnimationPriorityComparison2;
#endif /* __cplusplus */
#endif

#ifndef __IUIAnimationTransitionLibrary_FWD_DEFINED__
#define __IUIAnimationTransitionLibrary_FWD_DEFINED__
typedef interface IUIAnimationTransitionLibrary IUIAnimationTransitionLibrary;
#ifdef __cplusplus
interface IUIAnimationTransitionLibrary;
#endif /* __cplusplus */
#endif

#ifndef __IUIAnimationTransitionLibrary2_FWD_DEFINED__
#define __IUIAnimationTransitionLibrary2_FWD_DEFINED__
typedef interface IUIAnimationTransitionLibrary2 IUIAnimationTransitionLibrary2;
#ifdef __cplusplus
interface IUIAnimationTransitionLibrary2;
#endif /* __cplusplus */
#endif

#ifndef __IUIAnimationTransitionFactory_FWD_DEFINED__
#define __IUIAnimationTransitionFactory_FWD_DEFINED__
typedef interface IUIAnimationTransitionFactory IUIAnimationTransitionFactory;
#ifdef __cplusplus
interface IUIAnimationTransitionFactory;
#endif /* __cplusplus */
#endif

#ifndef __IUIAnimationInterpolator_FWD_DEFINED__
#define __IUIAnimationInterpolator_FWD_DEFINED__
typedef interface IUIAnimationInterpolator IUIAnimationInterpolator;
#ifdef __cplusplus
interface IUIAnimationInterpolator;
#endif /* __cplusplus */
#endif

#ifndef __IUIAnimationTransitionFactory2_FWD_DEFINED__
#define __IUIAnimationTransitionFactory2_FWD_DEFINED__
typedef interface IUIAnimationTransitionFactory2 IUIAnimationTransitionFactory2;
#ifdef __cplusplus
interface IUIAnimationTransitionFactory2;
#endif /* __cplusplus */
#endif

#ifndef __IUIAnimationInterpolator2_FWD_DEFINED__
#define __IUIAnimationInterpolator2_FWD_DEFINED__
typedef interface IUIAnimationInterpolator2 IUIAnimationInterpolator2;
#ifdef __cplusplus
interface IUIAnimationInterpolator2;
#endif /* __cplusplus */
#endif

#ifndef __IUIAnimationPrimitiveInterpolation_FWD_DEFINED__
#define __IUIAnimationPrimitiveInterpolation_FWD_DEFINED__
typedef interface IUIAnimationPrimitiveInterpolation IUIAnimationPrimitiveInterpolation;
#ifdef __cplusplus
interface IUIAnimationPrimitiveInterpolation;
#endif /* __cplusplus */
#endif

#ifndef __IUIAnimationTimer_FWD_DEFINED__
#define __IUIAnimationTimer_FWD_DEFINED__
typedef interface IUIAnimationTimer IUIAnimationTimer;
#ifdef __cplusplus
interface IUIAnimationTimer;
#endif /* __cplusplus */
#endif

#ifndef __IUIAnimationTimerUpdateHandler_FWD_DEFINED__
#define __IUIAnimationTimerUpdateHandler_FWD_DEFINED__
typedef interface IUIAnimationTimerUpdateHandler IUIAnimationTimerUpdateHandler;
#ifdef __cplusplus
interface IUIAnimationTimerUpdateHandler;
#endif /* __cplusplus */
#endif

#ifndef __IUIAnimationTimerClientEventHandler_FWD_DEFINED__
#define __IUIAnimationTimerClientEventHandler_FWD_DEFINED__
typedef interface IUIAnimationTimerClientEventHandler IUIAnimationTimerClientEventHandler;
#ifdef __cplusplus
interface IUIAnimationTimerClientEventHandler;
#endif /* __cplusplus */
#endif

#ifndef __IUIAnimationTimerEventHandler_FWD_DEFINED__
#define __IUIAnimationTimerEventHandler_FWD_DEFINED__
typedef interface IUIAnimationTimerEventHandler IUIAnimationTimerEventHandler;
#ifdef __cplusplus
interface IUIAnimationTimerEventHandler;
#endif /* __cplusplus */
#endif

/* Headers for imported files */

#include <unknwn.h>

#ifdef __cplusplus
extern "C" {
#endif

#ifndef __IUIAnimationManager_FWD_DEFINED__
#define __IUIAnimationManager_FWD_DEFINED__
typedef interface IUIAnimationManager IUIAnimationManager;
#ifdef __cplusplus
interface IUIAnimationManager;
#endif /* __cplusplus */
#endif

#ifndef __IUIAnimationVariable_FWD_DEFINED__
#define __IUIAnimationVariable_FWD_DEFINED__
typedef interface IUIAnimationVariable IUIAnimationVariable;
#ifdef __cplusplus
interface IUIAnimationVariable;
#endif /* __cplusplus */
#endif

#ifndef __IUIAnimationStoryboard_FWD_DEFINED__
#define __IUIAnimationStoryboard_FWD_DEFINED__
typedef interface IUIAnimationStoryboard IUIAnimationStoryboard;
#ifdef __cplusplus
interface IUIAnimationStoryboard;
#endif /* __cplusplus */
#endif

#ifndef __IUIAnimationTransition_FWD_DEFINED__
#define __IUIAnimationTransition_FWD_DEFINED__
typedef interface IUIAnimationTransition IUIAnimationTransition;
#ifdef __cplusplus
interface IUIAnimationTransition;
#endif /* __cplusplus */
#endif

#ifndef __IUIAnimationStoryboardEventHandler_FWD_DEFINED__
#define __IUIAnimationStoryboardEventHandler_FWD_DEFINED__
typedef interface IUIAnimationStoryboardEventHandler IUIAnimationStoryboardEventHandler;
#ifdef __cplusplus
interface IUIAnimationStoryboardEventHandler;
#endif /* __cplusplus */
#endif

#ifndef __IUIAnimationVariableChangeHandler_FWD_DEFINED__
#define __IUIAnimationVariableChangeHandler_FWD_DEFINED__
typedef interface IUIAnimationVariableChangeHandler IUIAnimationVariableChangeHandler;
#ifdef __cplusplus
interface IUIAnimationVariableChangeHandler;
#endif /* __cplusplus */
#endif

#ifndef __IUIAnimationVariableIntegerChangeHandler_FWD_DEFINED__
#define __IUIAnimationVariableIntegerChangeHandler_FWD_DEFINED__
typedef interface IUIAnimationVariableIntegerChangeHandler IUIAnimationVariableIntegerChangeHandler;
#ifdef __cplusplus
interface IUIAnimationVariableIntegerChangeHandler;
#endif /* __cplusplus */
#endif

#ifndef __IUIAnimationManagerEventHandler_FWD_DEFINED__
#define __IUIAnimationManagerEventHandler_FWD_DEFINED__
typedef interface IUIAnimationManagerEventHandler IUIAnimationManagerEventHandler;
#ifdef __cplusplus
interface IUIAnimationManagerEventHandler;
#endif /* __cplusplus */
#endif

#ifndef __IUIAnimationPriorityComparison_FWD_DEFINED__
#define __IUIAnimationPriorityComparison_FWD_DEFINED__
typedef interface IUIAnimationPriorityComparison IUIAnimationPriorityComparison;
#ifdef __cplusplus
interface IUIAnimationPriorityComparison;
#endif /* __cplusplus */
#endif

#ifndef __IUIAnimationManager2_FWD_DEFINED__
#define __IUIAnimationManager2_FWD_DEFINED__
typedef interface IUIAnimationManager2 IUIAnimationManager2;
#ifdef __cplusplus
interface IUIAnimationManager2;
#endif /* __cplusplus */
#endif

#ifndef __IUIAnimationVariable2_FWD_DEFINED__
#define __IUIAnimationVariable2_FWD_DEFINED__
typedef interface IUIAnimationVariable2 IUIAnimationVariable2;
#ifdef __cplusplus
interface IUIAnimationVariable2;
#endif /* __cplusplus */
#endif

#ifndef __IDCompositionAnimation_FWD_DEFINED__
#define __IDCompositionAnimation_FWD_DEFINED__
typedef interface IDCompositionAnimation IDCompositionAnimation;
#ifdef __cplusplus
interface IDCompositionAnimation;
#endif /* __cplusplus */
#endif

#ifndef __IUIAnimationStoryboard2_FWD_DEFINED__
#define __IUIAnimationStoryboard2_FWD_DEFINED__
typedef interface IUIAnimationStoryboard2 IUIAnimationStoryboard2;
#ifdef __cplusplus
interface IUIAnimationStoryboard2;
#endif /* __cplusplus */
#endif

#ifndef __IUIAnimationTransition2_FWD_DEFINED__
#define __IUIAnimationTransition2_FWD_DEFINED__
typedef interface IUIAnimationTransition2 IUIAnimationTransition2;
#ifdef __cplusplus
interface IUIAnimationTransition2;
#endif /* __cplusplus */
#endif

#ifndef __IUIAnimationLoopIterationChangeHandler2_FWD_DEFINED__
#define __IUIAnimationLoopIterationChangeHandler2_FWD_DEFINED__
typedef interface IUIAnimationLoopIterationChangeHandler2 IUIAnimationLoopIterationChangeHandler2;
#ifdef __cplusplus
interface IUIAnimationLoopIterationChangeHandler2;
#endif /* __cplusplus */
#endif

#ifndef __IUIAnimationStoryboardEventHandler2_FWD_DEFINED__
#define __IUIAnimationStoryboardEventHandler2_FWD_DEFINED__
typedef interface IUIAnimationStoryboardEventHandler2 IUIAnimationStoryboardEventHandler2;
#ifdef __cplusplus
interface IUIAnimationStoryboardEventHandler2;
#endif /* __cplusplus */
#endif

#ifndef __IUIAnimationVariableChangeHandler2_FWD_DEFINED__
#define __IUIAnimationVariableChangeHandler2_FWD_DEFINED__
typedef interface IUIAnimationVariableChangeHandler2 IUIAnimationVariableChangeHandler2;
#ifdef __cplusplus
interface IUIAnimationVariableChangeHandler2;
#endif /* __cplusplus */
#endif

#ifndef __IUIAnimationVariableIntegerChangeHandler2_FWD_DEFINED__
#define __IUIAnimationVariableIntegerChangeHandler2_FWD_DEFINED__
typedef interface IUIAnimationVariableIntegerChangeHandler2 IUIAnimationVariableIntegerChangeHandler2;
#ifdef __cplusplus
interface IUIAnimationVariableIntegerChangeHandler2;
#endif /* __cplusplus */
#endif

#ifndef __IUIAnimationVariableCurveChangeHandler2_FWD_DEFINED__
#define __IUIAnimationVariableCurveChangeHandler2_FWD_DEFINED__
typedef interface IUIAnimationVariableCurveChangeHandler2 IUIAnimationVariableCurveChangeHandler2;
#ifdef __cplusplus
interface IUIAnimationVariableCurveChangeHandler2;
#endif /* __cplusplus */
#endif

#ifndef __IUIAnimationManagerEventHandler2_FWD_DEFINED__
#define __IUIAnimationManagerEventHandler2_FWD_DEFINED__
typedef interface IUIAnimationManagerEventHandler2 IUIAnimationManagerEventHandler2;
#ifdef __cplusplus
interface IUIAnimationManagerEventHandler2;
#endif /* __cplusplus */
#endif

#ifndef __IUIAnimationPriorityComparison2_FWD_DEFINED__
#define __IUIAnimationPriorityComparison2_FWD_DEFINED__
typedef interface IUIAnimationPriorityComparison2 IUIAnimationPriorityComparison2;
#ifdef __cplusplus
interface IUIAnimationPriorityComparison2;
#endif /* __cplusplus */
#endif

#ifndef __IUIAnimationTransitionLibrary_FWD_DEFINED__
#define __IUIAnimationTransitionLibrary_FWD_DEFINED__
typedef interface IUIAnimationTransitionLibrary IUIAnimationTransitionLibrary;
#ifdef __cplusplus
interface IUIAnimationTransitionLibrary;
#endif /* __cplusplus */
#endif

#ifndef __IUIAnimationTransitionLibrary2_FWD_DEFINED__
#define __IUIAnimationTransitionLibrary2_FWD_DEFINED__
typedef interface IUIAnimationTransitionLibrary2 IUIAnimationTransitionLibrary2;
#ifdef __cplusplus
interface IUIAnimationTransitionLibrary2;
#endif /* __cplusplus */
#endif

#ifndef __IUIAnimationTransitionFactory_FWD_DEFINED__
#define __IUIAnimationTransitionFactory_FWD_DEFINED__
typedef interface IUIAnimationTransitionFactory IUIAnimationTransitionFactory;
#ifdef __cplusplus
interface IUIAnimationTransitionFactory;
#endif /* __cplusplus */
#endif

#ifndef __IUIAnimationInterpolator_FWD_DEFINED__
#define __IUIAnimationInterpolator_FWD_DEFINED__
typedef interface IUIAnimationInterpolator IUIAnimationInterpolator;
#ifdef __cplusplus
interface IUIAnimationInterpolator;
#endif /* __cplusplus */
#endif

#ifndef __IUIAnimationTransitionFactory2_FWD_DEFINED__
#define __IUIAnimationTransitionFactory2_FWD_DEFINED__
typedef interface IUIAnimationTransitionFactory2 IUIAnimationTransitionFactory2;
#ifdef __cplusplus
interface IUIAnimationTransitionFactory2;
#endif /* __cplusplus */
#endif

#ifndef __IUIAnimationInterpolator2_FWD_DEFINED__
#define __IUIAnimationInterpolator2_FWD_DEFINED__
typedef interface IUIAnimationInterpolator2 IUIAnimationInterpolator2;
#ifdef __cplusplus
interface IUIAnimationInterpolator2;
#endif /* __cplusplus */
#endif

#ifndef __IUIAnimationPrimitiveInterpolation_FWD_DEFINED__
#define __IUIAnimationPrimitiveInterpolation_FWD_DEFINED__
typedef interface IUIAnimationPrimitiveInterpolation IUIAnimationPrimitiveInterpolation;
#ifdef __cplusplus
interface IUIAnimationPrimitiveInterpolation;
#endif /* __cplusplus */
#endif

#ifndef __IUIAnimationTimer_FWD_DEFINED__
#define __IUIAnimationTimer_FWD_DEFINED__
typedef interface IUIAnimationTimer IUIAnimationTimer;
#ifdef __cplusplus
interface IUIAnimationTimer;
#endif /* __cplusplus */
#endif

#ifndef __IUIAnimationTimerUpdateHandler_FWD_DEFINED__
#define __IUIAnimationTimerUpdateHandler_FWD_DEFINED__
typedef interface IUIAnimationTimerUpdateHandler IUIAnimationTimerUpdateHandler;
#ifdef __cplusplus
interface IUIAnimationTimerUpdateHandler;
#endif /* __cplusplus */
#endif

#ifndef __IUIAnimationTimerClientEventHandler_FWD_DEFINED__
#define __IUIAnimationTimerClientEventHandler_FWD_DEFINED__
typedef interface IUIAnimationTimerClientEventHandler IUIAnimationTimerClientEventHandler;
#ifdef __cplusplus
interface IUIAnimationTimerClientEventHandler;
#endif /* __cplusplus */
#endif

#ifndef __IUIAnimationTimerEventHandler_FWD_DEFINED__
#define __IUIAnimationTimerEventHandler_FWD_DEFINED__
typedef interface IUIAnimationTimerEventHandler IUIAnimationTimerEventHandler;
#ifdef __cplusplus
interface IUIAnimationTimerEventHandler;
#endif /* __cplusplus */
#endif

typedef DOUBLE UI_ANIMATION_SECONDS;
typedef enum __WIDL_uianimation_generated_name_00000002 {
    UI_ANIMATION_SCHEDULING_UNEXPECTED_FAILURE = 0,
    UI_ANIMATION_SCHEDULING_INSUFFICIENT_PRIORITY = 1,
    UI_ANIMATION_SCHEDULING_ALREADY_SCHEDULED = 2,
    UI_ANIMATION_SCHEDULING_SUCCEEDED = 3,
    UI_ANIMATION_SCHEDULING_DEFERRED = 4
} UI_ANIMATION_SCHEDULING_RESULT;
typedef enum __WIDL_uianimation_generated_name_00000003 {
    UI_ANIMATION_STORYBOARD_BUILDING = 0,
    UI_ANIMATION_STORYBOARD_SCHEDULED = 1,
    UI_ANIMATION_STORYBOARD_CANCELLED = 2,
    UI_ANIMATION_STORYBOARD_PLAYING = 3,
    UI_ANIMATION_STORYBOARD_TRUNCATED = 4,
    UI_ANIMATION_STORYBOARD_FINISHED = 5,
    UI_ANIMATION_STORYBOARD_READY = 6,
    UI_ANIMATION_STORYBOARD_INSUFFICIENT_PRIORITY = 7
} UI_ANIMATION_STORYBOARD_STATUS;
typedef enum __WIDL_uianimation_generated_name_00000004 {
    UI_ANIMATION_ROUNDING_NEAREST = 0,
    UI_ANIMATION_ROUNDING_FLOOR = 1,
    UI_ANIMATION_ROUNDING_CEILING = 2
} UI_ANIMATION_ROUNDING_MODE;
typedef enum __WIDL_uianimation_generated_name_00000005 {
    UI_ANIMATION_UPDATE_NO_CHANGE = 0,
    UI_ANIMATION_UPDATE_VARIABLES_CHANGED = 1
} UI_ANIMATION_UPDATE_RESULT;
typedef enum __WIDL_uianimation_generated_name_00000006 {
    UI_ANIMATION_MANAGER_IDLE = 0,
    UI_ANIMATION_MANAGER_BUSY = 1
} UI_ANIMATION_MANAGER_STATUS;
typedef enum __WIDL_uianimation_generated_name_00000007 {
    UI_ANIMATION_MODE_DISABLED = 0,
    UI_ANIMATION_MODE_SYSTEM_DEFAULT = 1,
    UI_ANIMATION_MODE_ENABLED = 2
} UI_ANIMATION_MODE;
typedef enum __WIDL_uianimation_generated_name_00000008 {
    UI_ANIMATION_PRIORITY_EFFECT_FAILURE = 0,
    UI_ANIMATION_PRIORITY_EFFECT_DELAY = 1
} UI_ANIMATION_PRIORITY_EFFECT;
typedef enum __WIDL_uianimation_generated_name_00000009 {
    UI_ANIMATION_REPEAT_MODE_NORMAL = 0,
    UI_ANIMATION_REPEAT_MODE_ALTERNATE = 1
} UI_ANIMATION_REPEAT_MODE;
typedef enum __WIDL_uianimation_generated_name_0000000A {
    UI_ANIMATION_SLOPE_INCREASING = 0,
    UI_ANIMATION_SLOPE_DECREASING = 1
} UI_ANIMATION_SLOPE;
typedef enum __WIDL_uianimation_generated_name_0000000B {
    UI_ANIMATION_DEPENDENCY_NONE = 0,
    UI_ANIMATION_DEPENDENCY_INTERMEDIATE_VALUES = 0x1,
    UI_ANIMATION_DEPENDENCY_FINAL_VALUE = 0x2,
    UI_ANIMATION_DEPENDENCY_FINAL_VELOCITY = 0x4,
    UI_ANIMATION_DEPENDENCY_DURATION = 0x8
} UI_ANIMATION_DEPENDENCIES;
typedef enum __WIDL_uianimation_generated_name_0000000C {
    UI_ANIMATION_TIMER_CLIENT_IDLE = 0,
    UI_ANIMATION_TIMER_CLIENT_BUSY = 1
} UI_ANIMATION_TIMER_CLIENT_STATUS;
typedef enum __WIDL_uianimation_generated_name_0000000D {
    UI_ANIMATION_IDLE_BEHAVIOR_CONTINUE = 0,
    UI_ANIMATION_IDLE_BEHAVIOR_DISABLE = 1
} UI_ANIMATION_IDLE_BEHAVIOR;
typedef struct __WIDL_uianimation_generated_name_0000000E {
    int _;
} *UI_ANIMATION_KEYFRAME;
#define UI_ANIMATION_KEYFRAME_STORYBOARD_START ((UI_ANIMATION_KEYFRAME)-1)

#define UI_ANIMATION_REPEAT_INDEFINITELY (-1)

#define UI_ANIMATION_REPEAT_INDEFINITELY_CONCLUDE_AT_END (UI_ANIMATION_REPEAT_INDEFINITELY)

#define UI_ANIMATION_REPEAT_INDEFINITELY_CONCLUDE_AT_START (-2)


DEFINE_GUID(LIBID_uianimation, 0x44ca24db, 0x1a92, 0x4149, 0xba,0xb5, 0xfb,0x14,0xd6,0x4b,0x40,0x1e);

/*****************************************************************************
 * UIAnimationManager coclass
 */

DEFINE_GUID(CLSID_UIAnimationManager, 0x4c1fc63a, 0x695c, 0x47e8, 0xa3,0x39, 0x1a,0x19,0x4b,0xe3,0xd0,0xb8);

#ifdef __cplusplus
class DECLSPEC_UUID("4c1fc63a-695c-47e8-a339-1a194be3d0b8") UIAnimationManager;
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(UIAnimationManager, 0x4c1fc63a, 0x695c, 0x47e8, 0xa3,0x39, 0x1a,0x19,0x4b,0xe3,0xd0,0xb8)
#endif
#endif

/*****************************************************************************
 * UIAnimationManager2 coclass
 */

DEFINE_GUID(CLSID_UIAnimationManager2, 0xd25d8842, 0x8884, 0x4a4a, 0xb3,0x21, 0x09,0x13,0x14,0x37,0x9b,0xdd);

#ifdef __cplusplus
class DECLSPEC_UUID("d25d8842-8884-4a4a-b321-091314379bdd") UIAnimationManager2;
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(UIAnimationManager2, 0xd25d8842, 0x8884, 0x4a4a, 0xb3,0x21, 0x09,0x13,0x14,0x37,0x9b,0xdd)
#endif
#endif

/*****************************************************************************
 * UIAnimationTransitionLibrary coclass
 */

DEFINE_GUID(CLSID_UIAnimationTransitionLibrary, 0x1d6322ad, 0xaa85, 0x4ef5, 0xa8,0x28, 0x86,0xd7,0x10,0x67,0xd1,0x45);

#ifdef __cplusplus
class DECLSPEC_UUID("1d6322ad-aa85-4ef5-a828-86d71067d145") UIAnimationTransitionLibrary;
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(UIAnimationTransitionLibrary, 0x1d6322ad, 0xaa85, 0x4ef5, 0xa8,0x28, 0x86,0xd7,0x10,0x67,0xd1,0x45)
#endif
#endif

/*****************************************************************************
 * UIAnimationTransitionLibrary2 coclass
 */

DEFINE_GUID(CLSID_UIAnimationTransitionLibrary2, 0x812f944a, 0xc5c8, 0x4cd9, 0xb0,0xa6, 0xb3,0xda,0x80,0x2f,0x22,0x8d);

#ifdef __cplusplus
class DECLSPEC_UUID("812f944a-c5c8-4cd9-b0a6-b3da802f228d") UIAnimationTransitionLibrary2;
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(UIAnimationTransitionLibrary2, 0x812f944a, 0xc5c8, 0x4cd9, 0xb0,0xa6, 0xb3,0xda,0x80,0x2f,0x22,0x8d)
#endif
#endif

/*****************************************************************************
 * UIAnimationTransitionFactory coclass
 */

DEFINE_GUID(CLSID_UIAnimationTransitionFactory, 0x8a9b1cdd, 0xfcd7, 0x419c, 0x8b,0x44, 0x42,0xfd,0x17,0xdb,0x18,0x87);

#ifdef __cplusplus
class DECLSPEC_UUID("8a9b1cdd-fcd7-419c-8b44-42fd17db1887") UIAnimationTransitionFactory;
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(UIAnimationTransitionFactory, 0x8a9b1cdd, 0xfcd7, 0x419c, 0x8b,0x44, 0x42,0xfd,0x17,0xdb,0x18,0x87)
#endif
#endif

/*****************************************************************************
 * UIAnimationTransitionFactory2 coclass
 */

DEFINE_GUID(CLSID_UIAnimationTransitionFactory2, 0x84302f97, 0x7f7b, 0x4040, 0xb1,0x90, 0x72,0xac,0x9d,0x18,0xe4,0x20);

#ifdef __cplusplus
class DECLSPEC_UUID("84302f97-7f7b-4040-b190-72ac9d18e420") UIAnimationTransitionFactory2;
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(UIAnimationTransitionFactory2, 0x84302f97, 0x7f7b, 0x4040, 0xb1,0x90, 0x72,0xac,0x9d,0x18,0xe4,0x20)
#endif
#endif

/*****************************************************************************
 * UIAnimationTimer coclass
 */

DEFINE_GUID(CLSID_UIAnimationTimer, 0xbfcd4a0c, 0x06b6, 0x4384, 0xb7,0x68, 0x0d,0xaa,0x79,0x2c,0x38,0x0e);

#ifdef __cplusplus
class DECLSPEC_UUID("bfcd4a0c-06b6-4384-b768-0daa792c380e") UIAnimationTimer;
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(UIAnimationTimer, 0xbfcd4a0c, 0x06b6, 0x4384, 0xb7,0x68, 0x0d,0xaa,0x79,0x2c,0x38,0x0e)
#endif
#endif

/*****************************************************************************
 * IUIAnimationManager interface
 */
#ifndef __IUIAnimationManager_INTERFACE_DEFINED__
#define __IUIAnimationManager_INTERFACE_DEFINED__

DEFINE_GUID(IID_IUIAnimationManager, 0x9169896c, 0xac8d, 0x4e7d, 0x94,0xe5, 0x67,0xfa,0x4d,0xc2,0xf2,0xe8);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("9169896c-ac8d-4e7d-94e5-67fa4dc2f2e8")
IUIAnimationManager : public IUnknown
{
    virtual HRESULT STDMETHODCALLTYPE CreateAnimationVariable(
        double initialValue,
        IUIAnimationVariable **variable) = 0;

    virtual HRESULT STDMETHODCALLTYPE ScheduleTransition(
        IUIAnimationVariable *variable,
        IUIAnimationTransition *transition,
        double timeNow) = 0;

    virtual HRESULT STDMETHODCALLTYPE CreateStoryboard(
        IUIAnimationStoryboard **storyboard) = 0;

    virtual HRESULT STDMETHODCALLTYPE FinishAllStoryboards(
        double completionDeadline) = 0;

    virtual HRESULT STDMETHODCALLTYPE AbandonAllStoryboards(
        ) = 0;

    virtual HRESULT STDMETHODCALLTYPE Update(
        double timeNow,
        UI_ANIMATION_UPDATE_RESULT *updateResult = 0) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetVariableFromTag(
        IUnknown *object,
        UINT32 id,
        IUIAnimationVariable **variable) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetStoryboardFromTag(
        IUnknown *object,
        UINT32 id,
        IUIAnimationStoryboard **storyboard) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetStatus(
        UI_ANIMATION_MANAGER_STATUS *status) = 0;

    virtual HRESULT STDMETHODCALLTYPE SetAnimationMode(
        UI_ANIMATION_MODE mode) = 0;

    virtual HRESULT STDMETHODCALLTYPE Pause(
        ) = 0;

    virtual HRESULT STDMETHODCALLTYPE Resume(
        ) = 0;

    virtual HRESULT STDMETHODCALLTYPE SetManagerEventHandler(
        IUIAnimationManagerEventHandler *handler) = 0;

    virtual HRESULT STDMETHODCALLTYPE SetCancelPriorityComparison(
        IUIAnimationPriorityComparison *comparison) = 0;

    virtual HRESULT STDMETHODCALLTYPE SetTrimPriorityComparison(
        IUIAnimationPriorityComparison *comparison) = 0;

    virtual HRESULT STDMETHODCALLTYPE SetCompressPriorityComparison(
        IUIAnimationPriorityComparison *comparison) = 0;

    virtual HRESULT STDMETHODCALLTYPE SetConcludePriorityComparison(
        IUIAnimationPriorityComparison *comparison) = 0;

    virtual HRESULT STDMETHODCALLTYPE SetDefaultLongestAcceptableDelay(
        double delay) = 0;

    virtual HRESULT STDMETHODCALLTYPE Shutdown(
        ) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IUIAnimationManager, 0x9169896c, 0xac8d, 0x4e7d, 0x94,0xe5, 0x67,0xfa,0x4d,0xc2,0xf2,0xe8)
#endif
#else
typedef struct IUIAnimationManagerVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        IUIAnimationManager *This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        IUIAnimationManager *This);

    ULONG (STDMETHODCALLTYPE *Release)(
        IUIAnimationManager *This);

    /*** IUIAnimationManager methods ***/
    HRESULT (STDMETHODCALLTYPE *CreateAnimationVariable)(
        IUIAnimationManager *This,
        double initialValue,
        IUIAnimationVariable **variable);

    HRESULT (STDMETHODCALLTYPE *ScheduleTransition)(
        IUIAnimationManager *This,
        IUIAnimationVariable *variable,
        IUIAnimationTransition *transition,
        double timeNow);

    HRESULT (STDMETHODCALLTYPE *CreateStoryboard)(
        IUIAnimationManager *This,
        IUIAnimationStoryboard **storyboard);

    HRESULT (STDMETHODCALLTYPE *FinishAllStoryboards)(
        IUIAnimationManager *This,
        double completionDeadline);

    HRESULT (STDMETHODCALLTYPE *AbandonAllStoryboards)(
        IUIAnimationManager *This);

    HRESULT (STDMETHODCALLTYPE *Update)(
        IUIAnimationManager *This,
        double timeNow,
        UI_ANIMATION_UPDATE_RESULT *updateResult);

    HRESULT (STDMETHODCALLTYPE *GetVariableFromTag)(
        IUIAnimationManager *This,
        IUnknown *object,
        UINT32 id,
        IUIAnimationVariable **variable);

    HRESULT (STDMETHODCALLTYPE *GetStoryboardFromTag)(
        IUIAnimationManager *This,
        IUnknown *object,
        UINT32 id,
        IUIAnimationStoryboard **storyboard);

    HRESULT (STDMETHODCALLTYPE *GetStatus)(
        IUIAnimationManager *This,
        UI_ANIMATION_MANAGER_STATUS *status);

    HRESULT (STDMETHODCALLTYPE *SetAnimationMode)(
        IUIAnimationManager *This,
        UI_ANIMATION_MODE mode);

    HRESULT (STDMETHODCALLTYPE *Pause)(
        IUIAnimationManager *This);

    HRESULT (STDMETHODCALLTYPE *Resume)(
        IUIAnimationManager *This);

    HRESULT (STDMETHODCALLTYPE *SetManagerEventHandler)(
        IUIAnimationManager *This,
        IUIAnimationManagerEventHandler *handler);

    HRESULT (STDMETHODCALLTYPE *SetCancelPriorityComparison)(
        IUIAnimationManager *This,
        IUIAnimationPriorityComparison *comparison);

    HRESULT (STDMETHODCALLTYPE *SetTrimPriorityComparison)(
        IUIAnimationManager *This,
        IUIAnimationPriorityComparison *comparison);

    HRESULT (STDMETHODCALLTYPE *SetCompressPriorityComparison)(
        IUIAnimationManager *This,
        IUIAnimationPriorityComparison *comparison);

    HRESULT (STDMETHODCALLTYPE *SetConcludePriorityComparison)(
        IUIAnimationManager *This,
        IUIAnimationPriorityComparison *comparison);

    HRESULT (STDMETHODCALLTYPE *SetDefaultLongestAcceptableDelay)(
        IUIAnimationManager *This,
        double delay);

    HRESULT (STDMETHODCALLTYPE *Shutdown)(
        IUIAnimationManager *This);

    END_INTERFACE
} IUIAnimationManagerVtbl;

interface IUIAnimationManager {
    CONST_VTBL IUIAnimationManagerVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IUIAnimationManager_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IUIAnimationManager_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IUIAnimationManager_Release(This) (This)->lpVtbl->Release(This)
/*** IUIAnimationManager methods ***/
#define IUIAnimationManager_CreateAnimationVariable(This,initialValue,variable) (This)->lpVtbl->CreateAnimationVariable(This,initialValue,variable)
#define IUIAnimationManager_ScheduleTransition(This,variable,transition,timeNow) (This)->lpVtbl->ScheduleTransition(This,variable,transition,timeNow)
#define IUIAnimationManager_CreateStoryboard(This,storyboard) (This)->lpVtbl->CreateStoryboard(This,storyboard)
#define IUIAnimationManager_FinishAllStoryboards(This,completionDeadline) (This)->lpVtbl->FinishAllStoryboards(This,completionDeadline)
#define IUIAnimationManager_AbandonAllStoryboards(This) (This)->lpVtbl->AbandonAllStoryboards(This)
#define IUIAnimationManager_Update(This,timeNow,updateResult) (This)->lpVtbl->Update(This,timeNow,updateResult)
#define IUIAnimationManager_GetVariableFromTag(This,object,id,variable) (This)->lpVtbl->GetVariableFromTag(This,object,id,variable)
#define IUIAnimationManager_GetStoryboardFromTag(This,object,id,storyboard) (This)->lpVtbl->GetStoryboardFromTag(This,object,id,storyboard)
#define IUIAnimationManager_GetStatus(This,status) (This)->lpVtbl->GetStatus(This,status)
#define IUIAnimationManager_SetAnimationMode(This,mode) (This)->lpVtbl->SetAnimationMode(This,mode)
#define IUIAnimationManager_Pause(This) (This)->lpVtbl->Pause(This)
#define IUIAnimationManager_Resume(This) (This)->lpVtbl->Resume(This)
#define IUIAnimationManager_SetManagerEventHandler(This,handler) (This)->lpVtbl->SetManagerEventHandler(This,handler)
#define IUIAnimationManager_SetCancelPriorityComparison(This,comparison) (This)->lpVtbl->SetCancelPriorityComparison(This,comparison)
#define IUIAnimationManager_SetTrimPriorityComparison(This,comparison) (This)->lpVtbl->SetTrimPriorityComparison(This,comparison)
#define IUIAnimationManager_SetCompressPriorityComparison(This,comparison) (This)->lpVtbl->SetCompressPriorityComparison(This,comparison)
#define IUIAnimationManager_SetConcludePriorityComparison(This,comparison) (This)->lpVtbl->SetConcludePriorityComparison(This,comparison)
#define IUIAnimationManager_SetDefaultLongestAcceptableDelay(This,delay) (This)->lpVtbl->SetDefaultLongestAcceptableDelay(This,delay)
#define IUIAnimationManager_Shutdown(This) (This)->lpVtbl->Shutdown(This)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IUIAnimationManager_QueryInterface(IUIAnimationManager* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IUIAnimationManager_AddRef(IUIAnimationManager* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IUIAnimationManager_Release(IUIAnimationManager* This) {
    return This->lpVtbl->Release(This);
}
/*** IUIAnimationManager methods ***/
static FORCEINLINE HRESULT IUIAnimationManager_CreateAnimationVariable(IUIAnimationManager* This,double initialValue,IUIAnimationVariable **variable) {
    return This->lpVtbl->CreateAnimationVariable(This,initialValue,variable);
}
static FORCEINLINE HRESULT IUIAnimationManager_ScheduleTransition(IUIAnimationManager* This,IUIAnimationVariable *variable,IUIAnimationTransition *transition,double timeNow) {
    return This->lpVtbl->ScheduleTransition(This,variable,transition,timeNow);
}
static FORCEINLINE HRESULT IUIAnimationManager_CreateStoryboard(IUIAnimationManager* This,IUIAnimationStoryboard **storyboard) {
    return This->lpVtbl->CreateStoryboard(This,storyboard);
}
static FORCEINLINE HRESULT IUIAnimationManager_FinishAllStoryboards(IUIAnimationManager* This,double completionDeadline) {
    return This->lpVtbl->FinishAllStoryboards(This,completionDeadline);
}
static FORCEINLINE HRESULT IUIAnimationManager_AbandonAllStoryboards(IUIAnimationManager* This) {
    return This->lpVtbl->AbandonAllStoryboards(This);
}
static FORCEINLINE HRESULT IUIAnimationManager_Update(IUIAnimationManager* This,double timeNow,UI_ANIMATION_UPDATE_RESULT *updateResult) {
    return This->lpVtbl->Update(This,timeNow,updateResult);
}
static FORCEINLINE HRESULT IUIAnimationManager_GetVariableFromTag(IUIAnimationManager* This,IUnknown *object,UINT32 id,IUIAnimationVariable **variable) {
    return This->lpVtbl->GetVariableFromTag(This,object,id,variable);
}
static FORCEINLINE HRESULT IUIAnimationManager_GetStoryboardFromTag(IUIAnimationManager* This,IUnknown *object,UINT32 id,IUIAnimationStoryboard **storyboard) {
    return This->lpVtbl->GetStoryboardFromTag(This,object,id,storyboard);
}
static FORCEINLINE HRESULT IUIAnimationManager_GetStatus(IUIAnimationManager* This,UI_ANIMATION_MANAGER_STATUS *status) {
    return This->lpVtbl->GetStatus(This,status);
}
static FORCEINLINE HRESULT IUIAnimationManager_SetAnimationMode(IUIAnimationManager* This,UI_ANIMATION_MODE mode) {
    return This->lpVtbl->SetAnimationMode(This,mode);
}
static FORCEINLINE HRESULT IUIAnimationManager_Pause(IUIAnimationManager* This) {
    return This->lpVtbl->Pause(This);
}
static FORCEINLINE HRESULT IUIAnimationManager_Resume(IUIAnimationManager* This) {
    return This->lpVtbl->Resume(This);
}
static FORCEINLINE HRESULT IUIAnimationManager_SetManagerEventHandler(IUIAnimationManager* This,IUIAnimationManagerEventHandler *handler) {
    return This->lpVtbl->SetManagerEventHandler(This,handler);
}
static FORCEINLINE HRESULT IUIAnimationManager_SetCancelPriorityComparison(IUIAnimationManager* This,IUIAnimationPriorityComparison *comparison) {
    return This->lpVtbl->SetCancelPriorityComparison(This,comparison);
}
static FORCEINLINE HRESULT IUIAnimationManager_SetTrimPriorityComparison(IUIAnimationManager* This,IUIAnimationPriorityComparison *comparison) {
    return This->lpVtbl->SetTrimPriorityComparison(This,comparison);
}
static FORCEINLINE HRESULT IUIAnimationManager_SetCompressPriorityComparison(IUIAnimationManager* This,IUIAnimationPriorityComparison *comparison) {
    return This->lpVtbl->SetCompressPriorityComparison(This,comparison);
}
static FORCEINLINE HRESULT IUIAnimationManager_SetConcludePriorityComparison(IUIAnimationManager* This,IUIAnimationPriorityComparison *comparison) {
    return This->lpVtbl->SetConcludePriorityComparison(This,comparison);
}
static FORCEINLINE HRESULT IUIAnimationManager_SetDefaultLongestAcceptableDelay(IUIAnimationManager* This,double delay) {
    return This->lpVtbl->SetDefaultLongestAcceptableDelay(This,delay);
}
static FORCEINLINE HRESULT IUIAnimationManager_Shutdown(IUIAnimationManager* This) {
    return This->lpVtbl->Shutdown(This);
}
#endif
#endif

#endif


#endif  /* __IUIAnimationManager_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IUIAnimationVariable interface
 */
#ifndef __IUIAnimationVariable_INTERFACE_DEFINED__
#define __IUIAnimationVariable_INTERFACE_DEFINED__

DEFINE_GUID(IID_IUIAnimationVariable, 0x8ceeb155, 0x2849, 0x4ce5, 0x94,0x48, 0x91,0xff,0x70,0xe1,0xe4,0xd9);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("8ceeb155-2849-4ce5-9448-91ff70e1e4d9")
IUIAnimationVariable : public IUnknown
{
    virtual HRESULT STDMETHODCALLTYPE GetValue(
        double *value) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetFinalValue(
        double *finalValue) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetPreviousValue(
        double *previousValue) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetIntegerValue(
        int *value) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetFinalIntegerValue(
        int *finalValue) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetPreviousIntegerValue(
        int *previousValue) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetCurrentStoryboard(
        IUIAnimationStoryboard **storyboard) = 0;

    virtual HRESULT STDMETHODCALLTYPE SetLowerBound(
        double bound) = 0;

    virtual HRESULT STDMETHODCALLTYPE SetUpperBound(
        double bound) = 0;

    virtual HRESULT STDMETHODCALLTYPE SetRoundingMode(
        UI_ANIMATION_ROUNDING_MODE mode) = 0;

    virtual HRESULT STDMETHODCALLTYPE SetTag(
        IUnknown *object,
        unsigned int id) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetTag(
        IUnknown **object,
        unsigned int *id) = 0;

    virtual HRESULT STDMETHODCALLTYPE SetVariableChangeHandler(
        IUIAnimationVariableChangeHandler *handler) = 0;

    virtual HRESULT STDMETHODCALLTYPE SetVariableIntegerChangeHandler(
        IUIAnimationVariableIntegerChangeHandler *handler) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IUIAnimationVariable, 0x8ceeb155, 0x2849, 0x4ce5, 0x94,0x48, 0x91,0xff,0x70,0xe1,0xe4,0xd9)
#endif
#else
typedef struct IUIAnimationVariableVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        IUIAnimationVariable *This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        IUIAnimationVariable *This);

    ULONG (STDMETHODCALLTYPE *Release)(
        IUIAnimationVariable *This);

    /*** IUIAnimationVariable methods ***/
    HRESULT (STDMETHODCALLTYPE *GetValue)(
        IUIAnimationVariable *This,
        double *value);

    HRESULT (STDMETHODCALLTYPE *GetFinalValue)(
        IUIAnimationVariable *This,
        double *finalValue);

    HRESULT (STDMETHODCALLTYPE *GetPreviousValue)(
        IUIAnimationVariable *This,
        double *previousValue);

    HRESULT (STDMETHODCALLTYPE *GetIntegerValue)(
        IUIAnimationVariable *This,
        int *value);

    HRESULT (STDMETHODCALLTYPE *GetFinalIntegerValue)(
        IUIAnimationVariable *This,
        int *finalValue);

    HRESULT (STDMETHODCALLTYPE *GetPreviousIntegerValue)(
        IUIAnimationVariable *This,
        int *previousValue);

    HRESULT (STDMETHODCALLTYPE *GetCurrentStoryboard)(
        IUIAnimationVariable *This,
        IUIAnimationStoryboard **storyboard);

    HRESULT (STDMETHODCALLTYPE *SetLowerBound)(
        IUIAnimationVariable *This,
        double bound);

    HRESULT (STDMETHODCALLTYPE *SetUpperBound)(
        IUIAnimationVariable *This,
        double bound);

    HRESULT (STDMETHODCALLTYPE *SetRoundingMode)(
        IUIAnimationVariable *This,
        UI_ANIMATION_ROUNDING_MODE mode);

    HRESULT (STDMETHODCALLTYPE *SetTag)(
        IUIAnimationVariable *This,
        IUnknown *object,
        unsigned int id);

    HRESULT (STDMETHODCALLTYPE *GetTag)(
        IUIAnimationVariable *This,
        IUnknown **object,
        unsigned int *id);

    HRESULT (STDMETHODCALLTYPE *SetVariableChangeHandler)(
        IUIAnimationVariable *This,
        IUIAnimationVariableChangeHandler *handler);

    HRESULT (STDMETHODCALLTYPE *SetVariableIntegerChangeHandler)(
        IUIAnimationVariable *This,
        IUIAnimationVariableIntegerChangeHandler *handler);

    END_INTERFACE
} IUIAnimationVariableVtbl;

interface IUIAnimationVariable {
    CONST_VTBL IUIAnimationVariableVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IUIAnimationVariable_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IUIAnimationVariable_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IUIAnimationVariable_Release(This) (This)->lpVtbl->Release(This)
/*** IUIAnimationVariable methods ***/
#define IUIAnimationVariable_GetValue(This,value) (This)->lpVtbl->GetValue(This,value)
#define IUIAnimationVariable_GetFinalValue(This,finalValue) (This)->lpVtbl->GetFinalValue(This,finalValue)
#define IUIAnimationVariable_GetPreviousValue(This,previousValue) (This)->lpVtbl->GetPreviousValue(This,previousValue)
#define IUIAnimationVariable_GetIntegerValue(This,value) (This)->lpVtbl->GetIntegerValue(This,value)
#define IUIAnimationVariable_GetFinalIntegerValue(This,finalValue) (This)->lpVtbl->GetFinalIntegerValue(This,finalValue)
#define IUIAnimationVariable_GetPreviousIntegerValue(This,previousValue) (This)->lpVtbl->GetPreviousIntegerValue(This,previousValue)
#define IUIAnimationVariable_GetCurrentStoryboard(This,storyboard) (This)->lpVtbl->GetCurrentStoryboard(This,storyboard)
#define IUIAnimationVariable_SetLowerBound(This,bound) (This)->lpVtbl->SetLowerBound(This,bound)
#define IUIAnimationVariable_SetUpperBound(This,bound) (This)->lpVtbl->SetUpperBound(This,bound)
#define IUIAnimationVariable_SetRoundingMode(This,mode) (This)->lpVtbl->SetRoundingMode(This,mode)
#define IUIAnimationVariable_SetTag(This,object,id) (This)->lpVtbl->SetTag(This,object,id)
#define IUIAnimationVariable_GetTag(This,object,id) (This)->lpVtbl->GetTag(This,object,id)
#define IUIAnimationVariable_SetVariableChangeHandler(This,handler) (This)->lpVtbl->SetVariableChangeHandler(This,handler)
#define IUIAnimationVariable_SetVariableIntegerChangeHandler(This,handler) (This)->lpVtbl->SetVariableIntegerChangeHandler(This,handler)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IUIAnimationVariable_QueryInterface(IUIAnimationVariable* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IUIAnimationVariable_AddRef(IUIAnimationVariable* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IUIAnimationVariable_Release(IUIAnimationVariable* This) {
    return This->lpVtbl->Release(This);
}
/*** IUIAnimationVariable methods ***/
static FORCEINLINE HRESULT IUIAnimationVariable_GetValue(IUIAnimationVariable* This,double *value) {
    return This->lpVtbl->GetValue(This,value);
}
static FORCEINLINE HRESULT IUIAnimationVariable_GetFinalValue(IUIAnimationVariable* This,double *finalValue) {
    return This->lpVtbl->GetFinalValue(This,finalValue);
}
static FORCEINLINE HRESULT IUIAnimationVariable_GetPreviousValue(IUIAnimationVariable* This,double *previousValue) {
    return This->lpVtbl->GetPreviousValue(This,previousValue);
}
static FORCEINLINE HRESULT IUIAnimationVariable_GetIntegerValue(IUIAnimationVariable* This,int *value) {
    return This->lpVtbl->GetIntegerValue(This,value);
}
static FORCEINLINE HRESULT IUIAnimationVariable_GetFinalIntegerValue(IUIAnimationVariable* This,int *finalValue) {
    return This->lpVtbl->GetFinalIntegerValue(This,finalValue);
}
static FORCEINLINE HRESULT IUIAnimationVariable_GetPreviousIntegerValue(IUIAnimationVariable* This,int *previousValue) {
    return This->lpVtbl->GetPreviousIntegerValue(This,previousValue);
}
static FORCEINLINE HRESULT IUIAnimationVariable_GetCurrentStoryboard(IUIAnimationVariable* This,IUIAnimationStoryboard **storyboard) {
    return This->lpVtbl->GetCurrentStoryboard(This,storyboard);
}
static FORCEINLINE HRESULT IUIAnimationVariable_SetLowerBound(IUIAnimationVariable* This,double bound) {
    return This->lpVtbl->SetLowerBound(This,bound);
}
static FORCEINLINE HRESULT IUIAnimationVariable_SetUpperBound(IUIAnimationVariable* This,double bound) {
    return This->lpVtbl->SetUpperBound(This,bound);
}
static FORCEINLINE HRESULT IUIAnimationVariable_SetRoundingMode(IUIAnimationVariable* This,UI_ANIMATION_ROUNDING_MODE mode) {
    return This->lpVtbl->SetRoundingMode(This,mode);
}
static FORCEINLINE HRESULT IUIAnimationVariable_SetTag(IUIAnimationVariable* This,IUnknown *object,unsigned int id) {
    return This->lpVtbl->SetTag(This,object,id);
}
static FORCEINLINE HRESULT IUIAnimationVariable_GetTag(IUIAnimationVariable* This,IUnknown **object,unsigned int *id) {
    return This->lpVtbl->GetTag(This,object,id);
}
static FORCEINLINE HRESULT IUIAnimationVariable_SetVariableChangeHandler(IUIAnimationVariable* This,IUIAnimationVariableChangeHandler *handler) {
    return This->lpVtbl->SetVariableChangeHandler(This,handler);
}
static FORCEINLINE HRESULT IUIAnimationVariable_SetVariableIntegerChangeHandler(IUIAnimationVariable* This,IUIAnimationVariableIntegerChangeHandler *handler) {
    return This->lpVtbl->SetVariableIntegerChangeHandler(This,handler);
}
#endif
#endif

#endif


#endif  /* __IUIAnimationVariable_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IUIAnimationStoryboard interface
 */
#ifndef __IUIAnimationStoryboard_INTERFACE_DEFINED__
#define __IUIAnimationStoryboard_INTERFACE_DEFINED__

DEFINE_GUID(IID_IUIAnimationStoryboard, 0xa8ff128f, 0x9bf9, 0x4af1, 0x9e,0x67, 0xe5,0xe4,0x10,0xde,0xfb,0x84);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("a8ff128f-9bf9-4af1-9e67-e5e410defb84")
IUIAnimationStoryboard : public IUnknown
{
    virtual HRESULT STDMETHODCALLTYPE AddTransition(
        IUIAnimationVariable *variable,
        IUIAnimationTransition *transition) = 0;

    virtual HRESULT STDMETHODCALLTYPE AddKeyframeAtOffset(
        UI_ANIMATION_KEYFRAME existingKeyframe,
        double offset,
        UI_ANIMATION_KEYFRAME *keyframe) = 0;

    virtual HRESULT STDMETHODCALLTYPE AddKeyframeAfterTransition(
        IUIAnimationTransition *transition,
        UI_ANIMATION_KEYFRAME *keyframe) = 0;

    virtual HRESULT STDMETHODCALLTYPE AddTransitionAtKeyframe(
        IUIAnimationVariable *variable,
        IUIAnimationTransition *transition,
        UI_ANIMATION_KEYFRAME startKeyframe) = 0;

    virtual HRESULT STDMETHODCALLTYPE AddTransitionBetweenKeyframes(
        IUIAnimationVariable *variable,
        IUIAnimationTransition *transition,
        UI_ANIMATION_KEYFRAME startKeyframe,
        UI_ANIMATION_KEYFRAME endKeyframe) = 0;

    virtual HRESULT STDMETHODCALLTYPE RepeatBetweenKeyframes(
        UI_ANIMATION_KEYFRAME startKeyframe,
        UI_ANIMATION_KEYFRAME endKeyframe,
        int repetitionCount) = 0;

    virtual HRESULT STDMETHODCALLTYPE HoldVariable(
        IUIAnimationVariable *variable) = 0;

    virtual HRESULT STDMETHODCALLTYPE SetLongestAcceptableDelay(
        double delay) = 0;

    virtual HRESULT STDMETHODCALLTYPE Schedule(
        double timeNow,
        UI_ANIMATION_SCHEDULING_RESULT *schedulingResult = 0) = 0;

    virtual HRESULT STDMETHODCALLTYPE Conclude(
        ) = 0;

    virtual HRESULT STDMETHODCALLTYPE Finish(
        double completionDeadline) = 0;

    virtual HRESULT STDMETHODCALLTYPE Abandon(
        ) = 0;

    virtual HRESULT STDMETHODCALLTYPE SetTag(
        IUnknown *object,
        unsigned int id) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetTag(
        IUnknown **object,
        unsigned int *id) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetStatus(
        UI_ANIMATION_STORYBOARD_STATUS *status) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetElapsedTime(
        double *elapsedTime) = 0;

    virtual HRESULT STDMETHODCALLTYPE SetStoryboardEventHandler(
        IUIAnimationStoryboardEventHandler *handler) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IUIAnimationStoryboard, 0xa8ff128f, 0x9bf9, 0x4af1, 0x9e,0x67, 0xe5,0xe4,0x10,0xde,0xfb,0x84)
#endif
#else
typedef struct IUIAnimationStoryboardVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        IUIAnimationStoryboard *This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        IUIAnimationStoryboard *This);

    ULONG (STDMETHODCALLTYPE *Release)(
        IUIAnimationStoryboard *This);

    /*** IUIAnimationStoryboard methods ***/
    HRESULT (STDMETHODCALLTYPE *AddTransition)(
        IUIAnimationStoryboard *This,
        IUIAnimationVariable *variable,
        IUIAnimationTransition *transition);

    HRESULT (STDMETHODCALLTYPE *AddKeyframeAtOffset)(
        IUIAnimationStoryboard *This,
        UI_ANIMATION_KEYFRAME existingKeyframe,
        double offset,
        UI_ANIMATION_KEYFRAME *keyframe);

    HRESULT (STDMETHODCALLTYPE *AddKeyframeAfterTransition)(
        IUIAnimationStoryboard *This,
        IUIAnimationTransition *transition,
        UI_ANIMATION_KEYFRAME *keyframe);

    HRESULT (STDMETHODCALLTYPE *AddTransitionAtKeyframe)(
        IUIAnimationStoryboard *This,
        IUIAnimationVariable *variable,
        IUIAnimationTransition *transition,
        UI_ANIMATION_KEYFRAME startKeyframe);

    HRESULT (STDMETHODCALLTYPE *AddTransitionBetweenKeyframes)(
        IUIAnimationStoryboard *This,
        IUIAnimationVariable *variable,
        IUIAnimationTransition *transition,
        UI_ANIMATION_KEYFRAME startKeyframe,
        UI_ANIMATION_KEYFRAME endKeyframe);

    HRESULT (STDMETHODCALLTYPE *RepeatBetweenKeyframes)(
        IUIAnimationStoryboard *This,
        UI_ANIMATION_KEYFRAME startKeyframe,
        UI_ANIMATION_KEYFRAME endKeyframe,
        int repetitionCount);

    HRESULT (STDMETHODCALLTYPE *HoldVariable)(
        IUIAnimationStoryboard *This,
        IUIAnimationVariable *variable);

    HRESULT (STDMETHODCALLTYPE *SetLongestAcceptableDelay)(
        IUIAnimationStoryboard *This,
        double delay);

    HRESULT (STDMETHODCALLTYPE *Schedule)(
        IUIAnimationStoryboard *This,
        double timeNow,
        UI_ANIMATION_SCHEDULING_RESULT *schedulingResult);

    HRESULT (STDMETHODCALLTYPE *Conclude)(
        IUIAnimationStoryboard *This);

    HRESULT (STDMETHODCALLTYPE *Finish)(
        IUIAnimationStoryboard *This,
        double completionDeadline);

    HRESULT (STDMETHODCALLTYPE *Abandon)(
        IUIAnimationStoryboard *This);

    HRESULT (STDMETHODCALLTYPE *SetTag)(
        IUIAnimationStoryboard *This,
        IUnknown *object,
        unsigned int id);

    HRESULT (STDMETHODCALLTYPE *GetTag)(
        IUIAnimationStoryboard *This,
        IUnknown **object,
        unsigned int *id);

    HRESULT (STDMETHODCALLTYPE *GetStatus)(
        IUIAnimationStoryboard *This,
        UI_ANIMATION_STORYBOARD_STATUS *status);

    HRESULT (STDMETHODCALLTYPE *GetElapsedTime)(
        IUIAnimationStoryboard *This,
        double *elapsedTime);

    HRESULT (STDMETHODCALLTYPE *SetStoryboardEventHandler)(
        IUIAnimationStoryboard *This,
        IUIAnimationStoryboardEventHandler *handler);

    END_INTERFACE
} IUIAnimationStoryboardVtbl;

interface IUIAnimationStoryboard {
    CONST_VTBL IUIAnimationStoryboardVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IUIAnimationStoryboard_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IUIAnimationStoryboard_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IUIAnimationStoryboard_Release(This) (This)->lpVtbl->Release(This)
/*** IUIAnimationStoryboard methods ***/
#define IUIAnimationStoryboard_AddTransition(This,variable,transition) (This)->lpVtbl->AddTransition(This,variable,transition)
#define IUIAnimationStoryboard_AddKeyframeAtOffset(This,existingKeyframe,offset,keyframe) (This)->lpVtbl->AddKeyframeAtOffset(This,existingKeyframe,offset,keyframe)
#define IUIAnimationStoryboard_AddKeyframeAfterTransition(This,transition,keyframe) (This)->lpVtbl->AddKeyframeAfterTransition(This,transition,keyframe)
#define IUIAnimationStoryboard_AddTransitionAtKeyframe(This,variable,transition,startKeyframe) (This)->lpVtbl->AddTransitionAtKeyframe(This,variable,transition,startKeyframe)
#define IUIAnimationStoryboard_AddTransitionBetweenKeyframes(This,variable,transition,startKeyframe,endKeyframe) (This)->lpVtbl->AddTransitionBetweenKeyframes(This,variable,transition,startKeyframe,endKeyframe)
#define IUIAnimationStoryboard_RepeatBetweenKeyframes(This,startKeyframe,endKeyframe,repetitionCount) (This)->lpVtbl->RepeatBetweenKeyframes(This,startKeyframe,endKeyframe,repetitionCount)
#define IUIAnimationStoryboard_HoldVariable(This,variable) (This)->lpVtbl->HoldVariable(This,variable)
#define IUIAnimationStoryboard_SetLongestAcceptableDelay(This,delay) (This)->lpVtbl->SetLongestAcceptableDelay(This,delay)
#define IUIAnimationStoryboard_Schedule(This,timeNow,schedulingResult) (This)->lpVtbl->Schedule(This,timeNow,schedulingResult)
#define IUIAnimationStoryboard_Conclude(This) (This)->lpVtbl->Conclude(This)
#define IUIAnimationStoryboard_Finish(This,completionDeadline) (This)->lpVtbl->Finish(This,completionDeadline)
#define IUIAnimationStoryboard_Abandon(This) (This)->lpVtbl->Abandon(This)
#define IUIAnimationStoryboard_SetTag(This,object,id) (This)->lpVtbl->SetTag(This,object,id)
#define IUIAnimationStoryboard_GetTag(This,object,id) (This)->lpVtbl->GetTag(This,object,id)
#define IUIAnimationStoryboard_GetStatus(This,status) (This)->lpVtbl->GetStatus(This,status)
#define IUIAnimationStoryboard_GetElapsedTime(This,elapsedTime) (This)->lpVtbl->GetElapsedTime(This,elapsedTime)
#define IUIAnimationStoryboard_SetStoryboardEventHandler(This,handler) (This)->lpVtbl->SetStoryboardEventHandler(This,handler)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IUIAnimationStoryboard_QueryInterface(IUIAnimationStoryboard* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IUIAnimationStoryboard_AddRef(IUIAnimationStoryboard* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IUIAnimationStoryboard_Release(IUIAnimationStoryboard* This) {
    return This->lpVtbl->Release(This);
}
/*** IUIAnimationStoryboard methods ***/
static FORCEINLINE HRESULT IUIAnimationStoryboard_AddTransition(IUIAnimationStoryboard* This,IUIAnimationVariable *variable,IUIAnimationTransition *transition) {
    return This->lpVtbl->AddTransition(This,variable,transition);
}
static FORCEINLINE HRESULT IUIAnimationStoryboard_AddKeyframeAtOffset(IUIAnimationStoryboard* This,UI_ANIMATION_KEYFRAME existingKeyframe,double offset,UI_ANIMATION_KEYFRAME *keyframe) {
    return This->lpVtbl->AddKeyframeAtOffset(This,existingKeyframe,offset,keyframe);
}
static FORCEINLINE HRESULT IUIAnimationStoryboard_AddKeyframeAfterTransition(IUIAnimationStoryboard* This,IUIAnimationTransition *transition,UI_ANIMATION_KEYFRAME *keyframe) {
    return This->lpVtbl->AddKeyframeAfterTransition(This,transition,keyframe);
}
static FORCEINLINE HRESULT IUIAnimationStoryboard_AddTransitionAtKeyframe(IUIAnimationStoryboard* This,IUIAnimationVariable *variable,IUIAnimationTransition *transition,UI_ANIMATION_KEYFRAME startKeyframe) {
    return This->lpVtbl->AddTransitionAtKeyframe(This,variable,transition,startKeyframe);
}
static FORCEINLINE HRESULT IUIAnimationStoryboard_AddTransitionBetweenKeyframes(IUIAnimationStoryboard* This,IUIAnimationVariable *variable,IUIAnimationTransition *transition,UI_ANIMATION_KEYFRAME startKeyframe,UI_ANIMATION_KEYFRAME endKeyframe) {
    return This->lpVtbl->AddTransitionBetweenKeyframes(This,variable,transition,startKeyframe,endKeyframe);
}
static FORCEINLINE HRESULT IUIAnimationStoryboard_RepeatBetweenKeyframes(IUIAnimationStoryboard* This,UI_ANIMATION_KEYFRAME startKeyframe,UI_ANIMATION_KEYFRAME endKeyframe,int repetitionCount) {
    return This->lpVtbl->RepeatBetweenKeyframes(This,startKeyframe,endKeyframe,repetitionCount);
}
static FORCEINLINE HRESULT IUIAnimationStoryboard_HoldVariable(IUIAnimationStoryboard* This,IUIAnimationVariable *variable) {
    return This->lpVtbl->HoldVariable(This,variable);
}
static FORCEINLINE HRESULT IUIAnimationStoryboard_SetLongestAcceptableDelay(IUIAnimationStoryboard* This,double delay) {
    return This->lpVtbl->SetLongestAcceptableDelay(This,delay);
}
static FORCEINLINE HRESULT IUIAnimationStoryboard_Schedule(IUIAnimationStoryboard* This,double timeNow,UI_ANIMATION_SCHEDULING_RESULT *schedulingResult) {
    return This->lpVtbl->Schedule(This,timeNow,schedulingResult);
}
static FORCEINLINE HRESULT IUIAnimationStoryboard_Conclude(IUIAnimationStoryboard* This) {
    return This->lpVtbl->Conclude(This);
}
static FORCEINLINE HRESULT IUIAnimationStoryboard_Finish(IUIAnimationStoryboard* This,double completionDeadline) {
    return This->lpVtbl->Finish(This,completionDeadline);
}
static FORCEINLINE HRESULT IUIAnimationStoryboard_Abandon(IUIAnimationStoryboard* This) {
    return This->lpVtbl->Abandon(This);
}
static FORCEINLINE HRESULT IUIAnimationStoryboard_SetTag(IUIAnimationStoryboard* This,IUnknown *object,unsigned int id) {
    return This->lpVtbl->SetTag(This,object,id);
}
static FORCEINLINE HRESULT IUIAnimationStoryboard_GetTag(IUIAnimationStoryboard* This,IUnknown **object,unsigned int *id) {
    return This->lpVtbl->GetTag(This,object,id);
}
static FORCEINLINE HRESULT IUIAnimationStoryboard_GetStatus(IUIAnimationStoryboard* This,UI_ANIMATION_STORYBOARD_STATUS *status) {
    return This->lpVtbl->GetStatus(This,status);
}
static FORCEINLINE HRESULT IUIAnimationStoryboard_GetElapsedTime(IUIAnimationStoryboard* This,double *elapsedTime) {
    return This->lpVtbl->GetElapsedTime(This,elapsedTime);
}
static FORCEINLINE HRESULT IUIAnimationStoryboard_SetStoryboardEventHandler(IUIAnimationStoryboard* This,IUIAnimationStoryboardEventHandler *handler) {
    return This->lpVtbl->SetStoryboardEventHandler(This,handler);
}
#endif
#endif

#endif


#endif  /* __IUIAnimationStoryboard_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IUIAnimationTransition interface
 */
#ifndef __IUIAnimationTransition_INTERFACE_DEFINED__
#define __IUIAnimationTransition_INTERFACE_DEFINED__

DEFINE_GUID(IID_IUIAnimationTransition, 0xdc6ce252, 0xf731, 0x41cf, 0xb6,0x10, 0x61,0x4b,0x6c,0xa0,0x49,0xad);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("dc6ce252-f731-41cf-b610-614b6ca049ad")
IUIAnimationTransition : public IUnknown
{
    virtual HRESULT STDMETHODCALLTYPE SetInitialValue(
        double value) = 0;

    virtual HRESULT STDMETHODCALLTYPE SetInitialVelocity(
        double velocity) = 0;

    virtual HRESULT STDMETHODCALLTYPE IsDurationKnown(
        ) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetDuration(
        double *duration) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IUIAnimationTransition, 0xdc6ce252, 0xf731, 0x41cf, 0xb6,0x10, 0x61,0x4b,0x6c,0xa0,0x49,0xad)
#endif
#else
typedef struct IUIAnimationTransitionVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        IUIAnimationTransition *This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        IUIAnimationTransition *This);

    ULONG (STDMETHODCALLTYPE *Release)(
        IUIAnimationTransition *This);

    /*** IUIAnimationTransition methods ***/
    HRESULT (STDMETHODCALLTYPE *SetInitialValue)(
        IUIAnimationTransition *This,
        double value);

    HRESULT (STDMETHODCALLTYPE *SetInitialVelocity)(
        IUIAnimationTransition *This,
        double velocity);

    HRESULT (STDMETHODCALLTYPE *IsDurationKnown)(
        IUIAnimationTransition *This);

    HRESULT (STDMETHODCALLTYPE *GetDuration)(
        IUIAnimationTransition *This,
        double *duration);

    END_INTERFACE
} IUIAnimationTransitionVtbl;

interface IUIAnimationTransition {
    CONST_VTBL IUIAnimationTransitionVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IUIAnimationTransition_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IUIAnimationTransition_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IUIAnimationTransition_Release(This) (This)->lpVtbl->Release(This)
/*** IUIAnimationTransition methods ***/
#define IUIAnimationTransition_SetInitialValue(This,value) (This)->lpVtbl->SetInitialValue(This,value)
#define IUIAnimationTransition_SetInitialVelocity(This,velocity) (This)->lpVtbl->SetInitialVelocity(This,velocity)
#define IUIAnimationTransition_IsDurationKnown(This) (This)->lpVtbl->IsDurationKnown(This)
#define IUIAnimationTransition_GetDuration(This,duration) (This)->lpVtbl->GetDuration(This,duration)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IUIAnimationTransition_QueryInterface(IUIAnimationTransition* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IUIAnimationTransition_AddRef(IUIAnimationTransition* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IUIAnimationTransition_Release(IUIAnimationTransition* This) {
    return This->lpVtbl->Release(This);
}
/*** IUIAnimationTransition methods ***/
static FORCEINLINE HRESULT IUIAnimationTransition_SetInitialValue(IUIAnimationTransition* This,double value) {
    return This->lpVtbl->SetInitialValue(This,value);
}
static FORCEINLINE HRESULT IUIAnimationTransition_SetInitialVelocity(IUIAnimationTransition* This,double velocity) {
    return This->lpVtbl->SetInitialVelocity(This,velocity);
}
static FORCEINLINE HRESULT IUIAnimationTransition_IsDurationKnown(IUIAnimationTransition* This) {
    return This->lpVtbl->IsDurationKnown(This);
}
static FORCEINLINE HRESULT IUIAnimationTransition_GetDuration(IUIAnimationTransition* This,double *duration) {
    return This->lpVtbl->GetDuration(This,duration);
}
#endif
#endif

#endif


#endif  /* __IUIAnimationTransition_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IUIAnimationStoryboardEventHandler interface
 */
#ifndef __IUIAnimationStoryboardEventHandler_INTERFACE_DEFINED__
#define __IUIAnimationStoryboardEventHandler_INTERFACE_DEFINED__

DEFINE_GUID(IID_IUIAnimationStoryboardEventHandler, 0x3d5c9008, 0xec7c, 0x4364, 0x9f,0x8a, 0x9a,0xf3,0xc5,0x8c,0xba,0xe6);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("3d5c9008-ec7c-4364-9f8a-9af3c58cbae6")
IUIAnimationStoryboardEventHandler : public IUnknown
{
    virtual HRESULT STDMETHODCALLTYPE OnStoryboardStatusChanged(
        IUIAnimationStoryboard *storyboard,
        UI_ANIMATION_STORYBOARD_STATUS newStatus,
        UI_ANIMATION_STORYBOARD_STATUS previousStatus) = 0;

    virtual HRESULT STDMETHODCALLTYPE OnStoryboardUpdated(
        IUIAnimationStoryboard *storyboard) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IUIAnimationStoryboardEventHandler, 0x3d5c9008, 0xec7c, 0x4364, 0x9f,0x8a, 0x9a,0xf3,0xc5,0x8c,0xba,0xe6)
#endif
#else
typedef struct IUIAnimationStoryboardEventHandlerVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        IUIAnimationStoryboardEventHandler *This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        IUIAnimationStoryboardEventHandler *This);

    ULONG (STDMETHODCALLTYPE *Release)(
        IUIAnimationStoryboardEventHandler *This);

    /*** IUIAnimationStoryboardEventHandler methods ***/
    HRESULT (STDMETHODCALLTYPE *OnStoryboardStatusChanged)(
        IUIAnimationStoryboardEventHandler *This,
        IUIAnimationStoryboard *storyboard,
        UI_ANIMATION_STORYBOARD_STATUS newStatus,
        UI_ANIMATION_STORYBOARD_STATUS previousStatus);

    HRESULT (STDMETHODCALLTYPE *OnStoryboardUpdated)(
        IUIAnimationStoryboardEventHandler *This,
        IUIAnimationStoryboard *storyboard);

    END_INTERFACE
} IUIAnimationStoryboardEventHandlerVtbl;

interface IUIAnimationStoryboardEventHandler {
    CONST_VTBL IUIAnimationStoryboardEventHandlerVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IUIAnimationStoryboardEventHandler_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IUIAnimationStoryboardEventHandler_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IUIAnimationStoryboardEventHandler_Release(This) (This)->lpVtbl->Release(This)
/*** IUIAnimationStoryboardEventHandler methods ***/
#define IUIAnimationStoryboardEventHandler_OnStoryboardStatusChanged(This,storyboard,newStatus,previousStatus) (This)->lpVtbl->OnStoryboardStatusChanged(This,storyboard,newStatus,previousStatus)
#define IUIAnimationStoryboardEventHandler_OnStoryboardUpdated(This,storyboard) (This)->lpVtbl->OnStoryboardUpdated(This,storyboard)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IUIAnimationStoryboardEventHandler_QueryInterface(IUIAnimationStoryboardEventHandler* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IUIAnimationStoryboardEventHandler_AddRef(IUIAnimationStoryboardEventHandler* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IUIAnimationStoryboardEventHandler_Release(IUIAnimationStoryboardEventHandler* This) {
    return This->lpVtbl->Release(This);
}
/*** IUIAnimationStoryboardEventHandler methods ***/
static FORCEINLINE HRESULT IUIAnimationStoryboardEventHandler_OnStoryboardStatusChanged(IUIAnimationStoryboardEventHandler* This,IUIAnimationStoryboard *storyboard,UI_ANIMATION_STORYBOARD_STATUS newStatus,UI_ANIMATION_STORYBOARD_STATUS previousStatus) {
    return This->lpVtbl->OnStoryboardStatusChanged(This,storyboard,newStatus,previousStatus);
}
static FORCEINLINE HRESULT IUIAnimationStoryboardEventHandler_OnStoryboardUpdated(IUIAnimationStoryboardEventHandler* This,IUIAnimationStoryboard *storyboard) {
    return This->lpVtbl->OnStoryboardUpdated(This,storyboard);
}
#endif
#endif

#endif


#endif  /* __IUIAnimationStoryboardEventHandler_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IUIAnimationVariableChangeHandler interface
 */
#ifndef __IUIAnimationVariableChangeHandler_INTERFACE_DEFINED__
#define __IUIAnimationVariableChangeHandler_INTERFACE_DEFINED__

DEFINE_GUID(IID_IUIAnimationVariableChangeHandler, 0x6358b7ba, 0x87d2, 0x42d5, 0xbf,0x71, 0x82,0xe9,0x19,0xdd,0x58,0x62);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("6358b7ba-87d2-42d5-bf71-82e919dd5862")
IUIAnimationVariableChangeHandler : public IUnknown
{
    virtual HRESULT STDMETHODCALLTYPE OnValueChanged(
        IUIAnimationStoryboard *storyboard,
        IUIAnimationVariable *variable,
        double newValue,
        double previousValue) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IUIAnimationVariableChangeHandler, 0x6358b7ba, 0x87d2, 0x42d5, 0xbf,0x71, 0x82,0xe9,0x19,0xdd,0x58,0x62)
#endif
#else
typedef struct IUIAnimationVariableChangeHandlerVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        IUIAnimationVariableChangeHandler *This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        IUIAnimationVariableChangeHandler *This);

    ULONG (STDMETHODCALLTYPE *Release)(
        IUIAnimationVariableChangeHandler *This);

    /*** IUIAnimationVariableChangeHandler methods ***/
    HRESULT (STDMETHODCALLTYPE *OnValueChanged)(
        IUIAnimationVariableChangeHandler *This,
        IUIAnimationStoryboard *storyboard,
        IUIAnimationVariable *variable,
        double newValue,
        double previousValue);

    END_INTERFACE
} IUIAnimationVariableChangeHandlerVtbl;

interface IUIAnimationVariableChangeHandler {
    CONST_VTBL IUIAnimationVariableChangeHandlerVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IUIAnimationVariableChangeHandler_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IUIAnimationVariableChangeHandler_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IUIAnimationVariableChangeHandler_Release(This) (This)->lpVtbl->Release(This)
/*** IUIAnimationVariableChangeHandler methods ***/
#define IUIAnimationVariableChangeHandler_OnValueChanged(This,storyboard,variable,newValue,previousValue) (This)->lpVtbl->OnValueChanged(This,storyboard,variable,newValue,previousValue)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IUIAnimationVariableChangeHandler_QueryInterface(IUIAnimationVariableChangeHandler* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IUIAnimationVariableChangeHandler_AddRef(IUIAnimationVariableChangeHandler* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IUIAnimationVariableChangeHandler_Release(IUIAnimationVariableChangeHandler* This) {
    return This->lpVtbl->Release(This);
}
/*** IUIAnimationVariableChangeHandler methods ***/
static FORCEINLINE HRESULT IUIAnimationVariableChangeHandler_OnValueChanged(IUIAnimationVariableChangeHandler* This,IUIAnimationStoryboard *storyboard,IUIAnimationVariable *variable,double newValue,double previousValue) {
    return This->lpVtbl->OnValueChanged(This,storyboard,variable,newValue,previousValue);
}
#endif
#endif

#endif


#endif  /* __IUIAnimationVariableChangeHandler_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IUIAnimationVariableIntegerChangeHandler interface
 */
#ifndef __IUIAnimationVariableIntegerChangeHandler_INTERFACE_DEFINED__
#define __IUIAnimationVariableIntegerChangeHandler_INTERFACE_DEFINED__

DEFINE_GUID(IID_IUIAnimationVariableIntegerChangeHandler, 0xbb3e1550, 0x356e, 0x44b0, 0x99,0xda, 0x85,0xac,0x60,0x17,0x86,0x5e);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("bb3e1550-356e-44b0-99da-85ac6017865e")
IUIAnimationVariableIntegerChangeHandler : public IUnknown
{
    virtual HRESULT STDMETHODCALLTYPE OnIntegerValueChanged(
        IUIAnimationStoryboard *storyboard,
        IUIAnimationVariable *variable,
        int newValue,
        int previousValue) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IUIAnimationVariableIntegerChangeHandler, 0xbb3e1550, 0x356e, 0x44b0, 0x99,0xda, 0x85,0xac,0x60,0x17,0x86,0x5e)
#endif
#else
typedef struct IUIAnimationVariableIntegerChangeHandlerVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        IUIAnimationVariableIntegerChangeHandler *This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        IUIAnimationVariableIntegerChangeHandler *This);

    ULONG (STDMETHODCALLTYPE *Release)(
        IUIAnimationVariableIntegerChangeHandler *This);

    /*** IUIAnimationVariableIntegerChangeHandler methods ***/
    HRESULT (STDMETHODCALLTYPE *OnIntegerValueChanged)(
        IUIAnimationVariableIntegerChangeHandler *This,
        IUIAnimationStoryboard *storyboard,
        IUIAnimationVariable *variable,
        int newValue,
        int previousValue);

    END_INTERFACE
} IUIAnimationVariableIntegerChangeHandlerVtbl;

interface IUIAnimationVariableIntegerChangeHandler {
    CONST_VTBL IUIAnimationVariableIntegerChangeHandlerVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IUIAnimationVariableIntegerChangeHandler_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IUIAnimationVariableIntegerChangeHandler_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IUIAnimationVariableIntegerChangeHandler_Release(This) (This)->lpVtbl->Release(This)
/*** IUIAnimationVariableIntegerChangeHandler methods ***/
#define IUIAnimationVariableIntegerChangeHandler_OnIntegerValueChanged(This,storyboard,variable,newValue,previousValue) (This)->lpVtbl->OnIntegerValueChanged(This,storyboard,variable,newValue,previousValue)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IUIAnimationVariableIntegerChangeHandler_QueryInterface(IUIAnimationVariableIntegerChangeHandler* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IUIAnimationVariableIntegerChangeHandler_AddRef(IUIAnimationVariableIntegerChangeHandler* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IUIAnimationVariableIntegerChangeHandler_Release(IUIAnimationVariableIntegerChangeHandler* This) {
    return This->lpVtbl->Release(This);
}
/*** IUIAnimationVariableIntegerChangeHandler methods ***/
static FORCEINLINE HRESULT IUIAnimationVariableIntegerChangeHandler_OnIntegerValueChanged(IUIAnimationVariableIntegerChangeHandler* This,IUIAnimationStoryboard *storyboard,IUIAnimationVariable *variable,int newValue,int previousValue) {
    return This->lpVtbl->OnIntegerValueChanged(This,storyboard,variable,newValue,previousValue);
}
#endif
#endif

#endif


#endif  /* __IUIAnimationVariableIntegerChangeHandler_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IUIAnimationManagerEventHandler interface
 */
#ifndef __IUIAnimationManagerEventHandler_INTERFACE_DEFINED__
#define __IUIAnimationManagerEventHandler_INTERFACE_DEFINED__

DEFINE_GUID(IID_IUIAnimationManagerEventHandler, 0x783321ed, 0x78a3, 0x4366, 0xb5,0x74, 0x6a,0xf6,0x07,0xa6,0x47,0x88);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("783321ed-78a3-4366-b574-6af607a64788")
IUIAnimationManagerEventHandler : public IUnknown
{
    virtual HRESULT STDMETHODCALLTYPE OnManagerStatusChanged(
        UI_ANIMATION_MANAGER_STATUS newStatus,
        UI_ANIMATION_MANAGER_STATUS previousStatus) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IUIAnimationManagerEventHandler, 0x783321ed, 0x78a3, 0x4366, 0xb5,0x74, 0x6a,0xf6,0x07,0xa6,0x47,0x88)
#endif
#else
typedef struct IUIAnimationManagerEventHandlerVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        IUIAnimationManagerEventHandler *This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        IUIAnimationManagerEventHandler *This);

    ULONG (STDMETHODCALLTYPE *Release)(
        IUIAnimationManagerEventHandler *This);

    /*** IUIAnimationManagerEventHandler methods ***/
    HRESULT (STDMETHODCALLTYPE *OnManagerStatusChanged)(
        IUIAnimationManagerEventHandler *This,
        UI_ANIMATION_MANAGER_STATUS newStatus,
        UI_ANIMATION_MANAGER_STATUS previousStatus);

    END_INTERFACE
} IUIAnimationManagerEventHandlerVtbl;

interface IUIAnimationManagerEventHandler {
    CONST_VTBL IUIAnimationManagerEventHandlerVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IUIAnimationManagerEventHandler_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IUIAnimationManagerEventHandler_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IUIAnimationManagerEventHandler_Release(This) (This)->lpVtbl->Release(This)
/*** IUIAnimationManagerEventHandler methods ***/
#define IUIAnimationManagerEventHandler_OnManagerStatusChanged(This,newStatus,previousStatus) (This)->lpVtbl->OnManagerStatusChanged(This,newStatus,previousStatus)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IUIAnimationManagerEventHandler_QueryInterface(IUIAnimationManagerEventHandler* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IUIAnimationManagerEventHandler_AddRef(IUIAnimationManagerEventHandler* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IUIAnimationManagerEventHandler_Release(IUIAnimationManagerEventHandler* This) {
    return This->lpVtbl->Release(This);
}
/*** IUIAnimationManagerEventHandler methods ***/
static FORCEINLINE HRESULT IUIAnimationManagerEventHandler_OnManagerStatusChanged(IUIAnimationManagerEventHandler* This,UI_ANIMATION_MANAGER_STATUS newStatus,UI_ANIMATION_MANAGER_STATUS previousStatus) {
    return This->lpVtbl->OnManagerStatusChanged(This,newStatus,previousStatus);
}
#endif
#endif

#endif


#endif  /* __IUIAnimationManagerEventHandler_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IUIAnimationPriorityComparison interface
 */
#ifndef __IUIAnimationPriorityComparison_INTERFACE_DEFINED__
#define __IUIAnimationPriorityComparison_INTERFACE_DEFINED__

DEFINE_GUID(IID_IUIAnimationPriorityComparison, 0x83fa9b74, 0x5f86, 0x4618, 0xbc,0x6a, 0xa2,0xfa,0xc1,0x9b,0x3f,0x44);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("83fa9b74-5f86-4618-bc6a-a2fac19b3f44")
IUIAnimationPriorityComparison : public IUnknown
{
    virtual HRESULT STDMETHODCALLTYPE HasPriority(
        IUIAnimationStoryboard *scheduledStoryboard,
        IUIAnimationStoryboard *newStoryboard,
        UI_ANIMATION_PRIORITY_EFFECT priorityEffect) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IUIAnimationPriorityComparison, 0x83fa9b74, 0x5f86, 0x4618, 0xbc,0x6a, 0xa2,0xfa,0xc1,0x9b,0x3f,0x44)
#endif
#else
typedef struct IUIAnimationPriorityComparisonVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        IUIAnimationPriorityComparison *This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        IUIAnimationPriorityComparison *This);

    ULONG (STDMETHODCALLTYPE *Release)(
        IUIAnimationPriorityComparison *This);

    /*** IUIAnimationPriorityComparison methods ***/
    HRESULT (STDMETHODCALLTYPE *HasPriority)(
        IUIAnimationPriorityComparison *This,
        IUIAnimationStoryboard *scheduledStoryboard,
        IUIAnimationStoryboard *newStoryboard,
        UI_ANIMATION_PRIORITY_EFFECT priorityEffect);

    END_INTERFACE
} IUIAnimationPriorityComparisonVtbl;

interface IUIAnimationPriorityComparison {
    CONST_VTBL IUIAnimationPriorityComparisonVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IUIAnimationPriorityComparison_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IUIAnimationPriorityComparison_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IUIAnimationPriorityComparison_Release(This) (This)->lpVtbl->Release(This)
/*** IUIAnimationPriorityComparison methods ***/
#define IUIAnimationPriorityComparison_HasPriority(This,scheduledStoryboard,newStoryboard,priorityEffect) (This)->lpVtbl->HasPriority(This,scheduledStoryboard,newStoryboard,priorityEffect)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IUIAnimationPriorityComparison_QueryInterface(IUIAnimationPriorityComparison* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IUIAnimationPriorityComparison_AddRef(IUIAnimationPriorityComparison* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IUIAnimationPriorityComparison_Release(IUIAnimationPriorityComparison* This) {
    return This->lpVtbl->Release(This);
}
/*** IUIAnimationPriorityComparison methods ***/
static FORCEINLINE HRESULT IUIAnimationPriorityComparison_HasPriority(IUIAnimationPriorityComparison* This,IUIAnimationStoryboard *scheduledStoryboard,IUIAnimationStoryboard *newStoryboard,UI_ANIMATION_PRIORITY_EFFECT priorityEffect) {
    return This->lpVtbl->HasPriority(This,scheduledStoryboard,newStoryboard,priorityEffect);
}
#endif
#endif

#endif


#endif  /* __IUIAnimationPriorityComparison_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IUIAnimationManager2 interface
 */
#ifndef __IUIAnimationManager2_INTERFACE_DEFINED__
#define __IUIAnimationManager2_INTERFACE_DEFINED__

DEFINE_GUID(IID_IUIAnimationManager2, 0xd8b6f7d4, 0x4109, 0x4d3f, 0xac,0xee, 0x87,0x99,0x26,0x96,0x8c,0xb1);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("d8b6f7d4-4109-4d3f-acee-879926968cb1")
IUIAnimationManager2 : public IUnknown
{
    virtual HRESULT STDMETHODCALLTYPE CreateAnimationVectorVariable(
        double *initialValue,
        unsigned int cDimension,
        IUIAnimationVariable2 **variable) = 0;

    virtual HRESULT STDMETHODCALLTYPE CreateAnimationVariable(
        double initialValue,
        IUIAnimationVariable2 **variable) = 0;

    virtual HRESULT STDMETHODCALLTYPE ScheduleTransition(
        IUIAnimationVariable2 *variable,
        IUIAnimationTransition2 *transition,
        double timeNow) = 0;

    virtual HRESULT STDMETHODCALLTYPE CreateStoryboard(
        IUIAnimationStoryboard2 **storyboard) = 0;

    virtual HRESULT STDMETHODCALLTYPE FinishAllStoryboards(
        double completionDeadline) = 0;

    virtual HRESULT STDMETHODCALLTYPE AbandonAllStoryboards(
        ) = 0;

    virtual HRESULT STDMETHODCALLTYPE Update(
        double timeNow,
        UI_ANIMATION_UPDATE_RESULT *updateResult = 0) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetVariableFromTag(
        IUnknown *object,
        UINT32 id,
        IUIAnimationVariable2 **variable) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetStoryboardFromTag(
        IUnknown *object,
        unsigned int id,
        IUIAnimationStoryboard2 **storyboard) = 0;

    virtual HRESULT STDMETHODCALLTYPE EstimateNextEventTime(
        double *seconds) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetStatus(
        UI_ANIMATION_MANAGER_STATUS *status) = 0;

    virtual HRESULT STDMETHODCALLTYPE SetAnimationMode(
        UI_ANIMATION_MODE mode) = 0;

    virtual HRESULT STDMETHODCALLTYPE Pause(
        ) = 0;

    virtual HRESULT STDMETHODCALLTYPE Resume(
        ) = 0;

    virtual HRESULT STDMETHODCALLTYPE SetManagerEventHandler(
        IUIAnimationManagerEventHandler2 *handler,
        LONG fRegisterForNextAnimationEvent = FALSE) = 0;

    virtual HRESULT STDMETHODCALLTYPE SetCancelPriorityComparison(
        IUIAnimationPriorityComparison2 *comparison) = 0;

    virtual HRESULT STDMETHODCALLTYPE SetTrimPriorityComparison(
        IUIAnimationPriorityComparison2 *comparison) = 0;

    virtual HRESULT STDMETHODCALLTYPE SetCompressPriorityComparison(
        IUIAnimationPriorityComparison2 *comparison) = 0;

    virtual HRESULT STDMETHODCALLTYPE SetConcludePriorityComparison(
        IUIAnimationPriorityComparison2 *comparison) = 0;

    virtual HRESULT STDMETHODCALLTYPE SetDefaultLongestAcceptableDelay(
        double delay) = 0;

    virtual HRESULT STDMETHODCALLTYPE Shutdown(
        ) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IUIAnimationManager2, 0xd8b6f7d4, 0x4109, 0x4d3f, 0xac,0xee, 0x87,0x99,0x26,0x96,0x8c,0xb1)
#endif
#else
typedef struct IUIAnimationManager2Vtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        IUIAnimationManager2 *This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        IUIAnimationManager2 *This);

    ULONG (STDMETHODCALLTYPE *Release)(
        IUIAnimationManager2 *This);

    /*** IUIAnimationManager2 methods ***/
    HRESULT (STDMETHODCALLTYPE *CreateAnimationVectorVariable)(
        IUIAnimationManager2 *This,
        double *initialValue,
        unsigned int cDimension,
        IUIAnimationVariable2 **variable);

    HRESULT (STDMETHODCALLTYPE *CreateAnimationVariable)(
        IUIAnimationManager2 *This,
        double initialValue,
        IUIAnimationVariable2 **variable);

    HRESULT (STDMETHODCALLTYPE *ScheduleTransition)(
        IUIAnimationManager2 *This,
        IUIAnimationVariable2 *variable,
        IUIAnimationTransition2 *transition,
        double timeNow);

    HRESULT (STDMETHODCALLTYPE *CreateStoryboard)(
        IUIAnimationManager2 *This,
        IUIAnimationStoryboard2 **storyboard);

    HRESULT (STDMETHODCALLTYPE *FinishAllStoryboards)(
        IUIAnimationManager2 *This,
        double completionDeadline);

    HRESULT (STDMETHODCALLTYPE *AbandonAllStoryboards)(
        IUIAnimationManager2 *This);

    HRESULT (STDMETHODCALLTYPE *Update)(
        IUIAnimationManager2 *This,
        double timeNow,
        UI_ANIMATION_UPDATE_RESULT *updateResult);

    HRESULT (STDMETHODCALLTYPE *GetVariableFromTag)(
        IUIAnimationManager2 *This,
        IUnknown *object,
        UINT32 id,
        IUIAnimationVariable2 **variable);

    HRESULT (STDMETHODCALLTYPE *GetStoryboardFromTag)(
        IUIAnimationManager2 *This,
        IUnknown *object,
        unsigned int id,
        IUIAnimationStoryboard2 **storyboard);

    HRESULT (STDMETHODCALLTYPE *EstimateNextEventTime)(
        IUIAnimationManager2 *This,
        double *seconds);

    HRESULT (STDMETHODCALLTYPE *GetStatus)(
        IUIAnimationManager2 *This,
        UI_ANIMATION_MANAGER_STATUS *status);

    HRESULT (STDMETHODCALLTYPE *SetAnimationMode)(
        IUIAnimationManager2 *This,
        UI_ANIMATION_MODE mode);

    HRESULT (STDMETHODCALLTYPE *Pause)(
        IUIAnimationManager2 *This);

    HRESULT (STDMETHODCALLTYPE *Resume)(
        IUIAnimationManager2 *This);

    HRESULT (STDMETHODCALLTYPE *SetManagerEventHandler)(
        IUIAnimationManager2 *This,
        IUIAnimationManagerEventHandler2 *handler,
        LONG fRegisterForNextAnimationEvent);

    HRESULT (STDMETHODCALLTYPE *SetCancelPriorityComparison)(
        IUIAnimationManager2 *This,
        IUIAnimationPriorityComparison2 *comparison);

    HRESULT (STDMETHODCALLTYPE *SetTrimPriorityComparison)(
        IUIAnimationManager2 *This,
        IUIAnimationPriorityComparison2 *comparison);

    HRESULT (STDMETHODCALLTYPE *SetCompressPriorityComparison)(
        IUIAnimationManager2 *This,
        IUIAnimationPriorityComparison2 *comparison);

    HRESULT (STDMETHODCALLTYPE *SetConcludePriorityComparison)(
        IUIAnimationManager2 *This,
        IUIAnimationPriorityComparison2 *comparison);

    HRESULT (STDMETHODCALLTYPE *SetDefaultLongestAcceptableDelay)(
        IUIAnimationManager2 *This,
        double delay);

    HRESULT (STDMETHODCALLTYPE *Shutdown)(
        IUIAnimationManager2 *This);

    END_INTERFACE
} IUIAnimationManager2Vtbl;

interface IUIAnimationManager2 {
    CONST_VTBL IUIAnimationManager2Vtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IUIAnimationManager2_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IUIAnimationManager2_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IUIAnimationManager2_Release(This) (This)->lpVtbl->Release(This)
/*** IUIAnimationManager2 methods ***/
#define IUIAnimationManager2_CreateAnimationVectorVariable(This,initialValue,cDimension,variable) (This)->lpVtbl->CreateAnimationVectorVariable(This,initialValue,cDimension,variable)
#define IUIAnimationManager2_CreateAnimationVariable(This,initialValue,variable) (This)->lpVtbl->CreateAnimationVariable(This,initialValue,variable)
#define IUIAnimationManager2_ScheduleTransition(This,variable,transition,timeNow) (This)->lpVtbl->ScheduleTransition(This,variable,transition,timeNow)
#define IUIAnimationManager2_CreateStoryboard(This,storyboard) (This)->lpVtbl->CreateStoryboard(This,storyboard)
#define IUIAnimationManager2_FinishAllStoryboards(This,completionDeadline) (This)->lpVtbl->FinishAllStoryboards(This,completionDeadline)
#define IUIAnimationManager2_AbandonAllStoryboards(This) (This)->lpVtbl->AbandonAllStoryboards(This)
#define IUIAnimationManager2_Update(This,timeNow,updateResult) (This)->lpVtbl->Update(This,timeNow,updateResult)
#define IUIAnimationManager2_GetVariableFromTag(This,object,id,variable) (This)->lpVtbl->GetVariableFromTag(This,object,id,variable)
#define IUIAnimationManager2_GetStoryboardFromTag(This,object,id,storyboard) (This)->lpVtbl->GetStoryboardFromTag(This,object,id,storyboard)
#define IUIAnimationManager2_EstimateNextEventTime(This,seconds) (This)->lpVtbl->EstimateNextEventTime(This,seconds)
#define IUIAnimationManager2_GetStatus(This,status) (This)->lpVtbl->GetStatus(This,status)
#define IUIAnimationManager2_SetAnimationMode(This,mode) (This)->lpVtbl->SetAnimationMode(This,mode)
#define IUIAnimationManager2_Pause(This) (This)->lpVtbl->Pause(This)
#define IUIAnimationManager2_Resume(This) (This)->lpVtbl->Resume(This)
#define IUIAnimationManager2_SetManagerEventHandler(This,handler,fRegisterForNextAnimationEvent) (This)->lpVtbl->SetManagerEventHandler(This,handler,fRegisterForNextAnimationEvent)
#define IUIAnimationManager2_SetCancelPriorityComparison(This,comparison) (This)->lpVtbl->SetCancelPriorityComparison(This,comparison)
#define IUIAnimationManager2_SetTrimPriorityComparison(This,comparison) (This)->lpVtbl->SetTrimPriorityComparison(This,comparison)
#define IUIAnimationManager2_SetCompressPriorityComparison(This,comparison) (This)->lpVtbl->SetCompressPriorityComparison(This,comparison)
#define IUIAnimationManager2_SetConcludePriorityComparison(This,comparison) (This)->lpVtbl->SetConcludePriorityComparison(This,comparison)
#define IUIAnimationManager2_SetDefaultLongestAcceptableDelay(This,delay) (This)->lpVtbl->SetDefaultLongestAcceptableDelay(This,delay)
#define IUIAnimationManager2_Shutdown(This) (This)->lpVtbl->Shutdown(This)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IUIAnimationManager2_QueryInterface(IUIAnimationManager2* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IUIAnimationManager2_AddRef(IUIAnimationManager2* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IUIAnimationManager2_Release(IUIAnimationManager2* This) {
    return This->lpVtbl->Release(This);
}
/*** IUIAnimationManager2 methods ***/
static FORCEINLINE HRESULT IUIAnimationManager2_CreateAnimationVectorVariable(IUIAnimationManager2* This,double *initialValue,unsigned int cDimension,IUIAnimationVariable2 **variable) {
    return This->lpVtbl->CreateAnimationVectorVariable(This,initialValue,cDimension,variable);
}
static FORCEINLINE HRESULT IUIAnimationManager2_CreateAnimationVariable(IUIAnimationManager2* This,double initialValue,IUIAnimationVariable2 **variable) {
    return This->lpVtbl->CreateAnimationVariable(This,initialValue,variable);
}
static FORCEINLINE HRESULT IUIAnimationManager2_ScheduleTransition(IUIAnimationManager2* This,IUIAnimationVariable2 *variable,IUIAnimationTransition2 *transition,double timeNow) {
    return This->lpVtbl->ScheduleTransition(This,variable,transition,timeNow);
}
static FORCEINLINE HRESULT IUIAnimationManager2_CreateStoryboard(IUIAnimationManager2* This,IUIAnimationStoryboard2 **storyboard) {
    return This->lpVtbl->CreateStoryboard(This,storyboard);
}
static FORCEINLINE HRESULT IUIAnimationManager2_FinishAllStoryboards(IUIAnimationManager2* This,double completionDeadline) {
    return This->lpVtbl->FinishAllStoryboards(This,completionDeadline);
}
static FORCEINLINE HRESULT IUIAnimationManager2_AbandonAllStoryboards(IUIAnimationManager2* This) {
    return This->lpVtbl->AbandonAllStoryboards(This);
}
static FORCEINLINE HRESULT IUIAnimationManager2_Update(IUIAnimationManager2* This,double timeNow,UI_ANIMATION_UPDATE_RESULT *updateResult) {
    return This->lpVtbl->Update(This,timeNow,updateResult);
}
static FORCEINLINE HRESULT IUIAnimationManager2_GetVariableFromTag(IUIAnimationManager2* This,IUnknown *object,UINT32 id,IUIAnimationVariable2 **variable) {
    return This->lpVtbl->GetVariableFromTag(This,object,id,variable);
}
static FORCEINLINE HRESULT IUIAnimationManager2_GetStoryboardFromTag(IUIAnimationManager2* This,IUnknown *object,unsigned int id,IUIAnimationStoryboard2 **storyboard) {
    return This->lpVtbl->GetStoryboardFromTag(This,object,id,storyboard);
}
static FORCEINLINE HRESULT IUIAnimationManager2_EstimateNextEventTime(IUIAnimationManager2* This,double *seconds) {
    return This->lpVtbl->EstimateNextEventTime(This,seconds);
}
static FORCEINLINE HRESULT IUIAnimationManager2_GetStatus(IUIAnimationManager2* This,UI_ANIMATION_MANAGER_STATUS *status) {
    return This->lpVtbl->GetStatus(This,status);
}
static FORCEINLINE HRESULT IUIAnimationManager2_SetAnimationMode(IUIAnimationManager2* This,UI_ANIMATION_MODE mode) {
    return This->lpVtbl->SetAnimationMode(This,mode);
}
static FORCEINLINE HRESULT IUIAnimationManager2_Pause(IUIAnimationManager2* This) {
    return This->lpVtbl->Pause(This);
}
static FORCEINLINE HRESULT IUIAnimationManager2_Resume(IUIAnimationManager2* This) {
    return This->lpVtbl->Resume(This);
}
static FORCEINLINE HRESULT IUIAnimationManager2_SetManagerEventHandler(IUIAnimationManager2* This,IUIAnimationManagerEventHandler2 *handler,LONG fRegisterForNextAnimationEvent) {
    return This->lpVtbl->SetManagerEventHandler(This,handler,fRegisterForNextAnimationEvent);
}
static FORCEINLINE HRESULT IUIAnimationManager2_SetCancelPriorityComparison(IUIAnimationManager2* This,IUIAnimationPriorityComparison2 *comparison) {
    return This->lpVtbl->SetCancelPriorityComparison(This,comparison);
}
static FORCEINLINE HRESULT IUIAnimationManager2_SetTrimPriorityComparison(IUIAnimationManager2* This,IUIAnimationPriorityComparison2 *comparison) {
    return This->lpVtbl->SetTrimPriorityComparison(This,comparison);
}
static FORCEINLINE HRESULT IUIAnimationManager2_SetCompressPriorityComparison(IUIAnimationManager2* This,IUIAnimationPriorityComparison2 *comparison) {
    return This->lpVtbl->SetCompressPriorityComparison(This,comparison);
}
static FORCEINLINE HRESULT IUIAnimationManager2_SetConcludePriorityComparison(IUIAnimationManager2* This,IUIAnimationPriorityComparison2 *comparison) {
    return This->lpVtbl->SetConcludePriorityComparison(This,comparison);
}
static FORCEINLINE HRESULT IUIAnimationManager2_SetDefaultLongestAcceptableDelay(IUIAnimationManager2* This,double delay) {
    return This->lpVtbl->SetDefaultLongestAcceptableDelay(This,delay);
}
static FORCEINLINE HRESULT IUIAnimationManager2_Shutdown(IUIAnimationManager2* This) {
    return This->lpVtbl->Shutdown(This);
}
#endif
#endif

#endif


#endif  /* __IUIAnimationManager2_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IUIAnimationVariable2 interface
 */
#ifndef __IUIAnimationVariable2_INTERFACE_DEFINED__
#define __IUIAnimationVariable2_INTERFACE_DEFINED__

DEFINE_GUID(IID_IUIAnimationVariable2, 0x4914b304, 0x96ab, 0x44d9, 0x9e,0x77, 0xd5,0x10,0x9b,0x7e,0x74,0x66);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("4914b304-96ab-44d9-9e77-d5109b7e7466")
IUIAnimationVariable2 : public IUnknown
{
    virtual HRESULT STDMETHODCALLTYPE GetDimension(
        unsigned int *dimension) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetValue(
        double *value) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetVectorValue(
        double *value,
        unsigned int cDimension) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetCurve(
        IDCompositionAnimation *animation) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetVectorCurve(
        IDCompositionAnimation **animation,
        unsigned int cDimension) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetFinalValue(
        double *finalValue) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetFinalVectorValue(
        double *finalValue,
        unsigned int cDimension) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetPreviousValue(
        double *previousValue) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetPreviousVectorValue(
        double *previousValue,
        unsigned int cDimension) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetIntegerValue(
        int *value) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetIntegerVectorValue(
        int *value,
        unsigned int cDimension) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetFinalIntegerValue(
        int *finalValue) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetFinalIntegerVectorValue(
        int *finalValue,
        unsigned int cDimension) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetPreviousIntegerValue(
        int *previousValue) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetPreviousIntegerVectorValue(
        int *previousValue,
        unsigned int cDimension) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetCurrentStoryboard(
        IUIAnimationStoryboard2 **storyboard) = 0;

    virtual HRESULT STDMETHODCALLTYPE SetLowerBound(
        double bound) = 0;

    virtual HRESULT STDMETHODCALLTYPE SetLowerBoundVector(
        double *bound,
        unsigned int cDimension) = 0;

    virtual HRESULT STDMETHODCALLTYPE SetUpperBound(
        double bound) = 0;

    virtual HRESULT STDMETHODCALLTYPE SetUpperBoundVector(
        double *bound,
        unsigned int cDimension) = 0;

    virtual HRESULT STDMETHODCALLTYPE SetRoundingMode(
        UI_ANIMATION_ROUNDING_MODE mode) = 0;

    virtual HRESULT STDMETHODCALLTYPE SetTag(
        IUnknown *object,
        unsigned int id) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetTag(
        IUnknown **object,
        unsigned int *id) = 0;

    virtual HRESULT STDMETHODCALLTYPE SetVariableChangeHandler(
        IUIAnimationVariableChangeHandler2 *handler,
        LONG fRegisterForNextAnimationEvent = FALSE) = 0;

    virtual HRESULT STDMETHODCALLTYPE SetVariableIntegerChangeHandler(
        IUIAnimationVariableIntegerChangeHandler2 *handler,
        LONG fRegisterForNextAnimationEvent = FALSE) = 0;

    virtual HRESULT STDMETHODCALLTYPE SetVariableCurveChangeHandler(
        IUIAnimationVariableCurveChangeHandler2 *handler) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IUIAnimationVariable2, 0x4914b304, 0x96ab, 0x44d9, 0x9e,0x77, 0xd5,0x10,0x9b,0x7e,0x74,0x66)
#endif
#else
typedef struct IUIAnimationVariable2Vtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        IUIAnimationVariable2 *This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        IUIAnimationVariable2 *This);

    ULONG (STDMETHODCALLTYPE *Release)(
        IUIAnimationVariable2 *This);

    /*** IUIAnimationVariable2 methods ***/
    HRESULT (STDMETHODCALLTYPE *GetDimension)(
        IUIAnimationVariable2 *This,
        unsigned int *dimension);

    HRESULT (STDMETHODCALLTYPE *GetValue)(
        IUIAnimationVariable2 *This,
        double *value);

    HRESULT (STDMETHODCALLTYPE *GetVectorValue)(
        IUIAnimationVariable2 *This,
        double *value,
        unsigned int cDimension);

    HRESULT (STDMETHODCALLTYPE *GetCurve)(
        IUIAnimationVariable2 *This,
        IDCompositionAnimation *animation);

    HRESULT (STDMETHODCALLTYPE *GetVectorCurve)(
        IUIAnimationVariable2 *This,
        IDCompositionAnimation **animation,
        unsigned int cDimension);

    HRESULT (STDMETHODCALLTYPE *GetFinalValue)(
        IUIAnimationVariable2 *This,
        double *finalValue);

    HRESULT (STDMETHODCALLTYPE *GetFinalVectorValue)(
        IUIAnimationVariable2 *This,
        double *finalValue,
        unsigned int cDimension);

    HRESULT (STDMETHODCALLTYPE *GetPreviousValue)(
        IUIAnimationVariable2 *This,
        double *previousValue);

    HRESULT (STDMETHODCALLTYPE *GetPreviousVectorValue)(
        IUIAnimationVariable2 *This,
        double *previousValue,
        unsigned int cDimension);

    HRESULT (STDMETHODCALLTYPE *GetIntegerValue)(
        IUIAnimationVariable2 *This,
        int *value);

    HRESULT (STDMETHODCALLTYPE *GetIntegerVectorValue)(
        IUIAnimationVariable2 *This,
        int *value,
        unsigned int cDimension);

    HRESULT (STDMETHODCALLTYPE *GetFinalIntegerValue)(
        IUIAnimationVariable2 *This,
        int *finalValue);

    HRESULT (STDMETHODCALLTYPE *GetFinalIntegerVectorValue)(
        IUIAnimationVariable2 *This,
        int *finalValue,
        unsigned int cDimension);

    HRESULT (STDMETHODCALLTYPE *GetPreviousIntegerValue)(
        IUIAnimationVariable2 *This,
        int *previousValue);

    HRESULT (STDMETHODCALLTYPE *GetPreviousIntegerVectorValue)(
        IUIAnimationVariable2 *This,
        int *previousValue,
        unsigned int cDimension);

    HRESULT (STDMETHODCALLTYPE *GetCurrentStoryboard)(
        IUIAnimationVariable2 *This,
        IUIAnimationStoryboard2 **storyboard);

    HRESULT (STDMETHODCALLTYPE *SetLowerBound)(
        IUIAnimationVariable2 *This,
        double bound);

    HRESULT (STDMETHODCALLTYPE *SetLowerBoundVector)(
        IUIAnimationVariable2 *This,
        double *bound,
        unsigned int cDimension);

    HRESULT (STDMETHODCALLTYPE *SetUpperBound)(
        IUIAnimationVariable2 *This,
        double bound);

    HRESULT (STDMETHODCALLTYPE *SetUpperBoundVector)(
        IUIAnimationVariable2 *This,
        double *bound,
        unsigned int cDimension);

    HRESULT (STDMETHODCALLTYPE *SetRoundingMode)(
        IUIAnimationVariable2 *This,
        UI_ANIMATION_ROUNDING_MODE mode);

    HRESULT (STDMETHODCALLTYPE *SetTag)(
        IUIAnimationVariable2 *This,
        IUnknown *object,
        unsigned int id);

    HRESULT (STDMETHODCALLTYPE *GetTag)(
        IUIAnimationVariable2 *This,
        IUnknown **object,
        unsigned int *id);

    HRESULT (STDMETHODCALLTYPE *SetVariableChangeHandler)(
        IUIAnimationVariable2 *This,
        IUIAnimationVariableChangeHandler2 *handler,
        LONG fRegisterForNextAnimationEvent);

    HRESULT (STDMETHODCALLTYPE *SetVariableIntegerChangeHandler)(
        IUIAnimationVariable2 *This,
        IUIAnimationVariableIntegerChangeHandler2 *handler,
        LONG fRegisterForNextAnimationEvent);

    HRESULT (STDMETHODCALLTYPE *SetVariableCurveChangeHandler)(
        IUIAnimationVariable2 *This,
        IUIAnimationVariableCurveChangeHandler2 *handler);

    END_INTERFACE
} IUIAnimationVariable2Vtbl;

interface IUIAnimationVariable2 {
    CONST_VTBL IUIAnimationVariable2Vtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IUIAnimationVariable2_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IUIAnimationVariable2_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IUIAnimationVariable2_Release(This) (This)->lpVtbl->Release(This)
/*** IUIAnimationVariable2 methods ***/
#define IUIAnimationVariable2_GetDimension(This,dimension) (This)->lpVtbl->GetDimension(This,dimension)
#define IUIAnimationVariable2_GetValue(This,value) (This)->lpVtbl->GetValue(This,value)
#define IUIAnimationVariable2_GetVectorValue(This,value,cDimension) (This)->lpVtbl->GetVectorValue(This,value,cDimension)
#define IUIAnimationVariable2_GetCurve(This,animation) (This)->lpVtbl->GetCurve(This,animation)
#define IUIAnimationVariable2_GetVectorCurve(This,animation,cDimension) (This)->lpVtbl->GetVectorCurve(This,animation,cDimension)
#define IUIAnimationVariable2_GetFinalValue(This,finalValue) (This)->lpVtbl->GetFinalValue(This,finalValue)
#define IUIAnimationVariable2_GetFinalVectorValue(This,finalValue,cDimension) (This)->lpVtbl->GetFinalVectorValue(This,finalValue,cDimension)
#define IUIAnimationVariable2_GetPreviousValue(This,previousValue) (This)->lpVtbl->GetPreviousValue(This,previousValue)
#define IUIAnimationVariable2_GetPreviousVectorValue(This,previousValue,cDimension) (This)->lpVtbl->GetPreviousVectorValue(This,previousValue,cDimension)
#define IUIAnimationVariable2_GetIntegerValue(This,value) (This)->lpVtbl->GetIntegerValue(This,value)
#define IUIAnimationVariable2_GetIntegerVectorValue(This,value,cDimension) (This)->lpVtbl->GetIntegerVectorValue(This,value,cDimension)
#define IUIAnimationVariable2_GetFinalIntegerValue(This,finalValue) (This)->lpVtbl->GetFinalIntegerValue(This,finalValue)
#define IUIAnimationVariable2_GetFinalIntegerVectorValue(This,finalValue,cDimension) (This)->lpVtbl->GetFinalIntegerVectorValue(This,finalValue,cDimension)
#define IUIAnimationVariable2_GetPreviousIntegerValue(This,previousValue) (This)->lpVtbl->GetPreviousIntegerValue(This,previousValue)
#define IUIAnimationVariable2_GetPreviousIntegerVectorValue(This,previousValue,cDimension) (This)->lpVtbl->GetPreviousIntegerVectorValue(This,previousValue,cDimension)
#define IUIAnimationVariable2_GetCurrentStoryboard(This,storyboard) (This)->lpVtbl->GetCurrentStoryboard(This,storyboard)
#define IUIAnimationVariable2_SetLowerBound(This,bound) (This)->lpVtbl->SetLowerBound(This,bound)
#define IUIAnimationVariable2_SetLowerBoundVector(This,bound,cDimension) (This)->lpVtbl->SetLowerBoundVector(This,bound,cDimension)
#define IUIAnimationVariable2_SetUpperBound(This,bound) (This)->lpVtbl->SetUpperBound(This,bound)
#define IUIAnimationVariable2_SetUpperBoundVector(This,bound,cDimension) (This)->lpVtbl->SetUpperBoundVector(This,bound,cDimension)
#define IUIAnimationVariable2_SetRoundingMode(This,mode) (This)->lpVtbl->SetRoundingMode(This,mode)
#define IUIAnimationVariable2_SetTag(This,object,id) (This)->lpVtbl->SetTag(This,object,id)
#define IUIAnimationVariable2_GetTag(This,object,id) (This)->lpVtbl->GetTag(This,object,id)
#define IUIAnimationVariable2_SetVariableChangeHandler(This,handler,fRegisterForNextAnimationEvent) (This)->lpVtbl->SetVariableChangeHandler(This,handler,fRegisterForNextAnimationEvent)
#define IUIAnimationVariable2_SetVariableIntegerChangeHandler(This,handler,fRegisterForNextAnimationEvent) (This)->lpVtbl->SetVariableIntegerChangeHandler(This,handler,fRegisterForNextAnimationEvent)
#define IUIAnimationVariable2_SetVariableCurveChangeHandler(This,handler) (This)->lpVtbl->SetVariableCurveChangeHandler(This,handler)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IUIAnimationVariable2_QueryInterface(IUIAnimationVariable2* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IUIAnimationVariable2_AddRef(IUIAnimationVariable2* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IUIAnimationVariable2_Release(IUIAnimationVariable2* This) {
    return This->lpVtbl->Release(This);
}
/*** IUIAnimationVariable2 methods ***/
static FORCEINLINE HRESULT IUIAnimationVariable2_GetDimension(IUIAnimationVariable2* This,unsigned int *dimension) {
    return This->lpVtbl->GetDimension(This,dimension);
}
static FORCEINLINE HRESULT IUIAnimationVariable2_GetValue(IUIAnimationVariable2* This,double *value) {
    return This->lpVtbl->GetValue(This,value);
}
static FORCEINLINE HRESULT IUIAnimationVariable2_GetVectorValue(IUIAnimationVariable2* This,double *value,unsigned int cDimension) {
    return This->lpVtbl->GetVectorValue(This,value,cDimension);
}
static FORCEINLINE HRESULT IUIAnimationVariable2_GetCurve(IUIAnimationVariable2* This,IDCompositionAnimation *animation) {
    return This->lpVtbl->GetCurve(This,animation);
}
static FORCEINLINE HRESULT IUIAnimationVariable2_GetVectorCurve(IUIAnimationVariable2* This,IDCompositionAnimation **animation,unsigned int cDimension) {
    return This->lpVtbl->GetVectorCurve(This,animation,cDimension);
}
static FORCEINLINE HRESULT IUIAnimationVariable2_GetFinalValue(IUIAnimationVariable2* This,double *finalValue) {
    return This->lpVtbl->GetFinalValue(This,finalValue);
}
static FORCEINLINE HRESULT IUIAnimationVariable2_GetFinalVectorValue(IUIAnimationVariable2* This,double *finalValue,unsigned int cDimension) {
    return This->lpVtbl->GetFinalVectorValue(This,finalValue,cDimension);
}
static FORCEINLINE HRESULT IUIAnimationVariable2_GetPreviousValue(IUIAnimationVariable2* This,double *previousValue) {
    return This->lpVtbl->GetPreviousValue(This,previousValue);
}
static FORCEINLINE HRESULT IUIAnimationVariable2_GetPreviousVectorValue(IUIAnimationVariable2* This,double *previousValue,unsigned int cDimension) {
    return This->lpVtbl->GetPreviousVectorValue(This,previousValue,cDimension);
}
static FORCEINLINE HRESULT IUIAnimationVariable2_GetIntegerValue(IUIAnimationVariable2* This,int *value) {
    return This->lpVtbl->GetIntegerValue(This,value);
}
static FORCEINLINE HRESULT IUIAnimationVariable2_GetIntegerVectorValue(IUIAnimationVariable2* This,int *value,unsigned int cDimension) {
    return This->lpVtbl->GetIntegerVectorValue(This,value,cDimension);
}
static FORCEINLINE HRESULT IUIAnimationVariable2_GetFinalIntegerValue(IUIAnimationVariable2* This,int *finalValue) {
    return This->lpVtbl->GetFinalIntegerValue(This,finalValue);
}
static FORCEINLINE HRESULT IUIAnimationVariable2_GetFinalIntegerVectorValue(IUIAnimationVariable2* This,int *finalValue,unsigned int cDimension) {
    return This->lpVtbl->GetFinalIntegerVectorValue(This,finalValue,cDimension);
}
static FORCEINLINE HRESULT IUIAnimationVariable2_GetPreviousIntegerValue(IUIAnimationVariable2* This,int *previousValue) {
    return This->lpVtbl->GetPreviousIntegerValue(This,previousValue);
}
static FORCEINLINE HRESULT IUIAnimationVariable2_GetPreviousIntegerVectorValue(IUIAnimationVariable2* This,int *previousValue,unsigned int cDimension) {
    return This->lpVtbl->GetPreviousIntegerVectorValue(This,previousValue,cDimension);
}
static FORCEINLINE HRESULT IUIAnimationVariable2_GetCurrentStoryboard(IUIAnimationVariable2* This,IUIAnimationStoryboard2 **storyboard) {
    return This->lpVtbl->GetCurrentStoryboard(This,storyboard);
}
static FORCEINLINE HRESULT IUIAnimationVariable2_SetLowerBound(IUIAnimationVariable2* This,double bound) {
    return This->lpVtbl->SetLowerBound(This,bound);
}
static FORCEINLINE HRESULT IUIAnimationVariable2_SetLowerBoundVector(IUIAnimationVariable2* This,double *bound,unsigned int cDimension) {
    return This->lpVtbl->SetLowerBoundVector(This,bound,cDimension);
}
static FORCEINLINE HRESULT IUIAnimationVariable2_SetUpperBound(IUIAnimationVariable2* This,double bound) {
    return This->lpVtbl->SetUpperBound(This,bound);
}
static FORCEINLINE HRESULT IUIAnimationVariable2_SetUpperBoundVector(IUIAnimationVariable2* This,double *bound,unsigned int cDimension) {
    return This->lpVtbl->SetUpperBoundVector(This,bound,cDimension);
}
static FORCEINLINE HRESULT IUIAnimationVariable2_SetRoundingMode(IUIAnimationVariable2* This,UI_ANIMATION_ROUNDING_MODE mode) {
    return This->lpVtbl->SetRoundingMode(This,mode);
}
static FORCEINLINE HRESULT IUIAnimationVariable2_SetTag(IUIAnimationVariable2* This,IUnknown *object,unsigned int id) {
    return This->lpVtbl->SetTag(This,object,id);
}
static FORCEINLINE HRESULT IUIAnimationVariable2_GetTag(IUIAnimationVariable2* This,IUnknown **object,unsigned int *id) {
    return This->lpVtbl->GetTag(This,object,id);
}
static FORCEINLINE HRESULT IUIAnimationVariable2_SetVariableChangeHandler(IUIAnimationVariable2* This,IUIAnimationVariableChangeHandler2 *handler,LONG fRegisterForNextAnimationEvent) {
    return This->lpVtbl->SetVariableChangeHandler(This,handler,fRegisterForNextAnimationEvent);
}
static FORCEINLINE HRESULT IUIAnimationVariable2_SetVariableIntegerChangeHandler(IUIAnimationVariable2* This,IUIAnimationVariableIntegerChangeHandler2 *handler,LONG fRegisterForNextAnimationEvent) {
    return This->lpVtbl->SetVariableIntegerChangeHandler(This,handler,fRegisterForNextAnimationEvent);
}
static FORCEINLINE HRESULT IUIAnimationVariable2_SetVariableCurveChangeHandler(IUIAnimationVariable2* This,IUIAnimationVariableCurveChangeHandler2 *handler) {
    return This->lpVtbl->SetVariableCurveChangeHandler(This,handler);
}
#endif
#endif

#endif


#endif  /* __IUIAnimationVariable2_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IDCompositionAnimation interface
 */
#ifndef __IDCompositionAnimation_INTERFACE_DEFINED__
#define __IDCompositionAnimation_INTERFACE_DEFINED__

DEFINE_GUID(IID_IDCompositionAnimation, 0xcbfd91d9, 0x51b2, 0x45e4, 0xb3,0xde, 0xd1,0x9c,0xcf,0xb8,0x63,0xc5);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("cbfd91d9-51b2-45e4-b3de-d19ccfb863c5")
IDCompositionAnimation : public IUnknown
{
    virtual HRESULT STDMETHODCALLTYPE Reset(
        ) = 0;

    virtual HRESULT STDMETHODCALLTYPE SetAbsoluteBeginTime(
        LARGE_INTEGER beginTime) = 0;

    virtual HRESULT STDMETHODCALLTYPE AddCubic(
        double beginOffset,
        float constantCoefficient,
        float linearCoefficient,
        float quadraticCoefficient,
        float cubicCoefficient) = 0;

    virtual HRESULT STDMETHODCALLTYPE AddSinusoidal(
        double beginOffset,
        float bias,
        float amplitude,
        float frequency,
        float phase) = 0;

    virtual HRESULT STDMETHODCALLTYPE AddRepeat(
        double beginOffset,
        double durationToRepeat) = 0;

    virtual HRESULT STDMETHODCALLTYPE End(
        double endOffset,
        float endValue) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IDCompositionAnimation, 0xcbfd91d9, 0x51b2, 0x45e4, 0xb3,0xde, 0xd1,0x9c,0xcf,0xb8,0x63,0xc5)
#endif
#else
typedef struct IDCompositionAnimationVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        IDCompositionAnimation *This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        IDCompositionAnimation *This);

    ULONG (STDMETHODCALLTYPE *Release)(
        IDCompositionAnimation *This);

    /*** IDCompositionAnimation methods ***/
    HRESULT (STDMETHODCALLTYPE *Reset)(
        IDCompositionAnimation *This);

    HRESULT (STDMETHODCALLTYPE *SetAbsoluteBeginTime)(
        IDCompositionAnimation *This,
        LARGE_INTEGER beginTime);

    HRESULT (STDMETHODCALLTYPE *AddCubic)(
        IDCompositionAnimation *This,
        double beginOffset,
        float constantCoefficient,
        float linearCoefficient,
        float quadraticCoefficient,
        float cubicCoefficient);

    HRESULT (STDMETHODCALLTYPE *AddSinusoidal)(
        IDCompositionAnimation *This,
        double beginOffset,
        float bias,
        float amplitude,
        float frequency,
        float phase);

    HRESULT (STDMETHODCALLTYPE *AddRepeat)(
        IDCompositionAnimation *This,
        double beginOffset,
        double durationToRepeat);

    HRESULT (STDMETHODCALLTYPE *End)(
        IDCompositionAnimation *This,
        double endOffset,
        float endValue);

    END_INTERFACE
} IDCompositionAnimationVtbl;

interface IDCompositionAnimation {
    CONST_VTBL IDCompositionAnimationVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IDCompositionAnimation_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IDCompositionAnimation_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IDCompositionAnimation_Release(This) (This)->lpVtbl->Release(This)
/*** IDCompositionAnimation methods ***/
#define IDCompositionAnimation_Reset(This) (This)->lpVtbl->Reset(This)
#define IDCompositionAnimation_SetAbsoluteBeginTime(This,beginTime) (This)->lpVtbl->SetAbsoluteBeginTime(This,beginTime)
#define IDCompositionAnimation_AddCubic(This,beginOffset,constantCoefficient,linearCoefficient,quadraticCoefficient,cubicCoefficient) (This)->lpVtbl->AddCubic(This,beginOffset,constantCoefficient,linearCoefficient,quadraticCoefficient,cubicCoefficient)
#define IDCompositionAnimation_AddSinusoidal(This,beginOffset,bias,amplitude,frequency,phase) (This)->lpVtbl->AddSinusoidal(This,beginOffset,bias,amplitude,frequency,phase)
#define IDCompositionAnimation_AddRepeat(This,beginOffset,durationToRepeat) (This)->lpVtbl->AddRepeat(This,beginOffset,durationToRepeat)
#define IDCompositionAnimation_End(This,endOffset,endValue) (This)->lpVtbl->End(This,endOffset,endValue)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IDCompositionAnimation_QueryInterface(IDCompositionAnimation* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IDCompositionAnimation_AddRef(IDCompositionAnimation* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IDCompositionAnimation_Release(IDCompositionAnimation* This) {
    return This->lpVtbl->Release(This);
}
/*** IDCompositionAnimation methods ***/
static FORCEINLINE HRESULT IDCompositionAnimation_Reset(IDCompositionAnimation* This) {
    return This->lpVtbl->Reset(This);
}
static FORCEINLINE HRESULT IDCompositionAnimation_SetAbsoluteBeginTime(IDCompositionAnimation* This,LARGE_INTEGER beginTime) {
    return This->lpVtbl->SetAbsoluteBeginTime(This,beginTime);
}
static FORCEINLINE HRESULT IDCompositionAnimation_AddCubic(IDCompositionAnimation* This,double beginOffset,float constantCoefficient,float linearCoefficient,float quadraticCoefficient,float cubicCoefficient) {
    return This->lpVtbl->AddCubic(This,beginOffset,constantCoefficient,linearCoefficient,quadraticCoefficient,cubicCoefficient);
}
static FORCEINLINE HRESULT IDCompositionAnimation_AddSinusoidal(IDCompositionAnimation* This,double beginOffset,float bias,float amplitude,float frequency,float phase) {
    return This->lpVtbl->AddSinusoidal(This,beginOffset,bias,amplitude,frequency,phase);
}
static FORCEINLINE HRESULT IDCompositionAnimation_AddRepeat(IDCompositionAnimation* This,double beginOffset,double durationToRepeat) {
    return This->lpVtbl->AddRepeat(This,beginOffset,durationToRepeat);
}
static FORCEINLINE HRESULT IDCompositionAnimation_End(IDCompositionAnimation* This,double endOffset,float endValue) {
    return This->lpVtbl->End(This,endOffset,endValue);
}
#endif
#endif

#endif


#endif  /* __IDCompositionAnimation_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IUIAnimationStoryboard2 interface
 */
#ifndef __IUIAnimationStoryboard2_INTERFACE_DEFINED__
#define __IUIAnimationStoryboard2_INTERFACE_DEFINED__

DEFINE_GUID(IID_IUIAnimationStoryboard2, 0xae289cd2, 0x12d4, 0x4945, 0x94,0x19, 0x9e,0x41,0xbe,0x03,0x4d,0xf2);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("ae289cd2-12d4-4945-9419-9e41be034df2")
IUIAnimationStoryboard2 : public IUnknown
{
    virtual HRESULT STDMETHODCALLTYPE AddTransition(
        IUIAnimationVariable2 *variable,
        IUIAnimationTransition2 *transition) = 0;

    virtual HRESULT STDMETHODCALLTYPE AddKeyframeAtOffset(
        UI_ANIMATION_KEYFRAME existingKeyframe,
        double offset,
        UI_ANIMATION_KEYFRAME *keyframe) = 0;

    virtual HRESULT STDMETHODCALLTYPE AddKeyframeAfterTransition(
        IUIAnimationTransition2 *transition,
        UI_ANIMATION_KEYFRAME *keyframe) = 0;

    virtual HRESULT STDMETHODCALLTYPE AddTransitionAtKeyframe(
        IUIAnimationVariable2 *variable,
        IUIAnimationTransition2 *transition,
        UI_ANIMATION_KEYFRAME startKeyframe) = 0;

    virtual HRESULT STDMETHODCALLTYPE AddTransitionBetweenKeyframes(
        IUIAnimationVariable2 *variable,
        IUIAnimationTransition2 *transition,
        UI_ANIMATION_KEYFRAME startKeyframe,
        UI_ANIMATION_KEYFRAME endKeyframe) = 0;

    virtual HRESULT STDMETHODCALLTYPE RepeatBetweenKeyframes(
        UI_ANIMATION_KEYFRAME startKeyframe,
        UI_ANIMATION_KEYFRAME endKeyframe,
        double cRepetition,
        UI_ANIMATION_REPEAT_MODE repeatMode,
        IUIAnimationLoopIterationChangeHandler2 *pIterationChangeHandler = 0,
        UINT_PTR id = 0,
        LONG fRegisterForNextAnimationEvent = FALSE) = 0;

    virtual HRESULT STDMETHODCALLTYPE HoldVariable(
        IUIAnimationVariable2 *variable) = 0;

    virtual HRESULT STDMETHODCALLTYPE SetLongestAcceptableDelay(
        double delay) = 0;

    virtual HRESULT STDMETHODCALLTYPE SetSkipDuration(
        double secondsDuration) = 0;

    virtual HRESULT STDMETHODCALLTYPE Schedule(
        double timeNow,
        UI_ANIMATION_SCHEDULING_RESULT *schedulingResult = 0) = 0;

    virtual HRESULT STDMETHODCALLTYPE Conclude(
        ) = 0;

    virtual HRESULT STDMETHODCALLTYPE Finish(
        double completionDeadline) = 0;

    virtual HRESULT STDMETHODCALLTYPE Abandon(
        ) = 0;

    virtual HRESULT STDMETHODCALLTYPE SetTag(
        IUnknown *object,
        unsigned int id) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetTag(
        IUnknown **object,
        unsigned int *id) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetStatus(
        UI_ANIMATION_STORYBOARD_STATUS *status) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetElapsedTime(
        double *elapsedTime) = 0;

    virtual HRESULT STDMETHODCALLTYPE SetStoryboardEventHandler(
        IUIAnimationStoryboardEventHandler2 *handler,
        LONG fRegisterStatusChangeForNextAnimationEvent = FALSE,
        LONG fRegisterUpdateForNextAnimationEvent = FALSE) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IUIAnimationStoryboard2, 0xae289cd2, 0x12d4, 0x4945, 0x94,0x19, 0x9e,0x41,0xbe,0x03,0x4d,0xf2)
#endif
#else
typedef struct IUIAnimationStoryboard2Vtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        IUIAnimationStoryboard2 *This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        IUIAnimationStoryboard2 *This);

    ULONG (STDMETHODCALLTYPE *Release)(
        IUIAnimationStoryboard2 *This);

    /*** IUIAnimationStoryboard2 methods ***/
    HRESULT (STDMETHODCALLTYPE *AddTransition)(
        IUIAnimationStoryboard2 *This,
        IUIAnimationVariable2 *variable,
        IUIAnimationTransition2 *transition);

    HRESULT (STDMETHODCALLTYPE *AddKeyframeAtOffset)(
        IUIAnimationStoryboard2 *This,
        UI_ANIMATION_KEYFRAME existingKeyframe,
        double offset,
        UI_ANIMATION_KEYFRAME *keyframe);

    HRESULT (STDMETHODCALLTYPE *AddKeyframeAfterTransition)(
        IUIAnimationStoryboard2 *This,
        IUIAnimationTransition2 *transition,
        UI_ANIMATION_KEYFRAME *keyframe);

    HRESULT (STDMETHODCALLTYPE *AddTransitionAtKeyframe)(
        IUIAnimationStoryboard2 *This,
        IUIAnimationVariable2 *variable,
        IUIAnimationTransition2 *transition,
        UI_ANIMATION_KEYFRAME startKeyframe);

    HRESULT (STDMETHODCALLTYPE *AddTransitionBetweenKeyframes)(
        IUIAnimationStoryboard2 *This,
        IUIAnimationVariable2 *variable,
        IUIAnimationTransition2 *transition,
        UI_ANIMATION_KEYFRAME startKeyframe,
        UI_ANIMATION_KEYFRAME endKeyframe);

    HRESULT (STDMETHODCALLTYPE *RepeatBetweenKeyframes)(
        IUIAnimationStoryboard2 *This,
        UI_ANIMATION_KEYFRAME startKeyframe,
        UI_ANIMATION_KEYFRAME endKeyframe,
        double cRepetition,
        UI_ANIMATION_REPEAT_MODE repeatMode,
        IUIAnimationLoopIterationChangeHandler2 *pIterationChangeHandler,
        UINT_PTR id,
        LONG fRegisterForNextAnimationEvent);

    HRESULT (STDMETHODCALLTYPE *HoldVariable)(
        IUIAnimationStoryboard2 *This,
        IUIAnimationVariable2 *variable);

    HRESULT (STDMETHODCALLTYPE *SetLongestAcceptableDelay)(
        IUIAnimationStoryboard2 *This,
        double delay);

    HRESULT (STDMETHODCALLTYPE *SetSkipDuration)(
        IUIAnimationStoryboard2 *This,
        double secondsDuration);

    HRESULT (STDMETHODCALLTYPE *Schedule)(
        IUIAnimationStoryboard2 *This,
        double timeNow,
        UI_ANIMATION_SCHEDULING_RESULT *schedulingResult);

    HRESULT (STDMETHODCALLTYPE *Conclude)(
        IUIAnimationStoryboard2 *This);

    HRESULT (STDMETHODCALLTYPE *Finish)(
        IUIAnimationStoryboard2 *This,
        double completionDeadline);

    HRESULT (STDMETHODCALLTYPE *Abandon)(
        IUIAnimationStoryboard2 *This);

    HRESULT (STDMETHODCALLTYPE *SetTag)(
        IUIAnimationStoryboard2 *This,
        IUnknown *object,
        unsigned int id);

    HRESULT (STDMETHODCALLTYPE *GetTag)(
        IUIAnimationStoryboard2 *This,
        IUnknown **object,
        unsigned int *id);

    HRESULT (STDMETHODCALLTYPE *GetStatus)(
        IUIAnimationStoryboard2 *This,
        UI_ANIMATION_STORYBOARD_STATUS *status);

    HRESULT (STDMETHODCALLTYPE *GetElapsedTime)(
        IUIAnimationStoryboard2 *This,
        double *elapsedTime);

    HRESULT (STDMETHODCALLTYPE *SetStoryboardEventHandler)(
        IUIAnimationStoryboard2 *This,
        IUIAnimationStoryboardEventHandler2 *handler,
        LONG fRegisterStatusChangeForNextAnimationEvent,
        LONG fRegisterUpdateForNextAnimationEvent);

    END_INTERFACE
} IUIAnimationStoryboard2Vtbl;

interface IUIAnimationStoryboard2 {
    CONST_VTBL IUIAnimationStoryboard2Vtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IUIAnimationStoryboard2_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IUIAnimationStoryboard2_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IUIAnimationStoryboard2_Release(This) (This)->lpVtbl->Release(This)
/*** IUIAnimationStoryboard2 methods ***/
#define IUIAnimationStoryboard2_AddTransition(This,variable,transition) (This)->lpVtbl->AddTransition(This,variable,transition)
#define IUIAnimationStoryboard2_AddKeyframeAtOffset(This,existingKeyframe,offset,keyframe) (This)->lpVtbl->AddKeyframeAtOffset(This,existingKeyframe,offset,keyframe)
#define IUIAnimationStoryboard2_AddKeyframeAfterTransition(This,transition,keyframe) (This)->lpVtbl->AddKeyframeAfterTransition(This,transition,keyframe)
#define IUIAnimationStoryboard2_AddTransitionAtKeyframe(This,variable,transition,startKeyframe) (This)->lpVtbl->AddTransitionAtKeyframe(This,variable,transition,startKeyframe)
#define IUIAnimationStoryboard2_AddTransitionBetweenKeyframes(This,variable,transition,startKeyframe,endKeyframe) (This)->lpVtbl->AddTransitionBetweenKeyframes(This,variable,transition,startKeyframe,endKeyframe)
#define IUIAnimationStoryboard2_RepeatBetweenKeyframes(This,startKeyframe,endKeyframe,cRepetition,repeatMode,pIterationChangeHandler,id,fRegisterForNextAnimationEvent) (This)->lpVtbl->RepeatBetweenKeyframes(This,startKeyframe,endKeyframe,cRepetition,repeatMode,pIterationChangeHandler,id,fRegisterForNextAnimationEvent)
#define IUIAnimationStoryboard2_HoldVariable(This,variable) (This)->lpVtbl->HoldVariable(This,variable)
#define IUIAnimationStoryboard2_SetLongestAcceptableDelay(This,delay) (This)->lpVtbl->SetLongestAcceptableDelay(This,delay)
#define IUIAnimationStoryboard2_SetSkipDuration(This,secondsDuration) (This)->lpVtbl->SetSkipDuration(This,secondsDuration)
#define IUIAnimationStoryboard2_Schedule(This,timeNow,schedulingResult) (This)->lpVtbl->Schedule(This,timeNow,schedulingResult)
#define IUIAnimationStoryboard2_Conclude(This) (This)->lpVtbl->Conclude(This)
#define IUIAnimationStoryboard2_Finish(This,completionDeadline) (This)->lpVtbl->Finish(This,completionDeadline)
#define IUIAnimationStoryboard2_Abandon(This) (This)->lpVtbl->Abandon(This)
#define IUIAnimationStoryboard2_SetTag(This,object,id) (This)->lpVtbl->SetTag(This,object,id)
#define IUIAnimationStoryboard2_GetTag(This,object,id) (This)->lpVtbl->GetTag(This,object,id)
#define IUIAnimationStoryboard2_GetStatus(This,status) (This)->lpVtbl->GetStatus(This,status)
#define IUIAnimationStoryboard2_GetElapsedTime(This,elapsedTime) (This)->lpVtbl->GetElapsedTime(This,elapsedTime)
#define IUIAnimationStoryboard2_SetStoryboardEventHandler(This,handler,fRegisterStatusChangeForNextAnimationEvent,fRegisterUpdateForNextAnimationEvent) (This)->lpVtbl->SetStoryboardEventHandler(This,handler,fRegisterStatusChangeForNextAnimationEvent,fRegisterUpdateForNextAnimationEvent)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IUIAnimationStoryboard2_QueryInterface(IUIAnimationStoryboard2* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IUIAnimationStoryboard2_AddRef(IUIAnimationStoryboard2* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IUIAnimationStoryboard2_Release(IUIAnimationStoryboard2* This) {
    return This->lpVtbl->Release(This);
}
/*** IUIAnimationStoryboard2 methods ***/
static FORCEINLINE HRESULT IUIAnimationStoryboard2_AddTransition(IUIAnimationStoryboard2* This,IUIAnimationVariable2 *variable,IUIAnimationTransition2 *transition) {
    return This->lpVtbl->AddTransition(This,variable,transition);
}
static FORCEINLINE HRESULT IUIAnimationStoryboard2_AddKeyframeAtOffset(IUIAnimationStoryboard2* This,UI_ANIMATION_KEYFRAME existingKeyframe,double offset,UI_ANIMATION_KEYFRAME *keyframe) {
    return This->lpVtbl->AddKeyframeAtOffset(This,existingKeyframe,offset,keyframe);
}
static FORCEINLINE HRESULT IUIAnimationStoryboard2_AddKeyframeAfterTransition(IUIAnimationStoryboard2* This,IUIAnimationTransition2 *transition,UI_ANIMATION_KEYFRAME *keyframe) {
    return This->lpVtbl->AddKeyframeAfterTransition(This,transition,keyframe);
}
static FORCEINLINE HRESULT IUIAnimationStoryboard2_AddTransitionAtKeyframe(IUIAnimationStoryboard2* This,IUIAnimationVariable2 *variable,IUIAnimationTransition2 *transition,UI_ANIMATION_KEYFRAME startKeyframe) {
    return This->lpVtbl->AddTransitionAtKeyframe(This,variable,transition,startKeyframe);
}
static FORCEINLINE HRESULT IUIAnimationStoryboard2_AddTransitionBetweenKeyframes(IUIAnimationStoryboard2* This,IUIAnimationVariable2 *variable,IUIAnimationTransition2 *transition,UI_ANIMATION_KEYFRAME startKeyframe,UI_ANIMATION_KEYFRAME endKeyframe) {
    return This->lpVtbl->AddTransitionBetweenKeyframes(This,variable,transition,startKeyframe,endKeyframe);
}
static FORCEINLINE HRESULT IUIAnimationStoryboard2_RepeatBetweenKeyframes(IUIAnimationStoryboard2* This,UI_ANIMATION_KEYFRAME startKeyframe,UI_ANIMATION_KEYFRAME endKeyframe,double cRepetition,UI_ANIMATION_REPEAT_MODE repeatMode,IUIAnimationLoopIterationChangeHandler2 *pIterationChangeHandler,UINT_PTR id,LONG fRegisterForNextAnimationEvent) {
    return This->lpVtbl->RepeatBetweenKeyframes(This,startKeyframe,endKeyframe,cRepetition,repeatMode,pIterationChangeHandler,id,fRegisterForNextAnimationEvent);
}
static FORCEINLINE HRESULT IUIAnimationStoryboard2_HoldVariable(IUIAnimationStoryboard2* This,IUIAnimationVariable2 *variable) {
    return This->lpVtbl->HoldVariable(This,variable);
}
static FORCEINLINE HRESULT IUIAnimationStoryboard2_SetLongestAcceptableDelay(IUIAnimationStoryboard2* This,double delay) {
    return This->lpVtbl->SetLongestAcceptableDelay(This,delay);
}
static FORCEINLINE HRESULT IUIAnimationStoryboard2_SetSkipDuration(IUIAnimationStoryboard2* This,double secondsDuration) {
    return This->lpVtbl->SetSkipDuration(This,secondsDuration);
}
static FORCEINLINE HRESULT IUIAnimationStoryboard2_Schedule(IUIAnimationStoryboard2* This,double timeNow,UI_ANIMATION_SCHEDULING_RESULT *schedulingResult) {
    return This->lpVtbl->Schedule(This,timeNow,schedulingResult);
}
static FORCEINLINE HRESULT IUIAnimationStoryboard2_Conclude(IUIAnimationStoryboard2* This) {
    return This->lpVtbl->Conclude(This);
}
static FORCEINLINE HRESULT IUIAnimationStoryboard2_Finish(IUIAnimationStoryboard2* This,double completionDeadline) {
    return This->lpVtbl->Finish(This,completionDeadline);
}
static FORCEINLINE HRESULT IUIAnimationStoryboard2_Abandon(IUIAnimationStoryboard2* This) {
    return This->lpVtbl->Abandon(This);
}
static FORCEINLINE HRESULT IUIAnimationStoryboard2_SetTag(IUIAnimationStoryboard2* This,IUnknown *object,unsigned int id) {
    return This->lpVtbl->SetTag(This,object,id);
}
static FORCEINLINE HRESULT IUIAnimationStoryboard2_GetTag(IUIAnimationStoryboard2* This,IUnknown **object,unsigned int *id) {
    return This->lpVtbl->GetTag(This,object,id);
}
static FORCEINLINE HRESULT IUIAnimationStoryboard2_GetStatus(IUIAnimationStoryboard2* This,UI_ANIMATION_STORYBOARD_STATUS *status) {
    return This->lpVtbl->GetStatus(This,status);
}
static FORCEINLINE HRESULT IUIAnimationStoryboard2_GetElapsedTime(IUIAnimationStoryboard2* This,double *elapsedTime) {
    return This->lpVtbl->GetElapsedTime(This,elapsedTime);
}
static FORCEINLINE HRESULT IUIAnimationStoryboard2_SetStoryboardEventHandler(IUIAnimationStoryboard2* This,IUIAnimationStoryboardEventHandler2 *handler,LONG fRegisterStatusChangeForNextAnimationEvent,LONG fRegisterUpdateForNextAnimationEvent) {
    return This->lpVtbl->SetStoryboardEventHandler(This,handler,fRegisterStatusChangeForNextAnimationEvent,fRegisterUpdateForNextAnimationEvent);
}
#endif
#endif

#endif


#endif  /* __IUIAnimationStoryboard2_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IUIAnimationTransition2 interface
 */
#ifndef __IUIAnimationTransition2_INTERFACE_DEFINED__
#define __IUIAnimationTransition2_INTERFACE_DEFINED__

DEFINE_GUID(IID_IUIAnimationTransition2, 0x62ff9123, 0xa85a, 0x4e9b, 0xa2,0x18, 0x43,0x5a,0x93,0xe2,0x68,0xfd);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("62ff9123-a85a-4e9b-a218-435a93e268fd")
IUIAnimationTransition2 : public IUnknown
{
    virtual HRESULT STDMETHODCALLTYPE GetDimension(
        unsigned int *dimension) = 0;

    virtual HRESULT STDMETHODCALLTYPE SetInitialValue(
        double value) = 0;

    virtual HRESULT STDMETHODCALLTYPE SetInitialVectorValue(
        double *value,
        unsigned int cDimension) = 0;

    virtual HRESULT STDMETHODCALLTYPE SetInitialVelocity(
        double velocity) = 0;

    virtual HRESULT STDMETHODCALLTYPE SetInitialVectorVelocity(
        double *velocity,
        unsigned int cDimension) = 0;

    virtual HRESULT STDMETHODCALLTYPE IsDurationKnown(
        ) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetDuration(
        double *duration) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IUIAnimationTransition2, 0x62ff9123, 0xa85a, 0x4e9b, 0xa2,0x18, 0x43,0x5a,0x93,0xe2,0x68,0xfd)
#endif
#else
typedef struct IUIAnimationTransition2Vtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        IUIAnimationTransition2 *This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        IUIAnimationTransition2 *This);

    ULONG (STDMETHODCALLTYPE *Release)(
        IUIAnimationTransition2 *This);

    /*** IUIAnimationTransition2 methods ***/
    HRESULT (STDMETHODCALLTYPE *GetDimension)(
        IUIAnimationTransition2 *This,
        unsigned int *dimension);

    HRESULT (STDMETHODCALLTYPE *SetInitialValue)(
        IUIAnimationTransition2 *This,
        double value);

    HRESULT (STDMETHODCALLTYPE *SetInitialVectorValue)(
        IUIAnimationTransition2 *This,
        double *value,
        unsigned int cDimension);

    HRESULT (STDMETHODCALLTYPE *SetInitialVelocity)(
        IUIAnimationTransition2 *This,
        double velocity);

    HRESULT (STDMETHODCALLTYPE *SetInitialVectorVelocity)(
        IUIAnimationTransition2 *This,
        double *velocity,
        unsigned int cDimension);

    HRESULT (STDMETHODCALLTYPE *IsDurationKnown)(
        IUIAnimationTransition2 *This);

    HRESULT (STDMETHODCALLTYPE *GetDuration)(
        IUIAnimationTransition2 *This,
        double *duration);

    END_INTERFACE
} IUIAnimationTransition2Vtbl;

interface IUIAnimationTransition2 {
    CONST_VTBL IUIAnimationTransition2Vtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IUIAnimationTransition2_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IUIAnimationTransition2_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IUIAnimationTransition2_Release(This) (This)->lpVtbl->Release(This)
/*** IUIAnimationTransition2 methods ***/
#define IUIAnimationTransition2_GetDimension(This,dimension) (This)->lpVtbl->GetDimension(This,dimension)
#define IUIAnimationTransition2_SetInitialValue(This,value) (This)->lpVtbl->SetInitialValue(This,value)
#define IUIAnimationTransition2_SetInitialVectorValue(This,value,cDimension) (This)->lpVtbl->SetInitialVectorValue(This,value,cDimension)
#define IUIAnimationTransition2_SetInitialVelocity(This,velocity) (This)->lpVtbl->SetInitialVelocity(This,velocity)
#define IUIAnimationTransition2_SetInitialVectorVelocity(This,velocity,cDimension) (This)->lpVtbl->SetInitialVectorVelocity(This,velocity,cDimension)
#define IUIAnimationTransition2_IsDurationKnown(This) (This)->lpVtbl->IsDurationKnown(This)
#define IUIAnimationTransition2_GetDuration(This,duration) (This)->lpVtbl->GetDuration(This,duration)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IUIAnimationTransition2_QueryInterface(IUIAnimationTransition2* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IUIAnimationTransition2_AddRef(IUIAnimationTransition2* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IUIAnimationTransition2_Release(IUIAnimationTransition2* This) {
    return This->lpVtbl->Release(This);
}
/*** IUIAnimationTransition2 methods ***/
static FORCEINLINE HRESULT IUIAnimationTransition2_GetDimension(IUIAnimationTransition2* This,unsigned int *dimension) {
    return This->lpVtbl->GetDimension(This,dimension);
}
static FORCEINLINE HRESULT IUIAnimationTransition2_SetInitialValue(IUIAnimationTransition2* This,double value) {
    return This->lpVtbl->SetInitialValue(This,value);
}
static FORCEINLINE HRESULT IUIAnimationTransition2_SetInitialVectorValue(IUIAnimationTransition2* This,double *value,unsigned int cDimension) {
    return This->lpVtbl->SetInitialVectorValue(This,value,cDimension);
}
static FORCEINLINE HRESULT IUIAnimationTransition2_SetInitialVelocity(IUIAnimationTransition2* This,double velocity) {
    return This->lpVtbl->SetInitialVelocity(This,velocity);
}
static FORCEINLINE HRESULT IUIAnimationTransition2_SetInitialVectorVelocity(IUIAnimationTransition2* This,double *velocity,unsigned int cDimension) {
    return This->lpVtbl->SetInitialVectorVelocity(This,velocity,cDimension);
}
static FORCEINLINE HRESULT IUIAnimationTransition2_IsDurationKnown(IUIAnimationTransition2* This) {
    return This->lpVtbl->IsDurationKnown(This);
}
static FORCEINLINE HRESULT IUIAnimationTransition2_GetDuration(IUIAnimationTransition2* This,double *duration) {
    return This->lpVtbl->GetDuration(This,duration);
}
#endif
#endif

#endif


#endif  /* __IUIAnimationTransition2_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IUIAnimationLoopIterationChangeHandler2 interface
 */
#ifndef __IUIAnimationLoopIterationChangeHandler2_INTERFACE_DEFINED__
#define __IUIAnimationLoopIterationChangeHandler2_INTERFACE_DEFINED__

DEFINE_GUID(IID_IUIAnimationLoopIterationChangeHandler2, 0x2d3b15a4, 0x4762, 0x47ab, 0xa0,0x30, 0xb2,0x32,0x21,0xdf,0x3a,0xe0);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("2d3b15a4-4762-47ab-a030-b23221df3ae0")
IUIAnimationLoopIterationChangeHandler2 : public IUnknown
{
    virtual HRESULT STDMETHODCALLTYPE OnLoopIterationChanged(
        IUIAnimationStoryboard2 *storyboard,
        UINT_PTR id,
        unsigned int newIterationCount,
        unsigned int oldIterationCount) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IUIAnimationLoopIterationChangeHandler2, 0x2d3b15a4, 0x4762, 0x47ab, 0xa0,0x30, 0xb2,0x32,0x21,0xdf,0x3a,0xe0)
#endif
#else
typedef struct IUIAnimationLoopIterationChangeHandler2Vtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        IUIAnimationLoopIterationChangeHandler2 *This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        IUIAnimationLoopIterationChangeHandler2 *This);

    ULONG (STDMETHODCALLTYPE *Release)(
        IUIAnimationLoopIterationChangeHandler2 *This);

    /*** IUIAnimationLoopIterationChangeHandler2 methods ***/
    HRESULT (STDMETHODCALLTYPE *OnLoopIterationChanged)(
        IUIAnimationLoopIterationChangeHandler2 *This,
        IUIAnimationStoryboard2 *storyboard,
        UINT_PTR id,
        unsigned int newIterationCount,
        unsigned int oldIterationCount);

    END_INTERFACE
} IUIAnimationLoopIterationChangeHandler2Vtbl;

interface IUIAnimationLoopIterationChangeHandler2 {
    CONST_VTBL IUIAnimationLoopIterationChangeHandler2Vtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IUIAnimationLoopIterationChangeHandler2_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IUIAnimationLoopIterationChangeHandler2_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IUIAnimationLoopIterationChangeHandler2_Release(This) (This)->lpVtbl->Release(This)
/*** IUIAnimationLoopIterationChangeHandler2 methods ***/
#define IUIAnimationLoopIterationChangeHandler2_OnLoopIterationChanged(This,storyboard,id,newIterationCount,oldIterationCount) (This)->lpVtbl->OnLoopIterationChanged(This,storyboard,id,newIterationCount,oldIterationCount)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IUIAnimationLoopIterationChangeHandler2_QueryInterface(IUIAnimationLoopIterationChangeHandler2* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IUIAnimationLoopIterationChangeHandler2_AddRef(IUIAnimationLoopIterationChangeHandler2* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IUIAnimationLoopIterationChangeHandler2_Release(IUIAnimationLoopIterationChangeHandler2* This) {
    return This->lpVtbl->Release(This);
}
/*** IUIAnimationLoopIterationChangeHandler2 methods ***/
static FORCEINLINE HRESULT IUIAnimationLoopIterationChangeHandler2_OnLoopIterationChanged(IUIAnimationLoopIterationChangeHandler2* This,IUIAnimationStoryboard2 *storyboard,UINT_PTR id,unsigned int newIterationCount,unsigned int oldIterationCount) {
    return This->lpVtbl->OnLoopIterationChanged(This,storyboard,id,newIterationCount,oldIterationCount);
}
#endif
#endif

#endif


#endif  /* __IUIAnimationLoopIterationChangeHandler2_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IUIAnimationStoryboardEventHandler2 interface
 */
#ifndef __IUIAnimationStoryboardEventHandler2_INTERFACE_DEFINED__
#define __IUIAnimationStoryboardEventHandler2_INTERFACE_DEFINED__

DEFINE_GUID(IID_IUIAnimationStoryboardEventHandler2, 0xbac5f55a, 0xba7c, 0x414c, 0xb5,0x99, 0xfb,0xf8,0x50,0xf5,0x53,0xc6);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("bac5f55a-ba7c-414c-b599-fbf850f553c6")
IUIAnimationStoryboardEventHandler2 : public IUnknown
{
    virtual HRESULT STDMETHODCALLTYPE OnStoryboardStatusChanged(
        IUIAnimationStoryboard2 *storyboard,
        UI_ANIMATION_STORYBOARD_STATUS newStatus,
        UI_ANIMATION_STORYBOARD_STATUS previousStatus) = 0;

    virtual HRESULT STDMETHODCALLTYPE OnStoryboardUpdated(
        IUIAnimationStoryboard2 *storyboard) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IUIAnimationStoryboardEventHandler2, 0xbac5f55a, 0xba7c, 0x414c, 0xb5,0x99, 0xfb,0xf8,0x50,0xf5,0x53,0xc6)
#endif
#else
typedef struct IUIAnimationStoryboardEventHandler2Vtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        IUIAnimationStoryboardEventHandler2 *This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        IUIAnimationStoryboardEventHandler2 *This);

    ULONG (STDMETHODCALLTYPE *Release)(
        IUIAnimationStoryboardEventHandler2 *This);

    /*** IUIAnimationStoryboardEventHandler2 methods ***/
    HRESULT (STDMETHODCALLTYPE *OnStoryboardStatusChanged)(
        IUIAnimationStoryboardEventHandler2 *This,
        IUIAnimationStoryboard2 *storyboard,
        UI_ANIMATION_STORYBOARD_STATUS newStatus,
        UI_ANIMATION_STORYBOARD_STATUS previousStatus);

    HRESULT (STDMETHODCALLTYPE *OnStoryboardUpdated)(
        IUIAnimationStoryboardEventHandler2 *This,
        IUIAnimationStoryboard2 *storyboard);

    END_INTERFACE
} IUIAnimationStoryboardEventHandler2Vtbl;

interface IUIAnimationStoryboardEventHandler2 {
    CONST_VTBL IUIAnimationStoryboardEventHandler2Vtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IUIAnimationStoryboardEventHandler2_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IUIAnimationStoryboardEventHandler2_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IUIAnimationStoryboardEventHandler2_Release(This) (This)->lpVtbl->Release(This)
/*** IUIAnimationStoryboardEventHandler2 methods ***/
#define IUIAnimationStoryboardEventHandler2_OnStoryboardStatusChanged(This,storyboard,newStatus,previousStatus) (This)->lpVtbl->OnStoryboardStatusChanged(This,storyboard,newStatus,previousStatus)
#define IUIAnimationStoryboardEventHandler2_OnStoryboardUpdated(This,storyboard) (This)->lpVtbl->OnStoryboardUpdated(This,storyboard)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IUIAnimationStoryboardEventHandler2_QueryInterface(IUIAnimationStoryboardEventHandler2* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IUIAnimationStoryboardEventHandler2_AddRef(IUIAnimationStoryboardEventHandler2* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IUIAnimationStoryboardEventHandler2_Release(IUIAnimationStoryboardEventHandler2* This) {
    return This->lpVtbl->Release(This);
}
/*** IUIAnimationStoryboardEventHandler2 methods ***/
static FORCEINLINE HRESULT IUIAnimationStoryboardEventHandler2_OnStoryboardStatusChanged(IUIAnimationStoryboardEventHandler2* This,IUIAnimationStoryboard2 *storyboard,UI_ANIMATION_STORYBOARD_STATUS newStatus,UI_ANIMATION_STORYBOARD_STATUS previousStatus) {
    return This->lpVtbl->OnStoryboardStatusChanged(This,storyboard,newStatus,previousStatus);
}
static FORCEINLINE HRESULT IUIAnimationStoryboardEventHandler2_OnStoryboardUpdated(IUIAnimationStoryboardEventHandler2* This,IUIAnimationStoryboard2 *storyboard) {
    return This->lpVtbl->OnStoryboardUpdated(This,storyboard);
}
#endif
#endif

#endif


#endif  /* __IUIAnimationStoryboardEventHandler2_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IUIAnimationVariableChangeHandler2 interface
 */
#ifndef __IUIAnimationVariableChangeHandler2_INTERFACE_DEFINED__
#define __IUIAnimationVariableChangeHandler2_INTERFACE_DEFINED__

DEFINE_GUID(IID_IUIAnimationVariableChangeHandler2, 0x63acc8d2, 0x6eae, 0x4bb0, 0xb8,0x79, 0x58,0x6d,0xd8,0xcf,0xbe,0x42);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("63acc8d2-6eae-4bb0-b879-586dd8cfbe42")
IUIAnimationVariableChangeHandler2 : public IUnknown
{
    virtual HRESULT STDMETHODCALLTYPE OnValueChanged(
        IUIAnimationStoryboard2 *storyboard,
        IUIAnimationVariable2 *variable,
        double *newValue,
        double *previousValue,
        unsigned int cDimension) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IUIAnimationVariableChangeHandler2, 0x63acc8d2, 0x6eae, 0x4bb0, 0xb8,0x79, 0x58,0x6d,0xd8,0xcf,0xbe,0x42)
#endif
#else
typedef struct IUIAnimationVariableChangeHandler2Vtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        IUIAnimationVariableChangeHandler2 *This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        IUIAnimationVariableChangeHandler2 *This);

    ULONG (STDMETHODCALLTYPE *Release)(
        IUIAnimationVariableChangeHandler2 *This);

    /*** IUIAnimationVariableChangeHandler2 methods ***/
    HRESULT (STDMETHODCALLTYPE *OnValueChanged)(
        IUIAnimationVariableChangeHandler2 *This,
        IUIAnimationStoryboard2 *storyboard,
        IUIAnimationVariable2 *variable,
        double *newValue,
        double *previousValue,
        unsigned int cDimension);

    END_INTERFACE
} IUIAnimationVariableChangeHandler2Vtbl;

interface IUIAnimationVariableChangeHandler2 {
    CONST_VTBL IUIAnimationVariableChangeHandler2Vtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IUIAnimationVariableChangeHandler2_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IUIAnimationVariableChangeHandler2_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IUIAnimationVariableChangeHandler2_Release(This) (This)->lpVtbl->Release(This)
/*** IUIAnimationVariableChangeHandler2 methods ***/
#define IUIAnimationVariableChangeHandler2_OnValueChanged(This,storyboard,variable,newValue,previousValue,cDimension) (This)->lpVtbl->OnValueChanged(This,storyboard,variable,newValue,previousValue,cDimension)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IUIAnimationVariableChangeHandler2_QueryInterface(IUIAnimationVariableChangeHandler2* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IUIAnimationVariableChangeHandler2_AddRef(IUIAnimationVariableChangeHandler2* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IUIAnimationVariableChangeHandler2_Release(IUIAnimationVariableChangeHandler2* This) {
    return This->lpVtbl->Release(This);
}
/*** IUIAnimationVariableChangeHandler2 methods ***/
static FORCEINLINE HRESULT IUIAnimationVariableChangeHandler2_OnValueChanged(IUIAnimationVariableChangeHandler2* This,IUIAnimationStoryboard2 *storyboard,IUIAnimationVariable2 *variable,double *newValue,double *previousValue,unsigned int cDimension) {
    return This->lpVtbl->OnValueChanged(This,storyboard,variable,newValue,previousValue,cDimension);
}
#endif
#endif

#endif


#endif  /* __IUIAnimationVariableChangeHandler2_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IUIAnimationVariableIntegerChangeHandler2 interface
 */
#ifndef __IUIAnimationVariableIntegerChangeHandler2_INTERFACE_DEFINED__
#define __IUIAnimationVariableIntegerChangeHandler2_INTERFACE_DEFINED__

DEFINE_GUID(IID_IUIAnimationVariableIntegerChangeHandler2, 0x829b6cf1, 0x4f3a, 0x4412, 0xae,0x09, 0xb2,0x43,0xeb,0x4c,0x6b,0x58);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("829b6cf1-4f3a-4412-ae09-b243eb4c6b58")
IUIAnimationVariableIntegerChangeHandler2 : public IUnknown
{
    virtual HRESULT STDMETHODCALLTYPE OnIntegerValueChanged(
        IUIAnimationStoryboard2 *storyboard,
        IUIAnimationVariable2 *variable,
        int *newValue,
        int *previousValue,
        unsigned int cDimension) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IUIAnimationVariableIntegerChangeHandler2, 0x829b6cf1, 0x4f3a, 0x4412, 0xae,0x09, 0xb2,0x43,0xeb,0x4c,0x6b,0x58)
#endif
#else
typedef struct IUIAnimationVariableIntegerChangeHandler2Vtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        IUIAnimationVariableIntegerChangeHandler2 *This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        IUIAnimationVariableIntegerChangeHandler2 *This);

    ULONG (STDMETHODCALLTYPE *Release)(
        IUIAnimationVariableIntegerChangeHandler2 *This);

    /*** IUIAnimationVariableIntegerChangeHandler2 methods ***/
    HRESULT (STDMETHODCALLTYPE *OnIntegerValueChanged)(
        IUIAnimationVariableIntegerChangeHandler2 *This,
        IUIAnimationStoryboard2 *storyboard,
        IUIAnimationVariable2 *variable,
        int *newValue,
        int *previousValue,
        unsigned int cDimension);

    END_INTERFACE
} IUIAnimationVariableIntegerChangeHandler2Vtbl;

interface IUIAnimationVariableIntegerChangeHandler2 {
    CONST_VTBL IUIAnimationVariableIntegerChangeHandler2Vtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IUIAnimationVariableIntegerChangeHandler2_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IUIAnimationVariableIntegerChangeHandler2_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IUIAnimationVariableIntegerChangeHandler2_Release(This) (This)->lpVtbl->Release(This)
/*** IUIAnimationVariableIntegerChangeHandler2 methods ***/
#define IUIAnimationVariableIntegerChangeHandler2_OnIntegerValueChanged(This,storyboard,variable,newValue,previousValue,cDimension) (This)->lpVtbl->OnIntegerValueChanged(This,storyboard,variable,newValue,previousValue,cDimension)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IUIAnimationVariableIntegerChangeHandler2_QueryInterface(IUIAnimationVariableIntegerChangeHandler2* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IUIAnimationVariableIntegerChangeHandler2_AddRef(IUIAnimationVariableIntegerChangeHandler2* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IUIAnimationVariableIntegerChangeHandler2_Release(IUIAnimationVariableIntegerChangeHandler2* This) {
    return This->lpVtbl->Release(This);
}
/*** IUIAnimationVariableIntegerChangeHandler2 methods ***/
static FORCEINLINE HRESULT IUIAnimationVariableIntegerChangeHandler2_OnIntegerValueChanged(IUIAnimationVariableIntegerChangeHandler2* This,IUIAnimationStoryboard2 *storyboard,IUIAnimationVariable2 *variable,int *newValue,int *previousValue,unsigned int cDimension) {
    return This->lpVtbl->OnIntegerValueChanged(This,storyboard,variable,newValue,previousValue,cDimension);
}
#endif
#endif

#endif


#endif  /* __IUIAnimationVariableIntegerChangeHandler2_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IUIAnimationVariableCurveChangeHandler2 interface
 */
#ifndef __IUIAnimationVariableCurveChangeHandler2_INTERFACE_DEFINED__
#define __IUIAnimationVariableCurveChangeHandler2_INTERFACE_DEFINED__

DEFINE_GUID(IID_IUIAnimationVariableCurveChangeHandler2, 0x72895e91, 0x0145, 0x4c21, 0x91,0x92, 0x5a,0xab,0x40,0xed,0xdf,0x80);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("72895e91-0145-4c21-9192-5aab40eddf80")
IUIAnimationVariableCurveChangeHandler2 : public IUnknown
{
    virtual HRESULT STDMETHODCALLTYPE OnCurveChanged(
        IUIAnimationVariable2 *variable) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IUIAnimationVariableCurveChangeHandler2, 0x72895e91, 0x0145, 0x4c21, 0x91,0x92, 0x5a,0xab,0x40,0xed,0xdf,0x80)
#endif
#else
typedef struct IUIAnimationVariableCurveChangeHandler2Vtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        IUIAnimationVariableCurveChangeHandler2 *This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        IUIAnimationVariableCurveChangeHandler2 *This);

    ULONG (STDMETHODCALLTYPE *Release)(
        IUIAnimationVariableCurveChangeHandler2 *This);

    /*** IUIAnimationVariableCurveChangeHandler2 methods ***/
    HRESULT (STDMETHODCALLTYPE *OnCurveChanged)(
        IUIAnimationVariableCurveChangeHandler2 *This,
        IUIAnimationVariable2 *variable);

    END_INTERFACE
} IUIAnimationVariableCurveChangeHandler2Vtbl;

interface IUIAnimationVariableCurveChangeHandler2 {
    CONST_VTBL IUIAnimationVariableCurveChangeHandler2Vtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IUIAnimationVariableCurveChangeHandler2_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IUIAnimationVariableCurveChangeHandler2_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IUIAnimationVariableCurveChangeHandler2_Release(This) (This)->lpVtbl->Release(This)
/*** IUIAnimationVariableCurveChangeHandler2 methods ***/
#define IUIAnimationVariableCurveChangeHandler2_OnCurveChanged(This,variable) (This)->lpVtbl->OnCurveChanged(This,variable)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IUIAnimationVariableCurveChangeHandler2_QueryInterface(IUIAnimationVariableCurveChangeHandler2* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IUIAnimationVariableCurveChangeHandler2_AddRef(IUIAnimationVariableCurveChangeHandler2* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IUIAnimationVariableCurveChangeHandler2_Release(IUIAnimationVariableCurveChangeHandler2* This) {
    return This->lpVtbl->Release(This);
}
/*** IUIAnimationVariableCurveChangeHandler2 methods ***/
static FORCEINLINE HRESULT IUIAnimationVariableCurveChangeHandler2_OnCurveChanged(IUIAnimationVariableCurveChangeHandler2* This,IUIAnimationVariable2 *variable) {
    return This->lpVtbl->OnCurveChanged(This,variable);
}
#endif
#endif

#endif


#endif  /* __IUIAnimationVariableCurveChangeHandler2_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IUIAnimationManagerEventHandler2 interface
 */
#ifndef __IUIAnimationManagerEventHandler2_INTERFACE_DEFINED__
#define __IUIAnimationManagerEventHandler2_INTERFACE_DEFINED__

DEFINE_GUID(IID_IUIAnimationManagerEventHandler2, 0xf6e022ba, 0xbff3, 0x42ec, 0x90,0x33, 0xe0,0x73,0xf3,0x3e,0x83,0xc3);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("f6e022ba-bff3-42ec-9033-e073f33e83c3")
IUIAnimationManagerEventHandler2 : public IUnknown
{
    virtual HRESULT STDMETHODCALLTYPE OnManagerStatusChanged(
        UI_ANIMATION_MANAGER_STATUS newStatus,
        UI_ANIMATION_MANAGER_STATUS previousStatus) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IUIAnimationManagerEventHandler2, 0xf6e022ba, 0xbff3, 0x42ec, 0x90,0x33, 0xe0,0x73,0xf3,0x3e,0x83,0xc3)
#endif
#else
typedef struct IUIAnimationManagerEventHandler2Vtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        IUIAnimationManagerEventHandler2 *This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        IUIAnimationManagerEventHandler2 *This);

    ULONG (STDMETHODCALLTYPE *Release)(
        IUIAnimationManagerEventHandler2 *This);

    /*** IUIAnimationManagerEventHandler2 methods ***/
    HRESULT (STDMETHODCALLTYPE *OnManagerStatusChanged)(
        IUIAnimationManagerEventHandler2 *This,
        UI_ANIMATION_MANAGER_STATUS newStatus,
        UI_ANIMATION_MANAGER_STATUS previousStatus);

    END_INTERFACE
} IUIAnimationManagerEventHandler2Vtbl;

interface IUIAnimationManagerEventHandler2 {
    CONST_VTBL IUIAnimationManagerEventHandler2Vtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IUIAnimationManagerEventHandler2_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IUIAnimationManagerEventHandler2_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IUIAnimationManagerEventHandler2_Release(This) (This)->lpVtbl->Release(This)
/*** IUIAnimationManagerEventHandler2 methods ***/
#define IUIAnimationManagerEventHandler2_OnManagerStatusChanged(This,newStatus,previousStatus) (This)->lpVtbl->OnManagerStatusChanged(This,newStatus,previousStatus)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IUIAnimationManagerEventHandler2_QueryInterface(IUIAnimationManagerEventHandler2* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IUIAnimationManagerEventHandler2_AddRef(IUIAnimationManagerEventHandler2* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IUIAnimationManagerEventHandler2_Release(IUIAnimationManagerEventHandler2* This) {
    return This->lpVtbl->Release(This);
}
/*** IUIAnimationManagerEventHandler2 methods ***/
static FORCEINLINE HRESULT IUIAnimationManagerEventHandler2_OnManagerStatusChanged(IUIAnimationManagerEventHandler2* This,UI_ANIMATION_MANAGER_STATUS newStatus,UI_ANIMATION_MANAGER_STATUS previousStatus) {
    return This->lpVtbl->OnManagerStatusChanged(This,newStatus,previousStatus);
}
#endif
#endif

#endif


#endif  /* __IUIAnimationManagerEventHandler2_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IUIAnimationPriorityComparison2 interface
 */
#ifndef __IUIAnimationPriorityComparison2_INTERFACE_DEFINED__
#define __IUIAnimationPriorityComparison2_INTERFACE_DEFINED__

DEFINE_GUID(IID_IUIAnimationPriorityComparison2, 0x5b6d7a37, 0x4621, 0x467c, 0x8b,0x05, 0x70,0x13,0x1d,0xe6,0x2d,0xdb);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("5b6d7a37-4621-467c-8b05-70131de62ddb")
IUIAnimationPriorityComparison2 : public IUnknown
{
    virtual HRESULT STDMETHODCALLTYPE HasPriority(
        IUIAnimationStoryboard2 *scheduledStoryboard,
        IUIAnimationStoryboard2 *newStoryboard,
        UI_ANIMATION_PRIORITY_EFFECT priorityEffect) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IUIAnimationPriorityComparison2, 0x5b6d7a37, 0x4621, 0x467c, 0x8b,0x05, 0x70,0x13,0x1d,0xe6,0x2d,0xdb)
#endif
#else
typedef struct IUIAnimationPriorityComparison2Vtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        IUIAnimationPriorityComparison2 *This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        IUIAnimationPriorityComparison2 *This);

    ULONG (STDMETHODCALLTYPE *Release)(
        IUIAnimationPriorityComparison2 *This);

    /*** IUIAnimationPriorityComparison2 methods ***/
    HRESULT (STDMETHODCALLTYPE *HasPriority)(
        IUIAnimationPriorityComparison2 *This,
        IUIAnimationStoryboard2 *scheduledStoryboard,
        IUIAnimationStoryboard2 *newStoryboard,
        UI_ANIMATION_PRIORITY_EFFECT priorityEffect);

    END_INTERFACE
} IUIAnimationPriorityComparison2Vtbl;

interface IUIAnimationPriorityComparison2 {
    CONST_VTBL IUIAnimationPriorityComparison2Vtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IUIAnimationPriorityComparison2_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IUIAnimationPriorityComparison2_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IUIAnimationPriorityComparison2_Release(This) (This)->lpVtbl->Release(This)
/*** IUIAnimationPriorityComparison2 methods ***/
#define IUIAnimationPriorityComparison2_HasPriority(This,scheduledStoryboard,newStoryboard,priorityEffect) (This)->lpVtbl->HasPriority(This,scheduledStoryboard,newStoryboard,priorityEffect)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IUIAnimationPriorityComparison2_QueryInterface(IUIAnimationPriorityComparison2* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IUIAnimationPriorityComparison2_AddRef(IUIAnimationPriorityComparison2* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IUIAnimationPriorityComparison2_Release(IUIAnimationPriorityComparison2* This) {
    return This->lpVtbl->Release(This);
}
/*** IUIAnimationPriorityComparison2 methods ***/
static FORCEINLINE HRESULT IUIAnimationPriorityComparison2_HasPriority(IUIAnimationPriorityComparison2* This,IUIAnimationStoryboard2 *scheduledStoryboard,IUIAnimationStoryboard2 *newStoryboard,UI_ANIMATION_PRIORITY_EFFECT priorityEffect) {
    return This->lpVtbl->HasPriority(This,scheduledStoryboard,newStoryboard,priorityEffect);
}
#endif
#endif

#endif


#endif  /* __IUIAnimationPriorityComparison2_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IUIAnimationTransitionLibrary interface
 */
#ifndef __IUIAnimationTransitionLibrary_INTERFACE_DEFINED__
#define __IUIAnimationTransitionLibrary_INTERFACE_DEFINED__

DEFINE_GUID(IID_IUIAnimationTransitionLibrary, 0xca5a14b1, 0xd24f, 0x48b8, 0x8f,0xe4, 0xc7,0x81,0x69,0xba,0x95,0x4e);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("ca5a14b1-d24f-48b8-8fe4-c78169ba954e")
IUIAnimationTransitionLibrary : public IUnknown
{
    virtual HRESULT STDMETHODCALLTYPE CreateInstantaneousTransition(
        double finalValue,
        IUIAnimationTransition **transition) = 0;

    virtual HRESULT STDMETHODCALLTYPE CreateConstantTransition(
        double duration,
        IUIAnimationTransition **transition) = 0;

    virtual HRESULT STDMETHODCALLTYPE CreateDiscreteTransition(
        double delay,
        double finalValue,
        double hold,
        IUIAnimationTransition **transition) = 0;

    virtual HRESULT STDMETHODCALLTYPE CreateLinearTransition(
        double duration,
        double finalValue,
        IUIAnimationTransition **transition) = 0;

    virtual HRESULT STDMETHODCALLTYPE CreateLinearTransitionFromSpeed(
        double speed,
        double finalValue,
        IUIAnimationTransition **transition) = 0;

    virtual HRESULT STDMETHODCALLTYPE CreateSinusoidalTransitionFromVelocity(
        double duration,
        double period,
        IUIAnimationTransition **transition) = 0;

    virtual HRESULT STDMETHODCALLTYPE CreateSinusoidalTransitionFromRange(
        double duration,
        double minimumValue,
        double maximumValue,
        double period,
        UI_ANIMATION_SLOPE slope,
        IUIAnimationTransition **transition) = 0;

    virtual HRESULT STDMETHODCALLTYPE CreateAccelerateDecelerateTransition(
        double duration,
        double finalValue,
        double accelerationRatio,
        double decelerationRatio,
        IUIAnimationTransition **transition) = 0;

    virtual HRESULT STDMETHODCALLTYPE CreateReversalTransition(
        double duration,
        IUIAnimationTransition **transition) = 0;

    virtual HRESULT STDMETHODCALLTYPE CreateCubicTransition(
        double duration,
        double finalValue,
        double finalVelocity,
        IUIAnimationTransition **transition) = 0;

    virtual HRESULT STDMETHODCALLTYPE CreateSmoothStopTransition(
        double maximumDuration,
        double finalValue,
        IUIAnimationTransition **transition) = 0;

    virtual HRESULT STDMETHODCALLTYPE CreateParabolicTransitionFromAcceleration(
        double finalValue,
        double finalVelocity,
        double acceleration,
        IUIAnimationTransition **transition) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IUIAnimationTransitionLibrary, 0xca5a14b1, 0xd24f, 0x48b8, 0x8f,0xe4, 0xc7,0x81,0x69,0xba,0x95,0x4e)
#endif
#else
typedef struct IUIAnimationTransitionLibraryVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        IUIAnimationTransitionLibrary *This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        IUIAnimationTransitionLibrary *This);

    ULONG (STDMETHODCALLTYPE *Release)(
        IUIAnimationTransitionLibrary *This);

    /*** IUIAnimationTransitionLibrary methods ***/
    HRESULT (STDMETHODCALLTYPE *CreateInstantaneousTransition)(
        IUIAnimationTransitionLibrary *This,
        double finalValue,
        IUIAnimationTransition **transition);

    HRESULT (STDMETHODCALLTYPE *CreateConstantTransition)(
        IUIAnimationTransitionLibrary *This,
        double duration,
        IUIAnimationTransition **transition);

    HRESULT (STDMETHODCALLTYPE *CreateDiscreteTransition)(
        IUIAnimationTransitionLibrary *This,
        double delay,
        double finalValue,
        double hold,
        IUIAnimationTransition **transition);

    HRESULT (STDMETHODCALLTYPE *CreateLinearTransition)(
        IUIAnimationTransitionLibrary *This,
        double duration,
        double finalValue,
        IUIAnimationTransition **transition);

    HRESULT (STDMETHODCALLTYPE *CreateLinearTransitionFromSpeed)(
        IUIAnimationTransitionLibrary *This,
        double speed,
        double finalValue,
        IUIAnimationTransition **transition);

    HRESULT (STDMETHODCALLTYPE *CreateSinusoidalTransitionFromVelocity)(
        IUIAnimationTransitionLibrary *This,
        double duration,
        double period,
        IUIAnimationTransition **transition);

    HRESULT (STDMETHODCALLTYPE *CreateSinusoidalTransitionFromRange)(
        IUIAnimationTransitionLibrary *This,
        double duration,
        double minimumValue,
        double maximumValue,
        double period,
        UI_ANIMATION_SLOPE slope,
        IUIAnimationTransition **transition);

    HRESULT (STDMETHODCALLTYPE *CreateAccelerateDecelerateTransition)(
        IUIAnimationTransitionLibrary *This,
        double duration,
        double finalValue,
        double accelerationRatio,
        double decelerationRatio,
        IUIAnimationTransition **transition);

    HRESULT (STDMETHODCALLTYPE *CreateReversalTransition)(
        IUIAnimationTransitionLibrary *This,
        double duration,
        IUIAnimationTransition **transition);

    HRESULT (STDMETHODCALLTYPE *CreateCubicTransition)(
        IUIAnimationTransitionLibrary *This,
        double duration,
        double finalValue,
        double finalVelocity,
        IUIAnimationTransition **transition);

    HRESULT (STDMETHODCALLTYPE *CreateSmoothStopTransition)(
        IUIAnimationTransitionLibrary *This,
        double maximumDuration,
        double finalValue,
        IUIAnimationTransition **transition);

    HRESULT (STDMETHODCALLTYPE *CreateParabolicTransitionFromAcceleration)(
        IUIAnimationTransitionLibrary *This,
        double finalValue,
        double finalVelocity,
        double acceleration,
        IUIAnimationTransition **transition);

    END_INTERFACE
} IUIAnimationTransitionLibraryVtbl;

interface IUIAnimationTransitionLibrary {
    CONST_VTBL IUIAnimationTransitionLibraryVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IUIAnimationTransitionLibrary_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IUIAnimationTransitionLibrary_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IUIAnimationTransitionLibrary_Release(This) (This)->lpVtbl->Release(This)
/*** IUIAnimationTransitionLibrary methods ***/
#define IUIAnimationTransitionLibrary_CreateInstantaneousTransition(This,finalValue,transition) (This)->lpVtbl->CreateInstantaneousTransition(This,finalValue,transition)
#define IUIAnimationTransitionLibrary_CreateConstantTransition(This,duration,transition) (This)->lpVtbl->CreateConstantTransition(This,duration,transition)
#define IUIAnimationTransitionLibrary_CreateDiscreteTransition(This,delay,finalValue,hold,transition) (This)->lpVtbl->CreateDiscreteTransition(This,delay,finalValue,hold,transition)
#define IUIAnimationTransitionLibrary_CreateLinearTransition(This,duration,finalValue,transition) (This)->lpVtbl->CreateLinearTransition(This,duration,finalValue,transition)
#define IUIAnimationTransitionLibrary_CreateLinearTransitionFromSpeed(This,speed,finalValue,transition) (This)->lpVtbl->CreateLinearTransitionFromSpeed(This,speed,finalValue,transition)
#define IUIAnimationTransitionLibrary_CreateSinusoidalTransitionFromVelocity(This,duration,period,transition) (This)->lpVtbl->CreateSinusoidalTransitionFromVelocity(This,duration,period,transition)
#define IUIAnimationTransitionLibrary_CreateSinusoidalTransitionFromRange(This,duration,minimumValue,maximumValue,period,slope,transition) (This)->lpVtbl->CreateSinusoidalTransitionFromRange(This,duration,minimumValue,maximumValue,period,slope,transition)
#define IUIAnimationTransitionLibrary_CreateAccelerateDecelerateTransition(This,duration,finalValue,accelerationRatio,decelerationRatio,transition) (This)->lpVtbl->CreateAccelerateDecelerateTransition(This,duration,finalValue,accelerationRatio,decelerationRatio,transition)
#define IUIAnimationTransitionLibrary_CreateReversalTransition(This,duration,transition) (This)->lpVtbl->CreateReversalTransition(This,duration,transition)
#define IUIAnimationTransitionLibrary_CreateCubicTransition(This,duration,finalValue,finalVelocity,transition) (This)->lpVtbl->CreateCubicTransition(This,duration,finalValue,finalVelocity,transition)
#define IUIAnimationTransitionLibrary_CreateSmoothStopTransition(This,maximumDuration,finalValue,transition) (This)->lpVtbl->CreateSmoothStopTransition(This,maximumDuration,finalValue,transition)
#define IUIAnimationTransitionLibrary_CreateParabolicTransitionFromAcceleration(This,finalValue,finalVelocity,acceleration,transition) (This)->lpVtbl->CreateParabolicTransitionFromAcceleration(This,finalValue,finalVelocity,acceleration,transition)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IUIAnimationTransitionLibrary_QueryInterface(IUIAnimationTransitionLibrary* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IUIAnimationTransitionLibrary_AddRef(IUIAnimationTransitionLibrary* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IUIAnimationTransitionLibrary_Release(IUIAnimationTransitionLibrary* This) {
    return This->lpVtbl->Release(This);
}
/*** IUIAnimationTransitionLibrary methods ***/
static FORCEINLINE HRESULT IUIAnimationTransitionLibrary_CreateInstantaneousTransition(IUIAnimationTransitionLibrary* This,double finalValue,IUIAnimationTransition **transition) {
    return This->lpVtbl->CreateInstantaneousTransition(This,finalValue,transition);
}
static FORCEINLINE HRESULT IUIAnimationTransitionLibrary_CreateConstantTransition(IUIAnimationTransitionLibrary* This,double duration,IUIAnimationTransition **transition) {
    return This->lpVtbl->CreateConstantTransition(This,duration,transition);
}
static FORCEINLINE HRESULT IUIAnimationTransitionLibrary_CreateDiscreteTransition(IUIAnimationTransitionLibrary* This,double delay,double finalValue,double hold,IUIAnimationTransition **transition) {
    return This->lpVtbl->CreateDiscreteTransition(This,delay,finalValue,hold,transition);
}
static FORCEINLINE HRESULT IUIAnimationTransitionLibrary_CreateLinearTransition(IUIAnimationTransitionLibrary* This,double duration,double finalValue,IUIAnimationTransition **transition) {
    return This->lpVtbl->CreateLinearTransition(This,duration,finalValue,transition);
}
static FORCEINLINE HRESULT IUIAnimationTransitionLibrary_CreateLinearTransitionFromSpeed(IUIAnimationTransitionLibrary* This,double speed,double finalValue,IUIAnimationTransition **transition) {
    return This->lpVtbl->CreateLinearTransitionFromSpeed(This,speed,finalValue,transition);
}
static FORCEINLINE HRESULT IUIAnimationTransitionLibrary_CreateSinusoidalTransitionFromVelocity(IUIAnimationTransitionLibrary* This,double duration,double period,IUIAnimationTransition **transition) {
    return This->lpVtbl->CreateSinusoidalTransitionFromVelocity(This,duration,period,transition);
}
static FORCEINLINE HRESULT IUIAnimationTransitionLibrary_CreateSinusoidalTransitionFromRange(IUIAnimationTransitionLibrary* This,double duration,double minimumValue,double maximumValue,double period,UI_ANIMATION_SLOPE slope,IUIAnimationTransition **transition) {
    return This->lpVtbl->CreateSinusoidalTransitionFromRange(This,duration,minimumValue,maximumValue,period,slope,transition);
}
static FORCEINLINE HRESULT IUIAnimationTransitionLibrary_CreateAccelerateDecelerateTransition(IUIAnimationTransitionLibrary* This,double duration,double finalValue,double accelerationRatio,double decelerationRatio,IUIAnimationTransition **transition) {
    return This->lpVtbl->CreateAccelerateDecelerateTransition(This,duration,finalValue,accelerationRatio,decelerationRatio,transition);
}
static FORCEINLINE HRESULT IUIAnimationTransitionLibrary_CreateReversalTransition(IUIAnimationTransitionLibrary* This,double duration,IUIAnimationTransition **transition) {
    return This->lpVtbl->CreateReversalTransition(This,duration,transition);
}
static FORCEINLINE HRESULT IUIAnimationTransitionLibrary_CreateCubicTransition(IUIAnimationTransitionLibrary* This,double duration,double finalValue,double finalVelocity,IUIAnimationTransition **transition) {
    return This->lpVtbl->CreateCubicTransition(This,duration,finalValue,finalVelocity,transition);
}
static FORCEINLINE HRESULT IUIAnimationTransitionLibrary_CreateSmoothStopTransition(IUIAnimationTransitionLibrary* This,double maximumDuration,double finalValue,IUIAnimationTransition **transition) {
    return This->lpVtbl->CreateSmoothStopTransition(This,maximumDuration,finalValue,transition);
}
static FORCEINLINE HRESULT IUIAnimationTransitionLibrary_CreateParabolicTransitionFromAcceleration(IUIAnimationTransitionLibrary* This,double finalValue,double finalVelocity,double acceleration,IUIAnimationTransition **transition) {
    return This->lpVtbl->CreateParabolicTransitionFromAcceleration(This,finalValue,finalVelocity,acceleration,transition);
}
#endif
#endif

#endif


#endif  /* __IUIAnimationTransitionLibrary_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IUIAnimationTransitionLibrary2 interface
 */
#ifndef __IUIAnimationTransitionLibrary2_INTERFACE_DEFINED__
#define __IUIAnimationTransitionLibrary2_INTERFACE_DEFINED__

DEFINE_GUID(IID_IUIAnimationTransitionLibrary2, 0x03cfae53, 0x9580, 0x4ee3, 0xb3,0x63, 0x2e,0xce,0x51,0xb4,0xaf,0x6a);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("03cfae53-9580-4ee3-b363-2ece51b4af6a")
IUIAnimationTransitionLibrary2 : public IUnknown
{
    virtual HRESULT STDMETHODCALLTYPE CreateInstantaneousTransition(
        double finalValue,
        IUIAnimationTransition2 **transition) = 0;

    virtual HRESULT STDMETHODCALLTYPE CreateInstantaneousVectorTransition(
        double *finalValue,
        unsigned int cDimension,
        IUIAnimationTransition2 **transition) = 0;

    virtual HRESULT STDMETHODCALLTYPE CreateConstantTransition(
        double duration,
        IUIAnimationTransition2 **transition) = 0;

    virtual HRESULT STDMETHODCALLTYPE CreateDiscreteTransition(
        double delay,
        double finalValue,
        double hold,
        IUIAnimationTransition2 **transition) = 0;

    virtual HRESULT STDMETHODCALLTYPE CreateDiscreteVectorTransition(
        double delay,
        double *finalValue,
        unsigned int cDimension,
        double hold,
        IUIAnimationTransition2 **transition) = 0;

    virtual HRESULT STDMETHODCALLTYPE CreateLinearTransition(
        double duration,
        double finalValue,
        IUIAnimationTransition2 **transition) = 0;

    virtual HRESULT STDMETHODCALLTYPE CreateLinearVectorTransition(
        double duration,
        double *finalValue,
        unsigned int cDimension,
        IUIAnimationTransition2 **transition) = 0;

    virtual HRESULT STDMETHODCALLTYPE CreateLinearTransitionFromSpeed(
        double speed,
        double finalValue,
        IUIAnimationTransition2 **transition) = 0;

    virtual HRESULT STDMETHODCALLTYPE CreateLinearVectorTransitionFromSpeed(
        double speed,
        double *finalValue,
        unsigned int cDimension,
        IUIAnimationTransition2 **transition) = 0;

    virtual HRESULT STDMETHODCALLTYPE CreateSinusoidalTransitionFromVelocity(
        double duration,
        double period,
        IUIAnimationTransition2 **transition) = 0;

    virtual HRESULT STDMETHODCALLTYPE CreateSinusoidalTransitionFromRange(
        double duration,
        double minimumValue,
        double maximumValue,
        double period,
        UI_ANIMATION_SLOPE slope,
        IUIAnimationTransition2 **transition) = 0;

    virtual HRESULT STDMETHODCALLTYPE CreateAccelerateDecelerateTransition(
        double duration,
        double finalValue,
        double accelerationRatio,
        double decelerationRatio,
        IUIAnimationTransition2 **transition) = 0;

    virtual HRESULT STDMETHODCALLTYPE CreateReversalTransition(
        double duration,
        IUIAnimationTransition2 **transition) = 0;

    virtual HRESULT STDMETHODCALLTYPE CreateCubicTransition(
        double duration,
        double finalValue,
        double finalVelocity,
        IUIAnimationTransition2 **transition) = 0;

    virtual HRESULT STDMETHODCALLTYPE CreateCubicVectorTransition(
        double duration,
        double *finalValue,
        double *finalVelocity,
        unsigned int cDimension,
        IUIAnimationTransition2 **transition) = 0;

    virtual HRESULT STDMETHODCALLTYPE CreateSmoothStopTransition(
        double maximumDuration,
        double finalValue,
        IUIAnimationTransition2 **transition) = 0;

    virtual HRESULT STDMETHODCALLTYPE CreateParabolicTransitionFromAcceleration(
        double finalValue,
        double finalVelocity,
        double acceleration,
        IUIAnimationTransition2 **transition) = 0;

    virtual HRESULT STDMETHODCALLTYPE CreateCubicBezierLinearTransition(
        double duration,
        double finalValue,
        double x1,
        double y1,
        double x2,
        double y2,
        IUIAnimationTransition2 **ppTransition) = 0;

    virtual HRESULT STDMETHODCALLTYPE CreateCubicBezierLinearVectorTransition(
        double duration,
        double *finalValue,
        unsigned int cDimension,
        double x1,
        double y1,
        double x2,
        double y2,
        IUIAnimationTransition2 **ppTransition) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IUIAnimationTransitionLibrary2, 0x03cfae53, 0x9580, 0x4ee3, 0xb3,0x63, 0x2e,0xce,0x51,0xb4,0xaf,0x6a)
#endif
#else
typedef struct IUIAnimationTransitionLibrary2Vtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        IUIAnimationTransitionLibrary2 *This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        IUIAnimationTransitionLibrary2 *This);

    ULONG (STDMETHODCALLTYPE *Release)(
        IUIAnimationTransitionLibrary2 *This);

    /*** IUIAnimationTransitionLibrary2 methods ***/
    HRESULT (STDMETHODCALLTYPE *CreateInstantaneousTransition)(
        IUIAnimationTransitionLibrary2 *This,
        double finalValue,
        IUIAnimationTransition2 **transition);

    HRESULT (STDMETHODCALLTYPE *CreateInstantaneousVectorTransition)(
        IUIAnimationTransitionLibrary2 *This,
        double *finalValue,
        unsigned int cDimension,
        IUIAnimationTransition2 **transition);

    HRESULT (STDMETHODCALLTYPE *CreateConstantTransition)(
        IUIAnimationTransitionLibrary2 *This,
        double duration,
        IUIAnimationTransition2 **transition);

    HRESULT (STDMETHODCALLTYPE *CreateDiscreteTransition)(
        IUIAnimationTransitionLibrary2 *This,
        double delay,
        double finalValue,
        double hold,
        IUIAnimationTransition2 **transition);

    HRESULT (STDMETHODCALLTYPE *CreateDiscreteVectorTransition)(
        IUIAnimationTransitionLibrary2 *This,
        double delay,
        double *finalValue,
        unsigned int cDimension,
        double hold,
        IUIAnimationTransition2 **transition);

    HRESULT (STDMETHODCALLTYPE *CreateLinearTransition)(
        IUIAnimationTransitionLibrary2 *This,
        double duration,
        double finalValue,
        IUIAnimationTransition2 **transition);

    HRESULT (STDMETHODCALLTYPE *CreateLinearVectorTransition)(
        IUIAnimationTransitionLibrary2 *This,
        double duration,
        double *finalValue,
        unsigned int cDimension,
        IUIAnimationTransition2 **transition);

    HRESULT (STDMETHODCALLTYPE *CreateLinearTransitionFromSpeed)(
        IUIAnimationTransitionLibrary2 *This,
        double speed,
        double finalValue,
        IUIAnimationTransition2 **transition);

    HRESULT (STDMETHODCALLTYPE *CreateLinearVectorTransitionFromSpeed)(
        IUIAnimationTransitionLibrary2 *This,
        double speed,
        double *finalValue,
        unsigned int cDimension,
        IUIAnimationTransition2 **transition);

    HRESULT (STDMETHODCALLTYPE *CreateSinusoidalTransitionFromVelocity)(
        IUIAnimationTransitionLibrary2 *This,
        double duration,
        double period,
        IUIAnimationTransition2 **transition);

    HRESULT (STDMETHODCALLTYPE *CreateSinusoidalTransitionFromRange)(
        IUIAnimationTransitionLibrary2 *This,
        double duration,
        double minimumValue,
        double maximumValue,
        double period,
        UI_ANIMATION_SLOPE slope,
        IUIAnimationTransition2 **transition);

    HRESULT (STDMETHODCALLTYPE *CreateAccelerateDecelerateTransition)(
        IUIAnimationTransitionLibrary2 *This,
        double duration,
        double finalValue,
        double accelerationRatio,
        double decelerationRatio,
        IUIAnimationTransition2 **transition);

    HRESULT (STDMETHODCALLTYPE *CreateReversalTransition)(
        IUIAnimationTransitionLibrary2 *This,
        double duration,
        IUIAnimationTransition2 **transition);

    HRESULT (STDMETHODCALLTYPE *CreateCubicTransition)(
        IUIAnimationTransitionLibrary2 *This,
        double duration,
        double finalValue,
        double finalVelocity,
        IUIAnimationTransition2 **transition);

    HRESULT (STDMETHODCALLTYPE *CreateCubicVectorTransition)(
        IUIAnimationTransitionLibrary2 *This,
        double duration,
        double *finalValue,
        double *finalVelocity,
        unsigned int cDimension,
        IUIAnimationTransition2 **transition);

    HRESULT (STDMETHODCALLTYPE *CreateSmoothStopTransition)(
        IUIAnimationTransitionLibrary2 *This,
        double maximumDuration,
        double finalValue,
        IUIAnimationTransition2 **transition);

    HRESULT (STDMETHODCALLTYPE *CreateParabolicTransitionFromAcceleration)(
        IUIAnimationTransitionLibrary2 *This,
        double finalValue,
        double finalVelocity,
        double acceleration,
        IUIAnimationTransition2 **transition);

    HRESULT (STDMETHODCALLTYPE *CreateCubicBezierLinearTransition)(
        IUIAnimationTransitionLibrary2 *This,
        double duration,
        double finalValue,
        double x1,
        double y1,
        double x2,
        double y2,
        IUIAnimationTransition2 **ppTransition);

    HRESULT (STDMETHODCALLTYPE *CreateCubicBezierLinearVectorTransition)(
        IUIAnimationTransitionLibrary2 *This,
        double duration,
        double *finalValue,
        unsigned int cDimension,
        double x1,
        double y1,
        double x2,
        double y2,
        IUIAnimationTransition2 **ppTransition);

    END_INTERFACE
} IUIAnimationTransitionLibrary2Vtbl;

interface IUIAnimationTransitionLibrary2 {
    CONST_VTBL IUIAnimationTransitionLibrary2Vtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IUIAnimationTransitionLibrary2_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IUIAnimationTransitionLibrary2_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IUIAnimationTransitionLibrary2_Release(This) (This)->lpVtbl->Release(This)
/*** IUIAnimationTransitionLibrary2 methods ***/
#define IUIAnimationTransitionLibrary2_CreateInstantaneousTransition(This,finalValue,transition) (This)->lpVtbl->CreateInstantaneousTransition(This,finalValue,transition)
#define IUIAnimationTransitionLibrary2_CreateInstantaneousVectorTransition(This,finalValue,cDimension,transition) (This)->lpVtbl->CreateInstantaneousVectorTransition(This,finalValue,cDimension,transition)
#define IUIAnimationTransitionLibrary2_CreateConstantTransition(This,duration,transition) (This)->lpVtbl->CreateConstantTransition(This,duration,transition)
#define IUIAnimationTransitionLibrary2_CreateDiscreteTransition(This,delay,finalValue,hold,transition) (This)->lpVtbl->CreateDiscreteTransition(This,delay,finalValue,hold,transition)
#define IUIAnimationTransitionLibrary2_CreateDiscreteVectorTransition(This,delay,finalValue,cDimension,hold,transition) (This)->lpVtbl->CreateDiscreteVectorTransition(This,delay,finalValue,cDimension,hold,transition)
#define IUIAnimationTransitionLibrary2_CreateLinearTransition(This,duration,finalValue,transition) (This)->lpVtbl->CreateLinearTransition(This,duration,finalValue,transition)
#define IUIAnimationTransitionLibrary2_CreateLinearVectorTransition(This,duration,finalValue,cDimension,transition) (This)->lpVtbl->CreateLinearVectorTransition(This,duration,finalValue,cDimension,transition)
#define IUIAnimationTransitionLibrary2_CreateLinearTransitionFromSpeed(This,speed,finalValue,transition) (This)->lpVtbl->CreateLinearTransitionFromSpeed(This,speed,finalValue,transition)
#define IUIAnimationTransitionLibrary2_CreateLinearVectorTransitionFromSpeed(This,speed,finalValue,cDimension,transition) (This)->lpVtbl->CreateLinearVectorTransitionFromSpeed(This,speed,finalValue,cDimension,transition)
#define IUIAnimationTransitionLibrary2_CreateSinusoidalTransitionFromVelocity(This,duration,period,transition) (This)->lpVtbl->CreateSinusoidalTransitionFromVelocity(This,duration,period,transition)
#define IUIAnimationTransitionLibrary2_CreateSinusoidalTransitionFromRange(This,duration,minimumValue,maximumValue,period,slope,transition) (This)->lpVtbl->CreateSinusoidalTransitionFromRange(This,duration,minimumValue,maximumValue,period,slope,transition)
#define IUIAnimationTransitionLibrary2_CreateAccelerateDecelerateTransition(This,duration,finalValue,accelerationRatio,decelerationRatio,transition) (This)->lpVtbl->CreateAccelerateDecelerateTransition(This,duration,finalValue,accelerationRatio,decelerationRatio,transition)
#define IUIAnimationTransitionLibrary2_CreateReversalTransition(This,duration,transition) (This)->lpVtbl->CreateReversalTransition(This,duration,transition)
#define IUIAnimationTransitionLibrary2_CreateCubicTransition(This,duration,finalValue,finalVelocity,transition) (This)->lpVtbl->CreateCubicTransition(This,duration,finalValue,finalVelocity,transition)
#define IUIAnimationTransitionLibrary2_CreateCubicVectorTransition(This,duration,finalValue,finalVelocity,cDimension,transition) (This)->lpVtbl->CreateCubicVectorTransition(This,duration,finalValue,finalVelocity,cDimension,transition)
#define IUIAnimationTransitionLibrary2_CreateSmoothStopTransition(This,maximumDuration,finalValue,transition) (This)->lpVtbl->CreateSmoothStopTransition(This,maximumDuration,finalValue,transition)
#define IUIAnimationTransitionLibrary2_CreateParabolicTransitionFromAcceleration(This,finalValue,finalVelocity,acceleration,transition) (This)->lpVtbl->CreateParabolicTransitionFromAcceleration(This,finalValue,finalVelocity,acceleration,transition)
#define IUIAnimationTransitionLibrary2_CreateCubicBezierLinearTransition(This,duration,finalValue,x1,y1,x2,y2,ppTransition) (This)->lpVtbl->CreateCubicBezierLinearTransition(This,duration,finalValue,x1,y1,x2,y2,ppTransition)
#define IUIAnimationTransitionLibrary2_CreateCubicBezierLinearVectorTransition(This,duration,finalValue,cDimension,x1,y1,x2,y2,ppTransition) (This)->lpVtbl->CreateCubicBezierLinearVectorTransition(This,duration,finalValue,cDimension,x1,y1,x2,y2,ppTransition)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IUIAnimationTransitionLibrary2_QueryInterface(IUIAnimationTransitionLibrary2* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IUIAnimationTransitionLibrary2_AddRef(IUIAnimationTransitionLibrary2* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IUIAnimationTransitionLibrary2_Release(IUIAnimationTransitionLibrary2* This) {
    return This->lpVtbl->Release(This);
}
/*** IUIAnimationTransitionLibrary2 methods ***/
static FORCEINLINE HRESULT IUIAnimationTransitionLibrary2_CreateInstantaneousTransition(IUIAnimationTransitionLibrary2* This,double finalValue,IUIAnimationTransition2 **transition) {
    return This->lpVtbl->CreateInstantaneousTransition(This,finalValue,transition);
}
static FORCEINLINE HRESULT IUIAnimationTransitionLibrary2_CreateInstantaneousVectorTransition(IUIAnimationTransitionLibrary2* This,double *finalValue,unsigned int cDimension,IUIAnimationTransition2 **transition) {
    return This->lpVtbl->CreateInstantaneousVectorTransition(This,finalValue,cDimension,transition);
}
static FORCEINLINE HRESULT IUIAnimationTransitionLibrary2_CreateConstantTransition(IUIAnimationTransitionLibrary2* This,double duration,IUIAnimationTransition2 **transition) {
    return This->lpVtbl->CreateConstantTransition(This,duration,transition);
}
static FORCEINLINE HRESULT IUIAnimationTransitionLibrary2_CreateDiscreteTransition(IUIAnimationTransitionLibrary2* This,double delay,double finalValue,double hold,IUIAnimationTransition2 **transition) {
    return This->lpVtbl->CreateDiscreteTransition(This,delay,finalValue,hold,transition);
}
static FORCEINLINE HRESULT IUIAnimationTransitionLibrary2_CreateDiscreteVectorTransition(IUIAnimationTransitionLibrary2* This,double delay,double *finalValue,unsigned int cDimension,double hold,IUIAnimationTransition2 **transition) {
    return This->lpVtbl->CreateDiscreteVectorTransition(This,delay,finalValue,cDimension,hold,transition);
}
static FORCEINLINE HRESULT IUIAnimationTransitionLibrary2_CreateLinearTransition(IUIAnimationTransitionLibrary2* This,double duration,double finalValue,IUIAnimationTransition2 **transition) {
    return This->lpVtbl->CreateLinearTransition(This,duration,finalValue,transition);
}
static FORCEINLINE HRESULT IUIAnimationTransitionLibrary2_CreateLinearVectorTransition(IUIAnimationTransitionLibrary2* This,double duration,double *finalValue,unsigned int cDimension,IUIAnimationTransition2 **transition) {
    return This->lpVtbl->CreateLinearVectorTransition(This,duration,finalValue,cDimension,transition);
}
static FORCEINLINE HRESULT IUIAnimationTransitionLibrary2_CreateLinearTransitionFromSpeed(IUIAnimationTransitionLibrary2* This,double speed,double finalValue,IUIAnimationTransition2 **transition) {
    return This->lpVtbl->CreateLinearTransitionFromSpeed(This,speed,finalValue,transition);
}
static FORCEINLINE HRESULT IUIAnimationTransitionLibrary2_CreateLinearVectorTransitionFromSpeed(IUIAnimationTransitionLibrary2* This,double speed,double *finalValue,unsigned int cDimension,IUIAnimationTransition2 **transition) {
    return This->lpVtbl->CreateLinearVectorTransitionFromSpeed(This,speed,finalValue,cDimension,transition);
}
static FORCEINLINE HRESULT IUIAnimationTransitionLibrary2_CreateSinusoidalTransitionFromVelocity(IUIAnimationTransitionLibrary2* This,double duration,double period,IUIAnimationTransition2 **transition) {
    return This->lpVtbl->CreateSinusoidalTransitionFromVelocity(This,duration,period,transition);
}
static FORCEINLINE HRESULT IUIAnimationTransitionLibrary2_CreateSinusoidalTransitionFromRange(IUIAnimationTransitionLibrary2* This,double duration,double minimumValue,double maximumValue,double period,UI_ANIMATION_SLOPE slope,IUIAnimationTransition2 **transition) {
    return This->lpVtbl->CreateSinusoidalTransitionFromRange(This,duration,minimumValue,maximumValue,period,slope,transition);
}
static FORCEINLINE HRESULT IUIAnimationTransitionLibrary2_CreateAccelerateDecelerateTransition(IUIAnimationTransitionLibrary2* This,double duration,double finalValue,double accelerationRatio,double decelerationRatio,IUIAnimationTransition2 **transition) {
    return This->lpVtbl->CreateAccelerateDecelerateTransition(This,duration,finalValue,accelerationRatio,decelerationRatio,transition);
}
static FORCEINLINE HRESULT IUIAnimationTransitionLibrary2_CreateReversalTransition(IUIAnimationTransitionLibrary2* This,double duration,IUIAnimationTransition2 **transition) {
    return This->lpVtbl->CreateReversalTransition(This,duration,transition);
}
static FORCEINLINE HRESULT IUIAnimationTransitionLibrary2_CreateCubicTransition(IUIAnimationTransitionLibrary2* This,double duration,double finalValue,double finalVelocity,IUIAnimationTransition2 **transition) {
    return This->lpVtbl->CreateCubicTransition(This,duration,finalValue,finalVelocity,transition);
}
static FORCEINLINE HRESULT IUIAnimationTransitionLibrary2_CreateCubicVectorTransition(IUIAnimationTransitionLibrary2* This,double duration,double *finalValue,double *finalVelocity,unsigned int cDimension,IUIAnimationTransition2 **transition) {
    return This->lpVtbl->CreateCubicVectorTransition(This,duration,finalValue,finalVelocity,cDimension,transition);
}
static FORCEINLINE HRESULT IUIAnimationTransitionLibrary2_CreateSmoothStopTransition(IUIAnimationTransitionLibrary2* This,double maximumDuration,double finalValue,IUIAnimationTransition2 **transition) {
    return This->lpVtbl->CreateSmoothStopTransition(This,maximumDuration,finalValue,transition);
}
static FORCEINLINE HRESULT IUIAnimationTransitionLibrary2_CreateParabolicTransitionFromAcceleration(IUIAnimationTransitionLibrary2* This,double finalValue,double finalVelocity,double acceleration,IUIAnimationTransition2 **transition) {
    return This->lpVtbl->CreateParabolicTransitionFromAcceleration(This,finalValue,finalVelocity,acceleration,transition);
}
static FORCEINLINE HRESULT IUIAnimationTransitionLibrary2_CreateCubicBezierLinearTransition(IUIAnimationTransitionLibrary2* This,double duration,double finalValue,double x1,double y1,double x2,double y2,IUIAnimationTransition2 **ppTransition) {
    return This->lpVtbl->CreateCubicBezierLinearTransition(This,duration,finalValue,x1,y1,x2,y2,ppTransition);
}
static FORCEINLINE HRESULT IUIAnimationTransitionLibrary2_CreateCubicBezierLinearVectorTransition(IUIAnimationTransitionLibrary2* This,double duration,double *finalValue,unsigned int cDimension,double x1,double y1,double x2,double y2,IUIAnimationTransition2 **ppTransition) {
    return This->lpVtbl->CreateCubicBezierLinearVectorTransition(This,duration,finalValue,cDimension,x1,y1,x2,y2,ppTransition);
}
#endif
#endif

#endif


#endif  /* __IUIAnimationTransitionLibrary2_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IUIAnimationTransitionFactory interface
 */
#ifndef __IUIAnimationTransitionFactory_INTERFACE_DEFINED__
#define __IUIAnimationTransitionFactory_INTERFACE_DEFINED__

DEFINE_GUID(IID_IUIAnimationTransitionFactory, 0xfcd91e03, 0x3e3b, 0x45ad, 0xbb,0xb1, 0x6d,0xfc,0x81,0x53,0x74,0x3d);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("fcd91e03-3e3b-45ad-bbb1-6dfc8153743d")
IUIAnimationTransitionFactory : public IUnknown
{
    virtual HRESULT STDMETHODCALLTYPE CreateTransition(
        IUIAnimationInterpolator *interpolator,
        IUIAnimationTransition **transition) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IUIAnimationTransitionFactory, 0xfcd91e03, 0x3e3b, 0x45ad, 0xbb,0xb1, 0x6d,0xfc,0x81,0x53,0x74,0x3d)
#endif
#else
typedef struct IUIAnimationTransitionFactoryVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        IUIAnimationTransitionFactory *This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        IUIAnimationTransitionFactory *This);

    ULONG (STDMETHODCALLTYPE *Release)(
        IUIAnimationTransitionFactory *This);

    /*** IUIAnimationTransitionFactory methods ***/
    HRESULT (STDMETHODCALLTYPE *CreateTransition)(
        IUIAnimationTransitionFactory *This,
        IUIAnimationInterpolator *interpolator,
        IUIAnimationTransition **transition);

    END_INTERFACE
} IUIAnimationTransitionFactoryVtbl;

interface IUIAnimationTransitionFactory {
    CONST_VTBL IUIAnimationTransitionFactoryVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IUIAnimationTransitionFactory_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IUIAnimationTransitionFactory_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IUIAnimationTransitionFactory_Release(This) (This)->lpVtbl->Release(This)
/*** IUIAnimationTransitionFactory methods ***/
#define IUIAnimationTransitionFactory_CreateTransition(This,interpolator,transition) (This)->lpVtbl->CreateTransition(This,interpolator,transition)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IUIAnimationTransitionFactory_QueryInterface(IUIAnimationTransitionFactory* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IUIAnimationTransitionFactory_AddRef(IUIAnimationTransitionFactory* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IUIAnimationTransitionFactory_Release(IUIAnimationTransitionFactory* This) {
    return This->lpVtbl->Release(This);
}
/*** IUIAnimationTransitionFactory methods ***/
static FORCEINLINE HRESULT IUIAnimationTransitionFactory_CreateTransition(IUIAnimationTransitionFactory* This,IUIAnimationInterpolator *interpolator,IUIAnimationTransition **transition) {
    return This->lpVtbl->CreateTransition(This,interpolator,transition);
}
#endif
#endif

#endif


#endif  /* __IUIAnimationTransitionFactory_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IUIAnimationInterpolator interface
 */
#ifndef __IUIAnimationInterpolator_INTERFACE_DEFINED__
#define __IUIAnimationInterpolator_INTERFACE_DEFINED__

DEFINE_GUID(IID_IUIAnimationInterpolator, 0x7815cbba, 0xddf7, 0x478c, 0xa4,0x6c, 0x7b,0x6c,0x73,0x8b,0x79,0x78);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("7815cbba-ddf7-478c-a46c-7b6c738b7978")
IUIAnimationInterpolator : public IUnknown
{
    virtual HRESULT STDMETHODCALLTYPE SetInitialValueAndVelocity(
        double initialValue,
        double initialVelocity) = 0;

    virtual HRESULT STDMETHODCALLTYPE SetDuration(
        double duration) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetDuration(
        double *duration) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetFinalValue(
        double *value) = 0;

    virtual HRESULT STDMETHODCALLTYPE InterpolateValue(
        double offset,
        double *value) = 0;

    virtual HRESULT STDMETHODCALLTYPE InterpolateVelocity(
        double offset,
        double *velocity) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetDependencies(
        UI_ANIMATION_DEPENDENCIES *initialValueDependencies,
        UI_ANIMATION_DEPENDENCIES *initialVelocityDependencies,
        UI_ANIMATION_DEPENDENCIES *durationDependencies) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IUIAnimationInterpolator, 0x7815cbba, 0xddf7, 0x478c, 0xa4,0x6c, 0x7b,0x6c,0x73,0x8b,0x79,0x78)
#endif
#else
typedef struct IUIAnimationInterpolatorVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        IUIAnimationInterpolator *This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        IUIAnimationInterpolator *This);

    ULONG (STDMETHODCALLTYPE *Release)(
        IUIAnimationInterpolator *This);

    /*** IUIAnimationInterpolator methods ***/
    HRESULT (STDMETHODCALLTYPE *SetInitialValueAndVelocity)(
        IUIAnimationInterpolator *This,
        double initialValue,
        double initialVelocity);

    HRESULT (STDMETHODCALLTYPE *SetDuration)(
        IUIAnimationInterpolator *This,
        double duration);

    HRESULT (STDMETHODCALLTYPE *GetDuration)(
        IUIAnimationInterpolator *This,
        double *duration);

    HRESULT (STDMETHODCALLTYPE *GetFinalValue)(
        IUIAnimationInterpolator *This,
        double *value);

    HRESULT (STDMETHODCALLTYPE *InterpolateValue)(
        IUIAnimationInterpolator *This,
        double offset,
        double *value);

    HRESULT (STDMETHODCALLTYPE *InterpolateVelocity)(
        IUIAnimationInterpolator *This,
        double offset,
        double *velocity);

    HRESULT (STDMETHODCALLTYPE *GetDependencies)(
        IUIAnimationInterpolator *This,
        UI_ANIMATION_DEPENDENCIES *initialValueDependencies,
        UI_ANIMATION_DEPENDENCIES *initialVelocityDependencies,
        UI_ANIMATION_DEPENDENCIES *durationDependencies);

    END_INTERFACE
} IUIAnimationInterpolatorVtbl;

interface IUIAnimationInterpolator {
    CONST_VTBL IUIAnimationInterpolatorVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IUIAnimationInterpolator_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IUIAnimationInterpolator_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IUIAnimationInterpolator_Release(This) (This)->lpVtbl->Release(This)
/*** IUIAnimationInterpolator methods ***/
#define IUIAnimationInterpolator_SetInitialValueAndVelocity(This,initialValue,initialVelocity) (This)->lpVtbl->SetInitialValueAndVelocity(This,initialValue,initialVelocity)
#define IUIAnimationInterpolator_SetDuration(This,duration) (This)->lpVtbl->SetDuration(This,duration)
#define IUIAnimationInterpolator_GetDuration(This,duration) (This)->lpVtbl->GetDuration(This,duration)
#define IUIAnimationInterpolator_GetFinalValue(This,value) (This)->lpVtbl->GetFinalValue(This,value)
#define IUIAnimationInterpolator_InterpolateValue(This,offset,value) (This)->lpVtbl->InterpolateValue(This,offset,value)
#define IUIAnimationInterpolator_InterpolateVelocity(This,offset,velocity) (This)->lpVtbl->InterpolateVelocity(This,offset,velocity)
#define IUIAnimationInterpolator_GetDependencies(This,initialValueDependencies,initialVelocityDependencies,durationDependencies) (This)->lpVtbl->GetDependencies(This,initialValueDependencies,initialVelocityDependencies,durationDependencies)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IUIAnimationInterpolator_QueryInterface(IUIAnimationInterpolator* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IUIAnimationInterpolator_AddRef(IUIAnimationInterpolator* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IUIAnimationInterpolator_Release(IUIAnimationInterpolator* This) {
    return This->lpVtbl->Release(This);
}
/*** IUIAnimationInterpolator methods ***/
static FORCEINLINE HRESULT IUIAnimationInterpolator_SetInitialValueAndVelocity(IUIAnimationInterpolator* This,double initialValue,double initialVelocity) {
    return This->lpVtbl->SetInitialValueAndVelocity(This,initialValue,initialVelocity);
}
static FORCEINLINE HRESULT IUIAnimationInterpolator_SetDuration(IUIAnimationInterpolator* This,double duration) {
    return This->lpVtbl->SetDuration(This,duration);
}
static FORCEINLINE HRESULT IUIAnimationInterpolator_GetDuration(IUIAnimationInterpolator* This,double *duration) {
    return This->lpVtbl->GetDuration(This,duration);
}
static FORCEINLINE HRESULT IUIAnimationInterpolator_GetFinalValue(IUIAnimationInterpolator* This,double *value) {
    return This->lpVtbl->GetFinalValue(This,value);
}
static FORCEINLINE HRESULT IUIAnimationInterpolator_InterpolateValue(IUIAnimationInterpolator* This,double offset,double *value) {
    return This->lpVtbl->InterpolateValue(This,offset,value);
}
static FORCEINLINE HRESULT IUIAnimationInterpolator_InterpolateVelocity(IUIAnimationInterpolator* This,double offset,double *velocity) {
    return This->lpVtbl->InterpolateVelocity(This,offset,velocity);
}
static FORCEINLINE HRESULT IUIAnimationInterpolator_GetDependencies(IUIAnimationInterpolator* This,UI_ANIMATION_DEPENDENCIES *initialValueDependencies,UI_ANIMATION_DEPENDENCIES *initialVelocityDependencies,UI_ANIMATION_DEPENDENCIES *durationDependencies) {
    return This->lpVtbl->GetDependencies(This,initialValueDependencies,initialVelocityDependencies,durationDependencies);
}
#endif
#endif

#endif


#endif  /* __IUIAnimationInterpolator_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IUIAnimationTransitionFactory2 interface
 */
#ifndef __IUIAnimationTransitionFactory2_INTERFACE_DEFINED__
#define __IUIAnimationTransitionFactory2_INTERFACE_DEFINED__

DEFINE_GUID(IID_IUIAnimationTransitionFactory2, 0x937d4916, 0xc1a6, 0x42d5, 0x88,0xd8, 0x30,0x34,0x4d,0x6e,0xfe,0x31);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("937d4916-c1a6-42d5-88d8-30344d6efe31")
IUIAnimationTransitionFactory2 : public IUnknown
{
    virtual HRESULT STDMETHODCALLTYPE CreateTransition(
        IUIAnimationInterpolator2 *interpolator,
        IUIAnimationTransition2 **transition) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IUIAnimationTransitionFactory2, 0x937d4916, 0xc1a6, 0x42d5, 0x88,0xd8, 0x30,0x34,0x4d,0x6e,0xfe,0x31)
#endif
#else
typedef struct IUIAnimationTransitionFactory2Vtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        IUIAnimationTransitionFactory2 *This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        IUIAnimationTransitionFactory2 *This);

    ULONG (STDMETHODCALLTYPE *Release)(
        IUIAnimationTransitionFactory2 *This);

    /*** IUIAnimationTransitionFactory2 methods ***/
    HRESULT (STDMETHODCALLTYPE *CreateTransition)(
        IUIAnimationTransitionFactory2 *This,
        IUIAnimationInterpolator2 *interpolator,
        IUIAnimationTransition2 **transition);

    END_INTERFACE
} IUIAnimationTransitionFactory2Vtbl;

interface IUIAnimationTransitionFactory2 {
    CONST_VTBL IUIAnimationTransitionFactory2Vtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IUIAnimationTransitionFactory2_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IUIAnimationTransitionFactory2_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IUIAnimationTransitionFactory2_Release(This) (This)->lpVtbl->Release(This)
/*** IUIAnimationTransitionFactory2 methods ***/
#define IUIAnimationTransitionFactory2_CreateTransition(This,interpolator,transition) (This)->lpVtbl->CreateTransition(This,interpolator,transition)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IUIAnimationTransitionFactory2_QueryInterface(IUIAnimationTransitionFactory2* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IUIAnimationTransitionFactory2_AddRef(IUIAnimationTransitionFactory2* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IUIAnimationTransitionFactory2_Release(IUIAnimationTransitionFactory2* This) {
    return This->lpVtbl->Release(This);
}
/*** IUIAnimationTransitionFactory2 methods ***/
static FORCEINLINE HRESULT IUIAnimationTransitionFactory2_CreateTransition(IUIAnimationTransitionFactory2* This,IUIAnimationInterpolator2 *interpolator,IUIAnimationTransition2 **transition) {
    return This->lpVtbl->CreateTransition(This,interpolator,transition);
}
#endif
#endif

#endif


#endif  /* __IUIAnimationTransitionFactory2_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IUIAnimationInterpolator2 interface
 */
#ifndef __IUIAnimationInterpolator2_INTERFACE_DEFINED__
#define __IUIAnimationInterpolator2_INTERFACE_DEFINED__

DEFINE_GUID(IID_IUIAnimationInterpolator2, 0xea76aff8, 0xea22, 0x4a23, 0xa0,0xef, 0xa6,0xa9,0x66,0x70,0x35,0x18);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("ea76aff8-ea22-4a23-a0ef-a6a966703518")
IUIAnimationInterpolator2 : public IUnknown
{
    virtual HRESULT STDMETHODCALLTYPE GetDimension(
        unsigned int *dimension) = 0;

    virtual HRESULT STDMETHODCALLTYPE SetInitialValueAndVelocity(
        double *initialValue,
        double *initialVelocity,
        unsigned int cDimension) = 0;

    virtual HRESULT STDMETHODCALLTYPE SetDuration(
        double duration) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetDuration(
        double *duration) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetFinalValue(
        double *value,
        unsigned int cDimension) = 0;

    virtual HRESULT STDMETHODCALLTYPE InterpolateValue(
        double offset,
        double *value,
        unsigned int cDimension) = 0;

    virtual HRESULT STDMETHODCALLTYPE InterpolateVelocity(
        double offset,
        double *velocity,
        unsigned int cDimension) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetPrimitiveInterpolation(
        IUIAnimationPrimitiveInterpolation *interpolation,
        unsigned int cDimension) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetDependencies(
        UI_ANIMATION_DEPENDENCIES *initialValueDependencies,
        UI_ANIMATION_DEPENDENCIES *initialVelocityDependencies,
        UI_ANIMATION_DEPENDENCIES *durationDependencies) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IUIAnimationInterpolator2, 0xea76aff8, 0xea22, 0x4a23, 0xa0,0xef, 0xa6,0xa9,0x66,0x70,0x35,0x18)
#endif
#else
typedef struct IUIAnimationInterpolator2Vtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        IUIAnimationInterpolator2 *This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        IUIAnimationInterpolator2 *This);

    ULONG (STDMETHODCALLTYPE *Release)(
        IUIAnimationInterpolator2 *This);

    /*** IUIAnimationInterpolator2 methods ***/
    HRESULT (STDMETHODCALLTYPE *GetDimension)(
        IUIAnimationInterpolator2 *This,
        unsigned int *dimension);

    HRESULT (STDMETHODCALLTYPE *SetInitialValueAndVelocity)(
        IUIAnimationInterpolator2 *This,
        double *initialValue,
        double *initialVelocity,
        unsigned int cDimension);

    HRESULT (STDMETHODCALLTYPE *SetDuration)(
        IUIAnimationInterpolator2 *This,
        double duration);

    HRESULT (STDMETHODCALLTYPE *GetDuration)(
        IUIAnimationInterpolator2 *This,
        double *duration);

    HRESULT (STDMETHODCALLTYPE *GetFinalValue)(
        IUIAnimationInterpolator2 *This,
        double *value,
        unsigned int cDimension);

    HRESULT (STDMETHODCALLTYPE *InterpolateValue)(
        IUIAnimationInterpolator2 *This,
        double offset,
        double *value,
        unsigned int cDimension);

    HRESULT (STDMETHODCALLTYPE *InterpolateVelocity)(
        IUIAnimationInterpolator2 *This,
        double offset,
        double *velocity,
        unsigned int cDimension);

    HRESULT (STDMETHODCALLTYPE *GetPrimitiveInterpolation)(
        IUIAnimationInterpolator2 *This,
        IUIAnimationPrimitiveInterpolation *interpolation,
        unsigned int cDimension);

    HRESULT (STDMETHODCALLTYPE *GetDependencies)(
        IUIAnimationInterpolator2 *This,
        UI_ANIMATION_DEPENDENCIES *initialValueDependencies,
        UI_ANIMATION_DEPENDENCIES *initialVelocityDependencies,
        UI_ANIMATION_DEPENDENCIES *durationDependencies);

    END_INTERFACE
} IUIAnimationInterpolator2Vtbl;

interface IUIAnimationInterpolator2 {
    CONST_VTBL IUIAnimationInterpolator2Vtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IUIAnimationInterpolator2_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IUIAnimationInterpolator2_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IUIAnimationInterpolator2_Release(This) (This)->lpVtbl->Release(This)
/*** IUIAnimationInterpolator2 methods ***/
#define IUIAnimationInterpolator2_GetDimension(This,dimension) (This)->lpVtbl->GetDimension(This,dimension)
#define IUIAnimationInterpolator2_SetInitialValueAndVelocity(This,initialValue,initialVelocity,cDimension) (This)->lpVtbl->SetInitialValueAndVelocity(This,initialValue,initialVelocity,cDimension)
#define IUIAnimationInterpolator2_SetDuration(This,duration) (This)->lpVtbl->SetDuration(This,duration)
#define IUIAnimationInterpolator2_GetDuration(This,duration) (This)->lpVtbl->GetDuration(This,duration)
#define IUIAnimationInterpolator2_GetFinalValue(This,value,cDimension) (This)->lpVtbl->GetFinalValue(This,value,cDimension)
#define IUIAnimationInterpolator2_InterpolateValue(This,offset,value,cDimension) (This)->lpVtbl->InterpolateValue(This,offset,value,cDimension)
#define IUIAnimationInterpolator2_InterpolateVelocity(This,offset,velocity,cDimension) (This)->lpVtbl->InterpolateVelocity(This,offset,velocity,cDimension)
#define IUIAnimationInterpolator2_GetPrimitiveInterpolation(This,interpolation,cDimension) (This)->lpVtbl->GetPrimitiveInterpolation(This,interpolation,cDimension)
#define IUIAnimationInterpolator2_GetDependencies(This,initialValueDependencies,initialVelocityDependencies,durationDependencies) (This)->lpVtbl->GetDependencies(This,initialValueDependencies,initialVelocityDependencies,durationDependencies)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IUIAnimationInterpolator2_QueryInterface(IUIAnimationInterpolator2* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IUIAnimationInterpolator2_AddRef(IUIAnimationInterpolator2* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IUIAnimationInterpolator2_Release(IUIAnimationInterpolator2* This) {
    return This->lpVtbl->Release(This);
}
/*** IUIAnimationInterpolator2 methods ***/
static FORCEINLINE HRESULT IUIAnimationInterpolator2_GetDimension(IUIAnimationInterpolator2* This,unsigned int *dimension) {
    return This->lpVtbl->GetDimension(This,dimension);
}
static FORCEINLINE HRESULT IUIAnimationInterpolator2_SetInitialValueAndVelocity(IUIAnimationInterpolator2* This,double *initialValue,double *initialVelocity,unsigned int cDimension) {
    return This->lpVtbl->SetInitialValueAndVelocity(This,initialValue,initialVelocity,cDimension);
}
static FORCEINLINE HRESULT IUIAnimationInterpolator2_SetDuration(IUIAnimationInterpolator2* This,double duration) {
    return This->lpVtbl->SetDuration(This,duration);
}
static FORCEINLINE HRESULT IUIAnimationInterpolator2_GetDuration(IUIAnimationInterpolator2* This,double *duration) {
    return This->lpVtbl->GetDuration(This,duration);
}
static FORCEINLINE HRESULT IUIAnimationInterpolator2_GetFinalValue(IUIAnimationInterpolator2* This,double *value,unsigned int cDimension) {
    return This->lpVtbl->GetFinalValue(This,value,cDimension);
}
static FORCEINLINE HRESULT IUIAnimationInterpolator2_InterpolateValue(IUIAnimationInterpolator2* This,double offset,double *value,unsigned int cDimension) {
    return This->lpVtbl->InterpolateValue(This,offset,value,cDimension);
}
static FORCEINLINE HRESULT IUIAnimationInterpolator2_InterpolateVelocity(IUIAnimationInterpolator2* This,double offset,double *velocity,unsigned int cDimension) {
    return This->lpVtbl->InterpolateVelocity(This,offset,velocity,cDimension);
}
static FORCEINLINE HRESULT IUIAnimationInterpolator2_GetPrimitiveInterpolation(IUIAnimationInterpolator2* This,IUIAnimationPrimitiveInterpolation *interpolation,unsigned int cDimension) {
    return This->lpVtbl->GetPrimitiveInterpolation(This,interpolation,cDimension);
}
static FORCEINLINE HRESULT IUIAnimationInterpolator2_GetDependencies(IUIAnimationInterpolator2* This,UI_ANIMATION_DEPENDENCIES *initialValueDependencies,UI_ANIMATION_DEPENDENCIES *initialVelocityDependencies,UI_ANIMATION_DEPENDENCIES *durationDependencies) {
    return This->lpVtbl->GetDependencies(This,initialValueDependencies,initialVelocityDependencies,durationDependencies);
}
#endif
#endif

#endif


#endif  /* __IUIAnimationInterpolator2_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IUIAnimationPrimitiveInterpolation interface
 */
#ifndef __IUIAnimationPrimitiveInterpolation_INTERFACE_DEFINED__
#define __IUIAnimationPrimitiveInterpolation_INTERFACE_DEFINED__

DEFINE_GUID(IID_IUIAnimationPrimitiveInterpolation, 0xbab20d63, 0x4361, 0x45da, 0xa2,0x4f, 0xab,0x85,0x08,0x84,0x6b,0x5b);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("bab20d63-4361-45da-a24f-ab8508846b5b")
IUIAnimationPrimitiveInterpolation : public IUnknown
{
    virtual HRESULT STDMETHODCALLTYPE AddCubic(
        unsigned int dimension,
        double beginOffset,
        float constantCoefficient,
        float linearCoefficient,
        float quadraticCoefficient,
        float cubicCoefficient) = 0;

    virtual HRESULT STDMETHODCALLTYPE AddSinusoidal(
        unsigned int dimension,
        double beginOffset,
        float bias,
        float amplitude,
        float frequency,
        float phase) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IUIAnimationPrimitiveInterpolation, 0xbab20d63, 0x4361, 0x45da, 0xa2,0x4f, 0xab,0x85,0x08,0x84,0x6b,0x5b)
#endif
#else
typedef struct IUIAnimationPrimitiveInterpolationVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        IUIAnimationPrimitiveInterpolation *This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        IUIAnimationPrimitiveInterpolation *This);

    ULONG (STDMETHODCALLTYPE *Release)(
        IUIAnimationPrimitiveInterpolation *This);

    /*** IUIAnimationPrimitiveInterpolation methods ***/
    HRESULT (STDMETHODCALLTYPE *AddCubic)(
        IUIAnimationPrimitiveInterpolation *This,
        unsigned int dimension,
        double beginOffset,
        float constantCoefficient,
        float linearCoefficient,
        float quadraticCoefficient,
        float cubicCoefficient);

    HRESULT (STDMETHODCALLTYPE *AddSinusoidal)(
        IUIAnimationPrimitiveInterpolation *This,
        unsigned int dimension,
        double beginOffset,
        float bias,
        float amplitude,
        float frequency,
        float phase);

    END_INTERFACE
} IUIAnimationPrimitiveInterpolationVtbl;

interface IUIAnimationPrimitiveInterpolation {
    CONST_VTBL IUIAnimationPrimitiveInterpolationVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IUIAnimationPrimitiveInterpolation_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IUIAnimationPrimitiveInterpolation_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IUIAnimationPrimitiveInterpolation_Release(This) (This)->lpVtbl->Release(This)
/*** IUIAnimationPrimitiveInterpolation methods ***/
#define IUIAnimationPrimitiveInterpolation_AddCubic(This,dimension,beginOffset,constantCoefficient,linearCoefficient,quadraticCoefficient,cubicCoefficient) (This)->lpVtbl->AddCubic(This,dimension,beginOffset,constantCoefficient,linearCoefficient,quadraticCoefficient,cubicCoefficient)
#define IUIAnimationPrimitiveInterpolation_AddSinusoidal(This,dimension,beginOffset,bias,amplitude,frequency,phase) (This)->lpVtbl->AddSinusoidal(This,dimension,beginOffset,bias,amplitude,frequency,phase)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IUIAnimationPrimitiveInterpolation_QueryInterface(IUIAnimationPrimitiveInterpolation* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IUIAnimationPrimitiveInterpolation_AddRef(IUIAnimationPrimitiveInterpolation* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IUIAnimationPrimitiveInterpolation_Release(IUIAnimationPrimitiveInterpolation* This) {
    return This->lpVtbl->Release(This);
}
/*** IUIAnimationPrimitiveInterpolation methods ***/
static FORCEINLINE HRESULT IUIAnimationPrimitiveInterpolation_AddCubic(IUIAnimationPrimitiveInterpolation* This,unsigned int dimension,double beginOffset,float constantCoefficient,float linearCoefficient,float quadraticCoefficient,float cubicCoefficient) {
    return This->lpVtbl->AddCubic(This,dimension,beginOffset,constantCoefficient,linearCoefficient,quadraticCoefficient,cubicCoefficient);
}
static FORCEINLINE HRESULT IUIAnimationPrimitiveInterpolation_AddSinusoidal(IUIAnimationPrimitiveInterpolation* This,unsigned int dimension,double beginOffset,float bias,float amplitude,float frequency,float phase) {
    return This->lpVtbl->AddSinusoidal(This,dimension,beginOffset,bias,amplitude,frequency,phase);
}
#endif
#endif

#endif


#endif  /* __IUIAnimationPrimitiveInterpolation_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IUIAnimationTimer interface
 */
#ifndef __IUIAnimationTimer_INTERFACE_DEFINED__
#define __IUIAnimationTimer_INTERFACE_DEFINED__

DEFINE_GUID(IID_IUIAnimationTimer, 0x6b0efad1, 0xa053, 0x41d6, 0x90,0x85, 0x33,0xa6,0x89,0x14,0x46,0x65);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("6b0efad1-a053-41d6-9085-33a689144665")
IUIAnimationTimer : public IUnknown
{
    virtual HRESULT STDMETHODCALLTYPE SetTimerUpdateHandler(
        IUIAnimationTimerUpdateHandler *updateHandler,
        UI_ANIMATION_IDLE_BEHAVIOR idleBehavior) = 0;

    virtual HRESULT STDMETHODCALLTYPE SetTimerEventHandler(
        IUIAnimationTimerEventHandler *handler) = 0;

    virtual HRESULT STDMETHODCALLTYPE Enable(
        ) = 0;

    virtual HRESULT STDMETHODCALLTYPE Disable(
        ) = 0;

    virtual HRESULT STDMETHODCALLTYPE IsEnabled(
        ) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetTime(
        double *seconds) = 0;

    virtual HRESULT STDMETHODCALLTYPE SetFrameRateThreshold(
        unsigned int framesPerSecond) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IUIAnimationTimer, 0x6b0efad1, 0xa053, 0x41d6, 0x90,0x85, 0x33,0xa6,0x89,0x14,0x46,0x65)
#endif
#else
typedef struct IUIAnimationTimerVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        IUIAnimationTimer *This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        IUIAnimationTimer *This);

    ULONG (STDMETHODCALLTYPE *Release)(
        IUIAnimationTimer *This);

    /*** IUIAnimationTimer methods ***/
    HRESULT (STDMETHODCALLTYPE *SetTimerUpdateHandler)(
        IUIAnimationTimer *This,
        IUIAnimationTimerUpdateHandler *updateHandler,
        UI_ANIMATION_IDLE_BEHAVIOR idleBehavior);

    HRESULT (STDMETHODCALLTYPE *SetTimerEventHandler)(
        IUIAnimationTimer *This,
        IUIAnimationTimerEventHandler *handler);

    HRESULT (STDMETHODCALLTYPE *Enable)(
        IUIAnimationTimer *This);

    HRESULT (STDMETHODCALLTYPE *Disable)(
        IUIAnimationTimer *This);

    HRESULT (STDMETHODCALLTYPE *IsEnabled)(
        IUIAnimationTimer *This);

    HRESULT (STDMETHODCALLTYPE *GetTime)(
        IUIAnimationTimer *This,
        double *seconds);

    HRESULT (STDMETHODCALLTYPE *SetFrameRateThreshold)(
        IUIAnimationTimer *This,
        unsigned int framesPerSecond);

    END_INTERFACE
} IUIAnimationTimerVtbl;

interface IUIAnimationTimer {
    CONST_VTBL IUIAnimationTimerVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IUIAnimationTimer_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IUIAnimationTimer_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IUIAnimationTimer_Release(This) (This)->lpVtbl->Release(This)
/*** IUIAnimationTimer methods ***/
#define IUIAnimationTimer_SetTimerUpdateHandler(This,updateHandler,idleBehavior) (This)->lpVtbl->SetTimerUpdateHandler(This,updateHandler,idleBehavior)
#define IUIAnimationTimer_SetTimerEventHandler(This,handler) (This)->lpVtbl->SetTimerEventHandler(This,handler)
#define IUIAnimationTimer_Enable(This) (This)->lpVtbl->Enable(This)
#define IUIAnimationTimer_Disable(This) (This)->lpVtbl->Disable(This)
#define IUIAnimationTimer_IsEnabled(This) (This)->lpVtbl->IsEnabled(This)
#define IUIAnimationTimer_GetTime(This,seconds) (This)->lpVtbl->GetTime(This,seconds)
#define IUIAnimationTimer_SetFrameRateThreshold(This,framesPerSecond) (This)->lpVtbl->SetFrameRateThreshold(This,framesPerSecond)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IUIAnimationTimer_QueryInterface(IUIAnimationTimer* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IUIAnimationTimer_AddRef(IUIAnimationTimer* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IUIAnimationTimer_Release(IUIAnimationTimer* This) {
    return This->lpVtbl->Release(This);
}
/*** IUIAnimationTimer methods ***/
static FORCEINLINE HRESULT IUIAnimationTimer_SetTimerUpdateHandler(IUIAnimationTimer* This,IUIAnimationTimerUpdateHandler *updateHandler,UI_ANIMATION_IDLE_BEHAVIOR idleBehavior) {
    return This->lpVtbl->SetTimerUpdateHandler(This,updateHandler,idleBehavior);
}
static FORCEINLINE HRESULT IUIAnimationTimer_SetTimerEventHandler(IUIAnimationTimer* This,IUIAnimationTimerEventHandler *handler) {
    return This->lpVtbl->SetTimerEventHandler(This,handler);
}
static FORCEINLINE HRESULT IUIAnimationTimer_Enable(IUIAnimationTimer* This) {
    return This->lpVtbl->Enable(This);
}
static FORCEINLINE HRESULT IUIAnimationTimer_Disable(IUIAnimationTimer* This) {
    return This->lpVtbl->Disable(This);
}
static FORCEINLINE HRESULT IUIAnimationTimer_IsEnabled(IUIAnimationTimer* This) {
    return This->lpVtbl->IsEnabled(This);
}
static FORCEINLINE HRESULT IUIAnimationTimer_GetTime(IUIAnimationTimer* This,double *seconds) {
    return This->lpVtbl->GetTime(This,seconds);
}
static FORCEINLINE HRESULT IUIAnimationTimer_SetFrameRateThreshold(IUIAnimationTimer* This,unsigned int framesPerSecond) {
    return This->lpVtbl->SetFrameRateThreshold(This,framesPerSecond);
}
#endif
#endif

#endif


#endif  /* __IUIAnimationTimer_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IUIAnimationTimerUpdateHandler interface
 */
#ifndef __IUIAnimationTimerUpdateHandler_INTERFACE_DEFINED__
#define __IUIAnimationTimerUpdateHandler_INTERFACE_DEFINED__

DEFINE_GUID(IID_IUIAnimationTimerUpdateHandler, 0x195509b7, 0x5d5e, 0x4e3e, 0xb2,0x78, 0xee,0x37,0x59,0xb3,0x67,0xad);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("195509b7-5d5e-4e3e-b278-ee3759b367ad")
IUIAnimationTimerUpdateHandler : public IUnknown
{
    virtual HRESULT STDMETHODCALLTYPE OnUpdate(
        double timeNow,
        UI_ANIMATION_UPDATE_RESULT *result) = 0;

    virtual HRESULT STDMETHODCALLTYPE SetTimerClientEventHandler(
        IUIAnimationTimerClientEventHandler *handler) = 0;

    virtual HRESULT STDMETHODCALLTYPE ClearTimerClientEventHandler(
        ) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IUIAnimationTimerUpdateHandler, 0x195509b7, 0x5d5e, 0x4e3e, 0xb2,0x78, 0xee,0x37,0x59,0xb3,0x67,0xad)
#endif
#else
typedef struct IUIAnimationTimerUpdateHandlerVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        IUIAnimationTimerUpdateHandler *This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        IUIAnimationTimerUpdateHandler *This);

    ULONG (STDMETHODCALLTYPE *Release)(
        IUIAnimationTimerUpdateHandler *This);

    /*** IUIAnimationTimerUpdateHandler methods ***/
    HRESULT (STDMETHODCALLTYPE *OnUpdate)(
        IUIAnimationTimerUpdateHandler *This,
        double timeNow,
        UI_ANIMATION_UPDATE_RESULT *result);

    HRESULT (STDMETHODCALLTYPE *SetTimerClientEventHandler)(
        IUIAnimationTimerUpdateHandler *This,
        IUIAnimationTimerClientEventHandler *handler);

    HRESULT (STDMETHODCALLTYPE *ClearTimerClientEventHandler)(
        IUIAnimationTimerUpdateHandler *This);

    END_INTERFACE
} IUIAnimationTimerUpdateHandlerVtbl;

interface IUIAnimationTimerUpdateHandler {
    CONST_VTBL IUIAnimationTimerUpdateHandlerVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IUIAnimationTimerUpdateHandler_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IUIAnimationTimerUpdateHandler_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IUIAnimationTimerUpdateHandler_Release(This) (This)->lpVtbl->Release(This)
/*** IUIAnimationTimerUpdateHandler methods ***/
#define IUIAnimationTimerUpdateHandler_OnUpdate(This,timeNow,result) (This)->lpVtbl->OnUpdate(This,timeNow,result)
#define IUIAnimationTimerUpdateHandler_SetTimerClientEventHandler(This,handler) (This)->lpVtbl->SetTimerClientEventHandler(This,handler)
#define IUIAnimationTimerUpdateHandler_ClearTimerClientEventHandler(This) (This)->lpVtbl->ClearTimerClientEventHandler(This)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IUIAnimationTimerUpdateHandler_QueryInterface(IUIAnimationTimerUpdateHandler* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IUIAnimationTimerUpdateHandler_AddRef(IUIAnimationTimerUpdateHandler* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IUIAnimationTimerUpdateHandler_Release(IUIAnimationTimerUpdateHandler* This) {
    return This->lpVtbl->Release(This);
}
/*** IUIAnimationTimerUpdateHandler methods ***/
static FORCEINLINE HRESULT IUIAnimationTimerUpdateHandler_OnUpdate(IUIAnimationTimerUpdateHandler* This,double timeNow,UI_ANIMATION_UPDATE_RESULT *result) {
    return This->lpVtbl->OnUpdate(This,timeNow,result);
}
static FORCEINLINE HRESULT IUIAnimationTimerUpdateHandler_SetTimerClientEventHandler(IUIAnimationTimerUpdateHandler* This,IUIAnimationTimerClientEventHandler *handler) {
    return This->lpVtbl->SetTimerClientEventHandler(This,handler);
}
static FORCEINLINE HRESULT IUIAnimationTimerUpdateHandler_ClearTimerClientEventHandler(IUIAnimationTimerUpdateHandler* This) {
    return This->lpVtbl->ClearTimerClientEventHandler(This);
}
#endif
#endif

#endif


#endif  /* __IUIAnimationTimerUpdateHandler_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IUIAnimationTimerClientEventHandler interface
 */
#ifndef __IUIAnimationTimerClientEventHandler_INTERFACE_DEFINED__
#define __IUIAnimationTimerClientEventHandler_INTERFACE_DEFINED__

DEFINE_GUID(IID_IUIAnimationTimerClientEventHandler, 0xbedb4db6, 0x94fa, 0x4bfb, 0xa4,0x7f, 0xef,0x2d,0x9e,0x40,0x8c,0x25);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("bedb4db6-94fa-4bfb-a47f-ef2d9e408c25")
IUIAnimationTimerClientEventHandler : public IUnknown
{
    virtual HRESULT STDMETHODCALLTYPE OnTimerClientStatusChanged(
        UI_ANIMATION_TIMER_CLIENT_STATUS newStatus,
        UI_ANIMATION_TIMER_CLIENT_STATUS previousStatus) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IUIAnimationTimerClientEventHandler, 0xbedb4db6, 0x94fa, 0x4bfb, 0xa4,0x7f, 0xef,0x2d,0x9e,0x40,0x8c,0x25)
#endif
#else
typedef struct IUIAnimationTimerClientEventHandlerVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        IUIAnimationTimerClientEventHandler *This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        IUIAnimationTimerClientEventHandler *This);

    ULONG (STDMETHODCALLTYPE *Release)(
        IUIAnimationTimerClientEventHandler *This);

    /*** IUIAnimationTimerClientEventHandler methods ***/
    HRESULT (STDMETHODCALLTYPE *OnTimerClientStatusChanged)(
        IUIAnimationTimerClientEventHandler *This,
        UI_ANIMATION_TIMER_CLIENT_STATUS newStatus,
        UI_ANIMATION_TIMER_CLIENT_STATUS previousStatus);

    END_INTERFACE
} IUIAnimationTimerClientEventHandlerVtbl;

interface IUIAnimationTimerClientEventHandler {
    CONST_VTBL IUIAnimationTimerClientEventHandlerVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IUIAnimationTimerClientEventHandler_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IUIAnimationTimerClientEventHandler_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IUIAnimationTimerClientEventHandler_Release(This) (This)->lpVtbl->Release(This)
/*** IUIAnimationTimerClientEventHandler methods ***/
#define IUIAnimationTimerClientEventHandler_OnTimerClientStatusChanged(This,newStatus,previousStatus) (This)->lpVtbl->OnTimerClientStatusChanged(This,newStatus,previousStatus)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IUIAnimationTimerClientEventHandler_QueryInterface(IUIAnimationTimerClientEventHandler* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IUIAnimationTimerClientEventHandler_AddRef(IUIAnimationTimerClientEventHandler* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IUIAnimationTimerClientEventHandler_Release(IUIAnimationTimerClientEventHandler* This) {
    return This->lpVtbl->Release(This);
}
/*** IUIAnimationTimerClientEventHandler methods ***/
static FORCEINLINE HRESULT IUIAnimationTimerClientEventHandler_OnTimerClientStatusChanged(IUIAnimationTimerClientEventHandler* This,UI_ANIMATION_TIMER_CLIENT_STATUS newStatus,UI_ANIMATION_TIMER_CLIENT_STATUS previousStatus) {
    return This->lpVtbl->OnTimerClientStatusChanged(This,newStatus,previousStatus);
}
#endif
#endif

#endif


#endif  /* __IUIAnimationTimerClientEventHandler_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IUIAnimationTimerEventHandler interface
 */
#ifndef __IUIAnimationTimerEventHandler_INTERFACE_DEFINED__
#define __IUIAnimationTimerEventHandler_INTERFACE_DEFINED__

DEFINE_GUID(IID_IUIAnimationTimerEventHandler, 0x274a7dea, 0xd771, 0x4095, 0xab,0xbd, 0x8d,0xf7,0xab,0xd2,0x3c,0xe3);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("274a7dea-d771-4095-abbd-8df7abd23ce3")
IUIAnimationTimerEventHandler : public IUnknown
{
    virtual HRESULT STDMETHODCALLTYPE OnPreUpdate(
        ) = 0;

    virtual HRESULT STDMETHODCALLTYPE OnPostUpdate(
        ) = 0;

    virtual HRESULT STDMETHODCALLTYPE OnRenderingTooSlow(
        UINT32 framesPerSecond) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IUIAnimationTimerEventHandler, 0x274a7dea, 0xd771, 0x4095, 0xab,0xbd, 0x8d,0xf7,0xab,0xd2,0x3c,0xe3)
#endif
#else
typedef struct IUIAnimationTimerEventHandlerVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        IUIAnimationTimerEventHandler *This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        IUIAnimationTimerEventHandler *This);

    ULONG (STDMETHODCALLTYPE *Release)(
        IUIAnimationTimerEventHandler *This);

    /*** IUIAnimationTimerEventHandler methods ***/
    HRESULT (STDMETHODCALLTYPE *OnPreUpdate)(
        IUIAnimationTimerEventHandler *This);

    HRESULT (STDMETHODCALLTYPE *OnPostUpdate)(
        IUIAnimationTimerEventHandler *This);

    HRESULT (STDMETHODCALLTYPE *OnRenderingTooSlow)(
        IUIAnimationTimerEventHandler *This,
        UINT32 framesPerSecond);

    END_INTERFACE
} IUIAnimationTimerEventHandlerVtbl;

interface IUIAnimationTimerEventHandler {
    CONST_VTBL IUIAnimationTimerEventHandlerVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IUIAnimationTimerEventHandler_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IUIAnimationTimerEventHandler_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IUIAnimationTimerEventHandler_Release(This) (This)->lpVtbl->Release(This)
/*** IUIAnimationTimerEventHandler methods ***/
#define IUIAnimationTimerEventHandler_OnPreUpdate(This) (This)->lpVtbl->OnPreUpdate(This)
#define IUIAnimationTimerEventHandler_OnPostUpdate(This) (This)->lpVtbl->OnPostUpdate(This)
#define IUIAnimationTimerEventHandler_OnRenderingTooSlow(This,framesPerSecond) (This)->lpVtbl->OnRenderingTooSlow(This,framesPerSecond)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IUIAnimationTimerEventHandler_QueryInterface(IUIAnimationTimerEventHandler* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IUIAnimationTimerEventHandler_AddRef(IUIAnimationTimerEventHandler* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IUIAnimationTimerEventHandler_Release(IUIAnimationTimerEventHandler* This) {
    return This->lpVtbl->Release(This);
}
/*** IUIAnimationTimerEventHandler methods ***/
static FORCEINLINE HRESULT IUIAnimationTimerEventHandler_OnPreUpdate(IUIAnimationTimerEventHandler* This) {
    return This->lpVtbl->OnPreUpdate(This);
}
static FORCEINLINE HRESULT IUIAnimationTimerEventHandler_OnPostUpdate(IUIAnimationTimerEventHandler* This) {
    return This->lpVtbl->OnPostUpdate(This);
}
static FORCEINLINE HRESULT IUIAnimationTimerEventHandler_OnRenderingTooSlow(IUIAnimationTimerEventHandler* This,UINT32 framesPerSecond) {
    return This->lpVtbl->OnRenderingTooSlow(This,framesPerSecond);
}
#endif
#endif

#endif


#endif  /* __IUIAnimationTimerEventHandler_INTERFACE_DEFINED__ */

/* Begin additional prototypes for all interfaces */


/* End additional prototypes */

#ifdef __cplusplus
}
#endif

#endif /* __uianimation_h__ */
