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