/*** Autogenerated by WIDL 11.6 from include/windows.graphics.holographic.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_graphics_holographic_h__
#define __windows_graphics_holographic_h__

/* Forward declarations */

#ifndef ____x_ABI_CWindows_CGraphics_CHolographic_CIHolographicCamera_FWD_DEFINED__
#define ____x_ABI_CWindows_CGraphics_CHolographic_CIHolographicCamera_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CGraphics_CHolographic_CIHolographicCamera __x_ABI_CWindows_CGraphics_CHolographic_CIHolographicCamera;
#ifdef __cplusplus
#define __x_ABI_CWindows_CGraphics_CHolographic_CIHolographicCamera ABI::Windows::Graphics::Holographic::IHolographicCamera
namespace ABI {
    namespace Windows {
        namespace Graphics {
            namespace Holographic {
                interface IHolographicCamera;
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CGraphics_CHolographic_CIHolographicCameraPose_FWD_DEFINED__
#define ____x_ABI_CWindows_CGraphics_CHolographic_CIHolographicCameraPose_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CGraphics_CHolographic_CIHolographicCameraPose __x_ABI_CWindows_CGraphics_CHolographic_CIHolographicCameraPose;
#ifdef __cplusplus
#define __x_ABI_CWindows_CGraphics_CHolographic_CIHolographicCameraPose ABI::Windows::Graphics::Holographic::IHolographicCameraPose
namespace ABI {
    namespace Windows {
        namespace Graphics {
            namespace Holographic {
                interface IHolographicCameraPose;
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CGraphics_CHolographic_CIHolographicCameraRenderingParameters_FWD_DEFINED__
#define ____x_ABI_CWindows_CGraphics_CHolographic_CIHolographicCameraRenderingParameters_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CGraphics_CHolographic_CIHolographicCameraRenderingParameters __x_ABI_CWindows_CGraphics_CHolographic_CIHolographicCameraRenderingParameters;
#ifdef __cplusplus
#define __x_ABI_CWindows_CGraphics_CHolographic_CIHolographicCameraRenderingParameters ABI::Windows::Graphics::Holographic::IHolographicCameraRenderingParameters
namespace ABI {
    namespace Windows {
        namespace Graphics {
            namespace Holographic {
                interface IHolographicCameraRenderingParameters;
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CGraphics_CHolographic_CIHolographicFrame_FWD_DEFINED__
#define ____x_ABI_CWindows_CGraphics_CHolographic_CIHolographicFrame_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CGraphics_CHolographic_CIHolographicFrame __x_ABI_CWindows_CGraphics_CHolographic_CIHolographicFrame;
#ifdef __cplusplus
#define __x_ABI_CWindows_CGraphics_CHolographic_CIHolographicFrame ABI::Windows::Graphics::Holographic::IHolographicFrame
namespace ABI {
    namespace Windows {
        namespace Graphics {
            namespace Holographic {
                interface IHolographicFrame;
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CGraphics_CHolographic_CIHolographicFramePrediction_FWD_DEFINED__
#define ____x_ABI_CWindows_CGraphics_CHolographic_CIHolographicFramePrediction_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CGraphics_CHolographic_CIHolographicFramePrediction __x_ABI_CWindows_CGraphics_CHolographic_CIHolographicFramePrediction;
#ifdef __cplusplus
#define __x_ABI_CWindows_CGraphics_CHolographic_CIHolographicFramePrediction ABI::Windows::Graphics::Holographic::IHolographicFramePrediction
namespace ABI {
    namespace Windows {
        namespace Graphics {
            namespace Holographic {
                interface IHolographicFramePrediction;
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CGraphics_CHolographic_CIHolographicSpace_FWD_DEFINED__
#define ____x_ABI_CWindows_CGraphics_CHolographic_CIHolographicSpace_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CGraphics_CHolographic_CIHolographicSpace __x_ABI_CWindows_CGraphics_CHolographic_CIHolographicSpace;
#ifdef __cplusplus
#define __x_ABI_CWindows_CGraphics_CHolographic_CIHolographicSpace ABI::Windows::Graphics::Holographic::IHolographicSpace
namespace ABI {
    namespace Windows {
        namespace Graphics {
            namespace Holographic {
                interface IHolographicSpace;
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CGraphics_CHolographic_CIHolographicSpaceStatics2_FWD_DEFINED__
#define ____x_ABI_CWindows_CGraphics_CHolographic_CIHolographicSpaceStatics2_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CGraphics_CHolographic_CIHolographicSpaceStatics2 __x_ABI_CWindows_CGraphics_CHolographic_CIHolographicSpaceStatics2;
#ifdef __cplusplus
#define __x_ABI_CWindows_CGraphics_CHolographic_CIHolographicSpaceStatics2 ABI::Windows::Graphics::Holographic::IHolographicSpaceStatics2
namespace ABI {
    namespace Windows {
        namespace Graphics {
            namespace Holographic {
                interface IHolographicSpaceStatics2;
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CGraphics_CHolographic_CIHolographicSpaceStatics3_FWD_DEFINED__
#define ____x_ABI_CWindows_CGraphics_CHolographic_CIHolographicSpaceStatics3_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CGraphics_CHolographic_CIHolographicSpaceStatics3 __x_ABI_CWindows_CGraphics_CHolographic_CIHolographicSpaceStatics3;
#ifdef __cplusplus
#define __x_ABI_CWindows_CGraphics_CHolographic_CIHolographicSpaceStatics3 ABI::Windows::Graphics::Holographic::IHolographicSpaceStatics3
namespace ABI {
    namespace Windows {
        namespace Graphics {
            namespace Holographic {
                interface IHolographicSpaceStatics3;
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CGraphics_CHolographic_CIHolographicSpaceCameraAddedEventArgs_FWD_DEFINED__
#define ____x_ABI_CWindows_CGraphics_CHolographic_CIHolographicSpaceCameraAddedEventArgs_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CGraphics_CHolographic_CIHolographicSpaceCameraAddedEventArgs __x_ABI_CWindows_CGraphics_CHolographic_CIHolographicSpaceCameraAddedEventArgs;
#ifdef __cplusplus
#define __x_ABI_CWindows_CGraphics_CHolographic_CIHolographicSpaceCameraAddedEventArgs ABI::Windows::Graphics::Holographic::IHolographicSpaceCameraAddedEventArgs
namespace ABI {
    namespace Windows {
        namespace Graphics {
            namespace Holographic {
                interface IHolographicSpaceCameraAddedEventArgs;
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CGraphics_CHolographic_CIHolographicSpaceCameraRemovedEventArgs_FWD_DEFINED__
#define ____x_ABI_CWindows_CGraphics_CHolographic_CIHolographicSpaceCameraRemovedEventArgs_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CGraphics_CHolographic_CIHolographicSpaceCameraRemovedEventArgs __x_ABI_CWindows_CGraphics_CHolographic_CIHolographicSpaceCameraRemovedEventArgs;
#ifdef __cplusplus
#define __x_ABI_CWindows_CGraphics_CHolographic_CIHolographicSpaceCameraRemovedEventArgs ABI::Windows::Graphics::Holographic::IHolographicSpaceCameraRemovedEventArgs
namespace ABI {
    namespace Windows {
        namespace Graphics {
            namespace Holographic {
                interface IHolographicSpaceCameraRemovedEventArgs;
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CGraphics_CHolographic_CHolographicCamera_FWD_DEFINED__
#define ____x_ABI_CWindows_CGraphics_CHolographic_CHolographicCamera_FWD_DEFINED__
#ifdef __cplusplus
namespace ABI {
    namespace Windows {
        namespace Graphics {
            namespace Holographic {
                class HolographicCamera;
            }
        }
    }
}
#else
typedef struct __x_ABI_CWindows_CGraphics_CHolographic_CHolographicCamera __x_ABI_CWindows_CGraphics_CHolographic_CHolographicCamera;
#endif /* defined __cplusplus */
#endif /* defined ____x_ABI_CWindows_CGraphics_CHolographic_CHolographicCamera_FWD_DEFINED__ */

#ifndef ____x_ABI_CWindows_CGraphics_CHolographic_CHolographicCameraPose_FWD_DEFINED__
#define ____x_ABI_CWindows_CGraphics_CHolographic_CHolographicCameraPose_FWD_DEFINED__
#ifdef __cplusplus
namespace ABI {
    namespace Windows {
        namespace Graphics {
            namespace Holographic {
                class HolographicCameraPose;
            }
        }
    }
}
#else
typedef struct __x_ABI_CWindows_CGraphics_CHolographic_CHolographicCameraPose __x_ABI_CWindows_CGraphics_CHolographic_CHolographicCameraPose;
#endif /* defined __cplusplus */
#endif /* defined ____x_ABI_CWindows_CGraphics_CHolographic_CHolographicCameraPose_FWD_DEFINED__ */

#ifndef ____x_ABI_CWindows_CGraphics_CHolographic_CHolographicCameraRenderingParameters_FWD_DEFINED__
#define ____x_ABI_CWindows_CGraphics_CHolographic_CHolographicCameraRenderingParameters_FWD_DEFINED__
#ifdef __cplusplus
namespace ABI {
    namespace Windows {
        namespace Graphics {
            namespace Holographic {
                class HolographicCameraRenderingParameters;
            }
        }
    }
}
#else
typedef struct __x_ABI_CWindows_CGraphics_CHolographic_CHolographicCameraRenderingParameters __x_ABI_CWindows_CGraphics_CHolographic_CHolographicCameraRenderingParameters;
#endif /* defined __cplusplus */
#endif /* defined ____x_ABI_CWindows_CGraphics_CHolographic_CHolographicCameraRenderingParameters_FWD_DEFINED__ */

#ifndef ____x_ABI_CWindows_CGraphics_CHolographic_CHolographicFrame_FWD_DEFINED__
#define ____x_ABI_CWindows_CGraphics_CHolographic_CHolographicFrame_FWD_DEFINED__
#ifdef __cplusplus
namespace ABI {
    namespace Windows {
        namespace Graphics {
            namespace Holographic {
                class HolographicFrame;
            }
        }
    }
}
#else
typedef struct __x_ABI_CWindows_CGraphics_CHolographic_CHolographicFrame __x_ABI_CWindows_CGraphics_CHolographic_CHolographicFrame;
#endif /* defined __cplusplus */
#endif /* defined ____x_ABI_CWindows_CGraphics_CHolographic_CHolographicFrame_FWD_DEFINED__ */

#ifndef ____x_ABI_CWindows_CGraphics_CHolographic_CHolographicFramePrediction_FWD_DEFINED__
#define ____x_ABI_CWindows_CGraphics_CHolographic_CHolographicFramePrediction_FWD_DEFINED__
#ifdef __cplusplus
namespace ABI {
    namespace Windows {
        namespace Graphics {
            namespace Holographic {
                class HolographicFramePrediction;
            }
        }
    }
}
#else
typedef struct __x_ABI_CWindows_CGraphics_CHolographic_CHolographicFramePrediction __x_ABI_CWindows_CGraphics_CHolographic_CHolographicFramePrediction;
#endif /* defined __cplusplus */
#endif /* defined ____x_ABI_CWindows_CGraphics_CHolographic_CHolographicFramePrediction_FWD_DEFINED__ */

#ifndef ____x_ABI_CWindows_CGraphics_CHolographic_CHolographicSpace_FWD_DEFINED__
#define ____x_ABI_CWindows_CGraphics_CHolographic_CHolographicSpace_FWD_DEFINED__
#ifdef __cplusplus
namespace ABI {
    namespace Windows {
        namespace Graphics {
            namespace Holographic {
                class HolographicSpace;
            }
        }
    }
}
#else
typedef struct __x_ABI_CWindows_CGraphics_CHolographic_CHolographicSpace __x_ABI_CWindows_CGraphics_CHolographic_CHolographicSpace;
#endif /* defined __cplusplus */
#endif /* defined ____x_ABI_CWindows_CGraphics_CHolographic_CHolographicSpace_FWD_DEFINED__ */

#ifndef ____x_ABI_CWindows_CGraphics_CHolographic_CHolographicSpaceCameraAddedEventArgs_FWD_DEFINED__
#define ____x_ABI_CWindows_CGraphics_CHolographic_CHolographicSpaceCameraAddedEventArgs_FWD_DEFINED__
#ifdef __cplusplus
namespace ABI {
    namespace Windows {
        namespace Graphics {
            namespace Holographic {
                class HolographicSpaceCameraAddedEventArgs;
            }
        }
    }
}
#else
typedef struct __x_ABI_CWindows_CGraphics_CHolographic_CHolographicSpaceCameraAddedEventArgs __x_ABI_CWindows_CGraphics_CHolographic_CHolographicSpaceCameraAddedEventArgs;
#endif /* defined __cplusplus */
#endif /* defined ____x_ABI_CWindows_CGraphics_CHolographic_CHolographicSpaceCameraAddedEventArgs_FWD_DEFINED__ */

#ifndef ____x_ABI_CWindows_CGraphics_CHolographic_CHolographicSpaceCameraRemovedEventArgs_FWD_DEFINED__
#define ____x_ABI_CWindows_CGraphics_CHolographic_CHolographicSpaceCameraRemovedEventArgs_FWD_DEFINED__
#ifdef __cplusplus
namespace ABI {
    namespace Windows {
        namespace Graphics {
            namespace Holographic {
                class HolographicSpaceCameraRemovedEventArgs;
            }
        }
    }
}
#else
typedef struct __x_ABI_CWindows_CGraphics_CHolographic_CHolographicSpaceCameraRemovedEventArgs __x_ABI_CWindows_CGraphics_CHolographic_CHolographicSpaceCameraRemovedEventArgs;
#endif /* defined __cplusplus */
#endif /* defined ____x_ABI_CWindows_CGraphics_CHolographic_CHolographicSpaceCameraRemovedEventArgs_FWD_DEFINED__ */

#ifndef ____FIVectorView_1_Windows__CGraphics__CHolographic__CHolographicCamera_FWD_DEFINED__
#define ____FIVectorView_1_Windows__CGraphics__CHolographic__CHolographicCamera_FWD_DEFINED__
typedef interface __FIVectorView_1_Windows__CGraphics__CHolographic__CHolographicCamera __FIVectorView_1_Windows__CGraphics__CHolographic__CHolographicCamera;
#ifdef __cplusplus
#define __FIVectorView_1_Windows__CGraphics__CHolographic__CHolographicCamera ABI::Windows::Foundation::Collections::IVectorView<ABI::Windows::Graphics::Holographic::HolographicCamera* >
#endif /* __cplusplus */
#endif

#ifndef ____FIVectorView_1_Windows__CGraphics__CHolographic__CHolographicCameraPose_FWD_DEFINED__
#define ____FIVectorView_1_Windows__CGraphics__CHolographic__CHolographicCameraPose_FWD_DEFINED__
typedef interface __FIVectorView_1_Windows__CGraphics__CHolographic__CHolographicCameraPose __FIVectorView_1_Windows__CGraphics__CHolographic__CHolographicCameraPose;
#ifdef __cplusplus
#define __FIVectorView_1_Windows__CGraphics__CHolographic__CHolographicCameraPose ABI::Windows::Foundation::Collections::IVectorView<ABI::Windows::Graphics::Holographic::HolographicCameraPose* >
#endif /* __cplusplus */
#endif

#ifndef ____FIReference_1_HolographicStereoTransform_FWD_DEFINED__
#define ____FIReference_1_HolographicStereoTransform_FWD_DEFINED__
typedef interface __FIReference_1_HolographicStereoTransform __FIReference_1_HolographicStereoTransform;
#ifdef __cplusplus
#define __FIReference_1_HolographicStereoTransform ABI::Windows::Foundation::IReference<ABI::Windows::Graphics::Holographic::HolographicStereoTransform >
#endif /* __cplusplus */
#endif

#ifndef ____FITypedEventHandler_2_Windows__CGraphics__CHolographic__CHolographicSpace_IInspectable_FWD_DEFINED__
#define ____FITypedEventHandler_2_Windows__CGraphics__CHolographic__CHolographicSpace_IInspectable_FWD_DEFINED__
typedef interface __FITypedEventHandler_2_Windows__CGraphics__CHolographic__CHolographicSpace_IInspectable __FITypedEventHandler_2_Windows__CGraphics__CHolographic__CHolographicSpace_IInspectable;
#ifdef __cplusplus
#define __FITypedEventHandler_2_Windows__CGraphics__CHolographic__CHolographicSpace_IInspectable ABI::Windows::Foundation::ITypedEventHandler<ABI::Windows::Graphics::Holographic::HolographicSpace*,IInspectable* >
#endif /* __cplusplus */
#endif

#ifndef ____FITypedEventHandler_2_Windows__CGraphics__CHolographic__CHolographicSpace_Windows__CGraphics__CHolographic__CHolographicSpaceCameraAddedEventArgs_FWD_DEFINED__
#define ____FITypedEventHandler_2_Windows__CGraphics__CHolographic__CHolographicSpace_Windows__CGraphics__CHolographic__CHolographicSpaceCameraAddedEventArgs_FWD_DEFINED__
typedef interface __FITypedEventHandler_2_Windows__CGraphics__CHolographic__CHolographicSpace_Windows__CGraphics__CHolographic__CHolographicSpaceCameraAddedEventArgs __FITypedEventHandler_2_Windows__CGraphics__CHolographic__CHolographicSpace_Windows__CGraphics__CHolographic__CHolographicSpaceCameraAddedEventArgs;
#ifdef __cplusplus
#define __FITypedEventHandler_2_Windows__CGraphics__CHolographic__CHolographicSpace_Windows__CGraphics__CHolographic__CHolographicSpaceCameraAddedEventArgs ABI::Windows::Foundation::ITypedEventHandler<ABI::Windows::Graphics::Holographic::HolographicSpace*,ABI::Windows::Graphics::Holographic::HolographicSpaceCameraAddedEventArgs* >
#endif /* __cplusplus */
#endif

#ifndef ____FITypedEventHandler_2_Windows__CGraphics__CHolographic__CHolographicSpace_Windows__CGraphics__CHolographic__CHolographicSpaceCameraRemovedEventArgs_FWD_DEFINED__
#define ____FITypedEventHandler_2_Windows__CGraphics__CHolographic__CHolographicSpace_Windows__CGraphics__CHolographic__CHolographicSpaceCameraRemovedEventArgs_FWD_DEFINED__
typedef interface __FITypedEventHandler_2_Windows__CGraphics__CHolographic__CHolographicSpace_Windows__CGraphics__CHolographic__CHolographicSpaceCameraRemovedEventArgs __FITypedEventHandler_2_Windows__CGraphics__CHolographic__CHolographicSpace_Windows__CGraphics__CHolographic__CHolographicSpaceCameraRemovedEventArgs;
#ifdef __cplusplus
#define __FITypedEventHandler_2_Windows__CGraphics__CHolographic__CHolographicSpace_Windows__CGraphics__CHolographic__CHolographicSpaceCameraRemovedEventArgs ABI::Windows::Foundation::ITypedEventHandler<ABI::Windows::Graphics::Holographic::HolographicSpace*,ABI::Windows::Graphics::Holographic::HolographicSpaceCameraRemovedEventArgs* >
#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.directx.direct3d11.h>
#include <windows.perception.h>
#include <windows.perception.spatial.h>
#include <windows.ui.core.h>

#ifdef __cplusplus
extern "C" {
#endif

#if !defined(WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION)
#define WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION 0xe0000
#endif // defined(WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION)

#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x20000
#ifndef ____x_ABI_CWindows_CGraphics_CHolographic_CHolographicFramePresentResult_ENUM_DEFINED__
#define ____x_ABI_CWindows_CGraphics_CHolographic_CHolographicFramePresentResult_ENUM_DEFINED__
#ifdef __cplusplus
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace Graphics {
            namespace Holographic {
                enum HolographicFramePresentResult {
                    HolographicFramePresentResult_Success = 0,
                    HolographicFramePresentResult_DeviceRemoved = 1
                };
            }
        }
    }
}
extern "C" {
#else
enum __x_ABI_CWindows_CGraphics_CHolographic_CHolographicFramePresentResult {
    HolographicFramePresentResult_Success = 0,
    HolographicFramePresentResult_DeviceRemoved = 1
};
#ifdef WIDL_using_Windows_Graphics_Holographic
#define HolographicFramePresentResult __x_ABI_CWindows_CGraphics_CHolographic_CHolographicFramePresentResult
#endif /* WIDL_using_Windows_Graphics_Holographic */
#endif

#endif /* ____x_ABI_CWindows_CGraphics_CHolographic_CHolographicFramePresentResult_ENUM_DEFINED__ */
#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x20000 */
#ifndef __cplusplus
typedef enum __x_ABI_CWindows_CGraphics_CHolographic_CHolographicFramePresentResult __x_ABI_CWindows_CGraphics_CHolographic_CHolographicFramePresentResult;
#endif /* __cplusplus */

#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x20000
#ifndef ____x_ABI_CWindows_CGraphics_CHolographic_CHolographicFramePresentWaitBehavior_ENUM_DEFINED__
#define ____x_ABI_CWindows_CGraphics_CHolographic_CHolographicFramePresentWaitBehavior_ENUM_DEFINED__
#ifdef __cplusplus
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace Graphics {
            namespace Holographic {
                enum HolographicFramePresentWaitBehavior {
                    HolographicFramePresentWaitBehavior_WaitForFrameToFinish = 0,
                    HolographicFramePresentWaitBehavior_DoNotWaitForFrameToFinish = 1
                };
            }
        }
    }
}
extern "C" {
#else
enum __x_ABI_CWindows_CGraphics_CHolographic_CHolographicFramePresentWaitBehavior {
    HolographicFramePresentWaitBehavior_WaitForFrameToFinish = 0,
    HolographicFramePresentWaitBehavior_DoNotWaitForFrameToFinish = 1
};
#ifdef WIDL_using_Windows_Graphics_Holographic
#define HolographicFramePresentWaitBehavior __x_ABI_CWindows_CGraphics_CHolographic_CHolographicFramePresentWaitBehavior
#endif /* WIDL_using_Windows_Graphics_Holographic */
#endif

#endif /* ____x_ABI_CWindows_CGraphics_CHolographic_CHolographicFramePresentWaitBehavior_ENUM_DEFINED__ */
#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x20000 */
#ifndef __cplusplus
typedef enum __x_ABI_CWindows_CGraphics_CHolographic_CHolographicFramePresentWaitBehavior __x_ABI_CWindows_CGraphics_CHolographic_CHolographicFramePresentWaitBehavior;
#endif /* __cplusplus */

#ifndef __cplusplus
typedef struct __x_ABI_CWindows_CGraphics_CHolographic_CHolographicAdapterId __x_ABI_CWindows_CGraphics_CHolographic_CHolographicAdapterId;
#else /* __cplusplus */
namespace ABI {
    namespace Windows {
        namespace Graphics {
            namespace Holographic {
                typedef struct HolographicAdapterId HolographicAdapterId;
            }
        }
    }
}
#endif /* __cplusplus */

#ifndef __cplusplus
typedef struct __x_ABI_CWindows_CGraphics_CHolographic_CHolographicStereoTransform __x_ABI_CWindows_CGraphics_CHolographic_CHolographicStereoTransform;
#else /* __cplusplus */
namespace ABI {
    namespace Windows {
        namespace Graphics {
            namespace Holographic {
                typedef struct HolographicStereoTransform HolographicStereoTransform;
            }
        }
    }
}
#endif /* __cplusplus */

#ifndef ____x_ABI_CWindows_CGraphics_CHolographic_CIHolographicCamera_FWD_DEFINED__
#define ____x_ABI_CWindows_CGraphics_CHolographic_CIHolographicCamera_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CGraphics_CHolographic_CIHolographicCamera __x_ABI_CWindows_CGraphics_CHolographic_CIHolographicCamera;
#ifdef __cplusplus
#define __x_ABI_CWindows_CGraphics_CHolographic_CIHolographicCamera ABI::Windows::Graphics::Holographic::IHolographicCamera
namespace ABI {
    namespace Windows {
        namespace Graphics {
            namespace Holographic {
                interface IHolographicCamera;
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CGraphics_CHolographic_CIHolographicCameraPose_FWD_DEFINED__
#define ____x_ABI_CWindows_CGraphics_CHolographic_CIHolographicCameraPose_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CGraphics_CHolographic_CIHolographicCameraPose __x_ABI_CWindows_CGraphics_CHolographic_CIHolographicCameraPose;
#ifdef __cplusplus
#define __x_ABI_CWindows_CGraphics_CHolographic_CIHolographicCameraPose ABI::Windows::Graphics::Holographic::IHolographicCameraPose
namespace ABI {
    namespace Windows {
        namespace Graphics {
            namespace Holographic {
                interface IHolographicCameraPose;
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CGraphics_CHolographic_CIHolographicCameraRenderingParameters_FWD_DEFINED__
#define ____x_ABI_CWindows_CGraphics_CHolographic_CIHolographicCameraRenderingParameters_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CGraphics_CHolographic_CIHolographicCameraRenderingParameters __x_ABI_CWindows_CGraphics_CHolographic_CIHolographicCameraRenderingParameters;
#ifdef __cplusplus
#define __x_ABI_CWindows_CGraphics_CHolographic_CIHolographicCameraRenderingParameters ABI::Windows::Graphics::Holographic::IHolographicCameraRenderingParameters
namespace ABI {
    namespace Windows {
        namespace Graphics {
            namespace Holographic {
                interface IHolographicCameraRenderingParameters;
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CGraphics_CHolographic_CIHolographicFrame_FWD_DEFINED__
#define ____x_ABI_CWindows_CGraphics_CHolographic_CIHolographicFrame_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CGraphics_CHolographic_CIHolographicFrame __x_ABI_CWindows_CGraphics_CHolographic_CIHolographicFrame;
#ifdef __cplusplus
#define __x_ABI_CWindows_CGraphics_CHolographic_CIHolographicFrame ABI::Windows::Graphics::Holographic::IHolographicFrame
namespace ABI {
    namespace Windows {
        namespace Graphics {
            namespace Holographic {
                interface IHolographicFrame;
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CGraphics_CHolographic_CIHolographicFramePrediction_FWD_DEFINED__
#define ____x_ABI_CWindows_CGraphics_CHolographic_CIHolographicFramePrediction_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CGraphics_CHolographic_CIHolographicFramePrediction __x_ABI_CWindows_CGraphics_CHolographic_CIHolographicFramePrediction;
#ifdef __cplusplus
#define __x_ABI_CWindows_CGraphics_CHolographic_CIHolographicFramePrediction ABI::Windows::Graphics::Holographic::IHolographicFramePrediction
namespace ABI {
    namespace Windows {
        namespace Graphics {
            namespace Holographic {
                interface IHolographicFramePrediction;
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CGraphics_CHolographic_CIHolographicSpaceStatics_FWD_DEFINED__
#define ____x_ABI_CWindows_CGraphics_CHolographic_CIHolographicSpaceStatics_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CGraphics_CHolographic_CIHolographicSpaceStatics __x_ABI_CWindows_CGraphics_CHolographic_CIHolographicSpaceStatics;
#ifdef __cplusplus
#define __x_ABI_CWindows_CGraphics_CHolographic_CIHolographicSpaceStatics ABI::Windows::Graphics::Holographic::IHolographicSpaceStatics
namespace ABI {
    namespace Windows {
        namespace Graphics {
            namespace Holographic {
                interface IHolographicSpaceStatics;
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CGraphics_CHolographic_CIHolographicSpaceStatics2_FWD_DEFINED__
#define ____x_ABI_CWindows_CGraphics_CHolographic_CIHolographicSpaceStatics2_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CGraphics_CHolographic_CIHolographicSpaceStatics2 __x_ABI_CWindows_CGraphics_CHolographic_CIHolographicSpaceStatics2;
#ifdef __cplusplus
#define __x_ABI_CWindows_CGraphics_CHolographic_CIHolographicSpaceStatics2 ABI::Windows::Graphics::Holographic::IHolographicSpaceStatics2
namespace ABI {
    namespace Windows {
        namespace Graphics {
            namespace Holographic {
                interface IHolographicSpaceStatics2;
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CGraphics_CHolographic_CIHolographicSpaceStatics3_FWD_DEFINED__
#define ____x_ABI_CWindows_CGraphics_CHolographic_CIHolographicSpaceStatics3_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CGraphics_CHolographic_CIHolographicSpaceStatics3 __x_ABI_CWindows_CGraphics_CHolographic_CIHolographicSpaceStatics3;
#ifdef __cplusplus
#define __x_ABI_CWindows_CGraphics_CHolographic_CIHolographicSpaceStatics3 ABI::Windows::Graphics::Holographic::IHolographicSpaceStatics3
namespace ABI {
    namespace Windows {
        namespace Graphics {
            namespace Holographic {
                interface IHolographicSpaceStatics3;
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CGraphics_CHolographic_CIHolographicSpaceCameraAddedEventArgs_FWD_DEFINED__
#define ____x_ABI_CWindows_CGraphics_CHolographic_CIHolographicSpaceCameraAddedEventArgs_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CGraphics_CHolographic_CIHolographicSpaceCameraAddedEventArgs __x_ABI_CWindows_CGraphics_CHolographic_CIHolographicSpaceCameraAddedEventArgs;
#ifdef __cplusplus
#define __x_ABI_CWindows_CGraphics_CHolographic_CIHolographicSpaceCameraAddedEventArgs ABI::Windows::Graphics::Holographic::IHolographicSpaceCameraAddedEventArgs
namespace ABI {
    namespace Windows {
        namespace Graphics {
            namespace Holographic {
                interface IHolographicSpaceCameraAddedEventArgs;
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CGraphics_CHolographic_CIHolographicSpaceCameraRemovedEventArgs_FWD_DEFINED__
#define ____x_ABI_CWindows_CGraphics_CHolographic_CIHolographicSpaceCameraRemovedEventArgs_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CGraphics_CHolographic_CIHolographicSpaceCameraRemovedEventArgs __x_ABI_CWindows_CGraphics_CHolographic_CIHolographicSpaceCameraRemovedEventArgs;
#ifdef __cplusplus
#define __x_ABI_CWindows_CGraphics_CHolographic_CIHolographicSpaceCameraRemovedEventArgs ABI::Windows::Graphics::Holographic::IHolographicSpaceCameraRemovedEventArgs
namespace ABI {
    namespace Windows {
        namespace Graphics {
            namespace Holographic {
                interface IHolographicSpaceCameraRemovedEventArgs;
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____FIVectorView_1_Windows__CGraphics__CHolographic__CHolographicCamera_FWD_DEFINED__
#define ____FIVectorView_1_Windows__CGraphics__CHolographic__CHolographicCamera_FWD_DEFINED__
typedef interface __FIVectorView_1_Windows__CGraphics__CHolographic__CHolographicCamera __FIVectorView_1_Windows__CGraphics__CHolographic__CHolographicCamera;
#ifdef __cplusplus
#define __FIVectorView_1_Windows__CGraphics__CHolographic__CHolographicCamera ABI::Windows::Foundation::Collections::IVectorView<ABI::Windows::Graphics::Holographic::HolographicCamera* >
#endif /* __cplusplus */
#endif

#ifndef ____FIVectorView_1_Windows__CGraphics__CHolographic__CHolographicCameraPose_FWD_DEFINED__
#define ____FIVectorView_1_Windows__CGraphics__CHolographic__CHolographicCameraPose_FWD_DEFINED__
typedef interface __FIVectorView_1_Windows__CGraphics__CHolographic__CHolographicCameraPose __FIVectorView_1_Windows__CGraphics__CHolographic__CHolographicCameraPose;
#ifdef __cplusplus
#define __FIVectorView_1_Windows__CGraphics__CHolographic__CHolographicCameraPose ABI::Windows::Foundation::Collections::IVectorView<ABI::Windows::Graphics::Holographic::HolographicCameraPose* >
#endif /* __cplusplus */
#endif

#ifndef ____FIReference_1_HolographicStereoTransform_FWD_DEFINED__
#define ____FIReference_1_HolographicStereoTransform_FWD_DEFINED__
typedef interface __FIReference_1_HolographicStereoTransform __FIReference_1_HolographicStereoTransform;
#ifdef __cplusplus
#define __FIReference_1_HolographicStereoTransform ABI::Windows::Foundation::IReference<ABI::Windows::Graphics::Holographic::HolographicStereoTransform >
#endif /* __cplusplus */
#endif

#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x20000
#ifdef __cplusplus
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace Graphics {
            namespace Holographic {
                struct HolographicAdapterId {
                    UINT32 LowPart;
                    INT32 HighPart;
                };
            }
        }
    }
}
extern "C" {
#else
struct __x_ABI_CWindows_CGraphics_CHolographic_CHolographicAdapterId {
    UINT32 LowPart;
    INT32 HighPart;
};
#ifdef WIDL_using_Windows_Graphics_Holographic
#define HolographicAdapterId __x_ABI_CWindows_CGraphics_CHolographic_CHolographicAdapterId
#endif /* WIDL_using_Windows_Graphics_Holographic */
#endif

#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x20000 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x20000
#ifdef __cplusplus
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace Graphics {
            namespace Holographic {
                struct HolographicStereoTransform {
                    ABI::Windows::Foundation::Numerics::Matrix4x4 Left;
                    ABI::Windows::Foundation::Numerics::Matrix4x4 Right;
                };
            }
        }
    }
}
extern "C" {
#else
struct __x_ABI_CWindows_CGraphics_CHolographic_CHolographicStereoTransform {
    __x_ABI_CWindows_CFoundation_CNumerics_CMatrix4x4 Left;
    __x_ABI_CWindows_CFoundation_CNumerics_CMatrix4x4 Right;
};
#ifdef WIDL_using_Windows_Graphics_Holographic
#define HolographicStereoTransform __x_ABI_CWindows_CGraphics_CHolographic_CHolographicStereoTransform
#endif /* WIDL_using_Windows_Graphics_Holographic */
#endif

#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x20000 */
/*****************************************************************************
 * IHolographicCamera interface
 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x20000
#ifndef ____x_ABI_CWindows_CGraphics_CHolographic_CIHolographicCamera_INTERFACE_DEFINED__
#define ____x_ABI_CWindows_CGraphics_CHolographic_CIHolographicCamera_INTERFACE_DEFINED__

DEFINE_GUID(IID___x_ABI_CWindows_CGraphics_CHolographic_CIHolographicCamera, 0xe4e98445, 0x9bed, 0x4980, 0x9b,0xa0, 0xe8,0x76,0x80,0xd1,0xcb,0x74);
#if defined(__cplusplus) && !defined(CINTERFACE)
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace Graphics {
            namespace Holographic {
                MIDL_INTERFACE("e4e98445-9bed-4980-9ba0-e87680d1cb74")
                IHolographicCamera : public IInspectable
                {
                    virtual HRESULT STDMETHODCALLTYPE get_RenderTargetSize(
                        ABI::Windows::Foundation::Size *value) = 0;

                    virtual HRESULT STDMETHODCALLTYPE get_ViewportScaleFactor(
                        DOUBLE *value) = 0;

                    virtual HRESULT STDMETHODCALLTYPE put_ViewportScaleFactor(
                        DOUBLE value) = 0;

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

                    virtual HRESULT STDMETHODCALLTYPE get_Id(
                        UINT32 *value) = 0;

                    virtual HRESULT STDMETHODCALLTYPE SetNearPlaneDistance(
                        DOUBLE value) = 0;

                    virtual HRESULT STDMETHODCALLTYPE SetFarPlaneDistance(
                        DOUBLE value) = 0;

                };
            }
        }
    }
}
extern "C" {
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(__x_ABI_CWindows_CGraphics_CHolographic_CIHolographicCamera, 0xe4e98445, 0x9bed, 0x4980, 0x9b,0xa0, 0xe8,0x76,0x80,0xd1,0xcb,0x74)
#endif
#else
typedef struct __x_ABI_CWindows_CGraphics_CHolographic_CIHolographicCameraVtbl {
    BEGIN_INTERFACE

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

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

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

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

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

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

    /*** IHolographicCamera methods ***/
    HRESULT (STDMETHODCALLTYPE *get_RenderTargetSize)(
        __x_ABI_CWindows_CGraphics_CHolographic_CIHolographicCamera *This,
        __x_ABI_CWindows_CFoundation_CSize *value);

    HRESULT (STDMETHODCALLTYPE *get_ViewportScaleFactor)(
        __x_ABI_CWindows_CGraphics_CHolographic_CIHolographicCamera *This,
        DOUBLE *value);

    HRESULT (STDMETHODCALLTYPE *put_ViewportScaleFactor)(
        __x_ABI_CWindows_CGraphics_CHolographic_CIHolographicCamera *This,
        DOUBLE value);

    HRESULT (STDMETHODCALLTYPE *get_IsStereo)(
        __x_ABI_CWindows_CGraphics_CHolographic_CIHolographicCamera *This,
        boolean *value);

    HRESULT (STDMETHODCALLTYPE *get_Id)(
        __x_ABI_CWindows_CGraphics_CHolographic_CIHolographicCamera *This,
        UINT32 *value);

    HRESULT (STDMETHODCALLTYPE *SetNearPlaneDistance)(
        __x_ABI_CWindows_CGraphics_CHolographic_CIHolographicCamera *This,
        DOUBLE value);

    HRESULT (STDMETHODCALLTYPE *SetFarPlaneDistance)(
        __x_ABI_CWindows_CGraphics_CHolographic_CIHolographicCamera *This,
        DOUBLE value);

    END_INTERFACE
} __x_ABI_CWindows_CGraphics_CHolographic_CIHolographicCameraVtbl;

interface __x_ABI_CWindows_CGraphics_CHolographic_CIHolographicCamera {
    CONST_VTBL __x_ABI_CWindows_CGraphics_CHolographic_CIHolographicCameraVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define __x_ABI_CWindows_CGraphics_CHolographic_CIHolographicCamera_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define __x_ABI_CWindows_CGraphics_CHolographic_CIHolographicCamera_AddRef(This) (This)->lpVtbl->AddRef(This)
#define __x_ABI_CWindows_CGraphics_CHolographic_CIHolographicCamera_Release(This) (This)->lpVtbl->Release(This)
/*** IInspectable methods ***/
#define __x_ABI_CWindows_CGraphics_CHolographic_CIHolographicCamera_GetIids(This,iidCount,iids) (This)->lpVtbl->GetIids(This,iidCount,iids)
#define __x_ABI_CWindows_CGraphics_CHolographic_CIHolographicCamera_GetRuntimeClassName(This,className) (This)->lpVtbl->GetRuntimeClassName(This,className)
#define __x_ABI_CWindows_CGraphics_CHolographic_CIHolographicCamera_GetTrustLevel(This,trustLevel) (This)->lpVtbl->GetTrustLevel(This,trustLevel)
/*** IHolographicCamera methods ***/
#define __x_ABI_CWindows_CGraphics_CHolographic_CIHolographicCamera_get_RenderTargetSize(This,value) (This)->lpVtbl->get_RenderTargetSize(This,value)
#define __x_ABI_CWindows_CGraphics_CHolographic_CIHolographicCamera_get_ViewportScaleFactor(This,value) (This)->lpVtbl->get_ViewportScaleFactor(This,value)
#define __x_ABI_CWindows_CGraphics_CHolographic_CIHolographicCamera_put_ViewportScaleFactor(This,value) (This)->lpVtbl->put_ViewportScaleFactor(This,value)
#define __x_ABI_CWindows_CGraphics_CHolographic_CIHolographicCamera_get_IsStereo(This,value) (This)->lpVtbl->get_IsStereo(This,value)
#define __x_ABI_CWindows_CGraphics_CHolographic_CIHolographicCamera_get_Id(This,value) (This)->lpVtbl->get_Id(This,value)
#define __x_ABI_CWindows_CGraphics_CHolographic_CIHolographicCamera_SetNearPlaneDistance(This,value) (This)->lpVtbl->SetNearPlaneDistance(This,value)
#define __x_ABI_CWindows_CGraphics_CHolographic_CIHolographicCamera_SetFarPlaneDistance(This,value) (This)->lpVtbl->SetFarPlaneDistance(This,value)
#else
/*** IUnknown methods ***/
static inline HRESULT __x_ABI_CWindows_CGraphics_CHolographic_CIHolographicCamera_QueryInterface(__x_ABI_CWindows_CGraphics_CHolographic_CIHolographicCamera* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG __x_ABI_CWindows_CGraphics_CHolographic_CIHolographicCamera_AddRef(__x_ABI_CWindows_CGraphics_CHolographic_CIHolographicCamera* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG __x_ABI_CWindows_CGraphics_CHolographic_CIHolographicCamera_Release(__x_ABI_CWindows_CGraphics_CHolographic_CIHolographicCamera* This) {
    return This->lpVtbl->Release(This);
}
/*** IInspectable methods ***/
static inline HRESULT __x_ABI_CWindows_CGraphics_CHolographic_CIHolographicCamera_GetIids(__x_ABI_CWindows_CGraphics_CHolographic_CIHolographicCamera* This,ULONG *iidCount,IID **iids) {
    return This->lpVtbl->GetIids(This,iidCount,iids);
}
static inline HRESULT __x_ABI_CWindows_CGraphics_CHolographic_CIHolographicCamera_GetRuntimeClassName(__x_ABI_CWindows_CGraphics_CHolographic_CIHolographicCamera* This,HSTRING *className) {
    return This->lpVtbl->GetRuntimeClassName(This,className);
}
static inline HRESULT __x_ABI_CWindows_CGraphics_CHolographic_CIHolographicCamera_GetTrustLevel(__x_ABI_CWindows_CGraphics_CHolographic_CIHolographicCamera* This,TrustLevel *trustLevel) {
    return This->lpVtbl->GetTrustLevel(This,trustLevel);
}
/*** IHolographicCamera methods ***/
static inline HRESULT __x_ABI_CWindows_CGraphics_CHolographic_CIHolographicCamera_get_RenderTargetSize(__x_ABI_CWindows_CGraphics_CHolographic_CIHolographicCamera* This,__x_ABI_CWindows_CFoundation_CSize *value) {
    return This->lpVtbl->get_RenderTargetSize(This,value);
}
static inline HRESULT __x_ABI_CWindows_CGraphics_CHolographic_CIHolographicCamera_get_ViewportScaleFactor(__x_ABI_CWindows_CGraphics_CHolographic_CIHolographicCamera* This,DOUBLE *value) {
    return This->lpVtbl->get_ViewportScaleFactor(This,value);
}
static inline HRESULT __x_ABI_CWindows_CGraphics_CHolographic_CIHolographicCamera_put_ViewportScaleFactor(__x_ABI_CWindows_CGraphics_CHolographic_CIHolographicCamera* This,DOUBLE value) {
    return This->lpVtbl->put_ViewportScaleFactor(This,value);
}
static inline HRESULT __x_ABI_CWindows_CGraphics_CHolographic_CIHolographicCamera_get_IsStereo(__x_ABI_CWindows_CGraphics_CHolographic_CIHolographicCamera* This,boolean *value) {
    return This->lpVtbl->get_IsStereo(This,value);
}
static inline HRESULT __x_ABI_CWindows_CGraphics_CHolographic_CIHolographicCamera_get_Id(__x_ABI_CWindows_CGraphics_CHolographic_CIHolographicCamera* This,UINT32 *value) {
    return This->lpVtbl->get_Id(This,value);
}
static inline HRESULT __x_ABI_CWindows_CGraphics_CHolographic_CIHolographicCamera_SetNearPlaneDistance(__x_ABI_CWindows_CGraphics_CHolographic_CIHolographicCamera* This,DOUBLE value) {
    return This->lpVtbl->SetNearPlaneDistance(This,value);
}
static inline HRESULT __x_ABI_CWindows_CGraphics_CHolographic_CIHolographicCamera_SetFarPlaneDistance(__x_ABI_CWindows_CGraphics_CHolographic_CIHolographicCamera* This,DOUBLE value) {
    return This->lpVtbl->SetFarPlaneDistance(This,value);
}
#endif
#ifdef WIDL_using_Windows_Graphics_Holographic
#define IID_IHolographicCamera IID___x_ABI_CWindows_CGraphics_CHolographic_CIHolographicCamera
#define IHolographicCameraVtbl __x_ABI_CWindows_CGraphics_CHolographic_CIHolographicCameraVtbl
#define IHolographicCamera __x_ABI_CWindows_CGraphics_CHolographic_CIHolographicCamera
#define IHolographicCamera_QueryInterface __x_ABI_CWindows_CGraphics_CHolographic_CIHolographicCamera_QueryInterface
#define IHolographicCamera_AddRef __x_ABI_CWindows_CGraphics_CHolographic_CIHolographicCamera_AddRef
#define IHolographicCamera_Release __x_ABI_CWindows_CGraphics_CHolographic_CIHolographicCamera_Release
#define IHolographicCamera_GetIids __x_ABI_CWindows_CGraphics_CHolographic_CIHolographicCamera_GetIids
#define IHolographicCamera_GetRuntimeClassName __x_ABI_CWindows_CGraphics_CHolographic_CIHolographicCamera_GetRuntimeClassName
#define IHolographicCamera_GetTrustLevel __x_ABI_CWindows_CGraphics_CHolographic_CIHolographicCamera_GetTrustLevel
#define IHolographicCamera_get_RenderTargetSize __x_ABI_CWindows_CGraphics_CHolographic_CIHolographicCamera_get_RenderTargetSize
#define IHolographicCamera_get_ViewportScaleFactor __x_ABI_CWindows_CGraphics_CHolographic_CIHolographicCamera_get_ViewportScaleFactor
#define IHolographicCamera_put_ViewportScaleFactor __x_ABI_CWindows_CGraphics_CHolographic_CIHolographicCamera_put_ViewportScaleFactor
#define IHolographicCamera_get_IsStereo __x_ABI_CWindows_CGraphics_CHolographic_CIHolographicCamera_get_IsStereo
#define IHolographicCamera_get_Id __x_ABI_CWindows_CGraphics_CHolographic_CIHolographicCamera_get_Id
#define IHolographicCamera_SetNearPlaneDistance __x_ABI_CWindows_CGraphics_CHolographic_CIHolographicCamera_SetNearPlaneDistance
#define IHolographicCamera_SetFarPlaneDistance __x_ABI_CWindows_CGraphics_CHolographic_CIHolographicCamera_SetFarPlaneDistance
#endif /* WIDL_using_Windows_Graphics_Holographic */
#endif

#endif

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

/*****************************************************************************
 * IHolographicCameraPose interface
 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x20000
#ifndef ____x_ABI_CWindows_CGraphics_CHolographic_CIHolographicCameraPose_INTERFACE_DEFINED__
#define ____x_ABI_CWindows_CGraphics_CHolographic_CIHolographicCameraPose_INTERFACE_DEFINED__

DEFINE_GUID(IID___x_ABI_CWindows_CGraphics_CHolographic_CIHolographicCameraPose, 0x0d7d7e30, 0x12de, 0x45bd, 0x91,0x2b, 0xc7,0xf6,0x56,0x15,0x99,0xd1);
#if defined(__cplusplus) && !defined(CINTERFACE)
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace Graphics {
            namespace Holographic {
                MIDL_INTERFACE("0d7d7e30-12de-45bd-912b-c7f6561599d1")
                IHolographicCameraPose : public IInspectable
                {
                    virtual HRESULT STDMETHODCALLTYPE get_HolographicCamera(
                        ABI::Windows::Graphics::Holographic::IHolographicCamera **value) = 0;

                    virtual HRESULT STDMETHODCALLTYPE get_Viewport(
                        ABI::Windows::Foundation::Rect *value) = 0;

                    virtual HRESULT STDMETHODCALLTYPE TryGetViewTransform(
                        ABI::Windows::Perception::Spatial::ISpatialCoordinateSystem *coordinate_system,
                        ABI::Windows::Foundation::IReference<ABI::Windows::Graphics::Holographic::HolographicStereoTransform > **value) = 0;

                    virtual HRESULT STDMETHODCALLTYPE get_ProjectionTransform(
                        ABI::Windows::Graphics::Holographic::HolographicStereoTransform *value) = 0;

                    virtual HRESULT STDMETHODCALLTYPE TryGetCullingFrustum(
                        ABI::Windows::Perception::Spatial::ISpatialCoordinateSystem *coordinate_system,
                        ABI::Windows::Foundation::IReference<ABI::Windows::Perception::Spatial::SpatialBoundingFrustum > **value) = 0;

                    virtual HRESULT STDMETHODCALLTYPE TryGetVisibleFrustum(
                        ABI::Windows::Perception::Spatial::ISpatialCoordinateSystem *coordinateSystem,
                        ABI::Windows::Foundation::IReference<ABI::Windows::Perception::Spatial::SpatialBoundingFrustum > **value) = 0;

                    virtual HRESULT STDMETHODCALLTYPE get_NearPlaneDistance(
                        DOUBLE *value) = 0;

                    virtual HRESULT STDMETHODCALLTYPE get_FarPlaneDistance(
                        DOUBLE *value) = 0;

                };
            }
        }
    }
}
extern "C" {
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(__x_ABI_CWindows_CGraphics_CHolographic_CIHolographicCameraPose, 0x0d7d7e30, 0x12de, 0x45bd, 0x91,0x2b, 0xc7,0xf6,0x56,0x15,0x99,0xd1)
#endif
#else
typedef struct __x_ABI_CWindows_CGraphics_CHolographic_CIHolographicCameraPoseVtbl {
    BEGIN_INTERFACE

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

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

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

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

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

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

    /*** IHolographicCameraPose methods ***/
    HRESULT (STDMETHODCALLTYPE *get_HolographicCamera)(
        __x_ABI_CWindows_CGraphics_CHolographic_CIHolographicCameraPose *This,
        __x_ABI_CWindows_CGraphics_CHolographic_CIHolographicCamera **value);

    HRESULT (STDMETHODCALLTYPE *get_Viewport)(
        __x_ABI_CWindows_CGraphics_CHolographic_CIHolographicCameraPose *This,
        __x_ABI_CWindows_CFoundation_CRect *value);

    HRESULT (STDMETHODCALLTYPE *TryGetViewTransform)(
        __x_ABI_CWindows_CGraphics_CHolographic_CIHolographicCameraPose *This,
        __x_ABI_CWindows_CPerception_CSpatial_CISpatialCoordinateSystem *coordinate_system,
        __FIReference_1_HolographicStereoTransform **value);

    HRESULT (STDMETHODCALLTYPE *get_ProjectionTransform)(
        __x_ABI_CWindows_CGraphics_CHolographic_CIHolographicCameraPose *This,
        __x_ABI_CWindows_CGraphics_CHolographic_CHolographicStereoTransform *value);

    HRESULT (STDMETHODCALLTYPE *TryGetCullingFrustum)(
        __x_ABI_CWindows_CGraphics_CHolographic_CIHolographicCameraPose *This,
        __x_ABI_CWindows_CPerception_CSpatial_CISpatialCoordinateSystem *coordinate_system,
        __FIReference_1_SpatialBoundingFrustum **value);

    HRESULT (STDMETHODCALLTYPE *TryGetVisibleFrustum)(
        __x_ABI_CWindows_CGraphics_CHolographic_CIHolographicCameraPose *This,
        __x_ABI_CWindows_CPerception_CSpatial_CISpatialCoordinateSystem *coordinateSystem,
        __FIReference_1_SpatialBoundingFrustum **value);

    HRESULT (STDMETHODCALLTYPE *get_NearPlaneDistance)(
        __x_ABI_CWindows_CGraphics_CHolographic_CIHolographicCameraPose *This,
        DOUBLE *value);

    HRESULT (STDMETHODCALLTYPE *get_FarPlaneDistance)(
        __x_ABI_CWindows_CGraphics_CHolographic_CIHolographicCameraPose *This,
        DOUBLE *value);

    END_INTERFACE
} __x_ABI_CWindows_CGraphics_CHolographic_CIHolographicCameraPoseVtbl;

interface __x_ABI_CWindows_CGraphics_CHolographic_CIHolographicCameraPose {
    CONST_VTBL __x_ABI_CWindows_CGraphics_CHolographic_CIHolographicCameraPoseVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define __x_ABI_CWindows_CGraphics_CHolographic_CIHolographicCameraPose_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define __x_ABI_CWindows_CGraphics_CHolographic_CIHolographicCameraPose_AddRef(This) (This)->lpVtbl->AddRef(This)
#define __x_ABI_CWindows_CGraphics_CHolographic_CIHolographicCameraPose_Release(This) (This)->lpVtbl->Release(This)
/*** IInspectable methods ***/
#define __x_ABI_CWindows_CGraphics_CHolographic_CIHolographicCameraPose_GetIids(This,iidCount,iids) (This)->lpVtbl->GetIids(This,iidCount,iids)
#define __x_ABI_CWindows_CGraphics_CHolographic_CIHolographicCameraPose_GetRuntimeClassName(This,className) (This)->lpVtbl->GetRuntimeClassName(This,className)
#define __x_ABI_CWindows_CGraphics_CHolographic_CIHolographicCameraPose_GetTrustLevel(This,trustLevel) (This)->lpVtbl->GetTrustLevel(This,trustLevel)
/*** IHolographicCameraPose methods ***/
#define __x_ABI_CWindows_CGraphics_CHolographic_CIHolographicCameraPose_get_HolographicCamera(This,value) (This)->lpVtbl->get_HolographicCamera(This,value)
#define __x_ABI_CWindows_CGraphics_CHolographic_CIHolographicCameraPose_get_Viewport(This,value) (This)->lpVtbl->get_Viewport(This,value)
#define __x_ABI_CWindows_CGraphics_CHolographic_CIHolographicCameraPose_TryGetViewTransform(This,coordinate_system,value) (This)->lpVtbl->TryGetViewTransform(This,coordinate_system,value)
#define __x_ABI_CWindows_CGraphics_CHolographic_CIHolographicCameraPose_get_ProjectionTransform(This,value) (This)->lpVtbl->get_ProjectionTransform(This,value)
#define __x_ABI_CWindows_CGraphics_CHolographic_CIHolographicCameraPose_TryGetCullingFrustum(This,coordinate_system,value) (This)->lpVtbl->TryGetCullingFrustum(This,coordinate_system,value)
#define __x_ABI_CWindows_CGraphics_CHolographic_CIHolographicCameraPose_TryGetVisibleFrustum(This,coordinateSystem,value) (This)->lpVtbl->TryGetVisibleFrustum(This,coordinateSystem,value)
#define __x_ABI_CWindows_CGraphics_CHolographic_CIHolographicCameraPose_get_NearPlaneDistance(This,value) (This)->lpVtbl->get_NearPlaneDistance(This,value)
#define __x_ABI_CWindows_CGraphics_CHolographic_CIHolographicCameraPose_get_FarPlaneDistance(This,value) (This)->lpVtbl->get_FarPlaneDistance(This,value)
#else
/*** IUnknown methods ***/
static inline HRESULT __x_ABI_CWindows_CGraphics_CHolographic_CIHolographicCameraPose_QueryInterface(__x_ABI_CWindows_CGraphics_CHolographic_CIHolographicCameraPose* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG __x_ABI_CWindows_CGraphics_CHolographic_CIHolographicCameraPose_AddRef(__x_ABI_CWindows_CGraphics_CHolographic_CIHolographicCameraPose* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG __x_ABI_CWindows_CGraphics_CHolographic_CIHolographicCameraPose_Release(__x_ABI_CWindows_CGraphics_CHolographic_CIHolographicCameraPose* This) {
    return This->lpVtbl->Release(This);
}
/*** IInspectable methods ***/
static inline HRESULT __x_ABI_CWindows_CGraphics_CHolographic_CIHolographicCameraPose_GetIids(__x_ABI_CWindows_CGraphics_CHolographic_CIHolographicCameraPose* This,ULONG *iidCount,IID **iids) {
    return This->lpVtbl->GetIids(This,iidCount,iids);
}
static inline HRESULT __x_ABI_CWindows_CGraphics_CHolographic_CIHolographicCameraPose_GetRuntimeClassName(__x_ABI_CWindows_CGraphics_CHolographic_CIHolographicCameraPose* This,HSTRING *className) {
    return This->lpVtbl->GetRuntimeClassName(This,className);
}
static inline HRESULT __x_ABI_CWindows_CGraphics_CHolographic_CIHolographicCameraPose_GetTrustLevel(__x_ABI_CWindows_CGraphics_CHolographic_CIHolographicCameraPose* This,TrustLevel *trustLevel) {
    return This->lpVtbl->GetTrustLevel(This,trustLevel);
}
/*** IHolographicCameraPose methods ***/
static inline HRESULT __x_ABI_CWindows_CGraphics_CHolographic_CIHolographicCameraPose_get_HolographicCamera(__x_ABI_CWindows_CGraphics_CHolographic_CIHolographicCameraPose* This,__x_ABI_CWindows_CGraphics_CHolographic_CIHolographicCamera **value) {
    return This->lpVtbl->get_HolographicCamera(This,value);
}
static inline HRESULT __x_ABI_CWindows_CGraphics_CHolographic_CIHolographicCameraPose_get_Viewport(__x_ABI_CWindows_CGraphics_CHolographic_CIHolographicCameraPose* This,__x_ABI_CWindows_CFoundation_CRect *value) {
    return This->lpVtbl->get_Viewport(This,value);
}
static inline HRESULT __x_ABI_CWindows_CGraphics_CHolographic_CIHolographicCameraPose_TryGetViewTransform(__x_ABI_CWindows_CGraphics_CHolographic_CIHolographicCameraPose* This,__x_ABI_CWindows_CPerception_CSpatial_CISpatialCoordinateSystem *coordinate_system,__FIReference_1_HolographicStereoTransform **value) {
    return This->lpVtbl->TryGetViewTransform(This,coordinate_system,value);
}
static inline HRESULT __x_ABI_CWindows_CGraphics_CHolographic_CIHolographicCameraPose_get_ProjectionTransform(__x_ABI_CWindows_CGraphics_CHolographic_CIHolographicCameraPose* This,__x_ABI_CWindows_CGraphics_CHolographic_CHolographicStereoTransform *value) {
    return This->lpVtbl->get_ProjectionTransform(This,value);
}
static inline HRESULT __x_ABI_CWindows_CGraphics_CHolographic_CIHolographicCameraPose_TryGetCullingFrustum(__x_ABI_CWindows_CGraphics_CHolographic_CIHolographicCameraPose* This,__x_ABI_CWindows_CPerception_CSpatial_CISpatialCoordinateSystem *coordinate_system,__FIReference_1_SpatialBoundingFrustum **value) {
    return This->lpVtbl->TryGetCullingFrustum(This,coordinate_system,value);
}
static inline HRESULT __x_ABI_CWindows_CGraphics_CHolographic_CIHolographicCameraPose_TryGetVisibleFrustum(__x_ABI_CWindows_CGraphics_CHolographic_CIHolographicCameraPose* This,__x_ABI_CWindows_CPerception_CSpatial_CISpatialCoordinateSystem *coordinateSystem,__FIReference_1_SpatialBoundingFrustum **value) {
    return This->lpVtbl->TryGetVisibleFrustum(This,coordinateSystem,value);
}
static inline HRESULT __x_ABI_CWindows_CGraphics_CHolographic_CIHolographicCameraPose_get_NearPlaneDistance(__x_ABI_CWindows_CGraphics_CHolographic_CIHolographicCameraPose* This,DOUBLE *value) {
    return This->lpVtbl->get_NearPlaneDistance(This,value);
}
static inline HRESULT __x_ABI_CWindows_CGraphics_CHolographic_CIHolographicCameraPose_get_FarPlaneDistance(__x_ABI_CWindows_CGraphics_CHolographic_CIHolographicCameraPose* This,DOUBLE *value) {
    return This->lpVtbl->get_FarPlaneDistance(This,value);
}
#endif
#ifdef WIDL_using_Windows_Graphics_Holographic
#define IID_IHolographicCameraPose IID___x_ABI_CWindows_CGraphics_CHolographic_CIHolographicCameraPose
#define IHolographicCameraPoseVtbl __x_ABI_CWindows_CGraphics_CHolographic_CIHolographicCameraPoseVtbl
#define IHolographicCameraPose __x_ABI_CWindows_CGraphics_CHolographic_CIHolographicCameraPose
#define IHolographicCameraPose_QueryInterface __x_ABI_CWindows_CGraphics_CHolographic_CIHolographicCameraPose_QueryInterface
#define IHolographicCameraPose_AddRef __x_ABI_CWindows_CGraphics_CHolographic_CIHolographicCameraPose_AddRef
#define IHolographicCameraPose_Release __x_ABI_CWindows_CGraphics_CHolographic_CIHolographicCameraPose_Release
#define IHolographicCameraPose_GetIids __x_ABI_CWindows_CGraphics_CHolographic_CIHolographicCameraPose_GetIids
#define IHolographicCameraPose_GetRuntimeClassName __x_ABI_CWindows_CGraphics_CHolographic_CIHolographicCameraPose_GetRuntimeClassName
#define IHolographicCameraPose_GetTrustLevel __x_ABI_CWindows_CGraphics_CHolographic_CIHolographicCameraPose_GetTrustLevel
#define IHolographicCameraPose_get_HolographicCamera __x_ABI_CWindows_CGraphics_CHolographic_CIHolographicCameraPose_get_HolographicCamera
#define IHolographicCameraPose_get_Viewport __x_ABI_CWindows_CGraphics_CHolographic_CIHolographicCameraPose_get_Viewport
#define IHolographicCameraPose_TryGetViewTransform __x_ABI_CWindows_CGraphics_CHolographic_CIHolographicCameraPose_TryGetViewTransform
#define IHolographicCameraPose_get_ProjectionTransform __x_ABI_CWindows_CGraphics_CHolographic_CIHolographicCameraPose_get_ProjectionTransform
#define IHolographicCameraPose_TryGetCullingFrustum __x_ABI_CWindows_CGraphics_CHolographic_CIHolographicCameraPose_TryGetCullingFrustum
#define IHolographicCameraPose_TryGetVisibleFrustum __x_ABI_CWindows_CGraphics_CHolographic_CIHolographicCameraPose_TryGetVisibleFrustum
#define IHolographicCameraPose_get_NearPlaneDistance __x_ABI_CWindows_CGraphics_CHolographic_CIHolographicCameraPose_get_NearPlaneDistance
#define IHolographicCameraPose_get_FarPlaneDistance __x_ABI_CWindows_CGraphics_CHolographic_CIHolographicCameraPose_get_FarPlaneDistance
#endif /* WIDL_using_Windows_Graphics_Holographic */
#endif

#endif

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

/*****************************************************************************
 * IHolographicCameraRenderingParameters interface
 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x20000
#ifndef ____x_ABI_CWindows_CGraphics_CHolographic_CIHolographicCameraRenderingParameters_INTERFACE_DEFINED__
#define ____x_ABI_CWindows_CGraphics_CHolographic_CIHolographicCameraRenderingParameters_INTERFACE_DEFINED__

DEFINE_GUID(IID___x_ABI_CWindows_CGraphics_CHolographic_CIHolographicCameraRenderingParameters, 0x8eac2ed1, 0x5bf4, 0x4e16, 0x82,0x36, 0xae,0x08,0x00,0xc1,0x1d,0x0d);
#if defined(__cplusplus) && !defined(CINTERFACE)
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace Graphics {
            namespace Holographic {
                MIDL_INTERFACE("8eac2ed1-5bf4-4e16-8236-ae0800c11d0d")
                IHolographicCameraRenderingParameters : public IInspectable
                {
                    virtual HRESULT STDMETHODCALLTYPE SetFocusPoint(
                        ABI::Windows::Perception::Spatial::ISpatialCoordinateSystem *coordinate_system,
                        ABI::Windows::Foundation::Numerics::Vector3 position) = 0;

                    virtual HRESULT STDMETHODCALLTYPE SetFocusPointWithNormal(
                        ABI::Windows::Perception::Spatial::ISpatialCoordinateSystem *coordinate_system,
                        ABI::Windows::Foundation::Numerics::Vector3 position,
                        ABI::Windows::Foundation::Numerics::Vector3 normal) = 0;

                    virtual HRESULT STDMETHODCALLTYPE SetFocusPointWithNormalLinearVelocity(
                        ABI::Windows::Perception::Spatial::ISpatialCoordinateSystem *coordinate_system,
                        ABI::Windows::Foundation::Numerics::Vector3 position,
                        ABI::Windows::Foundation::Numerics::Vector3 normal,
                        ABI::Windows::Foundation::Numerics::Vector3 linearVelocity) = 0;

                    virtual HRESULT STDMETHODCALLTYPE get_Direct3D11Device(
                        ABI::Windows::Graphics::DirectX::Direct3D11::IDirect3DDevice **value) = 0;

                    virtual HRESULT STDMETHODCALLTYPE get_Direct3D11BackBuffer(
                        ABI::Windows::Graphics::DirectX::Direct3D11::IDirect3DSurface **value) = 0;

                };
            }
        }
    }
}
extern "C" {
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(__x_ABI_CWindows_CGraphics_CHolographic_CIHolographicCameraRenderingParameters, 0x8eac2ed1, 0x5bf4, 0x4e16, 0x82,0x36, 0xae,0x08,0x00,0xc1,0x1d,0x0d)
#endif
#else
typedef struct __x_ABI_CWindows_CGraphics_CHolographic_CIHolographicCameraRenderingParametersVtbl {
    BEGIN_INTERFACE

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

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

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

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

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

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

    /*** IHolographicCameraRenderingParameters methods ***/
    HRESULT (STDMETHODCALLTYPE *SetFocusPoint)(
        __x_ABI_CWindows_CGraphics_CHolographic_CIHolographicCameraRenderingParameters *This,
        __x_ABI_CWindows_CPerception_CSpatial_CISpatialCoordinateSystem *coordinate_system,
        __x_ABI_CWindows_CFoundation_CNumerics_CVector3 position);

    HRESULT (STDMETHODCALLTYPE *SetFocusPointWithNormal)(
        __x_ABI_CWindows_CGraphics_CHolographic_CIHolographicCameraRenderingParameters *This,
        __x_ABI_CWindows_CPerception_CSpatial_CISpatialCoordinateSystem *coordinate_system,
        __x_ABI_CWindows_CFoundation_CNumerics_CVector3 position,
        __x_ABI_CWindows_CFoundation_CNumerics_CVector3 normal);

    HRESULT (STDMETHODCALLTYPE *SetFocusPointWithNormalLinearVelocity)(
        __x_ABI_CWindows_CGraphics_CHolographic_CIHolographicCameraRenderingParameters *This,
        __x_ABI_CWindows_CPerception_CSpatial_CISpatialCoordinateSystem *coordinate_system,
        __x_ABI_CWindows_CFoundation_CNumerics_CVector3 position,
        __x_ABI_CWindows_CFoundation_CNumerics_CVector3 normal,
        __x_ABI_CWindows_CFoundation_CNumerics_CVector3 linearVelocity);

    HRESULT (STDMETHODCALLTYPE *get_Direct3D11Device)(
        __x_ABI_CWindows_CGraphics_CHolographic_CIHolographicCameraRenderingParameters *This,
        __x_ABI_CWindows_CGraphics_CDirectX_CDirect3D11_CIDirect3DDevice **value);

    HRESULT (STDMETHODCALLTYPE *get_Direct3D11BackBuffer)(
        __x_ABI_CWindows_CGraphics_CHolographic_CIHolographicCameraRenderingParameters *This,
        __x_ABI_CWindows_CGraphics_CDirectX_CDirect3D11_CIDirect3DSurface **value);

    END_INTERFACE
} __x_ABI_CWindows_CGraphics_CHolographic_CIHolographicCameraRenderingParametersVtbl;

interface __x_ABI_CWindows_CGraphics_CHolographic_CIHolographicCameraRenderingParameters {
    CONST_VTBL __x_ABI_CWindows_CGraphics_CHolographic_CIHolographicCameraRenderingParametersVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define __x_ABI_CWindows_CGraphics_CHolographic_CIHolographicCameraRenderingParameters_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define __x_ABI_CWindows_CGraphics_CHolographic_CIHolographicCameraRenderingParameters_AddRef(This) (This)->lpVtbl->AddRef(This)
#define __x_ABI_CWindows_CGraphics_CHolographic_CIHolographicCameraRenderingParameters_Release(This) (This)->lpVtbl->Release(This)
/*** IInspectable methods ***/
#define __x_ABI_CWindows_CGraphics_CHolographic_CIHolographicCameraRenderingParameters_GetIids(This,iidCount,iids) (This)->lpVtbl->GetIids(This,iidCount,iids)
#define __x_ABI_CWindows_CGraphics_CHolographic_CIHolographicCameraRenderingParameters_GetRuntimeClassName(This,className) (This)->lpVtbl->GetRuntimeClassName(This,className)
#define __x_ABI_CWindows_CGraphics_CHolographic_CIHolographicCameraRenderingParameters_GetTrustLevel(This,trustLevel) (This)->lpVtbl->GetTrustLevel(This,trustLevel)
/*** IHolographicCameraRenderingParameters methods ***/
#define __x_ABI_CWindows_CGraphics_CHolographic_CIHolographicCameraRenderingParameters_SetFocusPoint(This,coordinate_system,position) (This)->lpVtbl->SetFocusPoint(This,coordinate_system,position)
#define __x_ABI_CWindows_CGraphics_CHolographic_CIHolographicCameraRenderingParameters_SetFocusPointWithNormal(This,coordinate_system,position,normal) (This)->lpVtbl->SetFocusPointWithNormal(This,coordinate_system,position,normal)
#define __x_ABI_CWindows_CGraphics_CHolographic_CIHolographicCameraRenderingParameters_SetFocusPointWithNormalLinearVelocity(This,coordinate_system,position,normal,linearVelocity) (This)->lpVtbl->SetFocusPointWithNormalLinearVelocity(This,coordinate_system,position,normal,linearVelocity)
#define __x_ABI_CWindows_CGraphics_CHolographic_CIHolographicCameraRenderingParameters_get_Direct3D11Device(This,value) (This)->lpVtbl->get_Direct3D11Device(This,value)
#define __x_ABI_CWindows_CGraphics_CHolographic_CIHolographicCameraRenderingParameters_get_Direct3D11BackBuffer(This,value) (This)->lpVtbl->get_Direct3D11BackBuffer(This,value)
#else
/*** IUnknown methods ***/
static inline HRESULT __x_ABI_CWindows_CGraphics_CHolographic_CIHolographicCameraRenderingParameters_QueryInterface(__x_ABI_CWindows_CGraphics_CHolographic_CIHolographicCameraRenderingParameters* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG __x_ABI_CWindows_CGraphics_CHolographic_CIHolographicCameraRenderingParameters_AddRef(__x_ABI_CWindows_CGraphics_CHolographic_CIHolographicCameraRenderingParameters* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG __x_ABI_CWindows_CGraphics_CHolographic_CIHolographicCameraRenderingParameters_Release(__x_ABI_CWindows_CGraphics_CHolographic_CIHolographicCameraRenderingParameters* This) {
    return This->lpVtbl->Release(This);
}
/*** IInspectable methods ***/
static inline HRESULT __x_ABI_CWindows_CGraphics_CHolographic_CIHolographicCameraRenderingParameters_GetIids(__x_ABI_CWindows_CGraphics_CHolographic_CIHolographicCameraRenderingParameters* This,ULONG *iidCount,IID **iids) {
    return This->lpVtbl->GetIids(This,iidCount,iids);
}
static inline HRESULT __x_ABI_CWindows_CGraphics_CHolographic_CIHolographicCameraRenderingParameters_GetRuntimeClassName(__x_ABI_CWindows_CGraphics_CHolographic_CIHolographicCameraRenderingParameters* This,HSTRING *className) {
    return This->lpVtbl->GetRuntimeClassName(This,className);
}
static inline HRESULT __x_ABI_CWindows_CGraphics_CHolographic_CIHolographicCameraRenderingParameters_GetTrustLevel(__x_ABI_CWindows_CGraphics_CHolographic_CIHolographicCameraRenderingParameters* This,TrustLevel *trustLevel) {
    return This->lpVtbl->GetTrustLevel(This,trustLevel);
}
/*** IHolographicCameraRenderingParameters methods ***/
static inline HRESULT __x_ABI_CWindows_CGraphics_CHolographic_CIHolographicCameraRenderingParameters_SetFocusPoint(__x_ABI_CWindows_CGraphics_CHolographic_CIHolographicCameraRenderingParameters* This,__x_ABI_CWindows_CPerception_CSpatial_CISpatialCoordinateSystem *coordinate_system,__x_ABI_CWindows_CFoundation_CNumerics_CVector3 position) {
    return This->lpVtbl->SetFocusPoint(This,coordinate_system,position);
}
static inline HRESULT __x_ABI_CWindows_CGraphics_CHolographic_CIHolographicCameraRenderingParameters_SetFocusPointWithNormal(__x_ABI_CWindows_CGraphics_CHolographic_CIHolographicCameraRenderingParameters* This,__x_ABI_CWindows_CPerception_CSpatial_CISpatialCoordinateSystem *coordinate_system,__x_ABI_CWindows_CFoundation_CNumerics_CVector3 position,__x_ABI_CWindows_CFoundation_CNumerics_CVector3 normal) {
    return This->lpVtbl->SetFocusPointWithNormal(This,coordinate_system,position,normal);
}
static inline HRESULT __x_ABI_CWindows_CGraphics_CHolographic_CIHolographicCameraRenderingParameters_SetFocusPointWithNormalLinearVelocity(__x_ABI_CWindows_CGraphics_CHolographic_CIHolographicCameraRenderingParameters* This,__x_ABI_CWindows_CPerception_CSpatial_CISpatialCoordinateSystem *coordinate_system,__x_ABI_CWindows_CFoundation_CNumerics_CVector3 position,__x_ABI_CWindows_CFoundation_CNumerics_CVector3 normal,__x_ABI_CWindows_CFoundation_CNumerics_CVector3 linearVelocity) {
    return This->lpVtbl->SetFocusPointWithNormalLinearVelocity(This,coordinate_system,position,normal,linearVelocity);
}
static inline HRESULT __x_ABI_CWindows_CGraphics_CHolographic_CIHolographicCameraRenderingParameters_get_Direct3D11Device(__x_ABI_CWindows_CGraphics_CHolographic_CIHolographicCameraRenderingParameters* This,__x_ABI_CWindows_CGraphics_CDirectX_CDirect3D11_CIDirect3DDevice **value) {
    return This->lpVtbl->get_Direct3D11Device(This,value);
}
static inline HRESULT __x_ABI_CWindows_CGraphics_CHolographic_CIHolographicCameraRenderingParameters_get_Direct3D11BackBuffer(__x_ABI_CWindows_CGraphics_CHolographic_CIHolographicCameraRenderingParameters* This,__x_ABI_CWindows_CGraphics_CDirectX_CDirect3D11_CIDirect3DSurface **value) {
    return This->lpVtbl->get_Direct3D11BackBuffer(This,value);
}
#endif
#ifdef WIDL_using_Windows_Graphics_Holographic
#define IID_IHolographicCameraRenderingParameters IID___x_ABI_CWindows_CGraphics_CHolographic_CIHolographicCameraRenderingParameters
#define IHolographicCameraRenderingParametersVtbl __x_ABI_CWindows_CGraphics_CHolographic_CIHolographicCameraRenderingParametersVtbl
#define IHolographicCameraRenderingParameters __x_ABI_CWindows_CGraphics_CHolographic_CIHolographicCameraRenderingParameters
#define IHolographicCameraRenderingParameters_QueryInterface __x_ABI_CWindows_CGraphics_CHolographic_CIHolographicCameraRenderingParameters_QueryInterface
#define IHolographicCameraRenderingParameters_AddRef __x_ABI_CWindows_CGraphics_CHolographic_CIHolographicCameraRenderingParameters_AddRef
#define IHolographicCameraRenderingParameters_Release __x_ABI_CWindows_CGraphics_CHolographic_CIHolographicCameraRenderingParameters_Release
#define IHolographicCameraRenderingParameters_GetIids __x_ABI_CWindows_CGraphics_CHolographic_CIHolographicCameraRenderingParameters_GetIids
#define IHolographicCameraRenderingParameters_GetRuntimeClassName __x_ABI_CWindows_CGraphics_CHolographic_CIHolographicCameraRenderingParameters_GetRuntimeClassName
#define IHolographicCameraRenderingParameters_GetTrustLevel __x_ABI_CWindows_CGraphics_CHolographic_CIHolographicCameraRenderingParameters_GetTrustLevel
#define IHolographicCameraRenderingParameters_SetFocusPoint __x_ABI_CWindows_CGraphics_CHolographic_CIHolographicCameraRenderingParameters_SetFocusPoint
#define IHolographicCameraRenderingParameters_SetFocusPointWithNormal __x_ABI_CWindows_CGraphics_CHolographic_CIHolographicCameraRenderingParameters_SetFocusPointWithNormal
#define IHolographicCameraRenderingParameters_SetFocusPointWithNormalLinearVelocity __x_ABI_CWindows_CGraphics_CHolographic_CIHolographicCameraRenderingParameters_SetFocusPointWithNormalLinearVelocity
#define IHolographicCameraRenderingParameters_get_Direct3D11Device __x_ABI_CWindows_CGraphics_CHolographic_CIHolographicCameraRenderingParameters_get_Direct3D11Device
#define IHolographicCameraRenderingParameters_get_Direct3D11BackBuffer __x_ABI_CWindows_CGraphics_CHolographic_CIHolographicCameraRenderingParameters_get_Direct3D11BackBuffer
#endif /* WIDL_using_Windows_Graphics_Holographic */
#endif

#endif

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

/*****************************************************************************
 * IHolographicFrame interface
 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x20000
#ifndef ____x_ABI_CWindows_CGraphics_CHolographic_CIHolographicFrame_INTERFACE_DEFINED__
#define ____x_ABI_CWindows_CGraphics_CHolographic_CIHolographicFrame_INTERFACE_DEFINED__

DEFINE_GUID(IID___x_ABI_CWindows_CGraphics_CHolographic_CIHolographicFrame, 0xc6988eb6, 0xa8b9, 0x3054, 0xa6,0xeb, 0xd6,0x24,0xb6,0x53,0x63,0x75);
#if defined(__cplusplus) && !defined(CINTERFACE)
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace Graphics {
            namespace Holographic {
                MIDL_INTERFACE("c6988eb6-a8b9-3054-a6eb-d624b6536375")
                IHolographicFrame : public IInspectable
                {
                    virtual HRESULT STDMETHODCALLTYPE get_AddedCameras(
                        ABI::Windows::Foundation::Collections::IVectorView<ABI::Windows::Graphics::Holographic::HolographicCamera* > **value) = 0;

                    virtual HRESULT STDMETHODCALLTYPE get_RemovedCameras(
                        ABI::Windows::Foundation::Collections::IVectorView<ABI::Windows::Graphics::Holographic::HolographicCamera* > **value) = 0;

                    virtual HRESULT STDMETHODCALLTYPE GetRenderingParameters(
                        ABI::Windows::Graphics::Holographic::IHolographicCameraPose *camera_pose,
                        ABI::Windows::Graphics::Holographic::IHolographicCameraRenderingParameters **value) = 0;

                    virtual HRESULT STDMETHODCALLTYPE get_Duration(
                        ABI::Windows::Foundation::TimeSpan *value) = 0;

                    virtual HRESULT STDMETHODCALLTYPE get_CurrentPrediction(
                        ABI::Windows::Graphics::Holographic::IHolographicFramePrediction **value) = 0;

                    virtual HRESULT STDMETHODCALLTYPE UpdateCurrentPrediction(
                        ) = 0;

                    virtual HRESULT STDMETHODCALLTYPE PresentUsingCurrentPrediction(
                        ABI::Windows::Graphics::Holographic::HolographicFramePresentResult *result) = 0;

                    virtual HRESULT STDMETHODCALLTYPE PresentUsingCurrentPredictionWithBehavior(
                        ABI::Windows::Graphics::Holographic::HolographicFramePresentWaitBehavior wait_behavior,
                        ABI::Windows::Graphics::Holographic::HolographicFramePresentResult *result) = 0;

                    virtual HRESULT STDMETHODCALLTYPE WaitForFrameToFinish(
                        ) = 0;

                };
            }
        }
    }
}
extern "C" {
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(__x_ABI_CWindows_CGraphics_CHolographic_CIHolographicFrame, 0xc6988eb6, 0xa8b9, 0x3054, 0xa6,0xeb, 0xd6,0x24,0xb6,0x53,0x63,0x75)
#endif
#else
typedef struct __x_ABI_CWindows_CGraphics_CHolographic_CIHolographicFrameVtbl {
    BEGIN_INTERFACE

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

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

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

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

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

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

    /*** IHolographicFrame methods ***/
    HRESULT (STDMETHODCALLTYPE *get_AddedCameras)(
        __x_ABI_CWindows_CGraphics_CHolographic_CIHolographicFrame *This,
        __FIVectorView_1_Windows__CGraphics__CHolographic__CHolographicCamera **value);

    HRESULT (STDMETHODCALLTYPE *get_RemovedCameras)(
        __x_ABI_CWindows_CGraphics_CHolographic_CIHolographicFrame *This,
        __FIVectorView_1_Windows__CGraphics__CHolographic__CHolographicCamera **value);

    HRESULT (STDMETHODCALLTYPE *GetRenderingParameters)(
        __x_ABI_CWindows_CGraphics_CHolographic_CIHolographicFrame *This,
        __x_ABI_CWindows_CGraphics_CHolographic_CIHolographicCameraPose *camera_pose,
        __x_ABI_CWindows_CGraphics_CHolographic_CIHolographicCameraRenderingParameters **value);

    HRESULT (STDMETHODCALLTYPE *get_Duration)(
        __x_ABI_CWindows_CGraphics_CHolographic_CIHolographicFrame *This,
        __x_ABI_CWindows_CFoundation_CTimeSpan *value);

    HRESULT (STDMETHODCALLTYPE *get_CurrentPrediction)(
        __x_ABI_CWindows_CGraphics_CHolographic_CIHolographicFrame *This,
        __x_ABI_CWindows_CGraphics_CHolographic_CIHolographicFramePrediction **value);

    HRESULT (STDMETHODCALLTYPE *UpdateCurrentPrediction)(
        __x_ABI_CWindows_CGraphics_CHolographic_CIHolographicFrame *This);

    HRESULT (STDMETHODCALLTYPE *PresentUsingCurrentPrediction)(
        __x_ABI_CWindows_CGraphics_CHolographic_CIHolographicFrame *This,
        __x_ABI_CWindows_CGraphics_CHolographic_CHolographicFramePresentResult *result);

    HRESULT (STDMETHODCALLTYPE *PresentUsingCurrentPredictionWithBehavior)(
        __x_ABI_CWindows_CGraphics_CHolographic_CIHolographicFrame *This,
        __x_ABI_CWindows_CGraphics_CHolographic_CHolographicFramePresentWaitBehavior wait_behavior,
        __x_ABI_CWindows_CGraphics_CHolographic_CHolographicFramePresentResult *result);

    HRESULT (STDMETHODCALLTYPE *WaitForFrameToFinish)(
        __x_ABI_CWindows_CGraphics_CHolographic_CIHolographicFrame *This);

    END_INTERFACE
} __x_ABI_CWindows_CGraphics_CHolographic_CIHolographicFrameVtbl;

interface __x_ABI_CWindows_CGraphics_CHolographic_CIHolographicFrame {
    CONST_VTBL __x_ABI_CWindows_CGraphics_CHolographic_CIHolographicFrameVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define __x_ABI_CWindows_CGraphics_CHolographic_CIHolographicFrame_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define __x_ABI_CWindows_CGraphics_CHolographic_CIHolographicFrame_AddRef(This) (This)->lpVtbl->AddRef(This)
#define __x_ABI_CWindows_CGraphics_CHolographic_CIHolographicFrame_Release(This) (This)->lpVtbl->Release(This)
/*** IInspectable methods ***/
#define __x_ABI_CWindows_CGraphics_CHolographic_CIHolographicFrame_GetIids(This,iidCount,iids) (This)->lpVtbl->GetIids(This,iidCount,iids)
#define __x_ABI_CWindows_CGraphics_CHolographic_CIHolographicFrame_GetRuntimeClassName(This,className) (This)->lpVtbl->GetRuntimeClassName(This,className)
#define __x_ABI_CWindows_CGraphics_CHolographic_CIHolographicFrame_GetTrustLevel(This,trustLevel) (This)->lpVtbl->GetTrustLevel(This,trustLevel)
/*** IHolographicFrame methods ***/
#define __x_ABI_CWindows_CGraphics_CHolographic_CIHolographicFrame_get_AddedCameras(This,value) (This)->lpVtbl->get_AddedCameras(This,value)
#define __x_ABI_CWindows_CGraphics_CHolographic_CIHolographicFrame_get_RemovedCameras(This,value) (This)->lpVtbl->get_RemovedCameras(This,value)
#define __x_ABI_CWindows_CGraphics_CHolographic_CIHolographicFrame_GetRenderingParameters(This,camera_pose,value) (This)->lpVtbl->GetRenderingParameters(This,camera_pose,value)
#define __x_ABI_CWindows_CGraphics_CHolographic_CIHolographicFrame_get_Duration(This,value) (This)->lpVtbl->get_Duration(This,value)
#define __x_ABI_CWindows_CGraphics_CHolographic_CIHolographicFrame_get_CurrentPrediction(This,value) (This)->lpVtbl->get_CurrentPrediction(This,value)
#define __x_ABI_CWindows_CGraphics_CHolographic_CIHolographicFrame_UpdateCurrentPrediction(This) (This)->lpVtbl->UpdateCurrentPrediction(This)
#define __x_ABI_CWindows_CGraphics_CHolographic_CIHolographicFrame_PresentUsingCurrentPrediction(This,result) (This)->lpVtbl->PresentUsingCurrentPrediction(This,result)
#define __x_ABI_CWindows_CGraphics_CHolographic_CIHolographicFrame_PresentUsingCurrentPredictionWithBehavior(This,wait_behavior,result) (This)->lpVtbl->PresentUsingCurrentPredictionWithBehavior(This,wait_behavior,result)
#define __x_ABI_CWindows_CGraphics_CHolographic_CIHolographicFrame_WaitForFrameToFinish(This) (This)->lpVtbl->WaitForFrameToFinish(This)
#else
/*** IUnknown methods ***/
static inline HRESULT __x_ABI_CWindows_CGraphics_CHolographic_CIHolographicFrame_QueryInterface(__x_ABI_CWindows_CGraphics_CHolographic_CIHolographicFrame* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG __x_ABI_CWindows_CGraphics_CHolographic_CIHolographicFrame_AddRef(__x_ABI_CWindows_CGraphics_CHolographic_CIHolographicFrame* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG __x_ABI_CWindows_CGraphics_CHolographic_CIHolographicFrame_Release(__x_ABI_CWindows_CGraphics_CHolographic_CIHolographicFrame* This) {
    return This->lpVtbl->Release(This);
}
/*** IInspectable methods ***/
static inline HRESULT __x_ABI_CWindows_CGraphics_CHolographic_CIHolographicFrame_GetIids(__x_ABI_CWindows_CGraphics_CHolographic_CIHolographicFrame* This,ULONG *iidCount,IID **iids) {
    return This->lpVtbl->GetIids(This,iidCount,iids);
}
static inline HRESULT __x_ABI_CWindows_CGraphics_CHolographic_CIHolographicFrame_GetRuntimeClassName(__x_ABI_CWindows_CGraphics_CHolographic_CIHolographicFrame* This,HSTRING *className) {
    return This->lpVtbl->GetRuntimeClassName(This,className);
}
static inline HRESULT __x_ABI_CWindows_CGraphics_CHolographic_CIHolographicFrame_GetTrustLevel(__x_ABI_CWindows_CGraphics_CHolographic_CIHolographicFrame* This,TrustLevel *trustLevel) {
    return This->lpVtbl->GetTrustLevel(This,trustLevel);
}
/*** IHolographicFrame methods ***/
static inline HRESULT __x_ABI_CWindows_CGraphics_CHolographic_CIHolographicFrame_get_AddedCameras(__x_ABI_CWindows_CGraphics_CHolographic_CIHolographicFrame* This,__FIVectorView_1_Windows__CGraphics__CHolographic__CHolographicCamera **value) {
    return This->lpVtbl->get_AddedCameras(This,value);
}
static inline HRESULT __x_ABI_CWindows_CGraphics_CHolographic_CIHolographicFrame_get_RemovedCameras(__x_ABI_CWindows_CGraphics_CHolographic_CIHolographicFrame* This,__FIVectorView_1_Windows__CGraphics__CHolographic__CHolographicCamera **value) {
    return This->lpVtbl->get_RemovedCameras(This,value);
}
static inline HRESULT __x_ABI_CWindows_CGraphics_CHolographic_CIHolographicFrame_GetRenderingParameters(__x_ABI_CWindows_CGraphics_CHolographic_CIHolographicFrame* This,__x_ABI_CWindows_CGraphics_CHolographic_CIHolographicCameraPose *camera_pose,__x_ABI_CWindows_CGraphics_CHolographic_CIHolographicCameraRenderingParameters **value) {
    return This->lpVtbl->GetRenderingParameters(This,camera_pose,value);
}
static inline HRESULT __x_ABI_CWindows_CGraphics_CHolographic_CIHolographicFrame_get_Duration(__x_ABI_CWindows_CGraphics_CHolographic_CIHolographicFrame* This,__x_ABI_CWindows_CFoundation_CTimeSpan *value) {
    return This->lpVtbl->get_Duration(This,value);
}
static inline HRESULT __x_ABI_CWindows_CGraphics_CHolographic_CIHolographicFrame_get_CurrentPrediction(__x_ABI_CWindows_CGraphics_CHolographic_CIHolographicFrame* This,__x_ABI_CWindows_CGraphics_CHolographic_CIHolographicFramePrediction **value) {
    return This->lpVtbl->get_CurrentPrediction(This,value);
}
static inline HRESULT __x_ABI_CWindows_CGraphics_CHolographic_CIHolographicFrame_UpdateCurrentPrediction(__x_ABI_CWindows_CGraphics_CHolographic_CIHolographicFrame* This) {
    return This->lpVtbl->UpdateCurrentPrediction(This);
}
static inline HRESULT __x_ABI_CWindows_CGraphics_CHolographic_CIHolographicFrame_PresentUsingCurrentPrediction(__x_ABI_CWindows_CGraphics_CHolographic_CIHolographicFrame* This,__x_ABI_CWindows_CGraphics_CHolographic_CHolographicFramePresentResult *result) {
    return This->lpVtbl->PresentUsingCurrentPrediction(This,result);
}
static inline HRESULT __x_ABI_CWindows_CGraphics_CHolographic_CIHolographicFrame_PresentUsingCurrentPredictionWithBehavior(__x_ABI_CWindows_CGraphics_CHolographic_CIHolographicFrame* This,__x_ABI_CWindows_CGraphics_CHolographic_CHolographicFramePresentWaitBehavior wait_behavior,__x_ABI_CWindows_CGraphics_CHolographic_CHolographicFramePresentResult *result) {
    return This->lpVtbl->PresentUsingCurrentPredictionWithBehavior(This,wait_behavior,result);
}
static inline HRESULT __x_ABI_CWindows_CGraphics_CHolographic_CIHolographicFrame_WaitForFrameToFinish(__x_ABI_CWindows_CGraphics_CHolographic_CIHolographicFrame* This) {
    return This->lpVtbl->WaitForFrameToFinish(This);
}
#endif
#ifdef WIDL_using_Windows_Graphics_Holographic
#define IID_IHolographicFrame IID___x_ABI_CWindows_CGraphics_CHolographic_CIHolographicFrame
#define IHolographicFrameVtbl __x_ABI_CWindows_CGraphics_CHolographic_CIHolographicFrameVtbl
#define IHolographicFrame __x_ABI_CWindows_CGraphics_CHolographic_CIHolographicFrame
#define IHolographicFrame_QueryInterface __x_ABI_CWindows_CGraphics_CHolographic_CIHolographicFrame_QueryInterface
#define IHolographicFrame_AddRef __x_ABI_CWindows_CGraphics_CHolographic_CIHolographicFrame_AddRef
#define IHolographicFrame_Release __x_ABI_CWindows_CGraphics_CHolographic_CIHolographicFrame_Release
#define IHolographicFrame_GetIids __x_ABI_CWindows_CGraphics_CHolographic_CIHolographicFrame_GetIids
#define IHolographicFrame_GetRuntimeClassName __x_ABI_CWindows_CGraphics_CHolographic_CIHolographicFrame_GetRuntimeClassName
#define IHolographicFrame_GetTrustLevel __x_ABI_CWindows_CGraphics_CHolographic_CIHolographicFrame_GetTrustLevel
#define IHolographicFrame_get_AddedCameras __x_ABI_CWindows_CGraphics_CHolographic_CIHolographicFrame_get_AddedCameras
#define IHolographicFrame_get_RemovedCameras __x_ABI_CWindows_CGraphics_CHolographic_CIHolographicFrame_get_RemovedCameras
#define IHolographicFrame_GetRenderingParameters __x_ABI_CWindows_CGraphics_CHolographic_CIHolographicFrame_GetRenderingParameters
#define IHolographicFrame_get_Duration __x_ABI_CWindows_CGraphics_CHolographic_CIHolographicFrame_get_Duration
#define IHolographicFrame_get_CurrentPrediction __x_ABI_CWindows_CGraphics_CHolographic_CIHolographicFrame_get_CurrentPrediction
#define IHolographicFrame_UpdateCurrentPrediction __x_ABI_CWindows_CGraphics_CHolographic_CIHolographicFrame_UpdateCurrentPrediction
#define IHolographicFrame_PresentUsingCurrentPrediction __x_ABI_CWindows_CGraphics_CHolographic_CIHolographicFrame_PresentUsingCurrentPrediction
#define IHolographicFrame_PresentUsingCurrentPredictionWithBehavior __x_ABI_CWindows_CGraphics_CHolographic_CIHolographicFrame_PresentUsingCurrentPredictionWithBehavior
#define IHolographicFrame_WaitForFrameToFinish __x_ABI_CWindows_CGraphics_CHolographic_CIHolographicFrame_WaitForFrameToFinish
#endif /* WIDL_using_Windows_Graphics_Holographic */
#endif

#endif

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

/*****************************************************************************
 * IHolographicFramePrediction interface
 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x20000
#ifndef ____x_ABI_CWindows_CGraphics_CHolographic_CIHolographicFramePrediction_INTERFACE_DEFINED__
#define ____x_ABI_CWindows_CGraphics_CHolographic_CIHolographicFramePrediction_INTERFACE_DEFINED__

DEFINE_GUID(IID___x_ABI_CWindows_CGraphics_CHolographic_CIHolographicFramePrediction, 0x520f4de1, 0x5c0a, 0x4e79, 0xa8,0x1e, 0x6a,0xbe,0x02,0xbb,0x27,0x39);
#if defined(__cplusplus) && !defined(CINTERFACE)
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace Graphics {
            namespace Holographic {
                MIDL_INTERFACE("520f4de1-5c0a-4e79-a81e-6abe02bb2739")
                IHolographicFramePrediction : public IInspectable
                {
                    virtual HRESULT STDMETHODCALLTYPE get_CameraPoses(
                        ABI::Windows::Foundation::Collections::IVectorView<ABI::Windows::Graphics::Holographic::HolographicCameraPose* > **value) = 0;

                    virtual HRESULT STDMETHODCALLTYPE get_Timestamp(
                        ABI::Windows::Perception::IPerceptionTimestamp **value) = 0;

                };
            }
        }
    }
}
extern "C" {
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(__x_ABI_CWindows_CGraphics_CHolographic_CIHolographicFramePrediction, 0x520f4de1, 0x5c0a, 0x4e79, 0xa8,0x1e, 0x6a,0xbe,0x02,0xbb,0x27,0x39)
#endif
#else
typedef struct __x_ABI_CWindows_CGraphics_CHolographic_CIHolographicFramePredictionVtbl {
    BEGIN_INTERFACE

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

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

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

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

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

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

    /*** IHolographicFramePrediction methods ***/
    HRESULT (STDMETHODCALLTYPE *get_CameraPoses)(
        __x_ABI_CWindows_CGraphics_CHolographic_CIHolographicFramePrediction *This,
        __FIVectorView_1_Windows__CGraphics__CHolographic__CHolographicCameraPose **value);

    HRESULT (STDMETHODCALLTYPE *get_Timestamp)(
        __x_ABI_CWindows_CGraphics_CHolographic_CIHolographicFramePrediction *This,
        __x_ABI_CWindows_CPerception_CIPerceptionTimestamp **value);

    END_INTERFACE
} __x_ABI_CWindows_CGraphics_CHolographic_CIHolographicFramePredictionVtbl;

interface __x_ABI_CWindows_CGraphics_CHolographic_CIHolographicFramePrediction {
    CONST_VTBL __x_ABI_CWindows_CGraphics_CHolographic_CIHolographicFramePredictionVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define __x_ABI_CWindows_CGraphics_CHolographic_CIHolographicFramePrediction_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define __x_ABI_CWindows_CGraphics_CHolographic_CIHolographicFramePrediction_AddRef(This) (This)->lpVtbl->AddRef(This)
#define __x_ABI_CWindows_CGraphics_CHolographic_CIHolographicFramePrediction_Release(This) (This)->lpVtbl->Release(This)
/*** IInspectable methods ***/
#define __x_ABI_CWindows_CGraphics_CHolographic_CIHolographicFramePrediction_GetIids(This,iidCount,iids) (This)->lpVtbl->GetIids(This,iidCount,iids)
#define __x_ABI_CWindows_CGraphics_CHolographic_CIHolographicFramePrediction_GetRuntimeClassName(This,className) (This)->lpVtbl->GetRuntimeClassName(This,className)
#define __x_ABI_CWindows_CGraphics_CHolographic_CIHolographicFramePrediction_GetTrustLevel(This,trustLevel) (This)->lpVtbl->GetTrustLevel(This,trustLevel)
/*** IHolographicFramePrediction methods ***/
#define __x_ABI_CWindows_CGraphics_CHolographic_CIHolographicFramePrediction_get_CameraPoses(This,value) (This)->lpVtbl->get_CameraPoses(This,value)
#define __x_ABI_CWindows_CGraphics_CHolographic_CIHolographicFramePrediction_get_Timestamp(This,value) (This)->lpVtbl->get_Timestamp(This,value)
#else
/*** IUnknown methods ***/
static inline HRESULT __x_ABI_CWindows_CGraphics_CHolographic_CIHolographicFramePrediction_QueryInterface(__x_ABI_CWindows_CGraphics_CHolographic_CIHolographicFramePrediction* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG __x_ABI_CWindows_CGraphics_CHolographic_CIHolographicFramePrediction_AddRef(__x_ABI_CWindows_CGraphics_CHolographic_CIHolographicFramePrediction* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG __x_ABI_CWindows_CGraphics_CHolographic_CIHolographicFramePrediction_Release(__x_ABI_CWindows_CGraphics_CHolographic_CIHolographicFramePrediction* This) {
    return This->lpVtbl->Release(This);
}
/*** IInspectable methods ***/
static inline HRESULT __x_ABI_CWindows_CGraphics_CHolographic_CIHolographicFramePrediction_GetIids(__x_ABI_CWindows_CGraphics_CHolographic_CIHolographicFramePrediction* This,ULONG *iidCount,IID **iids) {
    return This->lpVtbl->GetIids(This,iidCount,iids);
}
static inline HRESULT __x_ABI_CWindows_CGraphics_CHolographic_CIHolographicFramePrediction_GetRuntimeClassName(__x_ABI_CWindows_CGraphics_CHolographic_CIHolographicFramePrediction* This,HSTRING *className) {
    return This->lpVtbl->GetRuntimeClassName(This,className);
}
static inline HRESULT __x_ABI_CWindows_CGraphics_CHolographic_CIHolographicFramePrediction_GetTrustLevel(__x_ABI_CWindows_CGraphics_CHolographic_CIHolographicFramePrediction* This,TrustLevel *trustLevel) {
    return This->lpVtbl->GetTrustLevel(This,trustLevel);
}
/*** IHolographicFramePrediction methods ***/
static inline HRESULT __x_ABI_CWindows_CGraphics_CHolographic_CIHolographicFramePrediction_get_CameraPoses(__x_ABI_CWindows_CGraphics_CHolographic_CIHolographicFramePrediction* This,__FIVectorView_1_Windows__CGraphics__CHolographic__CHolographicCameraPose **value) {
    return This->lpVtbl->get_CameraPoses(This,value);
}
static inline HRESULT __x_ABI_CWindows_CGraphics_CHolographic_CIHolographicFramePrediction_get_Timestamp(__x_ABI_CWindows_CGraphics_CHolographic_CIHolographicFramePrediction* This,__x_ABI_CWindows_CPerception_CIPerceptionTimestamp **value) {
    return This->lpVtbl->get_Timestamp(This,value);
}
#endif
#ifdef WIDL_using_Windows_Graphics_Holographic
#define IID_IHolographicFramePrediction IID___x_ABI_CWindows_CGraphics_CHolographic_CIHolographicFramePrediction
#define IHolographicFramePredictionVtbl __x_ABI_CWindows_CGraphics_CHolographic_CIHolographicFramePredictionVtbl
#define IHolographicFramePrediction __x_ABI_CWindows_CGraphics_CHolographic_CIHolographicFramePrediction
#define IHolographicFramePrediction_QueryInterface __x_ABI_CWindows_CGraphics_CHolographic_CIHolographicFramePrediction_QueryInterface
#define IHolographicFramePrediction_AddRef __x_ABI_CWindows_CGraphics_CHolographic_CIHolographicFramePrediction_AddRef
#define IHolographicFramePrediction_Release __x_ABI_CWindows_CGraphics_CHolographic_CIHolographicFramePrediction_Release
#define IHolographicFramePrediction_GetIids __x_ABI_CWindows_CGraphics_CHolographic_CIHolographicFramePrediction_GetIids
#define IHolographicFramePrediction_GetRuntimeClassName __x_ABI_CWindows_CGraphics_CHolographic_CIHolographicFramePrediction_GetRuntimeClassName
#define IHolographicFramePrediction_GetTrustLevel __x_ABI_CWindows_CGraphics_CHolographic_CIHolographicFramePrediction_GetTrustLevel
#define IHolographicFramePrediction_get_CameraPoses __x_ABI_CWindows_CGraphics_CHolographic_CIHolographicFramePrediction_get_CameraPoses
#define IHolographicFramePrediction_get_Timestamp __x_ABI_CWindows_CGraphics_CHolographic_CIHolographicFramePrediction_get_Timestamp
#endif /* WIDL_using_Windows_Graphics_Holographic */
#endif

#endif

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

/*****************************************************************************
 * IHolographicSpace interface
 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x20000
#ifndef ____x_ABI_CWindows_CGraphics_CHolographic_CIHolographicSpace_INTERFACE_DEFINED__
#define ____x_ABI_CWindows_CGraphics_CHolographic_CIHolographicSpace_INTERFACE_DEFINED__

DEFINE_GUID(IID___x_ABI_CWindows_CGraphics_CHolographic_CIHolographicSpace, 0x4380dba6, 0x5e78, 0x434f, 0x80,0x7c, 0x34,0x33,0xd1,0xef,0xe8,0xb7);
#if defined(__cplusplus) && !defined(CINTERFACE)
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace Graphics {
            namespace Holographic {
                MIDL_INTERFACE("4380dba6-5e78-434f-807c-3433d1efe8b7")
                IHolographicSpace : public IInspectable
                {
                    virtual HRESULT STDMETHODCALLTYPE get_PrimaryAdapterId(
                        ABI::Windows::Graphics::Holographic::HolographicAdapterId *value) = 0;

                    virtual HRESULT STDMETHODCALLTYPE SetDirect3D11Device(
                        ABI::Windows::Graphics::DirectX::Direct3D11::IDirect3DDevice *value) = 0;

                    virtual HRESULT STDMETHODCALLTYPE add_CameraAdded(
                        ABI::Windows::Foundation::ITypedEventHandler<ABI::Windows::Graphics::Holographic::HolographicSpace*,ABI::Windows::Graphics::Holographic::HolographicSpaceCameraAddedEventArgs* > *handler,
                        EventRegistrationToken *cookie) = 0;

                    virtual HRESULT STDMETHODCALLTYPE remove_CameraAdded(
                        EventRegistrationToken cookie) = 0;

                    virtual HRESULT STDMETHODCALLTYPE add_CameraRemoved(
                        ABI::Windows::Foundation::ITypedEventHandler<ABI::Windows::Graphics::Holographic::HolographicSpace*,ABI::Windows::Graphics::Holographic::HolographicSpaceCameraRemovedEventArgs* > *handler,
                        EventRegistrationToken *cookie) = 0;

                    virtual HRESULT STDMETHODCALLTYPE remove_CameraRemoved(
                        EventRegistrationToken cookie) = 0;

                    virtual HRESULT STDMETHODCALLTYPE CreateNextFrame(
                        ABI::Windows::Graphics::Holographic::IHolographicFrame **value) = 0;

                };
            }
        }
    }
}
extern "C" {
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(__x_ABI_CWindows_CGraphics_CHolographic_CIHolographicSpace, 0x4380dba6, 0x5e78, 0x434f, 0x80,0x7c, 0x34,0x33,0xd1,0xef,0xe8,0xb7)
#endif
#else
typedef struct __x_ABI_CWindows_CGraphics_CHolographic_CIHolographicSpaceVtbl {
    BEGIN_INTERFACE

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

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

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

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

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

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

    /*** IHolographicSpace methods ***/
    HRESULT (STDMETHODCALLTYPE *get_PrimaryAdapterId)(
        __x_ABI_CWindows_CGraphics_CHolographic_CIHolographicSpace *This,
        __x_ABI_CWindows_CGraphics_CHolographic_CHolographicAdapterId *value);

    HRESULT (STDMETHODCALLTYPE *SetDirect3D11Device)(
        __x_ABI_CWindows_CGraphics_CHolographic_CIHolographicSpace *This,
        __x_ABI_CWindows_CGraphics_CDirectX_CDirect3D11_CIDirect3DDevice *value);

    HRESULT (STDMETHODCALLTYPE *add_CameraAdded)(
        __x_ABI_CWindows_CGraphics_CHolographic_CIHolographicSpace *This,
        __FITypedEventHandler_2_Windows__CGraphics__CHolographic__CHolographicSpace_Windows__CGraphics__CHolographic__CHolographicSpaceCameraAddedEventArgs *handler,
        EventRegistrationToken *cookie);

    HRESULT (STDMETHODCALLTYPE *remove_CameraAdded)(
        __x_ABI_CWindows_CGraphics_CHolographic_CIHolographicSpace *This,
        EventRegistrationToken cookie);

    HRESULT (STDMETHODCALLTYPE *add_CameraRemoved)(
        __x_ABI_CWindows_CGraphics_CHolographic_CIHolographicSpace *This,
        __FITypedEventHandler_2_Windows__CGraphics__CHolographic__CHolographicSpace_Windows__CGraphics__CHolographic__CHolographicSpaceCameraRemovedEventArgs *handler,
        EventRegistrationToken *cookie);

    HRESULT (STDMETHODCALLTYPE *remove_CameraRemoved)(
        __x_ABI_CWindows_CGraphics_CHolographic_CIHolographicSpace *This,
        EventRegistrationToken cookie);

    HRESULT (STDMETHODCALLTYPE *CreateNextFrame)(
        __x_ABI_CWindows_CGraphics_CHolographic_CIHolographicSpace *This,
        __x_ABI_CWindows_CGraphics_CHolographic_CIHolographicFrame **value);

    END_INTERFACE
} __x_ABI_CWindows_CGraphics_CHolographic_CIHolographicSpaceVtbl;

interface __x_ABI_CWindows_CGraphics_CHolographic_CIHolographicSpace {
    CONST_VTBL __x_ABI_CWindows_CGraphics_CHolographic_CIHolographicSpaceVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define __x_ABI_CWindows_CGraphics_CHolographic_CIHolographicSpace_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define __x_ABI_CWindows_CGraphics_CHolographic_CIHolographicSpace_AddRef(This) (This)->lpVtbl->AddRef(This)
#define __x_ABI_CWindows_CGraphics_CHolographic_CIHolographicSpace_Release(This) (This)->lpVtbl->Release(This)
/*** IInspectable methods ***/
#define __x_ABI_CWindows_CGraphics_CHolographic_CIHolographicSpace_GetIids(This,iidCount,iids) (This)->lpVtbl->GetIids(This,iidCount,iids)
#define __x_ABI_CWindows_CGraphics_CHolographic_CIHolographicSpace_GetRuntimeClassName(This,className) (This)->lpVtbl->GetRuntimeClassName(This,className)
#define __x_ABI_CWindows_CGraphics_CHolographic_CIHolographicSpace_GetTrustLevel(This,trustLevel) (This)->lpVtbl->GetTrustLevel(This,trustLevel)
/*** IHolographicSpace methods ***/
#define __x_ABI_CWindows_CGraphics_CHolographic_CIHolographicSpace_get_PrimaryAdapterId(This,value) (This)->lpVtbl->get_PrimaryAdapterId(This,value)
#define __x_ABI_CWindows_CGraphics_CHolographic_CIHolographicSpace_SetDirect3D11Device(This,value) (This)->lpVtbl->SetDirect3D11Device(This,value)
#define __x_ABI_CWindows_CGraphics_CHolographic_CIHolographicSpace_add_CameraAdded(This,handler,cookie) (This)->lpVtbl->add_CameraAdded(This,handler,cookie)
#define __x_ABI_CWindows_CGraphics_CHolographic_CIHolographicSpace_remove_CameraAdded(This,cookie) (This)->lpVtbl->remove_CameraAdded(This,cookie)
#define __x_ABI_CWindows_CGraphics_CHolographic_CIHolographicSpace_add_CameraRemoved(This,handler,cookie) (This)->lpVtbl->add_CameraRemoved(This,handler,cookie)
#define __x_ABI_CWindows_CGraphics_CHolographic_CIHolographicSpace_remove_CameraRemoved(This,cookie) (This)->lpVtbl->remove_CameraRemoved(This,cookie)
#define __x_ABI_CWindows_CGraphics_CHolographic_CIHolographicSpace_CreateNextFrame(This,value) (This)->lpVtbl->CreateNextFrame(This,value)
#else
/*** IUnknown methods ***/
static inline HRESULT __x_ABI_CWindows_CGraphics_CHolographic_CIHolographicSpace_QueryInterface(__x_ABI_CWindows_CGraphics_CHolographic_CIHolographicSpace* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG __x_ABI_CWindows_CGraphics_CHolographic_CIHolographicSpace_AddRef(__x_ABI_CWindows_CGraphics_CHolographic_CIHolographicSpace* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG __x_ABI_CWindows_CGraphics_CHolographic_CIHolographicSpace_Release(__x_ABI_CWindows_CGraphics_CHolographic_CIHolographicSpace* This) {
    return This->lpVtbl->Release(This);
}
/*** IInspectable methods ***/
static inline HRESULT __x_ABI_CWindows_CGraphics_CHolographic_CIHolographicSpace_GetIids(__x_ABI_CWindows_CGraphics_CHolographic_CIHolographicSpace* This,ULONG *iidCount,IID **iids) {
    return This->lpVtbl->GetIids(This,iidCount,iids);
}
static inline HRESULT __x_ABI_CWindows_CGraphics_CHolographic_CIHolographicSpace_GetRuntimeClassName(__x_ABI_CWindows_CGraphics_CHolographic_CIHolographicSpace* This,HSTRING *className) {
    return This->lpVtbl->GetRuntimeClassName(This,className);
}
static inline HRESULT __x_ABI_CWindows_CGraphics_CHolographic_CIHolographicSpace_GetTrustLevel(__x_ABI_CWindows_CGraphics_CHolographic_CIHolographicSpace* This,TrustLevel *trustLevel) {
    return This->lpVtbl->GetTrustLevel(This,trustLevel);
}
/*** IHolographicSpace methods ***/
static inline HRESULT __x_ABI_CWindows_CGraphics_CHolographic_CIHolographicSpace_get_PrimaryAdapterId(__x_ABI_CWindows_CGraphics_CHolographic_CIHolographicSpace* This,__x_ABI_CWindows_CGraphics_CHolographic_CHolographicAdapterId *value) {
    return This->lpVtbl->get_PrimaryAdapterId(This,value);
}
static inline HRESULT __x_ABI_CWindows_CGraphics_CHolographic_CIHolographicSpace_SetDirect3D11Device(__x_ABI_CWindows_CGraphics_CHolographic_CIHolographicSpace* This,__x_ABI_CWindows_CGraphics_CDirectX_CDirect3D11_CIDirect3DDevice *value) {
    return This->lpVtbl->SetDirect3D11Device(This,value);
}
static inline HRESULT __x_ABI_CWindows_CGraphics_CHolographic_CIHolographicSpace_add_CameraAdded(__x_ABI_CWindows_CGraphics_CHolographic_CIHolographicSpace* This,__FITypedEventHandler_2_Windows__CGraphics__CHolographic__CHolographicSpace_Windows__CGraphics__CHolographic__CHolographicSpaceCameraAddedEventArgs *handler,EventRegistrationToken *cookie) {
    return This->lpVtbl->add_CameraAdded(This,handler,cookie);
}
static inline HRESULT __x_ABI_CWindows_CGraphics_CHolographic_CIHolographicSpace_remove_CameraAdded(__x_ABI_CWindows_CGraphics_CHolographic_CIHolographicSpace* This,EventRegistrationToken cookie) {
    return This->lpVtbl->remove_CameraAdded(This,cookie);
}
static inline HRESULT __x_ABI_CWindows_CGraphics_CHolographic_CIHolographicSpace_add_CameraRemoved(__x_ABI_CWindows_CGraphics_CHolographic_CIHolographicSpace* This,__FITypedEventHandler_2_Windows__CGraphics__CHolographic__CHolographicSpace_Windows__CGraphics__CHolographic__CHolographicSpaceCameraRemovedEventArgs *handler,EventRegistrationToken *cookie) {
    return This->lpVtbl->add_CameraRemoved(This,handler,cookie);
}
static inline HRESULT __x_ABI_CWindows_CGraphics_CHolographic_CIHolographicSpace_remove_CameraRemoved(__x_ABI_CWindows_CGraphics_CHolographic_CIHolographicSpace* This,EventRegistrationToken cookie) {
    return This->lpVtbl->remove_CameraRemoved(This,cookie);
}
static inline HRESULT __x_ABI_CWindows_CGraphics_CHolographic_CIHolographicSpace_CreateNextFrame(__x_ABI_CWindows_CGraphics_CHolographic_CIHolographicSpace* This,__x_ABI_CWindows_CGraphics_CHolographic_CIHolographicFrame **value) {
    return This->lpVtbl->CreateNextFrame(This,value);
}
#endif
#ifdef WIDL_using_Windows_Graphics_Holographic
#define IID_IHolographicSpace IID___x_ABI_CWindows_CGraphics_CHolographic_CIHolographicSpace
#define IHolographicSpaceVtbl __x_ABI_CWindows_CGraphics_CHolographic_CIHolographicSpaceVtbl
#define IHolographicSpace __x_ABI_CWindows_CGraphics_CHolographic_CIHolographicSpace
#define IHolographicSpace_QueryInterface __x_ABI_CWindows_CGraphics_CHolographic_CIHolographicSpace_QueryInterface
#define IHolographicSpace_AddRef __x_ABI_CWindows_CGraphics_CHolographic_CIHolographicSpace_AddRef
#define IHolographicSpace_Release __x_ABI_CWindows_CGraphics_CHolographic_CIHolographicSpace_Release
#define IHolographicSpace_GetIids __x_ABI_CWindows_CGraphics_CHolographic_CIHolographicSpace_GetIids
#define IHolographicSpace_GetRuntimeClassName __x_ABI_CWindows_CGraphics_CHolographic_CIHolographicSpace_GetRuntimeClassName
#define IHolographicSpace_GetTrustLevel __x_ABI_CWindows_CGraphics_CHolographic_CIHolographicSpace_GetTrustLevel
#define IHolographicSpace_get_PrimaryAdapterId __x_ABI_CWindows_CGraphics_CHolographic_CIHolographicSpace_get_PrimaryAdapterId
#define IHolographicSpace_SetDirect3D11Device __x_ABI_CWindows_CGraphics_CHolographic_CIHolographicSpace_SetDirect3D11Device
#define IHolographicSpace_add_CameraAdded __x_ABI_CWindows_CGraphics_CHolographic_CIHolographicSpace_add_CameraAdded
#define IHolographicSpace_remove_CameraAdded __x_ABI_CWindows_CGraphics_CHolographic_CIHolographicSpace_remove_CameraAdded
#define IHolographicSpace_add_CameraRemoved __x_ABI_CWindows_CGraphics_CHolographic_CIHolographicSpace_add_CameraRemoved
#define IHolographicSpace_remove_CameraRemoved __x_ABI_CWindows_CGraphics_CHolographic_CIHolographicSpace_remove_CameraRemoved
#define IHolographicSpace_CreateNextFrame __x_ABI_CWindows_CGraphics_CHolographic_CIHolographicSpace_CreateNextFrame
#endif /* WIDL_using_Windows_Graphics_Holographic */
#endif

#endif

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

/*****************************************************************************
 * IHolographicSpaceStatics2 interface
 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x40000
#ifndef ____x_ABI_CWindows_CGraphics_CHolographic_CIHolographicSpaceStatics2_INTERFACE_DEFINED__
#define ____x_ABI_CWindows_CGraphics_CHolographic_CIHolographicSpaceStatics2_INTERFACE_DEFINED__

DEFINE_GUID(IID___x_ABI_CWindows_CGraphics_CHolographic_CIHolographicSpaceStatics2, 0x0e777088, 0x75fc, 0x48af, 0x87,0x58, 0x06,0x52,0xf6,0xf0,0x7c,0x59);
#if defined(__cplusplus) && !defined(CINTERFACE)
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace Graphics {
            namespace Holographic {
                MIDL_INTERFACE("0e777088-75fc-48af-8758-0652f6f07c59")
                IHolographicSpaceStatics2 : public IInspectable
                {
                    virtual HRESULT STDMETHODCALLTYPE get_IsSupported(
                        boolean *value) = 0;

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

                    virtual HRESULT STDMETHODCALLTYPE add_IsAvailableChanged(
                        ABI::Windows::Foundation::IEventHandler<IInspectable* > *handler,
                        EventRegistrationToken *token) = 0;

                    virtual HRESULT STDMETHODCALLTYPE remove_IsAvailableChanged(
                        EventRegistrationToken token) = 0;

                };
            }
        }
    }
}
extern "C" {
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(__x_ABI_CWindows_CGraphics_CHolographic_CIHolographicSpaceStatics2, 0x0e777088, 0x75fc, 0x48af, 0x87,0x58, 0x06,0x52,0xf6,0xf0,0x7c,0x59)
#endif
#else
typedef struct __x_ABI_CWindows_CGraphics_CHolographic_CIHolographicSpaceStatics2Vtbl {
    BEGIN_INTERFACE

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

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

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

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

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

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

    /*** IHolographicSpaceStatics2 methods ***/
    HRESULT (STDMETHODCALLTYPE *get_IsSupported)(
        __x_ABI_CWindows_CGraphics_CHolographic_CIHolographicSpaceStatics2 *This,
        boolean *value);

    HRESULT (STDMETHODCALLTYPE *get_IsAvailable)(
        __x_ABI_CWindows_CGraphics_CHolographic_CIHolographicSpaceStatics2 *This,
        boolean *value);

    HRESULT (STDMETHODCALLTYPE *add_IsAvailableChanged)(
        __x_ABI_CWindows_CGraphics_CHolographic_CIHolographicSpaceStatics2 *This,
        __FIEventHandler_1_IInspectable *handler,
        EventRegistrationToken *token);

    HRESULT (STDMETHODCALLTYPE *remove_IsAvailableChanged)(
        __x_ABI_CWindows_CGraphics_CHolographic_CIHolographicSpaceStatics2 *This,
        EventRegistrationToken token);

    END_INTERFACE
} __x_ABI_CWindows_CGraphics_CHolographic_CIHolographicSpaceStatics2Vtbl;

interface __x_ABI_CWindows_CGraphics_CHolographic_CIHolographicSpaceStatics2 {
    CONST_VTBL __x_ABI_CWindows_CGraphics_CHolographic_CIHolographicSpaceStatics2Vtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define __x_ABI_CWindows_CGraphics_CHolographic_CIHolographicSpaceStatics2_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define __x_ABI_CWindows_CGraphics_CHolographic_CIHolographicSpaceStatics2_AddRef(This) (This)->lpVtbl->AddRef(This)
#define __x_ABI_CWindows_CGraphics_CHolographic_CIHolographicSpaceStatics2_Release(This) (This)->lpVtbl->Release(This)
/*** IInspectable methods ***/
#define __x_ABI_CWindows_CGraphics_CHolographic_CIHolographicSpaceStatics2_GetIids(This,iidCount,iids) (This)->lpVtbl->GetIids(This,iidCount,iids)
#define __x_ABI_CWindows_CGraphics_CHolographic_CIHolographicSpaceStatics2_GetRuntimeClassName(This,className) (This)->lpVtbl->GetRuntimeClassName(This,className)
#define __x_ABI_CWindows_CGraphics_CHolographic_CIHolographicSpaceStatics2_GetTrustLevel(This,trustLevel) (This)->lpVtbl->GetTrustLevel(This,trustLevel)
/*** IHolographicSpaceStatics2 methods ***/
#define __x_ABI_CWindows_CGraphics_CHolographic_CIHolographicSpaceStatics2_get_IsSupported(This,value) (This)->lpVtbl->get_IsSupported(This,value)
#define __x_ABI_CWindows_CGraphics_CHolographic_CIHolographicSpaceStatics2_get_IsAvailable(This,value) (This)->lpVtbl->get_IsAvailable(This,value)
#define __x_ABI_CWindows_CGraphics_CHolographic_CIHolographicSpaceStatics2_add_IsAvailableChanged(This,handler,token) (This)->lpVtbl->add_IsAvailableChanged(This,handler,token)
#define __x_ABI_CWindows_CGraphics_CHolographic_CIHolographicSpaceStatics2_remove_IsAvailableChanged(This,token) (This)->lpVtbl->remove_IsAvailableChanged(This,token)
#else
/*** IUnknown methods ***/
static inline HRESULT __x_ABI_CWindows_CGraphics_CHolographic_CIHolographicSpaceStatics2_QueryInterface(__x_ABI_CWindows_CGraphics_CHolographic_CIHolographicSpaceStatics2* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG __x_ABI_CWindows_CGraphics_CHolographic_CIHolographicSpaceStatics2_AddRef(__x_ABI_CWindows_CGraphics_CHolographic_CIHolographicSpaceStatics2* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG __x_ABI_CWindows_CGraphics_CHolographic_CIHolographicSpaceStatics2_Release(__x_ABI_CWindows_CGraphics_CHolographic_CIHolographicSpaceStatics2* This) {
    return This->lpVtbl->Release(This);
}
/*** IInspectable methods ***/
static inline HRESULT __x_ABI_CWindows_CGraphics_CHolographic_CIHolographicSpaceStatics2_GetIids(__x_ABI_CWindows_CGraphics_CHolographic_CIHolographicSpaceStatics2* This,ULONG *iidCount,IID **iids) {
    return This->lpVtbl->GetIids(This,iidCount,iids);
}
static inline HRESULT __x_ABI_CWindows_CGraphics_CHolographic_CIHolographicSpaceStatics2_GetRuntimeClassName(__x_ABI_CWindows_CGraphics_CHolographic_CIHolographicSpaceStatics2* This,HSTRING *className) {
    return This->lpVtbl->GetRuntimeClassName(This,className);
}
static inline HRESULT __x_ABI_CWindows_CGraphics_CHolographic_CIHolographicSpaceStatics2_GetTrustLevel(__x_ABI_CWindows_CGraphics_CHolographic_CIHolographicSpaceStatics2* This,TrustLevel *trustLevel) {
    return This->lpVtbl->GetTrustLevel(This,trustLevel);
}
/*** IHolographicSpaceStatics2 methods ***/
static inline HRESULT __x_ABI_CWindows_CGraphics_CHolographic_CIHolographicSpaceStatics2_get_IsSupported(__x_ABI_CWindows_CGraphics_CHolographic_CIHolographicSpaceStatics2* This,boolean *value) {
    return This->lpVtbl->get_IsSupported(This,value);
}
static inline HRESULT __x_ABI_CWindows_CGraphics_CHolographic_CIHolographicSpaceStatics2_get_IsAvailable(__x_ABI_CWindows_CGraphics_CHolographic_CIHolographicSpaceStatics2* This,boolean *value) {
    return This->lpVtbl->get_IsAvailable(This,value);
}
static inline HRESULT __x_ABI_CWindows_CGraphics_CHolographic_CIHolographicSpaceStatics2_add_IsAvailableChanged(__x_ABI_CWindows_CGraphics_CHolographic_CIHolographicSpaceStatics2* This,__FIEventHandler_1_IInspectable *handler,EventRegistrationToken *token) {
    return This->lpVtbl->add_IsAvailableChanged(This,handler,token);
}
static inline HRESULT __x_ABI_CWindows_CGraphics_CHolographic_CIHolographicSpaceStatics2_remove_IsAvailableChanged(__x_ABI_CWindows_CGraphics_CHolographic_CIHolographicSpaceStatics2* This,EventRegistrationToken token) {
    return This->lpVtbl->remove_IsAvailableChanged(This,token);
}
#endif
#ifdef WIDL_using_Windows_Graphics_Holographic
#define IID_IHolographicSpaceStatics2 IID___x_ABI_CWindows_CGraphics_CHolographic_CIHolographicSpaceStatics2
#define IHolographicSpaceStatics2Vtbl __x_ABI_CWindows_CGraphics_CHolographic_CIHolographicSpaceStatics2Vtbl
#define IHolographicSpaceStatics2 __x_ABI_CWindows_CGraphics_CHolographic_CIHolographicSpaceStatics2
#define IHolographicSpaceStatics2_QueryInterface __x_ABI_CWindows_CGraphics_CHolographic_CIHolographicSpaceStatics2_QueryInterface
#define IHolographicSpaceStatics2_AddRef __x_ABI_CWindows_CGraphics_CHolographic_CIHolographicSpaceStatics2_AddRef
#define IHolographicSpaceStatics2_Release __x_ABI_CWindows_CGraphics_CHolographic_CIHolographicSpaceStatics2_Release
#define IHolographicSpaceStatics2_GetIids __x_ABI_CWindows_CGraphics_CHolographic_CIHolographicSpaceStatics2_GetIids
#define IHolographicSpaceStatics2_GetRuntimeClassName __x_ABI_CWindows_CGraphics_CHolographic_CIHolographicSpaceStatics2_GetRuntimeClassName
#define IHolographicSpaceStatics2_GetTrustLevel __x_ABI_CWindows_CGraphics_CHolographic_CIHolographicSpaceStatics2_GetTrustLevel
#define IHolographicSpaceStatics2_get_IsSupported __x_ABI_CWindows_CGraphics_CHolographic_CIHolographicSpaceStatics2_get_IsSupported
#define IHolographicSpaceStatics2_get_IsAvailable __x_ABI_CWindows_CGraphics_CHolographic_CIHolographicSpaceStatics2_get_IsAvailable
#define IHolographicSpaceStatics2_add_IsAvailableChanged __x_ABI_CWindows_CGraphics_CHolographic_CIHolographicSpaceStatics2_add_IsAvailableChanged
#define IHolographicSpaceStatics2_remove_IsAvailableChanged __x_ABI_CWindows_CGraphics_CHolographic_CIHolographicSpaceStatics2_remove_IsAvailableChanged
#endif /* WIDL_using_Windows_Graphics_Holographic */
#endif

#endif

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

/*****************************************************************************
 * IHolographicSpaceStatics3 interface
 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x50000
#ifndef ____x_ABI_CWindows_CGraphics_CHolographic_CIHolographicSpaceStatics3_INTERFACE_DEFINED__
#define ____x_ABI_CWindows_CGraphics_CHolographic_CIHolographicSpaceStatics3_INTERFACE_DEFINED__

DEFINE_GUID(IID___x_ABI_CWindows_CGraphics_CHolographic_CIHolographicSpaceStatics3, 0x3b00de3d, 0xb1a3, 0x4dfe, 0x8e,0x79, 0xfe,0xc5,0x90,0x9e,0x6d,0xf8);
#if defined(__cplusplus) && !defined(CINTERFACE)
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace Graphics {
            namespace Holographic {
                MIDL_INTERFACE("3b00de3d-b1a3-4dfe-8e79-fec5909e6df8")
                IHolographicSpaceStatics3 : public IInspectable
                {
                    virtual HRESULT STDMETHODCALLTYPE get_IsConfigured(
                        boolean *value) = 0;

                };
            }
        }
    }
}
extern "C" {
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(__x_ABI_CWindows_CGraphics_CHolographic_CIHolographicSpaceStatics3, 0x3b00de3d, 0xb1a3, 0x4dfe, 0x8e,0x79, 0xfe,0xc5,0x90,0x9e,0x6d,0xf8)
#endif
#else
typedef struct __x_ABI_CWindows_CGraphics_CHolographic_CIHolographicSpaceStatics3Vtbl {
    BEGIN_INTERFACE

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

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

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

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

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

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

    /*** IHolographicSpaceStatics3 methods ***/
    HRESULT (STDMETHODCALLTYPE *get_IsConfigured)(
        __x_ABI_CWindows_CGraphics_CHolographic_CIHolographicSpaceStatics3 *This,
        boolean *value);

    END_INTERFACE
} __x_ABI_CWindows_CGraphics_CHolographic_CIHolographicSpaceStatics3Vtbl;

interface __x_ABI_CWindows_CGraphics_CHolographic_CIHolographicSpaceStatics3 {
    CONST_VTBL __x_ABI_CWindows_CGraphics_CHolographic_CIHolographicSpaceStatics3Vtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define __x_ABI_CWindows_CGraphics_CHolographic_CIHolographicSpaceStatics3_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define __x_ABI_CWindows_CGraphics_CHolographic_CIHolographicSpaceStatics3_AddRef(This) (This)->lpVtbl->AddRef(This)
#define __x_ABI_CWindows_CGraphics_CHolographic_CIHolographicSpaceStatics3_Release(This) (This)->lpVtbl->Release(This)
/*** IInspectable methods ***/
#define __x_ABI_CWindows_CGraphics_CHolographic_CIHolographicSpaceStatics3_GetIids(This,iidCount,iids) (This)->lpVtbl->GetIids(This,iidCount,iids)
#define __x_ABI_CWindows_CGraphics_CHolographic_CIHolographicSpaceStatics3_GetRuntimeClassName(This,className) (This)->lpVtbl->GetRuntimeClassName(This,className)
#define __x_ABI_CWindows_CGraphics_CHolographic_CIHolographicSpaceStatics3_GetTrustLevel(This,trustLevel) (This)->lpVtbl->GetTrustLevel(This,trustLevel)
/*** IHolographicSpaceStatics3 methods ***/
#define __x_ABI_CWindows_CGraphics_CHolographic_CIHolographicSpaceStatics3_get_IsConfigured(This,value) (This)->lpVtbl->get_IsConfigured(This,value)
#else
/*** IUnknown methods ***/
static inline HRESULT __x_ABI_CWindows_CGraphics_CHolographic_CIHolographicSpaceStatics3_QueryInterface(__x_ABI_CWindows_CGraphics_CHolographic_CIHolographicSpaceStatics3* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG __x_ABI_CWindows_CGraphics_CHolographic_CIHolographicSpaceStatics3_AddRef(__x_ABI_CWindows_CGraphics_CHolographic_CIHolographicSpaceStatics3* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG __x_ABI_CWindows_CGraphics_CHolographic_CIHolographicSpaceStatics3_Release(__x_ABI_CWindows_CGraphics_CHolographic_CIHolographicSpaceStatics3* This) {
    return This->lpVtbl->Release(This);
}
/*** IInspectable methods ***/
static inline HRESULT __x_ABI_CWindows_CGraphics_CHolographic_CIHolographicSpaceStatics3_GetIids(__x_ABI_CWindows_CGraphics_CHolographic_CIHolographicSpaceStatics3* This,ULONG *iidCount,IID **iids) {
    return This->lpVtbl->GetIids(This,iidCount,iids);
}
static inline HRESULT __x_ABI_CWindows_CGraphics_CHolographic_CIHolographicSpaceStatics3_GetRuntimeClassName(__x_ABI_CWindows_CGraphics_CHolographic_CIHolographicSpaceStatics3* This,HSTRING *className) {
    return This->lpVtbl->GetRuntimeClassName(This,className);
}
static inline HRESULT __x_ABI_CWindows_CGraphics_CHolographic_CIHolographicSpaceStatics3_GetTrustLevel(__x_ABI_CWindows_CGraphics_CHolographic_CIHolographicSpaceStatics3* This,TrustLevel *trustLevel) {
    return This->lpVtbl->GetTrustLevel(This,trustLevel);
}
/*** IHolographicSpaceStatics3 methods ***/
static inline HRESULT __x_ABI_CWindows_CGraphics_CHolographic_CIHolographicSpaceStatics3_get_IsConfigured(__x_ABI_CWindows_CGraphics_CHolographic_CIHolographicSpaceStatics3* This,boolean *value) {
    return This->lpVtbl->get_IsConfigured(This,value);
}
#endif
#ifdef WIDL_using_Windows_Graphics_Holographic
#define IID_IHolographicSpaceStatics3 IID___x_ABI_CWindows_CGraphics_CHolographic_CIHolographicSpaceStatics3
#define IHolographicSpaceStatics3Vtbl __x_ABI_CWindows_CGraphics_CHolographic_CIHolographicSpaceStatics3Vtbl
#define IHolographicSpaceStatics3 __x_ABI_CWindows_CGraphics_CHolographic_CIHolographicSpaceStatics3
#define IHolographicSpaceStatics3_QueryInterface __x_ABI_CWindows_CGraphics_CHolographic_CIHolographicSpaceStatics3_QueryInterface
#define IHolographicSpaceStatics3_AddRef __x_ABI_CWindows_CGraphics_CHolographic_CIHolographicSpaceStatics3_AddRef
#define IHolographicSpaceStatics3_Release __x_ABI_CWindows_CGraphics_CHolographic_CIHolographicSpaceStatics3_Release
#define IHolographicSpaceStatics3_GetIids __x_ABI_CWindows_CGraphics_CHolographic_CIHolographicSpaceStatics3_GetIids
#define IHolographicSpaceStatics3_GetRuntimeClassName __x_ABI_CWindows_CGraphics_CHolographic_CIHolographicSpaceStatics3_GetRuntimeClassName
#define IHolographicSpaceStatics3_GetTrustLevel __x_ABI_CWindows_CGraphics_CHolographic_CIHolographicSpaceStatics3_GetTrustLevel
#define IHolographicSpaceStatics3_get_IsConfigured __x_ABI_CWindows_CGraphics_CHolographic_CIHolographicSpaceStatics3_get_IsConfigured
#endif /* WIDL_using_Windows_Graphics_Holographic */
#endif

#endif

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

/*****************************************************************************
 * IHolographicSpaceCameraAddedEventArgs interface
 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x20000
#ifndef ____x_ABI_CWindows_CGraphics_CHolographic_CIHolographicSpaceCameraAddedEventArgs_INTERFACE_DEFINED__
#define ____x_ABI_CWindows_CGraphics_CHolographic_CIHolographicSpaceCameraAddedEventArgs_INTERFACE_DEFINED__

DEFINE_GUID(IID___x_ABI_CWindows_CGraphics_CHolographic_CIHolographicSpaceCameraAddedEventArgs, 0x58f1da35, 0xbbb3, 0x3c8f, 0x99,0x3d, 0x6c,0x80,0xe7,0xfe,0xb9,0x9f);
#if defined(__cplusplus) && !defined(CINTERFACE)
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace Graphics {
            namespace Holographic {
                MIDL_INTERFACE("58f1da35-bbb3-3c8f-993d-6c80e7feb99f")
                IHolographicSpaceCameraAddedEventArgs : public IInspectable
                {
                    virtual HRESULT STDMETHODCALLTYPE get_Camera(
                        ABI::Windows::Graphics::Holographic::IHolographicCamera **value) = 0;

                    virtual HRESULT STDMETHODCALLTYPE GetDeferral(
                        ABI::Windows::Foundation::IDeferral **value) = 0;

                };
            }
        }
    }
}
extern "C" {
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(__x_ABI_CWindows_CGraphics_CHolographic_CIHolographicSpaceCameraAddedEventArgs, 0x58f1da35, 0xbbb3, 0x3c8f, 0x99,0x3d, 0x6c,0x80,0xe7,0xfe,0xb9,0x9f)
#endif
#else
typedef struct __x_ABI_CWindows_CGraphics_CHolographic_CIHolographicSpaceCameraAddedEventArgsVtbl {
    BEGIN_INTERFACE

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

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

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

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

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

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

    /*** IHolographicSpaceCameraAddedEventArgs methods ***/
    HRESULT (STDMETHODCALLTYPE *get_Camera)(
        __x_ABI_CWindows_CGraphics_CHolographic_CIHolographicSpaceCameraAddedEventArgs *This,
        __x_ABI_CWindows_CGraphics_CHolographic_CIHolographicCamera **value);

    HRESULT (STDMETHODCALLTYPE *GetDeferral)(
        __x_ABI_CWindows_CGraphics_CHolographic_CIHolographicSpaceCameraAddedEventArgs *This,
        __x_ABI_CWindows_CFoundation_CIDeferral **value);

    END_INTERFACE
} __x_ABI_CWindows_CGraphics_CHolographic_CIHolographicSpaceCameraAddedEventArgsVtbl;

interface __x_ABI_CWindows_CGraphics_CHolographic_CIHolographicSpaceCameraAddedEventArgs {
    CONST_VTBL __x_ABI_CWindows_CGraphics_CHolographic_CIHolographicSpaceCameraAddedEventArgsVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define __x_ABI_CWindows_CGraphics_CHolographic_CIHolographicSpaceCameraAddedEventArgs_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define __x_ABI_CWindows_CGraphics_CHolographic_CIHolographicSpaceCameraAddedEventArgs_AddRef(This) (This)->lpVtbl->AddRef(This)
#define __x_ABI_CWindows_CGraphics_CHolographic_CIHolographicSpaceCameraAddedEventArgs_Release(This) (This)->lpVtbl->Release(This)
/*** IInspectable methods ***/
#define __x_ABI_CWindows_CGraphics_CHolographic_CIHolographicSpaceCameraAddedEventArgs_GetIids(This,iidCount,iids) (This)->lpVtbl->GetIids(This,iidCount,iids)
#define __x_ABI_CWindows_CGraphics_CHolographic_CIHolographicSpaceCameraAddedEventArgs_GetRuntimeClassName(This,className) (This)->lpVtbl->GetRuntimeClassName(This,className)
#define __x_ABI_CWindows_CGraphics_CHolographic_CIHolographicSpaceCameraAddedEventArgs_GetTrustLevel(This,trustLevel) (This)->lpVtbl->GetTrustLevel(This,trustLevel)
/*** IHolographicSpaceCameraAddedEventArgs methods ***/
#define __x_ABI_CWindows_CGraphics_CHolographic_CIHolographicSpaceCameraAddedEventArgs_get_Camera(This,value) (This)->lpVtbl->get_Camera(This,value)
#define __x_ABI_CWindows_CGraphics_CHolographic_CIHolographicSpaceCameraAddedEventArgs_GetDeferral(This,value) (This)->lpVtbl->GetDeferral(This,value)
#else
/*** IUnknown methods ***/
static inline HRESULT __x_ABI_CWindows_CGraphics_CHolographic_CIHolographicSpaceCameraAddedEventArgs_QueryInterface(__x_ABI_CWindows_CGraphics_CHolographic_CIHolographicSpaceCameraAddedEventArgs* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG __x_ABI_CWindows_CGraphics_CHolographic_CIHolographicSpaceCameraAddedEventArgs_AddRef(__x_ABI_CWindows_CGraphics_CHolographic_CIHolographicSpaceCameraAddedEventArgs* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG __x_ABI_CWindows_CGraphics_CHolographic_CIHolographicSpaceCameraAddedEventArgs_Release(__x_ABI_CWindows_CGraphics_CHolographic_CIHolographicSpaceCameraAddedEventArgs* This) {
    return This->lpVtbl->Release(This);
}
/*** IInspectable methods ***/
static inline HRESULT __x_ABI_CWindows_CGraphics_CHolographic_CIHolographicSpaceCameraAddedEventArgs_GetIids(__x_ABI_CWindows_CGraphics_CHolographic_CIHolographicSpaceCameraAddedEventArgs* This,ULONG *iidCount,IID **iids) {
    return This->lpVtbl->GetIids(This,iidCount,iids);
}
static inline HRESULT __x_ABI_CWindows_CGraphics_CHolographic_CIHolographicSpaceCameraAddedEventArgs_GetRuntimeClassName(__x_ABI_CWindows_CGraphics_CHolographic_CIHolographicSpaceCameraAddedEventArgs* This,HSTRING *className) {
    return This->lpVtbl->GetRuntimeClassName(This,className);
}
static inline HRESULT __x_ABI_CWindows_CGraphics_CHolographic_CIHolographicSpaceCameraAddedEventArgs_GetTrustLevel(__x_ABI_CWindows_CGraphics_CHolographic_CIHolographicSpaceCameraAddedEventArgs* This,TrustLevel *trustLevel) {
    return This->lpVtbl->GetTrustLevel(This,trustLevel);
}
/*** IHolographicSpaceCameraAddedEventArgs methods ***/
static inline HRESULT __x_ABI_CWindows_CGraphics_CHolographic_CIHolographicSpaceCameraAddedEventArgs_get_Camera(__x_ABI_CWindows_CGraphics_CHolographic_CIHolographicSpaceCameraAddedEventArgs* This,__x_ABI_CWindows_CGraphics_CHolographic_CIHolographicCamera **value) {
    return This->lpVtbl->get_Camera(This,value);
}
static inline HRESULT __x_ABI_CWindows_CGraphics_CHolographic_CIHolographicSpaceCameraAddedEventArgs_GetDeferral(__x_ABI_CWindows_CGraphics_CHolographic_CIHolographicSpaceCameraAddedEventArgs* This,__x_ABI_CWindows_CFoundation_CIDeferral **value) {
    return This->lpVtbl->GetDeferral(This,value);
}
#endif
#ifdef WIDL_using_Windows_Graphics_Holographic
#define IID_IHolographicSpaceCameraAddedEventArgs IID___x_ABI_CWindows_CGraphics_CHolographic_CIHolographicSpaceCameraAddedEventArgs
#define IHolographicSpaceCameraAddedEventArgsVtbl __x_ABI_CWindows_CGraphics_CHolographic_CIHolographicSpaceCameraAddedEventArgsVtbl
#define IHolographicSpaceCameraAddedEventArgs __x_ABI_CWindows_CGraphics_CHolographic_CIHolographicSpaceCameraAddedEventArgs
#define IHolographicSpaceCameraAddedEventArgs_QueryInterface __x_ABI_CWindows_CGraphics_CHolographic_CIHolographicSpaceCameraAddedEventArgs_QueryInterface
#define IHolographicSpaceCameraAddedEventArgs_AddRef __x_ABI_CWindows_CGraphics_CHolographic_CIHolographicSpaceCameraAddedEventArgs_AddRef
#define IHolographicSpaceCameraAddedEventArgs_Release __x_ABI_CWindows_CGraphics_CHolographic_CIHolographicSpaceCameraAddedEventArgs_Release
#define IHolographicSpaceCameraAddedEventArgs_GetIids __x_ABI_CWindows_CGraphics_CHolographic_CIHolographicSpaceCameraAddedEventArgs_GetIids
#define IHolographicSpaceCameraAddedEventArgs_GetRuntimeClassName __x_ABI_CWindows_CGraphics_CHolographic_CIHolographicSpaceCameraAddedEventArgs_GetRuntimeClassName
#define IHolographicSpaceCameraAddedEventArgs_GetTrustLevel __x_ABI_CWindows_CGraphics_CHolographic_CIHolographicSpaceCameraAddedEventArgs_GetTrustLevel
#define IHolographicSpaceCameraAddedEventArgs_get_Camera __x_ABI_CWindows_CGraphics_CHolographic_CIHolographicSpaceCameraAddedEventArgs_get_Camera
#define IHolographicSpaceCameraAddedEventArgs_GetDeferral __x_ABI_CWindows_CGraphics_CHolographic_CIHolographicSpaceCameraAddedEventArgs_GetDeferral
#endif /* WIDL_using_Windows_Graphics_Holographic */
#endif

#endif

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

/*****************************************************************************
 * IHolographicSpaceCameraRemovedEventArgs interface
 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x20000
#ifndef ____x_ABI_CWindows_CGraphics_CHolographic_CIHolographicSpaceCameraRemovedEventArgs_INTERFACE_DEFINED__
#define ____x_ABI_CWindows_CGraphics_CHolographic_CIHolographicSpaceCameraRemovedEventArgs_INTERFACE_DEFINED__

DEFINE_GUID(IID___x_ABI_CWindows_CGraphics_CHolographic_CIHolographicSpaceCameraRemovedEventArgs, 0x805444a8, 0xf2ae, 0x322e, 0x8d,0xa9, 0x83,0x6a,0x0a,0x95,0xa4,0xc1);
#if defined(__cplusplus) && !defined(CINTERFACE)
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace Graphics {
            namespace Holographic {
                MIDL_INTERFACE("805444a8-f2ae-322e-8da9-836a0a95a4c1")
                IHolographicSpaceCameraRemovedEventArgs : public IInspectable
                {
                    virtual HRESULT STDMETHODCALLTYPE get_Camera(
                        ABI::Windows::Graphics::Holographic::IHolographicCamera **value) = 0;

                };
            }
        }
    }
}
extern "C" {
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(__x_ABI_CWindows_CGraphics_CHolographic_CIHolographicSpaceCameraRemovedEventArgs, 0x805444a8, 0xf2ae, 0x322e, 0x8d,0xa9, 0x83,0x6a,0x0a,0x95,0xa4,0xc1)
#endif
#else
typedef struct __x_ABI_CWindows_CGraphics_CHolographic_CIHolographicSpaceCameraRemovedEventArgsVtbl {
    BEGIN_INTERFACE

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

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

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

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

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

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

    /*** IHolographicSpaceCameraRemovedEventArgs methods ***/
    HRESULT (STDMETHODCALLTYPE *get_Camera)(
        __x_ABI_CWindows_CGraphics_CHolographic_CIHolographicSpaceCameraRemovedEventArgs *This,
        __x_ABI_CWindows_CGraphics_CHolographic_CIHolographicCamera **value);

    END_INTERFACE
} __x_ABI_CWindows_CGraphics_CHolographic_CIHolographicSpaceCameraRemovedEventArgsVtbl;

interface __x_ABI_CWindows_CGraphics_CHolographic_CIHolographicSpaceCameraRemovedEventArgs {
    CONST_VTBL __x_ABI_CWindows_CGraphics_CHolographic_CIHolographicSpaceCameraRemovedEventArgsVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define __x_ABI_CWindows_CGraphics_CHolographic_CIHolographicSpaceCameraRemovedEventArgs_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define __x_ABI_CWindows_CGraphics_CHolographic_CIHolographicSpaceCameraRemovedEventArgs_AddRef(This) (This)->lpVtbl->AddRef(This)
#define __x_ABI_CWindows_CGraphics_CHolographic_CIHolographicSpaceCameraRemovedEventArgs_Release(This) (This)->lpVtbl->Release(This)
/*** IInspectable methods ***/
#define __x_ABI_CWindows_CGraphics_CHolographic_CIHolographicSpaceCameraRemovedEventArgs_GetIids(This,iidCount,iids) (This)->lpVtbl->GetIids(This,iidCount,iids)
#define __x_ABI_CWindows_CGraphics_CHolographic_CIHolographicSpaceCameraRemovedEventArgs_GetRuntimeClassName(This,className) (This)->lpVtbl->GetRuntimeClassName(This,className)
#define __x_ABI_CWindows_CGraphics_CHolographic_CIHolographicSpaceCameraRemovedEventArgs_GetTrustLevel(This,trustLevel) (This)->lpVtbl->GetTrustLevel(This,trustLevel)
/*** IHolographicSpaceCameraRemovedEventArgs methods ***/
#define __x_ABI_CWindows_CGraphics_CHolographic_CIHolographicSpaceCameraRemovedEventArgs_get_Camera(This,value) (This)->lpVtbl->get_Camera(This,value)
#else
/*** IUnknown methods ***/
static inline HRESULT __x_ABI_CWindows_CGraphics_CHolographic_CIHolographicSpaceCameraRemovedEventArgs_QueryInterface(__x_ABI_CWindows_CGraphics_CHolographic_CIHolographicSpaceCameraRemovedEventArgs* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG __x_ABI_CWindows_CGraphics_CHolographic_CIHolographicSpaceCameraRemovedEventArgs_AddRef(__x_ABI_CWindows_CGraphics_CHolographic_CIHolographicSpaceCameraRemovedEventArgs* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG __x_ABI_CWindows_CGraphics_CHolographic_CIHolographicSpaceCameraRemovedEventArgs_Release(__x_ABI_CWindows_CGraphics_CHolographic_CIHolographicSpaceCameraRemovedEventArgs* This) {
    return This->lpVtbl->Release(This);
}
/*** IInspectable methods ***/
static inline HRESULT __x_ABI_CWindows_CGraphics_CHolographic_CIHolographicSpaceCameraRemovedEventArgs_GetIids(__x_ABI_CWindows_CGraphics_CHolographic_CIHolographicSpaceCameraRemovedEventArgs* This,ULONG *iidCount,IID **iids) {
    return This->lpVtbl->GetIids(This,iidCount,iids);
}
static inline HRESULT __x_ABI_CWindows_CGraphics_CHolographic_CIHolographicSpaceCameraRemovedEventArgs_GetRuntimeClassName(__x_ABI_CWindows_CGraphics_CHolographic_CIHolographicSpaceCameraRemovedEventArgs* This,HSTRING *className) {
    return This->lpVtbl->GetRuntimeClassName(This,className);
}
static inline HRESULT __x_ABI_CWindows_CGraphics_CHolographic_CIHolographicSpaceCameraRemovedEventArgs_GetTrustLevel(__x_ABI_CWindows_CGraphics_CHolographic_CIHolographicSpaceCameraRemovedEventArgs* This,TrustLevel *trustLevel) {
    return This->lpVtbl->GetTrustLevel(This,trustLevel);
}
/*** IHolographicSpaceCameraRemovedEventArgs methods ***/
static inline HRESULT __x_ABI_CWindows_CGraphics_CHolographic_CIHolographicSpaceCameraRemovedEventArgs_get_Camera(__x_ABI_CWindows_CGraphics_CHolographic_CIHolographicSpaceCameraRemovedEventArgs* This,__x_ABI_CWindows_CGraphics_CHolographic_CIHolographicCamera **value) {
    return This->lpVtbl->get_Camera(This,value);
}
#endif
#ifdef WIDL_using_Windows_Graphics_Holographic
#define IID_IHolographicSpaceCameraRemovedEventArgs IID___x_ABI_CWindows_CGraphics_CHolographic_CIHolographicSpaceCameraRemovedEventArgs
#define IHolographicSpaceCameraRemovedEventArgsVtbl __x_ABI_CWindows_CGraphics_CHolographic_CIHolographicSpaceCameraRemovedEventArgsVtbl
#define IHolographicSpaceCameraRemovedEventArgs __x_ABI_CWindows_CGraphics_CHolographic_CIHolographicSpaceCameraRemovedEventArgs
#define IHolographicSpaceCameraRemovedEventArgs_QueryInterface __x_ABI_CWindows_CGraphics_CHolographic_CIHolographicSpaceCameraRemovedEventArgs_QueryInterface
#define IHolographicSpaceCameraRemovedEventArgs_AddRef __x_ABI_CWindows_CGraphics_CHolographic_CIHolographicSpaceCameraRemovedEventArgs_AddRef
#define IHolographicSpaceCameraRemovedEventArgs_Release __x_ABI_CWindows_CGraphics_CHolographic_CIHolographicSpaceCameraRemovedEventArgs_Release
#define IHolographicSpaceCameraRemovedEventArgs_GetIids __x_ABI_CWindows_CGraphics_CHolographic_CIHolographicSpaceCameraRemovedEventArgs_GetIids
#define IHolographicSpaceCameraRemovedEventArgs_GetRuntimeClassName __x_ABI_CWindows_CGraphics_CHolographic_CIHolographicSpaceCameraRemovedEventArgs_GetRuntimeClassName
#define IHolographicSpaceCameraRemovedEventArgs_GetTrustLevel __x_ABI_CWindows_CGraphics_CHolographic_CIHolographicSpaceCameraRemovedEventArgs_GetTrustLevel
#define IHolographicSpaceCameraRemovedEventArgs_get_Camera __x_ABI_CWindows_CGraphics_CHolographic_CIHolographicSpaceCameraRemovedEventArgs_get_Camera
#endif /* WIDL_using_Windows_Graphics_Holographic */
#endif

#endif

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

/*
 * Class Windows.Graphics.Holographic.HolographicCamera
 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x20000
#ifndef RUNTIMECLASS_Windows_Graphics_Holographic_HolographicCamera_DEFINED
#define RUNTIMECLASS_Windows_Graphics_Holographic_HolographicCamera_DEFINED
#if !defined(_MSC_VER) && !defined(__MINGW32__)
static const WCHAR RuntimeClass_Windows_Graphics_Holographic_HolographicCamera[] = {'W','i','n','d','o','w','s','.','G','r','a','p','h','i','c','s','.','H','o','l','o','g','r','a','p','h','i','c','.','H','o','l','o','g','r','a','p','h','i','c','C','a','m','e','r','a',0};
#elif defined(__GNUC__) && !defined(__cplusplus)
const DECLSPEC_SELECTANY WCHAR RuntimeClass_Windows_Graphics_Holographic_HolographicCamera[] = L"Windows.Graphics.Holographic.HolographicCamera";
#else
extern const DECLSPEC_SELECTANY WCHAR RuntimeClass_Windows_Graphics_Holographic_HolographicCamera[] = {'W','i','n','d','o','w','s','.','G','r','a','p','h','i','c','s','.','H','o','l','o','g','r','a','p','h','i','c','.','H','o','l','o','g','r','a','p','h','i','c','C','a','m','e','r','a',0};
#endif
#endif /* RUNTIMECLASS_Windows_Graphics_Holographic_HolographicCamera_DEFINED */
#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x20000 */

/*
 * Class Windows.Graphics.Holographic.HolographicCameraPose
 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x20000
#ifndef RUNTIMECLASS_Windows_Graphics_Holographic_HolographicCameraPose_DEFINED
#define RUNTIMECLASS_Windows_Graphics_Holographic_HolographicCameraPose_DEFINED
#if !defined(_MSC_VER) && !defined(__MINGW32__)
static const WCHAR RuntimeClass_Windows_Graphics_Holographic_HolographicCameraPose[] = {'W','i','n','d','o','w','s','.','G','r','a','p','h','i','c','s','.','H','o','l','o','g','r','a','p','h','i','c','.','H','o','l','o','g','r','a','p','h','i','c','C','a','m','e','r','a','P','o','s','e',0};
#elif defined(__GNUC__) && !defined(__cplusplus)
const DECLSPEC_SELECTANY WCHAR RuntimeClass_Windows_Graphics_Holographic_HolographicCameraPose[] = L"Windows.Graphics.Holographic.HolographicCameraPose";
#else
extern const DECLSPEC_SELECTANY WCHAR RuntimeClass_Windows_Graphics_Holographic_HolographicCameraPose[] = {'W','i','n','d','o','w','s','.','G','r','a','p','h','i','c','s','.','H','o','l','o','g','r','a','p','h','i','c','.','H','o','l','o','g','r','a','p','h','i','c','C','a','m','e','r','a','P','o','s','e',0};
#endif
#endif /* RUNTIMECLASS_Windows_Graphics_Holographic_HolographicCameraPose_DEFINED */
#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x20000 */

/*
 * Class Windows.Graphics.Holographic.HolographicCameraRenderingParameters
 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x20000
#ifndef RUNTIMECLASS_Windows_Graphics_Holographic_HolographicCameraRenderingParameters_DEFINED
#define RUNTIMECLASS_Windows_Graphics_Holographic_HolographicCameraRenderingParameters_DEFINED
#if !defined(_MSC_VER) && !defined(__MINGW32__)
static const WCHAR RuntimeClass_Windows_Graphics_Holographic_HolographicCameraRenderingParameters[] = {'W','i','n','d','o','w','s','.','G','r','a','p','h','i','c','s','.','H','o','l','o','g','r','a','p','h','i','c','.','H','o','l','o','g','r','a','p','h','i','c','C','a','m','e','r','a','R','e','n','d','e','r','i','n','g','P','a','r','a','m','e','t','e','r','s',0};
#elif defined(__GNUC__) && !defined(__cplusplus)
const DECLSPEC_SELECTANY WCHAR RuntimeClass_Windows_Graphics_Holographic_HolographicCameraRenderingParameters[] = L"Windows.Graphics.Holographic.HolographicCameraRenderingParameters";
#else
extern const DECLSPEC_SELECTANY WCHAR RuntimeClass_Windows_Graphics_Holographic_HolographicCameraRenderingParameters[] = {'W','i','n','d','o','w','s','.','G','r','a','p','h','i','c','s','.','H','o','l','o','g','r','a','p','h','i','c','.','H','o','l','o','g','r','a','p','h','i','c','C','a','m','e','r','a','R','e','n','d','e','r','i','n','g','P','a','r','a','m','e','t','e','r','s',0};
#endif
#endif /* RUNTIMECLASS_Windows_Graphics_Holographic_HolographicCameraRenderingParameters_DEFINED */
#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x20000 */

/*
 * Class Windows.Graphics.Holographic.HolographicFrame
 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x20000
#ifndef RUNTIMECLASS_Windows_Graphics_Holographic_HolographicFrame_DEFINED
#define RUNTIMECLASS_Windows_Graphics_Holographic_HolographicFrame_DEFINED
#if !defined(_MSC_VER) && !defined(__MINGW32__)
static const WCHAR RuntimeClass_Windows_Graphics_Holographic_HolographicFrame[] = {'W','i','n','d','o','w','s','.','G','r','a','p','h','i','c','s','.','H','o','l','o','g','r','a','p','h','i','c','.','H','o','l','o','g','r','a','p','h','i','c','F','r','a','m','e',0};
#elif defined(__GNUC__) && !defined(__cplusplus)
const DECLSPEC_SELECTANY WCHAR RuntimeClass_Windows_Graphics_Holographic_HolographicFrame[] = L"Windows.Graphics.Holographic.HolographicFrame";
#else
extern const DECLSPEC_SELECTANY WCHAR RuntimeClass_Windows_Graphics_Holographic_HolographicFrame[] = {'W','i','n','d','o','w','s','.','G','r','a','p','h','i','c','s','.','H','o','l','o','g','r','a','p','h','i','c','.','H','o','l','o','g','r','a','p','h','i','c','F','r','a','m','e',0};
#endif
#endif /* RUNTIMECLASS_Windows_Graphics_Holographic_HolographicFrame_DEFINED */
#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x20000 */

/*
 * Class Windows.Graphics.Holographic.HolographicFramePrediction
 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x20000
#ifndef RUNTIMECLASS_Windows_Graphics_Holographic_HolographicFramePrediction_DEFINED
#define RUNTIMECLASS_Windows_Graphics_Holographic_HolographicFramePrediction_DEFINED
#if !defined(_MSC_VER) && !defined(__MINGW32__)
static const WCHAR RuntimeClass_Windows_Graphics_Holographic_HolographicFramePrediction[] = {'W','i','n','d','o','w','s','.','G','r','a','p','h','i','c','s','.','H','o','l','o','g','r','a','p','h','i','c','.','H','o','l','o','g','r','a','p','h','i','c','F','r','a','m','e','P','r','e','d','i','c','t','i','o','n',0};
#elif defined(__GNUC__) && !defined(__cplusplus)
const DECLSPEC_SELECTANY WCHAR RuntimeClass_Windows_Graphics_Holographic_HolographicFramePrediction[] = L"Windows.Graphics.Holographic.HolographicFramePrediction";
#else
extern const DECLSPEC_SELECTANY WCHAR RuntimeClass_Windows_Graphics_Holographic_HolographicFramePrediction[] = {'W','i','n','d','o','w','s','.','G','r','a','p','h','i','c','s','.','H','o','l','o','g','r','a','p','h','i','c','.','H','o','l','o','g','r','a','p','h','i','c','F','r','a','m','e','P','r','e','d','i','c','t','i','o','n',0};
#endif
#endif /* RUNTIMECLASS_Windows_Graphics_Holographic_HolographicFramePrediction_DEFINED */
#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x20000 */

/*
 * Class Windows.Graphics.Holographic.HolographicSpace
 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x20000
#ifndef RUNTIMECLASS_Windows_Graphics_Holographic_HolographicSpace_DEFINED
#define RUNTIMECLASS_Windows_Graphics_Holographic_HolographicSpace_DEFINED
#if !defined(_MSC_VER) && !defined(__MINGW32__)
static const WCHAR RuntimeClass_Windows_Graphics_Holographic_HolographicSpace[] = {'W','i','n','d','o','w','s','.','G','r','a','p','h','i','c','s','.','H','o','l','o','g','r','a','p','h','i','c','.','H','o','l','o','g','r','a','p','h','i','c','S','p','a','c','e',0};
#elif defined(__GNUC__) && !defined(__cplusplus)
const DECLSPEC_SELECTANY WCHAR RuntimeClass_Windows_Graphics_Holographic_HolographicSpace[] = L"Windows.Graphics.Holographic.HolographicSpace";
#else
extern const DECLSPEC_SELECTANY WCHAR RuntimeClass_Windows_Graphics_Holographic_HolographicSpace[] = {'W','i','n','d','o','w','s','.','G','r','a','p','h','i','c','s','.','H','o','l','o','g','r','a','p','h','i','c','.','H','o','l','o','g','r','a','p','h','i','c','S','p','a','c','e',0};
#endif
#endif /* RUNTIMECLASS_Windows_Graphics_Holographic_HolographicSpace_DEFINED */
#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x20000 */

/*
 * Class Windows.Graphics.Holographic.HolographicSpaceCameraAddedEventArgs
 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x20000
#ifndef RUNTIMECLASS_Windows_Graphics_Holographic_HolographicSpaceCameraAddedEventArgs_DEFINED
#define RUNTIMECLASS_Windows_Graphics_Holographic_HolographicSpaceCameraAddedEventArgs_DEFINED
#if !defined(_MSC_VER) && !defined(__MINGW32__)
static const WCHAR RuntimeClass_Windows_Graphics_Holographic_HolographicSpaceCameraAddedEventArgs[] = {'W','i','n','d','o','w','s','.','G','r','a','p','h','i','c','s','.','H','o','l','o','g','r','a','p','h','i','c','.','H','o','l','o','g','r','a','p','h','i','c','S','p','a','c','e','C','a','m','e','r','a','A','d','d','e','d','E','v','e','n','t','A','r','g','s',0};
#elif defined(__GNUC__) && !defined(__cplusplus)
const DECLSPEC_SELECTANY WCHAR RuntimeClass_Windows_Graphics_Holographic_HolographicSpaceCameraAddedEventArgs[] = L"Windows.Graphics.Holographic.HolographicSpaceCameraAddedEventArgs";
#else
extern const DECLSPEC_SELECTANY WCHAR RuntimeClass_Windows_Graphics_Holographic_HolographicSpaceCameraAddedEventArgs[] = {'W','i','n','d','o','w','s','.','G','r','a','p','h','i','c','s','.','H','o','l','o','g','r','a','p','h','i','c','.','H','o','l','o','g','r','a','p','h','i','c','S','p','a','c','e','C','a','m','e','r','a','A','d','d','e','d','E','v','e','n','t','A','r','g','s',0};
#endif
#endif /* RUNTIMECLASS_Windows_Graphics_Holographic_HolographicSpaceCameraAddedEventArgs_DEFINED */
#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x20000 */

/*
 * Class Windows.Graphics.Holographic.HolographicSpaceCameraRemovedEventArgs
 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x20000
#ifndef RUNTIMECLASS_Windows_Graphics_Holographic_HolographicSpaceCameraRemovedEventArgs_DEFINED
#define RUNTIMECLASS_Windows_Graphics_Holographic_HolographicSpaceCameraRemovedEventArgs_DEFINED
#if !defined(_MSC_VER) && !defined(__MINGW32__)
static const WCHAR RuntimeClass_Windows_Graphics_Holographic_HolographicSpaceCameraRemovedEventArgs[] = {'W','i','n','d','o','w','s','.','G','r','a','p','h','i','c','s','.','H','o','l','o','g','r','a','p','h','i','c','.','H','o','l','o','g','r','a','p','h','i','c','S','p','a','c','e','C','a','m','e','r','a','R','e','m','o','v','e','d','E','v','e','n','t','A','r','g','s',0};
#elif defined(__GNUC__) && !defined(__cplusplus)
const DECLSPEC_SELECTANY WCHAR RuntimeClass_Windows_Graphics_Holographic_HolographicSpaceCameraRemovedEventArgs[] = L"Windows.Graphics.Holographic.HolographicSpaceCameraRemovedEventArgs";
#else
extern const DECLSPEC_SELECTANY WCHAR RuntimeClass_Windows_Graphics_Holographic_HolographicSpaceCameraRemovedEventArgs[] = {'W','i','n','d','o','w','s','.','G','r','a','p','h','i','c','s','.','H','o','l','o','g','r','a','p','h','i','c','.','H','o','l','o','g','r','a','p','h','i','c','S','p','a','c','e','C','a','m','e','r','a','R','e','m','o','v','e','d','E','v','e','n','t','A','r','g','s',0};
#endif
#endif /* RUNTIMECLASS_Windows_Graphics_Holographic_HolographicSpaceCameraRemovedEventArgs_DEFINED */
#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x20000 */

/*****************************************************************************
 * IVectorView<ABI::Windows::Graphics::Holographic::HolographicCamera* > interface
 */
#ifndef ____FIVectorView_1_Windows__CGraphics__CHolographic__CHolographicCamera_INTERFACE_DEFINED__
#define ____FIVectorView_1_Windows__CGraphics__CHolographic__CHolographicCamera_INTERFACE_DEFINED__

DEFINE_GUID(IID___FIVectorView_1_Windows__CGraphics__CHolographic__CHolographicCamera, 0x01d6c0ae, 0xada5, 0x50b0, 0x85,0x62, 0x41,0xfb,0x12,0x05,0xbb,0x4a);
#if defined(__cplusplus) && !defined(CINTERFACE)
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace Foundation {
            namespace Collections {
                template<>
                MIDL_INTERFACE("01d6c0ae-ada5-50b0-8562-41fb1205bb4a")
                IVectorView<ABI::Windows::Graphics::Holographic::HolographicCamera* > : IVectorView_impl<ABI::Windows::Foundation::Internal::AggregateType<ABI::Windows::Graphics::Holographic::HolographicCamera*, ABI::Windows::Graphics::Holographic::IHolographicCamera* > >
                {
                };
            }
        }
    }
}
extern "C" {
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(__FIVectorView_1_Windows__CGraphics__CHolographic__CHolographicCamera, 0x01d6c0ae, 0xada5, 0x50b0, 0x85,0x62, 0x41,0xfb,0x12,0x05,0xbb,0x4a)
#endif
#else
typedef struct __FIVectorView_1_Windows__CGraphics__CHolographic__CHolographicCameraVtbl {
    BEGIN_INTERFACE

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

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

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

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

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

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

    /*** IVectorView<ABI::Windows::Graphics::Holographic::HolographicCamera* > methods ***/
    HRESULT (STDMETHODCALLTYPE *GetAt)(
        __FIVectorView_1_Windows__CGraphics__CHolographic__CHolographicCamera *This,
        UINT32 index,
        __x_ABI_CWindows_CGraphics_CHolographic_CIHolographicCamera **value);

    HRESULT (STDMETHODCALLTYPE *get_Size)(
        __FIVectorView_1_Windows__CGraphics__CHolographic__CHolographicCamera *This,
        UINT32 *value);

    HRESULT (STDMETHODCALLTYPE *IndexOf)(
        __FIVectorView_1_Windows__CGraphics__CHolographic__CHolographicCamera *This,
        __x_ABI_CWindows_CGraphics_CHolographic_CIHolographicCamera *element,
        UINT32 *index,
        BOOLEAN *value);

    HRESULT (STDMETHODCALLTYPE *GetMany)(
        __FIVectorView_1_Windows__CGraphics__CHolographic__CHolographicCamera *This,
        UINT32 start_index,
        UINT32 items_size,
        __x_ABI_CWindows_CGraphics_CHolographic_CIHolographicCamera **items,
        UINT32 *value);

    END_INTERFACE
} __FIVectorView_1_Windows__CGraphics__CHolographic__CHolographicCameraVtbl;

interface __FIVectorView_1_Windows__CGraphics__CHolographic__CHolographicCamera {
    CONST_VTBL __FIVectorView_1_Windows__CGraphics__CHolographic__CHolographicCameraVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define __FIVectorView_1_Windows__CGraphics__CHolographic__CHolographicCamera_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define __FIVectorView_1_Windows__CGraphics__CHolographic__CHolographicCamera_AddRef(This) (This)->lpVtbl->AddRef(This)
#define __FIVectorView_1_Windows__CGraphics__CHolographic__CHolographicCamera_Release(This) (This)->lpVtbl->Release(This)
/*** IInspectable methods ***/
#define __FIVectorView_1_Windows__CGraphics__CHolographic__CHolographicCamera_GetIids(This,iidCount,iids) (This)->lpVtbl->GetIids(This,iidCount,iids)
#define __FIVectorView_1_Windows__CGraphics__CHolographic__CHolographicCamera_GetRuntimeClassName(This,className) (This)->lpVtbl->GetRuntimeClassName(This,className)
#define __FIVectorView_1_Windows__CGraphics__CHolographic__CHolographicCamera_GetTrustLevel(This,trustLevel) (This)->lpVtbl->GetTrustLevel(This,trustLevel)
/*** IVectorView<ABI::Windows::Graphics::Holographic::HolographicCamera* > methods ***/
#define __FIVectorView_1_Windows__CGraphics__CHolographic__CHolographicCamera_GetAt(This,index,value) (This)->lpVtbl->GetAt(This,index,value)
#define __FIVectorView_1_Windows__CGraphics__CHolographic__CHolographicCamera_get_Size(This,value) (This)->lpVtbl->get_Size(This,value)
#define __FIVectorView_1_Windows__CGraphics__CHolographic__CHolographicCamera_IndexOf(This,element,index,value) (This)->lpVtbl->IndexOf(This,element,index,value)
#define __FIVectorView_1_Windows__CGraphics__CHolographic__CHolographicCamera_GetMany(This,start_index,items_size,items,value) (This)->lpVtbl->GetMany(This,start_index,items_size,items,value)
#else
/*** IUnknown methods ***/
static inline HRESULT __FIVectorView_1_Windows__CGraphics__CHolographic__CHolographicCamera_QueryInterface(__FIVectorView_1_Windows__CGraphics__CHolographic__CHolographicCamera* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG __FIVectorView_1_Windows__CGraphics__CHolographic__CHolographicCamera_AddRef(__FIVectorView_1_Windows__CGraphics__CHolographic__CHolographicCamera* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG __FIVectorView_1_Windows__CGraphics__CHolographic__CHolographicCamera_Release(__FIVectorView_1_Windows__CGraphics__CHolographic__CHolographicCamera* This) {
    return This->lpVtbl->Release(This);
}
/*** IInspectable methods ***/
static inline HRESULT __FIVectorView_1_Windows__CGraphics__CHolographic__CHolographicCamera_GetIids(__FIVectorView_1_Windows__CGraphics__CHolographic__CHolographicCamera* This,ULONG *iidCount,IID **iids) {
    return This->lpVtbl->GetIids(This,iidCount,iids);
}
static inline HRESULT __FIVectorView_1_Windows__CGraphics__CHolographic__CHolographicCamera_GetRuntimeClassName(__FIVectorView_1_Windows__CGraphics__CHolographic__CHolographicCamera* This,HSTRING *className) {
    return This->lpVtbl->GetRuntimeClassName(This,className);
}
static inline HRESULT __FIVectorView_1_Windows__CGraphics__CHolographic__CHolographicCamera_GetTrustLevel(__FIVectorView_1_Windows__CGraphics__CHolographic__CHolographicCamera* This,TrustLevel *trustLevel) {
    return This->lpVtbl->GetTrustLevel(This,trustLevel);
}
/*** IVectorView<ABI::Windows::Graphics::Holographic::HolographicCamera* > methods ***/
static inline HRESULT __FIVectorView_1_Windows__CGraphics__CHolographic__CHolographicCamera_GetAt(__FIVectorView_1_Windows__CGraphics__CHolographic__CHolographicCamera* This,UINT32 index,__x_ABI_CWindows_CGraphics_CHolographic_CIHolographicCamera **value) {
    return This->lpVtbl->GetAt(This,index,value);
}
static inline HRESULT __FIVectorView_1_Windows__CGraphics__CHolographic__CHolographicCamera_get_Size(__FIVectorView_1_Windows__CGraphics__CHolographic__CHolographicCamera* This,UINT32 *value) {
    return This->lpVtbl->get_Size(This,value);
}
static inline HRESULT __FIVectorView_1_Windows__CGraphics__CHolographic__CHolographicCamera_IndexOf(__FIVectorView_1_Windows__CGraphics__CHolographic__CHolographicCamera* This,__x_ABI_CWindows_CGraphics_CHolographic_CIHolographicCamera *element,UINT32 *index,BOOLEAN *value) {
    return This->lpVtbl->IndexOf(This,element,index,value);
}
static inline HRESULT __FIVectorView_1_Windows__CGraphics__CHolographic__CHolographicCamera_GetMany(__FIVectorView_1_Windows__CGraphics__CHolographic__CHolographicCamera* This,UINT32 start_index,UINT32 items_size,__x_ABI_CWindows_CGraphics_CHolographic_CIHolographicCamera **items,UINT32 *value) {
    return This->lpVtbl->GetMany(This,start_index,items_size,items,value);
}
#endif
#ifdef WIDL_using_Windows_Foundation_Collections
#define IID_IVectorView_HolographicCamera IID___FIVectorView_1_Windows__CGraphics__CHolographic__CHolographicCamera
#define IVectorView_HolographicCameraVtbl __FIVectorView_1_Windows__CGraphics__CHolographic__CHolographicCameraVtbl
#define IVectorView_HolographicCamera __FIVectorView_1_Windows__CGraphics__CHolographic__CHolographicCamera
#define IVectorView_HolographicCamera_QueryInterface __FIVectorView_1_Windows__CGraphics__CHolographic__CHolographicCamera_QueryInterface
#define IVectorView_HolographicCamera_AddRef __FIVectorView_1_Windows__CGraphics__CHolographic__CHolographicCamera_AddRef
#define IVectorView_HolographicCamera_Release __FIVectorView_1_Windows__CGraphics__CHolographic__CHolographicCamera_Release
#define IVectorView_HolographicCamera_GetIids __FIVectorView_1_Windows__CGraphics__CHolographic__CHolographicCamera_GetIids
#define IVectorView_HolographicCamera_GetRuntimeClassName __FIVectorView_1_Windows__CGraphics__CHolographic__CHolographicCamera_GetRuntimeClassName
#define IVectorView_HolographicCamera_GetTrustLevel __FIVectorView_1_Windows__CGraphics__CHolographic__CHolographicCamera_GetTrustLevel
#define IVectorView_HolographicCamera_GetAt __FIVectorView_1_Windows__CGraphics__CHolographic__CHolographicCamera_GetAt
#define IVectorView_HolographicCamera_get_Size __FIVectorView_1_Windows__CGraphics__CHolographic__CHolographicCamera_get_Size
#define IVectorView_HolographicCamera_IndexOf __FIVectorView_1_Windows__CGraphics__CHolographic__CHolographicCamera_IndexOf
#define IVectorView_HolographicCamera_GetMany __FIVectorView_1_Windows__CGraphics__CHolographic__CHolographicCamera_GetMany
#endif /* WIDL_using_Windows_Foundation_Collections */
#endif

#endif

#endif  /* ____FIVectorView_1_Windows__CGraphics__CHolographic__CHolographicCamera_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IVectorView<ABI::Windows::Graphics::Holographic::HolographicCameraPose* > interface
 */
#ifndef ____FIVectorView_1_Windows__CGraphics__CHolographic__CHolographicCameraPose_INTERFACE_DEFINED__
#define ____FIVectorView_1_Windows__CGraphics__CHolographic__CHolographicCameraPose_INTERFACE_DEFINED__

DEFINE_GUID(IID___FIVectorView_1_Windows__CGraphics__CHolographic__CHolographicCameraPose, 0x17c5dfb1, 0x6e87, 0x5a17, 0xa7,0x91, 0xac,0x07,0xf8,0xee,0x92,0x92);
#if defined(__cplusplus) && !defined(CINTERFACE)
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace Foundation {
            namespace Collections {
                template<>
                MIDL_INTERFACE("17c5dfb1-6e87-5a17-a791-ac07f8ee9292")
                IVectorView<ABI::Windows::Graphics::Holographic::HolographicCameraPose* > : IVectorView_impl<ABI::Windows::Foundation::Internal::AggregateType<ABI::Windows::Graphics::Holographic::HolographicCameraPose*, ABI::Windows::Graphics::Holographic::IHolographicCameraPose* > >
                {
                };
            }
        }
    }
}
extern "C" {
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(__FIVectorView_1_Windows__CGraphics__CHolographic__CHolographicCameraPose, 0x17c5dfb1, 0x6e87, 0x5a17, 0xa7,0x91, 0xac,0x07,0xf8,0xee,0x92,0x92)
#endif
#else
typedef struct __FIVectorView_1_Windows__CGraphics__CHolographic__CHolographicCameraPoseVtbl {
    BEGIN_INTERFACE

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

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

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

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

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

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

    /*** IVectorView<ABI::Windows::Graphics::Holographic::HolographicCameraPose* > methods ***/
    HRESULT (STDMETHODCALLTYPE *GetAt)(
        __FIVectorView_1_Windows__CGraphics__CHolographic__CHolographicCameraPose *This,
        UINT32 index,
        __x_ABI_CWindows_CGraphics_CHolographic_CIHolographicCameraPose **value);

    HRESULT (STDMETHODCALLTYPE *get_Size)(
        __FIVectorView_1_Windows__CGraphics__CHolographic__CHolographicCameraPose *This,
        UINT32 *value);

    HRESULT (STDMETHODCALLTYPE *IndexOf)(
        __FIVectorView_1_Windows__CGraphics__CHolographic__CHolographicCameraPose *This,
        __x_ABI_CWindows_CGraphics_CHolographic_CIHolographicCameraPose *element,
        UINT32 *index,
        BOOLEAN *value);

    HRESULT (STDMETHODCALLTYPE *GetMany)(
        __FIVectorView_1_Windows__CGraphics__CHolographic__CHolographicCameraPose *This,
        UINT32 start_index,
        UINT32 items_size,
        __x_ABI_CWindows_CGraphics_CHolographic_CIHolographicCameraPose **items,
        UINT32 *value);

    END_INTERFACE
} __FIVectorView_1_Windows__CGraphics__CHolographic__CHolographicCameraPoseVtbl;

interface __FIVectorView_1_Windows__CGraphics__CHolographic__CHolographicCameraPose {
    CONST_VTBL __FIVectorView_1_Windows__CGraphics__CHolographic__CHolographicCameraPoseVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define __FIVectorView_1_Windows__CGraphics__CHolographic__CHolographicCameraPose_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define __FIVectorView_1_Windows__CGraphics__CHolographic__CHolographicCameraPose_AddRef(This) (This)->lpVtbl->AddRef(This)
#define __FIVectorView_1_Windows__CGraphics__CHolographic__CHolographicCameraPose_Release(This) (This)->lpVtbl->Release(This)
/*** IInspectable methods ***/
#define __FIVectorView_1_Windows__CGraphics__CHolographic__CHolographicCameraPose_GetIids(This,iidCount,iids) (This)->lpVtbl->GetIids(This,iidCount,iids)
#define __FIVectorView_1_Windows__CGraphics__CHolographic__CHolographicCameraPose_GetRuntimeClassName(This,className) (This)->lpVtbl->GetRuntimeClassName(This,className)
#define __FIVectorView_1_Windows__CGraphics__CHolographic__CHolographicCameraPose_GetTrustLevel(This,trustLevel) (This)->lpVtbl->GetTrustLevel(This,trustLevel)
/*** IVectorView<ABI::Windows::Graphics::Holographic::HolographicCameraPose* > methods ***/
#define __FIVectorView_1_Windows__CGraphics__CHolographic__CHolographicCameraPose_GetAt(This,index,value) (This)->lpVtbl->GetAt(This,index,value)
#define __FIVectorView_1_Windows__CGraphics__CHolographic__CHolographicCameraPose_get_Size(This,value) (This)->lpVtbl->get_Size(This,value)
#define __FIVectorView_1_Windows__CGraphics__CHolographic__CHolographicCameraPose_IndexOf(This,element,index,value) (This)->lpVtbl->IndexOf(This,element,index,value)
#define __FIVectorView_1_Windows__CGraphics__CHolographic__CHolographicCameraPose_GetMany(This,start_index,items_size,items,value) (This)->lpVtbl->GetMany(This,start_index,items_size,items,value)
#else
/*** IUnknown methods ***/
static inline HRESULT __FIVectorView_1_Windows__CGraphics__CHolographic__CHolographicCameraPose_QueryInterface(__FIVectorView_1_Windows__CGraphics__CHolographic__CHolographicCameraPose* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG __FIVectorView_1_Windows__CGraphics__CHolographic__CHolographicCameraPose_AddRef(__FIVectorView_1_Windows__CGraphics__CHolographic__CHolographicCameraPose* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG __FIVectorView_1_Windows__CGraphics__CHolographic__CHolographicCameraPose_Release(__FIVectorView_1_Windows__CGraphics__CHolographic__CHolographicCameraPose* This) {
    return This->lpVtbl->Release(This);
}
/*** IInspectable methods ***/
static inline HRESULT __FIVectorView_1_Windows__CGraphics__CHolographic__CHolographicCameraPose_GetIids(__FIVectorView_1_Windows__CGraphics__CHolographic__CHolographicCameraPose* This,ULONG *iidCount,IID **iids) {
    return This->lpVtbl->GetIids(This,iidCount,iids);
}
static inline HRESULT __FIVectorView_1_Windows__CGraphics__CHolographic__CHolographicCameraPose_GetRuntimeClassName(__FIVectorView_1_Windows__CGraphics__CHolographic__CHolographicCameraPose* This,HSTRING *className) {
    return This->lpVtbl->GetRuntimeClassName(This,className);
}
static inline HRESULT __FIVectorView_1_Windows__CGraphics__CHolographic__CHolographicCameraPose_GetTrustLevel(__FIVectorView_1_Windows__CGraphics__CHolographic__CHolographicCameraPose* This,TrustLevel *trustLevel) {
    return This->lpVtbl->GetTrustLevel(This,trustLevel);
}
/*** IVectorView<ABI::Windows::Graphics::Holographic::HolographicCameraPose* > methods ***/
static inline HRESULT __FIVectorView_1_Windows__CGraphics__CHolographic__CHolographicCameraPose_GetAt(__FIVectorView_1_Windows__CGraphics__CHolographic__CHolographicCameraPose* This,UINT32 index,__x_ABI_CWindows_CGraphics_CHolographic_CIHolographicCameraPose **value) {
    return This->lpVtbl->GetAt(This,index,value);
}
static inline HRESULT __FIVectorView_1_Windows__CGraphics__CHolographic__CHolographicCameraPose_get_Size(__FIVectorView_1_Windows__CGraphics__CHolographic__CHolographicCameraPose* This,UINT32 *value) {
    return This->lpVtbl->get_Size(This,value);
}
static inline HRESULT __FIVectorView_1_Windows__CGraphics__CHolographic__CHolographicCameraPose_IndexOf(__FIVectorView_1_Windows__CGraphics__CHolographic__CHolographicCameraPose* This,__x_ABI_CWindows_CGraphics_CHolographic_CIHolographicCameraPose *element,UINT32 *index,BOOLEAN *value) {
    return This->lpVtbl->IndexOf(This,element,index,value);
}
static inline HRESULT __FIVectorView_1_Windows__CGraphics__CHolographic__CHolographicCameraPose_GetMany(__FIVectorView_1_Windows__CGraphics__CHolographic__CHolographicCameraPose* This,UINT32 start_index,UINT32 items_size,__x_ABI_CWindows_CGraphics_CHolographic_CIHolographicCameraPose **items,UINT32 *value) {
    return This->lpVtbl->GetMany(This,start_index,items_size,items,value);
}
#endif
#ifdef WIDL_using_Windows_Foundation_Collections
#define IID_IVectorView_HolographicCameraPose IID___FIVectorView_1_Windows__CGraphics__CHolographic__CHolographicCameraPose
#define IVectorView_HolographicCameraPoseVtbl __FIVectorView_1_Windows__CGraphics__CHolographic__CHolographicCameraPoseVtbl
#define IVectorView_HolographicCameraPose __FIVectorView_1_Windows__CGraphics__CHolographic__CHolographicCameraPose
#define IVectorView_HolographicCameraPose_QueryInterface __FIVectorView_1_Windows__CGraphics__CHolographic__CHolographicCameraPose_QueryInterface
#define IVectorView_HolographicCameraPose_AddRef __FIVectorView_1_Windows__CGraphics__CHolographic__CHolographicCameraPose_AddRef
#define IVectorView_HolographicCameraPose_Release __FIVectorView_1_Windows__CGraphics__CHolographic__CHolographicCameraPose_Release
#define IVectorView_HolographicCameraPose_GetIids __FIVectorView_1_Windows__CGraphics__CHolographic__CHolographicCameraPose_GetIids
#define IVectorView_HolographicCameraPose_GetRuntimeClassName __FIVectorView_1_Windows__CGraphics__CHolographic__CHolographicCameraPose_GetRuntimeClassName
#define IVectorView_HolographicCameraPose_GetTrustLevel __FIVectorView_1_Windows__CGraphics__CHolographic__CHolographicCameraPose_GetTrustLevel
#define IVectorView_HolographicCameraPose_GetAt __FIVectorView_1_Windows__CGraphics__CHolographic__CHolographicCameraPose_GetAt
#define IVectorView_HolographicCameraPose_get_Size __FIVectorView_1_Windows__CGraphics__CHolographic__CHolographicCameraPose_get_Size
#define IVectorView_HolographicCameraPose_IndexOf __FIVectorView_1_Windows__CGraphics__CHolographic__CHolographicCameraPose_IndexOf
#define IVectorView_HolographicCameraPose_GetMany __FIVectorView_1_Windows__CGraphics__CHolographic__CHolographicCameraPose_GetMany
#endif /* WIDL_using_Windows_Foundation_Collections */
#endif

#endif

#endif  /* ____FIVectorView_1_Windows__CGraphics__CHolographic__CHolographicCameraPose_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IReference<ABI::Windows::Graphics::Holographic::HolographicStereoTransform > interface
 */
#ifndef ____FIReference_1_HolographicStereoTransform_INTERFACE_DEFINED__
#define ____FIReference_1_HolographicStereoTransform_INTERFACE_DEFINED__

DEFINE_GUID(IID___FIReference_1_HolographicStereoTransform, 0x6e67ce78, 0xcc67, 0x52c0, 0xb6,0x35, 0x99,0x1d,0xb0,0xbf,0xf5,0xca);
#if defined(__cplusplus) && !defined(CINTERFACE)
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace Foundation {
            template<>
            MIDL_INTERFACE("6e67ce78-cc67-52c0-b635-991db0bff5ca")
            IReference<ABI::Windows::Graphics::Holographic::HolographicStereoTransform > : IReference_impl<ABI::Windows::Graphics::Holographic::HolographicStereoTransform >
            {
            };
        }
    }
}
extern "C" {
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(__FIReference_1_HolographicStereoTransform, 0x6e67ce78, 0xcc67, 0x52c0, 0xb6,0x35, 0x99,0x1d,0xb0,0xbf,0xf5,0xca)
#endif
#else
typedef struct __FIReference_1_HolographicStereoTransformVtbl {
    BEGIN_INTERFACE

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

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

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

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

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

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

    /*** IReference<ABI::Windows::Graphics::Holographic::HolographicStereoTransform > methods ***/
    HRESULT (STDMETHODCALLTYPE *get_Value)(
        __FIReference_1_HolographicStereoTransform *This,
        __x_ABI_CWindows_CGraphics_CHolographic_CHolographicStereoTransform *value);

    END_INTERFACE
} __FIReference_1_HolographicStereoTransformVtbl;

interface __FIReference_1_HolographicStereoTransform {
    CONST_VTBL __FIReference_1_HolographicStereoTransformVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define __FIReference_1_HolographicStereoTransform_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define __FIReference_1_HolographicStereoTransform_AddRef(This) (This)->lpVtbl->AddRef(This)
#define __FIReference_1_HolographicStereoTransform_Release(This) (This)->lpVtbl->Release(This)
/*** IInspectable methods ***/
#define __FIReference_1_HolographicStereoTransform_GetIids(This,iidCount,iids) (This)->lpVtbl->GetIids(This,iidCount,iids)
#define __FIReference_1_HolographicStereoTransform_GetRuntimeClassName(This,className) (This)->lpVtbl->GetRuntimeClassName(This,className)
#define __FIReference_1_HolographicStereoTransform_GetTrustLevel(This,trustLevel) (This)->lpVtbl->GetTrustLevel(This,trustLevel)
/*** IReference<ABI::Windows::Graphics::Holographic::HolographicStereoTransform > methods ***/
#define __FIReference_1_HolographicStereoTransform_get_Value(This,value) (This)->lpVtbl->get_Value(This,value)
#else
/*** IUnknown methods ***/
static inline HRESULT __FIReference_1_HolographicStereoTransform_QueryInterface(__FIReference_1_HolographicStereoTransform* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG __FIReference_1_HolographicStereoTransform_AddRef(__FIReference_1_HolographicStereoTransform* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG __FIReference_1_HolographicStereoTransform_Release(__FIReference_1_HolographicStereoTransform* This) {
    return This->lpVtbl->Release(This);
}
/*** IInspectable methods ***/
static inline HRESULT __FIReference_1_HolographicStereoTransform_GetIids(__FIReference_1_HolographicStereoTransform* This,ULONG *iidCount,IID **iids) {
    return This->lpVtbl->GetIids(This,iidCount,iids);
}
static inline HRESULT __FIReference_1_HolographicStereoTransform_GetRuntimeClassName(__FIReference_1_HolographicStereoTransform* This,HSTRING *className) {
    return This->lpVtbl->GetRuntimeClassName(This,className);
}
static inline HRESULT __FIReference_1_HolographicStereoTransform_GetTrustLevel(__FIReference_1_HolographicStereoTransform* This,TrustLevel *trustLevel) {
    return This->lpVtbl->GetTrustLevel(This,trustLevel);
}
/*** IReference<ABI::Windows::Graphics::Holographic::HolographicStereoTransform > methods ***/
static inline HRESULT __FIReference_1_HolographicStereoTransform_get_Value(__FIReference_1_HolographicStereoTransform* This,__x_ABI_CWindows_CGraphics_CHolographic_CHolographicStereoTransform *value) {
    return This->lpVtbl->get_Value(This,value);
}
#endif
#ifdef WIDL_using_Windows_Foundation
#define IID_IReference_HolographicStereoTransform IID___FIReference_1_HolographicStereoTransform
#define IReference_HolographicStereoTransformVtbl __FIReference_1_HolographicStereoTransformVtbl
#define IReference_HolographicStereoTransform __FIReference_1_HolographicStereoTransform
#define IReference_HolographicStereoTransform_QueryInterface __FIReference_1_HolographicStereoTransform_QueryInterface
#define IReference_HolographicStereoTransform_AddRef __FIReference_1_HolographicStereoTransform_AddRef
#define IReference_HolographicStereoTransform_Release __FIReference_1_HolographicStereoTransform_Release
#define IReference_HolographicStereoTransform_GetIids __FIReference_1_HolographicStereoTransform_GetIids
#define IReference_HolographicStereoTransform_GetRuntimeClassName __FIReference_1_HolographicStereoTransform_GetRuntimeClassName
#define IReference_HolographicStereoTransform_GetTrustLevel __FIReference_1_HolographicStereoTransform_GetTrustLevel
#define IReference_HolographicStereoTransform_get_Value __FIReference_1_HolographicStereoTransform_get_Value
#endif /* WIDL_using_Windows_Foundation */
#endif

#endif

#endif  /* ____FIReference_1_HolographicStereoTransform_INTERFACE_DEFINED__ */

/*****************************************************************************
 * ITypedEventHandler<ABI::Windows::Graphics::Holographic::HolographicSpace*,IInspectable* > interface
 */
#ifndef ____FITypedEventHandler_2_Windows__CGraphics__CHolographic__CHolographicSpace_IInspectable_INTERFACE_DEFINED__
#define ____FITypedEventHandler_2_Windows__CGraphics__CHolographic__CHolographicSpace_IInspectable_INTERFACE_DEFINED__

DEFINE_GUID(IID___FITypedEventHandler_2_Windows__CGraphics__CHolographic__CHolographicSpace_IInspectable, 0x67aae2f2, 0x42d8, 0x5503, 0x91,0x31, 0xde,0xeb,0x45,0xa6,0xca,0x03);
#if defined(__cplusplus) && !defined(CINTERFACE)
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace Foundation {
            template<>
            MIDL_INTERFACE("67aae2f2-42d8-5503-9131-deeb45a6ca03")
            ITypedEventHandler<ABI::Windows::Graphics::Holographic::HolographicSpace*,IInspectable* > : ITypedEventHandler_impl<ABI::Windows::Foundation::Internal::AggregateType<ABI::Windows::Graphics::Holographic::HolographicSpace*, ABI::Windows::Graphics::Holographic::IHolographicSpace* >, IInspectable* >
            {
            };
        }
    }
}
extern "C" {
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(__FITypedEventHandler_2_Windows__CGraphics__CHolographic__CHolographicSpace_IInspectable, 0x67aae2f2, 0x42d8, 0x5503, 0x91,0x31, 0xde,0xeb,0x45,0xa6,0xca,0x03)
#endif
#else
typedef struct __FITypedEventHandler_2_Windows__CGraphics__CHolographic__CHolographicSpace_IInspectableVtbl {
    BEGIN_INTERFACE

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

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

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

    /*** ITypedEventHandler<ABI::Windows::Graphics::Holographic::HolographicSpace*,IInspectable* > methods ***/
    HRESULT (STDMETHODCALLTYPE *Invoke)(
        __FITypedEventHandler_2_Windows__CGraphics__CHolographic__CHolographicSpace_IInspectable *This,
        __x_ABI_CWindows_CGraphics_CHolographic_CIHolographicSpace *sender,
        IInspectable *args);

    END_INTERFACE
} __FITypedEventHandler_2_Windows__CGraphics__CHolographic__CHolographicSpace_IInspectableVtbl;

interface __FITypedEventHandler_2_Windows__CGraphics__CHolographic__CHolographicSpace_IInspectable {
    CONST_VTBL __FITypedEventHandler_2_Windows__CGraphics__CHolographic__CHolographicSpace_IInspectableVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define __FITypedEventHandler_2_Windows__CGraphics__CHolographic__CHolographicSpace_IInspectable_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define __FITypedEventHandler_2_Windows__CGraphics__CHolographic__CHolographicSpace_IInspectable_AddRef(This) (This)->lpVtbl->AddRef(This)
#define __FITypedEventHandler_2_Windows__CGraphics__CHolographic__CHolographicSpace_IInspectable_Release(This) (This)->lpVtbl->Release(This)
/*** ITypedEventHandler<ABI::Windows::Graphics::Holographic::HolographicSpace*,IInspectable* > methods ***/
#define __FITypedEventHandler_2_Windows__CGraphics__CHolographic__CHolographicSpace_IInspectable_Invoke(This,sender,args) (This)->lpVtbl->Invoke(This,sender,args)
#else
/*** IUnknown methods ***/
static inline HRESULT __FITypedEventHandler_2_Windows__CGraphics__CHolographic__CHolographicSpace_IInspectable_QueryInterface(__FITypedEventHandler_2_Windows__CGraphics__CHolographic__CHolographicSpace_IInspectable* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG __FITypedEventHandler_2_Windows__CGraphics__CHolographic__CHolographicSpace_IInspectable_AddRef(__FITypedEventHandler_2_Windows__CGraphics__CHolographic__CHolographicSpace_IInspectable* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG __FITypedEventHandler_2_Windows__CGraphics__CHolographic__CHolographicSpace_IInspectable_Release(__FITypedEventHandler_2_Windows__CGraphics__CHolographic__CHolographicSpace_IInspectable* This) {
    return This->lpVtbl->Release(This);
}
/*** ITypedEventHandler<ABI::Windows::Graphics::Holographic::HolographicSpace*,IInspectable* > methods ***/
static inline HRESULT __FITypedEventHandler_2_Windows__CGraphics__CHolographic__CHolographicSpace_IInspectable_Invoke(__FITypedEventHandler_2_Windows__CGraphics__CHolographic__CHolographicSpace_IInspectable* This,__x_ABI_CWindows_CGraphics_CHolographic_CIHolographicSpace *sender,IInspectable *args) {
    return This->lpVtbl->Invoke(This,sender,args);
}
#endif
#ifdef WIDL_using_Windows_Foundation
#define IID_ITypedEventHandler_HolographicSpace_IInspectable IID___FITypedEventHandler_2_Windows__CGraphics__CHolographic__CHolographicSpace_IInspectable
#define ITypedEventHandler_HolographicSpace_IInspectableVtbl __FITypedEventHandler_2_Windows__CGraphics__CHolographic__CHolographicSpace_IInspectableVtbl
#define ITypedEventHandler_HolographicSpace_IInspectable __FITypedEventHandler_2_Windows__CGraphics__CHolographic__CHolographicSpace_IInspectable
#define ITypedEventHandler_HolographicSpace_IInspectable_QueryInterface __FITypedEventHandler_2_Windows__CGraphics__CHolographic__CHolographicSpace_IInspectable_QueryInterface
#define ITypedEventHandler_HolographicSpace_IInspectable_AddRef __FITypedEventHandler_2_Windows__CGraphics__CHolographic__CHolographicSpace_IInspectable_AddRef
#define ITypedEventHandler_HolographicSpace_IInspectable_Release __FITypedEventHandler_2_Windows__CGraphics__CHolographic__CHolographicSpace_IInspectable_Release
#define ITypedEventHandler_HolographicSpace_IInspectable_Invoke __FITypedEventHandler_2_Windows__CGraphics__CHolographic__CHolographicSpace_IInspectable_Invoke
#endif /* WIDL_using_Windows_Foundation */
#endif

#endif

#endif  /* ____FITypedEventHandler_2_Windows__CGraphics__CHolographic__CHolographicSpace_IInspectable_INTERFACE_DEFINED__ */

/*****************************************************************************
 * ITypedEventHandler<ABI::Windows::Graphics::Holographic::HolographicSpace*,ABI::Windows::Graphics::Holographic::HolographicSpaceCameraAddedEventArgs* > interface
 */
#ifndef ____FITypedEventHandler_2_Windows__CGraphics__CHolographic__CHolographicSpace_Windows__CGraphics__CHolographic__CHolographicSpaceCameraAddedEventArgs_INTERFACE_DEFINED__
#define ____FITypedEventHandler_2_Windows__CGraphics__CHolographic__CHolographicSpace_Windows__CGraphics__CHolographic__CHolographicSpaceCameraAddedEventArgs_INTERFACE_DEFINED__

DEFINE_GUID(IID___FITypedEventHandler_2_Windows__CGraphics__CHolographic__CHolographicSpace_Windows__CGraphics__CHolographic__CHolographicSpaceCameraAddedEventArgs, 0x71d80b7c, 0x1d27, 0x5102, 0x83,0xd1, 0x4f,0x0e,0xfc,0x7c,0x9d,0x6f);
#if defined(__cplusplus) && !defined(CINTERFACE)
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace Foundation {
            template<>
            MIDL_INTERFACE("71d80b7c-1d27-5102-83d1-4f0efc7c9d6f")
            ITypedEventHandler<ABI::Windows::Graphics::Holographic::HolographicSpace*,ABI::Windows::Graphics::Holographic::HolographicSpaceCameraAddedEventArgs* > : ITypedEventHandler_impl<ABI::Windows::Foundation::Internal::AggregateType<ABI::Windows::Graphics::Holographic::HolographicSpace*, ABI::Windows::Graphics::Holographic::IHolographicSpace* >, ABI::Windows::Foundation::Internal::AggregateType<ABI::Windows::Graphics::Holographic::HolographicSpaceCameraAddedEventArgs*, ABI::Windows::Graphics::Holographic::IHolographicSpaceCameraAddedEventArgs* > >
            {
            };
        }
    }
}
extern "C" {
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(__FITypedEventHandler_2_Windows__CGraphics__CHolographic__CHolographicSpace_Windows__CGraphics__CHolographic__CHolographicSpaceCameraAddedEventArgs, 0x71d80b7c, 0x1d27, 0x5102, 0x83,0xd1, 0x4f,0x0e,0xfc,0x7c,0x9d,0x6f)
#endif
#else
typedef struct __FITypedEventHandler_2_Windows__CGraphics__CHolographic__CHolographicSpace_Windows__CGraphics__CHolographic__CHolographicSpaceCameraAddedEventArgsVtbl {
    BEGIN_INTERFACE

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

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

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

    /*** ITypedEventHandler<ABI::Windows::Graphics::Holographic::HolographicSpace*,ABI::Windows::Graphics::Holographic::HolographicSpaceCameraAddedEventArgs* > methods ***/
    HRESULT (STDMETHODCALLTYPE *Invoke)(
        __FITypedEventHandler_2_Windows__CGraphics__CHolographic__CHolographicSpace_Windows__CGraphics__CHolographic__CHolographicSpaceCameraAddedEventArgs *This,
        __x_ABI_CWindows_CGraphics_CHolographic_CIHolographicSpace *sender,
        __x_ABI_CWindows_CGraphics_CHolographic_CIHolographicSpaceCameraAddedEventArgs *args);

    END_INTERFACE
} __FITypedEventHandler_2_Windows__CGraphics__CHolographic__CHolographicSpace_Windows__CGraphics__CHolographic__CHolographicSpaceCameraAddedEventArgsVtbl;

interface __FITypedEventHandler_2_Windows__CGraphics__CHolographic__CHolographicSpace_Windows__CGraphics__CHolographic__CHolographicSpaceCameraAddedEventArgs {
    CONST_VTBL __FITypedEventHandler_2_Windows__CGraphics__CHolographic__CHolographicSpace_Windows__CGraphics__CHolographic__CHolographicSpaceCameraAddedEventArgsVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define __FITypedEventHandler_2_Windows__CGraphics__CHolographic__CHolographicSpace_Windows__CGraphics__CHolographic__CHolographicSpaceCameraAddedEventArgs_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define __FITypedEventHandler_2_Windows__CGraphics__CHolographic__CHolographicSpace_Windows__CGraphics__CHolographic__CHolographicSpaceCameraAddedEventArgs_AddRef(This) (This)->lpVtbl->AddRef(This)
#define __FITypedEventHandler_2_Windows__CGraphics__CHolographic__CHolographicSpace_Windows__CGraphics__CHolographic__CHolographicSpaceCameraAddedEventArgs_Release(This) (This)->lpVtbl->Release(This)
/*** ITypedEventHandler<ABI::Windows::Graphics::Holographic::HolographicSpace*,ABI::Windows::Graphics::Holographic::HolographicSpaceCameraAddedEventArgs* > methods ***/
#define __FITypedEventHandler_2_Windows__CGraphics__CHolographic__CHolographicSpace_Windows__CGraphics__CHolographic__CHolographicSpaceCameraAddedEventArgs_Invoke(This,sender,args) (This)->lpVtbl->Invoke(This,sender,args)
#else
/*** IUnknown methods ***/
static inline HRESULT __FITypedEventHandler_2_Windows__CGraphics__CHolographic__CHolographicSpace_Windows__CGraphics__CHolographic__CHolographicSpaceCameraAddedEventArgs_QueryInterface(__FITypedEventHandler_2_Windows__CGraphics__CHolographic__CHolographicSpace_Windows__CGraphics__CHolographic__CHolographicSpaceCameraAddedEventArgs* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG __FITypedEventHandler_2_Windows__CGraphics__CHolographic__CHolographicSpace_Windows__CGraphics__CHolographic__CHolographicSpaceCameraAddedEventArgs_AddRef(__FITypedEventHandler_2_Windows__CGraphics__CHolographic__CHolographicSpace_Windows__CGraphics__CHolographic__CHolographicSpaceCameraAddedEventArgs* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG __FITypedEventHandler_2_Windows__CGraphics__CHolographic__CHolographicSpace_Windows__CGraphics__CHolographic__CHolographicSpaceCameraAddedEventArgs_Release(__FITypedEventHandler_2_Windows__CGraphics__CHolographic__CHolographicSpace_Windows__CGraphics__CHolographic__CHolographicSpaceCameraAddedEventArgs* This) {
    return This->lpVtbl->Release(This);
}
/*** ITypedEventHandler<ABI::Windows::Graphics::Holographic::HolographicSpace*,ABI::Windows::Graphics::Holographic::HolographicSpaceCameraAddedEventArgs* > methods ***/
static inline HRESULT __FITypedEventHandler_2_Windows__CGraphics__CHolographic__CHolographicSpace_Windows__CGraphics__CHolographic__CHolographicSpaceCameraAddedEventArgs_Invoke(__FITypedEventHandler_2_Windows__CGraphics__CHolographic__CHolographicSpace_Windows__CGraphics__CHolographic__CHolographicSpaceCameraAddedEventArgs* This,__x_ABI_CWindows_CGraphics_CHolographic_CIHolographicSpace *sender,__x_ABI_CWindows_CGraphics_CHolographic_CIHolographicSpaceCameraAddedEventArgs *args) {
    return This->lpVtbl->Invoke(This,sender,args);
}
#endif
#ifdef WIDL_using_Windows_Foundation
#define IID_ITypedEventHandler_HolographicSpace_HolographicSpaceCameraAddedEventArgs IID___FITypedEventHandler_2_Windows__CGraphics__CHolographic__CHolographicSpace_Windows__CGraphics__CHolographic__CHolographicSpaceCameraAddedEventArgs
#define ITypedEventHandler_HolographicSpace_HolographicSpaceCameraAddedEventArgsVtbl __FITypedEventHandler_2_Windows__CGraphics__CHolographic__CHolographicSpace_Windows__CGraphics__CHolographic__CHolographicSpaceCameraAddedEventArgsVtbl
#define ITypedEventHandler_HolographicSpace_HolographicSpaceCameraAddedEventArgs __FITypedEventHandler_2_Windows__CGraphics__CHolographic__CHolographicSpace_Windows__CGraphics__CHolographic__CHolographicSpaceCameraAddedEventArgs
#define ITypedEventHandler_HolographicSpace_HolographicSpaceCameraAddedEventArgs_QueryInterface __FITypedEventHandler_2_Windows__CGraphics__CHolographic__CHolographicSpace_Windows__CGraphics__CHolographic__CHolographicSpaceCameraAddedEventArgs_QueryInterface
#define ITypedEventHandler_HolographicSpace_HolographicSpaceCameraAddedEventArgs_AddRef __FITypedEventHandler_2_Windows__CGraphics__CHolographic__CHolographicSpace_Windows__CGraphics__CHolographic__CHolographicSpaceCameraAddedEventArgs_AddRef
#define ITypedEventHandler_HolographicSpace_HolographicSpaceCameraAddedEventArgs_Release __FITypedEventHandler_2_Windows__CGraphics__CHolographic__CHolographicSpace_Windows__CGraphics__CHolographic__CHolographicSpaceCameraAddedEventArgs_Release
#define ITypedEventHandler_HolographicSpace_HolographicSpaceCameraAddedEventArgs_Invoke __FITypedEventHandler_2_Windows__CGraphics__CHolographic__CHolographicSpace_Windows__CGraphics__CHolographic__CHolographicSpaceCameraAddedEventArgs_Invoke
#endif /* WIDL_using_Windows_Foundation */
#endif

#endif

#endif  /* ____FITypedEventHandler_2_Windows__CGraphics__CHolographic__CHolographicSpace_Windows__CGraphics__CHolographic__CHolographicSpaceCameraAddedEventArgs_INTERFACE_DEFINED__ */

/*****************************************************************************
 * ITypedEventHandler<ABI::Windows::Graphics::Holographic::HolographicSpace*,ABI::Windows::Graphics::Holographic::HolographicSpaceCameraRemovedEventArgs* > interface
 */
#ifndef ____FITypedEventHandler_2_Windows__CGraphics__CHolographic__CHolographicSpace_Windows__CGraphics__CHolographic__CHolographicSpaceCameraRemovedEventArgs_INTERFACE_DEFINED__
#define ____FITypedEventHandler_2_Windows__CGraphics__CHolographic__CHolographicSpace_Windows__CGraphics__CHolographic__CHolographicSpaceCameraRemovedEventArgs_INTERFACE_DEFINED__

DEFINE_GUID(IID___FITypedEventHandler_2_Windows__CGraphics__CHolographic__CHolographicSpace_Windows__CGraphics__CHolographic__CHolographicSpaceCameraRemovedEventArgs, 0xdb68cfc3, 0x0874, 0x502a, 0xa3,0xb9, 0x2b,0x1f,0xe8,0x6c,0x67,0xbe);
#if defined(__cplusplus) && !defined(CINTERFACE)
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace Foundation {
            template<>
            MIDL_INTERFACE("db68cfc3-0874-502a-a3b9-2b1fe86c67be")
            ITypedEventHandler<ABI::Windows::Graphics::Holographic::HolographicSpace*,ABI::Windows::Graphics::Holographic::HolographicSpaceCameraRemovedEventArgs* > : ITypedEventHandler_impl<ABI::Windows::Foundation::Internal::AggregateType<ABI::Windows::Graphics::Holographic::HolographicSpace*, ABI::Windows::Graphics::Holographic::IHolographicSpace* >, ABI::Windows::Foundation::Internal::AggregateType<ABI::Windows::Graphics::Holographic::HolographicSpaceCameraRemovedEventArgs*, ABI::Windows::Graphics::Holographic::IHolographicSpaceCameraRemovedEventArgs* > >
            {
            };
        }
    }
}
extern "C" {
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(__FITypedEventHandler_2_Windows__CGraphics__CHolographic__CHolographicSpace_Windows__CGraphics__CHolographic__CHolographicSpaceCameraRemovedEventArgs, 0xdb68cfc3, 0x0874, 0x502a, 0xa3,0xb9, 0x2b,0x1f,0xe8,0x6c,0x67,0xbe)
#endif
#else
typedef struct __FITypedEventHandler_2_Windows__CGraphics__CHolographic__CHolographicSpace_Windows__CGraphics__CHolographic__CHolographicSpaceCameraRemovedEventArgsVtbl {
    BEGIN_INTERFACE

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

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

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

    /*** ITypedEventHandler<ABI::Windows::Graphics::Holographic::HolographicSpace*,ABI::Windows::Graphics::Holographic::HolographicSpaceCameraRemovedEventArgs* > methods ***/
    HRESULT (STDMETHODCALLTYPE *Invoke)(
        __FITypedEventHandler_2_Windows__CGraphics__CHolographic__CHolographicSpace_Windows__CGraphics__CHolographic__CHolographicSpaceCameraRemovedEventArgs *This,
        __x_ABI_CWindows_CGraphics_CHolographic_CIHolographicSpace *sender,
        __x_ABI_CWindows_CGraphics_CHolographic_CIHolographicSpaceCameraRemovedEventArgs *args);

    END_INTERFACE
} __FITypedEventHandler_2_Windows__CGraphics__CHolographic__CHolographicSpace_Windows__CGraphics__CHolographic__CHolographicSpaceCameraRemovedEventArgsVtbl;

interface __FITypedEventHandler_2_Windows__CGraphics__CHolographic__CHolographicSpace_Windows__CGraphics__CHolographic__CHolographicSpaceCameraRemovedEventArgs {
    CONST_VTBL __FITypedEventHandler_2_Windows__CGraphics__CHolographic__CHolographicSpace_Windows__CGraphics__CHolographic__CHolographicSpaceCameraRemovedEventArgsVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define __FITypedEventHandler_2_Windows__CGraphics__CHolographic__CHolographicSpace_Windows__CGraphics__CHolographic__CHolographicSpaceCameraRemovedEventArgs_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define __FITypedEventHandler_2_Windows__CGraphics__CHolographic__CHolographicSpace_Windows__CGraphics__CHolographic__CHolographicSpaceCameraRemovedEventArgs_AddRef(This) (This)->lpVtbl->AddRef(This)
#define __FITypedEventHandler_2_Windows__CGraphics__CHolographic__CHolographicSpace_Windows__CGraphics__CHolographic__CHolographicSpaceCameraRemovedEventArgs_Release(This) (This)->lpVtbl->Release(This)
/*** ITypedEventHandler<ABI::Windows::Graphics::Holographic::HolographicSpace*,ABI::Windows::Graphics::Holographic::HolographicSpaceCameraRemovedEventArgs* > methods ***/
#define __FITypedEventHandler_2_Windows__CGraphics__CHolographic__CHolographicSpace_Windows__CGraphics__CHolographic__CHolographicSpaceCameraRemovedEventArgs_Invoke(This,sender,args) (This)->lpVtbl->Invoke(This,sender,args)
#else
/*** IUnknown methods ***/
static inline HRESULT __FITypedEventHandler_2_Windows__CGraphics__CHolographic__CHolographicSpace_Windows__CGraphics__CHolographic__CHolographicSpaceCameraRemovedEventArgs_QueryInterface(__FITypedEventHandler_2_Windows__CGraphics__CHolographic__CHolographicSpace_Windows__CGraphics__CHolographic__CHolographicSpaceCameraRemovedEventArgs* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG __FITypedEventHandler_2_Windows__CGraphics__CHolographic__CHolographicSpace_Windows__CGraphics__CHolographic__CHolographicSpaceCameraRemovedEventArgs_AddRef(__FITypedEventHandler_2_Windows__CGraphics__CHolographic__CHolographicSpace_Windows__CGraphics__CHolographic__CHolographicSpaceCameraRemovedEventArgs* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG __FITypedEventHandler_2_Windows__CGraphics__CHolographic__CHolographicSpace_Windows__CGraphics__CHolographic__CHolographicSpaceCameraRemovedEventArgs_Release(__FITypedEventHandler_2_Windows__CGraphics__CHolographic__CHolographicSpace_Windows__CGraphics__CHolographic__CHolographicSpaceCameraRemovedEventArgs* This) {
    return This->lpVtbl->Release(This);
}
/*** ITypedEventHandler<ABI::Windows::Graphics::Holographic::HolographicSpace*,ABI::Windows::Graphics::Holographic::HolographicSpaceCameraRemovedEventArgs* > methods ***/
static inline HRESULT __FITypedEventHandler_2_Windows__CGraphics__CHolographic__CHolographicSpace_Windows__CGraphics__CHolographic__CHolographicSpaceCameraRemovedEventArgs_Invoke(__FITypedEventHandler_2_Windows__CGraphics__CHolographic__CHolographicSpace_Windows__CGraphics__CHolographic__CHolographicSpaceCameraRemovedEventArgs* This,__x_ABI_CWindows_CGraphics_CHolographic_CIHolographicSpace *sender,__x_ABI_CWindows_CGraphics_CHolographic_CIHolographicSpaceCameraRemovedEventArgs *args) {
    return This->lpVtbl->Invoke(This,sender,args);
}
#endif
#ifdef WIDL_using_Windows_Foundation
#define IID_ITypedEventHandler_HolographicSpace_HolographicSpaceCameraRemovedEventArgs IID___FITypedEventHandler_2_Windows__CGraphics__CHolographic__CHolographicSpace_Windows__CGraphics__CHolographic__CHolographicSpaceCameraRemovedEventArgs
#define ITypedEventHandler_HolographicSpace_HolographicSpaceCameraRemovedEventArgsVtbl __FITypedEventHandler_2_Windows__CGraphics__CHolographic__CHolographicSpace_Windows__CGraphics__CHolographic__CHolographicSpaceCameraRemovedEventArgsVtbl
#define ITypedEventHandler_HolographicSpace_HolographicSpaceCameraRemovedEventArgs __FITypedEventHandler_2_Windows__CGraphics__CHolographic__CHolographicSpace_Windows__CGraphics__CHolographic__CHolographicSpaceCameraRemovedEventArgs
#define ITypedEventHandler_HolographicSpace_HolographicSpaceCameraRemovedEventArgs_QueryInterface __FITypedEventHandler_2_Windows__CGraphics__CHolographic__CHolographicSpace_Windows__CGraphics__CHolographic__CHolographicSpaceCameraRemovedEventArgs_QueryInterface
#define ITypedEventHandler_HolographicSpace_HolographicSpaceCameraRemovedEventArgs_AddRef __FITypedEventHandler_2_Windows__CGraphics__CHolographic__CHolographicSpace_Windows__CGraphics__CHolographic__CHolographicSpaceCameraRemovedEventArgs_AddRef
#define ITypedEventHandler_HolographicSpace_HolographicSpaceCameraRemovedEventArgs_Release __FITypedEventHandler_2_Windows__CGraphics__CHolographic__CHolographicSpace_Windows__CGraphics__CHolographic__CHolographicSpaceCameraRemovedEventArgs_Release
#define ITypedEventHandler_HolographicSpace_HolographicSpaceCameraRemovedEventArgs_Invoke __FITypedEventHandler_2_Windows__CGraphics__CHolographic__CHolographicSpace_Windows__CGraphics__CHolographic__CHolographicSpaceCameraRemovedEventArgs_Invoke
#endif /* WIDL_using_Windows_Foundation */
#endif

#endif

#endif  /* ____FITypedEventHandler_2_Windows__CGraphics__CHolographic__CHolographicSpace_Windows__CGraphics__CHolographic__CHolographicSpaceCameraRemovedEventArgs_INTERFACE_DEFINED__ */

/* Begin additional prototypes for all interfaces */


/* End additional prototypes */

#ifdef __cplusplus
}
#endif

#endif /* __windows_graphics_holographic_h__ */
