/*** Autogenerated by WIDL 6.3 from include/directmanipulation.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 __directmanipulation_h__
#define __directmanipulation_h__

/* Forward declarations */

#ifndef __IDirectManipulationFrameInfoProvider_FWD_DEFINED__
#define __IDirectManipulationFrameInfoProvider_FWD_DEFINED__
typedef interface IDirectManipulationFrameInfoProvider IDirectManipulationFrameInfoProvider;
#ifdef __cplusplus
interface IDirectManipulationFrameInfoProvider;
#endif /* __cplusplus */
#endif

#ifndef __IDirectManipulationManager_FWD_DEFINED__
#define __IDirectManipulationManager_FWD_DEFINED__
typedef interface IDirectManipulationManager IDirectManipulationManager;
#ifdef __cplusplus
interface IDirectManipulationManager;
#endif /* __cplusplus */
#endif

#ifndef __IDirectManipulationContent_FWD_DEFINED__
#define __IDirectManipulationContent_FWD_DEFINED__
typedef interface IDirectManipulationContent IDirectManipulationContent;
#ifdef __cplusplus
interface IDirectManipulationContent;
#endif /* __cplusplus */
#endif

#ifndef __IDirectManipulationUpdateHandler_FWD_DEFINED__
#define __IDirectManipulationUpdateHandler_FWD_DEFINED__
typedef interface IDirectManipulationUpdateHandler IDirectManipulationUpdateHandler;
#ifdef __cplusplus
interface IDirectManipulationUpdateHandler;
#endif /* __cplusplus */
#endif

#ifndef __IDirectManipulationUpdateManager_FWD_DEFINED__
#define __IDirectManipulationUpdateManager_FWD_DEFINED__
typedef interface IDirectManipulationUpdateManager IDirectManipulationUpdateManager;
#ifdef __cplusplus
interface IDirectManipulationUpdateManager;
#endif /* __cplusplus */
#endif

#ifndef __IDirectManipulationCompositor_FWD_DEFINED__
#define __IDirectManipulationCompositor_FWD_DEFINED__
typedef interface IDirectManipulationCompositor IDirectManipulationCompositor;
#ifdef __cplusplus
interface IDirectManipulationCompositor;
#endif /* __cplusplus */
#endif

#ifndef __IDirectManipulationViewport_FWD_DEFINED__
#define __IDirectManipulationViewport_FWD_DEFINED__
typedef interface IDirectManipulationViewport IDirectManipulationViewport;
#ifdef __cplusplus
interface IDirectManipulationViewport;
#endif /* __cplusplus */
#endif

#ifndef __IDirectManipulationViewport2_FWD_DEFINED__
#define __IDirectManipulationViewport2_FWD_DEFINED__
typedef interface IDirectManipulationViewport2 IDirectManipulationViewport2;
#ifdef __cplusplus
interface IDirectManipulationViewport2;
#endif /* __cplusplus */
#endif

#ifndef __IDirectManipulationViewportEventHandler_FWD_DEFINED__
#define __IDirectManipulationViewportEventHandler_FWD_DEFINED__
typedef interface IDirectManipulationViewportEventHandler IDirectManipulationViewportEventHandler;
#ifdef __cplusplus
interface IDirectManipulationViewportEventHandler;
#endif /* __cplusplus */
#endif

#ifndef __IDirectManipulationManager2_FWD_DEFINED__
#define __IDirectManipulationManager2_FWD_DEFINED__
typedef interface IDirectManipulationManager2 IDirectManipulationManager2;
#ifdef __cplusplus
interface IDirectManipulationManager2;
#endif /* __cplusplus */
#endif

#ifndef __IDirectManipulationPrimaryContent_FWD_DEFINED__
#define __IDirectManipulationPrimaryContent_FWD_DEFINED__
typedef interface IDirectManipulationPrimaryContent IDirectManipulationPrimaryContent;
#ifdef __cplusplus
interface IDirectManipulationPrimaryContent;
#endif /* __cplusplus */
#endif

#ifndef __IDirectManipulationCompositor2_FWD_DEFINED__
#define __IDirectManipulationCompositor2_FWD_DEFINED__
typedef interface IDirectManipulationCompositor2 IDirectManipulationCompositor2;
#ifdef __cplusplus
interface IDirectManipulationCompositor2;
#endif /* __cplusplus */
#endif

#ifndef __DirectManipulationManager_FWD_DEFINED__
#define __DirectManipulationManager_FWD_DEFINED__
#ifdef __cplusplus
typedef class DirectManipulationManager DirectManipulationManager;
#else
typedef struct DirectManipulationManager DirectManipulationManager;
#endif /* defined __cplusplus */
#endif /* defined __DirectManipulationManager_FWD_DEFINED__ */

#ifndef __DirectManipulationSharedManager_FWD_DEFINED__
#define __DirectManipulationSharedManager_FWD_DEFINED__
#ifdef __cplusplus
typedef class DirectManipulationSharedManager DirectManipulationSharedManager;
#else
typedef struct DirectManipulationSharedManager DirectManipulationSharedManager;
#endif /* defined __cplusplus */
#endif /* defined __DirectManipulationSharedManager_FWD_DEFINED__ */

#ifndef __DCompManipulationCompositor_FWD_DEFINED__
#define __DCompManipulationCompositor_FWD_DEFINED__
#ifdef __cplusplus
typedef class DCompManipulationCompositor DCompManipulationCompositor;
#else
typedef struct DCompManipulationCompositor DCompManipulationCompositor;
#endif /* defined __cplusplus */
#endif /* defined __DCompManipulationCompositor_FWD_DEFINED__ */

#ifndef __DirectManipulationViewport_FWD_DEFINED__
#define __DirectManipulationViewport_FWD_DEFINED__
#ifdef __cplusplus
typedef class DirectManipulationViewport DirectManipulationViewport;
#else
typedef struct DirectManipulationViewport DirectManipulationViewport;
#endif /* defined __cplusplus */
#endif /* defined __DirectManipulationViewport_FWD_DEFINED__ */

/* Headers for imported files */

#include <oaidl.h>
#include <ocidl.h>

#ifdef __cplusplus
extern "C" {
#endif

#if 0
typedef void *HWND;
#endif
#ifndef __IDirectManipulationViewportEventHandler_FWD_DEFINED__
#define __IDirectManipulationViewportEventHandler_FWD_DEFINED__
typedef interface IDirectManipulationViewportEventHandler IDirectManipulationViewportEventHandler;
#ifdef __cplusplus
interface IDirectManipulationViewportEventHandler;
#endif /* __cplusplus */
#endif

typedef enum DIRECTMANIPULATION_HITTEST_TYPE {
    DIRECTMANIPULATION_HITTEST_TYPE_ASYNCHRONOUS = 0x0,
    DIRECTMANIPULATION_HITTEST_TYPE_SYNCHRONOUS = 0x1,
    DIRECTMANIPULATION_HITTEST_TYPE_AUTO_SYNCHRONOUS = 0x2
} DIRECTMANIPULATION_HITTEST_TYPE;
DEFINE_ENUM_FLAG_OPERATORS(DIRECTMANIPULATION_HITTEST_TYPE)
typedef enum DIRECTMANIPULATION_STATUS {
    DIRECTMANIPULATION_BUILDING = 0,
    DIRECTMANIPULATION_ENABLED = 1,
    DIRECTMANIPULATION_DISABLED = 2,
    DIRECTMANIPULATION_RUNNING = 3,
    DIRECTMANIPULATION_INERTIA = 4,
    DIRECTMANIPULATION_READY = 5,
    DIRECTMANIPULATION_SUSPENDED = 6
} DIRECTMANIPULATION_STATUS;
typedef enum DIRECTMANIPULATION_VIEWPORT_OPTIONS {
    DIRECTMANIPULATION_VIEWPORT_OPTIONS_DEFAULT = 0x0,
    DIRECTMANIPULATION_VIEWPORT_OPTIONS_AUTODISABLE = 0x1,
    DIRECTMANIPULATION_VIEWPORT_OPTIONS_MANUALUPDATE = 0x2,
    DIRECTMANIPULATION_VIEWPORT_OPTIONS_INPUT = 0x4,
    DIRECTMANIPULATION_VIEWPORT_OPTIONS_EXPLICITHITTEST = 0x8,
    DIRECTMANIPULATION_VIEWPORT_OPTIONS_DISABLEPIXELSNAPPING = 0x10
} DIRECTMANIPULATION_VIEWPORT_OPTIONS;
DEFINE_ENUM_FLAG_OPERATORS(DIRECTMANIPULATION_VIEWPORT_OPTIONS)
typedef enum DIRECTMANIPULATION_CONFIGURATION {
    DIRECTMANIPULATION_CONFIGURATION_NONE = 0x0,
    DIRECTMANIPULATION_CONFIGURATION_INTERACTION = 0x1,
    DIRECTMANIPULATION_CONFIGURATION_TRANSLATION_X = 0x2,
    DIRECTMANIPULATION_CONFIGURATION_TRANSLATION_Y = 0x4,
    DIRECTMANIPULATION_CONFIGURATION_SCALING = 0x10,
    DIRECTMANIPULATION_CONFIGURATION_TRANSLATION_INERTIA = 0x20,
    DIRECTMANIPULATION_CONFIGURATION_SCALING_INERTIA = 0x80,
    DIRECTMANIPULATION_CONFIGURATION_RAILS_X = 0x100,
    DIRECTMANIPULATION_CONFIGURATION_RAILS_Y = 0x200
} DIRECTMANIPULATION_CONFIGURATION;
DEFINE_ENUM_FLAG_OPERATORS(DIRECTMANIPULATION_CONFIGURATION)
typedef enum DIRECTMANIPULATION_GESTURE_CONFIGURATION {
    DIRECTMANIPULATION_GESTURE_NONE = 0x0,
    DIRECTMANIPULATION_GESTURE_DEFAULT = 0x0,
    DIRECTMANIPULATION_GESTURE_CROSS_SLIDE_VERTICAL = 0x8,
    DIRECTMANIPULATION_GESTURE_CROSS_SLIDE_HORIZONTAL = 0x10,
    DIRECTMANIPULATION_GESTURE_PINCH_ZOOM = 0x20
} DIRECTMANIPULATION_GESTURE_CONFIGURATION;
DEFINE_ENUM_FLAG_OPERATORS(DIRECTMANIPULATION_GESTURE_CONFIGURATION)
typedef enum DIRECTMANIPULATION_MOTION_TYPES {
    DIRECTMANIPULATION_MOTION_NONE = 0x0,
    DIRECTMANIPULATION_MOTION_TRANSLATEX = 0x1,
    DIRECTMANIPULATION_MOTION_TRANSLATEY = 0x2,
    DIRECTMANIPULATION_MOTION_ZOOM = 0x4,
    DIRECTMANIPULATION_MOTION_CENTERX = 0x10,
    DIRECTMANIPULATION_MOTION_CENTERY = 0x20,
    DIRECTMANIPULATION_MOTION_ALL = (((DIRECTMANIPULATION_MOTION_TRANSLATEX | DIRECTMANIPULATION_MOTION_TRANSLATEY) | DIRECTMANIPULATION_MOTION_ZOOM) | DIRECTMANIPULATION_MOTION_CENTERX) | DIRECTMANIPULATION_MOTION_CENTERY
} DIRECTMANIPULATION_MOTION_TYPES;
DEFINE_ENUM_FLAG_OPERATORS(DIRECTMANIPULATION_MOTION_TYPES)
typedef enum DIRECTMANIPULATION_SNAPPOINT_TYPE {
    DIRECTMANIPULATION_SNAPPOINT_MANDATORY = 0,
    DIRECTMANIPULATION_SNAPPOINT_OPTIONAL = 1,
    DIRECTMANIPULATION_SNAPPOINT_MANDATORY_SINGLE = 2,
    DIRECTMANIPULATION_SNAPPOINT_OPTIONAL_SINGLE = 3
} DIRECTMANIPULATION_SNAPPOINT_TYPE;
typedef enum DIRECTMANIPULATION_SNAPPOINT_COORDINATE {
    DIRECTMANIPULATION_COORDINATE_BOUNDARY = 0x0,
    DIRECTMANIPULATION_COORDINATE_ORIGIN = 0x1,
    DIRECTMANIPULATION_COORDINATE_MIRRORED = 0x10
} DIRECTMANIPULATION_SNAPPOINT_COORDINATE;
DEFINE_ENUM_FLAG_OPERATORS(DIRECTMANIPULATION_SNAPPOINT_COORDINATE)
typedef enum DIRECTMANIPULATION_HORIZONTALALIGNMENT {
    DIRECTMANIPULATION_HORIZONTALALIGNMENT_NONE = 0x0,
    DIRECTMANIPULATION_HORIZONTALALIGNMENT_LEFT = 0x1,
    DIRECTMANIPULATION_HORIZONTALALIGNMENT_CENTER = 0x2,
    DIRECTMANIPULATION_HORIZONTALALIGNMENT_RIGHT = 0x4,
    DIRECTMANIPULATION_HORIZONTALALIGNMENT_UNLOCKCENTER = 0x8
} DIRECTMANIPULATION_HORIZONTALALIGNMENT;
DEFINE_ENUM_FLAG_OPERATORS(DIRECTMANIPULATION_HORIZONTALALIGNMENT)
typedef enum DIRECTMANIPULATION_VERTICALALIGNMENT {
    DIRECTMANIPULATION_VERTICALALIGNMENT_NONE = 0x0,
    DIRECTMANIPULATION_VERTICALALIGNMENT_TOP = 0x1,
    DIRECTMANIPULATION_VERTICALALIGNMENT_CENTER = 0x2,
    DIRECTMANIPULATION_VERTICALALIGNMENT_BOTTOM = 0x4,
    DIRECTMANIPULATION_VERTICALALIGNMENT_UNLOCKCENTER = 0x8
} DIRECTMANIPULATION_VERTICALALIGNMENT;
DEFINE_ENUM_FLAG_OPERATORS(DIRECTMANIPULATION_VERTICALALIGNMENT)
typedef enum DIRECTMANIPULATION_INPUT_MODE {
    DIRECTMANIPULATION_INPUT_MODE_AUTOMATIC = 0,
    DIRECTMANIPULATION_INPUT_MODE_MANUAL = 1
} DIRECTMANIPULATION_INPUT_MODE;
/*****************************************************************************
 * IDirectManipulationFrameInfoProvider interface
 */
#ifndef __IDirectManipulationFrameInfoProvider_INTERFACE_DEFINED__
#define __IDirectManipulationFrameInfoProvider_INTERFACE_DEFINED__

DEFINE_GUID(IID_IDirectManipulationFrameInfoProvider, 0xfb759dba, 0x6f4c, 0x4c01, 0x87,0x4e, 0x19,0xc8,0xa0,0x59,0x07,0xf9);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("fb759dba-6f4c-4c01-874e-19c8a05907f9")
IDirectManipulationFrameInfoProvider : public IUnknown
{
    virtual HRESULT STDMETHODCALLTYPE GetNextFrameInfo(
        ULONGLONG *time,
        ULONGLONG *process,
        ULONGLONG *composition) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IDirectManipulationFrameInfoProvider, 0xfb759dba, 0x6f4c, 0x4c01, 0x87,0x4e, 0x19,0xc8,0xa0,0x59,0x07,0xf9)
#endif
#else
typedef struct IDirectManipulationFrameInfoProviderVtbl {
    BEGIN_INTERFACE

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

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

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

    /*** IDirectManipulationFrameInfoProvider methods ***/
    HRESULT (STDMETHODCALLTYPE *GetNextFrameInfo)(
        IDirectManipulationFrameInfoProvider *This,
        ULONGLONG *time,
        ULONGLONG *process,
        ULONGLONG *composition);

    END_INTERFACE
} IDirectManipulationFrameInfoProviderVtbl;

interface IDirectManipulationFrameInfoProvider {
    CONST_VTBL IDirectManipulationFrameInfoProviderVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IDirectManipulationFrameInfoProvider_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IDirectManipulationFrameInfoProvider_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IDirectManipulationFrameInfoProvider_Release(This) (This)->lpVtbl->Release(This)
/*** IDirectManipulationFrameInfoProvider methods ***/
#define IDirectManipulationFrameInfoProvider_GetNextFrameInfo(This,time,process,composition) (This)->lpVtbl->GetNextFrameInfo(This,time,process,composition)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IDirectManipulationFrameInfoProvider_QueryInterface(IDirectManipulationFrameInfoProvider* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IDirectManipulationFrameInfoProvider_AddRef(IDirectManipulationFrameInfoProvider* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IDirectManipulationFrameInfoProvider_Release(IDirectManipulationFrameInfoProvider* This) {
    return This->lpVtbl->Release(This);
}
/*** IDirectManipulationFrameInfoProvider methods ***/
static FORCEINLINE HRESULT IDirectManipulationFrameInfoProvider_GetNextFrameInfo(IDirectManipulationFrameInfoProvider* This,ULONGLONG *time,ULONGLONG *process,ULONGLONG *composition) {
    return This->lpVtbl->GetNextFrameInfo(This,time,process,composition);
}
#endif
#endif

#endif


#endif  /* __IDirectManipulationFrameInfoProvider_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IDirectManipulationManager interface
 */
#ifndef __IDirectManipulationManager_INTERFACE_DEFINED__
#define __IDirectManipulationManager_INTERFACE_DEFINED__

DEFINE_GUID(IID_IDirectManipulationManager, 0xfbf5d3b4, 0x70c7, 0x4163, 0x93,0x22, 0x5a,0x6f,0x66,0x0d,0x6f,0xbc);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("fbf5d3b4-70c7-4163-9322-5a6f660d6fbc")
IDirectManipulationManager : public IUnknown
{
    virtual HRESULT STDMETHODCALLTYPE Activate(
        HWND window) = 0;

    virtual HRESULT STDMETHODCALLTYPE Deactivate(
        HWND window) = 0;

    virtual HRESULT STDMETHODCALLTYPE RegisterHitTestTarget(
        HWND window,
        HWND hittest,
        DIRECTMANIPULATION_HITTEST_TYPE type) = 0;

    virtual HRESULT STDMETHODCALLTYPE ProcessInput(
        const MSG *msg,
        WINBOOL *handled) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetUpdateManager(
        REFIID riid,
        void **obj) = 0;

    virtual HRESULT STDMETHODCALLTYPE CreateViewport(
        IDirectManipulationFrameInfoProvider *frame,
        HWND window,
        REFIID riid,
        void **obj) = 0;

    virtual HRESULT STDMETHODCALLTYPE CreateContent(
        IDirectManipulationFrameInfoProvider *frame,
        REFCLSID clsid,
        REFIID riid,
        void **obj) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IDirectManipulationManager, 0xfbf5d3b4, 0x70c7, 0x4163, 0x93,0x22, 0x5a,0x6f,0x66,0x0d,0x6f,0xbc)
#endif
#else
typedef struct IDirectManipulationManagerVtbl {
    BEGIN_INTERFACE

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

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

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

    /*** IDirectManipulationManager methods ***/
    HRESULT (STDMETHODCALLTYPE *Activate)(
        IDirectManipulationManager *This,
        HWND window);

    HRESULT (STDMETHODCALLTYPE *Deactivate)(
        IDirectManipulationManager *This,
        HWND window);

    HRESULT (STDMETHODCALLTYPE *RegisterHitTestTarget)(
        IDirectManipulationManager *This,
        HWND window,
        HWND hittest,
        DIRECTMANIPULATION_HITTEST_TYPE type);

    HRESULT (STDMETHODCALLTYPE *ProcessInput)(
        IDirectManipulationManager *This,
        const MSG *msg,
        WINBOOL *handled);

    HRESULT (STDMETHODCALLTYPE *GetUpdateManager)(
        IDirectManipulationManager *This,
        REFIID riid,
        void **obj);

    HRESULT (STDMETHODCALLTYPE *CreateViewport)(
        IDirectManipulationManager *This,
        IDirectManipulationFrameInfoProvider *frame,
        HWND window,
        REFIID riid,
        void **obj);

    HRESULT (STDMETHODCALLTYPE *CreateContent)(
        IDirectManipulationManager *This,
        IDirectManipulationFrameInfoProvider *frame,
        REFCLSID clsid,
        REFIID riid,
        void **obj);

    END_INTERFACE
} IDirectManipulationManagerVtbl;

interface IDirectManipulationManager {
    CONST_VTBL IDirectManipulationManagerVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IDirectManipulationManager_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IDirectManipulationManager_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IDirectManipulationManager_Release(This) (This)->lpVtbl->Release(This)
/*** IDirectManipulationManager methods ***/
#define IDirectManipulationManager_Activate(This,window) (This)->lpVtbl->Activate(This,window)
#define IDirectManipulationManager_Deactivate(This,window) (This)->lpVtbl->Deactivate(This,window)
#define IDirectManipulationManager_RegisterHitTestTarget(This,window,hittest,type) (This)->lpVtbl->RegisterHitTestTarget(This,window,hittest,type)
#define IDirectManipulationManager_ProcessInput(This,msg,handled) (This)->lpVtbl->ProcessInput(This,msg,handled)
#define IDirectManipulationManager_GetUpdateManager(This,riid,obj) (This)->lpVtbl->GetUpdateManager(This,riid,obj)
#define IDirectManipulationManager_CreateViewport(This,frame,window,riid,obj) (This)->lpVtbl->CreateViewport(This,frame,window,riid,obj)
#define IDirectManipulationManager_CreateContent(This,frame,clsid,riid,obj) (This)->lpVtbl->CreateContent(This,frame,clsid,riid,obj)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IDirectManipulationManager_QueryInterface(IDirectManipulationManager* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IDirectManipulationManager_AddRef(IDirectManipulationManager* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IDirectManipulationManager_Release(IDirectManipulationManager* This) {
    return This->lpVtbl->Release(This);
}
/*** IDirectManipulationManager methods ***/
static FORCEINLINE HRESULT IDirectManipulationManager_Activate(IDirectManipulationManager* This,HWND window) {
    return This->lpVtbl->Activate(This,window);
}
static FORCEINLINE HRESULT IDirectManipulationManager_Deactivate(IDirectManipulationManager* This,HWND window) {
    return This->lpVtbl->Deactivate(This,window);
}
static FORCEINLINE HRESULT IDirectManipulationManager_RegisterHitTestTarget(IDirectManipulationManager* This,HWND window,HWND hittest,DIRECTMANIPULATION_HITTEST_TYPE type) {
    return This->lpVtbl->RegisterHitTestTarget(This,window,hittest,type);
}
static FORCEINLINE HRESULT IDirectManipulationManager_ProcessInput(IDirectManipulationManager* This,const MSG *msg,WINBOOL *handled) {
    return This->lpVtbl->ProcessInput(This,msg,handled);
}
static FORCEINLINE HRESULT IDirectManipulationManager_GetUpdateManager(IDirectManipulationManager* This,REFIID riid,void **obj) {
    return This->lpVtbl->GetUpdateManager(This,riid,obj);
}
static FORCEINLINE HRESULT IDirectManipulationManager_CreateViewport(IDirectManipulationManager* This,IDirectManipulationFrameInfoProvider *frame,HWND window,REFIID riid,void **obj) {
    return This->lpVtbl->CreateViewport(This,frame,window,riid,obj);
}
static FORCEINLINE HRESULT IDirectManipulationManager_CreateContent(IDirectManipulationManager* This,IDirectManipulationFrameInfoProvider *frame,REFCLSID clsid,REFIID riid,void **obj) {
    return This->lpVtbl->CreateContent(This,frame,clsid,riid,obj);
}
#endif
#endif

#endif


#endif  /* __IDirectManipulationManager_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IDirectManipulationContent interface
 */
#ifndef __IDirectManipulationContent_INTERFACE_DEFINED__
#define __IDirectManipulationContent_INTERFACE_DEFINED__

DEFINE_GUID(IID_IDirectManipulationContent, 0xb89962cb, 0x3d89, 0x442b, 0xbb,0x58, 0x50,0x98,0xfa,0x0f,0x9f,0x16);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("b89962cb-3d89-442b-bb58-5098fa0f9f16")
IDirectManipulationContent : public IUnknown
{
    virtual HRESULT STDMETHODCALLTYPE GetContentRect(
        RECT *size) = 0;

    virtual HRESULT STDMETHODCALLTYPE SetContentRect(
        const RECT *size) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetViewport(
        REFIID riid,
        void **object) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetTag(
        REFIID riid,
        void **object,
        UINT32 *id) = 0;

    virtual HRESULT STDMETHODCALLTYPE SetTag(
        IUnknown *object,
        UINT32 id) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetOutputTransform(
        float *matrix,
        DWORD count) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetContentTransform(
        float *matrix,
        DWORD count) = 0;

    virtual HRESULT STDMETHODCALLTYPE SyncContentTransform(
        const float *matrix,
        DWORD count) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IDirectManipulationContent, 0xb89962cb, 0x3d89, 0x442b, 0xbb,0x58, 0x50,0x98,0xfa,0x0f,0x9f,0x16)
#endif
#else
typedef struct IDirectManipulationContentVtbl {
    BEGIN_INTERFACE

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

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

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

    /*** IDirectManipulationContent methods ***/
    HRESULT (STDMETHODCALLTYPE *GetContentRect)(
        IDirectManipulationContent *This,
        RECT *size);

    HRESULT (STDMETHODCALLTYPE *SetContentRect)(
        IDirectManipulationContent *This,
        const RECT *size);

    HRESULT (STDMETHODCALLTYPE *GetViewport)(
        IDirectManipulationContent *This,
        REFIID riid,
        void **object);

    HRESULT (STDMETHODCALLTYPE *GetTag)(
        IDirectManipulationContent *This,
        REFIID riid,
        void **object,
        UINT32 *id);

    HRESULT (STDMETHODCALLTYPE *SetTag)(
        IDirectManipulationContent *This,
        IUnknown *object,
        UINT32 id);

    HRESULT (STDMETHODCALLTYPE *GetOutputTransform)(
        IDirectManipulationContent *This,
        float *matrix,
        DWORD count);

    HRESULT (STDMETHODCALLTYPE *GetContentTransform)(
        IDirectManipulationContent *This,
        float *matrix,
        DWORD count);

    HRESULT (STDMETHODCALLTYPE *SyncContentTransform)(
        IDirectManipulationContent *This,
        const float *matrix,
        DWORD count);

    END_INTERFACE
} IDirectManipulationContentVtbl;

interface IDirectManipulationContent {
    CONST_VTBL IDirectManipulationContentVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IDirectManipulationContent_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IDirectManipulationContent_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IDirectManipulationContent_Release(This) (This)->lpVtbl->Release(This)
/*** IDirectManipulationContent methods ***/
#define IDirectManipulationContent_GetContentRect(This,size) (This)->lpVtbl->GetContentRect(This,size)
#define IDirectManipulationContent_SetContentRect(This,size) (This)->lpVtbl->SetContentRect(This,size)
#define IDirectManipulationContent_GetViewport(This,riid,object) (This)->lpVtbl->GetViewport(This,riid,object)
#define IDirectManipulationContent_GetTag(This,riid,object,id) (This)->lpVtbl->GetTag(This,riid,object,id)
#define IDirectManipulationContent_SetTag(This,object,id) (This)->lpVtbl->SetTag(This,object,id)
#define IDirectManipulationContent_GetOutputTransform(This,matrix,count) (This)->lpVtbl->GetOutputTransform(This,matrix,count)
#define IDirectManipulationContent_GetContentTransform(This,matrix,count) (This)->lpVtbl->GetContentTransform(This,matrix,count)
#define IDirectManipulationContent_SyncContentTransform(This,matrix,count) (This)->lpVtbl->SyncContentTransform(This,matrix,count)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IDirectManipulationContent_QueryInterface(IDirectManipulationContent* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IDirectManipulationContent_AddRef(IDirectManipulationContent* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IDirectManipulationContent_Release(IDirectManipulationContent* This) {
    return This->lpVtbl->Release(This);
}
/*** IDirectManipulationContent methods ***/
static FORCEINLINE HRESULT IDirectManipulationContent_GetContentRect(IDirectManipulationContent* This,RECT *size) {
    return This->lpVtbl->GetContentRect(This,size);
}
static FORCEINLINE HRESULT IDirectManipulationContent_SetContentRect(IDirectManipulationContent* This,const RECT *size) {
    return This->lpVtbl->SetContentRect(This,size);
}
static FORCEINLINE HRESULT IDirectManipulationContent_GetViewport(IDirectManipulationContent* This,REFIID riid,void **object) {
    return This->lpVtbl->GetViewport(This,riid,object);
}
static FORCEINLINE HRESULT IDirectManipulationContent_GetTag(IDirectManipulationContent* This,REFIID riid,void **object,UINT32 *id) {
    return This->lpVtbl->GetTag(This,riid,object,id);
}
static FORCEINLINE HRESULT IDirectManipulationContent_SetTag(IDirectManipulationContent* This,IUnknown *object,UINT32 id) {
    return This->lpVtbl->SetTag(This,object,id);
}
static FORCEINLINE HRESULT IDirectManipulationContent_GetOutputTransform(IDirectManipulationContent* This,float *matrix,DWORD count) {
    return This->lpVtbl->GetOutputTransform(This,matrix,count);
}
static FORCEINLINE HRESULT IDirectManipulationContent_GetContentTransform(IDirectManipulationContent* This,float *matrix,DWORD count) {
    return This->lpVtbl->GetContentTransform(This,matrix,count);
}
static FORCEINLINE HRESULT IDirectManipulationContent_SyncContentTransform(IDirectManipulationContent* This,const float *matrix,DWORD count) {
    return This->lpVtbl->SyncContentTransform(This,matrix,count);
}
#endif
#endif

#endif


#endif  /* __IDirectManipulationContent_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IDirectManipulationUpdateHandler interface
 */
#ifndef __IDirectManipulationUpdateHandler_INTERFACE_DEFINED__
#define __IDirectManipulationUpdateHandler_INTERFACE_DEFINED__

DEFINE_GUID(IID_IDirectManipulationUpdateHandler, 0x790b6337, 0x64f8, 0x4ff5, 0xa2,0x69, 0xb3,0x2b,0xc2,0xaf,0x27,0xa7);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("790b6337-64f8-4ff5-a269-b32bc2af27a7")
IDirectManipulationUpdateHandler : public IUnknown
{
    virtual HRESULT STDMETHODCALLTYPE Update(
        ) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IDirectManipulationUpdateHandler, 0x790b6337, 0x64f8, 0x4ff5, 0xa2,0x69, 0xb3,0x2b,0xc2,0xaf,0x27,0xa7)
#endif
#else
typedef struct IDirectManipulationUpdateHandlerVtbl {
    BEGIN_INTERFACE

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

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

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

    /*** IDirectManipulationUpdateHandler methods ***/
    HRESULT (STDMETHODCALLTYPE *Update)(
        IDirectManipulationUpdateHandler *This);

    END_INTERFACE
} IDirectManipulationUpdateHandlerVtbl;

interface IDirectManipulationUpdateHandler {
    CONST_VTBL IDirectManipulationUpdateHandlerVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IDirectManipulationUpdateHandler_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IDirectManipulationUpdateHandler_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IDirectManipulationUpdateHandler_Release(This) (This)->lpVtbl->Release(This)
/*** IDirectManipulationUpdateHandler methods ***/
#define IDirectManipulationUpdateHandler_Update(This) (This)->lpVtbl->Update(This)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IDirectManipulationUpdateHandler_QueryInterface(IDirectManipulationUpdateHandler* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IDirectManipulationUpdateHandler_AddRef(IDirectManipulationUpdateHandler* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IDirectManipulationUpdateHandler_Release(IDirectManipulationUpdateHandler* This) {
    return This->lpVtbl->Release(This);
}
/*** IDirectManipulationUpdateHandler methods ***/
static FORCEINLINE HRESULT IDirectManipulationUpdateHandler_Update(IDirectManipulationUpdateHandler* This) {
    return This->lpVtbl->Update(This);
}
#endif
#endif

#endif


#endif  /* __IDirectManipulationUpdateHandler_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IDirectManipulationUpdateManager interface
 */
#ifndef __IDirectManipulationUpdateManager_INTERFACE_DEFINED__
#define __IDirectManipulationUpdateManager_INTERFACE_DEFINED__

DEFINE_GUID(IID_IDirectManipulationUpdateManager, 0xb0ae62fd, 0xbe34, 0x46e7, 0x9c,0xaa, 0xd3,0x61,0xfa,0xcb,0xb9,0xcc);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("b0ae62fd-be34-46e7-9caa-d361facbb9cc")
IDirectManipulationUpdateManager : public IUnknown
{
    virtual HRESULT STDMETHODCALLTYPE RegisterWaitHandleCallback(
        HANDLE handle,
        IDirectManipulationUpdateHandler *handler,
        DWORD *cookie) = 0;

    virtual HRESULT STDMETHODCALLTYPE UnregisterWaitHandleCallback(
        DWORD cookie) = 0;

    virtual HRESULT STDMETHODCALLTYPE Update(
        IDirectManipulationFrameInfoProvider *provider) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IDirectManipulationUpdateManager, 0xb0ae62fd, 0xbe34, 0x46e7, 0x9c,0xaa, 0xd3,0x61,0xfa,0xcb,0xb9,0xcc)
#endif
#else
typedef struct IDirectManipulationUpdateManagerVtbl {
    BEGIN_INTERFACE

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

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

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

    /*** IDirectManipulationUpdateManager methods ***/
    HRESULT (STDMETHODCALLTYPE *RegisterWaitHandleCallback)(
        IDirectManipulationUpdateManager *This,
        HANDLE handle,
        IDirectManipulationUpdateHandler *handler,
        DWORD *cookie);

    HRESULT (STDMETHODCALLTYPE *UnregisterWaitHandleCallback)(
        IDirectManipulationUpdateManager *This,
        DWORD cookie);

    HRESULT (STDMETHODCALLTYPE *Update)(
        IDirectManipulationUpdateManager *This,
        IDirectManipulationFrameInfoProvider *provider);

    END_INTERFACE
} IDirectManipulationUpdateManagerVtbl;

interface IDirectManipulationUpdateManager {
    CONST_VTBL IDirectManipulationUpdateManagerVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IDirectManipulationUpdateManager_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IDirectManipulationUpdateManager_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IDirectManipulationUpdateManager_Release(This) (This)->lpVtbl->Release(This)
/*** IDirectManipulationUpdateManager methods ***/
#define IDirectManipulationUpdateManager_RegisterWaitHandleCallback(This,handle,handler,cookie) (This)->lpVtbl->RegisterWaitHandleCallback(This,handle,handler,cookie)
#define IDirectManipulationUpdateManager_UnregisterWaitHandleCallback(This,cookie) (This)->lpVtbl->UnregisterWaitHandleCallback(This,cookie)
#define IDirectManipulationUpdateManager_Update(This,provider) (This)->lpVtbl->Update(This,provider)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IDirectManipulationUpdateManager_QueryInterface(IDirectManipulationUpdateManager* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IDirectManipulationUpdateManager_AddRef(IDirectManipulationUpdateManager* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IDirectManipulationUpdateManager_Release(IDirectManipulationUpdateManager* This) {
    return This->lpVtbl->Release(This);
}
/*** IDirectManipulationUpdateManager methods ***/
static FORCEINLINE HRESULT IDirectManipulationUpdateManager_RegisterWaitHandleCallback(IDirectManipulationUpdateManager* This,HANDLE handle,IDirectManipulationUpdateHandler *handler,DWORD *cookie) {
    return This->lpVtbl->RegisterWaitHandleCallback(This,handle,handler,cookie);
}
static FORCEINLINE HRESULT IDirectManipulationUpdateManager_UnregisterWaitHandleCallback(IDirectManipulationUpdateManager* This,DWORD cookie) {
    return This->lpVtbl->UnregisterWaitHandleCallback(This,cookie);
}
static FORCEINLINE HRESULT IDirectManipulationUpdateManager_Update(IDirectManipulationUpdateManager* This,IDirectManipulationFrameInfoProvider *provider) {
    return This->lpVtbl->Update(This,provider);
}
#endif
#endif

#endif


#endif  /* __IDirectManipulationUpdateManager_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IDirectManipulationCompositor interface
 */
#ifndef __IDirectManipulationCompositor_INTERFACE_DEFINED__
#define __IDirectManipulationCompositor_INTERFACE_DEFINED__

DEFINE_GUID(IID_IDirectManipulationCompositor, 0x537a0825, 0x0387, 0x4efa, 0xb6,0x2f, 0x71,0xeb,0x1f,0x08,0x5a,0x7e);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("537a0825-0387-4efa-b62f-71eb1f085a7e")
IDirectManipulationCompositor : public IUnknown
{
    virtual HRESULT STDMETHODCALLTYPE AddContent(
        IDirectManipulationContent *content,
        IUnknown *device,
        IUnknown *parent,
        IUnknown *child) = 0;

    virtual HRESULT STDMETHODCALLTYPE RemoveContent(
        IDirectManipulationContent *content) = 0;

    virtual HRESULT STDMETHODCALLTYPE SetUpdateManager(
        IDirectManipulationUpdateManager *manager) = 0;

    virtual HRESULT STDMETHODCALLTYPE Flush(
        ) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IDirectManipulationCompositor, 0x537a0825, 0x0387, 0x4efa, 0xb6,0x2f, 0x71,0xeb,0x1f,0x08,0x5a,0x7e)
#endif
#else
typedef struct IDirectManipulationCompositorVtbl {
    BEGIN_INTERFACE

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

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

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

    /*** IDirectManipulationCompositor methods ***/
    HRESULT (STDMETHODCALLTYPE *AddContent)(
        IDirectManipulationCompositor *This,
        IDirectManipulationContent *content,
        IUnknown *device,
        IUnknown *parent,
        IUnknown *child);

    HRESULT (STDMETHODCALLTYPE *RemoveContent)(
        IDirectManipulationCompositor *This,
        IDirectManipulationContent *content);

    HRESULT (STDMETHODCALLTYPE *SetUpdateManager)(
        IDirectManipulationCompositor *This,
        IDirectManipulationUpdateManager *manager);

    HRESULT (STDMETHODCALLTYPE *Flush)(
        IDirectManipulationCompositor *This);

    END_INTERFACE
} IDirectManipulationCompositorVtbl;

interface IDirectManipulationCompositor {
    CONST_VTBL IDirectManipulationCompositorVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IDirectManipulationCompositor_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IDirectManipulationCompositor_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IDirectManipulationCompositor_Release(This) (This)->lpVtbl->Release(This)
/*** IDirectManipulationCompositor methods ***/
#define IDirectManipulationCompositor_AddContent(This,content,device,parent,child) (This)->lpVtbl->AddContent(This,content,device,parent,child)
#define IDirectManipulationCompositor_RemoveContent(This,content) (This)->lpVtbl->RemoveContent(This,content)
#define IDirectManipulationCompositor_SetUpdateManager(This,manager) (This)->lpVtbl->SetUpdateManager(This,manager)
#define IDirectManipulationCompositor_Flush(This) (This)->lpVtbl->Flush(This)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IDirectManipulationCompositor_QueryInterface(IDirectManipulationCompositor* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IDirectManipulationCompositor_AddRef(IDirectManipulationCompositor* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IDirectManipulationCompositor_Release(IDirectManipulationCompositor* This) {
    return This->lpVtbl->Release(This);
}
/*** IDirectManipulationCompositor methods ***/
static FORCEINLINE HRESULT IDirectManipulationCompositor_AddContent(IDirectManipulationCompositor* This,IDirectManipulationContent *content,IUnknown *device,IUnknown *parent,IUnknown *child) {
    return This->lpVtbl->AddContent(This,content,device,parent,child);
}
static FORCEINLINE HRESULT IDirectManipulationCompositor_RemoveContent(IDirectManipulationCompositor* This,IDirectManipulationContent *content) {
    return This->lpVtbl->RemoveContent(This,content);
}
static FORCEINLINE HRESULT IDirectManipulationCompositor_SetUpdateManager(IDirectManipulationCompositor* This,IDirectManipulationUpdateManager *manager) {
    return This->lpVtbl->SetUpdateManager(This,manager);
}
static FORCEINLINE HRESULT IDirectManipulationCompositor_Flush(IDirectManipulationCompositor* This) {
    return This->lpVtbl->Flush(This);
}
#endif
#endif

#endif


#endif  /* __IDirectManipulationCompositor_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IDirectManipulationViewport interface
 */
#ifndef __IDirectManipulationViewport_INTERFACE_DEFINED__
#define __IDirectManipulationViewport_INTERFACE_DEFINED__

DEFINE_GUID(IID_IDirectManipulationViewport, 0x28b85a3d, 0x60a0, 0x48bd, 0x9b,0xa1, 0x5c,0xe8,0xd9,0xea,0x3a,0x6d);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("28b85a3d-60a0-48bd-9ba1-5ce8d9ea3a6d")
IDirectManipulationViewport : public IUnknown
{
    virtual HRESULT STDMETHODCALLTYPE Enable(
        ) = 0;

    virtual HRESULT STDMETHODCALLTYPE Disable(
        ) = 0;

    virtual HRESULT STDMETHODCALLTYPE SetContact(
        UINT32 id) = 0;

    virtual HRESULT STDMETHODCALLTYPE ReleaseContact(
        UINT32 id) = 0;

    virtual HRESULT STDMETHODCALLTYPE ReleaseAllContacts(
        ) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetStatus(
        DIRECTMANIPULATION_STATUS *status) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetTag(
        REFIID riid,
        void **object,
        UINT32 *id) = 0;

    virtual HRESULT STDMETHODCALLTYPE SetTag(
        IUnknown *object,
        UINT32 id) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetViewportRect(
        RECT *viewport) = 0;

    virtual HRESULT STDMETHODCALLTYPE SetViewportRect(
        const RECT *viewport) = 0;

    virtual HRESULT STDMETHODCALLTYPE ZoomToRect(
        const float left,
        const float top,
        const float right,
        const float bottom,
        WINBOOL animate) = 0;

    virtual HRESULT STDMETHODCALLTYPE SetViewportTransform(
        const float *matrix,
        DWORD count) = 0;

    virtual HRESULT STDMETHODCALLTYPE SyncDisplayTransform(
        const float *matrix,
        DWORD count) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetPrimaryContent(
        REFIID riid,
        void **object) = 0;

    virtual HRESULT STDMETHODCALLTYPE AddContent(
        IDirectManipulationContent *content) = 0;

    virtual HRESULT STDMETHODCALLTYPE RemoveContent(
        IDirectManipulationContent *content) = 0;

    virtual HRESULT STDMETHODCALLTYPE SetViewportOptions(
        DIRECTMANIPULATION_VIEWPORT_OPTIONS options) = 0;

    virtual HRESULT STDMETHODCALLTYPE AddConfiguration(
        DIRECTMANIPULATION_CONFIGURATION configuration) = 0;

    virtual HRESULT STDMETHODCALLTYPE RemoveConfiguration(
        DIRECTMANIPULATION_CONFIGURATION configuration) = 0;

    virtual HRESULT STDMETHODCALLTYPE ActivateConfiguration(
        DIRECTMANIPULATION_CONFIGURATION configuration) = 0;

    virtual HRESULT STDMETHODCALLTYPE SetManualGesture(
        DIRECTMANIPULATION_GESTURE_CONFIGURATION configuration) = 0;

    virtual HRESULT STDMETHODCALLTYPE SetChaining(
        DIRECTMANIPULATION_MOTION_TYPES enabledTypes) = 0;

    virtual HRESULT STDMETHODCALLTYPE AddEventHandler(
        HWND window,
        IDirectManipulationViewportEventHandler *eventHandler,
        DWORD *cookie) = 0;

    virtual HRESULT STDMETHODCALLTYPE RemoveEventHandler(
        DWORD cookie) = 0;

    virtual HRESULT STDMETHODCALLTYPE SetInputMode(
        DIRECTMANIPULATION_INPUT_MODE mode) = 0;

    virtual HRESULT STDMETHODCALLTYPE SetUpdateMode(
        DIRECTMANIPULATION_INPUT_MODE mode) = 0;

    virtual HRESULT STDMETHODCALLTYPE Stop(
        ) = 0;

    virtual HRESULT STDMETHODCALLTYPE Abandon(
        ) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IDirectManipulationViewport, 0x28b85a3d, 0x60a0, 0x48bd, 0x9b,0xa1, 0x5c,0xe8,0xd9,0xea,0x3a,0x6d)
#endif
#else
typedef struct IDirectManipulationViewportVtbl {
    BEGIN_INTERFACE

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

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

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

    /*** IDirectManipulationViewport methods ***/
    HRESULT (STDMETHODCALLTYPE *Enable)(
        IDirectManipulationViewport *This);

    HRESULT (STDMETHODCALLTYPE *Disable)(
        IDirectManipulationViewport *This);

    HRESULT (STDMETHODCALLTYPE *SetContact)(
        IDirectManipulationViewport *This,
        UINT32 id);

    HRESULT (STDMETHODCALLTYPE *ReleaseContact)(
        IDirectManipulationViewport *This,
        UINT32 id);

    HRESULT (STDMETHODCALLTYPE *ReleaseAllContacts)(
        IDirectManipulationViewport *This);

    HRESULT (STDMETHODCALLTYPE *GetStatus)(
        IDirectManipulationViewport *This,
        DIRECTMANIPULATION_STATUS *status);

    HRESULT (STDMETHODCALLTYPE *GetTag)(
        IDirectManipulationViewport *This,
        REFIID riid,
        void **object,
        UINT32 *id);

    HRESULT (STDMETHODCALLTYPE *SetTag)(
        IDirectManipulationViewport *This,
        IUnknown *object,
        UINT32 id);

    HRESULT (STDMETHODCALLTYPE *GetViewportRect)(
        IDirectManipulationViewport *This,
        RECT *viewport);

    HRESULT (STDMETHODCALLTYPE *SetViewportRect)(
        IDirectManipulationViewport *This,
        const RECT *viewport);

    HRESULT (STDMETHODCALLTYPE *ZoomToRect)(
        IDirectManipulationViewport *This,
        const float left,
        const float top,
        const float right,
        const float bottom,
        WINBOOL animate);

    HRESULT (STDMETHODCALLTYPE *SetViewportTransform)(
        IDirectManipulationViewport *This,
        const float *matrix,
        DWORD count);

    HRESULT (STDMETHODCALLTYPE *SyncDisplayTransform)(
        IDirectManipulationViewport *This,
        const float *matrix,
        DWORD count);

    HRESULT (STDMETHODCALLTYPE *GetPrimaryContent)(
        IDirectManipulationViewport *This,
        REFIID riid,
        void **object);

    HRESULT (STDMETHODCALLTYPE *AddContent)(
        IDirectManipulationViewport *This,
        IDirectManipulationContent *content);

    HRESULT (STDMETHODCALLTYPE *RemoveContent)(
        IDirectManipulationViewport *This,
        IDirectManipulationContent *content);

    HRESULT (STDMETHODCALLTYPE *SetViewportOptions)(
        IDirectManipulationViewport *This,
        DIRECTMANIPULATION_VIEWPORT_OPTIONS options);

    HRESULT (STDMETHODCALLTYPE *AddConfiguration)(
        IDirectManipulationViewport *This,
        DIRECTMANIPULATION_CONFIGURATION configuration);

    HRESULT (STDMETHODCALLTYPE *RemoveConfiguration)(
        IDirectManipulationViewport *This,
        DIRECTMANIPULATION_CONFIGURATION configuration);

    HRESULT (STDMETHODCALLTYPE *ActivateConfiguration)(
        IDirectManipulationViewport *This,
        DIRECTMANIPULATION_CONFIGURATION configuration);

    HRESULT (STDMETHODCALLTYPE *SetManualGesture)(
        IDirectManipulationViewport *This,
        DIRECTMANIPULATION_GESTURE_CONFIGURATION configuration);

    HRESULT (STDMETHODCALLTYPE *SetChaining)(
        IDirectManipulationViewport *This,
        DIRECTMANIPULATION_MOTION_TYPES enabledTypes);

    HRESULT (STDMETHODCALLTYPE *AddEventHandler)(
        IDirectManipulationViewport *This,
        HWND window,
        IDirectManipulationViewportEventHandler *eventHandler,
        DWORD *cookie);

    HRESULT (STDMETHODCALLTYPE *RemoveEventHandler)(
        IDirectManipulationViewport *This,
        DWORD cookie);

    HRESULT (STDMETHODCALLTYPE *SetInputMode)(
        IDirectManipulationViewport *This,
        DIRECTMANIPULATION_INPUT_MODE mode);

    HRESULT (STDMETHODCALLTYPE *SetUpdateMode)(
        IDirectManipulationViewport *This,
        DIRECTMANIPULATION_INPUT_MODE mode);

    HRESULT (STDMETHODCALLTYPE *Stop)(
        IDirectManipulationViewport *This);

    HRESULT (STDMETHODCALLTYPE *Abandon)(
        IDirectManipulationViewport *This);

    END_INTERFACE
} IDirectManipulationViewportVtbl;

interface IDirectManipulationViewport {
    CONST_VTBL IDirectManipulationViewportVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IDirectManipulationViewport_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IDirectManipulationViewport_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IDirectManipulationViewport_Release(This) (This)->lpVtbl->Release(This)
/*** IDirectManipulationViewport methods ***/
#define IDirectManipulationViewport_Enable(This) (This)->lpVtbl->Enable(This)
#define IDirectManipulationViewport_Disable(This) (This)->lpVtbl->Disable(This)
#define IDirectManipulationViewport_SetContact(This,id) (This)->lpVtbl->SetContact(This,id)
#define IDirectManipulationViewport_ReleaseContact(This,id) (This)->lpVtbl->ReleaseContact(This,id)
#define IDirectManipulationViewport_ReleaseAllContacts(This) (This)->lpVtbl->ReleaseAllContacts(This)
#define IDirectManipulationViewport_GetStatus(This,status) (This)->lpVtbl->GetStatus(This,status)
#define IDirectManipulationViewport_GetTag(This,riid,object,id) (This)->lpVtbl->GetTag(This,riid,object,id)
#define IDirectManipulationViewport_SetTag(This,object,id) (This)->lpVtbl->SetTag(This,object,id)
#define IDirectManipulationViewport_GetViewportRect(This,viewport) (This)->lpVtbl->GetViewportRect(This,viewport)
#define IDirectManipulationViewport_SetViewportRect(This,viewport) (This)->lpVtbl->SetViewportRect(This,viewport)
#define IDirectManipulationViewport_ZoomToRect(This,left,top,right,bottom,animate) (This)->lpVtbl->ZoomToRect(This,left,top,right,bottom,animate)
#define IDirectManipulationViewport_SetViewportTransform(This,matrix,count) (This)->lpVtbl->SetViewportTransform(This,matrix,count)
#define IDirectManipulationViewport_SyncDisplayTransform(This,matrix,count) (This)->lpVtbl->SyncDisplayTransform(This,matrix,count)
#define IDirectManipulationViewport_GetPrimaryContent(This,riid,object) (This)->lpVtbl->GetPrimaryContent(This,riid,object)
#define IDirectManipulationViewport_AddContent(This,content) (This)->lpVtbl->AddContent(This,content)
#define IDirectManipulationViewport_RemoveContent(This,content) (This)->lpVtbl->RemoveContent(This,content)
#define IDirectManipulationViewport_SetViewportOptions(This,options) (This)->lpVtbl->SetViewportOptions(This,options)
#define IDirectManipulationViewport_AddConfiguration(This,configuration) (This)->lpVtbl->AddConfiguration(This,configuration)
#define IDirectManipulationViewport_RemoveConfiguration(This,configuration) (This)->lpVtbl->RemoveConfiguration(This,configuration)
#define IDirectManipulationViewport_ActivateConfiguration(This,configuration) (This)->lpVtbl->ActivateConfiguration(This,configuration)
#define IDirectManipulationViewport_SetManualGesture(This,configuration) (This)->lpVtbl->SetManualGesture(This,configuration)
#define IDirectManipulationViewport_SetChaining(This,enabledTypes) (This)->lpVtbl->SetChaining(This,enabledTypes)
#define IDirectManipulationViewport_AddEventHandler(This,window,eventHandler,cookie) (This)->lpVtbl->AddEventHandler(This,window,eventHandler,cookie)
#define IDirectManipulationViewport_RemoveEventHandler(This,cookie) (This)->lpVtbl->RemoveEventHandler(This,cookie)
#define IDirectManipulationViewport_SetInputMode(This,mode) (This)->lpVtbl->SetInputMode(This,mode)
#define IDirectManipulationViewport_SetUpdateMode(This,mode) (This)->lpVtbl->SetUpdateMode(This,mode)
#define IDirectManipulationViewport_Stop(This) (This)->lpVtbl->Stop(This)
#define IDirectManipulationViewport_Abandon(This) (This)->lpVtbl->Abandon(This)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IDirectManipulationViewport_QueryInterface(IDirectManipulationViewport* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IDirectManipulationViewport_AddRef(IDirectManipulationViewport* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IDirectManipulationViewport_Release(IDirectManipulationViewport* This) {
    return This->lpVtbl->Release(This);
}
/*** IDirectManipulationViewport methods ***/
static FORCEINLINE HRESULT IDirectManipulationViewport_Enable(IDirectManipulationViewport* This) {
    return This->lpVtbl->Enable(This);
}
static FORCEINLINE HRESULT IDirectManipulationViewport_Disable(IDirectManipulationViewport* This) {
    return This->lpVtbl->Disable(This);
}
static FORCEINLINE HRESULT IDirectManipulationViewport_SetContact(IDirectManipulationViewport* This,UINT32 id) {
    return This->lpVtbl->SetContact(This,id);
}
static FORCEINLINE HRESULT IDirectManipulationViewport_ReleaseContact(IDirectManipulationViewport* This,UINT32 id) {
    return This->lpVtbl->ReleaseContact(This,id);
}
static FORCEINLINE HRESULT IDirectManipulationViewport_ReleaseAllContacts(IDirectManipulationViewport* This) {
    return This->lpVtbl->ReleaseAllContacts(This);
}
static FORCEINLINE HRESULT IDirectManipulationViewport_GetStatus(IDirectManipulationViewport* This,DIRECTMANIPULATION_STATUS *status) {
    return This->lpVtbl->GetStatus(This,status);
}
static FORCEINLINE HRESULT IDirectManipulationViewport_GetTag(IDirectManipulationViewport* This,REFIID riid,void **object,UINT32 *id) {
    return This->lpVtbl->GetTag(This,riid,object,id);
}
static FORCEINLINE HRESULT IDirectManipulationViewport_SetTag(IDirectManipulationViewport* This,IUnknown *object,UINT32 id) {
    return This->lpVtbl->SetTag(This,object,id);
}
static FORCEINLINE HRESULT IDirectManipulationViewport_GetViewportRect(IDirectManipulationViewport* This,RECT *viewport) {
    return This->lpVtbl->GetViewportRect(This,viewport);
}
static FORCEINLINE HRESULT IDirectManipulationViewport_SetViewportRect(IDirectManipulationViewport* This,const RECT *viewport) {
    return This->lpVtbl->SetViewportRect(This,viewport);
}
static FORCEINLINE HRESULT IDirectManipulationViewport_ZoomToRect(IDirectManipulationViewport* This,const float left,const float top,const float right,const float bottom,WINBOOL animate) {
    return This->lpVtbl->ZoomToRect(This,left,top,right,bottom,animate);
}
static FORCEINLINE HRESULT IDirectManipulationViewport_SetViewportTransform(IDirectManipulationViewport* This,const float *matrix,DWORD count) {
    return This->lpVtbl->SetViewportTransform(This,matrix,count);
}
static FORCEINLINE HRESULT IDirectManipulationViewport_SyncDisplayTransform(IDirectManipulationViewport* This,const float *matrix,DWORD count) {
    return This->lpVtbl->SyncDisplayTransform(This,matrix,count);
}
static FORCEINLINE HRESULT IDirectManipulationViewport_GetPrimaryContent(IDirectManipulationViewport* This,REFIID riid,void **object) {
    return This->lpVtbl->GetPrimaryContent(This,riid,object);
}
static FORCEINLINE HRESULT IDirectManipulationViewport_AddContent(IDirectManipulationViewport* This,IDirectManipulationContent *content) {
    return This->lpVtbl->AddContent(This,content);
}
static FORCEINLINE HRESULT IDirectManipulationViewport_RemoveContent(IDirectManipulationViewport* This,IDirectManipulationContent *content) {
    return This->lpVtbl->RemoveContent(This,content);
}
static FORCEINLINE HRESULT IDirectManipulationViewport_SetViewportOptions(IDirectManipulationViewport* This,DIRECTMANIPULATION_VIEWPORT_OPTIONS options) {
    return This->lpVtbl->SetViewportOptions(This,options);
}
static FORCEINLINE HRESULT IDirectManipulationViewport_AddConfiguration(IDirectManipulationViewport* This,DIRECTMANIPULATION_CONFIGURATION configuration) {
    return This->lpVtbl->AddConfiguration(This,configuration);
}
static FORCEINLINE HRESULT IDirectManipulationViewport_RemoveConfiguration(IDirectManipulationViewport* This,DIRECTMANIPULATION_CONFIGURATION configuration) {
    return This->lpVtbl->RemoveConfiguration(This,configuration);
}
static FORCEINLINE HRESULT IDirectManipulationViewport_ActivateConfiguration(IDirectManipulationViewport* This,DIRECTMANIPULATION_CONFIGURATION configuration) {
    return This->lpVtbl->ActivateConfiguration(This,configuration);
}
static FORCEINLINE HRESULT IDirectManipulationViewport_SetManualGesture(IDirectManipulationViewport* This,DIRECTMANIPULATION_GESTURE_CONFIGURATION configuration) {
    return This->lpVtbl->SetManualGesture(This,configuration);
}
static FORCEINLINE HRESULT IDirectManipulationViewport_SetChaining(IDirectManipulationViewport* This,DIRECTMANIPULATION_MOTION_TYPES enabledTypes) {
    return This->lpVtbl->SetChaining(This,enabledTypes);
}
static FORCEINLINE HRESULT IDirectManipulationViewport_AddEventHandler(IDirectManipulationViewport* This,HWND window,IDirectManipulationViewportEventHandler *eventHandler,DWORD *cookie) {
    return This->lpVtbl->AddEventHandler(This,window,eventHandler,cookie);
}
static FORCEINLINE HRESULT IDirectManipulationViewport_RemoveEventHandler(IDirectManipulationViewport* This,DWORD cookie) {
    return This->lpVtbl->RemoveEventHandler(This,cookie);
}
static FORCEINLINE HRESULT IDirectManipulationViewport_SetInputMode(IDirectManipulationViewport* This,DIRECTMANIPULATION_INPUT_MODE mode) {
    return This->lpVtbl->SetInputMode(This,mode);
}
static FORCEINLINE HRESULT IDirectManipulationViewport_SetUpdateMode(IDirectManipulationViewport* This,DIRECTMANIPULATION_INPUT_MODE mode) {
    return This->lpVtbl->SetUpdateMode(This,mode);
}
static FORCEINLINE HRESULT IDirectManipulationViewport_Stop(IDirectManipulationViewport* This) {
    return This->lpVtbl->Stop(This);
}
static FORCEINLINE HRESULT IDirectManipulationViewport_Abandon(IDirectManipulationViewport* This) {
    return This->lpVtbl->Abandon(This);
}
#endif
#endif

#endif


#endif  /* __IDirectManipulationViewport_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IDirectManipulationViewport2 interface
 */
#ifndef __IDirectManipulationViewport2_INTERFACE_DEFINED__
#define __IDirectManipulationViewport2_INTERFACE_DEFINED__

DEFINE_GUID(IID_IDirectManipulationViewport2, 0x923ccaac, 0x61e1, 0x4385, 0xb7,0x26, 0x01,0x7a,0xf1,0x89,0x88,0x2a);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("923ccaac-61e1-4385-b726-017af189882a")
IDirectManipulationViewport2 : public IDirectManipulationViewport
{
    virtual HRESULT STDMETHODCALLTYPE AddBehavior(
        IUnknown *behavior,
        DWORD *cookie) = 0;

    virtual HRESULT STDMETHODCALLTYPE RemoveBehavior(
        DWORD cookie) = 0;

    virtual HRESULT STDMETHODCALLTYPE RemoveAllBehaviors(
        ) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IDirectManipulationViewport2, 0x923ccaac, 0x61e1, 0x4385, 0xb7,0x26, 0x01,0x7a,0xf1,0x89,0x88,0x2a)
#endif
#else
typedef struct IDirectManipulationViewport2Vtbl {
    BEGIN_INTERFACE

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

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

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

    /*** IDirectManipulationViewport methods ***/
    HRESULT (STDMETHODCALLTYPE *Enable)(
        IDirectManipulationViewport2 *This);

    HRESULT (STDMETHODCALLTYPE *Disable)(
        IDirectManipulationViewport2 *This);

    HRESULT (STDMETHODCALLTYPE *SetContact)(
        IDirectManipulationViewport2 *This,
        UINT32 id);

    HRESULT (STDMETHODCALLTYPE *ReleaseContact)(
        IDirectManipulationViewport2 *This,
        UINT32 id);

    HRESULT (STDMETHODCALLTYPE *ReleaseAllContacts)(
        IDirectManipulationViewport2 *This);

    HRESULT (STDMETHODCALLTYPE *GetStatus)(
        IDirectManipulationViewport2 *This,
        DIRECTMANIPULATION_STATUS *status);

    HRESULT (STDMETHODCALLTYPE *GetTag)(
        IDirectManipulationViewport2 *This,
        REFIID riid,
        void **object,
        UINT32 *id);

    HRESULT (STDMETHODCALLTYPE *SetTag)(
        IDirectManipulationViewport2 *This,
        IUnknown *object,
        UINT32 id);

    HRESULT (STDMETHODCALLTYPE *GetViewportRect)(
        IDirectManipulationViewport2 *This,
        RECT *viewport);

    HRESULT (STDMETHODCALLTYPE *SetViewportRect)(
        IDirectManipulationViewport2 *This,
        const RECT *viewport);

    HRESULT (STDMETHODCALLTYPE *ZoomToRect)(
        IDirectManipulationViewport2 *This,
        const float left,
        const float top,
        const float right,
        const float bottom,
        WINBOOL animate);

    HRESULT (STDMETHODCALLTYPE *SetViewportTransform)(
        IDirectManipulationViewport2 *This,
        const float *matrix,
        DWORD count);

    HRESULT (STDMETHODCALLTYPE *SyncDisplayTransform)(
        IDirectManipulationViewport2 *This,
        const float *matrix,
        DWORD count);

    HRESULT (STDMETHODCALLTYPE *GetPrimaryContent)(
        IDirectManipulationViewport2 *This,
        REFIID riid,
        void **object);

    HRESULT (STDMETHODCALLTYPE *AddContent)(
        IDirectManipulationViewport2 *This,
        IDirectManipulationContent *content);

    HRESULT (STDMETHODCALLTYPE *RemoveContent)(
        IDirectManipulationViewport2 *This,
        IDirectManipulationContent *content);

    HRESULT (STDMETHODCALLTYPE *SetViewportOptions)(
        IDirectManipulationViewport2 *This,
        DIRECTMANIPULATION_VIEWPORT_OPTIONS options);

    HRESULT (STDMETHODCALLTYPE *AddConfiguration)(
        IDirectManipulationViewport2 *This,
        DIRECTMANIPULATION_CONFIGURATION configuration);

    HRESULT (STDMETHODCALLTYPE *RemoveConfiguration)(
        IDirectManipulationViewport2 *This,
        DIRECTMANIPULATION_CONFIGURATION configuration);

    HRESULT (STDMETHODCALLTYPE *ActivateConfiguration)(
        IDirectManipulationViewport2 *This,
        DIRECTMANIPULATION_CONFIGURATION configuration);

    HRESULT (STDMETHODCALLTYPE *SetManualGesture)(
        IDirectManipulationViewport2 *This,
        DIRECTMANIPULATION_GESTURE_CONFIGURATION configuration);

    HRESULT (STDMETHODCALLTYPE *SetChaining)(
        IDirectManipulationViewport2 *This,
        DIRECTMANIPULATION_MOTION_TYPES enabledTypes);

    HRESULT (STDMETHODCALLTYPE *AddEventHandler)(
        IDirectManipulationViewport2 *This,
        HWND window,
        IDirectManipulationViewportEventHandler *eventHandler,
        DWORD *cookie);

    HRESULT (STDMETHODCALLTYPE *RemoveEventHandler)(
        IDirectManipulationViewport2 *This,
        DWORD cookie);

    HRESULT (STDMETHODCALLTYPE *SetInputMode)(
        IDirectManipulationViewport2 *This,
        DIRECTMANIPULATION_INPUT_MODE mode);

    HRESULT (STDMETHODCALLTYPE *SetUpdateMode)(
        IDirectManipulationViewport2 *This,
        DIRECTMANIPULATION_INPUT_MODE mode);

    HRESULT (STDMETHODCALLTYPE *Stop)(
        IDirectManipulationViewport2 *This);

    HRESULT (STDMETHODCALLTYPE *Abandon)(
        IDirectManipulationViewport2 *This);

    /*** IDirectManipulationViewport2 methods ***/
    HRESULT (STDMETHODCALLTYPE *AddBehavior)(
        IDirectManipulationViewport2 *This,
        IUnknown *behavior,
        DWORD *cookie);

    HRESULT (STDMETHODCALLTYPE *RemoveBehavior)(
        IDirectManipulationViewport2 *This,
        DWORD cookie);

    HRESULT (STDMETHODCALLTYPE *RemoveAllBehaviors)(
        IDirectManipulationViewport2 *This);

    END_INTERFACE
} IDirectManipulationViewport2Vtbl;

interface IDirectManipulationViewport2 {
    CONST_VTBL IDirectManipulationViewport2Vtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IDirectManipulationViewport2_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IDirectManipulationViewport2_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IDirectManipulationViewport2_Release(This) (This)->lpVtbl->Release(This)
/*** IDirectManipulationViewport methods ***/
#define IDirectManipulationViewport2_Enable(This) (This)->lpVtbl->Enable(This)
#define IDirectManipulationViewport2_Disable(This) (This)->lpVtbl->Disable(This)
#define IDirectManipulationViewport2_SetContact(This,id) (This)->lpVtbl->SetContact(This,id)
#define IDirectManipulationViewport2_ReleaseContact(This,id) (This)->lpVtbl->ReleaseContact(This,id)
#define IDirectManipulationViewport2_ReleaseAllContacts(This) (This)->lpVtbl->ReleaseAllContacts(This)
#define IDirectManipulationViewport2_GetStatus(This,status) (This)->lpVtbl->GetStatus(This,status)
#define IDirectManipulationViewport2_GetTag(This,riid,object,id) (This)->lpVtbl->GetTag(This,riid,object,id)
#define IDirectManipulationViewport2_SetTag(This,object,id) (This)->lpVtbl->SetTag(This,object,id)
#define IDirectManipulationViewport2_GetViewportRect(This,viewport) (This)->lpVtbl->GetViewportRect(This,viewport)
#define IDirectManipulationViewport2_SetViewportRect(This,viewport) (This)->lpVtbl->SetViewportRect(This,viewport)
#define IDirectManipulationViewport2_ZoomToRect(This,left,top,right,bottom,animate) (This)->lpVtbl->ZoomToRect(This,left,top,right,bottom,animate)
#define IDirectManipulationViewport2_SetViewportTransform(This,matrix,count) (This)->lpVtbl->SetViewportTransform(This,matrix,count)
#define IDirectManipulationViewport2_SyncDisplayTransform(This,matrix,count) (This)->lpVtbl->SyncDisplayTransform(This,matrix,count)
#define IDirectManipulationViewport2_GetPrimaryContent(This,riid,object) (This)->lpVtbl->GetPrimaryContent(This,riid,object)
#define IDirectManipulationViewport2_AddContent(This,content) (This)->lpVtbl->AddContent(This,content)
#define IDirectManipulationViewport2_RemoveContent(This,content) (This)->lpVtbl->RemoveContent(This,content)
#define IDirectManipulationViewport2_SetViewportOptions(This,options) (This)->lpVtbl->SetViewportOptions(This,options)
#define IDirectManipulationViewport2_AddConfiguration(This,configuration) (This)->lpVtbl->AddConfiguration(This,configuration)
#define IDirectManipulationViewport2_RemoveConfiguration(This,configuration) (This)->lpVtbl->RemoveConfiguration(This,configuration)
#define IDirectManipulationViewport2_ActivateConfiguration(This,configuration) (This)->lpVtbl->ActivateConfiguration(This,configuration)
#define IDirectManipulationViewport2_SetManualGesture(This,configuration) (This)->lpVtbl->SetManualGesture(This,configuration)
#define IDirectManipulationViewport2_SetChaining(This,enabledTypes) (This)->lpVtbl->SetChaining(This,enabledTypes)
#define IDirectManipulationViewport2_AddEventHandler(This,window,eventHandler,cookie) (This)->lpVtbl->AddEventHandler(This,window,eventHandler,cookie)
#define IDirectManipulationViewport2_RemoveEventHandler(This,cookie) (This)->lpVtbl->RemoveEventHandler(This,cookie)
#define IDirectManipulationViewport2_SetInputMode(This,mode) (This)->lpVtbl->SetInputMode(This,mode)
#define IDirectManipulationViewport2_SetUpdateMode(This,mode) (This)->lpVtbl->SetUpdateMode(This,mode)
#define IDirectManipulationViewport2_Stop(This) (This)->lpVtbl->Stop(This)
#define IDirectManipulationViewport2_Abandon(This) (This)->lpVtbl->Abandon(This)
/*** IDirectManipulationViewport2 methods ***/
#define IDirectManipulationViewport2_AddBehavior(This,behavior,cookie) (This)->lpVtbl->AddBehavior(This,behavior,cookie)
#define IDirectManipulationViewport2_RemoveBehavior(This,cookie) (This)->lpVtbl->RemoveBehavior(This,cookie)
#define IDirectManipulationViewport2_RemoveAllBehaviors(This) (This)->lpVtbl->RemoveAllBehaviors(This)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IDirectManipulationViewport2_QueryInterface(IDirectManipulationViewport2* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IDirectManipulationViewport2_AddRef(IDirectManipulationViewport2* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IDirectManipulationViewport2_Release(IDirectManipulationViewport2* This) {
    return This->lpVtbl->Release(This);
}
/*** IDirectManipulationViewport methods ***/
static FORCEINLINE HRESULT IDirectManipulationViewport2_Enable(IDirectManipulationViewport2* This) {
    return This->lpVtbl->Enable(This);
}
static FORCEINLINE HRESULT IDirectManipulationViewport2_Disable(IDirectManipulationViewport2* This) {
    return This->lpVtbl->Disable(This);
}
static FORCEINLINE HRESULT IDirectManipulationViewport2_SetContact(IDirectManipulationViewport2* This,UINT32 id) {
    return This->lpVtbl->SetContact(This,id);
}
static FORCEINLINE HRESULT IDirectManipulationViewport2_ReleaseContact(IDirectManipulationViewport2* This,UINT32 id) {
    return This->lpVtbl->ReleaseContact(This,id);
}
static FORCEINLINE HRESULT IDirectManipulationViewport2_ReleaseAllContacts(IDirectManipulationViewport2* This) {
    return This->lpVtbl->ReleaseAllContacts(This);
}
static FORCEINLINE HRESULT IDirectManipulationViewport2_GetStatus(IDirectManipulationViewport2* This,DIRECTMANIPULATION_STATUS *status) {
    return This->lpVtbl->GetStatus(This,status);
}
static FORCEINLINE HRESULT IDirectManipulationViewport2_GetTag(IDirectManipulationViewport2* This,REFIID riid,void **object,UINT32 *id) {
    return This->lpVtbl->GetTag(This,riid,object,id);
}
static FORCEINLINE HRESULT IDirectManipulationViewport2_SetTag(IDirectManipulationViewport2* This,IUnknown *object,UINT32 id) {
    return This->lpVtbl->SetTag(This,object,id);
}
static FORCEINLINE HRESULT IDirectManipulationViewport2_GetViewportRect(IDirectManipulationViewport2* This,RECT *viewport) {
    return This->lpVtbl->GetViewportRect(This,viewport);
}
static FORCEINLINE HRESULT IDirectManipulationViewport2_SetViewportRect(IDirectManipulationViewport2* This,const RECT *viewport) {
    return This->lpVtbl->SetViewportRect(This,viewport);
}
static FORCEINLINE HRESULT IDirectManipulationViewport2_ZoomToRect(IDirectManipulationViewport2* This,const float left,const float top,const float right,const float bottom,WINBOOL animate) {
    return This->lpVtbl->ZoomToRect(This,left,top,right,bottom,animate);
}
static FORCEINLINE HRESULT IDirectManipulationViewport2_SetViewportTransform(IDirectManipulationViewport2* This,const float *matrix,DWORD count) {
    return This->lpVtbl->SetViewportTransform(This,matrix,count);
}
static FORCEINLINE HRESULT IDirectManipulationViewport2_SyncDisplayTransform(IDirectManipulationViewport2* This,const float *matrix,DWORD count) {
    return This->lpVtbl->SyncDisplayTransform(This,matrix,count);
}
static FORCEINLINE HRESULT IDirectManipulationViewport2_GetPrimaryContent(IDirectManipulationViewport2* This,REFIID riid,void **object) {
    return This->lpVtbl->GetPrimaryContent(This,riid,object);
}
static FORCEINLINE HRESULT IDirectManipulationViewport2_AddContent(IDirectManipulationViewport2* This,IDirectManipulationContent *content) {
    return This->lpVtbl->AddContent(This,content);
}
static FORCEINLINE HRESULT IDirectManipulationViewport2_RemoveContent(IDirectManipulationViewport2* This,IDirectManipulationContent *content) {
    return This->lpVtbl->RemoveContent(This,content);
}
static FORCEINLINE HRESULT IDirectManipulationViewport2_SetViewportOptions(IDirectManipulationViewport2* This,DIRECTMANIPULATION_VIEWPORT_OPTIONS options) {
    return This->lpVtbl->SetViewportOptions(This,options);
}
static FORCEINLINE HRESULT IDirectManipulationViewport2_AddConfiguration(IDirectManipulationViewport2* This,DIRECTMANIPULATION_CONFIGURATION configuration) {
    return This->lpVtbl->AddConfiguration(This,configuration);
}
static FORCEINLINE HRESULT IDirectManipulationViewport2_RemoveConfiguration(IDirectManipulationViewport2* This,DIRECTMANIPULATION_CONFIGURATION configuration) {
    return This->lpVtbl->RemoveConfiguration(This,configuration);
}
static FORCEINLINE HRESULT IDirectManipulationViewport2_ActivateConfiguration(IDirectManipulationViewport2* This,DIRECTMANIPULATION_CONFIGURATION configuration) {
    return This->lpVtbl->ActivateConfiguration(This,configuration);
}
static FORCEINLINE HRESULT IDirectManipulationViewport2_SetManualGesture(IDirectManipulationViewport2* This,DIRECTMANIPULATION_GESTURE_CONFIGURATION configuration) {
    return This->lpVtbl->SetManualGesture(This,configuration);
}
static FORCEINLINE HRESULT IDirectManipulationViewport2_SetChaining(IDirectManipulationViewport2* This,DIRECTMANIPULATION_MOTION_TYPES enabledTypes) {
    return This->lpVtbl->SetChaining(This,enabledTypes);
}
static FORCEINLINE HRESULT IDirectManipulationViewport2_AddEventHandler(IDirectManipulationViewport2* This,HWND window,IDirectManipulationViewportEventHandler *eventHandler,DWORD *cookie) {
    return This->lpVtbl->AddEventHandler(This,window,eventHandler,cookie);
}
static FORCEINLINE HRESULT IDirectManipulationViewport2_RemoveEventHandler(IDirectManipulationViewport2* This,DWORD cookie) {
    return This->lpVtbl->RemoveEventHandler(This,cookie);
}
static FORCEINLINE HRESULT IDirectManipulationViewport2_SetInputMode(IDirectManipulationViewport2* This,DIRECTMANIPULATION_INPUT_MODE mode) {
    return This->lpVtbl->SetInputMode(This,mode);
}
static FORCEINLINE HRESULT IDirectManipulationViewport2_SetUpdateMode(IDirectManipulationViewport2* This,DIRECTMANIPULATION_INPUT_MODE mode) {
    return This->lpVtbl->SetUpdateMode(This,mode);
}
static FORCEINLINE HRESULT IDirectManipulationViewport2_Stop(IDirectManipulationViewport2* This) {
    return This->lpVtbl->Stop(This);
}
static FORCEINLINE HRESULT IDirectManipulationViewport2_Abandon(IDirectManipulationViewport2* This) {
    return This->lpVtbl->Abandon(This);
}
/*** IDirectManipulationViewport2 methods ***/
static FORCEINLINE HRESULT IDirectManipulationViewport2_AddBehavior(IDirectManipulationViewport2* This,IUnknown *behavior,DWORD *cookie) {
    return This->lpVtbl->AddBehavior(This,behavior,cookie);
}
static FORCEINLINE HRESULT IDirectManipulationViewport2_RemoveBehavior(IDirectManipulationViewport2* This,DWORD cookie) {
    return This->lpVtbl->RemoveBehavior(This,cookie);
}
static FORCEINLINE HRESULT IDirectManipulationViewport2_RemoveAllBehaviors(IDirectManipulationViewport2* This) {
    return This->lpVtbl->RemoveAllBehaviors(This);
}
#endif
#endif

#endif


#endif  /* __IDirectManipulationViewport2_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IDirectManipulationViewportEventHandler interface
 */
#ifndef __IDirectManipulationViewportEventHandler_INTERFACE_DEFINED__
#define __IDirectManipulationViewportEventHandler_INTERFACE_DEFINED__

DEFINE_GUID(IID_IDirectManipulationViewportEventHandler, 0x952121da, 0xd69f, 0x45f9, 0xb0,0xf9, 0xf2,0x39,0x44,0x32,0x1a,0x6d);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("952121da-d69f-45f9-b0f9-f23944321a6d")
IDirectManipulationViewportEventHandler : public IUnknown
{
    virtual HRESULT STDMETHODCALLTYPE OnViewportStatusChanged(
        IDirectManipulationViewport *viewport,
        DIRECTMANIPULATION_STATUS current,
        DIRECTMANIPULATION_STATUS previous) = 0;

    virtual HRESULT STDMETHODCALLTYPE OnViewportUpdated(
        IDirectManipulationViewport *viewport) = 0;

    virtual HRESULT STDMETHODCALLTYPE OnContentUpdated(
        IDirectManipulationViewport *viewport,
        IDirectManipulationContent *content) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IDirectManipulationViewportEventHandler, 0x952121da, 0xd69f, 0x45f9, 0xb0,0xf9, 0xf2,0x39,0x44,0x32,0x1a,0x6d)
#endif
#else
typedef struct IDirectManipulationViewportEventHandlerVtbl {
    BEGIN_INTERFACE

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

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

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

    /*** IDirectManipulationViewportEventHandler methods ***/
    HRESULT (STDMETHODCALLTYPE *OnViewportStatusChanged)(
        IDirectManipulationViewportEventHandler *This,
        IDirectManipulationViewport *viewport,
        DIRECTMANIPULATION_STATUS current,
        DIRECTMANIPULATION_STATUS previous);

    HRESULT (STDMETHODCALLTYPE *OnViewportUpdated)(
        IDirectManipulationViewportEventHandler *This,
        IDirectManipulationViewport *viewport);

    HRESULT (STDMETHODCALLTYPE *OnContentUpdated)(
        IDirectManipulationViewportEventHandler *This,
        IDirectManipulationViewport *viewport,
        IDirectManipulationContent *content);

    END_INTERFACE
} IDirectManipulationViewportEventHandlerVtbl;

interface IDirectManipulationViewportEventHandler {
    CONST_VTBL IDirectManipulationViewportEventHandlerVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IDirectManipulationViewportEventHandler_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IDirectManipulationViewportEventHandler_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IDirectManipulationViewportEventHandler_Release(This) (This)->lpVtbl->Release(This)
/*** IDirectManipulationViewportEventHandler methods ***/
#define IDirectManipulationViewportEventHandler_OnViewportStatusChanged(This,viewport,current,previous) (This)->lpVtbl->OnViewportStatusChanged(This,viewport,current,previous)
#define IDirectManipulationViewportEventHandler_OnViewportUpdated(This,viewport) (This)->lpVtbl->OnViewportUpdated(This,viewport)
#define IDirectManipulationViewportEventHandler_OnContentUpdated(This,viewport,content) (This)->lpVtbl->OnContentUpdated(This,viewport,content)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IDirectManipulationViewportEventHandler_QueryInterface(IDirectManipulationViewportEventHandler* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IDirectManipulationViewportEventHandler_AddRef(IDirectManipulationViewportEventHandler* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IDirectManipulationViewportEventHandler_Release(IDirectManipulationViewportEventHandler* This) {
    return This->lpVtbl->Release(This);
}
/*** IDirectManipulationViewportEventHandler methods ***/
static FORCEINLINE HRESULT IDirectManipulationViewportEventHandler_OnViewportStatusChanged(IDirectManipulationViewportEventHandler* This,IDirectManipulationViewport *viewport,DIRECTMANIPULATION_STATUS current,DIRECTMANIPULATION_STATUS previous) {
    return This->lpVtbl->OnViewportStatusChanged(This,viewport,current,previous);
}
static FORCEINLINE HRESULT IDirectManipulationViewportEventHandler_OnViewportUpdated(IDirectManipulationViewportEventHandler* This,IDirectManipulationViewport *viewport) {
    return This->lpVtbl->OnViewportUpdated(This,viewport);
}
static FORCEINLINE HRESULT IDirectManipulationViewportEventHandler_OnContentUpdated(IDirectManipulationViewportEventHandler* This,IDirectManipulationViewport *viewport,IDirectManipulationContent *content) {
    return This->lpVtbl->OnContentUpdated(This,viewport,content);
}
#endif
#endif

#endif


#endif  /* __IDirectManipulationViewportEventHandler_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IDirectManipulationManager2 interface
 */
#ifndef __IDirectManipulationManager2_INTERFACE_DEFINED__
#define __IDirectManipulationManager2_INTERFACE_DEFINED__

DEFINE_GUID(IID_IDirectManipulationManager2, 0xfa1005e9, 0x3d16, 0x484c, 0xbf,0xc9, 0x62,0xb6,0x1e,0x56,0xec,0x4e);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("fa1005e9-3d16-484c-bfc9-62b61e56ec4e")
IDirectManipulationManager2 : public IDirectManipulationManager
{
    virtual HRESULT STDMETHODCALLTYPE CreateBehavior(
        REFCLSID clsid,
        REFIID riid,
        void **obj) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IDirectManipulationManager2, 0xfa1005e9, 0x3d16, 0x484c, 0xbf,0xc9, 0x62,0xb6,0x1e,0x56,0xec,0x4e)
#endif
#else
typedef struct IDirectManipulationManager2Vtbl {
    BEGIN_INTERFACE

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

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

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

    /*** IDirectManipulationManager methods ***/
    HRESULT (STDMETHODCALLTYPE *Activate)(
        IDirectManipulationManager2 *This,
        HWND window);

    HRESULT (STDMETHODCALLTYPE *Deactivate)(
        IDirectManipulationManager2 *This,
        HWND window);

    HRESULT (STDMETHODCALLTYPE *RegisterHitTestTarget)(
        IDirectManipulationManager2 *This,
        HWND window,
        HWND hittest,
        DIRECTMANIPULATION_HITTEST_TYPE type);

    HRESULT (STDMETHODCALLTYPE *ProcessInput)(
        IDirectManipulationManager2 *This,
        const MSG *msg,
        WINBOOL *handled);

    HRESULT (STDMETHODCALLTYPE *GetUpdateManager)(
        IDirectManipulationManager2 *This,
        REFIID riid,
        void **obj);

    HRESULT (STDMETHODCALLTYPE *CreateViewport)(
        IDirectManipulationManager2 *This,
        IDirectManipulationFrameInfoProvider *frame,
        HWND window,
        REFIID riid,
        void **obj);

    HRESULT (STDMETHODCALLTYPE *CreateContent)(
        IDirectManipulationManager2 *This,
        IDirectManipulationFrameInfoProvider *frame,
        REFCLSID clsid,
        REFIID riid,
        void **obj);

    /*** IDirectManipulationManager2 methods ***/
    HRESULT (STDMETHODCALLTYPE *CreateBehavior)(
        IDirectManipulationManager2 *This,
        REFCLSID clsid,
        REFIID riid,
        void **obj);

    END_INTERFACE
} IDirectManipulationManager2Vtbl;

interface IDirectManipulationManager2 {
    CONST_VTBL IDirectManipulationManager2Vtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IDirectManipulationManager2_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IDirectManipulationManager2_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IDirectManipulationManager2_Release(This) (This)->lpVtbl->Release(This)
/*** IDirectManipulationManager methods ***/
#define IDirectManipulationManager2_Activate(This,window) (This)->lpVtbl->Activate(This,window)
#define IDirectManipulationManager2_Deactivate(This,window) (This)->lpVtbl->Deactivate(This,window)
#define IDirectManipulationManager2_RegisterHitTestTarget(This,window,hittest,type) (This)->lpVtbl->RegisterHitTestTarget(This,window,hittest,type)
#define IDirectManipulationManager2_ProcessInput(This,msg,handled) (This)->lpVtbl->ProcessInput(This,msg,handled)
#define IDirectManipulationManager2_GetUpdateManager(This,riid,obj) (This)->lpVtbl->GetUpdateManager(This,riid,obj)
#define IDirectManipulationManager2_CreateViewport(This,frame,window,riid,obj) (This)->lpVtbl->CreateViewport(This,frame,window,riid,obj)
#define IDirectManipulationManager2_CreateContent(This,frame,clsid,riid,obj) (This)->lpVtbl->CreateContent(This,frame,clsid,riid,obj)
/*** IDirectManipulationManager2 methods ***/
#define IDirectManipulationManager2_CreateBehavior(This,clsid,riid,obj) (This)->lpVtbl->CreateBehavior(This,clsid,riid,obj)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IDirectManipulationManager2_QueryInterface(IDirectManipulationManager2* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IDirectManipulationManager2_AddRef(IDirectManipulationManager2* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IDirectManipulationManager2_Release(IDirectManipulationManager2* This) {
    return This->lpVtbl->Release(This);
}
/*** IDirectManipulationManager methods ***/
static FORCEINLINE HRESULT IDirectManipulationManager2_Activate(IDirectManipulationManager2* This,HWND window) {
    return This->lpVtbl->Activate(This,window);
}
static FORCEINLINE HRESULT IDirectManipulationManager2_Deactivate(IDirectManipulationManager2* This,HWND window) {
    return This->lpVtbl->Deactivate(This,window);
}
static FORCEINLINE HRESULT IDirectManipulationManager2_RegisterHitTestTarget(IDirectManipulationManager2* This,HWND window,HWND hittest,DIRECTMANIPULATION_HITTEST_TYPE type) {
    return This->lpVtbl->RegisterHitTestTarget(This,window,hittest,type);
}
static FORCEINLINE HRESULT IDirectManipulationManager2_ProcessInput(IDirectManipulationManager2* This,const MSG *msg,WINBOOL *handled) {
    return This->lpVtbl->ProcessInput(This,msg,handled);
}
static FORCEINLINE HRESULT IDirectManipulationManager2_GetUpdateManager(IDirectManipulationManager2* This,REFIID riid,void **obj) {
    return This->lpVtbl->GetUpdateManager(This,riid,obj);
}
static FORCEINLINE HRESULT IDirectManipulationManager2_CreateViewport(IDirectManipulationManager2* This,IDirectManipulationFrameInfoProvider *frame,HWND window,REFIID riid,void **obj) {
    return This->lpVtbl->CreateViewport(This,frame,window,riid,obj);
}
static FORCEINLINE HRESULT IDirectManipulationManager2_CreateContent(IDirectManipulationManager2* This,IDirectManipulationFrameInfoProvider *frame,REFCLSID clsid,REFIID riid,void **obj) {
    return This->lpVtbl->CreateContent(This,frame,clsid,riid,obj);
}
/*** IDirectManipulationManager2 methods ***/
static FORCEINLINE HRESULT IDirectManipulationManager2_CreateBehavior(IDirectManipulationManager2* This,REFCLSID clsid,REFIID riid,void **obj) {
    return This->lpVtbl->CreateBehavior(This,clsid,riid,obj);
}
#endif
#endif

#endif


#endif  /* __IDirectManipulationManager2_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IDirectManipulationPrimaryContent interface
 */
#ifndef __IDirectManipulationPrimaryContent_INTERFACE_DEFINED__
#define __IDirectManipulationPrimaryContent_INTERFACE_DEFINED__

DEFINE_GUID(IID_IDirectManipulationPrimaryContent, 0xc12851e4, 0x1698, 0x4625, 0xb9,0xb1, 0x7c,0xa3,0xec,0x18,0x63,0x0b);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("c12851e4-1698-4625-b9b1-7ca3ec18630b")
IDirectManipulationPrimaryContent : public IUnknown
{
    virtual HRESULT STDMETHODCALLTYPE SetSnapInterval(
        DIRECTMANIPULATION_MOTION_TYPES motion,
        float interval,
        float offset) = 0;

    virtual HRESULT STDMETHODCALLTYPE SetSnapPoints(
        DIRECTMANIPULATION_MOTION_TYPES motion,
        const float *points,
        DWORD count) = 0;

    virtual HRESULT STDMETHODCALLTYPE SetSnapType(
        DIRECTMANIPULATION_MOTION_TYPES motion,
        DIRECTMANIPULATION_SNAPPOINT_TYPE type) = 0;

    virtual HRESULT STDMETHODCALLTYPE SetSnapCoordinate(
        DIRECTMANIPULATION_MOTION_TYPES motion,
        DIRECTMANIPULATION_SNAPPOINT_COORDINATE coordinate,
        float origin) = 0;

    virtual HRESULT STDMETHODCALLTYPE SetZoomBoundaries(
        float minimum,
        float maximum) = 0;

    virtual HRESULT STDMETHODCALLTYPE SetHorizontalAlignment(
        DIRECTMANIPULATION_HORIZONTALALIGNMENT alignment) = 0;

    virtual HRESULT STDMETHODCALLTYPE SetVerticalAlignment(
        DIRECTMANIPULATION_VERTICALALIGNMENT alignment) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetInertiaEndTransform(
        float *matrix,
        DWORD count) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetCenterPoint(
        float *x,
        float *y) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IDirectManipulationPrimaryContent, 0xc12851e4, 0x1698, 0x4625, 0xb9,0xb1, 0x7c,0xa3,0xec,0x18,0x63,0x0b)
#endif
#else
typedef struct IDirectManipulationPrimaryContentVtbl {
    BEGIN_INTERFACE

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

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

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

    /*** IDirectManipulationPrimaryContent methods ***/
    HRESULT (STDMETHODCALLTYPE *SetSnapInterval)(
        IDirectManipulationPrimaryContent *This,
        DIRECTMANIPULATION_MOTION_TYPES motion,
        float interval,
        float offset);

    HRESULT (STDMETHODCALLTYPE *SetSnapPoints)(
        IDirectManipulationPrimaryContent *This,
        DIRECTMANIPULATION_MOTION_TYPES motion,
        const float *points,
        DWORD count);

    HRESULT (STDMETHODCALLTYPE *SetSnapType)(
        IDirectManipulationPrimaryContent *This,
        DIRECTMANIPULATION_MOTION_TYPES motion,
        DIRECTMANIPULATION_SNAPPOINT_TYPE type);

    HRESULT (STDMETHODCALLTYPE *SetSnapCoordinate)(
        IDirectManipulationPrimaryContent *This,
        DIRECTMANIPULATION_MOTION_TYPES motion,
        DIRECTMANIPULATION_SNAPPOINT_COORDINATE coordinate,
        float origin);

    HRESULT (STDMETHODCALLTYPE *SetZoomBoundaries)(
        IDirectManipulationPrimaryContent *This,
        float minimum,
        float maximum);

    HRESULT (STDMETHODCALLTYPE *SetHorizontalAlignment)(
        IDirectManipulationPrimaryContent *This,
        DIRECTMANIPULATION_HORIZONTALALIGNMENT alignment);

    HRESULT (STDMETHODCALLTYPE *SetVerticalAlignment)(
        IDirectManipulationPrimaryContent *This,
        DIRECTMANIPULATION_VERTICALALIGNMENT alignment);

    HRESULT (STDMETHODCALLTYPE *GetInertiaEndTransform)(
        IDirectManipulationPrimaryContent *This,
        float *matrix,
        DWORD count);

    HRESULT (STDMETHODCALLTYPE *GetCenterPoint)(
        IDirectManipulationPrimaryContent *This,
        float *x,
        float *y);

    END_INTERFACE
} IDirectManipulationPrimaryContentVtbl;

interface IDirectManipulationPrimaryContent {
    CONST_VTBL IDirectManipulationPrimaryContentVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IDirectManipulationPrimaryContent_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IDirectManipulationPrimaryContent_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IDirectManipulationPrimaryContent_Release(This) (This)->lpVtbl->Release(This)
/*** IDirectManipulationPrimaryContent methods ***/
#define IDirectManipulationPrimaryContent_SetSnapInterval(This,motion,interval,offset) (This)->lpVtbl->SetSnapInterval(This,motion,interval,offset)
#define IDirectManipulationPrimaryContent_SetSnapPoints(This,motion,points,count) (This)->lpVtbl->SetSnapPoints(This,motion,points,count)
#define IDirectManipulationPrimaryContent_SetSnapType(This,motion,type) (This)->lpVtbl->SetSnapType(This,motion,type)
#define IDirectManipulationPrimaryContent_SetSnapCoordinate(This,motion,coordinate,origin) (This)->lpVtbl->SetSnapCoordinate(This,motion,coordinate,origin)
#define IDirectManipulationPrimaryContent_SetZoomBoundaries(This,minimum,maximum) (This)->lpVtbl->SetZoomBoundaries(This,minimum,maximum)
#define IDirectManipulationPrimaryContent_SetHorizontalAlignment(This,alignment) (This)->lpVtbl->SetHorizontalAlignment(This,alignment)
#define IDirectManipulationPrimaryContent_SetVerticalAlignment(This,alignment) (This)->lpVtbl->SetVerticalAlignment(This,alignment)
#define IDirectManipulationPrimaryContent_GetInertiaEndTransform(This,matrix,count) (This)->lpVtbl->GetInertiaEndTransform(This,matrix,count)
#define IDirectManipulationPrimaryContent_GetCenterPoint(This,x,y) (This)->lpVtbl->GetCenterPoint(This,x,y)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IDirectManipulationPrimaryContent_QueryInterface(IDirectManipulationPrimaryContent* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IDirectManipulationPrimaryContent_AddRef(IDirectManipulationPrimaryContent* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IDirectManipulationPrimaryContent_Release(IDirectManipulationPrimaryContent* This) {
    return This->lpVtbl->Release(This);
}
/*** IDirectManipulationPrimaryContent methods ***/
static FORCEINLINE HRESULT IDirectManipulationPrimaryContent_SetSnapInterval(IDirectManipulationPrimaryContent* This,DIRECTMANIPULATION_MOTION_TYPES motion,float interval,float offset) {
    return This->lpVtbl->SetSnapInterval(This,motion,interval,offset);
}
static FORCEINLINE HRESULT IDirectManipulationPrimaryContent_SetSnapPoints(IDirectManipulationPrimaryContent* This,DIRECTMANIPULATION_MOTION_TYPES motion,const float *points,DWORD count) {
    return This->lpVtbl->SetSnapPoints(This,motion,points,count);
}
static FORCEINLINE HRESULT IDirectManipulationPrimaryContent_SetSnapType(IDirectManipulationPrimaryContent* This,DIRECTMANIPULATION_MOTION_TYPES motion,DIRECTMANIPULATION_SNAPPOINT_TYPE type) {
    return This->lpVtbl->SetSnapType(This,motion,type);
}
static FORCEINLINE HRESULT IDirectManipulationPrimaryContent_SetSnapCoordinate(IDirectManipulationPrimaryContent* This,DIRECTMANIPULATION_MOTION_TYPES motion,DIRECTMANIPULATION_SNAPPOINT_COORDINATE coordinate,float origin) {
    return This->lpVtbl->SetSnapCoordinate(This,motion,coordinate,origin);
}
static FORCEINLINE HRESULT IDirectManipulationPrimaryContent_SetZoomBoundaries(IDirectManipulationPrimaryContent* This,float minimum,float maximum) {
    return This->lpVtbl->SetZoomBoundaries(This,minimum,maximum);
}
static FORCEINLINE HRESULT IDirectManipulationPrimaryContent_SetHorizontalAlignment(IDirectManipulationPrimaryContent* This,DIRECTMANIPULATION_HORIZONTALALIGNMENT alignment) {
    return This->lpVtbl->SetHorizontalAlignment(This,alignment);
}
static FORCEINLINE HRESULT IDirectManipulationPrimaryContent_SetVerticalAlignment(IDirectManipulationPrimaryContent* This,DIRECTMANIPULATION_VERTICALALIGNMENT alignment) {
    return This->lpVtbl->SetVerticalAlignment(This,alignment);
}
static FORCEINLINE HRESULT IDirectManipulationPrimaryContent_GetInertiaEndTransform(IDirectManipulationPrimaryContent* This,float *matrix,DWORD count) {
    return This->lpVtbl->GetInertiaEndTransform(This,matrix,count);
}
static FORCEINLINE HRESULT IDirectManipulationPrimaryContent_GetCenterPoint(IDirectManipulationPrimaryContent* This,float *x,float *y) {
    return This->lpVtbl->GetCenterPoint(This,x,y);
}
#endif
#endif

#endif


#endif  /* __IDirectManipulationPrimaryContent_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IDirectManipulationCompositor2 interface
 */
#ifndef __IDirectManipulationCompositor2_INTERFACE_DEFINED__
#define __IDirectManipulationCompositor2_INTERFACE_DEFINED__

DEFINE_GUID(IID_IDirectManipulationCompositor2, 0xd38c7822, 0xf1cb, 0x43cb, 0xb4,0xb9, 0xac,0x0c,0x76,0x7a,0x41,0x2e);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("d38c7822-f1cb-43cb-b4b9-ac0c767a412e")
IDirectManipulationCompositor2 : public IDirectManipulationCompositor
{
    virtual HRESULT STDMETHODCALLTYPE AddContentWithCrossProcessChaining(
        IDirectManipulationPrimaryContent *content,
        IUnknown *device,
        IUnknown *parentVisual,
        IUnknown *childVisual) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IDirectManipulationCompositor2, 0xd38c7822, 0xf1cb, 0x43cb, 0xb4,0xb9, 0xac,0x0c,0x76,0x7a,0x41,0x2e)
#endif
#else
typedef struct IDirectManipulationCompositor2Vtbl {
    BEGIN_INTERFACE

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

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

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

    /*** IDirectManipulationCompositor methods ***/
    HRESULT (STDMETHODCALLTYPE *AddContent)(
        IDirectManipulationCompositor2 *This,
        IDirectManipulationContent *content,
        IUnknown *device,
        IUnknown *parent,
        IUnknown *child);

    HRESULT (STDMETHODCALLTYPE *RemoveContent)(
        IDirectManipulationCompositor2 *This,
        IDirectManipulationContent *content);

    HRESULT (STDMETHODCALLTYPE *SetUpdateManager)(
        IDirectManipulationCompositor2 *This,
        IDirectManipulationUpdateManager *manager);

    HRESULT (STDMETHODCALLTYPE *Flush)(
        IDirectManipulationCompositor2 *This);

    /*** IDirectManipulationCompositor2 methods ***/
    HRESULT (STDMETHODCALLTYPE *AddContentWithCrossProcessChaining)(
        IDirectManipulationCompositor2 *This,
        IDirectManipulationPrimaryContent *content,
        IUnknown *device,
        IUnknown *parentVisual,
        IUnknown *childVisual);

    END_INTERFACE
} IDirectManipulationCompositor2Vtbl;

interface IDirectManipulationCompositor2 {
    CONST_VTBL IDirectManipulationCompositor2Vtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IDirectManipulationCompositor2_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IDirectManipulationCompositor2_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IDirectManipulationCompositor2_Release(This) (This)->lpVtbl->Release(This)
/*** IDirectManipulationCompositor methods ***/
#define IDirectManipulationCompositor2_AddContent(This,content,device,parent,child) (This)->lpVtbl->AddContent(This,content,device,parent,child)
#define IDirectManipulationCompositor2_RemoveContent(This,content) (This)->lpVtbl->RemoveContent(This,content)
#define IDirectManipulationCompositor2_SetUpdateManager(This,manager) (This)->lpVtbl->SetUpdateManager(This,manager)
#define IDirectManipulationCompositor2_Flush(This) (This)->lpVtbl->Flush(This)
/*** IDirectManipulationCompositor2 methods ***/
#define IDirectManipulationCompositor2_AddContentWithCrossProcessChaining(This,content,device,parentVisual,childVisual) (This)->lpVtbl->AddContentWithCrossProcessChaining(This,content,device,parentVisual,childVisual)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IDirectManipulationCompositor2_QueryInterface(IDirectManipulationCompositor2* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IDirectManipulationCompositor2_AddRef(IDirectManipulationCompositor2* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IDirectManipulationCompositor2_Release(IDirectManipulationCompositor2* This) {
    return This->lpVtbl->Release(This);
}
/*** IDirectManipulationCompositor methods ***/
static FORCEINLINE HRESULT IDirectManipulationCompositor2_AddContent(IDirectManipulationCompositor2* This,IDirectManipulationContent *content,IUnknown *device,IUnknown *parent,IUnknown *child) {
    return This->lpVtbl->AddContent(This,content,device,parent,child);
}
static FORCEINLINE HRESULT IDirectManipulationCompositor2_RemoveContent(IDirectManipulationCompositor2* This,IDirectManipulationContent *content) {
    return This->lpVtbl->RemoveContent(This,content);
}
static FORCEINLINE HRESULT IDirectManipulationCompositor2_SetUpdateManager(IDirectManipulationCompositor2* This,IDirectManipulationUpdateManager *manager) {
    return This->lpVtbl->SetUpdateManager(This,manager);
}
static FORCEINLINE HRESULT IDirectManipulationCompositor2_Flush(IDirectManipulationCompositor2* This) {
    return This->lpVtbl->Flush(This);
}
/*** IDirectManipulationCompositor2 methods ***/
static FORCEINLINE HRESULT IDirectManipulationCompositor2_AddContentWithCrossProcessChaining(IDirectManipulationCompositor2* This,IDirectManipulationPrimaryContent *content,IUnknown *device,IUnknown *parentVisual,IUnknown *childVisual) {
    return This->lpVtbl->AddContentWithCrossProcessChaining(This,content,device,parentVisual,childVisual);
}
#endif
#endif

#endif


#endif  /* __IDirectManipulationCompositor2_INTERFACE_DEFINED__ */

#ifndef __DirectManipulation_LIBRARY_DEFINED__
#define __DirectManipulation_LIBRARY_DEFINED__

DEFINE_GUID(LIBID_DirectManipulation, 0x9fbedf98, 0xf6d8, 0x4e3b, 0xb4,0x88, 0xfa,0x66,0xdb,0xf5,0xe9,0xf3);

/*****************************************************************************
 * DirectManipulationManager coclass
 */

DEFINE_GUID(CLSID_DirectManipulationManager, 0x54e211b6, 0x3650, 0x4f75, 0x83,0x34, 0xfa,0x35,0x95,0x98,0xe1,0xc5);

#ifdef __cplusplus
class DECLSPEC_UUID("54e211b6-3650-4f75-8334-fa359598e1c5") DirectManipulationManager;
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(DirectManipulationManager, 0x54e211b6, 0x3650, 0x4f75, 0x83,0x34, 0xfa,0x35,0x95,0x98,0xe1,0xc5)
#endif
#endif

/*****************************************************************************
 * DirectManipulationSharedManager coclass
 */

DEFINE_GUID(CLSID_DirectManipulationSharedManager, 0x99793286, 0x77cc, 0x4b57, 0x96,0xdb, 0x3b,0x35,0x4f,0x6f,0x9f,0xb5);

#ifdef __cplusplus
class DECLSPEC_UUID("99793286-77cc-4b57-96db-3b354f6f9fb5") DirectManipulationSharedManager;
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(DirectManipulationSharedManager, 0x99793286, 0x77cc, 0x4b57, 0x96,0xdb, 0x3b,0x35,0x4f,0x6f,0x9f,0xb5)
#endif
#endif

/*****************************************************************************
 * DCompManipulationCompositor coclass
 */

DEFINE_GUID(CLSID_DCompManipulationCompositor, 0x79dea627, 0xa08a, 0x43ac, 0x8e,0xf5, 0x69,0x00,0xb9,0x29,0x91,0x26);

#ifdef __cplusplus
class DECLSPEC_UUID("79dea627-a08a-43ac-8ef5-6900b9299126") DCompManipulationCompositor;
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(DCompManipulationCompositor, 0x79dea627, 0xa08a, 0x43ac, 0x8e,0xf5, 0x69,0x00,0xb9,0x29,0x91,0x26)
#endif
#endif

/*****************************************************************************
 * DirectManipulationViewport coclass
 */

DEFINE_GUID(CLSID_DirectManipulationViewport, 0x34e211b6, 0x3650, 0x4f75, 0x83,0x34, 0xfa,0x35,0x95,0x98,0xe1,0xc5);

#ifdef __cplusplus
class DECLSPEC_UUID("34e211b6-3650-4f75-8334-fa359598e1c5") DirectManipulationViewport;
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(DirectManipulationViewport, 0x34e211b6, 0x3650, 0x4f75, 0x83,0x34, 0xfa,0x35,0x95,0x98,0xe1,0xc5)
#endif
#endif

#endif /* __DirectManipulation_LIBRARY_DEFINED__ */
/* Begin additional prototypes for all interfaces */


/* End additional prototypes */

#ifdef __cplusplus
}
#endif

#endif /* __directmanipulation_h__ */
