/*** Autogenerated by WIDL 8.21 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,
        WINBOOL *value);

    HRESULT (STDMETHODCALLTYPE *MoveNext)(
        __FIIterator_1_Windows__CUI__CComposition__CCompositionAnimation *This,
        WINBOOL *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,WINBOOL *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,WINBOOL *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,
        WINBOOL *value);

    HRESULT (STDMETHODCALLTYPE *MoveNext)(
        __FIIterator_1_Windows__CUI__CComposition__CVisual *This,
        WINBOOL *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,WINBOOL *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,WINBOOL *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__ */
