/*** Autogenerated by WIDL 10.4 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__

/* 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(
                        ABI::Windows::UI::Composition::CompositionColorSpace *value) = 0;

                    virtual HRESULT STDMETHODCALLTYPE put_InterpolationColorSpace(
                        ABI::Windows::UI::Composition::CompositionColorSpace value) = 0;

                    virtual HRESULT STDMETHODCALLTYPE InsertKeyFrame(
                        FLOAT key,
                        ABI::Windows::UI::Color value) = 0;

                    virtual HRESULT STDMETHODCALLTYPE InsertKeyFrameWithEasingFunction(
                        FLOAT key,
                        ABI::Windows::UI::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,
        __x_ABI_CWindows_CUI_CComposition_CCompositionColorSpace *value);

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

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

    HRESULT (STDMETHODCALLTYPE *InsertKeyFrameWithEasingFunction)(
        __x_ABI_CWindows_CUI_CComposition_CIColorKeyFrameAnimation *This,
        FLOAT key,
        __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 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 inline ULONG __x_ABI_CWindows_CUI_CComposition_CIColorKeyFrameAnimation_AddRef(__x_ABI_CWindows_CUI_CComposition_CIColorKeyFrameAnimation* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG __x_ABI_CWindows_CUI_CComposition_CIColorKeyFrameAnimation_Release(__x_ABI_CWindows_CUI_CComposition_CIColorKeyFrameAnimation* This) {
    return This->lpVtbl->Release(This);
}
/*** IInspectable methods ***/
static 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 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 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 inline HRESULT __x_ABI_CWindows_CUI_CComposition_CIColorKeyFrameAnimation_get_InterpolationColorSpace(__x_ABI_CWindows_CUI_CComposition_CIColorKeyFrameAnimation* This,__x_ABI_CWindows_CUI_CComposition_CCompositionColorSpace *value) {
    return This->lpVtbl->get_InterpolationColorSpace(This,value);
}
static inline HRESULT __x_ABI_CWindows_CUI_CComposition_CIColorKeyFrameAnimation_put_InterpolationColorSpace(__x_ABI_CWindows_CUI_CComposition_CIColorKeyFrameAnimation* This,__x_ABI_CWindows_CUI_CComposition_CCompositionColorSpace value) {
    return This->lpVtbl->put_InterpolationColorSpace(This,value);
}
static inline HRESULT __x_ABI_CWindows_CUI_CComposition_CIColorKeyFrameAnimation_InsertKeyFrame(__x_ABI_CWindows_CUI_CComposition_CIColorKeyFrameAnimation* This,FLOAT key,__x_ABI_CWindows_CUI_CColor value) {
    return This->lpVtbl->InsertKeyFrame(This,key,value);
}
static inline HRESULT __x_ABI_CWindows_CUI_CComposition_CIColorKeyFrameAnimation_InsertKeyFrameWithEasingFunction(__x_ABI_CWindows_CUI_CComposition_CIColorKeyFrameAnimation* This,FLOAT key,__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,
                        ABI::Windows::UI::Color value) = 0;

                    virtual HRESULT STDMETHODCALLTYPE SetMatrix3x2Parameter(
                        HSTRING key,
                        ABI::Windows::Foundation::Numerics::Matrix3x2 value) = 0;

                    virtual HRESULT STDMETHODCALLTYPE SetMatrix4x4Parameter(
                        HSTRING key,
                        ABI::Windows::Foundation::Numerics::Matrix4x4 value) = 0;

                    virtual HRESULT STDMETHODCALLTYPE SetQuaternionParameter(
                        HSTRING key,
                        ABI::Windows::Foundation::Numerics::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,
                        ABI::Windows::Foundation::Numerics::Vector2 value) = 0;

                    virtual HRESULT STDMETHODCALLTYPE SetVector3Parameter(
                        HSTRING key,
                        ABI::Windows::Foundation::Numerics::Vector3 value) = 0;

                    virtual HRESULT STDMETHODCALLTYPE SetVector4Parameter(
                        HSTRING key,
                        ABI::Windows::Foundation::Numerics::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,
        __x_ABI_CWindows_CUI_CColor value);

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

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

    HRESULT (STDMETHODCALLTYPE *SetQuaternionParameter)(
        __x_ABI_CWindows_CUI_CComposition_CICompositionAnimation *This,
        HSTRING key,
        __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,
        __x_ABI_CWindows_CFoundation_CNumerics_CVector2 value);

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

    HRESULT (STDMETHODCALLTYPE *SetVector4Parameter)(
        __x_ABI_CWindows_CUI_CComposition_CICompositionAnimation *This,
        HSTRING key,
        __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 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 inline ULONG __x_ABI_CWindows_CUI_CComposition_CICompositionAnimation_AddRef(__x_ABI_CWindows_CUI_CComposition_CICompositionAnimation* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG __x_ABI_CWindows_CUI_CComposition_CICompositionAnimation_Release(__x_ABI_CWindows_CUI_CComposition_CICompositionAnimation* This) {
    return This->lpVtbl->Release(This);
}
/*** IInspectable methods ***/
static 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 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 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 inline HRESULT __x_ABI_CWindows_CUI_CComposition_CICompositionAnimation_ClearAllParameters(__x_ABI_CWindows_CUI_CComposition_CICompositionAnimation* This) {
    return This->lpVtbl->ClearAllParameters(This);
}
static 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 inline HRESULT __x_ABI_CWindows_CUI_CComposition_CICompositionAnimation_SetColorParameter(__x_ABI_CWindows_CUI_CComposition_CICompositionAnimation* This,HSTRING key,__x_ABI_CWindows_CUI_CColor value) {
    return This->lpVtbl->SetColorParameter(This,key,value);
}
static inline HRESULT __x_ABI_CWindows_CUI_CComposition_CICompositionAnimation_SetMatrix3x2Parameter(__x_ABI_CWindows_CUI_CComposition_CICompositionAnimation* This,HSTRING key,__x_ABI_CWindows_CFoundation_CNumerics_CMatrix3x2 value) {
    return This->lpVtbl->SetMatrix3x2Parameter(This,key,value);
}
static inline HRESULT __x_ABI_CWindows_CUI_CComposition_CICompositionAnimation_SetMatrix4x4Parameter(__x_ABI_CWindows_CUI_CComposition_CICompositionAnimation* This,HSTRING key,__x_ABI_CWindows_CFoundation_CNumerics_CMatrix4x4 value) {
    return This->lpVtbl->SetMatrix4x4Parameter(This,key,value);
}
static inline HRESULT __x_ABI_CWindows_CUI_CComposition_CICompositionAnimation_SetQuaternionParameter(__x_ABI_CWindows_CUI_CComposition_CICompositionAnimation* This,HSTRING key,__x_ABI_CWindows_CFoundation_CNumerics_CQuaternion value) {
    return This->lpVtbl->SetQuaternionParameter(This,key,value);
}
static 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 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 inline HRESULT __x_ABI_CWindows_CUI_CComposition_CICompositionAnimation_SetVector2Parameter(__x_ABI_CWindows_CUI_CComposition_CICompositionAnimation* This,HSTRING key,__x_ABI_CWindows_CFoundation_CNumerics_CVector2 value) {
    return This->lpVtbl->SetVector2Parameter(This,key,value);
}
static inline HRESULT __x_ABI_CWindows_CUI_CComposition_CICompositionAnimation_SetVector3Parameter(__x_ABI_CWindows_CUI_CComposition_CICompositionAnimation* This,HSTRING key,__x_ABI_CWindows_CFoundation_CNumerics_CVector3 value) {
    return This->lpVtbl->SetVector3Parameter(This,key,value);
}
static inline HRESULT __x_ABI_CWindows_CUI_CComposition_CICompositionAnimation_SetVector4Parameter(__x_ABI_CWindows_CUI_CComposition_CICompositionAnimation* This,HSTRING key,__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 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 inline ULONG __x_ABI_CWindows_CUI_CComposition_CICompositionAnimationBase_AddRef(__x_ABI_CWindows_CUI_CComposition_CICompositionAnimationBase* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG __x_ABI_CWindows_CUI_CComposition_CICompositionAnimationBase_Release(__x_ABI_CWindows_CUI_CComposition_CICompositionAnimationBase* This) {
    return This->lpVtbl->Release(This);
}
/*** IInspectable methods ***/
static 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 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 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 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 inline ULONG __x_ABI_CWindows_CUI_CComposition_CICompositionAnimationFactory_AddRef(__x_ABI_CWindows_CUI_CComposition_CICompositionAnimationFactory* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG __x_ABI_CWindows_CUI_CComposition_CICompositionAnimationFactory_Release(__x_ABI_CWindows_CUI_CComposition_CICompositionAnimationFactory* This) {
    return This->lpVtbl->Release(This);
}
/*** IInspectable methods ***/
static 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 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 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 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 inline ULONG __x_ABI_CWindows_CUI_CComposition_CICompositionObject_AddRef(__x_ABI_CWindows_CUI_CComposition_CICompositionObject* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG __x_ABI_CWindows_CUI_CComposition_CICompositionObject_Release(__x_ABI_CWindows_CUI_CComposition_CICompositionObject* This) {
    return This->lpVtbl->Release(This);
}
/*** IInspectable methods ***/
static 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 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 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 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 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 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 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 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 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 inline ULONG __x_ABI_CWindows_CUI_CComposition_CICompositionObjectFactory_AddRef(__x_ABI_CWindows_CUI_CComposition_CICompositionObjectFactory* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG __x_ABI_CWindows_CUI_CComposition_CICompositionObjectFactory_Release(__x_ABI_CWindows_CUI_CComposition_CICompositionObjectFactory* This) {
    return This->lpVtbl->Release(This);
}
/*** IInspectable methods ***/
static 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 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 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 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 inline ULONG __x_ABI_CWindows_CUI_CComposition_CICompositionBatchCompletedEventArgs_AddRef(__x_ABI_CWindows_CUI_CComposition_CICompositionBatchCompletedEventArgs* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG __x_ABI_CWindows_CUI_CComposition_CICompositionBatchCompletedEventArgs_Release(__x_ABI_CWindows_CUI_CComposition_CICompositionBatchCompletedEventArgs* This) {
    return This->lpVtbl->Release(This);
}
/*** IInspectable methods ***/
static 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 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 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 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 inline ULONG __x_ABI_CWindows_CUI_CComposition_CICompositionBrush_AddRef(__x_ABI_CWindows_CUI_CComposition_CICompositionBrush* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG __x_ABI_CWindows_CUI_CComposition_CICompositionBrush_Release(__x_ABI_CWindows_CUI_CComposition_CICompositionBrush* This) {
    return This->lpVtbl->Release(This);
}
/*** IInspectable methods ***/
static 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 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 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 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 inline ULONG __x_ABI_CWindows_CUI_CComposition_CICompositionBrushFactory_AddRef(__x_ABI_CWindows_CUI_CComposition_CICompositionBrushFactory* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG __x_ABI_CWindows_CUI_CComposition_CICompositionBrushFactory_Release(__x_ABI_CWindows_CUI_CComposition_CICompositionBrushFactory* This) {
    return This->lpVtbl->Release(This);
}
/*** IInspectable methods ***/
static 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 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 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 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 inline ULONG __x_ABI_CWindows_CUI_CComposition_CICompositionClip_AddRef(__x_ABI_CWindows_CUI_CComposition_CICompositionClip* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG __x_ABI_CWindows_CUI_CComposition_CICompositionClip_Release(__x_ABI_CWindows_CUI_CComposition_CICompositionClip* This) {
    return This->lpVtbl->Release(This);
}
/*** IInspectable methods ***/
static 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 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 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 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 inline ULONG __x_ABI_CWindows_CUI_CComposition_CICompositionClipFactory_AddRef(__x_ABI_CWindows_CUI_CComposition_CICompositionClipFactory* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG __x_ABI_CWindows_CUI_CComposition_CICompositionClipFactory_Release(__x_ABI_CWindows_CUI_CComposition_CICompositionClipFactory* This) {
    return This->lpVtbl->Release(This);
}
/*** IInspectable methods ***/
static 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 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 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(
                        ABI::Windows::UI::Color *value) = 0;

                    virtual HRESULT STDMETHODCALLTYPE put_Color(
                        ABI::Windows::UI::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,
        __x_ABI_CWindows_CUI_CColor *value);

    HRESULT (STDMETHODCALLTYPE *put_Color)(
        __x_ABI_CWindows_CUI_CComposition_CICompositionColorBrush *This,
        __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 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 inline ULONG __x_ABI_CWindows_CUI_CComposition_CICompositionColorBrush_AddRef(__x_ABI_CWindows_CUI_CComposition_CICompositionColorBrush* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG __x_ABI_CWindows_CUI_CComposition_CICompositionColorBrush_Release(__x_ABI_CWindows_CUI_CComposition_CICompositionColorBrush* This) {
    return This->lpVtbl->Release(This);
}
/*** IInspectable methods ***/
static 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 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 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 inline HRESULT __x_ABI_CWindows_CUI_CComposition_CICompositionColorBrush_get_Color(__x_ABI_CWindows_CUI_CComposition_CICompositionColorBrush* This,__x_ABI_CWindows_CUI_CColor *value) {
    return This->lpVtbl->get_Color(This,value);
}
static inline HRESULT __x_ABI_CWindows_CUI_CComposition_CICompositionColorBrush_put_Color(__x_ABI_CWindows_CUI_CComposition_CICompositionColorBrush* This,__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 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 inline ULONG __x_ABI_CWindows_CUI_CComposition_CICompositionCommitBatch_AddRef(__x_ABI_CWindows_CUI_CComposition_CICompositionCommitBatch* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG __x_ABI_CWindows_CUI_CComposition_CICompositionCommitBatch_Release(__x_ABI_CWindows_CUI_CComposition_CICompositionCommitBatch* This) {
    return This->lpVtbl->Release(This);
}
/*** IInspectable methods ***/
static 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 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 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 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 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 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 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(
                        ABI::Windows::Graphics::DirectX::DirectXAlphaMode *value) = 0;

                    virtual HRESULT STDMETHODCALLTYPE get_PixelFormat(
                        ABI::Windows::Graphics::DirectX::DirectXPixelFormat *value) = 0;

                    virtual HRESULT STDMETHODCALLTYPE get_Size(
                        ABI::Windows::Foundation::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,
        __x_ABI_CWindows_CGraphics_CDirectX_CDirectXAlphaMode *value);

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

    HRESULT (STDMETHODCALLTYPE *get_Size)(
        __x_ABI_CWindows_CUI_CComposition_CICompositionDrawingSurface *This,
        __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 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 inline ULONG __x_ABI_CWindows_CUI_CComposition_CICompositionDrawingSurface_AddRef(__x_ABI_CWindows_CUI_CComposition_CICompositionDrawingSurface* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG __x_ABI_CWindows_CUI_CComposition_CICompositionDrawingSurface_Release(__x_ABI_CWindows_CUI_CComposition_CICompositionDrawingSurface* This) {
    return This->lpVtbl->Release(This);
}
/*** IInspectable methods ***/
static 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 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 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 inline HRESULT __x_ABI_CWindows_CUI_CComposition_CICompositionDrawingSurface_get_AlphaMode(__x_ABI_CWindows_CUI_CComposition_CICompositionDrawingSurface* This,__x_ABI_CWindows_CGraphics_CDirectX_CDirectXAlphaMode *value) {
    return This->lpVtbl->get_AlphaMode(This,value);
}
static inline HRESULT __x_ABI_CWindows_CUI_CComposition_CICompositionDrawingSurface_get_PixelFormat(__x_ABI_CWindows_CUI_CComposition_CICompositionDrawingSurface* This,__x_ABI_CWindows_CGraphics_CDirectX_CDirectXPixelFormat *value) {
    return This->lpVtbl->get_PixelFormat(This,value);
}
static inline HRESULT __x_ABI_CWindows_CUI_CComposition_CICompositionDrawingSurface_get_Size(__x_ABI_CWindows_CUI_CComposition_CICompositionDrawingSurface* This,__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 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 inline ULONG __x_ABI_CWindows_CUI_CComposition_CICompositionDrawingSurfaceFactory_AddRef(__x_ABI_CWindows_CUI_CComposition_CICompositionDrawingSurfaceFactory* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG __x_ABI_CWindows_CUI_CComposition_CICompositionDrawingSurfaceFactory_Release(__x_ABI_CWindows_CUI_CComposition_CICompositionDrawingSurfaceFactory* This) {
    return This->lpVtbl->Release(This);
}
/*** IInspectable methods ***/
static 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 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 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 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 inline ULONG __x_ABI_CWindows_CUI_CComposition_CICompositionEasingFunction_AddRef(__x_ABI_CWindows_CUI_CComposition_CICompositionEasingFunction* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG __x_ABI_CWindows_CUI_CComposition_CICompositionEasingFunction_Release(__x_ABI_CWindows_CUI_CComposition_CICompositionEasingFunction* This) {
    return This->lpVtbl->Release(This);
}
/*** IInspectable methods ***/
static 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 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 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 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 inline ULONG __x_ABI_CWindows_CUI_CComposition_CICompositionEasingFunctionFactory_AddRef(__x_ABI_CWindows_CUI_CComposition_CICompositionEasingFunctionFactory* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG __x_ABI_CWindows_CUI_CComposition_CICompositionEasingFunctionFactory_Release(__x_ABI_CWindows_CUI_CComposition_CICompositionEasingFunctionFactory* This) {
    return This->lpVtbl->Release(This);
}
/*** IInspectable methods ***/
static 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 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 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 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 inline ULONG __x_ABI_CWindows_CUI_CComposition_CICompositionEffectBrush_AddRef(__x_ABI_CWindows_CUI_CComposition_CICompositionEffectBrush* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG __x_ABI_CWindows_CUI_CComposition_CICompositionEffectBrush_Release(__x_ABI_CWindows_CUI_CComposition_CICompositionEffectBrush* This) {
    return This->lpVtbl->Release(This);
}
/*** IInspectable methods ***/
static 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 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 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 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 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(
                        ABI::Windows::UI::Composition::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,
        __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 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 inline ULONG __x_ABI_CWindows_CUI_CComposition_CICompositionEffectFactory_AddRef(__x_ABI_CWindows_CUI_CComposition_CICompositionEffectFactory* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG __x_ABI_CWindows_CUI_CComposition_CICompositionEffectFactory_Release(__x_ABI_CWindows_CUI_CComposition_CICompositionEffectFactory* This) {
    return This->lpVtbl->Release(This);
}
/*** IInspectable methods ***/
static 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 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 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 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 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 inline HRESULT __x_ABI_CWindows_CUI_CComposition_CICompositionEffectFactory_get_LoadStatus(__x_ABI_CWindows_CUI_CComposition_CICompositionEffectFactory* This,__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(
                        ABI::Windows::Foundation::Size pixels,
                        ABI::Windows::Graphics::DirectX::DirectXPixelFormat format,
                        ABI::Windows::Graphics::DirectX::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,
        __x_ABI_CWindows_CFoundation_CSize pixels,
        __x_ABI_CWindows_CGraphics_CDirectX_CDirectXPixelFormat format,
        __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 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 inline ULONG __x_ABI_CWindows_CUI_CComposition_CICompositionGraphicsDevice_AddRef(__x_ABI_CWindows_CUI_CComposition_CICompositionGraphicsDevice* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG __x_ABI_CWindows_CUI_CComposition_CICompositionGraphicsDevice_Release(__x_ABI_CWindows_CUI_CComposition_CICompositionGraphicsDevice* This) {
    return This->lpVtbl->Release(This);
}
/*** IInspectable methods ***/
static 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 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 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 inline HRESULT __x_ABI_CWindows_CUI_CComposition_CICompositionGraphicsDevice_CreateDrawingSurface(__x_ABI_CWindows_CUI_CComposition_CICompositionGraphicsDevice* This,__x_ABI_CWindows_CFoundation_CSize pixels,__x_ABI_CWindows_CGraphics_CDirectX_CDirectXPixelFormat format,__x_ABI_CWindows_CGraphics_CDirectX_CDirectXAlphaMode mode,__x_ABI_CWindows_CUI_CComposition_CICompositionDrawingSurface **result) {
    return This->lpVtbl->CreateDrawingSurface(This,pixels,format,mode,result);
}
static 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 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,
                        ABI::Windows::UI::Color value) = 0;

                    virtual HRESULT STDMETHODCALLTYPE InsertMatrix3x2(
                        HSTRING name,
                        ABI::Windows::Foundation::Numerics::Matrix3x2 value) = 0;

                    virtual HRESULT STDMETHODCALLTYPE InsertMatrix4x4(
                        HSTRING name,
                        ABI::Windows::Foundation::Numerics::Matrix4x4 value) = 0;

                    virtual HRESULT STDMETHODCALLTYPE InsertQuaternion(
                        HSTRING name,
                        ABI::Windows::Foundation::Numerics::Quaternion value) = 0;

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

                    virtual HRESULT STDMETHODCALLTYPE InsertVector2(
                        HSTRING name,
                        ABI::Windows::Foundation::Numerics::Vector2 value) = 0;

                    virtual HRESULT STDMETHODCALLTYPE InsertVector3(
                        HSTRING name,
                        ABI::Windows::Foundation::Numerics::Vector3 value) = 0;

                    virtual HRESULT STDMETHODCALLTYPE InsertVector4(
                        HSTRING name,
                        ABI::Windows::Foundation::Numerics::Vector4 value) = 0;

                    virtual HRESULT STDMETHODCALLTYPE TryGetColor(
                        HSTRING name,
                        ABI::Windows::UI::Color *value,
                        ABI::Windows::UI::Composition::CompositionGetValueStatus *result) = 0;

                    virtual HRESULT STDMETHODCALLTYPE TryGetMatrix3x2(
                        HSTRING name,
                        ABI::Windows::Foundation::Numerics::Matrix3x2 *value,
                        ABI::Windows::UI::Composition::CompositionGetValueStatus *result) = 0;

                    virtual HRESULT STDMETHODCALLTYPE TryGetMatrix4x4(
                        HSTRING name,
                        ABI::Windows::Foundation::Numerics::Matrix4x4 *value,
                        ABI::Windows::UI::Composition::CompositionGetValueStatus *result) = 0;

                    virtual HRESULT STDMETHODCALLTYPE TryGetQuaternion(
                        HSTRING name,
                        ABI::Windows::Foundation::Numerics::Quaternion *value,
                        ABI::Windows::UI::Composition::CompositionGetValueStatus *result) = 0;

                    virtual HRESULT STDMETHODCALLTYPE TryGetScalar(
                        HSTRING name,
                        FLOAT *value,
                        ABI::Windows::UI::Composition::CompositionGetValueStatus *result) = 0;

                    virtual HRESULT STDMETHODCALLTYPE TryGetVector2(
                        HSTRING name,
                        ABI::Windows::Foundation::Numerics::Vector2 *value,
                        ABI::Windows::UI::Composition::CompositionGetValueStatus *result) = 0;

                    virtual HRESULT STDMETHODCALLTYPE TryGetVector3(
                        HSTRING name,
                        ABI::Windows::Foundation::Numerics::Vector3 *value,
                        ABI::Windows::UI::Composition::CompositionGetValueStatus *result) = 0;

                    virtual HRESULT STDMETHODCALLTYPE TryGetVector4(
                        HSTRING name,
                        ABI::Windows::Foundation::Numerics::Vector4 *value,
                        ABI::Windows::UI::Composition::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,
        __x_ABI_CWindows_CUI_CColor value);

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

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

    HRESULT (STDMETHODCALLTYPE *InsertQuaternion)(
        __x_ABI_CWindows_CUI_CComposition_CICompositionPropertySet *This,
        HSTRING name,
        __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,
        __x_ABI_CWindows_CFoundation_CNumerics_CVector2 value);

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

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

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

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

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

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

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

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

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

    HRESULT (STDMETHODCALLTYPE *TryGetVector4)(
        __x_ABI_CWindows_CUI_CComposition_CICompositionPropertySet *This,
        HSTRING name,
        __x_ABI_CWindows_CFoundation_CNumerics_CVector4 *value,
        __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 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 inline ULONG __x_ABI_CWindows_CUI_CComposition_CICompositionPropertySet_AddRef(__x_ABI_CWindows_CUI_CComposition_CICompositionPropertySet* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG __x_ABI_CWindows_CUI_CComposition_CICompositionPropertySet_Release(__x_ABI_CWindows_CUI_CComposition_CICompositionPropertySet* This) {
    return This->lpVtbl->Release(This);
}
/*** IInspectable methods ***/
static 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 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 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 inline HRESULT __x_ABI_CWindows_CUI_CComposition_CICompositionPropertySet_InsertColor(__x_ABI_CWindows_CUI_CComposition_CICompositionPropertySet* This,HSTRING name,__x_ABI_CWindows_CUI_CColor value) {
    return This->lpVtbl->InsertColor(This,name,value);
}
static inline HRESULT __x_ABI_CWindows_CUI_CComposition_CICompositionPropertySet_InsertMatrix3x2(__x_ABI_CWindows_CUI_CComposition_CICompositionPropertySet* This,HSTRING name,__x_ABI_CWindows_CFoundation_CNumerics_CMatrix3x2 value) {
    return This->lpVtbl->InsertMatrix3x2(This,name,value);
}
static inline HRESULT __x_ABI_CWindows_CUI_CComposition_CICompositionPropertySet_InsertMatrix4x4(__x_ABI_CWindows_CUI_CComposition_CICompositionPropertySet* This,HSTRING name,__x_ABI_CWindows_CFoundation_CNumerics_CMatrix4x4 value) {
    return This->lpVtbl->InsertMatrix4x4(This,name,value);
}
static inline HRESULT __x_ABI_CWindows_CUI_CComposition_CICompositionPropertySet_InsertQuaternion(__x_ABI_CWindows_CUI_CComposition_CICompositionPropertySet* This,HSTRING name,__x_ABI_CWindows_CFoundation_CNumerics_CQuaternion value) {
    return This->lpVtbl->InsertQuaternion(This,name,value);
}
static 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 inline HRESULT __x_ABI_CWindows_CUI_CComposition_CICompositionPropertySet_InsertVector2(__x_ABI_CWindows_CUI_CComposition_CICompositionPropertySet* This,HSTRING name,__x_ABI_CWindows_CFoundation_CNumerics_CVector2 value) {
    return This->lpVtbl->InsertVector2(This,name,value);
}
static inline HRESULT __x_ABI_CWindows_CUI_CComposition_CICompositionPropertySet_InsertVector3(__x_ABI_CWindows_CUI_CComposition_CICompositionPropertySet* This,HSTRING name,__x_ABI_CWindows_CFoundation_CNumerics_CVector3 value) {
    return This->lpVtbl->InsertVector3(This,name,value);
}
static inline HRESULT __x_ABI_CWindows_CUI_CComposition_CICompositionPropertySet_InsertVector4(__x_ABI_CWindows_CUI_CComposition_CICompositionPropertySet* This,HSTRING name,__x_ABI_CWindows_CFoundation_CNumerics_CVector4 value) {
    return This->lpVtbl->InsertVector4(This,name,value);
}
static inline HRESULT __x_ABI_CWindows_CUI_CComposition_CICompositionPropertySet_TryGetColor(__x_ABI_CWindows_CUI_CComposition_CICompositionPropertySet* This,HSTRING name,__x_ABI_CWindows_CUI_CColor *value,__x_ABI_CWindows_CUI_CComposition_CCompositionGetValueStatus *result) {
    return This->lpVtbl->TryGetColor(This,name,value,result);
}
static inline HRESULT __x_ABI_CWindows_CUI_CComposition_CICompositionPropertySet_TryGetMatrix3x2(__x_ABI_CWindows_CUI_CComposition_CICompositionPropertySet* This,HSTRING name,__x_ABI_CWindows_CFoundation_CNumerics_CMatrix3x2 *value,__x_ABI_CWindows_CUI_CComposition_CCompositionGetValueStatus *result) {
    return This->lpVtbl->TryGetMatrix3x2(This,name,value,result);
}
static inline HRESULT __x_ABI_CWindows_CUI_CComposition_CICompositionPropertySet_TryGetMatrix4x4(__x_ABI_CWindows_CUI_CComposition_CICompositionPropertySet* This,HSTRING name,__x_ABI_CWindows_CFoundation_CNumerics_CMatrix4x4 *value,__x_ABI_CWindows_CUI_CComposition_CCompositionGetValueStatus *result) {
    return This->lpVtbl->TryGetMatrix4x4(This,name,value,result);
}
static inline HRESULT __x_ABI_CWindows_CUI_CComposition_CICompositionPropertySet_TryGetQuaternion(__x_ABI_CWindows_CUI_CComposition_CICompositionPropertySet* This,HSTRING name,__x_ABI_CWindows_CFoundation_CNumerics_CQuaternion *value,__x_ABI_CWindows_CUI_CComposition_CCompositionGetValueStatus *result) {
    return This->lpVtbl->TryGetQuaternion(This,name,value,result);
}
static inline HRESULT __x_ABI_CWindows_CUI_CComposition_CICompositionPropertySet_TryGetScalar(__x_ABI_CWindows_CUI_CComposition_CICompositionPropertySet* This,HSTRING name,FLOAT *value,__x_ABI_CWindows_CUI_CComposition_CCompositionGetValueStatus *result) {
    return This->lpVtbl->TryGetScalar(This,name,value,result);
}
static inline HRESULT __x_ABI_CWindows_CUI_CComposition_CICompositionPropertySet_TryGetVector2(__x_ABI_CWindows_CUI_CComposition_CICompositionPropertySet* This,HSTRING name,__x_ABI_CWindows_CFoundation_CNumerics_CVector2 *value,__x_ABI_CWindows_CUI_CComposition_CCompositionGetValueStatus *result) {
    return This->lpVtbl->TryGetVector2(This,name,value,result);
}
static inline HRESULT __x_ABI_CWindows_CUI_CComposition_CICompositionPropertySet_TryGetVector3(__x_ABI_CWindows_CUI_CComposition_CICompositionPropertySet* This,HSTRING name,__x_ABI_CWindows_CFoundation_CNumerics_CVector3 *value,__x_ABI_CWindows_CUI_CComposition_CCompositionGetValueStatus *result) {
    return This->lpVtbl->TryGetVector3(This,name,value,result);
}
static inline HRESULT __x_ABI_CWindows_CUI_CComposition_CICompositionPropertySet_TryGetVector4(__x_ABI_CWindows_CUI_CComposition_CICompositionPropertySet* This,HSTRING name,__x_ABI_CWindows_CFoundation_CNumerics_CVector4 *value,__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 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 inline ULONG __x_ABI_CWindows_CUI_CComposition_CICompositionScopedBatch_AddRef(__x_ABI_CWindows_CUI_CComposition_CICompositionScopedBatch* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG __x_ABI_CWindows_CUI_CComposition_CICompositionScopedBatch_Release(__x_ABI_CWindows_CUI_CComposition_CICompositionScopedBatch* This) {
    return This->lpVtbl->Release(This);
}
/*** IInspectable methods ***/
static 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 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 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 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 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 inline HRESULT __x_ABI_CWindows_CUI_CComposition_CICompositionScopedBatch_End(__x_ABI_CWindows_CUI_CComposition_CICompositionScopedBatch* This) {
    return This->lpVtbl->End(This);
}
static inline HRESULT __x_ABI_CWindows_CUI_CComposition_CICompositionScopedBatch_Resume(__x_ABI_CWindows_CUI_CComposition_CICompositionScopedBatch* This) {
    return This->lpVtbl->Resume(This);
}
static inline HRESULT __x_ABI_CWindows_CUI_CComposition_CICompositionScopedBatch_Suspend(__x_ABI_CWindows_CUI_CComposition_CICompositionScopedBatch* This) {
    return This->lpVtbl->Suspend(This);
}
static 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 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 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 inline ULONG __x_ABI_CWindows_CUI_CComposition_CICompositionSurface_AddRef(__x_ABI_CWindows_CUI_CComposition_CICompositionSurface* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG __x_ABI_CWindows_CUI_CComposition_CICompositionSurface_Release(__x_ABI_CWindows_CUI_CComposition_CICompositionSurface* This) {
    return This->lpVtbl->Release(This);
}
/*** IInspectable methods ***/
static 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 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 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(
                        ABI::Windows::UI::Composition::CompositionBitmapInterpolationMode *value) = 0;

                    virtual HRESULT STDMETHODCALLTYPE put_BitmapInterpolationMode(
                        ABI::Windows::UI::Composition::CompositionBitmapInterpolationMode value) = 0;

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

                    virtual HRESULT STDMETHODCALLTYPE put_HorizontalAlignmentRatio(
                        FLOAT value) = 0;

                    virtual HRESULT STDMETHODCALLTYPE get_Stretch(
                        ABI::Windows::UI::Composition::CompositionStretch *value) = 0;

                    virtual HRESULT STDMETHODCALLTYPE put_Stretch(
                        ABI::Windows::UI::Composition::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,
        __x_ABI_CWindows_CUI_CComposition_CCompositionBitmapInterpolationMode *value);

    HRESULT (STDMETHODCALLTYPE *put_BitmapInterpolationMode)(
        __x_ABI_CWindows_CUI_CComposition_CICompositionSurfaceBrush *This,
        __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,
        __x_ABI_CWindows_CUI_CComposition_CCompositionStretch *value);

    HRESULT (STDMETHODCALLTYPE *put_Stretch)(
        __x_ABI_CWindows_CUI_CComposition_CICompositionSurfaceBrush *This,
        __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 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 inline ULONG __x_ABI_CWindows_CUI_CComposition_CICompositionSurfaceBrush_AddRef(__x_ABI_CWindows_CUI_CComposition_CICompositionSurfaceBrush* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG __x_ABI_CWindows_CUI_CComposition_CICompositionSurfaceBrush_Release(__x_ABI_CWindows_CUI_CComposition_CICompositionSurfaceBrush* This) {
    return This->lpVtbl->Release(This);
}
/*** IInspectable methods ***/
static 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 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 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 inline HRESULT __x_ABI_CWindows_CUI_CComposition_CICompositionSurfaceBrush_get_BitmapInterpolationMode(__x_ABI_CWindows_CUI_CComposition_CICompositionSurfaceBrush* This,__x_ABI_CWindows_CUI_CComposition_CCompositionBitmapInterpolationMode *value) {
    return This->lpVtbl->get_BitmapInterpolationMode(This,value);
}
static inline HRESULT __x_ABI_CWindows_CUI_CComposition_CICompositionSurfaceBrush_put_BitmapInterpolationMode(__x_ABI_CWindows_CUI_CComposition_CICompositionSurfaceBrush* This,__x_ABI_CWindows_CUI_CComposition_CCompositionBitmapInterpolationMode value) {
    return This->lpVtbl->put_BitmapInterpolationMode(This,value);
}
static 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 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 inline HRESULT __x_ABI_CWindows_CUI_CComposition_CICompositionSurfaceBrush_get_Stretch(__x_ABI_CWindows_CUI_CComposition_CICompositionSurfaceBrush* This,__x_ABI_CWindows_CUI_CComposition_CCompositionStretch *value) {
    return This->lpVtbl->get_Stretch(This,value);
}
static inline HRESULT __x_ABI_CWindows_CUI_CComposition_CICompositionSurfaceBrush_put_Stretch(__x_ABI_CWindows_CUI_CComposition_CICompositionSurfaceBrush* This,__x_ABI_CWindows_CUI_CComposition_CCompositionStretch value) {
    return This->lpVtbl->put_Stretch(This,value);
}
static 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 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 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 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 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 inline ULONG __x_ABI_CWindows_CUI_CComposition_CICompositionTarget_AddRef(__x_ABI_CWindows_CUI_CComposition_CICompositionTarget* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG __x_ABI_CWindows_CUI_CComposition_CICompositionTarget_Release(__x_ABI_CWindows_CUI_CComposition_CICompositionTarget* This) {
    return This->lpVtbl->Release(This);
}
/*** IInspectable methods ***/
static 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 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 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 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 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 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 inline ULONG __x_ABI_CWindows_CUI_CComposition_CICompositionTargetFactory_AddRef(__x_ABI_CWindows_CUI_CComposition_CICompositionTargetFactory* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG __x_ABI_CWindows_CUI_CComposition_CICompositionTargetFactory_Release(__x_ABI_CWindows_CUI_CComposition_CICompositionTargetFactory* This) {
    return This->lpVtbl->Release(This);
}
/*** IInspectable methods ***/
static 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 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 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(
                        ABI::Windows::UI::Color color,
                        ABI::Windows::UI::Composition::ICompositionColorBrush **result) = 0;

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

                    virtual HRESULT STDMETHODCALLTYPE CreateCubicBezierEasingFunction(
                        ABI::Windows::Foundation::Numerics::Vector2 point1,
                        ABI::Windows::Foundation::Numerics::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(
                        ABI::Windows::UI::Composition::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(
                        ABI::Windows::UI::Composition::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,
        __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,
        __x_ABI_CWindows_CFoundation_CNumerics_CVector2 point1,
        __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,
        __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,
        __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 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 inline ULONG __x_ABI_CWindows_CUI_CComposition_CICompositor_AddRef(__x_ABI_CWindows_CUI_CComposition_CICompositor* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG __x_ABI_CWindows_CUI_CComposition_CICompositor_Release(__x_ABI_CWindows_CUI_CComposition_CICompositor* This) {
    return This->lpVtbl->Release(This);
}
/*** IInspectable methods ***/
static 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 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 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 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 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 inline HRESULT __x_ABI_CWindows_CUI_CComposition_CICompositor_CreateColorBrushWithColor(__x_ABI_CWindows_CUI_CComposition_CICompositor* This,__x_ABI_CWindows_CUI_CColor color,__x_ABI_CWindows_CUI_CComposition_CICompositionColorBrush **result) {
    return This->lpVtbl->CreateColorBrushWithColor(This,color,result);
}
static 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 inline HRESULT __x_ABI_CWindows_CUI_CComposition_CICompositor_CreateCubicBezierEasingFunction(__x_ABI_CWindows_CUI_CComposition_CICompositor* This,__x_ABI_CWindows_CFoundation_CNumerics_CVector2 point1,__x_ABI_CWindows_CFoundation_CNumerics_CVector2 point2,__x_ABI_CWindows_CUI_CComposition_CICubicBezierEasingFunction **result) {
    return This->lpVtbl->CreateCubicBezierEasingFunction(This,point1,point2,result);
}
static 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 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 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 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 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 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 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 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 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 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 inline HRESULT __x_ABI_CWindows_CUI_CComposition_CICompositor_CreateScopedBatch(__x_ABI_CWindows_CUI_CComposition_CICompositor* This,__x_ABI_CWindows_CUI_CComposition_CCompositionBatchTypes type,__x_ABI_CWindows_CUI_CComposition_CICompositionScopedBatch **result) {
    return This->lpVtbl->CreateScopedBatch(This,type,result);
}
static 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 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 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 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 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 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 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 inline HRESULT __x_ABI_CWindows_CUI_CComposition_CICompositor_GetCommitBatch(__x_ABI_CWindows_CUI_CComposition_CICompositor* This,__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 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 inline ULONG __x_ABI_CWindows_CUI_CComposition_CIContainerVisual_AddRef(__x_ABI_CWindows_CUI_CComposition_CIContainerVisual* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG __x_ABI_CWindows_CUI_CComposition_CIContainerVisual_Release(__x_ABI_CWindows_CUI_CComposition_CIContainerVisual* This) {
    return This->lpVtbl->Release(This);
}
/*** IInspectable methods ***/
static 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 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 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 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 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 inline ULONG __x_ABI_CWindows_CUI_CComposition_CIContainerVisualFactory_AddRef(__x_ABI_CWindows_CUI_CComposition_CIContainerVisualFactory* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG __x_ABI_CWindows_CUI_CComposition_CIContainerVisualFactory_Release(__x_ABI_CWindows_CUI_CComposition_CIContainerVisualFactory* This) {
    return This->lpVtbl->Release(This);
}
/*** IInspectable methods ***/
static 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 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 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(
                        ABI::Windows::Foundation::Numerics::Vector2 *value) = 0;

                    virtual HRESULT STDMETHODCALLTYPE get_ControlPoint2(
                        ABI::Windows::Foundation::Numerics::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,
        __x_ABI_CWindows_CFoundation_CNumerics_CVector2 *value);

    HRESULT (STDMETHODCALLTYPE *get_ControlPoint2)(
        __x_ABI_CWindows_CUI_CComposition_CICubicBezierEasingFunction *This,
        __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 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 inline ULONG __x_ABI_CWindows_CUI_CComposition_CICubicBezierEasingFunction_AddRef(__x_ABI_CWindows_CUI_CComposition_CICubicBezierEasingFunction* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG __x_ABI_CWindows_CUI_CComposition_CICubicBezierEasingFunction_Release(__x_ABI_CWindows_CUI_CComposition_CICubicBezierEasingFunction* This) {
    return This->lpVtbl->Release(This);
}
/*** IInspectable methods ***/
static 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 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 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 inline HRESULT __x_ABI_CWindows_CUI_CComposition_CICubicBezierEasingFunction_get_ControlPoint1(__x_ABI_CWindows_CUI_CComposition_CICubicBezierEasingFunction* This,__x_ABI_CWindows_CFoundation_CNumerics_CVector2 *value) {
    return This->lpVtbl->get_ControlPoint1(This,value);
}
static inline HRESULT __x_ABI_CWindows_CUI_CComposition_CICubicBezierEasingFunction_get_ControlPoint2(__x_ABI_CWindows_CUI_CComposition_CICubicBezierEasingFunction* This,__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 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 inline ULONG __x_ABI_CWindows_CUI_CComposition_CIExpressionAnimation_AddRef(__x_ABI_CWindows_CUI_CComposition_CIExpressionAnimation* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG __x_ABI_CWindows_CUI_CComposition_CIExpressionAnimation_Release(__x_ABI_CWindows_CUI_CComposition_CIExpressionAnimation* This) {
    return This->lpVtbl->Release(This);
}
/*** IInspectable methods ***/
static 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 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 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 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 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 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 inline ULONG __x_ABI_CWindows_CUI_CComposition_CIInsetClip_AddRef(__x_ABI_CWindows_CUI_CComposition_CIInsetClip* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG __x_ABI_CWindows_CUI_CComposition_CIInsetClip_Release(__x_ABI_CWindows_CUI_CComposition_CIInsetClip* This) {
    return This->lpVtbl->Release(This);
}
/*** IInspectable methods ***/
static 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 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 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 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 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 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 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 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 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 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 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 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 inline ULONG __x_ABI_CWindows_CUI_CComposition_CILinearEasingFunction_AddRef(__x_ABI_CWindows_CUI_CComposition_CILinearEasingFunction* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG __x_ABI_CWindows_CUI_CComposition_CILinearEasingFunction_Release(__x_ABI_CWindows_CUI_CComposition_CILinearEasingFunction* This) {
    return This->lpVtbl->Release(This);
}
/*** IInspectable methods ***/
static 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 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 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,
                        ABI::Windows::Foundation::Numerics::Quaternion value) = 0;

                    virtual HRESULT STDMETHODCALLTYPE InsertKeyFrameWithEasingFunction(
                        FLOAT key,
                        ABI::Windows::Foundation::Numerics::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,
        __x_ABI_CWindows_CFoundation_CNumerics_CQuaternion value);

    HRESULT (STDMETHODCALLTYPE *InsertKeyFrameWithEasingFunction)(
        __x_ABI_CWindows_CUI_CComposition_CIQuaternionKeyFrameAnimation *This,
        FLOAT key,
        __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 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 inline ULONG __x_ABI_CWindows_CUI_CComposition_CIQuaternionKeyFrameAnimation_AddRef(__x_ABI_CWindows_CUI_CComposition_CIQuaternionKeyFrameAnimation* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG __x_ABI_CWindows_CUI_CComposition_CIQuaternionKeyFrameAnimation_Release(__x_ABI_CWindows_CUI_CComposition_CIQuaternionKeyFrameAnimation* This) {
    return This->lpVtbl->Release(This);
}
/*** IInspectable methods ***/
static 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 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 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 inline HRESULT __x_ABI_CWindows_CUI_CComposition_CIQuaternionKeyFrameAnimation_InsertKeyFrame(__x_ABI_CWindows_CUI_CComposition_CIQuaternionKeyFrameAnimation* This,FLOAT key,__x_ABI_CWindows_CFoundation_CNumerics_CQuaternion value) {
    return This->lpVtbl->InsertKeyFrame(This,key,value);
}
static inline HRESULT __x_ABI_CWindows_CUI_CComposition_CIQuaternionKeyFrameAnimation_InsertKeyFrameWithEasingFunction(__x_ABI_CWindows_CUI_CComposition_CIQuaternionKeyFrameAnimation* This,FLOAT key,__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 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 inline ULONG __x_ABI_CWindows_CUI_CComposition_CIRenderingDeviceReplacedEventArgs_AddRef(__x_ABI_CWindows_CUI_CComposition_CIRenderingDeviceReplacedEventArgs* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG __x_ABI_CWindows_CUI_CComposition_CIRenderingDeviceReplacedEventArgs_Release(__x_ABI_CWindows_CUI_CComposition_CIRenderingDeviceReplacedEventArgs* This) {
    return This->lpVtbl->Release(This);
}
/*** IInspectable methods ***/
static 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 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 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 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 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 inline ULONG __x_ABI_CWindows_CUI_CComposition_CIScalarKeyFrameAnimation_AddRef(__x_ABI_CWindows_CUI_CComposition_CIScalarKeyFrameAnimation* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG __x_ABI_CWindows_CUI_CComposition_CIScalarKeyFrameAnimation_Release(__x_ABI_CWindows_CUI_CComposition_CIScalarKeyFrameAnimation* This) {
    return This->lpVtbl->Release(This);
}
/*** IInspectable methods ***/
static 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 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 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 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 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 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 inline ULONG __x_ABI_CWindows_CUI_CComposition_CISpriteVisual_AddRef(__x_ABI_CWindows_CUI_CComposition_CISpriteVisual* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG __x_ABI_CWindows_CUI_CComposition_CISpriteVisual_Release(__x_ABI_CWindows_CUI_CComposition_CISpriteVisual* This) {
    return This->lpVtbl->Release(This);
}
/*** IInspectable methods ***/
static 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 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 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 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 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,
                        ABI::Windows::Foundation::Numerics::Vector2 value) = 0;

                    virtual HRESULT STDMETHODCALLTYPE InsertKeyFrameWithEasingFunction(
                        FLOAT key,
                        ABI::Windows::Foundation::Numerics::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,
        __x_ABI_CWindows_CFoundation_CNumerics_CVector2 value);

    HRESULT (STDMETHODCALLTYPE *InsertKeyFrameWithEasingFunction)(
        __x_ABI_CWindows_CUI_CComposition_CIVector2KeyFrameAnimation *This,
        FLOAT key,
        __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 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 inline ULONG __x_ABI_CWindows_CUI_CComposition_CIVector2KeyFrameAnimation_AddRef(__x_ABI_CWindows_CUI_CComposition_CIVector2KeyFrameAnimation* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG __x_ABI_CWindows_CUI_CComposition_CIVector2KeyFrameAnimation_Release(__x_ABI_CWindows_CUI_CComposition_CIVector2KeyFrameAnimation* This) {
    return This->lpVtbl->Release(This);
}
/*** IInspectable methods ***/
static 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 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 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 inline HRESULT __x_ABI_CWindows_CUI_CComposition_CIVector2KeyFrameAnimation_InsertKeyFrame(__x_ABI_CWindows_CUI_CComposition_CIVector2KeyFrameAnimation* This,FLOAT key,__x_ABI_CWindows_CFoundation_CNumerics_CVector2 value) {
    return This->lpVtbl->InsertKeyFrame(This,key,value);
}
static inline HRESULT __x_ABI_CWindows_CUI_CComposition_CIVector2KeyFrameAnimation_InsertKeyFrameWithEasingFunction(__x_ABI_CWindows_CUI_CComposition_CIVector2KeyFrameAnimation* This,FLOAT key,__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,
                        ABI::Windows::Foundation::Numerics::Vector3 value) = 0;

                    virtual HRESULT STDMETHODCALLTYPE InsertKeyFrameWithEasingFunction(
                        FLOAT key,
                        ABI::Windows::Foundation::Numerics::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,
        __x_ABI_CWindows_CFoundation_CNumerics_CVector3 value);

    HRESULT (STDMETHODCALLTYPE *InsertKeyFrameWithEasingFunction)(
        __x_ABI_CWindows_CUI_CComposition_CIVector3KeyFrameAnimation *This,
        FLOAT key,
        __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 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 inline ULONG __x_ABI_CWindows_CUI_CComposition_CIVector3KeyFrameAnimation_AddRef(__x_ABI_CWindows_CUI_CComposition_CIVector3KeyFrameAnimation* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG __x_ABI_CWindows_CUI_CComposition_CIVector3KeyFrameAnimation_Release(__x_ABI_CWindows_CUI_CComposition_CIVector3KeyFrameAnimation* This) {
    return This->lpVtbl->Release(This);
}
/*** IInspectable methods ***/
static 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 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 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 inline HRESULT __x_ABI_CWindows_CUI_CComposition_CIVector3KeyFrameAnimation_InsertKeyFrame(__x_ABI_CWindows_CUI_CComposition_CIVector3KeyFrameAnimation* This,FLOAT key,__x_ABI_CWindows_CFoundation_CNumerics_CVector3 value) {
    return This->lpVtbl->InsertKeyFrame(This,key,value);
}
static inline HRESULT __x_ABI_CWindows_CUI_CComposition_CIVector3KeyFrameAnimation_InsertKeyFrameWithEasingFunction(__x_ABI_CWindows_CUI_CComposition_CIVector3KeyFrameAnimation* This,FLOAT key,__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,
                        ABI::Windows::Foundation::Numerics::Vector4 value) = 0;

                    virtual HRESULT STDMETHODCALLTYPE InsertKeyFrameWithEasingFunction(
                        FLOAT key,
                        ABI::Windows::Foundation::Numerics::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,
        __x_ABI_CWindows_CFoundation_CNumerics_CVector4 value);

    HRESULT (STDMETHODCALLTYPE *InsertKeyFrameWithEasingFunction)(
        __x_ABI_CWindows_CUI_CComposition_CIVector4KeyFrameAnimation *This,
        FLOAT key,
        __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 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 inline ULONG __x_ABI_CWindows_CUI_CComposition_CIVector4KeyFrameAnimation_AddRef(__x_ABI_CWindows_CUI_CComposition_CIVector4KeyFrameAnimation* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG __x_ABI_CWindows_CUI_CComposition_CIVector4KeyFrameAnimation_Release(__x_ABI_CWindows_CUI_CComposition_CIVector4KeyFrameAnimation* This) {
    return This->lpVtbl->Release(This);
}
/*** IInspectable methods ***/
static 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 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 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 inline HRESULT __x_ABI_CWindows_CUI_CComposition_CIVector4KeyFrameAnimation_InsertKeyFrame(__x_ABI_CWindows_CUI_CComposition_CIVector4KeyFrameAnimation* This,FLOAT key,__x_ABI_CWindows_CFoundation_CNumerics_CVector4 value) {
    return This->lpVtbl->InsertKeyFrame(This,key,value);
}
static inline HRESULT __x_ABI_CWindows_CUI_CComposition_CIVector4KeyFrameAnimation_InsertKeyFrameWithEasingFunction(__x_ABI_CWindows_CUI_CComposition_CIVector4KeyFrameAnimation* This,FLOAT key,__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(
                        ABI::Windows::Foundation::Numerics::Vector2 *value) = 0;

                    virtual HRESULT STDMETHODCALLTYPE put_AnchorPoint(
                        ABI::Windows::Foundation::Numerics::Vector2 value) = 0;

                    virtual HRESULT STDMETHODCALLTYPE get_BackfaceVisibility(
                        ABI::Windows::UI::Composition::CompositionBackfaceVisibility *value) = 0;

                    virtual HRESULT STDMETHODCALLTYPE put_BackfaceVisibility(
                        ABI::Windows::UI::Composition::CompositionBackfaceVisibility value) = 0;

                    virtual HRESULT STDMETHODCALLTYPE get_BorderMode(
                        ABI::Windows::UI::Composition::CompositionBorderMode *value) = 0;

                    virtual HRESULT STDMETHODCALLTYPE put_BorderMode(
                        ABI::Windows::UI::Composition::CompositionBorderMode value) = 0;

                    virtual HRESULT STDMETHODCALLTYPE get_CenterPoint(
                        ABI::Windows::Foundation::Numerics::Vector3 *value) = 0;

                    virtual HRESULT STDMETHODCALLTYPE put_CenterPoint(
                        ABI::Windows::Foundation::Numerics::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(
                        ABI::Windows::UI::Composition::CompositionCompositeMode *value) = 0;

                    virtual HRESULT STDMETHODCALLTYPE put_CompositeMode(
                        ABI::Windows::UI::Composition::CompositionCompositeMode value) = 0;

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

                    virtual HRESULT STDMETHODCALLTYPE put_IsVisible(
                        boolean value) = 0;

                    virtual HRESULT STDMETHODCALLTYPE get_Offset(
                        ABI::Windows::Foundation::Numerics::Vector3 *value) = 0;

                    virtual HRESULT STDMETHODCALLTYPE put_Offset(
                        ABI::Windows::Foundation::Numerics::Vector3 value) = 0;

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

                    virtual HRESULT STDMETHODCALLTYPE put_Opacity(
                        FLOAT value) = 0;

                    virtual HRESULT STDMETHODCALLTYPE get_Orientation(
                        ABI::Windows::Foundation::Numerics::Quaternion *value) = 0;

                    virtual HRESULT STDMETHODCALLTYPE put_Orientation(
                        ABI::Windows::Foundation::Numerics::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(
                        ABI::Windows::Foundation::Numerics::Vector3 *value) = 0;

                    virtual HRESULT STDMETHODCALLTYPE put_RotationAxis(
                        ABI::Windows::Foundation::Numerics::Vector3 value) = 0;

                    virtual HRESULT STDMETHODCALLTYPE get_Scale(
                        ABI::Windows::Foundation::Numerics::Vector3 *value) = 0;

                    virtual HRESULT STDMETHODCALLTYPE put_Scale(
                        ABI::Windows::Foundation::Numerics::Vector3 value) = 0;

                    virtual HRESULT STDMETHODCALLTYPE get_Size(
                        ABI::Windows::Foundation::Numerics::Vector2 *value) = 0;

                    virtual HRESULT STDMETHODCALLTYPE put_Size(
                        ABI::Windows::Foundation::Numerics::Vector2 value) = 0;

                    virtual HRESULT STDMETHODCALLTYPE get_TransformMatrix(
                        ABI::Windows::Foundation::Numerics::Matrix4x4 *value) = 0;

                    virtual HRESULT STDMETHODCALLTYPE put_TransformMatrix(
                        ABI::Windows::Foundation::Numerics::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,
        __x_ABI_CWindows_CFoundation_CNumerics_CVector2 *value);

    HRESULT (STDMETHODCALLTYPE *put_AnchorPoint)(
        __x_ABI_CWindows_CUI_CComposition_CIVisual *This,
        __x_ABI_CWindows_CFoundation_CNumerics_CVector2 value);

    HRESULT (STDMETHODCALLTYPE *get_BackfaceVisibility)(
        __x_ABI_CWindows_CUI_CComposition_CIVisual *This,
        __x_ABI_CWindows_CUI_CComposition_CCompositionBackfaceVisibility *value);

    HRESULT (STDMETHODCALLTYPE *put_BackfaceVisibility)(
        __x_ABI_CWindows_CUI_CComposition_CIVisual *This,
        __x_ABI_CWindows_CUI_CComposition_CCompositionBackfaceVisibility value);

    HRESULT (STDMETHODCALLTYPE *get_BorderMode)(
        __x_ABI_CWindows_CUI_CComposition_CIVisual *This,
        __x_ABI_CWindows_CUI_CComposition_CCompositionBorderMode *value);

    HRESULT (STDMETHODCALLTYPE *put_BorderMode)(
        __x_ABI_CWindows_CUI_CComposition_CIVisual *This,
        __x_ABI_CWindows_CUI_CComposition_CCompositionBorderMode value);

    HRESULT (STDMETHODCALLTYPE *get_CenterPoint)(
        __x_ABI_CWindows_CUI_CComposition_CIVisual *This,
        __x_ABI_CWindows_CFoundation_CNumerics_CVector3 *value);

    HRESULT (STDMETHODCALLTYPE *put_CenterPoint)(
        __x_ABI_CWindows_CUI_CComposition_CIVisual *This,
        __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,
        __x_ABI_CWindows_CUI_CComposition_CCompositionCompositeMode *value);

    HRESULT (STDMETHODCALLTYPE *put_CompositeMode)(
        __x_ABI_CWindows_CUI_CComposition_CIVisual *This,
        __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,
        __x_ABI_CWindows_CFoundation_CNumerics_CVector3 *value);

    HRESULT (STDMETHODCALLTYPE *put_Offset)(
        __x_ABI_CWindows_CUI_CComposition_CIVisual *This,
        __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,
        __x_ABI_CWindows_CFoundation_CNumerics_CQuaternion *value);

    HRESULT (STDMETHODCALLTYPE *put_Orientation)(
        __x_ABI_CWindows_CUI_CComposition_CIVisual *This,
        __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,
        __x_ABI_CWindows_CFoundation_CNumerics_CVector3 *value);

    HRESULT (STDMETHODCALLTYPE *put_RotationAxis)(
        __x_ABI_CWindows_CUI_CComposition_CIVisual *This,
        __x_ABI_CWindows_CFoundation_CNumerics_CVector3 value);

    HRESULT (STDMETHODCALLTYPE *get_Scale)(
        __x_ABI_CWindows_CUI_CComposition_CIVisual *This,
        __x_ABI_CWindows_CFoundation_CNumerics_CVector3 *value);

    HRESULT (STDMETHODCALLTYPE *put_Scale)(
        __x_ABI_CWindows_CUI_CComposition_CIVisual *This,
        __x_ABI_CWindows_CFoundation_CNumerics_CVector3 value);

    HRESULT (STDMETHODCALLTYPE *get_Size)(
        __x_ABI_CWindows_CUI_CComposition_CIVisual *This,
        __x_ABI_CWindows_CFoundation_CNumerics_CVector2 *value);

    HRESULT (STDMETHODCALLTYPE *put_Size)(
        __x_ABI_CWindows_CUI_CComposition_CIVisual *This,
        __x_ABI_CWindows_CFoundation_CNumerics_CVector2 value);

    HRESULT (STDMETHODCALLTYPE *get_TransformMatrix)(
        __x_ABI_CWindows_CUI_CComposition_CIVisual *This,
        __x_ABI_CWindows_CFoundation_CNumerics_CMatrix4x4 *value);

    HRESULT (STDMETHODCALLTYPE *put_TransformMatrix)(
        __x_ABI_CWindows_CUI_CComposition_CIVisual *This,
        __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 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 inline ULONG __x_ABI_CWindows_CUI_CComposition_CIVisual_AddRef(__x_ABI_CWindows_CUI_CComposition_CIVisual* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG __x_ABI_CWindows_CUI_CComposition_CIVisual_Release(__x_ABI_CWindows_CUI_CComposition_CIVisual* This) {
    return This->lpVtbl->Release(This);
}
/*** IInspectable methods ***/
static 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 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 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 inline HRESULT __x_ABI_CWindows_CUI_CComposition_CIVisual_get_AnchorPoint(__x_ABI_CWindows_CUI_CComposition_CIVisual* This,__x_ABI_CWindows_CFoundation_CNumerics_CVector2 *value) {
    return This->lpVtbl->get_AnchorPoint(This,value);
}
static inline HRESULT __x_ABI_CWindows_CUI_CComposition_CIVisual_put_AnchorPoint(__x_ABI_CWindows_CUI_CComposition_CIVisual* This,__x_ABI_CWindows_CFoundation_CNumerics_CVector2 value) {
    return This->lpVtbl->put_AnchorPoint(This,value);
}
static inline HRESULT __x_ABI_CWindows_CUI_CComposition_CIVisual_get_BackfaceVisibility(__x_ABI_CWindows_CUI_CComposition_CIVisual* This,__x_ABI_CWindows_CUI_CComposition_CCompositionBackfaceVisibility *value) {
    return This->lpVtbl->get_BackfaceVisibility(This,value);
}
static inline HRESULT __x_ABI_CWindows_CUI_CComposition_CIVisual_put_BackfaceVisibility(__x_ABI_CWindows_CUI_CComposition_CIVisual* This,__x_ABI_CWindows_CUI_CComposition_CCompositionBackfaceVisibility value) {
    return This->lpVtbl->put_BackfaceVisibility(This,value);
}
static inline HRESULT __x_ABI_CWindows_CUI_CComposition_CIVisual_get_BorderMode(__x_ABI_CWindows_CUI_CComposition_CIVisual* This,__x_ABI_CWindows_CUI_CComposition_CCompositionBorderMode *value) {
    return This->lpVtbl->get_BorderMode(This,value);
}
static inline HRESULT __x_ABI_CWindows_CUI_CComposition_CIVisual_put_BorderMode(__x_ABI_CWindows_CUI_CComposition_CIVisual* This,__x_ABI_CWindows_CUI_CComposition_CCompositionBorderMode value) {
    return This->lpVtbl->put_BorderMode(This,value);
}
static inline HRESULT __x_ABI_CWindows_CUI_CComposition_CIVisual_get_CenterPoint(__x_ABI_CWindows_CUI_CComposition_CIVisual* This,__x_ABI_CWindows_CFoundation_CNumerics_CVector3 *value) {
    return This->lpVtbl->get_CenterPoint(This,value);
}
static inline HRESULT __x_ABI_CWindows_CUI_CComposition_CIVisual_put_CenterPoint(__x_ABI_CWindows_CUI_CComposition_CIVisual* This,__x_ABI_CWindows_CFoundation_CNumerics_CVector3 value) {
    return This->lpVtbl->put_CenterPoint(This,value);
}
static 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 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 inline HRESULT __x_ABI_CWindows_CUI_CComposition_CIVisual_get_CompositeMode(__x_ABI_CWindows_CUI_CComposition_CIVisual* This,__x_ABI_CWindows_CUI_CComposition_CCompositionCompositeMode *value) {
    return This->lpVtbl->get_CompositeMode(This,value);
}
static inline HRESULT __x_ABI_CWindows_CUI_CComposition_CIVisual_put_CompositeMode(__x_ABI_CWindows_CUI_CComposition_CIVisual* This,__x_ABI_CWindows_CUI_CComposition_CCompositionCompositeMode value) {
    return This->lpVtbl->put_CompositeMode(This,value);
}
static 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 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 inline HRESULT __x_ABI_CWindows_CUI_CComposition_CIVisual_get_Offset(__x_ABI_CWindows_CUI_CComposition_CIVisual* This,__x_ABI_CWindows_CFoundation_CNumerics_CVector3 *value) {
    return This->lpVtbl->get_Offset(This,value);
}
static inline HRESULT __x_ABI_CWindows_CUI_CComposition_CIVisual_put_Offset(__x_ABI_CWindows_CUI_CComposition_CIVisual* This,__x_ABI_CWindows_CFoundation_CNumerics_CVector3 value) {
    return This->lpVtbl->put_Offset(This,value);
}
static 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 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 inline HRESULT __x_ABI_CWindows_CUI_CComposition_CIVisual_get_Orientation(__x_ABI_CWindows_CUI_CComposition_CIVisual* This,__x_ABI_CWindows_CFoundation_CNumerics_CQuaternion *value) {
    return This->lpVtbl->get_Orientation(This,value);
}
static inline HRESULT __x_ABI_CWindows_CUI_CComposition_CIVisual_put_Orientation(__x_ABI_CWindows_CUI_CComposition_CIVisual* This,__x_ABI_CWindows_CFoundation_CNumerics_CQuaternion value) {
    return This->lpVtbl->put_Orientation(This,value);
}
static 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 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 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 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 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 inline HRESULT __x_ABI_CWindows_CUI_CComposition_CIVisual_get_RotationAxis(__x_ABI_CWindows_CUI_CComposition_CIVisual* This,__x_ABI_CWindows_CFoundation_CNumerics_CVector3 *value) {
    return This->lpVtbl->get_RotationAxis(This,value);
}
static inline HRESULT __x_ABI_CWindows_CUI_CComposition_CIVisual_put_RotationAxis(__x_ABI_CWindows_CUI_CComposition_CIVisual* This,__x_ABI_CWindows_CFoundation_CNumerics_CVector3 value) {
    return This->lpVtbl->put_RotationAxis(This,value);
}
static inline HRESULT __x_ABI_CWindows_CUI_CComposition_CIVisual_get_Scale(__x_ABI_CWindows_CUI_CComposition_CIVisual* This,__x_ABI_CWindows_CFoundation_CNumerics_CVector3 *value) {
    return This->lpVtbl->get_Scale(This,value);
}
static inline HRESULT __x_ABI_CWindows_CUI_CComposition_CIVisual_put_Scale(__x_ABI_CWindows_CUI_CComposition_CIVisual* This,__x_ABI_CWindows_CFoundation_CNumerics_CVector3 value) {
    return This->lpVtbl->put_Scale(This,value);
}
static inline HRESULT __x_ABI_CWindows_CUI_CComposition_CIVisual_get_Size(__x_ABI_CWindows_CUI_CComposition_CIVisual* This,__x_ABI_CWindows_CFoundation_CNumerics_CVector2 *value) {
    return This->lpVtbl->get_Size(This,value);
}
static inline HRESULT __x_ABI_CWindows_CUI_CComposition_CIVisual_put_Size(__x_ABI_CWindows_CUI_CComposition_CIVisual* This,__x_ABI_CWindows_CFoundation_CNumerics_CVector2 value) {
    return This->lpVtbl->put_Size(This,value);
}
static inline HRESULT __x_ABI_CWindows_CUI_CComposition_CIVisual_get_TransformMatrix(__x_ABI_CWindows_CUI_CComposition_CIVisual* This,__x_ABI_CWindows_CFoundation_CNumerics_CMatrix4x4 *value) {
    return This->lpVtbl->get_TransformMatrix(This,value);
}
static inline HRESULT __x_ABI_CWindows_CUI_CComposition_CIVisual_put_TransformMatrix(__x_ABI_CWindows_CUI_CComposition_CIVisual* This,__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 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 inline ULONG __x_ABI_CWindows_CUI_CComposition_CIVisualFactory_AddRef(__x_ABI_CWindows_CUI_CComposition_CIVisualFactory* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG __x_ABI_CWindows_CUI_CComposition_CIVisualFactory_Release(__x_ABI_CWindows_CUI_CComposition_CIVisualFactory* This) {
    return This->lpVtbl->Release(This);
}
/*** IInspectable methods ***/
static 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 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 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 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 inline ULONG __x_ABI_CWindows_CUI_CComposition_CIVisualCollection_AddRef(__x_ABI_CWindows_CUI_CComposition_CIVisualCollection* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG __x_ABI_CWindows_CUI_CComposition_CIVisualCollection_Release(__x_ABI_CWindows_CUI_CComposition_CIVisualCollection* This) {
    return This->lpVtbl->Release(This);
}
/*** IInspectable methods ***/
static 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 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 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 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 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 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 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 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 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 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 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 inline ULONG __FIAsyncOperationCompletedHandler_1_Windows__CUI__CComposition__CICompositionSurface_AddRef(__FIAsyncOperationCompletedHandler_1_Windows__CUI__CComposition__CICompositionSurface* This) {
    return This->lpVtbl->AddRef(This);
}
static 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 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 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 inline ULONG __FIAsyncOperation_1_Windows__CUI__CComposition__CICompositionSurface_AddRef(__FIAsyncOperation_1_Windows__CUI__CComposition__CICompositionSurface* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG __FIAsyncOperation_1_Windows__CUI__CComposition__CICompositionSurface_Release(__FIAsyncOperation_1_Windows__CUI__CComposition__CICompositionSurface* This) {
    return This->lpVtbl->Release(This);
}
/*** IInspectable methods ***/
static 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 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 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 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 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 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 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 inline ULONG __FIIterable_1_Windows__CUI__CComposition__CCompositionAnimation_AddRef(__FIIterable_1_Windows__CUI__CComposition__CCompositionAnimation* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG __FIIterable_1_Windows__CUI__CComposition__CCompositionAnimation_Release(__FIIterable_1_Windows__CUI__CComposition__CCompositionAnimation* This) {
    return This->lpVtbl->Release(This);
}
/*** IInspectable methods ***/
static 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 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 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 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 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 inline ULONG __FIIterable_1_Windows__CUI__CComposition__CVisual_AddRef(__FIIterable_1_Windows__CUI__CComposition__CVisual* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG __FIIterable_1_Windows__CUI__CComposition__CVisual_Release(__FIIterable_1_Windows__CUI__CComposition__CVisual* This) {
    return This->lpVtbl->Release(This);
}
/*** IInspectable methods ***/
static 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 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 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 inline HRESULT __FIIterable_1_Windows__CUI__CComposition__CVisual_First(__FIIterable_1_Windows__CUI__CComposition__CVisual* This,__FIIterator_1_Windows__CUI__CComposition__CVisual **value) {
    return This->lpVtbl->First(This,value);
}
#endif
#ifdef WIDL_using_Windows_Foundation_Collections
#define IID_IIterable_Visual IID___FIIterable_1_Windows__CUI__CComposition__CVisual
#define IIterable_VisualVtbl __FIIterable_1_Windows__CUI__CComposition__CVisualVtbl
#define IIterable_Visual __FIIterable_1_Windows__CUI__CComposition__CVisual
#define IIterable_Visual_QueryInterface __FIIterable_1_Windows__CUI__CComposition__CVisual_QueryInterface
#define IIterable_Visual_AddRef __FIIterable_1_Windows__CUI__CComposition__CVisual_AddRef
#define IIterable_Visual_Release __FIIterable_1_Windows__CUI__CComposition__CVisual_Release
#define IIterable_Visual_GetIids __FIIterable_1_Windows__CUI__CComposition__CVisual_GetIids
#define IIterable_Visual_GetRuntimeClassName __FIIterable_1_Windows__CUI__CComposition__CVisual_GetRuntimeClassName
#define IIterable_Visual_GetTrustLevel __FIIterable_1_Windows__CUI__CComposition__CVisual_GetTrustLevel
#define IIterable_Visual_First __FIIterable_1_Windows__CUI__CComposition__CVisual_First
#endif /* WIDL_using_Windows_Foundation_Collections */
#endif

#endif

#endif  /* ____FIIterable_1_Windows__CUI__CComposition__CVisual_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IIterator<ABI::Windows::UI::Composition::CompositionAnimation* > interface
 */
#ifndef ____FIIterator_1_Windows__CUI__CComposition__CCompositionAnimation_INTERFACE_DEFINED__
#define ____FIIterator_1_Windows__CUI__CComposition__CCompositionAnimation_INTERFACE_DEFINED__

DEFINE_GUID(IID___FIIterator_1_Windows__CUI__CComposition__CCompositionAnimation, 0x98efbe55, 0x0a66, 0x556a, 0x9a,0xdc, 0x4a,0xb5,0x9c,0x69,0x68,0x46);
#if defined(__cplusplus) && !defined(CINTERFACE)
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace Foundation {
            namespace Collections {
                template<>
                MIDL_INTERFACE("98efbe55-0a66-556a-9adc-4ab59c696846")
                IIterator<ABI::Windows::UI::Composition::CompositionAnimation* > : IIterator_impl<ABI::Windows::Foundation::Internal::AggregateType<ABI::Windows::UI::Composition::CompositionAnimation*, ABI::Windows::UI::Composition::ICompositionAnimation* > >
                {
                };
            }
        }
    }
}
extern "C" {
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(__FIIterator_1_Windows__CUI__CComposition__CCompositionAnimation, 0x98efbe55, 0x0a66, 0x556a, 0x9a,0xdc, 0x4a,0xb5,0x9c,0x69,0x68,0x46)
#endif
#else
typedef struct __FIIterator_1_Windows__CUI__CComposition__CCompositionAnimationVtbl {
    BEGIN_INTERFACE

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

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

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

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

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

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

    /*** IIterator<ABI::Windows::UI::Composition::CompositionAnimation* > methods ***/
    HRESULT (STDMETHODCALLTYPE *get_Current)(
        __FIIterator_1_Windows__CUI__CComposition__CCompositionAnimation *This,
        __x_ABI_CWindows_CUI_CComposition_CICompositionAnimation **value);

    HRESULT (STDMETHODCALLTYPE *get_HasCurrent)(
        __FIIterator_1_Windows__CUI__CComposition__CCompositionAnimation *This,
        boolean *value);

    HRESULT (STDMETHODCALLTYPE *MoveNext)(
        __FIIterator_1_Windows__CUI__CComposition__CCompositionAnimation *This,
        boolean *value);

    HRESULT (STDMETHODCALLTYPE *GetMany)(
        __FIIterator_1_Windows__CUI__CComposition__CCompositionAnimation *This,
        UINT32 items_size,
        __x_ABI_CWindows_CUI_CComposition_CICompositionAnimation **items,
        UINT32 *value);

    END_INTERFACE
} __FIIterator_1_Windows__CUI__CComposition__CCompositionAnimationVtbl;

interface __FIIterator_1_Windows__CUI__CComposition__CCompositionAnimation {
    CONST_VTBL __FIIterator_1_Windows__CUI__CComposition__CCompositionAnimationVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define __FIIterator_1_Windows__CUI__CComposition__CCompositionAnimation_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define __FIIterator_1_Windows__CUI__CComposition__CCompositionAnimation_AddRef(This) (This)->lpVtbl->AddRef(This)
#define __FIIterator_1_Windows__CUI__CComposition__CCompositionAnimation_Release(This) (This)->lpVtbl->Release(This)
/*** IInspectable methods ***/
#define __FIIterator_1_Windows__CUI__CComposition__CCompositionAnimation_GetIids(This,iidCount,iids) (This)->lpVtbl->GetIids(This,iidCount,iids)
#define __FIIterator_1_Windows__CUI__CComposition__CCompositionAnimation_GetRuntimeClassName(This,className) (This)->lpVtbl->GetRuntimeClassName(This,className)
#define __FIIterator_1_Windows__CUI__CComposition__CCompositionAnimation_GetTrustLevel(This,trustLevel) (This)->lpVtbl->GetTrustLevel(This,trustLevel)
/*** IIterator<ABI::Windows::UI::Composition::CompositionAnimation* > methods ***/
#define __FIIterator_1_Windows__CUI__CComposition__CCompositionAnimation_get_Current(This,value) (This)->lpVtbl->get_Current(This,value)
#define __FIIterator_1_Windows__CUI__CComposition__CCompositionAnimation_get_HasCurrent(This,value) (This)->lpVtbl->get_HasCurrent(This,value)
#define __FIIterator_1_Windows__CUI__CComposition__CCompositionAnimation_MoveNext(This,value) (This)->lpVtbl->MoveNext(This,value)
#define __FIIterator_1_Windows__CUI__CComposition__CCompositionAnimation_GetMany(This,items_size,items,value) (This)->lpVtbl->GetMany(This,items_size,items,value)
#else
/*** IUnknown methods ***/
static 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 inline ULONG __FIIterator_1_Windows__CUI__CComposition__CCompositionAnimation_AddRef(__FIIterator_1_Windows__CUI__CComposition__CCompositionAnimation* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG __FIIterator_1_Windows__CUI__CComposition__CCompositionAnimation_Release(__FIIterator_1_Windows__CUI__CComposition__CCompositionAnimation* This) {
    return This->lpVtbl->Release(This);
}
/*** IInspectable methods ***/
static 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 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 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 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 inline HRESULT __FIIterator_1_Windows__CUI__CComposition__CCompositionAnimation_get_HasCurrent(__FIIterator_1_Windows__CUI__CComposition__CCompositionAnimation* This,boolean *value) {
    return This->lpVtbl->get_HasCurrent(This,value);
}
static inline HRESULT __FIIterator_1_Windows__CUI__CComposition__CCompositionAnimation_MoveNext(__FIIterator_1_Windows__CUI__CComposition__CCompositionAnimation* This,boolean *value) {
    return This->lpVtbl->MoveNext(This,value);
}
static inline HRESULT __FIIterator_1_Windows__CUI__CComposition__CCompositionAnimation_GetMany(__FIIterator_1_Windows__CUI__CComposition__CCompositionAnimation* This,UINT32 items_size,__x_ABI_CWindows_CUI_CComposition_CICompositionAnimation **items,UINT32 *value) {
    return This->lpVtbl->GetMany(This,items_size,items,value);
}
#endif
#ifdef WIDL_using_Windows_Foundation_Collections
#define IID_IIterator_CompositionAnimation IID___FIIterator_1_Windows__CUI__CComposition__CCompositionAnimation
#define IIterator_CompositionAnimationVtbl __FIIterator_1_Windows__CUI__CComposition__CCompositionAnimationVtbl
#define IIterator_CompositionAnimation __FIIterator_1_Windows__CUI__CComposition__CCompositionAnimation
#define IIterator_CompositionAnimation_QueryInterface __FIIterator_1_Windows__CUI__CComposition__CCompositionAnimation_QueryInterface
#define IIterator_CompositionAnimation_AddRef __FIIterator_1_Windows__CUI__CComposition__CCompositionAnimation_AddRef
#define IIterator_CompositionAnimation_Release __FIIterator_1_Windows__CUI__CComposition__CCompositionAnimation_Release
#define IIterator_CompositionAnimation_GetIids __FIIterator_1_Windows__CUI__CComposition__CCompositionAnimation_GetIids
#define IIterator_CompositionAnimation_GetRuntimeClassName __FIIterator_1_Windows__CUI__CComposition__CCompositionAnimation_GetRuntimeClassName
#define IIterator_CompositionAnimation_GetTrustLevel __FIIterator_1_Windows__CUI__CComposition__CCompositionAnimation_GetTrustLevel
#define IIterator_CompositionAnimation_get_Current __FIIterator_1_Windows__CUI__CComposition__CCompositionAnimation_get_Current
#define IIterator_CompositionAnimation_get_HasCurrent __FIIterator_1_Windows__CUI__CComposition__CCompositionAnimation_get_HasCurrent
#define IIterator_CompositionAnimation_MoveNext __FIIterator_1_Windows__CUI__CComposition__CCompositionAnimation_MoveNext
#define IIterator_CompositionAnimation_GetMany __FIIterator_1_Windows__CUI__CComposition__CCompositionAnimation_GetMany
#endif /* WIDL_using_Windows_Foundation_Collections */
#endif

#endif

#endif  /* ____FIIterator_1_Windows__CUI__CComposition__CCompositionAnimation_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IIterator<ABI::Windows::UI::Composition::Visual* > interface
 */
#ifndef ____FIIterator_1_Windows__CUI__CComposition__CVisual_INTERFACE_DEFINED__
#define ____FIIterator_1_Windows__CUI__CComposition__CVisual_INTERFACE_DEFINED__

DEFINE_GUID(IID___FIIterator_1_Windows__CUI__CComposition__CVisual, 0xeca15496, 0xdcaa, 0x5095, 0xa8,0x98, 0xf8,0x60,0x2a,0x40,0xe1,0x0a);
#if defined(__cplusplus) && !defined(CINTERFACE)
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace Foundation {
            namespace Collections {
                template<>
                MIDL_INTERFACE("eca15496-dcaa-5095-a898-f8602a40e10a")
                IIterator<ABI::Windows::UI::Composition::Visual* > : IIterator_impl<ABI::Windows::Foundation::Internal::AggregateType<ABI::Windows::UI::Composition::Visual*, ABI::Windows::UI::Composition::IVisual* > >
                {
                };
            }
        }
    }
}
extern "C" {
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(__FIIterator_1_Windows__CUI__CComposition__CVisual, 0xeca15496, 0xdcaa, 0x5095, 0xa8,0x98, 0xf8,0x60,0x2a,0x40,0xe1,0x0a)
#endif
#else
typedef struct __FIIterator_1_Windows__CUI__CComposition__CVisualVtbl {
    BEGIN_INTERFACE

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

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

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

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

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

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

    /*** IIterator<ABI::Windows::UI::Composition::Visual* > methods ***/
    HRESULT (STDMETHODCALLTYPE *get_Current)(
        __FIIterator_1_Windows__CUI__CComposition__CVisual *This,
        __x_ABI_CWindows_CUI_CComposition_CIVisual **value);

    HRESULT (STDMETHODCALLTYPE *get_HasCurrent)(
        __FIIterator_1_Windows__CUI__CComposition__CVisual *This,
        boolean *value);

    HRESULT (STDMETHODCALLTYPE *MoveNext)(
        __FIIterator_1_Windows__CUI__CComposition__CVisual *This,
        boolean *value);

    HRESULT (STDMETHODCALLTYPE *GetMany)(
        __FIIterator_1_Windows__CUI__CComposition__CVisual *This,
        UINT32 items_size,
        __x_ABI_CWindows_CUI_CComposition_CIVisual **items,
        UINT32 *value);

    END_INTERFACE
} __FIIterator_1_Windows__CUI__CComposition__CVisualVtbl;

interface __FIIterator_1_Windows__CUI__CComposition__CVisual {
    CONST_VTBL __FIIterator_1_Windows__CUI__CComposition__CVisualVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define __FIIterator_1_Windows__CUI__CComposition__CVisual_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define __FIIterator_1_Windows__CUI__CComposition__CVisual_AddRef(This) (This)->lpVtbl->AddRef(This)
#define __FIIterator_1_Windows__CUI__CComposition__CVisual_Release(This) (This)->lpVtbl->Release(This)
/*** IInspectable methods ***/
#define __FIIterator_1_Windows__CUI__CComposition__CVisual_GetIids(This,iidCount,iids) (This)->lpVtbl->GetIids(This,iidCount,iids)
#define __FIIterator_1_Windows__CUI__CComposition__CVisual_GetRuntimeClassName(This,className) (This)->lpVtbl->GetRuntimeClassName(This,className)
#define __FIIterator_1_Windows__CUI__CComposition__CVisual_GetTrustLevel(This,trustLevel) (This)->lpVtbl->GetTrustLevel(This,trustLevel)
/*** IIterator<ABI::Windows::UI::Composition::Visual* > methods ***/
#define __FIIterator_1_Windows__CUI__CComposition__CVisual_get_Current(This,value) (This)->lpVtbl->get_Current(This,value)
#define __FIIterator_1_Windows__CUI__CComposition__CVisual_get_HasCurrent(This,value) (This)->lpVtbl->get_HasCurrent(This,value)
#define __FIIterator_1_Windows__CUI__CComposition__CVisual_MoveNext(This,value) (This)->lpVtbl->MoveNext(This,value)
#define __FIIterator_1_Windows__CUI__CComposition__CVisual_GetMany(This,items_size,items,value) (This)->lpVtbl->GetMany(This,items_size,items,value)
#else
/*** IUnknown methods ***/
static 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 inline ULONG __FIIterator_1_Windows__CUI__CComposition__CVisual_AddRef(__FIIterator_1_Windows__CUI__CComposition__CVisual* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG __FIIterator_1_Windows__CUI__CComposition__CVisual_Release(__FIIterator_1_Windows__CUI__CComposition__CVisual* This) {
    return This->lpVtbl->Release(This);
}
/*** IInspectable methods ***/
static 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 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 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 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 inline HRESULT __FIIterator_1_Windows__CUI__CComposition__CVisual_get_HasCurrent(__FIIterator_1_Windows__CUI__CComposition__CVisual* This,boolean *value) {
    return This->lpVtbl->get_HasCurrent(This,value);
}
static inline HRESULT __FIIterator_1_Windows__CUI__CComposition__CVisual_MoveNext(__FIIterator_1_Windows__CUI__CComposition__CVisual* This,boolean *value) {
    return This->lpVtbl->MoveNext(This,value);
}
static 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 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 inline ULONG __FITypedEventHandler_2_IInspectable_Windows__CUI__CComposition__CCompositionBatchCompletedEventArgs_AddRef(__FITypedEventHandler_2_IInspectable_Windows__CUI__CComposition__CCompositionBatchCompletedEventArgs* This) {
    return This->lpVtbl->AddRef(This);
}
static 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 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 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 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 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 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__ */
