/*** Autogenerated by WIDL 9.5 from include/windows.ui.composition.idl - Do not edit ***/

#ifdef _WIN32
#ifndef __REQUIRED_RPCNDR_H_VERSION__
#define __REQUIRED_RPCNDR_H_VERSION__ 475
#endif
#include <rpc.h>
#include <rpcndr.h>
#endif

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

#ifndef __windows_ui_composition_h__
#define __windows_ui_composition_h__

#ifndef __WIDL_INLINE
#if defined(__cplusplus) || defined(_MSC_VER)
#define __WIDL_INLINE inline
#elif defined(__GNUC__)
#define __WIDL_INLINE __inline__
#endif
#endif

/* Forward declarations */

#ifndef ____x_ABI_CWindows_CUI_CComposition_CIColorKeyFrameAnimation_FWD_DEFINED__
#define ____x_ABI_CWindows_CUI_CComposition_CIColorKeyFrameAnimation_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CUI_CComposition_CIColorKeyFrameAnimation __x_ABI_CWindows_CUI_CComposition_CIColorKeyFrameAnimation;
#ifdef __cplusplus
#define __x_ABI_CWindows_CUI_CComposition_CIColorKeyFrameAnimation ABI::Windows::UI::Composition::IColorKeyFrameAnimation
namespace ABI {
    namespace Windows {
        namespace UI {
            namespace Composition {
                interface IColorKeyFrameAnimation;
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CUI_CComposition_CICompositionAnimation_FWD_DEFINED__
#define ____x_ABI_CWindows_CUI_CComposition_CICompositionAnimation_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CUI_CComposition_CICompositionAnimation __x_ABI_CWindows_CUI_CComposition_CICompositionAnimation;
#ifdef __cplusplus
#define __x_ABI_CWindows_CUI_CComposition_CICompositionAnimation ABI::Windows::UI::Composition::ICompositionAnimation
namespace ABI {
    namespace Windows {
        namespace UI {
            namespace Composition {
                interface ICompositionAnimation;
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CUI_CComposition_CICompositionAnimationBase_FWD_DEFINED__
#define ____x_ABI_CWindows_CUI_CComposition_CICompositionAnimationBase_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CUI_CComposition_CICompositionAnimationBase __x_ABI_CWindows_CUI_CComposition_CICompositionAnimationBase;
#ifdef __cplusplus
#define __x_ABI_CWindows_CUI_CComposition_CICompositionAnimationBase ABI::Windows::UI::Composition::ICompositionAnimationBase
namespace ABI {
    namespace Windows {
        namespace UI {
            namespace Composition {
                interface ICompositionAnimationBase;
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CUI_CComposition_CICompositionAnimationFactory_FWD_DEFINED__
#define ____x_ABI_CWindows_CUI_CComposition_CICompositionAnimationFactory_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CUI_CComposition_CICompositionAnimationFactory __x_ABI_CWindows_CUI_CComposition_CICompositionAnimationFactory;
#ifdef __cplusplus
#define __x_ABI_CWindows_CUI_CComposition_CICompositionAnimationFactory ABI::Windows::UI::Composition::ICompositionAnimationFactory
namespace ABI {
    namespace Windows {
        namespace UI {
            namespace Composition {
                interface ICompositionAnimationFactory;
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CUI_CComposition_CICompositionObject_FWD_DEFINED__
#define ____x_ABI_CWindows_CUI_CComposition_CICompositionObject_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CUI_CComposition_CICompositionObject __x_ABI_CWindows_CUI_CComposition_CICompositionObject;
#ifdef __cplusplus
#define __x_ABI_CWindows_CUI_CComposition_CICompositionObject ABI::Windows::UI::Composition::ICompositionObject
namespace ABI {
    namespace Windows {
        namespace UI {
            namespace Composition {
                interface ICompositionObject;
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CUI_CComposition_CICompositionObjectFactory_FWD_DEFINED__
#define ____x_ABI_CWindows_CUI_CComposition_CICompositionObjectFactory_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CUI_CComposition_CICompositionObjectFactory __x_ABI_CWindows_CUI_CComposition_CICompositionObjectFactory;
#ifdef __cplusplus
#define __x_ABI_CWindows_CUI_CComposition_CICompositionObjectFactory ABI::Windows::UI::Composition::ICompositionObjectFactory
namespace ABI {
    namespace Windows {
        namespace UI {
            namespace Composition {
                interface ICompositionObjectFactory;
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CUI_CComposition_CICompositionBatchCompletedEventArgs_FWD_DEFINED__
#define ____x_ABI_CWindows_CUI_CComposition_CICompositionBatchCompletedEventArgs_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CUI_CComposition_CICompositionBatchCompletedEventArgs __x_ABI_CWindows_CUI_CComposition_CICompositionBatchCompletedEventArgs;
#ifdef __cplusplus
#define __x_ABI_CWindows_CUI_CComposition_CICompositionBatchCompletedEventArgs ABI::Windows::UI::Composition::ICompositionBatchCompletedEventArgs
namespace ABI {
    namespace Windows {
        namespace UI {
            namespace Composition {
                interface ICompositionBatchCompletedEventArgs;
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CUI_CComposition_CICompositionBrush_FWD_DEFINED__
#define ____x_ABI_CWindows_CUI_CComposition_CICompositionBrush_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CUI_CComposition_CICompositionBrush __x_ABI_CWindows_CUI_CComposition_CICompositionBrush;
#ifdef __cplusplus
#define __x_ABI_CWindows_CUI_CComposition_CICompositionBrush ABI::Windows::UI::Composition::ICompositionBrush
namespace ABI {
    namespace Windows {
        namespace UI {
            namespace Composition {
                interface ICompositionBrush;
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CUI_CComposition_CICompositionBrushFactory_FWD_DEFINED__
#define ____x_ABI_CWindows_CUI_CComposition_CICompositionBrushFactory_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CUI_CComposition_CICompositionBrushFactory __x_ABI_CWindows_CUI_CComposition_CICompositionBrushFactory;
#ifdef __cplusplus
#define __x_ABI_CWindows_CUI_CComposition_CICompositionBrushFactory ABI::Windows::UI::Composition::ICompositionBrushFactory
namespace ABI {
    namespace Windows {
        namespace UI {
            namespace Composition {
                interface ICompositionBrushFactory;
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CUI_CComposition_CICompositionClip_FWD_DEFINED__
#define ____x_ABI_CWindows_CUI_CComposition_CICompositionClip_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CUI_CComposition_CICompositionClip __x_ABI_CWindows_CUI_CComposition_CICompositionClip;
#ifdef __cplusplus
#define __x_ABI_CWindows_CUI_CComposition_CICompositionClip ABI::Windows::UI::Composition::ICompositionClip
namespace ABI {
    namespace Windows {
        namespace UI {
            namespace Composition {
                interface ICompositionClip;
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CUI_CComposition_CICompositionClipFactory_FWD_DEFINED__
#define ____x_ABI_CWindows_CUI_CComposition_CICompositionClipFactory_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CUI_CComposition_CICompositionClipFactory __x_ABI_CWindows_CUI_CComposition_CICompositionClipFactory;
#ifdef __cplusplus
#define __x_ABI_CWindows_CUI_CComposition_CICompositionClipFactory ABI::Windows::UI::Composition::ICompositionClipFactory
namespace ABI {
    namespace Windows {
        namespace UI {
            namespace Composition {
                interface ICompositionClipFactory;
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CUI_CComposition_CICompositionColorBrush_FWD_DEFINED__
#define ____x_ABI_CWindows_CUI_CComposition_CICompositionColorBrush_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CUI_CComposition_CICompositionColorBrush __x_ABI_CWindows_CUI_CComposition_CICompositionColorBrush;
#ifdef __cplusplus
#define __x_ABI_CWindows_CUI_CComposition_CICompositionColorBrush ABI::Windows::UI::Composition::ICompositionColorBrush
namespace ABI {
    namespace Windows {
        namespace UI {
            namespace Composition {
                interface ICompositionColorBrush;
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CUI_CComposition_CICompositionCommitBatch_FWD_DEFINED__
#define ____x_ABI_CWindows_CUI_CComposition_CICompositionCommitBatch_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CUI_CComposition_CICompositionCommitBatch __x_ABI_CWindows_CUI_CComposition_CICompositionCommitBatch;
#ifdef __cplusplus
#define __x_ABI_CWindows_CUI_CComposition_CICompositionCommitBatch ABI::Windows::UI::Composition::ICompositionCommitBatch
namespace ABI {
    namespace Windows {
        namespace UI {
            namespace Composition {
                interface ICompositionCommitBatch;
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CUI_CComposition_CICompositionDrawingSurface_FWD_DEFINED__
#define ____x_ABI_CWindows_CUI_CComposition_CICompositionDrawingSurface_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CUI_CComposition_CICompositionDrawingSurface __x_ABI_CWindows_CUI_CComposition_CICompositionDrawingSurface;
#ifdef __cplusplus
#define __x_ABI_CWindows_CUI_CComposition_CICompositionDrawingSurface ABI::Windows::UI::Composition::ICompositionDrawingSurface
namespace ABI {
    namespace Windows {
        namespace UI {
            namespace Composition {
                interface ICompositionDrawingSurface;
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CUI_CComposition_CICompositionDrawingSurfaceFactory_FWD_DEFINED__
#define ____x_ABI_CWindows_CUI_CComposition_CICompositionDrawingSurfaceFactory_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CUI_CComposition_CICompositionDrawingSurfaceFactory __x_ABI_CWindows_CUI_CComposition_CICompositionDrawingSurfaceFactory;
#ifdef __cplusplus
#define __x_ABI_CWindows_CUI_CComposition_CICompositionDrawingSurfaceFactory ABI::Windows::UI::Composition::ICompositionDrawingSurfaceFactory
namespace ABI {
    namespace Windows {
        namespace UI {
            namespace Composition {
                interface ICompositionDrawingSurfaceFactory;
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CUI_CComposition_CICompositionEasingFunction_FWD_DEFINED__
#define ____x_ABI_CWindows_CUI_CComposition_CICompositionEasingFunction_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CUI_CComposition_CICompositionEasingFunction __x_ABI_CWindows_CUI_CComposition_CICompositionEasingFunction;
#ifdef __cplusplus
#define __x_ABI_CWindows_CUI_CComposition_CICompositionEasingFunction ABI::Windows::UI::Composition::ICompositionEasingFunction
namespace ABI {
    namespace Windows {
        namespace UI {
            namespace Composition {
                interface ICompositionEasingFunction;
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CUI_CComposition_CICompositionEasingFunctionFactory_FWD_DEFINED__
#define ____x_ABI_CWindows_CUI_CComposition_CICompositionEasingFunctionFactory_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CUI_CComposition_CICompositionEasingFunctionFactory __x_ABI_CWindows_CUI_CComposition_CICompositionEasingFunctionFactory;
#ifdef __cplusplus
#define __x_ABI_CWindows_CUI_CComposition_CICompositionEasingFunctionFactory ABI::Windows::UI::Composition::ICompositionEasingFunctionFactory
namespace ABI {
    namespace Windows {
        namespace UI {
            namespace Composition {
                interface ICompositionEasingFunctionFactory;
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CUI_CComposition_CICompositionEffectBrush_FWD_DEFINED__
#define ____x_ABI_CWindows_CUI_CComposition_CICompositionEffectBrush_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CUI_CComposition_CICompositionEffectBrush __x_ABI_CWindows_CUI_CComposition_CICompositionEffectBrush;
#ifdef __cplusplus
#define __x_ABI_CWindows_CUI_CComposition_CICompositionEffectBrush ABI::Windows::UI::Composition::ICompositionEffectBrush
namespace ABI {
    namespace Windows {
        namespace UI {
            namespace Composition {
                interface ICompositionEffectBrush;
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CUI_CComposition_CICompositionEffectFactory_FWD_DEFINED__
#define ____x_ABI_CWindows_CUI_CComposition_CICompositionEffectFactory_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CUI_CComposition_CICompositionEffectFactory __x_ABI_CWindows_CUI_CComposition_CICompositionEffectFactory;
#ifdef __cplusplus
#define __x_ABI_CWindows_CUI_CComposition_CICompositionEffectFactory ABI::Windows::UI::Composition::ICompositionEffectFactory
namespace ABI {
    namespace Windows {
        namespace UI {
            namespace Composition {
                interface ICompositionEffectFactory;
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CUI_CComposition_CICompositionGraphicsDevice_FWD_DEFINED__
#define ____x_ABI_CWindows_CUI_CComposition_CICompositionGraphicsDevice_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CUI_CComposition_CICompositionGraphicsDevice __x_ABI_CWindows_CUI_CComposition_CICompositionGraphicsDevice;
#ifdef __cplusplus
#define __x_ABI_CWindows_CUI_CComposition_CICompositionGraphicsDevice ABI::Windows::UI::Composition::ICompositionGraphicsDevice
namespace ABI {
    namespace Windows {
        namespace UI {
            namespace Composition {
                interface ICompositionGraphicsDevice;
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CUI_CComposition_CICompositionPropertySet_FWD_DEFINED__
#define ____x_ABI_CWindows_CUI_CComposition_CICompositionPropertySet_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CUI_CComposition_CICompositionPropertySet __x_ABI_CWindows_CUI_CComposition_CICompositionPropertySet;
#ifdef __cplusplus
#define __x_ABI_CWindows_CUI_CComposition_CICompositionPropertySet ABI::Windows::UI::Composition::ICompositionPropertySet
namespace ABI {
    namespace Windows {
        namespace UI {
            namespace Composition {
                interface ICompositionPropertySet;
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CUI_CComposition_CICompositionScopedBatch_FWD_DEFINED__
#define ____x_ABI_CWindows_CUI_CComposition_CICompositionScopedBatch_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CUI_CComposition_CICompositionScopedBatch __x_ABI_CWindows_CUI_CComposition_CICompositionScopedBatch;
#ifdef __cplusplus
#define __x_ABI_CWindows_CUI_CComposition_CICompositionScopedBatch ABI::Windows::UI::Composition::ICompositionScopedBatch
namespace ABI {
    namespace Windows {
        namespace UI {
            namespace Composition {
                interface ICompositionScopedBatch;
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CUI_CComposition_CICompositionSurface_FWD_DEFINED__
#define ____x_ABI_CWindows_CUI_CComposition_CICompositionSurface_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CUI_CComposition_CICompositionSurface __x_ABI_CWindows_CUI_CComposition_CICompositionSurface;
#ifdef __cplusplus
#define __x_ABI_CWindows_CUI_CComposition_CICompositionSurface ABI::Windows::UI::Composition::ICompositionSurface
namespace ABI {
    namespace Windows {
        namespace UI {
            namespace Composition {
                interface ICompositionSurface;
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CUI_CComposition_CICompositionSurfaceBrush_FWD_DEFINED__
#define ____x_ABI_CWindows_CUI_CComposition_CICompositionSurfaceBrush_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CUI_CComposition_CICompositionSurfaceBrush __x_ABI_CWindows_CUI_CComposition_CICompositionSurfaceBrush;
#ifdef __cplusplus
#define __x_ABI_CWindows_CUI_CComposition_CICompositionSurfaceBrush ABI::Windows::UI::Composition::ICompositionSurfaceBrush
namespace ABI {
    namespace Windows {
        namespace UI {
            namespace Composition {
                interface ICompositionSurfaceBrush;
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CUI_CComposition_CICompositionTarget_FWD_DEFINED__
#define ____x_ABI_CWindows_CUI_CComposition_CICompositionTarget_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CUI_CComposition_CICompositionTarget __x_ABI_CWindows_CUI_CComposition_CICompositionTarget;
#ifdef __cplusplus
#define __x_ABI_CWindows_CUI_CComposition_CICompositionTarget ABI::Windows::UI::Composition::ICompositionTarget
namespace ABI {
    namespace Windows {
        namespace UI {
            namespace Composition {
                interface ICompositionTarget;
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CUI_CComposition_CICompositionTargetFactory_FWD_DEFINED__
#define ____x_ABI_CWindows_CUI_CComposition_CICompositionTargetFactory_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CUI_CComposition_CICompositionTargetFactory __x_ABI_CWindows_CUI_CComposition_CICompositionTargetFactory;
#ifdef __cplusplus
#define __x_ABI_CWindows_CUI_CComposition_CICompositionTargetFactory ABI::Windows::UI::Composition::ICompositionTargetFactory
namespace ABI {
    namespace Windows {
        namespace UI {
            namespace Composition {
                interface ICompositionTargetFactory;
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CUI_CComposition_CICompositor_FWD_DEFINED__
#define ____x_ABI_CWindows_CUI_CComposition_CICompositor_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CUI_CComposition_CICompositor __x_ABI_CWindows_CUI_CComposition_CICompositor;
#ifdef __cplusplus
#define __x_ABI_CWindows_CUI_CComposition_CICompositor ABI::Windows::UI::Composition::ICompositor
namespace ABI {
    namespace Windows {
        namespace UI {
            namespace Composition {
                interface ICompositor;
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CUI_CComposition_CIContainerVisual_FWD_DEFINED__
#define ____x_ABI_CWindows_CUI_CComposition_CIContainerVisual_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CUI_CComposition_CIContainerVisual __x_ABI_CWindows_CUI_CComposition_CIContainerVisual;
#ifdef __cplusplus
#define __x_ABI_CWindows_CUI_CComposition_CIContainerVisual ABI::Windows::UI::Composition::IContainerVisual
namespace ABI {
    namespace Windows {
        namespace UI {
            namespace Composition {
                interface IContainerVisual;
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CUI_CComposition_CIContainerVisualFactory_FWD_DEFINED__
#define ____x_ABI_CWindows_CUI_CComposition_CIContainerVisualFactory_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CUI_CComposition_CIContainerVisualFactory __x_ABI_CWindows_CUI_CComposition_CIContainerVisualFactory;
#ifdef __cplusplus
#define __x_ABI_CWindows_CUI_CComposition_CIContainerVisualFactory ABI::Windows::UI::Composition::IContainerVisualFactory
namespace ABI {
    namespace Windows {
        namespace UI {
            namespace Composition {
                interface IContainerVisualFactory;
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CUI_CComposition_CICubicBezierEasingFunction_FWD_DEFINED__
#define ____x_ABI_CWindows_CUI_CComposition_CICubicBezierEasingFunction_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CUI_CComposition_CICubicBezierEasingFunction __x_ABI_CWindows_CUI_CComposition_CICubicBezierEasingFunction;
#ifdef __cplusplus
#define __x_ABI_CWindows_CUI_CComposition_CICubicBezierEasingFunction ABI::Windows::UI::Composition::ICubicBezierEasingFunction
namespace ABI {
    namespace Windows {
        namespace UI {
            namespace Composition {
                interface ICubicBezierEasingFunction;
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CUI_CComposition_CIExpressionAnimation_FWD_DEFINED__
#define ____x_ABI_CWindows_CUI_CComposition_CIExpressionAnimation_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CUI_CComposition_CIExpressionAnimation __x_ABI_CWindows_CUI_CComposition_CIExpressionAnimation;
#ifdef __cplusplus
#define __x_ABI_CWindows_CUI_CComposition_CIExpressionAnimation ABI::Windows::UI::Composition::IExpressionAnimation
namespace ABI {
    namespace Windows {
        namespace UI {
            namespace Composition {
                interface IExpressionAnimation;
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CUI_CComposition_CIInsetClip_FWD_DEFINED__
#define ____x_ABI_CWindows_CUI_CComposition_CIInsetClip_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CUI_CComposition_CIInsetClip __x_ABI_CWindows_CUI_CComposition_CIInsetClip;
#ifdef __cplusplus
#define __x_ABI_CWindows_CUI_CComposition_CIInsetClip ABI::Windows::UI::Composition::IInsetClip
namespace ABI {
    namespace Windows {
        namespace UI {
            namespace Composition {
                interface IInsetClip;
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CUI_CComposition_CILinearEasingFunction_FWD_DEFINED__
#define ____x_ABI_CWindows_CUI_CComposition_CILinearEasingFunction_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CUI_CComposition_CILinearEasingFunction __x_ABI_CWindows_CUI_CComposition_CILinearEasingFunction;
#ifdef __cplusplus
#define __x_ABI_CWindows_CUI_CComposition_CILinearEasingFunction ABI::Windows::UI::Composition::ILinearEasingFunction
namespace ABI {
    namespace Windows {
        namespace UI {
            namespace Composition {
                interface ILinearEasingFunction;
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CUI_CComposition_CIQuaternionKeyFrameAnimation_FWD_DEFINED__
#define ____x_ABI_CWindows_CUI_CComposition_CIQuaternionKeyFrameAnimation_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CUI_CComposition_CIQuaternionKeyFrameAnimation __x_ABI_CWindows_CUI_CComposition_CIQuaternionKeyFrameAnimation;
#ifdef __cplusplus
#define __x_ABI_CWindows_CUI_CComposition_CIQuaternionKeyFrameAnimation ABI::Windows::UI::Composition::IQuaternionKeyFrameAnimation
namespace ABI {
    namespace Windows {
        namespace UI {
            namespace Composition {
                interface IQuaternionKeyFrameAnimation;
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CUI_CComposition_CIRenderingDeviceReplacedEventArgs_FWD_DEFINED__
#define ____x_ABI_CWindows_CUI_CComposition_CIRenderingDeviceReplacedEventArgs_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CUI_CComposition_CIRenderingDeviceReplacedEventArgs __x_ABI_CWindows_CUI_CComposition_CIRenderingDeviceReplacedEventArgs;
#ifdef __cplusplus
#define __x_ABI_CWindows_CUI_CComposition_CIRenderingDeviceReplacedEventArgs ABI::Windows::UI::Composition::IRenderingDeviceReplacedEventArgs
namespace ABI {
    namespace Windows {
        namespace UI {
            namespace Composition {
                interface IRenderingDeviceReplacedEventArgs;
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CUI_CComposition_CIScalarKeyFrameAnimation_FWD_DEFINED__
#define ____x_ABI_CWindows_CUI_CComposition_CIScalarKeyFrameAnimation_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CUI_CComposition_CIScalarKeyFrameAnimation __x_ABI_CWindows_CUI_CComposition_CIScalarKeyFrameAnimation;
#ifdef __cplusplus
#define __x_ABI_CWindows_CUI_CComposition_CIScalarKeyFrameAnimation ABI::Windows::UI::Composition::IScalarKeyFrameAnimation
namespace ABI {
    namespace Windows {
        namespace UI {
            namespace Composition {
                interface IScalarKeyFrameAnimation;
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CUI_CComposition_CISpriteVisual_FWD_DEFINED__
#define ____x_ABI_CWindows_CUI_CComposition_CISpriteVisual_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CUI_CComposition_CISpriteVisual __x_ABI_CWindows_CUI_CComposition_CISpriteVisual;
#ifdef __cplusplus
#define __x_ABI_CWindows_CUI_CComposition_CISpriteVisual ABI::Windows::UI::Composition::ISpriteVisual
namespace ABI {
    namespace Windows {
        namespace UI {
            namespace Composition {
                interface ISpriteVisual;
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CUI_CComposition_CIVector2KeyFrameAnimation_FWD_DEFINED__
#define ____x_ABI_CWindows_CUI_CComposition_CIVector2KeyFrameAnimation_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CUI_CComposition_CIVector2KeyFrameAnimation __x_ABI_CWindows_CUI_CComposition_CIVector2KeyFrameAnimation;
#ifdef __cplusplus
#define __x_ABI_CWindows_CUI_CComposition_CIVector2KeyFrameAnimation ABI::Windows::UI::Composition::IVector2KeyFrameAnimation
namespace ABI {
    namespace Windows {
        namespace UI {
            namespace Composition {
                interface IVector2KeyFrameAnimation;
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CUI_CComposition_CIVector3KeyFrameAnimation_FWD_DEFINED__
#define ____x_ABI_CWindows_CUI_CComposition_CIVector3KeyFrameAnimation_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CUI_CComposition_CIVector3KeyFrameAnimation __x_ABI_CWindows_CUI_CComposition_CIVector3KeyFrameAnimation;
#ifdef __cplusplus
#define __x_ABI_CWindows_CUI_CComposition_CIVector3KeyFrameAnimation ABI::Windows::UI::Composition::IVector3KeyFrameAnimation
namespace ABI {
    namespace Windows {
        namespace UI {
            namespace Composition {
                interface IVector3KeyFrameAnimation;
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CUI_CComposition_CIVector4KeyFrameAnimation_FWD_DEFINED__
#define ____x_ABI_CWindows_CUI_CComposition_CIVector4KeyFrameAnimation_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CUI_CComposition_CIVector4KeyFrameAnimation __x_ABI_CWindows_CUI_CComposition_CIVector4KeyFrameAnimation;
#ifdef __cplusplus
#define __x_ABI_CWindows_CUI_CComposition_CIVector4KeyFrameAnimation ABI::Windows::UI::Composition::IVector4KeyFrameAnimation
namespace ABI {
    namespace Windows {
        namespace UI {
            namespace Composition {
                interface IVector4KeyFrameAnimation;
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CUI_CComposition_CIVisual_FWD_DEFINED__
#define ____x_ABI_CWindows_CUI_CComposition_CIVisual_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CUI_CComposition_CIVisual __x_ABI_CWindows_CUI_CComposition_CIVisual;
#ifdef __cplusplus
#define __x_ABI_CWindows_CUI_CComposition_CIVisual ABI::Windows::UI::Composition::IVisual
namespace ABI {
    namespace Windows {
        namespace UI {
            namespace Composition {
                interface IVisual;
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CUI_CComposition_CIVisualFactory_FWD_DEFINED__
#define ____x_ABI_CWindows_CUI_CComposition_CIVisualFactory_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CUI_CComposition_CIVisualFactory __x_ABI_CWindows_CUI_CComposition_CIVisualFactory;
#ifdef __cplusplus
#define __x_ABI_CWindows_CUI_CComposition_CIVisualFactory ABI::Windows::UI::Composition::IVisualFactory
namespace ABI {
    namespace Windows {
        namespace UI {
            namespace Composition {
                interface IVisualFactory;
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CUI_CComposition_CIVisualCollection_FWD_DEFINED__
#define ____x_ABI_CWindows_CUI_CComposition_CIVisualCollection_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CUI_CComposition_CIVisualCollection __x_ABI_CWindows_CUI_CComposition_CIVisualCollection;
#ifdef __cplusplus
#define __x_ABI_CWindows_CUI_CComposition_CIVisualCollection ABI::Windows::UI::Composition::IVisualCollection
namespace ABI {
    namespace Windows {
        namespace UI {
            namespace Composition {
                interface IVisualCollection;
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CUI_CComposition_CColorKeyFrameAnimation_FWD_DEFINED__
#define ____x_ABI_CWindows_CUI_CComposition_CColorKeyFrameAnimation_FWD_DEFINED__
#ifdef __cplusplus
namespace ABI {
    namespace Windows {
        namespace UI {
            namespace Composition {
                class ColorKeyFrameAnimation;
            }
        }
    }
}
#else
typedef struct __x_ABI_CWindows_CUI_CComposition_CColorKeyFrameAnimation __x_ABI_CWindows_CUI_CComposition_CColorKeyFrameAnimation;
#endif /* defined __cplusplus */
#endif /* defined ____x_ABI_CWindows_CUI_CComposition_CColorKeyFrameAnimation_FWD_DEFINED__ */

#ifndef ____x_ABI_CWindows_CUI_CComposition_CCompositionAnimation_FWD_DEFINED__
#define ____x_ABI_CWindows_CUI_CComposition_CCompositionAnimation_FWD_DEFINED__
#ifdef __cplusplus
namespace ABI {
    namespace Windows {
        namespace UI {
            namespace Composition {
                class CompositionAnimation;
            }
        }
    }
}
#else
typedef struct __x_ABI_CWindows_CUI_CComposition_CCompositionAnimation __x_ABI_CWindows_CUI_CComposition_CCompositionAnimation;
#endif /* defined __cplusplus */
#endif /* defined ____x_ABI_CWindows_CUI_CComposition_CCompositionAnimation_FWD_DEFINED__ */

#ifndef ____x_ABI_CWindows_CUI_CComposition_CCompositionBatchCompletedEventArgs_FWD_DEFINED__
#define ____x_ABI_CWindows_CUI_CComposition_CCompositionBatchCompletedEventArgs_FWD_DEFINED__
#ifdef __cplusplus
namespace ABI {
    namespace Windows {
        namespace UI {
            namespace Composition {
                class CompositionBatchCompletedEventArgs;
            }
        }
    }
}
#else
typedef struct __x_ABI_CWindows_CUI_CComposition_CCompositionBatchCompletedEventArgs __x_ABI_CWindows_CUI_CComposition_CCompositionBatchCompletedEventArgs;
#endif /* defined __cplusplus */
#endif /* defined ____x_ABI_CWindows_CUI_CComposition_CCompositionBatchCompletedEventArgs_FWD_DEFINED__ */

#ifndef ____x_ABI_CWindows_CUI_CComposition_CCompositionBrush_FWD_DEFINED__
#define ____x_ABI_CWindows_CUI_CComposition_CCompositionBrush_FWD_DEFINED__
#ifdef __cplusplus
namespace ABI {
    namespace Windows {
        namespace UI {
            namespace Composition {
                class CompositionBrush;
            }
        }
    }
}
#else
typedef struct __x_ABI_CWindows_CUI_CComposition_CCompositionBrush __x_ABI_CWindows_CUI_CComposition_CCompositionBrush;
#endif /* defined __cplusplus */
#endif /* defined ____x_ABI_CWindows_CUI_CComposition_CCompositionBrush_FWD_DEFINED__ */

#ifndef ____x_ABI_CWindows_CUI_CComposition_CCompositionClip_FWD_DEFINED__
#define ____x_ABI_CWindows_CUI_CComposition_CCompositionClip_FWD_DEFINED__
#ifdef __cplusplus
namespace ABI {
    namespace Windows {
        namespace UI {
            namespace Composition {
                class CompositionClip;
            }
        }
    }
}
#else
typedef struct __x_ABI_CWindows_CUI_CComposition_CCompositionClip __x_ABI_CWindows_CUI_CComposition_CCompositionClip;
#endif /* defined __cplusplus */
#endif /* defined ____x_ABI_CWindows_CUI_CComposition_CCompositionClip_FWD_DEFINED__ */

#ifndef ____x_ABI_CWindows_CUI_CComposition_CCompositionColorBrush_FWD_DEFINED__
#define ____x_ABI_CWindows_CUI_CComposition_CCompositionColorBrush_FWD_DEFINED__
#ifdef __cplusplus
namespace ABI {
    namespace Windows {
        namespace UI {
            namespace Composition {
                class CompositionColorBrush;
            }
        }
    }
}
#else
typedef struct __x_ABI_CWindows_CUI_CComposition_CCompositionColorBrush __x_ABI_CWindows_CUI_CComposition_CCompositionColorBrush;
#endif /* defined __cplusplus */
#endif /* defined ____x_ABI_CWindows_CUI_CComposition_CCompositionColorBrush_FWD_DEFINED__ */

#ifndef ____x_ABI_CWindows_CUI_CComposition_CCompositionCommitBatch_FWD_DEFINED__
#define ____x_ABI_CWindows_CUI_CComposition_CCompositionCommitBatch_FWD_DEFINED__
#ifdef __cplusplus
namespace ABI {
    namespace Windows {
        namespace UI {
            namespace Composition {
                class CompositionCommitBatch;
            }
        }
    }
}
#else
typedef struct __x_ABI_CWindows_CUI_CComposition_CCompositionCommitBatch __x_ABI_CWindows_CUI_CComposition_CCompositionCommitBatch;
#endif /* defined __cplusplus */
#endif /* defined ____x_ABI_CWindows_CUI_CComposition_CCompositionCommitBatch_FWD_DEFINED__ */

#ifndef ____x_ABI_CWindows_CUI_CComposition_CCompositionDrawingSurface_FWD_DEFINED__
#define ____x_ABI_CWindows_CUI_CComposition_CCompositionDrawingSurface_FWD_DEFINED__
#ifdef __cplusplus
namespace ABI {
    namespace Windows {
        namespace UI {
            namespace Composition {
                class CompositionDrawingSurface;
            }
        }
    }
}
#else
typedef struct __x_ABI_CWindows_CUI_CComposition_CCompositionDrawingSurface __x_ABI_CWindows_CUI_CComposition_CCompositionDrawingSurface;
#endif /* defined __cplusplus */
#endif /* defined ____x_ABI_CWindows_CUI_CComposition_CCompositionDrawingSurface_FWD_DEFINED__ */

#ifndef ____x_ABI_CWindows_CUI_CComposition_CCompositionEasingFunction_FWD_DEFINED__
#define ____x_ABI_CWindows_CUI_CComposition_CCompositionEasingFunction_FWD_DEFINED__
#ifdef __cplusplus
namespace ABI {
    namespace Windows {
        namespace UI {
            namespace Composition {
                class CompositionEasingFunction;
            }
        }
    }
}
#else
typedef struct __x_ABI_CWindows_CUI_CComposition_CCompositionEasingFunction __x_ABI_CWindows_CUI_CComposition_CCompositionEasingFunction;
#endif /* defined __cplusplus */
#endif /* defined ____x_ABI_CWindows_CUI_CComposition_CCompositionEasingFunction_FWD_DEFINED__ */

#ifndef ____x_ABI_CWindows_CUI_CComposition_CCompositionEffectBrush_FWD_DEFINED__
#define ____x_ABI_CWindows_CUI_CComposition_CCompositionEffectBrush_FWD_DEFINED__
#ifdef __cplusplus
namespace ABI {
    namespace Windows {
        namespace UI {
            namespace Composition {
                class CompositionEffectBrush;
            }
        }
    }
}
#else
typedef struct __x_ABI_CWindows_CUI_CComposition_CCompositionEffectBrush __x_ABI_CWindows_CUI_CComposition_CCompositionEffectBrush;
#endif /* defined __cplusplus */
#endif /* defined ____x_ABI_CWindows_CUI_CComposition_CCompositionEffectBrush_FWD_DEFINED__ */

#ifndef ____x_ABI_CWindows_CUI_CComposition_CCompositionEffectFactory_FWD_DEFINED__
#define ____x_ABI_CWindows_CUI_CComposition_CCompositionEffectFactory_FWD_DEFINED__
#ifdef __cplusplus
namespace ABI {
    namespace Windows {
        namespace UI {
            namespace Composition {
                class CompositionEffectFactory;
            }
        }
    }
}
#else
typedef struct __x_ABI_CWindows_CUI_CComposition_CCompositionEffectFactory __x_ABI_CWindows_CUI_CComposition_CCompositionEffectFactory;
#endif /* defined __cplusplus */
#endif /* defined ____x_ABI_CWindows_CUI_CComposition_CCompositionEffectFactory_FWD_DEFINED__ */

#ifndef ____x_ABI_CWindows_CUI_CComposition_CCompositionGraphicsDevice_FWD_DEFINED__
#define ____x_ABI_CWindows_CUI_CComposition_CCompositionGraphicsDevice_FWD_DEFINED__
#ifdef __cplusplus
namespace ABI {
    namespace Windows {
        namespace UI {
            namespace Composition {
                class CompositionGraphicsDevice;
            }
        }
    }
}
#else
typedef struct __x_ABI_CWindows_CUI_CComposition_CCompositionGraphicsDevice __x_ABI_CWindows_CUI_CComposition_CCompositionGraphicsDevice;
#endif /* defined __cplusplus */
#endif /* defined ____x_ABI_CWindows_CUI_CComposition_CCompositionGraphicsDevice_FWD_DEFINED__ */

#ifndef ____x_ABI_CWindows_CUI_CComposition_CCompositionObject_FWD_DEFINED__
#define ____x_ABI_CWindows_CUI_CComposition_CCompositionObject_FWD_DEFINED__
#ifdef __cplusplus
namespace ABI {
    namespace Windows {
        namespace UI {
            namespace Composition {
                class CompositionObject;
            }
        }
    }
}
#else
typedef struct __x_ABI_CWindows_CUI_CComposition_CCompositionObject __x_ABI_CWindows_CUI_CComposition_CCompositionObject;
#endif /* defined __cplusplus */
#endif /* defined ____x_ABI_CWindows_CUI_CComposition_CCompositionObject_FWD_DEFINED__ */

#ifndef ____x_ABI_CWindows_CUI_CComposition_CCompositionPropertySet_FWD_DEFINED__
#define ____x_ABI_CWindows_CUI_CComposition_CCompositionPropertySet_FWD_DEFINED__
#ifdef __cplusplus
namespace ABI {
    namespace Windows {
        namespace UI {
            namespace Composition {
                class CompositionPropertySet;
            }
        }
    }
}
#else
typedef struct __x_ABI_CWindows_CUI_CComposition_CCompositionPropertySet __x_ABI_CWindows_CUI_CComposition_CCompositionPropertySet;
#endif /* defined __cplusplus */
#endif /* defined ____x_ABI_CWindows_CUI_CComposition_CCompositionPropertySet_FWD_DEFINED__ */

#ifndef ____x_ABI_CWindows_CUI_CComposition_CCompositionScopedBatch_FWD_DEFINED__
#define ____x_ABI_CWindows_CUI_CComposition_CCompositionScopedBatch_FWD_DEFINED__
#ifdef __cplusplus
namespace ABI {
    namespace Windows {
        namespace UI {
            namespace Composition {
                class CompositionScopedBatch;
            }
        }
    }
}
#else
typedef struct __x_ABI_CWindows_CUI_CComposition_CCompositionScopedBatch __x_ABI_CWindows_CUI_CComposition_CCompositionScopedBatch;
#endif /* defined __cplusplus */
#endif /* defined ____x_ABI_CWindows_CUI_CComposition_CCompositionScopedBatch_FWD_DEFINED__ */

#ifndef ____x_ABI_CWindows_CUI_CComposition_CCompositionSurfaceBrush_FWD_DEFINED__
#define ____x_ABI_CWindows_CUI_CComposition_CCompositionSurfaceBrush_FWD_DEFINED__
#ifdef __cplusplus
namespace ABI {
    namespace Windows {
        namespace UI {
            namespace Composition {
                class CompositionSurfaceBrush;
            }
        }
    }
}
#else
typedef struct __x_ABI_CWindows_CUI_CComposition_CCompositionSurfaceBrush __x_ABI_CWindows_CUI_CComposition_CCompositionSurfaceBrush;
#endif /* defined __cplusplus */
#endif /* defined ____x_ABI_CWindows_CUI_CComposition_CCompositionSurfaceBrush_FWD_DEFINED__ */

#ifndef ____x_ABI_CWindows_CUI_CComposition_CCompositionTarget_FWD_DEFINED__
#define ____x_ABI_CWindows_CUI_CComposition_CCompositionTarget_FWD_DEFINED__
#ifdef __cplusplus
namespace ABI {
    namespace Windows {
        namespace UI {
            namespace Composition {
                class CompositionTarget;
            }
        }
    }
}
#else
typedef struct __x_ABI_CWindows_CUI_CComposition_CCompositionTarget __x_ABI_CWindows_CUI_CComposition_CCompositionTarget;
#endif /* defined __cplusplus */
#endif /* defined ____x_ABI_CWindows_CUI_CComposition_CCompositionTarget_FWD_DEFINED__ */

#ifndef ____x_ABI_CWindows_CUI_CComposition_CCompositor_FWD_DEFINED__
#define ____x_ABI_CWindows_CUI_CComposition_CCompositor_FWD_DEFINED__
#ifdef __cplusplus
namespace ABI {
    namespace Windows {
        namespace UI {
            namespace Composition {
                class Compositor;
            }
        }
    }
}
#else
typedef struct __x_ABI_CWindows_CUI_CComposition_CCompositor __x_ABI_CWindows_CUI_CComposition_CCompositor;
#endif /* defined __cplusplus */
#endif /* defined ____x_ABI_CWindows_CUI_CComposition_CCompositor_FWD_DEFINED__ */

#ifndef ____x_ABI_CWindows_CUI_CComposition_CContainerVisual_FWD_DEFINED__
#define ____x_ABI_CWindows_CUI_CComposition_CContainerVisual_FWD_DEFINED__
#ifdef __cplusplus
namespace ABI {
    namespace Windows {
        namespace UI {
            namespace Composition {
                class ContainerVisual;
            }
        }
    }
}
#else
typedef struct __x_ABI_CWindows_CUI_CComposition_CContainerVisual __x_ABI_CWindows_CUI_CComposition_CContainerVisual;
#endif /* defined __cplusplus */
#endif /* defined ____x_ABI_CWindows_CUI_CComposition_CContainerVisual_FWD_DEFINED__ */

#ifndef ____x_ABI_CWindows_CUI_CComposition_CCubicBezierEasingFunction_FWD_DEFINED__
#define ____x_ABI_CWindows_CUI_CComposition_CCubicBezierEasingFunction_FWD_DEFINED__
#ifdef __cplusplus
namespace ABI {
    namespace Windows {
        namespace UI {
            namespace Composition {
                class CubicBezierEasingFunction;
            }
        }
    }
}
#else
typedef struct __x_ABI_CWindows_CUI_CComposition_CCubicBezierEasingFunction __x_ABI_CWindows_CUI_CComposition_CCubicBezierEasingFunction;
#endif /* defined __cplusplus */
#endif /* defined ____x_ABI_CWindows_CUI_CComposition_CCubicBezierEasingFunction_FWD_DEFINED__ */

#ifndef ____x_ABI_CWindows_CUI_CComposition_CExpressionAnimation_FWD_DEFINED__
#define ____x_ABI_CWindows_CUI_CComposition_CExpressionAnimation_FWD_DEFINED__
#ifdef __cplusplus
namespace ABI {
    namespace Windows {
        namespace UI {
            namespace Composition {
                class ExpressionAnimation;
            }
        }
    }
}
#else
typedef struct __x_ABI_CWindows_CUI_CComposition_CExpressionAnimation __x_ABI_CWindows_CUI_CComposition_CExpressionAnimation;
#endif /* defined __cplusplus */
#endif /* defined ____x_ABI_CWindows_CUI_CComposition_CExpressionAnimation_FWD_DEFINED__ */

#ifndef ____x_ABI_CWindows_CUI_CComposition_CInsetClip_FWD_DEFINED__
#define ____x_ABI_CWindows_CUI_CComposition_CInsetClip_FWD_DEFINED__
#ifdef __cplusplus
namespace ABI {
    namespace Windows {
        namespace UI {
            namespace Composition {
                class InsetClip;
            }
        }
    }
}
#else
typedef struct __x_ABI_CWindows_CUI_CComposition_CInsetClip __x_ABI_CWindows_CUI_CComposition_CInsetClip;
#endif /* defined __cplusplus */
#endif /* defined ____x_ABI_CWindows_CUI_CComposition_CInsetClip_FWD_DEFINED__ */

#ifndef ____x_ABI_CWindows_CUI_CComposition_CLinearEasingFunction_FWD_DEFINED__
#define ____x_ABI_CWindows_CUI_CComposition_CLinearEasingFunction_FWD_DEFINED__
#ifdef __cplusplus
namespace ABI {
    namespace Windows {
        namespace UI {
            namespace Composition {
                class LinearEasingFunction;
            }
        }
    }
}
#else
typedef struct __x_ABI_CWindows_CUI_CComposition_CLinearEasingFunction __x_ABI_CWindows_CUI_CComposition_CLinearEasingFunction;
#endif /* defined __cplusplus */
#endif /* defined ____x_ABI_CWindows_CUI_CComposition_CLinearEasingFunction_FWD_DEFINED__ */

#ifndef ____x_ABI_CWindows_CUI_CComposition_CQuaternionKeyFrameAnimation_FWD_DEFINED__
#define ____x_ABI_CWindows_CUI_CComposition_CQuaternionKeyFrameAnimation_FWD_DEFINED__
#ifdef __cplusplus
namespace ABI {
    namespace Windows {
        namespace UI {
            namespace Composition {
                class QuaternionKeyFrameAnimation;
            }
        }
    }
}
#else
typedef struct __x_ABI_CWindows_CUI_CComposition_CQuaternionKeyFrameAnimation __x_ABI_CWindows_CUI_CComposition_CQuaternionKeyFrameAnimation;
#endif /* defined __cplusplus */
#endif /* defined ____x_ABI_CWindows_CUI_CComposition_CQuaternionKeyFrameAnimation_FWD_DEFINED__ */

#ifndef ____x_ABI_CWindows_CUI_CComposition_CRenderingDeviceReplacedEventArgs_FWD_DEFINED__
#define ____x_ABI_CWindows_CUI_CComposition_CRenderingDeviceReplacedEventArgs_FWD_DEFINED__
#ifdef __cplusplus
namespace ABI {
    namespace Windows {
        namespace UI {
            namespace Composition {
                class RenderingDeviceReplacedEventArgs;
            }
        }
    }
}
#else
typedef struct __x_ABI_CWindows_CUI_CComposition_CRenderingDeviceReplacedEventArgs __x_ABI_CWindows_CUI_CComposition_CRenderingDeviceReplacedEventArgs;
#endif /* defined __cplusplus */
#endif /* defined ____x_ABI_CWindows_CUI_CComposition_CRenderingDeviceReplacedEventArgs_FWD_DEFINED__ */

#ifndef ____x_ABI_CWindows_CUI_CComposition_CScalarKeyFrameAnimation_FWD_DEFINED__
#define ____x_ABI_CWindows_CUI_CComposition_CScalarKeyFrameAnimation_FWD_DEFINED__
#ifdef __cplusplus
namespace ABI {
    namespace Windows {
        namespace UI {
            namespace Composition {
                class ScalarKeyFrameAnimation;
            }
        }
    }
}
#else
typedef struct __x_ABI_CWindows_CUI_CComposition_CScalarKeyFrameAnimation __x_ABI_CWindows_CUI_CComposition_CScalarKeyFrameAnimation;
#endif /* defined __cplusplus */
#endif /* defined ____x_ABI_CWindows_CUI_CComposition_CScalarKeyFrameAnimation_FWD_DEFINED__ */

#ifndef ____x_ABI_CWindows_CUI_CComposition_CSpriteVisual_FWD_DEFINED__
#define ____x_ABI_CWindows_CUI_CComposition_CSpriteVisual_FWD_DEFINED__
#ifdef __cplusplus
namespace ABI {
    namespace Windows {
        namespace UI {
            namespace Composition {
                class SpriteVisual;
            }
        }
    }
}
#else
typedef struct __x_ABI_CWindows_CUI_CComposition_CSpriteVisual __x_ABI_CWindows_CUI_CComposition_CSpriteVisual;
#endif /* defined __cplusplus */
#endif /* defined ____x_ABI_CWindows_CUI_CComposition_CSpriteVisual_FWD_DEFINED__ */

#ifndef ____x_ABI_CWindows_CUI_CComposition_CVector2KeyFrameAnimation_FWD_DEFINED__
#define ____x_ABI_CWindows_CUI_CComposition_CVector2KeyFrameAnimation_FWD_DEFINED__
#ifdef __cplusplus
namespace ABI {
    namespace Windows {
        namespace UI {
            namespace Composition {
                class Vector2KeyFrameAnimation;
            }
        }
    }
}
#else
typedef struct __x_ABI_CWindows_CUI_CComposition_CVector2KeyFrameAnimation __x_ABI_CWindows_CUI_CComposition_CVector2KeyFrameAnimation;
#endif /* defined __cplusplus */
#endif /* defined ____x_ABI_CWindows_CUI_CComposition_CVector2KeyFrameAnimation_FWD_DEFINED__ */

#ifndef ____x_ABI_CWindows_CUI_CComposition_CVector3KeyFrameAnimation_FWD_DEFINED__
#define ____x_ABI_CWindows_CUI_CComposition_CVector3KeyFrameAnimation_FWD_DEFINED__
#ifdef __cplusplus
namespace ABI {
    namespace Windows {
        namespace UI {
            namespace Composition {
                class Vector3KeyFrameAnimation;
            }
        }
    }
}
#else
typedef struct __x_ABI_CWindows_CUI_CComposition_CVector3KeyFrameAnimation __x_ABI_CWindows_CUI_CComposition_CVector3KeyFrameAnimation;
#endif /* defined __cplusplus */
#endif /* defined ____x_ABI_CWindows_CUI_CComposition_CVector3KeyFrameAnimation_FWD_DEFINED__ */

#ifndef ____x_ABI_CWindows_CUI_CComposition_CVector4KeyFrameAnimation_FWD_DEFINED__
#define ____x_ABI_CWindows_CUI_CComposition_CVector4KeyFrameAnimation_FWD_DEFINED__
#ifdef __cplusplus
namespace ABI {
    namespace Windows {
        namespace UI {
            namespace Composition {
                class Vector4KeyFrameAnimation;
            }
        }
    }
}
#else
typedef struct __x_ABI_CWindows_CUI_CComposition_CVector4KeyFrameAnimation __x_ABI_CWindows_CUI_CComposition_CVector4KeyFrameAnimation;
#endif /* defined __cplusplus */
#endif /* defined ____x_ABI_CWindows_CUI_CComposition_CVector4KeyFrameAnimation_FWD_DEFINED__ */

#ifndef ____x_ABI_CWindows_CUI_CComposition_CVisual_FWD_DEFINED__
#define ____x_ABI_CWindows_CUI_CComposition_CVisual_FWD_DEFINED__
#ifdef __cplusplus
namespace ABI {
    namespace Windows {
        namespace UI {
            namespace Composition {
                class Visual;
            }
        }
    }
}
#else
typedef struct __x_ABI_CWindows_CUI_CComposition_CVisual __x_ABI_CWindows_CUI_CComposition_CVisual;
#endif /* defined __cplusplus */
#endif /* defined ____x_ABI_CWindows_CUI_CComposition_CVisual_FWD_DEFINED__ */

#ifndef ____x_ABI_CWindows_CUI_CComposition_CVisualCollection_FWD_DEFINED__
#define ____x_ABI_CWindows_CUI_CComposition_CVisualCollection_FWD_DEFINED__
#ifdef __cplusplus
namespace ABI {
    namespace Windows {
        namespace UI {
            namespace Composition {
                class VisualCollection;
            }
        }
    }
}
#else
typedef struct __x_ABI_CWindows_CUI_CComposition_CVisualCollection __x_ABI_CWindows_CUI_CComposition_CVisualCollection;
#endif /* defined __cplusplus */
#endif /* defined ____x_ABI_CWindows_CUI_CComposition_CVisualCollection_FWD_DEFINED__ */

#ifndef ____FIAsyncOperationCompletedHandler_1_Windows__CUI__CComposition__CICompositionSurface_FWD_DEFINED__
#define ____FIAsyncOperationCompletedHandler_1_Windows__CUI__CComposition__CICompositionSurface_FWD_DEFINED__
typedef interface __FIAsyncOperationCompletedHandler_1_Windows__CUI__CComposition__CICompositionSurface __FIAsyncOperationCompletedHandler_1_Windows__CUI__CComposition__CICompositionSurface;
#ifdef __cplusplus
#define __FIAsyncOperationCompletedHandler_1_Windows__CUI__CComposition__CICompositionSurface ABI::Windows::Foundation::IAsyncOperationCompletedHandler<ABI::Windows::UI::Composition::ICompositionSurface* >
#endif /* __cplusplus */
#endif

#ifndef ____FIAsyncOperation_1_Windows__CUI__CComposition__CICompositionSurface_FWD_DEFINED__
#define ____FIAsyncOperation_1_Windows__CUI__CComposition__CICompositionSurface_FWD_DEFINED__
typedef interface __FIAsyncOperation_1_Windows__CUI__CComposition__CICompositionSurface __FIAsyncOperation_1_Windows__CUI__CComposition__CICompositionSurface;
#ifdef __cplusplus
#define __FIAsyncOperation_1_Windows__CUI__CComposition__CICompositionSurface ABI::Windows::Foundation::IAsyncOperation<ABI::Windows::UI::Composition::ICompositionSurface* >
#endif /* __cplusplus */
#endif

#ifndef ____FIIterable_1_Windows__CUI__CComposition__CCompositionAnimation_FWD_DEFINED__
#define ____FIIterable_1_Windows__CUI__CComposition__CCompositionAnimation_FWD_DEFINED__
typedef interface __FIIterable_1_Windows__CUI__CComposition__CCompositionAnimation __FIIterable_1_Windows__CUI__CComposition__CCompositionAnimation;
#ifdef __cplusplus
#define __FIIterable_1_Windows__CUI__CComposition__CCompositionAnimation ABI::Windows::Foundation::Collections::IIterable<ABI::Windows::UI::Composition::CompositionAnimation* >
#endif /* __cplusplus */
#endif

#ifndef ____FIIterable_1_Windows__CUI__CComposition__CVisual_FWD_DEFINED__
#define ____FIIterable_1_Windows__CUI__CComposition__CVisual_FWD_DEFINED__
typedef interface __FIIterable_1_Windows__CUI__CComposition__CVisual __FIIterable_1_Windows__CUI__CComposition__CVisual;
#ifdef __cplusplus
#define __FIIterable_1_Windows__CUI__CComposition__CVisual ABI::Windows::Foundation::Collections::IIterable<ABI::Windows::UI::Composition::Visual* >
#endif /* __cplusplus */
#endif

#ifndef ____FIIterator_1_Windows__CUI__CComposition__CCompositionAnimation_FWD_DEFINED__
#define ____FIIterator_1_Windows__CUI__CComposition__CCompositionAnimation_FWD_DEFINED__
typedef interface __FIIterator_1_Windows__CUI__CComposition__CCompositionAnimation __FIIterator_1_Windows__CUI__CComposition__CCompositionAnimation;
#ifdef __cplusplus
#define __FIIterator_1_Windows__CUI__CComposition__CCompositionAnimation ABI::Windows::Foundation::Collections::IIterator<ABI::Windows::UI::Composition::CompositionAnimation* >
#endif /* __cplusplus */
#endif

#ifndef ____FIIterator_1_Windows__CUI__CComposition__CVisual_FWD_DEFINED__
#define ____FIIterator_1_Windows__CUI__CComposition__CVisual_FWD_DEFINED__
typedef interface __FIIterator_1_Windows__CUI__CComposition__CVisual __FIIterator_1_Windows__CUI__CComposition__CVisual;
#ifdef __cplusplus
#define __FIIterator_1_Windows__CUI__CComposition__CVisual ABI::Windows::Foundation::Collections::IIterator<ABI::Windows::UI::Composition::Visual* >
#endif /* __cplusplus */
#endif

#ifndef ____FITypedEventHandler_2_IInspectable_Windows__CUI__CComposition__CCompositionBatchCompletedEventArgs_FWD_DEFINED__
#define ____FITypedEventHandler_2_IInspectable_Windows__CUI__CComposition__CCompositionBatchCompletedEventArgs_FWD_DEFINED__
typedef interface __FITypedEventHandler_2_IInspectable_Windows__CUI__CComposition__CCompositionBatchCompletedEventArgs __FITypedEventHandler_2_IInspectable_Windows__CUI__CComposition__CCompositionBatchCompletedEventArgs;
#ifdef __cplusplus
#define __FITypedEventHandler_2_IInspectable_Windows__CUI__CComposition__CCompositionBatchCompletedEventArgs ABI::Windows::Foundation::ITypedEventHandler<IInspectable*,ABI::Windows::UI::Composition::CompositionBatchCompletedEventArgs* >
#endif /* __cplusplus */
#endif

#ifndef ____FITypedEventHandler_2_Windows__CUI__CComposition__CCompositionGraphicsDevice_Windows__CUI__CComposition__CRenderingDeviceReplacedEventArgs_FWD_DEFINED__
#define ____FITypedEventHandler_2_Windows__CUI__CComposition__CCompositionGraphicsDevice_Windows__CUI__CComposition__CRenderingDeviceReplacedEventArgs_FWD_DEFINED__
typedef interface __FITypedEventHandler_2_Windows__CUI__CComposition__CCompositionGraphicsDevice_Windows__CUI__CComposition__CRenderingDeviceReplacedEventArgs __FITypedEventHandler_2_Windows__CUI__CComposition__CCompositionGraphicsDevice_Windows__CUI__CComposition__CRenderingDeviceReplacedEventArgs;
#ifdef __cplusplus
#define __FITypedEventHandler_2_Windows__CUI__CComposition__CCompositionGraphicsDevice_Windows__CUI__CComposition__CRenderingDeviceReplacedEventArgs ABI::Windows::Foundation::ITypedEventHandler<ABI::Windows::UI::Composition::CompositionGraphicsDevice*,ABI::Windows::UI::Composition::RenderingDeviceReplacedEventArgs* >
#endif /* __cplusplus */
#endif

/* Headers for imported files */

#include <inspectable.h>
#include <asyncinfo.h>
#include <eventtoken.h>
#include <windowscontracts.h>
#include <windows.foundation.h>
#include <windows.foundation.numerics.h>
#include <windows.graphics.directx.h>
#include <windows.graphics.effects.h>
#include <windows.system.h>
#include <windows.ui.h>
#include <windows.ui.core.h>

#ifdef __cplusplus
extern "C" {
#endif

#ifndef __cplusplus
typedef enum __x_ABI_CWindows_CUI_CComposition_CCompositionBackfaceVisibility __x_ABI_CWindows_CUI_CComposition_CCompositionBackfaceVisibility;
#endif /* __cplusplus */

#ifndef __cplusplus
typedef enum __x_ABI_CWindows_CUI_CComposition_CCompositionBatchTypes __x_ABI_CWindows_CUI_CComposition_CCompositionBatchTypes;
#endif /* __cplusplus */

#ifndef __cplusplus
typedef enum __x_ABI_CWindows_CUI_CComposition_CCompositionBitmapInterpolationMode __x_ABI_CWindows_CUI_CComposition_CCompositionBitmapInterpolationMode;
#endif /* __cplusplus */

#ifndef __cplusplus
typedef enum __x_ABI_CWindows_CUI_CComposition_CCompositionBorderMode __x_ABI_CWindows_CUI_CComposition_CCompositionBorderMode;
#endif /* __cplusplus */

#ifndef __cplusplus
typedef enum __x_ABI_CWindows_CUI_CComposition_CCompositionColorSpace __x_ABI_CWindows_CUI_CComposition_CCompositionColorSpace;
#endif /* __cplusplus */

#ifndef __cplusplus
typedef enum __x_ABI_CWindows_CUI_CComposition_CCompositionCompositeMode __x_ABI_CWindows_CUI_CComposition_CCompositionCompositeMode;
#endif /* __cplusplus */

#ifndef __cplusplus
typedef enum __x_ABI_CWindows_CUI_CComposition_CCompositionEffectFactoryLoadStatus __x_ABI_CWindows_CUI_CComposition_CCompositionEffectFactoryLoadStatus;
#endif /* __cplusplus */

#ifndef __cplusplus
typedef enum __x_ABI_CWindows_CUI_CComposition_CCompositionGetValueStatus __x_ABI_CWindows_CUI_CComposition_CCompositionGetValueStatus;
#endif /* __cplusplus */

#ifndef __cplusplus
typedef enum __x_ABI_CWindows_CUI_CComposition_CCompositionStretch __x_ABI_CWindows_CUI_CComposition_CCompositionStretch;
#endif /* __cplusplus */

#ifndef ____x_ABI_CWindows_CUI_CComposition_CIAnimationObject_FWD_DEFINED__
#define ____x_ABI_CWindows_CUI_CComposition_CIAnimationObject_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CUI_CComposition_CIAnimationObject __x_ABI_CWindows_CUI_CComposition_CIAnimationObject;
#ifdef __cplusplus
#define __x_ABI_CWindows_CUI_CComposition_CIAnimationObject ABI::Windows::UI::Composition::IAnimationObject
namespace ABI {
    namespace Windows {
        namespace UI {
            namespace Composition {
                interface IAnimationObject;
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CUI_CComposition_CIColorKeyFrameAnimation_FWD_DEFINED__
#define ____x_ABI_CWindows_CUI_CComposition_CIColorKeyFrameAnimation_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CUI_CComposition_CIColorKeyFrameAnimation __x_ABI_CWindows_CUI_CComposition_CIColorKeyFrameAnimation;
#ifdef __cplusplus
#define __x_ABI_CWindows_CUI_CComposition_CIColorKeyFrameAnimation ABI::Windows::UI::Composition::IColorKeyFrameAnimation
namespace ABI {
    namespace Windows {
        namespace UI {
            namespace Composition {
                interface IColorKeyFrameAnimation;
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CUI_CComposition_CICompositionAnimation_FWD_DEFINED__
#define ____x_ABI_CWindows_CUI_CComposition_CICompositionAnimation_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CUI_CComposition_CICompositionAnimation __x_ABI_CWindows_CUI_CComposition_CICompositionAnimation;
#ifdef __cplusplus
#define __x_ABI_CWindows_CUI_CComposition_CICompositionAnimation ABI::Windows::UI::Composition::ICompositionAnimation
namespace ABI {
    namespace Windows {
        namespace UI {
            namespace Composition {
                interface ICompositionAnimation;
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CUI_CComposition_CICompositionAnimation2_FWD_DEFINED__
#define ____x_ABI_CWindows_CUI_CComposition_CICompositionAnimation2_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CUI_CComposition_CICompositionAnimation2 __x_ABI_CWindows_CUI_CComposition_CICompositionAnimation2;
#ifdef __cplusplus
#define __x_ABI_CWindows_CUI_CComposition_CICompositionAnimation2 ABI::Windows::UI::Composition::ICompositionAnimation2
namespace ABI {
    namespace Windows {
        namespace UI {
            namespace Composition {
                interface ICompositionAnimation2;
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CUI_CComposition_CICompositionAnimation3_FWD_DEFINED__
#define ____x_ABI_CWindows_CUI_CComposition_CICompositionAnimation3_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CUI_CComposition_CICompositionAnimation3 __x_ABI_CWindows_CUI_CComposition_CICompositionAnimation3;
#ifdef __cplusplus
#define __x_ABI_CWindows_CUI_CComposition_CICompositionAnimation3 ABI::Windows::UI::Composition::ICompositionAnimation3
namespace ABI {
    namespace Windows {
        namespace UI {
            namespace Composition {
                interface ICompositionAnimation3;
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CUI_CComposition_CICompositionAnimation4_FWD_DEFINED__
#define ____x_ABI_CWindows_CUI_CComposition_CICompositionAnimation4_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CUI_CComposition_CICompositionAnimation4 __x_ABI_CWindows_CUI_CComposition_CICompositionAnimation4;
#ifdef __cplusplus
#define __x_ABI_CWindows_CUI_CComposition_CICompositionAnimation4 ABI::Windows::UI::Composition::ICompositionAnimation4
namespace ABI {
    namespace Windows {
        namespace UI {
            namespace Composition {
                interface ICompositionAnimation4;
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CUI_CComposition_CICompositionAnimationBase_FWD_DEFINED__
#define ____x_ABI_CWindows_CUI_CComposition_CICompositionAnimationBase_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CUI_CComposition_CICompositionAnimationBase __x_ABI_CWindows_CUI_CComposition_CICompositionAnimationBase;
#ifdef __cplusplus
#define __x_ABI_CWindows_CUI_CComposition_CICompositionAnimationBase ABI::Windows::UI::Composition::ICompositionAnimationBase
namespace ABI {
    namespace Windows {
        namespace UI {
            namespace Composition {
                interface ICompositionAnimationBase;
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CUI_CComposition_CICompositionAnimationFactory_FWD_DEFINED__
#define ____x_ABI_CWindows_CUI_CComposition_CICompositionAnimationFactory_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CUI_CComposition_CICompositionAnimationFactory __x_ABI_CWindows_CUI_CComposition_CICompositionAnimationFactory;
#ifdef __cplusplus
#define __x_ABI_CWindows_CUI_CComposition_CICompositionAnimationFactory ABI::Windows::UI::Composition::ICompositionAnimationFactory
namespace ABI {
    namespace Windows {
        namespace UI {
            namespace Composition {
                interface ICompositionAnimationFactory;
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CUI_CComposition_CICompositionBatchCompletedEventArgs_FWD_DEFINED__
#define ____x_ABI_CWindows_CUI_CComposition_CICompositionBatchCompletedEventArgs_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CUI_CComposition_CICompositionBatchCompletedEventArgs __x_ABI_CWindows_CUI_CComposition_CICompositionBatchCompletedEventArgs;
#ifdef __cplusplus
#define __x_ABI_CWindows_CUI_CComposition_CICompositionBatchCompletedEventArgs ABI::Windows::UI::Composition::ICompositionBatchCompletedEventArgs
namespace ABI {
    namespace Windows {
        namespace UI {
            namespace Composition {
                interface ICompositionBatchCompletedEventArgs;
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CUI_CComposition_CICompositionBrush_FWD_DEFINED__
#define ____x_ABI_CWindows_CUI_CComposition_CICompositionBrush_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CUI_CComposition_CICompositionBrush __x_ABI_CWindows_CUI_CComposition_CICompositionBrush;
#ifdef __cplusplus
#define __x_ABI_CWindows_CUI_CComposition_CICompositionBrush ABI::Windows::UI::Composition::ICompositionBrush
namespace ABI {
    namespace Windows {
        namespace UI {
            namespace Composition {
                interface ICompositionBrush;
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CUI_CComposition_CICompositionBrushFactory_FWD_DEFINED__
#define ____x_ABI_CWindows_CUI_CComposition_CICompositionBrushFactory_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CUI_CComposition_CICompositionBrushFactory __x_ABI_CWindows_CUI_CComposition_CICompositionBrushFactory;
#ifdef __cplusplus
#define __x_ABI_CWindows_CUI_CComposition_CICompositionBrushFactory ABI::Windows::UI::Composition::ICompositionBrushFactory
namespace ABI {
    namespace Windows {
        namespace UI {
            namespace Composition {
                interface ICompositionBrushFactory;
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CUI_CComposition_CICompositionClip_FWD_DEFINED__
#define ____x_ABI_CWindows_CUI_CComposition_CICompositionClip_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CUI_CComposition_CICompositionClip __x_ABI_CWindows_CUI_CComposition_CICompositionClip;
#ifdef __cplusplus
#define __x_ABI_CWindows_CUI_CComposition_CICompositionClip ABI::Windows::UI::Composition::ICompositionClip
namespace ABI {
    namespace Windows {
        namespace UI {
            namespace Composition {
                interface ICompositionClip;
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CUI_CComposition_CICompositionClip2_FWD_DEFINED__
#define ____x_ABI_CWindows_CUI_CComposition_CICompositionClip2_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CUI_CComposition_CICompositionClip2 __x_ABI_CWindows_CUI_CComposition_CICompositionClip2;
#ifdef __cplusplus
#define __x_ABI_CWindows_CUI_CComposition_CICompositionClip2 ABI::Windows::UI::Composition::ICompositionClip2
namespace ABI {
    namespace Windows {
        namespace UI {
            namespace Composition {
                interface ICompositionClip2;
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CUI_CComposition_CICompositionClipFactory_FWD_DEFINED__
#define ____x_ABI_CWindows_CUI_CComposition_CICompositionClipFactory_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CUI_CComposition_CICompositionClipFactory __x_ABI_CWindows_CUI_CComposition_CICompositionClipFactory;
#ifdef __cplusplus
#define __x_ABI_CWindows_CUI_CComposition_CICompositionClipFactory ABI::Windows::UI::Composition::ICompositionClipFactory
namespace ABI {
    namespace Windows {
        namespace UI {
            namespace Composition {
                interface ICompositionClipFactory;
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CUI_CComposition_CICompositionColorBrush_FWD_DEFINED__
#define ____x_ABI_CWindows_CUI_CComposition_CICompositionColorBrush_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CUI_CComposition_CICompositionColorBrush __x_ABI_CWindows_CUI_CComposition_CICompositionColorBrush;
#ifdef __cplusplus
#define __x_ABI_CWindows_CUI_CComposition_CICompositionColorBrush ABI::Windows::UI::Composition::ICompositionColorBrush
namespace ABI {
    namespace Windows {
        namespace UI {
            namespace Composition {
                interface ICompositionColorBrush;
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CUI_CComposition_CICompositionCommitBatch_FWD_DEFINED__
#define ____x_ABI_CWindows_CUI_CComposition_CICompositionCommitBatch_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CUI_CComposition_CICompositionCommitBatch __x_ABI_CWindows_CUI_CComposition_CICompositionCommitBatch;
#ifdef __cplusplus
#define __x_ABI_CWindows_CUI_CComposition_CICompositionCommitBatch ABI::Windows::UI::Composition::ICompositionCommitBatch
namespace ABI {
    namespace Windows {
        namespace UI {
            namespace Composition {
                interface ICompositionCommitBatch;
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CUI_CComposition_CICompositionDrawingSurface_FWD_DEFINED__
#define ____x_ABI_CWindows_CUI_CComposition_CICompositionDrawingSurface_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CUI_CComposition_CICompositionDrawingSurface __x_ABI_CWindows_CUI_CComposition_CICompositionDrawingSurface;
#ifdef __cplusplus
#define __x_ABI_CWindows_CUI_CComposition_CICompositionDrawingSurface ABI::Windows::UI::Composition::ICompositionDrawingSurface
namespace ABI {
    namespace Windows {
        namespace UI {
            namespace Composition {
                interface ICompositionDrawingSurface;
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CUI_CComposition_CICompositionDrawingSurface2_FWD_DEFINED__
#define ____x_ABI_CWindows_CUI_CComposition_CICompositionDrawingSurface2_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CUI_CComposition_CICompositionDrawingSurface2 __x_ABI_CWindows_CUI_CComposition_CICompositionDrawingSurface2;
#ifdef __cplusplus
#define __x_ABI_CWindows_CUI_CComposition_CICompositionDrawingSurface2 ABI::Windows::UI::Composition::ICompositionDrawingSurface2
namespace ABI {
    namespace Windows {
        namespace UI {
            namespace Composition {
                interface ICompositionDrawingSurface2;
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CUI_CComposition_CICompositionDrawingSurfaceFactory_FWD_DEFINED__
#define ____x_ABI_CWindows_CUI_CComposition_CICompositionDrawingSurfaceFactory_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CUI_CComposition_CICompositionDrawingSurfaceFactory __x_ABI_CWindows_CUI_CComposition_CICompositionDrawingSurfaceFactory;
#ifdef __cplusplus
#define __x_ABI_CWindows_CUI_CComposition_CICompositionDrawingSurfaceFactory ABI::Windows::UI::Composition::ICompositionDrawingSurfaceFactory
namespace ABI {
    namespace Windows {
        namespace UI {
            namespace Composition {
                interface ICompositionDrawingSurfaceFactory;
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CUI_CComposition_CICompositionEasingFunction_FWD_DEFINED__
#define ____x_ABI_CWindows_CUI_CComposition_CICompositionEasingFunction_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CUI_CComposition_CICompositionEasingFunction __x_ABI_CWindows_CUI_CComposition_CICompositionEasingFunction;
#ifdef __cplusplus
#define __x_ABI_CWindows_CUI_CComposition_CICompositionEasingFunction ABI::Windows::UI::Composition::ICompositionEasingFunction
namespace ABI {
    namespace Windows {
        namespace UI {
            namespace Composition {
                interface ICompositionEasingFunction;
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CUI_CComposition_CICompositionEasingFunctionFactory_FWD_DEFINED__
#define ____x_ABI_CWindows_CUI_CComposition_CICompositionEasingFunctionFactory_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CUI_CComposition_CICompositionEasingFunctionFactory __x_ABI_CWindows_CUI_CComposition_CICompositionEasingFunctionFactory;
#ifdef __cplusplus
#define __x_ABI_CWindows_CUI_CComposition_CICompositionEasingFunctionFactory ABI::Windows::UI::Composition::ICompositionEasingFunctionFactory
namespace ABI {
    namespace Windows {
        namespace UI {
            namespace Composition {
                interface ICompositionEasingFunctionFactory;
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CUI_CComposition_CICompositionEasingFunctionStatics_FWD_DEFINED__
#define ____x_ABI_CWindows_CUI_CComposition_CICompositionEasingFunctionStatics_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CUI_CComposition_CICompositionEasingFunctionStatics __x_ABI_CWindows_CUI_CComposition_CICompositionEasingFunctionStatics;
#ifdef __cplusplus
#define __x_ABI_CWindows_CUI_CComposition_CICompositionEasingFunctionStatics ABI::Windows::UI::Composition::ICompositionEasingFunctionStatics
namespace ABI {
    namespace Windows {
        namespace UI {
            namespace Composition {
                interface ICompositionEasingFunctionStatics;
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CUI_CComposition_CICompositionEffectBrush_FWD_DEFINED__
#define ____x_ABI_CWindows_CUI_CComposition_CICompositionEffectBrush_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CUI_CComposition_CICompositionEffectBrush __x_ABI_CWindows_CUI_CComposition_CICompositionEffectBrush;
#ifdef __cplusplus
#define __x_ABI_CWindows_CUI_CComposition_CICompositionEffectBrush ABI::Windows::UI::Composition::ICompositionEffectBrush
namespace ABI {
    namespace Windows {
        namespace UI {
            namespace Composition {
                interface ICompositionEffectBrush;
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CUI_CComposition_CICompositionEffectFactory_FWD_DEFINED__
#define ____x_ABI_CWindows_CUI_CComposition_CICompositionEffectFactory_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CUI_CComposition_CICompositionEffectFactory __x_ABI_CWindows_CUI_CComposition_CICompositionEffectFactory;
#ifdef __cplusplus
#define __x_ABI_CWindows_CUI_CComposition_CICompositionEffectFactory ABI::Windows::UI::Composition::ICompositionEffectFactory
namespace ABI {
    namespace Windows {
        namespace UI {
            namespace Composition {
                interface ICompositionEffectFactory;
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CUI_CComposition_CICompositionGraphicsDevice_FWD_DEFINED__
#define ____x_ABI_CWindows_CUI_CComposition_CICompositionGraphicsDevice_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CUI_CComposition_CICompositionGraphicsDevice __x_ABI_CWindows_CUI_CComposition_CICompositionGraphicsDevice;
#ifdef __cplusplus
#define __x_ABI_CWindows_CUI_CComposition_CICompositionGraphicsDevice ABI::Windows::UI::Composition::ICompositionGraphicsDevice
namespace ABI {
    namespace Windows {
        namespace UI {
            namespace Composition {
                interface ICompositionGraphicsDevice;
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CUI_CComposition_CICompositionGraphicsDevice2_FWD_DEFINED__
#define ____x_ABI_CWindows_CUI_CComposition_CICompositionGraphicsDevice2_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CUI_CComposition_CICompositionGraphicsDevice2 __x_ABI_CWindows_CUI_CComposition_CICompositionGraphicsDevice2;
#ifdef __cplusplus
#define __x_ABI_CWindows_CUI_CComposition_CICompositionGraphicsDevice2 ABI::Windows::UI::Composition::ICompositionGraphicsDevice2
namespace ABI {
    namespace Windows {
        namespace UI {
            namespace Composition {
                interface ICompositionGraphicsDevice2;
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CUI_CComposition_CICompositionGraphicsDevice3_FWD_DEFINED__
#define ____x_ABI_CWindows_CUI_CComposition_CICompositionGraphicsDevice3_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CUI_CComposition_CICompositionGraphicsDevice3 __x_ABI_CWindows_CUI_CComposition_CICompositionGraphicsDevice3;
#ifdef __cplusplus
#define __x_ABI_CWindows_CUI_CComposition_CICompositionGraphicsDevice3 ABI::Windows::UI::Composition::ICompositionGraphicsDevice3
namespace ABI {
    namespace Windows {
        namespace UI {
            namespace Composition {
                interface ICompositionGraphicsDevice3;
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CUI_CComposition_CICompositionGraphicsDevice4_FWD_DEFINED__
#define ____x_ABI_CWindows_CUI_CComposition_CICompositionGraphicsDevice4_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CUI_CComposition_CICompositionGraphicsDevice4 __x_ABI_CWindows_CUI_CComposition_CICompositionGraphicsDevice4;
#ifdef __cplusplus
#define __x_ABI_CWindows_CUI_CComposition_CICompositionGraphicsDevice4 ABI::Windows::UI::Composition::ICompositionGraphicsDevice4
namespace ABI {
    namespace Windows {
        namespace UI {
            namespace Composition {
                interface ICompositionGraphicsDevice4;
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CUI_CComposition_CICompositionObject_FWD_DEFINED__
#define ____x_ABI_CWindows_CUI_CComposition_CICompositionObject_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CUI_CComposition_CICompositionObject __x_ABI_CWindows_CUI_CComposition_CICompositionObject;
#ifdef __cplusplus
#define __x_ABI_CWindows_CUI_CComposition_CICompositionObject ABI::Windows::UI::Composition::ICompositionObject
namespace ABI {
    namespace Windows {
        namespace UI {
            namespace Composition {
                interface ICompositionObject;
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CUI_CComposition_CICompositionObject2_FWD_DEFINED__
#define ____x_ABI_CWindows_CUI_CComposition_CICompositionObject2_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CUI_CComposition_CICompositionObject2 __x_ABI_CWindows_CUI_CComposition_CICompositionObject2;
#ifdef __cplusplus
#define __x_ABI_CWindows_CUI_CComposition_CICompositionObject2 ABI::Windows::UI::Composition::ICompositionObject2
namespace ABI {
    namespace Windows {
        namespace UI {
            namespace Composition {
                interface ICompositionObject2;
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CUI_CComposition_CICompositionObject3_FWD_DEFINED__
#define ____x_ABI_CWindows_CUI_CComposition_CICompositionObject3_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CUI_CComposition_CICompositionObject3 __x_ABI_CWindows_CUI_CComposition_CICompositionObject3;
#ifdef __cplusplus
#define __x_ABI_CWindows_CUI_CComposition_CICompositionObject3 ABI::Windows::UI::Composition::ICompositionObject3
namespace ABI {
    namespace Windows {
        namespace UI {
            namespace Composition {
                interface ICompositionObject3;
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CUI_CComposition_CICompositionObject4_FWD_DEFINED__
#define ____x_ABI_CWindows_CUI_CComposition_CICompositionObject4_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CUI_CComposition_CICompositionObject4 __x_ABI_CWindows_CUI_CComposition_CICompositionObject4;
#ifdef __cplusplus
#define __x_ABI_CWindows_CUI_CComposition_CICompositionObject4 ABI::Windows::UI::Composition::ICompositionObject4
namespace ABI {
    namespace Windows {
        namespace UI {
            namespace Composition {
                interface ICompositionObject4;
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CUI_CComposition_CICompositionObjectFactory_FWD_DEFINED__
#define ____x_ABI_CWindows_CUI_CComposition_CICompositionObjectFactory_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CUI_CComposition_CICompositionObjectFactory __x_ABI_CWindows_CUI_CComposition_CICompositionObjectFactory;
#ifdef __cplusplus
#define __x_ABI_CWindows_CUI_CComposition_CICompositionObjectFactory ABI::Windows::UI::Composition::ICompositionObjectFactory
namespace ABI {
    namespace Windows {
        namespace UI {
            namespace Composition {
                interface ICompositionObjectFactory;
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CUI_CComposition_CICompositionObjectStatics_FWD_DEFINED__
#define ____x_ABI_CWindows_CUI_CComposition_CICompositionObjectStatics_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CUI_CComposition_CICompositionObjectStatics __x_ABI_CWindows_CUI_CComposition_CICompositionObjectStatics;
#ifdef __cplusplus
#define __x_ABI_CWindows_CUI_CComposition_CICompositionObjectStatics ABI::Windows::UI::Composition::ICompositionObjectStatics
namespace ABI {
    namespace Windows {
        namespace UI {
            namespace Composition {
                interface ICompositionObjectStatics;
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CUI_CComposition_CICompositionPropertySet_FWD_DEFINED__
#define ____x_ABI_CWindows_CUI_CComposition_CICompositionPropertySet_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CUI_CComposition_CICompositionPropertySet __x_ABI_CWindows_CUI_CComposition_CICompositionPropertySet;
#ifdef __cplusplus
#define __x_ABI_CWindows_CUI_CComposition_CICompositionPropertySet ABI::Windows::UI::Composition::ICompositionPropertySet
namespace ABI {
    namespace Windows {
        namespace UI {
            namespace Composition {
                interface ICompositionPropertySet;
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CUI_CComposition_CICompositionPropertySet2_FWD_DEFINED__
#define ____x_ABI_CWindows_CUI_CComposition_CICompositionPropertySet2_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CUI_CComposition_CICompositionPropertySet2 __x_ABI_CWindows_CUI_CComposition_CICompositionPropertySet2;
#ifdef __cplusplus
#define __x_ABI_CWindows_CUI_CComposition_CICompositionPropertySet2 ABI::Windows::UI::Composition::ICompositionPropertySet2
namespace ABI {
    namespace Windows {
        namespace UI {
            namespace Composition {
                interface ICompositionPropertySet2;
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CUI_CComposition_CICompositionScopedBatch_FWD_DEFINED__
#define ____x_ABI_CWindows_CUI_CComposition_CICompositionScopedBatch_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CUI_CComposition_CICompositionScopedBatch __x_ABI_CWindows_CUI_CComposition_CICompositionScopedBatch;
#ifdef __cplusplus
#define __x_ABI_CWindows_CUI_CComposition_CICompositionScopedBatch ABI::Windows::UI::Composition::ICompositionScopedBatch
namespace ABI {
    namespace Windows {
        namespace UI {
            namespace Composition {
                interface ICompositionScopedBatch;
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CUI_CComposition_CICompositionSurface_FWD_DEFINED__
#define ____x_ABI_CWindows_CUI_CComposition_CICompositionSurface_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CUI_CComposition_CICompositionSurface __x_ABI_CWindows_CUI_CComposition_CICompositionSurface;
#ifdef __cplusplus
#define __x_ABI_CWindows_CUI_CComposition_CICompositionSurface ABI::Windows::UI::Composition::ICompositionSurface
namespace ABI {
    namespace Windows {
        namespace UI {
            namespace Composition {
                interface ICompositionSurface;
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CUI_CComposition_CICompositionSurfaceBrush_FWD_DEFINED__
#define ____x_ABI_CWindows_CUI_CComposition_CICompositionSurfaceBrush_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CUI_CComposition_CICompositionSurfaceBrush __x_ABI_CWindows_CUI_CComposition_CICompositionSurfaceBrush;
#ifdef __cplusplus
#define __x_ABI_CWindows_CUI_CComposition_CICompositionSurfaceBrush ABI::Windows::UI::Composition::ICompositionSurfaceBrush
namespace ABI {
    namespace Windows {
        namespace UI {
            namespace Composition {
                interface ICompositionSurfaceBrush;
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CUI_CComposition_CICompositionSurfaceBrush2_FWD_DEFINED__
#define ____x_ABI_CWindows_CUI_CComposition_CICompositionSurfaceBrush2_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CUI_CComposition_CICompositionSurfaceBrush2 __x_ABI_CWindows_CUI_CComposition_CICompositionSurfaceBrush2;
#ifdef __cplusplus
#define __x_ABI_CWindows_CUI_CComposition_CICompositionSurfaceBrush2 ABI::Windows::UI::Composition::ICompositionSurfaceBrush2
namespace ABI {
    namespace Windows {
        namespace UI {
            namespace Composition {
                interface ICompositionSurfaceBrush2;
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CUI_CComposition_CICompositionSurfaceBrush3_FWD_DEFINED__
#define ____x_ABI_CWindows_CUI_CComposition_CICompositionSurfaceBrush3_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CUI_CComposition_CICompositionSurfaceBrush3 __x_ABI_CWindows_CUI_CComposition_CICompositionSurfaceBrush3;
#ifdef __cplusplus
#define __x_ABI_CWindows_CUI_CComposition_CICompositionSurfaceBrush3 ABI::Windows::UI::Composition::ICompositionSurfaceBrush3
namespace ABI {
    namespace Windows {
        namespace UI {
            namespace Composition {
                interface ICompositionSurfaceBrush3;
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CUI_CComposition_CICompositionTarget_FWD_DEFINED__
#define ____x_ABI_CWindows_CUI_CComposition_CICompositionTarget_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CUI_CComposition_CICompositionTarget __x_ABI_CWindows_CUI_CComposition_CICompositionTarget;
#ifdef __cplusplus
#define __x_ABI_CWindows_CUI_CComposition_CICompositionTarget ABI::Windows::UI::Composition::ICompositionTarget
namespace ABI {
    namespace Windows {
        namespace UI {
            namespace Composition {
                interface ICompositionTarget;
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CUI_CComposition_CICompositionTargetFactory_FWD_DEFINED__
#define ____x_ABI_CWindows_CUI_CComposition_CICompositionTargetFactory_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CUI_CComposition_CICompositionTargetFactory __x_ABI_CWindows_CUI_CComposition_CICompositionTargetFactory;
#ifdef __cplusplus
#define __x_ABI_CWindows_CUI_CComposition_CICompositionTargetFactory ABI::Windows::UI::Composition::ICompositionTargetFactory
namespace ABI {
    namespace Windows {
        namespace UI {
            namespace Composition {
                interface ICompositionTargetFactory;
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CUI_CComposition_CICompositor_FWD_DEFINED__
#define ____x_ABI_CWindows_CUI_CComposition_CICompositor_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CUI_CComposition_CICompositor __x_ABI_CWindows_CUI_CComposition_CICompositor;
#ifdef __cplusplus
#define __x_ABI_CWindows_CUI_CComposition_CICompositor ABI::Windows::UI::Composition::ICompositor
namespace ABI {
    namespace Windows {
        namespace UI {
            namespace Composition {
                interface ICompositor;
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CUI_CComposition_CICompositor2_FWD_DEFINED__
#define ____x_ABI_CWindows_CUI_CComposition_CICompositor2_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CUI_CComposition_CICompositor2 __x_ABI_CWindows_CUI_CComposition_CICompositor2;
#ifdef __cplusplus
#define __x_ABI_CWindows_CUI_CComposition_CICompositor2 ABI::Windows::UI::Composition::ICompositor2
namespace ABI {
    namespace Windows {
        namespace UI {
            namespace Composition {
                interface ICompositor2;
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CUI_CComposition_CICompositor3_FWD_DEFINED__
#define ____x_ABI_CWindows_CUI_CComposition_CICompositor3_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CUI_CComposition_CICompositor3 __x_ABI_CWindows_CUI_CComposition_CICompositor3;
#ifdef __cplusplus
#define __x_ABI_CWindows_CUI_CComposition_CICompositor3 ABI::Windows::UI::Composition::ICompositor3
namespace ABI {
    namespace Windows {
        namespace UI {
            namespace Composition {
                interface ICompositor3;
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CUI_CComposition_CICompositor4_FWD_DEFINED__
#define ____x_ABI_CWindows_CUI_CComposition_CICompositor4_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CUI_CComposition_CICompositor4 __x_ABI_CWindows_CUI_CComposition_CICompositor4;
#ifdef __cplusplus
#define __x_ABI_CWindows_CUI_CComposition_CICompositor4 ABI::Windows::UI::Composition::ICompositor4
namespace ABI {
    namespace Windows {
        namespace UI {
            namespace Composition {
                interface ICompositor4;
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CUI_CComposition_CICompositor5_FWD_DEFINED__
#define ____x_ABI_CWindows_CUI_CComposition_CICompositor5_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CUI_CComposition_CICompositor5 __x_ABI_CWindows_CUI_CComposition_CICompositor5;
#ifdef __cplusplus
#define __x_ABI_CWindows_CUI_CComposition_CICompositor5 ABI::Windows::UI::Composition::ICompositor5
namespace ABI {
    namespace Windows {
        namespace UI {
            namespace Composition {
                interface ICompositor5;
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CUI_CComposition_CICompositor6_FWD_DEFINED__
#define ____x_ABI_CWindows_CUI_CComposition_CICompositor6_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CUI_CComposition_CICompositor6 __x_ABI_CWindows_CUI_CComposition_CICompositor6;
#ifdef __cplusplus
#define __x_ABI_CWindows_CUI_CComposition_CICompositor6 ABI::Windows::UI::Composition::ICompositor6
namespace ABI {
    namespace Windows {
        namespace UI {
            namespace Composition {
                interface ICompositor6;
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CUI_CComposition_CICompositor7_FWD_DEFINED__
#define ____x_ABI_CWindows_CUI_CComposition_CICompositor7_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CUI_CComposition_CICompositor7 __x_ABI_CWindows_CUI_CComposition_CICompositor7;
#ifdef __cplusplus
#define __x_ABI_CWindows_CUI_CComposition_CICompositor7 ABI::Windows::UI::Composition::ICompositor7
namespace ABI {
    namespace Windows {
        namespace UI {
            namespace Composition {
                interface ICompositor7;
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CUI_CComposition_CICompositorStatics_FWD_DEFINED__
#define ____x_ABI_CWindows_CUI_CComposition_CICompositorStatics_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CUI_CComposition_CICompositorStatics __x_ABI_CWindows_CUI_CComposition_CICompositorStatics;
#ifdef __cplusplus
#define __x_ABI_CWindows_CUI_CComposition_CICompositorStatics ABI::Windows::UI::Composition::ICompositorStatics
namespace ABI {
    namespace Windows {
        namespace UI {
            namespace Composition {
                interface ICompositorStatics;
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CUI_CComposition_CICompositorWithBlurredWallpaperBackdropBrush_FWD_DEFINED__
#define ____x_ABI_CWindows_CUI_CComposition_CICompositorWithBlurredWallpaperBackdropBrush_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CUI_CComposition_CICompositorWithBlurredWallpaperBackdropBrush __x_ABI_CWindows_CUI_CComposition_CICompositorWithBlurredWallpaperBackdropBrush;
#ifdef __cplusplus
#define __x_ABI_CWindows_CUI_CComposition_CICompositorWithBlurredWallpaperBackdropBrush ABI::Windows::UI::Composition::ICompositorWithBlurredWallpaperBackdropBrush
namespace ABI {
    namespace Windows {
        namespace UI {
            namespace Composition {
                interface ICompositorWithBlurredWallpaperBackdropBrush;
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CUI_CComposition_CICompositorWithProjectedShadow_FWD_DEFINED__
#define ____x_ABI_CWindows_CUI_CComposition_CICompositorWithProjectedShadow_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CUI_CComposition_CICompositorWithProjectedShadow __x_ABI_CWindows_CUI_CComposition_CICompositorWithProjectedShadow;
#ifdef __cplusplus
#define __x_ABI_CWindows_CUI_CComposition_CICompositorWithProjectedShadow ABI::Windows::UI::Composition::ICompositorWithProjectedShadow
namespace ABI {
    namespace Windows {
        namespace UI {
            namespace Composition {
                interface ICompositorWithProjectedShadow;
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CUI_CComposition_CICompositorWithRadialGradient_FWD_DEFINED__
#define ____x_ABI_CWindows_CUI_CComposition_CICompositorWithRadialGradient_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CUI_CComposition_CICompositorWithRadialGradient __x_ABI_CWindows_CUI_CComposition_CICompositorWithRadialGradient;
#ifdef __cplusplus
#define __x_ABI_CWindows_CUI_CComposition_CICompositorWithRadialGradient ABI::Windows::UI::Composition::ICompositorWithRadialGradient
namespace ABI {
    namespace Windows {
        namespace UI {
            namespace Composition {
                interface ICompositorWithRadialGradient;
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CUI_CComposition_CICompositorWithVisualSurface_FWD_DEFINED__
#define ____x_ABI_CWindows_CUI_CComposition_CICompositorWithVisualSurface_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CUI_CComposition_CICompositorWithVisualSurface __x_ABI_CWindows_CUI_CComposition_CICompositorWithVisualSurface;
#ifdef __cplusplus
#define __x_ABI_CWindows_CUI_CComposition_CICompositorWithVisualSurface ABI::Windows::UI::Composition::ICompositorWithVisualSurface
namespace ABI {
    namespace Windows {
        namespace UI {
            namespace Composition {
                interface ICompositorWithVisualSurface;
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CUI_CComposition_CIContainerVisual_FWD_DEFINED__
#define ____x_ABI_CWindows_CUI_CComposition_CIContainerVisual_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CUI_CComposition_CIContainerVisual __x_ABI_CWindows_CUI_CComposition_CIContainerVisual;
#ifdef __cplusplus
#define __x_ABI_CWindows_CUI_CComposition_CIContainerVisual ABI::Windows::UI::Composition::IContainerVisual
namespace ABI {
    namespace Windows {
        namespace UI {
            namespace Composition {
                interface IContainerVisual;
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CUI_CComposition_CIContainerVisualFactory_FWD_DEFINED__
#define ____x_ABI_CWindows_CUI_CComposition_CIContainerVisualFactory_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CUI_CComposition_CIContainerVisualFactory __x_ABI_CWindows_CUI_CComposition_CIContainerVisualFactory;
#ifdef __cplusplus
#define __x_ABI_CWindows_CUI_CComposition_CIContainerVisualFactory ABI::Windows::UI::Composition::IContainerVisualFactory
namespace ABI {
    namespace Windows {
        namespace UI {
            namespace Composition {
                interface IContainerVisualFactory;
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CUI_CComposition_CICubicBezierEasingFunction_FWD_DEFINED__
#define ____x_ABI_CWindows_CUI_CComposition_CICubicBezierEasingFunction_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CUI_CComposition_CICubicBezierEasingFunction __x_ABI_CWindows_CUI_CComposition_CICubicBezierEasingFunction;
#ifdef __cplusplus
#define __x_ABI_CWindows_CUI_CComposition_CICubicBezierEasingFunction ABI::Windows::UI::Composition::ICubicBezierEasingFunction
namespace ABI {
    namespace Windows {
        namespace UI {
            namespace Composition {
                interface ICubicBezierEasingFunction;
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CUI_CComposition_CIExpressionAnimation_FWD_DEFINED__
#define ____x_ABI_CWindows_CUI_CComposition_CIExpressionAnimation_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CUI_CComposition_CIExpressionAnimation __x_ABI_CWindows_CUI_CComposition_CIExpressionAnimation;
#ifdef __cplusplus
#define __x_ABI_CWindows_CUI_CComposition_CIExpressionAnimation ABI::Windows::UI::Composition::IExpressionAnimation
namespace ABI {
    namespace Windows {
        namespace UI {
            namespace Composition {
                interface IExpressionAnimation;
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CUI_CComposition_CIInsetClip_FWD_DEFINED__
#define ____x_ABI_CWindows_CUI_CComposition_CIInsetClip_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CUI_CComposition_CIInsetClip __x_ABI_CWindows_CUI_CComposition_CIInsetClip;
#ifdef __cplusplus
#define __x_ABI_CWindows_CUI_CComposition_CIInsetClip ABI::Windows::UI::Composition::IInsetClip
namespace ABI {
    namespace Windows {
        namespace UI {
            namespace Composition {
                interface IInsetClip;
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CUI_CComposition_CILinearEasingFunction_FWD_DEFINED__
#define ____x_ABI_CWindows_CUI_CComposition_CILinearEasingFunction_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CUI_CComposition_CILinearEasingFunction __x_ABI_CWindows_CUI_CComposition_CILinearEasingFunction;
#ifdef __cplusplus
#define __x_ABI_CWindows_CUI_CComposition_CILinearEasingFunction ABI::Windows::UI::Composition::ILinearEasingFunction
namespace ABI {
    namespace Windows {
        namespace UI {
            namespace Composition {
                interface ILinearEasingFunction;
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CUI_CComposition_CIQuaternionKeyFrameAnimation_FWD_DEFINED__
#define ____x_ABI_CWindows_CUI_CComposition_CIQuaternionKeyFrameAnimation_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CUI_CComposition_CIQuaternionKeyFrameAnimation __x_ABI_CWindows_CUI_CComposition_CIQuaternionKeyFrameAnimation;
#ifdef __cplusplus
#define __x_ABI_CWindows_CUI_CComposition_CIQuaternionKeyFrameAnimation ABI::Windows::UI::Composition::IQuaternionKeyFrameAnimation
namespace ABI {
    namespace Windows {
        namespace UI {
            namespace Composition {
                interface IQuaternionKeyFrameAnimation;
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CUI_CComposition_CIRenderingDeviceReplacedEventArgs_FWD_DEFINED__
#define ____x_ABI_CWindows_CUI_CComposition_CIRenderingDeviceReplacedEventArgs_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CUI_CComposition_CIRenderingDeviceReplacedEventArgs __x_ABI_CWindows_CUI_CComposition_CIRenderingDeviceReplacedEventArgs;
#ifdef __cplusplus
#define __x_ABI_CWindows_CUI_CComposition_CIRenderingDeviceReplacedEventArgs ABI::Windows::UI::Composition::IRenderingDeviceReplacedEventArgs
namespace ABI {
    namespace Windows {
        namespace UI {
            namespace Composition {
                interface IRenderingDeviceReplacedEventArgs;
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CUI_CComposition_CIScalarKeyFrameAnimation_FWD_DEFINED__
#define ____x_ABI_CWindows_CUI_CComposition_CIScalarKeyFrameAnimation_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CUI_CComposition_CIScalarKeyFrameAnimation __x_ABI_CWindows_CUI_CComposition_CIScalarKeyFrameAnimation;
#ifdef __cplusplus
#define __x_ABI_CWindows_CUI_CComposition_CIScalarKeyFrameAnimation ABI::Windows::UI::Composition::IScalarKeyFrameAnimation
namespace ABI {
    namespace Windows {
        namespace UI {
            namespace Composition {
                interface IScalarKeyFrameAnimation;
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CUI_CComposition_CISpriteVisual_FWD_DEFINED__
#define ____x_ABI_CWindows_CUI_CComposition_CISpriteVisual_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CUI_CComposition_CISpriteVisual __x_ABI_CWindows_CUI_CComposition_CISpriteVisual;
#ifdef __cplusplus
#define __x_ABI_CWindows_CUI_CComposition_CISpriteVisual ABI::Windows::UI::Composition::ISpriteVisual
namespace ABI {
    namespace Windows {
        namespace UI {
            namespace Composition {
                interface ISpriteVisual;
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CUI_CComposition_CISpriteVisual2_FWD_DEFINED__
#define ____x_ABI_CWindows_CUI_CComposition_CISpriteVisual2_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CUI_CComposition_CISpriteVisual2 __x_ABI_CWindows_CUI_CComposition_CISpriteVisual2;
#ifdef __cplusplus
#define __x_ABI_CWindows_CUI_CComposition_CISpriteVisual2 ABI::Windows::UI::Composition::ISpriteVisual2
namespace ABI {
    namespace Windows {
        namespace UI {
            namespace Composition {
                interface ISpriteVisual2;
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CUI_CComposition_CIVector2KeyFrameAnimation_FWD_DEFINED__
#define ____x_ABI_CWindows_CUI_CComposition_CIVector2KeyFrameAnimation_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CUI_CComposition_CIVector2KeyFrameAnimation __x_ABI_CWindows_CUI_CComposition_CIVector2KeyFrameAnimation;
#ifdef __cplusplus
#define __x_ABI_CWindows_CUI_CComposition_CIVector2KeyFrameAnimation ABI::Windows::UI::Composition::IVector2KeyFrameAnimation
namespace ABI {
    namespace Windows {
        namespace UI {
            namespace Composition {
                interface IVector2KeyFrameAnimation;
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CUI_CComposition_CIVector3KeyFrameAnimation_FWD_DEFINED__
#define ____x_ABI_CWindows_CUI_CComposition_CIVector3KeyFrameAnimation_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CUI_CComposition_CIVector3KeyFrameAnimation __x_ABI_CWindows_CUI_CComposition_CIVector3KeyFrameAnimation;
#ifdef __cplusplus
#define __x_ABI_CWindows_CUI_CComposition_CIVector3KeyFrameAnimation ABI::Windows::UI::Composition::IVector3KeyFrameAnimation
namespace ABI {
    namespace Windows {
        namespace UI {
            namespace Composition {
                interface IVector3KeyFrameAnimation;
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CUI_CComposition_CIVector4KeyFrameAnimation_FWD_DEFINED__
#define ____x_ABI_CWindows_CUI_CComposition_CIVector4KeyFrameAnimation_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CUI_CComposition_CIVector4KeyFrameAnimation __x_ABI_CWindows_CUI_CComposition_CIVector4KeyFrameAnimation;
#ifdef __cplusplus
#define __x_ABI_CWindows_CUI_CComposition_CIVector4KeyFrameAnimation ABI::Windows::UI::Composition::IVector4KeyFrameAnimation
namespace ABI {
    namespace Windows {
        namespace UI {
            namespace Composition {
                interface IVector4KeyFrameAnimation;
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CUI_CComposition_CIVisual_FWD_DEFINED__
#define ____x_ABI_CWindows_CUI_CComposition_CIVisual_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CUI_CComposition_CIVisual __x_ABI_CWindows_CUI_CComposition_CIVisual;
#ifdef __cplusplus
#define __x_ABI_CWindows_CUI_CComposition_CIVisual ABI::Windows::UI::Composition::IVisual
namespace ABI {
    namespace Windows {
        namespace UI {
            namespace Composition {
                interface IVisual;
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CUI_CComposition_CIVisual2_FWD_DEFINED__
#define ____x_ABI_CWindows_CUI_CComposition_CIVisual2_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CUI_CComposition_CIVisual2 __x_ABI_CWindows_CUI_CComposition_CIVisual2;
#ifdef __cplusplus
#define __x_ABI_CWindows_CUI_CComposition_CIVisual2 ABI::Windows::UI::Composition::IVisual2
namespace ABI {
    namespace Windows {
        namespace UI {
            namespace Composition {
                interface IVisual2;
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CUI_CComposition_CIVisual3_FWD_DEFINED__
#define ____x_ABI_CWindows_CUI_CComposition_CIVisual3_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CUI_CComposition_CIVisual3 __x_ABI_CWindows_CUI_CComposition_CIVisual3;
#ifdef __cplusplus
#define __x_ABI_CWindows_CUI_CComposition_CIVisual3 ABI::Windows::UI::Composition::IVisual3
namespace ABI {
    namespace Windows {
        namespace UI {
            namespace Composition {
                interface IVisual3;
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CUI_CComposition_CIVisual4_FWD_DEFINED__
#define ____x_ABI_CWindows_CUI_CComposition_CIVisual4_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CUI_CComposition_CIVisual4 __x_ABI_CWindows_CUI_CComposition_CIVisual4;
#ifdef __cplusplus
#define __x_ABI_CWindows_CUI_CComposition_CIVisual4 ABI::Windows::UI::Composition::IVisual4
namespace ABI {
    namespace Windows {
        namespace UI {
            namespace Composition {
                interface IVisual4;
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CUI_CComposition_CIVisualCollection_FWD_DEFINED__
#define ____x_ABI_CWindows_CUI_CComposition_CIVisualCollection_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CUI_CComposition_CIVisualCollection __x_ABI_CWindows_CUI_CComposition_CIVisualCollection;
#ifdef __cplusplus
#define __x_ABI_CWindows_CUI_CComposition_CIVisualCollection ABI::Windows::UI::Composition::IVisualCollection
namespace ABI {
    namespace Windows {
        namespace UI {
            namespace Composition {
                interface IVisualCollection;
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CUI_CComposition_CIVisualFactory_FWD_DEFINED__
#define ____x_ABI_CWindows_CUI_CComposition_CIVisualFactory_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CUI_CComposition_CIVisualFactory __x_ABI_CWindows_CUI_CComposition_CIVisualFactory;
#ifdef __cplusplus
#define __x_ABI_CWindows_CUI_CComposition_CIVisualFactory ABI::Windows::UI::Composition::IVisualFactory
namespace ABI {
    namespace Windows {
        namespace UI {
            namespace Composition {
                interface IVisualFactory;
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____FIAsyncOperation_1_Windows__CUI__CComposition__CICompositionSurface_FWD_DEFINED__
#define ____FIAsyncOperation_1_Windows__CUI__CComposition__CICompositionSurface_FWD_DEFINED__
typedef interface __FIAsyncOperation_1_Windows__CUI__CComposition__CICompositionSurface __FIAsyncOperation_1_Windows__CUI__CComposition__CICompositionSurface;
#ifdef __cplusplus
#define __FIAsyncOperation_1_Windows__CUI__CComposition__CICompositionSurface ABI::Windows::Foundation::IAsyncOperation<ABI::Windows::UI::Composition::ICompositionSurface* >
#endif /* __cplusplus */
#endif

#ifndef ____FIIterable_1_Windows__CUI__CComposition__CCompositionAnimation_FWD_DEFINED__
#define ____FIIterable_1_Windows__CUI__CComposition__CCompositionAnimation_FWD_DEFINED__
typedef interface __FIIterable_1_Windows__CUI__CComposition__CCompositionAnimation __FIIterable_1_Windows__CUI__CComposition__CCompositionAnimation;
#ifdef __cplusplus
#define __FIIterable_1_Windows__CUI__CComposition__CCompositionAnimation ABI::Windows::Foundation::Collections::IIterable<ABI::Windows::UI::Composition::CompositionAnimation* >
#endif /* __cplusplus */
#endif

#ifndef ____FIIterable_1_Windows__CUI__CComposition__CVisual_FWD_DEFINED__
#define ____FIIterable_1_Windows__CUI__CComposition__CVisual_FWD_DEFINED__
typedef interface __FIIterable_1_Windows__CUI__CComposition__CVisual __FIIterable_1_Windows__CUI__CComposition__CVisual;
#ifdef __cplusplus
#define __FIIterable_1_Windows__CUI__CComposition__CVisual ABI::Windows::Foundation::Collections::IIterable<ABI::Windows::UI::Composition::Visual* >
#endif /* __cplusplus */
#endif

#ifndef ____FIIterator_1_Windows__CUI__CComposition__CCompositionAnimation_FWD_DEFINED__
#define ____FIIterator_1_Windows__CUI__CComposition__CCompositionAnimation_FWD_DEFINED__
typedef interface __FIIterator_1_Windows__CUI__CComposition__CCompositionAnimation __FIIterator_1_Windows__CUI__CComposition__CCompositionAnimation;
#ifdef __cplusplus
#define __FIIterator_1_Windows__CUI__CComposition__CCompositionAnimation ABI::Windows::Foundation::Collections::IIterator<ABI::Windows::UI::Composition::CompositionAnimation* >
#endif /* __cplusplus */
#endif

#ifndef ____FIIterator_1_Windows__CUI__CComposition__CVisual_FWD_DEFINED__
#define ____FIIterator_1_Windows__CUI__CComposition__CVisual_FWD_DEFINED__
typedef interface __FIIterator_1_Windows__CUI__CComposition__CVisual __FIIterator_1_Windows__CUI__CComposition__CVisual;
#ifdef __cplusplus
#define __FIIterator_1_Windows__CUI__CComposition__CVisual ABI::Windows::Foundation::Collections::IIterator<ABI::Windows::UI::Composition::Visual* >
#endif /* __cplusplus */
#endif

#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x20000
#ifdef __cplusplus
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace UI {
            namespace Composition {
                enum CompositionBackfaceVisibility {
                    CompositionBackfaceVisibility_Inherit = 0,
                    CompositionBackfaceVisibility_Visible = 1,
                    CompositionBackfaceVisibility_Hidden = 2
                };
            }
        }
    }
}
extern "C" {
#else
enum __x_ABI_CWindows_CUI_CComposition_CCompositionBackfaceVisibility {
    CompositionBackfaceVisibility_Inherit = 0,
    CompositionBackfaceVisibility_Visible = 1,
    CompositionBackfaceVisibility_Hidden = 2
};
#ifdef WIDL_using_Windows_UI_Composition
#define CompositionBackfaceVisibility __x_ABI_CWindows_CUI_CComposition_CCompositionBackfaceVisibility
#endif /* WIDL_using_Windows_UI_Composition */
#endif

#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x20000 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x20000
#ifdef __cplusplus
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace UI {
            namespace Composition {
                enum CompositionBatchTypes {
                    CompositionBatchTypes_None = 0x0,
                    CompositionBatchTypes_Animation = 0x1,
                    CompositionBatchTypes_Effect = 0x2,
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x70000
                    CompositionBatchTypes_InfiniteAnimation = 0x4,
#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x70000 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x70000
                    CompositionBatchTypes_AllAnimations = 0x5
#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x70000 */
                };
            }
        }
    }
}
extern "C" {
#else
enum __x_ABI_CWindows_CUI_CComposition_CCompositionBatchTypes {
    CompositionBatchTypes_None = 0x0,
    CompositionBatchTypes_Animation = 0x1,
    CompositionBatchTypes_Effect = 0x2,
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x70000
    CompositionBatchTypes_InfiniteAnimation = 0x4,
#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x70000 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x70000
    CompositionBatchTypes_AllAnimations = 0x5
#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x70000 */
};
#ifdef WIDL_using_Windows_UI_Composition
#define CompositionBatchTypes __x_ABI_CWindows_CUI_CComposition_CCompositionBatchTypes
#endif /* WIDL_using_Windows_UI_Composition */
#endif

#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x20000 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x20000
#ifdef __cplusplus
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace UI {
            namespace Composition {
                enum CompositionBitmapInterpolationMode {
                    CompositionBitmapInterpolationMode_NearestNeighbor = 0,
                    CompositionBitmapInterpolationMode_Linear = 1,
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x80000
                    CompositionBitmapInterpolationMode_MagLinearMinLinearMipLinear = 2,
#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x80000 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x80000
                    CompositionBitmapInterpolationMode_MagLinearMinLinearMipNearest = 3,
#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x80000 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x80000
                    CompositionBitmapInterpolationMode_MagLinearMinNearestMipLinear = 4,
#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x80000 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x80000
                    CompositionBitmapInterpolationMode_MagLinearMinNearestMipNearest = 5,
#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x80000 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x80000
                    CompositionBitmapInterpolationMode_MagNearestMinLinearMipLinear = 6,
#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x80000 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x80000
                    CompositionBitmapInterpolationMode_MagNearestMinLinearMipNearest = 7,
#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x80000 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x80000
                    CompositionBitmapInterpolationMode_MagNearestMinNearestMipLinear = 8,
#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x80000 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x80000
                    CompositionBitmapInterpolationMode_MagNearestMinNearestMipNearest = 9
#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x80000 */
                };
            }
        }
    }
}
extern "C" {
#else
enum __x_ABI_CWindows_CUI_CComposition_CCompositionBitmapInterpolationMode {
    CompositionBitmapInterpolationMode_NearestNeighbor = 0,
    CompositionBitmapInterpolationMode_Linear = 1,
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x80000
    CompositionBitmapInterpolationMode_MagLinearMinLinearMipLinear = 2,
#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x80000 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x80000
    CompositionBitmapInterpolationMode_MagLinearMinLinearMipNearest = 3,
#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x80000 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x80000
    CompositionBitmapInterpolationMode_MagLinearMinNearestMipLinear = 4,
#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x80000 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x80000
    CompositionBitmapInterpolationMode_MagLinearMinNearestMipNearest = 5,
#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x80000 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x80000
    CompositionBitmapInterpolationMode_MagNearestMinLinearMipLinear = 6,
#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x80000 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x80000
    CompositionBitmapInterpolationMode_MagNearestMinLinearMipNearest = 7,
#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x80000 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x80000
    CompositionBitmapInterpolationMode_MagNearestMinNearestMipLinear = 8,
#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x80000 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x80000
    CompositionBitmapInterpolationMode_MagNearestMinNearestMipNearest = 9
#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x80000 */
};
#ifdef WIDL_using_Windows_UI_Composition
#define CompositionBitmapInterpolationMode __x_ABI_CWindows_CUI_CComposition_CCompositionBitmapInterpolationMode
#endif /* WIDL_using_Windows_UI_Composition */
#endif

#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x20000 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x20000
#ifdef __cplusplus
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace UI {
            namespace Composition {
                enum CompositionBorderMode {
                    CompositionBorderMode_Inherit = 0,
                    CompositionBorderMode_Soft = 1,
                    CompositionBorderMode_Hard = 2
                };
            }
        }
    }
}
extern "C" {
#else
enum __x_ABI_CWindows_CUI_CComposition_CCompositionBorderMode {
    CompositionBorderMode_Inherit = 0,
    CompositionBorderMode_Soft = 1,
    CompositionBorderMode_Hard = 2
};
#ifdef WIDL_using_Windows_UI_Composition
#define CompositionBorderMode __x_ABI_CWindows_CUI_CComposition_CCompositionBorderMode
#endif /* WIDL_using_Windows_UI_Composition */
#endif

#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x20000 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x20000
#ifdef __cplusplus
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace UI {
            namespace Composition {
                enum CompositionColorSpace {
                    CompositionColorSpace_Auto = 0,
                    CompositionColorSpace_Hsl = 1,
                    CompositionColorSpace_Rgb = 2,
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x50000
                    CompositionColorSpace_HslLinear = 3,
#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x50000 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x50000
                    CompositionColorSpace_RgbLinear = 4
#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x50000 */
                };
            }
        }
    }
}
extern "C" {
#else
enum __x_ABI_CWindows_CUI_CComposition_CCompositionColorSpace {
    CompositionColorSpace_Auto = 0,
    CompositionColorSpace_Hsl = 1,
    CompositionColorSpace_Rgb = 2,
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x50000
    CompositionColorSpace_HslLinear = 3,
#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x50000 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x50000
    CompositionColorSpace_RgbLinear = 4
#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x50000 */
};
#ifdef WIDL_using_Windows_UI_Composition
#define CompositionColorSpace __x_ABI_CWindows_CUI_CComposition_CCompositionColorSpace
#endif /* WIDL_using_Windows_UI_Composition */
#endif

#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x20000 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x20000
#ifdef __cplusplus
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace UI {
            namespace Composition {
                enum CompositionCompositeMode {
                    CompositionCompositeMode_Inherit = 0,
                    CompositionCompositeMode_SourceOver = 1,
                    CompositionCompositeMode_DestinationInvert = 2,
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x30000
                    CompositionCompositeMode_MinBlend = 3
#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x30000 */
                };
            }
        }
    }
}
extern "C" {
#else
enum __x_ABI_CWindows_CUI_CComposition_CCompositionCompositeMode {
    CompositionCompositeMode_Inherit = 0,
    CompositionCompositeMode_SourceOver = 1,
    CompositionCompositeMode_DestinationInvert = 2,
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x30000
    CompositionCompositeMode_MinBlend = 3
#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x30000 */
};
#ifdef WIDL_using_Windows_UI_Composition
#define CompositionCompositeMode __x_ABI_CWindows_CUI_CComposition_CCompositionCompositeMode
#endif /* WIDL_using_Windows_UI_Composition */
#endif

#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x20000 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x20000
#ifdef __cplusplus
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace UI {
            namespace Composition {
                enum CompositionEffectFactoryLoadStatus {
                    CompositionEffectFactoryLoadStatus_Success = 0,
                    CompositionEffectFactoryLoadStatus_EffectTooComplex = 1,
                    CompositionEffectFactoryLoadStatus_Pending = 2,
                    CompositionEffectFactoryLoadStatus_Other = -1
                };
            }
        }
    }
}
extern "C" {
#else
enum __x_ABI_CWindows_CUI_CComposition_CCompositionEffectFactoryLoadStatus {
    CompositionEffectFactoryLoadStatus_Success = 0,
    CompositionEffectFactoryLoadStatus_EffectTooComplex = 1,
    CompositionEffectFactoryLoadStatus_Pending = 2,
    CompositionEffectFactoryLoadStatus_Other = -1
};
#ifdef WIDL_using_Windows_UI_Composition
#define CompositionEffectFactoryLoadStatus __x_ABI_CWindows_CUI_CComposition_CCompositionEffectFactoryLoadStatus
#endif /* WIDL_using_Windows_UI_Composition */
#endif

#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x20000 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x20000
#ifdef __cplusplus
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace UI {
            namespace Composition {
                enum CompositionGetValueStatus {
                    CompositionGetValueStatus_Succeeded = 0,
                    CompositionGetValueStatus_TypeMismatch = 1,
                    CompositionGetValueStatus_NotFound = 2
                };
            }
        }
    }
}
extern "C" {
#else
enum __x_ABI_CWindows_CUI_CComposition_CCompositionGetValueStatus {
    CompositionGetValueStatus_Succeeded = 0,
    CompositionGetValueStatus_TypeMismatch = 1,
    CompositionGetValueStatus_NotFound = 2
};
#ifdef WIDL_using_Windows_UI_Composition
#define CompositionGetValueStatus __x_ABI_CWindows_CUI_CComposition_CCompositionGetValueStatus
#endif /* WIDL_using_Windows_UI_Composition */
#endif

#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x20000 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x20000
#ifdef __cplusplus
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace UI {
            namespace Composition {
                enum CompositionStretch {
                    CompositionStretch_None = 0,
                    CompositionStretch_Fill = 1,
                    CompositionStretch_Uniform = 2,
                    CompositionStretch_UniformToFill = 3
                };
            }
        }
    }
}
extern "C" {
#else
enum __x_ABI_CWindows_CUI_CComposition_CCompositionStretch {
    CompositionStretch_None = 0,
    CompositionStretch_Fill = 1,
    CompositionStretch_Uniform = 2,
    CompositionStretch_UniformToFill = 3
};
#ifdef WIDL_using_Windows_UI_Composition
#define CompositionStretch __x_ABI_CWindows_CUI_CComposition_CCompositionStretch
#endif /* WIDL_using_Windows_UI_Composition */
#endif

#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x20000 */
/*****************************************************************************
 * IColorKeyFrameAnimation interface
 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x20000
#ifndef ____x_ABI_CWindows_CUI_CComposition_CIColorKeyFrameAnimation_INTERFACE_DEFINED__
#define ____x_ABI_CWindows_CUI_CComposition_CIColorKeyFrameAnimation_INTERFACE_DEFINED__

DEFINE_GUID(IID___x_ABI_CWindows_CUI_CComposition_CIColorKeyFrameAnimation, 0x93adb5e9, 0x8e05, 0x4593, 0x84,0xa3, 0xdc,0xa1,0x52,0x78,0x1e,0x56);
#if defined(__cplusplus) && !defined(CINTERFACE)
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace UI {
            namespace Composition {
                MIDL_INTERFACE("93adb5e9-8e05-4593-84a3-dca152781e56")
                IColorKeyFrameAnimation : public IInspectable
                {
                    virtual HRESULT STDMETHODCALLTYPE get_InterpolationColorSpace(
                        enum CompositionColorSpace *value) = 0;

                    virtual HRESULT STDMETHODCALLTYPE put_InterpolationColorSpace(
                        enum CompositionColorSpace value) = 0;

                    virtual HRESULT STDMETHODCALLTYPE InsertKeyFrame(
                        FLOAT key,
                        struct Color value) = 0;

                    virtual HRESULT STDMETHODCALLTYPE InsertKeyFrameWithEasingFunction(
                        FLOAT key,
                        struct Color value,
                        ABI::Windows::UI::Composition::ICompositionEasingFunction *function) = 0;

                };
            }
        }
    }
}
extern "C" {
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(__x_ABI_CWindows_CUI_CComposition_CIColorKeyFrameAnimation, 0x93adb5e9, 0x8e05, 0x4593, 0x84,0xa3, 0xdc,0xa1,0x52,0x78,0x1e,0x56)
#endif
#else
typedef struct __x_ABI_CWindows_CUI_CComposition_CIColorKeyFrameAnimationVtbl {
    BEGIN_INTERFACE

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

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

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

    /*** IInspectable methods ***/
    HRESULT (STDMETHODCALLTYPE *GetIids)(
        __x_ABI_CWindows_CUI_CComposition_CIColorKeyFrameAnimation *This,
        ULONG *iidCount,
        IID **iids);

    HRESULT (STDMETHODCALLTYPE *GetRuntimeClassName)(
        __x_ABI_CWindows_CUI_CComposition_CIColorKeyFrameAnimation *This,
        HSTRING *className);

    HRESULT (STDMETHODCALLTYPE *GetTrustLevel)(
        __x_ABI_CWindows_CUI_CComposition_CIColorKeyFrameAnimation *This,
        TrustLevel *trustLevel);

    /*** IColorKeyFrameAnimation methods ***/
    HRESULT (STDMETHODCALLTYPE *get_InterpolationColorSpace)(
        __x_ABI_CWindows_CUI_CComposition_CIColorKeyFrameAnimation *This,
        enum __x_ABI_CWindows_CUI_CComposition_CCompositionColorSpace *value);

    HRESULT (STDMETHODCALLTYPE *put_InterpolationColorSpace)(
        __x_ABI_CWindows_CUI_CComposition_CIColorKeyFrameAnimation *This,
        enum __x_ABI_CWindows_CUI_CComposition_CCompositionColorSpace value);

    HRESULT (STDMETHODCALLTYPE *InsertKeyFrame)(
        __x_ABI_CWindows_CUI_CComposition_CIColorKeyFrameAnimation *This,
        FLOAT key,
        struct __x_ABI_CWindows_CUI_CColor value);

    HRESULT (STDMETHODCALLTYPE *InsertKeyFrameWithEasingFunction)(
        __x_ABI_CWindows_CUI_CComposition_CIColorKeyFrameAnimation *This,
        FLOAT key,
        struct __x_ABI_CWindows_CUI_CColor value,
        __x_ABI_CWindows_CUI_CComposition_CICompositionEasingFunction *function);

    END_INTERFACE
} __x_ABI_CWindows_CUI_CComposition_CIColorKeyFrameAnimationVtbl;

interface __x_ABI_CWindows_CUI_CComposition_CIColorKeyFrameAnimation {
    CONST_VTBL __x_ABI_CWindows_CUI_CComposition_CIColorKeyFrameAnimationVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define __x_ABI_CWindows_CUI_CComposition_CIColorKeyFrameAnimation_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define __x_ABI_CWindows_CUI_CComposition_CIColorKeyFrameAnimation_AddRef(This) (This)->lpVtbl->AddRef(This)
#define __x_ABI_CWindows_CUI_CComposition_CIColorKeyFrameAnimation_Release(This) (This)->lpVtbl->Release(This)
/*** IInspectable methods ***/
#define __x_ABI_CWindows_CUI_CComposition_CIColorKeyFrameAnimation_GetIids(This,iidCount,iids) (This)->lpVtbl->GetIids(This,iidCount,iids)
#define __x_ABI_CWindows_CUI_CComposition_CIColorKeyFrameAnimation_GetRuntimeClassName(This,className) (This)->lpVtbl->GetRuntimeClassName(This,className)
#define __x_ABI_CWindows_CUI_CComposition_CIColorKeyFrameAnimation_GetTrustLevel(This,trustLevel) (This)->lpVtbl->GetTrustLevel(This,trustLevel)
/*** IColorKeyFrameAnimation methods ***/
#define __x_ABI_CWindows_CUI_CComposition_CIColorKeyFrameAnimation_get_InterpolationColorSpace(This,value) (This)->lpVtbl->get_InterpolationColorSpace(This,value)
#define __x_ABI_CWindows_CUI_CComposition_CIColorKeyFrameAnimation_put_InterpolationColorSpace(This,value) (This)->lpVtbl->put_InterpolationColorSpace(This,value)
#define __x_ABI_CWindows_CUI_CComposition_CIColorKeyFrameAnimation_InsertKeyFrame(This,key,value) (This)->lpVtbl->InsertKeyFrame(This,key,value)
#define __x_ABI_CWindows_CUI_CComposition_CIColorKeyFrameAnimation_InsertKeyFrameWithEasingFunction(This,key,value,function) (This)->lpVtbl->InsertKeyFrameWithEasingFunction(This,key,value,function)
#else
/*** IUnknown methods ***/
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CUI_CComposition_CIColorKeyFrameAnimation_QueryInterface(__x_ABI_CWindows_CUI_CComposition_CIColorKeyFrameAnimation* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG __x_ABI_CWindows_CUI_CComposition_CIColorKeyFrameAnimation_AddRef(__x_ABI_CWindows_CUI_CComposition_CIColorKeyFrameAnimation* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG __x_ABI_CWindows_CUI_CComposition_CIColorKeyFrameAnimation_Release(__x_ABI_CWindows_CUI_CComposition_CIColorKeyFrameAnimation* This) {
    return This->lpVtbl->Release(This);
}
/*** IInspectable methods ***/
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CUI_CComposition_CIColorKeyFrameAnimation_GetIids(__x_ABI_CWindows_CUI_CComposition_CIColorKeyFrameAnimation* This,ULONG *iidCount,IID **iids) {
    return This->lpVtbl->GetIids(This,iidCount,iids);
}
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CUI_CComposition_CIColorKeyFrameAnimation_GetRuntimeClassName(__x_ABI_CWindows_CUI_CComposition_CIColorKeyFrameAnimation* This,HSTRING *className) {
    return This->lpVtbl->GetRuntimeClassName(This,className);
}
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CUI_CComposition_CIColorKeyFrameAnimation_GetTrustLevel(__x_ABI_CWindows_CUI_CComposition_CIColorKeyFrameAnimation* This,TrustLevel *trustLevel) {
    return This->lpVtbl->GetTrustLevel(This,trustLevel);
}
/*** IColorKeyFrameAnimation methods ***/
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CUI_CComposition_CIColorKeyFrameAnimation_get_InterpolationColorSpace(__x_ABI_CWindows_CUI_CComposition_CIColorKeyFrameAnimation* This,enum __x_ABI_CWindows_CUI_CComposition_CCompositionColorSpace *value) {
    return This->lpVtbl->get_InterpolationColorSpace(This,value);
}
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CUI_CComposition_CIColorKeyFrameAnimation_put_InterpolationColorSpace(__x_ABI_CWindows_CUI_CComposition_CIColorKeyFrameAnimation* This,enum __x_ABI_CWindows_CUI_CComposition_CCompositionColorSpace value) {
    return This->lpVtbl->put_InterpolationColorSpace(This,value);
}
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CUI_CComposition_CIColorKeyFrameAnimation_InsertKeyFrame(__x_ABI_CWindows_CUI_CComposition_CIColorKeyFrameAnimation* This,FLOAT key,struct __x_ABI_CWindows_CUI_CColor value) {
    return This->lpVtbl->InsertKeyFrame(This,key,value);
}
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CUI_CComposition_CIColorKeyFrameAnimation_InsertKeyFrameWithEasingFunction(__x_ABI_CWindows_CUI_CComposition_CIColorKeyFrameAnimation* This,FLOAT key,struct __x_ABI_CWindows_CUI_CColor value,__x_ABI_CWindows_CUI_CComposition_CICompositionEasingFunction *function) {
    return This->lpVtbl->InsertKeyFrameWithEasingFunction(This,key,value,function);
}
#endif
#ifdef WIDL_using_Windows_UI_Composition
#define IID_IColorKeyFrameAnimation IID___x_ABI_CWindows_CUI_CComposition_CIColorKeyFrameAnimation
#define IColorKeyFrameAnimationVtbl __x_ABI_CWindows_CUI_CComposition_CIColorKeyFrameAnimationVtbl
#define IColorKeyFrameAnimation __x_ABI_CWindows_CUI_CComposition_CIColorKeyFrameAnimation
#define IColorKeyFrameAnimation_QueryInterface __x_ABI_CWindows_CUI_CComposition_CIColorKeyFrameAnimation_QueryInterface
#define IColorKeyFrameAnimation_AddRef __x_ABI_CWindows_CUI_CComposition_CIColorKeyFrameAnimation_AddRef
#define IColorKeyFrameAnimation_Release __x_ABI_CWindows_CUI_CComposition_CIColorKeyFrameAnimation_Release
#define IColorKeyFrameAnimation_GetIids __x_ABI_CWindows_CUI_CComposition_CIColorKeyFrameAnimation_GetIids
#define IColorKeyFrameAnimation_GetRuntimeClassName __x_ABI_CWindows_CUI_CComposition_CIColorKeyFrameAnimation_GetRuntimeClassName
#define IColorKeyFrameAnimation_GetTrustLevel __x_ABI_CWindows_CUI_CComposition_CIColorKeyFrameAnimation_GetTrustLevel
#define IColorKeyFrameAnimation_get_InterpolationColorSpace __x_ABI_CWindows_CUI_CComposition_CIColorKeyFrameAnimation_get_InterpolationColorSpace
#define IColorKeyFrameAnimation_put_InterpolationColorSpace __x_ABI_CWindows_CUI_CComposition_CIColorKeyFrameAnimation_put_InterpolationColorSpace
#define IColorKeyFrameAnimation_InsertKeyFrame __x_ABI_CWindows_CUI_CComposition_CIColorKeyFrameAnimation_InsertKeyFrame
#define IColorKeyFrameAnimation_InsertKeyFrameWithEasingFunction __x_ABI_CWindows_CUI_CComposition_CIColorKeyFrameAnimation_InsertKeyFrameWithEasingFunction
#endif /* WIDL_using_Windows_UI_Composition */
#endif

#endif

#endif  /* ____x_ABI_CWindows_CUI_CComposition_CIColorKeyFrameAnimation_INTERFACE_DEFINED__ */
#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x20000 */

/*****************************************************************************
 * ICompositionAnimation interface
 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x20000
#ifndef ____x_ABI_CWindows_CUI_CComposition_CICompositionAnimation_INTERFACE_DEFINED__
#define ____x_ABI_CWindows_CUI_CComposition_CICompositionAnimation_INTERFACE_DEFINED__

DEFINE_GUID(IID___x_ABI_CWindows_CUI_CComposition_CICompositionAnimation, 0x464c4c2c, 0x1caa, 0x4061, 0x9b,0x40, 0xe1,0x3f,0xde,0x15,0x03,0xca);
#if defined(__cplusplus) && !defined(CINTERFACE)
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace UI {
            namespace Composition {
                MIDL_INTERFACE("464c4c2c-1caa-4061-9b40-e13fde1503ca")
                ICompositionAnimation : public IInspectable
                {
                    virtual HRESULT STDMETHODCALLTYPE ClearAllParameters(
                        ) = 0;

                    virtual HRESULT STDMETHODCALLTYPE ClearParameter(
                        HSTRING key) = 0;

                    virtual HRESULT STDMETHODCALLTYPE SetColorParameter(
                        HSTRING key,
                        struct Color value) = 0;

                    virtual HRESULT STDMETHODCALLTYPE SetMatrix3x2Parameter(
                        HSTRING key,
                        struct Matrix3x2 value) = 0;

                    virtual HRESULT STDMETHODCALLTYPE SetMatrix4x4Parameter(
                        HSTRING key,
                        struct Matrix4x4 value) = 0;

                    virtual HRESULT STDMETHODCALLTYPE SetQuaternionParameter(
                        HSTRING key,
                        struct Quaternion value) = 0;

                    virtual HRESULT STDMETHODCALLTYPE SetReferenceParameter(
                        HSTRING key,
                        ABI::Windows::UI::Composition::ICompositionObject *object) = 0;

                    virtual HRESULT STDMETHODCALLTYPE SetScalarParameter(
                        HSTRING key,
                        FLOAT value) = 0;

                    virtual HRESULT STDMETHODCALLTYPE SetVector2Parameter(
                        HSTRING key,
                        struct Vector2 value) = 0;

                    virtual HRESULT STDMETHODCALLTYPE SetVector3Parameter(
                        HSTRING key,
                        struct Vector3 value) = 0;

                    virtual HRESULT STDMETHODCALLTYPE SetVector4Parameter(
                        HSTRING key,
                        struct Vector4 value) = 0;

                };
            }
        }
    }
}
extern "C" {
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(__x_ABI_CWindows_CUI_CComposition_CICompositionAnimation, 0x464c4c2c, 0x1caa, 0x4061, 0x9b,0x40, 0xe1,0x3f,0xde,0x15,0x03,0xca)
#endif
#else
typedef struct __x_ABI_CWindows_CUI_CComposition_CICompositionAnimationVtbl {
    BEGIN_INTERFACE

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

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

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

    /*** IInspectable methods ***/
    HRESULT (STDMETHODCALLTYPE *GetIids)(
        __x_ABI_CWindows_CUI_CComposition_CICompositionAnimation *This,
        ULONG *iidCount,
        IID **iids);

    HRESULT (STDMETHODCALLTYPE *GetRuntimeClassName)(
        __x_ABI_CWindows_CUI_CComposition_CICompositionAnimation *This,
        HSTRING *className);

    HRESULT (STDMETHODCALLTYPE *GetTrustLevel)(
        __x_ABI_CWindows_CUI_CComposition_CICompositionAnimation *This,
        TrustLevel *trustLevel);

    /*** ICompositionAnimation methods ***/
    HRESULT (STDMETHODCALLTYPE *ClearAllParameters)(
        __x_ABI_CWindows_CUI_CComposition_CICompositionAnimation *This);

    HRESULT (STDMETHODCALLTYPE *ClearParameter)(
        __x_ABI_CWindows_CUI_CComposition_CICompositionAnimation *This,
        HSTRING key);

    HRESULT (STDMETHODCALLTYPE *SetColorParameter)(
        __x_ABI_CWindows_CUI_CComposition_CICompositionAnimation *This,
        HSTRING key,
        struct __x_ABI_CWindows_CUI_CColor value);

    HRESULT (STDMETHODCALLTYPE *SetMatrix3x2Parameter)(
        __x_ABI_CWindows_CUI_CComposition_CICompositionAnimation *This,
        HSTRING key,
        struct __x_ABI_CWindows_CFoundation_CNumerics_CMatrix3x2 value);

    HRESULT (STDMETHODCALLTYPE *SetMatrix4x4Parameter)(
        __x_ABI_CWindows_CUI_CComposition_CICompositionAnimation *This,
        HSTRING key,
        struct __x_ABI_CWindows_CFoundation_CNumerics_CMatrix4x4 value);

    HRESULT (STDMETHODCALLTYPE *SetQuaternionParameter)(
        __x_ABI_CWindows_CUI_CComposition_CICompositionAnimation *This,
        HSTRING key,
        struct __x_ABI_CWindows_CFoundation_CNumerics_CQuaternion value);

    HRESULT (STDMETHODCALLTYPE *SetReferenceParameter)(
        __x_ABI_CWindows_CUI_CComposition_CICompositionAnimation *This,
        HSTRING key,
        __x_ABI_CWindows_CUI_CComposition_CICompositionObject *object);

    HRESULT (STDMETHODCALLTYPE *SetScalarParameter)(
        __x_ABI_CWindows_CUI_CComposition_CICompositionAnimation *This,
        HSTRING key,
        FLOAT value);

    HRESULT (STDMETHODCALLTYPE *SetVector2Parameter)(
        __x_ABI_CWindows_CUI_CComposition_CICompositionAnimation *This,
        HSTRING key,
        struct __x_ABI_CWindows_CFoundation_CNumerics_CVector2 value);

    HRESULT (STDMETHODCALLTYPE *SetVector3Parameter)(
        __x_ABI_CWindows_CUI_CComposition_CICompositionAnimation *This,
        HSTRING key,
        struct __x_ABI_CWindows_CFoundation_CNumerics_CVector3 value);

    HRESULT (STDMETHODCALLTYPE *SetVector4Parameter)(
        __x_ABI_CWindows_CUI_CComposition_CICompositionAnimation *This,
        HSTRING key,
        struct __x_ABI_CWindows_CFoundation_CNumerics_CVector4 value);

    END_INTERFACE
} __x_ABI_CWindows_CUI_CComposition_CICompositionAnimationVtbl;

interface __x_ABI_CWindows_CUI_CComposition_CICompositionAnimation {
    CONST_VTBL __x_ABI_CWindows_CUI_CComposition_CICompositionAnimationVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define __x_ABI_CWindows_CUI_CComposition_CICompositionAnimation_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define __x_ABI_CWindows_CUI_CComposition_CICompositionAnimation_AddRef(This) (This)->lpVtbl->AddRef(This)
#define __x_ABI_CWindows_CUI_CComposition_CICompositionAnimation_Release(This) (This)->lpVtbl->Release(This)
/*** IInspectable methods ***/
#define __x_ABI_CWindows_CUI_CComposition_CICompositionAnimation_GetIids(This,iidCount,iids) (This)->lpVtbl->GetIids(This,iidCount,iids)
#define __x_ABI_CWindows_CUI_CComposition_CICompositionAnimation_GetRuntimeClassName(This,className) (This)->lpVtbl->GetRuntimeClassName(This,className)
#define __x_ABI_CWindows_CUI_CComposition_CICompositionAnimation_GetTrustLevel(This,trustLevel) (This)->lpVtbl->GetTrustLevel(This,trustLevel)
/*** ICompositionAnimation methods ***/
#define __x_ABI_CWindows_CUI_CComposition_CICompositionAnimation_ClearAllParameters(This) (This)->lpVtbl->ClearAllParameters(This)
#define __x_ABI_CWindows_CUI_CComposition_CICompositionAnimation_ClearParameter(This,key) (This)->lpVtbl->ClearParameter(This,key)
#define __x_ABI_CWindows_CUI_CComposition_CICompositionAnimation_SetColorParameter(This,key,value) (This)->lpVtbl->SetColorParameter(This,key,value)
#define __x_ABI_CWindows_CUI_CComposition_CICompositionAnimation_SetMatrix3x2Parameter(This,key,value) (This)->lpVtbl->SetMatrix3x2Parameter(This,key,value)
#define __x_ABI_CWindows_CUI_CComposition_CICompositionAnimation_SetMatrix4x4Parameter(This,key,value) (This)->lpVtbl->SetMatrix4x4Parameter(This,key,value)
#define __x_ABI_CWindows_CUI_CComposition_CICompositionAnimation_SetQuaternionParameter(This,key,value) (This)->lpVtbl->SetQuaternionParameter(This,key,value)
#define __x_ABI_CWindows_CUI_CComposition_CICompositionAnimation_SetReferenceParameter(This,key,object) (This)->lpVtbl->SetReferenceParameter(This,key,object)
#define __x_ABI_CWindows_CUI_CComposition_CICompositionAnimation_SetScalarParameter(This,key,value) (This)->lpVtbl->SetScalarParameter(This,key,value)
#define __x_ABI_CWindows_CUI_CComposition_CICompositionAnimation_SetVector2Parameter(This,key,value) (This)->lpVtbl->SetVector2Parameter(This,key,value)
#define __x_ABI_CWindows_CUI_CComposition_CICompositionAnimation_SetVector3Parameter(This,key,value) (This)->lpVtbl->SetVector3Parameter(This,key,value)
#define __x_ABI_CWindows_CUI_CComposition_CICompositionAnimation_SetVector4Parameter(This,key,value) (This)->lpVtbl->SetVector4Parameter(This,key,value)
#else
/*** IUnknown methods ***/
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CUI_CComposition_CICompositionAnimation_QueryInterface(__x_ABI_CWindows_CUI_CComposition_CICompositionAnimation* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG __x_ABI_CWindows_CUI_CComposition_CICompositionAnimation_AddRef(__x_ABI_CWindows_CUI_CComposition_CICompositionAnimation* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG __x_ABI_CWindows_CUI_CComposition_CICompositionAnimation_Release(__x_ABI_CWindows_CUI_CComposition_CICompositionAnimation* This) {
    return This->lpVtbl->Release(This);
}
/*** IInspectable methods ***/
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CUI_CComposition_CICompositionAnimation_GetIids(__x_ABI_CWindows_CUI_CComposition_CICompositionAnimation* This,ULONG *iidCount,IID **iids) {
    return This->lpVtbl->GetIids(This,iidCount,iids);
}
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CUI_CComposition_CICompositionAnimation_GetRuntimeClassName(__x_ABI_CWindows_CUI_CComposition_CICompositionAnimation* This,HSTRING *className) {
    return This->lpVtbl->GetRuntimeClassName(This,className);
}
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CUI_CComposition_CICompositionAnimation_GetTrustLevel(__x_ABI_CWindows_CUI_CComposition_CICompositionAnimation* This,TrustLevel *trustLevel) {
    return This->lpVtbl->GetTrustLevel(This,trustLevel);
}
/*** ICompositionAnimation methods ***/
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CUI_CComposition_CICompositionAnimation_ClearAllParameters(__x_ABI_CWindows_CUI_CComposition_CICompositionAnimation* This) {
    return This->lpVtbl->ClearAllParameters(This);
}
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CUI_CComposition_CICompositionAnimation_ClearParameter(__x_ABI_CWindows_CUI_CComposition_CICompositionAnimation* This,HSTRING key) {
    return This->lpVtbl->ClearParameter(This,key);
}
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CUI_CComposition_CICompositionAnimation_SetColorParameter(__x_ABI_CWindows_CUI_CComposition_CICompositionAnimation* This,HSTRING key,struct __x_ABI_CWindows_CUI_CColor value) {
    return This->lpVtbl->SetColorParameter(This,key,value);
}
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CUI_CComposition_CICompositionAnimation_SetMatrix3x2Parameter(__x_ABI_CWindows_CUI_CComposition_CICompositionAnimation* This,HSTRING key,struct __x_ABI_CWindows_CFoundation_CNumerics_CMatrix3x2 value) {
    return This->lpVtbl->SetMatrix3x2Parameter(This,key,value);
}
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CUI_CComposition_CICompositionAnimation_SetMatrix4x4Parameter(__x_ABI_CWindows_CUI_CComposition_CICompositionAnimation* This,HSTRING key,struct __x_ABI_CWindows_CFoundation_CNumerics_CMatrix4x4 value) {
    return This->lpVtbl->SetMatrix4x4Parameter(This,key,value);
}
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CUI_CComposition_CICompositionAnimation_SetQuaternionParameter(__x_ABI_CWindows_CUI_CComposition_CICompositionAnimation* This,HSTRING key,struct __x_ABI_CWindows_CFoundation_CNumerics_CQuaternion value) {
    return This->lpVtbl->SetQuaternionParameter(This,key,value);
}
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CUI_CComposition_CICompositionAnimation_SetReferenceParameter(__x_ABI_CWindows_CUI_CComposition_CICompositionAnimation* This,HSTRING key,__x_ABI_CWindows_CUI_CComposition_CICompositionObject *object) {
    return This->lpVtbl->SetReferenceParameter(This,key,object);
}
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CUI_CComposition_CICompositionAnimation_SetScalarParameter(__x_ABI_CWindows_CUI_CComposition_CICompositionAnimation* This,HSTRING key,FLOAT value) {
    return This->lpVtbl->SetScalarParameter(This,key,value);
}
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CUI_CComposition_CICompositionAnimation_SetVector2Parameter(__x_ABI_CWindows_CUI_CComposition_CICompositionAnimation* This,HSTRING key,struct __x_ABI_CWindows_CFoundation_CNumerics_CVector2 value) {
    return This->lpVtbl->SetVector2Parameter(This,key,value);
}
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CUI_CComposition_CICompositionAnimation_SetVector3Parameter(__x_ABI_CWindows_CUI_CComposition_CICompositionAnimation* This,HSTRING key,struct __x_ABI_CWindows_CFoundation_CNumerics_CVector3 value) {
    return This->lpVtbl->SetVector3Parameter(This,key,value);
}
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CUI_CComposition_CICompositionAnimation_SetVector4Parameter(__x_ABI_CWindows_CUI_CComposition_CICompositionAnimation* This,HSTRING key,struct __x_ABI_CWindows_CFoundation_CNumerics_CVector4 value) {
    return This->lpVtbl->SetVector4Parameter(This,key,value);
}
#endif
#ifdef WIDL_using_Windows_UI_Composition
#define IID_ICompositionAnimation IID___x_ABI_CWindows_CUI_CComposition_CICompositionAnimation
#define ICompositionAnimationVtbl __x_ABI_CWindows_CUI_CComposition_CICompositionAnimationVtbl
#define ICompositionAnimation __x_ABI_CWindows_CUI_CComposition_CICompositionAnimation
#define ICompositionAnimation_QueryInterface __x_ABI_CWindows_CUI_CComposition_CICompositionAnimation_QueryInterface
#define ICompositionAnimation_AddRef __x_ABI_CWindows_CUI_CComposition_CICompositionAnimation_AddRef
#define ICompositionAnimation_Release __x_ABI_CWindows_CUI_CComposition_CICompositionAnimation_Release
#define ICompositionAnimation_GetIids __x_ABI_CWindows_CUI_CComposition_CICompositionAnimation_GetIids
#define ICompositionAnimation_GetRuntimeClassName __x_ABI_CWindows_CUI_CComposition_CICompositionAnimation_GetRuntimeClassName
#define ICompositionAnimation_GetTrustLevel __x_ABI_CWindows_CUI_CComposition_CICompositionAnimation_GetTrustLevel
#define ICompositionAnimation_ClearAllParameters __x_ABI_CWindows_CUI_CComposition_CICompositionAnimation_ClearAllParameters
#define ICompositionAnimation_ClearParameter __x_ABI_CWindows_CUI_CComposition_CICompositionAnimation_ClearParameter
#define ICompositionAnimation_SetColorParameter __x_ABI_CWindows_CUI_CComposition_CICompositionAnimation_SetColorParameter
#define ICompositionAnimation_SetMatrix3x2Parameter __x_ABI_CWindows_CUI_CComposition_CICompositionAnimation_SetMatrix3x2Parameter
#define ICompositionAnimation_SetMatrix4x4Parameter __x_ABI_CWindows_CUI_CComposition_CICompositionAnimation_SetMatrix4x4Parameter
#define ICompositionAnimation_SetQuaternionParameter __x_ABI_CWindows_CUI_CComposition_CICompositionAnimation_SetQuaternionParameter
#define ICompositionAnimation_SetReferenceParameter __x_ABI_CWindows_CUI_CComposition_CICompositionAnimation_SetReferenceParameter
#define ICompositionAnimation_SetScalarParameter __x_ABI_CWindows_CUI_CComposition_CICompositionAnimation_SetScalarParameter
#define ICompositionAnimation_SetVector2Parameter __x_ABI_CWindows_CUI_CComposition_CICompositionAnimation_SetVector2Parameter
#define ICompositionAnimation_SetVector3Parameter __x_ABI_CWindows_CUI_CComposition_CICompositionAnimation_SetVector3Parameter
#define ICompositionAnimation_SetVector4Parameter __x_ABI_CWindows_CUI_CComposition_CICompositionAnimation_SetVector4Parameter
#endif /* WIDL_using_Windows_UI_Composition */
#endif

#endif

#endif  /* ____x_ABI_CWindows_CUI_CComposition_CICompositionAnimation_INTERFACE_DEFINED__ */
#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x20000 */

/*****************************************************************************
 * ICompositionAnimationBase interface
 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x30000
#ifndef ____x_ABI_CWindows_CUI_CComposition_CICompositionAnimationBase_INTERFACE_DEFINED__
#define ____x_ABI_CWindows_CUI_CComposition_CICompositionAnimationBase_INTERFACE_DEFINED__

DEFINE_GUID(IID___x_ABI_CWindows_CUI_CComposition_CICompositionAnimationBase, 0x1c2c2999, 0xe818, 0x48d3, 0xa6,0xdd, 0xd7,0x8c,0x82,0xf8,0xac,0xe9);
#if defined(__cplusplus) && !defined(CINTERFACE)
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace UI {
            namespace Composition {
                MIDL_INTERFACE("1c2c2999-e818-48d3-a6dd-d78c82f8ace9")
                ICompositionAnimationBase : public IInspectable
                {
                };
            }
        }
    }
}
extern "C" {
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(__x_ABI_CWindows_CUI_CComposition_CICompositionAnimationBase, 0x1c2c2999, 0xe818, 0x48d3, 0xa6,0xdd, 0xd7,0x8c,0x82,0xf8,0xac,0xe9)
#endif
#else
typedef struct __x_ABI_CWindows_CUI_CComposition_CICompositionAnimationBaseVtbl {
    BEGIN_INTERFACE

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

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

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

    /*** IInspectable methods ***/
    HRESULT (STDMETHODCALLTYPE *GetIids)(
        __x_ABI_CWindows_CUI_CComposition_CICompositionAnimationBase *This,
        ULONG *iidCount,
        IID **iids);

    HRESULT (STDMETHODCALLTYPE *GetRuntimeClassName)(
        __x_ABI_CWindows_CUI_CComposition_CICompositionAnimationBase *This,
        HSTRING *className);

    HRESULT (STDMETHODCALLTYPE *GetTrustLevel)(
        __x_ABI_CWindows_CUI_CComposition_CICompositionAnimationBase *This,
        TrustLevel *trustLevel);

    END_INTERFACE
} __x_ABI_CWindows_CUI_CComposition_CICompositionAnimationBaseVtbl;

interface __x_ABI_CWindows_CUI_CComposition_CICompositionAnimationBase {
    CONST_VTBL __x_ABI_CWindows_CUI_CComposition_CICompositionAnimationBaseVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define __x_ABI_CWindows_CUI_CComposition_CICompositionAnimationBase_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define __x_ABI_CWindows_CUI_CComposition_CICompositionAnimationBase_AddRef(This) (This)->lpVtbl->AddRef(This)
#define __x_ABI_CWindows_CUI_CComposition_CICompositionAnimationBase_Release(This) (This)->lpVtbl->Release(This)
/*** IInspectable methods ***/
#define __x_ABI_CWindows_CUI_CComposition_CICompositionAnimationBase_GetIids(This,iidCount,iids) (This)->lpVtbl->GetIids(This,iidCount,iids)
#define __x_ABI_CWindows_CUI_CComposition_CICompositionAnimationBase_GetRuntimeClassName(This,className) (This)->lpVtbl->GetRuntimeClassName(This,className)
#define __x_ABI_CWindows_CUI_CComposition_CICompositionAnimationBase_GetTrustLevel(This,trustLevel) (This)->lpVtbl->GetTrustLevel(This,trustLevel)
#else
/*** IUnknown methods ***/
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CUI_CComposition_CICompositionAnimationBase_QueryInterface(__x_ABI_CWindows_CUI_CComposition_CICompositionAnimationBase* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG __x_ABI_CWindows_CUI_CComposition_CICompositionAnimationBase_AddRef(__x_ABI_CWindows_CUI_CComposition_CICompositionAnimationBase* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG __x_ABI_CWindows_CUI_CComposition_CICompositionAnimationBase_Release(__x_ABI_CWindows_CUI_CComposition_CICompositionAnimationBase* This) {
    return This->lpVtbl->Release(This);
}
/*** IInspectable methods ***/
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CUI_CComposition_CICompositionAnimationBase_GetIids(__x_ABI_CWindows_CUI_CComposition_CICompositionAnimationBase* This,ULONG *iidCount,IID **iids) {
    return This->lpVtbl->GetIids(This,iidCount,iids);
}
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CUI_CComposition_CICompositionAnimationBase_GetRuntimeClassName(__x_ABI_CWindows_CUI_CComposition_CICompositionAnimationBase* This,HSTRING *className) {
    return This->lpVtbl->GetRuntimeClassName(This,className);
}
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CUI_CComposition_CICompositionAnimationBase_GetTrustLevel(__x_ABI_CWindows_CUI_CComposition_CICompositionAnimationBase* This,TrustLevel *trustLevel) {
    return This->lpVtbl->GetTrustLevel(This,trustLevel);
}
#endif
#ifdef WIDL_using_Windows_UI_Composition
#define IID_ICompositionAnimationBase IID___x_ABI_CWindows_CUI_CComposition_CICompositionAnimationBase
#define ICompositionAnimationBaseVtbl __x_ABI_CWindows_CUI_CComposition_CICompositionAnimationBaseVtbl
#define ICompositionAnimationBase __x_ABI_CWindows_CUI_CComposition_CICompositionAnimationBase
#define ICompositionAnimationBase_QueryInterface __x_ABI_CWindows_CUI_CComposition_CICompositionAnimationBase_QueryInterface
#define ICompositionAnimationBase_AddRef __x_ABI_CWindows_CUI_CComposition_CICompositionAnimationBase_AddRef
#define ICompositionAnimationBase_Release __x_ABI_CWindows_CUI_CComposition_CICompositionAnimationBase_Release
#define ICompositionAnimationBase_GetIids __x_ABI_CWindows_CUI_CComposition_CICompositionAnimationBase_GetIids
#define ICompositionAnimationBase_GetRuntimeClassName __x_ABI_CWindows_CUI_CComposition_CICompositionAnimationBase_GetRuntimeClassName
#define ICompositionAnimationBase_GetTrustLevel __x_ABI_CWindows_CUI_CComposition_CICompositionAnimationBase_GetTrustLevel
#endif /* WIDL_using_Windows_UI_Composition */
#endif

#endif

#endif  /* ____x_ABI_CWindows_CUI_CComposition_CICompositionAnimationBase_INTERFACE_DEFINED__ */
#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x30000 */

/*****************************************************************************
 * ICompositionAnimationFactory interface
 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x20000
#ifndef ____x_ABI_CWindows_CUI_CComposition_CICompositionAnimationFactory_INTERFACE_DEFINED__
#define ____x_ABI_CWindows_CUI_CComposition_CICompositionAnimationFactory_INTERFACE_DEFINED__

DEFINE_GUID(IID___x_ABI_CWindows_CUI_CComposition_CICompositionAnimationFactory, 0x10f6c4fb, 0x6e51, 0x4c25, 0xbb,0xd3, 0x58,0x6a,0x9b,0xec,0x3e,0xf4);
#if defined(__cplusplus) && !defined(CINTERFACE)
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace UI {
            namespace Composition {
                MIDL_INTERFACE("10f6c4fb-6e51-4c25-bbd3-586a9bec3ef4")
                ICompositionAnimationFactory : public IInspectable
                {
                };
            }
        }
    }
}
extern "C" {
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(__x_ABI_CWindows_CUI_CComposition_CICompositionAnimationFactory, 0x10f6c4fb, 0x6e51, 0x4c25, 0xbb,0xd3, 0x58,0x6a,0x9b,0xec,0x3e,0xf4)
#endif
#else
typedef struct __x_ABI_CWindows_CUI_CComposition_CICompositionAnimationFactoryVtbl {
    BEGIN_INTERFACE

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

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

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

    /*** IInspectable methods ***/
    HRESULT (STDMETHODCALLTYPE *GetIids)(
        __x_ABI_CWindows_CUI_CComposition_CICompositionAnimationFactory *This,
        ULONG *iidCount,
        IID **iids);

    HRESULT (STDMETHODCALLTYPE *GetRuntimeClassName)(
        __x_ABI_CWindows_CUI_CComposition_CICompositionAnimationFactory *This,
        HSTRING *className);

    HRESULT (STDMETHODCALLTYPE *GetTrustLevel)(
        __x_ABI_CWindows_CUI_CComposition_CICompositionAnimationFactory *This,
        TrustLevel *trustLevel);

    END_INTERFACE
} __x_ABI_CWindows_CUI_CComposition_CICompositionAnimationFactoryVtbl;

interface __x_ABI_CWindows_CUI_CComposition_CICompositionAnimationFactory {
    CONST_VTBL __x_ABI_CWindows_CUI_CComposition_CICompositionAnimationFactoryVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define __x_ABI_CWindows_CUI_CComposition_CICompositionAnimationFactory_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define __x_ABI_CWindows_CUI_CComposition_CICompositionAnimationFactory_AddRef(This) (This)->lpVtbl->AddRef(This)
#define __x_ABI_CWindows_CUI_CComposition_CICompositionAnimationFactory_Release(This) (This)->lpVtbl->Release(This)
/*** IInspectable methods ***/
#define __x_ABI_CWindows_CUI_CComposition_CICompositionAnimationFactory_GetIids(This,iidCount,iids) (This)->lpVtbl->GetIids(This,iidCount,iids)
#define __x_ABI_CWindows_CUI_CComposition_CICompositionAnimationFactory_GetRuntimeClassName(This,className) (This)->lpVtbl->GetRuntimeClassName(This,className)
#define __x_ABI_CWindows_CUI_CComposition_CICompositionAnimationFactory_GetTrustLevel(This,trustLevel) (This)->lpVtbl->GetTrustLevel(This,trustLevel)
#else
/*** IUnknown methods ***/
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CUI_CComposition_CICompositionAnimationFactory_QueryInterface(__x_ABI_CWindows_CUI_CComposition_CICompositionAnimationFactory* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG __x_ABI_CWindows_CUI_CComposition_CICompositionAnimationFactory_AddRef(__x_ABI_CWindows_CUI_CComposition_CICompositionAnimationFactory* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG __x_ABI_CWindows_CUI_CComposition_CICompositionAnimationFactory_Release(__x_ABI_CWindows_CUI_CComposition_CICompositionAnimationFactory* This) {
    return This->lpVtbl->Release(This);
}
/*** IInspectable methods ***/
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CUI_CComposition_CICompositionAnimationFactory_GetIids(__x_ABI_CWindows_CUI_CComposition_CICompositionAnimationFactory* This,ULONG *iidCount,IID **iids) {
    return This->lpVtbl->GetIids(This,iidCount,iids);
}
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CUI_CComposition_CICompositionAnimationFactory_GetRuntimeClassName(__x_ABI_CWindows_CUI_CComposition_CICompositionAnimationFactory* This,HSTRING *className) {
    return This->lpVtbl->GetRuntimeClassName(This,className);
}
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CUI_CComposition_CICompositionAnimationFactory_GetTrustLevel(__x_ABI_CWindows_CUI_CComposition_CICompositionAnimationFactory* This,TrustLevel *trustLevel) {
    return This->lpVtbl->GetTrustLevel(This,trustLevel);
}
#endif
#ifdef WIDL_using_Windows_UI_Composition
#define IID_ICompositionAnimationFactory IID___x_ABI_CWindows_CUI_CComposition_CICompositionAnimationFactory
#define ICompositionAnimationFactoryVtbl __x_ABI_CWindows_CUI_CComposition_CICompositionAnimationFactoryVtbl
#define ICompositionAnimationFactory __x_ABI_CWindows_CUI_CComposition_CICompositionAnimationFactory
#define ICompositionAnimationFactory_QueryInterface __x_ABI_CWindows_CUI_CComposition_CICompositionAnimationFactory_QueryInterface
#define ICompositionAnimationFactory_AddRef __x_ABI_CWindows_CUI_CComposition_CICompositionAnimationFactory_AddRef
#define ICompositionAnimationFactory_Release __x_ABI_CWindows_CUI_CComposition_CICompositionAnimationFactory_Release
#define ICompositionAnimationFactory_GetIids __x_ABI_CWindows_CUI_CComposition_CICompositionAnimationFactory_GetIids
#define ICompositionAnimationFactory_GetRuntimeClassName __x_ABI_CWindows_CUI_CComposition_CICompositionAnimationFactory_GetRuntimeClassName
#define ICompositionAnimationFactory_GetTrustLevel __x_ABI_CWindows_CUI_CComposition_CICompositionAnimationFactory_GetTrustLevel
#endif /* WIDL_using_Windows_UI_Composition */
#endif

#endif

#endif  /* ____x_ABI_CWindows_CUI_CComposition_CICompositionAnimationFactory_INTERFACE_DEFINED__ */
#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x20000 */

/*****************************************************************************
 * ICompositionObject interface
 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x20000
#ifndef ____x_ABI_CWindows_CUI_CComposition_CICompositionObject_INTERFACE_DEFINED__
#define ____x_ABI_CWindows_CUI_CComposition_CICompositionObject_INTERFACE_DEFINED__

DEFINE_GUID(IID___x_ABI_CWindows_CUI_CComposition_CICompositionObject, 0xbcb4ad45, 0x7609, 0x4550, 0x93,0x4f, 0x16,0x00,0x2a,0x68,0xfd,0xed);
#if defined(__cplusplus) && !defined(CINTERFACE)
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace UI {
            namespace Composition {
                MIDL_INTERFACE("bcb4ad45-7609-4550-934f-16002a68fded")
                ICompositionObject : public IInspectable
                {
                    virtual HRESULT STDMETHODCALLTYPE get_Compositor(
                        ABI::Windows::UI::Composition::ICompositor **value) = 0;

                    virtual HRESULT STDMETHODCALLTYPE get_Dispatcher(
                        ABI::Windows::UI::Core::ICoreDispatcher **value) = 0;

                    virtual HRESULT STDMETHODCALLTYPE get_Properties(
                        ABI::Windows::UI::Composition::ICompositionPropertySet **value) = 0;

                    virtual HRESULT STDMETHODCALLTYPE StartAnimation(
                        HSTRING name,
                        ABI::Windows::UI::Composition::ICompositionAnimation *animation) = 0;

                    virtual HRESULT STDMETHODCALLTYPE StopAnimation(
                        HSTRING name) = 0;

                };
            }
        }
    }
}
extern "C" {
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(__x_ABI_CWindows_CUI_CComposition_CICompositionObject, 0xbcb4ad45, 0x7609, 0x4550, 0x93,0x4f, 0x16,0x00,0x2a,0x68,0xfd,0xed)
#endif
#else
typedef struct __x_ABI_CWindows_CUI_CComposition_CICompositionObjectVtbl {
    BEGIN_INTERFACE

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

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

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

    /*** IInspectable methods ***/
    HRESULT (STDMETHODCALLTYPE *GetIids)(
        __x_ABI_CWindows_CUI_CComposition_CICompositionObject *This,
        ULONG *iidCount,
        IID **iids);

    HRESULT (STDMETHODCALLTYPE *GetRuntimeClassName)(
        __x_ABI_CWindows_CUI_CComposition_CICompositionObject *This,
        HSTRING *className);

    HRESULT (STDMETHODCALLTYPE *GetTrustLevel)(
        __x_ABI_CWindows_CUI_CComposition_CICompositionObject *This,
        TrustLevel *trustLevel);

    /*** ICompositionObject methods ***/
    HRESULT (STDMETHODCALLTYPE *get_Compositor)(
        __x_ABI_CWindows_CUI_CComposition_CICompositionObject *This,
        __x_ABI_CWindows_CUI_CComposition_CICompositor **value);

    HRESULT (STDMETHODCALLTYPE *get_Dispatcher)(
        __x_ABI_CWindows_CUI_CComposition_CICompositionObject *This,
        __x_ABI_CWindows_CUI_CCore_CICoreDispatcher **value);

    HRESULT (STDMETHODCALLTYPE *get_Properties)(
        __x_ABI_CWindows_CUI_CComposition_CICompositionObject *This,
        __x_ABI_CWindows_CUI_CComposition_CICompositionPropertySet **value);

    HRESULT (STDMETHODCALLTYPE *StartAnimation)(
        __x_ABI_CWindows_CUI_CComposition_CICompositionObject *This,
        HSTRING name,
        __x_ABI_CWindows_CUI_CComposition_CICompositionAnimation *animation);

    HRESULT (STDMETHODCALLTYPE *StopAnimation)(
        __x_ABI_CWindows_CUI_CComposition_CICompositionObject *This,
        HSTRING name);

    END_INTERFACE
} __x_ABI_CWindows_CUI_CComposition_CICompositionObjectVtbl;

interface __x_ABI_CWindows_CUI_CComposition_CICompositionObject {
    CONST_VTBL __x_ABI_CWindows_CUI_CComposition_CICompositionObjectVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define __x_ABI_CWindows_CUI_CComposition_CICompositionObject_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define __x_ABI_CWindows_CUI_CComposition_CICompositionObject_AddRef(This) (This)->lpVtbl->AddRef(This)
#define __x_ABI_CWindows_CUI_CComposition_CICompositionObject_Release(This) (This)->lpVtbl->Release(This)
/*** IInspectable methods ***/
#define __x_ABI_CWindows_CUI_CComposition_CICompositionObject_GetIids(This,iidCount,iids) (This)->lpVtbl->GetIids(This,iidCount,iids)
#define __x_ABI_CWindows_CUI_CComposition_CICompositionObject_GetRuntimeClassName(This,className) (This)->lpVtbl->GetRuntimeClassName(This,className)
#define __x_ABI_CWindows_CUI_CComposition_CICompositionObject_GetTrustLevel(This,trustLevel) (This)->lpVtbl->GetTrustLevel(This,trustLevel)
/*** ICompositionObject methods ***/
#define __x_ABI_CWindows_CUI_CComposition_CICompositionObject_get_Compositor(This,value) (This)->lpVtbl->get_Compositor(This,value)
#define __x_ABI_CWindows_CUI_CComposition_CICompositionObject_get_Dispatcher(This,value) (This)->lpVtbl->get_Dispatcher(This,value)
#define __x_ABI_CWindows_CUI_CComposition_CICompositionObject_get_Properties(This,value) (This)->lpVtbl->get_Properties(This,value)
#define __x_ABI_CWindows_CUI_CComposition_CICompositionObject_StartAnimation(This,name,animation) (This)->lpVtbl->StartAnimation(This,name,animation)
#define __x_ABI_CWindows_CUI_CComposition_CICompositionObject_StopAnimation(This,name) (This)->lpVtbl->StopAnimation(This,name)
#else
/*** IUnknown methods ***/
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CUI_CComposition_CICompositionObject_QueryInterface(__x_ABI_CWindows_CUI_CComposition_CICompositionObject* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG __x_ABI_CWindows_CUI_CComposition_CICompositionObject_AddRef(__x_ABI_CWindows_CUI_CComposition_CICompositionObject* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG __x_ABI_CWindows_CUI_CComposition_CICompositionObject_Release(__x_ABI_CWindows_CUI_CComposition_CICompositionObject* This) {
    return This->lpVtbl->Release(This);
}
/*** IInspectable methods ***/
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CUI_CComposition_CICompositionObject_GetIids(__x_ABI_CWindows_CUI_CComposition_CICompositionObject* This,ULONG *iidCount,IID **iids) {
    return This->lpVtbl->GetIids(This,iidCount,iids);
}
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CUI_CComposition_CICompositionObject_GetRuntimeClassName(__x_ABI_CWindows_CUI_CComposition_CICompositionObject* This,HSTRING *className) {
    return This->lpVtbl->GetRuntimeClassName(This,className);
}
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CUI_CComposition_CICompositionObject_GetTrustLevel(__x_ABI_CWindows_CUI_CComposition_CICompositionObject* This,TrustLevel *trustLevel) {
    return This->lpVtbl->GetTrustLevel(This,trustLevel);
}
/*** ICompositionObject methods ***/
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CUI_CComposition_CICompositionObject_get_Compositor(__x_ABI_CWindows_CUI_CComposition_CICompositionObject* This,__x_ABI_CWindows_CUI_CComposition_CICompositor **value) {
    return This->lpVtbl->get_Compositor(This,value);
}
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CUI_CComposition_CICompositionObject_get_Dispatcher(__x_ABI_CWindows_CUI_CComposition_CICompositionObject* This,__x_ABI_CWindows_CUI_CCore_CICoreDispatcher **value) {
    return This->lpVtbl->get_Dispatcher(This,value);
}
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CUI_CComposition_CICompositionObject_get_Properties(__x_ABI_CWindows_CUI_CComposition_CICompositionObject* This,__x_ABI_CWindows_CUI_CComposition_CICompositionPropertySet **value) {
    return This->lpVtbl->get_Properties(This,value);
}
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CUI_CComposition_CICompositionObject_StartAnimation(__x_ABI_CWindows_CUI_CComposition_CICompositionObject* This,HSTRING name,__x_ABI_CWindows_CUI_CComposition_CICompositionAnimation *animation) {
    return This->lpVtbl->StartAnimation(This,name,animation);
}
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CUI_CComposition_CICompositionObject_StopAnimation(__x_ABI_CWindows_CUI_CComposition_CICompositionObject* This,HSTRING name) {
    return This->lpVtbl->StopAnimation(This,name);
}
#endif
#ifdef WIDL_using_Windows_UI_Composition
#define IID_ICompositionObject IID___x_ABI_CWindows_CUI_CComposition_CICompositionObject
#define ICompositionObjectVtbl __x_ABI_CWindows_CUI_CComposition_CICompositionObjectVtbl
#define ICompositionObject __x_ABI_CWindows_CUI_CComposition_CICompositionObject
#define ICompositionObject_QueryInterface __x_ABI_CWindows_CUI_CComposition_CICompositionObject_QueryInterface
#define ICompositionObject_AddRef __x_ABI_CWindows_CUI_CComposition_CICompositionObject_AddRef
#define ICompositionObject_Release __x_ABI_CWindows_CUI_CComposition_CICompositionObject_Release
#define ICompositionObject_GetIids __x_ABI_CWindows_CUI_CComposition_CICompositionObject_GetIids
#define ICompositionObject_GetRuntimeClassName __x_ABI_CWindows_CUI_CComposition_CICompositionObject_GetRuntimeClassName
#define ICompositionObject_GetTrustLevel __x_ABI_CWindows_CUI_CComposition_CICompositionObject_GetTrustLevel
#define ICompositionObject_get_Compositor __x_ABI_CWindows_CUI_CComposition_CICompositionObject_get_Compositor
#define ICompositionObject_get_Dispatcher __x_ABI_CWindows_CUI_CComposition_CICompositionObject_get_Dispatcher
#define ICompositionObject_get_Properties __x_ABI_CWindows_CUI_CComposition_CICompositionObject_get_Properties
#define ICompositionObject_StartAnimation __x_ABI_CWindows_CUI_CComposition_CICompositionObject_StartAnimation
#define ICompositionObject_StopAnimation __x_ABI_CWindows_CUI_CComposition_CICompositionObject_StopAnimation
#endif /* WIDL_using_Windows_UI_Composition */
#endif

#endif

#endif  /* ____x_ABI_CWindows_CUI_CComposition_CICompositionObject_INTERFACE_DEFINED__ */
#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x20000 */

/*****************************************************************************
 * ICompositionObjectFactory interface
 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x20000
#ifndef ____x_ABI_CWindows_CUI_CComposition_CICompositionObjectFactory_INTERFACE_DEFINED__
#define ____x_ABI_CWindows_CUI_CComposition_CICompositionObjectFactory_INTERFACE_DEFINED__

DEFINE_GUID(IID___x_ABI_CWindows_CUI_CComposition_CICompositionObjectFactory, 0x51205c5e, 0x558a, 0x4f2a, 0x8d,0x39, 0x37,0xbf,0xe1,0xe2,0x0d,0xdd);
#if defined(__cplusplus) && !defined(CINTERFACE)
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace UI {
            namespace Composition {
                MIDL_INTERFACE("51205c5e-558a-4f2a-8d39-37bfe1e20ddd")
                ICompositionObjectFactory : public IInspectable
                {
                };
            }
        }
    }
}
extern "C" {
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(__x_ABI_CWindows_CUI_CComposition_CICompositionObjectFactory, 0x51205c5e, 0x558a, 0x4f2a, 0x8d,0x39, 0x37,0xbf,0xe1,0xe2,0x0d,0xdd)
#endif
#else
typedef struct __x_ABI_CWindows_CUI_CComposition_CICompositionObjectFactoryVtbl {
    BEGIN_INTERFACE

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

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

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

    /*** IInspectable methods ***/
    HRESULT (STDMETHODCALLTYPE *GetIids)(
        __x_ABI_CWindows_CUI_CComposition_CICompositionObjectFactory *This,
        ULONG *iidCount,
        IID **iids);

    HRESULT (STDMETHODCALLTYPE *GetRuntimeClassName)(
        __x_ABI_CWindows_CUI_CComposition_CICompositionObjectFactory *This,
        HSTRING *className);

    HRESULT (STDMETHODCALLTYPE *GetTrustLevel)(
        __x_ABI_CWindows_CUI_CComposition_CICompositionObjectFactory *This,
        TrustLevel *trustLevel);

    END_INTERFACE
} __x_ABI_CWindows_CUI_CComposition_CICompositionObjectFactoryVtbl;

interface __x_ABI_CWindows_CUI_CComposition_CICompositionObjectFactory {
    CONST_VTBL __x_ABI_CWindows_CUI_CComposition_CICompositionObjectFactoryVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define __x_ABI_CWindows_CUI_CComposition_CICompositionObjectFactory_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define __x_ABI_CWindows_CUI_CComposition_CICompositionObjectFactory_AddRef(This) (This)->lpVtbl->AddRef(This)
#define __x_ABI_CWindows_CUI_CComposition_CICompositionObjectFactory_Release(This) (This)->lpVtbl->Release(This)
/*** IInspectable methods ***/
#define __x_ABI_CWindows_CUI_CComposition_CICompositionObjectFactory_GetIids(This,iidCount,iids) (This)->lpVtbl->GetIids(This,iidCount,iids)
#define __x_ABI_CWindows_CUI_CComposition_CICompositionObjectFactory_GetRuntimeClassName(This,className) (This)->lpVtbl->GetRuntimeClassName(This,className)
#define __x_ABI_CWindows_CUI_CComposition_CICompositionObjectFactory_GetTrustLevel(This,trustLevel) (This)->lpVtbl->GetTrustLevel(This,trustLevel)
#else
/*** IUnknown methods ***/
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CUI_CComposition_CICompositionObjectFactory_QueryInterface(__x_ABI_CWindows_CUI_CComposition_CICompositionObjectFactory* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG __x_ABI_CWindows_CUI_CComposition_CICompositionObjectFactory_AddRef(__x_ABI_CWindows_CUI_CComposition_CICompositionObjectFactory* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG __x_ABI_CWindows_CUI_CComposition_CICompositionObjectFactory_Release(__x_ABI_CWindows_CUI_CComposition_CICompositionObjectFactory* This) {
    return This->lpVtbl->Release(This);
}
/*** IInspectable methods ***/
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CUI_CComposition_CICompositionObjectFactory_GetIids(__x_ABI_CWindows_CUI_CComposition_CICompositionObjectFactory* This,ULONG *iidCount,IID **iids) {
    return This->lpVtbl->GetIids(This,iidCount,iids);
}
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CUI_CComposition_CICompositionObjectFactory_GetRuntimeClassName(__x_ABI_CWindows_CUI_CComposition_CICompositionObjectFactory* This,HSTRING *className) {
    return This->lpVtbl->GetRuntimeClassName(This,className);
}
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CUI_CComposition_CICompositionObjectFactory_GetTrustLevel(__x_ABI_CWindows_CUI_CComposition_CICompositionObjectFactory* This,TrustLevel *trustLevel) {
    return This->lpVtbl->GetTrustLevel(This,trustLevel);
}
#endif
#ifdef WIDL_using_Windows_UI_Composition
#define IID_ICompositionObjectFactory IID___x_ABI_CWindows_CUI_CComposition_CICompositionObjectFactory
#define ICompositionObjectFactoryVtbl __x_ABI_CWindows_CUI_CComposition_CICompositionObjectFactoryVtbl
#define ICompositionObjectFactory __x_ABI_CWindows_CUI_CComposition_CICompositionObjectFactory
#define ICompositionObjectFactory_QueryInterface __x_ABI_CWindows_CUI_CComposition_CICompositionObjectFactory_QueryInterface
#define ICompositionObjectFactory_AddRef __x_ABI_CWindows_CUI_CComposition_CICompositionObjectFactory_AddRef
#define ICompositionObjectFactory_Release __x_ABI_CWindows_CUI_CComposition_CICompositionObjectFactory_Release
#define ICompositionObjectFactory_GetIids __x_ABI_CWindows_CUI_CComposition_CICompositionObjectFactory_GetIids
#define ICompositionObjectFactory_GetRuntimeClassName __x_ABI_CWindows_CUI_CComposition_CICompositionObjectFactory_GetRuntimeClassName
#define ICompositionObjectFactory_GetTrustLevel __x_ABI_CWindows_CUI_CComposition_CICompositionObjectFactory_GetTrustLevel
#endif /* WIDL_using_Windows_UI_Composition */
#endif

#endif

#endif  /* ____x_ABI_CWindows_CUI_CComposition_CICompositionObjectFactory_INTERFACE_DEFINED__ */
#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x20000 */

/*****************************************************************************
 * ICompositionBatchCompletedEventArgs interface
 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x20000
#ifndef ____x_ABI_CWindows_CUI_CComposition_CICompositionBatchCompletedEventArgs_INTERFACE_DEFINED__
#define ____x_ABI_CWindows_CUI_CComposition_CICompositionBatchCompletedEventArgs_INTERFACE_DEFINED__

DEFINE_GUID(IID___x_ABI_CWindows_CUI_CComposition_CICompositionBatchCompletedEventArgs, 0x0d00dad0, 0x9464, 0x450a, 0xa5,0x62, 0x2e,0x26,0x98,0xb0,0xa8,0x12);
#if defined(__cplusplus) && !defined(CINTERFACE)
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace UI {
            namespace Composition {
                MIDL_INTERFACE("0d00dad0-9464-450a-a562-2e2698b0a812")
                ICompositionBatchCompletedEventArgs : public IInspectable
                {
                };
            }
        }
    }
}
extern "C" {
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(__x_ABI_CWindows_CUI_CComposition_CICompositionBatchCompletedEventArgs, 0x0d00dad0, 0x9464, 0x450a, 0xa5,0x62, 0x2e,0x26,0x98,0xb0,0xa8,0x12)
#endif
#else
typedef struct __x_ABI_CWindows_CUI_CComposition_CICompositionBatchCompletedEventArgsVtbl {
    BEGIN_INTERFACE

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

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

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

    /*** IInspectable methods ***/
    HRESULT (STDMETHODCALLTYPE *GetIids)(
        __x_ABI_CWindows_CUI_CComposition_CICompositionBatchCompletedEventArgs *This,
        ULONG *iidCount,
        IID **iids);

    HRESULT (STDMETHODCALLTYPE *GetRuntimeClassName)(
        __x_ABI_CWindows_CUI_CComposition_CICompositionBatchCompletedEventArgs *This,
        HSTRING *className);

    HRESULT (STDMETHODCALLTYPE *GetTrustLevel)(
        __x_ABI_CWindows_CUI_CComposition_CICompositionBatchCompletedEventArgs *This,
        TrustLevel *trustLevel);

    END_INTERFACE
} __x_ABI_CWindows_CUI_CComposition_CICompositionBatchCompletedEventArgsVtbl;

interface __x_ABI_CWindows_CUI_CComposition_CICompositionBatchCompletedEventArgs {
    CONST_VTBL __x_ABI_CWindows_CUI_CComposition_CICompositionBatchCompletedEventArgsVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define __x_ABI_CWindows_CUI_CComposition_CICompositionBatchCompletedEventArgs_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define __x_ABI_CWindows_CUI_CComposition_CICompositionBatchCompletedEventArgs_AddRef(This) (This)->lpVtbl->AddRef(This)
#define __x_ABI_CWindows_CUI_CComposition_CICompositionBatchCompletedEventArgs_Release(This) (This)->lpVtbl->Release(This)
/*** IInspectable methods ***/
#define __x_ABI_CWindows_CUI_CComposition_CICompositionBatchCompletedEventArgs_GetIids(This,iidCount,iids) (This)->lpVtbl->GetIids(This,iidCount,iids)
#define __x_ABI_CWindows_CUI_CComposition_CICompositionBatchCompletedEventArgs_GetRuntimeClassName(This,className) (This)->lpVtbl->GetRuntimeClassName(This,className)
#define __x_ABI_CWindows_CUI_CComposition_CICompositionBatchCompletedEventArgs_GetTrustLevel(This,trustLevel) (This)->lpVtbl->GetTrustLevel(This,trustLevel)
#else
/*** IUnknown methods ***/
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CUI_CComposition_CICompositionBatchCompletedEventArgs_QueryInterface(__x_ABI_CWindows_CUI_CComposition_CICompositionBatchCompletedEventArgs* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG __x_ABI_CWindows_CUI_CComposition_CICompositionBatchCompletedEventArgs_AddRef(__x_ABI_CWindows_CUI_CComposition_CICompositionBatchCompletedEventArgs* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG __x_ABI_CWindows_CUI_CComposition_CICompositionBatchCompletedEventArgs_Release(__x_ABI_CWindows_CUI_CComposition_CICompositionBatchCompletedEventArgs* This) {
    return This->lpVtbl->Release(This);
}
/*** IInspectable methods ***/
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CUI_CComposition_CICompositionBatchCompletedEventArgs_GetIids(__x_ABI_CWindows_CUI_CComposition_CICompositionBatchCompletedEventArgs* This,ULONG *iidCount,IID **iids) {
    return This->lpVtbl->GetIids(This,iidCount,iids);
}
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CUI_CComposition_CICompositionBatchCompletedEventArgs_GetRuntimeClassName(__x_ABI_CWindows_CUI_CComposition_CICompositionBatchCompletedEventArgs* This,HSTRING *className) {
    return This->lpVtbl->GetRuntimeClassName(This,className);
}
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CUI_CComposition_CICompositionBatchCompletedEventArgs_GetTrustLevel(__x_ABI_CWindows_CUI_CComposition_CICompositionBatchCompletedEventArgs* This,TrustLevel *trustLevel) {
    return This->lpVtbl->GetTrustLevel(This,trustLevel);
}
#endif
#ifdef WIDL_using_Windows_UI_Composition
#define IID_ICompositionBatchCompletedEventArgs IID___x_ABI_CWindows_CUI_CComposition_CICompositionBatchCompletedEventArgs
#define ICompositionBatchCompletedEventArgsVtbl __x_ABI_CWindows_CUI_CComposition_CICompositionBatchCompletedEventArgsVtbl
#define ICompositionBatchCompletedEventArgs __x_ABI_CWindows_CUI_CComposition_CICompositionBatchCompletedEventArgs
#define ICompositionBatchCompletedEventArgs_QueryInterface __x_ABI_CWindows_CUI_CComposition_CICompositionBatchCompletedEventArgs_QueryInterface
#define ICompositionBatchCompletedEventArgs_AddRef __x_ABI_CWindows_CUI_CComposition_CICompositionBatchCompletedEventArgs_AddRef
#define ICompositionBatchCompletedEventArgs_Release __x_ABI_CWindows_CUI_CComposition_CICompositionBatchCompletedEventArgs_Release
#define ICompositionBatchCompletedEventArgs_GetIids __x_ABI_CWindows_CUI_CComposition_CICompositionBatchCompletedEventArgs_GetIids
#define ICompositionBatchCompletedEventArgs_GetRuntimeClassName __x_ABI_CWindows_CUI_CComposition_CICompositionBatchCompletedEventArgs_GetRuntimeClassName
#define ICompositionBatchCompletedEventArgs_GetTrustLevel __x_ABI_CWindows_CUI_CComposition_CICompositionBatchCompletedEventArgs_GetTrustLevel
#endif /* WIDL_using_Windows_UI_Composition */
#endif

#endif

#endif  /* ____x_ABI_CWindows_CUI_CComposition_CICompositionBatchCompletedEventArgs_INTERFACE_DEFINED__ */
#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x20000 */

/*****************************************************************************
 * ICompositionBrush interface
 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x20000
#ifndef ____x_ABI_CWindows_CUI_CComposition_CICompositionBrush_INTERFACE_DEFINED__
#define ____x_ABI_CWindows_CUI_CComposition_CICompositionBrush_INTERFACE_DEFINED__

DEFINE_GUID(IID___x_ABI_CWindows_CUI_CComposition_CICompositionBrush, 0xab0d7608, 0x30c0, 0x40e9, 0xb5,0x68, 0xb6,0x0a,0x6b,0xd1,0xfb,0x46);
#if defined(__cplusplus) && !defined(CINTERFACE)
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace UI {
            namespace Composition {
                MIDL_INTERFACE("ab0d7608-30c0-40e9-b568-b60a6bd1fb46")
                ICompositionBrush : public IInspectable
                {
                };
            }
        }
    }
}
extern "C" {
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(__x_ABI_CWindows_CUI_CComposition_CICompositionBrush, 0xab0d7608, 0x30c0, 0x40e9, 0xb5,0x68, 0xb6,0x0a,0x6b,0xd1,0xfb,0x46)
#endif
#else
typedef struct __x_ABI_CWindows_CUI_CComposition_CICompositionBrushVtbl {
    BEGIN_INTERFACE

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

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

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

    /*** IInspectable methods ***/
    HRESULT (STDMETHODCALLTYPE *GetIids)(
        __x_ABI_CWindows_CUI_CComposition_CICompositionBrush *This,
        ULONG *iidCount,
        IID **iids);

    HRESULT (STDMETHODCALLTYPE *GetRuntimeClassName)(
        __x_ABI_CWindows_CUI_CComposition_CICompositionBrush *This,
        HSTRING *className);

    HRESULT (STDMETHODCALLTYPE *GetTrustLevel)(
        __x_ABI_CWindows_CUI_CComposition_CICompositionBrush *This,
        TrustLevel *trustLevel);

    END_INTERFACE
} __x_ABI_CWindows_CUI_CComposition_CICompositionBrushVtbl;

interface __x_ABI_CWindows_CUI_CComposition_CICompositionBrush {
    CONST_VTBL __x_ABI_CWindows_CUI_CComposition_CICompositionBrushVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define __x_ABI_CWindows_CUI_CComposition_CICompositionBrush_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define __x_ABI_CWindows_CUI_CComposition_CICompositionBrush_AddRef(This) (This)->lpVtbl->AddRef(This)
#define __x_ABI_CWindows_CUI_CComposition_CICompositionBrush_Release(This) (This)->lpVtbl->Release(This)
/*** IInspectable methods ***/
#define __x_ABI_CWindows_CUI_CComposition_CICompositionBrush_GetIids(This,iidCount,iids) (This)->lpVtbl->GetIids(This,iidCount,iids)
#define __x_ABI_CWindows_CUI_CComposition_CICompositionBrush_GetRuntimeClassName(This,className) (This)->lpVtbl->GetRuntimeClassName(This,className)
#define __x_ABI_CWindows_CUI_CComposition_CICompositionBrush_GetTrustLevel(This,trustLevel) (This)->lpVtbl->GetTrustLevel(This,trustLevel)
#else
/*** IUnknown methods ***/
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CUI_CComposition_CICompositionBrush_QueryInterface(__x_ABI_CWindows_CUI_CComposition_CICompositionBrush* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG __x_ABI_CWindows_CUI_CComposition_CICompositionBrush_AddRef(__x_ABI_CWindows_CUI_CComposition_CICompositionBrush* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG __x_ABI_CWindows_CUI_CComposition_CICompositionBrush_Release(__x_ABI_CWindows_CUI_CComposition_CICompositionBrush* This) {
    return This->lpVtbl->Release(This);
}
/*** IInspectable methods ***/
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CUI_CComposition_CICompositionBrush_GetIids(__x_ABI_CWindows_CUI_CComposition_CICompositionBrush* This,ULONG *iidCount,IID **iids) {
    return This->lpVtbl->GetIids(This,iidCount,iids);
}
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CUI_CComposition_CICompositionBrush_GetRuntimeClassName(__x_ABI_CWindows_CUI_CComposition_CICompositionBrush* This,HSTRING *className) {
    return This->lpVtbl->GetRuntimeClassName(This,className);
}
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CUI_CComposition_CICompositionBrush_GetTrustLevel(__x_ABI_CWindows_CUI_CComposition_CICompositionBrush* This,TrustLevel *trustLevel) {
    return This->lpVtbl->GetTrustLevel(This,trustLevel);
}
#endif
#ifdef WIDL_using_Windows_UI_Composition
#define IID_ICompositionBrush IID___x_ABI_CWindows_CUI_CComposition_CICompositionBrush
#define ICompositionBrushVtbl __x_ABI_CWindows_CUI_CComposition_CICompositionBrushVtbl
#define ICompositionBrush __x_ABI_CWindows_CUI_CComposition_CICompositionBrush
#define ICompositionBrush_QueryInterface __x_ABI_CWindows_CUI_CComposition_CICompositionBrush_QueryInterface
#define ICompositionBrush_AddRef __x_ABI_CWindows_CUI_CComposition_CICompositionBrush_AddRef
#define ICompositionBrush_Release __x_ABI_CWindows_CUI_CComposition_CICompositionBrush_Release
#define ICompositionBrush_GetIids __x_ABI_CWindows_CUI_CComposition_CICompositionBrush_GetIids
#define ICompositionBrush_GetRuntimeClassName __x_ABI_CWindows_CUI_CComposition_CICompositionBrush_GetRuntimeClassName
#define ICompositionBrush_GetTrustLevel __x_ABI_CWindows_CUI_CComposition_CICompositionBrush_GetTrustLevel
#endif /* WIDL_using_Windows_UI_Composition */
#endif

#endif

#endif  /* ____x_ABI_CWindows_CUI_CComposition_CICompositionBrush_INTERFACE_DEFINED__ */
#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x20000 */

/*****************************************************************************
 * ICompositionBrushFactory interface
 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x20000
#ifndef ____x_ABI_CWindows_CUI_CComposition_CICompositionBrushFactory_INTERFACE_DEFINED__
#define ____x_ABI_CWindows_CUI_CComposition_CICompositionBrushFactory_INTERFACE_DEFINED__

DEFINE_GUID(IID___x_ABI_CWindows_CUI_CComposition_CICompositionBrushFactory, 0xda53fb4c, 0x4650, 0x47c4, 0xad,0x76, 0x76,0x53,0x79,0x60,0x7e,0xd6);
#if defined(__cplusplus) && !defined(CINTERFACE)
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace UI {
            namespace Composition {
                MIDL_INTERFACE("da53fb4c-4650-47c4-ad76-765379607ed6")
                ICompositionBrushFactory : public IInspectable
                {
                };
            }
        }
    }
}
extern "C" {
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(__x_ABI_CWindows_CUI_CComposition_CICompositionBrushFactory, 0xda53fb4c, 0x4650, 0x47c4, 0xad,0x76, 0x76,0x53,0x79,0x60,0x7e,0xd6)
#endif
#else
typedef struct __x_ABI_CWindows_CUI_CComposition_CICompositionBrushFactoryVtbl {
    BEGIN_INTERFACE

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

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

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

    /*** IInspectable methods ***/
    HRESULT (STDMETHODCALLTYPE *GetIids)(
        __x_ABI_CWindows_CUI_CComposition_CICompositionBrushFactory *This,
        ULONG *iidCount,
        IID **iids);

    HRESULT (STDMETHODCALLTYPE *GetRuntimeClassName)(
        __x_ABI_CWindows_CUI_CComposition_CICompositionBrushFactory *This,
        HSTRING *className);

    HRESULT (STDMETHODCALLTYPE *GetTrustLevel)(
        __x_ABI_CWindows_CUI_CComposition_CICompositionBrushFactory *This,
        TrustLevel *trustLevel);

    END_INTERFACE
} __x_ABI_CWindows_CUI_CComposition_CICompositionBrushFactoryVtbl;

interface __x_ABI_CWindows_CUI_CComposition_CICompositionBrushFactory {
    CONST_VTBL __x_ABI_CWindows_CUI_CComposition_CICompositionBrushFactoryVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define __x_ABI_CWindows_CUI_CComposition_CICompositionBrushFactory_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define __x_ABI_CWindows_CUI_CComposition_CICompositionBrushFactory_AddRef(This) (This)->lpVtbl->AddRef(This)
#define __x_ABI_CWindows_CUI_CComposition_CICompositionBrushFactory_Release(This) (This)->lpVtbl->Release(This)
/*** IInspectable methods ***/
#define __x_ABI_CWindows_CUI_CComposition_CICompositionBrushFactory_GetIids(This,iidCount,iids) (This)->lpVtbl->GetIids(This,iidCount,iids)
#define __x_ABI_CWindows_CUI_CComposition_CICompositionBrushFactory_GetRuntimeClassName(This,className) (This)->lpVtbl->GetRuntimeClassName(This,className)
#define __x_ABI_CWindows_CUI_CComposition_CICompositionBrushFactory_GetTrustLevel(This,trustLevel) (This)->lpVtbl->GetTrustLevel(This,trustLevel)
#else
/*** IUnknown methods ***/
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CUI_CComposition_CICompositionBrushFactory_QueryInterface(__x_ABI_CWindows_CUI_CComposition_CICompositionBrushFactory* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG __x_ABI_CWindows_CUI_CComposition_CICompositionBrushFactory_AddRef(__x_ABI_CWindows_CUI_CComposition_CICompositionBrushFactory* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG __x_ABI_CWindows_CUI_CComposition_CICompositionBrushFactory_Release(__x_ABI_CWindows_CUI_CComposition_CICompositionBrushFactory* This) {
    return This->lpVtbl->Release(This);
}
/*** IInspectable methods ***/
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CUI_CComposition_CICompositionBrushFactory_GetIids(__x_ABI_CWindows_CUI_CComposition_CICompositionBrushFactory* This,ULONG *iidCount,IID **iids) {
    return This->lpVtbl->GetIids(This,iidCount,iids);
}
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CUI_CComposition_CICompositionBrushFactory_GetRuntimeClassName(__x_ABI_CWindows_CUI_CComposition_CICompositionBrushFactory* This,HSTRING *className) {
    return This->lpVtbl->GetRuntimeClassName(This,className);
}
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CUI_CComposition_CICompositionBrushFactory_GetTrustLevel(__x_ABI_CWindows_CUI_CComposition_CICompositionBrushFactory* This,TrustLevel *trustLevel) {
    return This->lpVtbl->GetTrustLevel(This,trustLevel);
}
#endif
#ifdef WIDL_using_Windows_UI_Composition
#define IID_ICompositionBrushFactory IID___x_ABI_CWindows_CUI_CComposition_CICompositionBrushFactory
#define ICompositionBrushFactoryVtbl __x_ABI_CWindows_CUI_CComposition_CICompositionBrushFactoryVtbl
#define ICompositionBrushFactory __x_ABI_CWindows_CUI_CComposition_CICompositionBrushFactory
#define ICompositionBrushFactory_QueryInterface __x_ABI_CWindows_CUI_CComposition_CICompositionBrushFactory_QueryInterface
#define ICompositionBrushFactory_AddRef __x_ABI_CWindows_CUI_CComposition_CICompositionBrushFactory_AddRef
#define ICompositionBrushFactory_Release __x_ABI_CWindows_CUI_CComposition_CICompositionBrushFactory_Release
#define ICompositionBrushFactory_GetIids __x_ABI_CWindows_CUI_CComposition_CICompositionBrushFactory_GetIids
#define ICompositionBrushFactory_GetRuntimeClassName __x_ABI_CWindows_CUI_CComposition_CICompositionBrushFactory_GetRuntimeClassName
#define ICompositionBrushFactory_GetTrustLevel __x_ABI_CWindows_CUI_CComposition_CICompositionBrushFactory_GetTrustLevel
#endif /* WIDL_using_Windows_UI_Composition */
#endif

#endif

#endif  /* ____x_ABI_CWindows_CUI_CComposition_CICompositionBrushFactory_INTERFACE_DEFINED__ */
#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x20000 */

/*****************************************************************************
 * ICompositionClip interface
 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x20000
#ifndef ____x_ABI_CWindows_CUI_CComposition_CICompositionClip_INTERFACE_DEFINED__
#define ____x_ABI_CWindows_CUI_CComposition_CICompositionClip_INTERFACE_DEFINED__

DEFINE_GUID(IID___x_ABI_CWindows_CUI_CComposition_CICompositionClip, 0x1ccd2a52, 0xcfc7, 0x4ace, 0x99,0x83, 0x14,0x6b,0xb8,0xeb,0x6a,0x3c);
#if defined(__cplusplus) && !defined(CINTERFACE)
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace UI {
            namespace Composition {
                MIDL_INTERFACE("1ccd2a52-cfc7-4ace-9983-146bb8eb6a3c")
                ICompositionClip : public IInspectable
                {
                };
            }
        }
    }
}
extern "C" {
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(__x_ABI_CWindows_CUI_CComposition_CICompositionClip, 0x1ccd2a52, 0xcfc7, 0x4ace, 0x99,0x83, 0x14,0x6b,0xb8,0xeb,0x6a,0x3c)
#endif
#else
typedef struct __x_ABI_CWindows_CUI_CComposition_CICompositionClipVtbl {
    BEGIN_INTERFACE

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

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

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

    /*** IInspectable methods ***/
    HRESULT (STDMETHODCALLTYPE *GetIids)(
        __x_ABI_CWindows_CUI_CComposition_CICompositionClip *This,
        ULONG *iidCount,
        IID **iids);

    HRESULT (STDMETHODCALLTYPE *GetRuntimeClassName)(
        __x_ABI_CWindows_CUI_CComposition_CICompositionClip *This,
        HSTRING *className);

    HRESULT (STDMETHODCALLTYPE *GetTrustLevel)(
        __x_ABI_CWindows_CUI_CComposition_CICompositionClip *This,
        TrustLevel *trustLevel);

    END_INTERFACE
} __x_ABI_CWindows_CUI_CComposition_CICompositionClipVtbl;

interface __x_ABI_CWindows_CUI_CComposition_CICompositionClip {
    CONST_VTBL __x_ABI_CWindows_CUI_CComposition_CICompositionClipVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define __x_ABI_CWindows_CUI_CComposition_CICompositionClip_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define __x_ABI_CWindows_CUI_CComposition_CICompositionClip_AddRef(This) (This)->lpVtbl->AddRef(This)
#define __x_ABI_CWindows_CUI_CComposition_CICompositionClip_Release(This) (This)->lpVtbl->Release(This)
/*** IInspectable methods ***/
#define __x_ABI_CWindows_CUI_CComposition_CICompositionClip_GetIids(This,iidCount,iids) (This)->lpVtbl->GetIids(This,iidCount,iids)
#define __x_ABI_CWindows_CUI_CComposition_CICompositionClip_GetRuntimeClassName(This,className) (This)->lpVtbl->GetRuntimeClassName(This,className)
#define __x_ABI_CWindows_CUI_CComposition_CICompositionClip_GetTrustLevel(This,trustLevel) (This)->lpVtbl->GetTrustLevel(This,trustLevel)
#else
/*** IUnknown methods ***/
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CUI_CComposition_CICompositionClip_QueryInterface(__x_ABI_CWindows_CUI_CComposition_CICompositionClip* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG __x_ABI_CWindows_CUI_CComposition_CICompositionClip_AddRef(__x_ABI_CWindows_CUI_CComposition_CICompositionClip* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG __x_ABI_CWindows_CUI_CComposition_CICompositionClip_Release(__x_ABI_CWindows_CUI_CComposition_CICompositionClip* This) {
    return This->lpVtbl->Release(This);
}
/*** IInspectable methods ***/
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CUI_CComposition_CICompositionClip_GetIids(__x_ABI_CWindows_CUI_CComposition_CICompositionClip* This,ULONG *iidCount,IID **iids) {
    return This->lpVtbl->GetIids(This,iidCount,iids);
}
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CUI_CComposition_CICompositionClip_GetRuntimeClassName(__x_ABI_CWindows_CUI_CComposition_CICompositionClip* This,HSTRING *className) {
    return This->lpVtbl->GetRuntimeClassName(This,className);
}
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CUI_CComposition_CICompositionClip_GetTrustLevel(__x_ABI_CWindows_CUI_CComposition_CICompositionClip* This,TrustLevel *trustLevel) {
    return This->lpVtbl->GetTrustLevel(This,trustLevel);
}
#endif
#ifdef WIDL_using_Windows_UI_Composition
#define IID_ICompositionClip IID___x_ABI_CWindows_CUI_CComposition_CICompositionClip
#define ICompositionClipVtbl __x_ABI_CWindows_CUI_CComposition_CICompositionClipVtbl
#define ICompositionClip __x_ABI_CWindows_CUI_CComposition_CICompositionClip
#define ICompositionClip_QueryInterface __x_ABI_CWindows_CUI_CComposition_CICompositionClip_QueryInterface
#define ICompositionClip_AddRef __x_ABI_CWindows_CUI_CComposition_CICompositionClip_AddRef
#define ICompositionClip_Release __x_ABI_CWindows_CUI_CComposition_CICompositionClip_Release
#define ICompositionClip_GetIids __x_ABI_CWindows_CUI_CComposition_CICompositionClip_GetIids
#define ICompositionClip_GetRuntimeClassName __x_ABI_CWindows_CUI_CComposition_CICompositionClip_GetRuntimeClassName
#define ICompositionClip_GetTrustLevel __x_ABI_CWindows_CUI_CComposition_CICompositionClip_GetTrustLevel
#endif /* WIDL_using_Windows_UI_Composition */
#endif

#endif

#endif  /* ____x_ABI_CWindows_CUI_CComposition_CICompositionClip_INTERFACE_DEFINED__ */
#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x20000 */

/*****************************************************************************
 * ICompositionClipFactory interface
 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x20000
#ifndef ____x_ABI_CWindows_CUI_CComposition_CICompositionClipFactory_INTERFACE_DEFINED__
#define ____x_ABI_CWindows_CUI_CComposition_CICompositionClipFactory_INTERFACE_DEFINED__

DEFINE_GUID(IID___x_ABI_CWindows_CUI_CComposition_CICompositionClipFactory, 0xb9484caf, 0x20c7, 0x4aed, 0xac,0x4a, 0x9c,0x78,0xba,0x13,0x02,0xcf);
#if defined(__cplusplus) && !defined(CINTERFACE)
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace UI {
            namespace Composition {
                MIDL_INTERFACE("b9484caf-20c7-4aed-ac4a-9c78ba1302cf")
                ICompositionClipFactory : public IInspectable
                {
                };
            }
        }
    }
}
extern "C" {
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(__x_ABI_CWindows_CUI_CComposition_CICompositionClipFactory, 0xb9484caf, 0x20c7, 0x4aed, 0xac,0x4a, 0x9c,0x78,0xba,0x13,0x02,0xcf)
#endif
#else
typedef struct __x_ABI_CWindows_CUI_CComposition_CICompositionClipFactoryVtbl {
    BEGIN_INTERFACE

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

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

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

    /*** IInspectable methods ***/
    HRESULT (STDMETHODCALLTYPE *GetIids)(
        __x_ABI_CWindows_CUI_CComposition_CICompositionClipFactory *This,
        ULONG *iidCount,
        IID **iids);

    HRESULT (STDMETHODCALLTYPE *GetRuntimeClassName)(
        __x_ABI_CWindows_CUI_CComposition_CICompositionClipFactory *This,
        HSTRING *className);

    HRESULT (STDMETHODCALLTYPE *GetTrustLevel)(
        __x_ABI_CWindows_CUI_CComposition_CICompositionClipFactory *This,
        TrustLevel *trustLevel);

    END_INTERFACE
} __x_ABI_CWindows_CUI_CComposition_CICompositionClipFactoryVtbl;

interface __x_ABI_CWindows_CUI_CComposition_CICompositionClipFactory {
    CONST_VTBL __x_ABI_CWindows_CUI_CComposition_CICompositionClipFactoryVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define __x_ABI_CWindows_CUI_CComposition_CICompositionClipFactory_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define __x_ABI_CWindows_CUI_CComposition_CICompositionClipFactory_AddRef(This) (This)->lpVtbl->AddRef(This)
#define __x_ABI_CWindows_CUI_CComposition_CICompositionClipFactory_Release(This) (This)->lpVtbl->Release(This)
/*** IInspectable methods ***/
#define __x_ABI_CWindows_CUI_CComposition_CICompositionClipFactory_GetIids(This,iidCount,iids) (This)->lpVtbl->GetIids(This,iidCount,iids)
#define __x_ABI_CWindows_CUI_CComposition_CICompositionClipFactory_GetRuntimeClassName(This,className) (This)->lpVtbl->GetRuntimeClassName(This,className)
#define __x_ABI_CWindows_CUI_CComposition_CICompositionClipFactory_GetTrustLevel(This,trustLevel) (This)->lpVtbl->GetTrustLevel(This,trustLevel)
#else
/*** IUnknown methods ***/
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CUI_CComposition_CICompositionClipFactory_QueryInterface(__x_ABI_CWindows_CUI_CComposition_CICompositionClipFactory* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG __x_ABI_CWindows_CUI_CComposition_CICompositionClipFactory_AddRef(__x_ABI_CWindows_CUI_CComposition_CICompositionClipFactory* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG __x_ABI_CWindows_CUI_CComposition_CICompositionClipFactory_Release(__x_ABI_CWindows_CUI_CComposition_CICompositionClipFactory* This) {
    return This->lpVtbl->Release(This);
}
/*** IInspectable methods ***/
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CUI_CComposition_CICompositionClipFactory_GetIids(__x_ABI_CWindows_CUI_CComposition_CICompositionClipFactory* This,ULONG *iidCount,IID **iids) {
    return This->lpVtbl->GetIids(This,iidCount,iids);
}
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CUI_CComposition_CICompositionClipFactory_GetRuntimeClassName(__x_ABI_CWindows_CUI_CComposition_CICompositionClipFactory* This,HSTRING *className) {
    return This->lpVtbl->GetRuntimeClassName(This,className);
}
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CUI_CComposition_CICompositionClipFactory_GetTrustLevel(__x_ABI_CWindows_CUI_CComposition_CICompositionClipFactory* This,TrustLevel *trustLevel) {
    return This->lpVtbl->GetTrustLevel(This,trustLevel);
}
#endif
#ifdef WIDL_using_Windows_UI_Composition
#define IID_ICompositionClipFactory IID___x_ABI_CWindows_CUI_CComposition_CICompositionClipFactory
#define ICompositionClipFactoryVtbl __x_ABI_CWindows_CUI_CComposition_CICompositionClipFactoryVtbl
#define ICompositionClipFactory __x_ABI_CWindows_CUI_CComposition_CICompositionClipFactory
#define ICompositionClipFactory_QueryInterface __x_ABI_CWindows_CUI_CComposition_CICompositionClipFactory_QueryInterface
#define ICompositionClipFactory_AddRef __x_ABI_CWindows_CUI_CComposition_CICompositionClipFactory_AddRef
#define ICompositionClipFactory_Release __x_ABI_CWindows_CUI_CComposition_CICompositionClipFactory_Release
#define ICompositionClipFactory_GetIids __x_ABI_CWindows_CUI_CComposition_CICompositionClipFactory_GetIids
#define ICompositionClipFactory_GetRuntimeClassName __x_ABI_CWindows_CUI_CComposition_CICompositionClipFactory_GetRuntimeClassName
#define ICompositionClipFactory_GetTrustLevel __x_ABI_CWindows_CUI_CComposition_CICompositionClipFactory_GetTrustLevel
#endif /* WIDL_using_Windows_UI_Composition */
#endif

#endif

#endif  /* ____x_ABI_CWindows_CUI_CComposition_CICompositionClipFactory_INTERFACE_DEFINED__ */
#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x20000 */

/*****************************************************************************
 * ICompositionColorBrush interface
 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x20000
#ifndef ____x_ABI_CWindows_CUI_CComposition_CICompositionColorBrush_INTERFACE_DEFINED__
#define ____x_ABI_CWindows_CUI_CComposition_CICompositionColorBrush_INTERFACE_DEFINED__

DEFINE_GUID(IID___x_ABI_CWindows_CUI_CComposition_CICompositionColorBrush, 0x2b264c5e, 0xbf35, 0x4831, 0x86,0x42, 0xcf,0x70,0xc2,0x0f,0xff,0x2f);
#if defined(__cplusplus) && !defined(CINTERFACE)
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace UI {
            namespace Composition {
                MIDL_INTERFACE("2b264c5e-bf35-4831-8642-cf70c20fff2f")
                ICompositionColorBrush : public IInspectable
                {
                    virtual HRESULT STDMETHODCALLTYPE get_Color(
                        struct Color *value) = 0;

                    virtual HRESULT STDMETHODCALLTYPE put_Color(
                        struct Color value) = 0;

                };
            }
        }
    }
}
extern "C" {
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(__x_ABI_CWindows_CUI_CComposition_CICompositionColorBrush, 0x2b264c5e, 0xbf35, 0x4831, 0x86,0x42, 0xcf,0x70,0xc2,0x0f,0xff,0x2f)
#endif
#else
typedef struct __x_ABI_CWindows_CUI_CComposition_CICompositionColorBrushVtbl {
    BEGIN_INTERFACE

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

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

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

    /*** IInspectable methods ***/
    HRESULT (STDMETHODCALLTYPE *GetIids)(
        __x_ABI_CWindows_CUI_CComposition_CICompositionColorBrush *This,
        ULONG *iidCount,
        IID **iids);

    HRESULT (STDMETHODCALLTYPE *GetRuntimeClassName)(
        __x_ABI_CWindows_CUI_CComposition_CICompositionColorBrush *This,
        HSTRING *className);

    HRESULT (STDMETHODCALLTYPE *GetTrustLevel)(
        __x_ABI_CWindows_CUI_CComposition_CICompositionColorBrush *This,
        TrustLevel *trustLevel);

    /*** ICompositionColorBrush methods ***/
    HRESULT (STDMETHODCALLTYPE *get_Color)(
        __x_ABI_CWindows_CUI_CComposition_CICompositionColorBrush *This,
        struct __x_ABI_CWindows_CUI_CColor *value);

    HRESULT (STDMETHODCALLTYPE *put_Color)(
        __x_ABI_CWindows_CUI_CComposition_CICompositionColorBrush *This,
        struct __x_ABI_CWindows_CUI_CColor value);

    END_INTERFACE
} __x_ABI_CWindows_CUI_CComposition_CICompositionColorBrushVtbl;

interface __x_ABI_CWindows_CUI_CComposition_CICompositionColorBrush {
    CONST_VTBL __x_ABI_CWindows_CUI_CComposition_CICompositionColorBrushVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define __x_ABI_CWindows_CUI_CComposition_CICompositionColorBrush_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define __x_ABI_CWindows_CUI_CComposition_CICompositionColorBrush_AddRef(This) (This)->lpVtbl->AddRef(This)
#define __x_ABI_CWindows_CUI_CComposition_CICompositionColorBrush_Release(This) (This)->lpVtbl->Release(This)
/*** IInspectable methods ***/
#define __x_ABI_CWindows_CUI_CComposition_CICompositionColorBrush_GetIids(This,iidCount,iids) (This)->lpVtbl->GetIids(This,iidCount,iids)
#define __x_ABI_CWindows_CUI_CComposition_CICompositionColorBrush_GetRuntimeClassName(This,className) (This)->lpVtbl->GetRuntimeClassName(This,className)
#define __x_ABI_CWindows_CUI_CComposition_CICompositionColorBrush_GetTrustLevel(This,trustLevel) (This)->lpVtbl->GetTrustLevel(This,trustLevel)
/*** ICompositionColorBrush methods ***/
#define __x_ABI_CWindows_CUI_CComposition_CICompositionColorBrush_get_Color(This,value) (This)->lpVtbl->get_Color(This,value)
#define __x_ABI_CWindows_CUI_CComposition_CICompositionColorBrush_put_Color(This,value) (This)->lpVtbl->put_Color(This,value)
#else
/*** IUnknown methods ***/
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CUI_CComposition_CICompositionColorBrush_QueryInterface(__x_ABI_CWindows_CUI_CComposition_CICompositionColorBrush* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG __x_ABI_CWindows_CUI_CComposition_CICompositionColorBrush_AddRef(__x_ABI_CWindows_CUI_CComposition_CICompositionColorBrush* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG __x_ABI_CWindows_CUI_CComposition_CICompositionColorBrush_Release(__x_ABI_CWindows_CUI_CComposition_CICompositionColorBrush* This) {
    return This->lpVtbl->Release(This);
}
/*** IInspectable methods ***/
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CUI_CComposition_CICompositionColorBrush_GetIids(__x_ABI_CWindows_CUI_CComposition_CICompositionColorBrush* This,ULONG *iidCount,IID **iids) {
    return This->lpVtbl->GetIids(This,iidCount,iids);
}
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CUI_CComposition_CICompositionColorBrush_GetRuntimeClassName(__x_ABI_CWindows_CUI_CComposition_CICompositionColorBrush* This,HSTRING *className) {
    return This->lpVtbl->GetRuntimeClassName(This,className);
}
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CUI_CComposition_CICompositionColorBrush_GetTrustLevel(__x_ABI_CWindows_CUI_CComposition_CICompositionColorBrush* This,TrustLevel *trustLevel) {
    return This->lpVtbl->GetTrustLevel(This,trustLevel);
}
/*** ICompositionColorBrush methods ***/
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CUI_CComposition_CICompositionColorBrush_get_Color(__x_ABI_CWindows_CUI_CComposition_CICompositionColorBrush* This,struct __x_ABI_CWindows_CUI_CColor *value) {
    return This->lpVtbl->get_Color(This,value);
}
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CUI_CComposition_CICompositionColorBrush_put_Color(__x_ABI_CWindows_CUI_CComposition_CICompositionColorBrush* This,struct __x_ABI_CWindows_CUI_CColor value) {
    return This->lpVtbl->put_Color(This,value);
}
#endif
#ifdef WIDL_using_Windows_UI_Composition
#define IID_ICompositionColorBrush IID___x_ABI_CWindows_CUI_CComposition_CICompositionColorBrush
#define ICompositionColorBrushVtbl __x_ABI_CWindows_CUI_CComposition_CICompositionColorBrushVtbl
#define ICompositionColorBrush __x_ABI_CWindows_CUI_CComposition_CICompositionColorBrush
#define ICompositionColorBrush_QueryInterface __x_ABI_CWindows_CUI_CComposition_CICompositionColorBrush_QueryInterface
#define ICompositionColorBrush_AddRef __x_ABI_CWindows_CUI_CComposition_CICompositionColorBrush_AddRef
#define ICompositionColorBrush_Release __x_ABI_CWindows_CUI_CComposition_CICompositionColorBrush_Release
#define ICompositionColorBrush_GetIids __x_ABI_CWindows_CUI_CComposition_CICompositionColorBrush_GetIids
#define ICompositionColorBrush_GetRuntimeClassName __x_ABI_CWindows_CUI_CComposition_CICompositionColorBrush_GetRuntimeClassName
#define ICompositionColorBrush_GetTrustLevel __x_ABI_CWindows_CUI_CComposition_CICompositionColorBrush_GetTrustLevel
#define ICompositionColorBrush_get_Color __x_ABI_CWindows_CUI_CComposition_CICompositionColorBrush_get_Color
#define ICompositionColorBrush_put_Color __x_ABI_CWindows_CUI_CComposition_CICompositionColorBrush_put_Color
#endif /* WIDL_using_Windows_UI_Composition */
#endif

#endif

#endif  /* ____x_ABI_CWindows_CUI_CComposition_CICompositionColorBrush_INTERFACE_DEFINED__ */
#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x20000 */

/*****************************************************************************
 * ICompositionCommitBatch interface
 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x20000
#ifndef ____x_ABI_CWindows_CUI_CComposition_CICompositionCommitBatch_INTERFACE_DEFINED__
#define ____x_ABI_CWindows_CUI_CComposition_CICompositionCommitBatch_INTERFACE_DEFINED__

DEFINE_GUID(IID___x_ABI_CWindows_CUI_CComposition_CICompositionCommitBatch, 0x0d00dad0, 0xca07, 0x4400, 0x8c,0x8e, 0xcb,0x5d,0xb0,0x85,0x59,0xcc);
#if defined(__cplusplus) && !defined(CINTERFACE)
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace UI {
            namespace Composition {
                MIDL_INTERFACE("0d00dad0-ca07-4400-8c8e-cb5db08559cc")
                ICompositionCommitBatch : public IInspectable
                {
                    virtual HRESULT STDMETHODCALLTYPE get_IsActive(
                        boolean *value) = 0;

                    virtual HRESULT STDMETHODCALLTYPE get_IsEnded(
                        boolean *value) = 0;

                    virtual HRESULT STDMETHODCALLTYPE add_Completed(
                        ABI::Windows::Foundation::ITypedEventHandler<IInspectable*,ABI::Windows::UI::Composition::CompositionBatchCompletedEventArgs* > *handler,
                        EventRegistrationToken *token) = 0;

                    virtual HRESULT STDMETHODCALLTYPE remove_Completed(
                        EventRegistrationToken token) = 0;

                };
            }
        }
    }
}
extern "C" {
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(__x_ABI_CWindows_CUI_CComposition_CICompositionCommitBatch, 0x0d00dad0, 0xca07, 0x4400, 0x8c,0x8e, 0xcb,0x5d,0xb0,0x85,0x59,0xcc)
#endif
#else
typedef struct __x_ABI_CWindows_CUI_CComposition_CICompositionCommitBatchVtbl {
    BEGIN_INTERFACE

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

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

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

    /*** IInspectable methods ***/
    HRESULT (STDMETHODCALLTYPE *GetIids)(
        __x_ABI_CWindows_CUI_CComposition_CICompositionCommitBatch *This,
        ULONG *iidCount,
        IID **iids);

    HRESULT (STDMETHODCALLTYPE *GetRuntimeClassName)(
        __x_ABI_CWindows_CUI_CComposition_CICompositionCommitBatch *This,
        HSTRING *className);

    HRESULT (STDMETHODCALLTYPE *GetTrustLevel)(
        __x_ABI_CWindows_CUI_CComposition_CICompositionCommitBatch *This,
        TrustLevel *trustLevel);

    /*** ICompositionCommitBatch methods ***/
    HRESULT (STDMETHODCALLTYPE *get_IsActive)(
        __x_ABI_CWindows_CUI_CComposition_CICompositionCommitBatch *This,
        boolean *value);

    HRESULT (STDMETHODCALLTYPE *get_IsEnded)(
        __x_ABI_CWindows_CUI_CComposition_CICompositionCommitBatch *This,
        boolean *value);

    HRESULT (STDMETHODCALLTYPE *add_Completed)(
        __x_ABI_CWindows_CUI_CComposition_CICompositionCommitBatch *This,
        __FITypedEventHandler_2_IInspectable_Windows__CUI__CComposition__CCompositionBatchCompletedEventArgs *handler,
        EventRegistrationToken *token);

    HRESULT (STDMETHODCALLTYPE *remove_Completed)(
        __x_ABI_CWindows_CUI_CComposition_CICompositionCommitBatch *This,
        EventRegistrationToken token);

    END_INTERFACE
} __x_ABI_CWindows_CUI_CComposition_CICompositionCommitBatchVtbl;

interface __x_ABI_CWindows_CUI_CComposition_CICompositionCommitBatch {
    CONST_VTBL __x_ABI_CWindows_CUI_CComposition_CICompositionCommitBatchVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define __x_ABI_CWindows_CUI_CComposition_CICompositionCommitBatch_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define __x_ABI_CWindows_CUI_CComposition_CICompositionCommitBatch_AddRef(This) (This)->lpVtbl->AddRef(This)
#define __x_ABI_CWindows_CUI_CComposition_CICompositionCommitBatch_Release(This) (This)->lpVtbl->Release(This)
/*** IInspectable methods ***/
#define __x_ABI_CWindows_CUI_CComposition_CICompositionCommitBatch_GetIids(This,iidCount,iids) (This)->lpVtbl->GetIids(This,iidCount,iids)
#define __x_ABI_CWindows_CUI_CComposition_CICompositionCommitBatch_GetRuntimeClassName(This,className) (This)->lpVtbl->GetRuntimeClassName(This,className)
#define __x_ABI_CWindows_CUI_CComposition_CICompositionCommitBatch_GetTrustLevel(This,trustLevel) (This)->lpVtbl->GetTrustLevel(This,trustLevel)
/*** ICompositionCommitBatch methods ***/
#define __x_ABI_CWindows_CUI_CComposition_CICompositionCommitBatch_get_IsActive(This,value) (This)->lpVtbl->get_IsActive(This,value)
#define __x_ABI_CWindows_CUI_CComposition_CICompositionCommitBatch_get_IsEnded(This,value) (This)->lpVtbl->get_IsEnded(This,value)
#define __x_ABI_CWindows_CUI_CComposition_CICompositionCommitBatch_add_Completed(This,handler,token) (This)->lpVtbl->add_Completed(This,handler,token)
#define __x_ABI_CWindows_CUI_CComposition_CICompositionCommitBatch_remove_Completed(This,token) (This)->lpVtbl->remove_Completed(This,token)
#else
/*** IUnknown methods ***/
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CUI_CComposition_CICompositionCommitBatch_QueryInterface(__x_ABI_CWindows_CUI_CComposition_CICompositionCommitBatch* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG __x_ABI_CWindows_CUI_CComposition_CICompositionCommitBatch_AddRef(__x_ABI_CWindows_CUI_CComposition_CICompositionCommitBatch* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG __x_ABI_CWindows_CUI_CComposition_CICompositionCommitBatch_Release(__x_ABI_CWindows_CUI_CComposition_CICompositionCommitBatch* This) {
    return This->lpVtbl->Release(This);
}
/*** IInspectable methods ***/
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CUI_CComposition_CICompositionCommitBatch_GetIids(__x_ABI_CWindows_CUI_CComposition_CICompositionCommitBatch* This,ULONG *iidCount,IID **iids) {
    return This->lpVtbl->GetIids(This,iidCount,iids);
}
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CUI_CComposition_CICompositionCommitBatch_GetRuntimeClassName(__x_ABI_CWindows_CUI_CComposition_CICompositionCommitBatch* This,HSTRING *className) {
    return This->lpVtbl->GetRuntimeClassName(This,className);
}
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CUI_CComposition_CICompositionCommitBatch_GetTrustLevel(__x_ABI_CWindows_CUI_CComposition_CICompositionCommitBatch* This,TrustLevel *trustLevel) {
    return This->lpVtbl->GetTrustLevel(This,trustLevel);
}
/*** ICompositionCommitBatch methods ***/
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CUI_CComposition_CICompositionCommitBatch_get_IsActive(__x_ABI_CWindows_CUI_CComposition_CICompositionCommitBatch* This,boolean *value) {
    return This->lpVtbl->get_IsActive(This,value);
}
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CUI_CComposition_CICompositionCommitBatch_get_IsEnded(__x_ABI_CWindows_CUI_CComposition_CICompositionCommitBatch* This,boolean *value) {
    return This->lpVtbl->get_IsEnded(This,value);
}
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CUI_CComposition_CICompositionCommitBatch_add_Completed(__x_ABI_CWindows_CUI_CComposition_CICompositionCommitBatch* This,__FITypedEventHandler_2_IInspectable_Windows__CUI__CComposition__CCompositionBatchCompletedEventArgs *handler,EventRegistrationToken *token) {
    return This->lpVtbl->add_Completed(This,handler,token);
}
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CUI_CComposition_CICompositionCommitBatch_remove_Completed(__x_ABI_CWindows_CUI_CComposition_CICompositionCommitBatch* This,EventRegistrationToken token) {
    return This->lpVtbl->remove_Completed(This,token);
}
#endif
#ifdef WIDL_using_Windows_UI_Composition
#define IID_ICompositionCommitBatch IID___x_ABI_CWindows_CUI_CComposition_CICompositionCommitBatch
#define ICompositionCommitBatchVtbl __x_ABI_CWindows_CUI_CComposition_CICompositionCommitBatchVtbl
#define ICompositionCommitBatch __x_ABI_CWindows_CUI_CComposition_CICompositionCommitBatch
#define ICompositionCommitBatch_QueryInterface __x_ABI_CWindows_CUI_CComposition_CICompositionCommitBatch_QueryInterface
#define ICompositionCommitBatch_AddRef __x_ABI_CWindows_CUI_CComposition_CICompositionCommitBatch_AddRef
#define ICompositionCommitBatch_Release __x_ABI_CWindows_CUI_CComposition_CICompositionCommitBatch_Release
#define ICompositionCommitBatch_GetIids __x_ABI_CWindows_CUI_CComposition_CICompositionCommitBatch_GetIids
#define ICompositionCommitBatch_GetRuntimeClassName __x_ABI_CWindows_CUI_CComposition_CICompositionCommitBatch_GetRuntimeClassName
#define ICompositionCommitBatch_GetTrustLevel __x_ABI_CWindows_CUI_CComposition_CICompositionCommitBatch_GetTrustLevel
#define ICompositionCommitBatch_get_IsActive __x_ABI_CWindows_CUI_CComposition_CICompositionCommitBatch_get_IsActive
#define ICompositionCommitBatch_get_IsEnded __x_ABI_CWindows_CUI_CComposition_CICompositionCommitBatch_get_IsEnded
#define ICompositionCommitBatch_add_Completed __x_ABI_CWindows_CUI_CComposition_CICompositionCommitBatch_add_Completed
#define ICompositionCommitBatch_remove_Completed __x_ABI_CWindows_CUI_CComposition_CICompositionCommitBatch_remove_Completed
#endif /* WIDL_using_Windows_UI_Composition */
#endif

#endif

#endif  /* ____x_ABI_CWindows_CUI_CComposition_CICompositionCommitBatch_INTERFACE_DEFINED__ */
#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x20000 */

/*****************************************************************************
 * ICompositionDrawingSurface interface
 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x20000
#ifndef ____x_ABI_CWindows_CUI_CComposition_CICompositionDrawingSurface_INTERFACE_DEFINED__
#define ____x_ABI_CWindows_CUI_CComposition_CICompositionDrawingSurface_INTERFACE_DEFINED__

DEFINE_GUID(IID___x_ABI_CWindows_CUI_CComposition_CICompositionDrawingSurface, 0xa166c300, 0xfad0, 0x4d11, 0x9e,0x67, 0xe4,0x33,0x16,0x2f,0xf4,0x9e);
#if defined(__cplusplus) && !defined(CINTERFACE)
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace UI {
            namespace Composition {
                MIDL_INTERFACE("a166c300-fad0-4d11-9e67-e433162ff49e")
                ICompositionDrawingSurface : public IInspectable
                {
                    virtual HRESULT STDMETHODCALLTYPE get_AlphaMode(
                        enum DirectXAlphaMode *value) = 0;

                    virtual HRESULT STDMETHODCALLTYPE get_PixelFormat(
                        enum DirectXPixelFormat *value) = 0;

                    virtual HRESULT STDMETHODCALLTYPE get_Size(
                        struct Size *value) = 0;

                };
            }
        }
    }
}
extern "C" {
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(__x_ABI_CWindows_CUI_CComposition_CICompositionDrawingSurface, 0xa166c300, 0xfad0, 0x4d11, 0x9e,0x67, 0xe4,0x33,0x16,0x2f,0xf4,0x9e)
#endif
#else
typedef struct __x_ABI_CWindows_CUI_CComposition_CICompositionDrawingSurfaceVtbl {
    BEGIN_INTERFACE

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

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

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

    /*** IInspectable methods ***/
    HRESULT (STDMETHODCALLTYPE *GetIids)(
        __x_ABI_CWindows_CUI_CComposition_CICompositionDrawingSurface *This,
        ULONG *iidCount,
        IID **iids);

    HRESULT (STDMETHODCALLTYPE *GetRuntimeClassName)(
        __x_ABI_CWindows_CUI_CComposition_CICompositionDrawingSurface *This,
        HSTRING *className);

    HRESULT (STDMETHODCALLTYPE *GetTrustLevel)(
        __x_ABI_CWindows_CUI_CComposition_CICompositionDrawingSurface *This,
        TrustLevel *trustLevel);

    /*** ICompositionDrawingSurface methods ***/
    HRESULT (STDMETHODCALLTYPE *get_AlphaMode)(
        __x_ABI_CWindows_CUI_CComposition_CICompositionDrawingSurface *This,
        enum __x_ABI_CWindows_CGraphics_CDirectX_CDirectXAlphaMode *value);

    HRESULT (STDMETHODCALLTYPE *get_PixelFormat)(
        __x_ABI_CWindows_CUI_CComposition_CICompositionDrawingSurface *This,
        enum __x_ABI_CWindows_CGraphics_CDirectX_CDirectXPixelFormat *value);

    HRESULT (STDMETHODCALLTYPE *get_Size)(
        __x_ABI_CWindows_CUI_CComposition_CICompositionDrawingSurface *This,
        struct __x_ABI_CWindows_CFoundation_CSize *value);

    END_INTERFACE
} __x_ABI_CWindows_CUI_CComposition_CICompositionDrawingSurfaceVtbl;

interface __x_ABI_CWindows_CUI_CComposition_CICompositionDrawingSurface {
    CONST_VTBL __x_ABI_CWindows_CUI_CComposition_CICompositionDrawingSurfaceVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define __x_ABI_CWindows_CUI_CComposition_CICompositionDrawingSurface_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define __x_ABI_CWindows_CUI_CComposition_CICompositionDrawingSurface_AddRef(This) (This)->lpVtbl->AddRef(This)
#define __x_ABI_CWindows_CUI_CComposition_CICompositionDrawingSurface_Release(This) (This)->lpVtbl->Release(This)
/*** IInspectable methods ***/
#define __x_ABI_CWindows_CUI_CComposition_CICompositionDrawingSurface_GetIids(This,iidCount,iids) (This)->lpVtbl->GetIids(This,iidCount,iids)
#define __x_ABI_CWindows_CUI_CComposition_CICompositionDrawingSurface_GetRuntimeClassName(This,className) (This)->lpVtbl->GetRuntimeClassName(This,className)
#define __x_ABI_CWindows_CUI_CComposition_CICompositionDrawingSurface_GetTrustLevel(This,trustLevel) (This)->lpVtbl->GetTrustLevel(This,trustLevel)
/*** ICompositionDrawingSurface methods ***/
#define __x_ABI_CWindows_CUI_CComposition_CICompositionDrawingSurface_get_AlphaMode(This,value) (This)->lpVtbl->get_AlphaMode(This,value)
#define __x_ABI_CWindows_CUI_CComposition_CICompositionDrawingSurface_get_PixelFormat(This,value) (This)->lpVtbl->get_PixelFormat(This,value)
#define __x_ABI_CWindows_CUI_CComposition_CICompositionDrawingSurface_get_Size(This,value) (This)->lpVtbl->get_Size(This,value)
#else
/*** IUnknown methods ***/
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CUI_CComposition_CICompositionDrawingSurface_QueryInterface(__x_ABI_CWindows_CUI_CComposition_CICompositionDrawingSurface* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG __x_ABI_CWindows_CUI_CComposition_CICompositionDrawingSurface_AddRef(__x_ABI_CWindows_CUI_CComposition_CICompositionDrawingSurface* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG __x_ABI_CWindows_CUI_CComposition_CICompositionDrawingSurface_Release(__x_ABI_CWindows_CUI_CComposition_CICompositionDrawingSurface* This) {
    return This->lpVtbl->Release(This);
}
/*** IInspectable methods ***/
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CUI_CComposition_CICompositionDrawingSurface_GetIids(__x_ABI_CWindows_CUI_CComposition_CICompositionDrawingSurface* This,ULONG *iidCount,IID **iids) {
    return This->lpVtbl->GetIids(This,iidCount,iids);
}
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CUI_CComposition_CICompositionDrawingSurface_GetRuntimeClassName(__x_ABI_CWindows_CUI_CComposition_CICompositionDrawingSurface* This,HSTRING *className) {
    return This->lpVtbl->GetRuntimeClassName(This,className);
}
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CUI_CComposition_CICompositionDrawingSurface_GetTrustLevel(__x_ABI_CWindows_CUI_CComposition_CICompositionDrawingSurface* This,TrustLevel *trustLevel) {
    return This->lpVtbl->GetTrustLevel(This,trustLevel);
}
/*** ICompositionDrawingSurface methods ***/
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CUI_CComposition_CICompositionDrawingSurface_get_AlphaMode(__x_ABI_CWindows_CUI_CComposition_CICompositionDrawingSurface* This,enum __x_ABI_CWindows_CGraphics_CDirectX_CDirectXAlphaMode *value) {
    return This->lpVtbl->get_AlphaMode(This,value);
}
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CUI_CComposition_CICompositionDrawingSurface_get_PixelFormat(__x_ABI_CWindows_CUI_CComposition_CICompositionDrawingSurface* This,enum __x_ABI_CWindows_CGraphics_CDirectX_CDirectXPixelFormat *value) {
    return This->lpVtbl->get_PixelFormat(This,value);
}
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CUI_CComposition_CICompositionDrawingSurface_get_Size(__x_ABI_CWindows_CUI_CComposition_CICompositionDrawingSurface* This,struct __x_ABI_CWindows_CFoundation_CSize *value) {
    return This->lpVtbl->get_Size(This,value);
}
#endif
#ifdef WIDL_using_Windows_UI_Composition
#define IID_ICompositionDrawingSurface IID___x_ABI_CWindows_CUI_CComposition_CICompositionDrawingSurface
#define ICompositionDrawingSurfaceVtbl __x_ABI_CWindows_CUI_CComposition_CICompositionDrawingSurfaceVtbl
#define ICompositionDrawingSurface __x_ABI_CWindows_CUI_CComposition_CICompositionDrawingSurface
#define ICompositionDrawingSurface_QueryInterface __x_ABI_CWindows_CUI_CComposition_CICompositionDrawingSurface_QueryInterface
#define ICompositionDrawingSurface_AddRef __x_ABI_CWindows_CUI_CComposition_CICompositionDrawingSurface_AddRef
#define ICompositionDrawingSurface_Release __x_ABI_CWindows_CUI_CComposition_CICompositionDrawingSurface_Release
#define ICompositionDrawingSurface_GetIids __x_ABI_CWindows_CUI_CComposition_CICompositionDrawingSurface_GetIids
#define ICompositionDrawingSurface_GetRuntimeClassName __x_ABI_CWindows_CUI_CComposition_CICompositionDrawingSurface_GetRuntimeClassName
#define ICompositionDrawingSurface_GetTrustLevel __x_ABI_CWindows_CUI_CComposition_CICompositionDrawingSurface_GetTrustLevel
#define ICompositionDrawingSurface_get_AlphaMode __x_ABI_CWindows_CUI_CComposition_CICompositionDrawingSurface_get_AlphaMode
#define ICompositionDrawingSurface_get_PixelFormat __x_ABI_CWindows_CUI_CComposition_CICompositionDrawingSurface_get_PixelFormat
#define ICompositionDrawingSurface_get_Size __x_ABI_CWindows_CUI_CComposition_CICompositionDrawingSurface_get_Size
#endif /* WIDL_using_Windows_UI_Composition */
#endif

#endif

#endif  /* ____x_ABI_CWindows_CUI_CComposition_CICompositionDrawingSurface_INTERFACE_DEFINED__ */
#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x20000 */

/*****************************************************************************
 * ICompositionDrawingSurfaceFactory interface
 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x40000
#ifndef ____x_ABI_CWindows_CUI_CComposition_CICompositionDrawingSurfaceFactory_INTERFACE_DEFINED__
#define ____x_ABI_CWindows_CUI_CComposition_CICompositionDrawingSurfaceFactory_INTERFACE_DEFINED__

DEFINE_GUID(IID___x_ABI_CWindows_CUI_CComposition_CICompositionDrawingSurfaceFactory, 0x9497b00a, 0x312d, 0x46b9, 0x9d,0xb3, 0x41,0x2f,0xd7,0x94,0x64,0xc8);
#if defined(__cplusplus) && !defined(CINTERFACE)
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace UI {
            namespace Composition {
                MIDL_INTERFACE("9497b00a-312d-46b9-9db3-412fd79464c8")
                ICompositionDrawingSurfaceFactory : public IInspectable
                {
                };
            }
        }
    }
}
extern "C" {
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(__x_ABI_CWindows_CUI_CComposition_CICompositionDrawingSurfaceFactory, 0x9497b00a, 0x312d, 0x46b9, 0x9d,0xb3, 0x41,0x2f,0xd7,0x94,0x64,0xc8)
#endif
#else
typedef struct __x_ABI_CWindows_CUI_CComposition_CICompositionDrawingSurfaceFactoryVtbl {
    BEGIN_INTERFACE

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

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

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

    /*** IInspectable methods ***/
    HRESULT (STDMETHODCALLTYPE *GetIids)(
        __x_ABI_CWindows_CUI_CComposition_CICompositionDrawingSurfaceFactory *This,
        ULONG *iidCount,
        IID **iids);

    HRESULT (STDMETHODCALLTYPE *GetRuntimeClassName)(
        __x_ABI_CWindows_CUI_CComposition_CICompositionDrawingSurfaceFactory *This,
        HSTRING *className);

    HRESULT (STDMETHODCALLTYPE *GetTrustLevel)(
        __x_ABI_CWindows_CUI_CComposition_CICompositionDrawingSurfaceFactory *This,
        TrustLevel *trustLevel);

    END_INTERFACE
} __x_ABI_CWindows_CUI_CComposition_CICompositionDrawingSurfaceFactoryVtbl;

interface __x_ABI_CWindows_CUI_CComposition_CICompositionDrawingSurfaceFactory {
    CONST_VTBL __x_ABI_CWindows_CUI_CComposition_CICompositionDrawingSurfaceFactoryVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define __x_ABI_CWindows_CUI_CComposition_CICompositionDrawingSurfaceFactory_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define __x_ABI_CWindows_CUI_CComposition_CICompositionDrawingSurfaceFactory_AddRef(This) (This)->lpVtbl->AddRef(This)
#define __x_ABI_CWindows_CUI_CComposition_CICompositionDrawingSurfaceFactory_Release(This) (This)->lpVtbl->Release(This)
/*** IInspectable methods ***/
#define __x_ABI_CWindows_CUI_CComposition_CICompositionDrawingSurfaceFactory_GetIids(This,iidCount,iids) (This)->lpVtbl->GetIids(This,iidCount,iids)
#define __x_ABI_CWindows_CUI_CComposition_CICompositionDrawingSurfaceFactory_GetRuntimeClassName(This,className) (This)->lpVtbl->GetRuntimeClassName(This,className)
#define __x_ABI_CWindows_CUI_CComposition_CICompositionDrawingSurfaceFactory_GetTrustLevel(This,trustLevel) (This)->lpVtbl->GetTrustLevel(This,trustLevel)
#else
/*** IUnknown methods ***/
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CUI_CComposition_CICompositionDrawingSurfaceFactory_QueryInterface(__x_ABI_CWindows_CUI_CComposition_CICompositionDrawingSurfaceFactory* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG __x_ABI_CWindows_CUI_CComposition_CICompositionDrawingSurfaceFactory_AddRef(__x_ABI_CWindows_CUI_CComposition_CICompositionDrawingSurfaceFactory* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG __x_ABI_CWindows_CUI_CComposition_CICompositionDrawingSurfaceFactory_Release(__x_ABI_CWindows_CUI_CComposition_CICompositionDrawingSurfaceFactory* This) {
    return This->lpVtbl->Release(This);
}
/*** IInspectable methods ***/
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CUI_CComposition_CICompositionDrawingSurfaceFactory_GetIids(__x_ABI_CWindows_CUI_CComposition_CICompositionDrawingSurfaceFactory* This,ULONG *iidCount,IID **iids) {
    return This->lpVtbl->GetIids(This,iidCount,iids);
}
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CUI_CComposition_CICompositionDrawingSurfaceFactory_GetRuntimeClassName(__x_ABI_CWindows_CUI_CComposition_CICompositionDrawingSurfaceFactory* This,HSTRING *className) {
    return This->lpVtbl->GetRuntimeClassName(This,className);
}
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CUI_CComposition_CICompositionDrawingSurfaceFactory_GetTrustLevel(__x_ABI_CWindows_CUI_CComposition_CICompositionDrawingSurfaceFactory* This,TrustLevel *trustLevel) {
    return This->lpVtbl->GetTrustLevel(This,trustLevel);
}
#endif
#ifdef WIDL_using_Windows_UI_Composition
#define IID_ICompositionDrawingSurfaceFactory IID___x_ABI_CWindows_CUI_CComposition_CICompositionDrawingSurfaceFactory
#define ICompositionDrawingSurfaceFactoryVtbl __x_ABI_CWindows_CUI_CComposition_CICompositionDrawingSurfaceFactoryVtbl
#define ICompositionDrawingSurfaceFactory __x_ABI_CWindows_CUI_CComposition_CICompositionDrawingSurfaceFactory
#define ICompositionDrawingSurfaceFactory_QueryInterface __x_ABI_CWindows_CUI_CComposition_CICompositionDrawingSurfaceFactory_QueryInterface
#define ICompositionDrawingSurfaceFactory_AddRef __x_ABI_CWindows_CUI_CComposition_CICompositionDrawingSurfaceFactory_AddRef
#define ICompositionDrawingSurfaceFactory_Release __x_ABI_CWindows_CUI_CComposition_CICompositionDrawingSurfaceFactory_Release
#define ICompositionDrawingSurfaceFactory_GetIids __x_ABI_CWindows_CUI_CComposition_CICompositionDrawingSurfaceFactory_GetIids
#define ICompositionDrawingSurfaceFactory_GetRuntimeClassName __x_ABI_CWindows_CUI_CComposition_CICompositionDrawingSurfaceFactory_GetRuntimeClassName
#define ICompositionDrawingSurfaceFactory_GetTrustLevel __x_ABI_CWindows_CUI_CComposition_CICompositionDrawingSurfaceFactory_GetTrustLevel
#endif /* WIDL_using_Windows_UI_Composition */
#endif

#endif

#endif  /* ____x_ABI_CWindows_CUI_CComposition_CICompositionDrawingSurfaceFactory_INTERFACE_DEFINED__ */
#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x40000 */

/*****************************************************************************
 * ICompositionEasingFunction interface
 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x20000
#ifndef ____x_ABI_CWindows_CUI_CComposition_CICompositionEasingFunction_INTERFACE_DEFINED__
#define ____x_ABI_CWindows_CUI_CComposition_CICompositionEasingFunction_INTERFACE_DEFINED__

DEFINE_GUID(IID___x_ABI_CWindows_CUI_CComposition_CICompositionEasingFunction, 0x5145e356, 0xbf79, 0x4ea8, 0x8c,0xc2, 0x6b,0x5b,0x47,0x2e,0x6c,0x9a);
#if defined(__cplusplus) && !defined(CINTERFACE)
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace UI {
            namespace Composition {
                MIDL_INTERFACE("5145e356-bf79-4ea8-8cc2-6b5b472e6c9a")
                ICompositionEasingFunction : public IInspectable
                {
                };
            }
        }
    }
}
extern "C" {
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(__x_ABI_CWindows_CUI_CComposition_CICompositionEasingFunction, 0x5145e356, 0xbf79, 0x4ea8, 0x8c,0xc2, 0x6b,0x5b,0x47,0x2e,0x6c,0x9a)
#endif
#else
typedef struct __x_ABI_CWindows_CUI_CComposition_CICompositionEasingFunctionVtbl {
    BEGIN_INTERFACE

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

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

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

    /*** IInspectable methods ***/
    HRESULT (STDMETHODCALLTYPE *GetIids)(
        __x_ABI_CWindows_CUI_CComposition_CICompositionEasingFunction *This,
        ULONG *iidCount,
        IID **iids);

    HRESULT (STDMETHODCALLTYPE *GetRuntimeClassName)(
        __x_ABI_CWindows_CUI_CComposition_CICompositionEasingFunction *This,
        HSTRING *className);

    HRESULT (STDMETHODCALLTYPE *GetTrustLevel)(
        __x_ABI_CWindows_CUI_CComposition_CICompositionEasingFunction *This,
        TrustLevel *trustLevel);

    END_INTERFACE
} __x_ABI_CWindows_CUI_CComposition_CICompositionEasingFunctionVtbl;

interface __x_ABI_CWindows_CUI_CComposition_CICompositionEasingFunction {
    CONST_VTBL __x_ABI_CWindows_CUI_CComposition_CICompositionEasingFunctionVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define __x_ABI_CWindows_CUI_CComposition_CICompositionEasingFunction_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define __x_ABI_CWindows_CUI_CComposition_CICompositionEasingFunction_AddRef(This) (This)->lpVtbl->AddRef(This)
#define __x_ABI_CWindows_CUI_CComposition_CICompositionEasingFunction_Release(This) (This)->lpVtbl->Release(This)
/*** IInspectable methods ***/
#define __x_ABI_CWindows_CUI_CComposition_CICompositionEasingFunction_GetIids(This,iidCount,iids) (This)->lpVtbl->GetIids(This,iidCount,iids)
#define __x_ABI_CWindows_CUI_CComposition_CICompositionEasingFunction_GetRuntimeClassName(This,className) (This)->lpVtbl->GetRuntimeClassName(This,className)
#define __x_ABI_CWindows_CUI_CComposition_CICompositionEasingFunction_GetTrustLevel(This,trustLevel) (This)->lpVtbl->GetTrustLevel(This,trustLevel)
#else
/*** IUnknown methods ***/
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CUI_CComposition_CICompositionEasingFunction_QueryInterface(__x_ABI_CWindows_CUI_CComposition_CICompositionEasingFunction* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG __x_ABI_CWindows_CUI_CComposition_CICompositionEasingFunction_AddRef(__x_ABI_CWindows_CUI_CComposition_CICompositionEasingFunction* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG __x_ABI_CWindows_CUI_CComposition_CICompositionEasingFunction_Release(__x_ABI_CWindows_CUI_CComposition_CICompositionEasingFunction* This) {
    return This->lpVtbl->Release(This);
}
/*** IInspectable methods ***/
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CUI_CComposition_CICompositionEasingFunction_GetIids(__x_ABI_CWindows_CUI_CComposition_CICompositionEasingFunction* This,ULONG *iidCount,IID **iids) {
    return This->lpVtbl->GetIids(This,iidCount,iids);
}
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CUI_CComposition_CICompositionEasingFunction_GetRuntimeClassName(__x_ABI_CWindows_CUI_CComposition_CICompositionEasingFunction* This,HSTRING *className) {
    return This->lpVtbl->GetRuntimeClassName(This,className);
}
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CUI_CComposition_CICompositionEasingFunction_GetTrustLevel(__x_ABI_CWindows_CUI_CComposition_CICompositionEasingFunction* This,TrustLevel *trustLevel) {
    return This->lpVtbl->GetTrustLevel(This,trustLevel);
}
#endif
#ifdef WIDL_using_Windows_UI_Composition
#define IID_ICompositionEasingFunction IID___x_ABI_CWindows_CUI_CComposition_CICompositionEasingFunction
#define ICompositionEasingFunctionVtbl __x_ABI_CWindows_CUI_CComposition_CICompositionEasingFunctionVtbl
#define ICompositionEasingFunction __x_ABI_CWindows_CUI_CComposition_CICompositionEasingFunction
#define ICompositionEasingFunction_QueryInterface __x_ABI_CWindows_CUI_CComposition_CICompositionEasingFunction_QueryInterface
#define ICompositionEasingFunction_AddRef __x_ABI_CWindows_CUI_CComposition_CICompositionEasingFunction_AddRef
#define ICompositionEasingFunction_Release __x_ABI_CWindows_CUI_CComposition_CICompositionEasingFunction_Release
#define ICompositionEasingFunction_GetIids __x_ABI_CWindows_CUI_CComposition_CICompositionEasingFunction_GetIids
#define ICompositionEasingFunction_GetRuntimeClassName __x_ABI_CWindows_CUI_CComposition_CICompositionEasingFunction_GetRuntimeClassName
#define ICompositionEasingFunction_GetTrustLevel __x_ABI_CWindows_CUI_CComposition_CICompositionEasingFunction_GetTrustLevel
#endif /* WIDL_using_Windows_UI_Composition */
#endif

#endif

#endif  /* ____x_ABI_CWindows_CUI_CComposition_CICompositionEasingFunction_INTERFACE_DEFINED__ */
#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x20000 */

/*****************************************************************************
 * ICompositionEasingFunctionFactory interface
 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x20000
#ifndef ____x_ABI_CWindows_CUI_CComposition_CICompositionEasingFunctionFactory_INTERFACE_DEFINED__
#define ____x_ABI_CWindows_CUI_CComposition_CICompositionEasingFunctionFactory_INTERFACE_DEFINED__

DEFINE_GUID(IID___x_ABI_CWindows_CUI_CComposition_CICompositionEasingFunctionFactory, 0x60840774, 0x3da0, 0x4949, 0x82,0x00, 0x72,0x06,0xc0,0x01,0x90,0xa0);
#if defined(__cplusplus) && !defined(CINTERFACE)
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace UI {
            namespace Composition {
                MIDL_INTERFACE("60840774-3da0-4949-8200-7206c00190a0")
                ICompositionEasingFunctionFactory : public IInspectable
                {
                };
            }
        }
    }
}
extern "C" {
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(__x_ABI_CWindows_CUI_CComposition_CICompositionEasingFunctionFactory, 0x60840774, 0x3da0, 0x4949, 0x82,0x00, 0x72,0x06,0xc0,0x01,0x90,0xa0)
#endif
#else
typedef struct __x_ABI_CWindows_CUI_CComposition_CICompositionEasingFunctionFactoryVtbl {
    BEGIN_INTERFACE

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

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

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

    /*** IInspectable methods ***/
    HRESULT (STDMETHODCALLTYPE *GetIids)(
        __x_ABI_CWindows_CUI_CComposition_CICompositionEasingFunctionFactory *This,
        ULONG *iidCount,
        IID **iids);

    HRESULT (STDMETHODCALLTYPE *GetRuntimeClassName)(
        __x_ABI_CWindows_CUI_CComposition_CICompositionEasingFunctionFactory *This,
        HSTRING *className);

    HRESULT (STDMETHODCALLTYPE *GetTrustLevel)(
        __x_ABI_CWindows_CUI_CComposition_CICompositionEasingFunctionFactory *This,
        TrustLevel *trustLevel);

    END_INTERFACE
} __x_ABI_CWindows_CUI_CComposition_CICompositionEasingFunctionFactoryVtbl;

interface __x_ABI_CWindows_CUI_CComposition_CICompositionEasingFunctionFactory {
    CONST_VTBL __x_ABI_CWindows_CUI_CComposition_CICompositionEasingFunctionFactoryVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define __x_ABI_CWindows_CUI_CComposition_CICompositionEasingFunctionFactory_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define __x_ABI_CWindows_CUI_CComposition_CICompositionEasingFunctionFactory_AddRef(This) (This)->lpVtbl->AddRef(This)
#define __x_ABI_CWindows_CUI_CComposition_CICompositionEasingFunctionFactory_Release(This) (This)->lpVtbl->Release(This)
/*** IInspectable methods ***/
#define __x_ABI_CWindows_CUI_CComposition_CICompositionEasingFunctionFactory_GetIids(This,iidCount,iids) (This)->lpVtbl->GetIids(This,iidCount,iids)
#define __x_ABI_CWindows_CUI_CComposition_CICompositionEasingFunctionFactory_GetRuntimeClassName(This,className) (This)->lpVtbl->GetRuntimeClassName(This,className)
#define __x_ABI_CWindows_CUI_CComposition_CICompositionEasingFunctionFactory_GetTrustLevel(This,trustLevel) (This)->lpVtbl->GetTrustLevel(This,trustLevel)
#else
/*** IUnknown methods ***/
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CUI_CComposition_CICompositionEasingFunctionFactory_QueryInterface(__x_ABI_CWindows_CUI_CComposition_CICompositionEasingFunctionFactory* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG __x_ABI_CWindows_CUI_CComposition_CICompositionEasingFunctionFactory_AddRef(__x_ABI_CWindows_CUI_CComposition_CICompositionEasingFunctionFactory* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG __x_ABI_CWindows_CUI_CComposition_CICompositionEasingFunctionFactory_Release(__x_ABI_CWindows_CUI_CComposition_CICompositionEasingFunctionFactory* This) {
    return This->lpVtbl->Release(This);
}
/*** IInspectable methods ***/
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CUI_CComposition_CICompositionEasingFunctionFactory_GetIids(__x_ABI_CWindows_CUI_CComposition_CICompositionEasingFunctionFactory* This,ULONG *iidCount,IID **iids) {
    return This->lpVtbl->GetIids(This,iidCount,iids);
}
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CUI_CComposition_CICompositionEasingFunctionFactory_GetRuntimeClassName(__x_ABI_CWindows_CUI_CComposition_CICompositionEasingFunctionFactory* This,HSTRING *className) {
    return This->lpVtbl->GetRuntimeClassName(This,className);
}
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CUI_CComposition_CICompositionEasingFunctionFactory_GetTrustLevel(__x_ABI_CWindows_CUI_CComposition_CICompositionEasingFunctionFactory* This,TrustLevel *trustLevel) {
    return This->lpVtbl->GetTrustLevel(This,trustLevel);
}
#endif
#ifdef WIDL_using_Windows_UI_Composition
#define IID_ICompositionEasingFunctionFactory IID___x_ABI_CWindows_CUI_CComposition_CICompositionEasingFunctionFactory
#define ICompositionEasingFunctionFactoryVtbl __x_ABI_CWindows_CUI_CComposition_CICompositionEasingFunctionFactoryVtbl
#define ICompositionEasingFunctionFactory __x_ABI_CWindows_CUI_CComposition_CICompositionEasingFunctionFactory
#define ICompositionEasingFunctionFactory_QueryInterface __x_ABI_CWindows_CUI_CComposition_CICompositionEasingFunctionFactory_QueryInterface
#define ICompositionEasingFunctionFactory_AddRef __x_ABI_CWindows_CUI_CComposition_CICompositionEasingFunctionFactory_AddRef
#define ICompositionEasingFunctionFactory_Release __x_ABI_CWindows_CUI_CComposition_CICompositionEasingFunctionFactory_Release
#define ICompositionEasingFunctionFactory_GetIids __x_ABI_CWindows_CUI_CComposition_CICompositionEasingFunctionFactory_GetIids
#define ICompositionEasingFunctionFactory_GetRuntimeClassName __x_ABI_CWindows_CUI_CComposition_CICompositionEasingFunctionFactory_GetRuntimeClassName
#define ICompositionEasingFunctionFactory_GetTrustLevel __x_ABI_CWindows_CUI_CComposition_CICompositionEasingFunctionFactory_GetTrustLevel
#endif /* WIDL_using_Windows_UI_Composition */
#endif

#endif

#endif  /* ____x_ABI_CWindows_CUI_CComposition_CICompositionEasingFunctionFactory_INTERFACE_DEFINED__ */
#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x20000 */

/*****************************************************************************
 * ICompositionEffectBrush interface
 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x20000
#ifndef ____x_ABI_CWindows_CUI_CComposition_CICompositionEffectBrush_INTERFACE_DEFINED__
#define ____x_ABI_CWindows_CUI_CComposition_CICompositionEffectBrush_INTERFACE_DEFINED__

DEFINE_GUID(IID___x_ABI_CWindows_CUI_CComposition_CICompositionEffectBrush, 0xbf7f795e, 0x83cc, 0x44bf, 0xa4,0x47, 0x3e,0x3c,0x07,0x17,0x89,0xec);
#if defined(__cplusplus) && !defined(CINTERFACE)
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace UI {
            namespace Composition {
                MIDL_INTERFACE("bf7f795e-83cc-44bf-a447-3e3c071789ec")
                ICompositionEffectBrush : public IInspectable
                {
                    virtual HRESULT STDMETHODCALLTYPE GetSourceParameter(
                        HSTRING name,
                        ABI::Windows::UI::Composition::ICompositionBrush **result) = 0;

                    virtual HRESULT STDMETHODCALLTYPE SetSourceParameter(
                        HSTRING name,
                        ABI::Windows::UI::Composition::ICompositionBrush *source) = 0;

                };
            }
        }
    }
}
extern "C" {
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(__x_ABI_CWindows_CUI_CComposition_CICompositionEffectBrush, 0xbf7f795e, 0x83cc, 0x44bf, 0xa4,0x47, 0x3e,0x3c,0x07,0x17,0x89,0xec)
#endif
#else
typedef struct __x_ABI_CWindows_CUI_CComposition_CICompositionEffectBrushVtbl {
    BEGIN_INTERFACE

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

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

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

    /*** IInspectable methods ***/
    HRESULT (STDMETHODCALLTYPE *GetIids)(
        __x_ABI_CWindows_CUI_CComposition_CICompositionEffectBrush *This,
        ULONG *iidCount,
        IID **iids);

    HRESULT (STDMETHODCALLTYPE *GetRuntimeClassName)(
        __x_ABI_CWindows_CUI_CComposition_CICompositionEffectBrush *This,
        HSTRING *className);

    HRESULT (STDMETHODCALLTYPE *GetTrustLevel)(
        __x_ABI_CWindows_CUI_CComposition_CICompositionEffectBrush *This,
        TrustLevel *trustLevel);

    /*** ICompositionEffectBrush methods ***/
    HRESULT (STDMETHODCALLTYPE *GetSourceParameter)(
        __x_ABI_CWindows_CUI_CComposition_CICompositionEffectBrush *This,
        HSTRING name,
        __x_ABI_CWindows_CUI_CComposition_CICompositionBrush **result);

    HRESULT (STDMETHODCALLTYPE *SetSourceParameter)(
        __x_ABI_CWindows_CUI_CComposition_CICompositionEffectBrush *This,
        HSTRING name,
        __x_ABI_CWindows_CUI_CComposition_CICompositionBrush *source);

    END_INTERFACE
} __x_ABI_CWindows_CUI_CComposition_CICompositionEffectBrushVtbl;

interface __x_ABI_CWindows_CUI_CComposition_CICompositionEffectBrush {
    CONST_VTBL __x_ABI_CWindows_CUI_CComposition_CICompositionEffectBrushVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define __x_ABI_CWindows_CUI_CComposition_CICompositionEffectBrush_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define __x_ABI_CWindows_CUI_CComposition_CICompositionEffectBrush_AddRef(This) (This)->lpVtbl->AddRef(This)
#define __x_ABI_CWindows_CUI_CComposition_CICompositionEffectBrush_Release(This) (This)->lpVtbl->Release(This)
/*** IInspectable methods ***/
#define __x_ABI_CWindows_CUI_CComposition_CICompositionEffectBrush_GetIids(This,iidCount,iids) (This)->lpVtbl->GetIids(This,iidCount,iids)
#define __x_ABI_CWindows_CUI_CComposition_CICompositionEffectBrush_GetRuntimeClassName(This,className) (This)->lpVtbl->GetRuntimeClassName(This,className)
#define __x_ABI_CWindows_CUI_CComposition_CICompositionEffectBrush_GetTrustLevel(This,trustLevel) (This)->lpVtbl->GetTrustLevel(This,trustLevel)
/*** ICompositionEffectBrush methods ***/
#define __x_ABI_CWindows_CUI_CComposition_CICompositionEffectBrush_GetSourceParameter(This,name,result) (This)->lpVtbl->GetSourceParameter(This,name,result)
#define __x_ABI_CWindows_CUI_CComposition_CICompositionEffectBrush_SetSourceParameter(This,name,source) (This)->lpVtbl->SetSourceParameter(This,name,source)
#else
/*** IUnknown methods ***/
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CUI_CComposition_CICompositionEffectBrush_QueryInterface(__x_ABI_CWindows_CUI_CComposition_CICompositionEffectBrush* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG __x_ABI_CWindows_CUI_CComposition_CICompositionEffectBrush_AddRef(__x_ABI_CWindows_CUI_CComposition_CICompositionEffectBrush* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG __x_ABI_CWindows_CUI_CComposition_CICompositionEffectBrush_Release(__x_ABI_CWindows_CUI_CComposition_CICompositionEffectBrush* This) {
    return This->lpVtbl->Release(This);
}
/*** IInspectable methods ***/
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CUI_CComposition_CICompositionEffectBrush_GetIids(__x_ABI_CWindows_CUI_CComposition_CICompositionEffectBrush* This,ULONG *iidCount,IID **iids) {
    return This->lpVtbl->GetIids(This,iidCount,iids);
}
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CUI_CComposition_CICompositionEffectBrush_GetRuntimeClassName(__x_ABI_CWindows_CUI_CComposition_CICompositionEffectBrush* This,HSTRING *className) {
    return This->lpVtbl->GetRuntimeClassName(This,className);
}
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CUI_CComposition_CICompositionEffectBrush_GetTrustLevel(__x_ABI_CWindows_CUI_CComposition_CICompositionEffectBrush* This,TrustLevel *trustLevel) {
    return This->lpVtbl->GetTrustLevel(This,trustLevel);
}
/*** ICompositionEffectBrush methods ***/
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CUI_CComposition_CICompositionEffectBrush_GetSourceParameter(__x_ABI_CWindows_CUI_CComposition_CICompositionEffectBrush* This,HSTRING name,__x_ABI_CWindows_CUI_CComposition_CICompositionBrush **result) {
    return This->lpVtbl->GetSourceParameter(This,name,result);
}
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CUI_CComposition_CICompositionEffectBrush_SetSourceParameter(__x_ABI_CWindows_CUI_CComposition_CICompositionEffectBrush* This,HSTRING name,__x_ABI_CWindows_CUI_CComposition_CICompositionBrush *source) {
    return This->lpVtbl->SetSourceParameter(This,name,source);
}
#endif
#ifdef WIDL_using_Windows_UI_Composition
#define IID_ICompositionEffectBrush IID___x_ABI_CWindows_CUI_CComposition_CICompositionEffectBrush
#define ICompositionEffectBrushVtbl __x_ABI_CWindows_CUI_CComposition_CICompositionEffectBrushVtbl
#define ICompositionEffectBrush __x_ABI_CWindows_CUI_CComposition_CICompositionEffectBrush
#define ICompositionEffectBrush_QueryInterface __x_ABI_CWindows_CUI_CComposition_CICompositionEffectBrush_QueryInterface
#define ICompositionEffectBrush_AddRef __x_ABI_CWindows_CUI_CComposition_CICompositionEffectBrush_AddRef
#define ICompositionEffectBrush_Release __x_ABI_CWindows_CUI_CComposition_CICompositionEffectBrush_Release
#define ICompositionEffectBrush_GetIids __x_ABI_CWindows_CUI_CComposition_CICompositionEffectBrush_GetIids
#define ICompositionEffectBrush_GetRuntimeClassName __x_ABI_CWindows_CUI_CComposition_CICompositionEffectBrush_GetRuntimeClassName
#define ICompositionEffectBrush_GetTrustLevel __x_ABI_CWindows_CUI_CComposition_CICompositionEffectBrush_GetTrustLevel
#define ICompositionEffectBrush_GetSourceParameter __x_ABI_CWindows_CUI_CComposition_CICompositionEffectBrush_GetSourceParameter
#define ICompositionEffectBrush_SetSourceParameter __x_ABI_CWindows_CUI_CComposition_CICompositionEffectBrush_SetSourceParameter
#endif /* WIDL_using_Windows_UI_Composition */
#endif

#endif

#endif  /* ____x_ABI_CWindows_CUI_CComposition_CICompositionEffectBrush_INTERFACE_DEFINED__ */
#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x20000 */

/*****************************************************************************
 * ICompositionEffectFactory interface
 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x20000
#ifndef ____x_ABI_CWindows_CUI_CComposition_CICompositionEffectFactory_INTERFACE_DEFINED__
#define ____x_ABI_CWindows_CUI_CComposition_CICompositionEffectFactory_INTERFACE_DEFINED__

DEFINE_GUID(IID___x_ABI_CWindows_CUI_CComposition_CICompositionEffectFactory, 0xbe5624af, 0xba7e, 0x4510, 0x98,0x50, 0x41,0xc0,0xb4,0xff,0x74,0xdf);
#if defined(__cplusplus) && !defined(CINTERFACE)
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace UI {
            namespace Composition {
                MIDL_INTERFACE("be5624af-ba7e-4510-9850-41c0b4ff74df")
                ICompositionEffectFactory : public IInspectable
                {
                    virtual HRESULT STDMETHODCALLTYPE CreateBrush(
                        ABI::Windows::UI::Composition::ICompositionEffectBrush **result) = 0;

                    virtual HRESULT STDMETHODCALLTYPE get_ExtendedError(
                        HRESULT *value) = 0;

                    virtual HRESULT STDMETHODCALLTYPE get_LoadStatus(
                        enum CompositionEffectFactoryLoadStatus *value) = 0;

                };
            }
        }
    }
}
extern "C" {
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(__x_ABI_CWindows_CUI_CComposition_CICompositionEffectFactory, 0xbe5624af, 0xba7e, 0x4510, 0x98,0x50, 0x41,0xc0,0xb4,0xff,0x74,0xdf)
#endif
#else
typedef struct __x_ABI_CWindows_CUI_CComposition_CICompositionEffectFactoryVtbl {
    BEGIN_INTERFACE

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

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

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

    /*** IInspectable methods ***/
    HRESULT (STDMETHODCALLTYPE *GetIids)(
        __x_ABI_CWindows_CUI_CComposition_CICompositionEffectFactory *This,
        ULONG *iidCount,
        IID **iids);

    HRESULT (STDMETHODCALLTYPE *GetRuntimeClassName)(
        __x_ABI_CWindows_CUI_CComposition_CICompositionEffectFactory *This,
        HSTRING *className);

    HRESULT (STDMETHODCALLTYPE *GetTrustLevel)(
        __x_ABI_CWindows_CUI_CComposition_CICompositionEffectFactory *This,
        TrustLevel *trustLevel);

    /*** ICompositionEffectFactory methods ***/
    HRESULT (STDMETHODCALLTYPE *CreateBrush)(
        __x_ABI_CWindows_CUI_CComposition_CICompositionEffectFactory *This,
        __x_ABI_CWindows_CUI_CComposition_CICompositionEffectBrush **result);

    HRESULT (STDMETHODCALLTYPE *get_ExtendedError)(
        __x_ABI_CWindows_CUI_CComposition_CICompositionEffectFactory *This,
        HRESULT *value);

    HRESULT (STDMETHODCALLTYPE *get_LoadStatus)(
        __x_ABI_CWindows_CUI_CComposition_CICompositionEffectFactory *This,
        enum __x_ABI_CWindows_CUI_CComposition_CCompositionEffectFactoryLoadStatus *value);

    END_INTERFACE
} __x_ABI_CWindows_CUI_CComposition_CICompositionEffectFactoryVtbl;

interface __x_ABI_CWindows_CUI_CComposition_CICompositionEffectFactory {
    CONST_VTBL __x_ABI_CWindows_CUI_CComposition_CICompositionEffectFactoryVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define __x_ABI_CWindows_CUI_CComposition_CICompositionEffectFactory_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define __x_ABI_CWindows_CUI_CComposition_CICompositionEffectFactory_AddRef(This) (This)->lpVtbl->AddRef(This)
#define __x_ABI_CWindows_CUI_CComposition_CICompositionEffectFactory_Release(This) (This)->lpVtbl->Release(This)
/*** IInspectable methods ***/
#define __x_ABI_CWindows_CUI_CComposition_CICompositionEffectFactory_GetIids(This,iidCount,iids) (This)->lpVtbl->GetIids(This,iidCount,iids)
#define __x_ABI_CWindows_CUI_CComposition_CICompositionEffectFactory_GetRuntimeClassName(This,className) (This)->lpVtbl->GetRuntimeClassName(This,className)
#define __x_ABI_CWindows_CUI_CComposition_CICompositionEffectFactory_GetTrustLevel(This,trustLevel) (This)->lpVtbl->GetTrustLevel(This,trustLevel)
/*** ICompositionEffectFactory methods ***/
#define __x_ABI_CWindows_CUI_CComposition_CICompositionEffectFactory_CreateBrush(This,result) (This)->lpVtbl->CreateBrush(This,result)
#define __x_ABI_CWindows_CUI_CComposition_CICompositionEffectFactory_get_ExtendedError(This,value) (This)->lpVtbl->get_ExtendedError(This,value)
#define __x_ABI_CWindows_CUI_CComposition_CICompositionEffectFactory_get_LoadStatus(This,value) (This)->lpVtbl->get_LoadStatus(This,value)
#else
/*** IUnknown methods ***/
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CUI_CComposition_CICompositionEffectFactory_QueryInterface(__x_ABI_CWindows_CUI_CComposition_CICompositionEffectFactory* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG __x_ABI_CWindows_CUI_CComposition_CICompositionEffectFactory_AddRef(__x_ABI_CWindows_CUI_CComposition_CICompositionEffectFactory* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG __x_ABI_CWindows_CUI_CComposition_CICompositionEffectFactory_Release(__x_ABI_CWindows_CUI_CComposition_CICompositionEffectFactory* This) {
    return This->lpVtbl->Release(This);
}
/*** IInspectable methods ***/
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CUI_CComposition_CICompositionEffectFactory_GetIids(__x_ABI_CWindows_CUI_CComposition_CICompositionEffectFactory* This,ULONG *iidCount,IID **iids) {
    return This->lpVtbl->GetIids(This,iidCount,iids);
}
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CUI_CComposition_CICompositionEffectFactory_GetRuntimeClassName(__x_ABI_CWindows_CUI_CComposition_CICompositionEffectFactory* This,HSTRING *className) {
    return This->lpVtbl->GetRuntimeClassName(This,className);
}
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CUI_CComposition_CICompositionEffectFactory_GetTrustLevel(__x_ABI_CWindows_CUI_CComposition_CICompositionEffectFactory* This,TrustLevel *trustLevel) {
    return This->lpVtbl->GetTrustLevel(This,trustLevel);
}
/*** ICompositionEffectFactory methods ***/
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CUI_CComposition_CICompositionEffectFactory_CreateBrush(__x_ABI_CWindows_CUI_CComposition_CICompositionEffectFactory* This,__x_ABI_CWindows_CUI_CComposition_CICompositionEffectBrush **result) {
    return This->lpVtbl->CreateBrush(This,result);
}
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CUI_CComposition_CICompositionEffectFactory_get_ExtendedError(__x_ABI_CWindows_CUI_CComposition_CICompositionEffectFactory* This,HRESULT *value) {
    return This->lpVtbl->get_ExtendedError(This,value);
}
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CUI_CComposition_CICompositionEffectFactory_get_LoadStatus(__x_ABI_CWindows_CUI_CComposition_CICompositionEffectFactory* This,enum __x_ABI_CWindows_CUI_CComposition_CCompositionEffectFactoryLoadStatus *value) {
    return This->lpVtbl->get_LoadStatus(This,value);
}
#endif
#ifdef WIDL_using_Windows_UI_Composition
#define IID_ICompositionEffectFactory IID___x_ABI_CWindows_CUI_CComposition_CICompositionEffectFactory
#define ICompositionEffectFactoryVtbl __x_ABI_CWindows_CUI_CComposition_CICompositionEffectFactoryVtbl
#define ICompositionEffectFactory __x_ABI_CWindows_CUI_CComposition_CICompositionEffectFactory
#define ICompositionEffectFactory_QueryInterface __x_ABI_CWindows_CUI_CComposition_CICompositionEffectFactory_QueryInterface
#define ICompositionEffectFactory_AddRef __x_ABI_CWindows_CUI_CComposition_CICompositionEffectFactory_AddRef
#define ICompositionEffectFactory_Release __x_ABI_CWindows_CUI_CComposition_CICompositionEffectFactory_Release
#define ICompositionEffectFactory_GetIids __x_ABI_CWindows_CUI_CComposition_CICompositionEffectFactory_GetIids
#define ICompositionEffectFactory_GetRuntimeClassName __x_ABI_CWindows_CUI_CComposition_CICompositionEffectFactory_GetRuntimeClassName
#define ICompositionEffectFactory_GetTrustLevel __x_ABI_CWindows_CUI_CComposition_CICompositionEffectFactory_GetTrustLevel
#define ICompositionEffectFactory_CreateBrush __x_ABI_CWindows_CUI_CComposition_CICompositionEffectFactory_CreateBrush
#define ICompositionEffectFactory_get_ExtendedError __x_ABI_CWindows_CUI_CComposition_CICompositionEffectFactory_get_ExtendedError
#define ICompositionEffectFactory_get_LoadStatus __x_ABI_CWindows_CUI_CComposition_CICompositionEffectFactory_get_LoadStatus
#endif /* WIDL_using_Windows_UI_Composition */
#endif

#endif

#endif  /* ____x_ABI_CWindows_CUI_CComposition_CICompositionEffectFactory_INTERFACE_DEFINED__ */
#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x20000 */

/*****************************************************************************
 * ICompositionGraphicsDevice interface
 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x20000
#ifndef ____x_ABI_CWindows_CUI_CComposition_CICompositionGraphicsDevice_INTERFACE_DEFINED__
#define ____x_ABI_CWindows_CUI_CComposition_CICompositionGraphicsDevice_INTERFACE_DEFINED__

DEFINE_GUID(IID___x_ABI_CWindows_CUI_CComposition_CICompositionGraphicsDevice, 0xfb22c6e1, 0x80a2, 0x4667, 0x99,0x36, 0xdb,0xea,0xf6,0xee,0xfe,0x95);
#if defined(__cplusplus) && !defined(CINTERFACE)
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace UI {
            namespace Composition {
                MIDL_INTERFACE("fb22c6e1-80a2-4667-9936-dbeaf6eefe95")
                ICompositionGraphicsDevice : public IInspectable
                {
                    virtual HRESULT STDMETHODCALLTYPE CreateDrawingSurface(
                        struct Size pixels,
                        enum DirectXPixelFormat format,
                        enum DirectXAlphaMode mode,
                        ABI::Windows::UI::Composition::ICompositionDrawingSurface **result) = 0;

                    virtual HRESULT STDMETHODCALLTYPE add_RenderingDeviceReplaced(
                        ABI::Windows::Foundation::ITypedEventHandler<ABI::Windows::UI::Composition::CompositionGraphicsDevice*,ABI::Windows::UI::Composition::RenderingDeviceReplacedEventArgs* > *handler,
                        EventRegistrationToken *token) = 0;

                    virtual HRESULT STDMETHODCALLTYPE remove_RenderingDeviceReplaced(
                        EventRegistrationToken token) = 0;

                };
            }
        }
    }
}
extern "C" {
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(__x_ABI_CWindows_CUI_CComposition_CICompositionGraphicsDevice, 0xfb22c6e1, 0x80a2, 0x4667, 0x99,0x36, 0xdb,0xea,0xf6,0xee,0xfe,0x95)
#endif
#else
typedef struct __x_ABI_CWindows_CUI_CComposition_CICompositionGraphicsDeviceVtbl {
    BEGIN_INTERFACE

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

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

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

    /*** IInspectable methods ***/
    HRESULT (STDMETHODCALLTYPE *GetIids)(
        __x_ABI_CWindows_CUI_CComposition_CICompositionGraphicsDevice *This,
        ULONG *iidCount,
        IID **iids);

    HRESULT (STDMETHODCALLTYPE *GetRuntimeClassName)(
        __x_ABI_CWindows_CUI_CComposition_CICompositionGraphicsDevice *This,
        HSTRING *className);

    HRESULT (STDMETHODCALLTYPE *GetTrustLevel)(
        __x_ABI_CWindows_CUI_CComposition_CICompositionGraphicsDevice *This,
        TrustLevel *trustLevel);

    /*** ICompositionGraphicsDevice methods ***/
    HRESULT (STDMETHODCALLTYPE *CreateDrawingSurface)(
        __x_ABI_CWindows_CUI_CComposition_CICompositionGraphicsDevice *This,
        struct __x_ABI_CWindows_CFoundation_CSize pixels,
        enum __x_ABI_CWindows_CGraphics_CDirectX_CDirectXPixelFormat format,
        enum __x_ABI_CWindows_CGraphics_CDirectX_CDirectXAlphaMode mode,
        __x_ABI_CWindows_CUI_CComposition_CICompositionDrawingSurface **result);

    HRESULT (STDMETHODCALLTYPE *add_RenderingDeviceReplaced)(
        __x_ABI_CWindows_CUI_CComposition_CICompositionGraphicsDevice *This,
        __FITypedEventHandler_2_Windows__CUI__CComposition__CCompositionGraphicsDevice_Windows__CUI__CComposition__CRenderingDeviceReplacedEventArgs *handler,
        EventRegistrationToken *token);

    HRESULT (STDMETHODCALLTYPE *remove_RenderingDeviceReplaced)(
        __x_ABI_CWindows_CUI_CComposition_CICompositionGraphicsDevice *This,
        EventRegistrationToken token);

    END_INTERFACE
} __x_ABI_CWindows_CUI_CComposition_CICompositionGraphicsDeviceVtbl;

interface __x_ABI_CWindows_CUI_CComposition_CICompositionGraphicsDevice {
    CONST_VTBL __x_ABI_CWindows_CUI_CComposition_CICompositionGraphicsDeviceVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define __x_ABI_CWindows_CUI_CComposition_CICompositionGraphicsDevice_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define __x_ABI_CWindows_CUI_CComposition_CICompositionGraphicsDevice_AddRef(This) (This)->lpVtbl->AddRef(This)
#define __x_ABI_CWindows_CUI_CComposition_CICompositionGraphicsDevice_Release(This) (This)->lpVtbl->Release(This)
/*** IInspectable methods ***/
#define __x_ABI_CWindows_CUI_CComposition_CICompositionGraphicsDevice_GetIids(This,iidCount,iids) (This)->lpVtbl->GetIids(This,iidCount,iids)
#define __x_ABI_CWindows_CUI_CComposition_CICompositionGraphicsDevice_GetRuntimeClassName(This,className) (This)->lpVtbl->GetRuntimeClassName(This,className)
#define __x_ABI_CWindows_CUI_CComposition_CICompositionGraphicsDevice_GetTrustLevel(This,trustLevel) (This)->lpVtbl->GetTrustLevel(This,trustLevel)
/*** ICompositionGraphicsDevice methods ***/
#define __x_ABI_CWindows_CUI_CComposition_CICompositionGraphicsDevice_CreateDrawingSurface(This,pixels,format,mode,result) (This)->lpVtbl->CreateDrawingSurface(This,pixels,format,mode,result)
#define __x_ABI_CWindows_CUI_CComposition_CICompositionGraphicsDevice_add_RenderingDeviceReplaced(This,handler,token) (This)->lpVtbl->add_RenderingDeviceReplaced(This,handler,token)
#define __x_ABI_CWindows_CUI_CComposition_CICompositionGraphicsDevice_remove_RenderingDeviceReplaced(This,token) (This)->lpVtbl->remove_RenderingDeviceReplaced(This,token)
#else
/*** IUnknown methods ***/
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CUI_CComposition_CICompositionGraphicsDevice_QueryInterface(__x_ABI_CWindows_CUI_CComposition_CICompositionGraphicsDevice* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG __x_ABI_CWindows_CUI_CComposition_CICompositionGraphicsDevice_AddRef(__x_ABI_CWindows_CUI_CComposition_CICompositionGraphicsDevice* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG __x_ABI_CWindows_CUI_CComposition_CICompositionGraphicsDevice_Release(__x_ABI_CWindows_CUI_CComposition_CICompositionGraphicsDevice* This) {
    return This->lpVtbl->Release(This);
}
/*** IInspectable methods ***/
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CUI_CComposition_CICompositionGraphicsDevice_GetIids(__x_ABI_CWindows_CUI_CComposition_CICompositionGraphicsDevice* This,ULONG *iidCount,IID **iids) {
    return This->lpVtbl->GetIids(This,iidCount,iids);
}
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CUI_CComposition_CICompositionGraphicsDevice_GetRuntimeClassName(__x_ABI_CWindows_CUI_CComposition_CICompositionGraphicsDevice* This,HSTRING *className) {
    return This->lpVtbl->GetRuntimeClassName(This,className);
}
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CUI_CComposition_CICompositionGraphicsDevice_GetTrustLevel(__x_ABI_CWindows_CUI_CComposition_CICompositionGraphicsDevice* This,TrustLevel *trustLevel) {
    return This->lpVtbl->GetTrustLevel(This,trustLevel);
}
/*** ICompositionGraphicsDevice methods ***/
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CUI_CComposition_CICompositionGraphicsDevice_CreateDrawingSurface(__x_ABI_CWindows_CUI_CComposition_CICompositionGraphicsDevice* This,struct __x_ABI_CWindows_CFoundation_CSize pixels,enum __x_ABI_CWindows_CGraphics_CDirectX_CDirectXPixelFormat format,enum __x_ABI_CWindows_CGraphics_CDirectX_CDirectXAlphaMode mode,__x_ABI_CWindows_CUI_CComposition_CICompositionDrawingSurface **result) {
    return This->lpVtbl->CreateDrawingSurface(This,pixels,format,mode,result);
}
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CUI_CComposition_CICompositionGraphicsDevice_add_RenderingDeviceReplaced(__x_ABI_CWindows_CUI_CComposition_CICompositionGraphicsDevice* This,__FITypedEventHandler_2_Windows__CUI__CComposition__CCompositionGraphicsDevice_Windows__CUI__CComposition__CRenderingDeviceReplacedEventArgs *handler,EventRegistrationToken *token) {
    return This->lpVtbl->add_RenderingDeviceReplaced(This,handler,token);
}
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CUI_CComposition_CICompositionGraphicsDevice_remove_RenderingDeviceReplaced(__x_ABI_CWindows_CUI_CComposition_CICompositionGraphicsDevice* This,EventRegistrationToken token) {
    return This->lpVtbl->remove_RenderingDeviceReplaced(This,token);
}
#endif
#ifdef WIDL_using_Windows_UI_Composition
#define IID_ICompositionGraphicsDevice IID___x_ABI_CWindows_CUI_CComposition_CICompositionGraphicsDevice
#define ICompositionGraphicsDeviceVtbl __x_ABI_CWindows_CUI_CComposition_CICompositionGraphicsDeviceVtbl
#define ICompositionGraphicsDevice __x_ABI_CWindows_CUI_CComposition_CICompositionGraphicsDevice
#define ICompositionGraphicsDevice_QueryInterface __x_ABI_CWindows_CUI_CComposition_CICompositionGraphicsDevice_QueryInterface
#define ICompositionGraphicsDevice_AddRef __x_ABI_CWindows_CUI_CComposition_CICompositionGraphicsDevice_AddRef
#define ICompositionGraphicsDevice_Release __x_ABI_CWindows_CUI_CComposition_CICompositionGraphicsDevice_Release
#define ICompositionGraphicsDevice_GetIids __x_ABI_CWindows_CUI_CComposition_CICompositionGraphicsDevice_GetIids
#define ICompositionGraphicsDevice_GetRuntimeClassName __x_ABI_CWindows_CUI_CComposition_CICompositionGraphicsDevice_GetRuntimeClassName
#define ICompositionGraphicsDevice_GetTrustLevel __x_ABI_CWindows_CUI_CComposition_CICompositionGraphicsDevice_GetTrustLevel
#define ICompositionGraphicsDevice_CreateDrawingSurface __x_ABI_CWindows_CUI_CComposition_CICompositionGraphicsDevice_CreateDrawingSurface
#define ICompositionGraphicsDevice_add_RenderingDeviceReplaced __x_ABI_CWindows_CUI_CComposition_CICompositionGraphicsDevice_add_RenderingDeviceReplaced
#define ICompositionGraphicsDevice_remove_RenderingDeviceReplaced __x_ABI_CWindows_CUI_CComposition_CICompositionGraphicsDevice_remove_RenderingDeviceReplaced
#endif /* WIDL_using_Windows_UI_Composition */
#endif

#endif

#endif  /* ____x_ABI_CWindows_CUI_CComposition_CICompositionGraphicsDevice_INTERFACE_DEFINED__ */
#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x20000 */

/*****************************************************************************
 * ICompositionPropertySet interface
 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x20000
#ifndef ____x_ABI_CWindows_CUI_CComposition_CICompositionPropertySet_INTERFACE_DEFINED__
#define ____x_ABI_CWindows_CUI_CComposition_CICompositionPropertySet_INTERFACE_DEFINED__

DEFINE_GUID(IID___x_ABI_CWindows_CUI_CComposition_CICompositionPropertySet, 0xc9d6d202, 0x5f67, 0x4453, 0x91,0x17, 0x9e,0xad,0xd4,0x30,0xd3,0xc2);
#if defined(__cplusplus) && !defined(CINTERFACE)
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace UI {
            namespace Composition {
                MIDL_INTERFACE("c9d6d202-5f67-4453-9117-9eadd430d3c2")
                ICompositionPropertySet : public IInspectable
                {
                    virtual HRESULT STDMETHODCALLTYPE InsertColor(
                        HSTRING name,
                        struct Color value) = 0;

                    virtual HRESULT STDMETHODCALLTYPE InsertMatrix3x2(
                        HSTRING name,
                        struct Matrix3x2 value) = 0;

                    virtual HRESULT STDMETHODCALLTYPE InsertMatrix4x4(
                        HSTRING name,
                        struct Matrix4x4 value) = 0;

                    virtual HRESULT STDMETHODCALLTYPE InsertQuaternion(
                        HSTRING name,
                        struct Quaternion value) = 0;

                    virtual HRESULT STDMETHODCALLTYPE InsertScalar(
                        HSTRING name,
                        FLOAT value) = 0;

                    virtual HRESULT STDMETHODCALLTYPE InsertVector2(
                        HSTRING name,
                        struct Vector2 value) = 0;

                    virtual HRESULT STDMETHODCALLTYPE InsertVector3(
                        HSTRING name,
                        struct Vector3 value) = 0;

                    virtual HRESULT STDMETHODCALLTYPE InsertVector4(
                        HSTRING name,
                        struct Vector4 value) = 0;

                    virtual HRESULT STDMETHODCALLTYPE TryGetColor(
                        HSTRING name,
                        struct Color *value,
                        enum CompositionGetValueStatus *result) = 0;

                    virtual HRESULT STDMETHODCALLTYPE TryGetMatrix3x2(
                        HSTRING name,
                        struct Matrix3x2 *value,
                        enum CompositionGetValueStatus *result) = 0;

                    virtual HRESULT STDMETHODCALLTYPE TryGetMatrix4x4(
                        HSTRING name,
                        struct Matrix4x4 *value,
                        enum CompositionGetValueStatus *result) = 0;

                    virtual HRESULT STDMETHODCALLTYPE TryGetQuaternion(
                        HSTRING name,
                        struct Quaternion *value,
                        enum CompositionGetValueStatus *result) = 0;

                    virtual HRESULT STDMETHODCALLTYPE TryGetScalar(
                        HSTRING name,
                        FLOAT *value,
                        enum CompositionGetValueStatus *result) = 0;

                    virtual HRESULT STDMETHODCALLTYPE TryGetVector2(
                        HSTRING name,
                        struct Vector2 *value,
                        enum CompositionGetValueStatus *result) = 0;

                    virtual HRESULT STDMETHODCALLTYPE TryGetVector3(
                        HSTRING name,
                        struct Vector3 *value,
                        enum CompositionGetValueStatus *result) = 0;

                    virtual HRESULT STDMETHODCALLTYPE TryGetVector4(
                        HSTRING name,
                        struct Vector4 *value,
                        enum CompositionGetValueStatus *result) = 0;

                };
            }
        }
    }
}
extern "C" {
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(__x_ABI_CWindows_CUI_CComposition_CICompositionPropertySet, 0xc9d6d202, 0x5f67, 0x4453, 0x91,0x17, 0x9e,0xad,0xd4,0x30,0xd3,0xc2)
#endif
#else
typedef struct __x_ABI_CWindows_CUI_CComposition_CICompositionPropertySetVtbl {
    BEGIN_INTERFACE

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

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

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

    /*** IInspectable methods ***/
    HRESULT (STDMETHODCALLTYPE *GetIids)(
        __x_ABI_CWindows_CUI_CComposition_CICompositionPropertySet *This,
        ULONG *iidCount,
        IID **iids);

    HRESULT (STDMETHODCALLTYPE *GetRuntimeClassName)(
        __x_ABI_CWindows_CUI_CComposition_CICompositionPropertySet *This,
        HSTRING *className);

    HRESULT (STDMETHODCALLTYPE *GetTrustLevel)(
        __x_ABI_CWindows_CUI_CComposition_CICompositionPropertySet *This,
        TrustLevel *trustLevel);

    /*** ICompositionPropertySet methods ***/
    HRESULT (STDMETHODCALLTYPE *InsertColor)(
        __x_ABI_CWindows_CUI_CComposition_CICompositionPropertySet *This,
        HSTRING name,
        struct __x_ABI_CWindows_CUI_CColor value);

    HRESULT (STDMETHODCALLTYPE *InsertMatrix3x2)(
        __x_ABI_CWindows_CUI_CComposition_CICompositionPropertySet *This,
        HSTRING name,
        struct __x_ABI_CWindows_CFoundation_CNumerics_CMatrix3x2 value);

    HRESULT (STDMETHODCALLTYPE *InsertMatrix4x4)(
        __x_ABI_CWindows_CUI_CComposition_CICompositionPropertySet *This,
        HSTRING name,
        struct __x_ABI_CWindows_CFoundation_CNumerics_CMatrix4x4 value);

    HRESULT (STDMETHODCALLTYPE *InsertQuaternion)(
        __x_ABI_CWindows_CUI_CComposition_CICompositionPropertySet *This,
        HSTRING name,
        struct __x_ABI_CWindows_CFoundation_CNumerics_CQuaternion value);

    HRESULT (STDMETHODCALLTYPE *InsertScalar)(
        __x_ABI_CWindows_CUI_CComposition_CICompositionPropertySet *This,
        HSTRING name,
        FLOAT value);

    HRESULT (STDMETHODCALLTYPE *InsertVector2)(
        __x_ABI_CWindows_CUI_CComposition_CICompositionPropertySet *This,
        HSTRING name,
        struct __x_ABI_CWindows_CFoundation_CNumerics_CVector2 value);

    HRESULT (STDMETHODCALLTYPE *InsertVector3)(
        __x_ABI_CWindows_CUI_CComposition_CICompositionPropertySet *This,
        HSTRING name,
        struct __x_ABI_CWindows_CFoundation_CNumerics_CVector3 value);

    HRESULT (STDMETHODCALLTYPE *InsertVector4)(
        __x_ABI_CWindows_CUI_CComposition_CICompositionPropertySet *This,
        HSTRING name,
        struct __x_ABI_CWindows_CFoundation_CNumerics_CVector4 value);

    HRESULT (STDMETHODCALLTYPE *TryGetColor)(
        __x_ABI_CWindows_CUI_CComposition_CICompositionPropertySet *This,
        HSTRING name,
        struct __x_ABI_CWindows_CUI_CColor *value,
        enum __x_ABI_CWindows_CUI_CComposition_CCompositionGetValueStatus *result);

    HRESULT (STDMETHODCALLTYPE *TryGetMatrix3x2)(
        __x_ABI_CWindows_CUI_CComposition_CICompositionPropertySet *This,
        HSTRING name,
        struct __x_ABI_CWindows_CFoundation_CNumerics_CMatrix3x2 *value,
        enum __x_ABI_CWindows_CUI_CComposition_CCompositionGetValueStatus *result);

    HRESULT (STDMETHODCALLTYPE *TryGetMatrix4x4)(
        __x_ABI_CWindows_CUI_CComposition_CICompositionPropertySet *This,
        HSTRING name,
        struct __x_ABI_CWindows_CFoundation_CNumerics_CMatrix4x4 *value,
        enum __x_ABI_CWindows_CUI_CComposition_CCompositionGetValueStatus *result);

    HRESULT (STDMETHODCALLTYPE *TryGetQuaternion)(
        __x_ABI_CWindows_CUI_CComposition_CICompositionPropertySet *This,
        HSTRING name,
        struct __x_ABI_CWindows_CFoundation_CNumerics_CQuaternion *value,
        enum __x_ABI_CWindows_CUI_CComposition_CCompositionGetValueStatus *result);

    HRESULT (STDMETHODCALLTYPE *TryGetScalar)(
        __x_ABI_CWindows_CUI_CComposition_CICompositionPropertySet *This,
        HSTRING name,
        FLOAT *value,
        enum __x_ABI_CWindows_CUI_CComposition_CCompositionGetValueStatus *result);

    HRESULT (STDMETHODCALLTYPE *TryGetVector2)(
        __x_ABI_CWindows_CUI_CComposition_CICompositionPropertySet *This,
        HSTRING name,
        struct __x_ABI_CWindows_CFoundation_CNumerics_CVector2 *value,
        enum __x_ABI_CWindows_CUI_CComposition_CCompositionGetValueStatus *result);

    HRESULT (STDMETHODCALLTYPE *TryGetVector3)(
        __x_ABI_CWindows_CUI_CComposition_CICompositionPropertySet *This,
        HSTRING name,
        struct __x_ABI_CWindows_CFoundation_CNumerics_CVector3 *value,
        enum __x_ABI_CWindows_CUI_CComposition_CCompositionGetValueStatus *result);

    HRESULT (STDMETHODCALLTYPE *TryGetVector4)(
        __x_ABI_CWindows_CUI_CComposition_CICompositionPropertySet *This,
        HSTRING name,
        struct __x_ABI_CWindows_CFoundation_CNumerics_CVector4 *value,
        enum __x_ABI_CWindows_CUI_CComposition_CCompositionGetValueStatus *result);

    END_INTERFACE
} __x_ABI_CWindows_CUI_CComposition_CICompositionPropertySetVtbl;

interface __x_ABI_CWindows_CUI_CComposition_CICompositionPropertySet {
    CONST_VTBL __x_ABI_CWindows_CUI_CComposition_CICompositionPropertySetVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define __x_ABI_CWindows_CUI_CComposition_CICompositionPropertySet_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define __x_ABI_CWindows_CUI_CComposition_CICompositionPropertySet_AddRef(This) (This)->lpVtbl->AddRef(This)
#define __x_ABI_CWindows_CUI_CComposition_CICompositionPropertySet_Release(This) (This)->lpVtbl->Release(This)
/*** IInspectable methods ***/
#define __x_ABI_CWindows_CUI_CComposition_CICompositionPropertySet_GetIids(This,iidCount,iids) (This)->lpVtbl->GetIids(This,iidCount,iids)
#define __x_ABI_CWindows_CUI_CComposition_CICompositionPropertySet_GetRuntimeClassName(This,className) (This)->lpVtbl->GetRuntimeClassName(This,className)
#define __x_ABI_CWindows_CUI_CComposition_CICompositionPropertySet_GetTrustLevel(This,trustLevel) (This)->lpVtbl->GetTrustLevel(This,trustLevel)
/*** ICompositionPropertySet methods ***/
#define __x_ABI_CWindows_CUI_CComposition_CICompositionPropertySet_InsertColor(This,name,value) (This)->lpVtbl->InsertColor(This,name,value)
#define __x_ABI_CWindows_CUI_CComposition_CICompositionPropertySet_InsertMatrix3x2(This,name,value) (This)->lpVtbl->InsertMatrix3x2(This,name,value)
#define __x_ABI_CWindows_CUI_CComposition_CICompositionPropertySet_InsertMatrix4x4(This,name,value) (This)->lpVtbl->InsertMatrix4x4(This,name,value)
#define __x_ABI_CWindows_CUI_CComposition_CICompositionPropertySet_InsertQuaternion(This,name,value) (This)->lpVtbl->InsertQuaternion(This,name,value)
#define __x_ABI_CWindows_CUI_CComposition_CICompositionPropertySet_InsertScalar(This,name,value) (This)->lpVtbl->InsertScalar(This,name,value)
#define __x_ABI_CWindows_CUI_CComposition_CICompositionPropertySet_InsertVector2(This,name,value) (This)->lpVtbl->InsertVector2(This,name,value)
#define __x_ABI_CWindows_CUI_CComposition_CICompositionPropertySet_InsertVector3(This,name,value) (This)->lpVtbl->InsertVector3(This,name,value)
#define __x_ABI_CWindows_CUI_CComposition_CICompositionPropertySet_InsertVector4(This,name,value) (This)->lpVtbl->InsertVector4(This,name,value)
#define __x_ABI_CWindows_CUI_CComposition_CICompositionPropertySet_TryGetColor(This,name,value,result) (This)->lpVtbl->TryGetColor(This,name,value,result)
#define __x_ABI_CWindows_CUI_CComposition_CICompositionPropertySet_TryGetMatrix3x2(This,name,value,result) (This)->lpVtbl->TryGetMatrix3x2(This,name,value,result)
#define __x_ABI_CWindows_CUI_CComposition_CICompositionPropertySet_TryGetMatrix4x4(This,name,value,result) (This)->lpVtbl->TryGetMatrix4x4(This,name,value,result)
#define __x_ABI_CWindows_CUI_CComposition_CICompositionPropertySet_TryGetQuaternion(This,name,value,result) (This)->lpVtbl->TryGetQuaternion(This,name,value,result)
#define __x_ABI_CWindows_CUI_CComposition_CICompositionPropertySet_TryGetScalar(This,name,value,result) (This)->lpVtbl->TryGetScalar(This,name,value,result)
#define __x_ABI_CWindows_CUI_CComposition_CICompositionPropertySet_TryGetVector2(This,name,value,result) (This)->lpVtbl->TryGetVector2(This,name,value,result)
#define __x_ABI_CWindows_CUI_CComposition_CICompositionPropertySet_TryGetVector3(This,name,value,result) (This)->lpVtbl->TryGetVector3(This,name,value,result)
#define __x_ABI_CWindows_CUI_CComposition_CICompositionPropertySet_TryGetVector4(This,name,value,result) (This)->lpVtbl->TryGetVector4(This,name,value,result)
#else
/*** IUnknown methods ***/
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CUI_CComposition_CICompositionPropertySet_QueryInterface(__x_ABI_CWindows_CUI_CComposition_CICompositionPropertySet* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG __x_ABI_CWindows_CUI_CComposition_CICompositionPropertySet_AddRef(__x_ABI_CWindows_CUI_CComposition_CICompositionPropertySet* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG __x_ABI_CWindows_CUI_CComposition_CICompositionPropertySet_Release(__x_ABI_CWindows_CUI_CComposition_CICompositionPropertySet* This) {
    return This->lpVtbl->Release(This);
}
/*** IInspectable methods ***/
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CUI_CComposition_CICompositionPropertySet_GetIids(__x_ABI_CWindows_CUI_CComposition_CICompositionPropertySet* This,ULONG *iidCount,IID **iids) {
    return This->lpVtbl->GetIids(This,iidCount,iids);
}
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CUI_CComposition_CICompositionPropertySet_GetRuntimeClassName(__x_ABI_CWindows_CUI_CComposition_CICompositionPropertySet* This,HSTRING *className) {
    return This->lpVtbl->GetRuntimeClassName(This,className);
}
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CUI_CComposition_CICompositionPropertySet_GetTrustLevel(__x_ABI_CWindows_CUI_CComposition_CICompositionPropertySet* This,TrustLevel *trustLevel) {
    return This->lpVtbl->GetTrustLevel(This,trustLevel);
}
/*** ICompositionPropertySet methods ***/
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CUI_CComposition_CICompositionPropertySet_InsertColor(__x_ABI_CWindows_CUI_CComposition_CICompositionPropertySet* This,HSTRING name,struct __x_ABI_CWindows_CUI_CColor value) {
    return This->lpVtbl->InsertColor(This,name,value);
}
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CUI_CComposition_CICompositionPropertySet_InsertMatrix3x2(__x_ABI_CWindows_CUI_CComposition_CICompositionPropertySet* This,HSTRING name,struct __x_ABI_CWindows_CFoundation_CNumerics_CMatrix3x2 value) {
    return This->lpVtbl->InsertMatrix3x2(This,name,value);
}
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CUI_CComposition_CICompositionPropertySet_InsertMatrix4x4(__x_ABI_CWindows_CUI_CComposition_CICompositionPropertySet* This,HSTRING name,struct __x_ABI_CWindows_CFoundation_CNumerics_CMatrix4x4 value) {
    return This->lpVtbl->InsertMatrix4x4(This,name,value);
}
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CUI_CComposition_CICompositionPropertySet_InsertQuaternion(__x_ABI_CWindows_CUI_CComposition_CICompositionPropertySet* This,HSTRING name,struct __x_ABI_CWindows_CFoundation_CNumerics_CQuaternion value) {
    return This->lpVtbl->InsertQuaternion(This,name,value);
}
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CUI_CComposition_CICompositionPropertySet_InsertScalar(__x_ABI_CWindows_CUI_CComposition_CICompositionPropertySet* This,HSTRING name,FLOAT value) {
    return This->lpVtbl->InsertScalar(This,name,value);
}
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CUI_CComposition_CICompositionPropertySet_InsertVector2(__x_ABI_CWindows_CUI_CComposition_CICompositionPropertySet* This,HSTRING name,struct __x_ABI_CWindows_CFoundation_CNumerics_CVector2 value) {
    return This->lpVtbl->InsertVector2(This,name,value);
}
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CUI_CComposition_CICompositionPropertySet_InsertVector3(__x_ABI_CWindows_CUI_CComposition_CICompositionPropertySet* This,HSTRING name,struct __x_ABI_CWindows_CFoundation_CNumerics_CVector3 value) {
    return This->lpVtbl->InsertVector3(This,name,value);
}
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CUI_CComposition_CICompositionPropertySet_InsertVector4(__x_ABI_CWindows_CUI_CComposition_CICompositionPropertySet* This,HSTRING name,struct __x_ABI_CWindows_CFoundation_CNumerics_CVector4 value) {
    return This->lpVtbl->InsertVector4(This,name,value);
}
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CUI_CComposition_CICompositionPropertySet_TryGetColor(__x_ABI_CWindows_CUI_CComposition_CICompositionPropertySet* This,HSTRING name,struct __x_ABI_CWindows_CUI_CColor *value,enum __x_ABI_CWindows_CUI_CComposition_CCompositionGetValueStatus *result) {
    return This->lpVtbl->TryGetColor(This,name,value,result);
}
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CUI_CComposition_CICompositionPropertySet_TryGetMatrix3x2(__x_ABI_CWindows_CUI_CComposition_CICompositionPropertySet* This,HSTRING name,struct __x_ABI_CWindows_CFoundation_CNumerics_CMatrix3x2 *value,enum __x_ABI_CWindows_CUI_CComposition_CCompositionGetValueStatus *result) {
    return This->lpVtbl->TryGetMatrix3x2(This,name,value,result);
}
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CUI_CComposition_CICompositionPropertySet_TryGetMatrix4x4(__x_ABI_CWindows_CUI_CComposition_CICompositionPropertySet* This,HSTRING name,struct __x_ABI_CWindows_CFoundation_CNumerics_CMatrix4x4 *value,enum __x_ABI_CWindows_CUI_CComposition_CCompositionGetValueStatus *result) {
    return This->lpVtbl->TryGetMatrix4x4(This,name,value,result);
}
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CUI_CComposition_CICompositionPropertySet_TryGetQuaternion(__x_ABI_CWindows_CUI_CComposition_CICompositionPropertySet* This,HSTRING name,struct __x_ABI_CWindows_CFoundation_CNumerics_CQuaternion *value,enum __x_ABI_CWindows_CUI_CComposition_CCompositionGetValueStatus *result) {
    return This->lpVtbl->TryGetQuaternion(This,name,value,result);
}
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CUI_CComposition_CICompositionPropertySet_TryGetScalar(__x_ABI_CWindows_CUI_CComposition_CICompositionPropertySet* This,HSTRING name,FLOAT *value,enum __x_ABI_CWindows_CUI_CComposition_CCompositionGetValueStatus *result) {
    return This->lpVtbl->TryGetScalar(This,name,value,result);
}
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CUI_CComposition_CICompositionPropertySet_TryGetVector2(__x_ABI_CWindows_CUI_CComposition_CICompositionPropertySet* This,HSTRING name,struct __x_ABI_CWindows_CFoundation_CNumerics_CVector2 *value,enum __x_ABI_CWindows_CUI_CComposition_CCompositionGetValueStatus *result) {
    return This->lpVtbl->TryGetVector2(This,name,value,result);
}
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CUI_CComposition_CICompositionPropertySet_TryGetVector3(__x_ABI_CWindows_CUI_CComposition_CICompositionPropertySet* This,HSTRING name,struct __x_ABI_CWindows_CFoundation_CNumerics_CVector3 *value,enum __x_ABI_CWindows_CUI_CComposition_CCompositionGetValueStatus *result) {
    return This->lpVtbl->TryGetVector3(This,name,value,result);
}
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CUI_CComposition_CICompositionPropertySet_TryGetVector4(__x_ABI_CWindows_CUI_CComposition_CICompositionPropertySet* This,HSTRING name,struct __x_ABI_CWindows_CFoundation_CNumerics_CVector4 *value,enum __x_ABI_CWindows_CUI_CComposition_CCompositionGetValueStatus *result) {
    return This->lpVtbl->TryGetVector4(This,name,value,result);
}
#endif
#ifdef WIDL_using_Windows_UI_Composition
#define IID_ICompositionPropertySet IID___x_ABI_CWindows_CUI_CComposition_CICompositionPropertySet
#define ICompositionPropertySetVtbl __x_ABI_CWindows_CUI_CComposition_CICompositionPropertySetVtbl
#define ICompositionPropertySet __x_ABI_CWindows_CUI_CComposition_CICompositionPropertySet
#define ICompositionPropertySet_QueryInterface __x_ABI_CWindows_CUI_CComposition_CICompositionPropertySet_QueryInterface
#define ICompositionPropertySet_AddRef __x_ABI_CWindows_CUI_CComposition_CICompositionPropertySet_AddRef
#define ICompositionPropertySet_Release __x_ABI_CWindows_CUI_CComposition_CICompositionPropertySet_Release
#define ICompositionPropertySet_GetIids __x_ABI_CWindows_CUI_CComposition_CICompositionPropertySet_GetIids
#define ICompositionPropertySet_GetRuntimeClassName __x_ABI_CWindows_CUI_CComposition_CICompositionPropertySet_GetRuntimeClassName
#define ICompositionPropertySet_GetTrustLevel __x_ABI_CWindows_CUI_CComposition_CICompositionPropertySet_GetTrustLevel
#define ICompositionPropertySet_InsertColor __x_ABI_CWindows_CUI_CComposition_CICompositionPropertySet_InsertColor
#define ICompositionPropertySet_InsertMatrix3x2 __x_ABI_CWindows_CUI_CComposition_CICompositionPropertySet_InsertMatrix3x2
#define ICompositionPropertySet_InsertMatrix4x4 __x_ABI_CWindows_CUI_CComposition_CICompositionPropertySet_InsertMatrix4x4
#define ICompositionPropertySet_InsertQuaternion __x_ABI_CWindows_CUI_CComposition_CICompositionPropertySet_InsertQuaternion
#define ICompositionPropertySet_InsertScalar __x_ABI_CWindows_CUI_CComposition_CICompositionPropertySet_InsertScalar
#define ICompositionPropertySet_InsertVector2 __x_ABI_CWindows_CUI_CComposition_CICompositionPropertySet_InsertVector2
#define ICompositionPropertySet_InsertVector3 __x_ABI_CWindows_CUI_CComposition_CICompositionPropertySet_InsertVector3
#define ICompositionPropertySet_InsertVector4 __x_ABI_CWindows_CUI_CComposition_CICompositionPropertySet_InsertVector4
#define ICompositionPropertySet_TryGetColor __x_ABI_CWindows_CUI_CComposition_CICompositionPropertySet_TryGetColor
#define ICompositionPropertySet_TryGetMatrix3x2 __x_ABI_CWindows_CUI_CComposition_CICompositionPropertySet_TryGetMatrix3x2
#define ICompositionPropertySet_TryGetMatrix4x4 __x_ABI_CWindows_CUI_CComposition_CICompositionPropertySet_TryGetMatrix4x4
#define ICompositionPropertySet_TryGetQuaternion __x_ABI_CWindows_CUI_CComposition_CICompositionPropertySet_TryGetQuaternion
#define ICompositionPropertySet_TryGetScalar __x_ABI_CWindows_CUI_CComposition_CICompositionPropertySet_TryGetScalar
#define ICompositionPropertySet_TryGetVector2 __x_ABI_CWindows_CUI_CComposition_CICompositionPropertySet_TryGetVector2
#define ICompositionPropertySet_TryGetVector3 __x_ABI_CWindows_CUI_CComposition_CICompositionPropertySet_TryGetVector3
#define ICompositionPropertySet_TryGetVector4 __x_ABI_CWindows_CUI_CComposition_CICompositionPropertySet_TryGetVector4
#endif /* WIDL_using_Windows_UI_Composition */
#endif

#endif

#endif  /* ____x_ABI_CWindows_CUI_CComposition_CICompositionPropertySet_INTERFACE_DEFINED__ */
#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x20000 */

/*****************************************************************************
 * ICompositionScopedBatch interface
 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x20000
#ifndef ____x_ABI_CWindows_CUI_CComposition_CICompositionScopedBatch_INTERFACE_DEFINED__
#define ____x_ABI_CWindows_CUI_CComposition_CICompositionScopedBatch_INTERFACE_DEFINED__

DEFINE_GUID(IID___x_ABI_CWindows_CUI_CComposition_CICompositionScopedBatch, 0x0d00dad0, 0xfb07, 0x46fd, 0x8c,0x72, 0x62,0x80,0xd1,0xa3,0xd1,0xdd);
#if defined(__cplusplus) && !defined(CINTERFACE)
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace UI {
            namespace Composition {
                MIDL_INTERFACE("0d00dad0-fb07-46fd-8c72-6280d1a3d1dd")
                ICompositionScopedBatch : public IInspectable
                {
                    virtual HRESULT STDMETHODCALLTYPE get_IsActive(
                        boolean *value) = 0;

                    virtual HRESULT STDMETHODCALLTYPE get_IsEnded(
                        boolean *value) = 0;

                    virtual HRESULT STDMETHODCALLTYPE End(
                        ) = 0;

                    virtual HRESULT STDMETHODCALLTYPE Resume(
                        ) = 0;

                    virtual HRESULT STDMETHODCALLTYPE Suspend(
                        ) = 0;

                    virtual HRESULT STDMETHODCALLTYPE add_Completed(
                        ABI::Windows::Foundation::ITypedEventHandler<IInspectable*,ABI::Windows::UI::Composition::CompositionBatchCompletedEventArgs* > *handler,
                        EventRegistrationToken *token) = 0;

                    virtual HRESULT STDMETHODCALLTYPE remove_Completed(
                        EventRegistrationToken token) = 0;

                };
            }
        }
    }
}
extern "C" {
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(__x_ABI_CWindows_CUI_CComposition_CICompositionScopedBatch, 0x0d00dad0, 0xfb07, 0x46fd, 0x8c,0x72, 0x62,0x80,0xd1,0xa3,0xd1,0xdd)
#endif
#else
typedef struct __x_ABI_CWindows_CUI_CComposition_CICompositionScopedBatchVtbl {
    BEGIN_INTERFACE

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

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

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

    /*** IInspectable methods ***/
    HRESULT (STDMETHODCALLTYPE *GetIids)(
        __x_ABI_CWindows_CUI_CComposition_CICompositionScopedBatch *This,
        ULONG *iidCount,
        IID **iids);

    HRESULT (STDMETHODCALLTYPE *GetRuntimeClassName)(
        __x_ABI_CWindows_CUI_CComposition_CICompositionScopedBatch *This,
        HSTRING *className);

    HRESULT (STDMETHODCALLTYPE *GetTrustLevel)(
        __x_ABI_CWindows_CUI_CComposition_CICompositionScopedBatch *This,
        TrustLevel *trustLevel);

    /*** ICompositionScopedBatch methods ***/
    HRESULT (STDMETHODCALLTYPE *get_IsActive)(
        __x_ABI_CWindows_CUI_CComposition_CICompositionScopedBatch *This,
        boolean *value);

    HRESULT (STDMETHODCALLTYPE *get_IsEnded)(
        __x_ABI_CWindows_CUI_CComposition_CICompositionScopedBatch *This,
        boolean *value);

    HRESULT (STDMETHODCALLTYPE *End)(
        __x_ABI_CWindows_CUI_CComposition_CICompositionScopedBatch *This);

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

    HRESULT (STDMETHODCALLTYPE *Suspend)(
        __x_ABI_CWindows_CUI_CComposition_CICompositionScopedBatch *This);

    HRESULT (STDMETHODCALLTYPE *add_Completed)(
        __x_ABI_CWindows_CUI_CComposition_CICompositionScopedBatch *This,
        __FITypedEventHandler_2_IInspectable_Windows__CUI__CComposition__CCompositionBatchCompletedEventArgs *handler,
        EventRegistrationToken *token);

    HRESULT (STDMETHODCALLTYPE *remove_Completed)(
        __x_ABI_CWindows_CUI_CComposition_CICompositionScopedBatch *This,
        EventRegistrationToken token);

    END_INTERFACE
} __x_ABI_CWindows_CUI_CComposition_CICompositionScopedBatchVtbl;

interface __x_ABI_CWindows_CUI_CComposition_CICompositionScopedBatch {
    CONST_VTBL __x_ABI_CWindows_CUI_CComposition_CICompositionScopedBatchVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define __x_ABI_CWindows_CUI_CComposition_CICompositionScopedBatch_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define __x_ABI_CWindows_CUI_CComposition_CICompositionScopedBatch_AddRef(This) (This)->lpVtbl->AddRef(This)
#define __x_ABI_CWindows_CUI_CComposition_CICompositionScopedBatch_Release(This) (This)->lpVtbl->Release(This)
/*** IInspectable methods ***/
#define __x_ABI_CWindows_CUI_CComposition_CICompositionScopedBatch_GetIids(This,iidCount,iids) (This)->lpVtbl->GetIids(This,iidCount,iids)
#define __x_ABI_CWindows_CUI_CComposition_CICompositionScopedBatch_GetRuntimeClassName(This,className) (This)->lpVtbl->GetRuntimeClassName(This,className)
#define __x_ABI_CWindows_CUI_CComposition_CICompositionScopedBatch_GetTrustLevel(This,trustLevel) (This)->lpVtbl->GetTrustLevel(This,trustLevel)
/*** ICompositionScopedBatch methods ***/
#define __x_ABI_CWindows_CUI_CComposition_CICompositionScopedBatch_get_IsActive(This,value) (This)->lpVtbl->get_IsActive(This,value)
#define __x_ABI_CWindows_CUI_CComposition_CICompositionScopedBatch_get_IsEnded(This,value) (This)->lpVtbl->get_IsEnded(This,value)
#define __x_ABI_CWindows_CUI_CComposition_CICompositionScopedBatch_End(This) (This)->lpVtbl->End(This)
#define __x_ABI_CWindows_CUI_CComposition_CICompositionScopedBatch_Resume(This) (This)->lpVtbl->Resume(This)
#define __x_ABI_CWindows_CUI_CComposition_CICompositionScopedBatch_Suspend(This) (This)->lpVtbl->Suspend(This)
#define __x_ABI_CWindows_CUI_CComposition_CICompositionScopedBatch_add_Completed(This,handler,token) (This)->lpVtbl->add_Completed(This,handler,token)
#define __x_ABI_CWindows_CUI_CComposition_CICompositionScopedBatch_remove_Completed(This,token) (This)->lpVtbl->remove_Completed(This,token)
#else
/*** IUnknown methods ***/
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CUI_CComposition_CICompositionScopedBatch_QueryInterface(__x_ABI_CWindows_CUI_CComposition_CICompositionScopedBatch* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG __x_ABI_CWindows_CUI_CComposition_CICompositionScopedBatch_AddRef(__x_ABI_CWindows_CUI_CComposition_CICompositionScopedBatch* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG __x_ABI_CWindows_CUI_CComposition_CICompositionScopedBatch_Release(__x_ABI_CWindows_CUI_CComposition_CICompositionScopedBatch* This) {
    return This->lpVtbl->Release(This);
}
/*** IInspectable methods ***/
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CUI_CComposition_CICompositionScopedBatch_GetIids(__x_ABI_CWindows_CUI_CComposition_CICompositionScopedBatch* This,ULONG *iidCount,IID **iids) {
    return This->lpVtbl->GetIids(This,iidCount,iids);
}
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CUI_CComposition_CICompositionScopedBatch_GetRuntimeClassName(__x_ABI_CWindows_CUI_CComposition_CICompositionScopedBatch* This,HSTRING *className) {
    return This->lpVtbl->GetRuntimeClassName(This,className);
}
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CUI_CComposition_CICompositionScopedBatch_GetTrustLevel(__x_ABI_CWindows_CUI_CComposition_CICompositionScopedBatch* This,TrustLevel *trustLevel) {
    return This->lpVtbl->GetTrustLevel(This,trustLevel);
}
/*** ICompositionScopedBatch methods ***/
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CUI_CComposition_CICompositionScopedBatch_get_IsActive(__x_ABI_CWindows_CUI_CComposition_CICompositionScopedBatch* This,boolean *value) {
    return This->lpVtbl->get_IsActive(This,value);
}
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CUI_CComposition_CICompositionScopedBatch_get_IsEnded(__x_ABI_CWindows_CUI_CComposition_CICompositionScopedBatch* This,boolean *value) {
    return This->lpVtbl->get_IsEnded(This,value);
}
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CUI_CComposition_CICompositionScopedBatch_End(__x_ABI_CWindows_CUI_CComposition_CICompositionScopedBatch* This) {
    return This->lpVtbl->End(This);
}
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CUI_CComposition_CICompositionScopedBatch_Resume(__x_ABI_CWindows_CUI_CComposition_CICompositionScopedBatch* This) {
    return This->lpVtbl->Resume(This);
}
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CUI_CComposition_CICompositionScopedBatch_Suspend(__x_ABI_CWindows_CUI_CComposition_CICompositionScopedBatch* This) {
    return This->lpVtbl->Suspend(This);
}
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CUI_CComposition_CICompositionScopedBatch_add_Completed(__x_ABI_CWindows_CUI_CComposition_CICompositionScopedBatch* This,__FITypedEventHandler_2_IInspectable_Windows__CUI__CComposition__CCompositionBatchCompletedEventArgs *handler,EventRegistrationToken *token) {
    return This->lpVtbl->add_Completed(This,handler,token);
}
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CUI_CComposition_CICompositionScopedBatch_remove_Completed(__x_ABI_CWindows_CUI_CComposition_CICompositionScopedBatch* This,EventRegistrationToken token) {
    return This->lpVtbl->remove_Completed(This,token);
}
#endif
#ifdef WIDL_using_Windows_UI_Composition
#define IID_ICompositionScopedBatch IID___x_ABI_CWindows_CUI_CComposition_CICompositionScopedBatch
#define ICompositionScopedBatchVtbl __x_ABI_CWindows_CUI_CComposition_CICompositionScopedBatchVtbl
#define ICompositionScopedBatch __x_ABI_CWindows_CUI_CComposition_CICompositionScopedBatch
#define ICompositionScopedBatch_QueryInterface __x_ABI_CWindows_CUI_CComposition_CICompositionScopedBatch_QueryInterface
#define ICompositionScopedBatch_AddRef __x_ABI_CWindows_CUI_CComposition_CICompositionScopedBatch_AddRef
#define ICompositionScopedBatch_Release __x_ABI_CWindows_CUI_CComposition_CICompositionScopedBatch_Release
#define ICompositionScopedBatch_GetIids __x_ABI_CWindows_CUI_CComposition_CICompositionScopedBatch_GetIids
#define ICompositionScopedBatch_GetRuntimeClassName __x_ABI_CWindows_CUI_CComposition_CICompositionScopedBatch_GetRuntimeClassName
#define ICompositionScopedBatch_GetTrustLevel __x_ABI_CWindows_CUI_CComposition_CICompositionScopedBatch_GetTrustLevel
#define ICompositionScopedBatch_get_IsActive __x_ABI_CWindows_CUI_CComposition_CICompositionScopedBatch_get_IsActive
#define ICompositionScopedBatch_get_IsEnded __x_ABI_CWindows_CUI_CComposition_CICompositionScopedBatch_get_IsEnded
#define ICompositionScopedBatch_End __x_ABI_CWindows_CUI_CComposition_CICompositionScopedBatch_End
#define ICompositionScopedBatch_Resume __x_ABI_CWindows_CUI_CComposition_CICompositionScopedBatch_Resume
#define ICompositionScopedBatch_Suspend __x_ABI_CWindows_CUI_CComposition_CICompositionScopedBatch_Suspend
#define ICompositionScopedBatch_add_Completed __x_ABI_CWindows_CUI_CComposition_CICompositionScopedBatch_add_Completed
#define ICompositionScopedBatch_remove_Completed __x_ABI_CWindows_CUI_CComposition_CICompositionScopedBatch_remove_Completed
#endif /* WIDL_using_Windows_UI_Composition */
#endif

#endif

#endif  /* ____x_ABI_CWindows_CUI_CComposition_CICompositionScopedBatch_INTERFACE_DEFINED__ */
#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x20000 */

/*****************************************************************************
 * ICompositionSurface interface
 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x20000
#ifndef ____x_ABI_CWindows_CUI_CComposition_CICompositionSurface_INTERFACE_DEFINED__
#define ____x_ABI_CWindows_CUI_CComposition_CICompositionSurface_INTERFACE_DEFINED__

DEFINE_GUID(IID___x_ABI_CWindows_CUI_CComposition_CICompositionSurface, 0x1527540d, 0x42c7, 0x47a6, 0xa4,0x08, 0x66,0x8f,0x79,0xa9,0x0d,0xfb);
#if defined(__cplusplus) && !defined(CINTERFACE)
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace UI {
            namespace Composition {
                MIDL_INTERFACE("1527540d-42c7-47a6-a408-668f79a90dfb")
                ICompositionSurface : public IInspectable
                {
                };
            }
        }
    }
}
extern "C" {
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(__x_ABI_CWindows_CUI_CComposition_CICompositionSurface, 0x1527540d, 0x42c7, 0x47a6, 0xa4,0x08, 0x66,0x8f,0x79,0xa9,0x0d,0xfb)
#endif
#else
typedef struct __x_ABI_CWindows_CUI_CComposition_CICompositionSurfaceVtbl {
    BEGIN_INTERFACE

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

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

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

    /*** IInspectable methods ***/
    HRESULT (STDMETHODCALLTYPE *GetIids)(
        __x_ABI_CWindows_CUI_CComposition_CICompositionSurface *This,
        ULONG *iidCount,
        IID **iids);

    HRESULT (STDMETHODCALLTYPE *GetRuntimeClassName)(
        __x_ABI_CWindows_CUI_CComposition_CICompositionSurface *This,
        HSTRING *className);

    HRESULT (STDMETHODCALLTYPE *GetTrustLevel)(
        __x_ABI_CWindows_CUI_CComposition_CICompositionSurface *This,
        TrustLevel *trustLevel);

    END_INTERFACE
} __x_ABI_CWindows_CUI_CComposition_CICompositionSurfaceVtbl;

interface __x_ABI_CWindows_CUI_CComposition_CICompositionSurface {
    CONST_VTBL __x_ABI_CWindows_CUI_CComposition_CICompositionSurfaceVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define __x_ABI_CWindows_CUI_CComposition_CICompositionSurface_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define __x_ABI_CWindows_CUI_CComposition_CICompositionSurface_AddRef(This) (This)->lpVtbl->AddRef(This)
#define __x_ABI_CWindows_CUI_CComposition_CICompositionSurface_Release(This) (This)->lpVtbl->Release(This)
/*** IInspectable methods ***/
#define __x_ABI_CWindows_CUI_CComposition_CICompositionSurface_GetIids(This,iidCount,iids) (This)->lpVtbl->GetIids(This,iidCount,iids)
#define __x_ABI_CWindows_CUI_CComposition_CICompositionSurface_GetRuntimeClassName(This,className) (This)->lpVtbl->GetRuntimeClassName(This,className)
#define __x_ABI_CWindows_CUI_CComposition_CICompositionSurface_GetTrustLevel(This,trustLevel) (This)->lpVtbl->GetTrustLevel(This,trustLevel)
#else
/*** IUnknown methods ***/
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CUI_CComposition_CICompositionSurface_QueryInterface(__x_ABI_CWindows_CUI_CComposition_CICompositionSurface* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG __x_ABI_CWindows_CUI_CComposition_CICompositionSurface_AddRef(__x_ABI_CWindows_CUI_CComposition_CICompositionSurface* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG __x_ABI_CWindows_CUI_CComposition_CICompositionSurface_Release(__x_ABI_CWindows_CUI_CComposition_CICompositionSurface* This) {
    return This->lpVtbl->Release(This);
}
/*** IInspectable methods ***/
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CUI_CComposition_CICompositionSurface_GetIids(__x_ABI_CWindows_CUI_CComposition_CICompositionSurface* This,ULONG *iidCount,IID **iids) {
    return This->lpVtbl->GetIids(This,iidCount,iids);
}
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CUI_CComposition_CICompositionSurface_GetRuntimeClassName(__x_ABI_CWindows_CUI_CComposition_CICompositionSurface* This,HSTRING *className) {
    return This->lpVtbl->GetRuntimeClassName(This,className);
}
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CUI_CComposition_CICompositionSurface_GetTrustLevel(__x_ABI_CWindows_CUI_CComposition_CICompositionSurface* This,TrustLevel *trustLevel) {
    return This->lpVtbl->GetTrustLevel(This,trustLevel);
}
#endif
#ifdef WIDL_using_Windows_UI_Composition
#define IID_ICompositionSurface IID___x_ABI_CWindows_CUI_CComposition_CICompositionSurface
#define ICompositionSurfaceVtbl __x_ABI_CWindows_CUI_CComposition_CICompositionSurfaceVtbl
#define ICompositionSurface __x_ABI_CWindows_CUI_CComposition_CICompositionSurface
#define ICompositionSurface_QueryInterface __x_ABI_CWindows_CUI_CComposition_CICompositionSurface_QueryInterface
#define ICompositionSurface_AddRef __x_ABI_CWindows_CUI_CComposition_CICompositionSurface_AddRef
#define ICompositionSurface_Release __x_ABI_CWindows_CUI_CComposition_CICompositionSurface_Release
#define ICompositionSurface_GetIids __x_ABI_CWindows_CUI_CComposition_CICompositionSurface_GetIids
#define ICompositionSurface_GetRuntimeClassName __x_ABI_CWindows_CUI_CComposition_CICompositionSurface_GetRuntimeClassName
#define ICompositionSurface_GetTrustLevel __x_ABI_CWindows_CUI_CComposition_CICompositionSurface_GetTrustLevel
#endif /* WIDL_using_Windows_UI_Composition */
#endif

#endif

#endif  /* ____x_ABI_CWindows_CUI_CComposition_CICompositionSurface_INTERFACE_DEFINED__ */
#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x20000 */

/*****************************************************************************
 * ICompositionSurfaceBrush interface
 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x20000
#ifndef ____x_ABI_CWindows_CUI_CComposition_CICompositionSurfaceBrush_INTERFACE_DEFINED__
#define ____x_ABI_CWindows_CUI_CComposition_CICompositionSurfaceBrush_INTERFACE_DEFINED__

DEFINE_GUID(IID___x_ABI_CWindows_CUI_CComposition_CICompositionSurfaceBrush, 0xad016d79, 0x1e4c, 0x4c0d, 0x9c,0x29, 0x83,0x33,0x8c,0x87,0xc1,0x62);
#if defined(__cplusplus) && !defined(CINTERFACE)
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace UI {
            namespace Composition {
                MIDL_INTERFACE("ad016d79-1e4c-4c0d-9c29-83338c87c162")
                ICompositionSurfaceBrush : public IInspectable
                {
                    virtual HRESULT STDMETHODCALLTYPE get_BitmapInterpolationMode(
                        enum CompositionBitmapInterpolationMode *value) = 0;

                    virtual HRESULT STDMETHODCALLTYPE put_BitmapInterpolationMode(
                        enum CompositionBitmapInterpolationMode value) = 0;

                    virtual HRESULT STDMETHODCALLTYPE get_HorizontalAlignmentRatio(
                        FLOAT *value) = 0;

                    virtual HRESULT STDMETHODCALLTYPE put_HorizontalAlignmentRatio(
                        FLOAT value) = 0;

                    virtual HRESULT STDMETHODCALLTYPE get_Stretch(
                        enum CompositionStretch *value) = 0;

                    virtual HRESULT STDMETHODCALLTYPE put_Stretch(
                        enum CompositionStretch value) = 0;

                    virtual HRESULT STDMETHODCALLTYPE get_Surface(
                        ABI::Windows::UI::Composition::ICompositionSurface **value) = 0;

                    virtual HRESULT STDMETHODCALLTYPE put_Surface(
                        ABI::Windows::UI::Composition::ICompositionSurface *value) = 0;

                    virtual HRESULT STDMETHODCALLTYPE get_VerticalAlignmentRatio(
                        FLOAT *value) = 0;

                    virtual HRESULT STDMETHODCALLTYPE put_VerticalAlignmentRatio(
                        FLOAT value) = 0;

                };
            }
        }
    }
}
extern "C" {
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(__x_ABI_CWindows_CUI_CComposition_CICompositionSurfaceBrush, 0xad016d79, 0x1e4c, 0x4c0d, 0x9c,0x29, 0x83,0x33,0x8c,0x87,0xc1,0x62)
#endif
#else
typedef struct __x_ABI_CWindows_CUI_CComposition_CICompositionSurfaceBrushVtbl {
    BEGIN_INTERFACE

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

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

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

    /*** IInspectable methods ***/
    HRESULT (STDMETHODCALLTYPE *GetIids)(
        __x_ABI_CWindows_CUI_CComposition_CICompositionSurfaceBrush *This,
        ULONG *iidCount,
        IID **iids);

    HRESULT (STDMETHODCALLTYPE *GetRuntimeClassName)(
        __x_ABI_CWindows_CUI_CComposition_CICompositionSurfaceBrush *This,
        HSTRING *className);

    HRESULT (STDMETHODCALLTYPE *GetTrustLevel)(
        __x_ABI_CWindows_CUI_CComposition_CICompositionSurfaceBrush *This,
        TrustLevel *trustLevel);

    /*** ICompositionSurfaceBrush methods ***/
    HRESULT (STDMETHODCALLTYPE *get_BitmapInterpolationMode)(
        __x_ABI_CWindows_CUI_CComposition_CICompositionSurfaceBrush *This,
        enum __x_ABI_CWindows_CUI_CComposition_CCompositionBitmapInterpolationMode *value);

    HRESULT (STDMETHODCALLTYPE *put_BitmapInterpolationMode)(
        __x_ABI_CWindows_CUI_CComposition_CICompositionSurfaceBrush *This,
        enum __x_ABI_CWindows_CUI_CComposition_CCompositionBitmapInterpolationMode value);

    HRESULT (STDMETHODCALLTYPE *get_HorizontalAlignmentRatio)(
        __x_ABI_CWindows_CUI_CComposition_CICompositionSurfaceBrush *This,
        FLOAT *value);

    HRESULT (STDMETHODCALLTYPE *put_HorizontalAlignmentRatio)(
        __x_ABI_CWindows_CUI_CComposition_CICompositionSurfaceBrush *This,
        FLOAT value);

    HRESULT (STDMETHODCALLTYPE *get_Stretch)(
        __x_ABI_CWindows_CUI_CComposition_CICompositionSurfaceBrush *This,
        enum __x_ABI_CWindows_CUI_CComposition_CCompositionStretch *value);

    HRESULT (STDMETHODCALLTYPE *put_Stretch)(
        __x_ABI_CWindows_CUI_CComposition_CICompositionSurfaceBrush *This,
        enum __x_ABI_CWindows_CUI_CComposition_CCompositionStretch value);

    HRESULT (STDMETHODCALLTYPE *get_Surface)(
        __x_ABI_CWindows_CUI_CComposition_CICompositionSurfaceBrush *This,
        __x_ABI_CWindows_CUI_CComposition_CICompositionSurface **value);

    HRESULT (STDMETHODCALLTYPE *put_Surface)(
        __x_ABI_CWindows_CUI_CComposition_CICompositionSurfaceBrush *This,
        __x_ABI_CWindows_CUI_CComposition_CICompositionSurface *value);

    HRESULT (STDMETHODCALLTYPE *get_VerticalAlignmentRatio)(
        __x_ABI_CWindows_CUI_CComposition_CICompositionSurfaceBrush *This,
        FLOAT *value);

    HRESULT (STDMETHODCALLTYPE *put_VerticalAlignmentRatio)(
        __x_ABI_CWindows_CUI_CComposition_CICompositionSurfaceBrush *This,
        FLOAT value);

    END_INTERFACE
} __x_ABI_CWindows_CUI_CComposition_CICompositionSurfaceBrushVtbl;

interface __x_ABI_CWindows_CUI_CComposition_CICompositionSurfaceBrush {
    CONST_VTBL __x_ABI_CWindows_CUI_CComposition_CICompositionSurfaceBrushVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define __x_ABI_CWindows_CUI_CComposition_CICompositionSurfaceBrush_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define __x_ABI_CWindows_CUI_CComposition_CICompositionSurfaceBrush_AddRef(This) (This)->lpVtbl->AddRef(This)
#define __x_ABI_CWindows_CUI_CComposition_CICompositionSurfaceBrush_Release(This) (This)->lpVtbl->Release(This)
/*** IInspectable methods ***/
#define __x_ABI_CWindows_CUI_CComposition_CICompositionSurfaceBrush_GetIids(This,iidCount,iids) (This)->lpVtbl->GetIids(This,iidCount,iids)
#define __x_ABI_CWindows_CUI_CComposition_CICompositionSurfaceBrush_GetRuntimeClassName(This,className) (This)->lpVtbl->GetRuntimeClassName(This,className)
#define __x_ABI_CWindows_CUI_CComposition_CICompositionSurfaceBrush_GetTrustLevel(This,trustLevel) (This)->lpVtbl->GetTrustLevel(This,trustLevel)
/*** ICompositionSurfaceBrush methods ***/
#define __x_ABI_CWindows_CUI_CComposition_CICompositionSurfaceBrush_get_BitmapInterpolationMode(This,value) (This)->lpVtbl->get_BitmapInterpolationMode(This,value)
#define __x_ABI_CWindows_CUI_CComposition_CICompositionSurfaceBrush_put_BitmapInterpolationMode(This,value) (This)->lpVtbl->put_BitmapInterpolationMode(This,value)
#define __x_ABI_CWindows_CUI_CComposition_CICompositionSurfaceBrush_get_HorizontalAlignmentRatio(This,value) (This)->lpVtbl->get_HorizontalAlignmentRatio(This,value)
#define __x_ABI_CWindows_CUI_CComposition_CICompositionSurfaceBrush_put_HorizontalAlignmentRatio(This,value) (This)->lpVtbl->put_HorizontalAlignmentRatio(This,value)
#define __x_ABI_CWindows_CUI_CComposition_CICompositionSurfaceBrush_get_Stretch(This,value) (This)->lpVtbl->get_Stretch(This,value)
#define __x_ABI_CWindows_CUI_CComposition_CICompositionSurfaceBrush_put_Stretch(This,value) (This)->lpVtbl->put_Stretch(This,value)
#define __x_ABI_CWindows_CUI_CComposition_CICompositionSurfaceBrush_get_Surface(This,value) (This)->lpVtbl->get_Surface(This,value)
#define __x_ABI_CWindows_CUI_CComposition_CICompositionSurfaceBrush_put_Surface(This,value) (This)->lpVtbl->put_Surface(This,value)
#define __x_ABI_CWindows_CUI_CComposition_CICompositionSurfaceBrush_get_VerticalAlignmentRatio(This,value) (This)->lpVtbl->get_VerticalAlignmentRatio(This,value)
#define __x_ABI_CWindows_CUI_CComposition_CICompositionSurfaceBrush_put_VerticalAlignmentRatio(This,value) (This)->lpVtbl->put_VerticalAlignmentRatio(This,value)
#else
/*** IUnknown methods ***/
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CUI_CComposition_CICompositionSurfaceBrush_QueryInterface(__x_ABI_CWindows_CUI_CComposition_CICompositionSurfaceBrush* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG __x_ABI_CWindows_CUI_CComposition_CICompositionSurfaceBrush_AddRef(__x_ABI_CWindows_CUI_CComposition_CICompositionSurfaceBrush* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG __x_ABI_CWindows_CUI_CComposition_CICompositionSurfaceBrush_Release(__x_ABI_CWindows_CUI_CComposition_CICompositionSurfaceBrush* This) {
    return This->lpVtbl->Release(This);
}
/*** IInspectable methods ***/
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CUI_CComposition_CICompositionSurfaceBrush_GetIids(__x_ABI_CWindows_CUI_CComposition_CICompositionSurfaceBrush* This,ULONG *iidCount,IID **iids) {
    return This->lpVtbl->GetIids(This,iidCount,iids);
}
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CUI_CComposition_CICompositionSurfaceBrush_GetRuntimeClassName(__x_ABI_CWindows_CUI_CComposition_CICompositionSurfaceBrush* This,HSTRING *className) {
    return This->lpVtbl->GetRuntimeClassName(This,className);
}
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CUI_CComposition_CICompositionSurfaceBrush_GetTrustLevel(__x_ABI_CWindows_CUI_CComposition_CICompositionSurfaceBrush* This,TrustLevel *trustLevel) {
    return This->lpVtbl->GetTrustLevel(This,trustLevel);
}
/*** ICompositionSurfaceBrush methods ***/
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CUI_CComposition_CICompositionSurfaceBrush_get_BitmapInterpolationMode(__x_ABI_CWindows_CUI_CComposition_CICompositionSurfaceBrush* This,enum __x_ABI_CWindows_CUI_CComposition_CCompositionBitmapInterpolationMode *value) {
    return This->lpVtbl->get_BitmapInterpolationMode(This,value);
}
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CUI_CComposition_CICompositionSurfaceBrush_put_BitmapInterpolationMode(__x_ABI_CWindows_CUI_CComposition_CICompositionSurfaceBrush* This,enum __x_ABI_CWindows_CUI_CComposition_CCompositionBitmapInterpolationMode value) {
    return This->lpVtbl->put_BitmapInterpolationMode(This,value);
}
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CUI_CComposition_CICompositionSurfaceBrush_get_HorizontalAlignmentRatio(__x_ABI_CWindows_CUI_CComposition_CICompositionSurfaceBrush* This,FLOAT *value) {
    return This->lpVtbl->get_HorizontalAlignmentRatio(This,value);
}
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CUI_CComposition_CICompositionSurfaceBrush_put_HorizontalAlignmentRatio(__x_ABI_CWindows_CUI_CComposition_CICompositionSurfaceBrush* This,FLOAT value) {
    return This->lpVtbl->put_HorizontalAlignmentRatio(This,value);
}
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CUI_CComposition_CICompositionSurfaceBrush_get_Stretch(__x_ABI_CWindows_CUI_CComposition_CICompositionSurfaceBrush* This,enum __x_ABI_CWindows_CUI_CComposition_CCompositionStretch *value) {
    return This->lpVtbl->get_Stretch(This,value);
}
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CUI_CComposition_CICompositionSurfaceBrush_put_Stretch(__x_ABI_CWindows_CUI_CComposition_CICompositionSurfaceBrush* This,enum __x_ABI_CWindows_CUI_CComposition_CCompositionStretch value) {
    return This->lpVtbl->put_Stretch(This,value);
}
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CUI_CComposition_CICompositionSurfaceBrush_get_Surface(__x_ABI_CWindows_CUI_CComposition_CICompositionSurfaceBrush* This,__x_ABI_CWindows_CUI_CComposition_CICompositionSurface **value) {
    return This->lpVtbl->get_Surface(This,value);
}
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CUI_CComposition_CICompositionSurfaceBrush_put_Surface(__x_ABI_CWindows_CUI_CComposition_CICompositionSurfaceBrush* This,__x_ABI_CWindows_CUI_CComposition_CICompositionSurface *value) {
    return This->lpVtbl->put_Surface(This,value);
}
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CUI_CComposition_CICompositionSurfaceBrush_get_VerticalAlignmentRatio(__x_ABI_CWindows_CUI_CComposition_CICompositionSurfaceBrush* This,FLOAT *value) {
    return This->lpVtbl->get_VerticalAlignmentRatio(This,value);
}
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CUI_CComposition_CICompositionSurfaceBrush_put_VerticalAlignmentRatio(__x_ABI_CWindows_CUI_CComposition_CICompositionSurfaceBrush* This,FLOAT value) {
    return This->lpVtbl->put_VerticalAlignmentRatio(This,value);
}
#endif
#ifdef WIDL_using_Windows_UI_Composition
#define IID_ICompositionSurfaceBrush IID___x_ABI_CWindows_CUI_CComposition_CICompositionSurfaceBrush
#define ICompositionSurfaceBrushVtbl __x_ABI_CWindows_CUI_CComposition_CICompositionSurfaceBrushVtbl
#define ICompositionSurfaceBrush __x_ABI_CWindows_CUI_CComposition_CICompositionSurfaceBrush
#define ICompositionSurfaceBrush_QueryInterface __x_ABI_CWindows_CUI_CComposition_CICompositionSurfaceBrush_QueryInterface
#define ICompositionSurfaceBrush_AddRef __x_ABI_CWindows_CUI_CComposition_CICompositionSurfaceBrush_AddRef
#define ICompositionSurfaceBrush_Release __x_ABI_CWindows_CUI_CComposition_CICompositionSurfaceBrush_Release
#define ICompositionSurfaceBrush_GetIids __x_ABI_CWindows_CUI_CComposition_CICompositionSurfaceBrush_GetIids
#define ICompositionSurfaceBrush_GetRuntimeClassName __x_ABI_CWindows_CUI_CComposition_CICompositionSurfaceBrush_GetRuntimeClassName
#define ICompositionSurfaceBrush_GetTrustLevel __x_ABI_CWindows_CUI_CComposition_CICompositionSurfaceBrush_GetTrustLevel
#define ICompositionSurfaceBrush_get_BitmapInterpolationMode __x_ABI_CWindows_CUI_CComposition_CICompositionSurfaceBrush_get_BitmapInterpolationMode
#define ICompositionSurfaceBrush_put_BitmapInterpolationMode __x_ABI_CWindows_CUI_CComposition_CICompositionSurfaceBrush_put_BitmapInterpolationMode
#define ICompositionSurfaceBrush_get_HorizontalAlignmentRatio __x_ABI_CWindows_CUI_CComposition_CICompositionSurfaceBrush_get_HorizontalAlignmentRatio
#define ICompositionSurfaceBrush_put_HorizontalAlignmentRatio __x_ABI_CWindows_CUI_CComposition_CICompositionSurfaceBrush_put_HorizontalAlignmentRatio
#define ICompositionSurfaceBrush_get_Stretch __x_ABI_CWindows_CUI_CComposition_CICompositionSurfaceBrush_get_Stretch
#define ICompositionSurfaceBrush_put_Stretch __x_ABI_CWindows_CUI_CComposition_CICompositionSurfaceBrush_put_Stretch
#define ICompositionSurfaceBrush_get_Surface __x_ABI_CWindows_CUI_CComposition_CICompositionSurfaceBrush_get_Surface
#define ICompositionSurfaceBrush_put_Surface __x_ABI_CWindows_CUI_CComposition_CICompositionSurfaceBrush_put_Surface
#define ICompositionSurfaceBrush_get_VerticalAlignmentRatio __x_ABI_CWindows_CUI_CComposition_CICompositionSurfaceBrush_get_VerticalAlignmentRatio
#define ICompositionSurfaceBrush_put_VerticalAlignmentRatio __x_ABI_CWindows_CUI_CComposition_CICompositionSurfaceBrush_put_VerticalAlignmentRatio
#endif /* WIDL_using_Windows_UI_Composition */
#endif

#endif

#endif  /* ____x_ABI_CWindows_CUI_CComposition_CICompositionSurfaceBrush_INTERFACE_DEFINED__ */
#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x20000 */

/*****************************************************************************
 * ICompositionTarget interface
 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x20000
#ifndef ____x_ABI_CWindows_CUI_CComposition_CICompositionTarget_INTERFACE_DEFINED__
#define ____x_ABI_CWindows_CUI_CComposition_CICompositionTarget_INTERFACE_DEFINED__

DEFINE_GUID(IID___x_ABI_CWindows_CUI_CComposition_CICompositionTarget, 0xa1bea8ba, 0xd726, 0x4663, 0x81,0x29, 0x6b,0x5e,0x79,0x27,0xff,0xa6);
#if defined(__cplusplus) && !defined(CINTERFACE)
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace UI {
            namespace Composition {
                MIDL_INTERFACE("a1bea8ba-d726-4663-8129-6b5e7927ffa6")
                ICompositionTarget : public IInspectable
                {
                    virtual HRESULT STDMETHODCALLTYPE get_Root(
                        ABI::Windows::UI::Composition::IVisual **value) = 0;

                    virtual HRESULT STDMETHODCALLTYPE put_Root(
                        ABI::Windows::UI::Composition::IVisual *value) = 0;

                };
            }
        }
    }
}
extern "C" {
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(__x_ABI_CWindows_CUI_CComposition_CICompositionTarget, 0xa1bea8ba, 0xd726, 0x4663, 0x81,0x29, 0x6b,0x5e,0x79,0x27,0xff,0xa6)
#endif
#else
typedef struct __x_ABI_CWindows_CUI_CComposition_CICompositionTargetVtbl {
    BEGIN_INTERFACE

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

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

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

    /*** IInspectable methods ***/
    HRESULT (STDMETHODCALLTYPE *GetIids)(
        __x_ABI_CWindows_CUI_CComposition_CICompositionTarget *This,
        ULONG *iidCount,
        IID **iids);

    HRESULT (STDMETHODCALLTYPE *GetRuntimeClassName)(
        __x_ABI_CWindows_CUI_CComposition_CICompositionTarget *This,
        HSTRING *className);

    HRESULT (STDMETHODCALLTYPE *GetTrustLevel)(
        __x_ABI_CWindows_CUI_CComposition_CICompositionTarget *This,
        TrustLevel *trustLevel);

    /*** ICompositionTarget methods ***/
    HRESULT (STDMETHODCALLTYPE *get_Root)(
        __x_ABI_CWindows_CUI_CComposition_CICompositionTarget *This,
        __x_ABI_CWindows_CUI_CComposition_CIVisual **value);

    HRESULT (STDMETHODCALLTYPE *put_Root)(
        __x_ABI_CWindows_CUI_CComposition_CICompositionTarget *This,
        __x_ABI_CWindows_CUI_CComposition_CIVisual *value);

    END_INTERFACE
} __x_ABI_CWindows_CUI_CComposition_CICompositionTargetVtbl;

interface __x_ABI_CWindows_CUI_CComposition_CICompositionTarget {
    CONST_VTBL __x_ABI_CWindows_CUI_CComposition_CICompositionTargetVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define __x_ABI_CWindows_CUI_CComposition_CICompositionTarget_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define __x_ABI_CWindows_CUI_CComposition_CICompositionTarget_AddRef(This) (This)->lpVtbl->AddRef(This)
#define __x_ABI_CWindows_CUI_CComposition_CICompositionTarget_Release(This) (This)->lpVtbl->Release(This)
/*** IInspectable methods ***/
#define __x_ABI_CWindows_CUI_CComposition_CICompositionTarget_GetIids(This,iidCount,iids) (This)->lpVtbl->GetIids(This,iidCount,iids)
#define __x_ABI_CWindows_CUI_CComposition_CICompositionTarget_GetRuntimeClassName(This,className) (This)->lpVtbl->GetRuntimeClassName(This,className)
#define __x_ABI_CWindows_CUI_CComposition_CICompositionTarget_GetTrustLevel(This,trustLevel) (This)->lpVtbl->GetTrustLevel(This,trustLevel)
/*** ICompositionTarget methods ***/
#define __x_ABI_CWindows_CUI_CComposition_CICompositionTarget_get_Root(This,value) (This)->lpVtbl->get_Root(This,value)
#define __x_ABI_CWindows_CUI_CComposition_CICompositionTarget_put_Root(This,value) (This)->lpVtbl->put_Root(This,value)
#else
/*** IUnknown methods ***/
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CUI_CComposition_CICompositionTarget_QueryInterface(__x_ABI_CWindows_CUI_CComposition_CICompositionTarget* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG __x_ABI_CWindows_CUI_CComposition_CICompositionTarget_AddRef(__x_ABI_CWindows_CUI_CComposition_CICompositionTarget* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG __x_ABI_CWindows_CUI_CComposition_CICompositionTarget_Release(__x_ABI_CWindows_CUI_CComposition_CICompositionTarget* This) {
    return This->lpVtbl->Release(This);
}
/*** IInspectable methods ***/
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CUI_CComposition_CICompositionTarget_GetIids(__x_ABI_CWindows_CUI_CComposition_CICompositionTarget* This,ULONG *iidCount,IID **iids) {
    return This->lpVtbl->GetIids(This,iidCount,iids);
}
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CUI_CComposition_CICompositionTarget_GetRuntimeClassName(__x_ABI_CWindows_CUI_CComposition_CICompositionTarget* This,HSTRING *className) {
    return This->lpVtbl->GetRuntimeClassName(This,className);
}
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CUI_CComposition_CICompositionTarget_GetTrustLevel(__x_ABI_CWindows_CUI_CComposition_CICompositionTarget* This,TrustLevel *trustLevel) {
    return This->lpVtbl->GetTrustLevel(This,trustLevel);
}
/*** ICompositionTarget methods ***/
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CUI_CComposition_CICompositionTarget_get_Root(__x_ABI_CWindows_CUI_CComposition_CICompositionTarget* This,__x_ABI_CWindows_CUI_CComposition_CIVisual **value) {
    return This->lpVtbl->get_Root(This,value);
}
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CUI_CComposition_CICompositionTarget_put_Root(__x_ABI_CWindows_CUI_CComposition_CICompositionTarget* This,__x_ABI_CWindows_CUI_CComposition_CIVisual *value) {
    return This->lpVtbl->put_Root(This,value);
}
#endif
#ifdef WIDL_using_Windows_UI_Composition
#define IID_ICompositionTarget IID___x_ABI_CWindows_CUI_CComposition_CICompositionTarget
#define ICompositionTargetVtbl __x_ABI_CWindows_CUI_CComposition_CICompositionTargetVtbl
#define ICompositionTarget __x_ABI_CWindows_CUI_CComposition_CICompositionTarget
#define ICompositionTarget_QueryInterface __x_ABI_CWindows_CUI_CComposition_CICompositionTarget_QueryInterface
#define ICompositionTarget_AddRef __x_ABI_CWindows_CUI_CComposition_CICompositionTarget_AddRef
#define ICompositionTarget_Release __x_ABI_CWindows_CUI_CComposition_CICompositionTarget_Release
#define ICompositionTarget_GetIids __x_ABI_CWindows_CUI_CComposition_CICompositionTarget_GetIids
#define ICompositionTarget_GetRuntimeClassName __x_ABI_CWindows_CUI_CComposition_CICompositionTarget_GetRuntimeClassName
#define ICompositionTarget_GetTrustLevel __x_ABI_CWindows_CUI_CComposition_CICompositionTarget_GetTrustLevel
#define ICompositionTarget_get_Root __x_ABI_CWindows_CUI_CComposition_CICompositionTarget_get_Root
#define ICompositionTarget_put_Root __x_ABI_CWindows_CUI_CComposition_CICompositionTarget_put_Root
#endif /* WIDL_using_Windows_UI_Composition */
#endif

#endif

#endif  /* ____x_ABI_CWindows_CUI_CComposition_CICompositionTarget_INTERFACE_DEFINED__ */
#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x20000 */

/*****************************************************************************
 * ICompositionTargetFactory interface
 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x50000
#ifndef ____x_ABI_CWindows_CUI_CComposition_CICompositionTargetFactory_INTERFACE_DEFINED__
#define ____x_ABI_CWindows_CUI_CComposition_CICompositionTargetFactory_INTERFACE_DEFINED__

DEFINE_GUID(IID___x_ABI_CWindows_CUI_CComposition_CICompositionTargetFactory, 0x93cd9d2b, 0x8516, 0x4b14, 0xa8,0xce, 0xf4,0x9e,0x21,0x19,0xec,0x42);
#if defined(__cplusplus) && !defined(CINTERFACE)
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace UI {
            namespace Composition {
                MIDL_INTERFACE("93cd9d2b-8516-4b14-a8ce-f49e2119ec42")
                ICompositionTargetFactory : public IInspectable
                {
                };
            }
        }
    }
}
extern "C" {
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(__x_ABI_CWindows_CUI_CComposition_CICompositionTargetFactory, 0x93cd9d2b, 0x8516, 0x4b14, 0xa8,0xce, 0xf4,0x9e,0x21,0x19,0xec,0x42)
#endif
#else
typedef struct __x_ABI_CWindows_CUI_CComposition_CICompositionTargetFactoryVtbl {
    BEGIN_INTERFACE

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

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

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

    /*** IInspectable methods ***/
    HRESULT (STDMETHODCALLTYPE *GetIids)(
        __x_ABI_CWindows_CUI_CComposition_CICompositionTargetFactory *This,
        ULONG *iidCount,
        IID **iids);

    HRESULT (STDMETHODCALLTYPE *GetRuntimeClassName)(
        __x_ABI_CWindows_CUI_CComposition_CICompositionTargetFactory *This,
        HSTRING *className);

    HRESULT (STDMETHODCALLTYPE *GetTrustLevel)(
        __x_ABI_CWindows_CUI_CComposition_CICompositionTargetFactory *This,
        TrustLevel *trustLevel);

    END_INTERFACE
} __x_ABI_CWindows_CUI_CComposition_CICompositionTargetFactoryVtbl;

interface __x_ABI_CWindows_CUI_CComposition_CICompositionTargetFactory {
    CONST_VTBL __x_ABI_CWindows_CUI_CComposition_CICompositionTargetFactoryVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define __x_ABI_CWindows_CUI_CComposition_CICompositionTargetFactory_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define __x_ABI_CWindows_CUI_CComposition_CICompositionTargetFactory_AddRef(This) (This)->lpVtbl->AddRef(This)
#define __x_ABI_CWindows_CUI_CComposition_CICompositionTargetFactory_Release(This) (This)->lpVtbl->Release(This)
/*** IInspectable methods ***/
#define __x_ABI_CWindows_CUI_CComposition_CICompositionTargetFactory_GetIids(This,iidCount,iids) (This)->lpVtbl->GetIids(This,iidCount,iids)
#define __x_ABI_CWindows_CUI_CComposition_CICompositionTargetFactory_GetRuntimeClassName(This,className) (This)->lpVtbl->GetRuntimeClassName(This,className)
#define __x_ABI_CWindows_CUI_CComposition_CICompositionTargetFactory_GetTrustLevel(This,trustLevel) (This)->lpVtbl->GetTrustLevel(This,trustLevel)
#else
/*** IUnknown methods ***/
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CUI_CComposition_CICompositionTargetFactory_QueryInterface(__x_ABI_CWindows_CUI_CComposition_CICompositionTargetFactory* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG __x_ABI_CWindows_CUI_CComposition_CICompositionTargetFactory_AddRef(__x_ABI_CWindows_CUI_CComposition_CICompositionTargetFactory* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG __x_ABI_CWindows_CUI_CComposition_CICompositionTargetFactory_Release(__x_ABI_CWindows_CUI_CComposition_CICompositionTargetFactory* This) {
    return This->lpVtbl->Release(This);
}
/*** IInspectable methods ***/
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CUI_CComposition_CICompositionTargetFactory_GetIids(__x_ABI_CWindows_CUI_CComposition_CICompositionTargetFactory* This,ULONG *iidCount,IID **iids) {
    return This->lpVtbl->GetIids(This,iidCount,iids);
}
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CUI_CComposition_CICompositionTargetFactory_GetRuntimeClassName(__x_ABI_CWindows_CUI_CComposition_CICompositionTargetFactory* This,HSTRING *className) {
    return This->lpVtbl->GetRuntimeClassName(This,className);
}
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CUI_CComposition_CICompositionTargetFactory_GetTrustLevel(__x_ABI_CWindows_CUI_CComposition_CICompositionTargetFactory* This,TrustLevel *trustLevel) {
    return This->lpVtbl->GetTrustLevel(This,trustLevel);
}
#endif
#ifdef WIDL_using_Windows_UI_Composition
#define IID_ICompositionTargetFactory IID___x_ABI_CWindows_CUI_CComposition_CICompositionTargetFactory
#define ICompositionTargetFactoryVtbl __x_ABI_CWindows_CUI_CComposition_CICompositionTargetFactoryVtbl
#define ICompositionTargetFactory __x_ABI_CWindows_CUI_CComposition_CICompositionTargetFactory
#define ICompositionTargetFactory_QueryInterface __x_ABI_CWindows_CUI_CComposition_CICompositionTargetFactory_QueryInterface
#define ICompositionTargetFactory_AddRef __x_ABI_CWindows_CUI_CComposition_CICompositionTargetFactory_AddRef
#define ICompositionTargetFactory_Release __x_ABI_CWindows_CUI_CComposition_CICompositionTargetFactory_Release
#define ICompositionTargetFactory_GetIids __x_ABI_CWindows_CUI_CComposition_CICompositionTargetFactory_GetIids
#define ICompositionTargetFactory_GetRuntimeClassName __x_ABI_CWindows_CUI_CComposition_CICompositionTargetFactory_GetRuntimeClassName
#define ICompositionTargetFactory_GetTrustLevel __x_ABI_CWindows_CUI_CComposition_CICompositionTargetFactory_GetTrustLevel
#endif /* WIDL_using_Windows_UI_Composition */
#endif

#endif

#endif  /* ____x_ABI_CWindows_CUI_CComposition_CICompositionTargetFactory_INTERFACE_DEFINED__ */
#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x50000 */

/*****************************************************************************
 * ICompositor interface
 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x20000
#ifndef ____x_ABI_CWindows_CUI_CComposition_CICompositor_INTERFACE_DEFINED__
#define ____x_ABI_CWindows_CUI_CComposition_CICompositor_INTERFACE_DEFINED__

DEFINE_GUID(IID___x_ABI_CWindows_CUI_CComposition_CICompositor, 0xb403ca50, 0x7f8c, 0x4e83, 0x98,0x5f, 0xcc,0x45,0x06,0x00,0x36,0xd8);
#if defined(__cplusplus) && !defined(CINTERFACE)
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace UI {
            namespace Composition {
                MIDL_INTERFACE("b403ca50-7f8c-4e83-985f-cc45060036d8")
                ICompositor : public IInspectable
                {
                    virtual HRESULT STDMETHODCALLTYPE CreateColorKeyFrameAnimation(
                        ABI::Windows::UI::Composition::IColorKeyFrameAnimation **result) = 0;

                    virtual HRESULT STDMETHODCALLTYPE CreateColorBrush(
                        ABI::Windows::UI::Composition::ICompositionColorBrush **result) = 0;

                    virtual HRESULT STDMETHODCALLTYPE CreateColorBrushWithColor(
                        struct Color color,
                        ABI::Windows::UI::Composition::ICompositionColorBrush **result) = 0;

                    virtual HRESULT STDMETHODCALLTYPE CreateContainerVisual(
                        ABI::Windows::UI::Composition::IContainerVisual **result) = 0;

                    virtual HRESULT STDMETHODCALLTYPE CreateCubicBezierEasingFunction(
                        struct Vector2 point1,
                        struct Vector2 point2,
                        ABI::Windows::UI::Composition::ICubicBezierEasingFunction **result) = 0;

                    virtual HRESULT STDMETHODCALLTYPE CreateEffectFactory(
                        ABI::Windows::Graphics::Effects::IGraphicsEffect *effect,
                        ABI::Windows::UI::Composition::ICompositionEffectFactory **result) = 0;

                    virtual HRESULT STDMETHODCALLTYPE CreateEffectFactoryWithProperties(
                        ABI::Windows::Graphics::Effects::IGraphicsEffect *effect,
                        ABI::Windows::Foundation::Collections::IIterable<HSTRING > *animatable,
                        ABI::Windows::UI::Composition::ICompositionEffectFactory **result) = 0;

                    virtual HRESULT STDMETHODCALLTYPE CreateExpressionAnimation(
                        ABI::Windows::UI::Composition::IExpressionAnimation **result) = 0;

                    virtual HRESULT STDMETHODCALLTYPE CreateExpressionAnimationWithExpression(
                        HSTRING expression,
                        ABI::Windows::UI::Composition::IExpressionAnimation **result) = 0;

                    virtual HRESULT STDMETHODCALLTYPE CreateInsetClip(
                        ABI::Windows::UI::Composition::IInsetClip **result) = 0;

                    virtual HRESULT STDMETHODCALLTYPE CreateInsetClipWithInsets(
                        FLOAT left,
                        FLOAT top,
                        FLOAT right,
                        FLOAT bottom,
                        ABI::Windows::UI::Composition::IInsetClip **result) = 0;

                    virtual HRESULT STDMETHODCALLTYPE CreateLinearEasingFunction(
                        ABI::Windows::UI::Composition::ILinearEasingFunction **result) = 0;

                    virtual HRESULT STDMETHODCALLTYPE CreatePropertySet(
                        ABI::Windows::UI::Composition::ICompositionPropertySet **result) = 0;

                    virtual HRESULT STDMETHODCALLTYPE CreateQuaternionKeyFrameAnimation(
                        ABI::Windows::UI::Composition::IQuaternionKeyFrameAnimation **result) = 0;

                    virtual HRESULT STDMETHODCALLTYPE CreateScalarKeyFrameAnimation(
                        ABI::Windows::UI::Composition::IScalarKeyFrameAnimation **result) = 0;

                    virtual HRESULT STDMETHODCALLTYPE CreateScopedBatch(
                        enum CompositionBatchTypes type,
                        ABI::Windows::UI::Composition::ICompositionScopedBatch **result) = 0;

                    virtual HRESULT STDMETHODCALLTYPE CreateSpriteVisual(
                        ABI::Windows::UI::Composition::ISpriteVisual **result) = 0;

                    virtual HRESULT STDMETHODCALLTYPE CreateSurfaceBrush(
                        ABI::Windows::UI::Composition::ICompositionSurfaceBrush **result) = 0;

                    virtual HRESULT STDMETHODCALLTYPE CreateSurfaceBrushWithSurface(
                        ABI::Windows::UI::Composition::ICompositionSurface *surface,
                        ABI::Windows::UI::Composition::ICompositionSurfaceBrush **result) = 0;

                    virtual HRESULT STDMETHODCALLTYPE CreateTargetForCurrentView(
                        ABI::Windows::UI::Composition::ICompositionTarget **result) = 0;

                    virtual HRESULT STDMETHODCALLTYPE CreateVector2KeyFrameAnimation(
                        ABI::Windows::UI::Composition::IVector2KeyFrameAnimation **result) = 0;

                    virtual HRESULT STDMETHODCALLTYPE CreateVector3KeyFrameAnimation(
                        ABI::Windows::UI::Composition::IVector3KeyFrameAnimation **result) = 0;

                    virtual HRESULT STDMETHODCALLTYPE CreateVector4KeyFrameAnimation(
                        ABI::Windows::UI::Composition::IVector4KeyFrameAnimation **result) = 0;

                    virtual HRESULT STDMETHODCALLTYPE GetCommitBatch(
                        enum CompositionBatchTypes type,
                        ABI::Windows::UI::Composition::ICompositionCommitBatch **result) = 0;

                };
            }
        }
    }
}
extern "C" {
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(__x_ABI_CWindows_CUI_CComposition_CICompositor, 0xb403ca50, 0x7f8c, 0x4e83, 0x98,0x5f, 0xcc,0x45,0x06,0x00,0x36,0xd8)
#endif
#else
typedef struct __x_ABI_CWindows_CUI_CComposition_CICompositorVtbl {
    BEGIN_INTERFACE

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

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

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

    /*** IInspectable methods ***/
    HRESULT (STDMETHODCALLTYPE *GetIids)(
        __x_ABI_CWindows_CUI_CComposition_CICompositor *This,
        ULONG *iidCount,
        IID **iids);

    HRESULT (STDMETHODCALLTYPE *GetRuntimeClassName)(
        __x_ABI_CWindows_CUI_CComposition_CICompositor *This,
        HSTRING *className);

    HRESULT (STDMETHODCALLTYPE *GetTrustLevel)(
        __x_ABI_CWindows_CUI_CComposition_CICompositor *This,
        TrustLevel *trustLevel);

    /*** ICompositor methods ***/
    HRESULT (STDMETHODCALLTYPE *CreateColorKeyFrameAnimation)(
        __x_ABI_CWindows_CUI_CComposition_CICompositor *This,
        __x_ABI_CWindows_CUI_CComposition_CIColorKeyFrameAnimation **result);

    HRESULT (STDMETHODCALLTYPE *CreateColorBrush)(
        __x_ABI_CWindows_CUI_CComposition_CICompositor *This,
        __x_ABI_CWindows_CUI_CComposition_CICompositionColorBrush **result);

    HRESULT (STDMETHODCALLTYPE *CreateColorBrushWithColor)(
        __x_ABI_CWindows_CUI_CComposition_CICompositor *This,
        struct __x_ABI_CWindows_CUI_CColor color,
        __x_ABI_CWindows_CUI_CComposition_CICompositionColorBrush **result);

    HRESULT (STDMETHODCALLTYPE *CreateContainerVisual)(
        __x_ABI_CWindows_CUI_CComposition_CICompositor *This,
        __x_ABI_CWindows_CUI_CComposition_CIContainerVisual **result);

    HRESULT (STDMETHODCALLTYPE *CreateCubicBezierEasingFunction)(
        __x_ABI_CWindows_CUI_CComposition_CICompositor *This,
        struct __x_ABI_CWindows_CFoundation_CNumerics_CVector2 point1,
        struct __x_ABI_CWindows_CFoundation_CNumerics_CVector2 point2,
        __x_ABI_CWindows_CUI_CComposition_CICubicBezierEasingFunction **result);

    HRESULT (STDMETHODCALLTYPE *CreateEffectFactory)(
        __x_ABI_CWindows_CUI_CComposition_CICompositor *This,
        __x_ABI_CWindows_CGraphics_CEffects_CIGraphicsEffect *effect,
        __x_ABI_CWindows_CUI_CComposition_CICompositionEffectFactory **result);

    HRESULT (STDMETHODCALLTYPE *CreateEffectFactoryWithProperties)(
        __x_ABI_CWindows_CUI_CComposition_CICompositor *This,
        __x_ABI_CWindows_CGraphics_CEffects_CIGraphicsEffect *effect,
        __FIIterable_1_HSTRING *animatable,
        __x_ABI_CWindows_CUI_CComposition_CICompositionEffectFactory **result);

    HRESULT (STDMETHODCALLTYPE *CreateExpressionAnimation)(
        __x_ABI_CWindows_CUI_CComposition_CICompositor *This,
        __x_ABI_CWindows_CUI_CComposition_CIExpressionAnimation **result);

    HRESULT (STDMETHODCALLTYPE *CreateExpressionAnimationWithExpression)(
        __x_ABI_CWindows_CUI_CComposition_CICompositor *This,
        HSTRING expression,
        __x_ABI_CWindows_CUI_CComposition_CIExpressionAnimation **result);

    HRESULT (STDMETHODCALLTYPE *CreateInsetClip)(
        __x_ABI_CWindows_CUI_CComposition_CICompositor *This,
        __x_ABI_CWindows_CUI_CComposition_CIInsetClip **result);

    HRESULT (STDMETHODCALLTYPE *CreateInsetClipWithInsets)(
        __x_ABI_CWindows_CUI_CComposition_CICompositor *This,
        FLOAT left,
        FLOAT top,
        FLOAT right,
        FLOAT bottom,
        __x_ABI_CWindows_CUI_CComposition_CIInsetClip **result);

    HRESULT (STDMETHODCALLTYPE *CreateLinearEasingFunction)(
        __x_ABI_CWindows_CUI_CComposition_CICompositor *This,
        __x_ABI_CWindows_CUI_CComposition_CILinearEasingFunction **result);

    HRESULT (STDMETHODCALLTYPE *CreatePropertySet)(
        __x_ABI_CWindows_CUI_CComposition_CICompositor *This,
        __x_ABI_CWindows_CUI_CComposition_CICompositionPropertySet **result);

    HRESULT (STDMETHODCALLTYPE *CreateQuaternionKeyFrameAnimation)(
        __x_ABI_CWindows_CUI_CComposition_CICompositor *This,
        __x_ABI_CWindows_CUI_CComposition_CIQuaternionKeyFrameAnimation **result);

    HRESULT (STDMETHODCALLTYPE *CreateScalarKeyFrameAnimation)(
        __x_ABI_CWindows_CUI_CComposition_CICompositor *This,
        __x_ABI_CWindows_CUI_CComposition_CIScalarKeyFrameAnimation **result);

    HRESULT (STDMETHODCALLTYPE *CreateScopedBatch)(
        __x_ABI_CWindows_CUI_CComposition_CICompositor *This,
        enum __x_ABI_CWindows_CUI_CComposition_CCompositionBatchTypes type,
        __x_ABI_CWindows_CUI_CComposition_CICompositionScopedBatch **result);

    HRESULT (STDMETHODCALLTYPE *CreateSpriteVisual)(
        __x_ABI_CWindows_CUI_CComposition_CICompositor *This,
        __x_ABI_CWindows_CUI_CComposition_CISpriteVisual **result);

    HRESULT (STDMETHODCALLTYPE *CreateSurfaceBrush)(
        __x_ABI_CWindows_CUI_CComposition_CICompositor *This,
        __x_ABI_CWindows_CUI_CComposition_CICompositionSurfaceBrush **result);

    HRESULT (STDMETHODCALLTYPE *CreateSurfaceBrushWithSurface)(
        __x_ABI_CWindows_CUI_CComposition_CICompositor *This,
        __x_ABI_CWindows_CUI_CComposition_CICompositionSurface *surface,
        __x_ABI_CWindows_CUI_CComposition_CICompositionSurfaceBrush **result);

    HRESULT (STDMETHODCALLTYPE *CreateTargetForCurrentView)(
        __x_ABI_CWindows_CUI_CComposition_CICompositor *This,
        __x_ABI_CWindows_CUI_CComposition_CICompositionTarget **result);

    HRESULT (STDMETHODCALLTYPE *CreateVector2KeyFrameAnimation)(
        __x_ABI_CWindows_CUI_CComposition_CICompositor *This,
        __x_ABI_CWindows_CUI_CComposition_CIVector2KeyFrameAnimation **result);

    HRESULT (STDMETHODCALLTYPE *CreateVector3KeyFrameAnimation)(
        __x_ABI_CWindows_CUI_CComposition_CICompositor *This,
        __x_ABI_CWindows_CUI_CComposition_CIVector3KeyFrameAnimation **result);

    HRESULT (STDMETHODCALLTYPE *CreateVector4KeyFrameAnimation)(
        __x_ABI_CWindows_CUI_CComposition_CICompositor *This,
        __x_ABI_CWindows_CUI_CComposition_CIVector4KeyFrameAnimation **result);

    HRESULT (STDMETHODCALLTYPE *GetCommitBatch)(
        __x_ABI_CWindows_CUI_CComposition_CICompositor *This,
        enum __x_ABI_CWindows_CUI_CComposition_CCompositionBatchTypes type,
        __x_ABI_CWindows_CUI_CComposition_CICompositionCommitBatch **result);

    END_INTERFACE
} __x_ABI_CWindows_CUI_CComposition_CICompositorVtbl;

interface __x_ABI_CWindows_CUI_CComposition_CICompositor {
    CONST_VTBL __x_ABI_CWindows_CUI_CComposition_CICompositorVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define __x_ABI_CWindows_CUI_CComposition_CICompositor_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define __x_ABI_CWindows_CUI_CComposition_CICompositor_AddRef(This) (This)->lpVtbl->AddRef(This)
#define __x_ABI_CWindows_CUI_CComposition_CICompositor_Release(This) (This)->lpVtbl->Release(This)
/*** IInspectable methods ***/
#define __x_ABI_CWindows_CUI_CComposition_CICompositor_GetIids(This,iidCount,iids) (This)->lpVtbl->GetIids(This,iidCount,iids)
#define __x_ABI_CWindows_CUI_CComposition_CICompositor_GetRuntimeClassName(This,className) (This)->lpVtbl->GetRuntimeClassName(This,className)
#define __x_ABI_CWindows_CUI_CComposition_CICompositor_GetTrustLevel(This,trustLevel) (This)->lpVtbl->GetTrustLevel(This,trustLevel)
/*** ICompositor methods ***/
#define __x_ABI_CWindows_CUI_CComposition_CICompositor_CreateColorKeyFrameAnimation(This,result) (This)->lpVtbl->CreateColorKeyFrameAnimation(This,result)
#define __x_ABI_CWindows_CUI_CComposition_CICompositor_CreateColorBrush(This,result) (This)->lpVtbl->CreateColorBrush(This,result)
#define __x_ABI_CWindows_CUI_CComposition_CICompositor_CreateColorBrushWithColor(This,color,result) (This)->lpVtbl->CreateColorBrushWithColor(This,color,result)
#define __x_ABI_CWindows_CUI_CComposition_CICompositor_CreateContainerVisual(This,result) (This)->lpVtbl->CreateContainerVisual(This,result)
#define __x_ABI_CWindows_CUI_CComposition_CICompositor_CreateCubicBezierEasingFunction(This,point1,point2,result) (This)->lpVtbl->CreateCubicBezierEasingFunction(This,point1,point2,result)
#define __x_ABI_CWindows_CUI_CComposition_CICompositor_CreateEffectFactory(This,effect,result) (This)->lpVtbl->CreateEffectFactory(This,effect,result)
#define __x_ABI_CWindows_CUI_CComposition_CICompositor_CreateEffectFactoryWithProperties(This,effect,animatable,result) (This)->lpVtbl->CreateEffectFactoryWithProperties(This,effect,animatable,result)
#define __x_ABI_CWindows_CUI_CComposition_CICompositor_CreateExpressionAnimation(This,result) (This)->lpVtbl->CreateExpressionAnimation(This,result)
#define __x_ABI_CWindows_CUI_CComposition_CICompositor_CreateExpressionAnimationWithExpression(This,expression,result) (This)->lpVtbl->CreateExpressionAnimationWithExpression(This,expression,result)
#define __x_ABI_CWindows_CUI_CComposition_CICompositor_CreateInsetClip(This,result) (This)->lpVtbl->CreateInsetClip(This,result)
#define __x_ABI_CWindows_CUI_CComposition_CICompositor_CreateInsetClipWithInsets(This,left,top,right,bottom,result) (This)->lpVtbl->CreateInsetClipWithInsets(This,left,top,right,bottom,result)
#define __x_ABI_CWindows_CUI_CComposition_CICompositor_CreateLinearEasingFunction(This,result) (This)->lpVtbl->CreateLinearEasingFunction(This,result)
#define __x_ABI_CWindows_CUI_CComposition_CICompositor_CreatePropertySet(This,result) (This)->lpVtbl->CreatePropertySet(This,result)
#define __x_ABI_CWindows_CUI_CComposition_CICompositor_CreateQuaternionKeyFrameAnimation(This,result) (This)->lpVtbl->CreateQuaternionKeyFrameAnimation(This,result)
#define __x_ABI_CWindows_CUI_CComposition_CICompositor_CreateScalarKeyFrameAnimation(This,result) (This)->lpVtbl->CreateScalarKeyFrameAnimation(This,result)
#define __x_ABI_CWindows_CUI_CComposition_CICompositor_CreateScopedBatch(This,type,result) (This)->lpVtbl->CreateScopedBatch(This,type,result)
#define __x_ABI_CWindows_CUI_CComposition_CICompositor_CreateSpriteVisual(This,result) (This)->lpVtbl->CreateSpriteVisual(This,result)
#define __x_ABI_CWindows_CUI_CComposition_CICompositor_CreateSurfaceBrush(This,result) (This)->lpVtbl->CreateSurfaceBrush(This,result)
#define __x_ABI_CWindows_CUI_CComposition_CICompositor_CreateSurfaceBrushWithSurface(This,surface,result) (This)->lpVtbl->CreateSurfaceBrushWithSurface(This,surface,result)
#define __x_ABI_CWindows_CUI_CComposition_CICompositor_CreateTargetForCurrentView(This,result) (This)->lpVtbl->CreateTargetForCurrentView(This,result)
#define __x_ABI_CWindows_CUI_CComposition_CICompositor_CreateVector2KeyFrameAnimation(This,result) (This)->lpVtbl->CreateVector2KeyFrameAnimation(This,result)
#define __x_ABI_CWindows_CUI_CComposition_CICompositor_CreateVector3KeyFrameAnimation(This,result) (This)->lpVtbl->CreateVector3KeyFrameAnimation(This,result)
#define __x_ABI_CWindows_CUI_CComposition_CICompositor_CreateVector4KeyFrameAnimation(This,result) (This)->lpVtbl->CreateVector4KeyFrameAnimation(This,result)
#define __x_ABI_CWindows_CUI_CComposition_CICompositor_GetCommitBatch(This,type,result) (This)->lpVtbl->GetCommitBatch(This,type,result)
#else
/*** IUnknown methods ***/
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CUI_CComposition_CICompositor_QueryInterface(__x_ABI_CWindows_CUI_CComposition_CICompositor* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG __x_ABI_CWindows_CUI_CComposition_CICompositor_AddRef(__x_ABI_CWindows_CUI_CComposition_CICompositor* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG __x_ABI_CWindows_CUI_CComposition_CICompositor_Release(__x_ABI_CWindows_CUI_CComposition_CICompositor* This) {
    return This->lpVtbl->Release(This);
}
/*** IInspectable methods ***/
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CUI_CComposition_CICompositor_GetIids(__x_ABI_CWindows_CUI_CComposition_CICompositor* This,ULONG *iidCount,IID **iids) {
    return This->lpVtbl->GetIids(This,iidCount,iids);
}
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CUI_CComposition_CICompositor_GetRuntimeClassName(__x_ABI_CWindows_CUI_CComposition_CICompositor* This,HSTRING *className) {
    return This->lpVtbl->GetRuntimeClassName(This,className);
}
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CUI_CComposition_CICompositor_GetTrustLevel(__x_ABI_CWindows_CUI_CComposition_CICompositor* This,TrustLevel *trustLevel) {
    return This->lpVtbl->GetTrustLevel(This,trustLevel);
}
/*** ICompositor methods ***/
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CUI_CComposition_CICompositor_CreateColorKeyFrameAnimation(__x_ABI_CWindows_CUI_CComposition_CICompositor* This,__x_ABI_CWindows_CUI_CComposition_CIColorKeyFrameAnimation **result) {
    return This->lpVtbl->CreateColorKeyFrameAnimation(This,result);
}
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CUI_CComposition_CICompositor_CreateColorBrush(__x_ABI_CWindows_CUI_CComposition_CICompositor* This,__x_ABI_CWindows_CUI_CComposition_CICompositionColorBrush **result) {
    return This->lpVtbl->CreateColorBrush(This,result);
}
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CUI_CComposition_CICompositor_CreateColorBrushWithColor(__x_ABI_CWindows_CUI_CComposition_CICompositor* This,struct __x_ABI_CWindows_CUI_CColor color,__x_ABI_CWindows_CUI_CComposition_CICompositionColorBrush **result) {
    return This->lpVtbl->CreateColorBrushWithColor(This,color,result);
}
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CUI_CComposition_CICompositor_CreateContainerVisual(__x_ABI_CWindows_CUI_CComposition_CICompositor* This,__x_ABI_CWindows_CUI_CComposition_CIContainerVisual **result) {
    return This->lpVtbl->CreateContainerVisual(This,result);
}
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CUI_CComposition_CICompositor_CreateCubicBezierEasingFunction(__x_ABI_CWindows_CUI_CComposition_CICompositor* This,struct __x_ABI_CWindows_CFoundation_CNumerics_CVector2 point1,struct __x_ABI_CWindows_CFoundation_CNumerics_CVector2 point2,__x_ABI_CWindows_CUI_CComposition_CICubicBezierEasingFunction **result) {
    return This->lpVtbl->CreateCubicBezierEasingFunction(This,point1,point2,result);
}
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CUI_CComposition_CICompositor_CreateEffectFactory(__x_ABI_CWindows_CUI_CComposition_CICompositor* This,__x_ABI_CWindows_CGraphics_CEffects_CIGraphicsEffect *effect,__x_ABI_CWindows_CUI_CComposition_CICompositionEffectFactory **result) {
    return This->lpVtbl->CreateEffectFactory(This,effect,result);
}
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CUI_CComposition_CICompositor_CreateEffectFactoryWithProperties(__x_ABI_CWindows_CUI_CComposition_CICompositor* This,__x_ABI_CWindows_CGraphics_CEffects_CIGraphicsEffect *effect,__FIIterable_1_HSTRING *animatable,__x_ABI_CWindows_CUI_CComposition_CICompositionEffectFactory **result) {
    return This->lpVtbl->CreateEffectFactoryWithProperties(This,effect,animatable,result);
}
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CUI_CComposition_CICompositor_CreateExpressionAnimation(__x_ABI_CWindows_CUI_CComposition_CICompositor* This,__x_ABI_CWindows_CUI_CComposition_CIExpressionAnimation **result) {
    return This->lpVtbl->CreateExpressionAnimation(This,result);
}
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CUI_CComposition_CICompositor_CreateExpressionAnimationWithExpression(__x_ABI_CWindows_CUI_CComposition_CICompositor* This,HSTRING expression,__x_ABI_CWindows_CUI_CComposition_CIExpressionAnimation **result) {
    return This->lpVtbl->CreateExpressionAnimationWithExpression(This,expression,result);
}
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CUI_CComposition_CICompositor_CreateInsetClip(__x_ABI_CWindows_CUI_CComposition_CICompositor* This,__x_ABI_CWindows_CUI_CComposition_CIInsetClip **result) {
    return This->lpVtbl->CreateInsetClip(This,result);
}
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CUI_CComposition_CICompositor_CreateInsetClipWithInsets(__x_ABI_CWindows_CUI_CComposition_CICompositor* This,FLOAT left,FLOAT top,FLOAT right,FLOAT bottom,__x_ABI_CWindows_CUI_CComposition_CIInsetClip **result) {
    return This->lpVtbl->CreateInsetClipWithInsets(This,left,top,right,bottom,result);
}
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CUI_CComposition_CICompositor_CreateLinearEasingFunction(__x_ABI_CWindows_CUI_CComposition_CICompositor* This,__x_ABI_CWindows_CUI_CComposition_CILinearEasingFunction **result) {
    return This->lpVtbl->CreateLinearEasingFunction(This,result);
}
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CUI_CComposition_CICompositor_CreatePropertySet(__x_ABI_CWindows_CUI_CComposition_CICompositor* This,__x_ABI_CWindows_CUI_CComposition_CICompositionPropertySet **result) {
    return This->lpVtbl->CreatePropertySet(This,result);
}
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CUI_CComposition_CICompositor_CreateQuaternionKeyFrameAnimation(__x_ABI_CWindows_CUI_CComposition_CICompositor* This,__x_ABI_CWindows_CUI_CComposition_CIQuaternionKeyFrameAnimation **result) {
    return This->lpVtbl->CreateQuaternionKeyFrameAnimation(This,result);
}
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CUI_CComposition_CICompositor_CreateScalarKeyFrameAnimation(__x_ABI_CWindows_CUI_CComposition_CICompositor* This,__x_ABI_CWindows_CUI_CComposition_CIScalarKeyFrameAnimation **result) {
    return This->lpVtbl->CreateScalarKeyFrameAnimation(This,result);
}
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CUI_CComposition_CICompositor_CreateScopedBatch(__x_ABI_CWindows_CUI_CComposition_CICompositor* This,enum __x_ABI_CWindows_CUI_CComposition_CCompositionBatchTypes type,__x_ABI_CWindows_CUI_CComposition_CICompositionScopedBatch **result) {
    return This->lpVtbl->CreateScopedBatch(This,type,result);
}
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CUI_CComposition_CICompositor_CreateSpriteVisual(__x_ABI_CWindows_CUI_CComposition_CICompositor* This,__x_ABI_CWindows_CUI_CComposition_CISpriteVisual **result) {
    return This->lpVtbl->CreateSpriteVisual(This,result);
}
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CUI_CComposition_CICompositor_CreateSurfaceBrush(__x_ABI_CWindows_CUI_CComposition_CICompositor* This,__x_ABI_CWindows_CUI_CComposition_CICompositionSurfaceBrush **result) {
    return This->lpVtbl->CreateSurfaceBrush(This,result);
}
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CUI_CComposition_CICompositor_CreateSurfaceBrushWithSurface(__x_ABI_CWindows_CUI_CComposition_CICompositor* This,__x_ABI_CWindows_CUI_CComposition_CICompositionSurface *surface,__x_ABI_CWindows_CUI_CComposition_CICompositionSurfaceBrush **result) {
    return This->lpVtbl->CreateSurfaceBrushWithSurface(This,surface,result);
}
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CUI_CComposition_CICompositor_CreateTargetForCurrentView(__x_ABI_CWindows_CUI_CComposition_CICompositor* This,__x_ABI_CWindows_CUI_CComposition_CICompositionTarget **result) {
    return This->lpVtbl->CreateTargetForCurrentView(This,result);
}
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CUI_CComposition_CICompositor_CreateVector2KeyFrameAnimation(__x_ABI_CWindows_CUI_CComposition_CICompositor* This,__x_ABI_CWindows_CUI_CComposition_CIVector2KeyFrameAnimation **result) {
    return This->lpVtbl->CreateVector2KeyFrameAnimation(This,result);
}
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CUI_CComposition_CICompositor_CreateVector3KeyFrameAnimation(__x_ABI_CWindows_CUI_CComposition_CICompositor* This,__x_ABI_CWindows_CUI_CComposition_CIVector3KeyFrameAnimation **result) {
    return This->lpVtbl->CreateVector3KeyFrameAnimation(This,result);
}
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CUI_CComposition_CICompositor_CreateVector4KeyFrameAnimation(__x_ABI_CWindows_CUI_CComposition_CICompositor* This,__x_ABI_CWindows_CUI_CComposition_CIVector4KeyFrameAnimation **result) {
    return This->lpVtbl->CreateVector4KeyFrameAnimation(This,result);
}
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CUI_CComposition_CICompositor_GetCommitBatch(__x_ABI_CWindows_CUI_CComposition_CICompositor* This,enum __x_ABI_CWindows_CUI_CComposition_CCompositionBatchTypes type,__x_ABI_CWindows_CUI_CComposition_CICompositionCommitBatch **result) {
    return This->lpVtbl->GetCommitBatch(This,type,result);
}
#endif
#ifdef WIDL_using_Windows_UI_Composition
#define IID_ICompositor IID___x_ABI_CWindows_CUI_CComposition_CICompositor
#define ICompositorVtbl __x_ABI_CWindows_CUI_CComposition_CICompositorVtbl
#define ICompositor __x_ABI_CWindows_CUI_CComposition_CICompositor
#define ICompositor_QueryInterface __x_ABI_CWindows_CUI_CComposition_CICompositor_QueryInterface
#define ICompositor_AddRef __x_ABI_CWindows_CUI_CComposition_CICompositor_AddRef
#define ICompositor_Release __x_ABI_CWindows_CUI_CComposition_CICompositor_Release
#define ICompositor_GetIids __x_ABI_CWindows_CUI_CComposition_CICompositor_GetIids
#define ICompositor_GetRuntimeClassName __x_ABI_CWindows_CUI_CComposition_CICompositor_GetRuntimeClassName
#define ICompositor_GetTrustLevel __x_ABI_CWindows_CUI_CComposition_CICompositor_GetTrustLevel
#define ICompositor_CreateColorKeyFrameAnimation __x_ABI_CWindows_CUI_CComposition_CICompositor_CreateColorKeyFrameAnimation
#define ICompositor_CreateColorBrush __x_ABI_CWindows_CUI_CComposition_CICompositor_CreateColorBrush
#define ICompositor_CreateColorBrushWithColor __x_ABI_CWindows_CUI_CComposition_CICompositor_CreateColorBrushWithColor
#define ICompositor_CreateContainerVisual __x_ABI_CWindows_CUI_CComposition_CICompositor_CreateContainerVisual
#define ICompositor_CreateCubicBezierEasingFunction __x_ABI_CWindows_CUI_CComposition_CICompositor_CreateCubicBezierEasingFunction
#define ICompositor_CreateEffectFactory __x_ABI_CWindows_CUI_CComposition_CICompositor_CreateEffectFactory
#define ICompositor_CreateEffectFactoryWithProperties __x_ABI_CWindows_CUI_CComposition_CICompositor_CreateEffectFactoryWithProperties
#define ICompositor_CreateExpressionAnimation __x_ABI_CWindows_CUI_CComposition_CICompositor_CreateExpressionAnimation
#define ICompositor_CreateExpressionAnimationWithExpression __x_ABI_CWindows_CUI_CComposition_CICompositor_CreateExpressionAnimationWithExpression
#define ICompositor_CreateInsetClip __x_ABI_CWindows_CUI_CComposition_CICompositor_CreateInsetClip
#define ICompositor_CreateInsetClipWithInsets __x_ABI_CWindows_CUI_CComposition_CICompositor_CreateInsetClipWithInsets
#define ICompositor_CreateLinearEasingFunction __x_ABI_CWindows_CUI_CComposition_CICompositor_CreateLinearEasingFunction
#define ICompositor_CreatePropertySet __x_ABI_CWindows_CUI_CComposition_CICompositor_CreatePropertySet
#define ICompositor_CreateQuaternionKeyFrameAnimation __x_ABI_CWindows_CUI_CComposition_CICompositor_CreateQuaternionKeyFrameAnimation
#define ICompositor_CreateScalarKeyFrameAnimation __x_ABI_CWindows_CUI_CComposition_CICompositor_CreateScalarKeyFrameAnimation
#define ICompositor_CreateScopedBatch __x_ABI_CWindows_CUI_CComposition_CICompositor_CreateScopedBatch
#define ICompositor_CreateSpriteVisual __x_ABI_CWindows_CUI_CComposition_CICompositor_CreateSpriteVisual
#define ICompositor_CreateSurfaceBrush __x_ABI_CWindows_CUI_CComposition_CICompositor_CreateSurfaceBrush
#define ICompositor_CreateSurfaceBrushWithSurface __x_ABI_CWindows_CUI_CComposition_CICompositor_CreateSurfaceBrushWithSurface
#define ICompositor_CreateTargetForCurrentView __x_ABI_CWindows_CUI_CComposition_CICompositor_CreateTargetForCurrentView
#define ICompositor_CreateVector2KeyFrameAnimation __x_ABI_CWindows_CUI_CComposition_CICompositor_CreateVector2KeyFrameAnimation
#define ICompositor_CreateVector3KeyFrameAnimation __x_ABI_CWindows_CUI_CComposition_CICompositor_CreateVector3KeyFrameAnimation
#define ICompositor_CreateVector4KeyFrameAnimation __x_ABI_CWindows_CUI_CComposition_CICompositor_CreateVector4KeyFrameAnimation
#define ICompositor_GetCommitBatch __x_ABI_CWindows_CUI_CComposition_CICompositor_GetCommitBatch
#endif /* WIDL_using_Windows_UI_Composition */
#endif

#endif

#endif  /* ____x_ABI_CWindows_CUI_CComposition_CICompositor_INTERFACE_DEFINED__ */
#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x20000 */

/*****************************************************************************
 * IContainerVisual interface
 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x20000
#ifndef ____x_ABI_CWindows_CUI_CComposition_CIContainerVisual_INTERFACE_DEFINED__
#define ____x_ABI_CWindows_CUI_CComposition_CIContainerVisual_INTERFACE_DEFINED__

DEFINE_GUID(IID___x_ABI_CWindows_CUI_CComposition_CIContainerVisual, 0x02f6bc74, 0xed20, 0x4773, 0xaf,0xe6, 0xd4,0x9b,0x4a,0x93,0xdb,0x32);
#if defined(__cplusplus) && !defined(CINTERFACE)
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace UI {
            namespace Composition {
                MIDL_INTERFACE("02f6bc74-ed20-4773-afe6-d49b4a93db32")
                IContainerVisual : public IInspectable
                {
                    virtual HRESULT STDMETHODCALLTYPE get_Children(
                        ABI::Windows::UI::Composition::IVisualCollection **value) = 0;

                };
            }
        }
    }
}
extern "C" {
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(__x_ABI_CWindows_CUI_CComposition_CIContainerVisual, 0x02f6bc74, 0xed20, 0x4773, 0xaf,0xe6, 0xd4,0x9b,0x4a,0x93,0xdb,0x32)
#endif
#else
typedef struct __x_ABI_CWindows_CUI_CComposition_CIContainerVisualVtbl {
    BEGIN_INTERFACE

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

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

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

    /*** IInspectable methods ***/
    HRESULT (STDMETHODCALLTYPE *GetIids)(
        __x_ABI_CWindows_CUI_CComposition_CIContainerVisual *This,
        ULONG *iidCount,
        IID **iids);

    HRESULT (STDMETHODCALLTYPE *GetRuntimeClassName)(
        __x_ABI_CWindows_CUI_CComposition_CIContainerVisual *This,
        HSTRING *className);

    HRESULT (STDMETHODCALLTYPE *GetTrustLevel)(
        __x_ABI_CWindows_CUI_CComposition_CIContainerVisual *This,
        TrustLevel *trustLevel);

    /*** IContainerVisual methods ***/
    HRESULT (STDMETHODCALLTYPE *get_Children)(
        __x_ABI_CWindows_CUI_CComposition_CIContainerVisual *This,
        __x_ABI_CWindows_CUI_CComposition_CIVisualCollection **value);

    END_INTERFACE
} __x_ABI_CWindows_CUI_CComposition_CIContainerVisualVtbl;

interface __x_ABI_CWindows_CUI_CComposition_CIContainerVisual {
    CONST_VTBL __x_ABI_CWindows_CUI_CComposition_CIContainerVisualVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define __x_ABI_CWindows_CUI_CComposition_CIContainerVisual_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define __x_ABI_CWindows_CUI_CComposition_CIContainerVisual_AddRef(This) (This)->lpVtbl->AddRef(This)
#define __x_ABI_CWindows_CUI_CComposition_CIContainerVisual_Release(This) (This)->lpVtbl->Release(This)
/*** IInspectable methods ***/
#define __x_ABI_CWindows_CUI_CComposition_CIContainerVisual_GetIids(This,iidCount,iids) (This)->lpVtbl->GetIids(This,iidCount,iids)
#define __x_ABI_CWindows_CUI_CComposition_CIContainerVisual_GetRuntimeClassName(This,className) (This)->lpVtbl->GetRuntimeClassName(This,className)
#define __x_ABI_CWindows_CUI_CComposition_CIContainerVisual_GetTrustLevel(This,trustLevel) (This)->lpVtbl->GetTrustLevel(This,trustLevel)
/*** IContainerVisual methods ***/
#define __x_ABI_CWindows_CUI_CComposition_CIContainerVisual_get_Children(This,value) (This)->lpVtbl->get_Children(This,value)
#else
/*** IUnknown methods ***/
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CUI_CComposition_CIContainerVisual_QueryInterface(__x_ABI_CWindows_CUI_CComposition_CIContainerVisual* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG __x_ABI_CWindows_CUI_CComposition_CIContainerVisual_AddRef(__x_ABI_CWindows_CUI_CComposition_CIContainerVisual* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG __x_ABI_CWindows_CUI_CComposition_CIContainerVisual_Release(__x_ABI_CWindows_CUI_CComposition_CIContainerVisual* This) {
    return This->lpVtbl->Release(This);
}
/*** IInspectable methods ***/
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CUI_CComposition_CIContainerVisual_GetIids(__x_ABI_CWindows_CUI_CComposition_CIContainerVisual* This,ULONG *iidCount,IID **iids) {
    return This->lpVtbl->GetIids(This,iidCount,iids);
}
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CUI_CComposition_CIContainerVisual_GetRuntimeClassName(__x_ABI_CWindows_CUI_CComposition_CIContainerVisual* This,HSTRING *className) {
    return This->lpVtbl->GetRuntimeClassName(This,className);
}
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CUI_CComposition_CIContainerVisual_GetTrustLevel(__x_ABI_CWindows_CUI_CComposition_CIContainerVisual* This,TrustLevel *trustLevel) {
    return This->lpVtbl->GetTrustLevel(This,trustLevel);
}
/*** IContainerVisual methods ***/
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CUI_CComposition_CIContainerVisual_get_Children(__x_ABI_CWindows_CUI_CComposition_CIContainerVisual* This,__x_ABI_CWindows_CUI_CComposition_CIVisualCollection **value) {
    return This->lpVtbl->get_Children(This,value);
}
#endif
#ifdef WIDL_using_Windows_UI_Composition
#define IID_IContainerVisual IID___x_ABI_CWindows_CUI_CComposition_CIContainerVisual
#define IContainerVisualVtbl __x_ABI_CWindows_CUI_CComposition_CIContainerVisualVtbl
#define IContainerVisual __x_ABI_CWindows_CUI_CComposition_CIContainerVisual
#define IContainerVisual_QueryInterface __x_ABI_CWindows_CUI_CComposition_CIContainerVisual_QueryInterface
#define IContainerVisual_AddRef __x_ABI_CWindows_CUI_CComposition_CIContainerVisual_AddRef
#define IContainerVisual_Release __x_ABI_CWindows_CUI_CComposition_CIContainerVisual_Release
#define IContainerVisual_GetIids __x_ABI_CWindows_CUI_CComposition_CIContainerVisual_GetIids
#define IContainerVisual_GetRuntimeClassName __x_ABI_CWindows_CUI_CComposition_CIContainerVisual_GetRuntimeClassName
#define IContainerVisual_GetTrustLevel __x_ABI_CWindows_CUI_CComposition_CIContainerVisual_GetTrustLevel
#define IContainerVisual_get_Children __x_ABI_CWindows_CUI_CComposition_CIContainerVisual_get_Children
#endif /* WIDL_using_Windows_UI_Composition */
#endif

#endif

#endif  /* ____x_ABI_CWindows_CUI_CComposition_CIContainerVisual_INTERFACE_DEFINED__ */
#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x20000 */

/*****************************************************************************
 * IContainerVisualFactory interface
 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x20000
#ifndef ____x_ABI_CWindows_CUI_CComposition_CIContainerVisualFactory_INTERFACE_DEFINED__
#define ____x_ABI_CWindows_CUI_CComposition_CIContainerVisualFactory_INTERFACE_DEFINED__

DEFINE_GUID(IID___x_ABI_CWindows_CUI_CComposition_CIContainerVisualFactory, 0x0363a65b, 0xc7da, 0x4d9a, 0x95,0xf4, 0x69,0xb5,0xc8,0xdf,0x67,0x0b);
#if defined(__cplusplus) && !defined(CINTERFACE)
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace UI {
            namespace Composition {
                MIDL_INTERFACE("0363a65b-c7da-4d9a-95f4-69b5c8df670b")
                IContainerVisualFactory : public IInspectable
                {
                };
            }
        }
    }
}
extern "C" {
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(__x_ABI_CWindows_CUI_CComposition_CIContainerVisualFactory, 0x0363a65b, 0xc7da, 0x4d9a, 0x95,0xf4, 0x69,0xb5,0xc8,0xdf,0x67,0x0b)
#endif
#else
typedef struct __x_ABI_CWindows_CUI_CComposition_CIContainerVisualFactoryVtbl {
    BEGIN_INTERFACE

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

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

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

    /*** IInspectable methods ***/
    HRESULT (STDMETHODCALLTYPE *GetIids)(
        __x_ABI_CWindows_CUI_CComposition_CIContainerVisualFactory *This,
        ULONG *iidCount,
        IID **iids);

    HRESULT (STDMETHODCALLTYPE *GetRuntimeClassName)(
        __x_ABI_CWindows_CUI_CComposition_CIContainerVisualFactory *This,
        HSTRING *className);

    HRESULT (STDMETHODCALLTYPE *GetTrustLevel)(
        __x_ABI_CWindows_CUI_CComposition_CIContainerVisualFactory *This,
        TrustLevel *trustLevel);

    END_INTERFACE
} __x_ABI_CWindows_CUI_CComposition_CIContainerVisualFactoryVtbl;

interface __x_ABI_CWindows_CUI_CComposition_CIContainerVisualFactory {
    CONST_VTBL __x_ABI_CWindows_CUI_CComposition_CIContainerVisualFactoryVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define __x_ABI_CWindows_CUI_CComposition_CIContainerVisualFactory_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define __x_ABI_CWindows_CUI_CComposition_CIContainerVisualFactory_AddRef(This) (This)->lpVtbl->AddRef(This)
#define __x_ABI_CWindows_CUI_CComposition_CIContainerVisualFactory_Release(This) (This)->lpVtbl->Release(This)
/*** IInspectable methods ***/
#define __x_ABI_CWindows_CUI_CComposition_CIContainerVisualFactory_GetIids(This,iidCount,iids) (This)->lpVtbl->GetIids(This,iidCount,iids)
#define __x_ABI_CWindows_CUI_CComposition_CIContainerVisualFactory_GetRuntimeClassName(This,className) (This)->lpVtbl->GetRuntimeClassName(This,className)
#define __x_ABI_CWindows_CUI_CComposition_CIContainerVisualFactory_GetTrustLevel(This,trustLevel) (This)->lpVtbl->GetTrustLevel(This,trustLevel)
#else
/*** IUnknown methods ***/
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CUI_CComposition_CIContainerVisualFactory_QueryInterface(__x_ABI_CWindows_CUI_CComposition_CIContainerVisualFactory* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG __x_ABI_CWindows_CUI_CComposition_CIContainerVisualFactory_AddRef(__x_ABI_CWindows_CUI_CComposition_CIContainerVisualFactory* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG __x_ABI_CWindows_CUI_CComposition_CIContainerVisualFactory_Release(__x_ABI_CWindows_CUI_CComposition_CIContainerVisualFactory* This) {
    return This->lpVtbl->Release(This);
}
/*** IInspectable methods ***/
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CUI_CComposition_CIContainerVisualFactory_GetIids(__x_ABI_CWindows_CUI_CComposition_CIContainerVisualFactory* This,ULONG *iidCount,IID **iids) {
    return This->lpVtbl->GetIids(This,iidCount,iids);
}
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CUI_CComposition_CIContainerVisualFactory_GetRuntimeClassName(__x_ABI_CWindows_CUI_CComposition_CIContainerVisualFactory* This,HSTRING *className) {
    return This->lpVtbl->GetRuntimeClassName(This,className);
}
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CUI_CComposition_CIContainerVisualFactory_GetTrustLevel(__x_ABI_CWindows_CUI_CComposition_CIContainerVisualFactory* This,TrustLevel *trustLevel) {
    return This->lpVtbl->GetTrustLevel(This,trustLevel);
}
#endif
#ifdef WIDL_using_Windows_UI_Composition
#define IID_IContainerVisualFactory IID___x_ABI_CWindows_CUI_CComposition_CIContainerVisualFactory
#define IContainerVisualFactoryVtbl __x_ABI_CWindows_CUI_CComposition_CIContainerVisualFactoryVtbl
#define IContainerVisualFactory __x_ABI_CWindows_CUI_CComposition_CIContainerVisualFactory
#define IContainerVisualFactory_QueryInterface __x_ABI_CWindows_CUI_CComposition_CIContainerVisualFactory_QueryInterface
#define IContainerVisualFactory_AddRef __x_ABI_CWindows_CUI_CComposition_CIContainerVisualFactory_AddRef
#define IContainerVisualFactory_Release __x_ABI_CWindows_CUI_CComposition_CIContainerVisualFactory_Release
#define IContainerVisualFactory_GetIids __x_ABI_CWindows_CUI_CComposition_CIContainerVisualFactory_GetIids
#define IContainerVisualFactory_GetRuntimeClassName __x_ABI_CWindows_CUI_CComposition_CIContainerVisualFactory_GetRuntimeClassName
#define IContainerVisualFactory_GetTrustLevel __x_ABI_CWindows_CUI_CComposition_CIContainerVisualFactory_GetTrustLevel
#endif /* WIDL_using_Windows_UI_Composition */
#endif

#endif

#endif  /* ____x_ABI_CWindows_CUI_CComposition_CIContainerVisualFactory_INTERFACE_DEFINED__ */
#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x20000 */

/*****************************************************************************
 * ICubicBezierEasingFunction interface
 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x20000
#ifndef ____x_ABI_CWindows_CUI_CComposition_CICubicBezierEasingFunction_INTERFACE_DEFINED__
#define ____x_ABI_CWindows_CUI_CComposition_CICubicBezierEasingFunction_INTERFACE_DEFINED__

DEFINE_GUID(IID___x_ABI_CWindows_CUI_CComposition_CICubicBezierEasingFunction, 0x32350666, 0xc1e8, 0x44f9, 0x96,0xb8, 0xc9,0x8a,0xcf,0x0a,0xe6,0x98);
#if defined(__cplusplus) && !defined(CINTERFACE)
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace UI {
            namespace Composition {
                MIDL_INTERFACE("32350666-c1e8-44f9-96b8-c98acf0ae698")
                ICubicBezierEasingFunction : public IInspectable
                {
                    virtual HRESULT STDMETHODCALLTYPE get_ControlPoint1(
                        struct Vector2 *value) = 0;

                    virtual HRESULT STDMETHODCALLTYPE get_ControlPoint2(
                        struct Vector2 *value) = 0;

                };
            }
        }
    }
}
extern "C" {
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(__x_ABI_CWindows_CUI_CComposition_CICubicBezierEasingFunction, 0x32350666, 0xc1e8, 0x44f9, 0x96,0xb8, 0xc9,0x8a,0xcf,0x0a,0xe6,0x98)
#endif
#else
typedef struct __x_ABI_CWindows_CUI_CComposition_CICubicBezierEasingFunctionVtbl {
    BEGIN_INTERFACE

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

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

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

    /*** IInspectable methods ***/
    HRESULT (STDMETHODCALLTYPE *GetIids)(
        __x_ABI_CWindows_CUI_CComposition_CICubicBezierEasingFunction *This,
        ULONG *iidCount,
        IID **iids);

    HRESULT (STDMETHODCALLTYPE *GetRuntimeClassName)(
        __x_ABI_CWindows_CUI_CComposition_CICubicBezierEasingFunction *This,
        HSTRING *className);

    HRESULT (STDMETHODCALLTYPE *GetTrustLevel)(
        __x_ABI_CWindows_CUI_CComposition_CICubicBezierEasingFunction *This,
        TrustLevel *trustLevel);

    /*** ICubicBezierEasingFunction methods ***/
    HRESULT (STDMETHODCALLTYPE *get_ControlPoint1)(
        __x_ABI_CWindows_CUI_CComposition_CICubicBezierEasingFunction *This,
        struct __x_ABI_CWindows_CFoundation_CNumerics_CVector2 *value);

    HRESULT (STDMETHODCALLTYPE *get_ControlPoint2)(
        __x_ABI_CWindows_CUI_CComposition_CICubicBezierEasingFunction *This,
        struct __x_ABI_CWindows_CFoundation_CNumerics_CVector2 *value);

    END_INTERFACE
} __x_ABI_CWindows_CUI_CComposition_CICubicBezierEasingFunctionVtbl;

interface __x_ABI_CWindows_CUI_CComposition_CICubicBezierEasingFunction {
    CONST_VTBL __x_ABI_CWindows_CUI_CComposition_CICubicBezierEasingFunctionVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define __x_ABI_CWindows_CUI_CComposition_CICubicBezierEasingFunction_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define __x_ABI_CWindows_CUI_CComposition_CICubicBezierEasingFunction_AddRef(This) (This)->lpVtbl->AddRef(This)
#define __x_ABI_CWindows_CUI_CComposition_CICubicBezierEasingFunction_Release(This) (This)->lpVtbl->Release(This)
/*** IInspectable methods ***/
#define __x_ABI_CWindows_CUI_CComposition_CICubicBezierEasingFunction_GetIids(This,iidCount,iids) (This)->lpVtbl->GetIids(This,iidCount,iids)
#define __x_ABI_CWindows_CUI_CComposition_CICubicBezierEasingFunction_GetRuntimeClassName(This,className) (This)->lpVtbl->GetRuntimeClassName(This,className)
#define __x_ABI_CWindows_CUI_CComposition_CICubicBezierEasingFunction_GetTrustLevel(This,trustLevel) (This)->lpVtbl->GetTrustLevel(This,trustLevel)
/*** ICubicBezierEasingFunction methods ***/
#define __x_ABI_CWindows_CUI_CComposition_CICubicBezierEasingFunction_get_ControlPoint1(This,value) (This)->lpVtbl->get_ControlPoint1(This,value)
#define __x_ABI_CWindows_CUI_CComposition_CICubicBezierEasingFunction_get_ControlPoint2(This,value) (This)->lpVtbl->get_ControlPoint2(This,value)
#else
/*** IUnknown methods ***/
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CUI_CComposition_CICubicBezierEasingFunction_QueryInterface(__x_ABI_CWindows_CUI_CComposition_CICubicBezierEasingFunction* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG __x_ABI_CWindows_CUI_CComposition_CICubicBezierEasingFunction_AddRef(__x_ABI_CWindows_CUI_CComposition_CICubicBezierEasingFunction* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG __x_ABI_CWindows_CUI_CComposition_CICubicBezierEasingFunction_Release(__x_ABI_CWindows_CUI_CComposition_CICubicBezierEasingFunction* This) {
    return This->lpVtbl->Release(This);
}
/*** IInspectable methods ***/
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CUI_CComposition_CICubicBezierEasingFunction_GetIids(__x_ABI_CWindows_CUI_CComposition_CICubicBezierEasingFunction* This,ULONG *iidCount,IID **iids) {
    return This->lpVtbl->GetIids(This,iidCount,iids);
}
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CUI_CComposition_CICubicBezierEasingFunction_GetRuntimeClassName(__x_ABI_CWindows_CUI_CComposition_CICubicBezierEasingFunction* This,HSTRING *className) {
    return This->lpVtbl->GetRuntimeClassName(This,className);
}
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CUI_CComposition_CICubicBezierEasingFunction_GetTrustLevel(__x_ABI_CWindows_CUI_CComposition_CICubicBezierEasingFunction* This,TrustLevel *trustLevel) {
    return This->lpVtbl->GetTrustLevel(This,trustLevel);
}
/*** ICubicBezierEasingFunction methods ***/
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CUI_CComposition_CICubicBezierEasingFunction_get_ControlPoint1(__x_ABI_CWindows_CUI_CComposition_CICubicBezierEasingFunction* This,struct __x_ABI_CWindows_CFoundation_CNumerics_CVector2 *value) {
    return This->lpVtbl->get_ControlPoint1(This,value);
}
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CUI_CComposition_CICubicBezierEasingFunction_get_ControlPoint2(__x_ABI_CWindows_CUI_CComposition_CICubicBezierEasingFunction* This,struct __x_ABI_CWindows_CFoundation_CNumerics_CVector2 *value) {
    return This->lpVtbl->get_ControlPoint2(This,value);
}
#endif
#ifdef WIDL_using_Windows_UI_Composition
#define IID_ICubicBezierEasingFunction IID___x_ABI_CWindows_CUI_CComposition_CICubicBezierEasingFunction
#define ICubicBezierEasingFunctionVtbl __x_ABI_CWindows_CUI_CComposition_CICubicBezierEasingFunctionVtbl
#define ICubicBezierEasingFunction __x_ABI_CWindows_CUI_CComposition_CICubicBezierEasingFunction
#define ICubicBezierEasingFunction_QueryInterface __x_ABI_CWindows_CUI_CComposition_CICubicBezierEasingFunction_QueryInterface
#define ICubicBezierEasingFunction_AddRef __x_ABI_CWindows_CUI_CComposition_CICubicBezierEasingFunction_AddRef
#define ICubicBezierEasingFunction_Release __x_ABI_CWindows_CUI_CComposition_CICubicBezierEasingFunction_Release
#define ICubicBezierEasingFunction_GetIids __x_ABI_CWindows_CUI_CComposition_CICubicBezierEasingFunction_GetIids
#define ICubicBezierEasingFunction_GetRuntimeClassName __x_ABI_CWindows_CUI_CComposition_CICubicBezierEasingFunction_GetRuntimeClassName
#define ICubicBezierEasingFunction_GetTrustLevel __x_ABI_CWindows_CUI_CComposition_CICubicBezierEasingFunction_GetTrustLevel
#define ICubicBezierEasingFunction_get_ControlPoint1 __x_ABI_CWindows_CUI_CComposition_CICubicBezierEasingFunction_get_ControlPoint1
#define ICubicBezierEasingFunction_get_ControlPoint2 __x_ABI_CWindows_CUI_CComposition_CICubicBezierEasingFunction_get_ControlPoint2
#endif /* WIDL_using_Windows_UI_Composition */
#endif

#endif

#endif  /* ____x_ABI_CWindows_CUI_CComposition_CICubicBezierEasingFunction_INTERFACE_DEFINED__ */
#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x20000 */

/*****************************************************************************
 * IExpressionAnimation interface
 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x20000
#ifndef ____x_ABI_CWindows_CUI_CComposition_CIExpressionAnimation_INTERFACE_DEFINED__
#define ____x_ABI_CWindows_CUI_CComposition_CIExpressionAnimation_INTERFACE_DEFINED__

DEFINE_GUID(IID___x_ABI_CWindows_CUI_CComposition_CIExpressionAnimation, 0x6acc5431, 0x7d3d, 0x4bf3, 0xab,0xb6, 0xf4,0x4b,0xdc,0x48,0x88,0xc1);
#if defined(__cplusplus) && !defined(CINTERFACE)
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace UI {
            namespace Composition {
                MIDL_INTERFACE("6acc5431-7d3d-4bf3-abb6-f44bdc4888c1")
                IExpressionAnimation : public IInspectable
                {
                    virtual HRESULT STDMETHODCALLTYPE get_Expression(
                        HSTRING *value) = 0;

                    virtual HRESULT STDMETHODCALLTYPE put_Expression(
                        HSTRING value) = 0;

                };
            }
        }
    }
}
extern "C" {
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(__x_ABI_CWindows_CUI_CComposition_CIExpressionAnimation, 0x6acc5431, 0x7d3d, 0x4bf3, 0xab,0xb6, 0xf4,0x4b,0xdc,0x48,0x88,0xc1)
#endif
#else
typedef struct __x_ABI_CWindows_CUI_CComposition_CIExpressionAnimationVtbl {
    BEGIN_INTERFACE

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

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

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

    /*** IInspectable methods ***/
    HRESULT (STDMETHODCALLTYPE *GetIids)(
        __x_ABI_CWindows_CUI_CComposition_CIExpressionAnimation *This,
        ULONG *iidCount,
        IID **iids);

    HRESULT (STDMETHODCALLTYPE *GetRuntimeClassName)(
        __x_ABI_CWindows_CUI_CComposition_CIExpressionAnimation *This,
        HSTRING *className);

    HRESULT (STDMETHODCALLTYPE *GetTrustLevel)(
        __x_ABI_CWindows_CUI_CComposition_CIExpressionAnimation *This,
        TrustLevel *trustLevel);

    /*** IExpressionAnimation methods ***/
    HRESULT (STDMETHODCALLTYPE *get_Expression)(
        __x_ABI_CWindows_CUI_CComposition_CIExpressionAnimation *This,
        HSTRING *value);

    HRESULT (STDMETHODCALLTYPE *put_Expression)(
        __x_ABI_CWindows_CUI_CComposition_CIExpressionAnimation *This,
        HSTRING value);

    END_INTERFACE
} __x_ABI_CWindows_CUI_CComposition_CIExpressionAnimationVtbl;

interface __x_ABI_CWindows_CUI_CComposition_CIExpressionAnimation {
    CONST_VTBL __x_ABI_CWindows_CUI_CComposition_CIExpressionAnimationVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define __x_ABI_CWindows_CUI_CComposition_CIExpressionAnimation_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define __x_ABI_CWindows_CUI_CComposition_CIExpressionAnimation_AddRef(This) (This)->lpVtbl->AddRef(This)
#define __x_ABI_CWindows_CUI_CComposition_CIExpressionAnimation_Release(This) (This)->lpVtbl->Release(This)
/*** IInspectable methods ***/
#define __x_ABI_CWindows_CUI_CComposition_CIExpressionAnimation_GetIids(This,iidCount,iids) (This)->lpVtbl->GetIids(This,iidCount,iids)
#define __x_ABI_CWindows_CUI_CComposition_CIExpressionAnimation_GetRuntimeClassName(This,className) (This)->lpVtbl->GetRuntimeClassName(This,className)
#define __x_ABI_CWindows_CUI_CComposition_CIExpressionAnimation_GetTrustLevel(This,trustLevel) (This)->lpVtbl->GetTrustLevel(This,trustLevel)
/*** IExpressionAnimation methods ***/
#define __x_ABI_CWindows_CUI_CComposition_CIExpressionAnimation_get_Expression(This,value) (This)->lpVtbl->get_Expression(This,value)
#define __x_ABI_CWindows_CUI_CComposition_CIExpressionAnimation_put_Expression(This,value) (This)->lpVtbl->put_Expression(This,value)
#else
/*** IUnknown methods ***/
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CUI_CComposition_CIExpressionAnimation_QueryInterface(__x_ABI_CWindows_CUI_CComposition_CIExpressionAnimation* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG __x_ABI_CWindows_CUI_CComposition_CIExpressionAnimation_AddRef(__x_ABI_CWindows_CUI_CComposition_CIExpressionAnimation* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG __x_ABI_CWindows_CUI_CComposition_CIExpressionAnimation_Release(__x_ABI_CWindows_CUI_CComposition_CIExpressionAnimation* This) {
    return This->lpVtbl->Release(This);
}
/*** IInspectable methods ***/
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CUI_CComposition_CIExpressionAnimation_GetIids(__x_ABI_CWindows_CUI_CComposition_CIExpressionAnimation* This,ULONG *iidCount,IID **iids) {
    return This->lpVtbl->GetIids(This,iidCount,iids);
}
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CUI_CComposition_CIExpressionAnimation_GetRuntimeClassName(__x_ABI_CWindows_CUI_CComposition_CIExpressionAnimation* This,HSTRING *className) {
    return This->lpVtbl->GetRuntimeClassName(This,className);
}
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CUI_CComposition_CIExpressionAnimation_GetTrustLevel(__x_ABI_CWindows_CUI_CComposition_CIExpressionAnimation* This,TrustLevel *trustLevel) {
    return This->lpVtbl->GetTrustLevel(This,trustLevel);
}
/*** IExpressionAnimation methods ***/
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CUI_CComposition_CIExpressionAnimation_get_Expression(__x_ABI_CWindows_CUI_CComposition_CIExpressionAnimation* This,HSTRING *value) {
    return This->lpVtbl->get_Expression(This,value);
}
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CUI_CComposition_CIExpressionAnimation_put_Expression(__x_ABI_CWindows_CUI_CComposition_CIExpressionAnimation* This,HSTRING value) {
    return This->lpVtbl->put_Expression(This,value);
}
#endif
#ifdef WIDL_using_Windows_UI_Composition
#define IID_IExpressionAnimation IID___x_ABI_CWindows_CUI_CComposition_CIExpressionAnimation
#define IExpressionAnimationVtbl __x_ABI_CWindows_CUI_CComposition_CIExpressionAnimationVtbl
#define IExpressionAnimation __x_ABI_CWindows_CUI_CComposition_CIExpressionAnimation
#define IExpressionAnimation_QueryInterface __x_ABI_CWindows_CUI_CComposition_CIExpressionAnimation_QueryInterface
#define IExpressionAnimation_AddRef __x_ABI_CWindows_CUI_CComposition_CIExpressionAnimation_AddRef
#define IExpressionAnimation_Release __x_ABI_CWindows_CUI_CComposition_CIExpressionAnimation_Release
#define IExpressionAnimation_GetIids __x_ABI_CWindows_CUI_CComposition_CIExpressionAnimation_GetIids
#define IExpressionAnimation_GetRuntimeClassName __x_ABI_CWindows_CUI_CComposition_CIExpressionAnimation_GetRuntimeClassName
#define IExpressionAnimation_GetTrustLevel __x_ABI_CWindows_CUI_CComposition_CIExpressionAnimation_GetTrustLevel
#define IExpressionAnimation_get_Expression __x_ABI_CWindows_CUI_CComposition_CIExpressionAnimation_get_Expression
#define IExpressionAnimation_put_Expression __x_ABI_CWindows_CUI_CComposition_CIExpressionAnimation_put_Expression
#endif /* WIDL_using_Windows_UI_Composition */
#endif

#endif

#endif  /* ____x_ABI_CWindows_CUI_CComposition_CIExpressionAnimation_INTERFACE_DEFINED__ */
#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x20000 */

/*****************************************************************************
 * IInsetClip interface
 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x20000
#ifndef ____x_ABI_CWindows_CUI_CComposition_CIInsetClip_INTERFACE_DEFINED__
#define ____x_ABI_CWindows_CUI_CComposition_CIInsetClip_INTERFACE_DEFINED__

DEFINE_GUID(IID___x_ABI_CWindows_CUI_CComposition_CIInsetClip, 0x1e73e647, 0x84c7, 0x477a, 0xb4,0x74, 0x58,0x80,0xe0,0x44,0x2e,0x15);
#if defined(__cplusplus) && !defined(CINTERFACE)
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace UI {
            namespace Composition {
                MIDL_INTERFACE("1e73e647-84c7-477a-b474-5880e0442e15")
                IInsetClip : public IInspectable
                {
                    virtual HRESULT STDMETHODCALLTYPE get_BottomInset(
                        FLOAT *value) = 0;

                    virtual HRESULT STDMETHODCALLTYPE put_BottomInset(
                        FLOAT value) = 0;

                    virtual HRESULT STDMETHODCALLTYPE get_LeftInset(
                        FLOAT *value) = 0;

                    virtual HRESULT STDMETHODCALLTYPE put_LeftInset(
                        FLOAT value) = 0;

                    virtual HRESULT STDMETHODCALLTYPE get_RightInset(
                        FLOAT *value) = 0;

                    virtual HRESULT STDMETHODCALLTYPE put_RightInset(
                        FLOAT value) = 0;

                    virtual HRESULT STDMETHODCALLTYPE get_TopInset(
                        FLOAT *value) = 0;

                    virtual HRESULT STDMETHODCALLTYPE put_TopInset(
                        FLOAT value) = 0;

                };
            }
        }
    }
}
extern "C" {
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(__x_ABI_CWindows_CUI_CComposition_CIInsetClip, 0x1e73e647, 0x84c7, 0x477a, 0xb4,0x74, 0x58,0x80,0xe0,0x44,0x2e,0x15)
#endif
#else
typedef struct __x_ABI_CWindows_CUI_CComposition_CIInsetClipVtbl {
    BEGIN_INTERFACE

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

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

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

    /*** IInspectable methods ***/
    HRESULT (STDMETHODCALLTYPE *GetIids)(
        __x_ABI_CWindows_CUI_CComposition_CIInsetClip *This,
        ULONG *iidCount,
        IID **iids);

    HRESULT (STDMETHODCALLTYPE *GetRuntimeClassName)(
        __x_ABI_CWindows_CUI_CComposition_CIInsetClip *This,
        HSTRING *className);

    HRESULT (STDMETHODCALLTYPE *GetTrustLevel)(
        __x_ABI_CWindows_CUI_CComposition_CIInsetClip *This,
        TrustLevel *trustLevel);

    /*** IInsetClip methods ***/
    HRESULT (STDMETHODCALLTYPE *get_BottomInset)(
        __x_ABI_CWindows_CUI_CComposition_CIInsetClip *This,
        FLOAT *value);

    HRESULT (STDMETHODCALLTYPE *put_BottomInset)(
        __x_ABI_CWindows_CUI_CComposition_CIInsetClip *This,
        FLOAT value);

    HRESULT (STDMETHODCALLTYPE *get_LeftInset)(
        __x_ABI_CWindows_CUI_CComposition_CIInsetClip *This,
        FLOAT *value);

    HRESULT (STDMETHODCALLTYPE *put_LeftInset)(
        __x_ABI_CWindows_CUI_CComposition_CIInsetClip *This,
        FLOAT value);

    HRESULT (STDMETHODCALLTYPE *get_RightInset)(
        __x_ABI_CWindows_CUI_CComposition_CIInsetClip *This,
        FLOAT *value);

    HRESULT (STDMETHODCALLTYPE *put_RightInset)(
        __x_ABI_CWindows_CUI_CComposition_CIInsetClip *This,
        FLOAT value);

    HRESULT (STDMETHODCALLTYPE *get_TopInset)(
        __x_ABI_CWindows_CUI_CComposition_CIInsetClip *This,
        FLOAT *value);

    HRESULT (STDMETHODCALLTYPE *put_TopInset)(
        __x_ABI_CWindows_CUI_CComposition_CIInsetClip *This,
        FLOAT value);

    END_INTERFACE
} __x_ABI_CWindows_CUI_CComposition_CIInsetClipVtbl;

interface __x_ABI_CWindows_CUI_CComposition_CIInsetClip {
    CONST_VTBL __x_ABI_CWindows_CUI_CComposition_CIInsetClipVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define __x_ABI_CWindows_CUI_CComposition_CIInsetClip_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define __x_ABI_CWindows_CUI_CComposition_CIInsetClip_AddRef(This) (This)->lpVtbl->AddRef(This)
#define __x_ABI_CWindows_CUI_CComposition_CIInsetClip_Release(This) (This)->lpVtbl->Release(This)
/*** IInspectable methods ***/
#define __x_ABI_CWindows_CUI_CComposition_CIInsetClip_GetIids(This,iidCount,iids) (This)->lpVtbl->GetIids(This,iidCount,iids)
#define __x_ABI_CWindows_CUI_CComposition_CIInsetClip_GetRuntimeClassName(This,className) (This)->lpVtbl->GetRuntimeClassName(This,className)
#define __x_ABI_CWindows_CUI_CComposition_CIInsetClip_GetTrustLevel(This,trustLevel) (This)->lpVtbl->GetTrustLevel(This,trustLevel)
/*** IInsetClip methods ***/
#define __x_ABI_CWindows_CUI_CComposition_CIInsetClip_get_BottomInset(This,value) (This)->lpVtbl->get_BottomInset(This,value)
#define __x_ABI_CWindows_CUI_CComposition_CIInsetClip_put_BottomInset(This,value) (This)->lpVtbl->put_BottomInset(This,value)
#define __x_ABI_CWindows_CUI_CComposition_CIInsetClip_get_LeftInset(This,value) (This)->lpVtbl->get_LeftInset(This,value)
#define __x_ABI_CWindows_CUI_CComposition_CIInsetClip_put_LeftInset(This,value) (This)->lpVtbl->put_LeftInset(This,value)
#define __x_ABI_CWindows_CUI_CComposition_CIInsetClip_get_RightInset(This,value) (This)->lpVtbl->get_RightInset(This,value)
#define __x_ABI_CWindows_CUI_CComposition_CIInsetClip_put_RightInset(This,value) (This)->lpVtbl->put_RightInset(This,value)
#define __x_ABI_CWindows_CUI_CComposition_CIInsetClip_get_TopInset(This,value) (This)->lpVtbl->get_TopInset(This,value)
#define __x_ABI_CWindows_CUI_CComposition_CIInsetClip_put_TopInset(This,value) (This)->lpVtbl->put_TopInset(This,value)
#else
/*** IUnknown methods ***/
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CUI_CComposition_CIInsetClip_QueryInterface(__x_ABI_CWindows_CUI_CComposition_CIInsetClip* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG __x_ABI_CWindows_CUI_CComposition_CIInsetClip_AddRef(__x_ABI_CWindows_CUI_CComposition_CIInsetClip* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG __x_ABI_CWindows_CUI_CComposition_CIInsetClip_Release(__x_ABI_CWindows_CUI_CComposition_CIInsetClip* This) {
    return This->lpVtbl->Release(This);
}
/*** IInspectable methods ***/
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CUI_CComposition_CIInsetClip_GetIids(__x_ABI_CWindows_CUI_CComposition_CIInsetClip* This,ULONG *iidCount,IID **iids) {
    return This->lpVtbl->GetIids(This,iidCount,iids);
}
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CUI_CComposition_CIInsetClip_GetRuntimeClassName(__x_ABI_CWindows_CUI_CComposition_CIInsetClip* This,HSTRING *className) {
    return This->lpVtbl->GetRuntimeClassName(This,className);
}
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CUI_CComposition_CIInsetClip_GetTrustLevel(__x_ABI_CWindows_CUI_CComposition_CIInsetClip* This,TrustLevel *trustLevel) {
    return This->lpVtbl->GetTrustLevel(This,trustLevel);
}
/*** IInsetClip methods ***/
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CUI_CComposition_CIInsetClip_get_BottomInset(__x_ABI_CWindows_CUI_CComposition_CIInsetClip* This,FLOAT *value) {
    return This->lpVtbl->get_BottomInset(This,value);
}
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CUI_CComposition_CIInsetClip_put_BottomInset(__x_ABI_CWindows_CUI_CComposition_CIInsetClip* This,FLOAT value) {
    return This->lpVtbl->put_BottomInset(This,value);
}
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CUI_CComposition_CIInsetClip_get_LeftInset(__x_ABI_CWindows_CUI_CComposition_CIInsetClip* This,FLOAT *value) {
    return This->lpVtbl->get_LeftInset(This,value);
}
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CUI_CComposition_CIInsetClip_put_LeftInset(__x_ABI_CWindows_CUI_CComposition_CIInsetClip* This,FLOAT value) {
    return This->lpVtbl->put_LeftInset(This,value);
}
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CUI_CComposition_CIInsetClip_get_RightInset(__x_ABI_CWindows_CUI_CComposition_CIInsetClip* This,FLOAT *value) {
    return This->lpVtbl->get_RightInset(This,value);
}
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CUI_CComposition_CIInsetClip_put_RightInset(__x_ABI_CWindows_CUI_CComposition_CIInsetClip* This,FLOAT value) {
    return This->lpVtbl->put_RightInset(This,value);
}
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CUI_CComposition_CIInsetClip_get_TopInset(__x_ABI_CWindows_CUI_CComposition_CIInsetClip* This,FLOAT *value) {
    return This->lpVtbl->get_TopInset(This,value);
}
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CUI_CComposition_CIInsetClip_put_TopInset(__x_ABI_CWindows_CUI_CComposition_CIInsetClip* This,FLOAT value) {
    return This->lpVtbl->put_TopInset(This,value);
}
#endif
#ifdef WIDL_using_Windows_UI_Composition
#define IID_IInsetClip IID___x_ABI_CWindows_CUI_CComposition_CIInsetClip
#define IInsetClipVtbl __x_ABI_CWindows_CUI_CComposition_CIInsetClipVtbl
#define IInsetClip __x_ABI_CWindows_CUI_CComposition_CIInsetClip
#define IInsetClip_QueryInterface __x_ABI_CWindows_CUI_CComposition_CIInsetClip_QueryInterface
#define IInsetClip_AddRef __x_ABI_CWindows_CUI_CComposition_CIInsetClip_AddRef
#define IInsetClip_Release __x_ABI_CWindows_CUI_CComposition_CIInsetClip_Release
#define IInsetClip_GetIids __x_ABI_CWindows_CUI_CComposition_CIInsetClip_GetIids
#define IInsetClip_GetRuntimeClassName __x_ABI_CWindows_CUI_CComposition_CIInsetClip_GetRuntimeClassName
#define IInsetClip_GetTrustLevel __x_ABI_CWindows_CUI_CComposition_CIInsetClip_GetTrustLevel
#define IInsetClip_get_BottomInset __x_ABI_CWindows_CUI_CComposition_CIInsetClip_get_BottomInset
#define IInsetClip_put_BottomInset __x_ABI_CWindows_CUI_CComposition_CIInsetClip_put_BottomInset
#define IInsetClip_get_LeftInset __x_ABI_CWindows_CUI_CComposition_CIInsetClip_get_LeftInset
#define IInsetClip_put_LeftInset __x_ABI_CWindows_CUI_CComposition_CIInsetClip_put_LeftInset
#define IInsetClip_get_RightInset __x_ABI_CWindows_CUI_CComposition_CIInsetClip_get_RightInset
#define IInsetClip_put_RightInset __x_ABI_CWindows_CUI_CComposition_CIInsetClip_put_RightInset
#define IInsetClip_get_TopInset __x_ABI_CWindows_CUI_CComposition_CIInsetClip_get_TopInset
#define IInsetClip_put_TopInset __x_ABI_CWindows_CUI_CComposition_CIInsetClip_put_TopInset
#endif /* WIDL_using_Windows_UI_Composition */
#endif

#endif

#endif  /* ____x_ABI_CWindows_CUI_CComposition_CIInsetClip_INTERFACE_DEFINED__ */
#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x20000 */

/*****************************************************************************
 * ILinearEasingFunction interface
 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x20000
#ifndef ____x_ABI_CWindows_CUI_CComposition_CILinearEasingFunction_INTERFACE_DEFINED__
#define ____x_ABI_CWindows_CUI_CComposition_CILinearEasingFunction_INTERFACE_DEFINED__

DEFINE_GUID(IID___x_ABI_CWindows_CUI_CComposition_CILinearEasingFunction, 0x9400975a, 0xc7a6, 0x46b3, 0xac,0xf7, 0x1a,0x26,0x8a,0x0a,0x11,0x7d);
#if defined(__cplusplus) && !defined(CINTERFACE)
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace UI {
            namespace Composition {
                MIDL_INTERFACE("9400975a-c7a6-46b3-acf7-1a268a0a117d")
                ILinearEasingFunction : public IInspectable
                {
                };
            }
        }
    }
}
extern "C" {
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(__x_ABI_CWindows_CUI_CComposition_CILinearEasingFunction, 0x9400975a, 0xc7a6, 0x46b3, 0xac,0xf7, 0x1a,0x26,0x8a,0x0a,0x11,0x7d)
#endif
#else
typedef struct __x_ABI_CWindows_CUI_CComposition_CILinearEasingFunctionVtbl {
    BEGIN_INTERFACE

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

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

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

    /*** IInspectable methods ***/
    HRESULT (STDMETHODCALLTYPE *GetIids)(
        __x_ABI_CWindows_CUI_CComposition_CILinearEasingFunction *This,
        ULONG *iidCount,
        IID **iids);

    HRESULT (STDMETHODCALLTYPE *GetRuntimeClassName)(
        __x_ABI_CWindows_CUI_CComposition_CILinearEasingFunction *This,
        HSTRING *className);

    HRESULT (STDMETHODCALLTYPE *GetTrustLevel)(
        __x_ABI_CWindows_CUI_CComposition_CILinearEasingFunction *This,
        TrustLevel *trustLevel);

    END_INTERFACE
} __x_ABI_CWindows_CUI_CComposition_CILinearEasingFunctionVtbl;

interface __x_ABI_CWindows_CUI_CComposition_CILinearEasingFunction {
    CONST_VTBL __x_ABI_CWindows_CUI_CComposition_CILinearEasingFunctionVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define __x_ABI_CWindows_CUI_CComposition_CILinearEasingFunction_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define __x_ABI_CWindows_CUI_CComposition_CILinearEasingFunction_AddRef(This) (This)->lpVtbl->AddRef(This)
#define __x_ABI_CWindows_CUI_CComposition_CILinearEasingFunction_Release(This) (This)->lpVtbl->Release(This)
/*** IInspectable methods ***/
#define __x_ABI_CWindows_CUI_CComposition_CILinearEasingFunction_GetIids(This,iidCount,iids) (This)->lpVtbl->GetIids(This,iidCount,iids)
#define __x_ABI_CWindows_CUI_CComposition_CILinearEasingFunction_GetRuntimeClassName(This,className) (This)->lpVtbl->GetRuntimeClassName(This,className)
#define __x_ABI_CWindows_CUI_CComposition_CILinearEasingFunction_GetTrustLevel(This,trustLevel) (This)->lpVtbl->GetTrustLevel(This,trustLevel)
#else
/*** IUnknown methods ***/
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CUI_CComposition_CILinearEasingFunction_QueryInterface(__x_ABI_CWindows_CUI_CComposition_CILinearEasingFunction* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG __x_ABI_CWindows_CUI_CComposition_CILinearEasingFunction_AddRef(__x_ABI_CWindows_CUI_CComposition_CILinearEasingFunction* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG __x_ABI_CWindows_CUI_CComposition_CILinearEasingFunction_Release(__x_ABI_CWindows_CUI_CComposition_CILinearEasingFunction* This) {
    return This->lpVtbl->Release(This);
}
/*** IInspectable methods ***/
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CUI_CComposition_CILinearEasingFunction_GetIids(__x_ABI_CWindows_CUI_CComposition_CILinearEasingFunction* This,ULONG *iidCount,IID **iids) {
    return This->lpVtbl->GetIids(This,iidCount,iids);
}
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CUI_CComposition_CILinearEasingFunction_GetRuntimeClassName(__x_ABI_CWindows_CUI_CComposition_CILinearEasingFunction* This,HSTRING *className) {
    return This->lpVtbl->GetRuntimeClassName(This,className);
}
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CUI_CComposition_CILinearEasingFunction_GetTrustLevel(__x_ABI_CWindows_CUI_CComposition_CILinearEasingFunction* This,TrustLevel *trustLevel) {
    return This->lpVtbl->GetTrustLevel(This,trustLevel);
}
#endif
#ifdef WIDL_using_Windows_UI_Composition
#define IID_ILinearEasingFunction IID___x_ABI_CWindows_CUI_CComposition_CILinearEasingFunction
#define ILinearEasingFunctionVtbl __x_ABI_CWindows_CUI_CComposition_CILinearEasingFunctionVtbl
#define ILinearEasingFunction __x_ABI_CWindows_CUI_CComposition_CILinearEasingFunction
#define ILinearEasingFunction_QueryInterface __x_ABI_CWindows_CUI_CComposition_CILinearEasingFunction_QueryInterface
#define ILinearEasingFunction_AddRef __x_ABI_CWindows_CUI_CComposition_CILinearEasingFunction_AddRef
#define ILinearEasingFunction_Release __x_ABI_CWindows_CUI_CComposition_CILinearEasingFunction_Release
#define ILinearEasingFunction_GetIids __x_ABI_CWindows_CUI_CComposition_CILinearEasingFunction_GetIids
#define ILinearEasingFunction_GetRuntimeClassName __x_ABI_CWindows_CUI_CComposition_CILinearEasingFunction_GetRuntimeClassName
#define ILinearEasingFunction_GetTrustLevel __x_ABI_CWindows_CUI_CComposition_CILinearEasingFunction_GetTrustLevel
#endif /* WIDL_using_Windows_UI_Composition */
#endif

#endif

#endif  /* ____x_ABI_CWindows_CUI_CComposition_CILinearEasingFunction_INTERFACE_DEFINED__ */
#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x20000 */

/*****************************************************************************
 * IQuaternionKeyFrameAnimation interface
 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x20000
#ifndef ____x_ABI_CWindows_CUI_CComposition_CIQuaternionKeyFrameAnimation_INTERFACE_DEFINED__
#define ____x_ABI_CWindows_CUI_CComposition_CIQuaternionKeyFrameAnimation_INTERFACE_DEFINED__

DEFINE_GUID(IID___x_ABI_CWindows_CUI_CComposition_CIQuaternionKeyFrameAnimation, 0x404e5835, 0xecf6, 0x4240, 0x85,0x20, 0x67,0x12,0x79,0xcf,0x36,0xbc);
#if defined(__cplusplus) && !defined(CINTERFACE)
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace UI {
            namespace Composition {
                MIDL_INTERFACE("404e5835-ecf6-4240-8520-671279cf36bc")
                IQuaternionKeyFrameAnimation : public IInspectable
                {
                    virtual HRESULT STDMETHODCALLTYPE InsertKeyFrame(
                        FLOAT key,
                        struct Quaternion value) = 0;

                    virtual HRESULT STDMETHODCALLTYPE InsertKeyFrameWithEasingFunction(
                        FLOAT key,
                        struct Quaternion value,
                        ABI::Windows::UI::Composition::ICompositionEasingFunction *function) = 0;

                };
            }
        }
    }
}
extern "C" {
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(__x_ABI_CWindows_CUI_CComposition_CIQuaternionKeyFrameAnimation, 0x404e5835, 0xecf6, 0x4240, 0x85,0x20, 0x67,0x12,0x79,0xcf,0x36,0xbc)
#endif
#else
typedef struct __x_ABI_CWindows_CUI_CComposition_CIQuaternionKeyFrameAnimationVtbl {
    BEGIN_INTERFACE

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

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

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

    /*** IInspectable methods ***/
    HRESULT (STDMETHODCALLTYPE *GetIids)(
        __x_ABI_CWindows_CUI_CComposition_CIQuaternionKeyFrameAnimation *This,
        ULONG *iidCount,
        IID **iids);

    HRESULT (STDMETHODCALLTYPE *GetRuntimeClassName)(
        __x_ABI_CWindows_CUI_CComposition_CIQuaternionKeyFrameAnimation *This,
        HSTRING *className);

    HRESULT (STDMETHODCALLTYPE *GetTrustLevel)(
        __x_ABI_CWindows_CUI_CComposition_CIQuaternionKeyFrameAnimation *This,
        TrustLevel *trustLevel);

    /*** IQuaternionKeyFrameAnimation methods ***/
    HRESULT (STDMETHODCALLTYPE *InsertKeyFrame)(
        __x_ABI_CWindows_CUI_CComposition_CIQuaternionKeyFrameAnimation *This,
        FLOAT key,
        struct __x_ABI_CWindows_CFoundation_CNumerics_CQuaternion value);

    HRESULT (STDMETHODCALLTYPE *InsertKeyFrameWithEasingFunction)(
        __x_ABI_CWindows_CUI_CComposition_CIQuaternionKeyFrameAnimation *This,
        FLOAT key,
        struct __x_ABI_CWindows_CFoundation_CNumerics_CQuaternion value,
        __x_ABI_CWindows_CUI_CComposition_CICompositionEasingFunction *function);

    END_INTERFACE
} __x_ABI_CWindows_CUI_CComposition_CIQuaternionKeyFrameAnimationVtbl;

interface __x_ABI_CWindows_CUI_CComposition_CIQuaternionKeyFrameAnimation {
    CONST_VTBL __x_ABI_CWindows_CUI_CComposition_CIQuaternionKeyFrameAnimationVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define __x_ABI_CWindows_CUI_CComposition_CIQuaternionKeyFrameAnimation_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define __x_ABI_CWindows_CUI_CComposition_CIQuaternionKeyFrameAnimation_AddRef(This) (This)->lpVtbl->AddRef(This)
#define __x_ABI_CWindows_CUI_CComposition_CIQuaternionKeyFrameAnimation_Release(This) (This)->lpVtbl->Release(This)
/*** IInspectable methods ***/
#define __x_ABI_CWindows_CUI_CComposition_CIQuaternionKeyFrameAnimation_GetIids(This,iidCount,iids) (This)->lpVtbl->GetIids(This,iidCount,iids)
#define __x_ABI_CWindows_CUI_CComposition_CIQuaternionKeyFrameAnimation_GetRuntimeClassName(This,className) (This)->lpVtbl->GetRuntimeClassName(This,className)
#define __x_ABI_CWindows_CUI_CComposition_CIQuaternionKeyFrameAnimation_GetTrustLevel(This,trustLevel) (This)->lpVtbl->GetTrustLevel(This,trustLevel)
/*** IQuaternionKeyFrameAnimation methods ***/
#define __x_ABI_CWindows_CUI_CComposition_CIQuaternionKeyFrameAnimation_InsertKeyFrame(This,key,value) (This)->lpVtbl->InsertKeyFrame(This,key,value)
#define __x_ABI_CWindows_CUI_CComposition_CIQuaternionKeyFrameAnimation_InsertKeyFrameWithEasingFunction(This,key,value,function) (This)->lpVtbl->InsertKeyFrameWithEasingFunction(This,key,value,function)
#else
/*** IUnknown methods ***/
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CUI_CComposition_CIQuaternionKeyFrameAnimation_QueryInterface(__x_ABI_CWindows_CUI_CComposition_CIQuaternionKeyFrameAnimation* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG __x_ABI_CWindows_CUI_CComposition_CIQuaternionKeyFrameAnimation_AddRef(__x_ABI_CWindows_CUI_CComposition_CIQuaternionKeyFrameAnimation* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG __x_ABI_CWindows_CUI_CComposition_CIQuaternionKeyFrameAnimation_Release(__x_ABI_CWindows_CUI_CComposition_CIQuaternionKeyFrameAnimation* This) {
    return This->lpVtbl->Release(This);
}
/*** IInspectable methods ***/
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CUI_CComposition_CIQuaternionKeyFrameAnimation_GetIids(__x_ABI_CWindows_CUI_CComposition_CIQuaternionKeyFrameAnimation* This,ULONG *iidCount,IID **iids) {
    return This->lpVtbl->GetIids(This,iidCount,iids);
}
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CUI_CComposition_CIQuaternionKeyFrameAnimation_GetRuntimeClassName(__x_ABI_CWindows_CUI_CComposition_CIQuaternionKeyFrameAnimation* This,HSTRING *className) {
    return This->lpVtbl->GetRuntimeClassName(This,className);
}
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CUI_CComposition_CIQuaternionKeyFrameAnimation_GetTrustLevel(__x_ABI_CWindows_CUI_CComposition_CIQuaternionKeyFrameAnimation* This,TrustLevel *trustLevel) {
    return This->lpVtbl->GetTrustLevel(This,trustLevel);
}
/*** IQuaternionKeyFrameAnimation methods ***/
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CUI_CComposition_CIQuaternionKeyFrameAnimation_InsertKeyFrame(__x_ABI_CWindows_CUI_CComposition_CIQuaternionKeyFrameAnimation* This,FLOAT key,struct __x_ABI_CWindows_CFoundation_CNumerics_CQuaternion value) {
    return This->lpVtbl->InsertKeyFrame(This,key,value);
}
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CUI_CComposition_CIQuaternionKeyFrameAnimation_InsertKeyFrameWithEasingFunction(__x_ABI_CWindows_CUI_CComposition_CIQuaternionKeyFrameAnimation* This,FLOAT key,struct __x_ABI_CWindows_CFoundation_CNumerics_CQuaternion value,__x_ABI_CWindows_CUI_CComposition_CICompositionEasingFunction *function) {
    return This->lpVtbl->InsertKeyFrameWithEasingFunction(This,key,value,function);
}
#endif
#ifdef WIDL_using_Windows_UI_Composition
#define IID_IQuaternionKeyFrameAnimation IID___x_ABI_CWindows_CUI_CComposition_CIQuaternionKeyFrameAnimation
#define IQuaternionKeyFrameAnimationVtbl __x_ABI_CWindows_CUI_CComposition_CIQuaternionKeyFrameAnimationVtbl
#define IQuaternionKeyFrameAnimation __x_ABI_CWindows_CUI_CComposition_CIQuaternionKeyFrameAnimation
#define IQuaternionKeyFrameAnimation_QueryInterface __x_ABI_CWindows_CUI_CComposition_CIQuaternionKeyFrameAnimation_QueryInterface
#define IQuaternionKeyFrameAnimation_AddRef __x_ABI_CWindows_CUI_CComposition_CIQuaternionKeyFrameAnimation_AddRef
#define IQuaternionKeyFrameAnimation_Release __x_ABI_CWindows_CUI_CComposition_CIQuaternionKeyFrameAnimation_Release
#define IQuaternionKeyFrameAnimation_GetIids __x_ABI_CWindows_CUI_CComposition_CIQuaternionKeyFrameAnimation_GetIids
#define IQuaternionKeyFrameAnimation_GetRuntimeClassName __x_ABI_CWindows_CUI_CComposition_CIQuaternionKeyFrameAnimation_GetRuntimeClassName
#define IQuaternionKeyFrameAnimation_GetTrustLevel __x_ABI_CWindows_CUI_CComposition_CIQuaternionKeyFrameAnimation_GetTrustLevel
#define IQuaternionKeyFrameAnimation_InsertKeyFrame __x_ABI_CWindows_CUI_CComposition_CIQuaternionKeyFrameAnimation_InsertKeyFrame
#define IQuaternionKeyFrameAnimation_InsertKeyFrameWithEasingFunction __x_ABI_CWindows_CUI_CComposition_CIQuaternionKeyFrameAnimation_InsertKeyFrameWithEasingFunction
#endif /* WIDL_using_Windows_UI_Composition */
#endif

#endif

#endif  /* ____x_ABI_CWindows_CUI_CComposition_CIQuaternionKeyFrameAnimation_INTERFACE_DEFINED__ */
#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x20000 */

/*****************************************************************************
 * IRenderingDeviceReplacedEventArgs interface
 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x20000
#ifndef ____x_ABI_CWindows_CUI_CComposition_CIRenderingDeviceReplacedEventArgs_INTERFACE_DEFINED__
#define ____x_ABI_CWindows_CUI_CComposition_CIRenderingDeviceReplacedEventArgs_INTERFACE_DEFINED__

DEFINE_GUID(IID___x_ABI_CWindows_CUI_CComposition_CIRenderingDeviceReplacedEventArgs, 0x3a31ac7d, 0x28bf, 0x4e7a, 0x85,0x24, 0x71,0x67,0x9d,0x48,0x0f,0x38);
#if defined(__cplusplus) && !defined(CINTERFACE)
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace UI {
            namespace Composition {
                MIDL_INTERFACE("3a31ac7d-28bf-4e7a-8524-71679d480f38")
                IRenderingDeviceReplacedEventArgs : public IInspectable
                {
                    virtual HRESULT STDMETHODCALLTYPE get_GraphicsDevice(
                        ABI::Windows::UI::Composition::ICompositionGraphicsDevice **value) = 0;

                };
            }
        }
    }
}
extern "C" {
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(__x_ABI_CWindows_CUI_CComposition_CIRenderingDeviceReplacedEventArgs, 0x3a31ac7d, 0x28bf, 0x4e7a, 0x85,0x24, 0x71,0x67,0x9d,0x48,0x0f,0x38)
#endif
#else
typedef struct __x_ABI_CWindows_CUI_CComposition_CIRenderingDeviceReplacedEventArgsVtbl {
    BEGIN_INTERFACE

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

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

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

    /*** IInspectable methods ***/
    HRESULT (STDMETHODCALLTYPE *GetIids)(
        __x_ABI_CWindows_CUI_CComposition_CIRenderingDeviceReplacedEventArgs *This,
        ULONG *iidCount,
        IID **iids);

    HRESULT (STDMETHODCALLTYPE *GetRuntimeClassName)(
        __x_ABI_CWindows_CUI_CComposition_CIRenderingDeviceReplacedEventArgs *This,
        HSTRING *className);

    HRESULT (STDMETHODCALLTYPE *GetTrustLevel)(
        __x_ABI_CWindows_CUI_CComposition_CIRenderingDeviceReplacedEventArgs *This,
        TrustLevel *trustLevel);

    /*** IRenderingDeviceReplacedEventArgs methods ***/
    HRESULT (STDMETHODCALLTYPE *get_GraphicsDevice)(
        __x_ABI_CWindows_CUI_CComposition_CIRenderingDeviceReplacedEventArgs *This,
        __x_ABI_CWindows_CUI_CComposition_CICompositionGraphicsDevice **value);

    END_INTERFACE
} __x_ABI_CWindows_CUI_CComposition_CIRenderingDeviceReplacedEventArgsVtbl;

interface __x_ABI_CWindows_CUI_CComposition_CIRenderingDeviceReplacedEventArgs {
    CONST_VTBL __x_ABI_CWindows_CUI_CComposition_CIRenderingDeviceReplacedEventArgsVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define __x_ABI_CWindows_CUI_CComposition_CIRenderingDeviceReplacedEventArgs_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define __x_ABI_CWindows_CUI_CComposition_CIRenderingDeviceReplacedEventArgs_AddRef(This) (This)->lpVtbl->AddRef(This)
#define __x_ABI_CWindows_CUI_CComposition_CIRenderingDeviceReplacedEventArgs_Release(This) (This)->lpVtbl->Release(This)
/*** IInspectable methods ***/
#define __x_ABI_CWindows_CUI_CComposition_CIRenderingDeviceReplacedEventArgs_GetIids(This,iidCount,iids) (This)->lpVtbl->GetIids(This,iidCount,iids)
#define __x_ABI_CWindows_CUI_CComposition_CIRenderingDeviceReplacedEventArgs_GetRuntimeClassName(This,className) (This)->lpVtbl->GetRuntimeClassName(This,className)
#define __x_ABI_CWindows_CUI_CComposition_CIRenderingDeviceReplacedEventArgs_GetTrustLevel(This,trustLevel) (This)->lpVtbl->GetTrustLevel(This,trustLevel)
/*** IRenderingDeviceReplacedEventArgs methods ***/
#define __x_ABI_CWindows_CUI_CComposition_CIRenderingDeviceReplacedEventArgs_get_GraphicsDevice(This,value) (This)->lpVtbl->get_GraphicsDevice(This,value)
#else
/*** IUnknown methods ***/
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CUI_CComposition_CIRenderingDeviceReplacedEventArgs_QueryInterface(__x_ABI_CWindows_CUI_CComposition_CIRenderingDeviceReplacedEventArgs* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG __x_ABI_CWindows_CUI_CComposition_CIRenderingDeviceReplacedEventArgs_AddRef(__x_ABI_CWindows_CUI_CComposition_CIRenderingDeviceReplacedEventArgs* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG __x_ABI_CWindows_CUI_CComposition_CIRenderingDeviceReplacedEventArgs_Release(__x_ABI_CWindows_CUI_CComposition_CIRenderingDeviceReplacedEventArgs* This) {
    return This->lpVtbl->Release(This);
}
/*** IInspectable methods ***/
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CUI_CComposition_CIRenderingDeviceReplacedEventArgs_GetIids(__x_ABI_CWindows_CUI_CComposition_CIRenderingDeviceReplacedEventArgs* This,ULONG *iidCount,IID **iids) {
    return This->lpVtbl->GetIids(This,iidCount,iids);
}
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CUI_CComposition_CIRenderingDeviceReplacedEventArgs_GetRuntimeClassName(__x_ABI_CWindows_CUI_CComposition_CIRenderingDeviceReplacedEventArgs* This,HSTRING *className) {
    return This->lpVtbl->GetRuntimeClassName(This,className);
}
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CUI_CComposition_CIRenderingDeviceReplacedEventArgs_GetTrustLevel(__x_ABI_CWindows_CUI_CComposition_CIRenderingDeviceReplacedEventArgs* This,TrustLevel *trustLevel) {
    return This->lpVtbl->GetTrustLevel(This,trustLevel);
}
/*** IRenderingDeviceReplacedEventArgs methods ***/
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CUI_CComposition_CIRenderingDeviceReplacedEventArgs_get_GraphicsDevice(__x_ABI_CWindows_CUI_CComposition_CIRenderingDeviceReplacedEventArgs* This,__x_ABI_CWindows_CUI_CComposition_CICompositionGraphicsDevice **value) {
    return This->lpVtbl->get_GraphicsDevice(This,value);
}
#endif
#ifdef WIDL_using_Windows_UI_Composition
#define IID_IRenderingDeviceReplacedEventArgs IID___x_ABI_CWindows_CUI_CComposition_CIRenderingDeviceReplacedEventArgs
#define IRenderingDeviceReplacedEventArgsVtbl __x_ABI_CWindows_CUI_CComposition_CIRenderingDeviceReplacedEventArgsVtbl
#define IRenderingDeviceReplacedEventArgs __x_ABI_CWindows_CUI_CComposition_CIRenderingDeviceReplacedEventArgs
#define IRenderingDeviceReplacedEventArgs_QueryInterface __x_ABI_CWindows_CUI_CComposition_CIRenderingDeviceReplacedEventArgs_QueryInterface
#define IRenderingDeviceReplacedEventArgs_AddRef __x_ABI_CWindows_CUI_CComposition_CIRenderingDeviceReplacedEventArgs_AddRef
#define IRenderingDeviceReplacedEventArgs_Release __x_ABI_CWindows_CUI_CComposition_CIRenderingDeviceReplacedEventArgs_Release
#define IRenderingDeviceReplacedEventArgs_GetIids __x_ABI_CWindows_CUI_CComposition_CIRenderingDeviceReplacedEventArgs_GetIids
#define IRenderingDeviceReplacedEventArgs_GetRuntimeClassName __x_ABI_CWindows_CUI_CComposition_CIRenderingDeviceReplacedEventArgs_GetRuntimeClassName
#define IRenderingDeviceReplacedEventArgs_GetTrustLevel __x_ABI_CWindows_CUI_CComposition_CIRenderingDeviceReplacedEventArgs_GetTrustLevel
#define IRenderingDeviceReplacedEventArgs_get_GraphicsDevice __x_ABI_CWindows_CUI_CComposition_CIRenderingDeviceReplacedEventArgs_get_GraphicsDevice
#endif /* WIDL_using_Windows_UI_Composition */
#endif

#endif

#endif  /* ____x_ABI_CWindows_CUI_CComposition_CIRenderingDeviceReplacedEventArgs_INTERFACE_DEFINED__ */
#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x20000 */

/*****************************************************************************
 * IScalarKeyFrameAnimation interface
 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x20000
#ifndef ____x_ABI_CWindows_CUI_CComposition_CIScalarKeyFrameAnimation_INTERFACE_DEFINED__
#define ____x_ABI_CWindows_CUI_CComposition_CIScalarKeyFrameAnimation_INTERFACE_DEFINED__

DEFINE_GUID(IID___x_ABI_CWindows_CUI_CComposition_CIScalarKeyFrameAnimation, 0xae288fa9, 0x252c, 0x4b95, 0xa7,0x25, 0xbf,0x85,0xe3,0x80,0x00,0xa1);
#if defined(__cplusplus) && !defined(CINTERFACE)
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace UI {
            namespace Composition {
                MIDL_INTERFACE("ae288fa9-252c-4b95-a725-bf85e38000a1")
                IScalarKeyFrameAnimation : public IInspectable
                {
                    virtual HRESULT STDMETHODCALLTYPE InsertKeyFrame(
                        FLOAT key,
                        FLOAT value) = 0;

                    virtual HRESULT STDMETHODCALLTYPE InsertKeyFrameWithEasingFunction(
                        FLOAT key,
                        FLOAT value,
                        ABI::Windows::UI::Composition::ICompositionEasingFunction *function) = 0;

                };
            }
        }
    }
}
extern "C" {
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(__x_ABI_CWindows_CUI_CComposition_CIScalarKeyFrameAnimation, 0xae288fa9, 0x252c, 0x4b95, 0xa7,0x25, 0xbf,0x85,0xe3,0x80,0x00,0xa1)
#endif
#else
typedef struct __x_ABI_CWindows_CUI_CComposition_CIScalarKeyFrameAnimationVtbl {
    BEGIN_INTERFACE

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

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

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

    /*** IInspectable methods ***/
    HRESULT (STDMETHODCALLTYPE *GetIids)(
        __x_ABI_CWindows_CUI_CComposition_CIScalarKeyFrameAnimation *This,
        ULONG *iidCount,
        IID **iids);

    HRESULT (STDMETHODCALLTYPE *GetRuntimeClassName)(
        __x_ABI_CWindows_CUI_CComposition_CIScalarKeyFrameAnimation *This,
        HSTRING *className);

    HRESULT (STDMETHODCALLTYPE *GetTrustLevel)(
        __x_ABI_CWindows_CUI_CComposition_CIScalarKeyFrameAnimation *This,
        TrustLevel *trustLevel);

    /*** IScalarKeyFrameAnimation methods ***/
    HRESULT (STDMETHODCALLTYPE *InsertKeyFrame)(
        __x_ABI_CWindows_CUI_CComposition_CIScalarKeyFrameAnimation *This,
        FLOAT key,
        FLOAT value);

    HRESULT (STDMETHODCALLTYPE *InsertKeyFrameWithEasingFunction)(
        __x_ABI_CWindows_CUI_CComposition_CIScalarKeyFrameAnimation *This,
        FLOAT key,
        FLOAT value,
        __x_ABI_CWindows_CUI_CComposition_CICompositionEasingFunction *function);

    END_INTERFACE
} __x_ABI_CWindows_CUI_CComposition_CIScalarKeyFrameAnimationVtbl;

interface __x_ABI_CWindows_CUI_CComposition_CIScalarKeyFrameAnimation {
    CONST_VTBL __x_ABI_CWindows_CUI_CComposition_CIScalarKeyFrameAnimationVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define __x_ABI_CWindows_CUI_CComposition_CIScalarKeyFrameAnimation_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define __x_ABI_CWindows_CUI_CComposition_CIScalarKeyFrameAnimation_AddRef(This) (This)->lpVtbl->AddRef(This)
#define __x_ABI_CWindows_CUI_CComposition_CIScalarKeyFrameAnimation_Release(This) (This)->lpVtbl->Release(This)
/*** IInspectable methods ***/
#define __x_ABI_CWindows_CUI_CComposition_CIScalarKeyFrameAnimation_GetIids(This,iidCount,iids) (This)->lpVtbl->GetIids(This,iidCount,iids)
#define __x_ABI_CWindows_CUI_CComposition_CIScalarKeyFrameAnimation_GetRuntimeClassName(This,className) (This)->lpVtbl->GetRuntimeClassName(This,className)
#define __x_ABI_CWindows_CUI_CComposition_CIScalarKeyFrameAnimation_GetTrustLevel(This,trustLevel) (This)->lpVtbl->GetTrustLevel(This,trustLevel)
/*** IScalarKeyFrameAnimation methods ***/
#define __x_ABI_CWindows_CUI_CComposition_CIScalarKeyFrameAnimation_InsertKeyFrame(This,key,value) (This)->lpVtbl->InsertKeyFrame(This,key,value)
#define __x_ABI_CWindows_CUI_CComposition_CIScalarKeyFrameAnimation_InsertKeyFrameWithEasingFunction(This,key,value,function) (This)->lpVtbl->InsertKeyFrameWithEasingFunction(This,key,value,function)
#else
/*** IUnknown methods ***/
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CUI_CComposition_CIScalarKeyFrameAnimation_QueryInterface(__x_ABI_CWindows_CUI_CComposition_CIScalarKeyFrameAnimation* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG __x_ABI_CWindows_CUI_CComposition_CIScalarKeyFrameAnimation_AddRef(__x_ABI_CWindows_CUI_CComposition_CIScalarKeyFrameAnimation* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG __x_ABI_CWindows_CUI_CComposition_CIScalarKeyFrameAnimation_Release(__x_ABI_CWindows_CUI_CComposition_CIScalarKeyFrameAnimation* This) {
    return This->lpVtbl->Release(This);
}
/*** IInspectable methods ***/
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CUI_CComposition_CIScalarKeyFrameAnimation_GetIids(__x_ABI_CWindows_CUI_CComposition_CIScalarKeyFrameAnimation* This,ULONG *iidCount,IID **iids) {
    return This->lpVtbl->GetIids(This,iidCount,iids);
}
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CUI_CComposition_CIScalarKeyFrameAnimation_GetRuntimeClassName(__x_ABI_CWindows_CUI_CComposition_CIScalarKeyFrameAnimation* This,HSTRING *className) {
    return This->lpVtbl->GetRuntimeClassName(This,className);
}
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CUI_CComposition_CIScalarKeyFrameAnimation_GetTrustLevel(__x_ABI_CWindows_CUI_CComposition_CIScalarKeyFrameAnimation* This,TrustLevel *trustLevel) {
    return This->lpVtbl->GetTrustLevel(This,trustLevel);
}
/*** IScalarKeyFrameAnimation methods ***/
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CUI_CComposition_CIScalarKeyFrameAnimation_InsertKeyFrame(__x_ABI_CWindows_CUI_CComposition_CIScalarKeyFrameAnimation* This,FLOAT key,FLOAT value) {
    return This->lpVtbl->InsertKeyFrame(This,key,value);
}
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CUI_CComposition_CIScalarKeyFrameAnimation_InsertKeyFrameWithEasingFunction(__x_ABI_CWindows_CUI_CComposition_CIScalarKeyFrameAnimation* This,FLOAT key,FLOAT value,__x_ABI_CWindows_CUI_CComposition_CICompositionEasingFunction *function) {
    return This->lpVtbl->InsertKeyFrameWithEasingFunction(This,key,value,function);
}
#endif
#ifdef WIDL_using_Windows_UI_Composition
#define IID_IScalarKeyFrameAnimation IID___x_ABI_CWindows_CUI_CComposition_CIScalarKeyFrameAnimation
#define IScalarKeyFrameAnimationVtbl __x_ABI_CWindows_CUI_CComposition_CIScalarKeyFrameAnimationVtbl
#define IScalarKeyFrameAnimation __x_ABI_CWindows_CUI_CComposition_CIScalarKeyFrameAnimation
#define IScalarKeyFrameAnimation_QueryInterface __x_ABI_CWindows_CUI_CComposition_CIScalarKeyFrameAnimation_QueryInterface
#define IScalarKeyFrameAnimation_AddRef __x_ABI_CWindows_CUI_CComposition_CIScalarKeyFrameAnimation_AddRef
#define IScalarKeyFrameAnimation_Release __x_ABI_CWindows_CUI_CComposition_CIScalarKeyFrameAnimation_Release
#define IScalarKeyFrameAnimation_GetIids __x_ABI_CWindows_CUI_CComposition_CIScalarKeyFrameAnimation_GetIids
#define IScalarKeyFrameAnimation_GetRuntimeClassName __x_ABI_CWindows_CUI_CComposition_CIScalarKeyFrameAnimation_GetRuntimeClassName
#define IScalarKeyFrameAnimation_GetTrustLevel __x_ABI_CWindows_CUI_CComposition_CIScalarKeyFrameAnimation_GetTrustLevel
#define IScalarKeyFrameAnimation_InsertKeyFrame __x_ABI_CWindows_CUI_CComposition_CIScalarKeyFrameAnimation_InsertKeyFrame
#define IScalarKeyFrameAnimation_InsertKeyFrameWithEasingFunction __x_ABI_CWindows_CUI_CComposition_CIScalarKeyFrameAnimation_InsertKeyFrameWithEasingFunction
#endif /* WIDL_using_Windows_UI_Composition */
#endif

#endif

#endif  /* ____x_ABI_CWindows_CUI_CComposition_CIScalarKeyFrameAnimation_INTERFACE_DEFINED__ */
#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x20000 */

/*****************************************************************************
 * ISpriteVisual interface
 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x20000
#ifndef ____x_ABI_CWindows_CUI_CComposition_CISpriteVisual_INTERFACE_DEFINED__
#define ____x_ABI_CWindows_CUI_CComposition_CISpriteVisual_INTERFACE_DEFINED__

DEFINE_GUID(IID___x_ABI_CWindows_CUI_CComposition_CISpriteVisual, 0x08e05581, 0x1ad1, 0x4f97, 0x97,0x57, 0x40,0x2d,0x76,0xe4,0x23,0x3b);
#if defined(__cplusplus) && !defined(CINTERFACE)
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace UI {
            namespace Composition {
                MIDL_INTERFACE("08e05581-1ad1-4f97-9757-402d76e4233b")
                ISpriteVisual : public IInspectable
                {
                    virtual HRESULT STDMETHODCALLTYPE get_Brush(
                        ABI::Windows::UI::Composition::ICompositionBrush **value) = 0;

                    virtual HRESULT STDMETHODCALLTYPE put_Brush(
                        ABI::Windows::UI::Composition::ICompositionBrush *value) = 0;

                };
            }
        }
    }
}
extern "C" {
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(__x_ABI_CWindows_CUI_CComposition_CISpriteVisual, 0x08e05581, 0x1ad1, 0x4f97, 0x97,0x57, 0x40,0x2d,0x76,0xe4,0x23,0x3b)
#endif
#else
typedef struct __x_ABI_CWindows_CUI_CComposition_CISpriteVisualVtbl {
    BEGIN_INTERFACE

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

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

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

    /*** IInspectable methods ***/
    HRESULT (STDMETHODCALLTYPE *GetIids)(
        __x_ABI_CWindows_CUI_CComposition_CISpriteVisual *This,
        ULONG *iidCount,
        IID **iids);

    HRESULT (STDMETHODCALLTYPE *GetRuntimeClassName)(
        __x_ABI_CWindows_CUI_CComposition_CISpriteVisual *This,
        HSTRING *className);

    HRESULT (STDMETHODCALLTYPE *GetTrustLevel)(
        __x_ABI_CWindows_CUI_CComposition_CISpriteVisual *This,
        TrustLevel *trustLevel);

    /*** ISpriteVisual methods ***/
    HRESULT (STDMETHODCALLTYPE *get_Brush)(
        __x_ABI_CWindows_CUI_CComposition_CISpriteVisual *This,
        __x_ABI_CWindows_CUI_CComposition_CICompositionBrush **value);

    HRESULT (STDMETHODCALLTYPE *put_Brush)(
        __x_ABI_CWindows_CUI_CComposition_CISpriteVisual *This,
        __x_ABI_CWindows_CUI_CComposition_CICompositionBrush *value);

    END_INTERFACE
} __x_ABI_CWindows_CUI_CComposition_CISpriteVisualVtbl;

interface __x_ABI_CWindows_CUI_CComposition_CISpriteVisual {
    CONST_VTBL __x_ABI_CWindows_CUI_CComposition_CISpriteVisualVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define __x_ABI_CWindows_CUI_CComposition_CISpriteVisual_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define __x_ABI_CWindows_CUI_CComposition_CISpriteVisual_AddRef(This) (This)->lpVtbl->AddRef(This)
#define __x_ABI_CWindows_CUI_CComposition_CISpriteVisual_Release(This) (This)->lpVtbl->Release(This)
/*** IInspectable methods ***/
#define __x_ABI_CWindows_CUI_CComposition_CISpriteVisual_GetIids(This,iidCount,iids) (This)->lpVtbl->GetIids(This,iidCount,iids)
#define __x_ABI_CWindows_CUI_CComposition_CISpriteVisual_GetRuntimeClassName(This,className) (This)->lpVtbl->GetRuntimeClassName(This,className)
#define __x_ABI_CWindows_CUI_CComposition_CISpriteVisual_GetTrustLevel(This,trustLevel) (This)->lpVtbl->GetTrustLevel(This,trustLevel)
/*** ISpriteVisual methods ***/
#define __x_ABI_CWindows_CUI_CComposition_CISpriteVisual_get_Brush(This,value) (This)->lpVtbl->get_Brush(This,value)
#define __x_ABI_CWindows_CUI_CComposition_CISpriteVisual_put_Brush(This,value) (This)->lpVtbl->put_Brush(This,value)
#else
/*** IUnknown methods ***/
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CUI_CComposition_CISpriteVisual_QueryInterface(__x_ABI_CWindows_CUI_CComposition_CISpriteVisual* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG __x_ABI_CWindows_CUI_CComposition_CISpriteVisual_AddRef(__x_ABI_CWindows_CUI_CComposition_CISpriteVisual* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG __x_ABI_CWindows_CUI_CComposition_CISpriteVisual_Release(__x_ABI_CWindows_CUI_CComposition_CISpriteVisual* This) {
    return This->lpVtbl->Release(This);
}
/*** IInspectable methods ***/
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CUI_CComposition_CISpriteVisual_GetIids(__x_ABI_CWindows_CUI_CComposition_CISpriteVisual* This,ULONG *iidCount,IID **iids) {
    return This->lpVtbl->GetIids(This,iidCount,iids);
}
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CUI_CComposition_CISpriteVisual_GetRuntimeClassName(__x_ABI_CWindows_CUI_CComposition_CISpriteVisual* This,HSTRING *className) {
    return This->lpVtbl->GetRuntimeClassName(This,className);
}
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CUI_CComposition_CISpriteVisual_GetTrustLevel(__x_ABI_CWindows_CUI_CComposition_CISpriteVisual* This,TrustLevel *trustLevel) {
    return This->lpVtbl->GetTrustLevel(This,trustLevel);
}
/*** ISpriteVisual methods ***/
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CUI_CComposition_CISpriteVisual_get_Brush(__x_ABI_CWindows_CUI_CComposition_CISpriteVisual* This,__x_ABI_CWindows_CUI_CComposition_CICompositionBrush **value) {
    return This->lpVtbl->get_Brush(This,value);
}
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CUI_CComposition_CISpriteVisual_put_Brush(__x_ABI_CWindows_CUI_CComposition_CISpriteVisual* This,__x_ABI_CWindows_CUI_CComposition_CICompositionBrush *value) {
    return This->lpVtbl->put_Brush(This,value);
}
#endif
#ifdef WIDL_using_Windows_UI_Composition
#define IID_ISpriteVisual IID___x_ABI_CWindows_CUI_CComposition_CISpriteVisual
#define ISpriteVisualVtbl __x_ABI_CWindows_CUI_CComposition_CISpriteVisualVtbl
#define ISpriteVisual __x_ABI_CWindows_CUI_CComposition_CISpriteVisual
#define ISpriteVisual_QueryInterface __x_ABI_CWindows_CUI_CComposition_CISpriteVisual_QueryInterface
#define ISpriteVisual_AddRef __x_ABI_CWindows_CUI_CComposition_CISpriteVisual_AddRef
#define ISpriteVisual_Release __x_ABI_CWindows_CUI_CComposition_CISpriteVisual_Release
#define ISpriteVisual_GetIids __x_ABI_CWindows_CUI_CComposition_CISpriteVisual_GetIids
#define ISpriteVisual_GetRuntimeClassName __x_ABI_CWindows_CUI_CComposition_CISpriteVisual_GetRuntimeClassName
#define ISpriteVisual_GetTrustLevel __x_ABI_CWindows_CUI_CComposition_CISpriteVisual_GetTrustLevel
#define ISpriteVisual_get_Brush __x_ABI_CWindows_CUI_CComposition_CISpriteVisual_get_Brush
#define ISpriteVisual_put_Brush __x_ABI_CWindows_CUI_CComposition_CISpriteVisual_put_Brush
#endif /* WIDL_using_Windows_UI_Composition */
#endif

#endif

#endif  /* ____x_ABI_CWindows_CUI_CComposition_CISpriteVisual_INTERFACE_DEFINED__ */
#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x20000 */

/*****************************************************************************
 * IVector2KeyFrameAnimation interface
 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x20000
#ifndef ____x_ABI_CWindows_CUI_CComposition_CIVector2KeyFrameAnimation_INTERFACE_DEFINED__
#define ____x_ABI_CWindows_CUI_CComposition_CIVector2KeyFrameAnimation_INTERFACE_DEFINED__

DEFINE_GUID(IID___x_ABI_CWindows_CUI_CComposition_CIVector2KeyFrameAnimation, 0xdf414515, 0x4e29, 0x4f11, 0xb5,0x5e, 0xbf,0x2a,0x6e,0xb3,0x62,0x94);
#if defined(__cplusplus) && !defined(CINTERFACE)
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace UI {
            namespace Composition {
                MIDL_INTERFACE("df414515-4e29-4f11-b55e-bf2a6eb36294")
                IVector2KeyFrameAnimation : public IInspectable
                {
                    virtual HRESULT STDMETHODCALLTYPE InsertKeyFrame(
                        FLOAT key,
                        struct Vector2 value) = 0;

                    virtual HRESULT STDMETHODCALLTYPE InsertKeyFrameWithEasingFunction(
                        FLOAT key,
                        struct Vector2 value,
                        ABI::Windows::UI::Composition::ICompositionEasingFunction *function) = 0;

                };
            }
        }
    }
}
extern "C" {
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(__x_ABI_CWindows_CUI_CComposition_CIVector2KeyFrameAnimation, 0xdf414515, 0x4e29, 0x4f11, 0xb5,0x5e, 0xbf,0x2a,0x6e,0xb3,0x62,0x94)
#endif
#else
typedef struct __x_ABI_CWindows_CUI_CComposition_CIVector2KeyFrameAnimationVtbl {
    BEGIN_INTERFACE

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

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

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

    /*** IInspectable methods ***/
    HRESULT (STDMETHODCALLTYPE *GetIids)(
        __x_ABI_CWindows_CUI_CComposition_CIVector2KeyFrameAnimation *This,
        ULONG *iidCount,
        IID **iids);

    HRESULT (STDMETHODCALLTYPE *GetRuntimeClassName)(
        __x_ABI_CWindows_CUI_CComposition_CIVector2KeyFrameAnimation *This,
        HSTRING *className);

    HRESULT (STDMETHODCALLTYPE *GetTrustLevel)(
        __x_ABI_CWindows_CUI_CComposition_CIVector2KeyFrameAnimation *This,
        TrustLevel *trustLevel);

    /*** IVector2KeyFrameAnimation methods ***/
    HRESULT (STDMETHODCALLTYPE *InsertKeyFrame)(
        __x_ABI_CWindows_CUI_CComposition_CIVector2KeyFrameAnimation *This,
        FLOAT key,
        struct __x_ABI_CWindows_CFoundation_CNumerics_CVector2 value);

    HRESULT (STDMETHODCALLTYPE *InsertKeyFrameWithEasingFunction)(
        __x_ABI_CWindows_CUI_CComposition_CIVector2KeyFrameAnimation *This,
        FLOAT key,
        struct __x_ABI_CWindows_CFoundation_CNumerics_CVector2 value,
        __x_ABI_CWindows_CUI_CComposition_CICompositionEasingFunction *function);

    END_INTERFACE
} __x_ABI_CWindows_CUI_CComposition_CIVector2KeyFrameAnimationVtbl;

interface __x_ABI_CWindows_CUI_CComposition_CIVector2KeyFrameAnimation {
    CONST_VTBL __x_ABI_CWindows_CUI_CComposition_CIVector2KeyFrameAnimationVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define __x_ABI_CWindows_CUI_CComposition_CIVector2KeyFrameAnimation_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define __x_ABI_CWindows_CUI_CComposition_CIVector2KeyFrameAnimation_AddRef(This) (This)->lpVtbl->AddRef(This)
#define __x_ABI_CWindows_CUI_CComposition_CIVector2KeyFrameAnimation_Release(This) (This)->lpVtbl->Release(This)
/*** IInspectable methods ***/
#define __x_ABI_CWindows_CUI_CComposition_CIVector2KeyFrameAnimation_GetIids(This,iidCount,iids) (This)->lpVtbl->GetIids(This,iidCount,iids)
#define __x_ABI_CWindows_CUI_CComposition_CIVector2KeyFrameAnimation_GetRuntimeClassName(This,className) (This)->lpVtbl->GetRuntimeClassName(This,className)
#define __x_ABI_CWindows_CUI_CComposition_CIVector2KeyFrameAnimation_GetTrustLevel(This,trustLevel) (This)->lpVtbl->GetTrustLevel(This,trustLevel)
/*** IVector2KeyFrameAnimation methods ***/
#define __x_ABI_CWindows_CUI_CComposition_CIVector2KeyFrameAnimation_InsertKeyFrame(This,key,value) (This)->lpVtbl->InsertKeyFrame(This,key,value)
#define __x_ABI_CWindows_CUI_CComposition_CIVector2KeyFrameAnimation_InsertKeyFrameWithEasingFunction(This,key,value,function) (This)->lpVtbl->InsertKeyFrameWithEasingFunction(This,key,value,function)
#else
/*** IUnknown methods ***/
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CUI_CComposition_CIVector2KeyFrameAnimation_QueryInterface(__x_ABI_CWindows_CUI_CComposition_CIVector2KeyFrameAnimation* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG __x_ABI_CWindows_CUI_CComposition_CIVector2KeyFrameAnimation_AddRef(__x_ABI_CWindows_CUI_CComposition_CIVector2KeyFrameAnimation* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG __x_ABI_CWindows_CUI_CComposition_CIVector2KeyFrameAnimation_Release(__x_ABI_CWindows_CUI_CComposition_CIVector2KeyFrameAnimation* This) {
    return This->lpVtbl->Release(This);
}
/*** IInspectable methods ***/
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CUI_CComposition_CIVector2KeyFrameAnimation_GetIids(__x_ABI_CWindows_CUI_CComposition_CIVector2KeyFrameAnimation* This,ULONG *iidCount,IID **iids) {
    return This->lpVtbl->GetIids(This,iidCount,iids);
}
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CUI_CComposition_CIVector2KeyFrameAnimation_GetRuntimeClassName(__x_ABI_CWindows_CUI_CComposition_CIVector2KeyFrameAnimation* This,HSTRING *className) {
    return This->lpVtbl->GetRuntimeClassName(This,className);
}
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CUI_CComposition_CIVector2KeyFrameAnimation_GetTrustLevel(__x_ABI_CWindows_CUI_CComposition_CIVector2KeyFrameAnimation* This,TrustLevel *trustLevel) {
    return This->lpVtbl->GetTrustLevel(This,trustLevel);
}
/*** IVector2KeyFrameAnimation methods ***/
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CUI_CComposition_CIVector2KeyFrameAnimation_InsertKeyFrame(__x_ABI_CWindows_CUI_CComposition_CIVector2KeyFrameAnimation* This,FLOAT key,struct __x_ABI_CWindows_CFoundation_CNumerics_CVector2 value) {
    return This->lpVtbl->InsertKeyFrame(This,key,value);
}
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CUI_CComposition_CIVector2KeyFrameAnimation_InsertKeyFrameWithEasingFunction(__x_ABI_CWindows_CUI_CComposition_CIVector2KeyFrameAnimation* This,FLOAT key,struct __x_ABI_CWindows_CFoundation_CNumerics_CVector2 value,__x_ABI_CWindows_CUI_CComposition_CICompositionEasingFunction *function) {
    return This->lpVtbl->InsertKeyFrameWithEasingFunction(This,key,value,function);
}
#endif
#ifdef WIDL_using_Windows_UI_Composition
#define IID_IVector2KeyFrameAnimation IID___x_ABI_CWindows_CUI_CComposition_CIVector2KeyFrameAnimation
#define IVector2KeyFrameAnimationVtbl __x_ABI_CWindows_CUI_CComposition_CIVector2KeyFrameAnimationVtbl
#define IVector2KeyFrameAnimation __x_ABI_CWindows_CUI_CComposition_CIVector2KeyFrameAnimation
#define IVector2KeyFrameAnimation_QueryInterface __x_ABI_CWindows_CUI_CComposition_CIVector2KeyFrameAnimation_QueryInterface
#define IVector2KeyFrameAnimation_AddRef __x_ABI_CWindows_CUI_CComposition_CIVector2KeyFrameAnimation_AddRef
#define IVector2KeyFrameAnimation_Release __x_ABI_CWindows_CUI_CComposition_CIVector2KeyFrameAnimation_Release
#define IVector2KeyFrameAnimation_GetIids __x_ABI_CWindows_CUI_CComposition_CIVector2KeyFrameAnimation_GetIids
#define IVector2KeyFrameAnimation_GetRuntimeClassName __x_ABI_CWindows_CUI_CComposition_CIVector2KeyFrameAnimation_GetRuntimeClassName
#define IVector2KeyFrameAnimation_GetTrustLevel __x_ABI_CWindows_CUI_CComposition_CIVector2KeyFrameAnimation_GetTrustLevel
#define IVector2KeyFrameAnimation_InsertKeyFrame __x_ABI_CWindows_CUI_CComposition_CIVector2KeyFrameAnimation_InsertKeyFrame
#define IVector2KeyFrameAnimation_InsertKeyFrameWithEasingFunction __x_ABI_CWindows_CUI_CComposition_CIVector2KeyFrameAnimation_InsertKeyFrameWithEasingFunction
#endif /* WIDL_using_Windows_UI_Composition */
#endif

#endif

#endif  /* ____x_ABI_CWindows_CUI_CComposition_CIVector2KeyFrameAnimation_INTERFACE_DEFINED__ */
#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x20000 */

/*****************************************************************************
 * IVector3KeyFrameAnimation interface
 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x20000
#ifndef ____x_ABI_CWindows_CUI_CComposition_CIVector3KeyFrameAnimation_INTERFACE_DEFINED__
#define ____x_ABI_CWindows_CUI_CComposition_CIVector3KeyFrameAnimation_INTERFACE_DEFINED__

DEFINE_GUID(IID___x_ABI_CWindows_CUI_CComposition_CIVector3KeyFrameAnimation, 0xc8039daa, 0xa281, 0x43c2, 0xa7,0x3d, 0xb6,0x8e,0x3c,0x53,0x3c,0x40);
#if defined(__cplusplus) && !defined(CINTERFACE)
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace UI {
            namespace Composition {
                MIDL_INTERFACE("c8039daa-a281-43c2-a73d-b68e3c533c40")
                IVector3KeyFrameAnimation : public IInspectable
                {
                    virtual HRESULT STDMETHODCALLTYPE InsertKeyFrame(
                        FLOAT key,
                        struct Vector3 value) = 0;

                    virtual HRESULT STDMETHODCALLTYPE InsertKeyFrameWithEasingFunction(
                        FLOAT key,
                        struct Vector3 value,
                        ABI::Windows::UI::Composition::ICompositionEasingFunction *function) = 0;

                };
            }
        }
    }
}
extern "C" {
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(__x_ABI_CWindows_CUI_CComposition_CIVector3KeyFrameAnimation, 0xc8039daa, 0xa281, 0x43c2, 0xa7,0x3d, 0xb6,0x8e,0x3c,0x53,0x3c,0x40)
#endif
#else
typedef struct __x_ABI_CWindows_CUI_CComposition_CIVector3KeyFrameAnimationVtbl {
    BEGIN_INTERFACE

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

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

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

    /*** IInspectable methods ***/
    HRESULT (STDMETHODCALLTYPE *GetIids)(
        __x_ABI_CWindows_CUI_CComposition_CIVector3KeyFrameAnimation *This,
        ULONG *iidCount,
        IID **iids);

    HRESULT (STDMETHODCALLTYPE *GetRuntimeClassName)(
        __x_ABI_CWindows_CUI_CComposition_CIVector3KeyFrameAnimation *This,
        HSTRING *className);

    HRESULT (STDMETHODCALLTYPE *GetTrustLevel)(
        __x_ABI_CWindows_CUI_CComposition_CIVector3KeyFrameAnimation *This,
        TrustLevel *trustLevel);

    /*** IVector3KeyFrameAnimation methods ***/
    HRESULT (STDMETHODCALLTYPE *InsertKeyFrame)(
        __x_ABI_CWindows_CUI_CComposition_CIVector3KeyFrameAnimation *This,
        FLOAT key,
        struct __x_ABI_CWindows_CFoundation_CNumerics_CVector3 value);

    HRESULT (STDMETHODCALLTYPE *InsertKeyFrameWithEasingFunction)(
        __x_ABI_CWindows_CUI_CComposition_CIVector3KeyFrameAnimation *This,
        FLOAT key,
        struct __x_ABI_CWindows_CFoundation_CNumerics_CVector3 value,
        __x_ABI_CWindows_CUI_CComposition_CICompositionEasingFunction *function);

    END_INTERFACE
} __x_ABI_CWindows_CUI_CComposition_CIVector3KeyFrameAnimationVtbl;

interface __x_ABI_CWindows_CUI_CComposition_CIVector3KeyFrameAnimation {
    CONST_VTBL __x_ABI_CWindows_CUI_CComposition_CIVector3KeyFrameAnimationVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define __x_ABI_CWindows_CUI_CComposition_CIVector3KeyFrameAnimation_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define __x_ABI_CWindows_CUI_CComposition_CIVector3KeyFrameAnimation_AddRef(This) (This)->lpVtbl->AddRef(This)
#define __x_ABI_CWindows_CUI_CComposition_CIVector3KeyFrameAnimation_Release(This) (This)->lpVtbl->Release(This)
/*** IInspectable methods ***/
#define __x_ABI_CWindows_CUI_CComposition_CIVector3KeyFrameAnimation_GetIids(This,iidCount,iids) (This)->lpVtbl->GetIids(This,iidCount,iids)
#define __x_ABI_CWindows_CUI_CComposition_CIVector3KeyFrameAnimation_GetRuntimeClassName(This,className) (This)->lpVtbl->GetRuntimeClassName(This,className)
#define __x_ABI_CWindows_CUI_CComposition_CIVector3KeyFrameAnimation_GetTrustLevel(This,trustLevel) (This)->lpVtbl->GetTrustLevel(This,trustLevel)
/*** IVector3KeyFrameAnimation methods ***/
#define __x_ABI_CWindows_CUI_CComposition_CIVector3KeyFrameAnimation_InsertKeyFrame(This,key,value) (This)->lpVtbl->InsertKeyFrame(This,key,value)
#define __x_ABI_CWindows_CUI_CComposition_CIVector3KeyFrameAnimation_InsertKeyFrameWithEasingFunction(This,key,value,function) (This)->lpVtbl->InsertKeyFrameWithEasingFunction(This,key,value,function)
#else
/*** IUnknown methods ***/
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CUI_CComposition_CIVector3KeyFrameAnimation_QueryInterface(__x_ABI_CWindows_CUI_CComposition_CIVector3KeyFrameAnimation* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG __x_ABI_CWindows_CUI_CComposition_CIVector3KeyFrameAnimation_AddRef(__x_ABI_CWindows_CUI_CComposition_CIVector3KeyFrameAnimation* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG __x_ABI_CWindows_CUI_CComposition_CIVector3KeyFrameAnimation_Release(__x_ABI_CWindows_CUI_CComposition_CIVector3KeyFrameAnimation* This) {
    return This->lpVtbl->Release(This);
}
/*** IInspectable methods ***/
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CUI_CComposition_CIVector3KeyFrameAnimation_GetIids(__x_ABI_CWindows_CUI_CComposition_CIVector3KeyFrameAnimation* This,ULONG *iidCount,IID **iids) {
    return This->lpVtbl->GetIids(This,iidCount,iids);
}
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CUI_CComposition_CIVector3KeyFrameAnimation_GetRuntimeClassName(__x_ABI_CWindows_CUI_CComposition_CIVector3KeyFrameAnimation* This,HSTRING *className) {
    return This->lpVtbl->GetRuntimeClassName(This,className);
}
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CUI_CComposition_CIVector3KeyFrameAnimation_GetTrustLevel(__x_ABI_CWindows_CUI_CComposition_CIVector3KeyFrameAnimation* This,TrustLevel *trustLevel) {
    return This->lpVtbl->GetTrustLevel(This,trustLevel);
}
/*** IVector3KeyFrameAnimation methods ***/
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CUI_CComposition_CIVector3KeyFrameAnimation_InsertKeyFrame(__x_ABI_CWindows_CUI_CComposition_CIVector3KeyFrameAnimation* This,FLOAT key,struct __x_ABI_CWindows_CFoundation_CNumerics_CVector3 value) {
    return This->lpVtbl->InsertKeyFrame(This,key,value);
}
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CUI_CComposition_CIVector3KeyFrameAnimation_InsertKeyFrameWithEasingFunction(__x_ABI_CWindows_CUI_CComposition_CIVector3KeyFrameAnimation* This,FLOAT key,struct __x_ABI_CWindows_CFoundation_CNumerics_CVector3 value,__x_ABI_CWindows_CUI_CComposition_CICompositionEasingFunction *function) {
    return This->lpVtbl->InsertKeyFrameWithEasingFunction(This,key,value,function);
}
#endif
#ifdef WIDL_using_Windows_UI_Composition
#define IID_IVector3KeyFrameAnimation IID___x_ABI_CWindows_CUI_CComposition_CIVector3KeyFrameAnimation
#define IVector3KeyFrameAnimationVtbl __x_ABI_CWindows_CUI_CComposition_CIVector3KeyFrameAnimationVtbl
#define IVector3KeyFrameAnimation __x_ABI_CWindows_CUI_CComposition_CIVector3KeyFrameAnimation
#define IVector3KeyFrameAnimation_QueryInterface __x_ABI_CWindows_CUI_CComposition_CIVector3KeyFrameAnimation_QueryInterface
#define IVector3KeyFrameAnimation_AddRef __x_ABI_CWindows_CUI_CComposition_CIVector3KeyFrameAnimation_AddRef
#define IVector3KeyFrameAnimation_Release __x_ABI_CWindows_CUI_CComposition_CIVector3KeyFrameAnimation_Release
#define IVector3KeyFrameAnimation_GetIids __x_ABI_CWindows_CUI_CComposition_CIVector3KeyFrameAnimation_GetIids
#define IVector3KeyFrameAnimation_GetRuntimeClassName __x_ABI_CWindows_CUI_CComposition_CIVector3KeyFrameAnimation_GetRuntimeClassName
#define IVector3KeyFrameAnimation_GetTrustLevel __x_ABI_CWindows_CUI_CComposition_CIVector3KeyFrameAnimation_GetTrustLevel
#define IVector3KeyFrameAnimation_InsertKeyFrame __x_ABI_CWindows_CUI_CComposition_CIVector3KeyFrameAnimation_InsertKeyFrame
#define IVector3KeyFrameAnimation_InsertKeyFrameWithEasingFunction __x_ABI_CWindows_CUI_CComposition_CIVector3KeyFrameAnimation_InsertKeyFrameWithEasingFunction
#endif /* WIDL_using_Windows_UI_Composition */
#endif

#endif

#endif  /* ____x_ABI_CWindows_CUI_CComposition_CIVector3KeyFrameAnimation_INTERFACE_DEFINED__ */
#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x20000 */

/*****************************************************************************
 * IVector4KeyFrameAnimation interface
 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x20000
#ifndef ____x_ABI_CWindows_CUI_CComposition_CIVector4KeyFrameAnimation_INTERFACE_DEFINED__
#define ____x_ABI_CWindows_CUI_CComposition_CIVector4KeyFrameAnimation_INTERFACE_DEFINED__

DEFINE_GUID(IID___x_ABI_CWindows_CUI_CComposition_CIVector4KeyFrameAnimation, 0x2457945b, 0xaddd, 0x4385, 0x96,0x06, 0xb6,0xa3,0xd5,0xe4,0xe1,0xb9);
#if defined(__cplusplus) && !defined(CINTERFACE)
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace UI {
            namespace Composition {
                MIDL_INTERFACE("2457945b-addd-4385-9606-b6a3d5e4e1b9")
                IVector4KeyFrameAnimation : public IInspectable
                {
                    virtual HRESULT STDMETHODCALLTYPE InsertKeyFrame(
                        FLOAT key,
                        struct Vector4 value) = 0;

                    virtual HRESULT STDMETHODCALLTYPE InsertKeyFrameWithEasingFunction(
                        FLOAT key,
                        struct Vector4 value,
                        ABI::Windows::UI::Composition::ICompositionEasingFunction *function) = 0;

                };
            }
        }
    }
}
extern "C" {
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(__x_ABI_CWindows_CUI_CComposition_CIVector4KeyFrameAnimation, 0x2457945b, 0xaddd, 0x4385, 0x96,0x06, 0xb6,0xa3,0xd5,0xe4,0xe1,0xb9)
#endif
#else
typedef struct __x_ABI_CWindows_CUI_CComposition_CIVector4KeyFrameAnimationVtbl {
    BEGIN_INTERFACE

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

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

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

    /*** IInspectable methods ***/
    HRESULT (STDMETHODCALLTYPE *GetIids)(
        __x_ABI_CWindows_CUI_CComposition_CIVector4KeyFrameAnimation *This,
        ULONG *iidCount,
        IID **iids);

    HRESULT (STDMETHODCALLTYPE *GetRuntimeClassName)(
        __x_ABI_CWindows_CUI_CComposition_CIVector4KeyFrameAnimation *This,
        HSTRING *className);

    HRESULT (STDMETHODCALLTYPE *GetTrustLevel)(
        __x_ABI_CWindows_CUI_CComposition_CIVector4KeyFrameAnimation *This,
        TrustLevel *trustLevel);

    /*** IVector4KeyFrameAnimation methods ***/
    HRESULT (STDMETHODCALLTYPE *InsertKeyFrame)(
        __x_ABI_CWindows_CUI_CComposition_CIVector4KeyFrameAnimation *This,
        FLOAT key,
        struct __x_ABI_CWindows_CFoundation_CNumerics_CVector4 value);

    HRESULT (STDMETHODCALLTYPE *InsertKeyFrameWithEasingFunction)(
        __x_ABI_CWindows_CUI_CComposition_CIVector4KeyFrameAnimation *This,
        FLOAT key,
        struct __x_ABI_CWindows_CFoundation_CNumerics_CVector4 value,
        __x_ABI_CWindows_CUI_CComposition_CICompositionEasingFunction *function);

    END_INTERFACE
} __x_ABI_CWindows_CUI_CComposition_CIVector4KeyFrameAnimationVtbl;

interface __x_ABI_CWindows_CUI_CComposition_CIVector4KeyFrameAnimation {
    CONST_VTBL __x_ABI_CWindows_CUI_CComposition_CIVector4KeyFrameAnimationVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define __x_ABI_CWindows_CUI_CComposition_CIVector4KeyFrameAnimation_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define __x_ABI_CWindows_CUI_CComposition_CIVector4KeyFrameAnimation_AddRef(This) (This)->lpVtbl->AddRef(This)
#define __x_ABI_CWindows_CUI_CComposition_CIVector4KeyFrameAnimation_Release(This) (This)->lpVtbl->Release(This)
/*** IInspectable methods ***/
#define __x_ABI_CWindows_CUI_CComposition_CIVector4KeyFrameAnimation_GetIids(This,iidCount,iids) (This)->lpVtbl->GetIids(This,iidCount,iids)
#define __x_ABI_CWindows_CUI_CComposition_CIVector4KeyFrameAnimation_GetRuntimeClassName(This,className) (This)->lpVtbl->GetRuntimeClassName(This,className)
#define __x_ABI_CWindows_CUI_CComposition_CIVector4KeyFrameAnimation_GetTrustLevel(This,trustLevel) (This)->lpVtbl->GetTrustLevel(This,trustLevel)
/*** IVector4KeyFrameAnimation methods ***/
#define __x_ABI_CWindows_CUI_CComposition_CIVector4KeyFrameAnimation_InsertKeyFrame(This,key,value) (This)->lpVtbl->InsertKeyFrame(This,key,value)
#define __x_ABI_CWindows_CUI_CComposition_CIVector4KeyFrameAnimation_InsertKeyFrameWithEasingFunction(This,key,value,function) (This)->lpVtbl->InsertKeyFrameWithEasingFunction(This,key,value,function)
#else
/*** IUnknown methods ***/
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CUI_CComposition_CIVector4KeyFrameAnimation_QueryInterface(__x_ABI_CWindows_CUI_CComposition_CIVector4KeyFrameAnimation* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG __x_ABI_CWindows_CUI_CComposition_CIVector4KeyFrameAnimation_AddRef(__x_ABI_CWindows_CUI_CComposition_CIVector4KeyFrameAnimation* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG __x_ABI_CWindows_CUI_CComposition_CIVector4KeyFrameAnimation_Release(__x_ABI_CWindows_CUI_CComposition_CIVector4KeyFrameAnimation* This) {
    return This->lpVtbl->Release(This);
}
/*** IInspectable methods ***/
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CUI_CComposition_CIVector4KeyFrameAnimation_GetIids(__x_ABI_CWindows_CUI_CComposition_CIVector4KeyFrameAnimation* This,ULONG *iidCount,IID **iids) {
    return This->lpVtbl->GetIids(This,iidCount,iids);
}
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CUI_CComposition_CIVector4KeyFrameAnimation_GetRuntimeClassName(__x_ABI_CWindows_CUI_CComposition_CIVector4KeyFrameAnimation* This,HSTRING *className) {
    return This->lpVtbl->GetRuntimeClassName(This,className);
}
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CUI_CComposition_CIVector4KeyFrameAnimation_GetTrustLevel(__x_ABI_CWindows_CUI_CComposition_CIVector4KeyFrameAnimation* This,TrustLevel *trustLevel) {
    return This->lpVtbl->GetTrustLevel(This,trustLevel);
}
/*** IVector4KeyFrameAnimation methods ***/
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CUI_CComposition_CIVector4KeyFrameAnimation_InsertKeyFrame(__x_ABI_CWindows_CUI_CComposition_CIVector4KeyFrameAnimation* This,FLOAT key,struct __x_ABI_CWindows_CFoundation_CNumerics_CVector4 value) {
    return This->lpVtbl->InsertKeyFrame(This,key,value);
}
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CUI_CComposition_CIVector4KeyFrameAnimation_InsertKeyFrameWithEasingFunction(__x_ABI_CWindows_CUI_CComposition_CIVector4KeyFrameAnimation* This,FLOAT key,struct __x_ABI_CWindows_CFoundation_CNumerics_CVector4 value,__x_ABI_CWindows_CUI_CComposition_CICompositionEasingFunction *function) {
    return This->lpVtbl->InsertKeyFrameWithEasingFunction(This,key,value,function);
}
#endif
#ifdef WIDL_using_Windows_UI_Composition
#define IID_IVector4KeyFrameAnimation IID___x_ABI_CWindows_CUI_CComposition_CIVector4KeyFrameAnimation
#define IVector4KeyFrameAnimationVtbl __x_ABI_CWindows_CUI_CComposition_CIVector4KeyFrameAnimationVtbl
#define IVector4KeyFrameAnimation __x_ABI_CWindows_CUI_CComposition_CIVector4KeyFrameAnimation
#define IVector4KeyFrameAnimation_QueryInterface __x_ABI_CWindows_CUI_CComposition_CIVector4KeyFrameAnimation_QueryInterface
#define IVector4KeyFrameAnimation_AddRef __x_ABI_CWindows_CUI_CComposition_CIVector4KeyFrameAnimation_AddRef
#define IVector4KeyFrameAnimation_Release __x_ABI_CWindows_CUI_CComposition_CIVector4KeyFrameAnimation_Release
#define IVector4KeyFrameAnimation_GetIids __x_ABI_CWindows_CUI_CComposition_CIVector4KeyFrameAnimation_GetIids
#define IVector4KeyFrameAnimation_GetRuntimeClassName __x_ABI_CWindows_CUI_CComposition_CIVector4KeyFrameAnimation_GetRuntimeClassName
#define IVector4KeyFrameAnimation_GetTrustLevel __x_ABI_CWindows_CUI_CComposition_CIVector4KeyFrameAnimation_GetTrustLevel
#define IVector4KeyFrameAnimation_InsertKeyFrame __x_ABI_CWindows_CUI_CComposition_CIVector4KeyFrameAnimation_InsertKeyFrame
#define IVector4KeyFrameAnimation_InsertKeyFrameWithEasingFunction __x_ABI_CWindows_CUI_CComposition_CIVector4KeyFrameAnimation_InsertKeyFrameWithEasingFunction
#endif /* WIDL_using_Windows_UI_Composition */
#endif

#endif

#endif  /* ____x_ABI_CWindows_CUI_CComposition_CIVector4KeyFrameAnimation_INTERFACE_DEFINED__ */
#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x20000 */

/*****************************************************************************
 * IVisual interface
 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x20000
#ifndef ____x_ABI_CWindows_CUI_CComposition_CIVisual_INTERFACE_DEFINED__
#define ____x_ABI_CWindows_CUI_CComposition_CIVisual_INTERFACE_DEFINED__

DEFINE_GUID(IID___x_ABI_CWindows_CUI_CComposition_CIVisual, 0x117e202d, 0xa859, 0x4c89, 0x87,0x3b, 0xc2,0xaa,0x56,0x67,0x88,0xe3);
#if defined(__cplusplus) && !defined(CINTERFACE)
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace UI {
            namespace Composition {
                MIDL_INTERFACE("117e202d-a859-4c89-873b-c2aa566788e3")
                IVisual : public IInspectable
                {
                    virtual HRESULT STDMETHODCALLTYPE get_AnchorPoint(
                        struct Vector2 *value) = 0;

                    virtual HRESULT STDMETHODCALLTYPE put_AnchorPoint(
                        struct Vector2 value) = 0;

                    virtual HRESULT STDMETHODCALLTYPE get_BackfaceVisibility(
                        enum CompositionBackfaceVisibility *value) = 0;

                    virtual HRESULT STDMETHODCALLTYPE put_BackfaceVisibility(
                        enum CompositionBackfaceVisibility value) = 0;

                    virtual HRESULT STDMETHODCALLTYPE get_BorderMode(
                        enum CompositionBorderMode *value) = 0;

                    virtual HRESULT STDMETHODCALLTYPE put_BorderMode(
                        enum CompositionBorderMode value) = 0;

                    virtual HRESULT STDMETHODCALLTYPE get_CenterPoint(
                        struct Vector3 *value) = 0;

                    virtual HRESULT STDMETHODCALLTYPE put_CenterPoint(
                        struct Vector3 value) = 0;

                    virtual HRESULT STDMETHODCALLTYPE get_Clip(
                        ABI::Windows::UI::Composition::ICompositionClip **value) = 0;

                    virtual HRESULT STDMETHODCALLTYPE put_Clip(
                        ABI::Windows::UI::Composition::ICompositionClip *value) = 0;

                    virtual HRESULT STDMETHODCALLTYPE get_CompositeMode(
                        enum CompositionCompositeMode *value) = 0;

                    virtual HRESULT STDMETHODCALLTYPE put_CompositeMode(
                        enum CompositionCompositeMode value) = 0;

                    virtual HRESULT STDMETHODCALLTYPE get_IsVisible(
                        boolean *value) = 0;

                    virtual HRESULT STDMETHODCALLTYPE put_IsVisible(
                        boolean value) = 0;

                    virtual HRESULT STDMETHODCALLTYPE get_Offset(
                        struct Vector3 *value) = 0;

                    virtual HRESULT STDMETHODCALLTYPE put_Offset(
                        struct Vector3 value) = 0;

                    virtual HRESULT STDMETHODCALLTYPE get_Opacity(
                        FLOAT *value) = 0;

                    virtual HRESULT STDMETHODCALLTYPE put_Opacity(
                        FLOAT value) = 0;

                    virtual HRESULT STDMETHODCALLTYPE get_Orientation(
                        struct Quaternion *value) = 0;

                    virtual HRESULT STDMETHODCALLTYPE put_Orientation(
                        struct Quaternion value) = 0;

                    virtual HRESULT STDMETHODCALLTYPE get_Parent(
                        ABI::Windows::UI::Composition::IContainerVisual **value) = 0;

                    virtual HRESULT STDMETHODCALLTYPE get_RotationAngle(
                        FLOAT *value) = 0;

                    virtual HRESULT STDMETHODCALLTYPE put_RotationAngle(
                        FLOAT value) = 0;

                    virtual HRESULT STDMETHODCALLTYPE get_RotationAngleInDegrees(
                        FLOAT *value) = 0;

                    virtual HRESULT STDMETHODCALLTYPE put_RotationAngleInDegrees(
                        FLOAT value) = 0;

                    virtual HRESULT STDMETHODCALLTYPE get_RotationAxis(
                        struct Vector3 *value) = 0;

                    virtual HRESULT STDMETHODCALLTYPE put_RotationAxis(
                        struct Vector3 value) = 0;

                    virtual HRESULT STDMETHODCALLTYPE get_Scale(
                        struct Vector3 *value) = 0;

                    virtual HRESULT STDMETHODCALLTYPE put_Scale(
                        struct Vector3 value) = 0;

                    virtual HRESULT STDMETHODCALLTYPE get_Size(
                        struct Vector2 *value) = 0;

                    virtual HRESULT STDMETHODCALLTYPE put_Size(
                        struct Vector2 value) = 0;

                    virtual HRESULT STDMETHODCALLTYPE get_TransformMatrix(
                        struct Matrix4x4 *value) = 0;

                    virtual HRESULT STDMETHODCALLTYPE put_TransformMatrix(
                        struct Matrix4x4 value) = 0;

                };
            }
        }
    }
}
extern "C" {
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(__x_ABI_CWindows_CUI_CComposition_CIVisual, 0x117e202d, 0xa859, 0x4c89, 0x87,0x3b, 0xc2,0xaa,0x56,0x67,0x88,0xe3)
#endif
#else
typedef struct __x_ABI_CWindows_CUI_CComposition_CIVisualVtbl {
    BEGIN_INTERFACE

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

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

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

    /*** IInspectable methods ***/
    HRESULT (STDMETHODCALLTYPE *GetIids)(
        __x_ABI_CWindows_CUI_CComposition_CIVisual *This,
        ULONG *iidCount,
        IID **iids);

    HRESULT (STDMETHODCALLTYPE *GetRuntimeClassName)(
        __x_ABI_CWindows_CUI_CComposition_CIVisual *This,
        HSTRING *className);

    HRESULT (STDMETHODCALLTYPE *GetTrustLevel)(
        __x_ABI_CWindows_CUI_CComposition_CIVisual *This,
        TrustLevel *trustLevel);

    /*** IVisual methods ***/
    HRESULT (STDMETHODCALLTYPE *get_AnchorPoint)(
        __x_ABI_CWindows_CUI_CComposition_CIVisual *This,
        struct __x_ABI_CWindows_CFoundation_CNumerics_CVector2 *value);

    HRESULT (STDMETHODCALLTYPE *put_AnchorPoint)(
        __x_ABI_CWindows_CUI_CComposition_CIVisual *This,
        struct __x_ABI_CWindows_CFoundation_CNumerics_CVector2 value);

    HRESULT (STDMETHODCALLTYPE *get_BackfaceVisibility)(
        __x_ABI_CWindows_CUI_CComposition_CIVisual *This,
        enum __x_ABI_CWindows_CUI_CComposition_CCompositionBackfaceVisibility *value);

    HRESULT (STDMETHODCALLTYPE *put_BackfaceVisibility)(
        __x_ABI_CWindows_CUI_CComposition_CIVisual *This,
        enum __x_ABI_CWindows_CUI_CComposition_CCompositionBackfaceVisibility value);

    HRESULT (STDMETHODCALLTYPE *get_BorderMode)(
        __x_ABI_CWindows_CUI_CComposition_CIVisual *This,
        enum __x_ABI_CWindows_CUI_CComposition_CCompositionBorderMode *value);

    HRESULT (STDMETHODCALLTYPE *put_BorderMode)(
        __x_ABI_CWindows_CUI_CComposition_CIVisual *This,
        enum __x_ABI_CWindows_CUI_CComposition_CCompositionBorderMode value);

    HRESULT (STDMETHODCALLTYPE *get_CenterPoint)(
        __x_ABI_CWindows_CUI_CComposition_CIVisual *This,
        struct __x_ABI_CWindows_CFoundation_CNumerics_CVector3 *value);

    HRESULT (STDMETHODCALLTYPE *put_CenterPoint)(
        __x_ABI_CWindows_CUI_CComposition_CIVisual *This,
        struct __x_ABI_CWindows_CFoundation_CNumerics_CVector3 value);

    HRESULT (STDMETHODCALLTYPE *get_Clip)(
        __x_ABI_CWindows_CUI_CComposition_CIVisual *This,
        __x_ABI_CWindows_CUI_CComposition_CICompositionClip **value);

    HRESULT (STDMETHODCALLTYPE *put_Clip)(
        __x_ABI_CWindows_CUI_CComposition_CIVisual *This,
        __x_ABI_CWindows_CUI_CComposition_CICompositionClip *value);

    HRESULT (STDMETHODCALLTYPE *get_CompositeMode)(
        __x_ABI_CWindows_CUI_CComposition_CIVisual *This,
        enum __x_ABI_CWindows_CUI_CComposition_CCompositionCompositeMode *value);

    HRESULT (STDMETHODCALLTYPE *put_CompositeMode)(
        __x_ABI_CWindows_CUI_CComposition_CIVisual *This,
        enum __x_ABI_CWindows_CUI_CComposition_CCompositionCompositeMode value);

    HRESULT (STDMETHODCALLTYPE *get_IsVisible)(
        __x_ABI_CWindows_CUI_CComposition_CIVisual *This,
        boolean *value);

    HRESULT (STDMETHODCALLTYPE *put_IsVisible)(
        __x_ABI_CWindows_CUI_CComposition_CIVisual *This,
        boolean value);

    HRESULT (STDMETHODCALLTYPE *get_Offset)(
        __x_ABI_CWindows_CUI_CComposition_CIVisual *This,
        struct __x_ABI_CWindows_CFoundation_CNumerics_CVector3 *value);

    HRESULT (STDMETHODCALLTYPE *put_Offset)(
        __x_ABI_CWindows_CUI_CComposition_CIVisual *This,
        struct __x_ABI_CWindows_CFoundation_CNumerics_CVector3 value);

    HRESULT (STDMETHODCALLTYPE *get_Opacity)(
        __x_ABI_CWindows_CUI_CComposition_CIVisual *This,
        FLOAT *value);

    HRESULT (STDMETHODCALLTYPE *put_Opacity)(
        __x_ABI_CWindows_CUI_CComposition_CIVisual *This,
        FLOAT value);

    HRESULT (STDMETHODCALLTYPE *get_Orientation)(
        __x_ABI_CWindows_CUI_CComposition_CIVisual *This,
        struct __x_ABI_CWindows_CFoundation_CNumerics_CQuaternion *value);

    HRESULT (STDMETHODCALLTYPE *put_Orientation)(
        __x_ABI_CWindows_CUI_CComposition_CIVisual *This,
        struct __x_ABI_CWindows_CFoundation_CNumerics_CQuaternion value);

    HRESULT (STDMETHODCALLTYPE *get_Parent)(
        __x_ABI_CWindows_CUI_CComposition_CIVisual *This,
        __x_ABI_CWindows_CUI_CComposition_CIContainerVisual **value);

    HRESULT (STDMETHODCALLTYPE *get_RotationAngle)(
        __x_ABI_CWindows_CUI_CComposition_CIVisual *This,
        FLOAT *value);

    HRESULT (STDMETHODCALLTYPE *put_RotationAngle)(
        __x_ABI_CWindows_CUI_CComposition_CIVisual *This,
        FLOAT value);

    HRESULT (STDMETHODCALLTYPE *get_RotationAngleInDegrees)(
        __x_ABI_CWindows_CUI_CComposition_CIVisual *This,
        FLOAT *value);

    HRESULT (STDMETHODCALLTYPE *put_RotationAngleInDegrees)(
        __x_ABI_CWindows_CUI_CComposition_CIVisual *This,
        FLOAT value);

    HRESULT (STDMETHODCALLTYPE *get_RotationAxis)(
        __x_ABI_CWindows_CUI_CComposition_CIVisual *This,
        struct __x_ABI_CWindows_CFoundation_CNumerics_CVector3 *value);

    HRESULT (STDMETHODCALLTYPE *put_RotationAxis)(
        __x_ABI_CWindows_CUI_CComposition_CIVisual *This,
        struct __x_ABI_CWindows_CFoundation_CNumerics_CVector3 value);

    HRESULT (STDMETHODCALLTYPE *get_Scale)(
        __x_ABI_CWindows_CUI_CComposition_CIVisual *This,
        struct __x_ABI_CWindows_CFoundation_CNumerics_CVector3 *value);

    HRESULT (STDMETHODCALLTYPE *put_Scale)(
        __x_ABI_CWindows_CUI_CComposition_CIVisual *This,
        struct __x_ABI_CWindows_CFoundation_CNumerics_CVector3 value);

    HRESULT (STDMETHODCALLTYPE *get_Size)(
        __x_ABI_CWindows_CUI_CComposition_CIVisual *This,
        struct __x_ABI_CWindows_CFoundation_CNumerics_CVector2 *value);

    HRESULT (STDMETHODCALLTYPE *put_Size)(
        __x_ABI_CWindows_CUI_CComposition_CIVisual *This,
        struct __x_ABI_CWindows_CFoundation_CNumerics_CVector2 value);

    HRESULT (STDMETHODCALLTYPE *get_TransformMatrix)(
        __x_ABI_CWindows_CUI_CComposition_CIVisual *This,
        struct __x_ABI_CWindows_CFoundation_CNumerics_CMatrix4x4 *value);

    HRESULT (STDMETHODCALLTYPE *put_TransformMatrix)(
        __x_ABI_CWindows_CUI_CComposition_CIVisual *This,
        struct __x_ABI_CWindows_CFoundation_CNumerics_CMatrix4x4 value);

    END_INTERFACE
} __x_ABI_CWindows_CUI_CComposition_CIVisualVtbl;

interface __x_ABI_CWindows_CUI_CComposition_CIVisual {
    CONST_VTBL __x_ABI_CWindows_CUI_CComposition_CIVisualVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define __x_ABI_CWindows_CUI_CComposition_CIVisual_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define __x_ABI_CWindows_CUI_CComposition_CIVisual_AddRef(This) (This)->lpVtbl->AddRef(This)
#define __x_ABI_CWindows_CUI_CComposition_CIVisual_Release(This) (This)->lpVtbl->Release(This)
/*** IInspectable methods ***/
#define __x_ABI_CWindows_CUI_CComposition_CIVisual_GetIids(This,iidCount,iids) (This)->lpVtbl->GetIids(This,iidCount,iids)
#define __x_ABI_CWindows_CUI_CComposition_CIVisual_GetRuntimeClassName(This,className) (This)->lpVtbl->GetRuntimeClassName(This,className)
#define __x_ABI_CWindows_CUI_CComposition_CIVisual_GetTrustLevel(This,trustLevel) (This)->lpVtbl->GetTrustLevel(This,trustLevel)
/*** IVisual methods ***/
#define __x_ABI_CWindows_CUI_CComposition_CIVisual_get_AnchorPoint(This,value) (This)->lpVtbl->get_AnchorPoint(This,value)
#define __x_ABI_CWindows_CUI_CComposition_CIVisual_put_AnchorPoint(This,value) (This)->lpVtbl->put_AnchorPoint(This,value)
#define __x_ABI_CWindows_CUI_CComposition_CIVisual_get_BackfaceVisibility(This,value) (This)->lpVtbl->get_BackfaceVisibility(This,value)
#define __x_ABI_CWindows_CUI_CComposition_CIVisual_put_BackfaceVisibility(This,value) (This)->lpVtbl->put_BackfaceVisibility(This,value)
#define __x_ABI_CWindows_CUI_CComposition_CIVisual_get_BorderMode(This,value) (This)->lpVtbl->get_BorderMode(This,value)
#define __x_ABI_CWindows_CUI_CComposition_CIVisual_put_BorderMode(This,value) (This)->lpVtbl->put_BorderMode(This,value)
#define __x_ABI_CWindows_CUI_CComposition_CIVisual_get_CenterPoint(This,value) (This)->lpVtbl->get_CenterPoint(This,value)
#define __x_ABI_CWindows_CUI_CComposition_CIVisual_put_CenterPoint(This,value) (This)->lpVtbl->put_CenterPoint(This,value)
#define __x_ABI_CWindows_CUI_CComposition_CIVisual_get_Clip(This,value) (This)->lpVtbl->get_Clip(This,value)
#define __x_ABI_CWindows_CUI_CComposition_CIVisual_put_Clip(This,value) (This)->lpVtbl->put_Clip(This,value)
#define __x_ABI_CWindows_CUI_CComposition_CIVisual_get_CompositeMode(This,value) (This)->lpVtbl->get_CompositeMode(This,value)
#define __x_ABI_CWindows_CUI_CComposition_CIVisual_put_CompositeMode(This,value) (This)->lpVtbl->put_CompositeMode(This,value)
#define __x_ABI_CWindows_CUI_CComposition_CIVisual_get_IsVisible(This,value) (This)->lpVtbl->get_IsVisible(This,value)
#define __x_ABI_CWindows_CUI_CComposition_CIVisual_put_IsVisible(This,value) (This)->lpVtbl->put_IsVisible(This,value)
#define __x_ABI_CWindows_CUI_CComposition_CIVisual_get_Offset(This,value) (This)->lpVtbl->get_Offset(This,value)
#define __x_ABI_CWindows_CUI_CComposition_CIVisual_put_Offset(This,value) (This)->lpVtbl->put_Offset(This,value)
#define __x_ABI_CWindows_CUI_CComposition_CIVisual_get_Opacity(This,value) (This)->lpVtbl->get_Opacity(This,value)
#define __x_ABI_CWindows_CUI_CComposition_CIVisual_put_Opacity(This,value) (This)->lpVtbl->put_Opacity(This,value)
#define __x_ABI_CWindows_CUI_CComposition_CIVisual_get_Orientation(This,value) (This)->lpVtbl->get_Orientation(This,value)
#define __x_ABI_CWindows_CUI_CComposition_CIVisual_put_Orientation(This,value) (This)->lpVtbl->put_Orientation(This,value)
#define __x_ABI_CWindows_CUI_CComposition_CIVisual_get_Parent(This,value) (This)->lpVtbl->get_Parent(This,value)
#define __x_ABI_CWindows_CUI_CComposition_CIVisual_get_RotationAngle(This,value) (This)->lpVtbl->get_RotationAngle(This,value)
#define __x_ABI_CWindows_CUI_CComposition_CIVisual_put_RotationAngle(This,value) (This)->lpVtbl->put_RotationAngle(This,value)
#define __x_ABI_CWindows_CUI_CComposition_CIVisual_get_RotationAngleInDegrees(This,value) (This)->lpVtbl->get_RotationAngleInDegrees(This,value)
#define __x_ABI_CWindows_CUI_CComposition_CIVisual_put_RotationAngleInDegrees(This,value) (This)->lpVtbl->put_RotationAngleInDegrees(This,value)
#define __x_ABI_CWindows_CUI_CComposition_CIVisual_get_RotationAxis(This,value) (This)->lpVtbl->get_RotationAxis(This,value)
#define __x_ABI_CWindows_CUI_CComposition_CIVisual_put_RotationAxis(This,value) (This)->lpVtbl->put_RotationAxis(This,value)
#define __x_ABI_CWindows_CUI_CComposition_CIVisual_get_Scale(This,value) (This)->lpVtbl->get_Scale(This,value)
#define __x_ABI_CWindows_CUI_CComposition_CIVisual_put_Scale(This,value) (This)->lpVtbl->put_Scale(This,value)
#define __x_ABI_CWindows_CUI_CComposition_CIVisual_get_Size(This,value) (This)->lpVtbl->get_Size(This,value)
#define __x_ABI_CWindows_CUI_CComposition_CIVisual_put_Size(This,value) (This)->lpVtbl->put_Size(This,value)
#define __x_ABI_CWindows_CUI_CComposition_CIVisual_get_TransformMatrix(This,value) (This)->lpVtbl->get_TransformMatrix(This,value)
#define __x_ABI_CWindows_CUI_CComposition_CIVisual_put_TransformMatrix(This,value) (This)->lpVtbl->put_TransformMatrix(This,value)
#else
/*** IUnknown methods ***/
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CUI_CComposition_CIVisual_QueryInterface(__x_ABI_CWindows_CUI_CComposition_CIVisual* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG __x_ABI_CWindows_CUI_CComposition_CIVisual_AddRef(__x_ABI_CWindows_CUI_CComposition_CIVisual* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG __x_ABI_CWindows_CUI_CComposition_CIVisual_Release(__x_ABI_CWindows_CUI_CComposition_CIVisual* This) {
    return This->lpVtbl->Release(This);
}
/*** IInspectable methods ***/
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CUI_CComposition_CIVisual_GetIids(__x_ABI_CWindows_CUI_CComposition_CIVisual* This,ULONG *iidCount,IID **iids) {
    return This->lpVtbl->GetIids(This,iidCount,iids);
}
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CUI_CComposition_CIVisual_GetRuntimeClassName(__x_ABI_CWindows_CUI_CComposition_CIVisual* This,HSTRING *className) {
    return This->lpVtbl->GetRuntimeClassName(This,className);
}
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CUI_CComposition_CIVisual_GetTrustLevel(__x_ABI_CWindows_CUI_CComposition_CIVisual* This,TrustLevel *trustLevel) {
    return This->lpVtbl->GetTrustLevel(This,trustLevel);
}
/*** IVisual methods ***/
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CUI_CComposition_CIVisual_get_AnchorPoint(__x_ABI_CWindows_CUI_CComposition_CIVisual* This,struct __x_ABI_CWindows_CFoundation_CNumerics_CVector2 *value) {
    return This->lpVtbl->get_AnchorPoint(This,value);
}
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CUI_CComposition_CIVisual_put_AnchorPoint(__x_ABI_CWindows_CUI_CComposition_CIVisual* This,struct __x_ABI_CWindows_CFoundation_CNumerics_CVector2 value) {
    return This->lpVtbl->put_AnchorPoint(This,value);
}
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CUI_CComposition_CIVisual_get_BackfaceVisibility(__x_ABI_CWindows_CUI_CComposition_CIVisual* This,enum __x_ABI_CWindows_CUI_CComposition_CCompositionBackfaceVisibility *value) {
    return This->lpVtbl->get_BackfaceVisibility(This,value);
}
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CUI_CComposition_CIVisual_put_BackfaceVisibility(__x_ABI_CWindows_CUI_CComposition_CIVisual* This,enum __x_ABI_CWindows_CUI_CComposition_CCompositionBackfaceVisibility value) {
    return This->lpVtbl->put_BackfaceVisibility(This,value);
}
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CUI_CComposition_CIVisual_get_BorderMode(__x_ABI_CWindows_CUI_CComposition_CIVisual* This,enum __x_ABI_CWindows_CUI_CComposition_CCompositionBorderMode *value) {
    return This->lpVtbl->get_BorderMode(This,value);
}
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CUI_CComposition_CIVisual_put_BorderMode(__x_ABI_CWindows_CUI_CComposition_CIVisual* This,enum __x_ABI_CWindows_CUI_CComposition_CCompositionBorderMode value) {
    return This->lpVtbl->put_BorderMode(This,value);
}
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CUI_CComposition_CIVisual_get_CenterPoint(__x_ABI_CWindows_CUI_CComposition_CIVisual* This,struct __x_ABI_CWindows_CFoundation_CNumerics_CVector3 *value) {
    return This->lpVtbl->get_CenterPoint(This,value);
}
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CUI_CComposition_CIVisual_put_CenterPoint(__x_ABI_CWindows_CUI_CComposition_CIVisual* This,struct __x_ABI_CWindows_CFoundation_CNumerics_CVector3 value) {
    return This->lpVtbl->put_CenterPoint(This,value);
}
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CUI_CComposition_CIVisual_get_Clip(__x_ABI_CWindows_CUI_CComposition_CIVisual* This,__x_ABI_CWindows_CUI_CComposition_CICompositionClip **value) {
    return This->lpVtbl->get_Clip(This,value);
}
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CUI_CComposition_CIVisual_put_Clip(__x_ABI_CWindows_CUI_CComposition_CIVisual* This,__x_ABI_CWindows_CUI_CComposition_CICompositionClip *value) {
    return This->lpVtbl->put_Clip(This,value);
}
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CUI_CComposition_CIVisual_get_CompositeMode(__x_ABI_CWindows_CUI_CComposition_CIVisual* This,enum __x_ABI_CWindows_CUI_CComposition_CCompositionCompositeMode *value) {
    return This->lpVtbl->get_CompositeMode(This,value);
}
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CUI_CComposition_CIVisual_put_CompositeMode(__x_ABI_CWindows_CUI_CComposition_CIVisual* This,enum __x_ABI_CWindows_CUI_CComposition_CCompositionCompositeMode value) {
    return This->lpVtbl->put_CompositeMode(This,value);
}
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CUI_CComposition_CIVisual_get_IsVisible(__x_ABI_CWindows_CUI_CComposition_CIVisual* This,boolean *value) {
    return This->lpVtbl->get_IsVisible(This,value);
}
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CUI_CComposition_CIVisual_put_IsVisible(__x_ABI_CWindows_CUI_CComposition_CIVisual* This,boolean value) {
    return This->lpVtbl->put_IsVisible(This,value);
}
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CUI_CComposition_CIVisual_get_Offset(__x_ABI_CWindows_CUI_CComposition_CIVisual* This,struct __x_ABI_CWindows_CFoundation_CNumerics_CVector3 *value) {
    return This->lpVtbl->get_Offset(This,value);
}
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CUI_CComposition_CIVisual_put_Offset(__x_ABI_CWindows_CUI_CComposition_CIVisual* This,struct __x_ABI_CWindows_CFoundation_CNumerics_CVector3 value) {
    return This->lpVtbl->put_Offset(This,value);
}
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CUI_CComposition_CIVisual_get_Opacity(__x_ABI_CWindows_CUI_CComposition_CIVisual* This,FLOAT *value) {
    return This->lpVtbl->get_Opacity(This,value);
}
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CUI_CComposition_CIVisual_put_Opacity(__x_ABI_CWindows_CUI_CComposition_CIVisual* This,FLOAT value) {
    return This->lpVtbl->put_Opacity(This,value);
}
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CUI_CComposition_CIVisual_get_Orientation(__x_ABI_CWindows_CUI_CComposition_CIVisual* This,struct __x_ABI_CWindows_CFoundation_CNumerics_CQuaternion *value) {
    return This->lpVtbl->get_Orientation(This,value);
}
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CUI_CComposition_CIVisual_put_Orientation(__x_ABI_CWindows_CUI_CComposition_CIVisual* This,struct __x_ABI_CWindows_CFoundation_CNumerics_CQuaternion value) {
    return This->lpVtbl->put_Orientation(This,value);
}
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CUI_CComposition_CIVisual_get_Parent(__x_ABI_CWindows_CUI_CComposition_CIVisual* This,__x_ABI_CWindows_CUI_CComposition_CIContainerVisual **value) {
    return This->lpVtbl->get_Parent(This,value);
}
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CUI_CComposition_CIVisual_get_RotationAngle(__x_ABI_CWindows_CUI_CComposition_CIVisual* This,FLOAT *value) {
    return This->lpVtbl->get_RotationAngle(This,value);
}
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CUI_CComposition_CIVisual_put_RotationAngle(__x_ABI_CWindows_CUI_CComposition_CIVisual* This,FLOAT value) {
    return This->lpVtbl->put_RotationAngle(This,value);
}
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CUI_CComposition_CIVisual_get_RotationAngleInDegrees(__x_ABI_CWindows_CUI_CComposition_CIVisual* This,FLOAT *value) {
    return This->lpVtbl->get_RotationAngleInDegrees(This,value);
}
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CUI_CComposition_CIVisual_put_RotationAngleInDegrees(__x_ABI_CWindows_CUI_CComposition_CIVisual* This,FLOAT value) {
    return This->lpVtbl->put_RotationAngleInDegrees(This,value);
}
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CUI_CComposition_CIVisual_get_RotationAxis(__x_ABI_CWindows_CUI_CComposition_CIVisual* This,struct __x_ABI_CWindows_CFoundation_CNumerics_CVector3 *value) {
    return This->lpVtbl->get_RotationAxis(This,value);
}
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CUI_CComposition_CIVisual_put_RotationAxis(__x_ABI_CWindows_CUI_CComposition_CIVisual* This,struct __x_ABI_CWindows_CFoundation_CNumerics_CVector3 value) {
    return This->lpVtbl->put_RotationAxis(This,value);
}
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CUI_CComposition_CIVisual_get_Scale(__x_ABI_CWindows_CUI_CComposition_CIVisual* This,struct __x_ABI_CWindows_CFoundation_CNumerics_CVector3 *value) {
    return This->lpVtbl->get_Scale(This,value);
}
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CUI_CComposition_CIVisual_put_Scale(__x_ABI_CWindows_CUI_CComposition_CIVisual* This,struct __x_ABI_CWindows_CFoundation_CNumerics_CVector3 value) {
    return This->lpVtbl->put_Scale(This,value);
}
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CUI_CComposition_CIVisual_get_Size(__x_ABI_CWindows_CUI_CComposition_CIVisual* This,struct __x_ABI_CWindows_CFoundation_CNumerics_CVector2 *value) {
    return This->lpVtbl->get_Size(This,value);
}
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CUI_CComposition_CIVisual_put_Size(__x_ABI_CWindows_CUI_CComposition_CIVisual* This,struct __x_ABI_CWindows_CFoundation_CNumerics_CVector2 value) {
    return This->lpVtbl->put_Size(This,value);
}
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CUI_CComposition_CIVisual_get_TransformMatrix(__x_ABI_CWindows_CUI_CComposition_CIVisual* This,struct __x_ABI_CWindows_CFoundation_CNumerics_CMatrix4x4 *value) {
    return This->lpVtbl->get_TransformMatrix(This,value);
}
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CUI_CComposition_CIVisual_put_TransformMatrix(__x_ABI_CWindows_CUI_CComposition_CIVisual* This,struct __x_ABI_CWindows_CFoundation_CNumerics_CMatrix4x4 value) {
    return This->lpVtbl->put_TransformMatrix(This,value);
}
#endif
#ifdef WIDL_using_Windows_UI_Composition
#define IID_IVisual IID___x_ABI_CWindows_CUI_CComposition_CIVisual
#define IVisualVtbl __x_ABI_CWindows_CUI_CComposition_CIVisualVtbl
#define IVisual __x_ABI_CWindows_CUI_CComposition_CIVisual
#define IVisual_QueryInterface __x_ABI_CWindows_CUI_CComposition_CIVisual_QueryInterface
#define IVisual_AddRef __x_ABI_CWindows_CUI_CComposition_CIVisual_AddRef
#define IVisual_Release __x_ABI_CWindows_CUI_CComposition_CIVisual_Release
#define IVisual_GetIids __x_ABI_CWindows_CUI_CComposition_CIVisual_GetIids
#define IVisual_GetRuntimeClassName __x_ABI_CWindows_CUI_CComposition_CIVisual_GetRuntimeClassName
#define IVisual_GetTrustLevel __x_ABI_CWindows_CUI_CComposition_CIVisual_GetTrustLevel
#define IVisual_get_AnchorPoint __x_ABI_CWindows_CUI_CComposition_CIVisual_get_AnchorPoint
#define IVisual_put_AnchorPoint __x_ABI_CWindows_CUI_CComposition_CIVisual_put_AnchorPoint
#define IVisual_get_BackfaceVisibility __x_ABI_CWindows_CUI_CComposition_CIVisual_get_BackfaceVisibility
#define IVisual_put_BackfaceVisibility __x_ABI_CWindows_CUI_CComposition_CIVisual_put_BackfaceVisibility
#define IVisual_get_BorderMode __x_ABI_CWindows_CUI_CComposition_CIVisual_get_BorderMode
#define IVisual_put_BorderMode __x_ABI_CWindows_CUI_CComposition_CIVisual_put_BorderMode
#define IVisual_get_CenterPoint __x_ABI_CWindows_CUI_CComposition_CIVisual_get_CenterPoint
#define IVisual_put_CenterPoint __x_ABI_CWindows_CUI_CComposition_CIVisual_put_CenterPoint
#define IVisual_get_Clip __x_ABI_CWindows_CUI_CComposition_CIVisual_get_Clip
#define IVisual_put_Clip __x_ABI_CWindows_CUI_CComposition_CIVisual_put_Clip
#define IVisual_get_CompositeMode __x_ABI_CWindows_CUI_CComposition_CIVisual_get_CompositeMode
#define IVisual_put_CompositeMode __x_ABI_CWindows_CUI_CComposition_CIVisual_put_CompositeMode
#define IVisual_get_IsVisible __x_ABI_CWindows_CUI_CComposition_CIVisual_get_IsVisible
#define IVisual_put_IsVisible __x_ABI_CWindows_CUI_CComposition_CIVisual_put_IsVisible
#define IVisual_get_Offset __x_ABI_CWindows_CUI_CComposition_CIVisual_get_Offset
#define IVisual_put_Offset __x_ABI_CWindows_CUI_CComposition_CIVisual_put_Offset
#define IVisual_get_Opacity __x_ABI_CWindows_CUI_CComposition_CIVisual_get_Opacity
#define IVisual_put_Opacity __x_ABI_CWindows_CUI_CComposition_CIVisual_put_Opacity
#define IVisual_get_Orientation __x_ABI_CWindows_CUI_CComposition_CIVisual_get_Orientation
#define IVisual_put_Orientation __x_ABI_CWindows_CUI_CComposition_CIVisual_put_Orientation
#define IVisual_get_Parent __x_ABI_CWindows_CUI_CComposition_CIVisual_get_Parent
#define IVisual_get_RotationAngle __x_ABI_CWindows_CUI_CComposition_CIVisual_get_RotationAngle
#define IVisual_put_RotationAngle __x_ABI_CWindows_CUI_CComposition_CIVisual_put_RotationAngle
#define IVisual_get_RotationAngleInDegrees __x_ABI_CWindows_CUI_CComposition_CIVisual_get_RotationAngleInDegrees
#define IVisual_put_RotationAngleInDegrees __x_ABI_CWindows_CUI_CComposition_CIVisual_put_RotationAngleInDegrees
#define IVisual_get_RotationAxis __x_ABI_CWindows_CUI_CComposition_CIVisual_get_RotationAxis
#define IVisual_put_RotationAxis __x_ABI_CWindows_CUI_CComposition_CIVisual_put_RotationAxis
#define IVisual_get_Scale __x_ABI_CWindows_CUI_CComposition_CIVisual_get_Scale
#define IVisual_put_Scale __x_ABI_CWindows_CUI_CComposition_CIVisual_put_Scale
#define IVisual_get_Size __x_ABI_CWindows_CUI_CComposition_CIVisual_get_Size
#define IVisual_put_Size __x_ABI_CWindows_CUI_CComposition_CIVisual_put_Size
#define IVisual_get_TransformMatrix __x_ABI_CWindows_CUI_CComposition_CIVisual_get_TransformMatrix
#define IVisual_put_TransformMatrix __x_ABI_CWindows_CUI_CComposition_CIVisual_put_TransformMatrix
#endif /* WIDL_using_Windows_UI_Composition */
#endif

#endif

#endif  /* ____x_ABI_CWindows_CUI_CComposition_CIVisual_INTERFACE_DEFINED__ */
#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x20000 */

/*****************************************************************************
 * IVisualFactory interface
 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x20000
#ifndef ____x_ABI_CWindows_CUI_CComposition_CIVisualFactory_INTERFACE_DEFINED__
#define ____x_ABI_CWindows_CUI_CComposition_CIVisualFactory_INTERFACE_DEFINED__

DEFINE_GUID(IID___x_ABI_CWindows_CUI_CComposition_CIVisualFactory, 0xad0ff93e, 0xb502, 0x4eb5, 0x87,0xb4, 0x9a,0x38,0xa7,0x1d,0x01,0x37);
#if defined(__cplusplus) && !defined(CINTERFACE)
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace UI {
            namespace Composition {
                MIDL_INTERFACE("ad0ff93e-b502-4eb5-87b4-9a38a71d0137")
                IVisualFactory : public IInspectable
                {
                };
            }
        }
    }
}
extern "C" {
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(__x_ABI_CWindows_CUI_CComposition_CIVisualFactory, 0xad0ff93e, 0xb502, 0x4eb5, 0x87,0xb4, 0x9a,0x38,0xa7,0x1d,0x01,0x37)
#endif
#else
typedef struct __x_ABI_CWindows_CUI_CComposition_CIVisualFactoryVtbl {
    BEGIN_INTERFACE

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

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

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

    /*** IInspectable methods ***/
    HRESULT (STDMETHODCALLTYPE *GetIids)(
        __x_ABI_CWindows_CUI_CComposition_CIVisualFactory *This,
        ULONG *iidCount,
        IID **iids);

    HRESULT (STDMETHODCALLTYPE *GetRuntimeClassName)(
        __x_ABI_CWindows_CUI_CComposition_CIVisualFactory *This,
        HSTRING *className);

    HRESULT (STDMETHODCALLTYPE *GetTrustLevel)(
        __x_ABI_CWindows_CUI_CComposition_CIVisualFactory *This,
        TrustLevel *trustLevel);

    END_INTERFACE
} __x_ABI_CWindows_CUI_CComposition_CIVisualFactoryVtbl;

interface __x_ABI_CWindows_CUI_CComposition_CIVisualFactory {
    CONST_VTBL __x_ABI_CWindows_CUI_CComposition_CIVisualFactoryVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define __x_ABI_CWindows_CUI_CComposition_CIVisualFactory_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define __x_ABI_CWindows_CUI_CComposition_CIVisualFactory_AddRef(This) (This)->lpVtbl->AddRef(This)
#define __x_ABI_CWindows_CUI_CComposition_CIVisualFactory_Release(This) (This)->lpVtbl->Release(This)
/*** IInspectable methods ***/
#define __x_ABI_CWindows_CUI_CComposition_CIVisualFactory_GetIids(This,iidCount,iids) (This)->lpVtbl->GetIids(This,iidCount,iids)
#define __x_ABI_CWindows_CUI_CComposition_CIVisualFactory_GetRuntimeClassName(This,className) (This)->lpVtbl->GetRuntimeClassName(This,className)
#define __x_ABI_CWindows_CUI_CComposition_CIVisualFactory_GetTrustLevel(This,trustLevel) (This)->lpVtbl->GetTrustLevel(This,trustLevel)
#else
/*** IUnknown methods ***/
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CUI_CComposition_CIVisualFactory_QueryInterface(__x_ABI_CWindows_CUI_CComposition_CIVisualFactory* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG __x_ABI_CWindows_CUI_CComposition_CIVisualFactory_AddRef(__x_ABI_CWindows_CUI_CComposition_CIVisualFactory* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG __x_ABI_CWindows_CUI_CComposition_CIVisualFactory_Release(__x_ABI_CWindows_CUI_CComposition_CIVisualFactory* This) {
    return This->lpVtbl->Release(This);
}
/*** IInspectable methods ***/
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CUI_CComposition_CIVisualFactory_GetIids(__x_ABI_CWindows_CUI_CComposition_CIVisualFactory* This,ULONG *iidCount,IID **iids) {
    return This->lpVtbl->GetIids(This,iidCount,iids);
}
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CUI_CComposition_CIVisualFactory_GetRuntimeClassName(__x_ABI_CWindows_CUI_CComposition_CIVisualFactory* This,HSTRING *className) {
    return This->lpVtbl->GetRuntimeClassName(This,className);
}
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CUI_CComposition_CIVisualFactory_GetTrustLevel(__x_ABI_CWindows_CUI_CComposition_CIVisualFactory* This,TrustLevel *trustLevel) {
    return This->lpVtbl->GetTrustLevel(This,trustLevel);
}
#endif
#ifdef WIDL_using_Windows_UI_Composition
#define IID_IVisualFactory IID___x_ABI_CWindows_CUI_CComposition_CIVisualFactory
#define IVisualFactoryVtbl __x_ABI_CWindows_CUI_CComposition_CIVisualFactoryVtbl
#define IVisualFactory __x_ABI_CWindows_CUI_CComposition_CIVisualFactory
#define IVisualFactory_QueryInterface __x_ABI_CWindows_CUI_CComposition_CIVisualFactory_QueryInterface
#define IVisualFactory_AddRef __x_ABI_CWindows_CUI_CComposition_CIVisualFactory_AddRef
#define IVisualFactory_Release __x_ABI_CWindows_CUI_CComposition_CIVisualFactory_Release
#define IVisualFactory_GetIids __x_ABI_CWindows_CUI_CComposition_CIVisualFactory_GetIids
#define IVisualFactory_GetRuntimeClassName __x_ABI_CWindows_CUI_CComposition_CIVisualFactory_GetRuntimeClassName
#define IVisualFactory_GetTrustLevel __x_ABI_CWindows_CUI_CComposition_CIVisualFactory_GetTrustLevel
#endif /* WIDL_using_Windows_UI_Composition */
#endif

#endif

#endif  /* ____x_ABI_CWindows_CUI_CComposition_CIVisualFactory_INTERFACE_DEFINED__ */
#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x20000 */

/*****************************************************************************
 * IVisualCollection interface
 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x20000
#ifndef ____x_ABI_CWindows_CUI_CComposition_CIVisualCollection_INTERFACE_DEFINED__
#define ____x_ABI_CWindows_CUI_CComposition_CIVisualCollection_INTERFACE_DEFINED__

DEFINE_GUID(IID___x_ABI_CWindows_CUI_CComposition_CIVisualCollection, 0x8b745505, 0xfd3e, 0x4a98, 0x84,0xa8, 0xe9,0x49,0x46,0x8c,0x6b,0xcb);
#if defined(__cplusplus) && !defined(CINTERFACE)
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace UI {
            namespace Composition {
                MIDL_INTERFACE("8b745505-fd3e-4a98-84a8-e949468c6bcb")
                IVisualCollection : public IInspectable
                {
                    virtual HRESULT STDMETHODCALLTYPE get_Count(
                        INT32 *value) = 0;

                    virtual HRESULT STDMETHODCALLTYPE InsertAbove(
                        ABI::Windows::UI::Composition::IVisual *child,
                        ABI::Windows::UI::Composition::IVisual *sibling) = 0;

                    virtual HRESULT STDMETHODCALLTYPE InsertAtBottom(
                        ABI::Windows::UI::Composition::IVisual *child) = 0;

                    virtual HRESULT STDMETHODCALLTYPE InsertAtTop(
                        ABI::Windows::UI::Composition::IVisual *child) = 0;

                    virtual HRESULT STDMETHODCALLTYPE InsertBelow(
                        ABI::Windows::UI::Composition::IVisual *child,
                        ABI::Windows::UI::Composition::IVisual *sibling) = 0;

                    virtual HRESULT STDMETHODCALLTYPE Remove(
                        ABI::Windows::UI::Composition::IVisual *child) = 0;

                    virtual HRESULT STDMETHODCALLTYPE RemoveAll(
                        ) = 0;

                };
            }
        }
    }
}
extern "C" {
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(__x_ABI_CWindows_CUI_CComposition_CIVisualCollection, 0x8b745505, 0xfd3e, 0x4a98, 0x84,0xa8, 0xe9,0x49,0x46,0x8c,0x6b,0xcb)
#endif
#else
typedef struct __x_ABI_CWindows_CUI_CComposition_CIVisualCollectionVtbl {
    BEGIN_INTERFACE

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

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

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

    /*** IInspectable methods ***/
    HRESULT (STDMETHODCALLTYPE *GetIids)(
        __x_ABI_CWindows_CUI_CComposition_CIVisualCollection *This,
        ULONG *iidCount,
        IID **iids);

    HRESULT (STDMETHODCALLTYPE *GetRuntimeClassName)(
        __x_ABI_CWindows_CUI_CComposition_CIVisualCollection *This,
        HSTRING *className);

    HRESULT (STDMETHODCALLTYPE *GetTrustLevel)(
        __x_ABI_CWindows_CUI_CComposition_CIVisualCollection *This,
        TrustLevel *trustLevel);

    /*** IVisualCollection methods ***/
    HRESULT (STDMETHODCALLTYPE *get_Count)(
        __x_ABI_CWindows_CUI_CComposition_CIVisualCollection *This,
        INT32 *value);

    HRESULT (STDMETHODCALLTYPE *InsertAbove)(
        __x_ABI_CWindows_CUI_CComposition_CIVisualCollection *This,
        __x_ABI_CWindows_CUI_CComposition_CIVisual *child,
        __x_ABI_CWindows_CUI_CComposition_CIVisual *sibling);

    HRESULT (STDMETHODCALLTYPE *InsertAtBottom)(
        __x_ABI_CWindows_CUI_CComposition_CIVisualCollection *This,
        __x_ABI_CWindows_CUI_CComposition_CIVisual *child);

    HRESULT (STDMETHODCALLTYPE *InsertAtTop)(
        __x_ABI_CWindows_CUI_CComposition_CIVisualCollection *This,
        __x_ABI_CWindows_CUI_CComposition_CIVisual *child);

    HRESULT (STDMETHODCALLTYPE *InsertBelow)(
        __x_ABI_CWindows_CUI_CComposition_CIVisualCollection *This,
        __x_ABI_CWindows_CUI_CComposition_CIVisual *child,
        __x_ABI_CWindows_CUI_CComposition_CIVisual *sibling);

    HRESULT (STDMETHODCALLTYPE *Remove)(
        __x_ABI_CWindows_CUI_CComposition_CIVisualCollection *This,
        __x_ABI_CWindows_CUI_CComposition_CIVisual *child);

    HRESULT (STDMETHODCALLTYPE *RemoveAll)(
        __x_ABI_CWindows_CUI_CComposition_CIVisualCollection *This);

    END_INTERFACE
} __x_ABI_CWindows_CUI_CComposition_CIVisualCollectionVtbl;

interface __x_ABI_CWindows_CUI_CComposition_CIVisualCollection {
    CONST_VTBL __x_ABI_CWindows_CUI_CComposition_CIVisualCollectionVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define __x_ABI_CWindows_CUI_CComposition_CIVisualCollection_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define __x_ABI_CWindows_CUI_CComposition_CIVisualCollection_AddRef(This) (This)->lpVtbl->AddRef(This)
#define __x_ABI_CWindows_CUI_CComposition_CIVisualCollection_Release(This) (This)->lpVtbl->Release(This)
/*** IInspectable methods ***/
#define __x_ABI_CWindows_CUI_CComposition_CIVisualCollection_GetIids(This,iidCount,iids) (This)->lpVtbl->GetIids(This,iidCount,iids)
#define __x_ABI_CWindows_CUI_CComposition_CIVisualCollection_GetRuntimeClassName(This,className) (This)->lpVtbl->GetRuntimeClassName(This,className)
#define __x_ABI_CWindows_CUI_CComposition_CIVisualCollection_GetTrustLevel(This,trustLevel) (This)->lpVtbl->GetTrustLevel(This,trustLevel)
/*** IVisualCollection methods ***/
#define __x_ABI_CWindows_CUI_CComposition_CIVisualCollection_get_Count(This,value) (This)->lpVtbl->get_Count(This,value)
#define __x_ABI_CWindows_CUI_CComposition_CIVisualCollection_InsertAbove(This,child,sibling) (This)->lpVtbl->InsertAbove(This,child,sibling)
#define __x_ABI_CWindows_CUI_CComposition_CIVisualCollection_InsertAtBottom(This,child) (This)->lpVtbl->InsertAtBottom(This,child)
#define __x_ABI_CWindows_CUI_CComposition_CIVisualCollection_InsertAtTop(This,child) (This)->lpVtbl->InsertAtTop(This,child)
#define __x_ABI_CWindows_CUI_CComposition_CIVisualCollection_InsertBelow(This,child,sibling) (This)->lpVtbl->InsertBelow(This,child,sibling)
#define __x_ABI_CWindows_CUI_CComposition_CIVisualCollection_Remove(This,child) (This)->lpVtbl->Remove(This,child)
#define __x_ABI_CWindows_CUI_CComposition_CIVisualCollection_RemoveAll(This) (This)->lpVtbl->RemoveAll(This)
#else
/*** IUnknown methods ***/
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CUI_CComposition_CIVisualCollection_QueryInterface(__x_ABI_CWindows_CUI_CComposition_CIVisualCollection* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG __x_ABI_CWindows_CUI_CComposition_CIVisualCollection_AddRef(__x_ABI_CWindows_CUI_CComposition_CIVisualCollection* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG __x_ABI_CWindows_CUI_CComposition_CIVisualCollection_Release(__x_ABI_CWindows_CUI_CComposition_CIVisualCollection* This) {
    return This->lpVtbl->Release(This);
}
/*** IInspectable methods ***/
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CUI_CComposition_CIVisualCollection_GetIids(__x_ABI_CWindows_CUI_CComposition_CIVisualCollection* This,ULONG *iidCount,IID **iids) {
    return This->lpVtbl->GetIids(This,iidCount,iids);
}
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CUI_CComposition_CIVisualCollection_GetRuntimeClassName(__x_ABI_CWindows_CUI_CComposition_CIVisualCollection* This,HSTRING *className) {
    return This->lpVtbl->GetRuntimeClassName(This,className);
}
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CUI_CComposition_CIVisualCollection_GetTrustLevel(__x_ABI_CWindows_CUI_CComposition_CIVisualCollection* This,TrustLevel *trustLevel) {
    return This->lpVtbl->GetTrustLevel(This,trustLevel);
}
/*** IVisualCollection methods ***/
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CUI_CComposition_CIVisualCollection_get_Count(__x_ABI_CWindows_CUI_CComposition_CIVisualCollection* This,INT32 *value) {
    return This->lpVtbl->get_Count(This,value);
}
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CUI_CComposition_CIVisualCollection_InsertAbove(__x_ABI_CWindows_CUI_CComposition_CIVisualCollection* This,__x_ABI_CWindows_CUI_CComposition_CIVisual *child,__x_ABI_CWindows_CUI_CComposition_CIVisual *sibling) {
    return This->lpVtbl->InsertAbove(This,child,sibling);
}
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CUI_CComposition_CIVisualCollection_InsertAtBottom(__x_ABI_CWindows_CUI_CComposition_CIVisualCollection* This,__x_ABI_CWindows_CUI_CComposition_CIVisual *child) {
    return This->lpVtbl->InsertAtBottom(This,child);
}
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CUI_CComposition_CIVisualCollection_InsertAtTop(__x_ABI_CWindows_CUI_CComposition_CIVisualCollection* This,__x_ABI_CWindows_CUI_CComposition_CIVisual *child) {
    return This->lpVtbl->InsertAtTop(This,child);
}
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CUI_CComposition_CIVisualCollection_InsertBelow(__x_ABI_CWindows_CUI_CComposition_CIVisualCollection* This,__x_ABI_CWindows_CUI_CComposition_CIVisual *child,__x_ABI_CWindows_CUI_CComposition_CIVisual *sibling) {
    return This->lpVtbl->InsertBelow(This,child,sibling);
}
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CUI_CComposition_CIVisualCollection_Remove(__x_ABI_CWindows_CUI_CComposition_CIVisualCollection* This,__x_ABI_CWindows_CUI_CComposition_CIVisual *child) {
    return This->lpVtbl->Remove(This,child);
}
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CUI_CComposition_CIVisualCollection_RemoveAll(__x_ABI_CWindows_CUI_CComposition_CIVisualCollection* This) {
    return This->lpVtbl->RemoveAll(This);
}
#endif
#ifdef WIDL_using_Windows_UI_Composition
#define IID_IVisualCollection IID___x_ABI_CWindows_CUI_CComposition_CIVisualCollection
#define IVisualCollectionVtbl __x_ABI_CWindows_CUI_CComposition_CIVisualCollectionVtbl
#define IVisualCollection __x_ABI_CWindows_CUI_CComposition_CIVisualCollection
#define IVisualCollection_QueryInterface __x_ABI_CWindows_CUI_CComposition_CIVisualCollection_QueryInterface
#define IVisualCollection_AddRef __x_ABI_CWindows_CUI_CComposition_CIVisualCollection_AddRef
#define IVisualCollection_Release __x_ABI_CWindows_CUI_CComposition_CIVisualCollection_Release
#define IVisualCollection_GetIids __x_ABI_CWindows_CUI_CComposition_CIVisualCollection_GetIids
#define IVisualCollection_GetRuntimeClassName __x_ABI_CWindows_CUI_CComposition_CIVisualCollection_GetRuntimeClassName
#define IVisualCollection_GetTrustLevel __x_ABI_CWindows_CUI_CComposition_CIVisualCollection_GetTrustLevel
#define IVisualCollection_get_Count __x_ABI_CWindows_CUI_CComposition_CIVisualCollection_get_Count
#define IVisualCollection_InsertAbove __x_ABI_CWindows_CUI_CComposition_CIVisualCollection_InsertAbove
#define IVisualCollection_InsertAtBottom __x_ABI_CWindows_CUI_CComposition_CIVisualCollection_InsertAtBottom
#define IVisualCollection_InsertAtTop __x_ABI_CWindows_CUI_CComposition_CIVisualCollection_InsertAtTop
#define IVisualCollection_InsertBelow __x_ABI_CWindows_CUI_CComposition_CIVisualCollection_InsertBelow
#define IVisualCollection_Remove __x_ABI_CWindows_CUI_CComposition_CIVisualCollection_Remove
#define IVisualCollection_RemoveAll __x_ABI_CWindows_CUI_CComposition_CIVisualCollection_RemoveAll
#endif /* WIDL_using_Windows_UI_Composition */
#endif

#endif

#endif  /* ____x_ABI_CWindows_CUI_CComposition_CIVisualCollection_INTERFACE_DEFINED__ */
#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x20000 */

/*
 * Class Windows.UI.Composition.ColorKeyFrameAnimation
 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x20000
#ifndef RUNTIMECLASS_Windows_UI_Composition_ColorKeyFrameAnimation_DEFINED
#define RUNTIMECLASS_Windows_UI_Composition_ColorKeyFrameAnimation_DEFINED
#if !defined(_MSC_VER) && !defined(__MINGW32__)
static const WCHAR RuntimeClass_Windows_UI_Composition_ColorKeyFrameAnimation[] = {'W','i','n','d','o','w','s','.','U','I','.','C','o','m','p','o','s','i','t','i','o','n','.','C','o','l','o','r','K','e','y','F','r','a','m','e','A','n','i','m','a','t','i','o','n',0};
#elif defined(__GNUC__) && !defined(__cplusplus)
const DECLSPEC_SELECTANY WCHAR RuntimeClass_Windows_UI_Composition_ColorKeyFrameAnimation[] = L"Windows.UI.Composition.ColorKeyFrameAnimation";
#else
extern const DECLSPEC_SELECTANY WCHAR RuntimeClass_Windows_UI_Composition_ColorKeyFrameAnimation[] = {'W','i','n','d','o','w','s','.','U','I','.','C','o','m','p','o','s','i','t','i','o','n','.','C','o','l','o','r','K','e','y','F','r','a','m','e','A','n','i','m','a','t','i','o','n',0};
#endif
#endif /* RUNTIMECLASS_Windows_UI_Composition_ColorKeyFrameAnimation_DEFINED */
#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x20000 */

/*
 * Class Windows.UI.Composition.CompositionAnimation
 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x20000
#ifndef RUNTIMECLASS_Windows_UI_Composition_CompositionAnimation_DEFINED
#define RUNTIMECLASS_Windows_UI_Composition_CompositionAnimation_DEFINED
#if !defined(_MSC_VER) && !defined(__MINGW32__)
static const WCHAR RuntimeClass_Windows_UI_Composition_CompositionAnimation[] = {'W','i','n','d','o','w','s','.','U','I','.','C','o','m','p','o','s','i','t','i','o','n','.','C','o','m','p','o','s','i','t','i','o','n','A','n','i','m','a','t','i','o','n',0};
#elif defined(__GNUC__) && !defined(__cplusplus)
const DECLSPEC_SELECTANY WCHAR RuntimeClass_Windows_UI_Composition_CompositionAnimation[] = L"Windows.UI.Composition.CompositionAnimation";
#else
extern const DECLSPEC_SELECTANY WCHAR RuntimeClass_Windows_UI_Composition_CompositionAnimation[] = {'W','i','n','d','o','w','s','.','U','I','.','C','o','m','p','o','s','i','t','i','o','n','.','C','o','m','p','o','s','i','t','i','o','n','A','n','i','m','a','t','i','o','n',0};
#endif
#endif /* RUNTIMECLASS_Windows_UI_Composition_CompositionAnimation_DEFINED */
#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x20000 */

/*
 * Class Windows.UI.Composition.CompositionBatchCompletedEventArgs
 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x20000
#ifndef RUNTIMECLASS_Windows_UI_Composition_CompositionBatchCompletedEventArgs_DEFINED
#define RUNTIMECLASS_Windows_UI_Composition_CompositionBatchCompletedEventArgs_DEFINED
#if !defined(_MSC_VER) && !defined(__MINGW32__)
static const WCHAR RuntimeClass_Windows_UI_Composition_CompositionBatchCompletedEventArgs[] = {'W','i','n','d','o','w','s','.','U','I','.','C','o','m','p','o','s','i','t','i','o','n','.','C','o','m','p','o','s','i','t','i','o','n','B','a','t','c','h','C','o','m','p','l','e','t','e','d','E','v','e','n','t','A','r','g','s',0};
#elif defined(__GNUC__) && !defined(__cplusplus)
const DECLSPEC_SELECTANY WCHAR RuntimeClass_Windows_UI_Composition_CompositionBatchCompletedEventArgs[] = L"Windows.UI.Composition.CompositionBatchCompletedEventArgs";
#else
extern const DECLSPEC_SELECTANY WCHAR RuntimeClass_Windows_UI_Composition_CompositionBatchCompletedEventArgs[] = {'W','i','n','d','o','w','s','.','U','I','.','C','o','m','p','o','s','i','t','i','o','n','.','C','o','m','p','o','s','i','t','i','o','n','B','a','t','c','h','C','o','m','p','l','e','t','e','d','E','v','e','n','t','A','r','g','s',0};
#endif
#endif /* RUNTIMECLASS_Windows_UI_Composition_CompositionBatchCompletedEventArgs_DEFINED */
#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x20000 */

/*
 * Class Windows.UI.Composition.CompositionBrush
 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x20000
#ifndef RUNTIMECLASS_Windows_UI_Composition_CompositionBrush_DEFINED
#define RUNTIMECLASS_Windows_UI_Composition_CompositionBrush_DEFINED
#if !defined(_MSC_VER) && !defined(__MINGW32__)
static const WCHAR RuntimeClass_Windows_UI_Composition_CompositionBrush[] = {'W','i','n','d','o','w','s','.','U','I','.','C','o','m','p','o','s','i','t','i','o','n','.','C','o','m','p','o','s','i','t','i','o','n','B','r','u','s','h',0};
#elif defined(__GNUC__) && !defined(__cplusplus)
const DECLSPEC_SELECTANY WCHAR RuntimeClass_Windows_UI_Composition_CompositionBrush[] = L"Windows.UI.Composition.CompositionBrush";
#else
extern const DECLSPEC_SELECTANY WCHAR RuntimeClass_Windows_UI_Composition_CompositionBrush[] = {'W','i','n','d','o','w','s','.','U','I','.','C','o','m','p','o','s','i','t','i','o','n','.','C','o','m','p','o','s','i','t','i','o','n','B','r','u','s','h',0};
#endif
#endif /* RUNTIMECLASS_Windows_UI_Composition_CompositionBrush_DEFINED */
#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x20000 */

/*
 * Class Windows.UI.Composition.CompositionClip
 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x20000
#ifndef RUNTIMECLASS_Windows_UI_Composition_CompositionClip_DEFINED
#define RUNTIMECLASS_Windows_UI_Composition_CompositionClip_DEFINED
#if !defined(_MSC_VER) && !defined(__MINGW32__)
static const WCHAR RuntimeClass_Windows_UI_Composition_CompositionClip[] = {'W','i','n','d','o','w','s','.','U','I','.','C','o','m','p','o','s','i','t','i','o','n','.','C','o','m','p','o','s','i','t','i','o','n','C','l','i','p',0};
#elif defined(__GNUC__) && !defined(__cplusplus)
const DECLSPEC_SELECTANY WCHAR RuntimeClass_Windows_UI_Composition_CompositionClip[] = L"Windows.UI.Composition.CompositionClip";
#else
extern const DECLSPEC_SELECTANY WCHAR RuntimeClass_Windows_UI_Composition_CompositionClip[] = {'W','i','n','d','o','w','s','.','U','I','.','C','o','m','p','o','s','i','t','i','o','n','.','C','o','m','p','o','s','i','t','i','o','n','C','l','i','p',0};
#endif
#endif /* RUNTIMECLASS_Windows_UI_Composition_CompositionClip_DEFINED */
#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x20000 */

/*
 * Class Windows.UI.Composition.CompositionColorBrush
 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x20000
#ifndef RUNTIMECLASS_Windows_UI_Composition_CompositionColorBrush_DEFINED
#define RUNTIMECLASS_Windows_UI_Composition_CompositionColorBrush_DEFINED
#if !defined(_MSC_VER) && !defined(__MINGW32__)
static const WCHAR RuntimeClass_Windows_UI_Composition_CompositionColorBrush[] = {'W','i','n','d','o','w','s','.','U','I','.','C','o','m','p','o','s','i','t','i','o','n','.','C','o','m','p','o','s','i','t','i','o','n','C','o','l','o','r','B','r','u','s','h',0};
#elif defined(__GNUC__) && !defined(__cplusplus)
const DECLSPEC_SELECTANY WCHAR RuntimeClass_Windows_UI_Composition_CompositionColorBrush[] = L"Windows.UI.Composition.CompositionColorBrush";
#else
extern const DECLSPEC_SELECTANY WCHAR RuntimeClass_Windows_UI_Composition_CompositionColorBrush[] = {'W','i','n','d','o','w','s','.','U','I','.','C','o','m','p','o','s','i','t','i','o','n','.','C','o','m','p','o','s','i','t','i','o','n','C','o','l','o','r','B','r','u','s','h',0};
#endif
#endif /* RUNTIMECLASS_Windows_UI_Composition_CompositionColorBrush_DEFINED */
#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x20000 */

/*
 * Class Windows.UI.Composition.CompositionCommitBatch
 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x20000
#ifndef RUNTIMECLASS_Windows_UI_Composition_CompositionCommitBatch_DEFINED
#define RUNTIMECLASS_Windows_UI_Composition_CompositionCommitBatch_DEFINED
#if !defined(_MSC_VER) && !defined(__MINGW32__)
static const WCHAR RuntimeClass_Windows_UI_Composition_CompositionCommitBatch[] = {'W','i','n','d','o','w','s','.','U','I','.','C','o','m','p','o','s','i','t','i','o','n','.','C','o','m','p','o','s','i','t','i','o','n','C','o','m','m','i','t','B','a','t','c','h',0};
#elif defined(__GNUC__) && !defined(__cplusplus)
const DECLSPEC_SELECTANY WCHAR RuntimeClass_Windows_UI_Composition_CompositionCommitBatch[] = L"Windows.UI.Composition.CompositionCommitBatch";
#else
extern const DECLSPEC_SELECTANY WCHAR RuntimeClass_Windows_UI_Composition_CompositionCommitBatch[] = {'W','i','n','d','o','w','s','.','U','I','.','C','o','m','p','o','s','i','t','i','o','n','.','C','o','m','p','o','s','i','t','i','o','n','C','o','m','m','i','t','B','a','t','c','h',0};
#endif
#endif /* RUNTIMECLASS_Windows_UI_Composition_CompositionCommitBatch_DEFINED */
#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x20000 */

/*
 * Class Windows.UI.Composition.CompositionDrawingSurface
 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x20000
#ifndef RUNTIMECLASS_Windows_UI_Composition_CompositionDrawingSurface_DEFINED
#define RUNTIMECLASS_Windows_UI_Composition_CompositionDrawingSurface_DEFINED
#if !defined(_MSC_VER) && !defined(__MINGW32__)
static const WCHAR RuntimeClass_Windows_UI_Composition_CompositionDrawingSurface[] = {'W','i','n','d','o','w','s','.','U','I','.','C','o','m','p','o','s','i','t','i','o','n','.','C','o','m','p','o','s','i','t','i','o','n','D','r','a','w','i','n','g','S','u','r','f','a','c','e',0};
#elif defined(__GNUC__) && !defined(__cplusplus)
const DECLSPEC_SELECTANY WCHAR RuntimeClass_Windows_UI_Composition_CompositionDrawingSurface[] = L"Windows.UI.Composition.CompositionDrawingSurface";
#else
extern const DECLSPEC_SELECTANY WCHAR RuntimeClass_Windows_UI_Composition_CompositionDrawingSurface[] = {'W','i','n','d','o','w','s','.','U','I','.','C','o','m','p','o','s','i','t','i','o','n','.','C','o','m','p','o','s','i','t','i','o','n','D','r','a','w','i','n','g','S','u','r','f','a','c','e',0};
#endif
#endif /* RUNTIMECLASS_Windows_UI_Composition_CompositionDrawingSurface_DEFINED */
#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x20000 */

/*
 * Class Windows.UI.Composition.CompositionEasingFunction
 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x20000
#ifndef RUNTIMECLASS_Windows_UI_Composition_CompositionEasingFunction_DEFINED
#define RUNTIMECLASS_Windows_UI_Composition_CompositionEasingFunction_DEFINED
#if !defined(_MSC_VER) && !defined(__MINGW32__)
static const WCHAR RuntimeClass_Windows_UI_Composition_CompositionEasingFunction[] = {'W','i','n','d','o','w','s','.','U','I','.','C','o','m','p','o','s','i','t','i','o','n','.','C','o','m','p','o','s','i','t','i','o','n','E','a','s','i','n','g','F','u','n','c','t','i','o','n',0};
#elif defined(__GNUC__) && !defined(__cplusplus)
const DECLSPEC_SELECTANY WCHAR RuntimeClass_Windows_UI_Composition_CompositionEasingFunction[] = L"Windows.UI.Composition.CompositionEasingFunction";
#else
extern const DECLSPEC_SELECTANY WCHAR RuntimeClass_Windows_UI_Composition_CompositionEasingFunction[] = {'W','i','n','d','o','w','s','.','U','I','.','C','o','m','p','o','s','i','t','i','o','n','.','C','o','m','p','o','s','i','t','i','o','n','E','a','s','i','n','g','F','u','n','c','t','i','o','n',0};
#endif
#endif /* RUNTIMECLASS_Windows_UI_Composition_CompositionEasingFunction_DEFINED */
#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x20000 */

/*
 * Class Windows.UI.Composition.CompositionEffectBrush
 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x20000
#ifndef RUNTIMECLASS_Windows_UI_Composition_CompositionEffectBrush_DEFINED
#define RUNTIMECLASS_Windows_UI_Composition_CompositionEffectBrush_DEFINED
#if !defined(_MSC_VER) && !defined(__MINGW32__)
static const WCHAR RuntimeClass_Windows_UI_Composition_CompositionEffectBrush[] = {'W','i','n','d','o','w','s','.','U','I','.','C','o','m','p','o','s','i','t','i','o','n','.','C','o','m','p','o','s','i','t','i','o','n','E','f','f','e','c','t','B','r','u','s','h',0};
#elif defined(__GNUC__) && !defined(__cplusplus)
const DECLSPEC_SELECTANY WCHAR RuntimeClass_Windows_UI_Composition_CompositionEffectBrush[] = L"Windows.UI.Composition.CompositionEffectBrush";
#else
extern const DECLSPEC_SELECTANY WCHAR RuntimeClass_Windows_UI_Composition_CompositionEffectBrush[] = {'W','i','n','d','o','w','s','.','U','I','.','C','o','m','p','o','s','i','t','i','o','n','.','C','o','m','p','o','s','i','t','i','o','n','E','f','f','e','c','t','B','r','u','s','h',0};
#endif
#endif /* RUNTIMECLASS_Windows_UI_Composition_CompositionEffectBrush_DEFINED */
#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x20000 */

/*
 * Class Windows.UI.Composition.CompositionEffectFactory
 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x20000
#ifndef RUNTIMECLASS_Windows_UI_Composition_CompositionEffectFactory_DEFINED
#define RUNTIMECLASS_Windows_UI_Composition_CompositionEffectFactory_DEFINED
#if !defined(_MSC_VER) && !defined(__MINGW32__)
static const WCHAR RuntimeClass_Windows_UI_Composition_CompositionEffectFactory[] = {'W','i','n','d','o','w','s','.','U','I','.','C','o','m','p','o','s','i','t','i','o','n','.','C','o','m','p','o','s','i','t','i','o','n','E','f','f','e','c','t','F','a','c','t','o','r','y',0};
#elif defined(__GNUC__) && !defined(__cplusplus)
const DECLSPEC_SELECTANY WCHAR RuntimeClass_Windows_UI_Composition_CompositionEffectFactory[] = L"Windows.UI.Composition.CompositionEffectFactory";
#else
extern const DECLSPEC_SELECTANY WCHAR RuntimeClass_Windows_UI_Composition_CompositionEffectFactory[] = {'W','i','n','d','o','w','s','.','U','I','.','C','o','m','p','o','s','i','t','i','o','n','.','C','o','m','p','o','s','i','t','i','o','n','E','f','f','e','c','t','F','a','c','t','o','r','y',0};
#endif
#endif /* RUNTIMECLASS_Windows_UI_Composition_CompositionEffectFactory_DEFINED */
#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x20000 */

/*
 * Class Windows.UI.Composition.CompositionGraphicsDevice
 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x20000
#ifndef RUNTIMECLASS_Windows_UI_Composition_CompositionGraphicsDevice_DEFINED
#define RUNTIMECLASS_Windows_UI_Composition_CompositionGraphicsDevice_DEFINED
#if !defined(_MSC_VER) && !defined(__MINGW32__)
static const WCHAR RuntimeClass_Windows_UI_Composition_CompositionGraphicsDevice[] = {'W','i','n','d','o','w','s','.','U','I','.','C','o','m','p','o','s','i','t','i','o','n','.','C','o','m','p','o','s','i','t','i','o','n','G','r','a','p','h','i','c','s','D','e','v','i','c','e',0};
#elif defined(__GNUC__) && !defined(__cplusplus)
const DECLSPEC_SELECTANY WCHAR RuntimeClass_Windows_UI_Composition_CompositionGraphicsDevice[] = L"Windows.UI.Composition.CompositionGraphicsDevice";
#else
extern const DECLSPEC_SELECTANY WCHAR RuntimeClass_Windows_UI_Composition_CompositionGraphicsDevice[] = {'W','i','n','d','o','w','s','.','U','I','.','C','o','m','p','o','s','i','t','i','o','n','.','C','o','m','p','o','s','i','t','i','o','n','G','r','a','p','h','i','c','s','D','e','v','i','c','e',0};
#endif
#endif /* RUNTIMECLASS_Windows_UI_Composition_CompositionGraphicsDevice_DEFINED */
#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x20000 */

/*
 * Class Windows.UI.Composition.CompositionObject
 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x20000
#ifndef RUNTIMECLASS_Windows_UI_Composition_CompositionObject_DEFINED
#define RUNTIMECLASS_Windows_UI_Composition_CompositionObject_DEFINED
#if !defined(_MSC_VER) && !defined(__MINGW32__)
static const WCHAR RuntimeClass_Windows_UI_Composition_CompositionObject[] = {'W','i','n','d','o','w','s','.','U','I','.','C','o','m','p','o','s','i','t','i','o','n','.','C','o','m','p','o','s','i','t','i','o','n','O','b','j','e','c','t',0};
#elif defined(__GNUC__) && !defined(__cplusplus)
const DECLSPEC_SELECTANY WCHAR RuntimeClass_Windows_UI_Composition_CompositionObject[] = L"Windows.UI.Composition.CompositionObject";
#else
extern const DECLSPEC_SELECTANY WCHAR RuntimeClass_Windows_UI_Composition_CompositionObject[] = {'W','i','n','d','o','w','s','.','U','I','.','C','o','m','p','o','s','i','t','i','o','n','.','C','o','m','p','o','s','i','t','i','o','n','O','b','j','e','c','t',0};
#endif
#endif /* RUNTIMECLASS_Windows_UI_Composition_CompositionObject_DEFINED */
#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x20000 */

/*
 * Class Windows.UI.Composition.CompositionPropertySet
 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x20000
#ifndef RUNTIMECLASS_Windows_UI_Composition_CompositionPropertySet_DEFINED
#define RUNTIMECLASS_Windows_UI_Composition_CompositionPropertySet_DEFINED
#if !defined(_MSC_VER) && !defined(__MINGW32__)
static const WCHAR RuntimeClass_Windows_UI_Composition_CompositionPropertySet[] = {'W','i','n','d','o','w','s','.','U','I','.','C','o','m','p','o','s','i','t','i','o','n','.','C','o','m','p','o','s','i','t','i','o','n','P','r','o','p','e','r','t','y','S','e','t',0};
#elif defined(__GNUC__) && !defined(__cplusplus)
const DECLSPEC_SELECTANY WCHAR RuntimeClass_Windows_UI_Composition_CompositionPropertySet[] = L"Windows.UI.Composition.CompositionPropertySet";
#else
extern const DECLSPEC_SELECTANY WCHAR RuntimeClass_Windows_UI_Composition_CompositionPropertySet[] = {'W','i','n','d','o','w','s','.','U','I','.','C','o','m','p','o','s','i','t','i','o','n','.','C','o','m','p','o','s','i','t','i','o','n','P','r','o','p','e','r','t','y','S','e','t',0};
#endif
#endif /* RUNTIMECLASS_Windows_UI_Composition_CompositionPropertySet_DEFINED */
#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x20000 */

/*
 * Class Windows.UI.Composition.CompositionScopedBatch
 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x20000
#ifndef RUNTIMECLASS_Windows_UI_Composition_CompositionScopedBatch_DEFINED
#define RUNTIMECLASS_Windows_UI_Composition_CompositionScopedBatch_DEFINED
#if !defined(_MSC_VER) && !defined(__MINGW32__)
static const WCHAR RuntimeClass_Windows_UI_Composition_CompositionScopedBatch[] = {'W','i','n','d','o','w','s','.','U','I','.','C','o','m','p','o','s','i','t','i','o','n','.','C','o','m','p','o','s','i','t','i','o','n','S','c','o','p','e','d','B','a','t','c','h',0};
#elif defined(__GNUC__) && !defined(__cplusplus)
const DECLSPEC_SELECTANY WCHAR RuntimeClass_Windows_UI_Composition_CompositionScopedBatch[] = L"Windows.UI.Composition.CompositionScopedBatch";
#else
extern const DECLSPEC_SELECTANY WCHAR RuntimeClass_Windows_UI_Composition_CompositionScopedBatch[] = {'W','i','n','d','o','w','s','.','U','I','.','C','o','m','p','o','s','i','t','i','o','n','.','C','o','m','p','o','s','i','t','i','o','n','S','c','o','p','e','d','B','a','t','c','h',0};
#endif
#endif /* RUNTIMECLASS_Windows_UI_Composition_CompositionScopedBatch_DEFINED */
#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x20000 */

/*
 * Class Windows.UI.Composition.CompositionSurfaceBrush
 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x20000
#ifndef RUNTIMECLASS_Windows_UI_Composition_CompositionSurfaceBrush_DEFINED
#define RUNTIMECLASS_Windows_UI_Composition_CompositionSurfaceBrush_DEFINED
#if !defined(_MSC_VER) && !defined(__MINGW32__)
static const WCHAR RuntimeClass_Windows_UI_Composition_CompositionSurfaceBrush[] = {'W','i','n','d','o','w','s','.','U','I','.','C','o','m','p','o','s','i','t','i','o','n','.','C','o','m','p','o','s','i','t','i','o','n','S','u','r','f','a','c','e','B','r','u','s','h',0};
#elif defined(__GNUC__) && !defined(__cplusplus)
const DECLSPEC_SELECTANY WCHAR RuntimeClass_Windows_UI_Composition_CompositionSurfaceBrush[] = L"Windows.UI.Composition.CompositionSurfaceBrush";
#else
extern const DECLSPEC_SELECTANY WCHAR RuntimeClass_Windows_UI_Composition_CompositionSurfaceBrush[] = {'W','i','n','d','o','w','s','.','U','I','.','C','o','m','p','o','s','i','t','i','o','n','.','C','o','m','p','o','s','i','t','i','o','n','S','u','r','f','a','c','e','B','r','u','s','h',0};
#endif
#endif /* RUNTIMECLASS_Windows_UI_Composition_CompositionSurfaceBrush_DEFINED */
#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x20000 */

/*
 * Class Windows.UI.Composition.CompositionTarget
 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x20000
#ifndef RUNTIMECLASS_Windows_UI_Composition_CompositionTarget_DEFINED
#define RUNTIMECLASS_Windows_UI_Composition_CompositionTarget_DEFINED
#if !defined(_MSC_VER) && !defined(__MINGW32__)
static const WCHAR RuntimeClass_Windows_UI_Composition_CompositionTarget[] = {'W','i','n','d','o','w','s','.','U','I','.','C','o','m','p','o','s','i','t','i','o','n','.','C','o','m','p','o','s','i','t','i','o','n','T','a','r','g','e','t',0};
#elif defined(__GNUC__) && !defined(__cplusplus)
const DECLSPEC_SELECTANY WCHAR RuntimeClass_Windows_UI_Composition_CompositionTarget[] = L"Windows.UI.Composition.CompositionTarget";
#else
extern const DECLSPEC_SELECTANY WCHAR RuntimeClass_Windows_UI_Composition_CompositionTarget[] = {'W','i','n','d','o','w','s','.','U','I','.','C','o','m','p','o','s','i','t','i','o','n','.','C','o','m','p','o','s','i','t','i','o','n','T','a','r','g','e','t',0};
#endif
#endif /* RUNTIMECLASS_Windows_UI_Composition_CompositionTarget_DEFINED */
#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x20000 */

/*
 * Class Windows.UI.Composition.Compositor
 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x20000
#ifndef RUNTIMECLASS_Windows_UI_Composition_Compositor_DEFINED
#define RUNTIMECLASS_Windows_UI_Composition_Compositor_DEFINED
#if !defined(_MSC_VER) && !defined(__MINGW32__)
static const WCHAR RuntimeClass_Windows_UI_Composition_Compositor[] = {'W','i','n','d','o','w','s','.','U','I','.','C','o','m','p','o','s','i','t','i','o','n','.','C','o','m','p','o','s','i','t','o','r',0};
#elif defined(__GNUC__) && !defined(__cplusplus)
const DECLSPEC_SELECTANY WCHAR RuntimeClass_Windows_UI_Composition_Compositor[] = L"Windows.UI.Composition.Compositor";
#else
extern const DECLSPEC_SELECTANY WCHAR RuntimeClass_Windows_UI_Composition_Compositor[] = {'W','i','n','d','o','w','s','.','U','I','.','C','o','m','p','o','s','i','t','i','o','n','.','C','o','m','p','o','s','i','t','o','r',0};
#endif
#endif /* RUNTIMECLASS_Windows_UI_Composition_Compositor_DEFINED */
#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x20000 */

/*
 * Class Windows.UI.Composition.ContainerVisual
 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x20000
#ifndef RUNTIMECLASS_Windows_UI_Composition_ContainerVisual_DEFINED
#define RUNTIMECLASS_Windows_UI_Composition_ContainerVisual_DEFINED
#if !defined(_MSC_VER) && !defined(__MINGW32__)
static const WCHAR RuntimeClass_Windows_UI_Composition_ContainerVisual[] = {'W','i','n','d','o','w','s','.','U','I','.','C','o','m','p','o','s','i','t','i','o','n','.','C','o','n','t','a','i','n','e','r','V','i','s','u','a','l',0};
#elif defined(__GNUC__) && !defined(__cplusplus)
const DECLSPEC_SELECTANY WCHAR RuntimeClass_Windows_UI_Composition_ContainerVisual[] = L"Windows.UI.Composition.ContainerVisual";
#else
extern const DECLSPEC_SELECTANY WCHAR RuntimeClass_Windows_UI_Composition_ContainerVisual[] = {'W','i','n','d','o','w','s','.','U','I','.','C','o','m','p','o','s','i','t','i','o','n','.','C','o','n','t','a','i','n','e','r','V','i','s','u','a','l',0};
#endif
#endif /* RUNTIMECLASS_Windows_UI_Composition_ContainerVisual_DEFINED */
#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x20000 */

/*
 * Class Windows.UI.Composition.CubicBezierEasingFunction
 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x20000
#ifndef RUNTIMECLASS_Windows_UI_Composition_CubicBezierEasingFunction_DEFINED
#define RUNTIMECLASS_Windows_UI_Composition_CubicBezierEasingFunction_DEFINED
#if !defined(_MSC_VER) && !defined(__MINGW32__)
static const WCHAR RuntimeClass_Windows_UI_Composition_CubicBezierEasingFunction[] = {'W','i','n','d','o','w','s','.','U','I','.','C','o','m','p','o','s','i','t','i','o','n','.','C','u','b','i','c','B','e','z','i','e','r','E','a','s','i','n','g','F','u','n','c','t','i','o','n',0};
#elif defined(__GNUC__) && !defined(__cplusplus)
const DECLSPEC_SELECTANY WCHAR RuntimeClass_Windows_UI_Composition_CubicBezierEasingFunction[] = L"Windows.UI.Composition.CubicBezierEasingFunction";
#else
extern const DECLSPEC_SELECTANY WCHAR RuntimeClass_Windows_UI_Composition_CubicBezierEasingFunction[] = {'W','i','n','d','o','w','s','.','U','I','.','C','o','m','p','o','s','i','t','i','o','n','.','C','u','b','i','c','B','e','z','i','e','r','E','a','s','i','n','g','F','u','n','c','t','i','o','n',0};
#endif
#endif /* RUNTIMECLASS_Windows_UI_Composition_CubicBezierEasingFunction_DEFINED */
#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x20000 */

/*
 * Class Windows.UI.Composition.ExpressionAnimation
 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x20000
#ifndef RUNTIMECLASS_Windows_UI_Composition_ExpressionAnimation_DEFINED
#define RUNTIMECLASS_Windows_UI_Composition_ExpressionAnimation_DEFINED
#if !defined(_MSC_VER) && !defined(__MINGW32__)
static const WCHAR RuntimeClass_Windows_UI_Composition_ExpressionAnimation[] = {'W','i','n','d','o','w','s','.','U','I','.','C','o','m','p','o','s','i','t','i','o','n','.','E','x','p','r','e','s','s','i','o','n','A','n','i','m','a','t','i','o','n',0};
#elif defined(__GNUC__) && !defined(__cplusplus)
const DECLSPEC_SELECTANY WCHAR RuntimeClass_Windows_UI_Composition_ExpressionAnimation[] = L"Windows.UI.Composition.ExpressionAnimation";
#else
extern const DECLSPEC_SELECTANY WCHAR RuntimeClass_Windows_UI_Composition_ExpressionAnimation[] = {'W','i','n','d','o','w','s','.','U','I','.','C','o','m','p','o','s','i','t','i','o','n','.','E','x','p','r','e','s','s','i','o','n','A','n','i','m','a','t','i','o','n',0};
#endif
#endif /* RUNTIMECLASS_Windows_UI_Composition_ExpressionAnimation_DEFINED */
#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x20000 */

/*
 * Class Windows.UI.Composition.InsetClip
 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x20000
#ifndef RUNTIMECLASS_Windows_UI_Composition_InsetClip_DEFINED
#define RUNTIMECLASS_Windows_UI_Composition_InsetClip_DEFINED
#if !defined(_MSC_VER) && !defined(__MINGW32__)
static const WCHAR RuntimeClass_Windows_UI_Composition_InsetClip[] = {'W','i','n','d','o','w','s','.','U','I','.','C','o','m','p','o','s','i','t','i','o','n','.','I','n','s','e','t','C','l','i','p',0};
#elif defined(__GNUC__) && !defined(__cplusplus)
const DECLSPEC_SELECTANY WCHAR RuntimeClass_Windows_UI_Composition_InsetClip[] = L"Windows.UI.Composition.InsetClip";
#else
extern const DECLSPEC_SELECTANY WCHAR RuntimeClass_Windows_UI_Composition_InsetClip[] = {'W','i','n','d','o','w','s','.','U','I','.','C','o','m','p','o','s','i','t','i','o','n','.','I','n','s','e','t','C','l','i','p',0};
#endif
#endif /* RUNTIMECLASS_Windows_UI_Composition_InsetClip_DEFINED */
#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x20000 */

/*
 * Class Windows.UI.Composition.LinearEasingFunction
 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x20000
#ifndef RUNTIMECLASS_Windows_UI_Composition_LinearEasingFunction_DEFINED
#define RUNTIMECLASS_Windows_UI_Composition_LinearEasingFunction_DEFINED
#if !defined(_MSC_VER) && !defined(__MINGW32__)
static const WCHAR RuntimeClass_Windows_UI_Composition_LinearEasingFunction[] = {'W','i','n','d','o','w','s','.','U','I','.','C','o','m','p','o','s','i','t','i','o','n','.','L','i','n','e','a','r','E','a','s','i','n','g','F','u','n','c','t','i','o','n',0};
#elif defined(__GNUC__) && !defined(__cplusplus)
const DECLSPEC_SELECTANY WCHAR RuntimeClass_Windows_UI_Composition_LinearEasingFunction[] = L"Windows.UI.Composition.LinearEasingFunction";
#else
extern const DECLSPEC_SELECTANY WCHAR RuntimeClass_Windows_UI_Composition_LinearEasingFunction[] = {'W','i','n','d','o','w','s','.','U','I','.','C','o','m','p','o','s','i','t','i','o','n','.','L','i','n','e','a','r','E','a','s','i','n','g','F','u','n','c','t','i','o','n',0};
#endif
#endif /* RUNTIMECLASS_Windows_UI_Composition_LinearEasingFunction_DEFINED */
#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x20000 */

/*
 * Class Windows.UI.Composition.QuaternionKeyFrameAnimation
 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x20000
#ifndef RUNTIMECLASS_Windows_UI_Composition_QuaternionKeyFrameAnimation_DEFINED
#define RUNTIMECLASS_Windows_UI_Composition_QuaternionKeyFrameAnimation_DEFINED
#if !defined(_MSC_VER) && !defined(__MINGW32__)
static const WCHAR RuntimeClass_Windows_UI_Composition_QuaternionKeyFrameAnimation[] = {'W','i','n','d','o','w','s','.','U','I','.','C','o','m','p','o','s','i','t','i','o','n','.','Q','u','a','t','e','r','n','i','o','n','K','e','y','F','r','a','m','e','A','n','i','m','a','t','i','o','n',0};
#elif defined(__GNUC__) && !defined(__cplusplus)
const DECLSPEC_SELECTANY WCHAR RuntimeClass_Windows_UI_Composition_QuaternionKeyFrameAnimation[] = L"Windows.UI.Composition.QuaternionKeyFrameAnimation";
#else
extern const DECLSPEC_SELECTANY WCHAR RuntimeClass_Windows_UI_Composition_QuaternionKeyFrameAnimation[] = {'W','i','n','d','o','w','s','.','U','I','.','C','o','m','p','o','s','i','t','i','o','n','.','Q','u','a','t','e','r','n','i','o','n','K','e','y','F','r','a','m','e','A','n','i','m','a','t','i','o','n',0};
#endif
#endif /* RUNTIMECLASS_Windows_UI_Composition_QuaternionKeyFrameAnimation_DEFINED */
#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x20000 */

/*
 * Class Windows.UI.Composition.RenderingDeviceReplacedEventArgs
 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x20000
#ifndef RUNTIMECLASS_Windows_UI_Composition_RenderingDeviceReplacedEventArgs_DEFINED
#define RUNTIMECLASS_Windows_UI_Composition_RenderingDeviceReplacedEventArgs_DEFINED
#if !defined(_MSC_VER) && !defined(__MINGW32__)
static const WCHAR RuntimeClass_Windows_UI_Composition_RenderingDeviceReplacedEventArgs[] = {'W','i','n','d','o','w','s','.','U','I','.','C','o','m','p','o','s','i','t','i','o','n','.','R','e','n','d','e','r','i','n','g','D','e','v','i','c','e','R','e','p','l','a','c','e','d','E','v','e','n','t','A','r','g','s',0};
#elif defined(__GNUC__) && !defined(__cplusplus)
const DECLSPEC_SELECTANY WCHAR RuntimeClass_Windows_UI_Composition_RenderingDeviceReplacedEventArgs[] = L"Windows.UI.Composition.RenderingDeviceReplacedEventArgs";
#else
extern const DECLSPEC_SELECTANY WCHAR RuntimeClass_Windows_UI_Composition_RenderingDeviceReplacedEventArgs[] = {'W','i','n','d','o','w','s','.','U','I','.','C','o','m','p','o','s','i','t','i','o','n','.','R','e','n','d','e','r','i','n','g','D','e','v','i','c','e','R','e','p','l','a','c','e','d','E','v','e','n','t','A','r','g','s',0};
#endif
#endif /* RUNTIMECLASS_Windows_UI_Composition_RenderingDeviceReplacedEventArgs_DEFINED */
#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x20000 */

/*
 * Class Windows.UI.Composition.ScalarKeyFrameAnimation
 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x20000
#ifndef RUNTIMECLASS_Windows_UI_Composition_ScalarKeyFrameAnimation_DEFINED
#define RUNTIMECLASS_Windows_UI_Composition_ScalarKeyFrameAnimation_DEFINED
#if !defined(_MSC_VER) && !defined(__MINGW32__)
static const WCHAR RuntimeClass_Windows_UI_Composition_ScalarKeyFrameAnimation[] = {'W','i','n','d','o','w','s','.','U','I','.','C','o','m','p','o','s','i','t','i','o','n','.','S','c','a','l','a','r','K','e','y','F','r','a','m','e','A','n','i','m','a','t','i','o','n',0};
#elif defined(__GNUC__) && !defined(__cplusplus)
const DECLSPEC_SELECTANY WCHAR RuntimeClass_Windows_UI_Composition_ScalarKeyFrameAnimation[] = L"Windows.UI.Composition.ScalarKeyFrameAnimation";
#else
extern const DECLSPEC_SELECTANY WCHAR RuntimeClass_Windows_UI_Composition_ScalarKeyFrameAnimation[] = {'W','i','n','d','o','w','s','.','U','I','.','C','o','m','p','o','s','i','t','i','o','n','.','S','c','a','l','a','r','K','e','y','F','r','a','m','e','A','n','i','m','a','t','i','o','n',0};
#endif
#endif /* RUNTIMECLASS_Windows_UI_Composition_ScalarKeyFrameAnimation_DEFINED */
#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x20000 */

/*
 * Class Windows.UI.Composition.SpriteVisual
 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x20000
#ifndef RUNTIMECLASS_Windows_UI_Composition_SpriteVisual_DEFINED
#define RUNTIMECLASS_Windows_UI_Composition_SpriteVisual_DEFINED
#if !defined(_MSC_VER) && !defined(__MINGW32__)
static const WCHAR RuntimeClass_Windows_UI_Composition_SpriteVisual[] = {'W','i','n','d','o','w','s','.','U','I','.','C','o','m','p','o','s','i','t','i','o','n','.','S','p','r','i','t','e','V','i','s','u','a','l',0};
#elif defined(__GNUC__) && !defined(__cplusplus)
const DECLSPEC_SELECTANY WCHAR RuntimeClass_Windows_UI_Composition_SpriteVisual[] = L"Windows.UI.Composition.SpriteVisual";
#else
extern const DECLSPEC_SELECTANY WCHAR RuntimeClass_Windows_UI_Composition_SpriteVisual[] = {'W','i','n','d','o','w','s','.','U','I','.','C','o','m','p','o','s','i','t','i','o','n','.','S','p','r','i','t','e','V','i','s','u','a','l',0};
#endif
#endif /* RUNTIMECLASS_Windows_UI_Composition_SpriteVisual_DEFINED */
#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x20000 */

/*
 * Class Windows.UI.Composition.Vector2KeyFrameAnimation
 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x20000
#ifndef RUNTIMECLASS_Windows_UI_Composition_Vector2KeyFrameAnimation_DEFINED
#define RUNTIMECLASS_Windows_UI_Composition_Vector2KeyFrameAnimation_DEFINED
#if !defined(_MSC_VER) && !defined(__MINGW32__)
static const WCHAR RuntimeClass_Windows_UI_Composition_Vector2KeyFrameAnimation[] = {'W','i','n','d','o','w','s','.','U','I','.','C','o','m','p','o','s','i','t','i','o','n','.','V','e','c','t','o','r','2','K','e','y','F','r','a','m','e','A','n','i','m','a','t','i','o','n',0};
#elif defined(__GNUC__) && !defined(__cplusplus)
const DECLSPEC_SELECTANY WCHAR RuntimeClass_Windows_UI_Composition_Vector2KeyFrameAnimation[] = L"Windows.UI.Composition.Vector2KeyFrameAnimation";
#else
extern const DECLSPEC_SELECTANY WCHAR RuntimeClass_Windows_UI_Composition_Vector2KeyFrameAnimation[] = {'W','i','n','d','o','w','s','.','U','I','.','C','o','m','p','o','s','i','t','i','o','n','.','V','e','c','t','o','r','2','K','e','y','F','r','a','m','e','A','n','i','m','a','t','i','o','n',0};
#endif
#endif /* RUNTIMECLASS_Windows_UI_Composition_Vector2KeyFrameAnimation_DEFINED */
#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x20000 */

/*
 * Class Windows.UI.Composition.Vector3KeyFrameAnimation
 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x20000
#ifndef RUNTIMECLASS_Windows_UI_Composition_Vector3KeyFrameAnimation_DEFINED
#define RUNTIMECLASS_Windows_UI_Composition_Vector3KeyFrameAnimation_DEFINED
#if !defined(_MSC_VER) && !defined(__MINGW32__)
static const WCHAR RuntimeClass_Windows_UI_Composition_Vector3KeyFrameAnimation[] = {'W','i','n','d','o','w','s','.','U','I','.','C','o','m','p','o','s','i','t','i','o','n','.','V','e','c','t','o','r','3','K','e','y','F','r','a','m','e','A','n','i','m','a','t','i','o','n',0};
#elif defined(__GNUC__) && !defined(__cplusplus)
const DECLSPEC_SELECTANY WCHAR RuntimeClass_Windows_UI_Composition_Vector3KeyFrameAnimation[] = L"Windows.UI.Composition.Vector3KeyFrameAnimation";
#else
extern const DECLSPEC_SELECTANY WCHAR RuntimeClass_Windows_UI_Composition_Vector3KeyFrameAnimation[] = {'W','i','n','d','o','w','s','.','U','I','.','C','o','m','p','o','s','i','t','i','o','n','.','V','e','c','t','o','r','3','K','e','y','F','r','a','m','e','A','n','i','m','a','t','i','o','n',0};
#endif
#endif /* RUNTIMECLASS_Windows_UI_Composition_Vector3KeyFrameAnimation_DEFINED */
#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x20000 */

/*
 * Class Windows.UI.Composition.Vector4KeyFrameAnimation
 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x20000
#ifndef RUNTIMECLASS_Windows_UI_Composition_Vector4KeyFrameAnimation_DEFINED
#define RUNTIMECLASS_Windows_UI_Composition_Vector4KeyFrameAnimation_DEFINED
#if !defined(_MSC_VER) && !defined(__MINGW32__)
static const WCHAR RuntimeClass_Windows_UI_Composition_Vector4KeyFrameAnimation[] = {'W','i','n','d','o','w','s','.','U','I','.','C','o','m','p','o','s','i','t','i','o','n','.','V','e','c','t','o','r','4','K','e','y','F','r','a','m','e','A','n','i','m','a','t','i','o','n',0};
#elif defined(__GNUC__) && !defined(__cplusplus)
const DECLSPEC_SELECTANY WCHAR RuntimeClass_Windows_UI_Composition_Vector4KeyFrameAnimation[] = L"Windows.UI.Composition.Vector4KeyFrameAnimation";
#else
extern const DECLSPEC_SELECTANY WCHAR RuntimeClass_Windows_UI_Composition_Vector4KeyFrameAnimation[] = {'W','i','n','d','o','w','s','.','U','I','.','C','o','m','p','o','s','i','t','i','o','n','.','V','e','c','t','o','r','4','K','e','y','F','r','a','m','e','A','n','i','m','a','t','i','o','n',0};
#endif
#endif /* RUNTIMECLASS_Windows_UI_Composition_Vector4KeyFrameAnimation_DEFINED */
#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x20000 */

/*
 * Class Windows.UI.Composition.Visual
 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x20000
#ifndef RUNTIMECLASS_Windows_UI_Composition_Visual_DEFINED
#define RUNTIMECLASS_Windows_UI_Composition_Visual_DEFINED
#if !defined(_MSC_VER) && !defined(__MINGW32__)
static const WCHAR RuntimeClass_Windows_UI_Composition_Visual[] = {'W','i','n','d','o','w','s','.','U','I','.','C','o','m','p','o','s','i','t','i','o','n','.','V','i','s','u','a','l',0};
#elif defined(__GNUC__) && !defined(__cplusplus)
const DECLSPEC_SELECTANY WCHAR RuntimeClass_Windows_UI_Composition_Visual[] = L"Windows.UI.Composition.Visual";
#else
extern const DECLSPEC_SELECTANY WCHAR RuntimeClass_Windows_UI_Composition_Visual[] = {'W','i','n','d','o','w','s','.','U','I','.','C','o','m','p','o','s','i','t','i','o','n','.','V','i','s','u','a','l',0};
#endif
#endif /* RUNTIMECLASS_Windows_UI_Composition_Visual_DEFINED */
#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x20000 */

/*
 * Class Windows.UI.Composition.VisualCollection
 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x20000
#ifndef RUNTIMECLASS_Windows_UI_Composition_VisualCollection_DEFINED
#define RUNTIMECLASS_Windows_UI_Composition_VisualCollection_DEFINED
#if !defined(_MSC_VER) && !defined(__MINGW32__)
static const WCHAR RuntimeClass_Windows_UI_Composition_VisualCollection[] = {'W','i','n','d','o','w','s','.','U','I','.','C','o','m','p','o','s','i','t','i','o','n','.','V','i','s','u','a','l','C','o','l','l','e','c','t','i','o','n',0};
#elif defined(__GNUC__) && !defined(__cplusplus)
const DECLSPEC_SELECTANY WCHAR RuntimeClass_Windows_UI_Composition_VisualCollection[] = L"Windows.UI.Composition.VisualCollection";
#else
extern const DECLSPEC_SELECTANY WCHAR RuntimeClass_Windows_UI_Composition_VisualCollection[] = {'W','i','n','d','o','w','s','.','U','I','.','C','o','m','p','o','s','i','t','i','o','n','.','V','i','s','u','a','l','C','o','l','l','e','c','t','i','o','n',0};
#endif
#endif /* RUNTIMECLASS_Windows_UI_Composition_VisualCollection_DEFINED */
#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x20000 */

/*****************************************************************************
 * IAsyncOperationCompletedHandler<ABI::Windows::UI::Composition::ICompositionSurface* > interface
 */
#ifndef ____FIAsyncOperationCompletedHandler_1_Windows__CUI__CComposition__CICompositionSurface_INTERFACE_DEFINED__
#define ____FIAsyncOperationCompletedHandler_1_Windows__CUI__CComposition__CICompositionSurface_INTERFACE_DEFINED__

DEFINE_GUID(IID___FIAsyncOperationCompletedHandler_1_Windows__CUI__CComposition__CICompositionSurface, 0xdaf572ee, 0x035a, 0x594c, 0xb0,0x13, 0x84,0xbd,0x61,0x88,0x53,0xcc);
#if defined(__cplusplus) && !defined(CINTERFACE)
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace Foundation {
            template<>
            MIDL_INTERFACE("daf572ee-035a-594c-b013-84bd618853cc")
            IAsyncOperationCompletedHandler<ABI::Windows::UI::Composition::ICompositionSurface* > : IAsyncOperationCompletedHandler_impl<ABI::Windows::UI::Composition::ICompositionSurface* >
            {
            };
        }
    }
}
extern "C" {
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(__FIAsyncOperationCompletedHandler_1_Windows__CUI__CComposition__CICompositionSurface, 0xdaf572ee, 0x035a, 0x594c, 0xb0,0x13, 0x84,0xbd,0x61,0x88,0x53,0xcc)
#endif
#else
typedef struct __FIAsyncOperationCompletedHandler_1_Windows__CUI__CComposition__CICompositionSurfaceVtbl {
    BEGIN_INTERFACE

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

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

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

    /*** IAsyncOperationCompletedHandler<ABI::Windows::UI::Composition::ICompositionSurface* > methods ***/
    HRESULT (STDMETHODCALLTYPE *Invoke)(
        __FIAsyncOperationCompletedHandler_1_Windows__CUI__CComposition__CICompositionSurface *This,
        __FIAsyncOperation_1_Windows__CUI__CComposition__CICompositionSurface *info,
        AsyncStatus status);

    END_INTERFACE
} __FIAsyncOperationCompletedHandler_1_Windows__CUI__CComposition__CICompositionSurfaceVtbl;

interface __FIAsyncOperationCompletedHandler_1_Windows__CUI__CComposition__CICompositionSurface {
    CONST_VTBL __FIAsyncOperationCompletedHandler_1_Windows__CUI__CComposition__CICompositionSurfaceVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define __FIAsyncOperationCompletedHandler_1_Windows__CUI__CComposition__CICompositionSurface_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define __FIAsyncOperationCompletedHandler_1_Windows__CUI__CComposition__CICompositionSurface_AddRef(This) (This)->lpVtbl->AddRef(This)
#define __FIAsyncOperationCompletedHandler_1_Windows__CUI__CComposition__CICompositionSurface_Release(This) (This)->lpVtbl->Release(This)
/*** IAsyncOperationCompletedHandler<ABI::Windows::UI::Composition::ICompositionSurface* > methods ***/
#define __FIAsyncOperationCompletedHandler_1_Windows__CUI__CComposition__CICompositionSurface_Invoke(This,info,status) (This)->lpVtbl->Invoke(This,info,status)
#else
/*** IUnknown methods ***/
static __WIDL_INLINE HRESULT __FIAsyncOperationCompletedHandler_1_Windows__CUI__CComposition__CICompositionSurface_QueryInterface(__FIAsyncOperationCompletedHandler_1_Windows__CUI__CComposition__CICompositionSurface* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG __FIAsyncOperationCompletedHandler_1_Windows__CUI__CComposition__CICompositionSurface_AddRef(__FIAsyncOperationCompletedHandler_1_Windows__CUI__CComposition__CICompositionSurface* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG __FIAsyncOperationCompletedHandler_1_Windows__CUI__CComposition__CICompositionSurface_Release(__FIAsyncOperationCompletedHandler_1_Windows__CUI__CComposition__CICompositionSurface* This) {
    return This->lpVtbl->Release(This);
}
/*** IAsyncOperationCompletedHandler<ABI::Windows::UI::Composition::ICompositionSurface* > methods ***/
static __WIDL_INLINE HRESULT __FIAsyncOperationCompletedHandler_1_Windows__CUI__CComposition__CICompositionSurface_Invoke(__FIAsyncOperationCompletedHandler_1_Windows__CUI__CComposition__CICompositionSurface* This,__FIAsyncOperation_1_Windows__CUI__CComposition__CICompositionSurface *info,AsyncStatus status) {
    return This->lpVtbl->Invoke(This,info,status);
}
#endif
#ifdef WIDL_using_Windows_Foundation
#define IID_IAsyncOperationCompletedHandler_ICompositionSurface IID___FIAsyncOperationCompletedHandler_1_Windows__CUI__CComposition__CICompositionSurface
#define IAsyncOperationCompletedHandler_ICompositionSurfaceVtbl __FIAsyncOperationCompletedHandler_1_Windows__CUI__CComposition__CICompositionSurfaceVtbl
#define IAsyncOperationCompletedHandler_ICompositionSurface __FIAsyncOperationCompletedHandler_1_Windows__CUI__CComposition__CICompositionSurface
#define IAsyncOperationCompletedHandler_ICompositionSurface_QueryInterface __FIAsyncOperationCompletedHandler_1_Windows__CUI__CComposition__CICompositionSurface_QueryInterface
#define IAsyncOperationCompletedHandler_ICompositionSurface_AddRef __FIAsyncOperationCompletedHandler_1_Windows__CUI__CComposition__CICompositionSurface_AddRef
#define IAsyncOperationCompletedHandler_ICompositionSurface_Release __FIAsyncOperationCompletedHandler_1_Windows__CUI__CComposition__CICompositionSurface_Release
#define IAsyncOperationCompletedHandler_ICompositionSurface_Invoke __FIAsyncOperationCompletedHandler_1_Windows__CUI__CComposition__CICompositionSurface_Invoke
#endif /* WIDL_using_Windows_Foundation */
#endif

#endif

#endif  /* ____FIAsyncOperationCompletedHandler_1_Windows__CUI__CComposition__CICompositionSurface_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IAsyncOperation<ABI::Windows::UI::Composition::ICompositionSurface* > interface
 */
#ifndef ____FIAsyncOperation_1_Windows__CUI__CComposition__CICompositionSurface_INTERFACE_DEFINED__
#define ____FIAsyncOperation_1_Windows__CUI__CComposition__CICompositionSurface_INTERFACE_DEFINED__

DEFINE_GUID(IID___FIAsyncOperation_1_Windows__CUI__CComposition__CICompositionSurface, 0x66613cdd, 0x5076, 0x50d6, 0xab,0x32, 0xba,0x76,0xdf,0x49,0xc4,0x10);
#if defined(__cplusplus) && !defined(CINTERFACE)
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace Foundation {
            template<>
            MIDL_INTERFACE("66613cdd-5076-50d6-ab32-ba76df49c410")
            IAsyncOperation<ABI::Windows::UI::Composition::ICompositionSurface* > : IAsyncOperation_impl<ABI::Windows::UI::Composition::ICompositionSurface* >
            {
            };
        }
    }
}
extern "C" {
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(__FIAsyncOperation_1_Windows__CUI__CComposition__CICompositionSurface, 0x66613cdd, 0x5076, 0x50d6, 0xab,0x32, 0xba,0x76,0xdf,0x49,0xc4,0x10)
#endif
#else
typedef struct __FIAsyncOperation_1_Windows__CUI__CComposition__CICompositionSurfaceVtbl {
    BEGIN_INTERFACE

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

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

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

    /*** IInspectable methods ***/
    HRESULT (STDMETHODCALLTYPE *GetIids)(
        __FIAsyncOperation_1_Windows__CUI__CComposition__CICompositionSurface *This,
        ULONG *iidCount,
        IID **iids);

    HRESULT (STDMETHODCALLTYPE *GetRuntimeClassName)(
        __FIAsyncOperation_1_Windows__CUI__CComposition__CICompositionSurface *This,
        HSTRING *className);

    HRESULT (STDMETHODCALLTYPE *GetTrustLevel)(
        __FIAsyncOperation_1_Windows__CUI__CComposition__CICompositionSurface *This,
        TrustLevel *trustLevel);

    /*** IAsyncOperation<ABI::Windows::UI::Composition::ICompositionSurface* > methods ***/
    HRESULT (STDMETHODCALLTYPE *put_Completed)(
        __FIAsyncOperation_1_Windows__CUI__CComposition__CICompositionSurface *This,
        __FIAsyncOperationCompletedHandler_1_Windows__CUI__CComposition__CICompositionSurface *handler);

    HRESULT (STDMETHODCALLTYPE *get_Completed)(
        __FIAsyncOperation_1_Windows__CUI__CComposition__CICompositionSurface *This,
        __FIAsyncOperationCompletedHandler_1_Windows__CUI__CComposition__CICompositionSurface **handler);

    HRESULT (STDMETHODCALLTYPE *GetResults)(
        __FIAsyncOperation_1_Windows__CUI__CComposition__CICompositionSurface *This,
        __x_ABI_CWindows_CUI_CComposition_CICompositionSurface **results);

    END_INTERFACE
} __FIAsyncOperation_1_Windows__CUI__CComposition__CICompositionSurfaceVtbl;

interface __FIAsyncOperation_1_Windows__CUI__CComposition__CICompositionSurface {
    CONST_VTBL __FIAsyncOperation_1_Windows__CUI__CComposition__CICompositionSurfaceVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define __FIAsyncOperation_1_Windows__CUI__CComposition__CICompositionSurface_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define __FIAsyncOperation_1_Windows__CUI__CComposition__CICompositionSurface_AddRef(This) (This)->lpVtbl->AddRef(This)
#define __FIAsyncOperation_1_Windows__CUI__CComposition__CICompositionSurface_Release(This) (This)->lpVtbl->Release(This)
/*** IInspectable methods ***/
#define __FIAsyncOperation_1_Windows__CUI__CComposition__CICompositionSurface_GetIids(This,iidCount,iids) (This)->lpVtbl->GetIids(This,iidCount,iids)
#define __FIAsyncOperation_1_Windows__CUI__CComposition__CICompositionSurface_GetRuntimeClassName(This,className) (This)->lpVtbl->GetRuntimeClassName(This,className)
#define __FIAsyncOperation_1_Windows__CUI__CComposition__CICompositionSurface_GetTrustLevel(This,trustLevel) (This)->lpVtbl->GetTrustLevel(This,trustLevel)
/*** IAsyncOperation<ABI::Windows::UI::Composition::ICompositionSurface* > methods ***/
#define __FIAsyncOperation_1_Windows__CUI__CComposition__CICompositionSurface_put_Completed(This,handler) (This)->lpVtbl->put_Completed(This,handler)
#define __FIAsyncOperation_1_Windows__CUI__CComposition__CICompositionSurface_get_Completed(This,handler) (This)->lpVtbl->get_Completed(This,handler)
#define __FIAsyncOperation_1_Windows__CUI__CComposition__CICompositionSurface_GetResults(This,results) (This)->lpVtbl->GetResults(This,results)
#else
/*** IUnknown methods ***/
static __WIDL_INLINE HRESULT __FIAsyncOperation_1_Windows__CUI__CComposition__CICompositionSurface_QueryInterface(__FIAsyncOperation_1_Windows__CUI__CComposition__CICompositionSurface* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG __FIAsyncOperation_1_Windows__CUI__CComposition__CICompositionSurface_AddRef(__FIAsyncOperation_1_Windows__CUI__CComposition__CICompositionSurface* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG __FIAsyncOperation_1_Windows__CUI__CComposition__CICompositionSurface_Release(__FIAsyncOperation_1_Windows__CUI__CComposition__CICompositionSurface* This) {
    return This->lpVtbl->Release(This);
}
/*** IInspectable methods ***/
static __WIDL_INLINE HRESULT __FIAsyncOperation_1_Windows__CUI__CComposition__CICompositionSurface_GetIids(__FIAsyncOperation_1_Windows__CUI__CComposition__CICompositionSurface* This,ULONG *iidCount,IID **iids) {
    return This->lpVtbl->GetIids(This,iidCount,iids);
}
static __WIDL_INLINE HRESULT __FIAsyncOperation_1_Windows__CUI__CComposition__CICompositionSurface_GetRuntimeClassName(__FIAsyncOperation_1_Windows__CUI__CComposition__CICompositionSurface* This,HSTRING *className) {
    return This->lpVtbl->GetRuntimeClassName(This,className);
}
static __WIDL_INLINE HRESULT __FIAsyncOperation_1_Windows__CUI__CComposition__CICompositionSurface_GetTrustLevel(__FIAsyncOperation_1_Windows__CUI__CComposition__CICompositionSurface* This,TrustLevel *trustLevel) {
    return This->lpVtbl->GetTrustLevel(This,trustLevel);
}
/*** IAsyncOperation<ABI::Windows::UI::Composition::ICompositionSurface* > methods ***/
static __WIDL_INLINE HRESULT __FIAsyncOperation_1_Windows__CUI__CComposition__CICompositionSurface_put_Completed(__FIAsyncOperation_1_Windows__CUI__CComposition__CICompositionSurface* This,__FIAsyncOperationCompletedHandler_1_Windows__CUI__CComposition__CICompositionSurface *handler) {
    return This->lpVtbl->put_Completed(This,handler);
}
static __WIDL_INLINE HRESULT __FIAsyncOperation_1_Windows__CUI__CComposition__CICompositionSurface_get_Completed(__FIAsyncOperation_1_Windows__CUI__CComposition__CICompositionSurface* This,__FIAsyncOperationCompletedHandler_1_Windows__CUI__CComposition__CICompositionSurface **handler) {
    return This->lpVtbl->get_Completed(This,handler);
}
static __WIDL_INLINE HRESULT __FIAsyncOperation_1_Windows__CUI__CComposition__CICompositionSurface_GetResults(__FIAsyncOperation_1_Windows__CUI__CComposition__CICompositionSurface* This,__x_ABI_CWindows_CUI_CComposition_CICompositionSurface **results) {
    return This->lpVtbl->GetResults(This,results);
}
#endif
#ifdef WIDL_using_Windows_Foundation
#define IID_IAsyncOperation_ICompositionSurface IID___FIAsyncOperation_1_Windows__CUI__CComposition__CICompositionSurface
#define IAsyncOperation_ICompositionSurfaceVtbl __FIAsyncOperation_1_Windows__CUI__CComposition__CICompositionSurfaceVtbl
#define IAsyncOperation_ICompositionSurface __FIAsyncOperation_1_Windows__CUI__CComposition__CICompositionSurface
#define IAsyncOperation_ICompositionSurface_QueryInterface __FIAsyncOperation_1_Windows__CUI__CComposition__CICompositionSurface_QueryInterface
#define IAsyncOperation_ICompositionSurface_AddRef __FIAsyncOperation_1_Windows__CUI__CComposition__CICompositionSurface_AddRef
#define IAsyncOperation_ICompositionSurface_Release __FIAsyncOperation_1_Windows__CUI__CComposition__CICompositionSurface_Release
#define IAsyncOperation_ICompositionSurface_GetIids __FIAsyncOperation_1_Windows__CUI__CComposition__CICompositionSurface_GetIids
#define IAsyncOperation_ICompositionSurface_GetRuntimeClassName __FIAsyncOperation_1_Windows__CUI__CComposition__CICompositionSurface_GetRuntimeClassName
#define IAsyncOperation_ICompositionSurface_GetTrustLevel __FIAsyncOperation_1_Windows__CUI__CComposition__CICompositionSurface_GetTrustLevel
#define IAsyncOperation_ICompositionSurface_put_Completed __FIAsyncOperation_1_Windows__CUI__CComposition__CICompositionSurface_put_Completed
#define IAsyncOperation_ICompositionSurface_get_Completed __FIAsyncOperation_1_Windows__CUI__CComposition__CICompositionSurface_get_Completed
#define IAsyncOperation_ICompositionSurface_GetResults __FIAsyncOperation_1_Windows__CUI__CComposition__CICompositionSurface_GetResults
#endif /* WIDL_using_Windows_Foundation */
#endif

#endif

#endif  /* ____FIAsyncOperation_1_Windows__CUI__CComposition__CICompositionSurface_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IIterable<ABI::Windows::UI::Composition::CompositionAnimation* > interface
 */
#ifndef ____FIIterable_1_Windows__CUI__CComposition__CCompositionAnimation_INTERFACE_DEFINED__
#define ____FIIterable_1_Windows__CUI__CComposition__CCompositionAnimation_INTERFACE_DEFINED__

DEFINE_GUID(IID___FIIterable_1_Windows__CUI__CComposition__CCompositionAnimation, 0x0cb59942, 0xc6f3, 0x585f, 0x9a,0x92, 0xb4,0x7e,0x8d,0xd3,0x8e,0xbf);
#if defined(__cplusplus) && !defined(CINTERFACE)
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace Foundation {
            namespace Collections {
                template<>
                MIDL_INTERFACE("0cb59942-c6f3-585f-9a92-b47e8dd38ebf")
                IIterable<ABI::Windows::UI::Composition::CompositionAnimation* > : IIterable_impl<ABI::Windows::Foundation::Internal::AggregateType<ABI::Windows::UI::Composition::CompositionAnimation*, ABI::Windows::UI::Composition::ICompositionAnimation* > >
                {
                };
            }
        }
    }
}
extern "C" {
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(__FIIterable_1_Windows__CUI__CComposition__CCompositionAnimation, 0x0cb59942, 0xc6f3, 0x585f, 0x9a,0x92, 0xb4,0x7e,0x8d,0xd3,0x8e,0xbf)
#endif
#else
typedef struct __FIIterable_1_Windows__CUI__CComposition__CCompositionAnimationVtbl {
    BEGIN_INTERFACE

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

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

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

    /*** IInspectable methods ***/
    HRESULT (STDMETHODCALLTYPE *GetIids)(
        __FIIterable_1_Windows__CUI__CComposition__CCompositionAnimation *This,
        ULONG *iidCount,
        IID **iids);

    HRESULT (STDMETHODCALLTYPE *GetRuntimeClassName)(
        __FIIterable_1_Windows__CUI__CComposition__CCompositionAnimation *This,
        HSTRING *className);

    HRESULT (STDMETHODCALLTYPE *GetTrustLevel)(
        __FIIterable_1_Windows__CUI__CComposition__CCompositionAnimation *This,
        TrustLevel *trustLevel);

    /*** IIterable<ABI::Windows::UI::Composition::CompositionAnimation* > methods ***/
    HRESULT (STDMETHODCALLTYPE *First)(
        __FIIterable_1_Windows__CUI__CComposition__CCompositionAnimation *This,
        __FIIterator_1_Windows__CUI__CComposition__CCompositionAnimation **value);

    END_INTERFACE
} __FIIterable_1_Windows__CUI__CComposition__CCompositionAnimationVtbl;

interface __FIIterable_1_Windows__CUI__CComposition__CCompositionAnimation {
    CONST_VTBL __FIIterable_1_Windows__CUI__CComposition__CCompositionAnimationVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define __FIIterable_1_Windows__CUI__CComposition__CCompositionAnimation_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define __FIIterable_1_Windows__CUI__CComposition__CCompositionAnimation_AddRef(This) (This)->lpVtbl->AddRef(This)
#define __FIIterable_1_Windows__CUI__CComposition__CCompositionAnimation_Release(This) (This)->lpVtbl->Release(This)
/*** IInspectable methods ***/
#define __FIIterable_1_Windows__CUI__CComposition__CCompositionAnimation_GetIids(This,iidCount,iids) (This)->lpVtbl->GetIids(This,iidCount,iids)
#define __FIIterable_1_Windows__CUI__CComposition__CCompositionAnimation_GetRuntimeClassName(This,className) (This)->lpVtbl->GetRuntimeClassName(This,className)
#define __FIIterable_1_Windows__CUI__CComposition__CCompositionAnimation_GetTrustLevel(This,trustLevel) (This)->lpVtbl->GetTrustLevel(This,trustLevel)
/*** IIterable<ABI::Windows::UI::Composition::CompositionAnimation* > methods ***/
#define __FIIterable_1_Windows__CUI__CComposition__CCompositionAnimation_First(This,value) (This)->lpVtbl->First(This,value)
#else
/*** IUnknown methods ***/
static __WIDL_INLINE HRESULT __FIIterable_1_Windows__CUI__CComposition__CCompositionAnimation_QueryInterface(__FIIterable_1_Windows__CUI__CComposition__CCompositionAnimation* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG __FIIterable_1_Windows__CUI__CComposition__CCompositionAnimation_AddRef(__FIIterable_1_Windows__CUI__CComposition__CCompositionAnimation* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG __FIIterable_1_Windows__CUI__CComposition__CCompositionAnimation_Release(__FIIterable_1_Windows__CUI__CComposition__CCompositionAnimation* This) {
    return This->lpVtbl->Release(This);
}
/*** IInspectable methods ***/
static __WIDL_INLINE HRESULT __FIIterable_1_Windows__CUI__CComposition__CCompositionAnimation_GetIids(__FIIterable_1_Windows__CUI__CComposition__CCompositionAnimation* This,ULONG *iidCount,IID **iids) {
    return This->lpVtbl->GetIids(This,iidCount,iids);
}
static __WIDL_INLINE HRESULT __FIIterable_1_Windows__CUI__CComposition__CCompositionAnimation_GetRuntimeClassName(__FIIterable_1_Windows__CUI__CComposition__CCompositionAnimation* This,HSTRING *className) {
    return This->lpVtbl->GetRuntimeClassName(This,className);
}
static __WIDL_INLINE HRESULT __FIIterable_1_Windows__CUI__CComposition__CCompositionAnimation_GetTrustLevel(__FIIterable_1_Windows__CUI__CComposition__CCompositionAnimation* This,TrustLevel *trustLevel) {
    return This->lpVtbl->GetTrustLevel(This,trustLevel);
}
/*** IIterable<ABI::Windows::UI::Composition::CompositionAnimation* > methods ***/
static __WIDL_INLINE HRESULT __FIIterable_1_Windows__CUI__CComposition__CCompositionAnimation_First(__FIIterable_1_Windows__CUI__CComposition__CCompositionAnimation* This,__FIIterator_1_Windows__CUI__CComposition__CCompositionAnimation **value) {
    return This->lpVtbl->First(This,value);
}
#endif
#ifdef WIDL_using_Windows_Foundation_Collections
#define IID_IIterable_CompositionAnimation IID___FIIterable_1_Windows__CUI__CComposition__CCompositionAnimation
#define IIterable_CompositionAnimationVtbl __FIIterable_1_Windows__CUI__CComposition__CCompositionAnimationVtbl
#define IIterable_CompositionAnimation __FIIterable_1_Windows__CUI__CComposition__CCompositionAnimation
#define IIterable_CompositionAnimation_QueryInterface __FIIterable_1_Windows__CUI__CComposition__CCompositionAnimation_QueryInterface
#define IIterable_CompositionAnimation_AddRef __FIIterable_1_Windows__CUI__CComposition__CCompositionAnimation_AddRef
#define IIterable_CompositionAnimation_Release __FIIterable_1_Windows__CUI__CComposition__CCompositionAnimation_Release
#define IIterable_CompositionAnimation_GetIids __FIIterable_1_Windows__CUI__CComposition__CCompositionAnimation_GetIids
#define IIterable_CompositionAnimation_GetRuntimeClassName __FIIterable_1_Windows__CUI__CComposition__CCompositionAnimation_GetRuntimeClassName
#define IIterable_CompositionAnimation_GetTrustLevel __FIIterable_1_Windows__CUI__CComposition__CCompositionAnimation_GetTrustLevel
#define IIterable_CompositionAnimation_First __FIIterable_1_Windows__CUI__CComposition__CCompositionAnimation_First
#endif /* WIDL_using_Windows_Foundation_Collections */
#endif

#endif

#endif  /* ____FIIterable_1_Windows__CUI__CComposition__CCompositionAnimation_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IIterable<ABI::Windows::UI::Composition::Visual* > interface
 */
#ifndef ____FIIterable_1_Windows__CUI__CComposition__CVisual_INTERFACE_DEFINED__
#define ____FIIterable_1_Windows__CUI__CComposition__CVisual_INTERFACE_DEFINED__

DEFINE_GUID(IID___FIIterable_1_Windows__CUI__CComposition__CVisual, 0x4eed7dce, 0xe4ac, 0x5891, 0x9b,0x52, 0x79,0x9d,0x70,0xdf,0x47,0xfe);
#if defined(__cplusplus) && !defined(CINTERFACE)
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace Foundation {
            namespace Collections {
                template<>
                MIDL_INTERFACE("4eed7dce-e4ac-5891-9b52-799d70df47fe")
                IIterable<ABI::Windows::UI::Composition::Visual* > : IIterable_impl<ABI::Windows::Foundation::Internal::AggregateType<ABI::Windows::UI::Composition::Visual*, ABI::Windows::UI::Composition::IVisual* > >
                {
                };
            }
        }
    }
}
extern "C" {
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(__FIIterable_1_Windows__CUI__CComposition__CVisual, 0x4eed7dce, 0xe4ac, 0x5891, 0x9b,0x52, 0x79,0x9d,0x70,0xdf,0x47,0xfe)
#endif
#else
typedef struct __FIIterable_1_Windows__CUI__CComposition__CVisualVtbl {
    BEGIN_INTERFACE

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

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

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

    /*** IInspectable methods ***/
    HRESULT (STDMETHODCALLTYPE *GetIids)(
        __FIIterable_1_Windows__CUI__CComposition__CVisual *This,
        ULONG *iidCount,
        IID **iids);

    HRESULT (STDMETHODCALLTYPE *GetRuntimeClassName)(
        __FIIterable_1_Windows__CUI__CComposition__CVisual *This,
        HSTRING *className);

    HRESULT (STDMETHODCALLTYPE *GetTrustLevel)(
        __FIIterable_1_Windows__CUI__CComposition__CVisual *This,
        TrustLevel *trustLevel);

    /*** IIterable<ABI::Windows::UI::Composition::Visual* > methods ***/
    HRESULT (STDMETHODCALLTYPE *First)(
        __FIIterable_1_Windows__CUI__CComposition__CVisual *This,
        __FIIterator_1_Windows__CUI__CComposition__CVisual **value);

    END_INTERFACE
} __FIIterable_1_Windows__CUI__CComposition__CVisualVtbl;

interface __FIIterable_1_Windows__CUI__CComposition__CVisual {
    CONST_VTBL __FIIterable_1_Windows__CUI__CComposition__CVisualVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define __FIIterable_1_Windows__CUI__CComposition__CVisual_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define __FIIterable_1_Windows__CUI__CComposition__CVisual_AddRef(This) (This)->lpVtbl->AddRef(This)
#define __FIIterable_1_Windows__CUI__CComposition__CVisual_Release(This) (This)->lpVtbl->Release(This)
/*** IInspectable methods ***/
#define __FIIterable_1_Windows__CUI__CComposition__CVisual_GetIids(This,iidCount,iids) (This)->lpVtbl->GetIids(This,iidCount,iids)
#define __FIIterable_1_Windows__CUI__CComposition__CVisual_GetRuntimeClassName(This,className) (This)->lpVtbl->GetRuntimeClassName(This,className)
#define __FIIterable_1_Windows__CUI__CComposition__CVisual_GetTrustLevel(This,trustLevel) (This)->lpVtbl->GetTrustLevel(This,trustLevel)
/*** IIterable<ABI::Windows::UI::Composition::Visual* > methods ***/
#define __FIIterable_1_Windows__CUI__CComposition__CVisual_First(This,value) (This)->lpVtbl->First(This,value)
#else
/*** IUnknown methods ***/
static __WIDL_INLINE HRESULT __FIIterable_1_Windows__CUI__CComposition__CVisual_QueryInterface(__FIIterable_1_Windows__CUI__CComposition__CVisual* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG __FIIterable_1_Windows__CUI__CComposition__CVisual_AddRef(__FIIterable_1_Windows__CUI__CComposition__CVisual* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG __FIIterable_1_Windows__CUI__CComposition__CVisual_Release(__FIIterable_1_Windows__CUI__CComposition__CVisual* This) {
    return This->lpVtbl->Release(This);
}
/*** IInspectable methods ***/
static __WIDL_INLINE HRESULT __FIIterable_1_Windows__CUI__CComposition__CVisual_GetIids(__FIIterable_1_Windows__CUI__CComposition__CVisual* This,ULONG *iidCount,IID **iids) {
    return This->lpVtbl->GetIids(This,iidCount,iids);
}
static __WIDL_INLINE HRESULT __FIIterable_1_Windows__CUI__CComposition__CVisual_GetRuntimeClassName(__FIIterable_1_Windows__CUI__CComposition__CVisual* This,HSTRING *className) {
    return This->lpVtbl->GetRuntimeClassName(This,className);
}
static __WIDL_INLINE HRESULT __FIIterable_1_Windows__CUI__CComposition__CVisual_GetTrustLevel(__FIIterable_1_Windows__CUI__CComposition__CVisual* This,TrustLevel *trustLevel) {
    return This->lpVtbl->GetTrustLevel(This,trustLevel);
}
/*** IIterable<ABI::Windows::UI::Composition::Visual* > methods ***/
static __WIDL_INLINE HRESULT __FIIterable_1_Windows__CUI__CComposition__CVisual_First(__FIIterable_1_Windows__CUI__CComposition__CVisual* This,__FIIterator_1_Windows__CUI__CComposition__CVisual **value) {
    return This->lpVtbl->First(This,value);
}
#endif
#ifdef WIDL_using_Windows_Foundation_Collections
#define IID_IIterable_Visual IID___FIIterable_1_Windows__CUI__CComposition__CVisual
#define IIterable_VisualVtbl __FIIterable_1_Windows__CUI__CComposition__CVisualVtbl
#define IIterable_Visual __FIIterable_1_Windows__CUI__CComposition__CVisual
#define IIterable_Visual_QueryInterface __FIIterable_1_Windows__CUI__CComposition__CVisual_QueryInterface
#define IIterable_Visual_AddRef __FIIterable_1_Windows__CUI__CComposition__CVisual_AddRef
#define IIterable_Visual_Release __FIIterable_1_Windows__CUI__CComposition__CVisual_Release
#define IIterable_Visual_GetIids __FIIterable_1_Windows__CUI__CComposition__CVisual_GetIids
#define IIterable_Visual_GetRuntimeClassName __FIIterable_1_Windows__CUI__CComposition__CVisual_GetRuntimeClassName
#define IIterable_Visual_GetTrustLevel __FIIterable_1_Windows__CUI__CComposition__CVisual_GetTrustLevel
#define IIterable_Visual_First __FIIterable_1_Windows__CUI__CComposition__CVisual_First
#endif /* WIDL_using_Windows_Foundation_Collections */
#endif

#endif

#endif  /* ____FIIterable_1_Windows__CUI__CComposition__CVisual_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IIterator<ABI::Windows::UI::Composition::CompositionAnimation* > interface
 */
#ifndef ____FIIterator_1_Windows__CUI__CComposition__CCompositionAnimation_INTERFACE_DEFINED__
#define ____FIIterator_1_Windows__CUI__CComposition__CCompositionAnimation_INTERFACE_DEFINED__

DEFINE_GUID(IID___FIIterator_1_Windows__CUI__CComposition__CCompositionAnimation, 0x98efbe55, 0x0a66, 0x556a, 0x9a,0xdc, 0x4a,0xb5,0x9c,0x69,0x68,0x46);
#if defined(__cplusplus) && !defined(CINTERFACE)
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace Foundation {
            namespace Collections {
                template<>
                MIDL_INTERFACE("98efbe55-0a66-556a-9adc-4ab59c696846")
                IIterator<ABI::Windows::UI::Composition::CompositionAnimation* > : IIterator_impl<ABI::Windows::Foundation::Internal::AggregateType<ABI::Windows::UI::Composition::CompositionAnimation*, ABI::Windows::UI::Composition::ICompositionAnimation* > >
                {
                };
            }
        }
    }
}
extern "C" {
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(__FIIterator_1_Windows__CUI__CComposition__CCompositionAnimation, 0x98efbe55, 0x0a66, 0x556a, 0x9a,0xdc, 0x4a,0xb5,0x9c,0x69,0x68,0x46)
#endif
#else
typedef struct __FIIterator_1_Windows__CUI__CComposition__CCompositionAnimationVtbl {
    BEGIN_INTERFACE

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

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

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

    /*** IInspectable methods ***/
    HRESULT (STDMETHODCALLTYPE *GetIids)(
        __FIIterator_1_Windows__CUI__CComposition__CCompositionAnimation *This,
        ULONG *iidCount,
        IID **iids);

    HRESULT (STDMETHODCALLTYPE *GetRuntimeClassName)(
        __FIIterator_1_Windows__CUI__CComposition__CCompositionAnimation *This,
        HSTRING *className);

    HRESULT (STDMETHODCALLTYPE *GetTrustLevel)(
        __FIIterator_1_Windows__CUI__CComposition__CCompositionAnimation *This,
        TrustLevel *trustLevel);

    /*** IIterator<ABI::Windows::UI::Composition::CompositionAnimation* > methods ***/
    HRESULT (STDMETHODCALLTYPE *get_Current)(
        __FIIterator_1_Windows__CUI__CComposition__CCompositionAnimation *This,
        __x_ABI_CWindows_CUI_CComposition_CICompositionAnimation **value);

    HRESULT (STDMETHODCALLTYPE *get_HasCurrent)(
        __FIIterator_1_Windows__CUI__CComposition__CCompositionAnimation *This,
        boolean *value);

    HRESULT (STDMETHODCALLTYPE *MoveNext)(
        __FIIterator_1_Windows__CUI__CComposition__CCompositionAnimation *This,
        boolean *value);

    HRESULT (STDMETHODCALLTYPE *GetMany)(
        __FIIterator_1_Windows__CUI__CComposition__CCompositionAnimation *This,
        UINT32 items_size,
        __x_ABI_CWindows_CUI_CComposition_CICompositionAnimation **items,
        UINT32 *value);

    END_INTERFACE
} __FIIterator_1_Windows__CUI__CComposition__CCompositionAnimationVtbl;

interface __FIIterator_1_Windows__CUI__CComposition__CCompositionAnimation {
    CONST_VTBL __FIIterator_1_Windows__CUI__CComposition__CCompositionAnimationVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define __FIIterator_1_Windows__CUI__CComposition__CCompositionAnimation_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define __FIIterator_1_Windows__CUI__CComposition__CCompositionAnimation_AddRef(This) (This)->lpVtbl->AddRef(This)
#define __FIIterator_1_Windows__CUI__CComposition__CCompositionAnimation_Release(This) (This)->lpVtbl->Release(This)
/*** IInspectable methods ***/
#define __FIIterator_1_Windows__CUI__CComposition__CCompositionAnimation_GetIids(This,iidCount,iids) (This)->lpVtbl->GetIids(This,iidCount,iids)
#define __FIIterator_1_Windows__CUI__CComposition__CCompositionAnimation_GetRuntimeClassName(This,className) (This)->lpVtbl->GetRuntimeClassName(This,className)
#define __FIIterator_1_Windows__CUI__CComposition__CCompositionAnimation_GetTrustLevel(This,trustLevel) (This)->lpVtbl->GetTrustLevel(This,trustLevel)
/*** IIterator<ABI::Windows::UI::Composition::CompositionAnimation* > methods ***/
#define __FIIterator_1_Windows__CUI__CComposition__CCompositionAnimation_get_Current(This,value) (This)->lpVtbl->get_Current(This,value)
#define __FIIterator_1_Windows__CUI__CComposition__CCompositionAnimation_get_HasCurrent(This,value) (This)->lpVtbl->get_HasCurrent(This,value)
#define __FIIterator_1_Windows__CUI__CComposition__CCompositionAnimation_MoveNext(This,value) (This)->lpVtbl->MoveNext(This,value)
#define __FIIterator_1_Windows__CUI__CComposition__CCompositionAnimation_GetMany(This,items_size,items,value) (This)->lpVtbl->GetMany(This,items_size,items,value)
#else
/*** IUnknown methods ***/
static __WIDL_INLINE HRESULT __FIIterator_1_Windows__CUI__CComposition__CCompositionAnimation_QueryInterface(__FIIterator_1_Windows__CUI__CComposition__CCompositionAnimation* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG __FIIterator_1_Windows__CUI__CComposition__CCompositionAnimation_AddRef(__FIIterator_1_Windows__CUI__CComposition__CCompositionAnimation* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG __FIIterator_1_Windows__CUI__CComposition__CCompositionAnimation_Release(__FIIterator_1_Windows__CUI__CComposition__CCompositionAnimation* This) {
    return This->lpVtbl->Release(This);
}
/*** IInspectable methods ***/
static __WIDL_INLINE HRESULT __FIIterator_1_Windows__CUI__CComposition__CCompositionAnimation_GetIids(__FIIterator_1_Windows__CUI__CComposition__CCompositionAnimation* This,ULONG *iidCount,IID **iids) {
    return This->lpVtbl->GetIids(This,iidCount,iids);
}
static __WIDL_INLINE HRESULT __FIIterator_1_Windows__CUI__CComposition__CCompositionAnimation_GetRuntimeClassName(__FIIterator_1_Windows__CUI__CComposition__CCompositionAnimation* This,HSTRING *className) {
    return This->lpVtbl->GetRuntimeClassName(This,className);
}
static __WIDL_INLINE HRESULT __FIIterator_1_Windows__CUI__CComposition__CCompositionAnimation_GetTrustLevel(__FIIterator_1_Windows__CUI__CComposition__CCompositionAnimation* This,TrustLevel *trustLevel) {
    return This->lpVtbl->GetTrustLevel(This,trustLevel);
}
/*** IIterator<ABI::Windows::UI::Composition::CompositionAnimation* > methods ***/
static __WIDL_INLINE HRESULT __FIIterator_1_Windows__CUI__CComposition__CCompositionAnimation_get_Current(__FIIterator_1_Windows__CUI__CComposition__CCompositionAnimation* This,__x_ABI_CWindows_CUI_CComposition_CICompositionAnimation **value) {
    return This->lpVtbl->get_Current(This,value);
}
static __WIDL_INLINE HRESULT __FIIterator_1_Windows__CUI__CComposition__CCompositionAnimation_get_HasCurrent(__FIIterator_1_Windows__CUI__CComposition__CCompositionAnimation* This,boolean *value) {
    return This->lpVtbl->get_HasCurrent(This,value);
}
static __WIDL_INLINE HRESULT __FIIterator_1_Windows__CUI__CComposition__CCompositionAnimation_MoveNext(__FIIterator_1_Windows__CUI__CComposition__CCompositionAnimation* This,boolean *value) {
    return This->lpVtbl->MoveNext(This,value);
}
static __WIDL_INLINE HRESULT __FIIterator_1_Windows__CUI__CComposition__CCompositionAnimation_GetMany(__FIIterator_1_Windows__CUI__CComposition__CCompositionAnimation* This,UINT32 items_size,__x_ABI_CWindows_CUI_CComposition_CICompositionAnimation **items,UINT32 *value) {
    return This->lpVtbl->GetMany(This,items_size,items,value);
}
#endif
#ifdef WIDL_using_Windows_Foundation_Collections
#define IID_IIterator_CompositionAnimation IID___FIIterator_1_Windows__CUI__CComposition__CCompositionAnimation
#define IIterator_CompositionAnimationVtbl __FIIterator_1_Windows__CUI__CComposition__CCompositionAnimationVtbl
#define IIterator_CompositionAnimation __FIIterator_1_Windows__CUI__CComposition__CCompositionAnimation
#define IIterator_CompositionAnimation_QueryInterface __FIIterator_1_Windows__CUI__CComposition__CCompositionAnimation_QueryInterface
#define IIterator_CompositionAnimation_AddRef __FIIterator_1_Windows__CUI__CComposition__CCompositionAnimation_AddRef
#define IIterator_CompositionAnimation_Release __FIIterator_1_Windows__CUI__CComposition__CCompositionAnimation_Release
#define IIterator_CompositionAnimation_GetIids __FIIterator_1_Windows__CUI__CComposition__CCompositionAnimation_GetIids
#define IIterator_CompositionAnimation_GetRuntimeClassName __FIIterator_1_Windows__CUI__CComposition__CCompositionAnimation_GetRuntimeClassName
#define IIterator_CompositionAnimation_GetTrustLevel __FIIterator_1_Windows__CUI__CComposition__CCompositionAnimation_GetTrustLevel
#define IIterator_CompositionAnimation_get_Current __FIIterator_1_Windows__CUI__CComposition__CCompositionAnimation_get_Current
#define IIterator_CompositionAnimation_get_HasCurrent __FIIterator_1_Windows__CUI__CComposition__CCompositionAnimation_get_HasCurrent
#define IIterator_CompositionAnimation_MoveNext __FIIterator_1_Windows__CUI__CComposition__CCompositionAnimation_MoveNext
#define IIterator_CompositionAnimation_GetMany __FIIterator_1_Windows__CUI__CComposition__CCompositionAnimation_GetMany
#endif /* WIDL_using_Windows_Foundation_Collections */
#endif

#endif

#endif  /* ____FIIterator_1_Windows__CUI__CComposition__CCompositionAnimation_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IIterator<ABI::Windows::UI::Composition::Visual* > interface
 */
#ifndef ____FIIterator_1_Windows__CUI__CComposition__CVisual_INTERFACE_DEFINED__
#define ____FIIterator_1_Windows__CUI__CComposition__CVisual_INTERFACE_DEFINED__

DEFINE_GUID(IID___FIIterator_1_Windows__CUI__CComposition__CVisual, 0xeca15496, 0xdcaa, 0x5095, 0xa8,0x98, 0xf8,0x60,0x2a,0x40,0xe1,0x0a);
#if defined(__cplusplus) && !defined(CINTERFACE)
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace Foundation {
            namespace Collections {
                template<>
                MIDL_INTERFACE("eca15496-dcaa-5095-a898-f8602a40e10a")
                IIterator<ABI::Windows::UI::Composition::Visual* > : IIterator_impl<ABI::Windows::Foundation::Internal::AggregateType<ABI::Windows::UI::Composition::Visual*, ABI::Windows::UI::Composition::IVisual* > >
                {
                };
            }
        }
    }
}
extern "C" {
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(__FIIterator_1_Windows__CUI__CComposition__CVisual, 0xeca15496, 0xdcaa, 0x5095, 0xa8,0x98, 0xf8,0x60,0x2a,0x40,0xe1,0x0a)
#endif
#else
typedef struct __FIIterator_1_Windows__CUI__CComposition__CVisualVtbl {
    BEGIN_INTERFACE

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

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

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

    /*** IInspectable methods ***/
    HRESULT (STDMETHODCALLTYPE *GetIids)(
        __FIIterator_1_Windows__CUI__CComposition__CVisual *This,
        ULONG *iidCount,
        IID **iids);

    HRESULT (STDMETHODCALLTYPE *GetRuntimeClassName)(
        __FIIterator_1_Windows__CUI__CComposition__CVisual *This,
        HSTRING *className);

    HRESULT (STDMETHODCALLTYPE *GetTrustLevel)(
        __FIIterator_1_Windows__CUI__CComposition__CVisual *This,
        TrustLevel *trustLevel);

    /*** IIterator<ABI::Windows::UI::Composition::Visual* > methods ***/
    HRESULT (STDMETHODCALLTYPE *get_Current)(
        __FIIterator_1_Windows__CUI__CComposition__CVisual *This,
        __x_ABI_CWindows_CUI_CComposition_CIVisual **value);

    HRESULT (STDMETHODCALLTYPE *get_HasCurrent)(
        __FIIterator_1_Windows__CUI__CComposition__CVisual *This,
        boolean *value);

    HRESULT (STDMETHODCALLTYPE *MoveNext)(
        __FIIterator_1_Windows__CUI__CComposition__CVisual *This,
        boolean *value);

    HRESULT (STDMETHODCALLTYPE *GetMany)(
        __FIIterator_1_Windows__CUI__CComposition__CVisual *This,
        UINT32 items_size,
        __x_ABI_CWindows_CUI_CComposition_CIVisual **items,
        UINT32 *value);

    END_INTERFACE
} __FIIterator_1_Windows__CUI__CComposition__CVisualVtbl;

interface __FIIterator_1_Windows__CUI__CComposition__CVisual {
    CONST_VTBL __FIIterator_1_Windows__CUI__CComposition__CVisualVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define __FIIterator_1_Windows__CUI__CComposition__CVisual_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define __FIIterator_1_Windows__CUI__CComposition__CVisual_AddRef(This) (This)->lpVtbl->AddRef(This)
#define __FIIterator_1_Windows__CUI__CComposition__CVisual_Release(This) (This)->lpVtbl->Release(This)
/*** IInspectable methods ***/
#define __FIIterator_1_Windows__CUI__CComposition__CVisual_GetIids(This,iidCount,iids) (This)->lpVtbl->GetIids(This,iidCount,iids)
#define __FIIterator_1_Windows__CUI__CComposition__CVisual_GetRuntimeClassName(This,className) (This)->lpVtbl->GetRuntimeClassName(This,className)
#define __FIIterator_1_Windows__CUI__CComposition__CVisual_GetTrustLevel(This,trustLevel) (This)->lpVtbl->GetTrustLevel(This,trustLevel)
/*** IIterator<ABI::Windows::UI::Composition::Visual* > methods ***/
#define __FIIterator_1_Windows__CUI__CComposition__CVisual_get_Current(This,value) (This)->lpVtbl->get_Current(This,value)
#define __FIIterator_1_Windows__CUI__CComposition__CVisual_get_HasCurrent(This,value) (This)->lpVtbl->get_HasCurrent(This,value)
#define __FIIterator_1_Windows__CUI__CComposition__CVisual_MoveNext(This,value) (This)->lpVtbl->MoveNext(This,value)
#define __FIIterator_1_Windows__CUI__CComposition__CVisual_GetMany(This,items_size,items,value) (This)->lpVtbl->GetMany(This,items_size,items,value)
#else
/*** IUnknown methods ***/
static __WIDL_INLINE HRESULT __FIIterator_1_Windows__CUI__CComposition__CVisual_QueryInterface(__FIIterator_1_Windows__CUI__CComposition__CVisual* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG __FIIterator_1_Windows__CUI__CComposition__CVisual_AddRef(__FIIterator_1_Windows__CUI__CComposition__CVisual* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG __FIIterator_1_Windows__CUI__CComposition__CVisual_Release(__FIIterator_1_Windows__CUI__CComposition__CVisual* This) {
    return This->lpVtbl->Release(This);
}
/*** IInspectable methods ***/
static __WIDL_INLINE HRESULT __FIIterator_1_Windows__CUI__CComposition__CVisual_GetIids(__FIIterator_1_Windows__CUI__CComposition__CVisual* This,ULONG *iidCount,IID **iids) {
    return This->lpVtbl->GetIids(This,iidCount,iids);
}
static __WIDL_INLINE HRESULT __FIIterator_1_Windows__CUI__CComposition__CVisual_GetRuntimeClassName(__FIIterator_1_Windows__CUI__CComposition__CVisual* This,HSTRING *className) {
    return This->lpVtbl->GetRuntimeClassName(This,className);
}
static __WIDL_INLINE HRESULT __FIIterator_1_Windows__CUI__CComposition__CVisual_GetTrustLevel(__FIIterator_1_Windows__CUI__CComposition__CVisual* This,TrustLevel *trustLevel) {
    return This->lpVtbl->GetTrustLevel(This,trustLevel);
}
/*** IIterator<ABI::Windows::UI::Composition::Visual* > methods ***/
static __WIDL_INLINE HRESULT __FIIterator_1_Windows__CUI__CComposition__CVisual_get_Current(__FIIterator_1_Windows__CUI__CComposition__CVisual* This,__x_ABI_CWindows_CUI_CComposition_CIVisual **value) {
    return This->lpVtbl->get_Current(This,value);
}
static __WIDL_INLINE HRESULT __FIIterator_1_Windows__CUI__CComposition__CVisual_get_HasCurrent(__FIIterator_1_Windows__CUI__CComposition__CVisual* This,boolean *value) {
    return This->lpVtbl->get_HasCurrent(This,value);
}
static __WIDL_INLINE HRESULT __FIIterator_1_Windows__CUI__CComposition__CVisual_MoveNext(__FIIterator_1_Windows__CUI__CComposition__CVisual* This,boolean *value) {
    return This->lpVtbl->MoveNext(This,value);
}
static __WIDL_INLINE HRESULT __FIIterator_1_Windows__CUI__CComposition__CVisual_GetMany(__FIIterator_1_Windows__CUI__CComposition__CVisual* This,UINT32 items_size,__x_ABI_CWindows_CUI_CComposition_CIVisual **items,UINT32 *value) {
    return This->lpVtbl->GetMany(This,items_size,items,value);
}
#endif
#ifdef WIDL_using_Windows_Foundation_Collections
#define IID_IIterator_Visual IID___FIIterator_1_Windows__CUI__CComposition__CVisual
#define IIterator_VisualVtbl __FIIterator_1_Windows__CUI__CComposition__CVisualVtbl
#define IIterator_Visual __FIIterator_1_Windows__CUI__CComposition__CVisual
#define IIterator_Visual_QueryInterface __FIIterator_1_Windows__CUI__CComposition__CVisual_QueryInterface
#define IIterator_Visual_AddRef __FIIterator_1_Windows__CUI__CComposition__CVisual_AddRef
#define IIterator_Visual_Release __FIIterator_1_Windows__CUI__CComposition__CVisual_Release
#define IIterator_Visual_GetIids __FIIterator_1_Windows__CUI__CComposition__CVisual_GetIids
#define IIterator_Visual_GetRuntimeClassName __FIIterator_1_Windows__CUI__CComposition__CVisual_GetRuntimeClassName
#define IIterator_Visual_GetTrustLevel __FIIterator_1_Windows__CUI__CComposition__CVisual_GetTrustLevel
#define IIterator_Visual_get_Current __FIIterator_1_Windows__CUI__CComposition__CVisual_get_Current
#define IIterator_Visual_get_HasCurrent __FIIterator_1_Windows__CUI__CComposition__CVisual_get_HasCurrent
#define IIterator_Visual_MoveNext __FIIterator_1_Windows__CUI__CComposition__CVisual_MoveNext
#define IIterator_Visual_GetMany __FIIterator_1_Windows__CUI__CComposition__CVisual_GetMany
#endif /* WIDL_using_Windows_Foundation_Collections */
#endif

#endif

#endif  /* ____FIIterator_1_Windows__CUI__CComposition__CVisual_INTERFACE_DEFINED__ */

/*****************************************************************************
 * ITypedEventHandler<IInspectable*,ABI::Windows::UI::Composition::CompositionBatchCompletedEventArgs* > interface
 */
#ifndef ____FITypedEventHandler_2_IInspectable_Windows__CUI__CComposition__CCompositionBatchCompletedEventArgs_INTERFACE_DEFINED__
#define ____FITypedEventHandler_2_IInspectable_Windows__CUI__CComposition__CCompositionBatchCompletedEventArgs_INTERFACE_DEFINED__

DEFINE_GUID(IID___FITypedEventHandler_2_IInspectable_Windows__CUI__CComposition__CCompositionBatchCompletedEventArgs, 0x9df03456, 0x3383, 0x508b, 0x9c,0x75, 0xee,0x84,0x0a,0x7e,0x1a,0x39);
#if defined(__cplusplus) && !defined(CINTERFACE)
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace Foundation {
            template<>
            MIDL_INTERFACE("9df03456-3383-508b-9c75-ee840a7e1a39")
            ITypedEventHandler<IInspectable*,ABI::Windows::UI::Composition::CompositionBatchCompletedEventArgs* > : ITypedEventHandler_impl<IInspectable*, ABI::Windows::Foundation::Internal::AggregateType<ABI::Windows::UI::Composition::CompositionBatchCompletedEventArgs*, ABI::Windows::UI::Composition::ICompositionBatchCompletedEventArgs* > >
            {
            };
        }
    }
}
extern "C" {
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(__FITypedEventHandler_2_IInspectable_Windows__CUI__CComposition__CCompositionBatchCompletedEventArgs, 0x9df03456, 0x3383, 0x508b, 0x9c,0x75, 0xee,0x84,0x0a,0x7e,0x1a,0x39)
#endif
#else
typedef struct __FITypedEventHandler_2_IInspectable_Windows__CUI__CComposition__CCompositionBatchCompletedEventArgsVtbl {
    BEGIN_INTERFACE

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

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

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

    /*** ITypedEventHandler<IInspectable*,ABI::Windows::UI::Composition::CompositionBatchCompletedEventArgs* > methods ***/
    HRESULT (STDMETHODCALLTYPE *Invoke)(
        __FITypedEventHandler_2_IInspectable_Windows__CUI__CComposition__CCompositionBatchCompletedEventArgs *This,
        IInspectable *sender,
        __x_ABI_CWindows_CUI_CComposition_CICompositionBatchCompletedEventArgs *args);

    END_INTERFACE
} __FITypedEventHandler_2_IInspectable_Windows__CUI__CComposition__CCompositionBatchCompletedEventArgsVtbl;

interface __FITypedEventHandler_2_IInspectable_Windows__CUI__CComposition__CCompositionBatchCompletedEventArgs {
    CONST_VTBL __FITypedEventHandler_2_IInspectable_Windows__CUI__CComposition__CCompositionBatchCompletedEventArgsVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define __FITypedEventHandler_2_IInspectable_Windows__CUI__CComposition__CCompositionBatchCompletedEventArgs_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define __FITypedEventHandler_2_IInspectable_Windows__CUI__CComposition__CCompositionBatchCompletedEventArgs_AddRef(This) (This)->lpVtbl->AddRef(This)
#define __FITypedEventHandler_2_IInspectable_Windows__CUI__CComposition__CCompositionBatchCompletedEventArgs_Release(This) (This)->lpVtbl->Release(This)
/*** ITypedEventHandler<IInspectable*,ABI::Windows::UI::Composition::CompositionBatchCompletedEventArgs* > methods ***/
#define __FITypedEventHandler_2_IInspectable_Windows__CUI__CComposition__CCompositionBatchCompletedEventArgs_Invoke(This,sender,args) (This)->lpVtbl->Invoke(This,sender,args)
#else
/*** IUnknown methods ***/
static __WIDL_INLINE HRESULT __FITypedEventHandler_2_IInspectable_Windows__CUI__CComposition__CCompositionBatchCompletedEventArgs_QueryInterface(__FITypedEventHandler_2_IInspectable_Windows__CUI__CComposition__CCompositionBatchCompletedEventArgs* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG __FITypedEventHandler_2_IInspectable_Windows__CUI__CComposition__CCompositionBatchCompletedEventArgs_AddRef(__FITypedEventHandler_2_IInspectable_Windows__CUI__CComposition__CCompositionBatchCompletedEventArgs* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG __FITypedEventHandler_2_IInspectable_Windows__CUI__CComposition__CCompositionBatchCompletedEventArgs_Release(__FITypedEventHandler_2_IInspectable_Windows__CUI__CComposition__CCompositionBatchCompletedEventArgs* This) {
    return This->lpVtbl->Release(This);
}
/*** ITypedEventHandler<IInspectable*,ABI::Windows::UI::Composition::CompositionBatchCompletedEventArgs* > methods ***/
static __WIDL_INLINE HRESULT __FITypedEventHandler_2_IInspectable_Windows__CUI__CComposition__CCompositionBatchCompletedEventArgs_Invoke(__FITypedEventHandler_2_IInspectable_Windows__CUI__CComposition__CCompositionBatchCompletedEventArgs* This,IInspectable *sender,__x_ABI_CWindows_CUI_CComposition_CICompositionBatchCompletedEventArgs *args) {
    return This->lpVtbl->Invoke(This,sender,args);
}
#endif
#ifdef WIDL_using_Windows_Foundation
#define IID_ITypedEventHandler_IInspectable_CompositionBatchCompletedEventArgs IID___FITypedEventHandler_2_IInspectable_Windows__CUI__CComposition__CCompositionBatchCompletedEventArgs
#define ITypedEventHandler_IInspectable_CompositionBatchCompletedEventArgsVtbl __FITypedEventHandler_2_IInspectable_Windows__CUI__CComposition__CCompositionBatchCompletedEventArgsVtbl
#define ITypedEventHandler_IInspectable_CompositionBatchCompletedEventArgs __FITypedEventHandler_2_IInspectable_Windows__CUI__CComposition__CCompositionBatchCompletedEventArgs
#define ITypedEventHandler_IInspectable_CompositionBatchCompletedEventArgs_QueryInterface __FITypedEventHandler_2_IInspectable_Windows__CUI__CComposition__CCompositionBatchCompletedEventArgs_QueryInterface
#define ITypedEventHandler_IInspectable_CompositionBatchCompletedEventArgs_AddRef __FITypedEventHandler_2_IInspectable_Windows__CUI__CComposition__CCompositionBatchCompletedEventArgs_AddRef
#define ITypedEventHandler_IInspectable_CompositionBatchCompletedEventArgs_Release __FITypedEventHandler_2_IInspectable_Windows__CUI__CComposition__CCompositionBatchCompletedEventArgs_Release
#define ITypedEventHandler_IInspectable_CompositionBatchCompletedEventArgs_Invoke __FITypedEventHandler_2_IInspectable_Windows__CUI__CComposition__CCompositionBatchCompletedEventArgs_Invoke
#endif /* WIDL_using_Windows_Foundation */
#endif

#endif

#endif  /* ____FITypedEventHandler_2_IInspectable_Windows__CUI__CComposition__CCompositionBatchCompletedEventArgs_INTERFACE_DEFINED__ */

/*****************************************************************************
 * ITypedEventHandler<ABI::Windows::UI::Composition::CompositionGraphicsDevice*,ABI::Windows::UI::Composition::RenderingDeviceReplacedEventArgs* > interface
 */
#ifndef ____FITypedEventHandler_2_Windows__CUI__CComposition__CCompositionGraphicsDevice_Windows__CUI__CComposition__CRenderingDeviceReplacedEventArgs_INTERFACE_DEFINED__
#define ____FITypedEventHandler_2_Windows__CUI__CComposition__CCompositionGraphicsDevice_Windows__CUI__CComposition__CRenderingDeviceReplacedEventArgs_INTERFACE_DEFINED__

DEFINE_GUID(IID___FITypedEventHandler_2_Windows__CUI__CComposition__CCompositionGraphicsDevice_Windows__CUI__CComposition__CRenderingDeviceReplacedEventArgs, 0x259b32be, 0xbd06, 0x53c2, 0xbd,0x51, 0x89,0xe8,0xe0,0xf9,0xe2,0x39);
#if defined(__cplusplus) && !defined(CINTERFACE)
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace Foundation {
            template<>
            MIDL_INTERFACE("259b32be-bd06-53c2-bd51-89e8e0f9e239")
            ITypedEventHandler<ABI::Windows::UI::Composition::CompositionGraphicsDevice*,ABI::Windows::UI::Composition::RenderingDeviceReplacedEventArgs* > : ITypedEventHandler_impl<ABI::Windows::Foundation::Internal::AggregateType<ABI::Windows::UI::Composition::CompositionGraphicsDevice*, ABI::Windows::UI::Composition::ICompositionGraphicsDevice* >, ABI::Windows::Foundation::Internal::AggregateType<ABI::Windows::UI::Composition::RenderingDeviceReplacedEventArgs*, ABI::Windows::UI::Composition::IRenderingDeviceReplacedEventArgs* > >
            {
            };
        }
    }
}
extern "C" {
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(__FITypedEventHandler_2_Windows__CUI__CComposition__CCompositionGraphicsDevice_Windows__CUI__CComposition__CRenderingDeviceReplacedEventArgs, 0x259b32be, 0xbd06, 0x53c2, 0xbd,0x51, 0x89,0xe8,0xe0,0xf9,0xe2,0x39)
#endif
#else
typedef struct __FITypedEventHandler_2_Windows__CUI__CComposition__CCompositionGraphicsDevice_Windows__CUI__CComposition__CRenderingDeviceReplacedEventArgsVtbl {
    BEGIN_INTERFACE

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

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

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

    /*** ITypedEventHandler<ABI::Windows::UI::Composition::CompositionGraphicsDevice*,ABI::Windows::UI::Composition::RenderingDeviceReplacedEventArgs* > methods ***/
    HRESULT (STDMETHODCALLTYPE *Invoke)(
        __FITypedEventHandler_2_Windows__CUI__CComposition__CCompositionGraphicsDevice_Windows__CUI__CComposition__CRenderingDeviceReplacedEventArgs *This,
        __x_ABI_CWindows_CUI_CComposition_CICompositionGraphicsDevice *sender,
        __x_ABI_CWindows_CUI_CComposition_CIRenderingDeviceReplacedEventArgs *args);

    END_INTERFACE
} __FITypedEventHandler_2_Windows__CUI__CComposition__CCompositionGraphicsDevice_Windows__CUI__CComposition__CRenderingDeviceReplacedEventArgsVtbl;

interface __FITypedEventHandler_2_Windows__CUI__CComposition__CCompositionGraphicsDevice_Windows__CUI__CComposition__CRenderingDeviceReplacedEventArgs {
    CONST_VTBL __FITypedEventHandler_2_Windows__CUI__CComposition__CCompositionGraphicsDevice_Windows__CUI__CComposition__CRenderingDeviceReplacedEventArgsVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define __FITypedEventHandler_2_Windows__CUI__CComposition__CCompositionGraphicsDevice_Windows__CUI__CComposition__CRenderingDeviceReplacedEventArgs_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define __FITypedEventHandler_2_Windows__CUI__CComposition__CCompositionGraphicsDevice_Windows__CUI__CComposition__CRenderingDeviceReplacedEventArgs_AddRef(This) (This)->lpVtbl->AddRef(This)
#define __FITypedEventHandler_2_Windows__CUI__CComposition__CCompositionGraphicsDevice_Windows__CUI__CComposition__CRenderingDeviceReplacedEventArgs_Release(This) (This)->lpVtbl->Release(This)
/*** ITypedEventHandler<ABI::Windows::UI::Composition::CompositionGraphicsDevice*,ABI::Windows::UI::Composition::RenderingDeviceReplacedEventArgs* > methods ***/
#define __FITypedEventHandler_2_Windows__CUI__CComposition__CCompositionGraphicsDevice_Windows__CUI__CComposition__CRenderingDeviceReplacedEventArgs_Invoke(This,sender,args) (This)->lpVtbl->Invoke(This,sender,args)
#else
/*** IUnknown methods ***/
static __WIDL_INLINE HRESULT __FITypedEventHandler_2_Windows__CUI__CComposition__CCompositionGraphicsDevice_Windows__CUI__CComposition__CRenderingDeviceReplacedEventArgs_QueryInterface(__FITypedEventHandler_2_Windows__CUI__CComposition__CCompositionGraphicsDevice_Windows__CUI__CComposition__CRenderingDeviceReplacedEventArgs* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG __FITypedEventHandler_2_Windows__CUI__CComposition__CCompositionGraphicsDevice_Windows__CUI__CComposition__CRenderingDeviceReplacedEventArgs_AddRef(__FITypedEventHandler_2_Windows__CUI__CComposition__CCompositionGraphicsDevice_Windows__CUI__CComposition__CRenderingDeviceReplacedEventArgs* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG __FITypedEventHandler_2_Windows__CUI__CComposition__CCompositionGraphicsDevice_Windows__CUI__CComposition__CRenderingDeviceReplacedEventArgs_Release(__FITypedEventHandler_2_Windows__CUI__CComposition__CCompositionGraphicsDevice_Windows__CUI__CComposition__CRenderingDeviceReplacedEventArgs* This) {
    return This->lpVtbl->Release(This);
}
/*** ITypedEventHandler<ABI::Windows::UI::Composition::CompositionGraphicsDevice*,ABI::Windows::UI::Composition::RenderingDeviceReplacedEventArgs* > methods ***/
static __WIDL_INLINE HRESULT __FITypedEventHandler_2_Windows__CUI__CComposition__CCompositionGraphicsDevice_Windows__CUI__CComposition__CRenderingDeviceReplacedEventArgs_Invoke(__FITypedEventHandler_2_Windows__CUI__CComposition__CCompositionGraphicsDevice_Windows__CUI__CComposition__CRenderingDeviceReplacedEventArgs* This,__x_ABI_CWindows_CUI_CComposition_CICompositionGraphicsDevice *sender,__x_ABI_CWindows_CUI_CComposition_CIRenderingDeviceReplacedEventArgs *args) {
    return This->lpVtbl->Invoke(This,sender,args);
}
#endif
#ifdef WIDL_using_Windows_Foundation
#define IID_ITypedEventHandler_CompositionGraphicsDevice_RenderingDeviceReplacedEventArgs IID___FITypedEventHandler_2_Windows__CUI__CComposition__CCompositionGraphicsDevice_Windows__CUI__CComposition__CRenderingDeviceReplacedEventArgs
#define ITypedEventHandler_CompositionGraphicsDevice_RenderingDeviceReplacedEventArgsVtbl __FITypedEventHandler_2_Windows__CUI__CComposition__CCompositionGraphicsDevice_Windows__CUI__CComposition__CRenderingDeviceReplacedEventArgsVtbl
#define ITypedEventHandler_CompositionGraphicsDevice_RenderingDeviceReplacedEventArgs __FITypedEventHandler_2_Windows__CUI__CComposition__CCompositionGraphicsDevice_Windows__CUI__CComposition__CRenderingDeviceReplacedEventArgs
#define ITypedEventHandler_CompositionGraphicsDevice_RenderingDeviceReplacedEventArgs_QueryInterface __FITypedEventHandler_2_Windows__CUI__CComposition__CCompositionGraphicsDevice_Windows__CUI__CComposition__CRenderingDeviceReplacedEventArgs_QueryInterface
#define ITypedEventHandler_CompositionGraphicsDevice_RenderingDeviceReplacedEventArgs_AddRef __FITypedEventHandler_2_Windows__CUI__CComposition__CCompositionGraphicsDevice_Windows__CUI__CComposition__CRenderingDeviceReplacedEventArgs_AddRef
#define ITypedEventHandler_CompositionGraphicsDevice_RenderingDeviceReplacedEventArgs_Release __FITypedEventHandler_2_Windows__CUI__CComposition__CCompositionGraphicsDevice_Windows__CUI__CComposition__CRenderingDeviceReplacedEventArgs_Release
#define ITypedEventHandler_CompositionGraphicsDevice_RenderingDeviceReplacedEventArgs_Invoke __FITypedEventHandler_2_Windows__CUI__CComposition__CCompositionGraphicsDevice_Windows__CUI__CComposition__CRenderingDeviceReplacedEventArgs_Invoke
#endif /* WIDL_using_Windows_Foundation */
#endif

#endif

#endif  /* ____FITypedEventHandler_2_Windows__CUI__CComposition__CCompositionGraphicsDevice_Windows__CUI__CComposition__CRenderingDeviceReplacedEventArgs_INTERFACE_DEFINED__ */

/* Begin additional prototypes for all interfaces */

ULONG           __RPC_USER HSTRING_UserSize     (ULONG *, ULONG, HSTRING *);
unsigned char * __RPC_USER HSTRING_UserMarshal  (ULONG *, unsigned char *, HSTRING *);
unsigned char * __RPC_USER HSTRING_UserUnmarshal(ULONG *, unsigned char *, HSTRING *);
void            __RPC_USER HSTRING_UserFree     (ULONG *, HSTRING *);

/* End additional prototypes */

#ifdef __cplusplus
}
#endif

#endif /* __windows_ui_composition_h__ */
