/*** Autogenerated by WIDL 1.6 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;
#endif

#ifndef __IUIAnimationVariable_FWD_DEFINED__
#define __IUIAnimationVariable_FWD_DEFINED__
typedef interface IUIAnimationVariable IUIAnimationVariable;
#endif

#ifndef __IUIAnimationStoryboard_FWD_DEFINED__
#define __IUIAnimationStoryboard_FWD_DEFINED__
typedef interface IUIAnimationStoryboard IUIAnimationStoryboard;
#endif

#ifndef __IUIAnimationTransition_FWD_DEFINED__
#define __IUIAnimationTransition_FWD_DEFINED__
typedef interface IUIAnimationTransition IUIAnimationTransition;
#endif

#ifndef __IUIAnimationStoryboardEventHandler_FWD_DEFINED__
#define __IUIAnimationStoryboardEventHandler_FWD_DEFINED__
typedef interface IUIAnimationStoryboardEventHandler IUIAnimationStoryboardEventHandler;
#endif

#ifndef __IUIAnimationVariableChangeHandler_FWD_DEFINED__
#define __IUIAnimationVariableChangeHandler_FWD_DEFINED__
typedef interface IUIAnimationVariableChangeHandler IUIAnimationVariableChangeHandler;
#endif

#ifndef __IUIAnimationVariableIntegerChangeHandler_FWD_DEFINED__
#define __IUIAnimationVariableIntegerChangeHandler_FWD_DEFINED__
typedef interface IUIAnimationVariableIntegerChangeHandler IUIAnimationVariableIntegerChangeHandler;
#endif

#ifndef __IUIAnimationManagerEventHandler_FWD_DEFINED__
#define __IUIAnimationManagerEventHandler_FWD_DEFINED__
typedef interface IUIAnimationManagerEventHandler IUIAnimationManagerEventHandler;
#endif

#ifndef __IUIAnimationPriorityComparison_FWD_DEFINED__
#define __IUIAnimationPriorityComparison_FWD_DEFINED__
typedef interface IUIAnimationPriorityComparison IUIAnimationPriorityComparison;
#endif

#ifndef __IUIAnimationManager2_FWD_DEFINED__
#define __IUIAnimationManager2_FWD_DEFINED__
typedef interface IUIAnimationManager2 IUIAnimationManager2;
#endif

#ifndef __IUIAnimationVariable2_FWD_DEFINED__
#define __IUIAnimationVariable2_FWD_DEFINED__
typedef interface IUIAnimationVariable2 IUIAnimationVariable2;
#endif

#ifndef __IDCompositionAnimation_FWD_DEFINED__
#define __IDCompositionAnimation_FWD_DEFINED__
typedef interface IDCompositionAnimation IDCompositionAnimation;
#endif

#ifndef __IUIAnimationStoryboard2_FWD_DEFINED__
#define __IUIAnimationStoryboard2_FWD_DEFINED__
typedef interface IUIAnimationStoryboard2 IUIAnimationStoryboard2;
#endif

#ifndef __IUIAnimationTransition2_FWD_DEFINED__
#define __IUIAnimationTransition2_FWD_DEFINED__
typedef interface IUIAnimationTransition2 IUIAnimationTransition2;
#endif

#ifndef __IUIAnimationLoopIterationChangeHandler2_FWD_DEFINED__
#define __IUIAnimationLoopIterationChangeHandler2_FWD_DEFINED__
typedef interface IUIAnimationLoopIterationChangeHandler2 IUIAnimationLoopIterationChangeHandler2;
#endif

#ifndef __IUIAnimationStoryboardEventHandler2_FWD_DEFINED__
#define __IUIAnimationStoryboardEventHandler2_FWD_DEFINED__
typedef interface IUIAnimationStoryboardEventHandler2 IUIAnimationStoryboardEventHandler2;
#endif

#ifndef __IUIAnimationVariableChangeHandler2_FWD_DEFINED__
#define __IUIAnimationVariableChangeHandler2_FWD_DEFINED__
typedef interface IUIAnimationVariableChangeHandler2 IUIAnimationVariableChangeHandler2;
#endif

#ifndef __IUIAnimationVariableIntegerChangeHandler2_FWD_DEFINED__
#define __IUIAnimationVariableIntegerChangeHandler2_FWD_DEFINED__
typedef interface IUIAnimationVariableIntegerChangeHandler2 IUIAnimationVariableIntegerChangeHandler2;
#endif

#ifndef __IUIAnimationVariableCurveChangeHandler2_FWD_DEFINED__
#define __IUIAnimationVariableCurveChangeHandler2_FWD_DEFINED__
typedef interface IUIAnimationVariableCurveChangeHandler2 IUIAnimationVariableCurveChangeHandler2;
#endif

#ifndef __IUIAnimationManagerEventHandler2_FWD_DEFINED__
#define __IUIAnimationManagerEventHandler2_FWD_DEFINED__
typedef interface IUIAnimationManagerEventHandler2 IUIAnimationManagerEventHandler2;
#endif

#ifndef __IUIAnimationPriorityComparison2_FWD_DEFINED__
#define __IUIAnimationPriorityComparison2_FWD_DEFINED__
typedef interface IUIAnimationPriorityComparison2 IUIAnimationPriorityComparison2;
#endif

#ifndef __IUIAnimationTransitionLibrary_FWD_DEFINED__
#define __IUIAnimationTransitionLibrary_FWD_DEFINED__
typedef interface IUIAnimationTransitionLibrary IUIAnimationTransitionLibrary;
#endif

#ifndef __IUIAnimationTransitionLibrary2_FWD_DEFINED__
#define __IUIAnimationTransitionLibrary2_FWD_DEFINED__
typedef interface IUIAnimationTransitionLibrary2 IUIAnimationTransitionLibrary2;
#endif

#ifndef __IUIAnimationTransitionFactory_FWD_DEFINED__
#define __IUIAnimationTransitionFactory_FWD_DEFINED__
typedef interface IUIAnimationTransitionFactory IUIAnimationTransitionFactory;
#endif

#ifndef __IUIAnimationInterpolator_FWD_DEFINED__
#define __IUIAnimationInterpolator_FWD_DEFINED__
typedef interface IUIAnimationInterpolator IUIAnimationInterpolator;
#endif

#ifndef __IUIAnimationTransitionFactory2_FWD_DEFINED__
#define __IUIAnimationTransitionFactory2_FWD_DEFINED__
typedef interface IUIAnimationTransitionFactory2 IUIAnimationTransitionFactory2;
#endif

#ifndef __IUIAnimationInterpolator2_FWD_DEFINED__
#define __IUIAnimationInterpolator2_FWD_DEFINED__
typedef interface IUIAnimationInterpolator2 IUIAnimationInterpolator2;
#endif

#ifndef __IUIAnimationPrimitiveInterpolation_FWD_DEFINED__
#define __IUIAnimationPrimitiveInterpolation_FWD_DEFINED__
typedef interface IUIAnimationPrimitiveInterpolation IUIAnimationPrimitiveInterpolation;
#endif

#ifndef __IUIAnimationTimer_FWD_DEFINED__
#define __IUIAnimationTimer_FWD_DEFINED__
typedef interface IUIAnimationTimer IUIAnimationTimer;
#endif

#ifndef __IUIAnimationTimerUpdateHandler_FWD_DEFINED__
#define __IUIAnimationTimerUpdateHandler_FWD_DEFINED__
typedef interface IUIAnimationTimerUpdateHandler IUIAnimationTimerUpdateHandler;
#endif

#ifndef __IUIAnimationTimerClientEventHandler_FWD_DEFINED__
#define __IUIAnimationTimerClientEventHandler_FWD_DEFINED__
typedef interface IUIAnimationTimerClientEventHandler IUIAnimationTimerClientEventHandler;
#endif

#ifndef __IUIAnimationTimerEventHandler_FWD_DEFINED__
#define __IUIAnimationTimerEventHandler_FWD_DEFINED__
typedef interface IUIAnimationTimerEventHandler IUIAnimationTimerEventHandler;
#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;
#endif

#ifndef __IUIAnimationVariable_FWD_DEFINED__
#define __IUIAnimationVariable_FWD_DEFINED__
typedef interface IUIAnimationVariable IUIAnimationVariable;
#endif

#ifndef __IUIAnimationStoryboard_FWD_DEFINED__
#define __IUIAnimationStoryboard_FWD_DEFINED__
typedef interface IUIAnimationStoryboard IUIAnimationStoryboard;
#endif

#ifndef __IUIAnimationTransition_FWD_DEFINED__
#define __IUIAnimationTransition_FWD_DEFINED__
typedef interface IUIAnimationTransition IUIAnimationTransition;
#endif

#ifndef __IUIAnimationStoryboardEventHandler_FWD_DEFINED__
#define __IUIAnimationStoryboardEventHandler_FWD_DEFINED__
typedef interface IUIAnimationStoryboardEventHandler IUIAnimationStoryboardEventHandler;
#endif

#ifndef __IUIAnimationVariableChangeHandler_FWD_DEFINED__
#define __IUIAnimationVariableChangeHandler_FWD_DEFINED__
typedef interface IUIAnimationVariableChangeHandler IUIAnimationVariableChangeHandler;
#endif

#ifndef __IUIAnimationVariableIntegerChangeHandler_FWD_DEFINED__
#define __IUIAnimationVariableIntegerChangeHandler_FWD_DEFINED__
typedef interface IUIAnimationVariableIntegerChangeHandler IUIAnimationVariableIntegerChangeHandler;
#endif

#ifndef __IUIAnimationManagerEventHandler_FWD_DEFINED__
#define __IUIAnimationManagerEventHandler_FWD_DEFINED__
typedef interface IUIAnimationManagerEventHandler IUIAnimationManagerEventHandler;
#endif

#ifndef __IUIAnimationPriorityComparison_FWD_DEFINED__
#define __IUIAnimationPriorityComparison_FWD_DEFINED__
typedef interface IUIAnimationPriorityComparison IUIAnimationPriorityComparison;
#endif

#ifndef __IUIAnimationManager2_FWD_DEFINED__
#define __IUIAnimationManager2_FWD_DEFINED__
typedef interface IUIAnimationManager2 IUIAnimationManager2;
#endif

#ifndef __IUIAnimationVariable2_FWD_DEFINED__
#define __IUIAnimationVariable2_FWD_DEFINED__
typedef interface IUIAnimationVariable2 IUIAnimationVariable2;
#endif

#ifndef __IDCompositionAnimation_FWD_DEFINED__
#define __IDCompositionAnimation_FWD_DEFINED__
typedef interface IDCompositionAnimation IDCompositionAnimation;
#endif

#ifndef __IUIAnimationStoryboard2_FWD_DEFINED__
#define __IUIAnimationStoryboard2_FWD_DEFINED__
typedef interface IUIAnimationStoryboard2 IUIAnimationStoryboard2;
#endif

#ifndef __IUIAnimationTransition2_FWD_DEFINED__
#define __IUIAnimationTransition2_FWD_DEFINED__
typedef interface IUIAnimationTransition2 IUIAnimationTransition2;
#endif

#ifndef __IUIAnimationLoopIterationChangeHandler2_FWD_DEFINED__
#define __IUIAnimationLoopIterationChangeHandler2_FWD_DEFINED__
typedef interface IUIAnimationLoopIterationChangeHandler2 IUIAnimationLoopIterationChangeHandler2;
#endif

#ifndef __IUIAnimationStoryboardEventHandler2_FWD_DEFINED__
#define __IUIAnimationStoryboardEventHandler2_FWD_DEFINED__
typedef interface IUIAnimationStoryboardEventHandler2 IUIAnimationStoryboardEventHandler2;
#endif

#ifndef __IUIAnimationVariableChangeHandler2_FWD_DEFINED__
#define __IUIAnimationVariableChangeHandler2_FWD_DEFINED__
typedef interface IUIAnimationVariableChangeHandler2 IUIAnimationVariableChangeHandler2;
#endif

#ifndef __IUIAnimationVariableIntegerChangeHandler2_FWD_DEFINED__
#define __IUIAnimationVariableIntegerChangeHandler2_FWD_DEFINED__
typedef interface IUIAnimationVariableIntegerChangeHandler2 IUIAnimationVariableIntegerChangeHandler2;
#endif

#ifndef __IUIAnimationVariableCurveChangeHandler2_FWD_DEFINED__
#define __IUIAnimationVariableCurveChangeHandler2_FWD_DEFINED__
typedef interface IUIAnimationVariableCurveChangeHandler2 IUIAnimationVariableCurveChangeHandler2;
#endif

#ifndef __IUIAnimationManagerEventHandler2_FWD_DEFINED__
#define __IUIAnimationManagerEventHandler2_FWD_DEFINED__
typedef interface IUIAnimationManagerEventHandler2 IUIAnimationManagerEventHandler2;
#endif

#ifndef __IUIAnimationPriorityComparison2_FWD_DEFINED__
#define __IUIAnimationPriorityComparison2_FWD_DEFINED__
typedef interface IUIAnimationPriorityComparison2 IUIAnimationPriorityComparison2;
#endif

#ifndef __IUIAnimationTransitionLibrary_FWD_DEFINED__
#define __IUIAnimationTransitionLibrary_FWD_DEFINED__
typedef interface IUIAnimationTransitionLibrary IUIAnimationTransitionLibrary;
#endif

#ifndef __IUIAnimationTransitionLibrary2_FWD_DEFINED__
#define __IUIAnimationTransitionLibrary2_FWD_DEFINED__
typedef interface IUIAnimationTransitionLibrary2 IUIAnimationTransitionLibrary2;
#endif

#ifndef __IUIAnimationTransitionFactory_FWD_DEFINED__
#define __IUIAnimationTransitionFactory_FWD_DEFINED__
typedef interface IUIAnimationTransitionFactory IUIAnimationTransitionFactory;
#endif

#ifndef __IUIAnimationInterpolator_FWD_DEFINED__
#define __IUIAnimationInterpolator_FWD_DEFINED__
typedef interface IUIAnimationInterpolator IUIAnimationInterpolator;
#endif

#ifndef __IUIAnimationTransitionFactory2_FWD_DEFINED__
#define __IUIAnimationTransitionFactory2_FWD_DEFINED__
typedef interface IUIAnimationTransitionFactory2 IUIAnimationTransitionFactory2;
#endif

#ifndef __IUIAnimationInterpolator2_FWD_DEFINED__
#define __IUIAnimationInterpolator2_FWD_DEFINED__
typedef interface IUIAnimationInterpolator2 IUIAnimationInterpolator2;
#endif

#ifndef __IUIAnimationPrimitiveInterpolation_FWD_DEFINED__
#define __IUIAnimationPrimitiveInterpolation_FWD_DEFINED__
typedef interface IUIAnimationPrimitiveInterpolation IUIAnimationPrimitiveInterpolation;
#endif

#ifndef __IUIAnimationTimer_FWD_DEFINED__
#define __IUIAnimationTimer_FWD_DEFINED__
typedef interface IUIAnimationTimer IUIAnimationTimer;
#endif

#ifndef __IUIAnimationTimerUpdateHandler_FWD_DEFINED__
#define __IUIAnimationTimerUpdateHandler_FWD_DEFINED__
typedef interface IUIAnimationTimerUpdateHandler IUIAnimationTimerUpdateHandler;
#endif

#ifndef __IUIAnimationTimerClientEventHandler_FWD_DEFINED__
#define __IUIAnimationTimerClientEventHandler_FWD_DEFINED__
typedef interface IUIAnimationTimerClientEventHandler IUIAnimationTimerClientEventHandler;
#endif

#ifndef __IUIAnimationTimerEventHandler_FWD_DEFINED__
#define __IUIAnimationTimerEventHandler_FWD_DEFINED__
typedef interface IUIAnimationTimerEventHandler IUIAnimationTimerEventHandler;
#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_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

HRESULT STDMETHODCALLTYPE IUIAnimationManager_CreateAnimationVariable_Proxy(
    IUIAnimationManager* This,
    double initialValue,
    IUIAnimationVariable **variable);
void __RPC_STUB IUIAnimationManager_CreateAnimationVariable_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IUIAnimationManager_ScheduleTransition_Proxy(
    IUIAnimationManager* This,
    IUIAnimationVariable *variable,
    IUIAnimationTransition *transition,
    double timeNow);
void __RPC_STUB IUIAnimationManager_ScheduleTransition_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IUIAnimationManager_CreateStoryboard_Proxy(
    IUIAnimationManager* This,
    IUIAnimationStoryboard **storyboard);
void __RPC_STUB IUIAnimationManager_CreateStoryboard_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IUIAnimationManager_FinishAllStoryboards_Proxy(
    IUIAnimationManager* This,
    double completionDeadline);
void __RPC_STUB IUIAnimationManager_FinishAllStoryboards_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IUIAnimationManager_AbandonAllStoryboards_Proxy(
    IUIAnimationManager* This);
void __RPC_STUB IUIAnimationManager_AbandonAllStoryboards_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IUIAnimationManager_Update_Proxy(
    IUIAnimationManager* This,
    double timeNow,
    UI_ANIMATION_UPDATE_RESULT *updateResult);
void __RPC_STUB IUIAnimationManager_Update_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IUIAnimationManager_GetVariableFromTag_Proxy(
    IUIAnimationManager* This,
    IUnknown *object,
    UINT32 id,
    IUIAnimationVariable **variable);
void __RPC_STUB IUIAnimationManager_GetVariableFromTag_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IUIAnimationManager_GetStoryboardFromTag_Proxy(
    IUIAnimationManager* This,
    IUnknown *object,
    UINT32 id,
    IUIAnimationStoryboard **storyboard);
void __RPC_STUB IUIAnimationManager_GetStoryboardFromTag_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IUIAnimationManager_GetStatus_Proxy(
    IUIAnimationManager* This,
    UI_ANIMATION_MANAGER_STATUS *status);
void __RPC_STUB IUIAnimationManager_GetStatus_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IUIAnimationManager_SetAnimationMode_Proxy(
    IUIAnimationManager* This,
    UI_ANIMATION_MODE mode);
void __RPC_STUB IUIAnimationManager_SetAnimationMode_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IUIAnimationManager_Pause_Proxy(
    IUIAnimationManager* This);
void __RPC_STUB IUIAnimationManager_Pause_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IUIAnimationManager_Resume_Proxy(
    IUIAnimationManager* This);
void __RPC_STUB IUIAnimationManager_Resume_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IUIAnimationManager_SetManagerEventHandler_Proxy(
    IUIAnimationManager* This,
    IUIAnimationManagerEventHandler *handler);
void __RPC_STUB IUIAnimationManager_SetManagerEventHandler_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IUIAnimationManager_SetCancelPriorityComparison_Proxy(
    IUIAnimationManager* This,
    IUIAnimationPriorityComparison *comparison);
void __RPC_STUB IUIAnimationManager_SetCancelPriorityComparison_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IUIAnimationManager_SetTrimPriorityComparison_Proxy(
    IUIAnimationManager* This,
    IUIAnimationPriorityComparison *comparison);
void __RPC_STUB IUIAnimationManager_SetTrimPriorityComparison_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IUIAnimationManager_SetCompressPriorityComparison_Proxy(
    IUIAnimationManager* This,
    IUIAnimationPriorityComparison *comparison);
void __RPC_STUB IUIAnimationManager_SetCompressPriorityComparison_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IUIAnimationManager_SetConcludePriorityComparison_Proxy(
    IUIAnimationManager* This,
    IUIAnimationPriorityComparison *comparison);
void __RPC_STUB IUIAnimationManager_SetConcludePriorityComparison_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IUIAnimationManager_SetDefaultLongestAcceptableDelay_Proxy(
    IUIAnimationManager* This,
    double delay);
void __RPC_STUB IUIAnimationManager_SetDefaultLongestAcceptableDelay_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IUIAnimationManager_Shutdown_Proxy(
    IUIAnimationManager* This);
void __RPC_STUB IUIAnimationManager_Shutdown_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);

#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

HRESULT STDMETHODCALLTYPE IUIAnimationVariable_GetValue_Proxy(
    IUIAnimationVariable* This,
    double *value);
void __RPC_STUB IUIAnimationVariable_GetValue_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IUIAnimationVariable_GetFinalValue_Proxy(
    IUIAnimationVariable* This,
    double *finalValue);
void __RPC_STUB IUIAnimationVariable_GetFinalValue_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IUIAnimationVariable_GetPreviousValue_Proxy(
    IUIAnimationVariable* This,
    double *previousValue);
void __RPC_STUB IUIAnimationVariable_GetPreviousValue_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IUIAnimationVariable_GetIntegerValue_Proxy(
    IUIAnimationVariable* This,
    int *value);
void __RPC_STUB IUIAnimationVariable_GetIntegerValue_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IUIAnimationVariable_GetFinalIntegerValue_Proxy(
    IUIAnimationVariable* This,
    int *finalValue);
void __RPC_STUB IUIAnimationVariable_GetFinalIntegerValue_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IUIAnimationVariable_GetPreviousIntegerValue_Proxy(
    IUIAnimationVariable* This,
    int *previousValue);
void __RPC_STUB IUIAnimationVariable_GetPreviousIntegerValue_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IUIAnimationVariable_GetCurrentStoryboard_Proxy(
    IUIAnimationVariable* This,
    IUIAnimationStoryboard **storyboard);
void __RPC_STUB IUIAnimationVariable_GetCurrentStoryboard_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IUIAnimationVariable_SetLowerBound_Proxy(
    IUIAnimationVariable* This,
    double bound);
void __RPC_STUB IUIAnimationVariable_SetLowerBound_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IUIAnimationVariable_SetUpperBound_Proxy(
    IUIAnimationVariable* This,
    double bound);
void __RPC_STUB IUIAnimationVariable_SetUpperBound_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IUIAnimationVariable_SetRoundingMode_Proxy(
    IUIAnimationVariable* This,
    UI_ANIMATION_ROUNDING_MODE mode);
void __RPC_STUB IUIAnimationVariable_SetRoundingMode_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IUIAnimationVariable_SetTag_Proxy(
    IUIAnimationVariable* This,
    IUnknown *object,
    unsigned int id);
void __RPC_STUB IUIAnimationVariable_SetTag_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IUIAnimationVariable_GetTag_Proxy(
    IUIAnimationVariable* This,
    IUnknown **object,
    unsigned int *id);
void __RPC_STUB IUIAnimationVariable_GetTag_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IUIAnimationVariable_SetVariableChangeHandler_Proxy(
    IUIAnimationVariable* This,
    IUIAnimationVariableChangeHandler *handler);
void __RPC_STUB IUIAnimationVariable_SetVariableChangeHandler_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IUIAnimationVariable_SetVariableIntegerChangeHandler_Proxy(
    IUIAnimationVariable* This,
    IUIAnimationVariableIntegerChangeHandler *handler);
void __RPC_STUB IUIAnimationVariable_SetVariableIntegerChangeHandler_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);

#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

HRESULT STDMETHODCALLTYPE IUIAnimationStoryboard_AddTransition_Proxy(
    IUIAnimationStoryboard* This,
    IUIAnimationVariable *variable,
    IUIAnimationTransition *transition);
void __RPC_STUB IUIAnimationStoryboard_AddTransition_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IUIAnimationStoryboard_AddKeyframeAtOffset_Proxy(
    IUIAnimationStoryboard* This,
    UI_ANIMATION_KEYFRAME existingKeyframe,
    double offset,
    UI_ANIMATION_KEYFRAME *keyframe);
void __RPC_STUB IUIAnimationStoryboard_AddKeyframeAtOffset_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IUIAnimationStoryboard_AddKeyframeAfterTransition_Proxy(
    IUIAnimationStoryboard* This,
    IUIAnimationTransition *transition,
    UI_ANIMATION_KEYFRAME *keyframe);
void __RPC_STUB IUIAnimationStoryboard_AddKeyframeAfterTransition_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IUIAnimationStoryboard_AddTransitionAtKeyframe_Proxy(
    IUIAnimationStoryboard* This,
    IUIAnimationVariable *variable,
    IUIAnimationTransition *transition,
    UI_ANIMATION_KEYFRAME startKeyframe);
void __RPC_STUB IUIAnimationStoryboard_AddTransitionAtKeyframe_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IUIAnimationStoryboard_AddTransitionBetweenKeyframes_Proxy(
    IUIAnimationStoryboard* This,
    IUIAnimationVariable *variable,
    IUIAnimationTransition *transition,
    UI_ANIMATION_KEYFRAME startKeyframe,
    UI_ANIMATION_KEYFRAME endKeyframe);
void __RPC_STUB IUIAnimationStoryboard_AddTransitionBetweenKeyframes_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IUIAnimationStoryboard_RepeatBetweenKeyframes_Proxy(
    IUIAnimationStoryboard* This,
    UI_ANIMATION_KEYFRAME startKeyframe,
    UI_ANIMATION_KEYFRAME endKeyframe,
    int repetitionCount);
void __RPC_STUB IUIAnimationStoryboard_RepeatBetweenKeyframes_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IUIAnimationStoryboard_HoldVariable_Proxy(
    IUIAnimationStoryboard* This,
    IUIAnimationVariable *variable);
void __RPC_STUB IUIAnimationStoryboard_HoldVariable_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IUIAnimationStoryboard_SetLongestAcceptableDelay_Proxy(
    IUIAnimationStoryboard* This,
    double delay);
void __RPC_STUB IUIAnimationStoryboard_SetLongestAcceptableDelay_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IUIAnimationStoryboard_Schedule_Proxy(
    IUIAnimationStoryboard* This,
    double timeNow,
    UI_ANIMATION_SCHEDULING_RESULT *schedulingResult);
void __RPC_STUB IUIAnimationStoryboard_Schedule_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IUIAnimationStoryboard_Conclude_Proxy(
    IUIAnimationStoryboard* This);
void __RPC_STUB IUIAnimationStoryboard_Conclude_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IUIAnimationStoryboard_Finish_Proxy(
    IUIAnimationStoryboard* This,
    double completionDeadline);
void __RPC_STUB IUIAnimationStoryboard_Finish_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IUIAnimationStoryboard_Abandon_Proxy(
    IUIAnimationStoryboard* This);
void __RPC_STUB IUIAnimationStoryboard_Abandon_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IUIAnimationStoryboard_SetTag_Proxy(
    IUIAnimationStoryboard* This,
    IUnknown *object,
    unsigned int id);
void __RPC_STUB IUIAnimationStoryboard_SetTag_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IUIAnimationStoryboard_GetTag_Proxy(
    IUIAnimationStoryboard* This,
    IUnknown **object,
    unsigned int *id);
void __RPC_STUB IUIAnimationStoryboard_GetTag_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IUIAnimationStoryboard_GetStatus_Proxy(
    IUIAnimationStoryboard* This,
    UI_ANIMATION_STORYBOARD_STATUS *status);
void __RPC_STUB IUIAnimationStoryboard_GetStatus_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IUIAnimationStoryboard_GetElapsedTime_Proxy(
    IUIAnimationStoryboard* This,
    double *elapsedTime);
void __RPC_STUB IUIAnimationStoryboard_GetElapsedTime_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IUIAnimationStoryboard_SetStoryboardEventHandler_Proxy(
    IUIAnimationStoryboard* This,
    IUIAnimationStoryboardEventHandler *handler);
void __RPC_STUB IUIAnimationStoryboard_SetStoryboardEventHandler_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);

#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

HRESULT STDMETHODCALLTYPE IUIAnimationTransition_SetInitialValue_Proxy(
    IUIAnimationTransition* This,
    double value);
void __RPC_STUB IUIAnimationTransition_SetInitialValue_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IUIAnimationTransition_SetInitialVelocity_Proxy(
    IUIAnimationTransition* This,
    double velocity);
void __RPC_STUB IUIAnimationTransition_SetInitialVelocity_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IUIAnimationTransition_IsDurationKnown_Proxy(
    IUIAnimationTransition* This);
void __RPC_STUB IUIAnimationTransition_IsDurationKnown_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IUIAnimationTransition_GetDuration_Proxy(
    IUIAnimationTransition* This,
    double *duration);
void __RPC_STUB IUIAnimationTransition_GetDuration_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);

#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

HRESULT STDMETHODCALLTYPE IUIAnimationStoryboardEventHandler_OnStoryboardStatusChanged_Proxy(
    IUIAnimationStoryboardEventHandler* This,
    IUIAnimationStoryboard *storyboard,
    UI_ANIMATION_STORYBOARD_STATUS newStatus,
    UI_ANIMATION_STORYBOARD_STATUS previousStatus);
void __RPC_STUB IUIAnimationStoryboardEventHandler_OnStoryboardStatusChanged_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IUIAnimationStoryboardEventHandler_OnStoryboardUpdated_Proxy(
    IUIAnimationStoryboardEventHandler* This,
    IUIAnimationStoryboard *storyboard);
void __RPC_STUB IUIAnimationStoryboardEventHandler_OnStoryboardUpdated_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);

#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

HRESULT STDMETHODCALLTYPE IUIAnimationVariableChangeHandler_OnValueChanged_Proxy(
    IUIAnimationVariableChangeHandler* This,
    IUIAnimationStoryboard *storyboard,
    IUIAnimationVariable *variable,
    double newValue,
    double previousValue);
void __RPC_STUB IUIAnimationVariableChangeHandler_OnValueChanged_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);

#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

HRESULT STDMETHODCALLTYPE IUIAnimationVariableIntegerChangeHandler_OnIntegerValueChanged_Proxy(
    IUIAnimationVariableIntegerChangeHandler* This,
    IUIAnimationStoryboard *storyboard,
    IUIAnimationVariable *variable,
    int newValue,
    int previousValue);
void __RPC_STUB IUIAnimationVariableIntegerChangeHandler_OnIntegerValueChanged_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);

#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

HRESULT STDMETHODCALLTYPE IUIAnimationManagerEventHandler_OnManagerStatusChanged_Proxy(
    IUIAnimationManagerEventHandler* This,
    UI_ANIMATION_MANAGER_STATUS newStatus,
    UI_ANIMATION_MANAGER_STATUS previousStatus);
void __RPC_STUB IUIAnimationManagerEventHandler_OnManagerStatusChanged_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);

#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

HRESULT STDMETHODCALLTYPE IUIAnimationPriorityComparison_HasPriority_Proxy(
    IUIAnimationPriorityComparison* This,
    IUIAnimationStoryboard *scheduledStoryboard,
    IUIAnimationStoryboard *newStoryboard,
    UI_ANIMATION_PRIORITY_EFFECT priorityEffect);
void __RPC_STUB IUIAnimationPriorityComparison_HasPriority_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);

#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

HRESULT STDMETHODCALLTYPE IUIAnimationManager2_CreateAnimationVectorVariable_Proxy(
    IUIAnimationManager2* This,
    double *initialValue,
    unsigned int cDimension,
    IUIAnimationVariable2 **variable);
void __RPC_STUB IUIAnimationManager2_CreateAnimationVectorVariable_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IUIAnimationManager2_CreateAnimationVariable_Proxy(
    IUIAnimationManager2* This,
    double initialValue,
    IUIAnimationVariable2 **variable);
void __RPC_STUB IUIAnimationManager2_CreateAnimationVariable_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IUIAnimationManager2_ScheduleTransition_Proxy(
    IUIAnimationManager2* This,
    IUIAnimationVariable2 *variable,
    IUIAnimationTransition2 *transition,
    double timeNow);
void __RPC_STUB IUIAnimationManager2_ScheduleTransition_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IUIAnimationManager2_CreateStoryboard_Proxy(
    IUIAnimationManager2* This,
    IUIAnimationStoryboard2 **storyboard);
void __RPC_STUB IUIAnimationManager2_CreateStoryboard_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IUIAnimationManager2_FinishAllStoryboards_Proxy(
    IUIAnimationManager2* This,
    double completionDeadline);
void __RPC_STUB IUIAnimationManager2_FinishAllStoryboards_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IUIAnimationManager2_AbandonAllStoryboards_Proxy(
    IUIAnimationManager2* This);
void __RPC_STUB IUIAnimationManager2_AbandonAllStoryboards_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IUIAnimationManager2_Update_Proxy(
    IUIAnimationManager2* This,
    double timeNow,
    UI_ANIMATION_UPDATE_RESULT *updateResult);
void __RPC_STUB IUIAnimationManager2_Update_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IUIAnimationManager2_GetVariableFromTag_Proxy(
    IUIAnimationManager2* This,
    IUnknown *object,
    UINT32 id,
    IUIAnimationVariable2 **variable);
void __RPC_STUB IUIAnimationManager2_GetVariableFromTag_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IUIAnimationManager2_GetStoryboardFromTag_Proxy(
    IUIAnimationManager2* This,
    IUnknown *object,
    unsigned int id,
    IUIAnimationStoryboard2 **storyboard);
void __RPC_STUB IUIAnimationManager2_GetStoryboardFromTag_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IUIAnimationManager2_EstimateNextEventTime_Proxy(
    IUIAnimationManager2* This,
    double *seconds);
void __RPC_STUB IUIAnimationManager2_EstimateNextEventTime_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IUIAnimationManager2_GetStatus_Proxy(
    IUIAnimationManager2* This,
    UI_ANIMATION_MANAGER_STATUS *status);
void __RPC_STUB IUIAnimationManager2_GetStatus_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IUIAnimationManager2_SetAnimationMode_Proxy(
    IUIAnimationManager2* This,
    UI_ANIMATION_MODE mode);
void __RPC_STUB IUIAnimationManager2_SetAnimationMode_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IUIAnimationManager2_Pause_Proxy(
    IUIAnimationManager2* This);
void __RPC_STUB IUIAnimationManager2_Pause_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IUIAnimationManager2_Resume_Proxy(
    IUIAnimationManager2* This);
void __RPC_STUB IUIAnimationManager2_Resume_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IUIAnimationManager2_SetManagerEventHandler_Proxy(
    IUIAnimationManager2* This,
    IUIAnimationManagerEventHandler2 *handler,
    LONG fRegisterForNextAnimationEvent);
void __RPC_STUB IUIAnimationManager2_SetManagerEventHandler_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IUIAnimationManager2_SetCancelPriorityComparison_Proxy(
    IUIAnimationManager2* This,
    IUIAnimationPriorityComparison2 *comparison);
void __RPC_STUB IUIAnimationManager2_SetCancelPriorityComparison_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IUIAnimationManager2_SetTrimPriorityComparison_Proxy(
    IUIAnimationManager2* This,
    IUIAnimationPriorityComparison2 *comparison);
void __RPC_STUB IUIAnimationManager2_SetTrimPriorityComparison_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IUIAnimationManager2_SetCompressPriorityComparison_Proxy(
    IUIAnimationManager2* This,
    IUIAnimationPriorityComparison2 *comparison);
void __RPC_STUB IUIAnimationManager2_SetCompressPriorityComparison_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IUIAnimationManager2_SetConcludePriorityComparison_Proxy(
    IUIAnimationManager2* This,
    IUIAnimationPriorityComparison2 *comparison);
void __RPC_STUB IUIAnimationManager2_SetConcludePriorityComparison_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IUIAnimationManager2_SetDefaultLongestAcceptableDelay_Proxy(
    IUIAnimationManager2* This,
    double delay);
void __RPC_STUB IUIAnimationManager2_SetDefaultLongestAcceptableDelay_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IUIAnimationManager2_Shutdown_Proxy(
    IUIAnimationManager2* This);
void __RPC_STUB IUIAnimationManager2_Shutdown_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);

#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

HRESULT STDMETHODCALLTYPE IUIAnimationVariable2_GetDimension_Proxy(
    IUIAnimationVariable2* This,
    unsigned int *dimension);
void __RPC_STUB IUIAnimationVariable2_GetDimension_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IUIAnimationVariable2_GetValue_Proxy(
    IUIAnimationVariable2* This,
    double *value);
void __RPC_STUB IUIAnimationVariable2_GetValue_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IUIAnimationVariable2_GetVectorValue_Proxy(
    IUIAnimationVariable2* This,
    double *value,
    unsigned int cDimension);
void __RPC_STUB IUIAnimationVariable2_GetVectorValue_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IUIAnimationVariable2_GetCurve_Proxy(
    IUIAnimationVariable2* This,
    IDCompositionAnimation *animation);
void __RPC_STUB IUIAnimationVariable2_GetCurve_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IUIAnimationVariable2_GetVectorCurve_Proxy(
    IUIAnimationVariable2* This,
    IDCompositionAnimation **animation,
    unsigned int cDimension);
void __RPC_STUB IUIAnimationVariable2_GetVectorCurve_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IUIAnimationVariable2_GetFinalValue_Proxy(
    IUIAnimationVariable2* This,
    double *finalValue);
void __RPC_STUB IUIAnimationVariable2_GetFinalValue_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IUIAnimationVariable2_GetFinalVectorValue_Proxy(
    IUIAnimationVariable2* This,
    double *finalValue,
    unsigned int cDimension);
void __RPC_STUB IUIAnimationVariable2_GetFinalVectorValue_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IUIAnimationVariable2_GetPreviousValue_Proxy(
    IUIAnimationVariable2* This,
    double *previousValue);
void __RPC_STUB IUIAnimationVariable2_GetPreviousValue_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IUIAnimationVariable2_GetPreviousVectorValue_Proxy(
    IUIAnimationVariable2* This,
    double *previousValue,
    unsigned int cDimension);
void __RPC_STUB IUIAnimationVariable2_GetPreviousVectorValue_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IUIAnimationVariable2_GetIntegerValue_Proxy(
    IUIAnimationVariable2* This,
    int *value);
void __RPC_STUB IUIAnimationVariable2_GetIntegerValue_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IUIAnimationVariable2_GetIntegerVectorValue_Proxy(
    IUIAnimationVariable2* This,
    int *value,
    unsigned int cDimension);
void __RPC_STUB IUIAnimationVariable2_GetIntegerVectorValue_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IUIAnimationVariable2_GetFinalIntegerValue_Proxy(
    IUIAnimationVariable2* This,
    int *finalValue);
void __RPC_STUB IUIAnimationVariable2_GetFinalIntegerValue_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IUIAnimationVariable2_GetFinalIntegerVectorValue_Proxy(
    IUIAnimationVariable2* This,
    int *finalValue,
    unsigned int cDimension);
void __RPC_STUB IUIAnimationVariable2_GetFinalIntegerVectorValue_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IUIAnimationVariable2_GetPreviousIntegerValue_Proxy(
    IUIAnimationVariable2* This,
    int *previousValue);
void __RPC_STUB IUIAnimationVariable2_GetPreviousIntegerValue_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IUIAnimationVariable2_GetPreviousIntegerVectorValue_Proxy(
    IUIAnimationVariable2* This,
    int *previousValue,
    unsigned int cDimension);
void __RPC_STUB IUIAnimationVariable2_GetPreviousIntegerVectorValue_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IUIAnimationVariable2_GetCurrentStoryboard_Proxy(
    IUIAnimationVariable2* This,
    IUIAnimationStoryboard2 **storyboard);
void __RPC_STUB IUIAnimationVariable2_GetCurrentStoryboard_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IUIAnimationVariable2_SetLowerBound_Proxy(
    IUIAnimationVariable2* This,
    double bound);
void __RPC_STUB IUIAnimationVariable2_SetLowerBound_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IUIAnimationVariable2_SetLowerBoundVector_Proxy(
    IUIAnimationVariable2* This,
    double *bound,
    unsigned int cDimension);
void __RPC_STUB IUIAnimationVariable2_SetLowerBoundVector_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IUIAnimationVariable2_SetUpperBound_Proxy(
    IUIAnimationVariable2* This,
    double bound);
void __RPC_STUB IUIAnimationVariable2_SetUpperBound_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IUIAnimationVariable2_SetUpperBoundVector_Proxy(
    IUIAnimationVariable2* This,
    double *bound,
    unsigned int cDimension);
void __RPC_STUB IUIAnimationVariable2_SetUpperBoundVector_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IUIAnimationVariable2_SetRoundingMode_Proxy(
    IUIAnimationVariable2* This,
    UI_ANIMATION_ROUNDING_MODE mode);
void __RPC_STUB IUIAnimationVariable2_SetRoundingMode_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IUIAnimationVariable2_SetTag_Proxy(
    IUIAnimationVariable2* This,
    IUnknown *object,
    unsigned int id);
void __RPC_STUB IUIAnimationVariable2_SetTag_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IUIAnimationVariable2_GetTag_Proxy(
    IUIAnimationVariable2* This,
    IUnknown **object,
    unsigned int *id);
void __RPC_STUB IUIAnimationVariable2_GetTag_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IUIAnimationVariable2_SetVariableChangeHandler_Proxy(
    IUIAnimationVariable2* This,
    IUIAnimationVariableChangeHandler2 *handler,
    LONG fRegisterForNextAnimationEvent);
void __RPC_STUB IUIAnimationVariable2_SetVariableChangeHandler_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IUIAnimationVariable2_SetVariableIntegerChangeHandler_Proxy(
    IUIAnimationVariable2* This,
    IUIAnimationVariableIntegerChangeHandler2 *handler,
    LONG fRegisterForNextAnimationEvent);
void __RPC_STUB IUIAnimationVariable2_SetVariableIntegerChangeHandler_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IUIAnimationVariable2_SetVariableCurveChangeHandler_Proxy(
    IUIAnimationVariable2* This,
    IUIAnimationVariableCurveChangeHandler2 *handler);
void __RPC_STUB IUIAnimationVariable2_SetVariableCurveChangeHandler_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);

#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

HRESULT STDMETHODCALLTYPE IDCompositionAnimation_Reset_Proxy(
    IDCompositionAnimation* This);
void __RPC_STUB IDCompositionAnimation_Reset_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IDCompositionAnimation_SetAbsoluteBeginTime_Proxy(
    IDCompositionAnimation* This,
    LARGE_INTEGER beginTime);
void __RPC_STUB IDCompositionAnimation_SetAbsoluteBeginTime_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IDCompositionAnimation_AddCubic_Proxy(
    IDCompositionAnimation* This,
    double beginOffset,
    float constantCoefficient,
    float linearCoefficient,
    float quadraticCoefficient,
    float cubicCoefficient);
void __RPC_STUB IDCompositionAnimation_AddCubic_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IDCompositionAnimation_AddSinusoidal_Proxy(
    IDCompositionAnimation* This,
    double beginOffset,
    float bias,
    float amplitude,
    float frequency,
    float phase);
void __RPC_STUB IDCompositionAnimation_AddSinusoidal_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IDCompositionAnimation_AddRepeat_Proxy(
    IDCompositionAnimation* This,
    double beginOffset,
    double durationToRepeat);
void __RPC_STUB IDCompositionAnimation_AddRepeat_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IDCompositionAnimation_End_Proxy(
    IDCompositionAnimation* This,
    double endOffset,
    float endValue);
void __RPC_STUB IDCompositionAnimation_End_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);

#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

HRESULT STDMETHODCALLTYPE IUIAnimationStoryboard2_AddTransition_Proxy(
    IUIAnimationStoryboard2* This,
    IUIAnimationVariable2 *variable,
    IUIAnimationTransition2 *transition);
void __RPC_STUB IUIAnimationStoryboard2_AddTransition_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IUIAnimationStoryboard2_AddKeyframeAtOffset_Proxy(
    IUIAnimationStoryboard2* This,
    UI_ANIMATION_KEYFRAME existingKeyframe,
    double offset,
    UI_ANIMATION_KEYFRAME *keyframe);
void __RPC_STUB IUIAnimationStoryboard2_AddKeyframeAtOffset_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IUIAnimationStoryboard2_AddKeyframeAfterTransition_Proxy(
    IUIAnimationStoryboard2* This,
    IUIAnimationTransition2 *transition,
    UI_ANIMATION_KEYFRAME *keyframe);
void __RPC_STUB IUIAnimationStoryboard2_AddKeyframeAfterTransition_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IUIAnimationStoryboard2_AddTransitionAtKeyframe_Proxy(
    IUIAnimationStoryboard2* This,
    IUIAnimationVariable2 *variable,
    IUIAnimationTransition2 *transition,
    UI_ANIMATION_KEYFRAME startKeyframe);
void __RPC_STUB IUIAnimationStoryboard2_AddTransitionAtKeyframe_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IUIAnimationStoryboard2_AddTransitionBetweenKeyframes_Proxy(
    IUIAnimationStoryboard2* This,
    IUIAnimationVariable2 *variable,
    IUIAnimationTransition2 *transition,
    UI_ANIMATION_KEYFRAME startKeyframe,
    UI_ANIMATION_KEYFRAME endKeyframe);
void __RPC_STUB IUIAnimationStoryboard2_AddTransitionBetweenKeyframes_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IUIAnimationStoryboard2_RepeatBetweenKeyframes_Proxy(
    IUIAnimationStoryboard2* This,
    UI_ANIMATION_KEYFRAME startKeyframe,
    UI_ANIMATION_KEYFRAME endKeyframe,
    double cRepetition,
    UI_ANIMATION_REPEAT_MODE repeatMode,
    IUIAnimationLoopIterationChangeHandler2 *pIterationChangeHandler,
    UINT_PTR id,
    LONG fRegisterForNextAnimationEvent);
void __RPC_STUB IUIAnimationStoryboard2_RepeatBetweenKeyframes_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IUIAnimationStoryboard2_HoldVariable_Proxy(
    IUIAnimationStoryboard2* This,
    IUIAnimationVariable2 *variable);
void __RPC_STUB IUIAnimationStoryboard2_HoldVariable_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IUIAnimationStoryboard2_SetLongestAcceptableDelay_Proxy(
    IUIAnimationStoryboard2* This,
    double delay);
void __RPC_STUB IUIAnimationStoryboard2_SetLongestAcceptableDelay_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IUIAnimationStoryboard2_SetSkipDuration_Proxy(
    IUIAnimationStoryboard2* This,
    double secondsDuration);
void __RPC_STUB IUIAnimationStoryboard2_SetSkipDuration_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IUIAnimationStoryboard2_Schedule_Proxy(
    IUIAnimationStoryboard2* This,
    double timeNow,
    UI_ANIMATION_SCHEDULING_RESULT *schedulingResult);
void __RPC_STUB IUIAnimationStoryboard2_Schedule_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IUIAnimationStoryboard2_Conclude_Proxy(
    IUIAnimationStoryboard2* This);
void __RPC_STUB IUIAnimationStoryboard2_Conclude_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IUIAnimationStoryboard2_Finish_Proxy(
    IUIAnimationStoryboard2* This,
    double completionDeadline);
void __RPC_STUB IUIAnimationStoryboard2_Finish_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IUIAnimationStoryboard2_Abandon_Proxy(
    IUIAnimationStoryboard2* This);
void __RPC_STUB IUIAnimationStoryboard2_Abandon_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IUIAnimationStoryboard2_SetTag_Proxy(
    IUIAnimationStoryboard2* This,
    IUnknown *object,
    unsigned int id);
void __RPC_STUB IUIAnimationStoryboard2_SetTag_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IUIAnimationStoryboard2_GetTag_Proxy(
    IUIAnimationStoryboard2* This,
    IUnknown **object,
    unsigned int *id);
void __RPC_STUB IUIAnimationStoryboard2_GetTag_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IUIAnimationStoryboard2_GetStatus_Proxy(
    IUIAnimationStoryboard2* This,
    UI_ANIMATION_STORYBOARD_STATUS *status);
void __RPC_STUB IUIAnimationStoryboard2_GetStatus_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IUIAnimationStoryboard2_GetElapsedTime_Proxy(
    IUIAnimationStoryboard2* This,
    double *elapsedTime);
void __RPC_STUB IUIAnimationStoryboard2_GetElapsedTime_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IUIAnimationStoryboard2_SetStoryboardEventHandler_Proxy(
    IUIAnimationStoryboard2* This,
    IUIAnimationStoryboardEventHandler2 *handler,
    LONG fRegisterStatusChangeForNextAnimationEvent,
    LONG fRegisterUpdateForNextAnimationEvent);
void __RPC_STUB IUIAnimationStoryboard2_SetStoryboardEventHandler_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);

#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

HRESULT STDMETHODCALLTYPE IUIAnimationTransition2_GetDimension_Proxy(
    IUIAnimationTransition2* This,
    unsigned int *dimension);
void __RPC_STUB IUIAnimationTransition2_GetDimension_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IUIAnimationTransition2_SetInitialValue_Proxy(
    IUIAnimationTransition2* This,
    double value);
void __RPC_STUB IUIAnimationTransition2_SetInitialValue_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IUIAnimationTransition2_SetInitialVectorValue_Proxy(
    IUIAnimationTransition2* This,
    double *value,
    unsigned int cDimension);
void __RPC_STUB IUIAnimationTransition2_SetInitialVectorValue_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IUIAnimationTransition2_SetInitialVelocity_Proxy(
    IUIAnimationTransition2* This,
    double velocity);
void __RPC_STUB IUIAnimationTransition2_SetInitialVelocity_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IUIAnimationTransition2_SetInitialVectorVelocity_Proxy(
    IUIAnimationTransition2* This,
    double *velocity,
    unsigned int cDimension);
void __RPC_STUB IUIAnimationTransition2_SetInitialVectorVelocity_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IUIAnimationTransition2_IsDurationKnown_Proxy(
    IUIAnimationTransition2* This);
void __RPC_STUB IUIAnimationTransition2_IsDurationKnown_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IUIAnimationTransition2_GetDuration_Proxy(
    IUIAnimationTransition2* This,
    double *duration);
void __RPC_STUB IUIAnimationTransition2_GetDuration_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);

#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

HRESULT STDMETHODCALLTYPE IUIAnimationLoopIterationChangeHandler2_OnLoopIterationChanged_Proxy(
    IUIAnimationLoopIterationChangeHandler2* This,
    IUIAnimationStoryboard2 *storyboard,
    UINT_PTR id,
    unsigned int newIterationCount,
    unsigned int oldIterationCount);
void __RPC_STUB IUIAnimationLoopIterationChangeHandler2_OnLoopIterationChanged_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);

#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

HRESULT STDMETHODCALLTYPE IUIAnimationStoryboardEventHandler2_OnStoryboardStatusChanged_Proxy(
    IUIAnimationStoryboardEventHandler2* This,
    IUIAnimationStoryboard2 *storyboard,
    UI_ANIMATION_STORYBOARD_STATUS newStatus,
    UI_ANIMATION_STORYBOARD_STATUS previousStatus);
void __RPC_STUB IUIAnimationStoryboardEventHandler2_OnStoryboardStatusChanged_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IUIAnimationStoryboardEventHandler2_OnStoryboardUpdated_Proxy(
    IUIAnimationStoryboardEventHandler2* This,
    IUIAnimationStoryboard2 *storyboard);
void __RPC_STUB IUIAnimationStoryboardEventHandler2_OnStoryboardUpdated_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);

#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

HRESULT STDMETHODCALLTYPE IUIAnimationVariableChangeHandler2_OnValueChanged_Proxy(
    IUIAnimationVariableChangeHandler2* This,
    IUIAnimationStoryboard2 *storyboard,
    IUIAnimationVariable2 *variable,
    double *newValue,
    double *previousValue,
    unsigned int cDimension);
void __RPC_STUB IUIAnimationVariableChangeHandler2_OnValueChanged_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);

#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

HRESULT STDMETHODCALLTYPE IUIAnimationVariableIntegerChangeHandler2_OnIntegerValueChanged_Proxy(
    IUIAnimationVariableIntegerChangeHandler2* This,
    IUIAnimationStoryboard2 *storyboard,
    IUIAnimationVariable2 *variable,
    int *newValue,
    int *previousValue,
    unsigned int cDimension);
void __RPC_STUB IUIAnimationVariableIntegerChangeHandler2_OnIntegerValueChanged_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);

#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

HRESULT STDMETHODCALLTYPE IUIAnimationVariableCurveChangeHandler2_OnCurveChanged_Proxy(
    IUIAnimationVariableCurveChangeHandler2* This,
    IUIAnimationVariable2 *variable);
void __RPC_STUB IUIAnimationVariableCurveChangeHandler2_OnCurveChanged_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);

#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

HRESULT STDMETHODCALLTYPE IUIAnimationManagerEventHandler2_OnManagerStatusChanged_Proxy(
    IUIAnimationManagerEventHandler2* This,
    UI_ANIMATION_MANAGER_STATUS newStatus,
    UI_ANIMATION_MANAGER_STATUS previousStatus);
void __RPC_STUB IUIAnimationManagerEventHandler2_OnManagerStatusChanged_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);

#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

HRESULT STDMETHODCALLTYPE IUIAnimationPriorityComparison2_HasPriority_Proxy(
    IUIAnimationPriorityComparison2* This,
    IUIAnimationStoryboard2 *scheduledStoryboard,
    IUIAnimationStoryboard2 *newStoryboard,
    UI_ANIMATION_PRIORITY_EFFECT priorityEffect);
void __RPC_STUB IUIAnimationPriorityComparison2_HasPriority_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);

#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

HRESULT STDMETHODCALLTYPE IUIAnimationTransitionLibrary_CreateInstantaneousTransition_Proxy(
    IUIAnimationTransitionLibrary* This,
    double finalValue,
    IUIAnimationTransition **transition);
void __RPC_STUB IUIAnimationTransitionLibrary_CreateInstantaneousTransition_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IUIAnimationTransitionLibrary_CreateConstantTransition_Proxy(
    IUIAnimationTransitionLibrary* This,
    double duration,
    IUIAnimationTransition **transition);
void __RPC_STUB IUIAnimationTransitionLibrary_CreateConstantTransition_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IUIAnimationTransitionLibrary_CreateDiscreteTransition_Proxy(
    IUIAnimationTransitionLibrary* This,
    double delay,
    double finalValue,
    double hold,
    IUIAnimationTransition **transition);
void __RPC_STUB IUIAnimationTransitionLibrary_CreateDiscreteTransition_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IUIAnimationTransitionLibrary_CreateLinearTransition_Proxy(
    IUIAnimationTransitionLibrary* This,
    double duration,
    double finalValue,
    IUIAnimationTransition **transition);
void __RPC_STUB IUIAnimationTransitionLibrary_CreateLinearTransition_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IUIAnimationTransitionLibrary_CreateLinearTransitionFromSpeed_Proxy(
    IUIAnimationTransitionLibrary* This,
    double speed,
    double finalValue,
    IUIAnimationTransition **transition);
void __RPC_STUB IUIAnimationTransitionLibrary_CreateLinearTransitionFromSpeed_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IUIAnimationTransitionLibrary_CreateSinusoidalTransitionFromVelocity_Proxy(
    IUIAnimationTransitionLibrary* This,
    double duration,
    double period,
    IUIAnimationTransition **transition);
void __RPC_STUB IUIAnimationTransitionLibrary_CreateSinusoidalTransitionFromVelocity_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IUIAnimationTransitionLibrary_CreateSinusoidalTransitionFromRange_Proxy(
    IUIAnimationTransitionLibrary* This,
    double duration,
    double minimumValue,
    double maximumValue,
    double period,
    UI_ANIMATION_SLOPE slope,
    IUIAnimationTransition **transition);
void __RPC_STUB IUIAnimationTransitionLibrary_CreateSinusoidalTransitionFromRange_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IUIAnimationTransitionLibrary_CreateAccelerateDecelerateTransition_Proxy(
    IUIAnimationTransitionLibrary* This,
    double duration,
    double finalValue,
    double accelerationRatio,
    double decelerationRatio,
    IUIAnimationTransition **transition);
void __RPC_STUB IUIAnimationTransitionLibrary_CreateAccelerateDecelerateTransition_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IUIAnimationTransitionLibrary_CreateReversalTransition_Proxy(
    IUIAnimationTransitionLibrary* This,
    double duration,
    IUIAnimationTransition **transition);
void __RPC_STUB IUIAnimationTransitionLibrary_CreateReversalTransition_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IUIAnimationTransitionLibrary_CreateCubicTransition_Proxy(
    IUIAnimationTransitionLibrary* This,
    double duration,
    double finalValue,
    double finalVelocity,
    IUIAnimationTransition **transition);
void __RPC_STUB IUIAnimationTransitionLibrary_CreateCubicTransition_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IUIAnimationTransitionLibrary_CreateSmoothStopTransition_Proxy(
    IUIAnimationTransitionLibrary* This,
    double maximumDuration,
    double finalValue,
    IUIAnimationTransition **transition);
void __RPC_STUB IUIAnimationTransitionLibrary_CreateSmoothStopTransition_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IUIAnimationTransitionLibrary_CreateParabolicTransitionFromAcceleration_Proxy(
    IUIAnimationTransitionLibrary* This,
    double finalValue,
    double finalVelocity,
    double acceleration,
    IUIAnimationTransition **transition);
void __RPC_STUB IUIAnimationTransitionLibrary_CreateParabolicTransitionFromAcceleration_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);

#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

HRESULT STDMETHODCALLTYPE IUIAnimationTransitionLibrary2_CreateInstantaneousTransition_Proxy(
    IUIAnimationTransitionLibrary2* This,
    double finalValue,
    IUIAnimationTransition2 **transition);
void __RPC_STUB IUIAnimationTransitionLibrary2_CreateInstantaneousTransition_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IUIAnimationTransitionLibrary2_CreateInstantaneousVectorTransition_Proxy(
    IUIAnimationTransitionLibrary2* This,
    double *finalValue,
    unsigned int cDimension,
    IUIAnimationTransition2 **transition);
void __RPC_STUB IUIAnimationTransitionLibrary2_CreateInstantaneousVectorTransition_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IUIAnimationTransitionLibrary2_CreateConstantTransition_Proxy(
    IUIAnimationTransitionLibrary2* This,
    double duration,
    IUIAnimationTransition2 **transition);
void __RPC_STUB IUIAnimationTransitionLibrary2_CreateConstantTransition_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IUIAnimationTransitionLibrary2_CreateDiscreteTransition_Proxy(
    IUIAnimationTransitionLibrary2* This,
    double delay,
    double finalValue,
    double hold,
    IUIAnimationTransition2 **transition);
void __RPC_STUB IUIAnimationTransitionLibrary2_CreateDiscreteTransition_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IUIAnimationTransitionLibrary2_CreateDiscreteVectorTransition_Proxy(
    IUIAnimationTransitionLibrary2* This,
    double delay,
    double *finalValue,
    unsigned int cDimension,
    double hold,
    IUIAnimationTransition2 **transition);
void __RPC_STUB IUIAnimationTransitionLibrary2_CreateDiscreteVectorTransition_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IUIAnimationTransitionLibrary2_CreateLinearTransition_Proxy(
    IUIAnimationTransitionLibrary2* This,
    double duration,
    double finalValue,
    IUIAnimationTransition2 **transition);
void __RPC_STUB IUIAnimationTransitionLibrary2_CreateLinearTransition_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IUIAnimationTransitionLibrary2_CreateLinearVectorTransition_Proxy(
    IUIAnimationTransitionLibrary2* This,
    double duration,
    double *finalValue,
    unsigned int cDimension,
    IUIAnimationTransition2 **transition);
void __RPC_STUB IUIAnimationTransitionLibrary2_CreateLinearVectorTransition_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IUIAnimationTransitionLibrary2_CreateLinearTransitionFromSpeed_Proxy(
    IUIAnimationTransitionLibrary2* This,
    double speed,
    double finalValue,
    IUIAnimationTransition2 **transition);
void __RPC_STUB IUIAnimationTransitionLibrary2_CreateLinearTransitionFromSpeed_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IUIAnimationTransitionLibrary2_CreateLinearVectorTransitionFromSpeed_Proxy(
    IUIAnimationTransitionLibrary2* This,
    double speed,
    double *finalValue,
    unsigned int cDimension,
    IUIAnimationTransition2 **transition);
void __RPC_STUB IUIAnimationTransitionLibrary2_CreateLinearVectorTransitionFromSpeed_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IUIAnimationTransitionLibrary2_CreateSinusoidalTransitionFromVelocity_Proxy(
    IUIAnimationTransitionLibrary2* This,
    double duration,
    double period,
    IUIAnimationTransition2 **transition);
void __RPC_STUB IUIAnimationTransitionLibrary2_CreateSinusoidalTransitionFromVelocity_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IUIAnimationTransitionLibrary2_CreateSinusoidalTransitionFromRange_Proxy(
    IUIAnimationTransitionLibrary2* This,
    double duration,
    double minimumValue,
    double maximumValue,
    double period,
    UI_ANIMATION_SLOPE slope,
    IUIAnimationTransition2 **transition);
void __RPC_STUB IUIAnimationTransitionLibrary2_CreateSinusoidalTransitionFromRange_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IUIAnimationTransitionLibrary2_CreateAccelerateDecelerateTransition_Proxy(
    IUIAnimationTransitionLibrary2* This,
    double duration,
    double finalValue,
    double accelerationRatio,
    double decelerationRatio,
    IUIAnimationTransition2 **transition);
void __RPC_STUB IUIAnimationTransitionLibrary2_CreateAccelerateDecelerateTransition_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IUIAnimationTransitionLibrary2_CreateReversalTransition_Proxy(
    IUIAnimationTransitionLibrary2* This,
    double duration,
    IUIAnimationTransition2 **transition);
void __RPC_STUB IUIAnimationTransitionLibrary2_CreateReversalTransition_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IUIAnimationTransitionLibrary2_CreateCubicTransition_Proxy(
    IUIAnimationTransitionLibrary2* This,
    double duration,
    double finalValue,
    double finalVelocity,
    IUIAnimationTransition2 **transition);
void __RPC_STUB IUIAnimationTransitionLibrary2_CreateCubicTransition_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IUIAnimationTransitionLibrary2_CreateCubicVectorTransition_Proxy(
    IUIAnimationTransitionLibrary2* This,
    double duration,
    double *finalValue,
    double *finalVelocity,
    unsigned int cDimension,
    IUIAnimationTransition2 **transition);
void __RPC_STUB IUIAnimationTransitionLibrary2_CreateCubicVectorTransition_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IUIAnimationTransitionLibrary2_CreateSmoothStopTransition_Proxy(
    IUIAnimationTransitionLibrary2* This,
    double maximumDuration,
    double finalValue,
    IUIAnimationTransition2 **transition);
void __RPC_STUB IUIAnimationTransitionLibrary2_CreateSmoothStopTransition_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IUIAnimationTransitionLibrary2_CreateParabolicTransitionFromAcceleration_Proxy(
    IUIAnimationTransitionLibrary2* This,
    double finalValue,
    double finalVelocity,
    double acceleration,
    IUIAnimationTransition2 **transition);
void __RPC_STUB IUIAnimationTransitionLibrary2_CreateParabolicTransitionFromAcceleration_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IUIAnimationTransitionLibrary2_CreateCubicBezierLinearTransition_Proxy(
    IUIAnimationTransitionLibrary2* This,
    double duration,
    double finalValue,
    double x1,
    double y1,
    double x2,
    double y2,
    IUIAnimationTransition2 **ppTransition);
void __RPC_STUB IUIAnimationTransitionLibrary2_CreateCubicBezierLinearTransition_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IUIAnimationTransitionLibrary2_CreateCubicBezierLinearVectorTransition_Proxy(
    IUIAnimationTransitionLibrary2* This,
    double duration,
    double *finalValue,
    unsigned int cDimension,
    double x1,
    double y1,
    double x2,
    double y2,
    IUIAnimationTransition2 **ppTransition);
void __RPC_STUB IUIAnimationTransitionLibrary2_CreateCubicBezierLinearVectorTransition_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);

#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

HRESULT STDMETHODCALLTYPE IUIAnimationTransitionFactory_CreateTransition_Proxy(
    IUIAnimationTransitionFactory* This,
    IUIAnimationInterpolator *interpolator,
    IUIAnimationTransition **transition);
void __RPC_STUB IUIAnimationTransitionFactory_CreateTransition_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);

#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

HRESULT STDMETHODCALLTYPE IUIAnimationInterpolator_SetInitialValueAndVelocity_Proxy(
    IUIAnimationInterpolator* This,
    double initialValue,
    double initialVelocity);
void __RPC_STUB IUIAnimationInterpolator_SetInitialValueAndVelocity_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IUIAnimationInterpolator_SetDuration_Proxy(
    IUIAnimationInterpolator* This,
    double duration);
void __RPC_STUB IUIAnimationInterpolator_SetDuration_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IUIAnimationInterpolator_GetDuration_Proxy(
    IUIAnimationInterpolator* This,
    double *duration);
void __RPC_STUB IUIAnimationInterpolator_GetDuration_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IUIAnimationInterpolator_GetFinalValue_Proxy(
    IUIAnimationInterpolator* This,
    double *value);
void __RPC_STUB IUIAnimationInterpolator_GetFinalValue_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IUIAnimationInterpolator_InterpolateValue_Proxy(
    IUIAnimationInterpolator* This,
    double offset,
    double *value);
void __RPC_STUB IUIAnimationInterpolator_InterpolateValue_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IUIAnimationInterpolator_InterpolateVelocity_Proxy(
    IUIAnimationInterpolator* This,
    double offset,
    double *velocity);
void __RPC_STUB IUIAnimationInterpolator_InterpolateVelocity_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IUIAnimationInterpolator_GetDependencies_Proxy(
    IUIAnimationInterpolator* This,
    UI_ANIMATION_DEPENDENCIES *initialValueDependencies,
    UI_ANIMATION_DEPENDENCIES *initialVelocityDependencies,
    UI_ANIMATION_DEPENDENCIES *durationDependencies);
void __RPC_STUB IUIAnimationInterpolator_GetDependencies_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);

#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

HRESULT STDMETHODCALLTYPE IUIAnimationTransitionFactory2_CreateTransition_Proxy(
    IUIAnimationTransitionFactory2* This,
    IUIAnimationInterpolator2 *interpolator,
    IUIAnimationTransition2 **transition);
void __RPC_STUB IUIAnimationTransitionFactory2_CreateTransition_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);

#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

HRESULT STDMETHODCALLTYPE IUIAnimationInterpolator2_GetDimension_Proxy(
    IUIAnimationInterpolator2* This,
    unsigned int *dimension);
void __RPC_STUB IUIAnimationInterpolator2_GetDimension_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IUIAnimationInterpolator2_SetInitialValueAndVelocity_Proxy(
    IUIAnimationInterpolator2* This,
    double *initialValue,
    double *initialVelocity,
    unsigned int cDimension);
void __RPC_STUB IUIAnimationInterpolator2_SetInitialValueAndVelocity_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IUIAnimationInterpolator2_SetDuration_Proxy(
    IUIAnimationInterpolator2* This,
    double duration);
void __RPC_STUB IUIAnimationInterpolator2_SetDuration_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IUIAnimationInterpolator2_GetDuration_Proxy(
    IUIAnimationInterpolator2* This,
    double *duration);
void __RPC_STUB IUIAnimationInterpolator2_GetDuration_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IUIAnimationInterpolator2_GetFinalValue_Proxy(
    IUIAnimationInterpolator2* This,
    double *value,
    unsigned int cDimension);
void __RPC_STUB IUIAnimationInterpolator2_GetFinalValue_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IUIAnimationInterpolator2_InterpolateValue_Proxy(
    IUIAnimationInterpolator2* This,
    double offset,
    double *value,
    unsigned int cDimension);
void __RPC_STUB IUIAnimationInterpolator2_InterpolateValue_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IUIAnimationInterpolator2_InterpolateVelocity_Proxy(
    IUIAnimationInterpolator2* This,
    double offset,
    double *velocity,
    unsigned int cDimension);
void __RPC_STUB IUIAnimationInterpolator2_InterpolateVelocity_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IUIAnimationInterpolator2_GetPrimitiveInterpolation_Proxy(
    IUIAnimationInterpolator2* This,
    IUIAnimationPrimitiveInterpolation *interpolation,
    unsigned int cDimension);
void __RPC_STUB IUIAnimationInterpolator2_GetPrimitiveInterpolation_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IUIAnimationInterpolator2_GetDependencies_Proxy(
    IUIAnimationInterpolator2* This,
    UI_ANIMATION_DEPENDENCIES *initialValueDependencies,
    UI_ANIMATION_DEPENDENCIES *initialVelocityDependencies,
    UI_ANIMATION_DEPENDENCIES *durationDependencies);
void __RPC_STUB IUIAnimationInterpolator2_GetDependencies_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);

#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

HRESULT STDMETHODCALLTYPE IUIAnimationPrimitiveInterpolation_AddCubic_Proxy(
    IUIAnimationPrimitiveInterpolation* This,
    unsigned int dimension,
    double beginOffset,
    float constantCoefficient,
    float linearCoefficient,
    float quadraticCoefficient,
    float cubicCoefficient);
void __RPC_STUB IUIAnimationPrimitiveInterpolation_AddCubic_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IUIAnimationPrimitiveInterpolation_AddSinusoidal_Proxy(
    IUIAnimationPrimitiveInterpolation* This,
    unsigned int dimension,
    double beginOffset,
    float bias,
    float amplitude,
    float frequency,
    float phase);
void __RPC_STUB IUIAnimationPrimitiveInterpolation_AddSinusoidal_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);

#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

HRESULT STDMETHODCALLTYPE IUIAnimationTimer_SetTimerUpdateHandler_Proxy(
    IUIAnimationTimer* This,
    IUIAnimationTimerUpdateHandler *updateHandler,
    UI_ANIMATION_IDLE_BEHAVIOR idleBehavior);
void __RPC_STUB IUIAnimationTimer_SetTimerUpdateHandler_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IUIAnimationTimer_SetTimerEventHandler_Proxy(
    IUIAnimationTimer* This,
    IUIAnimationTimerEventHandler *handler);
void __RPC_STUB IUIAnimationTimer_SetTimerEventHandler_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IUIAnimationTimer_Enable_Proxy(
    IUIAnimationTimer* This);
void __RPC_STUB IUIAnimationTimer_Enable_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IUIAnimationTimer_Disable_Proxy(
    IUIAnimationTimer* This);
void __RPC_STUB IUIAnimationTimer_Disable_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IUIAnimationTimer_IsEnabled_Proxy(
    IUIAnimationTimer* This);
void __RPC_STUB IUIAnimationTimer_IsEnabled_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IUIAnimationTimer_GetTime_Proxy(
    IUIAnimationTimer* This,
    double *seconds);
void __RPC_STUB IUIAnimationTimer_GetTime_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IUIAnimationTimer_SetFrameRateThreshold_Proxy(
    IUIAnimationTimer* This,
    unsigned int framesPerSecond);
void __RPC_STUB IUIAnimationTimer_SetFrameRateThreshold_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);

#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

HRESULT STDMETHODCALLTYPE IUIAnimationTimerUpdateHandler_OnUpdate_Proxy(
    IUIAnimationTimerUpdateHandler* This,
    double timeNow,
    UI_ANIMATION_UPDATE_RESULT *result);
void __RPC_STUB IUIAnimationTimerUpdateHandler_OnUpdate_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IUIAnimationTimerUpdateHandler_SetTimerClientEventHandler_Proxy(
    IUIAnimationTimerUpdateHandler* This,
    IUIAnimationTimerClientEventHandler *handler);
void __RPC_STUB IUIAnimationTimerUpdateHandler_SetTimerClientEventHandler_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IUIAnimationTimerUpdateHandler_ClearTimerClientEventHandler_Proxy(
    IUIAnimationTimerUpdateHandler* This);
void __RPC_STUB IUIAnimationTimerUpdateHandler_ClearTimerClientEventHandler_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);

#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

HRESULT STDMETHODCALLTYPE IUIAnimationTimerClientEventHandler_OnTimerClientStatusChanged_Proxy(
    IUIAnimationTimerClientEventHandler* This,
    UI_ANIMATION_TIMER_CLIENT_STATUS newStatus,
    UI_ANIMATION_TIMER_CLIENT_STATUS previousStatus);
void __RPC_STUB IUIAnimationTimerClientEventHandler_OnTimerClientStatusChanged_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);

#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

HRESULT STDMETHODCALLTYPE IUIAnimationTimerEventHandler_OnPreUpdate_Proxy(
    IUIAnimationTimerEventHandler* This);
void __RPC_STUB IUIAnimationTimerEventHandler_OnPreUpdate_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IUIAnimationTimerEventHandler_OnPostUpdate_Proxy(
    IUIAnimationTimerEventHandler* This);
void __RPC_STUB IUIAnimationTimerEventHandler_OnPostUpdate_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE IUIAnimationTimerEventHandler_OnRenderingTooSlow_Proxy(
    IUIAnimationTimerEventHandler* This,
    UINT32 framesPerSecond);
void __RPC_STUB IUIAnimationTimerEventHandler_OnRenderingTooSlow_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);

#endif  /* __IUIAnimationTimerEventHandler_INTERFACE_DEFINED__ */

/* Begin additional prototypes for all interfaces */


/* End additional prototypes */

#ifdef __cplusplus
}
#endif

#endif /* __uianimation_h__ */
