/*** Autogenerated by WIDL 8.21 from include/xpsobjectmodel.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 __xpsobjectmodel_h__
#define __xpsobjectmodel_h__

#ifndef __WIDL_INLINE
#if defined(__cplusplus) || defined(_MSC_VER)
#define __WIDL_INLINE inline
#elif defined(__GNUC__)
#define __WIDL_INLINE __inline__
#endif
#endif

/* Forward declarations */

#ifndef __IXpsOMShareable_FWD_DEFINED__
#define __IXpsOMShareable_FWD_DEFINED__
typedef interface IXpsOMShareable IXpsOMShareable;
#ifdef __cplusplus
interface IXpsOMShareable;
#endif /* __cplusplus */
#endif

#ifndef __IXpsOMPart_FWD_DEFINED__
#define __IXpsOMPart_FWD_DEFINED__
typedef interface IXpsOMPart IXpsOMPart;
#ifdef __cplusplus
interface IXpsOMPart;
#endif /* __cplusplus */
#endif

#ifndef __IXpsOMGlyphsEditor_FWD_DEFINED__
#define __IXpsOMGlyphsEditor_FWD_DEFINED__
typedef interface IXpsOMGlyphsEditor IXpsOMGlyphsEditor;
#ifdef __cplusplus
interface IXpsOMGlyphsEditor;
#endif /* __cplusplus */
#endif

#ifndef __IXpsOMDashCollection_FWD_DEFINED__
#define __IXpsOMDashCollection_FWD_DEFINED__
typedef interface IXpsOMDashCollection IXpsOMDashCollection;
#ifdef __cplusplus
interface IXpsOMDashCollection;
#endif /* __cplusplus */
#endif

#ifndef __IXpsOMGeometryFigure_FWD_DEFINED__
#define __IXpsOMGeometryFigure_FWD_DEFINED__
typedef interface IXpsOMGeometryFigure IXpsOMGeometryFigure;
#ifdef __cplusplus
interface IXpsOMGeometryFigure;
#endif /* __cplusplus */
#endif

#ifndef __IXpsOMGeometryFigureCollection_FWD_DEFINED__
#define __IXpsOMGeometryFigureCollection_FWD_DEFINED__
typedef interface IXpsOMGeometryFigureCollection IXpsOMGeometryFigureCollection;
#ifdef __cplusplus
interface IXpsOMGeometryFigureCollection;
#endif /* __cplusplus */
#endif

#ifndef __IXpsOMGradientStopCollection_FWD_DEFINED__
#define __IXpsOMGradientStopCollection_FWD_DEFINED__
typedef interface IXpsOMGradientStopCollection IXpsOMGradientStopCollection;
#ifdef __cplusplus
interface IXpsOMGradientStopCollection;
#endif /* __cplusplus */
#endif

#ifndef __IXpsOMGradientStop_FWD_DEFINED__
#define __IXpsOMGradientStop_FWD_DEFINED__
typedef interface IXpsOMGradientStop IXpsOMGradientStop;
#ifdef __cplusplus
interface IXpsOMGradientStop;
#endif /* __cplusplus */
#endif

#ifndef __IXpsOMPartResources_FWD_DEFINED__
#define __IXpsOMPartResources_FWD_DEFINED__
typedef interface IXpsOMPartResources IXpsOMPartResources;
#ifdef __cplusplus
interface IXpsOMPartResources;
#endif /* __cplusplus */
#endif

#ifndef __IXpsOMFontResourceCollection_FWD_DEFINED__
#define __IXpsOMFontResourceCollection_FWD_DEFINED__
typedef interface IXpsOMFontResourceCollection IXpsOMFontResourceCollection;
#ifdef __cplusplus
interface IXpsOMFontResourceCollection;
#endif /* __cplusplus */
#endif

#ifndef __IXpsOMImageResourceCollection_FWD_DEFINED__
#define __IXpsOMImageResourceCollection_FWD_DEFINED__
typedef interface IXpsOMImageResourceCollection IXpsOMImageResourceCollection;
#ifdef __cplusplus
interface IXpsOMImageResourceCollection;
#endif /* __cplusplus */
#endif

#ifndef __IXpsOMColorProfileResourceCollection_FWD_DEFINED__
#define __IXpsOMColorProfileResourceCollection_FWD_DEFINED__
typedef interface IXpsOMColorProfileResourceCollection IXpsOMColorProfileResourceCollection;
#ifdef __cplusplus
interface IXpsOMColorProfileResourceCollection;
#endif /* __cplusplus */
#endif

#ifndef __IXpsOMRemoteDictionaryResourceCollection_FWD_DEFINED__
#define __IXpsOMRemoteDictionaryResourceCollection_FWD_DEFINED__
typedef interface IXpsOMRemoteDictionaryResourceCollection IXpsOMRemoteDictionaryResourceCollection;
#ifdef __cplusplus
interface IXpsOMRemoteDictionaryResourceCollection;
#endif /* __cplusplus */
#endif

#ifndef __IXpsOMSignatureBlockResourceCollection_FWD_DEFINED__
#define __IXpsOMSignatureBlockResourceCollection_FWD_DEFINED__
typedef interface IXpsOMSignatureBlockResourceCollection IXpsOMSignatureBlockResourceCollection;
#ifdef __cplusplus
interface IXpsOMSignatureBlockResourceCollection;
#endif /* __cplusplus */
#endif

#ifndef __IXpsOMVisualCollection_FWD_DEFINED__
#define __IXpsOMVisualCollection_FWD_DEFINED__
typedef interface IXpsOMVisualCollection IXpsOMVisualCollection;
#ifdef __cplusplus
interface IXpsOMVisualCollection;
#endif /* __cplusplus */
#endif

#ifndef __IXpsOMDictionary_FWD_DEFINED__
#define __IXpsOMDictionary_FWD_DEFINED__
typedef interface IXpsOMDictionary IXpsOMDictionary;
#ifdef __cplusplus
interface IXpsOMDictionary;
#endif /* __cplusplus */
#endif

#ifndef __IXpsOMPageReference_FWD_DEFINED__
#define __IXpsOMPageReference_FWD_DEFINED__
typedef interface IXpsOMPageReference IXpsOMPageReference;
#ifdef __cplusplus
interface IXpsOMPageReference;
#endif /* __cplusplus */
#endif

#ifndef __IXpsOMPageReferenceCollection_FWD_DEFINED__
#define __IXpsOMPageReferenceCollection_FWD_DEFINED__
typedef interface IXpsOMPageReferenceCollection IXpsOMPageReferenceCollection;
#ifdef __cplusplus
interface IXpsOMPageReferenceCollection;
#endif /* __cplusplus */
#endif

#ifndef __IXpsOMDocumentCollection_FWD_DEFINED__
#define __IXpsOMDocumentCollection_FWD_DEFINED__
typedef interface IXpsOMDocumentCollection IXpsOMDocumentCollection;
#ifdef __cplusplus
interface IXpsOMDocumentCollection;
#endif /* __cplusplus */
#endif

#ifndef __IXpsOMPackage_FWD_DEFINED__
#define __IXpsOMPackage_FWD_DEFINED__
typedef interface IXpsOMPackage IXpsOMPackage;
#ifdef __cplusplus
interface IXpsOMPackage;
#endif /* __cplusplus */
#endif

#ifndef __IXpsOMObjectFactory_FWD_DEFINED__
#define __IXpsOMObjectFactory_FWD_DEFINED__
typedef interface IXpsOMObjectFactory IXpsOMObjectFactory;
#ifdef __cplusplus
interface IXpsOMObjectFactory;
#endif /* __cplusplus */
#endif

#ifndef __IXpsOMNameCollection_FWD_DEFINED__
#define __IXpsOMNameCollection_FWD_DEFINED__
typedef interface IXpsOMNameCollection IXpsOMNameCollection;
#ifdef __cplusplus
interface IXpsOMNameCollection;
#endif /* __cplusplus */
#endif

#ifndef __IXpsOMPartUriCollection_FWD_DEFINED__
#define __IXpsOMPartUriCollection_FWD_DEFINED__
typedef interface IXpsOMPartUriCollection IXpsOMPartUriCollection;
#ifdef __cplusplus
interface IXpsOMPartUriCollection;
#endif /* __cplusplus */
#endif

#ifndef __IXpsOMPackageWriter_FWD_DEFINED__
#define __IXpsOMPackageWriter_FWD_DEFINED__
typedef interface IXpsOMPackageWriter IXpsOMPackageWriter;
#ifdef __cplusplus
interface IXpsOMPackageWriter;
#endif /* __cplusplus */
#endif

#ifndef __IXpsOMPackageTarget_FWD_DEFINED__
#define __IXpsOMPackageTarget_FWD_DEFINED__
typedef interface IXpsOMPackageTarget IXpsOMPackageTarget;
#ifdef __cplusplus
interface IXpsOMPackageTarget;
#endif /* __cplusplus */
#endif

#ifndef __IXpsOMVisual_FWD_DEFINED__
#define __IXpsOMVisual_FWD_DEFINED__
typedef interface IXpsOMVisual IXpsOMVisual;
#ifdef __cplusplus
interface IXpsOMVisual;
#endif /* __cplusplus */
#endif

#ifndef __IXpsOMBrush_FWD_DEFINED__
#define __IXpsOMBrush_FWD_DEFINED__
typedef interface IXpsOMBrush IXpsOMBrush;
#ifdef __cplusplus
interface IXpsOMBrush;
#endif /* __cplusplus */
#endif

#ifndef __IXpsOMMatrixTransform_FWD_DEFINED__
#define __IXpsOMMatrixTransform_FWD_DEFINED__
typedef interface IXpsOMMatrixTransform IXpsOMMatrixTransform;
#ifdef __cplusplus
interface IXpsOMMatrixTransform;
#endif /* __cplusplus */
#endif

#ifndef __IXpsOMGeometry_FWD_DEFINED__
#define __IXpsOMGeometry_FWD_DEFINED__
typedef interface IXpsOMGeometry IXpsOMGeometry;
#ifdef __cplusplus
interface IXpsOMGeometry;
#endif /* __cplusplus */
#endif

#ifndef __IXpsOMGlyphs_FWD_DEFINED__
#define __IXpsOMGlyphs_FWD_DEFINED__
typedef interface IXpsOMGlyphs IXpsOMGlyphs;
#ifdef __cplusplus
interface IXpsOMGlyphs;
#endif /* __cplusplus */
#endif

#ifndef __IXpsOMPath_FWD_DEFINED__
#define __IXpsOMPath_FWD_DEFINED__
typedef interface IXpsOMPath IXpsOMPath;
#ifdef __cplusplus
interface IXpsOMPath;
#endif /* __cplusplus */
#endif

#ifndef __IXpsOMSolidColorBrush_FWD_DEFINED__
#define __IXpsOMSolidColorBrush_FWD_DEFINED__
typedef interface IXpsOMSolidColorBrush IXpsOMSolidColorBrush;
#ifdef __cplusplus
interface IXpsOMSolidColorBrush;
#endif /* __cplusplus */
#endif

#ifndef __IXpsOMTileBrush_FWD_DEFINED__
#define __IXpsOMTileBrush_FWD_DEFINED__
typedef interface IXpsOMTileBrush IXpsOMTileBrush;
#ifdef __cplusplus
interface IXpsOMTileBrush;
#endif /* __cplusplus */
#endif

#ifndef __IXpsOMGradientBrush_FWD_DEFINED__
#define __IXpsOMGradientBrush_FWD_DEFINED__
typedef interface IXpsOMGradientBrush IXpsOMGradientBrush;
#ifdef __cplusplus
interface IXpsOMGradientBrush;
#endif /* __cplusplus */
#endif

#ifndef __IXpsOMVisualBrush_FWD_DEFINED__
#define __IXpsOMVisualBrush_FWD_DEFINED__
typedef interface IXpsOMVisualBrush IXpsOMVisualBrush;
#ifdef __cplusplus
interface IXpsOMVisualBrush;
#endif /* __cplusplus */
#endif

#ifndef __IXpsOMImageBrush_FWD_DEFINED__
#define __IXpsOMImageBrush_FWD_DEFINED__
typedef interface IXpsOMImageBrush IXpsOMImageBrush;
#ifdef __cplusplus
interface IXpsOMImageBrush;
#endif /* __cplusplus */
#endif

#ifndef __IXpsOMLinearGradientBrush_FWD_DEFINED__
#define __IXpsOMLinearGradientBrush_FWD_DEFINED__
typedef interface IXpsOMLinearGradientBrush IXpsOMLinearGradientBrush;
#ifdef __cplusplus
interface IXpsOMLinearGradientBrush;
#endif /* __cplusplus */
#endif

#ifndef __IXpsOMRadialGradientBrush_FWD_DEFINED__
#define __IXpsOMRadialGradientBrush_FWD_DEFINED__
typedef interface IXpsOMRadialGradientBrush IXpsOMRadialGradientBrush;
#ifdef __cplusplus
interface IXpsOMRadialGradientBrush;
#endif /* __cplusplus */
#endif

#ifndef __IXpsOMResource_FWD_DEFINED__
#define __IXpsOMResource_FWD_DEFINED__
typedef interface IXpsOMResource IXpsOMResource;
#ifdef __cplusplus
interface IXpsOMResource;
#endif /* __cplusplus */
#endif

#ifndef __IXpsOMFontResource_FWD_DEFINED__
#define __IXpsOMFontResource_FWD_DEFINED__
typedef interface IXpsOMFontResource IXpsOMFontResource;
#ifdef __cplusplus
interface IXpsOMFontResource;
#endif /* __cplusplus */
#endif

#ifndef __IXpsOMImageResource_FWD_DEFINED__
#define __IXpsOMImageResource_FWD_DEFINED__
typedef interface IXpsOMImageResource IXpsOMImageResource;
#ifdef __cplusplus
interface IXpsOMImageResource;
#endif /* __cplusplus */
#endif

#ifndef __IXpsOMColorProfileResource_FWD_DEFINED__
#define __IXpsOMColorProfileResource_FWD_DEFINED__
typedef interface IXpsOMColorProfileResource IXpsOMColorProfileResource;
#ifdef __cplusplus
interface IXpsOMColorProfileResource;
#endif /* __cplusplus */
#endif

#ifndef __IXpsOMPrintTicketResource_FWD_DEFINED__
#define __IXpsOMPrintTicketResource_FWD_DEFINED__
typedef interface IXpsOMPrintTicketResource IXpsOMPrintTicketResource;
#ifdef __cplusplus
interface IXpsOMPrintTicketResource;
#endif /* __cplusplus */
#endif

#ifndef __IXpsOMRemoteDictionaryResource_FWD_DEFINED__
#define __IXpsOMRemoteDictionaryResource_FWD_DEFINED__
typedef interface IXpsOMRemoteDictionaryResource IXpsOMRemoteDictionaryResource;
#ifdef __cplusplus
interface IXpsOMRemoteDictionaryResource;
#endif /* __cplusplus */
#endif

#ifndef __IXpsOMDocumentStructureResource_FWD_DEFINED__
#define __IXpsOMDocumentStructureResource_FWD_DEFINED__
typedef interface IXpsOMDocumentStructureResource IXpsOMDocumentStructureResource;
#ifdef __cplusplus
interface IXpsOMDocumentStructureResource;
#endif /* __cplusplus */
#endif

#ifndef __IXpsOMStoryFragmentsResource_FWD_DEFINED__
#define __IXpsOMStoryFragmentsResource_FWD_DEFINED__
typedef interface IXpsOMStoryFragmentsResource IXpsOMStoryFragmentsResource;
#ifdef __cplusplus
interface IXpsOMStoryFragmentsResource;
#endif /* __cplusplus */
#endif

#ifndef __IXpsOMSignatureBlockResource_FWD_DEFINED__
#define __IXpsOMSignatureBlockResource_FWD_DEFINED__
typedef interface IXpsOMSignatureBlockResource IXpsOMSignatureBlockResource;
#ifdef __cplusplus
interface IXpsOMSignatureBlockResource;
#endif /* __cplusplus */
#endif

#ifndef __IXpsOMCanvas_FWD_DEFINED__
#define __IXpsOMCanvas_FWD_DEFINED__
typedef interface IXpsOMCanvas IXpsOMCanvas;
#ifdef __cplusplus
interface IXpsOMCanvas;
#endif /* __cplusplus */
#endif

#ifndef __IXpsOMPage_FWD_DEFINED__
#define __IXpsOMPage_FWD_DEFINED__
typedef interface IXpsOMPage IXpsOMPage;
#ifdef __cplusplus
interface IXpsOMPage;
#endif /* __cplusplus */
#endif

#ifndef __IXpsOMDocument_FWD_DEFINED__
#define __IXpsOMDocument_FWD_DEFINED__
typedef interface IXpsOMDocument IXpsOMDocument;
#ifdef __cplusplus
interface IXpsOMDocument;
#endif /* __cplusplus */
#endif

#ifndef __IXpsOMDocumentSequence_FWD_DEFINED__
#define __IXpsOMDocumentSequence_FWD_DEFINED__
typedef interface IXpsOMDocumentSequence IXpsOMDocumentSequence;
#ifdef __cplusplus
interface IXpsOMDocumentSequence;
#endif /* __cplusplus */
#endif

#ifndef __IXpsOMCoreProperties_FWD_DEFINED__
#define __IXpsOMCoreProperties_FWD_DEFINED__
typedef interface IXpsOMCoreProperties IXpsOMCoreProperties;
#ifdef __cplusplus
interface IXpsOMCoreProperties;
#endif /* __cplusplus */
#endif

#ifndef __IXpsOMThumbnailGenerator_FWD_DEFINED__
#define __IXpsOMThumbnailGenerator_FWD_DEFINED__
typedef interface IXpsOMThumbnailGenerator IXpsOMThumbnailGenerator;
#ifdef __cplusplus
interface IXpsOMThumbnailGenerator;
#endif /* __cplusplus */
#endif

#ifndef __XpsOMObjectFactory_FWD_DEFINED__
#define __XpsOMObjectFactory_FWD_DEFINED__
#ifdef __cplusplus
typedef class XpsOMObjectFactory XpsOMObjectFactory;
#else
typedef struct XpsOMObjectFactory XpsOMObjectFactory;
#endif /* defined __cplusplus */
#endif /* defined __XpsOMObjectFactory_FWD_DEFINED__ */

#ifndef __XpsOMThumbnailGenerator_FWD_DEFINED__
#define __XpsOMThumbnailGenerator_FWD_DEFINED__
#ifdef __cplusplus
typedef class XpsOMThumbnailGenerator XpsOMThumbnailGenerator;
#else
typedef struct XpsOMThumbnailGenerator XpsOMThumbnailGenerator;
#endif /* defined __cplusplus */
#endif /* defined __XpsOMThumbnailGenerator_FWD_DEFINED__ */

/* Headers for imported files */

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

#ifdef __cplusplus
extern "C" {
#endif

#include <winapifamily.h>

#if NTDDI_VERSION >= 0x06010000
#if WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_DESKTOP)
#endif
#if WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_APP)
#define XPS_E_INVALID_LANGUAGE MAKE_HRESULT(1, FACILITY_XPS, 0x0)
#define XPS_E_INVALID_NAME MAKE_HRESULT(1, FACILITY_XPS, 0x1)
#define XPS_E_INVALID_RESOURCE_KEY MAKE_HRESULT(1, FACILITY_XPS, 0x2)
#define XPS_E_INVALID_PAGE_SIZE MAKE_HRESULT(1, FACILITY_XPS, 0x3)
#define XPS_E_INVALID_BLEED_BOX MAKE_HRESULT(1, FACILITY_XPS, 0x4)
#define XPS_E_INVALID_THUMBNAIL_IMAGE_TYPE MAKE_HRESULT(1, FACILITY_XPS, 0x5)
#define XPS_E_INVALID_LOOKUP_TYPE MAKE_HRESULT(1, FACILITY_XPS, 0x6)
#define XPS_E_INVALID_FLOAT MAKE_HRESULT(1, FACILITY_XPS, 0x7)
#define XPS_E_UNEXPECTED_CONTENT_TYPE MAKE_HRESULT(1, FACILITY_XPS, 0x8)
#define XPS_E_INVALID_FONT_URI MAKE_HRESULT(1, FACILITY_XPS, 0xa)
#define XPS_E_INVALID_CONTENT_BOX MAKE_HRESULT(1, FACILITY_XPS, 0xb)
#define XPS_E_INVALID_MARKUP MAKE_HRESULT(1, FACILITY_XPS, 0xc)
#define XPS_E_INVALID_XML_ENCODING MAKE_HRESULT(1, FACILITY_XPS, 0xd)
#define XPS_E_INVALID_CONTENT_TYPE MAKE_HRESULT(1, FACILITY_XPS, 0xe)
#define XPS_E_INVALID_OBFUSCATED_FONT_URI MAKE_HRESULT(1, FACILITY_XPS, 0xf)
#define XPS_E_UNEXPECTED_RELATIONSHIP_TYPE MAKE_HRESULT(1, FACILITY_XPS, 0x10)
#define XPS_E_UNEXPECTED_RESTRICTED_FONT_RELATIONSHIP MAKE_HRESULT(1, FACILITY_XPS, 0x11)
#define XPS_E_MISSING_NAME MAKE_HRESULT(1, FACILITY_XPS, 0x100)
#define XPS_E_MISSING_LOOKUP MAKE_HRESULT(1, FACILITY_XPS, 0x101)
#define XPS_E_MISSING_GLYPHS MAKE_HRESULT(1, FACILITY_XPS, 0x102)
#define XPS_E_MISSING_SEGMENT_DATA MAKE_HRESULT(1, FACILITY_XPS, 0x103)
#define XPS_E_MISSING_COLORPROFILE MAKE_HRESULT(1, FACILITY_XPS, 0x104)
#define XPS_E_MISSING_RELATIONSHIP_TARGET MAKE_HRESULT(1, FACILITY_XPS, 0x105)
#define XPS_E_MISSING_RESOURCE_RELATIONSHIP MAKE_HRESULT(1, FACILITY_XPS, 0x106)
#define XPS_E_MISSING_FONTURI MAKE_HRESULT(1, FACILITY_XPS, 0x107)
#define XPS_E_MISSING_DOCUMENTSEQUENCE_RELATIONSHIP MAKE_HRESULT(1, FACILITY_XPS, 0x108)
#define XPS_E_MISSING_DOCUMENT MAKE_HRESULT(1, FACILITY_XPS, 0x109)
#define XPS_E_MISSING_REFERRED_DOCUMENT MAKE_HRESULT(1, FACILITY_XPS, 0x10a)
#define XPS_E_MISSING_REFERRED_PAGE MAKE_HRESULT(1, FACILITY_XPS, 0x10b)
#define XPS_E_MISSING_PAGE_IN_DOCUMENT MAKE_HRESULT(1, FACILITY_XPS, 0x10c)
#define XPS_E_MISSING_PAGE_IN_PAGEREFERENCE MAKE_HRESULT(1, FACILITY_XPS, 0x10d)
#define XPS_E_MISSING_IMAGE_IN_IMAGEBRUSH MAKE_HRESULT(1, FACILITY_XPS, 0x10e)
#define XPS_E_MISSING_RESOURCE_KEY MAKE_HRESULT(1, FACILITY_XPS, 0x10f)
#define XPS_E_MISSING_PART_REFERENCE MAKE_HRESULT(1, FACILITY_XPS, 0x110)
#define XPS_E_MISSING_RESTRICTED_FONT_RELATIONSHIP MAKE_HRESULT(1, FACILITY_XPS, 0x111)
#define XPS_E_MISSING_DISCARDCONTROL MAKE_HRESULT(1, FACILITY_XPS, 0x112)
#define XPS_E_MISSING_PART_STREAM MAKE_HRESULT(1, FACILITY_XPS, 0x113)
#define XPS_E_UNAVAILABLE_PACKAGE MAKE_HRESULT(1, FACILITY_XPS, 0x114)
#define XPS_E_DUPLICATE_RESOURCE_KEYS MAKE_HRESULT(1, FACILITY_XPS, 0x200)
#define XPS_E_MULTIPLE_RESOURCES MAKE_HRESULT(1, FACILITY_XPS, 0x201)
#define XPS_E_MULTIPLE_DOCUMENTSEQUENCE_RELATIONSHIPS MAKE_HRESULT(1, FACILITY_XPS, 0x202)
#define XPS_E_MULTIPLE_THUMBNAILS_ON_PAGE MAKE_HRESULT(1, FACILITY_XPS, 0x203)
#define XPS_E_MULTIPLE_THUMBNAILS_ON_PACKAGE MAKE_HRESULT(1, FACILITY_XPS, 0x204)
#define XPS_E_MULTIPLE_PRINTTICKETS_ON_PAGE MAKE_HRESULT(1, FACILITY_XPS, 0x205)
#define XPS_E_MULTIPLE_PRINTTICKETS_ON_DOCUMENT MAKE_HRESULT(1, FACILITY_XPS, 0x206)
#define XPS_E_MULTIPLE_PRINTTICKETS_ON_DOCUMENTSEQUENCE MAKE_HRESULT(1, FACILITY_XPS, 0x207)
#define XPS_E_MULTIPLE_REFERENCES_TO_PART MAKE_HRESULT(1, FACILITY_XPS, 0x208)
#define XPS_E_DUPLICATE_NAMES MAKE_HRESULT(1, FACILITY_XPS, 0x209)
#define XPS_E_STRING_TOO_LONG MAKE_HRESULT(1, FACILITY_XPS, 0x300)
#define XPS_E_TOO_MANY_INDICES MAKE_HRESULT(1, FACILITY_XPS, 0x301)
#define XPS_E_MAPPING_OUT_OF_ORDER MAKE_HRESULT(1, FACILITY_XPS, 0x302)
#define XPS_E_MAPPING_OUTSIDE_STRING MAKE_HRESULT(1, FACILITY_XPS, 0x303)
#define XPS_E_MAPPING_OUTSIDE_INDICES MAKE_HRESULT(1, FACILITY_XPS, 0x304)
#define XPS_E_CARET_OUTSIDE_STRING MAKE_HRESULT(1, FACILITY_XPS, 0x305)
#define XPS_E_CARET_OUT_OF_ORDER MAKE_HRESULT(1, FACILITY_XPS, 0x306)
#define XPS_E_ODD_BIDILEVEL MAKE_HRESULT(1, FACILITY_XPS, 0x307)
#define XPS_E_ONE_TO_ONE_MAPPING_EXPECTED MAKE_HRESULT(1, FACILITY_XPS, 0x308)
#define XPS_E_RESTRICTED_FONT_NOT_OBFUSCATED MAKE_HRESULT(1, FACILITY_XPS, 0x309)
#define XPS_E_NEGATIVE_FLOAT MAKE_HRESULT(1, FACILITY_XPS, 0x30a)
#define XPS_E_XKEY_ATTR_PRESENT_OUTSIDE_RES_DICT MAKE_HRESULT(1, FACILITY_XPS, 0x400)
#define XPS_E_DICTIONARY_ITEM_NAMED MAKE_HRESULT(1, FACILITY_XPS, 0x401)
#define XPS_E_NESTED_REMOTE_DICTIONARY MAKE_HRESULT(1, FACILITY_XPS, 0x402)
#define XPS_E_INDEX_OUT_OF_RANGE MAKE_HRESULT(1, FACILITY_XPS, 0x500)
#define XPS_E_VISUAL_CIRCULAR_REF MAKE_HRESULT(1, FACILITY_XPS, 0x501)
#define XPS_E_NO_CUSTOM_OBJECTS MAKE_HRESULT(1, FACILITY_XPS, 0x502)
#define XPS_E_ALREADY_OWNED MAKE_HRESULT(1, FACILITY_XPS, 0x503)
#define XPS_E_RESOURCE_NOT_OWNED MAKE_HRESULT(1, FACILITY_XPS, 0x504)
#define XPS_E_UNEXPECTED_COLORPROFILE MAKE_HRESULT(1, FACILITY_XPS, 0x505)
#define XPS_E_COLOR_COMPONENT_OUT_OF_RANGE MAKE_HRESULT(1, FACILITY_XPS, 0x506)
#define XPS_E_BOTH_PATHFIGURE_AND_ABBR_SYNTAX_PRESENT MAKE_HRESULT(1, FACILITY_XPS, 0x507)
#define XPS_E_BOTH_RESOURCE_AND_SOURCEATTR_PRESENT MAKE_HRESULT(1, FACILITY_XPS, 0x508)
#define XPS_E_BLEED_BOX_PAGE_DIMENSIONS_NOT_IN_SYNC MAKE_HRESULT(1, FACILITY_XPS, 0x509)
#define XPS_E_RELATIONSHIP_EXTERNAL MAKE_HRESULT(1, FACILITY_XPS, 0x50a)
#define XPS_E_NOT_ENOUGH_GRADIENT_STOPS MAKE_HRESULT(1, FACILITY_XPS, 0x50b)
#define XPS_E_PACKAGE_WRITER_NOT_CLOSED MAKE_HRESULT(1, FACILITY_XPS, 0x50c)
#ifndef __IXpsOMDocumentStructureResource_FWD_DEFINED__
#define __IXpsOMDocumentStructureResource_FWD_DEFINED__
typedef interface IXpsOMDocumentStructureResource IXpsOMDocumentStructureResource;
#ifdef __cplusplus
interface IXpsOMDocumentStructureResource;
#endif /* __cplusplus */
#endif

#ifndef __IXpsOMCoreProperties_FWD_DEFINED__
#define __IXpsOMCoreProperties_FWD_DEFINED__
typedef interface IXpsOMCoreProperties IXpsOMCoreProperties;
#ifdef __cplusplus
interface IXpsOMCoreProperties;
#endif /* __cplusplus */
#endif

#ifndef __IXpsOMPrintTicketResource_FWD_DEFINED__
#define __IXpsOMPrintTicketResource_FWD_DEFINED__
typedef interface IXpsOMPrintTicketResource IXpsOMPrintTicketResource;
#ifdef __cplusplus
interface IXpsOMPrintTicketResource;
#endif /* __cplusplus */
#endif

#ifndef __IXpsOMStoryFragmentsResource_FWD_DEFINED__
#define __IXpsOMStoryFragmentsResource_FWD_DEFINED__
typedef interface IXpsOMStoryFragmentsResource IXpsOMStoryFragmentsResource;
#ifdef __cplusplus
interface IXpsOMStoryFragmentsResource;
#endif /* __cplusplus */
#endif

#ifndef __IXpsOMPackage_FWD_DEFINED__
#define __IXpsOMPackage_FWD_DEFINED__
typedef interface IXpsOMPackage IXpsOMPackage;
#ifdef __cplusplus
interface IXpsOMPackage;
#endif /* __cplusplus */
#endif

#ifndef __IXpsOMPart_FWD_DEFINED__
#define __IXpsOMPart_FWD_DEFINED__
typedef interface IXpsOMPart IXpsOMPart;
#ifdef __cplusplus
interface IXpsOMPart;
#endif /* __cplusplus */
#endif

#ifndef __IXpsOMShareable_FWD_DEFINED__
#define __IXpsOMShareable_FWD_DEFINED__
typedef interface IXpsOMShareable IXpsOMShareable;
#ifdef __cplusplus
interface IXpsOMShareable;
#endif /* __cplusplus */
#endif

#ifndef __IXpsOMVisual_FWD_DEFINED__
#define __IXpsOMVisual_FWD_DEFINED__
typedef interface IXpsOMVisual IXpsOMVisual;
#ifdef __cplusplus
interface IXpsOMVisual;
#endif /* __cplusplus */
#endif

#ifndef __IXpsOMBrush_FWD_DEFINED__
#define __IXpsOMBrush_FWD_DEFINED__
typedef interface IXpsOMBrush IXpsOMBrush;
#ifdef __cplusplus
interface IXpsOMBrush;
#endif /* __cplusplus */
#endif

#ifndef __IXpsOMTileBrush_FWD_DEFINED__
#define __IXpsOMTileBrush_FWD_DEFINED__
typedef interface IXpsOMTileBrush IXpsOMTileBrush;
#ifdef __cplusplus
interface IXpsOMTileBrush;
#endif /* __cplusplus */
#endif

#ifndef __IXpsOMResource_FWD_DEFINED__
#define __IXpsOMResource_FWD_DEFINED__
typedef interface IXpsOMResource IXpsOMResource;
#ifdef __cplusplus
interface IXpsOMResource;
#endif /* __cplusplus */
#endif

#ifndef __IXpsOMCanvas_FWD_DEFINED__
#define __IXpsOMCanvas_FWD_DEFINED__
typedef interface IXpsOMCanvas IXpsOMCanvas;
#ifdef __cplusplus
interface IXpsOMCanvas;
#endif /* __cplusplus */
#endif

#ifndef __IXpsOMColorProfileResource_FWD_DEFINED__
#define __IXpsOMColorProfileResource_FWD_DEFINED__
typedef interface IXpsOMColorProfileResource IXpsOMColorProfileResource;
#ifdef __cplusplus
interface IXpsOMColorProfileResource;
#endif /* __cplusplus */
#endif

#ifndef __IXpsOMColorProfileResourceCollection_FWD_DEFINED__
#define __IXpsOMColorProfileResourceCollection_FWD_DEFINED__
typedef interface IXpsOMColorProfileResourceCollection IXpsOMColorProfileResourceCollection;
#ifdef __cplusplus
interface IXpsOMColorProfileResourceCollection;
#endif /* __cplusplus */
#endif

#ifndef __IXpsOMDashCollection_FWD_DEFINED__
#define __IXpsOMDashCollection_FWD_DEFINED__
typedef interface IXpsOMDashCollection IXpsOMDashCollection;
#ifdef __cplusplus
interface IXpsOMDashCollection;
#endif /* __cplusplus */
#endif

#ifndef __IXpsOMFontResource_FWD_DEFINED__
#define __IXpsOMFontResource_FWD_DEFINED__
typedef interface IXpsOMFontResource IXpsOMFontResource;
#ifdef __cplusplus
interface IXpsOMFontResource;
#endif /* __cplusplus */
#endif

#ifndef __IXpsOMFontResourceCollection_FWD_DEFINED__
#define __IXpsOMFontResourceCollection_FWD_DEFINED__
typedef interface IXpsOMFontResourceCollection IXpsOMFontResourceCollection;
#ifdef __cplusplus
interface IXpsOMFontResourceCollection;
#endif /* __cplusplus */
#endif

#ifndef __IXpsOMGeometry_FWD_DEFINED__
#define __IXpsOMGeometry_FWD_DEFINED__
typedef interface IXpsOMGeometry IXpsOMGeometry;
#ifdef __cplusplus
interface IXpsOMGeometry;
#endif /* __cplusplus */
#endif

#ifndef __IXpsOMGeometryFigure_FWD_DEFINED__
#define __IXpsOMGeometryFigure_FWD_DEFINED__
typedef interface IXpsOMGeometryFigure IXpsOMGeometryFigure;
#ifdef __cplusplus
interface IXpsOMGeometryFigure;
#endif /* __cplusplus */
#endif

#ifndef __IXpsOMGeometryFigureCollection_FWD_DEFINED__
#define __IXpsOMGeometryFigureCollection_FWD_DEFINED__
typedef interface IXpsOMGeometryFigureCollection IXpsOMGeometryFigureCollection;
#ifdef __cplusplus
interface IXpsOMGeometryFigureCollection;
#endif /* __cplusplus */
#endif

#ifndef __IXpsOMGlyphs_FWD_DEFINED__
#define __IXpsOMGlyphs_FWD_DEFINED__
typedef interface IXpsOMGlyphs IXpsOMGlyphs;
#ifdef __cplusplus
interface IXpsOMGlyphs;
#endif /* __cplusplus */
#endif

#ifndef __IXpsOMGradientBrush_FWD_DEFINED__
#define __IXpsOMGradientBrush_FWD_DEFINED__
typedef interface IXpsOMGradientBrush IXpsOMGradientBrush;
#ifdef __cplusplus
interface IXpsOMGradientBrush;
#endif /* __cplusplus */
#endif

#ifndef __IXpsOMGradientStop_FWD_DEFINED__
#define __IXpsOMGradientStop_FWD_DEFINED__
typedef interface IXpsOMGradientStop IXpsOMGradientStop;
#ifdef __cplusplus
interface IXpsOMGradientStop;
#endif /* __cplusplus */
#endif

#ifndef __IXpsOMGradientStopCollection_FWD_DEFINED__
#define __IXpsOMGradientStopCollection_FWD_DEFINED__
typedef interface IXpsOMGradientStopCollection IXpsOMGradientStopCollection;
#ifdef __cplusplus
interface IXpsOMGradientStopCollection;
#endif /* __cplusplus */
#endif

#ifndef __IXpsOMImageBrush_FWD_DEFINED__
#define __IXpsOMImageBrush_FWD_DEFINED__
typedef interface IXpsOMImageBrush IXpsOMImageBrush;
#ifdef __cplusplus
interface IXpsOMImageBrush;
#endif /* __cplusplus */
#endif

#ifndef __IXpsOMImageResource_FWD_DEFINED__
#define __IXpsOMImageResource_FWD_DEFINED__
typedef interface IXpsOMImageResource IXpsOMImageResource;
#ifdef __cplusplus
interface IXpsOMImageResource;
#endif /* __cplusplus */
#endif

#ifndef __IXpsOMImageResourceCollection_FWD_DEFINED__
#define __IXpsOMImageResourceCollection_FWD_DEFINED__
typedef interface IXpsOMImageResourceCollection IXpsOMImageResourceCollection;
#ifdef __cplusplus
interface IXpsOMImageResourceCollection;
#endif /* __cplusplus */
#endif

#ifndef __IXpsOMLinearGradientBrush_FWD_DEFINED__
#define __IXpsOMLinearGradientBrush_FWD_DEFINED__
typedef interface IXpsOMLinearGradientBrush IXpsOMLinearGradientBrush;
#ifdef __cplusplus
interface IXpsOMLinearGradientBrush;
#endif /* __cplusplus */
#endif

#ifndef __IXpsOMMatrixTransform_FWD_DEFINED__
#define __IXpsOMMatrixTransform_FWD_DEFINED__
typedef interface IXpsOMMatrixTransform IXpsOMMatrixTransform;
#ifdef __cplusplus
interface IXpsOMMatrixTransform;
#endif /* __cplusplus */
#endif

#ifndef __IXpsOMPartResources_FWD_DEFINED__
#define __IXpsOMPartResources_FWD_DEFINED__
typedef interface IXpsOMPartResources IXpsOMPartResources;
#ifdef __cplusplus
interface IXpsOMPartResources;
#endif /* __cplusplus */
#endif

#ifndef __IXpsOMPath_FWD_DEFINED__
#define __IXpsOMPath_FWD_DEFINED__
typedef interface IXpsOMPath IXpsOMPath;
#ifdef __cplusplus
interface IXpsOMPath;
#endif /* __cplusplus */
#endif

#ifndef __IXpsOMPartUriCollection_FWD_DEFINED__
#define __IXpsOMPartUriCollection_FWD_DEFINED__
typedef interface IXpsOMPartUriCollection IXpsOMPartUriCollection;
#ifdef __cplusplus
interface IXpsOMPartUriCollection;
#endif /* __cplusplus */
#endif

#ifndef __IXpsOMRadialGradientBrush_FWD_DEFINED__
#define __IXpsOMRadialGradientBrush_FWD_DEFINED__
typedef interface IXpsOMRadialGradientBrush IXpsOMRadialGradientBrush;
#ifdef __cplusplus
interface IXpsOMRadialGradientBrush;
#endif /* __cplusplus */
#endif

#ifndef __IXpsOMRemoteDictionaryResource_FWD_DEFINED__
#define __IXpsOMRemoteDictionaryResource_FWD_DEFINED__
typedef interface IXpsOMRemoteDictionaryResource IXpsOMRemoteDictionaryResource;
#ifdef __cplusplus
interface IXpsOMRemoteDictionaryResource;
#endif /* __cplusplus */
#endif

#ifndef __IXpsOMRemoteDictionaryResourceCollection_FWD_DEFINED__
#define __IXpsOMRemoteDictionaryResourceCollection_FWD_DEFINED__
typedef interface IXpsOMRemoteDictionaryResourceCollection IXpsOMRemoteDictionaryResourceCollection;
#ifdef __cplusplus
interface IXpsOMRemoteDictionaryResourceCollection;
#endif /* __cplusplus */
#endif

#ifndef __IXpsOMDictionary_FWD_DEFINED__
#define __IXpsOMDictionary_FWD_DEFINED__
typedef interface IXpsOMDictionary IXpsOMDictionary;
#ifdef __cplusplus
interface IXpsOMDictionary;
#endif /* __cplusplus */
#endif

#ifndef __IXpsOMShareable_FWD_DEFINED__
#define __IXpsOMShareable_FWD_DEFINED__
typedef interface IXpsOMShareable IXpsOMShareable;
#ifdef __cplusplus
interface IXpsOMShareable;
#endif /* __cplusplus */
#endif

#ifndef __IXpsOMSolidColorBrush_FWD_DEFINED__
#define __IXpsOMSolidColorBrush_FWD_DEFINED__
typedef interface IXpsOMSolidColorBrush IXpsOMSolidColorBrush;
#ifdef __cplusplus
interface IXpsOMSolidColorBrush;
#endif /* __cplusplus */
#endif

#ifndef __IXpsOMTileBrush_FWD_DEFINED__
#define __IXpsOMTileBrush_FWD_DEFINED__
typedef interface IXpsOMTileBrush IXpsOMTileBrush;
#ifdef __cplusplus
interface IXpsOMTileBrush;
#endif /* __cplusplus */
#endif

#ifndef __IXpsOMVisualBrush_FWD_DEFINED__
#define __IXpsOMVisualBrush_FWD_DEFINED__
typedef interface IXpsOMVisualBrush IXpsOMVisualBrush;
#ifdef __cplusplus
interface IXpsOMVisualBrush;
#endif /* __cplusplus */
#endif

#ifndef __IXpsOMVisualCollection_FWD_DEFINED__
#define __IXpsOMVisualCollection_FWD_DEFINED__
typedef interface IXpsOMVisualCollection IXpsOMVisualCollection;
#ifdef __cplusplus
interface IXpsOMVisualCollection;
#endif /* __cplusplus */
#endif

#ifndef __IXpsOMPageReference_FWD_DEFINED__
#define __IXpsOMPageReference_FWD_DEFINED__
typedef interface IXpsOMPageReference IXpsOMPageReference;
#ifdef __cplusplus
interface IXpsOMPageReference;
#endif /* __cplusplus */
#endif

#ifndef __IXpsOMDocumentSequence_FWD_DEFINED__
#define __IXpsOMDocumentSequence_FWD_DEFINED__
typedef interface IXpsOMDocumentSequence IXpsOMDocumentSequence;
#ifdef __cplusplus
interface IXpsOMDocumentSequence;
#endif /* __cplusplus */
#endif

#ifndef __IXpsOMSignatureBlockResource_FWD_DEFINED__
#define __IXpsOMSignatureBlockResource_FWD_DEFINED__
typedef interface IXpsOMSignatureBlockResource IXpsOMSignatureBlockResource;
#ifdef __cplusplus
interface IXpsOMSignatureBlockResource;
#endif /* __cplusplus */
#endif

#ifndef __IXpsOMSignatureBlockResourceCollection_FWD_DEFINED__
#define __IXpsOMSignatureBlockResourceCollection_FWD_DEFINED__
typedef interface IXpsOMSignatureBlockResourceCollection IXpsOMSignatureBlockResourceCollection;
#ifdef __cplusplus
interface IXpsOMSignatureBlockResourceCollection;
#endif /* __cplusplus */
#endif

#ifndef __IXpsOMNameCollection_FWD_DEFINED__
#define __IXpsOMNameCollection_FWD_DEFINED__
typedef interface IXpsOMNameCollection IXpsOMNameCollection;
#ifdef __cplusplus
interface IXpsOMNameCollection;
#endif /* __cplusplus */
#endif

#ifndef __IXpsOMDocument_FWD_DEFINED__
#define __IXpsOMDocument_FWD_DEFINED__
typedef interface IXpsOMDocument IXpsOMDocument;
#ifdef __cplusplus
interface IXpsOMDocument;
#endif /* __cplusplus */
#endif

#ifndef __IXpsOMPage_FWD_DEFINED__
#define __IXpsOMPage_FWD_DEFINED__
typedef interface IXpsOMPage IXpsOMPage;
#ifdef __cplusplus
interface IXpsOMPage;
#endif /* __cplusplus */
#endif

#ifndef __IXpsOMPackageWriter_FWD_DEFINED__
#define __IXpsOMPackageWriter_FWD_DEFINED__
typedef interface IXpsOMPackageWriter IXpsOMPackageWriter;
#ifdef __cplusplus
interface IXpsOMPackageWriter;
#endif /* __cplusplus */
#endif

#ifndef __IXpsOMPackageTarget_FWD_DEFINED__
#define __IXpsOMPackageTarget_FWD_DEFINED__
typedef interface IXpsOMPackageTarget IXpsOMPackageTarget;
#ifdef __cplusplus
interface IXpsOMPackageTarget;
#endif /* __cplusplus */
#endif

typedef enum __WIDL_xpsobjectmodel_generated_name_0000002F {
    XPS_COLOR_INTERPOLATION_SCRGBLINEAR = 1,
    XPS_COLOR_INTERPOLATION_SRGBLINEAR = 2
} XPS_COLOR_INTERPOLATION;
typedef enum __WIDL_xpsobjectmodel_generated_name_00000030 {
    XPS_COLOR_TYPE_SRGB = 1,
    XPS_COLOR_TYPE_SCRGB = 2,
    XPS_COLOR_TYPE_CONTEXT = 3
} XPS_COLOR_TYPE;
typedef enum __WIDL_xpsobjectmodel_generated_name_00000031 {
    XPS_DASH_CAP_FLAT = 1,
    XPS_DASH_CAP_ROUND = 2,
    XPS_DASH_CAP_SQUARE = 3,
    XPS_DASH_CAP_TRIANGLE = 4
} XPS_DASH_CAP;
typedef enum __WIDL_xpsobjectmodel_generated_name_00000032 {
    XPS_FILL_RULE_EVENODD = 1,
    XPS_FILL_RULE_NONZERO = 2
} XPS_FILL_RULE;
typedef enum __WIDL_xpsobjectmodel_generated_name_00000033 {
    XPS_FONT_EMBEDDING_NORMAL = 1,
    XPS_FONT_EMBEDDING_OBFUSCATED = 2,
    XPS_FONT_EMBEDDING_RESTRICTED = 3,
    XPS_FONT_EMBEDDING_RESTRICTED_UNOBFUSCATED = 4
} XPS_FONT_EMBEDDING;
typedef enum __WIDL_xpsobjectmodel_generated_name_00000034 {
    XPS_IMAGE_TYPE_JPEG = 1,
    XPS_IMAGE_TYPE_PNG = 2,
    XPS_IMAGE_TYPE_TIFF = 3,
    XPS_IMAGE_TYPE_WDP = 4,
    XPS_IMAGE_TYPE_JXR = 5
} XPS_IMAGE_TYPE;
typedef enum __WIDL_xpsobjectmodel_generated_name_00000035 {
    XPS_INTERLEAVING_OFF = 1,
    XPS_INTERLEAVING_ON = 2
} XPS_INTERLEAVING;
typedef enum __WIDL_xpsobjectmodel_generated_name_00000036 {
    XPS_LINE_CAP_FLAT = 1,
    XPS_LINE_CAP_ROUND = 2,
    XPS_LINE_CAP_SQUARE = 3,
    XPS_LINE_CAP_TRIANGLE = 4
} XPS_LINE_CAP;
typedef enum __WIDL_xpsobjectmodel_generated_name_00000037 {
    XPS_LINE_JOIN_MITER = 1,
    XPS_LINE_JOIN_BEVEL = 2,
    XPS_LINE_JOIN_ROUND = 3
} XPS_LINE_JOIN;
typedef enum __WIDL_xpsobjectmodel_generated_name_00000038 {
    XPS_OBJECT_TYPE_CANVAS = 1,
    XPS_OBJECT_TYPE_GLYPHS = 2,
    XPS_OBJECT_TYPE_PATH = 3,
    XPS_OBJECT_TYPE_MATRIX_TRANSFORM = 4,
    XPS_OBJECT_TYPE_GEOMETRY = 5,
    XPS_OBJECT_TYPE_SOLID_COLOR_BRUSH = 6,
    XPS_OBJECT_TYPE_IMAGE_BRUSH = 7,
    XPS_OBJECT_TYPE_LINEAR_GRADIENT_BRUSH = 8,
    XPS_OBJECT_TYPE_RADIAL_GRADIENT_BRUSH = 9,
    XPS_OBJECT_TYPE_VISUAL_BRUSH = 10
} XPS_OBJECT_TYPE;
typedef enum __WIDL_xpsobjectmodel_generated_name_00000039 {
    XPS_SEGMENT_STROKE_PATTERN_ALL = 1,
    XPS_SEGMENT_STROKE_PATTERN_NONE = 2,
    XPS_SEGMENT_STROKE_PATTERN_MIXED = 3
} XPS_SEGMENT_STROKE_PATTERN;
typedef enum __WIDL_xpsobjectmodel_generated_name_0000003A {
    XPS_SEGMENT_TYPE_ARC_LARGE_CLOCKWISE = 1,
    XPS_SEGMENT_TYPE_ARC_LARGE_COUNTERCLOCKWISE = 2,
    XPS_SEGMENT_TYPE_ARC_SMALL_CLOCKWISE = 3,
    XPS_SEGMENT_TYPE_ARC_SMALL_COUNTERCLOCKWISE = 4,
    XPS_SEGMENT_TYPE_BEZIER = 5,
    XPS_SEGMENT_TYPE_LINE = 6,
    XPS_SEGMENT_TYPE_QUADRATIC_BEZIER = 7
} XPS_SEGMENT_TYPE;
typedef enum __WIDL_xpsobjectmodel_generated_name_0000003B {
    XPS_SPREAD_METHOD_PAD = 1,
    XPS_SPREAD_METHOD_REFLECT = 2,
    XPS_SPREAD_METHOD_REPEAT = 3
} XPS_SPREAD_METHOD;
typedef enum __WIDL_xpsobjectmodel_generated_name_0000003C {
    XPS_STYLE_SIMULATION_NONE = 1,
    XPS_STYLE_SIMULATION_ITALIC = 2,
    XPS_STYLE_SIMULATION_BOLD = 3,
    XPS_STYLE_SIMULATION_BOLDITALIC = 4
} XPS_STYLE_SIMULATION;
typedef enum __WIDL_xpsobjectmodel_generated_name_0000003D {
    XPS_THUMBNAIL_SIZE_VERYSMALL = 1,
    XPS_THUMBNAIL_SIZE_SMALL = 2,
    XPS_THUMBNAIL_SIZE_MEDIUM = 3,
    XPS_THUMBNAIL_SIZE_LARGE = 4
} XPS_THUMBNAIL_SIZE;
typedef enum __WIDL_xpsobjectmodel_generated_name_0000003E {
    XPS_TILE_MODE_NONE = 1,
    XPS_TILE_MODE_TILE = 2,
    XPS_TILE_MODE_FLIPX = 3,
    XPS_TILE_MODE_FLIPY = 4,
    XPS_TILE_MODE_FLIPXY = 5
} XPS_TILE_MODE;
typedef struct __WIDL_xpsobjectmodel_generated_name_00000040 {
    XPS_COLOR_TYPE colorType;
    union __WIDL_xpsobjectmodel_generated_name_0000003F {
        struct {
            UINT8 alpha;
            UINT8 red;
            UINT8 green;
            UINT8 blue;
        } sRGB;
        struct {
            FLOAT alpha;
            FLOAT red;
            FLOAT green;
            FLOAT blue;
        } scRGB;
        struct {
            UINT8 channelCount;
            FLOAT channels[9];
        } context;
    } value;
} XPS_COLOR;
typedef struct __WIDL_xpsobjectmodel_generated_name_00000041 {
    FLOAT length;
    FLOAT gap;
} XPS_DASH;
typedef struct __WIDL_xpsobjectmodel_generated_name_00000042 {
    LONG index;
    FLOAT advanceWidth;
    FLOAT horizontalOffset;
    FLOAT verticalOffset;
} XPS_GLYPH_INDEX;
typedef struct __WIDL_xpsobjectmodel_generated_name_00000043 {
    UINT32 unicodeStringStart;
    UINT16 unicodeStringLength;
    UINT32 glyphIndicesStart;
    UINT16 glyphIndicesLength;
} XPS_GLYPH_MAPPING;
typedef struct __WIDL_xpsobjectmodel_generated_name_00000044 {
    FLOAT m11;
    FLOAT m12;
    FLOAT m21;
    FLOAT m22;
    FLOAT m31;
    FLOAT m32;
} XPS_MATRIX;
typedef struct __WIDL_xpsobjectmodel_generated_name_00000045 {
    FLOAT x;
    FLOAT y;
} XPS_POINT;
typedef struct __WIDL_xpsobjectmodel_generated_name_00000046 {
    FLOAT x;
    FLOAT y;
    FLOAT width;
    FLOAT height;
} XPS_RECT;
typedef struct __WIDL_xpsobjectmodel_generated_name_00000047 {
    FLOAT width;
    FLOAT height;
} XPS_SIZE;
/*****************************************************************************
 * IXpsOMShareable interface
 */
#ifndef __IXpsOMShareable_INTERFACE_DEFINED__
#define __IXpsOMShareable_INTERFACE_DEFINED__

DEFINE_GUID(IID_IXpsOMShareable, 0x7137398f, 0x2fc1, 0x454d, 0x8c,0x6a, 0x2c,0x31,0x15,0xa1,0x6e,0xce);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("7137398f-2fc1-454d-8c6a-2c3115a16ece")
IXpsOMShareable : public IUnknown
{
    virtual HRESULT STDMETHODCALLTYPE GetOwner(
        IUnknown **owner) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetType(
        XPS_OBJECT_TYPE *type) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IXpsOMShareable, 0x7137398f, 0x2fc1, 0x454d, 0x8c,0x6a, 0x2c,0x31,0x15,0xa1,0x6e,0xce)
#endif
#else
typedef struct IXpsOMShareableVtbl {
    BEGIN_INTERFACE

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

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

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

    /*** IXpsOMShareable methods ***/
    HRESULT (STDMETHODCALLTYPE *GetOwner)(
        IXpsOMShareable *This,
        IUnknown **owner);

    HRESULT (STDMETHODCALLTYPE *GetType)(
        IXpsOMShareable *This,
        XPS_OBJECT_TYPE *type);

    END_INTERFACE
} IXpsOMShareableVtbl;

interface IXpsOMShareable {
    CONST_VTBL IXpsOMShareableVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IXpsOMShareable_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IXpsOMShareable_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IXpsOMShareable_Release(This) (This)->lpVtbl->Release(This)
/*** IXpsOMShareable methods ***/
#define IXpsOMShareable_GetOwner(This,owner) (This)->lpVtbl->GetOwner(This,owner)
#define IXpsOMShareable_GetType(This,type) (This)->lpVtbl->GetType(This,type)
#else
/*** IUnknown methods ***/
static __WIDL_INLINE HRESULT IXpsOMShareable_QueryInterface(IXpsOMShareable* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IXpsOMShareable_AddRef(IXpsOMShareable* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IXpsOMShareable_Release(IXpsOMShareable* This) {
    return This->lpVtbl->Release(This);
}
/*** IXpsOMShareable methods ***/
static __WIDL_INLINE HRESULT IXpsOMShareable_GetOwner(IXpsOMShareable* This,IUnknown **owner) {
    return This->lpVtbl->GetOwner(This,owner);
}
static __WIDL_INLINE HRESULT IXpsOMShareable_GetType(IXpsOMShareable* This,XPS_OBJECT_TYPE *type) {
    return This->lpVtbl->GetType(This,type);
}
#endif
#endif

#endif


#endif  /* __IXpsOMShareable_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IXpsOMPart interface
 */
#ifndef __IXpsOMPart_INTERFACE_DEFINED__
#define __IXpsOMPart_INTERFACE_DEFINED__

DEFINE_GUID(IID_IXpsOMPart, 0x74eb2f0b, 0xa91e, 0x4486, 0xaf,0xac, 0x0f,0xab,0xec,0xa3,0xdf,0xc6);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("74eb2f0b-a91e-4486-afac-0fabeca3dfc6")
IXpsOMPart : public IUnknown
{
    virtual HRESULT STDMETHODCALLTYPE GetPartName(
        IOpcPartUri **partUri) = 0;

    virtual HRESULT STDMETHODCALLTYPE SetPartName(
        IOpcPartUri *partUri) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IXpsOMPart, 0x74eb2f0b, 0xa91e, 0x4486, 0xaf,0xac, 0x0f,0xab,0xec,0xa3,0xdf,0xc6)
#endif
#else
typedef struct IXpsOMPartVtbl {
    BEGIN_INTERFACE

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

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

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

    /*** IXpsOMPart methods ***/
    HRESULT (STDMETHODCALLTYPE *GetPartName)(
        IXpsOMPart *This,
        IOpcPartUri **partUri);

    HRESULT (STDMETHODCALLTYPE *SetPartName)(
        IXpsOMPart *This,
        IOpcPartUri *partUri);

    END_INTERFACE
} IXpsOMPartVtbl;

interface IXpsOMPart {
    CONST_VTBL IXpsOMPartVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IXpsOMPart_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IXpsOMPart_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IXpsOMPart_Release(This) (This)->lpVtbl->Release(This)
/*** IXpsOMPart methods ***/
#define IXpsOMPart_GetPartName(This,partUri) (This)->lpVtbl->GetPartName(This,partUri)
#define IXpsOMPart_SetPartName(This,partUri) (This)->lpVtbl->SetPartName(This,partUri)
#else
/*** IUnknown methods ***/
static __WIDL_INLINE HRESULT IXpsOMPart_QueryInterface(IXpsOMPart* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IXpsOMPart_AddRef(IXpsOMPart* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IXpsOMPart_Release(IXpsOMPart* This) {
    return This->lpVtbl->Release(This);
}
/*** IXpsOMPart methods ***/
static __WIDL_INLINE HRESULT IXpsOMPart_GetPartName(IXpsOMPart* This,IOpcPartUri **partUri) {
    return This->lpVtbl->GetPartName(This,partUri);
}
static __WIDL_INLINE HRESULT IXpsOMPart_SetPartName(IXpsOMPart* This,IOpcPartUri *partUri) {
    return This->lpVtbl->SetPartName(This,partUri);
}
#endif
#endif

#endif


#endif  /* __IXpsOMPart_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IXpsOMGlyphsEditor interface
 */
#ifndef __IXpsOMGlyphsEditor_INTERFACE_DEFINED__
#define __IXpsOMGlyphsEditor_INTERFACE_DEFINED__

DEFINE_GUID(IID_IXpsOMGlyphsEditor, 0xa5ab8616, 0x5b16, 0x4b9f, 0x96,0x29, 0x89,0xb3,0x23,0xed,0x79,0x09);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("a5ab8616-5b16-4b9f-9629-89b323ed7909")
IXpsOMGlyphsEditor : public IUnknown
{
    virtual HRESULT STDMETHODCALLTYPE ApplyEdits(
        ) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetUnicodeString(
        LPWSTR *unicodeString) = 0;

    virtual HRESULT STDMETHODCALLTYPE SetUnicodeString(
        LPCWSTR unicodeString) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetGlyphIndexCount(
        UINT32 *indexCount) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetGlyphIndices(
        UINT32 *indexCount,
        XPS_GLYPH_INDEX *glyphIndices) = 0;

    virtual HRESULT STDMETHODCALLTYPE SetGlyphIndices(
        UINT32 indexCount,
        const XPS_GLYPH_INDEX *glyphIndices) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetGlyphMappingCount(
        UINT32 *glyphMappingCount) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetGlyphMappings(
        UINT32 *glyphMappingCount,
        XPS_GLYPH_MAPPING *glyphMappings) = 0;

    virtual HRESULT STDMETHODCALLTYPE SetGlyphMappings(
        UINT32 glyphMappingCount,
        const XPS_GLYPH_MAPPING *glyphMappings) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetProhibitedCaretStopCount(
        UINT32 *prohibitedCaretStopCount) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetProhibitedCaretStops(
        UINT32 *count,
        UINT32 *prohibitedCaretStops) = 0;

    virtual HRESULT STDMETHODCALLTYPE SetProhibitedCaretStops(
        UINT32 count,
        const UINT32 *prohibitedCaretStops) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetBidiLevel(
        UINT32 *bidiLevel) = 0;

    virtual HRESULT STDMETHODCALLTYPE SetBidiLevel(
        UINT32 bidiLevel) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetIsSideways(
        WINBOOL *isSideways) = 0;

    virtual HRESULT STDMETHODCALLTYPE SetIsSideways(
        WINBOOL isSideways) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetDeviceFontName(
        LPWSTR *deviceFontName) = 0;

    virtual HRESULT STDMETHODCALLTYPE SetDeviceFontName(
        LPCWSTR deviceFontName) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IXpsOMGlyphsEditor, 0xa5ab8616, 0x5b16, 0x4b9f, 0x96,0x29, 0x89,0xb3,0x23,0xed,0x79,0x09)
#endif
#else
typedef struct IXpsOMGlyphsEditorVtbl {
    BEGIN_INTERFACE

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

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

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

    /*** IXpsOMGlyphsEditor methods ***/
    HRESULT (STDMETHODCALLTYPE *ApplyEdits)(
        IXpsOMGlyphsEditor *This);

    HRESULT (STDMETHODCALLTYPE *GetUnicodeString)(
        IXpsOMGlyphsEditor *This,
        LPWSTR *unicodeString);

    HRESULT (STDMETHODCALLTYPE *SetUnicodeString)(
        IXpsOMGlyphsEditor *This,
        LPCWSTR unicodeString);

    HRESULT (STDMETHODCALLTYPE *GetGlyphIndexCount)(
        IXpsOMGlyphsEditor *This,
        UINT32 *indexCount);

    HRESULT (STDMETHODCALLTYPE *GetGlyphIndices)(
        IXpsOMGlyphsEditor *This,
        UINT32 *indexCount,
        XPS_GLYPH_INDEX *glyphIndices);

    HRESULT (STDMETHODCALLTYPE *SetGlyphIndices)(
        IXpsOMGlyphsEditor *This,
        UINT32 indexCount,
        const XPS_GLYPH_INDEX *glyphIndices);

    HRESULT (STDMETHODCALLTYPE *GetGlyphMappingCount)(
        IXpsOMGlyphsEditor *This,
        UINT32 *glyphMappingCount);

    HRESULT (STDMETHODCALLTYPE *GetGlyphMappings)(
        IXpsOMGlyphsEditor *This,
        UINT32 *glyphMappingCount,
        XPS_GLYPH_MAPPING *glyphMappings);

    HRESULT (STDMETHODCALLTYPE *SetGlyphMappings)(
        IXpsOMGlyphsEditor *This,
        UINT32 glyphMappingCount,
        const XPS_GLYPH_MAPPING *glyphMappings);

    HRESULT (STDMETHODCALLTYPE *GetProhibitedCaretStopCount)(
        IXpsOMGlyphsEditor *This,
        UINT32 *prohibitedCaretStopCount);

    HRESULT (STDMETHODCALLTYPE *GetProhibitedCaretStops)(
        IXpsOMGlyphsEditor *This,
        UINT32 *count,
        UINT32 *prohibitedCaretStops);

    HRESULT (STDMETHODCALLTYPE *SetProhibitedCaretStops)(
        IXpsOMGlyphsEditor *This,
        UINT32 count,
        const UINT32 *prohibitedCaretStops);

    HRESULT (STDMETHODCALLTYPE *GetBidiLevel)(
        IXpsOMGlyphsEditor *This,
        UINT32 *bidiLevel);

    HRESULT (STDMETHODCALLTYPE *SetBidiLevel)(
        IXpsOMGlyphsEditor *This,
        UINT32 bidiLevel);

    HRESULT (STDMETHODCALLTYPE *GetIsSideways)(
        IXpsOMGlyphsEditor *This,
        WINBOOL *isSideways);

    HRESULT (STDMETHODCALLTYPE *SetIsSideways)(
        IXpsOMGlyphsEditor *This,
        WINBOOL isSideways);

    HRESULT (STDMETHODCALLTYPE *GetDeviceFontName)(
        IXpsOMGlyphsEditor *This,
        LPWSTR *deviceFontName);

    HRESULT (STDMETHODCALLTYPE *SetDeviceFontName)(
        IXpsOMGlyphsEditor *This,
        LPCWSTR deviceFontName);

    END_INTERFACE
} IXpsOMGlyphsEditorVtbl;

interface IXpsOMGlyphsEditor {
    CONST_VTBL IXpsOMGlyphsEditorVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IXpsOMGlyphsEditor_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IXpsOMGlyphsEditor_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IXpsOMGlyphsEditor_Release(This) (This)->lpVtbl->Release(This)
/*** IXpsOMGlyphsEditor methods ***/
#define IXpsOMGlyphsEditor_ApplyEdits(This) (This)->lpVtbl->ApplyEdits(This)
#define IXpsOMGlyphsEditor_GetUnicodeString(This,unicodeString) (This)->lpVtbl->GetUnicodeString(This,unicodeString)
#define IXpsOMGlyphsEditor_SetUnicodeString(This,unicodeString) (This)->lpVtbl->SetUnicodeString(This,unicodeString)
#define IXpsOMGlyphsEditor_GetGlyphIndexCount(This,indexCount) (This)->lpVtbl->GetGlyphIndexCount(This,indexCount)
#define IXpsOMGlyphsEditor_GetGlyphIndices(This,indexCount,glyphIndices) (This)->lpVtbl->GetGlyphIndices(This,indexCount,glyphIndices)
#define IXpsOMGlyphsEditor_SetGlyphIndices(This,indexCount,glyphIndices) (This)->lpVtbl->SetGlyphIndices(This,indexCount,glyphIndices)
#define IXpsOMGlyphsEditor_GetGlyphMappingCount(This,glyphMappingCount) (This)->lpVtbl->GetGlyphMappingCount(This,glyphMappingCount)
#define IXpsOMGlyphsEditor_GetGlyphMappings(This,glyphMappingCount,glyphMappings) (This)->lpVtbl->GetGlyphMappings(This,glyphMappingCount,glyphMappings)
#define IXpsOMGlyphsEditor_SetGlyphMappings(This,glyphMappingCount,glyphMappings) (This)->lpVtbl->SetGlyphMappings(This,glyphMappingCount,glyphMappings)
#define IXpsOMGlyphsEditor_GetProhibitedCaretStopCount(This,prohibitedCaretStopCount) (This)->lpVtbl->GetProhibitedCaretStopCount(This,prohibitedCaretStopCount)
#define IXpsOMGlyphsEditor_GetProhibitedCaretStops(This,count,prohibitedCaretStops) (This)->lpVtbl->GetProhibitedCaretStops(This,count,prohibitedCaretStops)
#define IXpsOMGlyphsEditor_SetProhibitedCaretStops(This,count,prohibitedCaretStops) (This)->lpVtbl->SetProhibitedCaretStops(This,count,prohibitedCaretStops)
#define IXpsOMGlyphsEditor_GetBidiLevel(This,bidiLevel) (This)->lpVtbl->GetBidiLevel(This,bidiLevel)
#define IXpsOMGlyphsEditor_SetBidiLevel(This,bidiLevel) (This)->lpVtbl->SetBidiLevel(This,bidiLevel)
#define IXpsOMGlyphsEditor_GetIsSideways(This,isSideways) (This)->lpVtbl->GetIsSideways(This,isSideways)
#define IXpsOMGlyphsEditor_SetIsSideways(This,isSideways) (This)->lpVtbl->SetIsSideways(This,isSideways)
#define IXpsOMGlyphsEditor_GetDeviceFontName(This,deviceFontName) (This)->lpVtbl->GetDeviceFontName(This,deviceFontName)
#define IXpsOMGlyphsEditor_SetDeviceFontName(This,deviceFontName) (This)->lpVtbl->SetDeviceFontName(This,deviceFontName)
#else
/*** IUnknown methods ***/
static __WIDL_INLINE HRESULT IXpsOMGlyphsEditor_QueryInterface(IXpsOMGlyphsEditor* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IXpsOMGlyphsEditor_AddRef(IXpsOMGlyphsEditor* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IXpsOMGlyphsEditor_Release(IXpsOMGlyphsEditor* This) {
    return This->lpVtbl->Release(This);
}
/*** IXpsOMGlyphsEditor methods ***/
static __WIDL_INLINE HRESULT IXpsOMGlyphsEditor_ApplyEdits(IXpsOMGlyphsEditor* This) {
    return This->lpVtbl->ApplyEdits(This);
}
static __WIDL_INLINE HRESULT IXpsOMGlyphsEditor_GetUnicodeString(IXpsOMGlyphsEditor* This,LPWSTR *unicodeString) {
    return This->lpVtbl->GetUnicodeString(This,unicodeString);
}
static __WIDL_INLINE HRESULT IXpsOMGlyphsEditor_SetUnicodeString(IXpsOMGlyphsEditor* This,LPCWSTR unicodeString) {
    return This->lpVtbl->SetUnicodeString(This,unicodeString);
}
static __WIDL_INLINE HRESULT IXpsOMGlyphsEditor_GetGlyphIndexCount(IXpsOMGlyphsEditor* This,UINT32 *indexCount) {
    return This->lpVtbl->GetGlyphIndexCount(This,indexCount);
}
static __WIDL_INLINE HRESULT IXpsOMGlyphsEditor_GetGlyphIndices(IXpsOMGlyphsEditor* This,UINT32 *indexCount,XPS_GLYPH_INDEX *glyphIndices) {
    return This->lpVtbl->GetGlyphIndices(This,indexCount,glyphIndices);
}
static __WIDL_INLINE HRESULT IXpsOMGlyphsEditor_SetGlyphIndices(IXpsOMGlyphsEditor* This,UINT32 indexCount,const XPS_GLYPH_INDEX *glyphIndices) {
    return This->lpVtbl->SetGlyphIndices(This,indexCount,glyphIndices);
}
static __WIDL_INLINE HRESULT IXpsOMGlyphsEditor_GetGlyphMappingCount(IXpsOMGlyphsEditor* This,UINT32 *glyphMappingCount) {
    return This->lpVtbl->GetGlyphMappingCount(This,glyphMappingCount);
}
static __WIDL_INLINE HRESULT IXpsOMGlyphsEditor_GetGlyphMappings(IXpsOMGlyphsEditor* This,UINT32 *glyphMappingCount,XPS_GLYPH_MAPPING *glyphMappings) {
    return This->lpVtbl->GetGlyphMappings(This,glyphMappingCount,glyphMappings);
}
static __WIDL_INLINE HRESULT IXpsOMGlyphsEditor_SetGlyphMappings(IXpsOMGlyphsEditor* This,UINT32 glyphMappingCount,const XPS_GLYPH_MAPPING *glyphMappings) {
    return This->lpVtbl->SetGlyphMappings(This,glyphMappingCount,glyphMappings);
}
static __WIDL_INLINE HRESULT IXpsOMGlyphsEditor_GetProhibitedCaretStopCount(IXpsOMGlyphsEditor* This,UINT32 *prohibitedCaretStopCount) {
    return This->lpVtbl->GetProhibitedCaretStopCount(This,prohibitedCaretStopCount);
}
static __WIDL_INLINE HRESULT IXpsOMGlyphsEditor_GetProhibitedCaretStops(IXpsOMGlyphsEditor* This,UINT32 *count,UINT32 *prohibitedCaretStops) {
    return This->lpVtbl->GetProhibitedCaretStops(This,count,prohibitedCaretStops);
}
static __WIDL_INLINE HRESULT IXpsOMGlyphsEditor_SetProhibitedCaretStops(IXpsOMGlyphsEditor* This,UINT32 count,const UINT32 *prohibitedCaretStops) {
    return This->lpVtbl->SetProhibitedCaretStops(This,count,prohibitedCaretStops);
}
static __WIDL_INLINE HRESULT IXpsOMGlyphsEditor_GetBidiLevel(IXpsOMGlyphsEditor* This,UINT32 *bidiLevel) {
    return This->lpVtbl->GetBidiLevel(This,bidiLevel);
}
static __WIDL_INLINE HRESULT IXpsOMGlyphsEditor_SetBidiLevel(IXpsOMGlyphsEditor* This,UINT32 bidiLevel) {
    return This->lpVtbl->SetBidiLevel(This,bidiLevel);
}
static __WIDL_INLINE HRESULT IXpsOMGlyphsEditor_GetIsSideways(IXpsOMGlyphsEditor* This,WINBOOL *isSideways) {
    return This->lpVtbl->GetIsSideways(This,isSideways);
}
static __WIDL_INLINE HRESULT IXpsOMGlyphsEditor_SetIsSideways(IXpsOMGlyphsEditor* This,WINBOOL isSideways) {
    return This->lpVtbl->SetIsSideways(This,isSideways);
}
static __WIDL_INLINE HRESULT IXpsOMGlyphsEditor_GetDeviceFontName(IXpsOMGlyphsEditor* This,LPWSTR *deviceFontName) {
    return This->lpVtbl->GetDeviceFontName(This,deviceFontName);
}
static __WIDL_INLINE HRESULT IXpsOMGlyphsEditor_SetDeviceFontName(IXpsOMGlyphsEditor* This,LPCWSTR deviceFontName) {
    return This->lpVtbl->SetDeviceFontName(This,deviceFontName);
}
#endif
#endif

#endif


#endif  /* __IXpsOMGlyphsEditor_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IXpsOMDashCollection interface
 */
#ifndef __IXpsOMDashCollection_INTERFACE_DEFINED__
#define __IXpsOMDashCollection_INTERFACE_DEFINED__

DEFINE_GUID(IID_IXpsOMDashCollection, 0x081613f4, 0x74eb, 0x48f2, 0x83,0xb3, 0x37,0xa9,0xce,0x2d,0x7d,0xc6);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("081613f4-74eb-48f2-83b3-37a9ce2d7dc6")
IXpsOMDashCollection : public IUnknown
{
    virtual HRESULT STDMETHODCALLTYPE GetCount(
        UINT32 *count) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetAt(
        UINT32 index,
        XPS_DASH *dash) = 0;

    virtual HRESULT STDMETHODCALLTYPE InsertAt(
        UINT32 index,
        const XPS_DASH *dash) = 0;

    virtual HRESULT STDMETHODCALLTYPE RemoveAt(
        UINT32 index) = 0;

    virtual HRESULT STDMETHODCALLTYPE SetAt(
        UINT32 index,
        const XPS_DASH *dash) = 0;

    virtual HRESULT STDMETHODCALLTYPE Append(
        const XPS_DASH *dash) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IXpsOMDashCollection, 0x081613f4, 0x74eb, 0x48f2, 0x83,0xb3, 0x37,0xa9,0xce,0x2d,0x7d,0xc6)
#endif
#else
typedef struct IXpsOMDashCollectionVtbl {
    BEGIN_INTERFACE

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

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

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

    /*** IXpsOMDashCollection methods ***/
    HRESULT (STDMETHODCALLTYPE *GetCount)(
        IXpsOMDashCollection *This,
        UINT32 *count);

    HRESULT (STDMETHODCALLTYPE *GetAt)(
        IXpsOMDashCollection *This,
        UINT32 index,
        XPS_DASH *dash);

    HRESULT (STDMETHODCALLTYPE *InsertAt)(
        IXpsOMDashCollection *This,
        UINT32 index,
        const XPS_DASH *dash);

    HRESULT (STDMETHODCALLTYPE *RemoveAt)(
        IXpsOMDashCollection *This,
        UINT32 index);

    HRESULT (STDMETHODCALLTYPE *SetAt)(
        IXpsOMDashCollection *This,
        UINT32 index,
        const XPS_DASH *dash);

    HRESULT (STDMETHODCALLTYPE *Append)(
        IXpsOMDashCollection *This,
        const XPS_DASH *dash);

    END_INTERFACE
} IXpsOMDashCollectionVtbl;

interface IXpsOMDashCollection {
    CONST_VTBL IXpsOMDashCollectionVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IXpsOMDashCollection_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IXpsOMDashCollection_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IXpsOMDashCollection_Release(This) (This)->lpVtbl->Release(This)
/*** IXpsOMDashCollection methods ***/
#define IXpsOMDashCollection_GetCount(This,count) (This)->lpVtbl->GetCount(This,count)
#define IXpsOMDashCollection_GetAt(This,index,dash) (This)->lpVtbl->GetAt(This,index,dash)
#define IXpsOMDashCollection_InsertAt(This,index,dash) (This)->lpVtbl->InsertAt(This,index,dash)
#define IXpsOMDashCollection_RemoveAt(This,index) (This)->lpVtbl->RemoveAt(This,index)
#define IXpsOMDashCollection_SetAt(This,index,dash) (This)->lpVtbl->SetAt(This,index,dash)
#define IXpsOMDashCollection_Append(This,dash) (This)->lpVtbl->Append(This,dash)
#else
/*** IUnknown methods ***/
static __WIDL_INLINE HRESULT IXpsOMDashCollection_QueryInterface(IXpsOMDashCollection* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IXpsOMDashCollection_AddRef(IXpsOMDashCollection* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IXpsOMDashCollection_Release(IXpsOMDashCollection* This) {
    return This->lpVtbl->Release(This);
}
/*** IXpsOMDashCollection methods ***/
static __WIDL_INLINE HRESULT IXpsOMDashCollection_GetCount(IXpsOMDashCollection* This,UINT32 *count) {
    return This->lpVtbl->GetCount(This,count);
}
static __WIDL_INLINE HRESULT IXpsOMDashCollection_GetAt(IXpsOMDashCollection* This,UINT32 index,XPS_DASH *dash) {
    return This->lpVtbl->GetAt(This,index,dash);
}
static __WIDL_INLINE HRESULT IXpsOMDashCollection_InsertAt(IXpsOMDashCollection* This,UINT32 index,const XPS_DASH *dash) {
    return This->lpVtbl->InsertAt(This,index,dash);
}
static __WIDL_INLINE HRESULT IXpsOMDashCollection_RemoveAt(IXpsOMDashCollection* This,UINT32 index) {
    return This->lpVtbl->RemoveAt(This,index);
}
static __WIDL_INLINE HRESULT IXpsOMDashCollection_SetAt(IXpsOMDashCollection* This,UINT32 index,const XPS_DASH *dash) {
    return This->lpVtbl->SetAt(This,index,dash);
}
static __WIDL_INLINE HRESULT IXpsOMDashCollection_Append(IXpsOMDashCollection* This,const XPS_DASH *dash) {
    return This->lpVtbl->Append(This,dash);
}
#endif
#endif

#endif


#endif  /* __IXpsOMDashCollection_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IXpsOMGeometryFigure interface
 */
#ifndef __IXpsOMGeometryFigure_INTERFACE_DEFINED__
#define __IXpsOMGeometryFigure_INTERFACE_DEFINED__

DEFINE_GUID(IID_IXpsOMGeometryFigure, 0xd410dc83, 0x908c, 0x443e, 0x89,0x47, 0xb1,0x79,0x5d,0x3c,0x16,0x5a);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("d410dc83-908c-443e-8947-b1795d3c165a")
IXpsOMGeometryFigure : public IUnknown
{
    virtual HRESULT STDMETHODCALLTYPE GetOwner(
        IXpsOMGeometry **owner) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetSegmentData(
        UINT32 *dataCount,
        FLOAT *segmentData) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetSegmentTypes(
        UINT32 *segmentCount,
        XPS_SEGMENT_TYPE *segmentTypes) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetSegmentStrokes(
        UINT32 *segmentCount,
        WINBOOL *segmentStrokes) = 0;

    virtual HRESULT STDMETHODCALLTYPE SetSegments(
        UINT32 segmentCount,
        UINT32 segmentDataCount,
        const XPS_SEGMENT_TYPE *segmentTypes,
        const FLOAT *segmentData,
        const WINBOOL *segmentStrokes) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetStartPoint(
        XPS_POINT *startPoint) = 0;

    virtual HRESULT STDMETHODCALLTYPE SetStartPoint(
        const XPS_POINT *startPoint) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetIsClosed(
        WINBOOL *isClosed) = 0;

    virtual HRESULT STDMETHODCALLTYPE SetIsClosed(
        WINBOOL isClosed) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetIsFilled(
        WINBOOL *isFilled) = 0;

    virtual HRESULT STDMETHODCALLTYPE SetIsFilled(
        WINBOOL isFilled) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetSegmentCount(
        UINT32 *segmentCount) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetSegmentDataCount(
        UINT32 *segmentDataCount) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetSegmentStrokePattern(
        XPS_SEGMENT_STROKE_PATTERN *segmentStrokePattern) = 0;

    virtual HRESULT STDMETHODCALLTYPE Clone(
        IXpsOMGeometryFigure **geometryFigure) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IXpsOMGeometryFigure, 0xd410dc83, 0x908c, 0x443e, 0x89,0x47, 0xb1,0x79,0x5d,0x3c,0x16,0x5a)
#endif
#else
typedef struct IXpsOMGeometryFigureVtbl {
    BEGIN_INTERFACE

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

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

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

    /*** IXpsOMGeometryFigure methods ***/
    HRESULT (STDMETHODCALLTYPE *GetOwner)(
        IXpsOMGeometryFigure *This,
        IXpsOMGeometry **owner);

    HRESULT (STDMETHODCALLTYPE *GetSegmentData)(
        IXpsOMGeometryFigure *This,
        UINT32 *dataCount,
        FLOAT *segmentData);

    HRESULT (STDMETHODCALLTYPE *GetSegmentTypes)(
        IXpsOMGeometryFigure *This,
        UINT32 *segmentCount,
        XPS_SEGMENT_TYPE *segmentTypes);

    HRESULT (STDMETHODCALLTYPE *GetSegmentStrokes)(
        IXpsOMGeometryFigure *This,
        UINT32 *segmentCount,
        WINBOOL *segmentStrokes);

    HRESULT (STDMETHODCALLTYPE *SetSegments)(
        IXpsOMGeometryFigure *This,
        UINT32 segmentCount,
        UINT32 segmentDataCount,
        const XPS_SEGMENT_TYPE *segmentTypes,
        const FLOAT *segmentData,
        const WINBOOL *segmentStrokes);

    HRESULT (STDMETHODCALLTYPE *GetStartPoint)(
        IXpsOMGeometryFigure *This,
        XPS_POINT *startPoint);

    HRESULT (STDMETHODCALLTYPE *SetStartPoint)(
        IXpsOMGeometryFigure *This,
        const XPS_POINT *startPoint);

    HRESULT (STDMETHODCALLTYPE *GetIsClosed)(
        IXpsOMGeometryFigure *This,
        WINBOOL *isClosed);

    HRESULT (STDMETHODCALLTYPE *SetIsClosed)(
        IXpsOMGeometryFigure *This,
        WINBOOL isClosed);

    HRESULT (STDMETHODCALLTYPE *GetIsFilled)(
        IXpsOMGeometryFigure *This,
        WINBOOL *isFilled);

    HRESULT (STDMETHODCALLTYPE *SetIsFilled)(
        IXpsOMGeometryFigure *This,
        WINBOOL isFilled);

    HRESULT (STDMETHODCALLTYPE *GetSegmentCount)(
        IXpsOMGeometryFigure *This,
        UINT32 *segmentCount);

    HRESULT (STDMETHODCALLTYPE *GetSegmentDataCount)(
        IXpsOMGeometryFigure *This,
        UINT32 *segmentDataCount);

    HRESULT (STDMETHODCALLTYPE *GetSegmentStrokePattern)(
        IXpsOMGeometryFigure *This,
        XPS_SEGMENT_STROKE_PATTERN *segmentStrokePattern);

    HRESULT (STDMETHODCALLTYPE *Clone)(
        IXpsOMGeometryFigure *This,
        IXpsOMGeometryFigure **geometryFigure);

    END_INTERFACE
} IXpsOMGeometryFigureVtbl;

interface IXpsOMGeometryFigure {
    CONST_VTBL IXpsOMGeometryFigureVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IXpsOMGeometryFigure_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IXpsOMGeometryFigure_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IXpsOMGeometryFigure_Release(This) (This)->lpVtbl->Release(This)
/*** IXpsOMGeometryFigure methods ***/
#define IXpsOMGeometryFigure_GetOwner(This,owner) (This)->lpVtbl->GetOwner(This,owner)
#define IXpsOMGeometryFigure_GetSegmentData(This,dataCount,segmentData) (This)->lpVtbl->GetSegmentData(This,dataCount,segmentData)
#define IXpsOMGeometryFigure_GetSegmentTypes(This,segmentCount,segmentTypes) (This)->lpVtbl->GetSegmentTypes(This,segmentCount,segmentTypes)
#define IXpsOMGeometryFigure_GetSegmentStrokes(This,segmentCount,segmentStrokes) (This)->lpVtbl->GetSegmentStrokes(This,segmentCount,segmentStrokes)
#define IXpsOMGeometryFigure_SetSegments(This,segmentCount,segmentDataCount,segmentTypes,segmentData,segmentStrokes) (This)->lpVtbl->SetSegments(This,segmentCount,segmentDataCount,segmentTypes,segmentData,segmentStrokes)
#define IXpsOMGeometryFigure_GetStartPoint(This,startPoint) (This)->lpVtbl->GetStartPoint(This,startPoint)
#define IXpsOMGeometryFigure_SetStartPoint(This,startPoint) (This)->lpVtbl->SetStartPoint(This,startPoint)
#define IXpsOMGeometryFigure_GetIsClosed(This,isClosed) (This)->lpVtbl->GetIsClosed(This,isClosed)
#define IXpsOMGeometryFigure_SetIsClosed(This,isClosed) (This)->lpVtbl->SetIsClosed(This,isClosed)
#define IXpsOMGeometryFigure_GetIsFilled(This,isFilled) (This)->lpVtbl->GetIsFilled(This,isFilled)
#define IXpsOMGeometryFigure_SetIsFilled(This,isFilled) (This)->lpVtbl->SetIsFilled(This,isFilled)
#define IXpsOMGeometryFigure_GetSegmentCount(This,segmentCount) (This)->lpVtbl->GetSegmentCount(This,segmentCount)
#define IXpsOMGeometryFigure_GetSegmentDataCount(This,segmentDataCount) (This)->lpVtbl->GetSegmentDataCount(This,segmentDataCount)
#define IXpsOMGeometryFigure_GetSegmentStrokePattern(This,segmentStrokePattern) (This)->lpVtbl->GetSegmentStrokePattern(This,segmentStrokePattern)
#define IXpsOMGeometryFigure_Clone(This,geometryFigure) (This)->lpVtbl->Clone(This,geometryFigure)
#else
/*** IUnknown methods ***/
static __WIDL_INLINE HRESULT IXpsOMGeometryFigure_QueryInterface(IXpsOMGeometryFigure* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IXpsOMGeometryFigure_AddRef(IXpsOMGeometryFigure* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IXpsOMGeometryFigure_Release(IXpsOMGeometryFigure* This) {
    return This->lpVtbl->Release(This);
}
/*** IXpsOMGeometryFigure methods ***/
static __WIDL_INLINE HRESULT IXpsOMGeometryFigure_GetOwner(IXpsOMGeometryFigure* This,IXpsOMGeometry **owner) {
    return This->lpVtbl->GetOwner(This,owner);
}
static __WIDL_INLINE HRESULT IXpsOMGeometryFigure_GetSegmentData(IXpsOMGeometryFigure* This,UINT32 *dataCount,FLOAT *segmentData) {
    return This->lpVtbl->GetSegmentData(This,dataCount,segmentData);
}
static __WIDL_INLINE HRESULT IXpsOMGeometryFigure_GetSegmentTypes(IXpsOMGeometryFigure* This,UINT32 *segmentCount,XPS_SEGMENT_TYPE *segmentTypes) {
    return This->lpVtbl->GetSegmentTypes(This,segmentCount,segmentTypes);
}
static __WIDL_INLINE HRESULT IXpsOMGeometryFigure_GetSegmentStrokes(IXpsOMGeometryFigure* This,UINT32 *segmentCount,WINBOOL *segmentStrokes) {
    return This->lpVtbl->GetSegmentStrokes(This,segmentCount,segmentStrokes);
}
static __WIDL_INLINE HRESULT IXpsOMGeometryFigure_SetSegments(IXpsOMGeometryFigure* This,UINT32 segmentCount,UINT32 segmentDataCount,const XPS_SEGMENT_TYPE *segmentTypes,const FLOAT *segmentData,const WINBOOL *segmentStrokes) {
    return This->lpVtbl->SetSegments(This,segmentCount,segmentDataCount,segmentTypes,segmentData,segmentStrokes);
}
static __WIDL_INLINE HRESULT IXpsOMGeometryFigure_GetStartPoint(IXpsOMGeometryFigure* This,XPS_POINT *startPoint) {
    return This->lpVtbl->GetStartPoint(This,startPoint);
}
static __WIDL_INLINE HRESULT IXpsOMGeometryFigure_SetStartPoint(IXpsOMGeometryFigure* This,const XPS_POINT *startPoint) {
    return This->lpVtbl->SetStartPoint(This,startPoint);
}
static __WIDL_INLINE HRESULT IXpsOMGeometryFigure_GetIsClosed(IXpsOMGeometryFigure* This,WINBOOL *isClosed) {
    return This->lpVtbl->GetIsClosed(This,isClosed);
}
static __WIDL_INLINE HRESULT IXpsOMGeometryFigure_SetIsClosed(IXpsOMGeometryFigure* This,WINBOOL isClosed) {
    return This->lpVtbl->SetIsClosed(This,isClosed);
}
static __WIDL_INLINE HRESULT IXpsOMGeometryFigure_GetIsFilled(IXpsOMGeometryFigure* This,WINBOOL *isFilled) {
    return This->lpVtbl->GetIsFilled(This,isFilled);
}
static __WIDL_INLINE HRESULT IXpsOMGeometryFigure_SetIsFilled(IXpsOMGeometryFigure* This,WINBOOL isFilled) {
    return This->lpVtbl->SetIsFilled(This,isFilled);
}
static __WIDL_INLINE HRESULT IXpsOMGeometryFigure_GetSegmentCount(IXpsOMGeometryFigure* This,UINT32 *segmentCount) {
    return This->lpVtbl->GetSegmentCount(This,segmentCount);
}
static __WIDL_INLINE HRESULT IXpsOMGeometryFigure_GetSegmentDataCount(IXpsOMGeometryFigure* This,UINT32 *segmentDataCount) {
    return This->lpVtbl->GetSegmentDataCount(This,segmentDataCount);
}
static __WIDL_INLINE HRESULT IXpsOMGeometryFigure_GetSegmentStrokePattern(IXpsOMGeometryFigure* This,XPS_SEGMENT_STROKE_PATTERN *segmentStrokePattern) {
    return This->lpVtbl->GetSegmentStrokePattern(This,segmentStrokePattern);
}
static __WIDL_INLINE HRESULT IXpsOMGeometryFigure_Clone(IXpsOMGeometryFigure* This,IXpsOMGeometryFigure **geometryFigure) {
    return This->lpVtbl->Clone(This,geometryFigure);
}
#endif
#endif

#endif


#endif  /* __IXpsOMGeometryFigure_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IXpsOMGeometryFigureCollection interface
 */
#ifndef __IXpsOMGeometryFigureCollection_INTERFACE_DEFINED__
#define __IXpsOMGeometryFigureCollection_INTERFACE_DEFINED__

DEFINE_GUID(IID_IXpsOMGeometryFigureCollection, 0xfd48c3f3, 0xa58e, 0x4b5a, 0x88,0x26, 0x1d,0xe5,0x4a,0xbe,0x72,0xb2);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("fd48c3f3-a58e-4b5a-8826-1de54abe72b2")
IXpsOMGeometryFigureCollection : public IUnknown
{
    virtual HRESULT STDMETHODCALLTYPE GetCount(
        UINT32 *count) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetAt(
        UINT32 index,
        IXpsOMGeometryFigure **geometryFigure) = 0;

    virtual HRESULT STDMETHODCALLTYPE InsertAt(
        UINT32 index,
        IXpsOMGeometryFigure *geometryFigure) = 0;

    virtual HRESULT STDMETHODCALLTYPE RemoveAt(
        UINT32 index) = 0;

    virtual HRESULT STDMETHODCALLTYPE SetAt(
        UINT32 index,
        IXpsOMGeometryFigure *geometryFigure) = 0;

    virtual HRESULT STDMETHODCALLTYPE Append(
        IXpsOMGeometryFigure *geometryFigure) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IXpsOMGeometryFigureCollection, 0xfd48c3f3, 0xa58e, 0x4b5a, 0x88,0x26, 0x1d,0xe5,0x4a,0xbe,0x72,0xb2)
#endif
#else
typedef struct IXpsOMGeometryFigureCollectionVtbl {
    BEGIN_INTERFACE

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

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

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

    /*** IXpsOMGeometryFigureCollection methods ***/
    HRESULT (STDMETHODCALLTYPE *GetCount)(
        IXpsOMGeometryFigureCollection *This,
        UINT32 *count);

    HRESULT (STDMETHODCALLTYPE *GetAt)(
        IXpsOMGeometryFigureCollection *This,
        UINT32 index,
        IXpsOMGeometryFigure **geometryFigure);

    HRESULT (STDMETHODCALLTYPE *InsertAt)(
        IXpsOMGeometryFigureCollection *This,
        UINT32 index,
        IXpsOMGeometryFigure *geometryFigure);

    HRESULT (STDMETHODCALLTYPE *RemoveAt)(
        IXpsOMGeometryFigureCollection *This,
        UINT32 index);

    HRESULT (STDMETHODCALLTYPE *SetAt)(
        IXpsOMGeometryFigureCollection *This,
        UINT32 index,
        IXpsOMGeometryFigure *geometryFigure);

    HRESULT (STDMETHODCALLTYPE *Append)(
        IXpsOMGeometryFigureCollection *This,
        IXpsOMGeometryFigure *geometryFigure);

    END_INTERFACE
} IXpsOMGeometryFigureCollectionVtbl;

interface IXpsOMGeometryFigureCollection {
    CONST_VTBL IXpsOMGeometryFigureCollectionVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IXpsOMGeometryFigureCollection_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IXpsOMGeometryFigureCollection_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IXpsOMGeometryFigureCollection_Release(This) (This)->lpVtbl->Release(This)
/*** IXpsOMGeometryFigureCollection methods ***/
#define IXpsOMGeometryFigureCollection_GetCount(This,count) (This)->lpVtbl->GetCount(This,count)
#define IXpsOMGeometryFigureCollection_GetAt(This,index,geometryFigure) (This)->lpVtbl->GetAt(This,index,geometryFigure)
#define IXpsOMGeometryFigureCollection_InsertAt(This,index,geometryFigure) (This)->lpVtbl->InsertAt(This,index,geometryFigure)
#define IXpsOMGeometryFigureCollection_RemoveAt(This,index) (This)->lpVtbl->RemoveAt(This,index)
#define IXpsOMGeometryFigureCollection_SetAt(This,index,geometryFigure) (This)->lpVtbl->SetAt(This,index,geometryFigure)
#define IXpsOMGeometryFigureCollection_Append(This,geometryFigure) (This)->lpVtbl->Append(This,geometryFigure)
#else
/*** IUnknown methods ***/
static __WIDL_INLINE HRESULT IXpsOMGeometryFigureCollection_QueryInterface(IXpsOMGeometryFigureCollection* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IXpsOMGeometryFigureCollection_AddRef(IXpsOMGeometryFigureCollection* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IXpsOMGeometryFigureCollection_Release(IXpsOMGeometryFigureCollection* This) {
    return This->lpVtbl->Release(This);
}
/*** IXpsOMGeometryFigureCollection methods ***/
static __WIDL_INLINE HRESULT IXpsOMGeometryFigureCollection_GetCount(IXpsOMGeometryFigureCollection* This,UINT32 *count) {
    return This->lpVtbl->GetCount(This,count);
}
static __WIDL_INLINE HRESULT IXpsOMGeometryFigureCollection_GetAt(IXpsOMGeometryFigureCollection* This,UINT32 index,IXpsOMGeometryFigure **geometryFigure) {
    return This->lpVtbl->GetAt(This,index,geometryFigure);
}
static __WIDL_INLINE HRESULT IXpsOMGeometryFigureCollection_InsertAt(IXpsOMGeometryFigureCollection* This,UINT32 index,IXpsOMGeometryFigure *geometryFigure) {
    return This->lpVtbl->InsertAt(This,index,geometryFigure);
}
static __WIDL_INLINE HRESULT IXpsOMGeometryFigureCollection_RemoveAt(IXpsOMGeometryFigureCollection* This,UINT32 index) {
    return This->lpVtbl->RemoveAt(This,index);
}
static __WIDL_INLINE HRESULT IXpsOMGeometryFigureCollection_SetAt(IXpsOMGeometryFigureCollection* This,UINT32 index,IXpsOMGeometryFigure *geometryFigure) {
    return This->lpVtbl->SetAt(This,index,geometryFigure);
}
static __WIDL_INLINE HRESULT IXpsOMGeometryFigureCollection_Append(IXpsOMGeometryFigureCollection* This,IXpsOMGeometryFigure *geometryFigure) {
    return This->lpVtbl->Append(This,geometryFigure);
}
#endif
#endif

#endif


#endif  /* __IXpsOMGeometryFigureCollection_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IXpsOMGradientStopCollection interface
 */
#ifndef __IXpsOMGradientStopCollection_INTERFACE_DEFINED__
#define __IXpsOMGradientStopCollection_INTERFACE_DEFINED__

DEFINE_GUID(IID_IXpsOMGradientStopCollection, 0xc9174c3a, 0x3cd3, 0x4319, 0xbd,0xa4, 0x11,0xa3,0x93,0x92,0xce,0xef);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("c9174c3a-3cd3-4319-bda4-11a39392ceef")
IXpsOMGradientStopCollection : public IUnknown
{
    virtual HRESULT STDMETHODCALLTYPE GetCount(
        UINT32 *count) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetAt(
        UINT32 index,
        IXpsOMGradientStop **stop) = 0;

    virtual HRESULT STDMETHODCALLTYPE InsertAt(
        UINT32 index,
        IXpsOMGradientStop *stop) = 0;

    virtual HRESULT STDMETHODCALLTYPE RemoveAt(
        UINT32 index) = 0;

    virtual HRESULT STDMETHODCALLTYPE SetAt(
        UINT32 index,
        IXpsOMGradientStop *stop) = 0;

    virtual HRESULT STDMETHODCALLTYPE Append(
        IXpsOMGradientStop *stop) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IXpsOMGradientStopCollection, 0xc9174c3a, 0x3cd3, 0x4319, 0xbd,0xa4, 0x11,0xa3,0x93,0x92,0xce,0xef)
#endif
#else
typedef struct IXpsOMGradientStopCollectionVtbl {
    BEGIN_INTERFACE

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

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

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

    /*** IXpsOMGradientStopCollection methods ***/
    HRESULT (STDMETHODCALLTYPE *GetCount)(
        IXpsOMGradientStopCollection *This,
        UINT32 *count);

    HRESULT (STDMETHODCALLTYPE *GetAt)(
        IXpsOMGradientStopCollection *This,
        UINT32 index,
        IXpsOMGradientStop **stop);

    HRESULT (STDMETHODCALLTYPE *InsertAt)(
        IXpsOMGradientStopCollection *This,
        UINT32 index,
        IXpsOMGradientStop *stop);

    HRESULT (STDMETHODCALLTYPE *RemoveAt)(
        IXpsOMGradientStopCollection *This,
        UINT32 index);

    HRESULT (STDMETHODCALLTYPE *SetAt)(
        IXpsOMGradientStopCollection *This,
        UINT32 index,
        IXpsOMGradientStop *stop);

    HRESULT (STDMETHODCALLTYPE *Append)(
        IXpsOMGradientStopCollection *This,
        IXpsOMGradientStop *stop);

    END_INTERFACE
} IXpsOMGradientStopCollectionVtbl;

interface IXpsOMGradientStopCollection {
    CONST_VTBL IXpsOMGradientStopCollectionVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IXpsOMGradientStopCollection_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IXpsOMGradientStopCollection_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IXpsOMGradientStopCollection_Release(This) (This)->lpVtbl->Release(This)
/*** IXpsOMGradientStopCollection methods ***/
#define IXpsOMGradientStopCollection_GetCount(This,count) (This)->lpVtbl->GetCount(This,count)
#define IXpsOMGradientStopCollection_GetAt(This,index,stop) (This)->lpVtbl->GetAt(This,index,stop)
#define IXpsOMGradientStopCollection_InsertAt(This,index,stop) (This)->lpVtbl->InsertAt(This,index,stop)
#define IXpsOMGradientStopCollection_RemoveAt(This,index) (This)->lpVtbl->RemoveAt(This,index)
#define IXpsOMGradientStopCollection_SetAt(This,index,stop) (This)->lpVtbl->SetAt(This,index,stop)
#define IXpsOMGradientStopCollection_Append(This,stop) (This)->lpVtbl->Append(This,stop)
#else
/*** IUnknown methods ***/
static __WIDL_INLINE HRESULT IXpsOMGradientStopCollection_QueryInterface(IXpsOMGradientStopCollection* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IXpsOMGradientStopCollection_AddRef(IXpsOMGradientStopCollection* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IXpsOMGradientStopCollection_Release(IXpsOMGradientStopCollection* This) {
    return This->lpVtbl->Release(This);
}
/*** IXpsOMGradientStopCollection methods ***/
static __WIDL_INLINE HRESULT IXpsOMGradientStopCollection_GetCount(IXpsOMGradientStopCollection* This,UINT32 *count) {
    return This->lpVtbl->GetCount(This,count);
}
static __WIDL_INLINE HRESULT IXpsOMGradientStopCollection_GetAt(IXpsOMGradientStopCollection* This,UINT32 index,IXpsOMGradientStop **stop) {
    return This->lpVtbl->GetAt(This,index,stop);
}
static __WIDL_INLINE HRESULT IXpsOMGradientStopCollection_InsertAt(IXpsOMGradientStopCollection* This,UINT32 index,IXpsOMGradientStop *stop) {
    return This->lpVtbl->InsertAt(This,index,stop);
}
static __WIDL_INLINE HRESULT IXpsOMGradientStopCollection_RemoveAt(IXpsOMGradientStopCollection* This,UINT32 index) {
    return This->lpVtbl->RemoveAt(This,index);
}
static __WIDL_INLINE HRESULT IXpsOMGradientStopCollection_SetAt(IXpsOMGradientStopCollection* This,UINT32 index,IXpsOMGradientStop *stop) {
    return This->lpVtbl->SetAt(This,index,stop);
}
static __WIDL_INLINE HRESULT IXpsOMGradientStopCollection_Append(IXpsOMGradientStopCollection* This,IXpsOMGradientStop *stop) {
    return This->lpVtbl->Append(This,stop);
}
#endif
#endif

#endif


#endif  /* __IXpsOMGradientStopCollection_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IXpsOMGradientStop interface
 */
#ifndef __IXpsOMGradientStop_INTERFACE_DEFINED__
#define __IXpsOMGradientStop_INTERFACE_DEFINED__

DEFINE_GUID(IID_IXpsOMGradientStop, 0x5cf4f5cc, 0x3969, 0x49b5, 0xa7,0x0a, 0x55,0x50,0xb6,0x18,0xfe,0x49);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("5cf4f5cc-3969-49b5-a70a-5550b618fe49")
IXpsOMGradientStop : public IUnknown
{
    virtual HRESULT STDMETHODCALLTYPE GetOwner(
        IXpsOMGradientBrush **owner) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetOffset(
        FLOAT *offset) = 0;

    virtual HRESULT STDMETHODCALLTYPE SetOffset(
        FLOAT offset) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetColor(
        XPS_COLOR *color,
        IXpsOMColorProfileResource **colorProfile) = 0;

    virtual HRESULT STDMETHODCALLTYPE SetColor(
        const XPS_COLOR *color,
        IXpsOMColorProfileResource *colorProfile) = 0;

    virtual HRESULT STDMETHODCALLTYPE Clone(
        IXpsOMGradientStop **gradientStop) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IXpsOMGradientStop, 0x5cf4f5cc, 0x3969, 0x49b5, 0xa7,0x0a, 0x55,0x50,0xb6,0x18,0xfe,0x49)
#endif
#else
typedef struct IXpsOMGradientStopVtbl {
    BEGIN_INTERFACE

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

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

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

    /*** IXpsOMGradientStop methods ***/
    HRESULT (STDMETHODCALLTYPE *GetOwner)(
        IXpsOMGradientStop *This,
        IXpsOMGradientBrush **owner);

    HRESULT (STDMETHODCALLTYPE *GetOffset)(
        IXpsOMGradientStop *This,
        FLOAT *offset);

    HRESULT (STDMETHODCALLTYPE *SetOffset)(
        IXpsOMGradientStop *This,
        FLOAT offset);

    HRESULT (STDMETHODCALLTYPE *GetColor)(
        IXpsOMGradientStop *This,
        XPS_COLOR *color,
        IXpsOMColorProfileResource **colorProfile);

    HRESULT (STDMETHODCALLTYPE *SetColor)(
        IXpsOMGradientStop *This,
        const XPS_COLOR *color,
        IXpsOMColorProfileResource *colorProfile);

    HRESULT (STDMETHODCALLTYPE *Clone)(
        IXpsOMGradientStop *This,
        IXpsOMGradientStop **gradientStop);

    END_INTERFACE
} IXpsOMGradientStopVtbl;

interface IXpsOMGradientStop {
    CONST_VTBL IXpsOMGradientStopVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IXpsOMGradientStop_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IXpsOMGradientStop_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IXpsOMGradientStop_Release(This) (This)->lpVtbl->Release(This)
/*** IXpsOMGradientStop methods ***/
#define IXpsOMGradientStop_GetOwner(This,owner) (This)->lpVtbl->GetOwner(This,owner)
#define IXpsOMGradientStop_GetOffset(This,offset) (This)->lpVtbl->GetOffset(This,offset)
#define IXpsOMGradientStop_SetOffset(This,offset) (This)->lpVtbl->SetOffset(This,offset)
#define IXpsOMGradientStop_GetColor(This,color,colorProfile) (This)->lpVtbl->GetColor(This,color,colorProfile)
#define IXpsOMGradientStop_SetColor(This,color,colorProfile) (This)->lpVtbl->SetColor(This,color,colorProfile)
#define IXpsOMGradientStop_Clone(This,gradientStop) (This)->lpVtbl->Clone(This,gradientStop)
#else
/*** IUnknown methods ***/
static __WIDL_INLINE HRESULT IXpsOMGradientStop_QueryInterface(IXpsOMGradientStop* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IXpsOMGradientStop_AddRef(IXpsOMGradientStop* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IXpsOMGradientStop_Release(IXpsOMGradientStop* This) {
    return This->lpVtbl->Release(This);
}
/*** IXpsOMGradientStop methods ***/
static __WIDL_INLINE HRESULT IXpsOMGradientStop_GetOwner(IXpsOMGradientStop* This,IXpsOMGradientBrush **owner) {
    return This->lpVtbl->GetOwner(This,owner);
}
static __WIDL_INLINE HRESULT IXpsOMGradientStop_GetOffset(IXpsOMGradientStop* This,FLOAT *offset) {
    return This->lpVtbl->GetOffset(This,offset);
}
static __WIDL_INLINE HRESULT IXpsOMGradientStop_SetOffset(IXpsOMGradientStop* This,FLOAT offset) {
    return This->lpVtbl->SetOffset(This,offset);
}
static __WIDL_INLINE HRESULT IXpsOMGradientStop_GetColor(IXpsOMGradientStop* This,XPS_COLOR *color,IXpsOMColorProfileResource **colorProfile) {
    return This->lpVtbl->GetColor(This,color,colorProfile);
}
static __WIDL_INLINE HRESULT IXpsOMGradientStop_SetColor(IXpsOMGradientStop* This,const XPS_COLOR *color,IXpsOMColorProfileResource *colorProfile) {
    return This->lpVtbl->SetColor(This,color,colorProfile);
}
static __WIDL_INLINE HRESULT IXpsOMGradientStop_Clone(IXpsOMGradientStop* This,IXpsOMGradientStop **gradientStop) {
    return This->lpVtbl->Clone(This,gradientStop);
}
#endif
#endif

#endif


#endif  /* __IXpsOMGradientStop_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IXpsOMPartResources interface
 */
#ifndef __IXpsOMPartResources_INTERFACE_DEFINED__
#define __IXpsOMPartResources_INTERFACE_DEFINED__

DEFINE_GUID(IID_IXpsOMPartResources, 0xf4cf7729, 0x4864, 0x4275, 0x99,0xb3, 0xa8,0x71,0x71,0x63,0xec,0xaf);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("f4cf7729-4864-4275-99b3-a8717163ecaf")
IXpsOMPartResources : public IUnknown
{
    virtual HRESULT STDMETHODCALLTYPE GetFontResources(
        IXpsOMFontResourceCollection **fontResources) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetImageResources(
        IXpsOMImageResourceCollection **imageResources) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetColorProfileResources(
        IXpsOMColorProfileResourceCollection **colorProfileResources) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetRemoteDictionaryResources(
        IXpsOMRemoteDictionaryResourceCollection **dictionaryResources) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IXpsOMPartResources, 0xf4cf7729, 0x4864, 0x4275, 0x99,0xb3, 0xa8,0x71,0x71,0x63,0xec,0xaf)
#endif
#else
typedef struct IXpsOMPartResourcesVtbl {
    BEGIN_INTERFACE

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

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

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

    /*** IXpsOMPartResources methods ***/
    HRESULT (STDMETHODCALLTYPE *GetFontResources)(
        IXpsOMPartResources *This,
        IXpsOMFontResourceCollection **fontResources);

    HRESULT (STDMETHODCALLTYPE *GetImageResources)(
        IXpsOMPartResources *This,
        IXpsOMImageResourceCollection **imageResources);

    HRESULT (STDMETHODCALLTYPE *GetColorProfileResources)(
        IXpsOMPartResources *This,
        IXpsOMColorProfileResourceCollection **colorProfileResources);

    HRESULT (STDMETHODCALLTYPE *GetRemoteDictionaryResources)(
        IXpsOMPartResources *This,
        IXpsOMRemoteDictionaryResourceCollection **dictionaryResources);

    END_INTERFACE
} IXpsOMPartResourcesVtbl;

interface IXpsOMPartResources {
    CONST_VTBL IXpsOMPartResourcesVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IXpsOMPartResources_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IXpsOMPartResources_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IXpsOMPartResources_Release(This) (This)->lpVtbl->Release(This)
/*** IXpsOMPartResources methods ***/
#define IXpsOMPartResources_GetFontResources(This,fontResources) (This)->lpVtbl->GetFontResources(This,fontResources)
#define IXpsOMPartResources_GetImageResources(This,imageResources) (This)->lpVtbl->GetImageResources(This,imageResources)
#define IXpsOMPartResources_GetColorProfileResources(This,colorProfileResources) (This)->lpVtbl->GetColorProfileResources(This,colorProfileResources)
#define IXpsOMPartResources_GetRemoteDictionaryResources(This,dictionaryResources) (This)->lpVtbl->GetRemoteDictionaryResources(This,dictionaryResources)
#else
/*** IUnknown methods ***/
static __WIDL_INLINE HRESULT IXpsOMPartResources_QueryInterface(IXpsOMPartResources* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IXpsOMPartResources_AddRef(IXpsOMPartResources* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IXpsOMPartResources_Release(IXpsOMPartResources* This) {
    return This->lpVtbl->Release(This);
}
/*** IXpsOMPartResources methods ***/
static __WIDL_INLINE HRESULT IXpsOMPartResources_GetFontResources(IXpsOMPartResources* This,IXpsOMFontResourceCollection **fontResources) {
    return This->lpVtbl->GetFontResources(This,fontResources);
}
static __WIDL_INLINE HRESULT IXpsOMPartResources_GetImageResources(IXpsOMPartResources* This,IXpsOMImageResourceCollection **imageResources) {
    return This->lpVtbl->GetImageResources(This,imageResources);
}
static __WIDL_INLINE HRESULT IXpsOMPartResources_GetColorProfileResources(IXpsOMPartResources* This,IXpsOMColorProfileResourceCollection **colorProfileResources) {
    return This->lpVtbl->GetColorProfileResources(This,colorProfileResources);
}
static __WIDL_INLINE HRESULT IXpsOMPartResources_GetRemoteDictionaryResources(IXpsOMPartResources* This,IXpsOMRemoteDictionaryResourceCollection **dictionaryResources) {
    return This->lpVtbl->GetRemoteDictionaryResources(This,dictionaryResources);
}
#endif
#endif

#endif


#endif  /* __IXpsOMPartResources_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IXpsOMFontResourceCollection interface
 */
#ifndef __IXpsOMFontResourceCollection_INTERFACE_DEFINED__
#define __IXpsOMFontResourceCollection_INTERFACE_DEFINED__

DEFINE_GUID(IID_IXpsOMFontResourceCollection, 0x70b4a6bb, 0x88d4, 0x4fa8, 0xaa,0xf9, 0x6d,0x9c,0x59,0x6f,0xdb,0xad);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("70b4a6bb-88d4-4fa8-aaf9-6d9c596fdbad")
IXpsOMFontResourceCollection : public IUnknown
{
    virtual HRESULT STDMETHODCALLTYPE GetCount(
        UINT32 *count) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetAt(
        UINT32 index,
        IXpsOMFontResource **value) = 0;

    virtual HRESULT STDMETHODCALLTYPE SetAt(
        UINT32 index,
        IXpsOMFontResource *value) = 0;

    virtual HRESULT STDMETHODCALLTYPE InsertAt(
        UINT32 index,
        IXpsOMFontResource *value) = 0;

    virtual HRESULT STDMETHODCALLTYPE Append(
        IXpsOMFontResource *value) = 0;

    virtual HRESULT STDMETHODCALLTYPE RemoveAt(
        UINT32 index) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetByPartName(
        IOpcPartUri *partName,
        IXpsOMFontResource **part) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IXpsOMFontResourceCollection, 0x70b4a6bb, 0x88d4, 0x4fa8, 0xaa,0xf9, 0x6d,0x9c,0x59,0x6f,0xdb,0xad)
#endif
#else
typedef struct IXpsOMFontResourceCollectionVtbl {
    BEGIN_INTERFACE

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

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

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

    /*** IXpsOMFontResourceCollection methods ***/
    HRESULT (STDMETHODCALLTYPE *GetCount)(
        IXpsOMFontResourceCollection *This,
        UINT32 *count);

    HRESULT (STDMETHODCALLTYPE *GetAt)(
        IXpsOMFontResourceCollection *This,
        UINT32 index,
        IXpsOMFontResource **value);

    HRESULT (STDMETHODCALLTYPE *SetAt)(
        IXpsOMFontResourceCollection *This,
        UINT32 index,
        IXpsOMFontResource *value);

    HRESULT (STDMETHODCALLTYPE *InsertAt)(
        IXpsOMFontResourceCollection *This,
        UINT32 index,
        IXpsOMFontResource *value);

    HRESULT (STDMETHODCALLTYPE *Append)(
        IXpsOMFontResourceCollection *This,
        IXpsOMFontResource *value);

    HRESULT (STDMETHODCALLTYPE *RemoveAt)(
        IXpsOMFontResourceCollection *This,
        UINT32 index);

    HRESULT (STDMETHODCALLTYPE *GetByPartName)(
        IXpsOMFontResourceCollection *This,
        IOpcPartUri *partName,
        IXpsOMFontResource **part);

    END_INTERFACE
} IXpsOMFontResourceCollectionVtbl;

interface IXpsOMFontResourceCollection {
    CONST_VTBL IXpsOMFontResourceCollectionVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IXpsOMFontResourceCollection_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IXpsOMFontResourceCollection_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IXpsOMFontResourceCollection_Release(This) (This)->lpVtbl->Release(This)
/*** IXpsOMFontResourceCollection methods ***/
#define IXpsOMFontResourceCollection_GetCount(This,count) (This)->lpVtbl->GetCount(This,count)
#define IXpsOMFontResourceCollection_GetAt(This,index,value) (This)->lpVtbl->GetAt(This,index,value)
#define IXpsOMFontResourceCollection_SetAt(This,index,value) (This)->lpVtbl->SetAt(This,index,value)
#define IXpsOMFontResourceCollection_InsertAt(This,index,value) (This)->lpVtbl->InsertAt(This,index,value)
#define IXpsOMFontResourceCollection_Append(This,value) (This)->lpVtbl->Append(This,value)
#define IXpsOMFontResourceCollection_RemoveAt(This,index) (This)->lpVtbl->RemoveAt(This,index)
#define IXpsOMFontResourceCollection_GetByPartName(This,partName,part) (This)->lpVtbl->GetByPartName(This,partName,part)
#else
/*** IUnknown methods ***/
static __WIDL_INLINE HRESULT IXpsOMFontResourceCollection_QueryInterface(IXpsOMFontResourceCollection* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IXpsOMFontResourceCollection_AddRef(IXpsOMFontResourceCollection* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IXpsOMFontResourceCollection_Release(IXpsOMFontResourceCollection* This) {
    return This->lpVtbl->Release(This);
}
/*** IXpsOMFontResourceCollection methods ***/
static __WIDL_INLINE HRESULT IXpsOMFontResourceCollection_GetCount(IXpsOMFontResourceCollection* This,UINT32 *count) {
    return This->lpVtbl->GetCount(This,count);
}
static __WIDL_INLINE HRESULT IXpsOMFontResourceCollection_GetAt(IXpsOMFontResourceCollection* This,UINT32 index,IXpsOMFontResource **value) {
    return This->lpVtbl->GetAt(This,index,value);
}
static __WIDL_INLINE HRESULT IXpsOMFontResourceCollection_SetAt(IXpsOMFontResourceCollection* This,UINT32 index,IXpsOMFontResource *value) {
    return This->lpVtbl->SetAt(This,index,value);
}
static __WIDL_INLINE HRESULT IXpsOMFontResourceCollection_InsertAt(IXpsOMFontResourceCollection* This,UINT32 index,IXpsOMFontResource *value) {
    return This->lpVtbl->InsertAt(This,index,value);
}
static __WIDL_INLINE HRESULT IXpsOMFontResourceCollection_Append(IXpsOMFontResourceCollection* This,IXpsOMFontResource *value) {
    return This->lpVtbl->Append(This,value);
}
static __WIDL_INLINE HRESULT IXpsOMFontResourceCollection_RemoveAt(IXpsOMFontResourceCollection* This,UINT32 index) {
    return This->lpVtbl->RemoveAt(This,index);
}
static __WIDL_INLINE HRESULT IXpsOMFontResourceCollection_GetByPartName(IXpsOMFontResourceCollection* This,IOpcPartUri *partName,IXpsOMFontResource **part) {
    return This->lpVtbl->GetByPartName(This,partName,part);
}
#endif
#endif

#endif


#endif  /* __IXpsOMFontResourceCollection_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IXpsOMImageResourceCollection interface
 */
#ifndef __IXpsOMImageResourceCollection_INTERFACE_DEFINED__
#define __IXpsOMImageResourceCollection_INTERFACE_DEFINED__

DEFINE_GUID(IID_IXpsOMImageResourceCollection, 0x7a4a1a71, 0x9cde, 0x4b71, 0xb3,0x3f, 0x62,0xde,0x84,0x3e,0xab,0xfe);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("7a4a1a71-9cde-4b71-b33f-62de843eabfe")
IXpsOMImageResourceCollection : public IUnknown
{
    virtual HRESULT STDMETHODCALLTYPE GetCount(
        UINT32 *count) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetAt(
        UINT32 index,
        IXpsOMImageResource **object) = 0;

    virtual HRESULT STDMETHODCALLTYPE InsertAt(
        UINT32 index,
        IXpsOMImageResource *object) = 0;

    virtual HRESULT STDMETHODCALLTYPE RemoveAt(
        UINT32 index) = 0;

    virtual HRESULT STDMETHODCALLTYPE SetAt(
        UINT32 index,
        IXpsOMImageResource *object) = 0;

    virtual HRESULT STDMETHODCALLTYPE Append(
        IXpsOMImageResource *object) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetByPartName(
        IOpcPartUri *partName,
        IXpsOMImageResource **part) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IXpsOMImageResourceCollection, 0x7a4a1a71, 0x9cde, 0x4b71, 0xb3,0x3f, 0x62,0xde,0x84,0x3e,0xab,0xfe)
#endif
#else
typedef struct IXpsOMImageResourceCollectionVtbl {
    BEGIN_INTERFACE

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

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

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

    /*** IXpsOMImageResourceCollection methods ***/
    HRESULT (STDMETHODCALLTYPE *GetCount)(
        IXpsOMImageResourceCollection *This,
        UINT32 *count);

    HRESULT (STDMETHODCALLTYPE *GetAt)(
        IXpsOMImageResourceCollection *This,
        UINT32 index,
        IXpsOMImageResource **object);

    HRESULT (STDMETHODCALLTYPE *InsertAt)(
        IXpsOMImageResourceCollection *This,
        UINT32 index,
        IXpsOMImageResource *object);

    HRESULT (STDMETHODCALLTYPE *RemoveAt)(
        IXpsOMImageResourceCollection *This,
        UINT32 index);

    HRESULT (STDMETHODCALLTYPE *SetAt)(
        IXpsOMImageResourceCollection *This,
        UINT32 index,
        IXpsOMImageResource *object);

    HRESULT (STDMETHODCALLTYPE *Append)(
        IXpsOMImageResourceCollection *This,
        IXpsOMImageResource *object);

    HRESULT (STDMETHODCALLTYPE *GetByPartName)(
        IXpsOMImageResourceCollection *This,
        IOpcPartUri *partName,
        IXpsOMImageResource **part);

    END_INTERFACE
} IXpsOMImageResourceCollectionVtbl;

interface IXpsOMImageResourceCollection {
    CONST_VTBL IXpsOMImageResourceCollectionVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IXpsOMImageResourceCollection_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IXpsOMImageResourceCollection_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IXpsOMImageResourceCollection_Release(This) (This)->lpVtbl->Release(This)
/*** IXpsOMImageResourceCollection methods ***/
#define IXpsOMImageResourceCollection_GetCount(This,count) (This)->lpVtbl->GetCount(This,count)
#define IXpsOMImageResourceCollection_GetAt(This,index,object) (This)->lpVtbl->GetAt(This,index,object)
#define IXpsOMImageResourceCollection_InsertAt(This,index,object) (This)->lpVtbl->InsertAt(This,index,object)
#define IXpsOMImageResourceCollection_RemoveAt(This,index) (This)->lpVtbl->RemoveAt(This,index)
#define IXpsOMImageResourceCollection_SetAt(This,index,object) (This)->lpVtbl->SetAt(This,index,object)
#define IXpsOMImageResourceCollection_Append(This,object) (This)->lpVtbl->Append(This,object)
#define IXpsOMImageResourceCollection_GetByPartName(This,partName,part) (This)->lpVtbl->GetByPartName(This,partName,part)
#else
/*** IUnknown methods ***/
static __WIDL_INLINE HRESULT IXpsOMImageResourceCollection_QueryInterface(IXpsOMImageResourceCollection* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IXpsOMImageResourceCollection_AddRef(IXpsOMImageResourceCollection* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IXpsOMImageResourceCollection_Release(IXpsOMImageResourceCollection* This) {
    return This->lpVtbl->Release(This);
}
/*** IXpsOMImageResourceCollection methods ***/
static __WIDL_INLINE HRESULT IXpsOMImageResourceCollection_GetCount(IXpsOMImageResourceCollection* This,UINT32 *count) {
    return This->lpVtbl->GetCount(This,count);
}
static __WIDL_INLINE HRESULT IXpsOMImageResourceCollection_GetAt(IXpsOMImageResourceCollection* This,UINT32 index,IXpsOMImageResource **object) {
    return This->lpVtbl->GetAt(This,index,object);
}
static __WIDL_INLINE HRESULT IXpsOMImageResourceCollection_InsertAt(IXpsOMImageResourceCollection* This,UINT32 index,IXpsOMImageResource *object) {
    return This->lpVtbl->InsertAt(This,index,object);
}
static __WIDL_INLINE HRESULT IXpsOMImageResourceCollection_RemoveAt(IXpsOMImageResourceCollection* This,UINT32 index) {
    return This->lpVtbl->RemoveAt(This,index);
}
static __WIDL_INLINE HRESULT IXpsOMImageResourceCollection_SetAt(IXpsOMImageResourceCollection* This,UINT32 index,IXpsOMImageResource *object) {
    return This->lpVtbl->SetAt(This,index,object);
}
static __WIDL_INLINE HRESULT IXpsOMImageResourceCollection_Append(IXpsOMImageResourceCollection* This,IXpsOMImageResource *object) {
    return This->lpVtbl->Append(This,object);
}
static __WIDL_INLINE HRESULT IXpsOMImageResourceCollection_GetByPartName(IXpsOMImageResourceCollection* This,IOpcPartUri *partName,IXpsOMImageResource **part) {
    return This->lpVtbl->GetByPartName(This,partName,part);
}
#endif
#endif

#endif


#endif  /* __IXpsOMImageResourceCollection_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IXpsOMColorProfileResourceCollection interface
 */
#ifndef __IXpsOMColorProfileResourceCollection_INTERFACE_DEFINED__
#define __IXpsOMColorProfileResourceCollection_INTERFACE_DEFINED__

DEFINE_GUID(IID_IXpsOMColorProfileResourceCollection, 0x12759630, 0x5fba, 0x4283, 0x8f,0x7d, 0xcc,0xa8,0x49,0x80,0x9e,0xdb);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("12759630-5fba-4283-8f7d-cca849809edb")
IXpsOMColorProfileResourceCollection : public IUnknown
{
    virtual HRESULT STDMETHODCALLTYPE GetCount(
        UINT32 *count) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetAt(
        UINT32 index,
        IXpsOMColorProfileResource **object) = 0;

    virtual HRESULT STDMETHODCALLTYPE InsertAt(
        UINT32 index,
        IXpsOMColorProfileResource *object) = 0;

    virtual HRESULT STDMETHODCALLTYPE RemoveAt(
        UINT32 index) = 0;

    virtual HRESULT STDMETHODCALLTYPE SetAt(
        UINT32 index,
        IXpsOMColorProfileResource *object) = 0;

    virtual HRESULT STDMETHODCALLTYPE Append(
        IXpsOMColorProfileResource *object) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetByPartName(
        IOpcPartUri *partName,
        IXpsOMColorProfileResource **part) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IXpsOMColorProfileResourceCollection, 0x12759630, 0x5fba, 0x4283, 0x8f,0x7d, 0xcc,0xa8,0x49,0x80,0x9e,0xdb)
#endif
#else
typedef struct IXpsOMColorProfileResourceCollectionVtbl {
    BEGIN_INTERFACE

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

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

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

    /*** IXpsOMColorProfileResourceCollection methods ***/
    HRESULT (STDMETHODCALLTYPE *GetCount)(
        IXpsOMColorProfileResourceCollection *This,
        UINT32 *count);

    HRESULT (STDMETHODCALLTYPE *GetAt)(
        IXpsOMColorProfileResourceCollection *This,
        UINT32 index,
        IXpsOMColorProfileResource **object);

    HRESULT (STDMETHODCALLTYPE *InsertAt)(
        IXpsOMColorProfileResourceCollection *This,
        UINT32 index,
        IXpsOMColorProfileResource *object);

    HRESULT (STDMETHODCALLTYPE *RemoveAt)(
        IXpsOMColorProfileResourceCollection *This,
        UINT32 index);

    HRESULT (STDMETHODCALLTYPE *SetAt)(
        IXpsOMColorProfileResourceCollection *This,
        UINT32 index,
        IXpsOMColorProfileResource *object);

    HRESULT (STDMETHODCALLTYPE *Append)(
        IXpsOMColorProfileResourceCollection *This,
        IXpsOMColorProfileResource *object);

    HRESULT (STDMETHODCALLTYPE *GetByPartName)(
        IXpsOMColorProfileResourceCollection *This,
        IOpcPartUri *partName,
        IXpsOMColorProfileResource **part);

    END_INTERFACE
} IXpsOMColorProfileResourceCollectionVtbl;

interface IXpsOMColorProfileResourceCollection {
    CONST_VTBL IXpsOMColorProfileResourceCollectionVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IXpsOMColorProfileResourceCollection_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IXpsOMColorProfileResourceCollection_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IXpsOMColorProfileResourceCollection_Release(This) (This)->lpVtbl->Release(This)
/*** IXpsOMColorProfileResourceCollection methods ***/
#define IXpsOMColorProfileResourceCollection_GetCount(This,count) (This)->lpVtbl->GetCount(This,count)
#define IXpsOMColorProfileResourceCollection_GetAt(This,index,object) (This)->lpVtbl->GetAt(This,index,object)
#define IXpsOMColorProfileResourceCollection_InsertAt(This,index,object) (This)->lpVtbl->InsertAt(This,index,object)
#define IXpsOMColorProfileResourceCollection_RemoveAt(This,index) (This)->lpVtbl->RemoveAt(This,index)
#define IXpsOMColorProfileResourceCollection_SetAt(This,index,object) (This)->lpVtbl->SetAt(This,index,object)
#define IXpsOMColorProfileResourceCollection_Append(This,object) (This)->lpVtbl->Append(This,object)
#define IXpsOMColorProfileResourceCollection_GetByPartName(This,partName,part) (This)->lpVtbl->GetByPartName(This,partName,part)
#else
/*** IUnknown methods ***/
static __WIDL_INLINE HRESULT IXpsOMColorProfileResourceCollection_QueryInterface(IXpsOMColorProfileResourceCollection* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IXpsOMColorProfileResourceCollection_AddRef(IXpsOMColorProfileResourceCollection* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IXpsOMColorProfileResourceCollection_Release(IXpsOMColorProfileResourceCollection* This) {
    return This->lpVtbl->Release(This);
}
/*** IXpsOMColorProfileResourceCollection methods ***/
static __WIDL_INLINE HRESULT IXpsOMColorProfileResourceCollection_GetCount(IXpsOMColorProfileResourceCollection* This,UINT32 *count) {
    return This->lpVtbl->GetCount(This,count);
}
static __WIDL_INLINE HRESULT IXpsOMColorProfileResourceCollection_GetAt(IXpsOMColorProfileResourceCollection* This,UINT32 index,IXpsOMColorProfileResource **object) {
    return This->lpVtbl->GetAt(This,index,object);
}
static __WIDL_INLINE HRESULT IXpsOMColorProfileResourceCollection_InsertAt(IXpsOMColorProfileResourceCollection* This,UINT32 index,IXpsOMColorProfileResource *object) {
    return This->lpVtbl->InsertAt(This,index,object);
}
static __WIDL_INLINE HRESULT IXpsOMColorProfileResourceCollection_RemoveAt(IXpsOMColorProfileResourceCollection* This,UINT32 index) {
    return This->lpVtbl->RemoveAt(This,index);
}
static __WIDL_INLINE HRESULT IXpsOMColorProfileResourceCollection_SetAt(IXpsOMColorProfileResourceCollection* This,UINT32 index,IXpsOMColorProfileResource *object) {
    return This->lpVtbl->SetAt(This,index,object);
}
static __WIDL_INLINE HRESULT IXpsOMColorProfileResourceCollection_Append(IXpsOMColorProfileResourceCollection* This,IXpsOMColorProfileResource *object) {
    return This->lpVtbl->Append(This,object);
}
static __WIDL_INLINE HRESULT IXpsOMColorProfileResourceCollection_GetByPartName(IXpsOMColorProfileResourceCollection* This,IOpcPartUri *partName,IXpsOMColorProfileResource **part) {
    return This->lpVtbl->GetByPartName(This,partName,part);
}
#endif
#endif

#endif


#endif  /* __IXpsOMColorProfileResourceCollection_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IXpsOMRemoteDictionaryResourceCollection interface
 */
#ifndef __IXpsOMRemoteDictionaryResourceCollection_INTERFACE_DEFINED__
#define __IXpsOMRemoteDictionaryResourceCollection_INTERFACE_DEFINED__

DEFINE_GUID(IID_IXpsOMRemoteDictionaryResourceCollection, 0x5c38db61, 0x7fec, 0x464a, 0x87,0xbd, 0x41,0xe3,0xbe,0xf0,0x18,0xbe);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("5c38db61-7fec-464a-87bd-41e3bef018be")
IXpsOMRemoteDictionaryResourceCollection : public IUnknown
{
    virtual HRESULT STDMETHODCALLTYPE GetCount(
        UINT32 *count) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetAt(
        UINT32 index,
        IXpsOMRemoteDictionaryResource **object) = 0;

    virtual HRESULT STDMETHODCALLTYPE InsertAt(
        UINT32 index,
        IXpsOMRemoteDictionaryResource *object) = 0;

    virtual HRESULT STDMETHODCALLTYPE RemoveAt(
        UINT32 index) = 0;

    virtual HRESULT STDMETHODCALLTYPE SetAt(
        UINT32 index,
        IXpsOMRemoteDictionaryResource *object) = 0;

    virtual HRESULT STDMETHODCALLTYPE Append(
        IXpsOMRemoteDictionaryResource *object) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetByPartName(
        IOpcPartUri *partName,
        IXpsOMRemoteDictionaryResource **remoteDictionaryResource) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IXpsOMRemoteDictionaryResourceCollection, 0x5c38db61, 0x7fec, 0x464a, 0x87,0xbd, 0x41,0xe3,0xbe,0xf0,0x18,0xbe)
#endif
#else
typedef struct IXpsOMRemoteDictionaryResourceCollectionVtbl {
    BEGIN_INTERFACE

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

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

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

    /*** IXpsOMRemoteDictionaryResourceCollection methods ***/
    HRESULT (STDMETHODCALLTYPE *GetCount)(
        IXpsOMRemoteDictionaryResourceCollection *This,
        UINT32 *count);

    HRESULT (STDMETHODCALLTYPE *GetAt)(
        IXpsOMRemoteDictionaryResourceCollection *This,
        UINT32 index,
        IXpsOMRemoteDictionaryResource **object);

    HRESULT (STDMETHODCALLTYPE *InsertAt)(
        IXpsOMRemoteDictionaryResourceCollection *This,
        UINT32 index,
        IXpsOMRemoteDictionaryResource *object);

    HRESULT (STDMETHODCALLTYPE *RemoveAt)(
        IXpsOMRemoteDictionaryResourceCollection *This,
        UINT32 index);

    HRESULT (STDMETHODCALLTYPE *SetAt)(
        IXpsOMRemoteDictionaryResourceCollection *This,
        UINT32 index,
        IXpsOMRemoteDictionaryResource *object);

    HRESULT (STDMETHODCALLTYPE *Append)(
        IXpsOMRemoteDictionaryResourceCollection *This,
        IXpsOMRemoteDictionaryResource *object);

    HRESULT (STDMETHODCALLTYPE *GetByPartName)(
        IXpsOMRemoteDictionaryResourceCollection *This,
        IOpcPartUri *partName,
        IXpsOMRemoteDictionaryResource **remoteDictionaryResource);

    END_INTERFACE
} IXpsOMRemoteDictionaryResourceCollectionVtbl;

interface IXpsOMRemoteDictionaryResourceCollection {
    CONST_VTBL IXpsOMRemoteDictionaryResourceCollectionVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IXpsOMRemoteDictionaryResourceCollection_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IXpsOMRemoteDictionaryResourceCollection_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IXpsOMRemoteDictionaryResourceCollection_Release(This) (This)->lpVtbl->Release(This)
/*** IXpsOMRemoteDictionaryResourceCollection methods ***/
#define IXpsOMRemoteDictionaryResourceCollection_GetCount(This,count) (This)->lpVtbl->GetCount(This,count)
#define IXpsOMRemoteDictionaryResourceCollection_GetAt(This,index,object) (This)->lpVtbl->GetAt(This,index,object)
#define IXpsOMRemoteDictionaryResourceCollection_InsertAt(This,index,object) (This)->lpVtbl->InsertAt(This,index,object)
#define IXpsOMRemoteDictionaryResourceCollection_RemoveAt(This,index) (This)->lpVtbl->RemoveAt(This,index)
#define IXpsOMRemoteDictionaryResourceCollection_SetAt(This,index,object) (This)->lpVtbl->SetAt(This,index,object)
#define IXpsOMRemoteDictionaryResourceCollection_Append(This,object) (This)->lpVtbl->Append(This,object)
#define IXpsOMRemoteDictionaryResourceCollection_GetByPartName(This,partName,remoteDictionaryResource) (This)->lpVtbl->GetByPartName(This,partName,remoteDictionaryResource)
#else
/*** IUnknown methods ***/
static __WIDL_INLINE HRESULT IXpsOMRemoteDictionaryResourceCollection_QueryInterface(IXpsOMRemoteDictionaryResourceCollection* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IXpsOMRemoteDictionaryResourceCollection_AddRef(IXpsOMRemoteDictionaryResourceCollection* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IXpsOMRemoteDictionaryResourceCollection_Release(IXpsOMRemoteDictionaryResourceCollection* This) {
    return This->lpVtbl->Release(This);
}
/*** IXpsOMRemoteDictionaryResourceCollection methods ***/
static __WIDL_INLINE HRESULT IXpsOMRemoteDictionaryResourceCollection_GetCount(IXpsOMRemoteDictionaryResourceCollection* This,UINT32 *count) {
    return This->lpVtbl->GetCount(This,count);
}
static __WIDL_INLINE HRESULT IXpsOMRemoteDictionaryResourceCollection_GetAt(IXpsOMRemoteDictionaryResourceCollection* This,UINT32 index,IXpsOMRemoteDictionaryResource **object) {
    return This->lpVtbl->GetAt(This,index,object);
}
static __WIDL_INLINE HRESULT IXpsOMRemoteDictionaryResourceCollection_InsertAt(IXpsOMRemoteDictionaryResourceCollection* This,UINT32 index,IXpsOMRemoteDictionaryResource *object) {
    return This->lpVtbl->InsertAt(This,index,object);
}
static __WIDL_INLINE HRESULT IXpsOMRemoteDictionaryResourceCollection_RemoveAt(IXpsOMRemoteDictionaryResourceCollection* This,UINT32 index) {
    return This->lpVtbl->RemoveAt(This,index);
}
static __WIDL_INLINE HRESULT IXpsOMRemoteDictionaryResourceCollection_SetAt(IXpsOMRemoteDictionaryResourceCollection* This,UINT32 index,IXpsOMRemoteDictionaryResource *object) {
    return This->lpVtbl->SetAt(This,index,object);
}
static __WIDL_INLINE HRESULT IXpsOMRemoteDictionaryResourceCollection_Append(IXpsOMRemoteDictionaryResourceCollection* This,IXpsOMRemoteDictionaryResource *object) {
    return This->lpVtbl->Append(This,object);
}
static __WIDL_INLINE HRESULT IXpsOMRemoteDictionaryResourceCollection_GetByPartName(IXpsOMRemoteDictionaryResourceCollection* This,IOpcPartUri *partName,IXpsOMRemoteDictionaryResource **remoteDictionaryResource) {
    return This->lpVtbl->GetByPartName(This,partName,remoteDictionaryResource);
}
#endif
#endif

#endif


#endif  /* __IXpsOMRemoteDictionaryResourceCollection_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IXpsOMSignatureBlockResourceCollection interface
 */
#ifndef __IXpsOMSignatureBlockResourceCollection_INTERFACE_DEFINED__
#define __IXpsOMSignatureBlockResourceCollection_INTERFACE_DEFINED__

DEFINE_GUID(IID_IXpsOMSignatureBlockResourceCollection, 0xab8f5d8e, 0x351b, 0x4d33, 0xaa,0xed, 0xfa,0x56,0xf0,0x02,0x29,0x31);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("ab8f5d8e-351b-4d33-aaed-fa56f0022931")
IXpsOMSignatureBlockResourceCollection : public IUnknown
{
    virtual HRESULT STDMETHODCALLTYPE GetCount(
        UINT32 *count) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetAt(
        UINT32 index,
        IXpsOMSignatureBlockResource **signatureBlockResource) = 0;

    virtual HRESULT STDMETHODCALLTYPE InsertAt(
        UINT32 index,
        IXpsOMSignatureBlockResource *signatureBlockResource) = 0;

    virtual HRESULT STDMETHODCALLTYPE RemoveAt(
        UINT32 index) = 0;

    virtual HRESULT STDMETHODCALLTYPE SetAt(
        UINT32 index,
        IXpsOMSignatureBlockResource *signatureBlockResource) = 0;

    virtual HRESULT STDMETHODCALLTYPE Append(
        IXpsOMSignatureBlockResource *signatureBlockResource) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetByPartName(
        IOpcPartUri *partName,
        IXpsOMSignatureBlockResource **signatureBlockResource) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IXpsOMSignatureBlockResourceCollection, 0xab8f5d8e, 0x351b, 0x4d33, 0xaa,0xed, 0xfa,0x56,0xf0,0x02,0x29,0x31)
#endif
#else
typedef struct IXpsOMSignatureBlockResourceCollectionVtbl {
    BEGIN_INTERFACE

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

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

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

    /*** IXpsOMSignatureBlockResourceCollection methods ***/
    HRESULT (STDMETHODCALLTYPE *GetCount)(
        IXpsOMSignatureBlockResourceCollection *This,
        UINT32 *count);

    HRESULT (STDMETHODCALLTYPE *GetAt)(
        IXpsOMSignatureBlockResourceCollection *This,
        UINT32 index,
        IXpsOMSignatureBlockResource **signatureBlockResource);

    HRESULT (STDMETHODCALLTYPE *InsertAt)(
        IXpsOMSignatureBlockResourceCollection *This,
        UINT32 index,
        IXpsOMSignatureBlockResource *signatureBlockResource);

    HRESULT (STDMETHODCALLTYPE *RemoveAt)(
        IXpsOMSignatureBlockResourceCollection *This,
        UINT32 index);

    HRESULT (STDMETHODCALLTYPE *SetAt)(
        IXpsOMSignatureBlockResourceCollection *This,
        UINT32 index,
        IXpsOMSignatureBlockResource *signatureBlockResource);

    HRESULT (STDMETHODCALLTYPE *Append)(
        IXpsOMSignatureBlockResourceCollection *This,
        IXpsOMSignatureBlockResource *signatureBlockResource);

    HRESULT (STDMETHODCALLTYPE *GetByPartName)(
        IXpsOMSignatureBlockResourceCollection *This,
        IOpcPartUri *partName,
        IXpsOMSignatureBlockResource **signatureBlockResource);

    END_INTERFACE
} IXpsOMSignatureBlockResourceCollectionVtbl;

interface IXpsOMSignatureBlockResourceCollection {
    CONST_VTBL IXpsOMSignatureBlockResourceCollectionVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IXpsOMSignatureBlockResourceCollection_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IXpsOMSignatureBlockResourceCollection_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IXpsOMSignatureBlockResourceCollection_Release(This) (This)->lpVtbl->Release(This)
/*** IXpsOMSignatureBlockResourceCollection methods ***/
#define IXpsOMSignatureBlockResourceCollection_GetCount(This,count) (This)->lpVtbl->GetCount(This,count)
#define IXpsOMSignatureBlockResourceCollection_GetAt(This,index,signatureBlockResource) (This)->lpVtbl->GetAt(This,index,signatureBlockResource)
#define IXpsOMSignatureBlockResourceCollection_InsertAt(This,index,signatureBlockResource) (This)->lpVtbl->InsertAt(This,index,signatureBlockResource)
#define IXpsOMSignatureBlockResourceCollection_RemoveAt(This,index) (This)->lpVtbl->RemoveAt(This,index)
#define IXpsOMSignatureBlockResourceCollection_SetAt(This,index,signatureBlockResource) (This)->lpVtbl->SetAt(This,index,signatureBlockResource)
#define IXpsOMSignatureBlockResourceCollection_Append(This,signatureBlockResource) (This)->lpVtbl->Append(This,signatureBlockResource)
#define IXpsOMSignatureBlockResourceCollection_GetByPartName(This,partName,signatureBlockResource) (This)->lpVtbl->GetByPartName(This,partName,signatureBlockResource)
#else
/*** IUnknown methods ***/
static __WIDL_INLINE HRESULT IXpsOMSignatureBlockResourceCollection_QueryInterface(IXpsOMSignatureBlockResourceCollection* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IXpsOMSignatureBlockResourceCollection_AddRef(IXpsOMSignatureBlockResourceCollection* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IXpsOMSignatureBlockResourceCollection_Release(IXpsOMSignatureBlockResourceCollection* This) {
    return This->lpVtbl->Release(This);
}
/*** IXpsOMSignatureBlockResourceCollection methods ***/
static __WIDL_INLINE HRESULT IXpsOMSignatureBlockResourceCollection_GetCount(IXpsOMSignatureBlockResourceCollection* This,UINT32 *count) {
    return This->lpVtbl->GetCount(This,count);
}
static __WIDL_INLINE HRESULT IXpsOMSignatureBlockResourceCollection_GetAt(IXpsOMSignatureBlockResourceCollection* This,UINT32 index,IXpsOMSignatureBlockResource **signatureBlockResource) {
    return This->lpVtbl->GetAt(This,index,signatureBlockResource);
}
static __WIDL_INLINE HRESULT IXpsOMSignatureBlockResourceCollection_InsertAt(IXpsOMSignatureBlockResourceCollection* This,UINT32 index,IXpsOMSignatureBlockResource *signatureBlockResource) {
    return This->lpVtbl->InsertAt(This,index,signatureBlockResource);
}
static __WIDL_INLINE HRESULT IXpsOMSignatureBlockResourceCollection_RemoveAt(IXpsOMSignatureBlockResourceCollection* This,UINT32 index) {
    return This->lpVtbl->RemoveAt(This,index);
}
static __WIDL_INLINE HRESULT IXpsOMSignatureBlockResourceCollection_SetAt(IXpsOMSignatureBlockResourceCollection* This,UINT32 index,IXpsOMSignatureBlockResource *signatureBlockResource) {
    return This->lpVtbl->SetAt(This,index,signatureBlockResource);
}
static __WIDL_INLINE HRESULT IXpsOMSignatureBlockResourceCollection_Append(IXpsOMSignatureBlockResourceCollection* This,IXpsOMSignatureBlockResource *signatureBlockResource) {
    return This->lpVtbl->Append(This,signatureBlockResource);
}
static __WIDL_INLINE HRESULT IXpsOMSignatureBlockResourceCollection_GetByPartName(IXpsOMSignatureBlockResourceCollection* This,IOpcPartUri *partName,IXpsOMSignatureBlockResource **signatureBlockResource) {
    return This->lpVtbl->GetByPartName(This,partName,signatureBlockResource);
}
#endif
#endif

#endif


#endif  /* __IXpsOMSignatureBlockResourceCollection_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IXpsOMVisualCollection interface
 */
#ifndef __IXpsOMVisualCollection_INTERFACE_DEFINED__
#define __IXpsOMVisualCollection_INTERFACE_DEFINED__

DEFINE_GUID(IID_IXpsOMVisualCollection, 0x94d8abde, 0xab91, 0x46a8, 0x82,0xb7, 0xf5,0xb0,0x5e,0xf0,0x1a,0x96);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("94d8abde-ab91-46a8-82b7-f5b05ef01a96")
IXpsOMVisualCollection : public IUnknown
{
    virtual HRESULT STDMETHODCALLTYPE GetCount(
        UINT32 *count) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetAt(
        UINT32 index,
        IXpsOMVisual **object) = 0;

    virtual HRESULT STDMETHODCALLTYPE InsertAt(
        UINT32 index,
        IXpsOMVisual *object) = 0;

    virtual HRESULT STDMETHODCALLTYPE RemoveAt(
        UINT32 index) = 0;

    virtual HRESULT STDMETHODCALLTYPE SetAt(
        UINT32 index,
        IXpsOMVisual *object) = 0;

    virtual HRESULT STDMETHODCALLTYPE Append(
        IXpsOMVisual *object) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IXpsOMVisualCollection, 0x94d8abde, 0xab91, 0x46a8, 0x82,0xb7, 0xf5,0xb0,0x5e,0xf0,0x1a,0x96)
#endif
#else
typedef struct IXpsOMVisualCollectionVtbl {
    BEGIN_INTERFACE

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

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

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

    /*** IXpsOMVisualCollection methods ***/
    HRESULT (STDMETHODCALLTYPE *GetCount)(
        IXpsOMVisualCollection *This,
        UINT32 *count);

    HRESULT (STDMETHODCALLTYPE *GetAt)(
        IXpsOMVisualCollection *This,
        UINT32 index,
        IXpsOMVisual **object);

    HRESULT (STDMETHODCALLTYPE *InsertAt)(
        IXpsOMVisualCollection *This,
        UINT32 index,
        IXpsOMVisual *object);

    HRESULT (STDMETHODCALLTYPE *RemoveAt)(
        IXpsOMVisualCollection *This,
        UINT32 index);

    HRESULT (STDMETHODCALLTYPE *SetAt)(
        IXpsOMVisualCollection *This,
        UINT32 index,
        IXpsOMVisual *object);

    HRESULT (STDMETHODCALLTYPE *Append)(
        IXpsOMVisualCollection *This,
        IXpsOMVisual *object);

    END_INTERFACE
} IXpsOMVisualCollectionVtbl;

interface IXpsOMVisualCollection {
    CONST_VTBL IXpsOMVisualCollectionVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IXpsOMVisualCollection_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IXpsOMVisualCollection_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IXpsOMVisualCollection_Release(This) (This)->lpVtbl->Release(This)
/*** IXpsOMVisualCollection methods ***/
#define IXpsOMVisualCollection_GetCount(This,count) (This)->lpVtbl->GetCount(This,count)
#define IXpsOMVisualCollection_GetAt(This,index,object) (This)->lpVtbl->GetAt(This,index,object)
#define IXpsOMVisualCollection_InsertAt(This,index,object) (This)->lpVtbl->InsertAt(This,index,object)
#define IXpsOMVisualCollection_RemoveAt(This,index) (This)->lpVtbl->RemoveAt(This,index)
#define IXpsOMVisualCollection_SetAt(This,index,object) (This)->lpVtbl->SetAt(This,index,object)
#define IXpsOMVisualCollection_Append(This,object) (This)->lpVtbl->Append(This,object)
#else
/*** IUnknown methods ***/
static __WIDL_INLINE HRESULT IXpsOMVisualCollection_QueryInterface(IXpsOMVisualCollection* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IXpsOMVisualCollection_AddRef(IXpsOMVisualCollection* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IXpsOMVisualCollection_Release(IXpsOMVisualCollection* This) {
    return This->lpVtbl->Release(This);
}
/*** IXpsOMVisualCollection methods ***/
static __WIDL_INLINE HRESULT IXpsOMVisualCollection_GetCount(IXpsOMVisualCollection* This,UINT32 *count) {
    return This->lpVtbl->GetCount(This,count);
}
static __WIDL_INLINE HRESULT IXpsOMVisualCollection_GetAt(IXpsOMVisualCollection* This,UINT32 index,IXpsOMVisual **object) {
    return This->lpVtbl->GetAt(This,index,object);
}
static __WIDL_INLINE HRESULT IXpsOMVisualCollection_InsertAt(IXpsOMVisualCollection* This,UINT32 index,IXpsOMVisual *object) {
    return This->lpVtbl->InsertAt(This,index,object);
}
static __WIDL_INLINE HRESULT IXpsOMVisualCollection_RemoveAt(IXpsOMVisualCollection* This,UINT32 index) {
    return This->lpVtbl->RemoveAt(This,index);
}
static __WIDL_INLINE HRESULT IXpsOMVisualCollection_SetAt(IXpsOMVisualCollection* This,UINT32 index,IXpsOMVisual *object) {
    return This->lpVtbl->SetAt(This,index,object);
}
static __WIDL_INLINE HRESULT IXpsOMVisualCollection_Append(IXpsOMVisualCollection* This,IXpsOMVisual *object) {
    return This->lpVtbl->Append(This,object);
}
#endif
#endif

#endif


#endif  /* __IXpsOMVisualCollection_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IXpsOMDictionary interface
 */
#ifndef __IXpsOMDictionary_INTERFACE_DEFINED__
#define __IXpsOMDictionary_INTERFACE_DEFINED__

DEFINE_GUID(IID_IXpsOMDictionary, 0x897c86b8, 0x8eaf, 0x4ae3, 0xbd,0xde, 0x56,0x41,0x9f,0xcf,0x42,0x36);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("897c86b8-8eaf-4ae3-bdde-56419fcf4236")
IXpsOMDictionary : public IUnknown
{
    virtual HRESULT STDMETHODCALLTYPE GetOwner(
        IUnknown **owner) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetCount(
        UINT32 *count) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetAt(
        UINT32 index,
        LPWSTR *key,
        IXpsOMShareable **entry) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetByKey(
        LPCWSTR key,
        IXpsOMShareable *beforeEntry,
        IXpsOMShareable **entry) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetIndex(
        IXpsOMShareable *entry,
        UINT32 *index) = 0;

    virtual HRESULT STDMETHODCALLTYPE Append(
        LPCWSTR key,
        IXpsOMShareable *entry) = 0;

    virtual HRESULT STDMETHODCALLTYPE InsertAt(
        UINT32 index,
        LPCWSTR key,
        IXpsOMShareable *entry) = 0;

    virtual HRESULT STDMETHODCALLTYPE RemoveAt(
        UINT32 index) = 0;

    virtual HRESULT STDMETHODCALLTYPE SetAt(
        UINT32 index,
        LPCWSTR key,
        IXpsOMShareable *entry) = 0;

    virtual HRESULT STDMETHODCALLTYPE Clone(
        IXpsOMDictionary **dictionary) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IXpsOMDictionary, 0x897c86b8, 0x8eaf, 0x4ae3, 0xbd,0xde, 0x56,0x41,0x9f,0xcf,0x42,0x36)
#endif
#else
typedef struct IXpsOMDictionaryVtbl {
    BEGIN_INTERFACE

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

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

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

    /*** IXpsOMDictionary methods ***/
    HRESULT (STDMETHODCALLTYPE *GetOwner)(
        IXpsOMDictionary *This,
        IUnknown **owner);

    HRESULT (STDMETHODCALLTYPE *GetCount)(
        IXpsOMDictionary *This,
        UINT32 *count);

    HRESULT (STDMETHODCALLTYPE *GetAt)(
        IXpsOMDictionary *This,
        UINT32 index,
        LPWSTR *key,
        IXpsOMShareable **entry);

    HRESULT (STDMETHODCALLTYPE *GetByKey)(
        IXpsOMDictionary *This,
        LPCWSTR key,
        IXpsOMShareable *beforeEntry,
        IXpsOMShareable **entry);

    HRESULT (STDMETHODCALLTYPE *GetIndex)(
        IXpsOMDictionary *This,
        IXpsOMShareable *entry,
        UINT32 *index);

    HRESULT (STDMETHODCALLTYPE *Append)(
        IXpsOMDictionary *This,
        LPCWSTR key,
        IXpsOMShareable *entry);

    HRESULT (STDMETHODCALLTYPE *InsertAt)(
        IXpsOMDictionary *This,
        UINT32 index,
        LPCWSTR key,
        IXpsOMShareable *entry);

    HRESULT (STDMETHODCALLTYPE *RemoveAt)(
        IXpsOMDictionary *This,
        UINT32 index);

    HRESULT (STDMETHODCALLTYPE *SetAt)(
        IXpsOMDictionary *This,
        UINT32 index,
        LPCWSTR key,
        IXpsOMShareable *entry);

    HRESULT (STDMETHODCALLTYPE *Clone)(
        IXpsOMDictionary *This,
        IXpsOMDictionary **dictionary);

    END_INTERFACE
} IXpsOMDictionaryVtbl;

interface IXpsOMDictionary {
    CONST_VTBL IXpsOMDictionaryVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IXpsOMDictionary_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IXpsOMDictionary_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IXpsOMDictionary_Release(This) (This)->lpVtbl->Release(This)
/*** IXpsOMDictionary methods ***/
#define IXpsOMDictionary_GetOwner(This,owner) (This)->lpVtbl->GetOwner(This,owner)
#define IXpsOMDictionary_GetCount(This,count) (This)->lpVtbl->GetCount(This,count)
#define IXpsOMDictionary_GetAt(This,index,key,entry) (This)->lpVtbl->GetAt(This,index,key,entry)
#define IXpsOMDictionary_GetByKey(This,key,beforeEntry,entry) (This)->lpVtbl->GetByKey(This,key,beforeEntry,entry)
#define IXpsOMDictionary_GetIndex(This,entry,index) (This)->lpVtbl->GetIndex(This,entry,index)
#define IXpsOMDictionary_Append(This,key,entry) (This)->lpVtbl->Append(This,key,entry)
#define IXpsOMDictionary_InsertAt(This,index,key,entry) (This)->lpVtbl->InsertAt(This,index,key,entry)
#define IXpsOMDictionary_RemoveAt(This,index) (This)->lpVtbl->RemoveAt(This,index)
#define IXpsOMDictionary_SetAt(This,index,key,entry) (This)->lpVtbl->SetAt(This,index,key,entry)
#define IXpsOMDictionary_Clone(This,dictionary) (This)->lpVtbl->Clone(This,dictionary)
#else
/*** IUnknown methods ***/
static __WIDL_INLINE HRESULT IXpsOMDictionary_QueryInterface(IXpsOMDictionary* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IXpsOMDictionary_AddRef(IXpsOMDictionary* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IXpsOMDictionary_Release(IXpsOMDictionary* This) {
    return This->lpVtbl->Release(This);
}
/*** IXpsOMDictionary methods ***/
static __WIDL_INLINE HRESULT IXpsOMDictionary_GetOwner(IXpsOMDictionary* This,IUnknown **owner) {
    return This->lpVtbl->GetOwner(This,owner);
}
static __WIDL_INLINE HRESULT IXpsOMDictionary_GetCount(IXpsOMDictionary* This,UINT32 *count) {
    return This->lpVtbl->GetCount(This,count);
}
static __WIDL_INLINE HRESULT IXpsOMDictionary_GetAt(IXpsOMDictionary* This,UINT32 index,LPWSTR *key,IXpsOMShareable **entry) {
    return This->lpVtbl->GetAt(This,index,key,entry);
}
static __WIDL_INLINE HRESULT IXpsOMDictionary_GetByKey(IXpsOMDictionary* This,LPCWSTR key,IXpsOMShareable *beforeEntry,IXpsOMShareable **entry) {
    return This->lpVtbl->GetByKey(This,key,beforeEntry,entry);
}
static __WIDL_INLINE HRESULT IXpsOMDictionary_GetIndex(IXpsOMDictionary* This,IXpsOMShareable *entry,UINT32 *index) {
    return This->lpVtbl->GetIndex(This,entry,index);
}
static __WIDL_INLINE HRESULT IXpsOMDictionary_Append(IXpsOMDictionary* This,LPCWSTR key,IXpsOMShareable *entry) {
    return This->lpVtbl->Append(This,key,entry);
}
static __WIDL_INLINE HRESULT IXpsOMDictionary_InsertAt(IXpsOMDictionary* This,UINT32 index,LPCWSTR key,IXpsOMShareable *entry) {
    return This->lpVtbl->InsertAt(This,index,key,entry);
}
static __WIDL_INLINE HRESULT IXpsOMDictionary_RemoveAt(IXpsOMDictionary* This,UINT32 index) {
    return This->lpVtbl->RemoveAt(This,index);
}
static __WIDL_INLINE HRESULT IXpsOMDictionary_SetAt(IXpsOMDictionary* This,UINT32 index,LPCWSTR key,IXpsOMShareable *entry) {
    return This->lpVtbl->SetAt(This,index,key,entry);
}
static __WIDL_INLINE HRESULT IXpsOMDictionary_Clone(IXpsOMDictionary* This,IXpsOMDictionary **dictionary) {
    return This->lpVtbl->Clone(This,dictionary);
}
#endif
#endif

#endif


#endif  /* __IXpsOMDictionary_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IXpsOMPageReference interface
 */
#ifndef __IXpsOMPageReference_INTERFACE_DEFINED__
#define __IXpsOMPageReference_INTERFACE_DEFINED__

DEFINE_GUID(IID_IXpsOMPageReference, 0xed360180, 0x6f92, 0x4998, 0x89,0x0d, 0x2f,0x20,0x85,0x31,0xa0,0xa0);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("ed360180-6f92-4998-890d-2f208531a0a0")
IXpsOMPageReference : public IUnknown
{
    virtual HRESULT STDMETHODCALLTYPE GetOwner(
        IXpsOMDocument **document) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetPage(
        IXpsOMPage **page) = 0;

    virtual HRESULT STDMETHODCALLTYPE SetPage(
        IXpsOMPage *page) = 0;

    virtual HRESULT STDMETHODCALLTYPE DiscardPage(
        ) = 0;

    virtual HRESULT STDMETHODCALLTYPE IsPageLoaded(
        WINBOOL *isPageLoaded) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetAdvisoryPageDimensions(
        XPS_SIZE *pageDimensions) = 0;

    virtual HRESULT STDMETHODCALLTYPE SetAdvisoryPageDimensions(
        const XPS_SIZE *pageDimensions) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetStoryFragmentsResource(
        IXpsOMStoryFragmentsResource **storyFragmentsResource) = 0;

    virtual HRESULT STDMETHODCALLTYPE SetStoryFragmentsResource(
        IXpsOMStoryFragmentsResource *storyFragmentsResource) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetPrintTicketResource(
        IXpsOMPrintTicketResource **printTicketResource) = 0;

    virtual HRESULT STDMETHODCALLTYPE SetPrintTicketResource(
        IXpsOMPrintTicketResource *printTicketResource) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetThumbnailResource(
        IXpsOMImageResource **imageResource) = 0;

    virtual HRESULT STDMETHODCALLTYPE SetThumbnailResource(
        IXpsOMImageResource *imageResource) = 0;

    virtual HRESULT STDMETHODCALLTYPE CollectLinkTargets(
        IXpsOMNameCollection **linkTargets) = 0;

    virtual HRESULT STDMETHODCALLTYPE CollectPartResources(
        IXpsOMPartResources **partResources) = 0;

    virtual HRESULT STDMETHODCALLTYPE HasRestrictedFonts(
        WINBOOL *restrictedFonts) = 0;

    virtual HRESULT STDMETHODCALLTYPE Clone(
        IXpsOMPageReference **pageReference) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IXpsOMPageReference, 0xed360180, 0x6f92, 0x4998, 0x89,0x0d, 0x2f,0x20,0x85,0x31,0xa0,0xa0)
#endif
#else
typedef struct IXpsOMPageReferenceVtbl {
    BEGIN_INTERFACE

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

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

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

    /*** IXpsOMPageReference methods ***/
    HRESULT (STDMETHODCALLTYPE *GetOwner)(
        IXpsOMPageReference *This,
        IXpsOMDocument **document);

    HRESULT (STDMETHODCALLTYPE *GetPage)(
        IXpsOMPageReference *This,
        IXpsOMPage **page);

    HRESULT (STDMETHODCALLTYPE *SetPage)(
        IXpsOMPageReference *This,
        IXpsOMPage *page);

    HRESULT (STDMETHODCALLTYPE *DiscardPage)(
        IXpsOMPageReference *This);

    HRESULT (STDMETHODCALLTYPE *IsPageLoaded)(
        IXpsOMPageReference *This,
        WINBOOL *isPageLoaded);

    HRESULT (STDMETHODCALLTYPE *GetAdvisoryPageDimensions)(
        IXpsOMPageReference *This,
        XPS_SIZE *pageDimensions);

    HRESULT (STDMETHODCALLTYPE *SetAdvisoryPageDimensions)(
        IXpsOMPageReference *This,
        const XPS_SIZE *pageDimensions);

    HRESULT (STDMETHODCALLTYPE *GetStoryFragmentsResource)(
        IXpsOMPageReference *This,
        IXpsOMStoryFragmentsResource **storyFragmentsResource);

    HRESULT (STDMETHODCALLTYPE *SetStoryFragmentsResource)(
        IXpsOMPageReference *This,
        IXpsOMStoryFragmentsResource *storyFragmentsResource);

    HRESULT (STDMETHODCALLTYPE *GetPrintTicketResource)(
        IXpsOMPageReference *This,
        IXpsOMPrintTicketResource **printTicketResource);

    HRESULT (STDMETHODCALLTYPE *SetPrintTicketResource)(
        IXpsOMPageReference *This,
        IXpsOMPrintTicketResource *printTicketResource);

    HRESULT (STDMETHODCALLTYPE *GetThumbnailResource)(
        IXpsOMPageReference *This,
        IXpsOMImageResource **imageResource);

    HRESULT (STDMETHODCALLTYPE *SetThumbnailResource)(
        IXpsOMPageReference *This,
        IXpsOMImageResource *imageResource);

    HRESULT (STDMETHODCALLTYPE *CollectLinkTargets)(
        IXpsOMPageReference *This,
        IXpsOMNameCollection **linkTargets);

    HRESULT (STDMETHODCALLTYPE *CollectPartResources)(
        IXpsOMPageReference *This,
        IXpsOMPartResources **partResources);

    HRESULT (STDMETHODCALLTYPE *HasRestrictedFonts)(
        IXpsOMPageReference *This,
        WINBOOL *restrictedFonts);

    HRESULT (STDMETHODCALLTYPE *Clone)(
        IXpsOMPageReference *This,
        IXpsOMPageReference **pageReference);

    END_INTERFACE
} IXpsOMPageReferenceVtbl;

interface IXpsOMPageReference {
    CONST_VTBL IXpsOMPageReferenceVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IXpsOMPageReference_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IXpsOMPageReference_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IXpsOMPageReference_Release(This) (This)->lpVtbl->Release(This)
/*** IXpsOMPageReference methods ***/
#define IXpsOMPageReference_GetOwner(This,document) (This)->lpVtbl->GetOwner(This,document)
#define IXpsOMPageReference_GetPage(This,page) (This)->lpVtbl->GetPage(This,page)
#define IXpsOMPageReference_SetPage(This,page) (This)->lpVtbl->SetPage(This,page)
#define IXpsOMPageReference_DiscardPage(This) (This)->lpVtbl->DiscardPage(This)
#define IXpsOMPageReference_IsPageLoaded(This,isPageLoaded) (This)->lpVtbl->IsPageLoaded(This,isPageLoaded)
#define IXpsOMPageReference_GetAdvisoryPageDimensions(This,pageDimensions) (This)->lpVtbl->GetAdvisoryPageDimensions(This,pageDimensions)
#define IXpsOMPageReference_SetAdvisoryPageDimensions(This,pageDimensions) (This)->lpVtbl->SetAdvisoryPageDimensions(This,pageDimensions)
#define IXpsOMPageReference_GetStoryFragmentsResource(This,storyFragmentsResource) (This)->lpVtbl->GetStoryFragmentsResource(This,storyFragmentsResource)
#define IXpsOMPageReference_SetStoryFragmentsResource(This,storyFragmentsResource) (This)->lpVtbl->SetStoryFragmentsResource(This,storyFragmentsResource)
#define IXpsOMPageReference_GetPrintTicketResource(This,printTicketResource) (This)->lpVtbl->GetPrintTicketResource(This,printTicketResource)
#define IXpsOMPageReference_SetPrintTicketResource(This,printTicketResource) (This)->lpVtbl->SetPrintTicketResource(This,printTicketResource)
#define IXpsOMPageReference_GetThumbnailResource(This,imageResource) (This)->lpVtbl->GetThumbnailResource(This,imageResource)
#define IXpsOMPageReference_SetThumbnailResource(This,imageResource) (This)->lpVtbl->SetThumbnailResource(This,imageResource)
#define IXpsOMPageReference_CollectLinkTargets(This,linkTargets) (This)->lpVtbl->CollectLinkTargets(This,linkTargets)
#define IXpsOMPageReference_CollectPartResources(This,partResources) (This)->lpVtbl->CollectPartResources(This,partResources)
#define IXpsOMPageReference_HasRestrictedFonts(This,restrictedFonts) (This)->lpVtbl->HasRestrictedFonts(This,restrictedFonts)
#define IXpsOMPageReference_Clone(This,pageReference) (This)->lpVtbl->Clone(This,pageReference)
#else
/*** IUnknown methods ***/
static __WIDL_INLINE HRESULT IXpsOMPageReference_QueryInterface(IXpsOMPageReference* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IXpsOMPageReference_AddRef(IXpsOMPageReference* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IXpsOMPageReference_Release(IXpsOMPageReference* This) {
    return This->lpVtbl->Release(This);
}
/*** IXpsOMPageReference methods ***/
static __WIDL_INLINE HRESULT IXpsOMPageReference_GetOwner(IXpsOMPageReference* This,IXpsOMDocument **document) {
    return This->lpVtbl->GetOwner(This,document);
}
static __WIDL_INLINE HRESULT IXpsOMPageReference_GetPage(IXpsOMPageReference* This,IXpsOMPage **page) {
    return This->lpVtbl->GetPage(This,page);
}
static __WIDL_INLINE HRESULT IXpsOMPageReference_SetPage(IXpsOMPageReference* This,IXpsOMPage *page) {
    return This->lpVtbl->SetPage(This,page);
}
static __WIDL_INLINE HRESULT IXpsOMPageReference_DiscardPage(IXpsOMPageReference* This) {
    return This->lpVtbl->DiscardPage(This);
}
static __WIDL_INLINE HRESULT IXpsOMPageReference_IsPageLoaded(IXpsOMPageReference* This,WINBOOL *isPageLoaded) {
    return This->lpVtbl->IsPageLoaded(This,isPageLoaded);
}
static __WIDL_INLINE HRESULT IXpsOMPageReference_GetAdvisoryPageDimensions(IXpsOMPageReference* This,XPS_SIZE *pageDimensions) {
    return This->lpVtbl->GetAdvisoryPageDimensions(This,pageDimensions);
}
static __WIDL_INLINE HRESULT IXpsOMPageReference_SetAdvisoryPageDimensions(IXpsOMPageReference* This,const XPS_SIZE *pageDimensions) {
    return This->lpVtbl->SetAdvisoryPageDimensions(This,pageDimensions);
}
static __WIDL_INLINE HRESULT IXpsOMPageReference_GetStoryFragmentsResource(IXpsOMPageReference* This,IXpsOMStoryFragmentsResource **storyFragmentsResource) {
    return This->lpVtbl->GetStoryFragmentsResource(This,storyFragmentsResource);
}
static __WIDL_INLINE HRESULT IXpsOMPageReference_SetStoryFragmentsResource(IXpsOMPageReference* This,IXpsOMStoryFragmentsResource *storyFragmentsResource) {
    return This->lpVtbl->SetStoryFragmentsResource(This,storyFragmentsResource);
}
static __WIDL_INLINE HRESULT IXpsOMPageReference_GetPrintTicketResource(IXpsOMPageReference* This,IXpsOMPrintTicketResource **printTicketResource) {
    return This->lpVtbl->GetPrintTicketResource(This,printTicketResource);
}
static __WIDL_INLINE HRESULT IXpsOMPageReference_SetPrintTicketResource(IXpsOMPageReference* This,IXpsOMPrintTicketResource *printTicketResource) {
    return This->lpVtbl->SetPrintTicketResource(This,printTicketResource);
}
static __WIDL_INLINE HRESULT IXpsOMPageReference_GetThumbnailResource(IXpsOMPageReference* This,IXpsOMImageResource **imageResource) {
    return This->lpVtbl->GetThumbnailResource(This,imageResource);
}
static __WIDL_INLINE HRESULT IXpsOMPageReference_SetThumbnailResource(IXpsOMPageReference* This,IXpsOMImageResource *imageResource) {
    return This->lpVtbl->SetThumbnailResource(This,imageResource);
}
static __WIDL_INLINE HRESULT IXpsOMPageReference_CollectLinkTargets(IXpsOMPageReference* This,IXpsOMNameCollection **linkTargets) {
    return This->lpVtbl->CollectLinkTargets(This,linkTargets);
}
static __WIDL_INLINE HRESULT IXpsOMPageReference_CollectPartResources(IXpsOMPageReference* This,IXpsOMPartResources **partResources) {
    return This->lpVtbl->CollectPartResources(This,partResources);
}
static __WIDL_INLINE HRESULT IXpsOMPageReference_HasRestrictedFonts(IXpsOMPageReference* This,WINBOOL *restrictedFonts) {
    return This->lpVtbl->HasRestrictedFonts(This,restrictedFonts);
}
static __WIDL_INLINE HRESULT IXpsOMPageReference_Clone(IXpsOMPageReference* This,IXpsOMPageReference **pageReference) {
    return This->lpVtbl->Clone(This,pageReference);
}
#endif
#endif

#endif


#endif  /* __IXpsOMPageReference_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IXpsOMPageReferenceCollection interface
 */
#ifndef __IXpsOMPageReferenceCollection_INTERFACE_DEFINED__
#define __IXpsOMPageReferenceCollection_INTERFACE_DEFINED__

DEFINE_GUID(IID_IXpsOMPageReferenceCollection, 0xca16ba4d, 0xe7b9, 0x45c5, 0x95,0x8b, 0xf9,0x80,0x22,0x47,0x37,0x45);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("ca16ba4d-e7b9-45c5-958b-f98022473745")
IXpsOMPageReferenceCollection : public IUnknown
{
    virtual HRESULT STDMETHODCALLTYPE GetCount(
        UINT32 *count) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetAt(
        UINT32 index,
        IXpsOMPageReference **pageReference) = 0;

    virtual HRESULT STDMETHODCALLTYPE InsertAt(
        UINT32 index,
        IXpsOMPageReference *pageReference) = 0;

    virtual HRESULT STDMETHODCALLTYPE RemoveAt(
        UINT32 index) = 0;

    virtual HRESULT STDMETHODCALLTYPE SetAt(
        UINT32 index,
        IXpsOMPageReference *pageReference) = 0;

    virtual HRESULT STDMETHODCALLTYPE Append(
        IXpsOMPageReference *pageReference) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IXpsOMPageReferenceCollection, 0xca16ba4d, 0xe7b9, 0x45c5, 0x95,0x8b, 0xf9,0x80,0x22,0x47,0x37,0x45)
#endif
#else
typedef struct IXpsOMPageReferenceCollectionVtbl {
    BEGIN_INTERFACE

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

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

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

    /*** IXpsOMPageReferenceCollection methods ***/
    HRESULT (STDMETHODCALLTYPE *GetCount)(
        IXpsOMPageReferenceCollection *This,
        UINT32 *count);

    HRESULT (STDMETHODCALLTYPE *GetAt)(
        IXpsOMPageReferenceCollection *This,
        UINT32 index,
        IXpsOMPageReference **pageReference);

    HRESULT (STDMETHODCALLTYPE *InsertAt)(
        IXpsOMPageReferenceCollection *This,
        UINT32 index,
        IXpsOMPageReference *pageReference);

    HRESULT (STDMETHODCALLTYPE *RemoveAt)(
        IXpsOMPageReferenceCollection *This,
        UINT32 index);

    HRESULT (STDMETHODCALLTYPE *SetAt)(
        IXpsOMPageReferenceCollection *This,
        UINT32 index,
        IXpsOMPageReference *pageReference);

    HRESULT (STDMETHODCALLTYPE *Append)(
        IXpsOMPageReferenceCollection *This,
        IXpsOMPageReference *pageReference);

    END_INTERFACE
} IXpsOMPageReferenceCollectionVtbl;

interface IXpsOMPageReferenceCollection {
    CONST_VTBL IXpsOMPageReferenceCollectionVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IXpsOMPageReferenceCollection_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IXpsOMPageReferenceCollection_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IXpsOMPageReferenceCollection_Release(This) (This)->lpVtbl->Release(This)
/*** IXpsOMPageReferenceCollection methods ***/
#define IXpsOMPageReferenceCollection_GetCount(This,count) (This)->lpVtbl->GetCount(This,count)
#define IXpsOMPageReferenceCollection_GetAt(This,index,pageReference) (This)->lpVtbl->GetAt(This,index,pageReference)
#define IXpsOMPageReferenceCollection_InsertAt(This,index,pageReference) (This)->lpVtbl->InsertAt(This,index,pageReference)
#define IXpsOMPageReferenceCollection_RemoveAt(This,index) (This)->lpVtbl->RemoveAt(This,index)
#define IXpsOMPageReferenceCollection_SetAt(This,index,pageReference) (This)->lpVtbl->SetAt(This,index,pageReference)
#define IXpsOMPageReferenceCollection_Append(This,pageReference) (This)->lpVtbl->Append(This,pageReference)
#else
/*** IUnknown methods ***/
static __WIDL_INLINE HRESULT IXpsOMPageReferenceCollection_QueryInterface(IXpsOMPageReferenceCollection* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IXpsOMPageReferenceCollection_AddRef(IXpsOMPageReferenceCollection* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IXpsOMPageReferenceCollection_Release(IXpsOMPageReferenceCollection* This) {
    return This->lpVtbl->Release(This);
}
/*** IXpsOMPageReferenceCollection methods ***/
static __WIDL_INLINE HRESULT IXpsOMPageReferenceCollection_GetCount(IXpsOMPageReferenceCollection* This,UINT32 *count) {
    return This->lpVtbl->GetCount(This,count);
}
static __WIDL_INLINE HRESULT IXpsOMPageReferenceCollection_GetAt(IXpsOMPageReferenceCollection* This,UINT32 index,IXpsOMPageReference **pageReference) {
    return This->lpVtbl->GetAt(This,index,pageReference);
}
static __WIDL_INLINE HRESULT IXpsOMPageReferenceCollection_InsertAt(IXpsOMPageReferenceCollection* This,UINT32 index,IXpsOMPageReference *pageReference) {
    return This->lpVtbl->InsertAt(This,index,pageReference);
}
static __WIDL_INLINE HRESULT IXpsOMPageReferenceCollection_RemoveAt(IXpsOMPageReferenceCollection* This,UINT32 index) {
    return This->lpVtbl->RemoveAt(This,index);
}
static __WIDL_INLINE HRESULT IXpsOMPageReferenceCollection_SetAt(IXpsOMPageReferenceCollection* This,UINT32 index,IXpsOMPageReference *pageReference) {
    return This->lpVtbl->SetAt(This,index,pageReference);
}
static __WIDL_INLINE HRESULT IXpsOMPageReferenceCollection_Append(IXpsOMPageReferenceCollection* This,IXpsOMPageReference *pageReference) {
    return This->lpVtbl->Append(This,pageReference);
}
#endif
#endif

#endif


#endif  /* __IXpsOMPageReferenceCollection_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IXpsOMDocumentCollection interface
 */
#ifndef __IXpsOMDocumentCollection_INTERFACE_DEFINED__
#define __IXpsOMDocumentCollection_INTERFACE_DEFINED__

DEFINE_GUID(IID_IXpsOMDocumentCollection, 0xd1c87f0d, 0xe947, 0x4754, 0x8a,0x25, 0x97,0x14,0x78,0xf7,0xe8,0x3e);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("d1c87f0d-e947-4754-8a25-971478f7e83e")
IXpsOMDocumentCollection : public IUnknown
{
    virtual HRESULT STDMETHODCALLTYPE GetCount(
        UINT32 *count) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetAt(
        UINT32 index,
        IXpsOMDocument **document) = 0;

    virtual HRESULT STDMETHODCALLTYPE InsertAt(
        UINT32 index,
        IXpsOMDocument *document) = 0;

    virtual HRESULT STDMETHODCALLTYPE RemoveAt(
        UINT32 index) = 0;

    virtual HRESULT STDMETHODCALLTYPE SetAt(
        UINT32 index,
        IXpsOMDocument *document) = 0;

    virtual HRESULT STDMETHODCALLTYPE Append(
        IXpsOMDocument *document) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IXpsOMDocumentCollection, 0xd1c87f0d, 0xe947, 0x4754, 0x8a,0x25, 0x97,0x14,0x78,0xf7,0xe8,0x3e)
#endif
#else
typedef struct IXpsOMDocumentCollectionVtbl {
    BEGIN_INTERFACE

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

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

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

    /*** IXpsOMDocumentCollection methods ***/
    HRESULT (STDMETHODCALLTYPE *GetCount)(
        IXpsOMDocumentCollection *This,
        UINT32 *count);

    HRESULT (STDMETHODCALLTYPE *GetAt)(
        IXpsOMDocumentCollection *This,
        UINT32 index,
        IXpsOMDocument **document);

    HRESULT (STDMETHODCALLTYPE *InsertAt)(
        IXpsOMDocumentCollection *This,
        UINT32 index,
        IXpsOMDocument *document);

    HRESULT (STDMETHODCALLTYPE *RemoveAt)(
        IXpsOMDocumentCollection *This,
        UINT32 index);

    HRESULT (STDMETHODCALLTYPE *SetAt)(
        IXpsOMDocumentCollection *This,
        UINT32 index,
        IXpsOMDocument *document);

    HRESULT (STDMETHODCALLTYPE *Append)(
        IXpsOMDocumentCollection *This,
        IXpsOMDocument *document);

    END_INTERFACE
} IXpsOMDocumentCollectionVtbl;

interface IXpsOMDocumentCollection {
    CONST_VTBL IXpsOMDocumentCollectionVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IXpsOMDocumentCollection_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IXpsOMDocumentCollection_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IXpsOMDocumentCollection_Release(This) (This)->lpVtbl->Release(This)
/*** IXpsOMDocumentCollection methods ***/
#define IXpsOMDocumentCollection_GetCount(This,count) (This)->lpVtbl->GetCount(This,count)
#define IXpsOMDocumentCollection_GetAt(This,index,document) (This)->lpVtbl->GetAt(This,index,document)
#define IXpsOMDocumentCollection_InsertAt(This,index,document) (This)->lpVtbl->InsertAt(This,index,document)
#define IXpsOMDocumentCollection_RemoveAt(This,index) (This)->lpVtbl->RemoveAt(This,index)
#define IXpsOMDocumentCollection_SetAt(This,index,document) (This)->lpVtbl->SetAt(This,index,document)
#define IXpsOMDocumentCollection_Append(This,document) (This)->lpVtbl->Append(This,document)
#else
/*** IUnknown methods ***/
static __WIDL_INLINE HRESULT IXpsOMDocumentCollection_QueryInterface(IXpsOMDocumentCollection* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IXpsOMDocumentCollection_AddRef(IXpsOMDocumentCollection* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IXpsOMDocumentCollection_Release(IXpsOMDocumentCollection* This) {
    return This->lpVtbl->Release(This);
}
/*** IXpsOMDocumentCollection methods ***/
static __WIDL_INLINE HRESULT IXpsOMDocumentCollection_GetCount(IXpsOMDocumentCollection* This,UINT32 *count) {
    return This->lpVtbl->GetCount(This,count);
}
static __WIDL_INLINE HRESULT IXpsOMDocumentCollection_GetAt(IXpsOMDocumentCollection* This,UINT32 index,IXpsOMDocument **document) {
    return This->lpVtbl->GetAt(This,index,document);
}
static __WIDL_INLINE HRESULT IXpsOMDocumentCollection_InsertAt(IXpsOMDocumentCollection* This,UINT32 index,IXpsOMDocument *document) {
    return This->lpVtbl->InsertAt(This,index,document);
}
static __WIDL_INLINE HRESULT IXpsOMDocumentCollection_RemoveAt(IXpsOMDocumentCollection* This,UINT32 index) {
    return This->lpVtbl->RemoveAt(This,index);
}
static __WIDL_INLINE HRESULT IXpsOMDocumentCollection_SetAt(IXpsOMDocumentCollection* This,UINT32 index,IXpsOMDocument *document) {
    return This->lpVtbl->SetAt(This,index,document);
}
static __WIDL_INLINE HRESULT IXpsOMDocumentCollection_Append(IXpsOMDocumentCollection* This,IXpsOMDocument *document) {
    return This->lpVtbl->Append(This,document);
}
#endif
#endif

#endif


#endif  /* __IXpsOMDocumentCollection_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IXpsOMPackage interface
 */
#ifndef __IXpsOMPackage_INTERFACE_DEFINED__
#define __IXpsOMPackage_INTERFACE_DEFINED__

DEFINE_GUID(IID_IXpsOMPackage, 0x18c3df65, 0x81e1, 0x4674, 0x91,0xdc, 0xfc,0x45,0x2f,0x5a,0x41,0x6f);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("18c3df65-81e1-4674-91dc-fc452f5a416f")
IXpsOMPackage : public IUnknown
{
    virtual HRESULT STDMETHODCALLTYPE GetDocumentSequence(
        IXpsOMDocumentSequence **documentSequence) = 0;

    virtual HRESULT STDMETHODCALLTYPE SetDocumentSequence(
        IXpsOMDocumentSequence *documentSequence) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetCoreProperties(
        IXpsOMCoreProperties **coreProperties) = 0;

    virtual HRESULT STDMETHODCALLTYPE SetCoreProperties(
        IXpsOMCoreProperties *coreProperties) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetDiscardControlPartName(
        IOpcPartUri **discardControlPartUri) = 0;

    virtual HRESULT STDMETHODCALLTYPE SetDiscardControlPartName(
        IOpcPartUri *discardControlPartUri) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetThumbnailResource(
        IXpsOMImageResource **imageResource) = 0;

    virtual HRESULT STDMETHODCALLTYPE SetThumbnailResource(
        IXpsOMImageResource *imageResource) = 0;

    virtual HRESULT STDMETHODCALLTYPE WriteToFile(
        LPCWSTR fileName,
        LPSECURITY_ATTRIBUTES securityAttributes,
        DWORD flagsAndAttributes,
        WINBOOL optimizeMarkupSize) = 0;

    virtual HRESULT STDMETHODCALLTYPE WriteToStream(
        ISequentialStream *stream,
        WINBOOL optimizeMarkupSize) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IXpsOMPackage, 0x18c3df65, 0x81e1, 0x4674, 0x91,0xdc, 0xfc,0x45,0x2f,0x5a,0x41,0x6f)
#endif
#else
typedef struct IXpsOMPackageVtbl {
    BEGIN_INTERFACE

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

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

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

    /*** IXpsOMPackage methods ***/
    HRESULT (STDMETHODCALLTYPE *GetDocumentSequence)(
        IXpsOMPackage *This,
        IXpsOMDocumentSequence **documentSequence);

    HRESULT (STDMETHODCALLTYPE *SetDocumentSequence)(
        IXpsOMPackage *This,
        IXpsOMDocumentSequence *documentSequence);

    HRESULT (STDMETHODCALLTYPE *GetCoreProperties)(
        IXpsOMPackage *This,
        IXpsOMCoreProperties **coreProperties);

    HRESULT (STDMETHODCALLTYPE *SetCoreProperties)(
        IXpsOMPackage *This,
        IXpsOMCoreProperties *coreProperties);

    HRESULT (STDMETHODCALLTYPE *GetDiscardControlPartName)(
        IXpsOMPackage *This,
        IOpcPartUri **discardControlPartUri);

    HRESULT (STDMETHODCALLTYPE *SetDiscardControlPartName)(
        IXpsOMPackage *This,
        IOpcPartUri *discardControlPartUri);

    HRESULT (STDMETHODCALLTYPE *GetThumbnailResource)(
        IXpsOMPackage *This,
        IXpsOMImageResource **imageResource);

    HRESULT (STDMETHODCALLTYPE *SetThumbnailResource)(
        IXpsOMPackage *This,
        IXpsOMImageResource *imageResource);

    HRESULT (STDMETHODCALLTYPE *WriteToFile)(
        IXpsOMPackage *This,
        LPCWSTR fileName,
        LPSECURITY_ATTRIBUTES securityAttributes,
        DWORD flagsAndAttributes,
        WINBOOL optimizeMarkupSize);

    HRESULT (STDMETHODCALLTYPE *WriteToStream)(
        IXpsOMPackage *This,
        ISequentialStream *stream,
        WINBOOL optimizeMarkupSize);

    END_INTERFACE
} IXpsOMPackageVtbl;

interface IXpsOMPackage {
    CONST_VTBL IXpsOMPackageVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IXpsOMPackage_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IXpsOMPackage_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IXpsOMPackage_Release(This) (This)->lpVtbl->Release(This)
/*** IXpsOMPackage methods ***/
#define IXpsOMPackage_GetDocumentSequence(This,documentSequence) (This)->lpVtbl->GetDocumentSequence(This,documentSequence)
#define IXpsOMPackage_SetDocumentSequence(This,documentSequence) (This)->lpVtbl->SetDocumentSequence(This,documentSequence)
#define IXpsOMPackage_GetCoreProperties(This,coreProperties) (This)->lpVtbl->GetCoreProperties(This,coreProperties)
#define IXpsOMPackage_SetCoreProperties(This,coreProperties) (This)->lpVtbl->SetCoreProperties(This,coreProperties)
#define IXpsOMPackage_GetDiscardControlPartName(This,discardControlPartUri) (This)->lpVtbl->GetDiscardControlPartName(This,discardControlPartUri)
#define IXpsOMPackage_SetDiscardControlPartName(This,discardControlPartUri) (This)->lpVtbl->SetDiscardControlPartName(This,discardControlPartUri)
#define IXpsOMPackage_GetThumbnailResource(This,imageResource) (This)->lpVtbl->GetThumbnailResource(This,imageResource)
#define IXpsOMPackage_SetThumbnailResource(This,imageResource) (This)->lpVtbl->SetThumbnailResource(This,imageResource)
#define IXpsOMPackage_WriteToFile(This,fileName,securityAttributes,flagsAndAttributes,optimizeMarkupSize) (This)->lpVtbl->WriteToFile(This,fileName,securityAttributes,flagsAndAttributes,optimizeMarkupSize)
#define IXpsOMPackage_WriteToStream(This,stream,optimizeMarkupSize) (This)->lpVtbl->WriteToStream(This,stream,optimizeMarkupSize)
#else
/*** IUnknown methods ***/
static __WIDL_INLINE HRESULT IXpsOMPackage_QueryInterface(IXpsOMPackage* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IXpsOMPackage_AddRef(IXpsOMPackage* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IXpsOMPackage_Release(IXpsOMPackage* This) {
    return This->lpVtbl->Release(This);
}
/*** IXpsOMPackage methods ***/
static __WIDL_INLINE HRESULT IXpsOMPackage_GetDocumentSequence(IXpsOMPackage* This,IXpsOMDocumentSequence **documentSequence) {
    return This->lpVtbl->GetDocumentSequence(This,documentSequence);
}
static __WIDL_INLINE HRESULT IXpsOMPackage_SetDocumentSequence(IXpsOMPackage* This,IXpsOMDocumentSequence *documentSequence) {
    return This->lpVtbl->SetDocumentSequence(This,documentSequence);
}
static __WIDL_INLINE HRESULT IXpsOMPackage_GetCoreProperties(IXpsOMPackage* This,IXpsOMCoreProperties **coreProperties) {
    return This->lpVtbl->GetCoreProperties(This,coreProperties);
}
static __WIDL_INLINE HRESULT IXpsOMPackage_SetCoreProperties(IXpsOMPackage* This,IXpsOMCoreProperties *coreProperties) {
    return This->lpVtbl->SetCoreProperties(This,coreProperties);
}
static __WIDL_INLINE HRESULT IXpsOMPackage_GetDiscardControlPartName(IXpsOMPackage* This,IOpcPartUri **discardControlPartUri) {
    return This->lpVtbl->GetDiscardControlPartName(This,discardControlPartUri);
}
static __WIDL_INLINE HRESULT IXpsOMPackage_SetDiscardControlPartName(IXpsOMPackage* This,IOpcPartUri *discardControlPartUri) {
    return This->lpVtbl->SetDiscardControlPartName(This,discardControlPartUri);
}
static __WIDL_INLINE HRESULT IXpsOMPackage_GetThumbnailResource(IXpsOMPackage* This,IXpsOMImageResource **imageResource) {
    return This->lpVtbl->GetThumbnailResource(This,imageResource);
}
static __WIDL_INLINE HRESULT IXpsOMPackage_SetThumbnailResource(IXpsOMPackage* This,IXpsOMImageResource *imageResource) {
    return This->lpVtbl->SetThumbnailResource(This,imageResource);
}
static __WIDL_INLINE HRESULT IXpsOMPackage_WriteToFile(IXpsOMPackage* This,LPCWSTR fileName,LPSECURITY_ATTRIBUTES securityAttributes,DWORD flagsAndAttributes,WINBOOL optimizeMarkupSize) {
    return This->lpVtbl->WriteToFile(This,fileName,securityAttributes,flagsAndAttributes,optimizeMarkupSize);
}
static __WIDL_INLINE HRESULT IXpsOMPackage_WriteToStream(IXpsOMPackage* This,ISequentialStream *stream,WINBOOL optimizeMarkupSize) {
    return This->lpVtbl->WriteToStream(This,stream,optimizeMarkupSize);
}
#endif
#endif

#endif


#endif  /* __IXpsOMPackage_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IXpsOMObjectFactory interface
 */
#ifndef __IXpsOMObjectFactory_INTERFACE_DEFINED__
#define __IXpsOMObjectFactory_INTERFACE_DEFINED__

DEFINE_GUID(IID_IXpsOMObjectFactory, 0xf9b2a685, 0xa50d, 0x4fc2, 0xb7,0x64, 0xb5,0x6e,0x09,0x3e,0xa0,0xca);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("f9b2a685-a50d-4fc2-b764-b56e093ea0ca")
IXpsOMObjectFactory : public IUnknown
{
    virtual HRESULT STDMETHODCALLTYPE CreatePackage(
        IXpsOMPackage **package) = 0;

    virtual HRESULT STDMETHODCALLTYPE CreatePackageFromFile(
        LPCWSTR filename,
        WINBOOL reuseObjects,
        IXpsOMPackage **package) = 0;

    virtual HRESULT STDMETHODCALLTYPE CreatePackageFromStream(
        IStream *stream,
        WINBOOL reuseObjects,
        IXpsOMPackage **package) = 0;

    virtual HRESULT STDMETHODCALLTYPE CreateStoryFragmentsResource(
        IStream *acquiredStream,
        IOpcPartUri *partUri,
        IXpsOMStoryFragmentsResource **storyFragmentsResource) = 0;

    virtual HRESULT STDMETHODCALLTYPE CreateDocumentStructureResource(
        IStream *acquiredStream,
        IOpcPartUri *partUri,
        IXpsOMDocumentStructureResource **documentStructureResource) = 0;

    virtual HRESULT STDMETHODCALLTYPE CreateSignatureBlockResource(
        IStream *acquiredStream,
        IOpcPartUri *partUri,
        IXpsOMSignatureBlockResource **signatureBlockResource) = 0;

    virtual HRESULT STDMETHODCALLTYPE CreateRemoteDictionaryResource(
        IXpsOMDictionary *dictionary,
        IOpcPartUri *partUri,
        IXpsOMRemoteDictionaryResource **remoteDictionaryResource) = 0;

    virtual HRESULT STDMETHODCALLTYPE CreateRemoteDictionaryResourceFromStream(
        IStream *dictionaryMarkupStream,
        IOpcPartUri *dictionaryPartUri,
        IXpsOMPartResources *resources,
        IXpsOMRemoteDictionaryResource **dictionaryResource) = 0;

    virtual HRESULT STDMETHODCALLTYPE CreatePartResources(
        IXpsOMPartResources **partResources) = 0;

    virtual HRESULT STDMETHODCALLTYPE CreateDocumentSequence(
        IOpcPartUri *partUri,
        IXpsOMDocumentSequence **documentSequence) = 0;

    virtual HRESULT STDMETHODCALLTYPE CreateDocument(
        IOpcPartUri *partUri,
        IXpsOMDocument **document) = 0;

    virtual HRESULT STDMETHODCALLTYPE CreatePageReference(
        const XPS_SIZE *advisoryPageDimensions,
        IXpsOMPageReference **pageReference) = 0;

    virtual HRESULT STDMETHODCALLTYPE CreatePage(
        const XPS_SIZE *pageDimensions,
        LPCWSTR language,
        IOpcPartUri *partUri,
        IXpsOMPage **page) = 0;

    virtual HRESULT STDMETHODCALLTYPE CreatePageFromStream(
        IStream *pageMarkupStream,
        IOpcPartUri *partUri,
        IXpsOMPartResources *resources,
        WINBOOL reuseObjects,
        IXpsOMPage **page) = 0;

    virtual HRESULT STDMETHODCALLTYPE CreateCanvas(
        IXpsOMCanvas **canvas) = 0;

    virtual HRESULT STDMETHODCALLTYPE CreateGlyphs(
        IXpsOMFontResource *fontResource,
        IXpsOMGlyphs **glyphs) = 0;

    virtual HRESULT STDMETHODCALLTYPE CreatePath(
        IXpsOMPath **path) = 0;

    virtual HRESULT STDMETHODCALLTYPE CreateGeometry(
        IXpsOMGeometry **geometry) = 0;

    virtual HRESULT STDMETHODCALLTYPE CreateGeometryFigure(
        const XPS_POINT *startPoint,
        IXpsOMGeometryFigure **figure) = 0;

    virtual HRESULT STDMETHODCALLTYPE CreateMatrixTransform(
        const XPS_MATRIX *matrix,
        IXpsOMMatrixTransform **transform) = 0;

    virtual HRESULT STDMETHODCALLTYPE CreateSolidColorBrush(
        const XPS_COLOR *color,
        IXpsOMColorProfileResource *colorProfile,
        IXpsOMSolidColorBrush **solidColorBrush) = 0;

    virtual HRESULT STDMETHODCALLTYPE CreateColorProfileResource(
        IStream *acquiredStream,
        IOpcPartUri *partUri,
        IXpsOMColorProfileResource **colorProfileResource) = 0;

    virtual HRESULT STDMETHODCALLTYPE CreateImageBrush(
        IXpsOMImageResource *image,
        const XPS_RECT *viewBox,
        const XPS_RECT *viewPort,
        IXpsOMImageBrush **imageBrush) = 0;

    virtual HRESULT STDMETHODCALLTYPE CreateVisualBrush(
        const XPS_RECT *viewBox,
        const XPS_RECT *viewPort,
        IXpsOMVisualBrush **visualBrush) = 0;

    virtual HRESULT STDMETHODCALLTYPE CreateImageResource(
        IStream *acquiredStream,
        XPS_IMAGE_TYPE contentType,
        IOpcPartUri *partUri,
        IXpsOMImageResource **imageResource) = 0;

    virtual HRESULT STDMETHODCALLTYPE CreatePrintTicketResource(
        IStream *acquiredStream,
        IOpcPartUri *partUri,
        IXpsOMPrintTicketResource **printTicketResource) = 0;

    virtual HRESULT STDMETHODCALLTYPE CreateFontResource(
        IStream *acquiredStream,
        XPS_FONT_EMBEDDING fontEmbedding,
        IOpcPartUri *partUri,
        WINBOOL isObfSourceStream,
        IXpsOMFontResource **fontResource) = 0;

    virtual HRESULT STDMETHODCALLTYPE CreateGradientStop(
        const XPS_COLOR *color,
        IXpsOMColorProfileResource *colorProfile,
        FLOAT offset,
        IXpsOMGradientStop **gradientStop) = 0;

    virtual HRESULT STDMETHODCALLTYPE CreateLinearGradientBrush(
        IXpsOMGradientStop *gradStop1,
        IXpsOMGradientStop *gradStop2,
        const XPS_POINT *startPoint,
        const XPS_POINT *endPoint,
        IXpsOMLinearGradientBrush **linearGradientBrush) = 0;

    virtual HRESULT STDMETHODCALLTYPE CreateRadialGradientBrush(
        IXpsOMGradientStop *gradStop1,
        IXpsOMGradientStop *gradStop2,
        const XPS_POINT *centerPoint,
        const XPS_POINT *gradientOrigin,
        const XPS_SIZE *radiiSizes,
        IXpsOMRadialGradientBrush **radialGradientBrush) = 0;

    virtual HRESULT STDMETHODCALLTYPE CreateCoreProperties(
        IOpcPartUri *partUri,
        IXpsOMCoreProperties **coreProperties) = 0;

    virtual HRESULT STDMETHODCALLTYPE CreateDictionary(
        IXpsOMDictionary **dictionary) = 0;

    virtual HRESULT STDMETHODCALLTYPE CreatePartUriCollection(
        IXpsOMPartUriCollection **partUriCollection) = 0;

    virtual HRESULT STDMETHODCALLTYPE CreatePackageWriterOnFile(
        LPCWSTR fileName,
        LPSECURITY_ATTRIBUTES securityAttributes,
        DWORD flagsAndAttributes,
        WINBOOL optimizeMarkupSize,
        XPS_INTERLEAVING interleaving,
        IOpcPartUri *documentSequencePartName,
        IXpsOMCoreProperties *coreProperties,
        IXpsOMImageResource *packageThumbnail,
        IXpsOMPrintTicketResource *documentSequencePrintTicket,
        IOpcPartUri *discardControlPartName,
        IXpsOMPackageWriter **packageWriter) = 0;

    virtual HRESULT STDMETHODCALLTYPE CreatePackageWriterOnStream(
        ISequentialStream *outputStream,
        WINBOOL optimizeMarkupSize,
        XPS_INTERLEAVING interleaving,
        IOpcPartUri *documentSequencePartName,
        IXpsOMCoreProperties *coreProperties,
        IXpsOMImageResource *packageThumbnail,
        IXpsOMPrintTicketResource *documentSequencePrintTicket,
        IOpcPartUri *discardControlPartName,
        IXpsOMPackageWriter **packageWriter) = 0;

    virtual HRESULT STDMETHODCALLTYPE CreatePartUri(
        LPCWSTR uri,
        IOpcPartUri **partUri) = 0;

    virtual HRESULT STDMETHODCALLTYPE CreateReadOnlyStreamOnFile(
        LPCWSTR filename,
        IStream **stream) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IXpsOMObjectFactory, 0xf9b2a685, 0xa50d, 0x4fc2, 0xb7,0x64, 0xb5,0x6e,0x09,0x3e,0xa0,0xca)
#endif
#else
typedef struct IXpsOMObjectFactoryVtbl {
    BEGIN_INTERFACE

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

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

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

    /*** IXpsOMObjectFactory methods ***/
    HRESULT (STDMETHODCALLTYPE *CreatePackage)(
        IXpsOMObjectFactory *This,
        IXpsOMPackage **package);

    HRESULT (STDMETHODCALLTYPE *CreatePackageFromFile)(
        IXpsOMObjectFactory *This,
        LPCWSTR filename,
        WINBOOL reuseObjects,
        IXpsOMPackage **package);

    HRESULT (STDMETHODCALLTYPE *CreatePackageFromStream)(
        IXpsOMObjectFactory *This,
        IStream *stream,
        WINBOOL reuseObjects,
        IXpsOMPackage **package);

    HRESULT (STDMETHODCALLTYPE *CreateStoryFragmentsResource)(
        IXpsOMObjectFactory *This,
        IStream *acquiredStream,
        IOpcPartUri *partUri,
        IXpsOMStoryFragmentsResource **storyFragmentsResource);

    HRESULT (STDMETHODCALLTYPE *CreateDocumentStructureResource)(
        IXpsOMObjectFactory *This,
        IStream *acquiredStream,
        IOpcPartUri *partUri,
        IXpsOMDocumentStructureResource **documentStructureResource);

    HRESULT (STDMETHODCALLTYPE *CreateSignatureBlockResource)(
        IXpsOMObjectFactory *This,
        IStream *acquiredStream,
        IOpcPartUri *partUri,
        IXpsOMSignatureBlockResource **signatureBlockResource);

    HRESULT (STDMETHODCALLTYPE *CreateRemoteDictionaryResource)(
        IXpsOMObjectFactory *This,
        IXpsOMDictionary *dictionary,
        IOpcPartUri *partUri,
        IXpsOMRemoteDictionaryResource **remoteDictionaryResource);

    HRESULT (STDMETHODCALLTYPE *CreateRemoteDictionaryResourceFromStream)(
        IXpsOMObjectFactory *This,
        IStream *dictionaryMarkupStream,
        IOpcPartUri *dictionaryPartUri,
        IXpsOMPartResources *resources,
        IXpsOMRemoteDictionaryResource **dictionaryResource);

    HRESULT (STDMETHODCALLTYPE *CreatePartResources)(
        IXpsOMObjectFactory *This,
        IXpsOMPartResources **partResources);

    HRESULT (STDMETHODCALLTYPE *CreateDocumentSequence)(
        IXpsOMObjectFactory *This,
        IOpcPartUri *partUri,
        IXpsOMDocumentSequence **documentSequence);

    HRESULT (STDMETHODCALLTYPE *CreateDocument)(
        IXpsOMObjectFactory *This,
        IOpcPartUri *partUri,
        IXpsOMDocument **document);

    HRESULT (STDMETHODCALLTYPE *CreatePageReference)(
        IXpsOMObjectFactory *This,
        const XPS_SIZE *advisoryPageDimensions,
        IXpsOMPageReference **pageReference);

    HRESULT (STDMETHODCALLTYPE *CreatePage)(
        IXpsOMObjectFactory *This,
        const XPS_SIZE *pageDimensions,
        LPCWSTR language,
        IOpcPartUri *partUri,
        IXpsOMPage **page);

    HRESULT (STDMETHODCALLTYPE *CreatePageFromStream)(
        IXpsOMObjectFactory *This,
        IStream *pageMarkupStream,
        IOpcPartUri *partUri,
        IXpsOMPartResources *resources,
        WINBOOL reuseObjects,
        IXpsOMPage **page);

    HRESULT (STDMETHODCALLTYPE *CreateCanvas)(
        IXpsOMObjectFactory *This,
        IXpsOMCanvas **canvas);

    HRESULT (STDMETHODCALLTYPE *CreateGlyphs)(
        IXpsOMObjectFactory *This,
        IXpsOMFontResource *fontResource,
        IXpsOMGlyphs **glyphs);

    HRESULT (STDMETHODCALLTYPE *CreatePath)(
        IXpsOMObjectFactory *This,
        IXpsOMPath **path);

    HRESULT (STDMETHODCALLTYPE *CreateGeometry)(
        IXpsOMObjectFactory *This,
        IXpsOMGeometry **geometry);

    HRESULT (STDMETHODCALLTYPE *CreateGeometryFigure)(
        IXpsOMObjectFactory *This,
        const XPS_POINT *startPoint,
        IXpsOMGeometryFigure **figure);

    HRESULT (STDMETHODCALLTYPE *CreateMatrixTransform)(
        IXpsOMObjectFactory *This,
        const XPS_MATRIX *matrix,
        IXpsOMMatrixTransform **transform);

    HRESULT (STDMETHODCALLTYPE *CreateSolidColorBrush)(
        IXpsOMObjectFactory *This,
        const XPS_COLOR *color,
        IXpsOMColorProfileResource *colorProfile,
        IXpsOMSolidColorBrush **solidColorBrush);

    HRESULT (STDMETHODCALLTYPE *CreateColorProfileResource)(
        IXpsOMObjectFactory *This,
        IStream *acquiredStream,
        IOpcPartUri *partUri,
        IXpsOMColorProfileResource **colorProfileResource);

    HRESULT (STDMETHODCALLTYPE *CreateImageBrush)(
        IXpsOMObjectFactory *This,
        IXpsOMImageResource *image,
        const XPS_RECT *viewBox,
        const XPS_RECT *viewPort,
        IXpsOMImageBrush **imageBrush);

    HRESULT (STDMETHODCALLTYPE *CreateVisualBrush)(
        IXpsOMObjectFactory *This,
        const XPS_RECT *viewBox,
        const XPS_RECT *viewPort,
        IXpsOMVisualBrush **visualBrush);

    HRESULT (STDMETHODCALLTYPE *CreateImageResource)(
        IXpsOMObjectFactory *This,
        IStream *acquiredStream,
        XPS_IMAGE_TYPE contentType,
        IOpcPartUri *partUri,
        IXpsOMImageResource **imageResource);

    HRESULT (STDMETHODCALLTYPE *CreatePrintTicketResource)(
        IXpsOMObjectFactory *This,
        IStream *acquiredStream,
        IOpcPartUri *partUri,
        IXpsOMPrintTicketResource **printTicketResource);

    HRESULT (STDMETHODCALLTYPE *CreateFontResource)(
        IXpsOMObjectFactory *This,
        IStream *acquiredStream,
        XPS_FONT_EMBEDDING fontEmbedding,
        IOpcPartUri *partUri,
        WINBOOL isObfSourceStream,
        IXpsOMFontResource **fontResource);

    HRESULT (STDMETHODCALLTYPE *CreateGradientStop)(
        IXpsOMObjectFactory *This,
        const XPS_COLOR *color,
        IXpsOMColorProfileResource *colorProfile,
        FLOAT offset,
        IXpsOMGradientStop **gradientStop);

    HRESULT (STDMETHODCALLTYPE *CreateLinearGradientBrush)(
        IXpsOMObjectFactory *This,
        IXpsOMGradientStop *gradStop1,
        IXpsOMGradientStop *gradStop2,
        const XPS_POINT *startPoint,
        const XPS_POINT *endPoint,
        IXpsOMLinearGradientBrush **linearGradientBrush);

    HRESULT (STDMETHODCALLTYPE *CreateRadialGradientBrush)(
        IXpsOMObjectFactory *This,
        IXpsOMGradientStop *gradStop1,
        IXpsOMGradientStop *gradStop2,
        const XPS_POINT *centerPoint,
        const XPS_POINT *gradientOrigin,
        const XPS_SIZE *radiiSizes,
        IXpsOMRadialGradientBrush **radialGradientBrush);

    HRESULT (STDMETHODCALLTYPE *CreateCoreProperties)(
        IXpsOMObjectFactory *This,
        IOpcPartUri *partUri,
        IXpsOMCoreProperties **coreProperties);

    HRESULT (STDMETHODCALLTYPE *CreateDictionary)(
        IXpsOMObjectFactory *This,
        IXpsOMDictionary **dictionary);

    HRESULT (STDMETHODCALLTYPE *CreatePartUriCollection)(
        IXpsOMObjectFactory *This,
        IXpsOMPartUriCollection **partUriCollection);

    HRESULT (STDMETHODCALLTYPE *CreatePackageWriterOnFile)(
        IXpsOMObjectFactory *This,
        LPCWSTR fileName,
        LPSECURITY_ATTRIBUTES securityAttributes,
        DWORD flagsAndAttributes,
        WINBOOL optimizeMarkupSize,
        XPS_INTERLEAVING interleaving,
        IOpcPartUri *documentSequencePartName,
        IXpsOMCoreProperties *coreProperties,
        IXpsOMImageResource *packageThumbnail,
        IXpsOMPrintTicketResource *documentSequencePrintTicket,
        IOpcPartUri *discardControlPartName,
        IXpsOMPackageWriter **packageWriter);

    HRESULT (STDMETHODCALLTYPE *CreatePackageWriterOnStream)(
        IXpsOMObjectFactory *This,
        ISequentialStream *outputStream,
        WINBOOL optimizeMarkupSize,
        XPS_INTERLEAVING interleaving,
        IOpcPartUri *documentSequencePartName,
        IXpsOMCoreProperties *coreProperties,
        IXpsOMImageResource *packageThumbnail,
        IXpsOMPrintTicketResource *documentSequencePrintTicket,
        IOpcPartUri *discardControlPartName,
        IXpsOMPackageWriter **packageWriter);

    HRESULT (STDMETHODCALLTYPE *CreatePartUri)(
        IXpsOMObjectFactory *This,
        LPCWSTR uri,
        IOpcPartUri **partUri);

    HRESULT (STDMETHODCALLTYPE *CreateReadOnlyStreamOnFile)(
        IXpsOMObjectFactory *This,
        LPCWSTR filename,
        IStream **stream);

    END_INTERFACE
} IXpsOMObjectFactoryVtbl;

interface IXpsOMObjectFactory {
    CONST_VTBL IXpsOMObjectFactoryVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IXpsOMObjectFactory_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IXpsOMObjectFactory_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IXpsOMObjectFactory_Release(This) (This)->lpVtbl->Release(This)
/*** IXpsOMObjectFactory methods ***/
#define IXpsOMObjectFactory_CreatePackage(This,package) (This)->lpVtbl->CreatePackage(This,package)
#define IXpsOMObjectFactory_CreatePackageFromFile(This,filename,reuseObjects,package) (This)->lpVtbl->CreatePackageFromFile(This,filename,reuseObjects,package)
#define IXpsOMObjectFactory_CreatePackageFromStream(This,stream,reuseObjects,package) (This)->lpVtbl->CreatePackageFromStream(This,stream,reuseObjects,package)
#define IXpsOMObjectFactory_CreateStoryFragmentsResource(This,acquiredStream,partUri,storyFragmentsResource) (This)->lpVtbl->CreateStoryFragmentsResource(This,acquiredStream,partUri,storyFragmentsResource)
#define IXpsOMObjectFactory_CreateDocumentStructureResource(This,acquiredStream,partUri,documentStructureResource) (This)->lpVtbl->CreateDocumentStructureResource(This,acquiredStream,partUri,documentStructureResource)
#define IXpsOMObjectFactory_CreateSignatureBlockResource(This,acquiredStream,partUri,signatureBlockResource) (This)->lpVtbl->CreateSignatureBlockResource(This,acquiredStream,partUri,signatureBlockResource)
#define IXpsOMObjectFactory_CreateRemoteDictionaryResource(This,dictionary,partUri,remoteDictionaryResource) (This)->lpVtbl->CreateRemoteDictionaryResource(This,dictionary,partUri,remoteDictionaryResource)
#define IXpsOMObjectFactory_CreateRemoteDictionaryResourceFromStream(This,dictionaryMarkupStream,dictionaryPartUri,resources,dictionaryResource) (This)->lpVtbl->CreateRemoteDictionaryResourceFromStream(This,dictionaryMarkupStream,dictionaryPartUri,resources,dictionaryResource)
#define IXpsOMObjectFactory_CreatePartResources(This,partResources) (This)->lpVtbl->CreatePartResources(This,partResources)
#define IXpsOMObjectFactory_CreateDocumentSequence(This,partUri,documentSequence) (This)->lpVtbl->CreateDocumentSequence(This,partUri,documentSequence)
#define IXpsOMObjectFactory_CreateDocument(This,partUri,document) (This)->lpVtbl->CreateDocument(This,partUri,document)
#define IXpsOMObjectFactory_CreatePageReference(This,advisoryPageDimensions,pageReference) (This)->lpVtbl->CreatePageReference(This,advisoryPageDimensions,pageReference)
#define IXpsOMObjectFactory_CreatePage(This,pageDimensions,language,partUri,page) (This)->lpVtbl->CreatePage(This,pageDimensions,language,partUri,page)
#define IXpsOMObjectFactory_CreatePageFromStream(This,pageMarkupStream,partUri,resources,reuseObjects,page) (This)->lpVtbl->CreatePageFromStream(This,pageMarkupStream,partUri,resources,reuseObjects,page)
#define IXpsOMObjectFactory_CreateCanvas(This,canvas) (This)->lpVtbl->CreateCanvas(This,canvas)
#define IXpsOMObjectFactory_CreateGlyphs(This,fontResource,glyphs) (This)->lpVtbl->CreateGlyphs(This,fontResource,glyphs)
#define IXpsOMObjectFactory_CreatePath(This,path) (This)->lpVtbl->CreatePath(This,path)
#define IXpsOMObjectFactory_CreateGeometry(This,geometry) (This)->lpVtbl->CreateGeometry(This,geometry)
#define IXpsOMObjectFactory_CreateGeometryFigure(This,startPoint,figure) (This)->lpVtbl->CreateGeometryFigure(This,startPoint,figure)
#define IXpsOMObjectFactory_CreateMatrixTransform(This,matrix,transform) (This)->lpVtbl->CreateMatrixTransform(This,matrix,transform)
#define IXpsOMObjectFactory_CreateSolidColorBrush(This,color,colorProfile,solidColorBrush) (This)->lpVtbl->CreateSolidColorBrush(This,color,colorProfile,solidColorBrush)
#define IXpsOMObjectFactory_CreateColorProfileResource(This,acquiredStream,partUri,colorProfileResource) (This)->lpVtbl->CreateColorProfileResource(This,acquiredStream,partUri,colorProfileResource)
#define IXpsOMObjectFactory_CreateImageBrush(This,image,viewBox,viewPort,imageBrush) (This)->lpVtbl->CreateImageBrush(This,image,viewBox,viewPort,imageBrush)
#define IXpsOMObjectFactory_CreateVisualBrush(This,viewBox,viewPort,visualBrush) (This)->lpVtbl->CreateVisualBrush(This,viewBox,viewPort,visualBrush)
#define IXpsOMObjectFactory_CreateImageResource(This,acquiredStream,contentType,partUri,imageResource) (This)->lpVtbl->CreateImageResource(This,acquiredStream,contentType,partUri,imageResource)
#define IXpsOMObjectFactory_CreatePrintTicketResource(This,acquiredStream,partUri,printTicketResource) (This)->lpVtbl->CreatePrintTicketResource(This,acquiredStream,partUri,printTicketResource)
#define IXpsOMObjectFactory_CreateFontResource(This,acquiredStream,fontEmbedding,partUri,isObfSourceStream,fontResource) (This)->lpVtbl->CreateFontResource(This,acquiredStream,fontEmbedding,partUri,isObfSourceStream,fontResource)
#define IXpsOMObjectFactory_CreateGradientStop(This,color,colorProfile,offset,gradientStop) (This)->lpVtbl->CreateGradientStop(This,color,colorProfile,offset,gradientStop)
#define IXpsOMObjectFactory_CreateLinearGradientBrush(This,gradStop1,gradStop2,startPoint,endPoint,linearGradientBrush) (This)->lpVtbl->CreateLinearGradientBrush(This,gradStop1,gradStop2,startPoint,endPoint,linearGradientBrush)
#define IXpsOMObjectFactory_CreateRadialGradientBrush(This,gradStop1,gradStop2,centerPoint,gradientOrigin,radiiSizes,radialGradientBrush) (This)->lpVtbl->CreateRadialGradientBrush(This,gradStop1,gradStop2,centerPoint,gradientOrigin,radiiSizes,radialGradientBrush)
#define IXpsOMObjectFactory_CreateCoreProperties(This,partUri,coreProperties) (This)->lpVtbl->CreateCoreProperties(This,partUri,coreProperties)
#define IXpsOMObjectFactory_CreateDictionary(This,dictionary) (This)->lpVtbl->CreateDictionary(This,dictionary)
#define IXpsOMObjectFactory_CreatePartUriCollection(This,partUriCollection) (This)->lpVtbl->CreatePartUriCollection(This,partUriCollection)
#define IXpsOMObjectFactory_CreatePackageWriterOnFile(This,fileName,securityAttributes,flagsAndAttributes,optimizeMarkupSize,interleaving,documentSequencePartName,coreProperties,packageThumbnail,documentSequencePrintTicket,discardControlPartName,packageWriter) (This)->lpVtbl->CreatePackageWriterOnFile(This,fileName,securityAttributes,flagsAndAttributes,optimizeMarkupSize,interleaving,documentSequencePartName,coreProperties,packageThumbnail,documentSequencePrintTicket,discardControlPartName,packageWriter)
#define IXpsOMObjectFactory_CreatePackageWriterOnStream(This,outputStream,optimizeMarkupSize,interleaving,documentSequencePartName,coreProperties,packageThumbnail,documentSequencePrintTicket,discardControlPartName,packageWriter) (This)->lpVtbl->CreatePackageWriterOnStream(This,outputStream,optimizeMarkupSize,interleaving,documentSequencePartName,coreProperties,packageThumbnail,documentSequencePrintTicket,discardControlPartName,packageWriter)
#define IXpsOMObjectFactory_CreatePartUri(This,uri,partUri) (This)->lpVtbl->CreatePartUri(This,uri,partUri)
#define IXpsOMObjectFactory_CreateReadOnlyStreamOnFile(This,filename,stream) (This)->lpVtbl->CreateReadOnlyStreamOnFile(This,filename,stream)
#else
/*** IUnknown methods ***/
static __WIDL_INLINE HRESULT IXpsOMObjectFactory_QueryInterface(IXpsOMObjectFactory* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IXpsOMObjectFactory_AddRef(IXpsOMObjectFactory* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IXpsOMObjectFactory_Release(IXpsOMObjectFactory* This) {
    return This->lpVtbl->Release(This);
}
/*** IXpsOMObjectFactory methods ***/
static __WIDL_INLINE HRESULT IXpsOMObjectFactory_CreatePackage(IXpsOMObjectFactory* This,IXpsOMPackage **package) {
    return This->lpVtbl->CreatePackage(This,package);
}
static __WIDL_INLINE HRESULT IXpsOMObjectFactory_CreatePackageFromFile(IXpsOMObjectFactory* This,LPCWSTR filename,WINBOOL reuseObjects,IXpsOMPackage **package) {
    return This->lpVtbl->CreatePackageFromFile(This,filename,reuseObjects,package);
}
static __WIDL_INLINE HRESULT IXpsOMObjectFactory_CreatePackageFromStream(IXpsOMObjectFactory* This,IStream *stream,WINBOOL reuseObjects,IXpsOMPackage **package) {
    return This->lpVtbl->CreatePackageFromStream(This,stream,reuseObjects,package);
}
static __WIDL_INLINE HRESULT IXpsOMObjectFactory_CreateStoryFragmentsResource(IXpsOMObjectFactory* This,IStream *acquiredStream,IOpcPartUri *partUri,IXpsOMStoryFragmentsResource **storyFragmentsResource) {
    return This->lpVtbl->CreateStoryFragmentsResource(This,acquiredStream,partUri,storyFragmentsResource);
}
static __WIDL_INLINE HRESULT IXpsOMObjectFactory_CreateDocumentStructureResource(IXpsOMObjectFactory* This,IStream *acquiredStream,IOpcPartUri *partUri,IXpsOMDocumentStructureResource **documentStructureResource) {
    return This->lpVtbl->CreateDocumentStructureResource(This,acquiredStream,partUri,documentStructureResource);
}
static __WIDL_INLINE HRESULT IXpsOMObjectFactory_CreateSignatureBlockResource(IXpsOMObjectFactory* This,IStream *acquiredStream,IOpcPartUri *partUri,IXpsOMSignatureBlockResource **signatureBlockResource) {
    return This->lpVtbl->CreateSignatureBlockResource(This,acquiredStream,partUri,signatureBlockResource);
}
static __WIDL_INLINE HRESULT IXpsOMObjectFactory_CreateRemoteDictionaryResource(IXpsOMObjectFactory* This,IXpsOMDictionary *dictionary,IOpcPartUri *partUri,IXpsOMRemoteDictionaryResource **remoteDictionaryResource) {
    return This->lpVtbl->CreateRemoteDictionaryResource(This,dictionary,partUri,remoteDictionaryResource);
}
static __WIDL_INLINE HRESULT IXpsOMObjectFactory_CreateRemoteDictionaryResourceFromStream(IXpsOMObjectFactory* This,IStream *dictionaryMarkupStream,IOpcPartUri *dictionaryPartUri,IXpsOMPartResources *resources,IXpsOMRemoteDictionaryResource **dictionaryResource) {
    return This->lpVtbl->CreateRemoteDictionaryResourceFromStream(This,dictionaryMarkupStream,dictionaryPartUri,resources,dictionaryResource);
}
static __WIDL_INLINE HRESULT IXpsOMObjectFactory_CreatePartResources(IXpsOMObjectFactory* This,IXpsOMPartResources **partResources) {
    return This->lpVtbl->CreatePartResources(This,partResources);
}
static __WIDL_INLINE HRESULT IXpsOMObjectFactory_CreateDocumentSequence(IXpsOMObjectFactory* This,IOpcPartUri *partUri,IXpsOMDocumentSequence **documentSequence) {
    return This->lpVtbl->CreateDocumentSequence(This,partUri,documentSequence);
}
static __WIDL_INLINE HRESULT IXpsOMObjectFactory_CreateDocument(IXpsOMObjectFactory* This,IOpcPartUri *partUri,IXpsOMDocument **document) {
    return This->lpVtbl->CreateDocument(This,partUri,document);
}
static __WIDL_INLINE HRESULT IXpsOMObjectFactory_CreatePageReference(IXpsOMObjectFactory* This,const XPS_SIZE *advisoryPageDimensions,IXpsOMPageReference **pageReference) {
    return This->lpVtbl->CreatePageReference(This,advisoryPageDimensions,pageReference);
}
static __WIDL_INLINE HRESULT IXpsOMObjectFactory_CreatePage(IXpsOMObjectFactory* This,const XPS_SIZE *pageDimensions,LPCWSTR language,IOpcPartUri *partUri,IXpsOMPage **page) {
    return This->lpVtbl->CreatePage(This,pageDimensions,language,partUri,page);
}
static __WIDL_INLINE HRESULT IXpsOMObjectFactory_CreatePageFromStream(IXpsOMObjectFactory* This,IStream *pageMarkupStream,IOpcPartUri *partUri,IXpsOMPartResources *resources,WINBOOL reuseObjects,IXpsOMPage **page) {
    return This->lpVtbl->CreatePageFromStream(This,pageMarkupStream,partUri,resources,reuseObjects,page);
}
static __WIDL_INLINE HRESULT IXpsOMObjectFactory_CreateCanvas(IXpsOMObjectFactory* This,IXpsOMCanvas **canvas) {
    return This->lpVtbl->CreateCanvas(This,canvas);
}
static __WIDL_INLINE HRESULT IXpsOMObjectFactory_CreateGlyphs(IXpsOMObjectFactory* This,IXpsOMFontResource *fontResource,IXpsOMGlyphs **glyphs) {
    return This->lpVtbl->CreateGlyphs(This,fontResource,glyphs);
}
static __WIDL_INLINE HRESULT IXpsOMObjectFactory_CreatePath(IXpsOMObjectFactory* This,IXpsOMPath **path) {
    return This->lpVtbl->CreatePath(This,path);
}
static __WIDL_INLINE HRESULT IXpsOMObjectFactory_CreateGeometry(IXpsOMObjectFactory* This,IXpsOMGeometry **geometry) {
    return This->lpVtbl->CreateGeometry(This,geometry);
}
static __WIDL_INLINE HRESULT IXpsOMObjectFactory_CreateGeometryFigure(IXpsOMObjectFactory* This,const XPS_POINT *startPoint,IXpsOMGeometryFigure **figure) {
    return This->lpVtbl->CreateGeometryFigure(This,startPoint,figure);
}
static __WIDL_INLINE HRESULT IXpsOMObjectFactory_CreateMatrixTransform(IXpsOMObjectFactory* This,const XPS_MATRIX *matrix,IXpsOMMatrixTransform **transform) {
    return This->lpVtbl->CreateMatrixTransform(This,matrix,transform);
}
static __WIDL_INLINE HRESULT IXpsOMObjectFactory_CreateSolidColorBrush(IXpsOMObjectFactory* This,const XPS_COLOR *color,IXpsOMColorProfileResource *colorProfile,IXpsOMSolidColorBrush **solidColorBrush) {
    return This->lpVtbl->CreateSolidColorBrush(This,color,colorProfile,solidColorBrush);
}
static __WIDL_INLINE HRESULT IXpsOMObjectFactory_CreateColorProfileResource(IXpsOMObjectFactory* This,IStream *acquiredStream,IOpcPartUri *partUri,IXpsOMColorProfileResource **colorProfileResource) {
    return This->lpVtbl->CreateColorProfileResource(This,acquiredStream,partUri,colorProfileResource);
}
static __WIDL_INLINE HRESULT IXpsOMObjectFactory_CreateImageBrush(IXpsOMObjectFactory* This,IXpsOMImageResource *image,const XPS_RECT *viewBox,const XPS_RECT *viewPort,IXpsOMImageBrush **imageBrush) {
    return This->lpVtbl->CreateImageBrush(This,image,viewBox,viewPort,imageBrush);
}
static __WIDL_INLINE HRESULT IXpsOMObjectFactory_CreateVisualBrush(IXpsOMObjectFactory* This,const XPS_RECT *viewBox,const XPS_RECT *viewPort,IXpsOMVisualBrush **visualBrush) {
    return This->lpVtbl->CreateVisualBrush(This,viewBox,viewPort,visualBrush);
}
static __WIDL_INLINE HRESULT IXpsOMObjectFactory_CreateImageResource(IXpsOMObjectFactory* This,IStream *acquiredStream,XPS_IMAGE_TYPE contentType,IOpcPartUri *partUri,IXpsOMImageResource **imageResource) {
    return This->lpVtbl->CreateImageResource(This,acquiredStream,contentType,partUri,imageResource);
}
static __WIDL_INLINE HRESULT IXpsOMObjectFactory_CreatePrintTicketResource(IXpsOMObjectFactory* This,IStream *acquiredStream,IOpcPartUri *partUri,IXpsOMPrintTicketResource **printTicketResource) {
    return This->lpVtbl->CreatePrintTicketResource(This,acquiredStream,partUri,printTicketResource);
}
static __WIDL_INLINE HRESULT IXpsOMObjectFactory_CreateFontResource(IXpsOMObjectFactory* This,IStream *acquiredStream,XPS_FONT_EMBEDDING fontEmbedding,IOpcPartUri *partUri,WINBOOL isObfSourceStream,IXpsOMFontResource **fontResource) {
    return This->lpVtbl->CreateFontResource(This,acquiredStream,fontEmbedding,partUri,isObfSourceStream,fontResource);
}
static __WIDL_INLINE HRESULT IXpsOMObjectFactory_CreateGradientStop(IXpsOMObjectFactory* This,const XPS_COLOR *color,IXpsOMColorProfileResource *colorProfile,FLOAT offset,IXpsOMGradientStop **gradientStop) {
    return This->lpVtbl->CreateGradientStop(This,color,colorProfile,offset,gradientStop);
}
static __WIDL_INLINE HRESULT IXpsOMObjectFactory_CreateLinearGradientBrush(IXpsOMObjectFactory* This,IXpsOMGradientStop *gradStop1,IXpsOMGradientStop *gradStop2,const XPS_POINT *startPoint,const XPS_POINT *endPoint,IXpsOMLinearGradientBrush **linearGradientBrush) {
    return This->lpVtbl->CreateLinearGradientBrush(This,gradStop1,gradStop2,startPoint,endPoint,linearGradientBrush);
}
static __WIDL_INLINE HRESULT IXpsOMObjectFactory_CreateRadialGradientBrush(IXpsOMObjectFactory* This,IXpsOMGradientStop *gradStop1,IXpsOMGradientStop *gradStop2,const XPS_POINT *centerPoint,const XPS_POINT *gradientOrigin,const XPS_SIZE *radiiSizes,IXpsOMRadialGradientBrush **radialGradientBrush) {
    return This->lpVtbl->CreateRadialGradientBrush(This,gradStop1,gradStop2,centerPoint,gradientOrigin,radiiSizes,radialGradientBrush);
}
static __WIDL_INLINE HRESULT IXpsOMObjectFactory_CreateCoreProperties(IXpsOMObjectFactory* This,IOpcPartUri *partUri,IXpsOMCoreProperties **coreProperties) {
    return This->lpVtbl->CreateCoreProperties(This,partUri,coreProperties);
}
static __WIDL_INLINE HRESULT IXpsOMObjectFactory_CreateDictionary(IXpsOMObjectFactory* This,IXpsOMDictionary **dictionary) {
    return This->lpVtbl->CreateDictionary(This,dictionary);
}
static __WIDL_INLINE HRESULT IXpsOMObjectFactory_CreatePartUriCollection(IXpsOMObjectFactory* This,IXpsOMPartUriCollection **partUriCollection) {
    return This->lpVtbl->CreatePartUriCollection(This,partUriCollection);
}
static __WIDL_INLINE HRESULT IXpsOMObjectFactory_CreatePackageWriterOnFile(IXpsOMObjectFactory* This,LPCWSTR fileName,LPSECURITY_ATTRIBUTES securityAttributes,DWORD flagsAndAttributes,WINBOOL optimizeMarkupSize,XPS_INTERLEAVING interleaving,IOpcPartUri *documentSequencePartName,IXpsOMCoreProperties *coreProperties,IXpsOMImageResource *packageThumbnail,IXpsOMPrintTicketResource *documentSequencePrintTicket,IOpcPartUri *discardControlPartName,IXpsOMPackageWriter **packageWriter) {
    return This->lpVtbl->CreatePackageWriterOnFile(This,fileName,securityAttributes,flagsAndAttributes,optimizeMarkupSize,interleaving,documentSequencePartName,coreProperties,packageThumbnail,documentSequencePrintTicket,discardControlPartName,packageWriter);
}
static __WIDL_INLINE HRESULT IXpsOMObjectFactory_CreatePackageWriterOnStream(IXpsOMObjectFactory* This,ISequentialStream *outputStream,WINBOOL optimizeMarkupSize,XPS_INTERLEAVING interleaving,IOpcPartUri *documentSequencePartName,IXpsOMCoreProperties *coreProperties,IXpsOMImageResource *packageThumbnail,IXpsOMPrintTicketResource *documentSequencePrintTicket,IOpcPartUri *discardControlPartName,IXpsOMPackageWriter **packageWriter) {
    return This->lpVtbl->CreatePackageWriterOnStream(This,outputStream,optimizeMarkupSize,interleaving,documentSequencePartName,coreProperties,packageThumbnail,documentSequencePrintTicket,discardControlPartName,packageWriter);
}
static __WIDL_INLINE HRESULT IXpsOMObjectFactory_CreatePartUri(IXpsOMObjectFactory* This,LPCWSTR uri,IOpcPartUri **partUri) {
    return This->lpVtbl->CreatePartUri(This,uri,partUri);
}
static __WIDL_INLINE HRESULT IXpsOMObjectFactory_CreateReadOnlyStreamOnFile(IXpsOMObjectFactory* This,LPCWSTR filename,IStream **stream) {
    return This->lpVtbl->CreateReadOnlyStreamOnFile(This,filename,stream);
}
#endif
#endif

#endif


#endif  /* __IXpsOMObjectFactory_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IXpsOMNameCollection interface
 */
#ifndef __IXpsOMNameCollection_INTERFACE_DEFINED__
#define __IXpsOMNameCollection_INTERFACE_DEFINED__

DEFINE_GUID(IID_IXpsOMNameCollection, 0x4bddf8ec, 0xc915, 0x421b, 0xa1,0x66, 0xd1,0x73,0xd2,0x56,0x53,0xd2);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("4bddf8ec-c915-421b-a166-d173d25653d2")
IXpsOMNameCollection : public IUnknown
{
    virtual HRESULT STDMETHODCALLTYPE GetCount(
        UINT32 *count) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetAt(
        UINT32 index,
        LPWSTR *name) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IXpsOMNameCollection, 0x4bddf8ec, 0xc915, 0x421b, 0xa1,0x66, 0xd1,0x73,0xd2,0x56,0x53,0xd2)
#endif
#else
typedef struct IXpsOMNameCollectionVtbl {
    BEGIN_INTERFACE

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

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

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

    /*** IXpsOMNameCollection methods ***/
    HRESULT (STDMETHODCALLTYPE *GetCount)(
        IXpsOMNameCollection *This,
        UINT32 *count);

    HRESULT (STDMETHODCALLTYPE *GetAt)(
        IXpsOMNameCollection *This,
        UINT32 index,
        LPWSTR *name);

    END_INTERFACE
} IXpsOMNameCollectionVtbl;

interface IXpsOMNameCollection {
    CONST_VTBL IXpsOMNameCollectionVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IXpsOMNameCollection_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IXpsOMNameCollection_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IXpsOMNameCollection_Release(This) (This)->lpVtbl->Release(This)
/*** IXpsOMNameCollection methods ***/
#define IXpsOMNameCollection_GetCount(This,count) (This)->lpVtbl->GetCount(This,count)
#define IXpsOMNameCollection_GetAt(This,index,name) (This)->lpVtbl->GetAt(This,index,name)
#else
/*** IUnknown methods ***/
static __WIDL_INLINE HRESULT IXpsOMNameCollection_QueryInterface(IXpsOMNameCollection* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IXpsOMNameCollection_AddRef(IXpsOMNameCollection* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IXpsOMNameCollection_Release(IXpsOMNameCollection* This) {
    return This->lpVtbl->Release(This);
}
/*** IXpsOMNameCollection methods ***/
static __WIDL_INLINE HRESULT IXpsOMNameCollection_GetCount(IXpsOMNameCollection* This,UINT32 *count) {
    return This->lpVtbl->GetCount(This,count);
}
static __WIDL_INLINE HRESULT IXpsOMNameCollection_GetAt(IXpsOMNameCollection* This,UINT32 index,LPWSTR *name) {
    return This->lpVtbl->GetAt(This,index,name);
}
#endif
#endif

#endif


#endif  /* __IXpsOMNameCollection_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IXpsOMPartUriCollection interface
 */
#ifndef __IXpsOMPartUriCollection_INTERFACE_DEFINED__
#define __IXpsOMPartUriCollection_INTERFACE_DEFINED__

DEFINE_GUID(IID_IXpsOMPartUriCollection, 0x57c650d4, 0x067c, 0x4893, 0x8c,0x33, 0xf6,0x2a,0x06,0x33,0x73,0x0f);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("57c650d4-067c-4893-8c33-f62a0633730f")
IXpsOMPartUriCollection : public IUnknown
{
    virtual HRESULT STDMETHODCALLTYPE GetCount(
        UINT32 *count) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetAt(
        UINT32 index,
        IOpcPartUri **partUri) = 0;

    virtual HRESULT STDMETHODCALLTYPE InsertAt(
        UINT32 index,
        IOpcPartUri *partUri) = 0;

    virtual HRESULT STDMETHODCALLTYPE RemoveAt(
        UINT32 index) = 0;

    virtual HRESULT STDMETHODCALLTYPE SetAt(
        UINT32 index,
        IOpcPartUri *partUri) = 0;

    virtual HRESULT STDMETHODCALLTYPE Append(
        IOpcPartUri *partUri) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IXpsOMPartUriCollection, 0x57c650d4, 0x067c, 0x4893, 0x8c,0x33, 0xf6,0x2a,0x06,0x33,0x73,0x0f)
#endif
#else
typedef struct IXpsOMPartUriCollectionVtbl {
    BEGIN_INTERFACE

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

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

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

    /*** IXpsOMPartUriCollection methods ***/
    HRESULT (STDMETHODCALLTYPE *GetCount)(
        IXpsOMPartUriCollection *This,
        UINT32 *count);

    HRESULT (STDMETHODCALLTYPE *GetAt)(
        IXpsOMPartUriCollection *This,
        UINT32 index,
        IOpcPartUri **partUri);

    HRESULT (STDMETHODCALLTYPE *InsertAt)(
        IXpsOMPartUriCollection *This,
        UINT32 index,
        IOpcPartUri *partUri);

    HRESULT (STDMETHODCALLTYPE *RemoveAt)(
        IXpsOMPartUriCollection *This,
        UINT32 index);

    HRESULT (STDMETHODCALLTYPE *SetAt)(
        IXpsOMPartUriCollection *This,
        UINT32 index,
        IOpcPartUri *partUri);

    HRESULT (STDMETHODCALLTYPE *Append)(
        IXpsOMPartUriCollection *This,
        IOpcPartUri *partUri);

    END_INTERFACE
} IXpsOMPartUriCollectionVtbl;

interface IXpsOMPartUriCollection {
    CONST_VTBL IXpsOMPartUriCollectionVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IXpsOMPartUriCollection_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IXpsOMPartUriCollection_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IXpsOMPartUriCollection_Release(This) (This)->lpVtbl->Release(This)
/*** IXpsOMPartUriCollection methods ***/
#define IXpsOMPartUriCollection_GetCount(This,count) (This)->lpVtbl->GetCount(This,count)
#define IXpsOMPartUriCollection_GetAt(This,index,partUri) (This)->lpVtbl->GetAt(This,index,partUri)
#define IXpsOMPartUriCollection_InsertAt(This,index,partUri) (This)->lpVtbl->InsertAt(This,index,partUri)
#define IXpsOMPartUriCollection_RemoveAt(This,index) (This)->lpVtbl->RemoveAt(This,index)
#define IXpsOMPartUriCollection_SetAt(This,index,partUri) (This)->lpVtbl->SetAt(This,index,partUri)
#define IXpsOMPartUriCollection_Append(This,partUri) (This)->lpVtbl->Append(This,partUri)
#else
/*** IUnknown methods ***/
static __WIDL_INLINE HRESULT IXpsOMPartUriCollection_QueryInterface(IXpsOMPartUriCollection* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IXpsOMPartUriCollection_AddRef(IXpsOMPartUriCollection* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IXpsOMPartUriCollection_Release(IXpsOMPartUriCollection* This) {
    return This->lpVtbl->Release(This);
}
/*** IXpsOMPartUriCollection methods ***/
static __WIDL_INLINE HRESULT IXpsOMPartUriCollection_GetCount(IXpsOMPartUriCollection* This,UINT32 *count) {
    return This->lpVtbl->GetCount(This,count);
}
static __WIDL_INLINE HRESULT IXpsOMPartUriCollection_GetAt(IXpsOMPartUriCollection* This,UINT32 index,IOpcPartUri **partUri) {
    return This->lpVtbl->GetAt(This,index,partUri);
}
static __WIDL_INLINE HRESULT IXpsOMPartUriCollection_InsertAt(IXpsOMPartUriCollection* This,UINT32 index,IOpcPartUri *partUri) {
    return This->lpVtbl->InsertAt(This,index,partUri);
}
static __WIDL_INLINE HRESULT IXpsOMPartUriCollection_RemoveAt(IXpsOMPartUriCollection* This,UINT32 index) {
    return This->lpVtbl->RemoveAt(This,index);
}
static __WIDL_INLINE HRESULT IXpsOMPartUriCollection_SetAt(IXpsOMPartUriCollection* This,UINT32 index,IOpcPartUri *partUri) {
    return This->lpVtbl->SetAt(This,index,partUri);
}
static __WIDL_INLINE HRESULT IXpsOMPartUriCollection_Append(IXpsOMPartUriCollection* This,IOpcPartUri *partUri) {
    return This->lpVtbl->Append(This,partUri);
}
#endif
#endif

#endif


#endif  /* __IXpsOMPartUriCollection_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IXpsOMPackageWriter interface
 */
#ifndef __IXpsOMPackageWriter_INTERFACE_DEFINED__
#define __IXpsOMPackageWriter_INTERFACE_DEFINED__

DEFINE_GUID(IID_IXpsOMPackageWriter, 0x4e2aa182, 0xa443, 0x42c6, 0xb4,0x1b, 0x4f,0x8e,0x9d,0xe7,0x3f,0xf9);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("4e2aa182-a443-42c6-b41b-4f8e9de73ff9")
IXpsOMPackageWriter : public IUnknown
{
    virtual HRESULT STDMETHODCALLTYPE StartNewDocument(
        IOpcPartUri *documentPartName,
        IXpsOMPrintTicketResource *documentPrintTicket,
        IXpsOMDocumentStructureResource *documentStructure,
        IXpsOMSignatureBlockResourceCollection *signatureBlockResources,
        IXpsOMPartUriCollection *restrictedFonts) = 0;

    virtual HRESULT STDMETHODCALLTYPE AddPage(
        IXpsOMPage *page,
        const XPS_SIZE *advisoryPageDimensions,
        IXpsOMPartUriCollection *discardableResourceParts,
        IXpsOMStoryFragmentsResource *storyFragments,
        IXpsOMPrintTicketResource *pagePrintTicket,
        IXpsOMImageResource *pageThumbnail) = 0;

    virtual HRESULT STDMETHODCALLTYPE AddResource(
        IXpsOMResource *resource) = 0;

    virtual HRESULT STDMETHODCALLTYPE Close(
        ) = 0;

    virtual HRESULT STDMETHODCALLTYPE IsClosed(
        WINBOOL *isClosed) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IXpsOMPackageWriter, 0x4e2aa182, 0xa443, 0x42c6, 0xb4,0x1b, 0x4f,0x8e,0x9d,0xe7,0x3f,0xf9)
#endif
#else
typedef struct IXpsOMPackageWriterVtbl {
    BEGIN_INTERFACE

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

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

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

    /*** IXpsOMPackageWriter methods ***/
    HRESULT (STDMETHODCALLTYPE *StartNewDocument)(
        IXpsOMPackageWriter *This,
        IOpcPartUri *documentPartName,
        IXpsOMPrintTicketResource *documentPrintTicket,
        IXpsOMDocumentStructureResource *documentStructure,
        IXpsOMSignatureBlockResourceCollection *signatureBlockResources,
        IXpsOMPartUriCollection *restrictedFonts);

    HRESULT (STDMETHODCALLTYPE *AddPage)(
        IXpsOMPackageWriter *This,
        IXpsOMPage *page,
        const XPS_SIZE *advisoryPageDimensions,
        IXpsOMPartUriCollection *discardableResourceParts,
        IXpsOMStoryFragmentsResource *storyFragments,
        IXpsOMPrintTicketResource *pagePrintTicket,
        IXpsOMImageResource *pageThumbnail);

    HRESULT (STDMETHODCALLTYPE *AddResource)(
        IXpsOMPackageWriter *This,
        IXpsOMResource *resource);

    HRESULT (STDMETHODCALLTYPE *Close)(
        IXpsOMPackageWriter *This);

    HRESULT (STDMETHODCALLTYPE *IsClosed)(
        IXpsOMPackageWriter *This,
        WINBOOL *isClosed);

    END_INTERFACE
} IXpsOMPackageWriterVtbl;

interface IXpsOMPackageWriter {
    CONST_VTBL IXpsOMPackageWriterVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IXpsOMPackageWriter_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IXpsOMPackageWriter_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IXpsOMPackageWriter_Release(This) (This)->lpVtbl->Release(This)
/*** IXpsOMPackageWriter methods ***/
#define IXpsOMPackageWriter_StartNewDocument(This,documentPartName,documentPrintTicket,documentStructure,signatureBlockResources,restrictedFonts) (This)->lpVtbl->StartNewDocument(This,documentPartName,documentPrintTicket,documentStructure,signatureBlockResources,restrictedFonts)
#define IXpsOMPackageWriter_AddPage(This,page,advisoryPageDimensions,discardableResourceParts,storyFragments,pagePrintTicket,pageThumbnail) (This)->lpVtbl->AddPage(This,page,advisoryPageDimensions,discardableResourceParts,storyFragments,pagePrintTicket,pageThumbnail)
#define IXpsOMPackageWriter_AddResource(This,resource) (This)->lpVtbl->AddResource(This,resource)
#define IXpsOMPackageWriter_Close(This) (This)->lpVtbl->Close(This)
#define IXpsOMPackageWriter_IsClosed(This,isClosed) (This)->lpVtbl->IsClosed(This,isClosed)
#else
/*** IUnknown methods ***/
static __WIDL_INLINE HRESULT IXpsOMPackageWriter_QueryInterface(IXpsOMPackageWriter* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IXpsOMPackageWriter_AddRef(IXpsOMPackageWriter* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IXpsOMPackageWriter_Release(IXpsOMPackageWriter* This) {
    return This->lpVtbl->Release(This);
}
/*** IXpsOMPackageWriter methods ***/
static __WIDL_INLINE HRESULT IXpsOMPackageWriter_StartNewDocument(IXpsOMPackageWriter* This,IOpcPartUri *documentPartName,IXpsOMPrintTicketResource *documentPrintTicket,IXpsOMDocumentStructureResource *documentStructure,IXpsOMSignatureBlockResourceCollection *signatureBlockResources,IXpsOMPartUriCollection *restrictedFonts) {
    return This->lpVtbl->StartNewDocument(This,documentPartName,documentPrintTicket,documentStructure,signatureBlockResources,restrictedFonts);
}
static __WIDL_INLINE HRESULT IXpsOMPackageWriter_AddPage(IXpsOMPackageWriter* This,IXpsOMPage *page,const XPS_SIZE *advisoryPageDimensions,IXpsOMPartUriCollection *discardableResourceParts,IXpsOMStoryFragmentsResource *storyFragments,IXpsOMPrintTicketResource *pagePrintTicket,IXpsOMImageResource *pageThumbnail) {
    return This->lpVtbl->AddPage(This,page,advisoryPageDimensions,discardableResourceParts,storyFragments,pagePrintTicket,pageThumbnail);
}
static __WIDL_INLINE HRESULT IXpsOMPackageWriter_AddResource(IXpsOMPackageWriter* This,IXpsOMResource *resource) {
    return This->lpVtbl->AddResource(This,resource);
}
static __WIDL_INLINE HRESULT IXpsOMPackageWriter_Close(IXpsOMPackageWriter* This) {
    return This->lpVtbl->Close(This);
}
static __WIDL_INLINE HRESULT IXpsOMPackageWriter_IsClosed(IXpsOMPackageWriter* This,WINBOOL *isClosed) {
    return This->lpVtbl->IsClosed(This,isClosed);
}
#endif
#endif

#endif


#endif  /* __IXpsOMPackageWriter_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IXpsOMPackageTarget interface
 */
#ifndef __IXpsOMPackageTarget_INTERFACE_DEFINED__
#define __IXpsOMPackageTarget_INTERFACE_DEFINED__

DEFINE_GUID(IID_IXpsOMPackageTarget, 0x219a9db0, 0x4959, 0x47d0, 0x80,0x34, 0xb1,0xce,0x84,0xf4,0x1a,0x4d);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("219a9db0-4959-47d0-8034-b1ce84f41a4d")
IXpsOMPackageTarget : public IUnknown
{
    virtual HRESULT STDMETHODCALLTYPE CreateXpsOMPackageWriter(
        IOpcPartUri *documentSequencePartName,
        IXpsOMPrintTicketResource *documentSequencePrintTicket,
        IOpcPartUri *discardControlPartName,
        IXpsOMPackageWriter **packageWriter) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IXpsOMPackageTarget, 0x219a9db0, 0x4959, 0x47d0, 0x80,0x34, 0xb1,0xce,0x84,0xf4,0x1a,0x4d)
#endif
#else
typedef struct IXpsOMPackageTargetVtbl {
    BEGIN_INTERFACE

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

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

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

    /*** IXpsOMPackageTarget methods ***/
    HRESULT (STDMETHODCALLTYPE *CreateXpsOMPackageWriter)(
        IXpsOMPackageTarget *This,
        IOpcPartUri *documentSequencePartName,
        IXpsOMPrintTicketResource *documentSequencePrintTicket,
        IOpcPartUri *discardControlPartName,
        IXpsOMPackageWriter **packageWriter);

    END_INTERFACE
} IXpsOMPackageTargetVtbl;

interface IXpsOMPackageTarget {
    CONST_VTBL IXpsOMPackageTargetVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IXpsOMPackageTarget_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IXpsOMPackageTarget_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IXpsOMPackageTarget_Release(This) (This)->lpVtbl->Release(This)
/*** IXpsOMPackageTarget methods ***/
#define IXpsOMPackageTarget_CreateXpsOMPackageWriter(This,documentSequencePartName,documentSequencePrintTicket,discardControlPartName,packageWriter) (This)->lpVtbl->CreateXpsOMPackageWriter(This,documentSequencePartName,documentSequencePrintTicket,discardControlPartName,packageWriter)
#else
/*** IUnknown methods ***/
static __WIDL_INLINE HRESULT IXpsOMPackageTarget_QueryInterface(IXpsOMPackageTarget* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IXpsOMPackageTarget_AddRef(IXpsOMPackageTarget* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IXpsOMPackageTarget_Release(IXpsOMPackageTarget* This) {
    return This->lpVtbl->Release(This);
}
/*** IXpsOMPackageTarget methods ***/
static __WIDL_INLINE HRESULT IXpsOMPackageTarget_CreateXpsOMPackageWriter(IXpsOMPackageTarget* This,IOpcPartUri *documentSequencePartName,IXpsOMPrintTicketResource *documentSequencePrintTicket,IOpcPartUri *discardControlPartName,IXpsOMPackageWriter **packageWriter) {
    return This->lpVtbl->CreateXpsOMPackageWriter(This,documentSequencePartName,documentSequencePrintTicket,discardControlPartName,packageWriter);
}
#endif
#endif

#endif


#endif  /* __IXpsOMPackageTarget_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IXpsOMVisual interface
 */
#ifndef __IXpsOMVisual_INTERFACE_DEFINED__
#define __IXpsOMVisual_INTERFACE_DEFINED__

DEFINE_GUID(IID_IXpsOMVisual, 0xbc3e7333, 0xfb0b, 0x4af3, 0xa8,0x19, 0x0b,0x4e,0xaa,0xd0,0xd2,0xfd);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("bc3e7333-fb0b-4af3-a819-0b4eaad0d2fd")
IXpsOMVisual : public IXpsOMShareable
{
    virtual HRESULT STDMETHODCALLTYPE GetTransform(
        IXpsOMMatrixTransform **matrixTransform) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetTransformLocal(
        IXpsOMMatrixTransform **matrixTransform) = 0;

    virtual HRESULT STDMETHODCALLTYPE SetTransformLocal(
        IXpsOMMatrixTransform *matrixTransform) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetTransformLookup(
        LPWSTR *key) = 0;

    virtual HRESULT STDMETHODCALLTYPE SetTransformLookup(
        LPCWSTR key) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetClipGeometry(
        IXpsOMGeometry **clipGeometry) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetClipGeometryLocal(
        IXpsOMGeometry **clipGeometry) = 0;

    virtual HRESULT STDMETHODCALLTYPE SetClipGeometryLocal(
        IXpsOMGeometry *clipGeometry) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetClipGeometryLookup(
        LPWSTR *key) = 0;

    virtual HRESULT STDMETHODCALLTYPE SetClipGeometryLookup(
        LPCWSTR key) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetOpacity(
        FLOAT *opacity) = 0;

    virtual HRESULT STDMETHODCALLTYPE SetOpacity(
        FLOAT opacity) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetOpacityMaskBrush(
        IXpsOMBrush **opacityMaskBrush) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetOpacityMaskBrushLocal(
        IXpsOMBrush **opacityMaskBrush) = 0;

    virtual HRESULT STDMETHODCALLTYPE SetOpacityMaskBrushLocal(
        IXpsOMBrush *opacityMaskBrush) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetOpacityMaskBrushLookup(
        LPWSTR *key) = 0;

    virtual HRESULT STDMETHODCALLTYPE SetOpacityMaskBrushLookup(
        LPCWSTR key) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetName(
        LPWSTR *name) = 0;

    virtual HRESULT STDMETHODCALLTYPE SetName(
        LPCWSTR name) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetIsHyperlinkTarget(
        WINBOOL *isHyperlink) = 0;

    virtual HRESULT STDMETHODCALLTYPE SetIsHyperlinkTarget(
        WINBOOL isHyperlink) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetHyperlinkNavigateUri(
        IUri **hyperlinkUri) = 0;

    virtual HRESULT STDMETHODCALLTYPE SetHyperlinkNavigateUri(
        IUri *hyperlinkUri) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetLanguage(
        LPWSTR *language) = 0;

    virtual HRESULT STDMETHODCALLTYPE SetLanguage(
        LPCWSTR language) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IXpsOMVisual, 0xbc3e7333, 0xfb0b, 0x4af3, 0xa8,0x19, 0x0b,0x4e,0xaa,0xd0,0xd2,0xfd)
#endif
#else
typedef struct IXpsOMVisualVtbl {
    BEGIN_INTERFACE

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

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

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

    /*** IXpsOMShareable methods ***/
    HRESULT (STDMETHODCALLTYPE *GetOwner)(
        IXpsOMVisual *This,
        IUnknown **owner);

    HRESULT (STDMETHODCALLTYPE *GetType)(
        IXpsOMVisual *This,
        XPS_OBJECT_TYPE *type);

    /*** IXpsOMVisual methods ***/
    HRESULT (STDMETHODCALLTYPE *GetTransform)(
        IXpsOMVisual *This,
        IXpsOMMatrixTransform **matrixTransform);

    HRESULT (STDMETHODCALLTYPE *GetTransformLocal)(
        IXpsOMVisual *This,
        IXpsOMMatrixTransform **matrixTransform);

    HRESULT (STDMETHODCALLTYPE *SetTransformLocal)(
        IXpsOMVisual *This,
        IXpsOMMatrixTransform *matrixTransform);

    HRESULT (STDMETHODCALLTYPE *GetTransformLookup)(
        IXpsOMVisual *This,
        LPWSTR *key);

    HRESULT (STDMETHODCALLTYPE *SetTransformLookup)(
        IXpsOMVisual *This,
        LPCWSTR key);

    HRESULT (STDMETHODCALLTYPE *GetClipGeometry)(
        IXpsOMVisual *This,
        IXpsOMGeometry **clipGeometry);

    HRESULT (STDMETHODCALLTYPE *GetClipGeometryLocal)(
        IXpsOMVisual *This,
        IXpsOMGeometry **clipGeometry);

    HRESULT (STDMETHODCALLTYPE *SetClipGeometryLocal)(
        IXpsOMVisual *This,
        IXpsOMGeometry *clipGeometry);

    HRESULT (STDMETHODCALLTYPE *GetClipGeometryLookup)(
        IXpsOMVisual *This,
        LPWSTR *key);

    HRESULT (STDMETHODCALLTYPE *SetClipGeometryLookup)(
        IXpsOMVisual *This,
        LPCWSTR key);

    HRESULT (STDMETHODCALLTYPE *GetOpacity)(
        IXpsOMVisual *This,
        FLOAT *opacity);

    HRESULT (STDMETHODCALLTYPE *SetOpacity)(
        IXpsOMVisual *This,
        FLOAT opacity);

    HRESULT (STDMETHODCALLTYPE *GetOpacityMaskBrush)(
        IXpsOMVisual *This,
        IXpsOMBrush **opacityMaskBrush);

    HRESULT (STDMETHODCALLTYPE *GetOpacityMaskBrushLocal)(
        IXpsOMVisual *This,
        IXpsOMBrush **opacityMaskBrush);

    HRESULT (STDMETHODCALLTYPE *SetOpacityMaskBrushLocal)(
        IXpsOMVisual *This,
        IXpsOMBrush *opacityMaskBrush);

    HRESULT (STDMETHODCALLTYPE *GetOpacityMaskBrushLookup)(
        IXpsOMVisual *This,
        LPWSTR *key);

    HRESULT (STDMETHODCALLTYPE *SetOpacityMaskBrushLookup)(
        IXpsOMVisual *This,
        LPCWSTR key);

    HRESULT (STDMETHODCALLTYPE *GetName)(
        IXpsOMVisual *This,
        LPWSTR *name);

    HRESULT (STDMETHODCALLTYPE *SetName)(
        IXpsOMVisual *This,
        LPCWSTR name);

    HRESULT (STDMETHODCALLTYPE *GetIsHyperlinkTarget)(
        IXpsOMVisual *This,
        WINBOOL *isHyperlink);

    HRESULT (STDMETHODCALLTYPE *SetIsHyperlinkTarget)(
        IXpsOMVisual *This,
        WINBOOL isHyperlink);

    HRESULT (STDMETHODCALLTYPE *GetHyperlinkNavigateUri)(
        IXpsOMVisual *This,
        IUri **hyperlinkUri);

    HRESULT (STDMETHODCALLTYPE *SetHyperlinkNavigateUri)(
        IXpsOMVisual *This,
        IUri *hyperlinkUri);

    HRESULT (STDMETHODCALLTYPE *GetLanguage)(
        IXpsOMVisual *This,
        LPWSTR *language);

    HRESULT (STDMETHODCALLTYPE *SetLanguage)(
        IXpsOMVisual *This,
        LPCWSTR language);

    END_INTERFACE
} IXpsOMVisualVtbl;

interface IXpsOMVisual {
    CONST_VTBL IXpsOMVisualVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IXpsOMVisual_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IXpsOMVisual_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IXpsOMVisual_Release(This) (This)->lpVtbl->Release(This)
/*** IXpsOMShareable methods ***/
#define IXpsOMVisual_GetOwner(This,owner) (This)->lpVtbl->GetOwner(This,owner)
#define IXpsOMVisual_GetType(This,type) (This)->lpVtbl->GetType(This,type)
/*** IXpsOMVisual methods ***/
#define IXpsOMVisual_GetTransform(This,matrixTransform) (This)->lpVtbl->GetTransform(This,matrixTransform)
#define IXpsOMVisual_GetTransformLocal(This,matrixTransform) (This)->lpVtbl->GetTransformLocal(This,matrixTransform)
#define IXpsOMVisual_SetTransformLocal(This,matrixTransform) (This)->lpVtbl->SetTransformLocal(This,matrixTransform)
#define IXpsOMVisual_GetTransformLookup(This,key) (This)->lpVtbl->GetTransformLookup(This,key)
#define IXpsOMVisual_SetTransformLookup(This,key) (This)->lpVtbl->SetTransformLookup(This,key)
#define IXpsOMVisual_GetClipGeometry(This,clipGeometry) (This)->lpVtbl->GetClipGeometry(This,clipGeometry)
#define IXpsOMVisual_GetClipGeometryLocal(This,clipGeometry) (This)->lpVtbl->GetClipGeometryLocal(This,clipGeometry)
#define IXpsOMVisual_SetClipGeometryLocal(This,clipGeometry) (This)->lpVtbl->SetClipGeometryLocal(This,clipGeometry)
#define IXpsOMVisual_GetClipGeometryLookup(This,key) (This)->lpVtbl->GetClipGeometryLookup(This,key)
#define IXpsOMVisual_SetClipGeometryLookup(This,key) (This)->lpVtbl->SetClipGeometryLookup(This,key)
#define IXpsOMVisual_GetOpacity(This,opacity) (This)->lpVtbl->GetOpacity(This,opacity)
#define IXpsOMVisual_SetOpacity(This,opacity) (This)->lpVtbl->SetOpacity(This,opacity)
#define IXpsOMVisual_GetOpacityMaskBrush(This,opacityMaskBrush) (This)->lpVtbl->GetOpacityMaskBrush(This,opacityMaskBrush)
#define IXpsOMVisual_GetOpacityMaskBrushLocal(This,opacityMaskBrush) (This)->lpVtbl->GetOpacityMaskBrushLocal(This,opacityMaskBrush)
#define IXpsOMVisual_SetOpacityMaskBrushLocal(This,opacityMaskBrush) (This)->lpVtbl->SetOpacityMaskBrushLocal(This,opacityMaskBrush)
#define IXpsOMVisual_GetOpacityMaskBrushLookup(This,key) (This)->lpVtbl->GetOpacityMaskBrushLookup(This,key)
#define IXpsOMVisual_SetOpacityMaskBrushLookup(This,key) (This)->lpVtbl->SetOpacityMaskBrushLookup(This,key)
#define IXpsOMVisual_GetName(This,name) (This)->lpVtbl->GetName(This,name)
#define IXpsOMVisual_SetName(This,name) (This)->lpVtbl->SetName(This,name)
#define IXpsOMVisual_GetIsHyperlinkTarget(This,isHyperlink) (This)->lpVtbl->GetIsHyperlinkTarget(This,isHyperlink)
#define IXpsOMVisual_SetIsHyperlinkTarget(This,isHyperlink) (This)->lpVtbl->SetIsHyperlinkTarget(This,isHyperlink)
#define IXpsOMVisual_GetHyperlinkNavigateUri(This,hyperlinkUri) (This)->lpVtbl->GetHyperlinkNavigateUri(This,hyperlinkUri)
#define IXpsOMVisual_SetHyperlinkNavigateUri(This,hyperlinkUri) (This)->lpVtbl->SetHyperlinkNavigateUri(This,hyperlinkUri)
#define IXpsOMVisual_GetLanguage(This,language) (This)->lpVtbl->GetLanguage(This,language)
#define IXpsOMVisual_SetLanguage(This,language) (This)->lpVtbl->SetLanguage(This,language)
#else
/*** IUnknown methods ***/
static __WIDL_INLINE HRESULT IXpsOMVisual_QueryInterface(IXpsOMVisual* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IXpsOMVisual_AddRef(IXpsOMVisual* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IXpsOMVisual_Release(IXpsOMVisual* This) {
    return This->lpVtbl->Release(This);
}
/*** IXpsOMShareable methods ***/
static __WIDL_INLINE HRESULT IXpsOMVisual_GetOwner(IXpsOMVisual* This,IUnknown **owner) {
    return This->lpVtbl->GetOwner(This,owner);
}
static __WIDL_INLINE HRESULT IXpsOMVisual_GetType(IXpsOMVisual* This,XPS_OBJECT_TYPE *type) {
    return This->lpVtbl->GetType(This,type);
}
/*** IXpsOMVisual methods ***/
static __WIDL_INLINE HRESULT IXpsOMVisual_GetTransform(IXpsOMVisual* This,IXpsOMMatrixTransform **matrixTransform) {
    return This->lpVtbl->GetTransform(This,matrixTransform);
}
static __WIDL_INLINE HRESULT IXpsOMVisual_GetTransformLocal(IXpsOMVisual* This,IXpsOMMatrixTransform **matrixTransform) {
    return This->lpVtbl->GetTransformLocal(This,matrixTransform);
}
static __WIDL_INLINE HRESULT IXpsOMVisual_SetTransformLocal(IXpsOMVisual* This,IXpsOMMatrixTransform *matrixTransform) {
    return This->lpVtbl->SetTransformLocal(This,matrixTransform);
}
static __WIDL_INLINE HRESULT IXpsOMVisual_GetTransformLookup(IXpsOMVisual* This,LPWSTR *key) {
    return This->lpVtbl->GetTransformLookup(This,key);
}
static __WIDL_INLINE HRESULT IXpsOMVisual_SetTransformLookup(IXpsOMVisual* This,LPCWSTR key) {
    return This->lpVtbl->SetTransformLookup(This,key);
}
static __WIDL_INLINE HRESULT IXpsOMVisual_GetClipGeometry(IXpsOMVisual* This,IXpsOMGeometry **clipGeometry) {
    return This->lpVtbl->GetClipGeometry(This,clipGeometry);
}
static __WIDL_INLINE HRESULT IXpsOMVisual_GetClipGeometryLocal(IXpsOMVisual* This,IXpsOMGeometry **clipGeometry) {
    return This->lpVtbl->GetClipGeometryLocal(This,clipGeometry);
}
static __WIDL_INLINE HRESULT IXpsOMVisual_SetClipGeometryLocal(IXpsOMVisual* This,IXpsOMGeometry *clipGeometry) {
    return This->lpVtbl->SetClipGeometryLocal(This,clipGeometry);
}
static __WIDL_INLINE HRESULT IXpsOMVisual_GetClipGeometryLookup(IXpsOMVisual* This,LPWSTR *key) {
    return This->lpVtbl->GetClipGeometryLookup(This,key);
}
static __WIDL_INLINE HRESULT IXpsOMVisual_SetClipGeometryLookup(IXpsOMVisual* This,LPCWSTR key) {
    return This->lpVtbl->SetClipGeometryLookup(This,key);
}
static __WIDL_INLINE HRESULT IXpsOMVisual_GetOpacity(IXpsOMVisual* This,FLOAT *opacity) {
    return This->lpVtbl->GetOpacity(This,opacity);
}
static __WIDL_INLINE HRESULT IXpsOMVisual_SetOpacity(IXpsOMVisual* This,FLOAT opacity) {
    return This->lpVtbl->SetOpacity(This,opacity);
}
static __WIDL_INLINE HRESULT IXpsOMVisual_GetOpacityMaskBrush(IXpsOMVisual* This,IXpsOMBrush **opacityMaskBrush) {
    return This->lpVtbl->GetOpacityMaskBrush(This,opacityMaskBrush);
}
static __WIDL_INLINE HRESULT IXpsOMVisual_GetOpacityMaskBrushLocal(IXpsOMVisual* This,IXpsOMBrush **opacityMaskBrush) {
    return This->lpVtbl->GetOpacityMaskBrushLocal(This,opacityMaskBrush);
}
static __WIDL_INLINE HRESULT IXpsOMVisual_SetOpacityMaskBrushLocal(IXpsOMVisual* This,IXpsOMBrush *opacityMaskBrush) {
    return This->lpVtbl->SetOpacityMaskBrushLocal(This,opacityMaskBrush);
}
static __WIDL_INLINE HRESULT IXpsOMVisual_GetOpacityMaskBrushLookup(IXpsOMVisual* This,LPWSTR *key) {
    return This->lpVtbl->GetOpacityMaskBrushLookup(This,key);
}
static __WIDL_INLINE HRESULT IXpsOMVisual_SetOpacityMaskBrushLookup(IXpsOMVisual* This,LPCWSTR key) {
    return This->lpVtbl->SetOpacityMaskBrushLookup(This,key);
}
static __WIDL_INLINE HRESULT IXpsOMVisual_GetName(IXpsOMVisual* This,LPWSTR *name) {
    return This->lpVtbl->GetName(This,name);
}
static __WIDL_INLINE HRESULT IXpsOMVisual_SetName(IXpsOMVisual* This,LPCWSTR name) {
    return This->lpVtbl->SetName(This,name);
}
static __WIDL_INLINE HRESULT IXpsOMVisual_GetIsHyperlinkTarget(IXpsOMVisual* This,WINBOOL *isHyperlink) {
    return This->lpVtbl->GetIsHyperlinkTarget(This,isHyperlink);
}
static __WIDL_INLINE HRESULT IXpsOMVisual_SetIsHyperlinkTarget(IXpsOMVisual* This,WINBOOL isHyperlink) {
    return This->lpVtbl->SetIsHyperlinkTarget(This,isHyperlink);
}
static __WIDL_INLINE HRESULT IXpsOMVisual_GetHyperlinkNavigateUri(IXpsOMVisual* This,IUri **hyperlinkUri) {
    return This->lpVtbl->GetHyperlinkNavigateUri(This,hyperlinkUri);
}
static __WIDL_INLINE HRESULT IXpsOMVisual_SetHyperlinkNavigateUri(IXpsOMVisual* This,IUri *hyperlinkUri) {
    return This->lpVtbl->SetHyperlinkNavigateUri(This,hyperlinkUri);
}
static __WIDL_INLINE HRESULT IXpsOMVisual_GetLanguage(IXpsOMVisual* This,LPWSTR *language) {
    return This->lpVtbl->GetLanguage(This,language);
}
static __WIDL_INLINE HRESULT IXpsOMVisual_SetLanguage(IXpsOMVisual* This,LPCWSTR language) {
    return This->lpVtbl->SetLanguage(This,language);
}
#endif
#endif

#endif


#endif  /* __IXpsOMVisual_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IXpsOMBrush interface
 */
#ifndef __IXpsOMBrush_INTERFACE_DEFINED__
#define __IXpsOMBrush_INTERFACE_DEFINED__

DEFINE_GUID(IID_IXpsOMBrush, 0x56a3f80c, 0xea4c, 0x4187, 0xa5,0x7b, 0xa2,0xa4,0x73,0xb2,0xb4,0x2b);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("56a3f80c-ea4c-4187-a57b-a2a473b2b42b")
IXpsOMBrush : public IXpsOMShareable
{
    virtual HRESULT STDMETHODCALLTYPE GetOpacity(
        FLOAT *opacity) = 0;

    virtual HRESULT STDMETHODCALLTYPE SetOpacity(
        FLOAT opacity) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IXpsOMBrush, 0x56a3f80c, 0xea4c, 0x4187, 0xa5,0x7b, 0xa2,0xa4,0x73,0xb2,0xb4,0x2b)
#endif
#else
typedef struct IXpsOMBrushVtbl {
    BEGIN_INTERFACE

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

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

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

    /*** IXpsOMShareable methods ***/
    HRESULT (STDMETHODCALLTYPE *GetOwner)(
        IXpsOMBrush *This,
        IUnknown **owner);

    HRESULT (STDMETHODCALLTYPE *GetType)(
        IXpsOMBrush *This,
        XPS_OBJECT_TYPE *type);

    /*** IXpsOMBrush methods ***/
    HRESULT (STDMETHODCALLTYPE *GetOpacity)(
        IXpsOMBrush *This,
        FLOAT *opacity);

    HRESULT (STDMETHODCALLTYPE *SetOpacity)(
        IXpsOMBrush *This,
        FLOAT opacity);

    END_INTERFACE
} IXpsOMBrushVtbl;

interface IXpsOMBrush {
    CONST_VTBL IXpsOMBrushVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IXpsOMBrush_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IXpsOMBrush_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IXpsOMBrush_Release(This) (This)->lpVtbl->Release(This)
/*** IXpsOMShareable methods ***/
#define IXpsOMBrush_GetOwner(This,owner) (This)->lpVtbl->GetOwner(This,owner)
#define IXpsOMBrush_GetType(This,type) (This)->lpVtbl->GetType(This,type)
/*** IXpsOMBrush methods ***/
#define IXpsOMBrush_GetOpacity(This,opacity) (This)->lpVtbl->GetOpacity(This,opacity)
#define IXpsOMBrush_SetOpacity(This,opacity) (This)->lpVtbl->SetOpacity(This,opacity)
#else
/*** IUnknown methods ***/
static __WIDL_INLINE HRESULT IXpsOMBrush_QueryInterface(IXpsOMBrush* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IXpsOMBrush_AddRef(IXpsOMBrush* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IXpsOMBrush_Release(IXpsOMBrush* This) {
    return This->lpVtbl->Release(This);
}
/*** IXpsOMShareable methods ***/
static __WIDL_INLINE HRESULT IXpsOMBrush_GetOwner(IXpsOMBrush* This,IUnknown **owner) {
    return This->lpVtbl->GetOwner(This,owner);
}
static __WIDL_INLINE HRESULT IXpsOMBrush_GetType(IXpsOMBrush* This,XPS_OBJECT_TYPE *type) {
    return This->lpVtbl->GetType(This,type);
}
/*** IXpsOMBrush methods ***/
static __WIDL_INLINE HRESULT IXpsOMBrush_GetOpacity(IXpsOMBrush* This,FLOAT *opacity) {
    return This->lpVtbl->GetOpacity(This,opacity);
}
static __WIDL_INLINE HRESULT IXpsOMBrush_SetOpacity(IXpsOMBrush* This,FLOAT opacity) {
    return This->lpVtbl->SetOpacity(This,opacity);
}
#endif
#endif

#endif


#endif  /* __IXpsOMBrush_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IXpsOMMatrixTransform interface
 */
#ifndef __IXpsOMMatrixTransform_INTERFACE_DEFINED__
#define __IXpsOMMatrixTransform_INTERFACE_DEFINED__

DEFINE_GUID(IID_IXpsOMMatrixTransform, 0xb77330ff, 0xbb37, 0x4501, 0xa9,0x3e, 0xf1,0xb1,0xe5,0x0b,0xfc,0x46);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("b77330ff-bb37-4501-a93e-f1b1e50bfc46")
IXpsOMMatrixTransform : public IXpsOMShareable
{
    virtual HRESULT STDMETHODCALLTYPE GetMatrix(
        XPS_MATRIX *matrix) = 0;

    virtual HRESULT STDMETHODCALLTYPE SetMatrix(
        const XPS_MATRIX *matrix) = 0;

    virtual HRESULT STDMETHODCALLTYPE Clone(
        IXpsOMMatrixTransform **matrixTransform) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IXpsOMMatrixTransform, 0xb77330ff, 0xbb37, 0x4501, 0xa9,0x3e, 0xf1,0xb1,0xe5,0x0b,0xfc,0x46)
#endif
#else
typedef struct IXpsOMMatrixTransformVtbl {
    BEGIN_INTERFACE

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

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

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

    /*** IXpsOMShareable methods ***/
    HRESULT (STDMETHODCALLTYPE *GetOwner)(
        IXpsOMMatrixTransform *This,
        IUnknown **owner);

    HRESULT (STDMETHODCALLTYPE *GetType)(
        IXpsOMMatrixTransform *This,
        XPS_OBJECT_TYPE *type);

    /*** IXpsOMMatrixTransform methods ***/
    HRESULT (STDMETHODCALLTYPE *GetMatrix)(
        IXpsOMMatrixTransform *This,
        XPS_MATRIX *matrix);

    HRESULT (STDMETHODCALLTYPE *SetMatrix)(
        IXpsOMMatrixTransform *This,
        const XPS_MATRIX *matrix);

    HRESULT (STDMETHODCALLTYPE *Clone)(
        IXpsOMMatrixTransform *This,
        IXpsOMMatrixTransform **matrixTransform);

    END_INTERFACE
} IXpsOMMatrixTransformVtbl;

interface IXpsOMMatrixTransform {
    CONST_VTBL IXpsOMMatrixTransformVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IXpsOMMatrixTransform_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IXpsOMMatrixTransform_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IXpsOMMatrixTransform_Release(This) (This)->lpVtbl->Release(This)
/*** IXpsOMShareable methods ***/
#define IXpsOMMatrixTransform_GetOwner(This,owner) (This)->lpVtbl->GetOwner(This,owner)
#define IXpsOMMatrixTransform_GetType(This,type) (This)->lpVtbl->GetType(This,type)
/*** IXpsOMMatrixTransform methods ***/
#define IXpsOMMatrixTransform_GetMatrix(This,matrix) (This)->lpVtbl->GetMatrix(This,matrix)
#define IXpsOMMatrixTransform_SetMatrix(This,matrix) (This)->lpVtbl->SetMatrix(This,matrix)
#define IXpsOMMatrixTransform_Clone(This,matrixTransform) (This)->lpVtbl->Clone(This,matrixTransform)
#else
/*** IUnknown methods ***/
static __WIDL_INLINE HRESULT IXpsOMMatrixTransform_QueryInterface(IXpsOMMatrixTransform* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IXpsOMMatrixTransform_AddRef(IXpsOMMatrixTransform* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IXpsOMMatrixTransform_Release(IXpsOMMatrixTransform* This) {
    return This->lpVtbl->Release(This);
}
/*** IXpsOMShareable methods ***/
static __WIDL_INLINE HRESULT IXpsOMMatrixTransform_GetOwner(IXpsOMMatrixTransform* This,IUnknown **owner) {
    return This->lpVtbl->GetOwner(This,owner);
}
static __WIDL_INLINE HRESULT IXpsOMMatrixTransform_GetType(IXpsOMMatrixTransform* This,XPS_OBJECT_TYPE *type) {
    return This->lpVtbl->GetType(This,type);
}
/*** IXpsOMMatrixTransform methods ***/
static __WIDL_INLINE HRESULT IXpsOMMatrixTransform_GetMatrix(IXpsOMMatrixTransform* This,XPS_MATRIX *matrix) {
    return This->lpVtbl->GetMatrix(This,matrix);
}
static __WIDL_INLINE HRESULT IXpsOMMatrixTransform_SetMatrix(IXpsOMMatrixTransform* This,const XPS_MATRIX *matrix) {
    return This->lpVtbl->SetMatrix(This,matrix);
}
static __WIDL_INLINE HRESULT IXpsOMMatrixTransform_Clone(IXpsOMMatrixTransform* This,IXpsOMMatrixTransform **matrixTransform) {
    return This->lpVtbl->Clone(This,matrixTransform);
}
#endif
#endif

#endif


#endif  /* __IXpsOMMatrixTransform_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IXpsOMGeometry interface
 */
#ifndef __IXpsOMGeometry_INTERFACE_DEFINED__
#define __IXpsOMGeometry_INTERFACE_DEFINED__

DEFINE_GUID(IID_IXpsOMGeometry, 0x64fcf3d7, 0x4d58, 0x44ba, 0xad,0x73, 0xa1,0x3a,0xf6,0x49,0x20,0x72);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("64fcf3d7-4d58-44ba-ad73-a13af6492072")
IXpsOMGeometry : public IXpsOMShareable
{
    virtual HRESULT STDMETHODCALLTYPE GetFigures(
        IXpsOMGeometryFigureCollection **figures) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetFillRule(
        XPS_FILL_RULE *fillRule) = 0;

    virtual HRESULT STDMETHODCALLTYPE SetFillRule(
        XPS_FILL_RULE fillRule) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetTransform(
        IXpsOMMatrixTransform **transform) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetTransformLocal(
        IXpsOMMatrixTransform **transform) = 0;

    virtual HRESULT STDMETHODCALLTYPE SetTransformLocal(
        IXpsOMMatrixTransform *transform) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetTransformLookup(
        LPWSTR *lookup) = 0;

    virtual HRESULT STDMETHODCALLTYPE SetTransformLookup(
        LPCWSTR lookup) = 0;

    virtual HRESULT STDMETHODCALLTYPE Clone(
        IXpsOMGeometry **geometry) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IXpsOMGeometry, 0x64fcf3d7, 0x4d58, 0x44ba, 0xad,0x73, 0xa1,0x3a,0xf6,0x49,0x20,0x72)
#endif
#else
typedef struct IXpsOMGeometryVtbl {
    BEGIN_INTERFACE

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

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

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

    /*** IXpsOMShareable methods ***/
    HRESULT (STDMETHODCALLTYPE *GetOwner)(
        IXpsOMGeometry *This,
        IUnknown **owner);

    HRESULT (STDMETHODCALLTYPE *GetType)(
        IXpsOMGeometry *This,
        XPS_OBJECT_TYPE *type);

    /*** IXpsOMGeometry methods ***/
    HRESULT (STDMETHODCALLTYPE *GetFigures)(
        IXpsOMGeometry *This,
        IXpsOMGeometryFigureCollection **figures);

    HRESULT (STDMETHODCALLTYPE *GetFillRule)(
        IXpsOMGeometry *This,
        XPS_FILL_RULE *fillRule);

    HRESULT (STDMETHODCALLTYPE *SetFillRule)(
        IXpsOMGeometry *This,
        XPS_FILL_RULE fillRule);

    HRESULT (STDMETHODCALLTYPE *GetTransform)(
        IXpsOMGeometry *This,
        IXpsOMMatrixTransform **transform);

    HRESULT (STDMETHODCALLTYPE *GetTransformLocal)(
        IXpsOMGeometry *This,
        IXpsOMMatrixTransform **transform);

    HRESULT (STDMETHODCALLTYPE *SetTransformLocal)(
        IXpsOMGeometry *This,
        IXpsOMMatrixTransform *transform);

    HRESULT (STDMETHODCALLTYPE *GetTransformLookup)(
        IXpsOMGeometry *This,
        LPWSTR *lookup);

    HRESULT (STDMETHODCALLTYPE *SetTransformLookup)(
        IXpsOMGeometry *This,
        LPCWSTR lookup);

    HRESULT (STDMETHODCALLTYPE *Clone)(
        IXpsOMGeometry *This,
        IXpsOMGeometry **geometry);

    END_INTERFACE
} IXpsOMGeometryVtbl;

interface IXpsOMGeometry {
    CONST_VTBL IXpsOMGeometryVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IXpsOMGeometry_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IXpsOMGeometry_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IXpsOMGeometry_Release(This) (This)->lpVtbl->Release(This)
/*** IXpsOMShareable methods ***/
#define IXpsOMGeometry_GetOwner(This,owner) (This)->lpVtbl->GetOwner(This,owner)
#define IXpsOMGeometry_GetType(This,type) (This)->lpVtbl->GetType(This,type)
/*** IXpsOMGeometry methods ***/
#define IXpsOMGeometry_GetFigures(This,figures) (This)->lpVtbl->GetFigures(This,figures)
#define IXpsOMGeometry_GetFillRule(This,fillRule) (This)->lpVtbl->GetFillRule(This,fillRule)
#define IXpsOMGeometry_SetFillRule(This,fillRule) (This)->lpVtbl->SetFillRule(This,fillRule)
#define IXpsOMGeometry_GetTransform(This,transform) (This)->lpVtbl->GetTransform(This,transform)
#define IXpsOMGeometry_GetTransformLocal(This,transform) (This)->lpVtbl->GetTransformLocal(This,transform)
#define IXpsOMGeometry_SetTransformLocal(This,transform) (This)->lpVtbl->SetTransformLocal(This,transform)
#define IXpsOMGeometry_GetTransformLookup(This,lookup) (This)->lpVtbl->GetTransformLookup(This,lookup)
#define IXpsOMGeometry_SetTransformLookup(This,lookup) (This)->lpVtbl->SetTransformLookup(This,lookup)
#define IXpsOMGeometry_Clone(This,geometry) (This)->lpVtbl->Clone(This,geometry)
#else
/*** IUnknown methods ***/
static __WIDL_INLINE HRESULT IXpsOMGeometry_QueryInterface(IXpsOMGeometry* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IXpsOMGeometry_AddRef(IXpsOMGeometry* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IXpsOMGeometry_Release(IXpsOMGeometry* This) {
    return This->lpVtbl->Release(This);
}
/*** IXpsOMShareable methods ***/
static __WIDL_INLINE HRESULT IXpsOMGeometry_GetOwner(IXpsOMGeometry* This,IUnknown **owner) {
    return This->lpVtbl->GetOwner(This,owner);
}
static __WIDL_INLINE HRESULT IXpsOMGeometry_GetType(IXpsOMGeometry* This,XPS_OBJECT_TYPE *type) {
    return This->lpVtbl->GetType(This,type);
}
/*** IXpsOMGeometry methods ***/
static __WIDL_INLINE HRESULT IXpsOMGeometry_GetFigures(IXpsOMGeometry* This,IXpsOMGeometryFigureCollection **figures) {
    return This->lpVtbl->GetFigures(This,figures);
}
static __WIDL_INLINE HRESULT IXpsOMGeometry_GetFillRule(IXpsOMGeometry* This,XPS_FILL_RULE *fillRule) {
    return This->lpVtbl->GetFillRule(This,fillRule);
}
static __WIDL_INLINE HRESULT IXpsOMGeometry_SetFillRule(IXpsOMGeometry* This,XPS_FILL_RULE fillRule) {
    return This->lpVtbl->SetFillRule(This,fillRule);
}
static __WIDL_INLINE HRESULT IXpsOMGeometry_GetTransform(IXpsOMGeometry* This,IXpsOMMatrixTransform **transform) {
    return This->lpVtbl->GetTransform(This,transform);
}
static __WIDL_INLINE HRESULT IXpsOMGeometry_GetTransformLocal(IXpsOMGeometry* This,IXpsOMMatrixTransform **transform) {
    return This->lpVtbl->GetTransformLocal(This,transform);
}
static __WIDL_INLINE HRESULT IXpsOMGeometry_SetTransformLocal(IXpsOMGeometry* This,IXpsOMMatrixTransform *transform) {
    return This->lpVtbl->SetTransformLocal(This,transform);
}
static __WIDL_INLINE HRESULT IXpsOMGeometry_GetTransformLookup(IXpsOMGeometry* This,LPWSTR *lookup) {
    return This->lpVtbl->GetTransformLookup(This,lookup);
}
static __WIDL_INLINE HRESULT IXpsOMGeometry_SetTransformLookup(IXpsOMGeometry* This,LPCWSTR lookup) {
    return This->lpVtbl->SetTransformLookup(This,lookup);
}
static __WIDL_INLINE HRESULT IXpsOMGeometry_Clone(IXpsOMGeometry* This,IXpsOMGeometry **geometry) {
    return This->lpVtbl->Clone(This,geometry);
}
#endif
#endif

#endif


#endif  /* __IXpsOMGeometry_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IXpsOMGlyphs interface
 */
#ifndef __IXpsOMGlyphs_INTERFACE_DEFINED__
#define __IXpsOMGlyphs_INTERFACE_DEFINED__

DEFINE_GUID(IID_IXpsOMGlyphs, 0x819b3199, 0x0a5a, 0x4b64, 0xbe,0xc7, 0xa9,0xe1,0x7e,0x78,0x0d,0xe2);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("819b3199-0a5a-4b64-bec7-a9e17e780de2")
IXpsOMGlyphs : public IXpsOMVisual
{
    virtual HRESULT STDMETHODCALLTYPE GetUnicodeString(
        LPWSTR *unicodeString) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetGlyphIndexCount(
        UINT32 *indexCount) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetGlyphIndices(
        UINT32 *indexCount,
        XPS_GLYPH_INDEX *glyphIndices) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetGlyphMappingCount(
        UINT32 *glyphMappingCount) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetGlyphMappings(
        UINT32 *glyphMappingCount,
        XPS_GLYPH_MAPPING *glyphMappings) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetProhibitedCaretStopCount(
        UINT32 *prohibitedCaretStopCount) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetProhibitedCaretStops(
        UINT32 *prohibitedCaretStopCount,
        UINT32 *prohibitedCaretStops) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetBidiLevel(
        UINT32 *bidiLevel) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetIsSideways(
        WINBOOL *isSideways) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetDeviceFontName(
        LPWSTR *deviceFontName) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetStyleSimulations(
        XPS_STYLE_SIMULATION *styleSimulations) = 0;

    virtual HRESULT STDMETHODCALLTYPE SetStyleSimulations(
        XPS_STYLE_SIMULATION styleSimulations) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetOrigin(
        XPS_POINT *origin) = 0;

    virtual HRESULT STDMETHODCALLTYPE SetOrigin(
        const XPS_POINT *origin) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetFontRenderingEmSize(
        FLOAT *fontRenderingEmSize) = 0;

    virtual HRESULT STDMETHODCALLTYPE SetFontRenderingEmSize(
        FLOAT fontRenderingEmSize) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetFontResource(
        IXpsOMFontResource **fontResource) = 0;

    virtual HRESULT STDMETHODCALLTYPE SetFontResource(
        IXpsOMFontResource *fontResource) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetFontFaceIndex(
        SHORT *fontFaceIndex) = 0;

    virtual HRESULT STDMETHODCALLTYPE SetFontFaceIndex(
        SHORT fontFaceIndex) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetFillBrush(
        IXpsOMBrush **fillBrush) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetFillBrushLocal(
        IXpsOMBrush **fillBrush) = 0;

    virtual HRESULT STDMETHODCALLTYPE SetFillBrushLocal(
        IXpsOMBrush *fillBrush) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetFillBrushLookup(
        LPWSTR *key) = 0;

    virtual HRESULT STDMETHODCALLTYPE SetFillBrushLookup(
        LPCWSTR key) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetGlyphsEditor(
        IXpsOMGlyphsEditor **editor) = 0;

    virtual HRESULT STDMETHODCALLTYPE Clone(
        IXpsOMGlyphs **glyphs) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IXpsOMGlyphs, 0x819b3199, 0x0a5a, 0x4b64, 0xbe,0xc7, 0xa9,0xe1,0x7e,0x78,0x0d,0xe2)
#endif
#else
typedef struct IXpsOMGlyphsVtbl {
    BEGIN_INTERFACE

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

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

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

    /*** IXpsOMShareable methods ***/
    HRESULT (STDMETHODCALLTYPE *GetOwner)(
        IXpsOMGlyphs *This,
        IUnknown **owner);

    HRESULT (STDMETHODCALLTYPE *GetType)(
        IXpsOMGlyphs *This,
        XPS_OBJECT_TYPE *type);

    /*** IXpsOMVisual methods ***/
    HRESULT (STDMETHODCALLTYPE *GetTransform)(
        IXpsOMGlyphs *This,
        IXpsOMMatrixTransform **matrixTransform);

    HRESULT (STDMETHODCALLTYPE *GetTransformLocal)(
        IXpsOMGlyphs *This,
        IXpsOMMatrixTransform **matrixTransform);

    HRESULT (STDMETHODCALLTYPE *SetTransformLocal)(
        IXpsOMGlyphs *This,
        IXpsOMMatrixTransform *matrixTransform);

    HRESULT (STDMETHODCALLTYPE *GetTransformLookup)(
        IXpsOMGlyphs *This,
        LPWSTR *key);

    HRESULT (STDMETHODCALLTYPE *SetTransformLookup)(
        IXpsOMGlyphs *This,
        LPCWSTR key);

    HRESULT (STDMETHODCALLTYPE *GetClipGeometry)(
        IXpsOMGlyphs *This,
        IXpsOMGeometry **clipGeometry);

    HRESULT (STDMETHODCALLTYPE *GetClipGeometryLocal)(
        IXpsOMGlyphs *This,
        IXpsOMGeometry **clipGeometry);

    HRESULT (STDMETHODCALLTYPE *SetClipGeometryLocal)(
        IXpsOMGlyphs *This,
        IXpsOMGeometry *clipGeometry);

    HRESULT (STDMETHODCALLTYPE *GetClipGeometryLookup)(
        IXpsOMGlyphs *This,
        LPWSTR *key);

    HRESULT (STDMETHODCALLTYPE *SetClipGeometryLookup)(
        IXpsOMGlyphs *This,
        LPCWSTR key);

    HRESULT (STDMETHODCALLTYPE *GetOpacity)(
        IXpsOMGlyphs *This,
        FLOAT *opacity);

    HRESULT (STDMETHODCALLTYPE *SetOpacity)(
        IXpsOMGlyphs *This,
        FLOAT opacity);

    HRESULT (STDMETHODCALLTYPE *GetOpacityMaskBrush)(
        IXpsOMGlyphs *This,
        IXpsOMBrush **opacityMaskBrush);

    HRESULT (STDMETHODCALLTYPE *GetOpacityMaskBrushLocal)(
        IXpsOMGlyphs *This,
        IXpsOMBrush **opacityMaskBrush);

    HRESULT (STDMETHODCALLTYPE *SetOpacityMaskBrushLocal)(
        IXpsOMGlyphs *This,
        IXpsOMBrush *opacityMaskBrush);

    HRESULT (STDMETHODCALLTYPE *GetOpacityMaskBrushLookup)(
        IXpsOMGlyphs *This,
        LPWSTR *key);

    HRESULT (STDMETHODCALLTYPE *SetOpacityMaskBrushLookup)(
        IXpsOMGlyphs *This,
        LPCWSTR key);

    HRESULT (STDMETHODCALLTYPE *GetName)(
        IXpsOMGlyphs *This,
        LPWSTR *name);

    HRESULT (STDMETHODCALLTYPE *SetName)(
        IXpsOMGlyphs *This,
        LPCWSTR name);

    HRESULT (STDMETHODCALLTYPE *GetIsHyperlinkTarget)(
        IXpsOMGlyphs *This,
        WINBOOL *isHyperlink);

    HRESULT (STDMETHODCALLTYPE *SetIsHyperlinkTarget)(
        IXpsOMGlyphs *This,
        WINBOOL isHyperlink);

    HRESULT (STDMETHODCALLTYPE *GetHyperlinkNavigateUri)(
        IXpsOMGlyphs *This,
        IUri **hyperlinkUri);

    HRESULT (STDMETHODCALLTYPE *SetHyperlinkNavigateUri)(
        IXpsOMGlyphs *This,
        IUri *hyperlinkUri);

    HRESULT (STDMETHODCALLTYPE *GetLanguage)(
        IXpsOMGlyphs *This,
        LPWSTR *language);

    HRESULT (STDMETHODCALLTYPE *SetLanguage)(
        IXpsOMGlyphs *This,
        LPCWSTR language);

    /*** IXpsOMGlyphs methods ***/
    HRESULT (STDMETHODCALLTYPE *GetUnicodeString)(
        IXpsOMGlyphs *This,
        LPWSTR *unicodeString);

    HRESULT (STDMETHODCALLTYPE *GetGlyphIndexCount)(
        IXpsOMGlyphs *This,
        UINT32 *indexCount);

    HRESULT (STDMETHODCALLTYPE *GetGlyphIndices)(
        IXpsOMGlyphs *This,
        UINT32 *indexCount,
        XPS_GLYPH_INDEX *glyphIndices);

    HRESULT (STDMETHODCALLTYPE *GetGlyphMappingCount)(
        IXpsOMGlyphs *This,
        UINT32 *glyphMappingCount);

    HRESULT (STDMETHODCALLTYPE *GetGlyphMappings)(
        IXpsOMGlyphs *This,
        UINT32 *glyphMappingCount,
        XPS_GLYPH_MAPPING *glyphMappings);

    HRESULT (STDMETHODCALLTYPE *GetProhibitedCaretStopCount)(
        IXpsOMGlyphs *This,
        UINT32 *prohibitedCaretStopCount);

    HRESULT (STDMETHODCALLTYPE *GetProhibitedCaretStops)(
        IXpsOMGlyphs *This,
        UINT32 *prohibitedCaretStopCount,
        UINT32 *prohibitedCaretStops);

    HRESULT (STDMETHODCALLTYPE *GetBidiLevel)(
        IXpsOMGlyphs *This,
        UINT32 *bidiLevel);

    HRESULT (STDMETHODCALLTYPE *GetIsSideways)(
        IXpsOMGlyphs *This,
        WINBOOL *isSideways);

    HRESULT (STDMETHODCALLTYPE *GetDeviceFontName)(
        IXpsOMGlyphs *This,
        LPWSTR *deviceFontName);

    HRESULT (STDMETHODCALLTYPE *GetStyleSimulations)(
        IXpsOMGlyphs *This,
        XPS_STYLE_SIMULATION *styleSimulations);

    HRESULT (STDMETHODCALLTYPE *SetStyleSimulations)(
        IXpsOMGlyphs *This,
        XPS_STYLE_SIMULATION styleSimulations);

    HRESULT (STDMETHODCALLTYPE *GetOrigin)(
        IXpsOMGlyphs *This,
        XPS_POINT *origin);

    HRESULT (STDMETHODCALLTYPE *SetOrigin)(
        IXpsOMGlyphs *This,
        const XPS_POINT *origin);

    HRESULT (STDMETHODCALLTYPE *GetFontRenderingEmSize)(
        IXpsOMGlyphs *This,
        FLOAT *fontRenderingEmSize);

    HRESULT (STDMETHODCALLTYPE *SetFontRenderingEmSize)(
        IXpsOMGlyphs *This,
        FLOAT fontRenderingEmSize);

    HRESULT (STDMETHODCALLTYPE *GetFontResource)(
        IXpsOMGlyphs *This,
        IXpsOMFontResource **fontResource);

    HRESULT (STDMETHODCALLTYPE *SetFontResource)(
        IXpsOMGlyphs *This,
        IXpsOMFontResource *fontResource);

    HRESULT (STDMETHODCALLTYPE *GetFontFaceIndex)(
        IXpsOMGlyphs *This,
        SHORT *fontFaceIndex);

    HRESULT (STDMETHODCALLTYPE *SetFontFaceIndex)(
        IXpsOMGlyphs *This,
        SHORT fontFaceIndex);

    HRESULT (STDMETHODCALLTYPE *GetFillBrush)(
        IXpsOMGlyphs *This,
        IXpsOMBrush **fillBrush);

    HRESULT (STDMETHODCALLTYPE *GetFillBrushLocal)(
        IXpsOMGlyphs *This,
        IXpsOMBrush **fillBrush);

    HRESULT (STDMETHODCALLTYPE *SetFillBrushLocal)(
        IXpsOMGlyphs *This,
        IXpsOMBrush *fillBrush);

    HRESULT (STDMETHODCALLTYPE *GetFillBrushLookup)(
        IXpsOMGlyphs *This,
        LPWSTR *key);

    HRESULT (STDMETHODCALLTYPE *SetFillBrushLookup)(
        IXpsOMGlyphs *This,
        LPCWSTR key);

    HRESULT (STDMETHODCALLTYPE *GetGlyphsEditor)(
        IXpsOMGlyphs *This,
        IXpsOMGlyphsEditor **editor);

    HRESULT (STDMETHODCALLTYPE *Clone)(
        IXpsOMGlyphs *This,
        IXpsOMGlyphs **glyphs);

    END_INTERFACE
} IXpsOMGlyphsVtbl;

interface IXpsOMGlyphs {
    CONST_VTBL IXpsOMGlyphsVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IXpsOMGlyphs_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IXpsOMGlyphs_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IXpsOMGlyphs_Release(This) (This)->lpVtbl->Release(This)
/*** IXpsOMShareable methods ***/
#define IXpsOMGlyphs_GetOwner(This,owner) (This)->lpVtbl->GetOwner(This,owner)
#define IXpsOMGlyphs_GetType(This,type) (This)->lpVtbl->GetType(This,type)
/*** IXpsOMVisual methods ***/
#define IXpsOMGlyphs_GetTransform(This,matrixTransform) (This)->lpVtbl->GetTransform(This,matrixTransform)
#define IXpsOMGlyphs_GetTransformLocal(This,matrixTransform) (This)->lpVtbl->GetTransformLocal(This,matrixTransform)
#define IXpsOMGlyphs_SetTransformLocal(This,matrixTransform) (This)->lpVtbl->SetTransformLocal(This,matrixTransform)
#define IXpsOMGlyphs_GetTransformLookup(This,key) (This)->lpVtbl->GetTransformLookup(This,key)
#define IXpsOMGlyphs_SetTransformLookup(This,key) (This)->lpVtbl->SetTransformLookup(This,key)
#define IXpsOMGlyphs_GetClipGeometry(This,clipGeometry) (This)->lpVtbl->GetClipGeometry(This,clipGeometry)
#define IXpsOMGlyphs_GetClipGeometryLocal(This,clipGeometry) (This)->lpVtbl->GetClipGeometryLocal(This,clipGeometry)
#define IXpsOMGlyphs_SetClipGeometryLocal(This,clipGeometry) (This)->lpVtbl->SetClipGeometryLocal(This,clipGeometry)
#define IXpsOMGlyphs_GetClipGeometryLookup(This,key) (This)->lpVtbl->GetClipGeometryLookup(This,key)
#define IXpsOMGlyphs_SetClipGeometryLookup(This,key) (This)->lpVtbl->SetClipGeometryLookup(This,key)
#define IXpsOMGlyphs_GetOpacity(This,opacity) (This)->lpVtbl->GetOpacity(This,opacity)
#define IXpsOMGlyphs_SetOpacity(This,opacity) (This)->lpVtbl->SetOpacity(This,opacity)
#define IXpsOMGlyphs_GetOpacityMaskBrush(This,opacityMaskBrush) (This)->lpVtbl->GetOpacityMaskBrush(This,opacityMaskBrush)
#define IXpsOMGlyphs_GetOpacityMaskBrushLocal(This,opacityMaskBrush) (This)->lpVtbl->GetOpacityMaskBrushLocal(This,opacityMaskBrush)
#define IXpsOMGlyphs_SetOpacityMaskBrushLocal(This,opacityMaskBrush) (This)->lpVtbl->SetOpacityMaskBrushLocal(This,opacityMaskBrush)
#define IXpsOMGlyphs_GetOpacityMaskBrushLookup(This,key) (This)->lpVtbl->GetOpacityMaskBrushLookup(This,key)
#define IXpsOMGlyphs_SetOpacityMaskBrushLookup(This,key) (This)->lpVtbl->SetOpacityMaskBrushLookup(This,key)
#define IXpsOMGlyphs_GetName(This,name) (This)->lpVtbl->GetName(This,name)
#define IXpsOMGlyphs_SetName(This,name) (This)->lpVtbl->SetName(This,name)
#define IXpsOMGlyphs_GetIsHyperlinkTarget(This,isHyperlink) (This)->lpVtbl->GetIsHyperlinkTarget(This,isHyperlink)
#define IXpsOMGlyphs_SetIsHyperlinkTarget(This,isHyperlink) (This)->lpVtbl->SetIsHyperlinkTarget(This,isHyperlink)
#define IXpsOMGlyphs_GetHyperlinkNavigateUri(This,hyperlinkUri) (This)->lpVtbl->GetHyperlinkNavigateUri(This,hyperlinkUri)
#define IXpsOMGlyphs_SetHyperlinkNavigateUri(This,hyperlinkUri) (This)->lpVtbl->SetHyperlinkNavigateUri(This,hyperlinkUri)
#define IXpsOMGlyphs_GetLanguage(This,language) (This)->lpVtbl->GetLanguage(This,language)
#define IXpsOMGlyphs_SetLanguage(This,language) (This)->lpVtbl->SetLanguage(This,language)
/*** IXpsOMGlyphs methods ***/
#define IXpsOMGlyphs_GetUnicodeString(This,unicodeString) (This)->lpVtbl->GetUnicodeString(This,unicodeString)
#define IXpsOMGlyphs_GetGlyphIndexCount(This,indexCount) (This)->lpVtbl->GetGlyphIndexCount(This,indexCount)
#define IXpsOMGlyphs_GetGlyphIndices(This,indexCount,glyphIndices) (This)->lpVtbl->GetGlyphIndices(This,indexCount,glyphIndices)
#define IXpsOMGlyphs_GetGlyphMappingCount(This,glyphMappingCount) (This)->lpVtbl->GetGlyphMappingCount(This,glyphMappingCount)
#define IXpsOMGlyphs_GetGlyphMappings(This,glyphMappingCount,glyphMappings) (This)->lpVtbl->GetGlyphMappings(This,glyphMappingCount,glyphMappings)
#define IXpsOMGlyphs_GetProhibitedCaretStopCount(This,prohibitedCaretStopCount) (This)->lpVtbl->GetProhibitedCaretStopCount(This,prohibitedCaretStopCount)
#define IXpsOMGlyphs_GetProhibitedCaretStops(This,prohibitedCaretStopCount,prohibitedCaretStops) (This)->lpVtbl->GetProhibitedCaretStops(This,prohibitedCaretStopCount,prohibitedCaretStops)
#define IXpsOMGlyphs_GetBidiLevel(This,bidiLevel) (This)->lpVtbl->GetBidiLevel(This,bidiLevel)
#define IXpsOMGlyphs_GetIsSideways(This,isSideways) (This)->lpVtbl->GetIsSideways(This,isSideways)
#define IXpsOMGlyphs_GetDeviceFontName(This,deviceFontName) (This)->lpVtbl->GetDeviceFontName(This,deviceFontName)
#define IXpsOMGlyphs_GetStyleSimulations(This,styleSimulations) (This)->lpVtbl->GetStyleSimulations(This,styleSimulations)
#define IXpsOMGlyphs_SetStyleSimulations(This,styleSimulations) (This)->lpVtbl->SetStyleSimulations(This,styleSimulations)
#define IXpsOMGlyphs_GetOrigin(This,origin) (This)->lpVtbl->GetOrigin(This,origin)
#define IXpsOMGlyphs_SetOrigin(This,origin) (This)->lpVtbl->SetOrigin(This,origin)
#define IXpsOMGlyphs_GetFontRenderingEmSize(This,fontRenderingEmSize) (This)->lpVtbl->GetFontRenderingEmSize(This,fontRenderingEmSize)
#define IXpsOMGlyphs_SetFontRenderingEmSize(This,fontRenderingEmSize) (This)->lpVtbl->SetFontRenderingEmSize(This,fontRenderingEmSize)
#define IXpsOMGlyphs_GetFontResource(This,fontResource) (This)->lpVtbl->GetFontResource(This,fontResource)
#define IXpsOMGlyphs_SetFontResource(This,fontResource) (This)->lpVtbl->SetFontResource(This,fontResource)
#define IXpsOMGlyphs_GetFontFaceIndex(This,fontFaceIndex) (This)->lpVtbl->GetFontFaceIndex(This,fontFaceIndex)
#define IXpsOMGlyphs_SetFontFaceIndex(This,fontFaceIndex) (This)->lpVtbl->SetFontFaceIndex(This,fontFaceIndex)
#define IXpsOMGlyphs_GetFillBrush(This,fillBrush) (This)->lpVtbl->GetFillBrush(This,fillBrush)
#define IXpsOMGlyphs_GetFillBrushLocal(This,fillBrush) (This)->lpVtbl->GetFillBrushLocal(This,fillBrush)
#define IXpsOMGlyphs_SetFillBrushLocal(This,fillBrush) (This)->lpVtbl->SetFillBrushLocal(This,fillBrush)
#define IXpsOMGlyphs_GetFillBrushLookup(This,key) (This)->lpVtbl->GetFillBrushLookup(This,key)
#define IXpsOMGlyphs_SetFillBrushLookup(This,key) (This)->lpVtbl->SetFillBrushLookup(This,key)
#define IXpsOMGlyphs_GetGlyphsEditor(This,editor) (This)->lpVtbl->GetGlyphsEditor(This,editor)
#define IXpsOMGlyphs_Clone(This,glyphs) (This)->lpVtbl->Clone(This,glyphs)
#else
/*** IUnknown methods ***/
static __WIDL_INLINE HRESULT IXpsOMGlyphs_QueryInterface(IXpsOMGlyphs* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IXpsOMGlyphs_AddRef(IXpsOMGlyphs* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IXpsOMGlyphs_Release(IXpsOMGlyphs* This) {
    return This->lpVtbl->Release(This);
}
/*** IXpsOMShareable methods ***/
static __WIDL_INLINE HRESULT IXpsOMGlyphs_GetOwner(IXpsOMGlyphs* This,IUnknown **owner) {
    return This->lpVtbl->GetOwner(This,owner);
}
static __WIDL_INLINE HRESULT IXpsOMGlyphs_GetType(IXpsOMGlyphs* This,XPS_OBJECT_TYPE *type) {
    return This->lpVtbl->GetType(This,type);
}
/*** IXpsOMVisual methods ***/
static __WIDL_INLINE HRESULT IXpsOMGlyphs_GetTransform(IXpsOMGlyphs* This,IXpsOMMatrixTransform **matrixTransform) {
    return This->lpVtbl->GetTransform(This,matrixTransform);
}
static __WIDL_INLINE HRESULT IXpsOMGlyphs_GetTransformLocal(IXpsOMGlyphs* This,IXpsOMMatrixTransform **matrixTransform) {
    return This->lpVtbl->GetTransformLocal(This,matrixTransform);
}
static __WIDL_INLINE HRESULT IXpsOMGlyphs_SetTransformLocal(IXpsOMGlyphs* This,IXpsOMMatrixTransform *matrixTransform) {
    return This->lpVtbl->SetTransformLocal(This,matrixTransform);
}
static __WIDL_INLINE HRESULT IXpsOMGlyphs_GetTransformLookup(IXpsOMGlyphs* This,LPWSTR *key) {
    return This->lpVtbl->GetTransformLookup(This,key);
}
static __WIDL_INLINE HRESULT IXpsOMGlyphs_SetTransformLookup(IXpsOMGlyphs* This,LPCWSTR key) {
    return This->lpVtbl->SetTransformLookup(This,key);
}
static __WIDL_INLINE HRESULT IXpsOMGlyphs_GetClipGeometry(IXpsOMGlyphs* This,IXpsOMGeometry **clipGeometry) {
    return This->lpVtbl->GetClipGeometry(This,clipGeometry);
}
static __WIDL_INLINE HRESULT IXpsOMGlyphs_GetClipGeometryLocal(IXpsOMGlyphs* This,IXpsOMGeometry **clipGeometry) {
    return This->lpVtbl->GetClipGeometryLocal(This,clipGeometry);
}
static __WIDL_INLINE HRESULT IXpsOMGlyphs_SetClipGeometryLocal(IXpsOMGlyphs* This,IXpsOMGeometry *clipGeometry) {
    return This->lpVtbl->SetClipGeometryLocal(This,clipGeometry);
}
static __WIDL_INLINE HRESULT IXpsOMGlyphs_GetClipGeometryLookup(IXpsOMGlyphs* This,LPWSTR *key) {
    return This->lpVtbl->GetClipGeometryLookup(This,key);
}
static __WIDL_INLINE HRESULT IXpsOMGlyphs_SetClipGeometryLookup(IXpsOMGlyphs* This,LPCWSTR key) {
    return This->lpVtbl->SetClipGeometryLookup(This,key);
}
static __WIDL_INLINE HRESULT IXpsOMGlyphs_GetOpacity(IXpsOMGlyphs* This,FLOAT *opacity) {
    return This->lpVtbl->GetOpacity(This,opacity);
}
static __WIDL_INLINE HRESULT IXpsOMGlyphs_SetOpacity(IXpsOMGlyphs* This,FLOAT opacity) {
    return This->lpVtbl->SetOpacity(This,opacity);
}
static __WIDL_INLINE HRESULT IXpsOMGlyphs_GetOpacityMaskBrush(IXpsOMGlyphs* This,IXpsOMBrush **opacityMaskBrush) {
    return This->lpVtbl->GetOpacityMaskBrush(This,opacityMaskBrush);
}
static __WIDL_INLINE HRESULT IXpsOMGlyphs_GetOpacityMaskBrushLocal(IXpsOMGlyphs* This,IXpsOMBrush **opacityMaskBrush) {
    return This->lpVtbl->GetOpacityMaskBrushLocal(This,opacityMaskBrush);
}
static __WIDL_INLINE HRESULT IXpsOMGlyphs_SetOpacityMaskBrushLocal(IXpsOMGlyphs* This,IXpsOMBrush *opacityMaskBrush) {
    return This->lpVtbl->SetOpacityMaskBrushLocal(This,opacityMaskBrush);
}
static __WIDL_INLINE HRESULT IXpsOMGlyphs_GetOpacityMaskBrushLookup(IXpsOMGlyphs* This,LPWSTR *key) {
    return This->lpVtbl->GetOpacityMaskBrushLookup(This,key);
}
static __WIDL_INLINE HRESULT IXpsOMGlyphs_SetOpacityMaskBrushLookup(IXpsOMGlyphs* This,LPCWSTR key) {
    return This->lpVtbl->SetOpacityMaskBrushLookup(This,key);
}
static __WIDL_INLINE HRESULT IXpsOMGlyphs_GetName(IXpsOMGlyphs* This,LPWSTR *name) {
    return This->lpVtbl->GetName(This,name);
}
static __WIDL_INLINE HRESULT IXpsOMGlyphs_SetName(IXpsOMGlyphs* This,LPCWSTR name) {
    return This->lpVtbl->SetName(This,name);
}
static __WIDL_INLINE HRESULT IXpsOMGlyphs_GetIsHyperlinkTarget(IXpsOMGlyphs* This,WINBOOL *isHyperlink) {
    return This->lpVtbl->GetIsHyperlinkTarget(This,isHyperlink);
}
static __WIDL_INLINE HRESULT IXpsOMGlyphs_SetIsHyperlinkTarget(IXpsOMGlyphs* This,WINBOOL isHyperlink) {
    return This->lpVtbl->SetIsHyperlinkTarget(This,isHyperlink);
}
static __WIDL_INLINE HRESULT IXpsOMGlyphs_GetHyperlinkNavigateUri(IXpsOMGlyphs* This,IUri **hyperlinkUri) {
    return This->lpVtbl->GetHyperlinkNavigateUri(This,hyperlinkUri);
}
static __WIDL_INLINE HRESULT IXpsOMGlyphs_SetHyperlinkNavigateUri(IXpsOMGlyphs* This,IUri *hyperlinkUri) {
    return This->lpVtbl->SetHyperlinkNavigateUri(This,hyperlinkUri);
}
static __WIDL_INLINE HRESULT IXpsOMGlyphs_GetLanguage(IXpsOMGlyphs* This,LPWSTR *language) {
    return This->lpVtbl->GetLanguage(This,language);
}
static __WIDL_INLINE HRESULT IXpsOMGlyphs_SetLanguage(IXpsOMGlyphs* This,LPCWSTR language) {
    return This->lpVtbl->SetLanguage(This,language);
}
/*** IXpsOMGlyphs methods ***/
static __WIDL_INLINE HRESULT IXpsOMGlyphs_GetUnicodeString(IXpsOMGlyphs* This,LPWSTR *unicodeString) {
    return This->lpVtbl->GetUnicodeString(This,unicodeString);
}
static __WIDL_INLINE HRESULT IXpsOMGlyphs_GetGlyphIndexCount(IXpsOMGlyphs* This,UINT32 *indexCount) {
    return This->lpVtbl->GetGlyphIndexCount(This,indexCount);
}
static __WIDL_INLINE HRESULT IXpsOMGlyphs_GetGlyphIndices(IXpsOMGlyphs* This,UINT32 *indexCount,XPS_GLYPH_INDEX *glyphIndices) {
    return This->lpVtbl->GetGlyphIndices(This,indexCount,glyphIndices);
}
static __WIDL_INLINE HRESULT IXpsOMGlyphs_GetGlyphMappingCount(IXpsOMGlyphs* This,UINT32 *glyphMappingCount) {
    return This->lpVtbl->GetGlyphMappingCount(This,glyphMappingCount);
}
static __WIDL_INLINE HRESULT IXpsOMGlyphs_GetGlyphMappings(IXpsOMGlyphs* This,UINT32 *glyphMappingCount,XPS_GLYPH_MAPPING *glyphMappings) {
    return This->lpVtbl->GetGlyphMappings(This,glyphMappingCount,glyphMappings);
}
static __WIDL_INLINE HRESULT IXpsOMGlyphs_GetProhibitedCaretStopCount(IXpsOMGlyphs* This,UINT32 *prohibitedCaretStopCount) {
    return This->lpVtbl->GetProhibitedCaretStopCount(This,prohibitedCaretStopCount);
}
static __WIDL_INLINE HRESULT IXpsOMGlyphs_GetProhibitedCaretStops(IXpsOMGlyphs* This,UINT32 *prohibitedCaretStopCount,UINT32 *prohibitedCaretStops) {
    return This->lpVtbl->GetProhibitedCaretStops(This,prohibitedCaretStopCount,prohibitedCaretStops);
}
static __WIDL_INLINE HRESULT IXpsOMGlyphs_GetBidiLevel(IXpsOMGlyphs* This,UINT32 *bidiLevel) {
    return This->lpVtbl->GetBidiLevel(This,bidiLevel);
}
static __WIDL_INLINE HRESULT IXpsOMGlyphs_GetIsSideways(IXpsOMGlyphs* This,WINBOOL *isSideways) {
    return This->lpVtbl->GetIsSideways(This,isSideways);
}
static __WIDL_INLINE HRESULT IXpsOMGlyphs_GetDeviceFontName(IXpsOMGlyphs* This,LPWSTR *deviceFontName) {
    return This->lpVtbl->GetDeviceFontName(This,deviceFontName);
}
static __WIDL_INLINE HRESULT IXpsOMGlyphs_GetStyleSimulations(IXpsOMGlyphs* This,XPS_STYLE_SIMULATION *styleSimulations) {
    return This->lpVtbl->GetStyleSimulations(This,styleSimulations);
}
static __WIDL_INLINE HRESULT IXpsOMGlyphs_SetStyleSimulations(IXpsOMGlyphs* This,XPS_STYLE_SIMULATION styleSimulations) {
    return This->lpVtbl->SetStyleSimulations(This,styleSimulations);
}
static __WIDL_INLINE HRESULT IXpsOMGlyphs_GetOrigin(IXpsOMGlyphs* This,XPS_POINT *origin) {
    return This->lpVtbl->GetOrigin(This,origin);
}
static __WIDL_INLINE HRESULT IXpsOMGlyphs_SetOrigin(IXpsOMGlyphs* This,const XPS_POINT *origin) {
    return This->lpVtbl->SetOrigin(This,origin);
}
static __WIDL_INLINE HRESULT IXpsOMGlyphs_GetFontRenderingEmSize(IXpsOMGlyphs* This,FLOAT *fontRenderingEmSize) {
    return This->lpVtbl->GetFontRenderingEmSize(This,fontRenderingEmSize);
}
static __WIDL_INLINE HRESULT IXpsOMGlyphs_SetFontRenderingEmSize(IXpsOMGlyphs* This,FLOAT fontRenderingEmSize) {
    return This->lpVtbl->SetFontRenderingEmSize(This,fontRenderingEmSize);
}
static __WIDL_INLINE HRESULT IXpsOMGlyphs_GetFontResource(IXpsOMGlyphs* This,IXpsOMFontResource **fontResource) {
    return This->lpVtbl->GetFontResource(This,fontResource);
}
static __WIDL_INLINE HRESULT IXpsOMGlyphs_SetFontResource(IXpsOMGlyphs* This,IXpsOMFontResource *fontResource) {
    return This->lpVtbl->SetFontResource(This,fontResource);
}
static __WIDL_INLINE HRESULT IXpsOMGlyphs_GetFontFaceIndex(IXpsOMGlyphs* This,SHORT *fontFaceIndex) {
    return This->lpVtbl->GetFontFaceIndex(This,fontFaceIndex);
}
static __WIDL_INLINE HRESULT IXpsOMGlyphs_SetFontFaceIndex(IXpsOMGlyphs* This,SHORT fontFaceIndex) {
    return This->lpVtbl->SetFontFaceIndex(This,fontFaceIndex);
}
static __WIDL_INLINE HRESULT IXpsOMGlyphs_GetFillBrush(IXpsOMGlyphs* This,IXpsOMBrush **fillBrush) {
    return This->lpVtbl->GetFillBrush(This,fillBrush);
}
static __WIDL_INLINE HRESULT IXpsOMGlyphs_GetFillBrushLocal(IXpsOMGlyphs* This,IXpsOMBrush **fillBrush) {
    return This->lpVtbl->GetFillBrushLocal(This,fillBrush);
}
static __WIDL_INLINE HRESULT IXpsOMGlyphs_SetFillBrushLocal(IXpsOMGlyphs* This,IXpsOMBrush *fillBrush) {
    return This->lpVtbl->SetFillBrushLocal(This,fillBrush);
}
static __WIDL_INLINE HRESULT IXpsOMGlyphs_GetFillBrushLookup(IXpsOMGlyphs* This,LPWSTR *key) {
    return This->lpVtbl->GetFillBrushLookup(This,key);
}
static __WIDL_INLINE HRESULT IXpsOMGlyphs_SetFillBrushLookup(IXpsOMGlyphs* This,LPCWSTR key) {
    return This->lpVtbl->SetFillBrushLookup(This,key);
}
static __WIDL_INLINE HRESULT IXpsOMGlyphs_GetGlyphsEditor(IXpsOMGlyphs* This,IXpsOMGlyphsEditor **editor) {
    return This->lpVtbl->GetGlyphsEditor(This,editor);
}
static __WIDL_INLINE HRESULT IXpsOMGlyphs_Clone(IXpsOMGlyphs* This,IXpsOMGlyphs **glyphs) {
    return This->lpVtbl->Clone(This,glyphs);
}
#endif
#endif

#endif


#endif  /* __IXpsOMGlyphs_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IXpsOMPath interface
 */
#ifndef __IXpsOMPath_INTERFACE_DEFINED__
#define __IXpsOMPath_INTERFACE_DEFINED__

DEFINE_GUID(IID_IXpsOMPath, 0x37d38bb6, 0x3ee9, 0x4110, 0x93,0x12, 0x14,0xb1,0x94,0x16,0x33,0x37);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("37d38bb6-3ee9-4110-9312-14b194163337")
IXpsOMPath : public IXpsOMVisual
{
    virtual HRESULT STDMETHODCALLTYPE GetGeometry(
        IXpsOMGeometry **geometry) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetGeometryLocal(
        IXpsOMGeometry **geometry) = 0;

    virtual HRESULT STDMETHODCALLTYPE SetGeometryLocal(
        IXpsOMGeometry *geometry) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetGeometryLookup(
        LPWSTR *lookup) = 0;

    virtual HRESULT STDMETHODCALLTYPE SetGeometryLookup(
        LPCWSTR lookup) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetAccessibilityShortDescription(
        LPWSTR *shortDescription) = 0;

    virtual HRESULT STDMETHODCALLTYPE SetAccessibilityShortDescription(
        LPCWSTR shortDescription) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetAccessibilityLongDescription(
        LPWSTR *longDescription) = 0;

    virtual HRESULT STDMETHODCALLTYPE SetAccessibilityLongDescription(
        LPCWSTR longDescription) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetSnapsToPixels(
        WINBOOL *snapsToPixels) = 0;

    virtual HRESULT STDMETHODCALLTYPE SetSnapsToPixels(
        WINBOOL snapsToPixels) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetStrokeBrush(
        IXpsOMBrush **brush) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetStrokeBrushLocal(
        IXpsOMBrush **brush) = 0;

    virtual HRESULT STDMETHODCALLTYPE SetStrokeBrushLocal(
        IXpsOMBrush *brush) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetStrokeBrushLookup(
        LPWSTR *lookup) = 0;

    virtual HRESULT STDMETHODCALLTYPE SetStrokeBrushLookup(
        LPCWSTR lookup) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetStrokeDashes(
        IXpsOMDashCollection **strokeDashes) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetStrokeDashCap(
        XPS_DASH_CAP *strokeDashCap) = 0;

    virtual HRESULT STDMETHODCALLTYPE SetStrokeDashCap(
        XPS_DASH_CAP strokeDashCap) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetStrokeDashOffset(
        FLOAT *strokeDashOffset) = 0;

    virtual HRESULT STDMETHODCALLTYPE SetStrokeDashOffset(
        FLOAT strokeDashOffset) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetStrokeStartLineCap(
        XPS_LINE_CAP *strokeStartLineCap) = 0;

    virtual HRESULT STDMETHODCALLTYPE SetStrokeStartLineCap(
        XPS_LINE_CAP strokeStartLineCap) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetStrokeEndLineCap(
        XPS_LINE_CAP *strokeEndLineCap) = 0;

    virtual HRESULT STDMETHODCALLTYPE SetStrokeEndLineCap(
        XPS_LINE_CAP strokeEndLineCap) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetStrokeLineJoin(
        XPS_LINE_JOIN *strokeLineJoin) = 0;

    virtual HRESULT STDMETHODCALLTYPE SetStrokeLineJoin(
        XPS_LINE_JOIN strokeLineJoin) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetStrokeMiterLimit(
        FLOAT *strokeMiterLimit) = 0;

    virtual HRESULT STDMETHODCALLTYPE SetStrokeMiterLimit(
        FLOAT strokeMiterLimit) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetStrokeThickness(
        FLOAT *strokeThickness) = 0;

    virtual HRESULT STDMETHODCALLTYPE SetStrokeThickness(
        FLOAT strokeThickness) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetFillBrush(
        IXpsOMBrush **brush) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetFillBrushLocal(
        IXpsOMBrush **brush) = 0;

    virtual HRESULT STDMETHODCALLTYPE SetFillBrushLocal(
        IXpsOMBrush *brush) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetFillBrushLookup(
        LPWSTR *lookup) = 0;

    virtual HRESULT STDMETHODCALLTYPE SetFillBrushLookup(
        LPCWSTR lookup) = 0;

    virtual HRESULT STDMETHODCALLTYPE Clone(
        IXpsOMPath **path) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IXpsOMPath, 0x37d38bb6, 0x3ee9, 0x4110, 0x93,0x12, 0x14,0xb1,0x94,0x16,0x33,0x37)
#endif
#else
typedef struct IXpsOMPathVtbl {
    BEGIN_INTERFACE

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

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

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

    /*** IXpsOMShareable methods ***/
    HRESULT (STDMETHODCALLTYPE *GetOwner)(
        IXpsOMPath *This,
        IUnknown **owner);

    HRESULT (STDMETHODCALLTYPE *GetType)(
        IXpsOMPath *This,
        XPS_OBJECT_TYPE *type);

    /*** IXpsOMVisual methods ***/
    HRESULT (STDMETHODCALLTYPE *GetTransform)(
        IXpsOMPath *This,
        IXpsOMMatrixTransform **matrixTransform);

    HRESULT (STDMETHODCALLTYPE *GetTransformLocal)(
        IXpsOMPath *This,
        IXpsOMMatrixTransform **matrixTransform);

    HRESULT (STDMETHODCALLTYPE *SetTransformLocal)(
        IXpsOMPath *This,
        IXpsOMMatrixTransform *matrixTransform);

    HRESULT (STDMETHODCALLTYPE *GetTransformLookup)(
        IXpsOMPath *This,
        LPWSTR *key);

    HRESULT (STDMETHODCALLTYPE *SetTransformLookup)(
        IXpsOMPath *This,
        LPCWSTR key);

    HRESULT (STDMETHODCALLTYPE *GetClipGeometry)(
        IXpsOMPath *This,
        IXpsOMGeometry **clipGeometry);

    HRESULT (STDMETHODCALLTYPE *GetClipGeometryLocal)(
        IXpsOMPath *This,
        IXpsOMGeometry **clipGeometry);

    HRESULT (STDMETHODCALLTYPE *SetClipGeometryLocal)(
        IXpsOMPath *This,
        IXpsOMGeometry *clipGeometry);

    HRESULT (STDMETHODCALLTYPE *GetClipGeometryLookup)(
        IXpsOMPath *This,
        LPWSTR *key);

    HRESULT (STDMETHODCALLTYPE *SetClipGeometryLookup)(
        IXpsOMPath *This,
        LPCWSTR key);

    HRESULT (STDMETHODCALLTYPE *GetOpacity)(
        IXpsOMPath *This,
        FLOAT *opacity);

    HRESULT (STDMETHODCALLTYPE *SetOpacity)(
        IXpsOMPath *This,
        FLOAT opacity);

    HRESULT (STDMETHODCALLTYPE *GetOpacityMaskBrush)(
        IXpsOMPath *This,
        IXpsOMBrush **opacityMaskBrush);

    HRESULT (STDMETHODCALLTYPE *GetOpacityMaskBrushLocal)(
        IXpsOMPath *This,
        IXpsOMBrush **opacityMaskBrush);

    HRESULT (STDMETHODCALLTYPE *SetOpacityMaskBrushLocal)(
        IXpsOMPath *This,
        IXpsOMBrush *opacityMaskBrush);

    HRESULT (STDMETHODCALLTYPE *GetOpacityMaskBrushLookup)(
        IXpsOMPath *This,
        LPWSTR *key);

    HRESULT (STDMETHODCALLTYPE *SetOpacityMaskBrushLookup)(
        IXpsOMPath *This,
        LPCWSTR key);

    HRESULT (STDMETHODCALLTYPE *GetName)(
        IXpsOMPath *This,
        LPWSTR *name);

    HRESULT (STDMETHODCALLTYPE *SetName)(
        IXpsOMPath *This,
        LPCWSTR name);

    HRESULT (STDMETHODCALLTYPE *GetIsHyperlinkTarget)(
        IXpsOMPath *This,
        WINBOOL *isHyperlink);

    HRESULT (STDMETHODCALLTYPE *SetIsHyperlinkTarget)(
        IXpsOMPath *This,
        WINBOOL isHyperlink);

    HRESULT (STDMETHODCALLTYPE *GetHyperlinkNavigateUri)(
        IXpsOMPath *This,
        IUri **hyperlinkUri);

    HRESULT (STDMETHODCALLTYPE *SetHyperlinkNavigateUri)(
        IXpsOMPath *This,
        IUri *hyperlinkUri);

    HRESULT (STDMETHODCALLTYPE *GetLanguage)(
        IXpsOMPath *This,
        LPWSTR *language);

    HRESULT (STDMETHODCALLTYPE *SetLanguage)(
        IXpsOMPath *This,
        LPCWSTR language);

    /*** IXpsOMPath methods ***/
    HRESULT (STDMETHODCALLTYPE *GetGeometry)(
        IXpsOMPath *This,
        IXpsOMGeometry **geometry);

    HRESULT (STDMETHODCALLTYPE *GetGeometryLocal)(
        IXpsOMPath *This,
        IXpsOMGeometry **geometry);

    HRESULT (STDMETHODCALLTYPE *SetGeometryLocal)(
        IXpsOMPath *This,
        IXpsOMGeometry *geometry);

    HRESULT (STDMETHODCALLTYPE *GetGeometryLookup)(
        IXpsOMPath *This,
        LPWSTR *lookup);

    HRESULT (STDMETHODCALLTYPE *SetGeometryLookup)(
        IXpsOMPath *This,
        LPCWSTR lookup);

    HRESULT (STDMETHODCALLTYPE *GetAccessibilityShortDescription)(
        IXpsOMPath *This,
        LPWSTR *shortDescription);

    HRESULT (STDMETHODCALLTYPE *SetAccessibilityShortDescription)(
        IXpsOMPath *This,
        LPCWSTR shortDescription);

    HRESULT (STDMETHODCALLTYPE *GetAccessibilityLongDescription)(
        IXpsOMPath *This,
        LPWSTR *longDescription);

    HRESULT (STDMETHODCALLTYPE *SetAccessibilityLongDescription)(
        IXpsOMPath *This,
        LPCWSTR longDescription);

    HRESULT (STDMETHODCALLTYPE *GetSnapsToPixels)(
        IXpsOMPath *This,
        WINBOOL *snapsToPixels);

    HRESULT (STDMETHODCALLTYPE *SetSnapsToPixels)(
        IXpsOMPath *This,
        WINBOOL snapsToPixels);

    HRESULT (STDMETHODCALLTYPE *GetStrokeBrush)(
        IXpsOMPath *This,
        IXpsOMBrush **brush);

    HRESULT (STDMETHODCALLTYPE *GetStrokeBrushLocal)(
        IXpsOMPath *This,
        IXpsOMBrush **brush);

    HRESULT (STDMETHODCALLTYPE *SetStrokeBrushLocal)(
        IXpsOMPath *This,
        IXpsOMBrush *brush);

    HRESULT (STDMETHODCALLTYPE *GetStrokeBrushLookup)(
        IXpsOMPath *This,
        LPWSTR *lookup);

    HRESULT (STDMETHODCALLTYPE *SetStrokeBrushLookup)(
        IXpsOMPath *This,
        LPCWSTR lookup);

    HRESULT (STDMETHODCALLTYPE *GetStrokeDashes)(
        IXpsOMPath *This,
        IXpsOMDashCollection **strokeDashes);

    HRESULT (STDMETHODCALLTYPE *GetStrokeDashCap)(
        IXpsOMPath *This,
        XPS_DASH_CAP *strokeDashCap);

    HRESULT (STDMETHODCALLTYPE *SetStrokeDashCap)(
        IXpsOMPath *This,
        XPS_DASH_CAP strokeDashCap);

    HRESULT (STDMETHODCALLTYPE *GetStrokeDashOffset)(
        IXpsOMPath *This,
        FLOAT *strokeDashOffset);

    HRESULT (STDMETHODCALLTYPE *SetStrokeDashOffset)(
        IXpsOMPath *This,
        FLOAT strokeDashOffset);

    HRESULT (STDMETHODCALLTYPE *GetStrokeStartLineCap)(
        IXpsOMPath *This,
        XPS_LINE_CAP *strokeStartLineCap);

    HRESULT (STDMETHODCALLTYPE *SetStrokeStartLineCap)(
        IXpsOMPath *This,
        XPS_LINE_CAP strokeStartLineCap);

    HRESULT (STDMETHODCALLTYPE *GetStrokeEndLineCap)(
        IXpsOMPath *This,
        XPS_LINE_CAP *strokeEndLineCap);

    HRESULT (STDMETHODCALLTYPE *SetStrokeEndLineCap)(
        IXpsOMPath *This,
        XPS_LINE_CAP strokeEndLineCap);

    HRESULT (STDMETHODCALLTYPE *GetStrokeLineJoin)(
        IXpsOMPath *This,
        XPS_LINE_JOIN *strokeLineJoin);

    HRESULT (STDMETHODCALLTYPE *SetStrokeLineJoin)(
        IXpsOMPath *This,
        XPS_LINE_JOIN strokeLineJoin);

    HRESULT (STDMETHODCALLTYPE *GetStrokeMiterLimit)(
        IXpsOMPath *This,
        FLOAT *strokeMiterLimit);

    HRESULT (STDMETHODCALLTYPE *SetStrokeMiterLimit)(
        IXpsOMPath *This,
        FLOAT strokeMiterLimit);

    HRESULT (STDMETHODCALLTYPE *GetStrokeThickness)(
        IXpsOMPath *This,
        FLOAT *strokeThickness);

    HRESULT (STDMETHODCALLTYPE *SetStrokeThickness)(
        IXpsOMPath *This,
        FLOAT strokeThickness);

    HRESULT (STDMETHODCALLTYPE *GetFillBrush)(
        IXpsOMPath *This,
        IXpsOMBrush **brush);

    HRESULT (STDMETHODCALLTYPE *GetFillBrushLocal)(
        IXpsOMPath *This,
        IXpsOMBrush **brush);

    HRESULT (STDMETHODCALLTYPE *SetFillBrushLocal)(
        IXpsOMPath *This,
        IXpsOMBrush *brush);

    HRESULT (STDMETHODCALLTYPE *GetFillBrushLookup)(
        IXpsOMPath *This,
        LPWSTR *lookup);

    HRESULT (STDMETHODCALLTYPE *SetFillBrushLookup)(
        IXpsOMPath *This,
        LPCWSTR lookup);

    HRESULT (STDMETHODCALLTYPE *Clone)(
        IXpsOMPath *This,
        IXpsOMPath **path);

    END_INTERFACE
} IXpsOMPathVtbl;

interface IXpsOMPath {
    CONST_VTBL IXpsOMPathVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IXpsOMPath_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IXpsOMPath_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IXpsOMPath_Release(This) (This)->lpVtbl->Release(This)
/*** IXpsOMShareable methods ***/
#define IXpsOMPath_GetOwner(This,owner) (This)->lpVtbl->GetOwner(This,owner)
#define IXpsOMPath_GetType(This,type) (This)->lpVtbl->GetType(This,type)
/*** IXpsOMVisual methods ***/
#define IXpsOMPath_GetTransform(This,matrixTransform) (This)->lpVtbl->GetTransform(This,matrixTransform)
#define IXpsOMPath_GetTransformLocal(This,matrixTransform) (This)->lpVtbl->GetTransformLocal(This,matrixTransform)
#define IXpsOMPath_SetTransformLocal(This,matrixTransform) (This)->lpVtbl->SetTransformLocal(This,matrixTransform)
#define IXpsOMPath_GetTransformLookup(This,key) (This)->lpVtbl->GetTransformLookup(This,key)
#define IXpsOMPath_SetTransformLookup(This,key) (This)->lpVtbl->SetTransformLookup(This,key)
#define IXpsOMPath_GetClipGeometry(This,clipGeometry) (This)->lpVtbl->GetClipGeometry(This,clipGeometry)
#define IXpsOMPath_GetClipGeometryLocal(This,clipGeometry) (This)->lpVtbl->GetClipGeometryLocal(This,clipGeometry)
#define IXpsOMPath_SetClipGeometryLocal(This,clipGeometry) (This)->lpVtbl->SetClipGeometryLocal(This,clipGeometry)
#define IXpsOMPath_GetClipGeometryLookup(This,key) (This)->lpVtbl->GetClipGeometryLookup(This,key)
#define IXpsOMPath_SetClipGeometryLookup(This,key) (This)->lpVtbl->SetClipGeometryLookup(This,key)
#define IXpsOMPath_GetOpacity(This,opacity) (This)->lpVtbl->GetOpacity(This,opacity)
#define IXpsOMPath_SetOpacity(This,opacity) (This)->lpVtbl->SetOpacity(This,opacity)
#define IXpsOMPath_GetOpacityMaskBrush(This,opacityMaskBrush) (This)->lpVtbl->GetOpacityMaskBrush(This,opacityMaskBrush)
#define IXpsOMPath_GetOpacityMaskBrushLocal(This,opacityMaskBrush) (This)->lpVtbl->GetOpacityMaskBrushLocal(This,opacityMaskBrush)
#define IXpsOMPath_SetOpacityMaskBrushLocal(This,opacityMaskBrush) (This)->lpVtbl->SetOpacityMaskBrushLocal(This,opacityMaskBrush)
#define IXpsOMPath_GetOpacityMaskBrushLookup(This,key) (This)->lpVtbl->GetOpacityMaskBrushLookup(This,key)
#define IXpsOMPath_SetOpacityMaskBrushLookup(This,key) (This)->lpVtbl->SetOpacityMaskBrushLookup(This,key)
#define IXpsOMPath_GetName(This,name) (This)->lpVtbl->GetName(This,name)
#define IXpsOMPath_SetName(This,name) (This)->lpVtbl->SetName(This,name)
#define IXpsOMPath_GetIsHyperlinkTarget(This,isHyperlink) (This)->lpVtbl->GetIsHyperlinkTarget(This,isHyperlink)
#define IXpsOMPath_SetIsHyperlinkTarget(This,isHyperlink) (This)->lpVtbl->SetIsHyperlinkTarget(This,isHyperlink)
#define IXpsOMPath_GetHyperlinkNavigateUri(This,hyperlinkUri) (This)->lpVtbl->GetHyperlinkNavigateUri(This,hyperlinkUri)
#define IXpsOMPath_SetHyperlinkNavigateUri(This,hyperlinkUri) (This)->lpVtbl->SetHyperlinkNavigateUri(This,hyperlinkUri)
#define IXpsOMPath_GetLanguage(This,language) (This)->lpVtbl->GetLanguage(This,language)
#define IXpsOMPath_SetLanguage(This,language) (This)->lpVtbl->SetLanguage(This,language)
/*** IXpsOMPath methods ***/
#define IXpsOMPath_GetGeometry(This,geometry) (This)->lpVtbl->GetGeometry(This,geometry)
#define IXpsOMPath_GetGeometryLocal(This,geometry) (This)->lpVtbl->GetGeometryLocal(This,geometry)
#define IXpsOMPath_SetGeometryLocal(This,geometry) (This)->lpVtbl->SetGeometryLocal(This,geometry)
#define IXpsOMPath_GetGeometryLookup(This,lookup) (This)->lpVtbl->GetGeometryLookup(This,lookup)
#define IXpsOMPath_SetGeometryLookup(This,lookup) (This)->lpVtbl->SetGeometryLookup(This,lookup)
#define IXpsOMPath_GetAccessibilityShortDescription(This,shortDescription) (This)->lpVtbl->GetAccessibilityShortDescription(This,shortDescription)
#define IXpsOMPath_SetAccessibilityShortDescription(This,shortDescription) (This)->lpVtbl->SetAccessibilityShortDescription(This,shortDescription)
#define IXpsOMPath_GetAccessibilityLongDescription(This,longDescription) (This)->lpVtbl->GetAccessibilityLongDescription(This,longDescription)
#define IXpsOMPath_SetAccessibilityLongDescription(This,longDescription) (This)->lpVtbl->SetAccessibilityLongDescription(This,longDescription)
#define IXpsOMPath_GetSnapsToPixels(This,snapsToPixels) (This)->lpVtbl->GetSnapsToPixels(This,snapsToPixels)
#define IXpsOMPath_SetSnapsToPixels(This,snapsToPixels) (This)->lpVtbl->SetSnapsToPixels(This,snapsToPixels)
#define IXpsOMPath_GetStrokeBrush(This,brush) (This)->lpVtbl->GetStrokeBrush(This,brush)
#define IXpsOMPath_GetStrokeBrushLocal(This,brush) (This)->lpVtbl->GetStrokeBrushLocal(This,brush)
#define IXpsOMPath_SetStrokeBrushLocal(This,brush) (This)->lpVtbl->SetStrokeBrushLocal(This,brush)
#define IXpsOMPath_GetStrokeBrushLookup(This,lookup) (This)->lpVtbl->GetStrokeBrushLookup(This,lookup)
#define IXpsOMPath_SetStrokeBrushLookup(This,lookup) (This)->lpVtbl->SetStrokeBrushLookup(This,lookup)
#define IXpsOMPath_GetStrokeDashes(This,strokeDashes) (This)->lpVtbl->GetStrokeDashes(This,strokeDashes)
#define IXpsOMPath_GetStrokeDashCap(This,strokeDashCap) (This)->lpVtbl->GetStrokeDashCap(This,strokeDashCap)
#define IXpsOMPath_SetStrokeDashCap(This,strokeDashCap) (This)->lpVtbl->SetStrokeDashCap(This,strokeDashCap)
#define IXpsOMPath_GetStrokeDashOffset(This,strokeDashOffset) (This)->lpVtbl->GetStrokeDashOffset(This,strokeDashOffset)
#define IXpsOMPath_SetStrokeDashOffset(This,strokeDashOffset) (This)->lpVtbl->SetStrokeDashOffset(This,strokeDashOffset)
#define IXpsOMPath_GetStrokeStartLineCap(This,strokeStartLineCap) (This)->lpVtbl->GetStrokeStartLineCap(This,strokeStartLineCap)
#define IXpsOMPath_SetStrokeStartLineCap(This,strokeStartLineCap) (This)->lpVtbl->SetStrokeStartLineCap(This,strokeStartLineCap)
#define IXpsOMPath_GetStrokeEndLineCap(This,strokeEndLineCap) (This)->lpVtbl->GetStrokeEndLineCap(This,strokeEndLineCap)
#define IXpsOMPath_SetStrokeEndLineCap(This,strokeEndLineCap) (This)->lpVtbl->SetStrokeEndLineCap(This,strokeEndLineCap)
#define IXpsOMPath_GetStrokeLineJoin(This,strokeLineJoin) (This)->lpVtbl->GetStrokeLineJoin(This,strokeLineJoin)
#define IXpsOMPath_SetStrokeLineJoin(This,strokeLineJoin) (This)->lpVtbl->SetStrokeLineJoin(This,strokeLineJoin)
#define IXpsOMPath_GetStrokeMiterLimit(This,strokeMiterLimit) (This)->lpVtbl->GetStrokeMiterLimit(This,strokeMiterLimit)
#define IXpsOMPath_SetStrokeMiterLimit(This,strokeMiterLimit) (This)->lpVtbl->SetStrokeMiterLimit(This,strokeMiterLimit)
#define IXpsOMPath_GetStrokeThickness(This,strokeThickness) (This)->lpVtbl->GetStrokeThickness(This,strokeThickness)
#define IXpsOMPath_SetStrokeThickness(This,strokeThickness) (This)->lpVtbl->SetStrokeThickness(This,strokeThickness)
#define IXpsOMPath_GetFillBrush(This,brush) (This)->lpVtbl->GetFillBrush(This,brush)
#define IXpsOMPath_GetFillBrushLocal(This,brush) (This)->lpVtbl->GetFillBrushLocal(This,brush)
#define IXpsOMPath_SetFillBrushLocal(This,brush) (This)->lpVtbl->SetFillBrushLocal(This,brush)
#define IXpsOMPath_GetFillBrushLookup(This,lookup) (This)->lpVtbl->GetFillBrushLookup(This,lookup)
#define IXpsOMPath_SetFillBrushLookup(This,lookup) (This)->lpVtbl->SetFillBrushLookup(This,lookup)
#define IXpsOMPath_Clone(This,path) (This)->lpVtbl->Clone(This,path)
#else
/*** IUnknown methods ***/
static __WIDL_INLINE HRESULT IXpsOMPath_QueryInterface(IXpsOMPath* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IXpsOMPath_AddRef(IXpsOMPath* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IXpsOMPath_Release(IXpsOMPath* This) {
    return This->lpVtbl->Release(This);
}
/*** IXpsOMShareable methods ***/
static __WIDL_INLINE HRESULT IXpsOMPath_GetOwner(IXpsOMPath* This,IUnknown **owner) {
    return This->lpVtbl->GetOwner(This,owner);
}
static __WIDL_INLINE HRESULT IXpsOMPath_GetType(IXpsOMPath* This,XPS_OBJECT_TYPE *type) {
    return This->lpVtbl->GetType(This,type);
}
/*** IXpsOMVisual methods ***/
static __WIDL_INLINE HRESULT IXpsOMPath_GetTransform(IXpsOMPath* This,IXpsOMMatrixTransform **matrixTransform) {
    return This->lpVtbl->GetTransform(This,matrixTransform);
}
static __WIDL_INLINE HRESULT IXpsOMPath_GetTransformLocal(IXpsOMPath* This,IXpsOMMatrixTransform **matrixTransform) {
    return This->lpVtbl->GetTransformLocal(This,matrixTransform);
}
static __WIDL_INLINE HRESULT IXpsOMPath_SetTransformLocal(IXpsOMPath* This,IXpsOMMatrixTransform *matrixTransform) {
    return This->lpVtbl->SetTransformLocal(This,matrixTransform);
}
static __WIDL_INLINE HRESULT IXpsOMPath_GetTransformLookup(IXpsOMPath* This,LPWSTR *key) {
    return This->lpVtbl->GetTransformLookup(This,key);
}
static __WIDL_INLINE HRESULT IXpsOMPath_SetTransformLookup(IXpsOMPath* This,LPCWSTR key) {
    return This->lpVtbl->SetTransformLookup(This,key);
}
static __WIDL_INLINE HRESULT IXpsOMPath_GetClipGeometry(IXpsOMPath* This,IXpsOMGeometry **clipGeometry) {
    return This->lpVtbl->GetClipGeometry(This,clipGeometry);
}
static __WIDL_INLINE HRESULT IXpsOMPath_GetClipGeometryLocal(IXpsOMPath* This,IXpsOMGeometry **clipGeometry) {
    return This->lpVtbl->GetClipGeometryLocal(This,clipGeometry);
}
static __WIDL_INLINE HRESULT IXpsOMPath_SetClipGeometryLocal(IXpsOMPath* This,IXpsOMGeometry *clipGeometry) {
    return This->lpVtbl->SetClipGeometryLocal(This,clipGeometry);
}
static __WIDL_INLINE HRESULT IXpsOMPath_GetClipGeometryLookup(IXpsOMPath* This,LPWSTR *key) {
    return This->lpVtbl->GetClipGeometryLookup(This,key);
}
static __WIDL_INLINE HRESULT IXpsOMPath_SetClipGeometryLookup(IXpsOMPath* This,LPCWSTR key) {
    return This->lpVtbl->SetClipGeometryLookup(This,key);
}
static __WIDL_INLINE HRESULT IXpsOMPath_GetOpacity(IXpsOMPath* This,FLOAT *opacity) {
    return This->lpVtbl->GetOpacity(This,opacity);
}
static __WIDL_INLINE HRESULT IXpsOMPath_SetOpacity(IXpsOMPath* This,FLOAT opacity) {
    return This->lpVtbl->SetOpacity(This,opacity);
}
static __WIDL_INLINE HRESULT IXpsOMPath_GetOpacityMaskBrush(IXpsOMPath* This,IXpsOMBrush **opacityMaskBrush) {
    return This->lpVtbl->GetOpacityMaskBrush(This,opacityMaskBrush);
}
static __WIDL_INLINE HRESULT IXpsOMPath_GetOpacityMaskBrushLocal(IXpsOMPath* This,IXpsOMBrush **opacityMaskBrush) {
    return This->lpVtbl->GetOpacityMaskBrushLocal(This,opacityMaskBrush);
}
static __WIDL_INLINE HRESULT IXpsOMPath_SetOpacityMaskBrushLocal(IXpsOMPath* This,IXpsOMBrush *opacityMaskBrush) {
    return This->lpVtbl->SetOpacityMaskBrushLocal(This,opacityMaskBrush);
}
static __WIDL_INLINE HRESULT IXpsOMPath_GetOpacityMaskBrushLookup(IXpsOMPath* This,LPWSTR *key) {
    return This->lpVtbl->GetOpacityMaskBrushLookup(This,key);
}
static __WIDL_INLINE HRESULT IXpsOMPath_SetOpacityMaskBrushLookup(IXpsOMPath* This,LPCWSTR key) {
    return This->lpVtbl->SetOpacityMaskBrushLookup(This,key);
}
static __WIDL_INLINE HRESULT IXpsOMPath_GetName(IXpsOMPath* This,LPWSTR *name) {
    return This->lpVtbl->GetName(This,name);
}
static __WIDL_INLINE HRESULT IXpsOMPath_SetName(IXpsOMPath* This,LPCWSTR name) {
    return This->lpVtbl->SetName(This,name);
}
static __WIDL_INLINE HRESULT IXpsOMPath_GetIsHyperlinkTarget(IXpsOMPath* This,WINBOOL *isHyperlink) {
    return This->lpVtbl->GetIsHyperlinkTarget(This,isHyperlink);
}
static __WIDL_INLINE HRESULT IXpsOMPath_SetIsHyperlinkTarget(IXpsOMPath* This,WINBOOL isHyperlink) {
    return This->lpVtbl->SetIsHyperlinkTarget(This,isHyperlink);
}
static __WIDL_INLINE HRESULT IXpsOMPath_GetHyperlinkNavigateUri(IXpsOMPath* This,IUri **hyperlinkUri) {
    return This->lpVtbl->GetHyperlinkNavigateUri(This,hyperlinkUri);
}
static __WIDL_INLINE HRESULT IXpsOMPath_SetHyperlinkNavigateUri(IXpsOMPath* This,IUri *hyperlinkUri) {
    return This->lpVtbl->SetHyperlinkNavigateUri(This,hyperlinkUri);
}
static __WIDL_INLINE HRESULT IXpsOMPath_GetLanguage(IXpsOMPath* This,LPWSTR *language) {
    return This->lpVtbl->GetLanguage(This,language);
}
static __WIDL_INLINE HRESULT IXpsOMPath_SetLanguage(IXpsOMPath* This,LPCWSTR language) {
    return This->lpVtbl->SetLanguage(This,language);
}
/*** IXpsOMPath methods ***/
static __WIDL_INLINE HRESULT IXpsOMPath_GetGeometry(IXpsOMPath* This,IXpsOMGeometry **geometry) {
    return This->lpVtbl->GetGeometry(This,geometry);
}
static __WIDL_INLINE HRESULT IXpsOMPath_GetGeometryLocal(IXpsOMPath* This,IXpsOMGeometry **geometry) {
    return This->lpVtbl->GetGeometryLocal(This,geometry);
}
static __WIDL_INLINE HRESULT IXpsOMPath_SetGeometryLocal(IXpsOMPath* This,IXpsOMGeometry *geometry) {
    return This->lpVtbl->SetGeometryLocal(This,geometry);
}
static __WIDL_INLINE HRESULT IXpsOMPath_GetGeometryLookup(IXpsOMPath* This,LPWSTR *lookup) {
    return This->lpVtbl->GetGeometryLookup(This,lookup);
}
static __WIDL_INLINE HRESULT IXpsOMPath_SetGeometryLookup(IXpsOMPath* This,LPCWSTR lookup) {
    return This->lpVtbl->SetGeometryLookup(This,lookup);
}
static __WIDL_INLINE HRESULT IXpsOMPath_GetAccessibilityShortDescription(IXpsOMPath* This,LPWSTR *shortDescription) {
    return This->lpVtbl->GetAccessibilityShortDescription(This,shortDescription);
}
static __WIDL_INLINE HRESULT IXpsOMPath_SetAccessibilityShortDescription(IXpsOMPath* This,LPCWSTR shortDescription) {
    return This->lpVtbl->SetAccessibilityShortDescription(This,shortDescription);
}
static __WIDL_INLINE HRESULT IXpsOMPath_GetAccessibilityLongDescription(IXpsOMPath* This,LPWSTR *longDescription) {
    return This->lpVtbl->GetAccessibilityLongDescription(This,longDescription);
}
static __WIDL_INLINE HRESULT IXpsOMPath_SetAccessibilityLongDescription(IXpsOMPath* This,LPCWSTR longDescription) {
    return This->lpVtbl->SetAccessibilityLongDescription(This,longDescription);
}
static __WIDL_INLINE HRESULT IXpsOMPath_GetSnapsToPixels(IXpsOMPath* This,WINBOOL *snapsToPixels) {
    return This->lpVtbl->GetSnapsToPixels(This,snapsToPixels);
}
static __WIDL_INLINE HRESULT IXpsOMPath_SetSnapsToPixels(IXpsOMPath* This,WINBOOL snapsToPixels) {
    return This->lpVtbl->SetSnapsToPixels(This,snapsToPixels);
}
static __WIDL_INLINE HRESULT IXpsOMPath_GetStrokeBrush(IXpsOMPath* This,IXpsOMBrush **brush) {
    return This->lpVtbl->GetStrokeBrush(This,brush);
}
static __WIDL_INLINE HRESULT IXpsOMPath_GetStrokeBrushLocal(IXpsOMPath* This,IXpsOMBrush **brush) {
    return This->lpVtbl->GetStrokeBrushLocal(This,brush);
}
static __WIDL_INLINE HRESULT IXpsOMPath_SetStrokeBrushLocal(IXpsOMPath* This,IXpsOMBrush *brush) {
    return This->lpVtbl->SetStrokeBrushLocal(This,brush);
}
static __WIDL_INLINE HRESULT IXpsOMPath_GetStrokeBrushLookup(IXpsOMPath* This,LPWSTR *lookup) {
    return This->lpVtbl->GetStrokeBrushLookup(This,lookup);
}
static __WIDL_INLINE HRESULT IXpsOMPath_SetStrokeBrushLookup(IXpsOMPath* This,LPCWSTR lookup) {
    return This->lpVtbl->SetStrokeBrushLookup(This,lookup);
}
static __WIDL_INLINE HRESULT IXpsOMPath_GetStrokeDashes(IXpsOMPath* This,IXpsOMDashCollection **strokeDashes) {
    return This->lpVtbl->GetStrokeDashes(This,strokeDashes);
}
static __WIDL_INLINE HRESULT IXpsOMPath_GetStrokeDashCap(IXpsOMPath* This,XPS_DASH_CAP *strokeDashCap) {
    return This->lpVtbl->GetStrokeDashCap(This,strokeDashCap);
}
static __WIDL_INLINE HRESULT IXpsOMPath_SetStrokeDashCap(IXpsOMPath* This,XPS_DASH_CAP strokeDashCap) {
    return This->lpVtbl->SetStrokeDashCap(This,strokeDashCap);
}
static __WIDL_INLINE HRESULT IXpsOMPath_GetStrokeDashOffset(IXpsOMPath* This,FLOAT *strokeDashOffset) {
    return This->lpVtbl->GetStrokeDashOffset(This,strokeDashOffset);
}
static __WIDL_INLINE HRESULT IXpsOMPath_SetStrokeDashOffset(IXpsOMPath* This,FLOAT strokeDashOffset) {
    return This->lpVtbl->SetStrokeDashOffset(This,strokeDashOffset);
}
static __WIDL_INLINE HRESULT IXpsOMPath_GetStrokeStartLineCap(IXpsOMPath* This,XPS_LINE_CAP *strokeStartLineCap) {
    return This->lpVtbl->GetStrokeStartLineCap(This,strokeStartLineCap);
}
static __WIDL_INLINE HRESULT IXpsOMPath_SetStrokeStartLineCap(IXpsOMPath* This,XPS_LINE_CAP strokeStartLineCap) {
    return This->lpVtbl->SetStrokeStartLineCap(This,strokeStartLineCap);
}
static __WIDL_INLINE HRESULT IXpsOMPath_GetStrokeEndLineCap(IXpsOMPath* This,XPS_LINE_CAP *strokeEndLineCap) {
    return This->lpVtbl->GetStrokeEndLineCap(This,strokeEndLineCap);
}
static __WIDL_INLINE HRESULT IXpsOMPath_SetStrokeEndLineCap(IXpsOMPath* This,XPS_LINE_CAP strokeEndLineCap) {
    return This->lpVtbl->SetStrokeEndLineCap(This,strokeEndLineCap);
}
static __WIDL_INLINE HRESULT IXpsOMPath_GetStrokeLineJoin(IXpsOMPath* This,XPS_LINE_JOIN *strokeLineJoin) {
    return This->lpVtbl->GetStrokeLineJoin(This,strokeLineJoin);
}
static __WIDL_INLINE HRESULT IXpsOMPath_SetStrokeLineJoin(IXpsOMPath* This,XPS_LINE_JOIN strokeLineJoin) {
    return This->lpVtbl->SetStrokeLineJoin(This,strokeLineJoin);
}
static __WIDL_INLINE HRESULT IXpsOMPath_GetStrokeMiterLimit(IXpsOMPath* This,FLOAT *strokeMiterLimit) {
    return This->lpVtbl->GetStrokeMiterLimit(This,strokeMiterLimit);
}
static __WIDL_INLINE HRESULT IXpsOMPath_SetStrokeMiterLimit(IXpsOMPath* This,FLOAT strokeMiterLimit) {
    return This->lpVtbl->SetStrokeMiterLimit(This,strokeMiterLimit);
}
static __WIDL_INLINE HRESULT IXpsOMPath_GetStrokeThickness(IXpsOMPath* This,FLOAT *strokeThickness) {
    return This->lpVtbl->GetStrokeThickness(This,strokeThickness);
}
static __WIDL_INLINE HRESULT IXpsOMPath_SetStrokeThickness(IXpsOMPath* This,FLOAT strokeThickness) {
    return This->lpVtbl->SetStrokeThickness(This,strokeThickness);
}
static __WIDL_INLINE HRESULT IXpsOMPath_GetFillBrush(IXpsOMPath* This,IXpsOMBrush **brush) {
    return This->lpVtbl->GetFillBrush(This,brush);
}
static __WIDL_INLINE HRESULT IXpsOMPath_GetFillBrushLocal(IXpsOMPath* This,IXpsOMBrush **brush) {
    return This->lpVtbl->GetFillBrushLocal(This,brush);
}
static __WIDL_INLINE HRESULT IXpsOMPath_SetFillBrushLocal(IXpsOMPath* This,IXpsOMBrush *brush) {
    return This->lpVtbl->SetFillBrushLocal(This,brush);
}
static __WIDL_INLINE HRESULT IXpsOMPath_GetFillBrushLookup(IXpsOMPath* This,LPWSTR *lookup) {
    return This->lpVtbl->GetFillBrushLookup(This,lookup);
}
static __WIDL_INLINE HRESULT IXpsOMPath_SetFillBrushLookup(IXpsOMPath* This,LPCWSTR lookup) {
    return This->lpVtbl->SetFillBrushLookup(This,lookup);
}
static __WIDL_INLINE HRESULT IXpsOMPath_Clone(IXpsOMPath* This,IXpsOMPath **path) {
    return This->lpVtbl->Clone(This,path);
}
#endif
#endif

#endif


#endif  /* __IXpsOMPath_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IXpsOMSolidColorBrush interface
 */
#ifndef __IXpsOMSolidColorBrush_INTERFACE_DEFINED__
#define __IXpsOMSolidColorBrush_INTERFACE_DEFINED__

DEFINE_GUID(IID_IXpsOMSolidColorBrush, 0xa06f9f05, 0x3be9, 0x4763, 0x98,0xa8, 0x09,0x4f,0xc6,0x72,0xe4,0x88);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("a06f9f05-3be9-4763-98a8-094fc672e488")
IXpsOMSolidColorBrush : public IXpsOMBrush
{
    virtual HRESULT STDMETHODCALLTYPE GetColor(
        XPS_COLOR *color,
        IXpsOMColorProfileResource **colorProfile) = 0;

    virtual HRESULT STDMETHODCALLTYPE SetColor(
        const XPS_COLOR *color,
        IXpsOMColorProfileResource *colorProfile) = 0;

    virtual HRESULT STDMETHODCALLTYPE Clone(
        IXpsOMSolidColorBrush **solidColorBrush) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IXpsOMSolidColorBrush, 0xa06f9f05, 0x3be9, 0x4763, 0x98,0xa8, 0x09,0x4f,0xc6,0x72,0xe4,0x88)
#endif
#else
typedef struct IXpsOMSolidColorBrushVtbl {
    BEGIN_INTERFACE

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

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

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

    /*** IXpsOMShareable methods ***/
    HRESULT (STDMETHODCALLTYPE *GetOwner)(
        IXpsOMSolidColorBrush *This,
        IUnknown **owner);

    HRESULT (STDMETHODCALLTYPE *GetType)(
        IXpsOMSolidColorBrush *This,
        XPS_OBJECT_TYPE *type);

    /*** IXpsOMBrush methods ***/
    HRESULT (STDMETHODCALLTYPE *GetOpacity)(
        IXpsOMSolidColorBrush *This,
        FLOAT *opacity);

    HRESULT (STDMETHODCALLTYPE *SetOpacity)(
        IXpsOMSolidColorBrush *This,
        FLOAT opacity);

    /*** IXpsOMSolidColorBrush methods ***/
    HRESULT (STDMETHODCALLTYPE *GetColor)(
        IXpsOMSolidColorBrush *This,
        XPS_COLOR *color,
        IXpsOMColorProfileResource **colorProfile);

    HRESULT (STDMETHODCALLTYPE *SetColor)(
        IXpsOMSolidColorBrush *This,
        const XPS_COLOR *color,
        IXpsOMColorProfileResource *colorProfile);

    HRESULT (STDMETHODCALLTYPE *Clone)(
        IXpsOMSolidColorBrush *This,
        IXpsOMSolidColorBrush **solidColorBrush);

    END_INTERFACE
} IXpsOMSolidColorBrushVtbl;

interface IXpsOMSolidColorBrush {
    CONST_VTBL IXpsOMSolidColorBrushVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IXpsOMSolidColorBrush_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IXpsOMSolidColorBrush_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IXpsOMSolidColorBrush_Release(This) (This)->lpVtbl->Release(This)
/*** IXpsOMShareable methods ***/
#define IXpsOMSolidColorBrush_GetOwner(This,owner) (This)->lpVtbl->GetOwner(This,owner)
#define IXpsOMSolidColorBrush_GetType(This,type) (This)->lpVtbl->GetType(This,type)
/*** IXpsOMBrush methods ***/
#define IXpsOMSolidColorBrush_GetOpacity(This,opacity) (This)->lpVtbl->GetOpacity(This,opacity)
#define IXpsOMSolidColorBrush_SetOpacity(This,opacity) (This)->lpVtbl->SetOpacity(This,opacity)
/*** IXpsOMSolidColorBrush methods ***/
#define IXpsOMSolidColorBrush_GetColor(This,color,colorProfile) (This)->lpVtbl->GetColor(This,color,colorProfile)
#define IXpsOMSolidColorBrush_SetColor(This,color,colorProfile) (This)->lpVtbl->SetColor(This,color,colorProfile)
#define IXpsOMSolidColorBrush_Clone(This,solidColorBrush) (This)->lpVtbl->Clone(This,solidColorBrush)
#else
/*** IUnknown methods ***/
static __WIDL_INLINE HRESULT IXpsOMSolidColorBrush_QueryInterface(IXpsOMSolidColorBrush* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IXpsOMSolidColorBrush_AddRef(IXpsOMSolidColorBrush* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IXpsOMSolidColorBrush_Release(IXpsOMSolidColorBrush* This) {
    return This->lpVtbl->Release(This);
}
/*** IXpsOMShareable methods ***/
static __WIDL_INLINE HRESULT IXpsOMSolidColorBrush_GetOwner(IXpsOMSolidColorBrush* This,IUnknown **owner) {
    return This->lpVtbl->GetOwner(This,owner);
}
static __WIDL_INLINE HRESULT IXpsOMSolidColorBrush_GetType(IXpsOMSolidColorBrush* This,XPS_OBJECT_TYPE *type) {
    return This->lpVtbl->GetType(This,type);
}
/*** IXpsOMBrush methods ***/
static __WIDL_INLINE HRESULT IXpsOMSolidColorBrush_GetOpacity(IXpsOMSolidColorBrush* This,FLOAT *opacity) {
    return This->lpVtbl->GetOpacity(This,opacity);
}
static __WIDL_INLINE HRESULT IXpsOMSolidColorBrush_SetOpacity(IXpsOMSolidColorBrush* This,FLOAT opacity) {
    return This->lpVtbl->SetOpacity(This,opacity);
}
/*** IXpsOMSolidColorBrush methods ***/
static __WIDL_INLINE HRESULT IXpsOMSolidColorBrush_GetColor(IXpsOMSolidColorBrush* This,XPS_COLOR *color,IXpsOMColorProfileResource **colorProfile) {
    return This->lpVtbl->GetColor(This,color,colorProfile);
}
static __WIDL_INLINE HRESULT IXpsOMSolidColorBrush_SetColor(IXpsOMSolidColorBrush* This,const XPS_COLOR *color,IXpsOMColorProfileResource *colorProfile) {
    return This->lpVtbl->SetColor(This,color,colorProfile);
}
static __WIDL_INLINE HRESULT IXpsOMSolidColorBrush_Clone(IXpsOMSolidColorBrush* This,IXpsOMSolidColorBrush **solidColorBrush) {
    return This->lpVtbl->Clone(This,solidColorBrush);
}
#endif
#endif

#endif


#endif  /* __IXpsOMSolidColorBrush_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IXpsOMTileBrush interface
 */
#ifndef __IXpsOMTileBrush_INTERFACE_DEFINED__
#define __IXpsOMTileBrush_INTERFACE_DEFINED__

DEFINE_GUID(IID_IXpsOMTileBrush, 0x0fc2328d, 0xd722, 0x4a54, 0xb2,0xec, 0xbe,0x90,0x21,0x8a,0x78,0x9e);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("0fc2328d-d722-4a54-b2ec-be90218a789e")
IXpsOMTileBrush : public IXpsOMBrush
{
    virtual HRESULT STDMETHODCALLTYPE GetTransform(
        IXpsOMMatrixTransform **transform) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetTransformLocal(
        IXpsOMMatrixTransform **transform) = 0;

    virtual HRESULT STDMETHODCALLTYPE SetTransformLocal(
        IXpsOMMatrixTransform *transform) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetTransformLookup(
        LPWSTR *key) = 0;

    virtual HRESULT STDMETHODCALLTYPE SetTransformLookup(
        LPCWSTR key) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetViewbox(
        XPS_RECT *viewbox) = 0;

    virtual HRESULT STDMETHODCALLTYPE SetViewbox(
        const XPS_RECT *viewbox) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetViewport(
        XPS_RECT *viewport) = 0;

    virtual HRESULT STDMETHODCALLTYPE SetViewport(
        const XPS_RECT *viewport) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetTileMode(
        XPS_TILE_MODE *tileMode) = 0;

    virtual HRESULT STDMETHODCALLTYPE SetTileMode(
        XPS_TILE_MODE tileMode) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IXpsOMTileBrush, 0x0fc2328d, 0xd722, 0x4a54, 0xb2,0xec, 0xbe,0x90,0x21,0x8a,0x78,0x9e)
#endif
#else
typedef struct IXpsOMTileBrushVtbl {
    BEGIN_INTERFACE

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

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

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

    /*** IXpsOMShareable methods ***/
    HRESULT (STDMETHODCALLTYPE *GetOwner)(
        IXpsOMTileBrush *This,
        IUnknown **owner);

    HRESULT (STDMETHODCALLTYPE *GetType)(
        IXpsOMTileBrush *This,
        XPS_OBJECT_TYPE *type);

    /*** IXpsOMBrush methods ***/
    HRESULT (STDMETHODCALLTYPE *GetOpacity)(
        IXpsOMTileBrush *This,
        FLOAT *opacity);

    HRESULT (STDMETHODCALLTYPE *SetOpacity)(
        IXpsOMTileBrush *This,
        FLOAT opacity);

    /*** IXpsOMTileBrush methods ***/
    HRESULT (STDMETHODCALLTYPE *GetTransform)(
        IXpsOMTileBrush *This,
        IXpsOMMatrixTransform **transform);

    HRESULT (STDMETHODCALLTYPE *GetTransformLocal)(
        IXpsOMTileBrush *This,
        IXpsOMMatrixTransform **transform);

    HRESULT (STDMETHODCALLTYPE *SetTransformLocal)(
        IXpsOMTileBrush *This,
        IXpsOMMatrixTransform *transform);

    HRESULT (STDMETHODCALLTYPE *GetTransformLookup)(
        IXpsOMTileBrush *This,
        LPWSTR *key);

    HRESULT (STDMETHODCALLTYPE *SetTransformLookup)(
        IXpsOMTileBrush *This,
        LPCWSTR key);

    HRESULT (STDMETHODCALLTYPE *GetViewbox)(
        IXpsOMTileBrush *This,
        XPS_RECT *viewbox);

    HRESULT (STDMETHODCALLTYPE *SetViewbox)(
        IXpsOMTileBrush *This,
        const XPS_RECT *viewbox);

    HRESULT (STDMETHODCALLTYPE *GetViewport)(
        IXpsOMTileBrush *This,
        XPS_RECT *viewport);

    HRESULT (STDMETHODCALLTYPE *SetViewport)(
        IXpsOMTileBrush *This,
        const XPS_RECT *viewport);

    HRESULT (STDMETHODCALLTYPE *GetTileMode)(
        IXpsOMTileBrush *This,
        XPS_TILE_MODE *tileMode);

    HRESULT (STDMETHODCALLTYPE *SetTileMode)(
        IXpsOMTileBrush *This,
        XPS_TILE_MODE tileMode);

    END_INTERFACE
} IXpsOMTileBrushVtbl;

interface IXpsOMTileBrush {
    CONST_VTBL IXpsOMTileBrushVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IXpsOMTileBrush_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IXpsOMTileBrush_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IXpsOMTileBrush_Release(This) (This)->lpVtbl->Release(This)
/*** IXpsOMShareable methods ***/
#define IXpsOMTileBrush_GetOwner(This,owner) (This)->lpVtbl->GetOwner(This,owner)
#define IXpsOMTileBrush_GetType(This,type) (This)->lpVtbl->GetType(This,type)
/*** IXpsOMBrush methods ***/
#define IXpsOMTileBrush_GetOpacity(This,opacity) (This)->lpVtbl->GetOpacity(This,opacity)
#define IXpsOMTileBrush_SetOpacity(This,opacity) (This)->lpVtbl->SetOpacity(This,opacity)
/*** IXpsOMTileBrush methods ***/
#define IXpsOMTileBrush_GetTransform(This,transform) (This)->lpVtbl->GetTransform(This,transform)
#define IXpsOMTileBrush_GetTransformLocal(This,transform) (This)->lpVtbl->GetTransformLocal(This,transform)
#define IXpsOMTileBrush_SetTransformLocal(This,transform) (This)->lpVtbl->SetTransformLocal(This,transform)
#define IXpsOMTileBrush_GetTransformLookup(This,key) (This)->lpVtbl->GetTransformLookup(This,key)
#define IXpsOMTileBrush_SetTransformLookup(This,key) (This)->lpVtbl->SetTransformLookup(This,key)
#define IXpsOMTileBrush_GetViewbox(This,viewbox) (This)->lpVtbl->GetViewbox(This,viewbox)
#define IXpsOMTileBrush_SetViewbox(This,viewbox) (This)->lpVtbl->SetViewbox(This,viewbox)
#define IXpsOMTileBrush_GetViewport(This,viewport) (This)->lpVtbl->GetViewport(This,viewport)
#define IXpsOMTileBrush_SetViewport(This,viewport) (This)->lpVtbl->SetViewport(This,viewport)
#define IXpsOMTileBrush_GetTileMode(This,tileMode) (This)->lpVtbl->GetTileMode(This,tileMode)
#define IXpsOMTileBrush_SetTileMode(This,tileMode) (This)->lpVtbl->SetTileMode(This,tileMode)
#else
/*** IUnknown methods ***/
static __WIDL_INLINE HRESULT IXpsOMTileBrush_QueryInterface(IXpsOMTileBrush* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IXpsOMTileBrush_AddRef(IXpsOMTileBrush* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IXpsOMTileBrush_Release(IXpsOMTileBrush* This) {
    return This->lpVtbl->Release(This);
}
/*** IXpsOMShareable methods ***/
static __WIDL_INLINE HRESULT IXpsOMTileBrush_GetOwner(IXpsOMTileBrush* This,IUnknown **owner) {
    return This->lpVtbl->GetOwner(This,owner);
}
static __WIDL_INLINE HRESULT IXpsOMTileBrush_GetType(IXpsOMTileBrush* This,XPS_OBJECT_TYPE *type) {
    return This->lpVtbl->GetType(This,type);
}
/*** IXpsOMBrush methods ***/
static __WIDL_INLINE HRESULT IXpsOMTileBrush_GetOpacity(IXpsOMTileBrush* This,FLOAT *opacity) {
    return This->lpVtbl->GetOpacity(This,opacity);
}
static __WIDL_INLINE HRESULT IXpsOMTileBrush_SetOpacity(IXpsOMTileBrush* This,FLOAT opacity) {
    return This->lpVtbl->SetOpacity(This,opacity);
}
/*** IXpsOMTileBrush methods ***/
static __WIDL_INLINE HRESULT IXpsOMTileBrush_GetTransform(IXpsOMTileBrush* This,IXpsOMMatrixTransform **transform) {
    return This->lpVtbl->GetTransform(This,transform);
}
static __WIDL_INLINE HRESULT IXpsOMTileBrush_GetTransformLocal(IXpsOMTileBrush* This,IXpsOMMatrixTransform **transform) {
    return This->lpVtbl->GetTransformLocal(This,transform);
}
static __WIDL_INLINE HRESULT IXpsOMTileBrush_SetTransformLocal(IXpsOMTileBrush* This,IXpsOMMatrixTransform *transform) {
    return This->lpVtbl->SetTransformLocal(This,transform);
}
static __WIDL_INLINE HRESULT IXpsOMTileBrush_GetTransformLookup(IXpsOMTileBrush* This,LPWSTR *key) {
    return This->lpVtbl->GetTransformLookup(This,key);
}
static __WIDL_INLINE HRESULT IXpsOMTileBrush_SetTransformLookup(IXpsOMTileBrush* This,LPCWSTR key) {
    return This->lpVtbl->SetTransformLookup(This,key);
}
static __WIDL_INLINE HRESULT IXpsOMTileBrush_GetViewbox(IXpsOMTileBrush* This,XPS_RECT *viewbox) {
    return This->lpVtbl->GetViewbox(This,viewbox);
}
static __WIDL_INLINE HRESULT IXpsOMTileBrush_SetViewbox(IXpsOMTileBrush* This,const XPS_RECT *viewbox) {
    return This->lpVtbl->SetViewbox(This,viewbox);
}
static __WIDL_INLINE HRESULT IXpsOMTileBrush_GetViewport(IXpsOMTileBrush* This,XPS_RECT *viewport) {
    return This->lpVtbl->GetViewport(This,viewport);
}
static __WIDL_INLINE HRESULT IXpsOMTileBrush_SetViewport(IXpsOMTileBrush* This,const XPS_RECT *viewport) {
    return This->lpVtbl->SetViewport(This,viewport);
}
static __WIDL_INLINE HRESULT IXpsOMTileBrush_GetTileMode(IXpsOMTileBrush* This,XPS_TILE_MODE *tileMode) {
    return This->lpVtbl->GetTileMode(This,tileMode);
}
static __WIDL_INLINE HRESULT IXpsOMTileBrush_SetTileMode(IXpsOMTileBrush* This,XPS_TILE_MODE tileMode) {
    return This->lpVtbl->SetTileMode(This,tileMode);
}
#endif
#endif

#endif


#endif  /* __IXpsOMTileBrush_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IXpsOMGradientBrush interface
 */
#ifndef __IXpsOMGradientBrush_INTERFACE_DEFINED__
#define __IXpsOMGradientBrush_INTERFACE_DEFINED__

DEFINE_GUID(IID_IXpsOMGradientBrush, 0xedb59622, 0x61a2, 0x42c3, 0xba,0xce, 0xac,0xf2,0x28,0x6c,0x06,0xbf);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("edb59622-61a2-42c3-bace-acf2286c06bf")
IXpsOMGradientBrush : public IXpsOMBrush
{
    virtual HRESULT STDMETHODCALLTYPE GetGradientStops(
        IXpsOMGradientStopCollection **gradientStops) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetTransform(
        IXpsOMMatrixTransform **transform) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetTransformLocal(
        IXpsOMMatrixTransform **transform) = 0;

    virtual HRESULT STDMETHODCALLTYPE SetTransformLocal(
        IXpsOMMatrixTransform *transform) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetTransformLookup(
        LPWSTR *key) = 0;

    virtual HRESULT STDMETHODCALLTYPE SetTransformLookup(
        LPCWSTR key) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetSpreadMethod(
        XPS_SPREAD_METHOD *spreadMethod) = 0;

    virtual HRESULT STDMETHODCALLTYPE SetSpreadMethod(
        XPS_SPREAD_METHOD spreadMethod) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetColorInterpolationMode(
        XPS_COLOR_INTERPOLATION *colorInterpolationMode) = 0;

    virtual HRESULT STDMETHODCALLTYPE SetColorInterpolationMode(
        XPS_COLOR_INTERPOLATION colorInterpolationMode) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IXpsOMGradientBrush, 0xedb59622, 0x61a2, 0x42c3, 0xba,0xce, 0xac,0xf2,0x28,0x6c,0x06,0xbf)
#endif
#else
typedef struct IXpsOMGradientBrushVtbl {
    BEGIN_INTERFACE

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

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

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

    /*** IXpsOMShareable methods ***/
    HRESULT (STDMETHODCALLTYPE *GetOwner)(
        IXpsOMGradientBrush *This,
        IUnknown **owner);

    HRESULT (STDMETHODCALLTYPE *GetType)(
        IXpsOMGradientBrush *This,
        XPS_OBJECT_TYPE *type);

    /*** IXpsOMBrush methods ***/
    HRESULT (STDMETHODCALLTYPE *GetOpacity)(
        IXpsOMGradientBrush *This,
        FLOAT *opacity);

    HRESULT (STDMETHODCALLTYPE *SetOpacity)(
        IXpsOMGradientBrush *This,
        FLOAT opacity);

    /*** IXpsOMGradientBrush methods ***/
    HRESULT (STDMETHODCALLTYPE *GetGradientStops)(
        IXpsOMGradientBrush *This,
        IXpsOMGradientStopCollection **gradientStops);

    HRESULT (STDMETHODCALLTYPE *GetTransform)(
        IXpsOMGradientBrush *This,
        IXpsOMMatrixTransform **transform);

    HRESULT (STDMETHODCALLTYPE *GetTransformLocal)(
        IXpsOMGradientBrush *This,
        IXpsOMMatrixTransform **transform);

    HRESULT (STDMETHODCALLTYPE *SetTransformLocal)(
        IXpsOMGradientBrush *This,
        IXpsOMMatrixTransform *transform);

    HRESULT (STDMETHODCALLTYPE *GetTransformLookup)(
        IXpsOMGradientBrush *This,
        LPWSTR *key);

    HRESULT (STDMETHODCALLTYPE *SetTransformLookup)(
        IXpsOMGradientBrush *This,
        LPCWSTR key);

    HRESULT (STDMETHODCALLTYPE *GetSpreadMethod)(
        IXpsOMGradientBrush *This,
        XPS_SPREAD_METHOD *spreadMethod);

    HRESULT (STDMETHODCALLTYPE *SetSpreadMethod)(
        IXpsOMGradientBrush *This,
        XPS_SPREAD_METHOD spreadMethod);

    HRESULT (STDMETHODCALLTYPE *GetColorInterpolationMode)(
        IXpsOMGradientBrush *This,
        XPS_COLOR_INTERPOLATION *colorInterpolationMode);

    HRESULT (STDMETHODCALLTYPE *SetColorInterpolationMode)(
        IXpsOMGradientBrush *This,
        XPS_COLOR_INTERPOLATION colorInterpolationMode);

    END_INTERFACE
} IXpsOMGradientBrushVtbl;

interface IXpsOMGradientBrush {
    CONST_VTBL IXpsOMGradientBrushVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IXpsOMGradientBrush_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IXpsOMGradientBrush_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IXpsOMGradientBrush_Release(This) (This)->lpVtbl->Release(This)
/*** IXpsOMShareable methods ***/
#define IXpsOMGradientBrush_GetOwner(This,owner) (This)->lpVtbl->GetOwner(This,owner)
#define IXpsOMGradientBrush_GetType(This,type) (This)->lpVtbl->GetType(This,type)
/*** IXpsOMBrush methods ***/
#define IXpsOMGradientBrush_GetOpacity(This,opacity) (This)->lpVtbl->GetOpacity(This,opacity)
#define IXpsOMGradientBrush_SetOpacity(This,opacity) (This)->lpVtbl->SetOpacity(This,opacity)
/*** IXpsOMGradientBrush methods ***/
#define IXpsOMGradientBrush_GetGradientStops(This,gradientStops) (This)->lpVtbl->GetGradientStops(This,gradientStops)
#define IXpsOMGradientBrush_GetTransform(This,transform) (This)->lpVtbl->GetTransform(This,transform)
#define IXpsOMGradientBrush_GetTransformLocal(This,transform) (This)->lpVtbl->GetTransformLocal(This,transform)
#define IXpsOMGradientBrush_SetTransformLocal(This,transform) (This)->lpVtbl->SetTransformLocal(This,transform)
#define IXpsOMGradientBrush_GetTransformLookup(This,key) (This)->lpVtbl->GetTransformLookup(This,key)
#define IXpsOMGradientBrush_SetTransformLookup(This,key) (This)->lpVtbl->SetTransformLookup(This,key)
#define IXpsOMGradientBrush_GetSpreadMethod(This,spreadMethod) (This)->lpVtbl->GetSpreadMethod(This,spreadMethod)
#define IXpsOMGradientBrush_SetSpreadMethod(This,spreadMethod) (This)->lpVtbl->SetSpreadMethod(This,spreadMethod)
#define IXpsOMGradientBrush_GetColorInterpolationMode(This,colorInterpolationMode) (This)->lpVtbl->GetColorInterpolationMode(This,colorInterpolationMode)
#define IXpsOMGradientBrush_SetColorInterpolationMode(This,colorInterpolationMode) (This)->lpVtbl->SetColorInterpolationMode(This,colorInterpolationMode)
#else
/*** IUnknown methods ***/
static __WIDL_INLINE HRESULT IXpsOMGradientBrush_QueryInterface(IXpsOMGradientBrush* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IXpsOMGradientBrush_AddRef(IXpsOMGradientBrush* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IXpsOMGradientBrush_Release(IXpsOMGradientBrush* This) {
    return This->lpVtbl->Release(This);
}
/*** IXpsOMShareable methods ***/
static __WIDL_INLINE HRESULT IXpsOMGradientBrush_GetOwner(IXpsOMGradientBrush* This,IUnknown **owner) {
    return This->lpVtbl->GetOwner(This,owner);
}
static __WIDL_INLINE HRESULT IXpsOMGradientBrush_GetType(IXpsOMGradientBrush* This,XPS_OBJECT_TYPE *type) {
    return This->lpVtbl->GetType(This,type);
}
/*** IXpsOMBrush methods ***/
static __WIDL_INLINE HRESULT IXpsOMGradientBrush_GetOpacity(IXpsOMGradientBrush* This,FLOAT *opacity) {
    return This->lpVtbl->GetOpacity(This,opacity);
}
static __WIDL_INLINE HRESULT IXpsOMGradientBrush_SetOpacity(IXpsOMGradientBrush* This,FLOAT opacity) {
    return This->lpVtbl->SetOpacity(This,opacity);
}
/*** IXpsOMGradientBrush methods ***/
static __WIDL_INLINE HRESULT IXpsOMGradientBrush_GetGradientStops(IXpsOMGradientBrush* This,IXpsOMGradientStopCollection **gradientStops) {
    return This->lpVtbl->GetGradientStops(This,gradientStops);
}
static __WIDL_INLINE HRESULT IXpsOMGradientBrush_GetTransform(IXpsOMGradientBrush* This,IXpsOMMatrixTransform **transform) {
    return This->lpVtbl->GetTransform(This,transform);
}
static __WIDL_INLINE HRESULT IXpsOMGradientBrush_GetTransformLocal(IXpsOMGradientBrush* This,IXpsOMMatrixTransform **transform) {
    return This->lpVtbl->GetTransformLocal(This,transform);
}
static __WIDL_INLINE HRESULT IXpsOMGradientBrush_SetTransformLocal(IXpsOMGradientBrush* This,IXpsOMMatrixTransform *transform) {
    return This->lpVtbl->SetTransformLocal(This,transform);
}
static __WIDL_INLINE HRESULT IXpsOMGradientBrush_GetTransformLookup(IXpsOMGradientBrush* This,LPWSTR *key) {
    return This->lpVtbl->GetTransformLookup(This,key);
}
static __WIDL_INLINE HRESULT IXpsOMGradientBrush_SetTransformLookup(IXpsOMGradientBrush* This,LPCWSTR key) {
    return This->lpVtbl->SetTransformLookup(This,key);
}
static __WIDL_INLINE HRESULT IXpsOMGradientBrush_GetSpreadMethod(IXpsOMGradientBrush* This,XPS_SPREAD_METHOD *spreadMethod) {
    return This->lpVtbl->GetSpreadMethod(This,spreadMethod);
}
static __WIDL_INLINE HRESULT IXpsOMGradientBrush_SetSpreadMethod(IXpsOMGradientBrush* This,XPS_SPREAD_METHOD spreadMethod) {
    return This->lpVtbl->SetSpreadMethod(This,spreadMethod);
}
static __WIDL_INLINE HRESULT IXpsOMGradientBrush_GetColorInterpolationMode(IXpsOMGradientBrush* This,XPS_COLOR_INTERPOLATION *colorInterpolationMode) {
    return This->lpVtbl->GetColorInterpolationMode(This,colorInterpolationMode);
}
static __WIDL_INLINE HRESULT IXpsOMGradientBrush_SetColorInterpolationMode(IXpsOMGradientBrush* This,XPS_COLOR_INTERPOLATION colorInterpolationMode) {
    return This->lpVtbl->SetColorInterpolationMode(This,colorInterpolationMode);
}
#endif
#endif

#endif


#endif  /* __IXpsOMGradientBrush_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IXpsOMVisualBrush interface
 */
#ifndef __IXpsOMVisualBrush_INTERFACE_DEFINED__
#define __IXpsOMVisualBrush_INTERFACE_DEFINED__

DEFINE_GUID(IID_IXpsOMVisualBrush, 0x97e294af, 0x5b37, 0x46b4, 0x80,0x57, 0x87,0x4d,0x2f,0x64,0x11,0x9b);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("97e294af-5b37-46b4-8057-874d2f64119b")
IXpsOMVisualBrush : public IXpsOMTileBrush
{
    virtual HRESULT STDMETHODCALLTYPE GetVisual(
        IXpsOMVisual **visual) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetVisualLocal(
        IXpsOMVisual **visual) = 0;

    virtual HRESULT STDMETHODCALLTYPE SetVisualLocal(
        IXpsOMVisual *visual) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetVisualLookup(
        LPWSTR *lookup) = 0;

    virtual HRESULT STDMETHODCALLTYPE SetVisualLookup(
        LPCWSTR lookup) = 0;

    virtual HRESULT STDMETHODCALLTYPE Clone(
        IXpsOMVisualBrush **visualBrush) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IXpsOMVisualBrush, 0x97e294af, 0x5b37, 0x46b4, 0x80,0x57, 0x87,0x4d,0x2f,0x64,0x11,0x9b)
#endif
#else
typedef struct IXpsOMVisualBrushVtbl {
    BEGIN_INTERFACE

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

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

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

    /*** IXpsOMShareable methods ***/
    HRESULT (STDMETHODCALLTYPE *GetOwner)(
        IXpsOMVisualBrush *This,
        IUnknown **owner);

    HRESULT (STDMETHODCALLTYPE *GetType)(
        IXpsOMVisualBrush *This,
        XPS_OBJECT_TYPE *type);

    /*** IXpsOMBrush methods ***/
    HRESULT (STDMETHODCALLTYPE *GetOpacity)(
        IXpsOMVisualBrush *This,
        FLOAT *opacity);

    HRESULT (STDMETHODCALLTYPE *SetOpacity)(
        IXpsOMVisualBrush *This,
        FLOAT opacity);

    /*** IXpsOMTileBrush methods ***/
    HRESULT (STDMETHODCALLTYPE *GetTransform)(
        IXpsOMVisualBrush *This,
        IXpsOMMatrixTransform **transform);

    HRESULT (STDMETHODCALLTYPE *GetTransformLocal)(
        IXpsOMVisualBrush *This,
        IXpsOMMatrixTransform **transform);

    HRESULT (STDMETHODCALLTYPE *SetTransformLocal)(
        IXpsOMVisualBrush *This,
        IXpsOMMatrixTransform *transform);

    HRESULT (STDMETHODCALLTYPE *GetTransformLookup)(
        IXpsOMVisualBrush *This,
        LPWSTR *key);

    HRESULT (STDMETHODCALLTYPE *SetTransformLookup)(
        IXpsOMVisualBrush *This,
        LPCWSTR key);

    HRESULT (STDMETHODCALLTYPE *GetViewbox)(
        IXpsOMVisualBrush *This,
        XPS_RECT *viewbox);

    HRESULT (STDMETHODCALLTYPE *SetViewbox)(
        IXpsOMVisualBrush *This,
        const XPS_RECT *viewbox);

    HRESULT (STDMETHODCALLTYPE *GetViewport)(
        IXpsOMVisualBrush *This,
        XPS_RECT *viewport);

    HRESULT (STDMETHODCALLTYPE *SetViewport)(
        IXpsOMVisualBrush *This,
        const XPS_RECT *viewport);

    HRESULT (STDMETHODCALLTYPE *GetTileMode)(
        IXpsOMVisualBrush *This,
        XPS_TILE_MODE *tileMode);

    HRESULT (STDMETHODCALLTYPE *SetTileMode)(
        IXpsOMVisualBrush *This,
        XPS_TILE_MODE tileMode);

    /*** IXpsOMVisualBrush methods ***/
    HRESULT (STDMETHODCALLTYPE *GetVisual)(
        IXpsOMVisualBrush *This,
        IXpsOMVisual **visual);

    HRESULT (STDMETHODCALLTYPE *GetVisualLocal)(
        IXpsOMVisualBrush *This,
        IXpsOMVisual **visual);

    HRESULT (STDMETHODCALLTYPE *SetVisualLocal)(
        IXpsOMVisualBrush *This,
        IXpsOMVisual *visual);

    HRESULT (STDMETHODCALLTYPE *GetVisualLookup)(
        IXpsOMVisualBrush *This,
        LPWSTR *lookup);

    HRESULT (STDMETHODCALLTYPE *SetVisualLookup)(
        IXpsOMVisualBrush *This,
        LPCWSTR lookup);

    HRESULT (STDMETHODCALLTYPE *Clone)(
        IXpsOMVisualBrush *This,
        IXpsOMVisualBrush **visualBrush);

    END_INTERFACE
} IXpsOMVisualBrushVtbl;

interface IXpsOMVisualBrush {
    CONST_VTBL IXpsOMVisualBrushVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IXpsOMVisualBrush_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IXpsOMVisualBrush_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IXpsOMVisualBrush_Release(This) (This)->lpVtbl->Release(This)
/*** IXpsOMShareable methods ***/
#define IXpsOMVisualBrush_GetOwner(This,owner) (This)->lpVtbl->GetOwner(This,owner)
#define IXpsOMVisualBrush_GetType(This,type) (This)->lpVtbl->GetType(This,type)
/*** IXpsOMBrush methods ***/
#define IXpsOMVisualBrush_GetOpacity(This,opacity) (This)->lpVtbl->GetOpacity(This,opacity)
#define IXpsOMVisualBrush_SetOpacity(This,opacity) (This)->lpVtbl->SetOpacity(This,opacity)
/*** IXpsOMTileBrush methods ***/
#define IXpsOMVisualBrush_GetTransform(This,transform) (This)->lpVtbl->GetTransform(This,transform)
#define IXpsOMVisualBrush_GetTransformLocal(This,transform) (This)->lpVtbl->GetTransformLocal(This,transform)
#define IXpsOMVisualBrush_SetTransformLocal(This,transform) (This)->lpVtbl->SetTransformLocal(This,transform)
#define IXpsOMVisualBrush_GetTransformLookup(This,key) (This)->lpVtbl->GetTransformLookup(This,key)
#define IXpsOMVisualBrush_SetTransformLookup(This,key) (This)->lpVtbl->SetTransformLookup(This,key)
#define IXpsOMVisualBrush_GetViewbox(This,viewbox) (This)->lpVtbl->GetViewbox(This,viewbox)
#define IXpsOMVisualBrush_SetViewbox(This,viewbox) (This)->lpVtbl->SetViewbox(This,viewbox)
#define IXpsOMVisualBrush_GetViewport(This,viewport) (This)->lpVtbl->GetViewport(This,viewport)
#define IXpsOMVisualBrush_SetViewport(This,viewport) (This)->lpVtbl->SetViewport(This,viewport)
#define IXpsOMVisualBrush_GetTileMode(This,tileMode) (This)->lpVtbl->GetTileMode(This,tileMode)
#define IXpsOMVisualBrush_SetTileMode(This,tileMode) (This)->lpVtbl->SetTileMode(This,tileMode)
/*** IXpsOMVisualBrush methods ***/
#define IXpsOMVisualBrush_GetVisual(This,visual) (This)->lpVtbl->GetVisual(This,visual)
#define IXpsOMVisualBrush_GetVisualLocal(This,visual) (This)->lpVtbl->GetVisualLocal(This,visual)
#define IXpsOMVisualBrush_SetVisualLocal(This,visual) (This)->lpVtbl->SetVisualLocal(This,visual)
#define IXpsOMVisualBrush_GetVisualLookup(This,lookup) (This)->lpVtbl->GetVisualLookup(This,lookup)
#define IXpsOMVisualBrush_SetVisualLookup(This,lookup) (This)->lpVtbl->SetVisualLookup(This,lookup)
#define IXpsOMVisualBrush_Clone(This,visualBrush) (This)->lpVtbl->Clone(This,visualBrush)
#else
/*** IUnknown methods ***/
static __WIDL_INLINE HRESULT IXpsOMVisualBrush_QueryInterface(IXpsOMVisualBrush* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IXpsOMVisualBrush_AddRef(IXpsOMVisualBrush* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IXpsOMVisualBrush_Release(IXpsOMVisualBrush* This) {
    return This->lpVtbl->Release(This);
}
/*** IXpsOMShareable methods ***/
static __WIDL_INLINE HRESULT IXpsOMVisualBrush_GetOwner(IXpsOMVisualBrush* This,IUnknown **owner) {
    return This->lpVtbl->GetOwner(This,owner);
}
static __WIDL_INLINE HRESULT IXpsOMVisualBrush_GetType(IXpsOMVisualBrush* This,XPS_OBJECT_TYPE *type) {
    return This->lpVtbl->GetType(This,type);
}
/*** IXpsOMBrush methods ***/
static __WIDL_INLINE HRESULT IXpsOMVisualBrush_GetOpacity(IXpsOMVisualBrush* This,FLOAT *opacity) {
    return This->lpVtbl->GetOpacity(This,opacity);
}
static __WIDL_INLINE HRESULT IXpsOMVisualBrush_SetOpacity(IXpsOMVisualBrush* This,FLOAT opacity) {
    return This->lpVtbl->SetOpacity(This,opacity);
}
/*** IXpsOMTileBrush methods ***/
static __WIDL_INLINE HRESULT IXpsOMVisualBrush_GetTransform(IXpsOMVisualBrush* This,IXpsOMMatrixTransform **transform) {
    return This->lpVtbl->GetTransform(This,transform);
}
static __WIDL_INLINE HRESULT IXpsOMVisualBrush_GetTransformLocal(IXpsOMVisualBrush* This,IXpsOMMatrixTransform **transform) {
    return This->lpVtbl->GetTransformLocal(This,transform);
}
static __WIDL_INLINE HRESULT IXpsOMVisualBrush_SetTransformLocal(IXpsOMVisualBrush* This,IXpsOMMatrixTransform *transform) {
    return This->lpVtbl->SetTransformLocal(This,transform);
}
static __WIDL_INLINE HRESULT IXpsOMVisualBrush_GetTransformLookup(IXpsOMVisualBrush* This,LPWSTR *key) {
    return This->lpVtbl->GetTransformLookup(This,key);
}
static __WIDL_INLINE HRESULT IXpsOMVisualBrush_SetTransformLookup(IXpsOMVisualBrush* This,LPCWSTR key) {
    return This->lpVtbl->SetTransformLookup(This,key);
}
static __WIDL_INLINE HRESULT IXpsOMVisualBrush_GetViewbox(IXpsOMVisualBrush* This,XPS_RECT *viewbox) {
    return This->lpVtbl->GetViewbox(This,viewbox);
}
static __WIDL_INLINE HRESULT IXpsOMVisualBrush_SetViewbox(IXpsOMVisualBrush* This,const XPS_RECT *viewbox) {
    return This->lpVtbl->SetViewbox(This,viewbox);
}
static __WIDL_INLINE HRESULT IXpsOMVisualBrush_GetViewport(IXpsOMVisualBrush* This,XPS_RECT *viewport) {
    return This->lpVtbl->GetViewport(This,viewport);
}
static __WIDL_INLINE HRESULT IXpsOMVisualBrush_SetViewport(IXpsOMVisualBrush* This,const XPS_RECT *viewport) {
    return This->lpVtbl->SetViewport(This,viewport);
}
static __WIDL_INLINE HRESULT IXpsOMVisualBrush_GetTileMode(IXpsOMVisualBrush* This,XPS_TILE_MODE *tileMode) {
    return This->lpVtbl->GetTileMode(This,tileMode);
}
static __WIDL_INLINE HRESULT IXpsOMVisualBrush_SetTileMode(IXpsOMVisualBrush* This,XPS_TILE_MODE tileMode) {
    return This->lpVtbl->SetTileMode(This,tileMode);
}
/*** IXpsOMVisualBrush methods ***/
static __WIDL_INLINE HRESULT IXpsOMVisualBrush_GetVisual(IXpsOMVisualBrush* This,IXpsOMVisual **visual) {
    return This->lpVtbl->GetVisual(This,visual);
}
static __WIDL_INLINE HRESULT IXpsOMVisualBrush_GetVisualLocal(IXpsOMVisualBrush* This,IXpsOMVisual **visual) {
    return This->lpVtbl->GetVisualLocal(This,visual);
}
static __WIDL_INLINE HRESULT IXpsOMVisualBrush_SetVisualLocal(IXpsOMVisualBrush* This,IXpsOMVisual *visual) {
    return This->lpVtbl->SetVisualLocal(This,visual);
}
static __WIDL_INLINE HRESULT IXpsOMVisualBrush_GetVisualLookup(IXpsOMVisualBrush* This,LPWSTR *lookup) {
    return This->lpVtbl->GetVisualLookup(This,lookup);
}
static __WIDL_INLINE HRESULT IXpsOMVisualBrush_SetVisualLookup(IXpsOMVisualBrush* This,LPCWSTR lookup) {
    return This->lpVtbl->SetVisualLookup(This,lookup);
}
static __WIDL_INLINE HRESULT IXpsOMVisualBrush_Clone(IXpsOMVisualBrush* This,IXpsOMVisualBrush **visualBrush) {
    return This->lpVtbl->Clone(This,visualBrush);
}
#endif
#endif

#endif


#endif  /* __IXpsOMVisualBrush_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IXpsOMImageBrush interface
 */
#ifndef __IXpsOMImageBrush_INTERFACE_DEFINED__
#define __IXpsOMImageBrush_INTERFACE_DEFINED__

DEFINE_GUID(IID_IXpsOMImageBrush, 0x3df0b466, 0xd382, 0x49ef, 0x85,0x50, 0xdd,0x94,0xc8,0x02,0x42,0xe4);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("3df0b466-d382-49ef-8550-dd94c80242e4")
IXpsOMImageBrush : public IXpsOMTileBrush
{
    virtual HRESULT STDMETHODCALLTYPE GetImageResource(
        IXpsOMImageResource **imageResource) = 0;

    virtual HRESULT STDMETHODCALLTYPE SetImageResource(
        IXpsOMImageResource *imageResource) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetColorProfileResource(
        IXpsOMColorProfileResource **colorProfileResource) = 0;

    virtual HRESULT STDMETHODCALLTYPE SetColorProfileResource(
        IXpsOMColorProfileResource *colorProfileResource) = 0;

    virtual HRESULT STDMETHODCALLTYPE Clone(
        IXpsOMImageBrush **imageBrush) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IXpsOMImageBrush, 0x3df0b466, 0xd382, 0x49ef, 0x85,0x50, 0xdd,0x94,0xc8,0x02,0x42,0xe4)
#endif
#else
typedef struct IXpsOMImageBrushVtbl {
    BEGIN_INTERFACE

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

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

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

    /*** IXpsOMShareable methods ***/
    HRESULT (STDMETHODCALLTYPE *GetOwner)(
        IXpsOMImageBrush *This,
        IUnknown **owner);

    HRESULT (STDMETHODCALLTYPE *GetType)(
        IXpsOMImageBrush *This,
        XPS_OBJECT_TYPE *type);

    /*** IXpsOMBrush methods ***/
    HRESULT (STDMETHODCALLTYPE *GetOpacity)(
        IXpsOMImageBrush *This,
        FLOAT *opacity);

    HRESULT (STDMETHODCALLTYPE *SetOpacity)(
        IXpsOMImageBrush *This,
        FLOAT opacity);

    /*** IXpsOMTileBrush methods ***/
    HRESULT (STDMETHODCALLTYPE *GetTransform)(
        IXpsOMImageBrush *This,
        IXpsOMMatrixTransform **transform);

    HRESULT (STDMETHODCALLTYPE *GetTransformLocal)(
        IXpsOMImageBrush *This,
        IXpsOMMatrixTransform **transform);

    HRESULT (STDMETHODCALLTYPE *SetTransformLocal)(
        IXpsOMImageBrush *This,
        IXpsOMMatrixTransform *transform);

    HRESULT (STDMETHODCALLTYPE *GetTransformLookup)(
        IXpsOMImageBrush *This,
        LPWSTR *key);

    HRESULT (STDMETHODCALLTYPE *SetTransformLookup)(
        IXpsOMImageBrush *This,
        LPCWSTR key);

    HRESULT (STDMETHODCALLTYPE *GetViewbox)(
        IXpsOMImageBrush *This,
        XPS_RECT *viewbox);

    HRESULT (STDMETHODCALLTYPE *SetViewbox)(
        IXpsOMImageBrush *This,
        const XPS_RECT *viewbox);

    HRESULT (STDMETHODCALLTYPE *GetViewport)(
        IXpsOMImageBrush *This,
        XPS_RECT *viewport);

    HRESULT (STDMETHODCALLTYPE *SetViewport)(
        IXpsOMImageBrush *This,
        const XPS_RECT *viewport);

    HRESULT (STDMETHODCALLTYPE *GetTileMode)(
        IXpsOMImageBrush *This,
        XPS_TILE_MODE *tileMode);

    HRESULT (STDMETHODCALLTYPE *SetTileMode)(
        IXpsOMImageBrush *This,
        XPS_TILE_MODE tileMode);

    /*** IXpsOMImageBrush methods ***/
    HRESULT (STDMETHODCALLTYPE *GetImageResource)(
        IXpsOMImageBrush *This,
        IXpsOMImageResource **imageResource);

    HRESULT (STDMETHODCALLTYPE *SetImageResource)(
        IXpsOMImageBrush *This,
        IXpsOMImageResource *imageResource);

    HRESULT (STDMETHODCALLTYPE *GetColorProfileResource)(
        IXpsOMImageBrush *This,
        IXpsOMColorProfileResource **colorProfileResource);

    HRESULT (STDMETHODCALLTYPE *SetColorProfileResource)(
        IXpsOMImageBrush *This,
        IXpsOMColorProfileResource *colorProfileResource);

    HRESULT (STDMETHODCALLTYPE *Clone)(
        IXpsOMImageBrush *This,
        IXpsOMImageBrush **imageBrush);

    END_INTERFACE
} IXpsOMImageBrushVtbl;

interface IXpsOMImageBrush {
    CONST_VTBL IXpsOMImageBrushVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IXpsOMImageBrush_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IXpsOMImageBrush_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IXpsOMImageBrush_Release(This) (This)->lpVtbl->Release(This)
/*** IXpsOMShareable methods ***/
#define IXpsOMImageBrush_GetOwner(This,owner) (This)->lpVtbl->GetOwner(This,owner)
#define IXpsOMImageBrush_GetType(This,type) (This)->lpVtbl->GetType(This,type)
/*** IXpsOMBrush methods ***/
#define IXpsOMImageBrush_GetOpacity(This,opacity) (This)->lpVtbl->GetOpacity(This,opacity)
#define IXpsOMImageBrush_SetOpacity(This,opacity) (This)->lpVtbl->SetOpacity(This,opacity)
/*** IXpsOMTileBrush methods ***/
#define IXpsOMImageBrush_GetTransform(This,transform) (This)->lpVtbl->GetTransform(This,transform)
#define IXpsOMImageBrush_GetTransformLocal(This,transform) (This)->lpVtbl->GetTransformLocal(This,transform)
#define IXpsOMImageBrush_SetTransformLocal(This,transform) (This)->lpVtbl->SetTransformLocal(This,transform)
#define IXpsOMImageBrush_GetTransformLookup(This,key) (This)->lpVtbl->GetTransformLookup(This,key)
#define IXpsOMImageBrush_SetTransformLookup(This,key) (This)->lpVtbl->SetTransformLookup(This,key)
#define IXpsOMImageBrush_GetViewbox(This,viewbox) (This)->lpVtbl->GetViewbox(This,viewbox)
#define IXpsOMImageBrush_SetViewbox(This,viewbox) (This)->lpVtbl->SetViewbox(This,viewbox)
#define IXpsOMImageBrush_GetViewport(This,viewport) (This)->lpVtbl->GetViewport(This,viewport)
#define IXpsOMImageBrush_SetViewport(This,viewport) (This)->lpVtbl->SetViewport(This,viewport)
#define IXpsOMImageBrush_GetTileMode(This,tileMode) (This)->lpVtbl->GetTileMode(This,tileMode)
#define IXpsOMImageBrush_SetTileMode(This,tileMode) (This)->lpVtbl->SetTileMode(This,tileMode)
/*** IXpsOMImageBrush methods ***/
#define IXpsOMImageBrush_GetImageResource(This,imageResource) (This)->lpVtbl->GetImageResource(This,imageResource)
#define IXpsOMImageBrush_SetImageResource(This,imageResource) (This)->lpVtbl->SetImageResource(This,imageResource)
#define IXpsOMImageBrush_GetColorProfileResource(This,colorProfileResource) (This)->lpVtbl->GetColorProfileResource(This,colorProfileResource)
#define IXpsOMImageBrush_SetColorProfileResource(This,colorProfileResource) (This)->lpVtbl->SetColorProfileResource(This,colorProfileResource)
#define IXpsOMImageBrush_Clone(This,imageBrush) (This)->lpVtbl->Clone(This,imageBrush)
#else
/*** IUnknown methods ***/
static __WIDL_INLINE HRESULT IXpsOMImageBrush_QueryInterface(IXpsOMImageBrush* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IXpsOMImageBrush_AddRef(IXpsOMImageBrush* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IXpsOMImageBrush_Release(IXpsOMImageBrush* This) {
    return This->lpVtbl->Release(This);
}
/*** IXpsOMShareable methods ***/
static __WIDL_INLINE HRESULT IXpsOMImageBrush_GetOwner(IXpsOMImageBrush* This,IUnknown **owner) {
    return This->lpVtbl->GetOwner(This,owner);
}
static __WIDL_INLINE HRESULT IXpsOMImageBrush_GetType(IXpsOMImageBrush* This,XPS_OBJECT_TYPE *type) {
    return This->lpVtbl->GetType(This,type);
}
/*** IXpsOMBrush methods ***/
static __WIDL_INLINE HRESULT IXpsOMImageBrush_GetOpacity(IXpsOMImageBrush* This,FLOAT *opacity) {
    return This->lpVtbl->GetOpacity(This,opacity);
}
static __WIDL_INLINE HRESULT IXpsOMImageBrush_SetOpacity(IXpsOMImageBrush* This,FLOAT opacity) {
    return This->lpVtbl->SetOpacity(This,opacity);
}
/*** IXpsOMTileBrush methods ***/
static __WIDL_INLINE HRESULT IXpsOMImageBrush_GetTransform(IXpsOMImageBrush* This,IXpsOMMatrixTransform **transform) {
    return This->lpVtbl->GetTransform(This,transform);
}
static __WIDL_INLINE HRESULT IXpsOMImageBrush_GetTransformLocal(IXpsOMImageBrush* This,IXpsOMMatrixTransform **transform) {
    return This->lpVtbl->GetTransformLocal(This,transform);
}
static __WIDL_INLINE HRESULT IXpsOMImageBrush_SetTransformLocal(IXpsOMImageBrush* This,IXpsOMMatrixTransform *transform) {
    return This->lpVtbl->SetTransformLocal(This,transform);
}
static __WIDL_INLINE HRESULT IXpsOMImageBrush_GetTransformLookup(IXpsOMImageBrush* This,LPWSTR *key) {
    return This->lpVtbl->GetTransformLookup(This,key);
}
static __WIDL_INLINE HRESULT IXpsOMImageBrush_SetTransformLookup(IXpsOMImageBrush* This,LPCWSTR key) {
    return This->lpVtbl->SetTransformLookup(This,key);
}
static __WIDL_INLINE HRESULT IXpsOMImageBrush_GetViewbox(IXpsOMImageBrush* This,XPS_RECT *viewbox) {
    return This->lpVtbl->GetViewbox(This,viewbox);
}
static __WIDL_INLINE HRESULT IXpsOMImageBrush_SetViewbox(IXpsOMImageBrush* This,const XPS_RECT *viewbox) {
    return This->lpVtbl->SetViewbox(This,viewbox);
}
static __WIDL_INLINE HRESULT IXpsOMImageBrush_GetViewport(IXpsOMImageBrush* This,XPS_RECT *viewport) {
    return This->lpVtbl->GetViewport(This,viewport);
}
static __WIDL_INLINE HRESULT IXpsOMImageBrush_SetViewport(IXpsOMImageBrush* This,const XPS_RECT *viewport) {
    return This->lpVtbl->SetViewport(This,viewport);
}
static __WIDL_INLINE HRESULT IXpsOMImageBrush_GetTileMode(IXpsOMImageBrush* This,XPS_TILE_MODE *tileMode) {
    return This->lpVtbl->GetTileMode(This,tileMode);
}
static __WIDL_INLINE HRESULT IXpsOMImageBrush_SetTileMode(IXpsOMImageBrush* This,XPS_TILE_MODE tileMode) {
    return This->lpVtbl->SetTileMode(This,tileMode);
}
/*** IXpsOMImageBrush methods ***/
static __WIDL_INLINE HRESULT IXpsOMImageBrush_GetImageResource(IXpsOMImageBrush* This,IXpsOMImageResource **imageResource) {
    return This->lpVtbl->GetImageResource(This,imageResource);
}
static __WIDL_INLINE HRESULT IXpsOMImageBrush_SetImageResource(IXpsOMImageBrush* This,IXpsOMImageResource *imageResource) {
    return This->lpVtbl->SetImageResource(This,imageResource);
}
static __WIDL_INLINE HRESULT IXpsOMImageBrush_GetColorProfileResource(IXpsOMImageBrush* This,IXpsOMColorProfileResource **colorProfileResource) {
    return This->lpVtbl->GetColorProfileResource(This,colorProfileResource);
}
static __WIDL_INLINE HRESULT IXpsOMImageBrush_SetColorProfileResource(IXpsOMImageBrush* This,IXpsOMColorProfileResource *colorProfileResource) {
    return This->lpVtbl->SetColorProfileResource(This,colorProfileResource);
}
static __WIDL_INLINE HRESULT IXpsOMImageBrush_Clone(IXpsOMImageBrush* This,IXpsOMImageBrush **imageBrush) {
    return This->lpVtbl->Clone(This,imageBrush);
}
#endif
#endif

#endif


#endif  /* __IXpsOMImageBrush_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IXpsOMLinearGradientBrush interface
 */
#ifndef __IXpsOMLinearGradientBrush_INTERFACE_DEFINED__
#define __IXpsOMLinearGradientBrush_INTERFACE_DEFINED__

DEFINE_GUID(IID_IXpsOMLinearGradientBrush, 0x005e279f, 0xc30d, 0x40ff, 0x93,0xec, 0x19,0x50,0xd3,0xc5,0x28,0xdb);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("005e279f-c30d-40ff-93ec-1950d3c528db")
IXpsOMLinearGradientBrush : public IXpsOMGradientBrush
{
    virtual HRESULT STDMETHODCALLTYPE GetStartPoint(
        XPS_POINT *startPoint) = 0;

    virtual HRESULT STDMETHODCALLTYPE SetStartPoint(
        const XPS_POINT *startPoint) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetEndPoint(
        XPS_POINT *endPoint) = 0;

    virtual HRESULT STDMETHODCALLTYPE SetEndPoint(
        const XPS_POINT *endPoint) = 0;

    virtual HRESULT STDMETHODCALLTYPE Clone(
        IXpsOMLinearGradientBrush **linearGradientBrush) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IXpsOMLinearGradientBrush, 0x005e279f, 0xc30d, 0x40ff, 0x93,0xec, 0x19,0x50,0xd3,0xc5,0x28,0xdb)
#endif
#else
typedef struct IXpsOMLinearGradientBrushVtbl {
    BEGIN_INTERFACE

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

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

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

    /*** IXpsOMShareable methods ***/
    HRESULT (STDMETHODCALLTYPE *GetOwner)(
        IXpsOMLinearGradientBrush *This,
        IUnknown **owner);

    HRESULT (STDMETHODCALLTYPE *GetType)(
        IXpsOMLinearGradientBrush *This,
        XPS_OBJECT_TYPE *type);

    /*** IXpsOMBrush methods ***/
    HRESULT (STDMETHODCALLTYPE *GetOpacity)(
        IXpsOMLinearGradientBrush *This,
        FLOAT *opacity);

    HRESULT (STDMETHODCALLTYPE *SetOpacity)(
        IXpsOMLinearGradientBrush *This,
        FLOAT opacity);

    /*** IXpsOMGradientBrush methods ***/
    HRESULT (STDMETHODCALLTYPE *GetGradientStops)(
        IXpsOMLinearGradientBrush *This,
        IXpsOMGradientStopCollection **gradientStops);

    HRESULT (STDMETHODCALLTYPE *GetTransform)(
        IXpsOMLinearGradientBrush *This,
        IXpsOMMatrixTransform **transform);

    HRESULT (STDMETHODCALLTYPE *GetTransformLocal)(
        IXpsOMLinearGradientBrush *This,
        IXpsOMMatrixTransform **transform);

    HRESULT (STDMETHODCALLTYPE *SetTransformLocal)(
        IXpsOMLinearGradientBrush *This,
        IXpsOMMatrixTransform *transform);

    HRESULT (STDMETHODCALLTYPE *GetTransformLookup)(
        IXpsOMLinearGradientBrush *This,
        LPWSTR *key);

    HRESULT (STDMETHODCALLTYPE *SetTransformLookup)(
        IXpsOMLinearGradientBrush *This,
        LPCWSTR key);

    HRESULT (STDMETHODCALLTYPE *GetSpreadMethod)(
        IXpsOMLinearGradientBrush *This,
        XPS_SPREAD_METHOD *spreadMethod);

    HRESULT (STDMETHODCALLTYPE *SetSpreadMethod)(
        IXpsOMLinearGradientBrush *This,
        XPS_SPREAD_METHOD spreadMethod);

    HRESULT (STDMETHODCALLTYPE *GetColorInterpolationMode)(
        IXpsOMLinearGradientBrush *This,
        XPS_COLOR_INTERPOLATION *colorInterpolationMode);

    HRESULT (STDMETHODCALLTYPE *SetColorInterpolationMode)(
        IXpsOMLinearGradientBrush *This,
        XPS_COLOR_INTERPOLATION colorInterpolationMode);

    /*** IXpsOMLinearGradientBrush methods ***/
    HRESULT (STDMETHODCALLTYPE *GetStartPoint)(
        IXpsOMLinearGradientBrush *This,
        XPS_POINT *startPoint);

    HRESULT (STDMETHODCALLTYPE *SetStartPoint)(
        IXpsOMLinearGradientBrush *This,
        const XPS_POINT *startPoint);

    HRESULT (STDMETHODCALLTYPE *GetEndPoint)(
        IXpsOMLinearGradientBrush *This,
        XPS_POINT *endPoint);

    HRESULT (STDMETHODCALLTYPE *SetEndPoint)(
        IXpsOMLinearGradientBrush *This,
        const XPS_POINT *endPoint);

    HRESULT (STDMETHODCALLTYPE *Clone)(
        IXpsOMLinearGradientBrush *This,
        IXpsOMLinearGradientBrush **linearGradientBrush);

    END_INTERFACE
} IXpsOMLinearGradientBrushVtbl;

interface IXpsOMLinearGradientBrush {
    CONST_VTBL IXpsOMLinearGradientBrushVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IXpsOMLinearGradientBrush_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IXpsOMLinearGradientBrush_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IXpsOMLinearGradientBrush_Release(This) (This)->lpVtbl->Release(This)
/*** IXpsOMShareable methods ***/
#define IXpsOMLinearGradientBrush_GetOwner(This,owner) (This)->lpVtbl->GetOwner(This,owner)
#define IXpsOMLinearGradientBrush_GetType(This,type) (This)->lpVtbl->GetType(This,type)
/*** IXpsOMBrush methods ***/
#define IXpsOMLinearGradientBrush_GetOpacity(This,opacity) (This)->lpVtbl->GetOpacity(This,opacity)
#define IXpsOMLinearGradientBrush_SetOpacity(This,opacity) (This)->lpVtbl->SetOpacity(This,opacity)
/*** IXpsOMGradientBrush methods ***/
#define IXpsOMLinearGradientBrush_GetGradientStops(This,gradientStops) (This)->lpVtbl->GetGradientStops(This,gradientStops)
#define IXpsOMLinearGradientBrush_GetTransform(This,transform) (This)->lpVtbl->GetTransform(This,transform)
#define IXpsOMLinearGradientBrush_GetTransformLocal(This,transform) (This)->lpVtbl->GetTransformLocal(This,transform)
#define IXpsOMLinearGradientBrush_SetTransformLocal(This,transform) (This)->lpVtbl->SetTransformLocal(This,transform)
#define IXpsOMLinearGradientBrush_GetTransformLookup(This,key) (This)->lpVtbl->GetTransformLookup(This,key)
#define IXpsOMLinearGradientBrush_SetTransformLookup(This,key) (This)->lpVtbl->SetTransformLookup(This,key)
#define IXpsOMLinearGradientBrush_GetSpreadMethod(This,spreadMethod) (This)->lpVtbl->GetSpreadMethod(This,spreadMethod)
#define IXpsOMLinearGradientBrush_SetSpreadMethod(This,spreadMethod) (This)->lpVtbl->SetSpreadMethod(This,spreadMethod)
#define IXpsOMLinearGradientBrush_GetColorInterpolationMode(This,colorInterpolationMode) (This)->lpVtbl->GetColorInterpolationMode(This,colorInterpolationMode)
#define IXpsOMLinearGradientBrush_SetColorInterpolationMode(This,colorInterpolationMode) (This)->lpVtbl->SetColorInterpolationMode(This,colorInterpolationMode)
/*** IXpsOMLinearGradientBrush methods ***/
#define IXpsOMLinearGradientBrush_GetStartPoint(This,startPoint) (This)->lpVtbl->GetStartPoint(This,startPoint)
#define IXpsOMLinearGradientBrush_SetStartPoint(This,startPoint) (This)->lpVtbl->SetStartPoint(This,startPoint)
#define IXpsOMLinearGradientBrush_GetEndPoint(This,endPoint) (This)->lpVtbl->GetEndPoint(This,endPoint)
#define IXpsOMLinearGradientBrush_SetEndPoint(This,endPoint) (This)->lpVtbl->SetEndPoint(This,endPoint)
#define IXpsOMLinearGradientBrush_Clone(This,linearGradientBrush) (This)->lpVtbl->Clone(This,linearGradientBrush)
#else
/*** IUnknown methods ***/
static __WIDL_INLINE HRESULT IXpsOMLinearGradientBrush_QueryInterface(IXpsOMLinearGradientBrush* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IXpsOMLinearGradientBrush_AddRef(IXpsOMLinearGradientBrush* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IXpsOMLinearGradientBrush_Release(IXpsOMLinearGradientBrush* This) {
    return This->lpVtbl->Release(This);
}
/*** IXpsOMShareable methods ***/
static __WIDL_INLINE HRESULT IXpsOMLinearGradientBrush_GetOwner(IXpsOMLinearGradientBrush* This,IUnknown **owner) {
    return This->lpVtbl->GetOwner(This,owner);
}
static __WIDL_INLINE HRESULT IXpsOMLinearGradientBrush_GetType(IXpsOMLinearGradientBrush* This,XPS_OBJECT_TYPE *type) {
    return This->lpVtbl->GetType(This,type);
}
/*** IXpsOMBrush methods ***/
static __WIDL_INLINE HRESULT IXpsOMLinearGradientBrush_GetOpacity(IXpsOMLinearGradientBrush* This,FLOAT *opacity) {
    return This->lpVtbl->GetOpacity(This,opacity);
}
static __WIDL_INLINE HRESULT IXpsOMLinearGradientBrush_SetOpacity(IXpsOMLinearGradientBrush* This,FLOAT opacity) {
    return This->lpVtbl->SetOpacity(This,opacity);
}
/*** IXpsOMGradientBrush methods ***/
static __WIDL_INLINE HRESULT IXpsOMLinearGradientBrush_GetGradientStops(IXpsOMLinearGradientBrush* This,IXpsOMGradientStopCollection **gradientStops) {
    return This->lpVtbl->GetGradientStops(This,gradientStops);
}
static __WIDL_INLINE HRESULT IXpsOMLinearGradientBrush_GetTransform(IXpsOMLinearGradientBrush* This,IXpsOMMatrixTransform **transform) {
    return This->lpVtbl->GetTransform(This,transform);
}
static __WIDL_INLINE HRESULT IXpsOMLinearGradientBrush_GetTransformLocal(IXpsOMLinearGradientBrush* This,IXpsOMMatrixTransform **transform) {
    return This->lpVtbl->GetTransformLocal(This,transform);
}
static __WIDL_INLINE HRESULT IXpsOMLinearGradientBrush_SetTransformLocal(IXpsOMLinearGradientBrush* This,IXpsOMMatrixTransform *transform) {
    return This->lpVtbl->SetTransformLocal(This,transform);
}
static __WIDL_INLINE HRESULT IXpsOMLinearGradientBrush_GetTransformLookup(IXpsOMLinearGradientBrush* This,LPWSTR *key) {
    return This->lpVtbl->GetTransformLookup(This,key);
}
static __WIDL_INLINE HRESULT IXpsOMLinearGradientBrush_SetTransformLookup(IXpsOMLinearGradientBrush* This,LPCWSTR key) {
    return This->lpVtbl->SetTransformLookup(This,key);
}
static __WIDL_INLINE HRESULT IXpsOMLinearGradientBrush_GetSpreadMethod(IXpsOMLinearGradientBrush* This,XPS_SPREAD_METHOD *spreadMethod) {
    return This->lpVtbl->GetSpreadMethod(This,spreadMethod);
}
static __WIDL_INLINE HRESULT IXpsOMLinearGradientBrush_SetSpreadMethod(IXpsOMLinearGradientBrush* This,XPS_SPREAD_METHOD spreadMethod) {
    return This->lpVtbl->SetSpreadMethod(This,spreadMethod);
}
static __WIDL_INLINE HRESULT IXpsOMLinearGradientBrush_GetColorInterpolationMode(IXpsOMLinearGradientBrush* This,XPS_COLOR_INTERPOLATION *colorInterpolationMode) {
    return This->lpVtbl->GetColorInterpolationMode(This,colorInterpolationMode);
}
static __WIDL_INLINE HRESULT IXpsOMLinearGradientBrush_SetColorInterpolationMode(IXpsOMLinearGradientBrush* This,XPS_COLOR_INTERPOLATION colorInterpolationMode) {
    return This->lpVtbl->SetColorInterpolationMode(This,colorInterpolationMode);
}
/*** IXpsOMLinearGradientBrush methods ***/
static __WIDL_INLINE HRESULT IXpsOMLinearGradientBrush_GetStartPoint(IXpsOMLinearGradientBrush* This,XPS_POINT *startPoint) {
    return This->lpVtbl->GetStartPoint(This,startPoint);
}
static __WIDL_INLINE HRESULT IXpsOMLinearGradientBrush_SetStartPoint(IXpsOMLinearGradientBrush* This,const XPS_POINT *startPoint) {
    return This->lpVtbl->SetStartPoint(This,startPoint);
}
static __WIDL_INLINE HRESULT IXpsOMLinearGradientBrush_GetEndPoint(IXpsOMLinearGradientBrush* This,XPS_POINT *endPoint) {
    return This->lpVtbl->GetEndPoint(This,endPoint);
}
static __WIDL_INLINE HRESULT IXpsOMLinearGradientBrush_SetEndPoint(IXpsOMLinearGradientBrush* This,const XPS_POINT *endPoint) {
    return This->lpVtbl->SetEndPoint(This,endPoint);
}
static __WIDL_INLINE HRESULT IXpsOMLinearGradientBrush_Clone(IXpsOMLinearGradientBrush* This,IXpsOMLinearGradientBrush **linearGradientBrush) {
    return This->lpVtbl->Clone(This,linearGradientBrush);
}
#endif
#endif

#endif


#endif  /* __IXpsOMLinearGradientBrush_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IXpsOMRadialGradientBrush interface
 */
#ifndef __IXpsOMRadialGradientBrush_INTERFACE_DEFINED__
#define __IXpsOMRadialGradientBrush_INTERFACE_DEFINED__

DEFINE_GUID(IID_IXpsOMRadialGradientBrush, 0x75f207e5, 0x08bf, 0x413c, 0x96,0xb1, 0xb8,0x2b,0x40,0x64,0x17,0x6b);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("75f207e5-08bf-413c-96b1-b82b4064176b")
IXpsOMRadialGradientBrush : public IXpsOMGradientBrush
{
    virtual HRESULT STDMETHODCALLTYPE GetCenter(
        XPS_POINT *center) = 0;

    virtual HRESULT STDMETHODCALLTYPE SetCenter(
        const XPS_POINT *center) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetRadiiSizes(
        XPS_SIZE *radiiSizes) = 0;

    virtual HRESULT STDMETHODCALLTYPE SetRadiiSizes(
        const XPS_SIZE *radiiSizes) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetGradientOrigin(
        XPS_POINT *origin) = 0;

    virtual HRESULT STDMETHODCALLTYPE SetGradientOrigin(
        const XPS_POINT *origin) = 0;

    virtual HRESULT STDMETHODCALLTYPE Clone(
        IXpsOMRadialGradientBrush **radialGradientBrush) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IXpsOMRadialGradientBrush, 0x75f207e5, 0x08bf, 0x413c, 0x96,0xb1, 0xb8,0x2b,0x40,0x64,0x17,0x6b)
#endif
#else
typedef struct IXpsOMRadialGradientBrushVtbl {
    BEGIN_INTERFACE

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

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

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

    /*** IXpsOMShareable methods ***/
    HRESULT (STDMETHODCALLTYPE *GetOwner)(
        IXpsOMRadialGradientBrush *This,
        IUnknown **owner);

    HRESULT (STDMETHODCALLTYPE *GetType)(
        IXpsOMRadialGradientBrush *This,
        XPS_OBJECT_TYPE *type);

    /*** IXpsOMBrush methods ***/
    HRESULT (STDMETHODCALLTYPE *GetOpacity)(
        IXpsOMRadialGradientBrush *This,
        FLOAT *opacity);

    HRESULT (STDMETHODCALLTYPE *SetOpacity)(
        IXpsOMRadialGradientBrush *This,
        FLOAT opacity);

    /*** IXpsOMGradientBrush methods ***/
    HRESULT (STDMETHODCALLTYPE *GetGradientStops)(
        IXpsOMRadialGradientBrush *This,
        IXpsOMGradientStopCollection **gradientStops);

    HRESULT (STDMETHODCALLTYPE *GetTransform)(
        IXpsOMRadialGradientBrush *This,
        IXpsOMMatrixTransform **transform);

    HRESULT (STDMETHODCALLTYPE *GetTransformLocal)(
        IXpsOMRadialGradientBrush *This,
        IXpsOMMatrixTransform **transform);

    HRESULT (STDMETHODCALLTYPE *SetTransformLocal)(
        IXpsOMRadialGradientBrush *This,
        IXpsOMMatrixTransform *transform);

    HRESULT (STDMETHODCALLTYPE *GetTransformLookup)(
        IXpsOMRadialGradientBrush *This,
        LPWSTR *key);

    HRESULT (STDMETHODCALLTYPE *SetTransformLookup)(
        IXpsOMRadialGradientBrush *This,
        LPCWSTR key);

    HRESULT (STDMETHODCALLTYPE *GetSpreadMethod)(
        IXpsOMRadialGradientBrush *This,
        XPS_SPREAD_METHOD *spreadMethod);

    HRESULT (STDMETHODCALLTYPE *SetSpreadMethod)(
        IXpsOMRadialGradientBrush *This,
        XPS_SPREAD_METHOD spreadMethod);

    HRESULT (STDMETHODCALLTYPE *GetColorInterpolationMode)(
        IXpsOMRadialGradientBrush *This,
        XPS_COLOR_INTERPOLATION *colorInterpolationMode);

    HRESULT (STDMETHODCALLTYPE *SetColorInterpolationMode)(
        IXpsOMRadialGradientBrush *This,
        XPS_COLOR_INTERPOLATION colorInterpolationMode);

    /*** IXpsOMRadialGradientBrush methods ***/
    HRESULT (STDMETHODCALLTYPE *GetCenter)(
        IXpsOMRadialGradientBrush *This,
        XPS_POINT *center);

    HRESULT (STDMETHODCALLTYPE *SetCenter)(
        IXpsOMRadialGradientBrush *This,
        const XPS_POINT *center);

    HRESULT (STDMETHODCALLTYPE *GetRadiiSizes)(
        IXpsOMRadialGradientBrush *This,
        XPS_SIZE *radiiSizes);

    HRESULT (STDMETHODCALLTYPE *SetRadiiSizes)(
        IXpsOMRadialGradientBrush *This,
        const XPS_SIZE *radiiSizes);

    HRESULT (STDMETHODCALLTYPE *GetGradientOrigin)(
        IXpsOMRadialGradientBrush *This,
        XPS_POINT *origin);

    HRESULT (STDMETHODCALLTYPE *SetGradientOrigin)(
        IXpsOMRadialGradientBrush *This,
        const XPS_POINT *origin);

    HRESULT (STDMETHODCALLTYPE *Clone)(
        IXpsOMRadialGradientBrush *This,
        IXpsOMRadialGradientBrush **radialGradientBrush);

    END_INTERFACE
} IXpsOMRadialGradientBrushVtbl;

interface IXpsOMRadialGradientBrush {
    CONST_VTBL IXpsOMRadialGradientBrushVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IXpsOMRadialGradientBrush_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IXpsOMRadialGradientBrush_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IXpsOMRadialGradientBrush_Release(This) (This)->lpVtbl->Release(This)
/*** IXpsOMShareable methods ***/
#define IXpsOMRadialGradientBrush_GetOwner(This,owner) (This)->lpVtbl->GetOwner(This,owner)
#define IXpsOMRadialGradientBrush_GetType(This,type) (This)->lpVtbl->GetType(This,type)
/*** IXpsOMBrush methods ***/
#define IXpsOMRadialGradientBrush_GetOpacity(This,opacity) (This)->lpVtbl->GetOpacity(This,opacity)
#define IXpsOMRadialGradientBrush_SetOpacity(This,opacity) (This)->lpVtbl->SetOpacity(This,opacity)
/*** IXpsOMGradientBrush methods ***/
#define IXpsOMRadialGradientBrush_GetGradientStops(This,gradientStops) (This)->lpVtbl->GetGradientStops(This,gradientStops)
#define IXpsOMRadialGradientBrush_GetTransform(This,transform) (This)->lpVtbl->GetTransform(This,transform)
#define IXpsOMRadialGradientBrush_GetTransformLocal(This,transform) (This)->lpVtbl->GetTransformLocal(This,transform)
#define IXpsOMRadialGradientBrush_SetTransformLocal(This,transform) (This)->lpVtbl->SetTransformLocal(This,transform)
#define IXpsOMRadialGradientBrush_GetTransformLookup(This,key) (This)->lpVtbl->GetTransformLookup(This,key)
#define IXpsOMRadialGradientBrush_SetTransformLookup(This,key) (This)->lpVtbl->SetTransformLookup(This,key)
#define IXpsOMRadialGradientBrush_GetSpreadMethod(This,spreadMethod) (This)->lpVtbl->GetSpreadMethod(This,spreadMethod)
#define IXpsOMRadialGradientBrush_SetSpreadMethod(This,spreadMethod) (This)->lpVtbl->SetSpreadMethod(This,spreadMethod)
#define IXpsOMRadialGradientBrush_GetColorInterpolationMode(This,colorInterpolationMode) (This)->lpVtbl->GetColorInterpolationMode(This,colorInterpolationMode)
#define IXpsOMRadialGradientBrush_SetColorInterpolationMode(This,colorInterpolationMode) (This)->lpVtbl->SetColorInterpolationMode(This,colorInterpolationMode)
/*** IXpsOMRadialGradientBrush methods ***/
#define IXpsOMRadialGradientBrush_GetCenter(This,center) (This)->lpVtbl->GetCenter(This,center)
#define IXpsOMRadialGradientBrush_SetCenter(This,center) (This)->lpVtbl->SetCenter(This,center)
#define IXpsOMRadialGradientBrush_GetRadiiSizes(This,radiiSizes) (This)->lpVtbl->GetRadiiSizes(This,radiiSizes)
#define IXpsOMRadialGradientBrush_SetRadiiSizes(This,radiiSizes) (This)->lpVtbl->SetRadiiSizes(This,radiiSizes)
#define IXpsOMRadialGradientBrush_GetGradientOrigin(This,origin) (This)->lpVtbl->GetGradientOrigin(This,origin)
#define IXpsOMRadialGradientBrush_SetGradientOrigin(This,origin) (This)->lpVtbl->SetGradientOrigin(This,origin)
#define IXpsOMRadialGradientBrush_Clone(This,radialGradientBrush) (This)->lpVtbl->Clone(This,radialGradientBrush)
#else
/*** IUnknown methods ***/
static __WIDL_INLINE HRESULT IXpsOMRadialGradientBrush_QueryInterface(IXpsOMRadialGradientBrush* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IXpsOMRadialGradientBrush_AddRef(IXpsOMRadialGradientBrush* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IXpsOMRadialGradientBrush_Release(IXpsOMRadialGradientBrush* This) {
    return This->lpVtbl->Release(This);
}
/*** IXpsOMShareable methods ***/
static __WIDL_INLINE HRESULT IXpsOMRadialGradientBrush_GetOwner(IXpsOMRadialGradientBrush* This,IUnknown **owner) {
    return This->lpVtbl->GetOwner(This,owner);
}
static __WIDL_INLINE HRESULT IXpsOMRadialGradientBrush_GetType(IXpsOMRadialGradientBrush* This,XPS_OBJECT_TYPE *type) {
    return This->lpVtbl->GetType(This,type);
}
/*** IXpsOMBrush methods ***/
static __WIDL_INLINE HRESULT IXpsOMRadialGradientBrush_GetOpacity(IXpsOMRadialGradientBrush* This,FLOAT *opacity) {
    return This->lpVtbl->GetOpacity(This,opacity);
}
static __WIDL_INLINE HRESULT IXpsOMRadialGradientBrush_SetOpacity(IXpsOMRadialGradientBrush* This,FLOAT opacity) {
    return This->lpVtbl->SetOpacity(This,opacity);
}
/*** IXpsOMGradientBrush methods ***/
static __WIDL_INLINE HRESULT IXpsOMRadialGradientBrush_GetGradientStops(IXpsOMRadialGradientBrush* This,IXpsOMGradientStopCollection **gradientStops) {
    return This->lpVtbl->GetGradientStops(This,gradientStops);
}
static __WIDL_INLINE HRESULT IXpsOMRadialGradientBrush_GetTransform(IXpsOMRadialGradientBrush* This,IXpsOMMatrixTransform **transform) {
    return This->lpVtbl->GetTransform(This,transform);
}
static __WIDL_INLINE HRESULT IXpsOMRadialGradientBrush_GetTransformLocal(IXpsOMRadialGradientBrush* This,IXpsOMMatrixTransform **transform) {
    return This->lpVtbl->GetTransformLocal(This,transform);
}
static __WIDL_INLINE HRESULT IXpsOMRadialGradientBrush_SetTransformLocal(IXpsOMRadialGradientBrush* This,IXpsOMMatrixTransform *transform) {
    return This->lpVtbl->SetTransformLocal(This,transform);
}
static __WIDL_INLINE HRESULT IXpsOMRadialGradientBrush_GetTransformLookup(IXpsOMRadialGradientBrush* This,LPWSTR *key) {
    return This->lpVtbl->GetTransformLookup(This,key);
}
static __WIDL_INLINE HRESULT IXpsOMRadialGradientBrush_SetTransformLookup(IXpsOMRadialGradientBrush* This,LPCWSTR key) {
    return This->lpVtbl->SetTransformLookup(This,key);
}
static __WIDL_INLINE HRESULT IXpsOMRadialGradientBrush_GetSpreadMethod(IXpsOMRadialGradientBrush* This,XPS_SPREAD_METHOD *spreadMethod) {
    return This->lpVtbl->GetSpreadMethod(This,spreadMethod);
}
static __WIDL_INLINE HRESULT IXpsOMRadialGradientBrush_SetSpreadMethod(IXpsOMRadialGradientBrush* This,XPS_SPREAD_METHOD spreadMethod) {
    return This->lpVtbl->SetSpreadMethod(This,spreadMethod);
}
static __WIDL_INLINE HRESULT IXpsOMRadialGradientBrush_GetColorInterpolationMode(IXpsOMRadialGradientBrush* This,XPS_COLOR_INTERPOLATION *colorInterpolationMode) {
    return This->lpVtbl->GetColorInterpolationMode(This,colorInterpolationMode);
}
static __WIDL_INLINE HRESULT IXpsOMRadialGradientBrush_SetColorInterpolationMode(IXpsOMRadialGradientBrush* This,XPS_COLOR_INTERPOLATION colorInterpolationMode) {
    return This->lpVtbl->SetColorInterpolationMode(This,colorInterpolationMode);
}
/*** IXpsOMRadialGradientBrush methods ***/
static __WIDL_INLINE HRESULT IXpsOMRadialGradientBrush_GetCenter(IXpsOMRadialGradientBrush* This,XPS_POINT *center) {
    return This->lpVtbl->GetCenter(This,center);
}
static __WIDL_INLINE HRESULT IXpsOMRadialGradientBrush_SetCenter(IXpsOMRadialGradientBrush* This,const XPS_POINT *center) {
    return This->lpVtbl->SetCenter(This,center);
}
static __WIDL_INLINE HRESULT IXpsOMRadialGradientBrush_GetRadiiSizes(IXpsOMRadialGradientBrush* This,XPS_SIZE *radiiSizes) {
    return This->lpVtbl->GetRadiiSizes(This,radiiSizes);
}
static __WIDL_INLINE HRESULT IXpsOMRadialGradientBrush_SetRadiiSizes(IXpsOMRadialGradientBrush* This,const XPS_SIZE *radiiSizes) {
    return This->lpVtbl->SetRadiiSizes(This,radiiSizes);
}
static __WIDL_INLINE HRESULT IXpsOMRadialGradientBrush_GetGradientOrigin(IXpsOMRadialGradientBrush* This,XPS_POINT *origin) {
    return This->lpVtbl->GetGradientOrigin(This,origin);
}
static __WIDL_INLINE HRESULT IXpsOMRadialGradientBrush_SetGradientOrigin(IXpsOMRadialGradientBrush* This,const XPS_POINT *origin) {
    return This->lpVtbl->SetGradientOrigin(This,origin);
}
static __WIDL_INLINE HRESULT IXpsOMRadialGradientBrush_Clone(IXpsOMRadialGradientBrush* This,IXpsOMRadialGradientBrush **radialGradientBrush) {
    return This->lpVtbl->Clone(This,radialGradientBrush);
}
#endif
#endif

#endif


#endif  /* __IXpsOMRadialGradientBrush_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IXpsOMResource interface
 */
#ifndef __IXpsOMResource_INTERFACE_DEFINED__
#define __IXpsOMResource_INTERFACE_DEFINED__

DEFINE_GUID(IID_IXpsOMResource, 0xda2ac0a2, 0x73a2, 0x4975, 0xad,0x14, 0x74,0x09,0x7c,0x3f,0xf3,0xa5);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("da2ac0a2-73a2-4975-ad14-74097c3ff3a5")
IXpsOMResource : public IXpsOMPart
{
};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IXpsOMResource, 0xda2ac0a2, 0x73a2, 0x4975, 0xad,0x14, 0x74,0x09,0x7c,0x3f,0xf3,0xa5)
#endif
#else
typedef struct IXpsOMResourceVtbl {
    BEGIN_INTERFACE

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

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

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

    /*** IXpsOMPart methods ***/
    HRESULT (STDMETHODCALLTYPE *GetPartName)(
        IXpsOMResource *This,
        IOpcPartUri **partUri);

    HRESULT (STDMETHODCALLTYPE *SetPartName)(
        IXpsOMResource *This,
        IOpcPartUri *partUri);

    END_INTERFACE
} IXpsOMResourceVtbl;

interface IXpsOMResource {
    CONST_VTBL IXpsOMResourceVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IXpsOMResource_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IXpsOMResource_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IXpsOMResource_Release(This) (This)->lpVtbl->Release(This)
/*** IXpsOMPart methods ***/
#define IXpsOMResource_GetPartName(This,partUri) (This)->lpVtbl->GetPartName(This,partUri)
#define IXpsOMResource_SetPartName(This,partUri) (This)->lpVtbl->SetPartName(This,partUri)
#else
/*** IUnknown methods ***/
static __WIDL_INLINE HRESULT IXpsOMResource_QueryInterface(IXpsOMResource* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IXpsOMResource_AddRef(IXpsOMResource* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IXpsOMResource_Release(IXpsOMResource* This) {
    return This->lpVtbl->Release(This);
}
/*** IXpsOMPart methods ***/
static __WIDL_INLINE HRESULT IXpsOMResource_GetPartName(IXpsOMResource* This,IOpcPartUri **partUri) {
    return This->lpVtbl->GetPartName(This,partUri);
}
static __WIDL_INLINE HRESULT IXpsOMResource_SetPartName(IXpsOMResource* This,IOpcPartUri *partUri) {
    return This->lpVtbl->SetPartName(This,partUri);
}
#endif
#endif

#endif


#endif  /* __IXpsOMResource_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IXpsOMFontResource interface
 */
#ifndef __IXpsOMFontResource_INTERFACE_DEFINED__
#define __IXpsOMFontResource_INTERFACE_DEFINED__

DEFINE_GUID(IID_IXpsOMFontResource, 0xa8c45708, 0x47d9, 0x4af4, 0x8d,0x20, 0x33,0xb4,0x8c,0x9b,0x84,0x85);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("a8c45708-47d9-4af4-8d20-33b48c9b8485")
IXpsOMFontResource : public IXpsOMResource
{
    virtual HRESULT STDMETHODCALLTYPE GetStream(
        IStream **readerStream) = 0;

    virtual HRESULT STDMETHODCALLTYPE SetContent(
        IStream *sourceStream,
        XPS_FONT_EMBEDDING embeddingOption,
        IOpcPartUri *partName) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetEmbeddingOption(
        XPS_FONT_EMBEDDING *embeddingOption) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IXpsOMFontResource, 0xa8c45708, 0x47d9, 0x4af4, 0x8d,0x20, 0x33,0xb4,0x8c,0x9b,0x84,0x85)
#endif
#else
typedef struct IXpsOMFontResourceVtbl {
    BEGIN_INTERFACE

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

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

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

    /*** IXpsOMPart methods ***/
    HRESULT (STDMETHODCALLTYPE *GetPartName)(
        IXpsOMFontResource *This,
        IOpcPartUri **partUri);

    HRESULT (STDMETHODCALLTYPE *SetPartName)(
        IXpsOMFontResource *This,
        IOpcPartUri *partUri);

    /*** IXpsOMFontResource methods ***/
    HRESULT (STDMETHODCALLTYPE *GetStream)(
        IXpsOMFontResource *This,
        IStream **readerStream);

    HRESULT (STDMETHODCALLTYPE *SetContent)(
        IXpsOMFontResource *This,
        IStream *sourceStream,
        XPS_FONT_EMBEDDING embeddingOption,
        IOpcPartUri *partName);

    HRESULT (STDMETHODCALLTYPE *GetEmbeddingOption)(
        IXpsOMFontResource *This,
        XPS_FONT_EMBEDDING *embeddingOption);

    END_INTERFACE
} IXpsOMFontResourceVtbl;

interface IXpsOMFontResource {
    CONST_VTBL IXpsOMFontResourceVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IXpsOMFontResource_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IXpsOMFontResource_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IXpsOMFontResource_Release(This) (This)->lpVtbl->Release(This)
/*** IXpsOMPart methods ***/
#define IXpsOMFontResource_GetPartName(This,partUri) (This)->lpVtbl->GetPartName(This,partUri)
#define IXpsOMFontResource_SetPartName(This,partUri) (This)->lpVtbl->SetPartName(This,partUri)
/*** IXpsOMFontResource methods ***/
#define IXpsOMFontResource_GetStream(This,readerStream) (This)->lpVtbl->GetStream(This,readerStream)
#define IXpsOMFontResource_SetContent(This,sourceStream,embeddingOption,partName) (This)->lpVtbl->SetContent(This,sourceStream,embeddingOption,partName)
#define IXpsOMFontResource_GetEmbeddingOption(This,embeddingOption) (This)->lpVtbl->GetEmbeddingOption(This,embeddingOption)
#else
/*** IUnknown methods ***/
static __WIDL_INLINE HRESULT IXpsOMFontResource_QueryInterface(IXpsOMFontResource* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IXpsOMFontResource_AddRef(IXpsOMFontResource* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IXpsOMFontResource_Release(IXpsOMFontResource* This) {
    return This->lpVtbl->Release(This);
}
/*** IXpsOMPart methods ***/
static __WIDL_INLINE HRESULT IXpsOMFontResource_GetPartName(IXpsOMFontResource* This,IOpcPartUri **partUri) {
    return This->lpVtbl->GetPartName(This,partUri);
}
static __WIDL_INLINE HRESULT IXpsOMFontResource_SetPartName(IXpsOMFontResource* This,IOpcPartUri *partUri) {
    return This->lpVtbl->SetPartName(This,partUri);
}
/*** IXpsOMFontResource methods ***/
static __WIDL_INLINE HRESULT IXpsOMFontResource_GetStream(IXpsOMFontResource* This,IStream **readerStream) {
    return This->lpVtbl->GetStream(This,readerStream);
}
static __WIDL_INLINE HRESULT IXpsOMFontResource_SetContent(IXpsOMFontResource* This,IStream *sourceStream,XPS_FONT_EMBEDDING embeddingOption,IOpcPartUri *partName) {
    return This->lpVtbl->SetContent(This,sourceStream,embeddingOption,partName);
}
static __WIDL_INLINE HRESULT IXpsOMFontResource_GetEmbeddingOption(IXpsOMFontResource* This,XPS_FONT_EMBEDDING *embeddingOption) {
    return This->lpVtbl->GetEmbeddingOption(This,embeddingOption);
}
#endif
#endif

#endif


#endif  /* __IXpsOMFontResource_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IXpsOMImageResource interface
 */
#ifndef __IXpsOMImageResource_INTERFACE_DEFINED__
#define __IXpsOMImageResource_INTERFACE_DEFINED__

DEFINE_GUID(IID_IXpsOMImageResource, 0x3db8417d, 0xae50, 0x485e, 0x9a,0x44, 0xd7,0x75,0x8f,0x78,0xa2,0x3f);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("3db8417d-ae50-485e-9a44-d7758f78a23f")
IXpsOMImageResource : public IXpsOMResource
{
    virtual HRESULT STDMETHODCALLTYPE GetStream(
        IStream **readerStream) = 0;

    virtual HRESULT STDMETHODCALLTYPE SetContent(
        IStream *sourceStream,
        XPS_IMAGE_TYPE imageType,
        IOpcPartUri *partName) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetImageType(
        XPS_IMAGE_TYPE *imageType) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IXpsOMImageResource, 0x3db8417d, 0xae50, 0x485e, 0x9a,0x44, 0xd7,0x75,0x8f,0x78,0xa2,0x3f)
#endif
#else
typedef struct IXpsOMImageResourceVtbl {
    BEGIN_INTERFACE

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

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

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

    /*** IXpsOMPart methods ***/
    HRESULT (STDMETHODCALLTYPE *GetPartName)(
        IXpsOMImageResource *This,
        IOpcPartUri **partUri);

    HRESULT (STDMETHODCALLTYPE *SetPartName)(
        IXpsOMImageResource *This,
        IOpcPartUri *partUri);

    /*** IXpsOMImageResource methods ***/
    HRESULT (STDMETHODCALLTYPE *GetStream)(
        IXpsOMImageResource *This,
        IStream **readerStream);

    HRESULT (STDMETHODCALLTYPE *SetContent)(
        IXpsOMImageResource *This,
        IStream *sourceStream,
        XPS_IMAGE_TYPE imageType,
        IOpcPartUri *partName);

    HRESULT (STDMETHODCALLTYPE *GetImageType)(
        IXpsOMImageResource *This,
        XPS_IMAGE_TYPE *imageType);

    END_INTERFACE
} IXpsOMImageResourceVtbl;

interface IXpsOMImageResource {
    CONST_VTBL IXpsOMImageResourceVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IXpsOMImageResource_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IXpsOMImageResource_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IXpsOMImageResource_Release(This) (This)->lpVtbl->Release(This)
/*** IXpsOMPart methods ***/
#define IXpsOMImageResource_GetPartName(This,partUri) (This)->lpVtbl->GetPartName(This,partUri)
#define IXpsOMImageResource_SetPartName(This,partUri) (This)->lpVtbl->SetPartName(This,partUri)
/*** IXpsOMImageResource methods ***/
#define IXpsOMImageResource_GetStream(This,readerStream) (This)->lpVtbl->GetStream(This,readerStream)
#define IXpsOMImageResource_SetContent(This,sourceStream,imageType,partName) (This)->lpVtbl->SetContent(This,sourceStream,imageType,partName)
#define IXpsOMImageResource_GetImageType(This,imageType) (This)->lpVtbl->GetImageType(This,imageType)
#else
/*** IUnknown methods ***/
static __WIDL_INLINE HRESULT IXpsOMImageResource_QueryInterface(IXpsOMImageResource* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IXpsOMImageResource_AddRef(IXpsOMImageResource* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IXpsOMImageResource_Release(IXpsOMImageResource* This) {
    return This->lpVtbl->Release(This);
}
/*** IXpsOMPart methods ***/
static __WIDL_INLINE HRESULT IXpsOMImageResource_GetPartName(IXpsOMImageResource* This,IOpcPartUri **partUri) {
    return This->lpVtbl->GetPartName(This,partUri);
}
static __WIDL_INLINE HRESULT IXpsOMImageResource_SetPartName(IXpsOMImageResource* This,IOpcPartUri *partUri) {
    return This->lpVtbl->SetPartName(This,partUri);
}
/*** IXpsOMImageResource methods ***/
static __WIDL_INLINE HRESULT IXpsOMImageResource_GetStream(IXpsOMImageResource* This,IStream **readerStream) {
    return This->lpVtbl->GetStream(This,readerStream);
}
static __WIDL_INLINE HRESULT IXpsOMImageResource_SetContent(IXpsOMImageResource* This,IStream *sourceStream,XPS_IMAGE_TYPE imageType,IOpcPartUri *partName) {
    return This->lpVtbl->SetContent(This,sourceStream,imageType,partName);
}
static __WIDL_INLINE HRESULT IXpsOMImageResource_GetImageType(IXpsOMImageResource* This,XPS_IMAGE_TYPE *imageType) {
    return This->lpVtbl->GetImageType(This,imageType);
}
#endif
#endif

#endif


#endif  /* __IXpsOMImageResource_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IXpsOMColorProfileResource interface
 */
#ifndef __IXpsOMColorProfileResource_INTERFACE_DEFINED__
#define __IXpsOMColorProfileResource_INTERFACE_DEFINED__

DEFINE_GUID(IID_IXpsOMColorProfileResource, 0x67bd7d69, 0x1eef, 0x4bb1, 0xb5,0xe7, 0x6f,0x4f,0x87,0xbe,0x8a,0xbe);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("67bd7d69-1eef-4bb1-b5e7-6f4f87be8abe")
IXpsOMColorProfileResource : public IXpsOMResource
{
    virtual HRESULT STDMETHODCALLTYPE GetStream(
        IStream **stream) = 0;

    virtual HRESULT STDMETHODCALLTYPE SetContent(
        IStream *sourceStream,
        IOpcPartUri *partName) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IXpsOMColorProfileResource, 0x67bd7d69, 0x1eef, 0x4bb1, 0xb5,0xe7, 0x6f,0x4f,0x87,0xbe,0x8a,0xbe)
#endif
#else
typedef struct IXpsOMColorProfileResourceVtbl {
    BEGIN_INTERFACE

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

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

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

    /*** IXpsOMPart methods ***/
    HRESULT (STDMETHODCALLTYPE *GetPartName)(
        IXpsOMColorProfileResource *This,
        IOpcPartUri **partUri);

    HRESULT (STDMETHODCALLTYPE *SetPartName)(
        IXpsOMColorProfileResource *This,
        IOpcPartUri *partUri);

    /*** IXpsOMColorProfileResource methods ***/
    HRESULT (STDMETHODCALLTYPE *GetStream)(
        IXpsOMColorProfileResource *This,
        IStream **stream);

    HRESULT (STDMETHODCALLTYPE *SetContent)(
        IXpsOMColorProfileResource *This,
        IStream *sourceStream,
        IOpcPartUri *partName);

    END_INTERFACE
} IXpsOMColorProfileResourceVtbl;

interface IXpsOMColorProfileResource {
    CONST_VTBL IXpsOMColorProfileResourceVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IXpsOMColorProfileResource_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IXpsOMColorProfileResource_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IXpsOMColorProfileResource_Release(This) (This)->lpVtbl->Release(This)
/*** IXpsOMPart methods ***/
#define IXpsOMColorProfileResource_GetPartName(This,partUri) (This)->lpVtbl->GetPartName(This,partUri)
#define IXpsOMColorProfileResource_SetPartName(This,partUri) (This)->lpVtbl->SetPartName(This,partUri)
/*** IXpsOMColorProfileResource methods ***/
#define IXpsOMColorProfileResource_GetStream(This,stream) (This)->lpVtbl->GetStream(This,stream)
#define IXpsOMColorProfileResource_SetContent(This,sourceStream,partName) (This)->lpVtbl->SetContent(This,sourceStream,partName)
#else
/*** IUnknown methods ***/
static __WIDL_INLINE HRESULT IXpsOMColorProfileResource_QueryInterface(IXpsOMColorProfileResource* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IXpsOMColorProfileResource_AddRef(IXpsOMColorProfileResource* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IXpsOMColorProfileResource_Release(IXpsOMColorProfileResource* This) {
    return This->lpVtbl->Release(This);
}
/*** IXpsOMPart methods ***/
static __WIDL_INLINE HRESULT IXpsOMColorProfileResource_GetPartName(IXpsOMColorProfileResource* This,IOpcPartUri **partUri) {
    return This->lpVtbl->GetPartName(This,partUri);
}
static __WIDL_INLINE HRESULT IXpsOMColorProfileResource_SetPartName(IXpsOMColorProfileResource* This,IOpcPartUri *partUri) {
    return This->lpVtbl->SetPartName(This,partUri);
}
/*** IXpsOMColorProfileResource methods ***/
static __WIDL_INLINE HRESULT IXpsOMColorProfileResource_GetStream(IXpsOMColorProfileResource* This,IStream **stream) {
    return This->lpVtbl->GetStream(This,stream);
}
static __WIDL_INLINE HRESULT IXpsOMColorProfileResource_SetContent(IXpsOMColorProfileResource* This,IStream *sourceStream,IOpcPartUri *partName) {
    return This->lpVtbl->SetContent(This,sourceStream,partName);
}
#endif
#endif

#endif


#endif  /* __IXpsOMColorProfileResource_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IXpsOMPrintTicketResource interface
 */
#ifndef __IXpsOMPrintTicketResource_INTERFACE_DEFINED__
#define __IXpsOMPrintTicketResource_INTERFACE_DEFINED__

DEFINE_GUID(IID_IXpsOMPrintTicketResource, 0xe7ff32d2, 0x34aa, 0x499b, 0xbb,0xe9, 0x9c,0xd4,0xee,0x6c,0x59,0xf7);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("e7ff32d2-34aa-499b-bbe9-9cd4ee6c59f7")
IXpsOMPrintTicketResource : public IXpsOMResource
{
    virtual HRESULT STDMETHODCALLTYPE GetStream(
        IStream **stream) = 0;

    virtual HRESULT STDMETHODCALLTYPE SetContent(
        IStream *sourceStream,
        IOpcPartUri *partName) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IXpsOMPrintTicketResource, 0xe7ff32d2, 0x34aa, 0x499b, 0xbb,0xe9, 0x9c,0xd4,0xee,0x6c,0x59,0xf7)
#endif
#else
typedef struct IXpsOMPrintTicketResourceVtbl {
    BEGIN_INTERFACE

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

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

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

    /*** IXpsOMPart methods ***/
    HRESULT (STDMETHODCALLTYPE *GetPartName)(
        IXpsOMPrintTicketResource *This,
        IOpcPartUri **partUri);

    HRESULT (STDMETHODCALLTYPE *SetPartName)(
        IXpsOMPrintTicketResource *This,
        IOpcPartUri *partUri);

    /*** IXpsOMPrintTicketResource methods ***/
    HRESULT (STDMETHODCALLTYPE *GetStream)(
        IXpsOMPrintTicketResource *This,
        IStream **stream);

    HRESULT (STDMETHODCALLTYPE *SetContent)(
        IXpsOMPrintTicketResource *This,
        IStream *sourceStream,
        IOpcPartUri *partName);

    END_INTERFACE
} IXpsOMPrintTicketResourceVtbl;

interface IXpsOMPrintTicketResource {
    CONST_VTBL IXpsOMPrintTicketResourceVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IXpsOMPrintTicketResource_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IXpsOMPrintTicketResource_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IXpsOMPrintTicketResource_Release(This) (This)->lpVtbl->Release(This)
/*** IXpsOMPart methods ***/
#define IXpsOMPrintTicketResource_GetPartName(This,partUri) (This)->lpVtbl->GetPartName(This,partUri)
#define IXpsOMPrintTicketResource_SetPartName(This,partUri) (This)->lpVtbl->SetPartName(This,partUri)
/*** IXpsOMPrintTicketResource methods ***/
#define IXpsOMPrintTicketResource_GetStream(This,stream) (This)->lpVtbl->GetStream(This,stream)
#define IXpsOMPrintTicketResource_SetContent(This,sourceStream,partName) (This)->lpVtbl->SetContent(This,sourceStream,partName)
#else
/*** IUnknown methods ***/
static __WIDL_INLINE HRESULT IXpsOMPrintTicketResource_QueryInterface(IXpsOMPrintTicketResource* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IXpsOMPrintTicketResource_AddRef(IXpsOMPrintTicketResource* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IXpsOMPrintTicketResource_Release(IXpsOMPrintTicketResource* This) {
    return This->lpVtbl->Release(This);
}
/*** IXpsOMPart methods ***/
static __WIDL_INLINE HRESULT IXpsOMPrintTicketResource_GetPartName(IXpsOMPrintTicketResource* This,IOpcPartUri **partUri) {
    return This->lpVtbl->GetPartName(This,partUri);
}
static __WIDL_INLINE HRESULT IXpsOMPrintTicketResource_SetPartName(IXpsOMPrintTicketResource* This,IOpcPartUri *partUri) {
    return This->lpVtbl->SetPartName(This,partUri);
}
/*** IXpsOMPrintTicketResource methods ***/
static __WIDL_INLINE HRESULT IXpsOMPrintTicketResource_GetStream(IXpsOMPrintTicketResource* This,IStream **stream) {
    return This->lpVtbl->GetStream(This,stream);
}
static __WIDL_INLINE HRESULT IXpsOMPrintTicketResource_SetContent(IXpsOMPrintTicketResource* This,IStream *sourceStream,IOpcPartUri *partName) {
    return This->lpVtbl->SetContent(This,sourceStream,partName);
}
#endif
#endif

#endif


#endif  /* __IXpsOMPrintTicketResource_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IXpsOMRemoteDictionaryResource interface
 */
#ifndef __IXpsOMRemoteDictionaryResource_INTERFACE_DEFINED__
#define __IXpsOMRemoteDictionaryResource_INTERFACE_DEFINED__

DEFINE_GUID(IID_IXpsOMRemoteDictionaryResource, 0xc9bd7cd4, 0xe16a, 0x4bf8, 0x8c,0x84, 0xc9,0x50,0xaf,0x7a,0x30,0x61);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("c9bd7cd4-e16a-4bf8-8c84-c950af7a3061")
IXpsOMRemoteDictionaryResource : public IXpsOMResource
{
    virtual HRESULT STDMETHODCALLTYPE GetDictionary(
        IXpsOMDictionary **dictionary) = 0;

    virtual HRESULT STDMETHODCALLTYPE SetDictionary(
        IXpsOMDictionary *dictionary) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IXpsOMRemoteDictionaryResource, 0xc9bd7cd4, 0xe16a, 0x4bf8, 0x8c,0x84, 0xc9,0x50,0xaf,0x7a,0x30,0x61)
#endif
#else
typedef struct IXpsOMRemoteDictionaryResourceVtbl {
    BEGIN_INTERFACE

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

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

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

    /*** IXpsOMPart methods ***/
    HRESULT (STDMETHODCALLTYPE *GetPartName)(
        IXpsOMRemoteDictionaryResource *This,
        IOpcPartUri **partUri);

    HRESULT (STDMETHODCALLTYPE *SetPartName)(
        IXpsOMRemoteDictionaryResource *This,
        IOpcPartUri *partUri);

    /*** IXpsOMRemoteDictionaryResource methods ***/
    HRESULT (STDMETHODCALLTYPE *GetDictionary)(
        IXpsOMRemoteDictionaryResource *This,
        IXpsOMDictionary **dictionary);

    HRESULT (STDMETHODCALLTYPE *SetDictionary)(
        IXpsOMRemoteDictionaryResource *This,
        IXpsOMDictionary *dictionary);

    END_INTERFACE
} IXpsOMRemoteDictionaryResourceVtbl;

interface IXpsOMRemoteDictionaryResource {
    CONST_VTBL IXpsOMRemoteDictionaryResourceVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IXpsOMRemoteDictionaryResource_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IXpsOMRemoteDictionaryResource_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IXpsOMRemoteDictionaryResource_Release(This) (This)->lpVtbl->Release(This)
/*** IXpsOMPart methods ***/
#define IXpsOMRemoteDictionaryResource_GetPartName(This,partUri) (This)->lpVtbl->GetPartName(This,partUri)
#define IXpsOMRemoteDictionaryResource_SetPartName(This,partUri) (This)->lpVtbl->SetPartName(This,partUri)
/*** IXpsOMRemoteDictionaryResource methods ***/
#define IXpsOMRemoteDictionaryResource_GetDictionary(This,dictionary) (This)->lpVtbl->GetDictionary(This,dictionary)
#define IXpsOMRemoteDictionaryResource_SetDictionary(This,dictionary) (This)->lpVtbl->SetDictionary(This,dictionary)
#else
/*** IUnknown methods ***/
static __WIDL_INLINE HRESULT IXpsOMRemoteDictionaryResource_QueryInterface(IXpsOMRemoteDictionaryResource* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IXpsOMRemoteDictionaryResource_AddRef(IXpsOMRemoteDictionaryResource* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IXpsOMRemoteDictionaryResource_Release(IXpsOMRemoteDictionaryResource* This) {
    return This->lpVtbl->Release(This);
}
/*** IXpsOMPart methods ***/
static __WIDL_INLINE HRESULT IXpsOMRemoteDictionaryResource_GetPartName(IXpsOMRemoteDictionaryResource* This,IOpcPartUri **partUri) {
    return This->lpVtbl->GetPartName(This,partUri);
}
static __WIDL_INLINE HRESULT IXpsOMRemoteDictionaryResource_SetPartName(IXpsOMRemoteDictionaryResource* This,IOpcPartUri *partUri) {
    return This->lpVtbl->SetPartName(This,partUri);
}
/*** IXpsOMRemoteDictionaryResource methods ***/
static __WIDL_INLINE HRESULT IXpsOMRemoteDictionaryResource_GetDictionary(IXpsOMRemoteDictionaryResource* This,IXpsOMDictionary **dictionary) {
    return This->lpVtbl->GetDictionary(This,dictionary);
}
static __WIDL_INLINE HRESULT IXpsOMRemoteDictionaryResource_SetDictionary(IXpsOMRemoteDictionaryResource* This,IXpsOMDictionary *dictionary) {
    return This->lpVtbl->SetDictionary(This,dictionary);
}
#endif
#endif

#endif


#endif  /* __IXpsOMRemoteDictionaryResource_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IXpsOMDocumentStructureResource interface
 */
#ifndef __IXpsOMDocumentStructureResource_INTERFACE_DEFINED__
#define __IXpsOMDocumentStructureResource_INTERFACE_DEFINED__

DEFINE_GUID(IID_IXpsOMDocumentStructureResource, 0x85febc8a, 0x6b63, 0x48a9, 0xaf,0x07, 0x70,0x64,0xe4,0xec,0xff,0x30);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("85febc8a-6b63-48a9-af07-7064e4ecff30")
IXpsOMDocumentStructureResource : public IXpsOMResource
{
    virtual HRESULT STDMETHODCALLTYPE GetOwner(
        IXpsOMDocument **owner) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetStream(
        IStream **stream) = 0;

    virtual HRESULT STDMETHODCALLTYPE SetContent(
        IStream *sourceStream,
        IOpcPartUri *partName) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IXpsOMDocumentStructureResource, 0x85febc8a, 0x6b63, 0x48a9, 0xaf,0x07, 0x70,0x64,0xe4,0xec,0xff,0x30)
#endif
#else
typedef struct IXpsOMDocumentStructureResourceVtbl {
    BEGIN_INTERFACE

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

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

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

    /*** IXpsOMPart methods ***/
    HRESULT (STDMETHODCALLTYPE *GetPartName)(
        IXpsOMDocumentStructureResource *This,
        IOpcPartUri **partUri);

    HRESULT (STDMETHODCALLTYPE *SetPartName)(
        IXpsOMDocumentStructureResource *This,
        IOpcPartUri *partUri);

    /*** IXpsOMDocumentStructureResource methods ***/
    HRESULT (STDMETHODCALLTYPE *GetOwner)(
        IXpsOMDocumentStructureResource *This,
        IXpsOMDocument **owner);

    HRESULT (STDMETHODCALLTYPE *GetStream)(
        IXpsOMDocumentStructureResource *This,
        IStream **stream);

    HRESULT (STDMETHODCALLTYPE *SetContent)(
        IXpsOMDocumentStructureResource *This,
        IStream *sourceStream,
        IOpcPartUri *partName);

    END_INTERFACE
} IXpsOMDocumentStructureResourceVtbl;

interface IXpsOMDocumentStructureResource {
    CONST_VTBL IXpsOMDocumentStructureResourceVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IXpsOMDocumentStructureResource_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IXpsOMDocumentStructureResource_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IXpsOMDocumentStructureResource_Release(This) (This)->lpVtbl->Release(This)
/*** IXpsOMPart methods ***/
#define IXpsOMDocumentStructureResource_GetPartName(This,partUri) (This)->lpVtbl->GetPartName(This,partUri)
#define IXpsOMDocumentStructureResource_SetPartName(This,partUri) (This)->lpVtbl->SetPartName(This,partUri)
/*** IXpsOMDocumentStructureResource methods ***/
#define IXpsOMDocumentStructureResource_GetOwner(This,owner) (This)->lpVtbl->GetOwner(This,owner)
#define IXpsOMDocumentStructureResource_GetStream(This,stream) (This)->lpVtbl->GetStream(This,stream)
#define IXpsOMDocumentStructureResource_SetContent(This,sourceStream,partName) (This)->lpVtbl->SetContent(This,sourceStream,partName)
#else
/*** IUnknown methods ***/
static __WIDL_INLINE HRESULT IXpsOMDocumentStructureResource_QueryInterface(IXpsOMDocumentStructureResource* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IXpsOMDocumentStructureResource_AddRef(IXpsOMDocumentStructureResource* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IXpsOMDocumentStructureResource_Release(IXpsOMDocumentStructureResource* This) {
    return This->lpVtbl->Release(This);
}
/*** IXpsOMPart methods ***/
static __WIDL_INLINE HRESULT IXpsOMDocumentStructureResource_GetPartName(IXpsOMDocumentStructureResource* This,IOpcPartUri **partUri) {
    return This->lpVtbl->GetPartName(This,partUri);
}
static __WIDL_INLINE HRESULT IXpsOMDocumentStructureResource_SetPartName(IXpsOMDocumentStructureResource* This,IOpcPartUri *partUri) {
    return This->lpVtbl->SetPartName(This,partUri);
}
/*** IXpsOMDocumentStructureResource methods ***/
static __WIDL_INLINE HRESULT IXpsOMDocumentStructureResource_GetOwner(IXpsOMDocumentStructureResource* This,IXpsOMDocument **owner) {
    return This->lpVtbl->GetOwner(This,owner);
}
static __WIDL_INLINE HRESULT IXpsOMDocumentStructureResource_GetStream(IXpsOMDocumentStructureResource* This,IStream **stream) {
    return This->lpVtbl->GetStream(This,stream);
}
static __WIDL_INLINE HRESULT IXpsOMDocumentStructureResource_SetContent(IXpsOMDocumentStructureResource* This,IStream *sourceStream,IOpcPartUri *partName) {
    return This->lpVtbl->SetContent(This,sourceStream,partName);
}
#endif
#endif

#endif


#endif  /* __IXpsOMDocumentStructureResource_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IXpsOMStoryFragmentsResource interface
 */
#ifndef __IXpsOMStoryFragmentsResource_INTERFACE_DEFINED__
#define __IXpsOMStoryFragmentsResource_INTERFACE_DEFINED__

DEFINE_GUID(IID_IXpsOMStoryFragmentsResource, 0xc2b3ca09, 0x0473, 0x4282, 0x87,0xae, 0x17,0x80,0x86,0x32,0x23,0xf0);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("c2b3ca09-0473-4282-87ae-1780863223f0")
IXpsOMStoryFragmentsResource : public IXpsOMResource
{
    virtual HRESULT STDMETHODCALLTYPE GetOwner(
        IXpsOMPageReference **owner) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetStream(
        IStream **stream) = 0;

    virtual HRESULT STDMETHODCALLTYPE SetContent(
        IStream *sourceStream,
        IOpcPartUri *partName) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IXpsOMStoryFragmentsResource, 0xc2b3ca09, 0x0473, 0x4282, 0x87,0xae, 0x17,0x80,0x86,0x32,0x23,0xf0)
#endif
#else
typedef struct IXpsOMStoryFragmentsResourceVtbl {
    BEGIN_INTERFACE

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

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

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

    /*** IXpsOMPart methods ***/
    HRESULT (STDMETHODCALLTYPE *GetPartName)(
        IXpsOMStoryFragmentsResource *This,
        IOpcPartUri **partUri);

    HRESULT (STDMETHODCALLTYPE *SetPartName)(
        IXpsOMStoryFragmentsResource *This,
        IOpcPartUri *partUri);

    /*** IXpsOMStoryFragmentsResource methods ***/
    HRESULT (STDMETHODCALLTYPE *GetOwner)(
        IXpsOMStoryFragmentsResource *This,
        IXpsOMPageReference **owner);

    HRESULT (STDMETHODCALLTYPE *GetStream)(
        IXpsOMStoryFragmentsResource *This,
        IStream **stream);

    HRESULT (STDMETHODCALLTYPE *SetContent)(
        IXpsOMStoryFragmentsResource *This,
        IStream *sourceStream,
        IOpcPartUri *partName);

    END_INTERFACE
} IXpsOMStoryFragmentsResourceVtbl;

interface IXpsOMStoryFragmentsResource {
    CONST_VTBL IXpsOMStoryFragmentsResourceVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IXpsOMStoryFragmentsResource_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IXpsOMStoryFragmentsResource_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IXpsOMStoryFragmentsResource_Release(This) (This)->lpVtbl->Release(This)
/*** IXpsOMPart methods ***/
#define IXpsOMStoryFragmentsResource_GetPartName(This,partUri) (This)->lpVtbl->GetPartName(This,partUri)
#define IXpsOMStoryFragmentsResource_SetPartName(This,partUri) (This)->lpVtbl->SetPartName(This,partUri)
/*** IXpsOMStoryFragmentsResource methods ***/
#define IXpsOMStoryFragmentsResource_GetOwner(This,owner) (This)->lpVtbl->GetOwner(This,owner)
#define IXpsOMStoryFragmentsResource_GetStream(This,stream) (This)->lpVtbl->GetStream(This,stream)
#define IXpsOMStoryFragmentsResource_SetContent(This,sourceStream,partName) (This)->lpVtbl->SetContent(This,sourceStream,partName)
#else
/*** IUnknown methods ***/
static __WIDL_INLINE HRESULT IXpsOMStoryFragmentsResource_QueryInterface(IXpsOMStoryFragmentsResource* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IXpsOMStoryFragmentsResource_AddRef(IXpsOMStoryFragmentsResource* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IXpsOMStoryFragmentsResource_Release(IXpsOMStoryFragmentsResource* This) {
    return This->lpVtbl->Release(This);
}
/*** IXpsOMPart methods ***/
static __WIDL_INLINE HRESULT IXpsOMStoryFragmentsResource_GetPartName(IXpsOMStoryFragmentsResource* This,IOpcPartUri **partUri) {
    return This->lpVtbl->GetPartName(This,partUri);
}
static __WIDL_INLINE HRESULT IXpsOMStoryFragmentsResource_SetPartName(IXpsOMStoryFragmentsResource* This,IOpcPartUri *partUri) {
    return This->lpVtbl->SetPartName(This,partUri);
}
/*** IXpsOMStoryFragmentsResource methods ***/
static __WIDL_INLINE HRESULT IXpsOMStoryFragmentsResource_GetOwner(IXpsOMStoryFragmentsResource* This,IXpsOMPageReference **owner) {
    return This->lpVtbl->GetOwner(This,owner);
}
static __WIDL_INLINE HRESULT IXpsOMStoryFragmentsResource_GetStream(IXpsOMStoryFragmentsResource* This,IStream **stream) {
    return This->lpVtbl->GetStream(This,stream);
}
static __WIDL_INLINE HRESULT IXpsOMStoryFragmentsResource_SetContent(IXpsOMStoryFragmentsResource* This,IStream *sourceStream,IOpcPartUri *partName) {
    return This->lpVtbl->SetContent(This,sourceStream,partName);
}
#endif
#endif

#endif


#endif  /* __IXpsOMStoryFragmentsResource_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IXpsOMSignatureBlockResource interface
 */
#ifndef __IXpsOMSignatureBlockResource_INTERFACE_DEFINED__
#define __IXpsOMSignatureBlockResource_INTERFACE_DEFINED__

DEFINE_GUID(IID_IXpsOMSignatureBlockResource, 0x4776ad35, 0x2e04, 0x4357, 0x87,0x43, 0xeb,0xf6,0xc1,0x71,0xa9,0x05);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("4776ad35-2e04-4357-8743-ebf6c171a905")
IXpsOMSignatureBlockResource : public IXpsOMResource
{
    virtual HRESULT STDMETHODCALLTYPE GetOwner(
        IXpsOMDocument **owner) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetStream(
        IStream **stream) = 0;

    virtual HRESULT STDMETHODCALLTYPE SetContent(
        IStream *sourceStream,
        IOpcPartUri *partName) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IXpsOMSignatureBlockResource, 0x4776ad35, 0x2e04, 0x4357, 0x87,0x43, 0xeb,0xf6,0xc1,0x71,0xa9,0x05)
#endif
#else
typedef struct IXpsOMSignatureBlockResourceVtbl {
    BEGIN_INTERFACE

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

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

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

    /*** IXpsOMPart methods ***/
    HRESULT (STDMETHODCALLTYPE *GetPartName)(
        IXpsOMSignatureBlockResource *This,
        IOpcPartUri **partUri);

    HRESULT (STDMETHODCALLTYPE *SetPartName)(
        IXpsOMSignatureBlockResource *This,
        IOpcPartUri *partUri);

    /*** IXpsOMSignatureBlockResource methods ***/
    HRESULT (STDMETHODCALLTYPE *GetOwner)(
        IXpsOMSignatureBlockResource *This,
        IXpsOMDocument **owner);

    HRESULT (STDMETHODCALLTYPE *GetStream)(
        IXpsOMSignatureBlockResource *This,
        IStream **stream);

    HRESULT (STDMETHODCALLTYPE *SetContent)(
        IXpsOMSignatureBlockResource *This,
        IStream *sourceStream,
        IOpcPartUri *partName);

    END_INTERFACE
} IXpsOMSignatureBlockResourceVtbl;

interface IXpsOMSignatureBlockResource {
    CONST_VTBL IXpsOMSignatureBlockResourceVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IXpsOMSignatureBlockResource_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IXpsOMSignatureBlockResource_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IXpsOMSignatureBlockResource_Release(This) (This)->lpVtbl->Release(This)
/*** IXpsOMPart methods ***/
#define IXpsOMSignatureBlockResource_GetPartName(This,partUri) (This)->lpVtbl->GetPartName(This,partUri)
#define IXpsOMSignatureBlockResource_SetPartName(This,partUri) (This)->lpVtbl->SetPartName(This,partUri)
/*** IXpsOMSignatureBlockResource methods ***/
#define IXpsOMSignatureBlockResource_GetOwner(This,owner) (This)->lpVtbl->GetOwner(This,owner)
#define IXpsOMSignatureBlockResource_GetStream(This,stream) (This)->lpVtbl->GetStream(This,stream)
#define IXpsOMSignatureBlockResource_SetContent(This,sourceStream,partName) (This)->lpVtbl->SetContent(This,sourceStream,partName)
#else
/*** IUnknown methods ***/
static __WIDL_INLINE HRESULT IXpsOMSignatureBlockResource_QueryInterface(IXpsOMSignatureBlockResource* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IXpsOMSignatureBlockResource_AddRef(IXpsOMSignatureBlockResource* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IXpsOMSignatureBlockResource_Release(IXpsOMSignatureBlockResource* This) {
    return This->lpVtbl->Release(This);
}
/*** IXpsOMPart methods ***/
static __WIDL_INLINE HRESULT IXpsOMSignatureBlockResource_GetPartName(IXpsOMSignatureBlockResource* This,IOpcPartUri **partUri) {
    return This->lpVtbl->GetPartName(This,partUri);
}
static __WIDL_INLINE HRESULT IXpsOMSignatureBlockResource_SetPartName(IXpsOMSignatureBlockResource* This,IOpcPartUri *partUri) {
    return This->lpVtbl->SetPartName(This,partUri);
}
/*** IXpsOMSignatureBlockResource methods ***/
static __WIDL_INLINE HRESULT IXpsOMSignatureBlockResource_GetOwner(IXpsOMSignatureBlockResource* This,IXpsOMDocument **owner) {
    return This->lpVtbl->GetOwner(This,owner);
}
static __WIDL_INLINE HRESULT IXpsOMSignatureBlockResource_GetStream(IXpsOMSignatureBlockResource* This,IStream **stream) {
    return This->lpVtbl->GetStream(This,stream);
}
static __WIDL_INLINE HRESULT IXpsOMSignatureBlockResource_SetContent(IXpsOMSignatureBlockResource* This,IStream *sourceStream,IOpcPartUri *partName) {
    return This->lpVtbl->SetContent(This,sourceStream,partName);
}
#endif
#endif

#endif


#endif  /* __IXpsOMSignatureBlockResource_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IXpsOMCanvas interface
 */
#ifndef __IXpsOMCanvas_INTERFACE_DEFINED__
#define __IXpsOMCanvas_INTERFACE_DEFINED__

DEFINE_GUID(IID_IXpsOMCanvas, 0x221d1452, 0x331e, 0x47c6, 0x87,0xe9, 0x6c,0xce,0xfb,0x9b,0x5b,0xa3);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("221d1452-331e-47c6-87e9-6ccefb9b5ba3")
IXpsOMCanvas : public IXpsOMVisual
{
    virtual HRESULT STDMETHODCALLTYPE GetVisuals(
        IXpsOMVisualCollection **visuals) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetUseAliasedEdgeMode(
        WINBOOL *useAliasedEdgeMode) = 0;

    virtual HRESULT STDMETHODCALLTYPE SetUseAliasedEdgeMode(
        WINBOOL useAliasedEdgeMode) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetAccessibilityShortDescription(
        LPWSTR *shortDescription) = 0;

    virtual HRESULT STDMETHODCALLTYPE SetAccessibilityShortDescription(
        LPCWSTR shortDescription) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetAccessibilityLongDescription(
        LPWSTR *longDescription) = 0;

    virtual HRESULT STDMETHODCALLTYPE SetAccessibilityLongDescription(
        LPCWSTR longDescription) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetDictionary(
        IXpsOMDictionary **resourceDictionary) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetDictionaryLocal(
        IXpsOMDictionary **resourceDictionary) = 0;

    virtual HRESULT STDMETHODCALLTYPE SetDictionaryLocal(
        IXpsOMDictionary *resourceDictionary) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetDictionaryResource(
        IXpsOMRemoteDictionaryResource **remoteDictionaryResource) = 0;

    virtual HRESULT STDMETHODCALLTYPE SetDictionaryResource(
        IXpsOMRemoteDictionaryResource *remoteDictionaryResource) = 0;

    virtual HRESULT STDMETHODCALLTYPE Clone(
        IXpsOMCanvas **canvas) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IXpsOMCanvas, 0x221d1452, 0x331e, 0x47c6, 0x87,0xe9, 0x6c,0xce,0xfb,0x9b,0x5b,0xa3)
#endif
#else
typedef struct IXpsOMCanvasVtbl {
    BEGIN_INTERFACE

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

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

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

    /*** IXpsOMShareable methods ***/
    HRESULT (STDMETHODCALLTYPE *GetOwner)(
        IXpsOMCanvas *This,
        IUnknown **owner);

    HRESULT (STDMETHODCALLTYPE *GetType)(
        IXpsOMCanvas *This,
        XPS_OBJECT_TYPE *type);

    /*** IXpsOMVisual methods ***/
    HRESULT (STDMETHODCALLTYPE *GetTransform)(
        IXpsOMCanvas *This,
        IXpsOMMatrixTransform **matrixTransform);

    HRESULT (STDMETHODCALLTYPE *GetTransformLocal)(
        IXpsOMCanvas *This,
        IXpsOMMatrixTransform **matrixTransform);

    HRESULT (STDMETHODCALLTYPE *SetTransformLocal)(
        IXpsOMCanvas *This,
        IXpsOMMatrixTransform *matrixTransform);

    HRESULT (STDMETHODCALLTYPE *GetTransformLookup)(
        IXpsOMCanvas *This,
        LPWSTR *key);

    HRESULT (STDMETHODCALLTYPE *SetTransformLookup)(
        IXpsOMCanvas *This,
        LPCWSTR key);

    HRESULT (STDMETHODCALLTYPE *GetClipGeometry)(
        IXpsOMCanvas *This,
        IXpsOMGeometry **clipGeometry);

    HRESULT (STDMETHODCALLTYPE *GetClipGeometryLocal)(
        IXpsOMCanvas *This,
        IXpsOMGeometry **clipGeometry);

    HRESULT (STDMETHODCALLTYPE *SetClipGeometryLocal)(
        IXpsOMCanvas *This,
        IXpsOMGeometry *clipGeometry);

    HRESULT (STDMETHODCALLTYPE *GetClipGeometryLookup)(
        IXpsOMCanvas *This,
        LPWSTR *key);

    HRESULT (STDMETHODCALLTYPE *SetClipGeometryLookup)(
        IXpsOMCanvas *This,
        LPCWSTR key);

    HRESULT (STDMETHODCALLTYPE *GetOpacity)(
        IXpsOMCanvas *This,
        FLOAT *opacity);

    HRESULT (STDMETHODCALLTYPE *SetOpacity)(
        IXpsOMCanvas *This,
        FLOAT opacity);

    HRESULT (STDMETHODCALLTYPE *GetOpacityMaskBrush)(
        IXpsOMCanvas *This,
        IXpsOMBrush **opacityMaskBrush);

    HRESULT (STDMETHODCALLTYPE *GetOpacityMaskBrushLocal)(
        IXpsOMCanvas *This,
        IXpsOMBrush **opacityMaskBrush);

    HRESULT (STDMETHODCALLTYPE *SetOpacityMaskBrushLocal)(
        IXpsOMCanvas *This,
        IXpsOMBrush *opacityMaskBrush);

    HRESULT (STDMETHODCALLTYPE *GetOpacityMaskBrushLookup)(
        IXpsOMCanvas *This,
        LPWSTR *key);

    HRESULT (STDMETHODCALLTYPE *SetOpacityMaskBrushLookup)(
        IXpsOMCanvas *This,
        LPCWSTR key);

    HRESULT (STDMETHODCALLTYPE *GetName)(
        IXpsOMCanvas *This,
        LPWSTR *name);

    HRESULT (STDMETHODCALLTYPE *SetName)(
        IXpsOMCanvas *This,
        LPCWSTR name);

    HRESULT (STDMETHODCALLTYPE *GetIsHyperlinkTarget)(
        IXpsOMCanvas *This,
        WINBOOL *isHyperlink);

    HRESULT (STDMETHODCALLTYPE *SetIsHyperlinkTarget)(
        IXpsOMCanvas *This,
        WINBOOL isHyperlink);

    HRESULT (STDMETHODCALLTYPE *GetHyperlinkNavigateUri)(
        IXpsOMCanvas *This,
        IUri **hyperlinkUri);

    HRESULT (STDMETHODCALLTYPE *SetHyperlinkNavigateUri)(
        IXpsOMCanvas *This,
        IUri *hyperlinkUri);

    HRESULT (STDMETHODCALLTYPE *GetLanguage)(
        IXpsOMCanvas *This,
        LPWSTR *language);

    HRESULT (STDMETHODCALLTYPE *SetLanguage)(
        IXpsOMCanvas *This,
        LPCWSTR language);

    /*** IXpsOMCanvas methods ***/
    HRESULT (STDMETHODCALLTYPE *GetVisuals)(
        IXpsOMCanvas *This,
        IXpsOMVisualCollection **visuals);

    HRESULT (STDMETHODCALLTYPE *GetUseAliasedEdgeMode)(
        IXpsOMCanvas *This,
        WINBOOL *useAliasedEdgeMode);

    HRESULT (STDMETHODCALLTYPE *SetUseAliasedEdgeMode)(
        IXpsOMCanvas *This,
        WINBOOL useAliasedEdgeMode);

    HRESULT (STDMETHODCALLTYPE *GetAccessibilityShortDescription)(
        IXpsOMCanvas *This,
        LPWSTR *shortDescription);

    HRESULT (STDMETHODCALLTYPE *SetAccessibilityShortDescription)(
        IXpsOMCanvas *This,
        LPCWSTR shortDescription);

    HRESULT (STDMETHODCALLTYPE *GetAccessibilityLongDescription)(
        IXpsOMCanvas *This,
        LPWSTR *longDescription);

    HRESULT (STDMETHODCALLTYPE *SetAccessibilityLongDescription)(
        IXpsOMCanvas *This,
        LPCWSTR longDescription);

    HRESULT (STDMETHODCALLTYPE *GetDictionary)(
        IXpsOMCanvas *This,
        IXpsOMDictionary **resourceDictionary);

    HRESULT (STDMETHODCALLTYPE *GetDictionaryLocal)(
        IXpsOMCanvas *This,
        IXpsOMDictionary **resourceDictionary);

    HRESULT (STDMETHODCALLTYPE *SetDictionaryLocal)(
        IXpsOMCanvas *This,
        IXpsOMDictionary *resourceDictionary);

    HRESULT (STDMETHODCALLTYPE *GetDictionaryResource)(
        IXpsOMCanvas *This,
        IXpsOMRemoteDictionaryResource **remoteDictionaryResource);

    HRESULT (STDMETHODCALLTYPE *SetDictionaryResource)(
        IXpsOMCanvas *This,
        IXpsOMRemoteDictionaryResource *remoteDictionaryResource);

    HRESULT (STDMETHODCALLTYPE *Clone)(
        IXpsOMCanvas *This,
        IXpsOMCanvas **canvas);

    END_INTERFACE
} IXpsOMCanvasVtbl;

interface IXpsOMCanvas {
    CONST_VTBL IXpsOMCanvasVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IXpsOMCanvas_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IXpsOMCanvas_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IXpsOMCanvas_Release(This) (This)->lpVtbl->Release(This)
/*** IXpsOMShareable methods ***/
#define IXpsOMCanvas_GetOwner(This,owner) (This)->lpVtbl->GetOwner(This,owner)
#define IXpsOMCanvas_GetType(This,type) (This)->lpVtbl->GetType(This,type)
/*** IXpsOMVisual methods ***/
#define IXpsOMCanvas_GetTransform(This,matrixTransform) (This)->lpVtbl->GetTransform(This,matrixTransform)
#define IXpsOMCanvas_GetTransformLocal(This,matrixTransform) (This)->lpVtbl->GetTransformLocal(This,matrixTransform)
#define IXpsOMCanvas_SetTransformLocal(This,matrixTransform) (This)->lpVtbl->SetTransformLocal(This,matrixTransform)
#define IXpsOMCanvas_GetTransformLookup(This,key) (This)->lpVtbl->GetTransformLookup(This,key)
#define IXpsOMCanvas_SetTransformLookup(This,key) (This)->lpVtbl->SetTransformLookup(This,key)
#define IXpsOMCanvas_GetClipGeometry(This,clipGeometry) (This)->lpVtbl->GetClipGeometry(This,clipGeometry)
#define IXpsOMCanvas_GetClipGeometryLocal(This,clipGeometry) (This)->lpVtbl->GetClipGeometryLocal(This,clipGeometry)
#define IXpsOMCanvas_SetClipGeometryLocal(This,clipGeometry) (This)->lpVtbl->SetClipGeometryLocal(This,clipGeometry)
#define IXpsOMCanvas_GetClipGeometryLookup(This,key) (This)->lpVtbl->GetClipGeometryLookup(This,key)
#define IXpsOMCanvas_SetClipGeometryLookup(This,key) (This)->lpVtbl->SetClipGeometryLookup(This,key)
#define IXpsOMCanvas_GetOpacity(This,opacity) (This)->lpVtbl->GetOpacity(This,opacity)
#define IXpsOMCanvas_SetOpacity(This,opacity) (This)->lpVtbl->SetOpacity(This,opacity)
#define IXpsOMCanvas_GetOpacityMaskBrush(This,opacityMaskBrush) (This)->lpVtbl->GetOpacityMaskBrush(This,opacityMaskBrush)
#define IXpsOMCanvas_GetOpacityMaskBrushLocal(This,opacityMaskBrush) (This)->lpVtbl->GetOpacityMaskBrushLocal(This,opacityMaskBrush)
#define IXpsOMCanvas_SetOpacityMaskBrushLocal(This,opacityMaskBrush) (This)->lpVtbl->SetOpacityMaskBrushLocal(This,opacityMaskBrush)
#define IXpsOMCanvas_GetOpacityMaskBrushLookup(This,key) (This)->lpVtbl->GetOpacityMaskBrushLookup(This,key)
#define IXpsOMCanvas_SetOpacityMaskBrushLookup(This,key) (This)->lpVtbl->SetOpacityMaskBrushLookup(This,key)
#define IXpsOMCanvas_GetName(This,name) (This)->lpVtbl->GetName(This,name)
#define IXpsOMCanvas_SetName(This,name) (This)->lpVtbl->SetName(This,name)
#define IXpsOMCanvas_GetIsHyperlinkTarget(This,isHyperlink) (This)->lpVtbl->GetIsHyperlinkTarget(This,isHyperlink)
#define IXpsOMCanvas_SetIsHyperlinkTarget(This,isHyperlink) (This)->lpVtbl->SetIsHyperlinkTarget(This,isHyperlink)
#define IXpsOMCanvas_GetHyperlinkNavigateUri(This,hyperlinkUri) (This)->lpVtbl->GetHyperlinkNavigateUri(This,hyperlinkUri)
#define IXpsOMCanvas_SetHyperlinkNavigateUri(This,hyperlinkUri) (This)->lpVtbl->SetHyperlinkNavigateUri(This,hyperlinkUri)
#define IXpsOMCanvas_GetLanguage(This,language) (This)->lpVtbl->GetLanguage(This,language)
#define IXpsOMCanvas_SetLanguage(This,language) (This)->lpVtbl->SetLanguage(This,language)
/*** IXpsOMCanvas methods ***/
#define IXpsOMCanvas_GetVisuals(This,visuals) (This)->lpVtbl->GetVisuals(This,visuals)
#define IXpsOMCanvas_GetUseAliasedEdgeMode(This,useAliasedEdgeMode) (This)->lpVtbl->GetUseAliasedEdgeMode(This,useAliasedEdgeMode)
#define IXpsOMCanvas_SetUseAliasedEdgeMode(This,useAliasedEdgeMode) (This)->lpVtbl->SetUseAliasedEdgeMode(This,useAliasedEdgeMode)
#define IXpsOMCanvas_GetAccessibilityShortDescription(This,shortDescription) (This)->lpVtbl->GetAccessibilityShortDescription(This,shortDescription)
#define IXpsOMCanvas_SetAccessibilityShortDescription(This,shortDescription) (This)->lpVtbl->SetAccessibilityShortDescription(This,shortDescription)
#define IXpsOMCanvas_GetAccessibilityLongDescription(This,longDescription) (This)->lpVtbl->GetAccessibilityLongDescription(This,longDescription)
#define IXpsOMCanvas_SetAccessibilityLongDescription(This,longDescription) (This)->lpVtbl->SetAccessibilityLongDescription(This,longDescription)
#define IXpsOMCanvas_GetDictionary(This,resourceDictionary) (This)->lpVtbl->GetDictionary(This,resourceDictionary)
#define IXpsOMCanvas_GetDictionaryLocal(This,resourceDictionary) (This)->lpVtbl->GetDictionaryLocal(This,resourceDictionary)
#define IXpsOMCanvas_SetDictionaryLocal(This,resourceDictionary) (This)->lpVtbl->SetDictionaryLocal(This,resourceDictionary)
#define IXpsOMCanvas_GetDictionaryResource(This,remoteDictionaryResource) (This)->lpVtbl->GetDictionaryResource(This,remoteDictionaryResource)
#define IXpsOMCanvas_SetDictionaryResource(This,remoteDictionaryResource) (This)->lpVtbl->SetDictionaryResource(This,remoteDictionaryResource)
#define IXpsOMCanvas_Clone(This,canvas) (This)->lpVtbl->Clone(This,canvas)
#else
/*** IUnknown methods ***/
static __WIDL_INLINE HRESULT IXpsOMCanvas_QueryInterface(IXpsOMCanvas* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IXpsOMCanvas_AddRef(IXpsOMCanvas* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IXpsOMCanvas_Release(IXpsOMCanvas* This) {
    return This->lpVtbl->Release(This);
}
/*** IXpsOMShareable methods ***/
static __WIDL_INLINE HRESULT IXpsOMCanvas_GetOwner(IXpsOMCanvas* This,IUnknown **owner) {
    return This->lpVtbl->GetOwner(This,owner);
}
static __WIDL_INLINE HRESULT IXpsOMCanvas_GetType(IXpsOMCanvas* This,XPS_OBJECT_TYPE *type) {
    return This->lpVtbl->GetType(This,type);
}
/*** IXpsOMVisual methods ***/
static __WIDL_INLINE HRESULT IXpsOMCanvas_GetTransform(IXpsOMCanvas* This,IXpsOMMatrixTransform **matrixTransform) {
    return This->lpVtbl->GetTransform(This,matrixTransform);
}
static __WIDL_INLINE HRESULT IXpsOMCanvas_GetTransformLocal(IXpsOMCanvas* This,IXpsOMMatrixTransform **matrixTransform) {
    return This->lpVtbl->GetTransformLocal(This,matrixTransform);
}
static __WIDL_INLINE HRESULT IXpsOMCanvas_SetTransformLocal(IXpsOMCanvas* This,IXpsOMMatrixTransform *matrixTransform) {
    return This->lpVtbl->SetTransformLocal(This,matrixTransform);
}
static __WIDL_INLINE HRESULT IXpsOMCanvas_GetTransformLookup(IXpsOMCanvas* This,LPWSTR *key) {
    return This->lpVtbl->GetTransformLookup(This,key);
}
static __WIDL_INLINE HRESULT IXpsOMCanvas_SetTransformLookup(IXpsOMCanvas* This,LPCWSTR key) {
    return This->lpVtbl->SetTransformLookup(This,key);
}
static __WIDL_INLINE HRESULT IXpsOMCanvas_GetClipGeometry(IXpsOMCanvas* This,IXpsOMGeometry **clipGeometry) {
    return This->lpVtbl->GetClipGeometry(This,clipGeometry);
}
static __WIDL_INLINE HRESULT IXpsOMCanvas_GetClipGeometryLocal(IXpsOMCanvas* This,IXpsOMGeometry **clipGeometry) {
    return This->lpVtbl->GetClipGeometryLocal(This,clipGeometry);
}
static __WIDL_INLINE HRESULT IXpsOMCanvas_SetClipGeometryLocal(IXpsOMCanvas* This,IXpsOMGeometry *clipGeometry) {
    return This->lpVtbl->SetClipGeometryLocal(This,clipGeometry);
}
static __WIDL_INLINE HRESULT IXpsOMCanvas_GetClipGeometryLookup(IXpsOMCanvas* This,LPWSTR *key) {
    return This->lpVtbl->GetClipGeometryLookup(This,key);
}
static __WIDL_INLINE HRESULT IXpsOMCanvas_SetClipGeometryLookup(IXpsOMCanvas* This,LPCWSTR key) {
    return This->lpVtbl->SetClipGeometryLookup(This,key);
}
static __WIDL_INLINE HRESULT IXpsOMCanvas_GetOpacity(IXpsOMCanvas* This,FLOAT *opacity) {
    return This->lpVtbl->GetOpacity(This,opacity);
}
static __WIDL_INLINE HRESULT IXpsOMCanvas_SetOpacity(IXpsOMCanvas* This,FLOAT opacity) {
    return This->lpVtbl->SetOpacity(This,opacity);
}
static __WIDL_INLINE HRESULT IXpsOMCanvas_GetOpacityMaskBrush(IXpsOMCanvas* This,IXpsOMBrush **opacityMaskBrush) {
    return This->lpVtbl->GetOpacityMaskBrush(This,opacityMaskBrush);
}
static __WIDL_INLINE HRESULT IXpsOMCanvas_GetOpacityMaskBrushLocal(IXpsOMCanvas* This,IXpsOMBrush **opacityMaskBrush) {
    return This->lpVtbl->GetOpacityMaskBrushLocal(This,opacityMaskBrush);
}
static __WIDL_INLINE HRESULT IXpsOMCanvas_SetOpacityMaskBrushLocal(IXpsOMCanvas* This,IXpsOMBrush *opacityMaskBrush) {
    return This->lpVtbl->SetOpacityMaskBrushLocal(This,opacityMaskBrush);
}
static __WIDL_INLINE HRESULT IXpsOMCanvas_GetOpacityMaskBrushLookup(IXpsOMCanvas* This,LPWSTR *key) {
    return This->lpVtbl->GetOpacityMaskBrushLookup(This,key);
}
static __WIDL_INLINE HRESULT IXpsOMCanvas_SetOpacityMaskBrushLookup(IXpsOMCanvas* This,LPCWSTR key) {
    return This->lpVtbl->SetOpacityMaskBrushLookup(This,key);
}
static __WIDL_INLINE HRESULT IXpsOMCanvas_GetName(IXpsOMCanvas* This,LPWSTR *name) {
    return This->lpVtbl->GetName(This,name);
}
static __WIDL_INLINE HRESULT IXpsOMCanvas_SetName(IXpsOMCanvas* This,LPCWSTR name) {
    return This->lpVtbl->SetName(This,name);
}
static __WIDL_INLINE HRESULT IXpsOMCanvas_GetIsHyperlinkTarget(IXpsOMCanvas* This,WINBOOL *isHyperlink) {
    return This->lpVtbl->GetIsHyperlinkTarget(This,isHyperlink);
}
static __WIDL_INLINE HRESULT IXpsOMCanvas_SetIsHyperlinkTarget(IXpsOMCanvas* This,WINBOOL isHyperlink) {
    return This->lpVtbl->SetIsHyperlinkTarget(This,isHyperlink);
}
static __WIDL_INLINE HRESULT IXpsOMCanvas_GetHyperlinkNavigateUri(IXpsOMCanvas* This,IUri **hyperlinkUri) {
    return This->lpVtbl->GetHyperlinkNavigateUri(This,hyperlinkUri);
}
static __WIDL_INLINE HRESULT IXpsOMCanvas_SetHyperlinkNavigateUri(IXpsOMCanvas* This,IUri *hyperlinkUri) {
    return This->lpVtbl->SetHyperlinkNavigateUri(This,hyperlinkUri);
}
static __WIDL_INLINE HRESULT IXpsOMCanvas_GetLanguage(IXpsOMCanvas* This,LPWSTR *language) {
    return This->lpVtbl->GetLanguage(This,language);
}
static __WIDL_INLINE HRESULT IXpsOMCanvas_SetLanguage(IXpsOMCanvas* This,LPCWSTR language) {
    return This->lpVtbl->SetLanguage(This,language);
}
/*** IXpsOMCanvas methods ***/
static __WIDL_INLINE HRESULT IXpsOMCanvas_GetVisuals(IXpsOMCanvas* This,IXpsOMVisualCollection **visuals) {
    return This->lpVtbl->GetVisuals(This,visuals);
}
static __WIDL_INLINE HRESULT IXpsOMCanvas_GetUseAliasedEdgeMode(IXpsOMCanvas* This,WINBOOL *useAliasedEdgeMode) {
    return This->lpVtbl->GetUseAliasedEdgeMode(This,useAliasedEdgeMode);
}
static __WIDL_INLINE HRESULT IXpsOMCanvas_SetUseAliasedEdgeMode(IXpsOMCanvas* This,WINBOOL useAliasedEdgeMode) {
    return This->lpVtbl->SetUseAliasedEdgeMode(This,useAliasedEdgeMode);
}
static __WIDL_INLINE HRESULT IXpsOMCanvas_GetAccessibilityShortDescription(IXpsOMCanvas* This,LPWSTR *shortDescription) {
    return This->lpVtbl->GetAccessibilityShortDescription(This,shortDescription);
}
static __WIDL_INLINE HRESULT IXpsOMCanvas_SetAccessibilityShortDescription(IXpsOMCanvas* This,LPCWSTR shortDescription) {
    return This->lpVtbl->SetAccessibilityShortDescription(This,shortDescription);
}
static __WIDL_INLINE HRESULT IXpsOMCanvas_GetAccessibilityLongDescription(IXpsOMCanvas* This,LPWSTR *longDescription) {
    return This->lpVtbl->GetAccessibilityLongDescription(This,longDescription);
}
static __WIDL_INLINE HRESULT IXpsOMCanvas_SetAccessibilityLongDescription(IXpsOMCanvas* This,LPCWSTR longDescription) {
    return This->lpVtbl->SetAccessibilityLongDescription(This,longDescription);
}
static __WIDL_INLINE HRESULT IXpsOMCanvas_GetDictionary(IXpsOMCanvas* This,IXpsOMDictionary **resourceDictionary) {
    return This->lpVtbl->GetDictionary(This,resourceDictionary);
}
static __WIDL_INLINE HRESULT IXpsOMCanvas_GetDictionaryLocal(IXpsOMCanvas* This,IXpsOMDictionary **resourceDictionary) {
    return This->lpVtbl->GetDictionaryLocal(This,resourceDictionary);
}
static __WIDL_INLINE HRESULT IXpsOMCanvas_SetDictionaryLocal(IXpsOMCanvas* This,IXpsOMDictionary *resourceDictionary) {
    return This->lpVtbl->SetDictionaryLocal(This,resourceDictionary);
}
static __WIDL_INLINE HRESULT IXpsOMCanvas_GetDictionaryResource(IXpsOMCanvas* This,IXpsOMRemoteDictionaryResource **remoteDictionaryResource) {
    return This->lpVtbl->GetDictionaryResource(This,remoteDictionaryResource);
}
static __WIDL_INLINE HRESULT IXpsOMCanvas_SetDictionaryResource(IXpsOMCanvas* This,IXpsOMRemoteDictionaryResource *remoteDictionaryResource) {
    return This->lpVtbl->SetDictionaryResource(This,remoteDictionaryResource);
}
static __WIDL_INLINE HRESULT IXpsOMCanvas_Clone(IXpsOMCanvas* This,IXpsOMCanvas **canvas) {
    return This->lpVtbl->Clone(This,canvas);
}
#endif
#endif

#endif


#endif  /* __IXpsOMCanvas_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IXpsOMPage interface
 */
#ifndef __IXpsOMPage_INTERFACE_DEFINED__
#define __IXpsOMPage_INTERFACE_DEFINED__

DEFINE_GUID(IID_IXpsOMPage, 0xd3e18888, 0xf120, 0x4fee, 0x8c,0x68, 0x35,0x29,0x6e,0xae,0x91,0xd4);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("d3e18888-f120-4fee-8c68-35296eae91d4")
IXpsOMPage : public IXpsOMPart
{
    virtual HRESULT STDMETHODCALLTYPE GetOwner(
        IXpsOMPageReference **pageReference) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetVisuals(
        IXpsOMVisualCollection **visuals) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetPageDimensions(
        XPS_SIZE *pageDimensions) = 0;

    virtual HRESULT STDMETHODCALLTYPE SetPageDimensions(
        const XPS_SIZE *pageDimensions) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetContentBox(
        XPS_RECT *contentBox) = 0;

    virtual HRESULT STDMETHODCALLTYPE SetContentBox(
        const XPS_RECT *contentBox) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetBleedBox(
        XPS_RECT *bleedBox) = 0;

    virtual HRESULT STDMETHODCALLTYPE SetBleedBox(
        const XPS_RECT *bleedBox) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetLanguage(
        LPWSTR *language) = 0;

    virtual HRESULT STDMETHODCALLTYPE SetLanguage(
        LPCWSTR language) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetName(
        LPWSTR *name) = 0;

    virtual HRESULT STDMETHODCALLTYPE SetName(
        LPCWSTR name) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetIsHyperlinkTarget(
        WINBOOL *isHyperlinkTarget) = 0;

    virtual HRESULT STDMETHODCALLTYPE SetIsHyperlinkTarget(
        WINBOOL isHyperlinkTarget) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetDictionary(
        IXpsOMDictionary **resourceDictionary) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetDictionaryLocal(
        IXpsOMDictionary **resourceDictionary) = 0;

    virtual HRESULT STDMETHODCALLTYPE SetDictionaryLocal(
        IXpsOMDictionary *resourceDictionary) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetDictionaryResource(
        IXpsOMRemoteDictionaryResource **remoteDictionaryResource) = 0;

    virtual HRESULT STDMETHODCALLTYPE SetDictionaryResource(
        IXpsOMRemoteDictionaryResource *remoteDictionaryResource) = 0;

    virtual HRESULT STDMETHODCALLTYPE Write(
        ISequentialStream *stream,
        WINBOOL optimizeMarkupSize) = 0;

    virtual HRESULT STDMETHODCALLTYPE GenerateUnusedLookupKey(
        XPS_OBJECT_TYPE type,
        LPWSTR *key) = 0;

    virtual HRESULT STDMETHODCALLTYPE Clone(
        IXpsOMPage **page) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IXpsOMPage, 0xd3e18888, 0xf120, 0x4fee, 0x8c,0x68, 0x35,0x29,0x6e,0xae,0x91,0xd4)
#endif
#else
typedef struct IXpsOMPageVtbl {
    BEGIN_INTERFACE

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

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

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

    /*** IXpsOMPart methods ***/
    HRESULT (STDMETHODCALLTYPE *GetPartName)(
        IXpsOMPage *This,
        IOpcPartUri **partUri);

    HRESULT (STDMETHODCALLTYPE *SetPartName)(
        IXpsOMPage *This,
        IOpcPartUri *partUri);

    /*** IXpsOMPage methods ***/
    HRESULT (STDMETHODCALLTYPE *GetOwner)(
        IXpsOMPage *This,
        IXpsOMPageReference **pageReference);

    HRESULT (STDMETHODCALLTYPE *GetVisuals)(
        IXpsOMPage *This,
        IXpsOMVisualCollection **visuals);

    HRESULT (STDMETHODCALLTYPE *GetPageDimensions)(
        IXpsOMPage *This,
        XPS_SIZE *pageDimensions);

    HRESULT (STDMETHODCALLTYPE *SetPageDimensions)(
        IXpsOMPage *This,
        const XPS_SIZE *pageDimensions);

    HRESULT (STDMETHODCALLTYPE *GetContentBox)(
        IXpsOMPage *This,
        XPS_RECT *contentBox);

    HRESULT (STDMETHODCALLTYPE *SetContentBox)(
        IXpsOMPage *This,
        const XPS_RECT *contentBox);

    HRESULT (STDMETHODCALLTYPE *GetBleedBox)(
        IXpsOMPage *This,
        XPS_RECT *bleedBox);

    HRESULT (STDMETHODCALLTYPE *SetBleedBox)(
        IXpsOMPage *This,
        const XPS_RECT *bleedBox);

    HRESULT (STDMETHODCALLTYPE *GetLanguage)(
        IXpsOMPage *This,
        LPWSTR *language);

    HRESULT (STDMETHODCALLTYPE *SetLanguage)(
        IXpsOMPage *This,
        LPCWSTR language);

    HRESULT (STDMETHODCALLTYPE *GetName)(
        IXpsOMPage *This,
        LPWSTR *name);

    HRESULT (STDMETHODCALLTYPE *SetName)(
        IXpsOMPage *This,
        LPCWSTR name);

    HRESULT (STDMETHODCALLTYPE *GetIsHyperlinkTarget)(
        IXpsOMPage *This,
        WINBOOL *isHyperlinkTarget);

    HRESULT (STDMETHODCALLTYPE *SetIsHyperlinkTarget)(
        IXpsOMPage *This,
        WINBOOL isHyperlinkTarget);

    HRESULT (STDMETHODCALLTYPE *GetDictionary)(
        IXpsOMPage *This,
        IXpsOMDictionary **resourceDictionary);

    HRESULT (STDMETHODCALLTYPE *GetDictionaryLocal)(
        IXpsOMPage *This,
        IXpsOMDictionary **resourceDictionary);

    HRESULT (STDMETHODCALLTYPE *SetDictionaryLocal)(
        IXpsOMPage *This,
        IXpsOMDictionary *resourceDictionary);

    HRESULT (STDMETHODCALLTYPE *GetDictionaryResource)(
        IXpsOMPage *This,
        IXpsOMRemoteDictionaryResource **remoteDictionaryResource);

    HRESULT (STDMETHODCALLTYPE *SetDictionaryResource)(
        IXpsOMPage *This,
        IXpsOMRemoteDictionaryResource *remoteDictionaryResource);

    HRESULT (STDMETHODCALLTYPE *Write)(
        IXpsOMPage *This,
        ISequentialStream *stream,
        WINBOOL optimizeMarkupSize);

    HRESULT (STDMETHODCALLTYPE *GenerateUnusedLookupKey)(
        IXpsOMPage *This,
        XPS_OBJECT_TYPE type,
        LPWSTR *key);

    HRESULT (STDMETHODCALLTYPE *Clone)(
        IXpsOMPage *This,
        IXpsOMPage **page);

    END_INTERFACE
} IXpsOMPageVtbl;

interface IXpsOMPage {
    CONST_VTBL IXpsOMPageVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IXpsOMPage_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IXpsOMPage_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IXpsOMPage_Release(This) (This)->lpVtbl->Release(This)
/*** IXpsOMPart methods ***/
#define IXpsOMPage_GetPartName(This,partUri) (This)->lpVtbl->GetPartName(This,partUri)
#define IXpsOMPage_SetPartName(This,partUri) (This)->lpVtbl->SetPartName(This,partUri)
/*** IXpsOMPage methods ***/
#define IXpsOMPage_GetOwner(This,pageReference) (This)->lpVtbl->GetOwner(This,pageReference)
#define IXpsOMPage_GetVisuals(This,visuals) (This)->lpVtbl->GetVisuals(This,visuals)
#define IXpsOMPage_GetPageDimensions(This,pageDimensions) (This)->lpVtbl->GetPageDimensions(This,pageDimensions)
#define IXpsOMPage_SetPageDimensions(This,pageDimensions) (This)->lpVtbl->SetPageDimensions(This,pageDimensions)
#define IXpsOMPage_GetContentBox(This,contentBox) (This)->lpVtbl->GetContentBox(This,contentBox)
#define IXpsOMPage_SetContentBox(This,contentBox) (This)->lpVtbl->SetContentBox(This,contentBox)
#define IXpsOMPage_GetBleedBox(This,bleedBox) (This)->lpVtbl->GetBleedBox(This,bleedBox)
#define IXpsOMPage_SetBleedBox(This,bleedBox) (This)->lpVtbl->SetBleedBox(This,bleedBox)
#define IXpsOMPage_GetLanguage(This,language) (This)->lpVtbl->GetLanguage(This,language)
#define IXpsOMPage_SetLanguage(This,language) (This)->lpVtbl->SetLanguage(This,language)
#define IXpsOMPage_GetName(This,name) (This)->lpVtbl->GetName(This,name)
#define IXpsOMPage_SetName(This,name) (This)->lpVtbl->SetName(This,name)
#define IXpsOMPage_GetIsHyperlinkTarget(This,isHyperlinkTarget) (This)->lpVtbl->GetIsHyperlinkTarget(This,isHyperlinkTarget)
#define IXpsOMPage_SetIsHyperlinkTarget(This,isHyperlinkTarget) (This)->lpVtbl->SetIsHyperlinkTarget(This,isHyperlinkTarget)
#define IXpsOMPage_GetDictionary(This,resourceDictionary) (This)->lpVtbl->GetDictionary(This,resourceDictionary)
#define IXpsOMPage_GetDictionaryLocal(This,resourceDictionary) (This)->lpVtbl->GetDictionaryLocal(This,resourceDictionary)
#define IXpsOMPage_SetDictionaryLocal(This,resourceDictionary) (This)->lpVtbl->SetDictionaryLocal(This,resourceDictionary)
#define IXpsOMPage_GetDictionaryResource(This,remoteDictionaryResource) (This)->lpVtbl->GetDictionaryResource(This,remoteDictionaryResource)
#define IXpsOMPage_SetDictionaryResource(This,remoteDictionaryResource) (This)->lpVtbl->SetDictionaryResource(This,remoteDictionaryResource)
#define IXpsOMPage_Write(This,stream,optimizeMarkupSize) (This)->lpVtbl->Write(This,stream,optimizeMarkupSize)
#define IXpsOMPage_GenerateUnusedLookupKey(This,type,key) (This)->lpVtbl->GenerateUnusedLookupKey(This,type,key)
#define IXpsOMPage_Clone(This,page) (This)->lpVtbl->Clone(This,page)
#else
/*** IUnknown methods ***/
static __WIDL_INLINE HRESULT IXpsOMPage_QueryInterface(IXpsOMPage* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IXpsOMPage_AddRef(IXpsOMPage* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IXpsOMPage_Release(IXpsOMPage* This) {
    return This->lpVtbl->Release(This);
}
/*** IXpsOMPart methods ***/
static __WIDL_INLINE HRESULT IXpsOMPage_GetPartName(IXpsOMPage* This,IOpcPartUri **partUri) {
    return This->lpVtbl->GetPartName(This,partUri);
}
static __WIDL_INLINE HRESULT IXpsOMPage_SetPartName(IXpsOMPage* This,IOpcPartUri *partUri) {
    return This->lpVtbl->SetPartName(This,partUri);
}
/*** IXpsOMPage methods ***/
static __WIDL_INLINE HRESULT IXpsOMPage_GetOwner(IXpsOMPage* This,IXpsOMPageReference **pageReference) {
    return This->lpVtbl->GetOwner(This,pageReference);
}
static __WIDL_INLINE HRESULT IXpsOMPage_GetVisuals(IXpsOMPage* This,IXpsOMVisualCollection **visuals) {
    return This->lpVtbl->GetVisuals(This,visuals);
}
static __WIDL_INLINE HRESULT IXpsOMPage_GetPageDimensions(IXpsOMPage* This,XPS_SIZE *pageDimensions) {
    return This->lpVtbl->GetPageDimensions(This,pageDimensions);
}
static __WIDL_INLINE HRESULT IXpsOMPage_SetPageDimensions(IXpsOMPage* This,const XPS_SIZE *pageDimensions) {
    return This->lpVtbl->SetPageDimensions(This,pageDimensions);
}
static __WIDL_INLINE HRESULT IXpsOMPage_GetContentBox(IXpsOMPage* This,XPS_RECT *contentBox) {
    return This->lpVtbl->GetContentBox(This,contentBox);
}
static __WIDL_INLINE HRESULT IXpsOMPage_SetContentBox(IXpsOMPage* This,const XPS_RECT *contentBox) {
    return This->lpVtbl->SetContentBox(This,contentBox);
}
static __WIDL_INLINE HRESULT IXpsOMPage_GetBleedBox(IXpsOMPage* This,XPS_RECT *bleedBox) {
    return This->lpVtbl->GetBleedBox(This,bleedBox);
}
static __WIDL_INLINE HRESULT IXpsOMPage_SetBleedBox(IXpsOMPage* This,const XPS_RECT *bleedBox) {
    return This->lpVtbl->SetBleedBox(This,bleedBox);
}
static __WIDL_INLINE HRESULT IXpsOMPage_GetLanguage(IXpsOMPage* This,LPWSTR *language) {
    return This->lpVtbl->GetLanguage(This,language);
}
static __WIDL_INLINE HRESULT IXpsOMPage_SetLanguage(IXpsOMPage* This,LPCWSTR language) {
    return This->lpVtbl->SetLanguage(This,language);
}
static __WIDL_INLINE HRESULT IXpsOMPage_GetName(IXpsOMPage* This,LPWSTR *name) {
    return This->lpVtbl->GetName(This,name);
}
static __WIDL_INLINE HRESULT IXpsOMPage_SetName(IXpsOMPage* This,LPCWSTR name) {
    return This->lpVtbl->SetName(This,name);
}
static __WIDL_INLINE HRESULT IXpsOMPage_GetIsHyperlinkTarget(IXpsOMPage* This,WINBOOL *isHyperlinkTarget) {
    return This->lpVtbl->GetIsHyperlinkTarget(This,isHyperlinkTarget);
}
static __WIDL_INLINE HRESULT IXpsOMPage_SetIsHyperlinkTarget(IXpsOMPage* This,WINBOOL isHyperlinkTarget) {
    return This->lpVtbl->SetIsHyperlinkTarget(This,isHyperlinkTarget);
}
static __WIDL_INLINE HRESULT IXpsOMPage_GetDictionary(IXpsOMPage* This,IXpsOMDictionary **resourceDictionary) {
    return This->lpVtbl->GetDictionary(This,resourceDictionary);
}
static __WIDL_INLINE HRESULT IXpsOMPage_GetDictionaryLocal(IXpsOMPage* This,IXpsOMDictionary **resourceDictionary) {
    return This->lpVtbl->GetDictionaryLocal(This,resourceDictionary);
}
static __WIDL_INLINE HRESULT IXpsOMPage_SetDictionaryLocal(IXpsOMPage* This,IXpsOMDictionary *resourceDictionary) {
    return This->lpVtbl->SetDictionaryLocal(This,resourceDictionary);
}
static __WIDL_INLINE HRESULT IXpsOMPage_GetDictionaryResource(IXpsOMPage* This,IXpsOMRemoteDictionaryResource **remoteDictionaryResource) {
    return This->lpVtbl->GetDictionaryResource(This,remoteDictionaryResource);
}
static __WIDL_INLINE HRESULT IXpsOMPage_SetDictionaryResource(IXpsOMPage* This,IXpsOMRemoteDictionaryResource *remoteDictionaryResource) {
    return This->lpVtbl->SetDictionaryResource(This,remoteDictionaryResource);
}
static __WIDL_INLINE HRESULT IXpsOMPage_Write(IXpsOMPage* This,ISequentialStream *stream,WINBOOL optimizeMarkupSize) {
    return This->lpVtbl->Write(This,stream,optimizeMarkupSize);
}
static __WIDL_INLINE HRESULT IXpsOMPage_GenerateUnusedLookupKey(IXpsOMPage* This,XPS_OBJECT_TYPE type,LPWSTR *key) {
    return This->lpVtbl->GenerateUnusedLookupKey(This,type,key);
}
static __WIDL_INLINE HRESULT IXpsOMPage_Clone(IXpsOMPage* This,IXpsOMPage **page) {
    return This->lpVtbl->Clone(This,page);
}
#endif
#endif

#endif


#endif  /* __IXpsOMPage_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IXpsOMDocument interface
 */
#ifndef __IXpsOMDocument_INTERFACE_DEFINED__
#define __IXpsOMDocument_INTERFACE_DEFINED__

DEFINE_GUID(IID_IXpsOMDocument, 0x2c2c94cb, 0xac5f, 0x4254, 0x8e,0xe9, 0x23,0x94,0x83,0x09,0xd9,0xf0);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("2c2c94cb-ac5f-4254-8ee9-23948309d9f0")
IXpsOMDocument : public IXpsOMPart
{
    virtual HRESULT STDMETHODCALLTYPE GetOwner(
        IXpsOMDocumentSequence **documentSequence) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetPageReferences(
        IXpsOMPageReferenceCollection **pageReferences) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetPrintTicketResource(
        IXpsOMPrintTicketResource **printTicketResource) = 0;

    virtual HRESULT STDMETHODCALLTYPE SetPrintTicketResource(
        IXpsOMPrintTicketResource *printTicketResource) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetDocumentStructureResource(
        IXpsOMDocumentStructureResource **documentStructureResource) = 0;

    virtual HRESULT STDMETHODCALLTYPE SetDocumentStructureResource(
        IXpsOMDocumentStructureResource *documentStructureResource) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetSignatureBlockResources(
        IXpsOMSignatureBlockResourceCollection **signatureBlockResources) = 0;

    virtual HRESULT STDMETHODCALLTYPE Clone(
        IXpsOMDocument **document) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IXpsOMDocument, 0x2c2c94cb, 0xac5f, 0x4254, 0x8e,0xe9, 0x23,0x94,0x83,0x09,0xd9,0xf0)
#endif
#else
typedef struct IXpsOMDocumentVtbl {
    BEGIN_INTERFACE

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

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

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

    /*** IXpsOMPart methods ***/
    HRESULT (STDMETHODCALLTYPE *GetPartName)(
        IXpsOMDocument *This,
        IOpcPartUri **partUri);

    HRESULT (STDMETHODCALLTYPE *SetPartName)(
        IXpsOMDocument *This,
        IOpcPartUri *partUri);

    /*** IXpsOMDocument methods ***/
    HRESULT (STDMETHODCALLTYPE *GetOwner)(
        IXpsOMDocument *This,
        IXpsOMDocumentSequence **documentSequence);

    HRESULT (STDMETHODCALLTYPE *GetPageReferences)(
        IXpsOMDocument *This,
        IXpsOMPageReferenceCollection **pageReferences);

    HRESULT (STDMETHODCALLTYPE *GetPrintTicketResource)(
        IXpsOMDocument *This,
        IXpsOMPrintTicketResource **printTicketResource);

    HRESULT (STDMETHODCALLTYPE *SetPrintTicketResource)(
        IXpsOMDocument *This,
        IXpsOMPrintTicketResource *printTicketResource);

    HRESULT (STDMETHODCALLTYPE *GetDocumentStructureResource)(
        IXpsOMDocument *This,
        IXpsOMDocumentStructureResource **documentStructureResource);

    HRESULT (STDMETHODCALLTYPE *SetDocumentStructureResource)(
        IXpsOMDocument *This,
        IXpsOMDocumentStructureResource *documentStructureResource);

    HRESULT (STDMETHODCALLTYPE *GetSignatureBlockResources)(
        IXpsOMDocument *This,
        IXpsOMSignatureBlockResourceCollection **signatureBlockResources);

    HRESULT (STDMETHODCALLTYPE *Clone)(
        IXpsOMDocument *This,
        IXpsOMDocument **document);

    END_INTERFACE
} IXpsOMDocumentVtbl;

interface IXpsOMDocument {
    CONST_VTBL IXpsOMDocumentVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IXpsOMDocument_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IXpsOMDocument_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IXpsOMDocument_Release(This) (This)->lpVtbl->Release(This)
/*** IXpsOMPart methods ***/
#define IXpsOMDocument_GetPartName(This,partUri) (This)->lpVtbl->GetPartName(This,partUri)
#define IXpsOMDocument_SetPartName(This,partUri) (This)->lpVtbl->SetPartName(This,partUri)
/*** IXpsOMDocument methods ***/
#define IXpsOMDocument_GetOwner(This,documentSequence) (This)->lpVtbl->GetOwner(This,documentSequence)
#define IXpsOMDocument_GetPageReferences(This,pageReferences) (This)->lpVtbl->GetPageReferences(This,pageReferences)
#define IXpsOMDocument_GetPrintTicketResource(This,printTicketResource) (This)->lpVtbl->GetPrintTicketResource(This,printTicketResource)
#define IXpsOMDocument_SetPrintTicketResource(This,printTicketResource) (This)->lpVtbl->SetPrintTicketResource(This,printTicketResource)
#define IXpsOMDocument_GetDocumentStructureResource(This,documentStructureResource) (This)->lpVtbl->GetDocumentStructureResource(This,documentStructureResource)
#define IXpsOMDocument_SetDocumentStructureResource(This,documentStructureResource) (This)->lpVtbl->SetDocumentStructureResource(This,documentStructureResource)
#define IXpsOMDocument_GetSignatureBlockResources(This,signatureBlockResources) (This)->lpVtbl->GetSignatureBlockResources(This,signatureBlockResources)
#define IXpsOMDocument_Clone(This,document) (This)->lpVtbl->Clone(This,document)
#else
/*** IUnknown methods ***/
static __WIDL_INLINE HRESULT IXpsOMDocument_QueryInterface(IXpsOMDocument* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IXpsOMDocument_AddRef(IXpsOMDocument* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IXpsOMDocument_Release(IXpsOMDocument* This) {
    return This->lpVtbl->Release(This);
}
/*** IXpsOMPart methods ***/
static __WIDL_INLINE HRESULT IXpsOMDocument_GetPartName(IXpsOMDocument* This,IOpcPartUri **partUri) {
    return This->lpVtbl->GetPartName(This,partUri);
}
static __WIDL_INLINE HRESULT IXpsOMDocument_SetPartName(IXpsOMDocument* This,IOpcPartUri *partUri) {
    return This->lpVtbl->SetPartName(This,partUri);
}
/*** IXpsOMDocument methods ***/
static __WIDL_INLINE HRESULT IXpsOMDocument_GetOwner(IXpsOMDocument* This,IXpsOMDocumentSequence **documentSequence) {
    return This->lpVtbl->GetOwner(This,documentSequence);
}
static __WIDL_INLINE HRESULT IXpsOMDocument_GetPageReferences(IXpsOMDocument* This,IXpsOMPageReferenceCollection **pageReferences) {
    return This->lpVtbl->GetPageReferences(This,pageReferences);
}
static __WIDL_INLINE HRESULT IXpsOMDocument_GetPrintTicketResource(IXpsOMDocument* This,IXpsOMPrintTicketResource **printTicketResource) {
    return This->lpVtbl->GetPrintTicketResource(This,printTicketResource);
}
static __WIDL_INLINE HRESULT IXpsOMDocument_SetPrintTicketResource(IXpsOMDocument* This,IXpsOMPrintTicketResource *printTicketResource) {
    return This->lpVtbl->SetPrintTicketResource(This,printTicketResource);
}
static __WIDL_INLINE HRESULT IXpsOMDocument_GetDocumentStructureResource(IXpsOMDocument* This,IXpsOMDocumentStructureResource **documentStructureResource) {
    return This->lpVtbl->GetDocumentStructureResource(This,documentStructureResource);
}
static __WIDL_INLINE HRESULT IXpsOMDocument_SetDocumentStructureResource(IXpsOMDocument* This,IXpsOMDocumentStructureResource *documentStructureResource) {
    return This->lpVtbl->SetDocumentStructureResource(This,documentStructureResource);
}
static __WIDL_INLINE HRESULT IXpsOMDocument_GetSignatureBlockResources(IXpsOMDocument* This,IXpsOMSignatureBlockResourceCollection **signatureBlockResources) {
    return This->lpVtbl->GetSignatureBlockResources(This,signatureBlockResources);
}
static __WIDL_INLINE HRESULT IXpsOMDocument_Clone(IXpsOMDocument* This,IXpsOMDocument **document) {
    return This->lpVtbl->Clone(This,document);
}
#endif
#endif

#endif


#endif  /* __IXpsOMDocument_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IXpsOMDocumentSequence interface
 */
#ifndef __IXpsOMDocumentSequence_INTERFACE_DEFINED__
#define __IXpsOMDocumentSequence_INTERFACE_DEFINED__

DEFINE_GUID(IID_IXpsOMDocumentSequence, 0x56492eb4, 0xd8d5, 0x425e, 0x82,0x56, 0x4c,0x2b,0x64,0xad,0x02,0x64);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("56492eb4-d8d5-425e-8256-4c2b64ad0264")
IXpsOMDocumentSequence : public IXpsOMPart
{
    virtual HRESULT STDMETHODCALLTYPE GetOwner(
        IXpsOMPackage **package) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetDocuments(
        IXpsOMDocumentCollection **documents) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetPrintTicketResource(
        IXpsOMPrintTicketResource **printTicketResource) = 0;

    virtual HRESULT STDMETHODCALLTYPE SetPrintTicketResource(
        IXpsOMPrintTicketResource *printTicketResource) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IXpsOMDocumentSequence, 0x56492eb4, 0xd8d5, 0x425e, 0x82,0x56, 0x4c,0x2b,0x64,0xad,0x02,0x64)
#endif
#else
typedef struct IXpsOMDocumentSequenceVtbl {
    BEGIN_INTERFACE

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

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

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

    /*** IXpsOMPart methods ***/
    HRESULT (STDMETHODCALLTYPE *GetPartName)(
        IXpsOMDocumentSequence *This,
        IOpcPartUri **partUri);

    HRESULT (STDMETHODCALLTYPE *SetPartName)(
        IXpsOMDocumentSequence *This,
        IOpcPartUri *partUri);

    /*** IXpsOMDocumentSequence methods ***/
    HRESULT (STDMETHODCALLTYPE *GetOwner)(
        IXpsOMDocumentSequence *This,
        IXpsOMPackage **package);

    HRESULT (STDMETHODCALLTYPE *GetDocuments)(
        IXpsOMDocumentSequence *This,
        IXpsOMDocumentCollection **documents);

    HRESULT (STDMETHODCALLTYPE *GetPrintTicketResource)(
        IXpsOMDocumentSequence *This,
        IXpsOMPrintTicketResource **printTicketResource);

    HRESULT (STDMETHODCALLTYPE *SetPrintTicketResource)(
        IXpsOMDocumentSequence *This,
        IXpsOMPrintTicketResource *printTicketResource);

    END_INTERFACE
} IXpsOMDocumentSequenceVtbl;

interface IXpsOMDocumentSequence {
    CONST_VTBL IXpsOMDocumentSequenceVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IXpsOMDocumentSequence_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IXpsOMDocumentSequence_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IXpsOMDocumentSequence_Release(This) (This)->lpVtbl->Release(This)
/*** IXpsOMPart methods ***/
#define IXpsOMDocumentSequence_GetPartName(This,partUri) (This)->lpVtbl->GetPartName(This,partUri)
#define IXpsOMDocumentSequence_SetPartName(This,partUri) (This)->lpVtbl->SetPartName(This,partUri)
/*** IXpsOMDocumentSequence methods ***/
#define IXpsOMDocumentSequence_GetOwner(This,package) (This)->lpVtbl->GetOwner(This,package)
#define IXpsOMDocumentSequence_GetDocuments(This,documents) (This)->lpVtbl->GetDocuments(This,documents)
#define IXpsOMDocumentSequence_GetPrintTicketResource(This,printTicketResource) (This)->lpVtbl->GetPrintTicketResource(This,printTicketResource)
#define IXpsOMDocumentSequence_SetPrintTicketResource(This,printTicketResource) (This)->lpVtbl->SetPrintTicketResource(This,printTicketResource)
#else
/*** IUnknown methods ***/
static __WIDL_INLINE HRESULT IXpsOMDocumentSequence_QueryInterface(IXpsOMDocumentSequence* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IXpsOMDocumentSequence_AddRef(IXpsOMDocumentSequence* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IXpsOMDocumentSequence_Release(IXpsOMDocumentSequence* This) {
    return This->lpVtbl->Release(This);
}
/*** IXpsOMPart methods ***/
static __WIDL_INLINE HRESULT IXpsOMDocumentSequence_GetPartName(IXpsOMDocumentSequence* This,IOpcPartUri **partUri) {
    return This->lpVtbl->GetPartName(This,partUri);
}
static __WIDL_INLINE HRESULT IXpsOMDocumentSequence_SetPartName(IXpsOMDocumentSequence* This,IOpcPartUri *partUri) {
    return This->lpVtbl->SetPartName(This,partUri);
}
/*** IXpsOMDocumentSequence methods ***/
static __WIDL_INLINE HRESULT IXpsOMDocumentSequence_GetOwner(IXpsOMDocumentSequence* This,IXpsOMPackage **package) {
    return This->lpVtbl->GetOwner(This,package);
}
static __WIDL_INLINE HRESULT IXpsOMDocumentSequence_GetDocuments(IXpsOMDocumentSequence* This,IXpsOMDocumentCollection **documents) {
    return This->lpVtbl->GetDocuments(This,documents);
}
static __WIDL_INLINE HRESULT IXpsOMDocumentSequence_GetPrintTicketResource(IXpsOMDocumentSequence* This,IXpsOMPrintTicketResource **printTicketResource) {
    return This->lpVtbl->GetPrintTicketResource(This,printTicketResource);
}
static __WIDL_INLINE HRESULT IXpsOMDocumentSequence_SetPrintTicketResource(IXpsOMDocumentSequence* This,IXpsOMPrintTicketResource *printTicketResource) {
    return This->lpVtbl->SetPrintTicketResource(This,printTicketResource);
}
#endif
#endif

#endif


#endif  /* __IXpsOMDocumentSequence_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IXpsOMCoreProperties interface
 */
#ifndef __IXpsOMCoreProperties_INTERFACE_DEFINED__
#define __IXpsOMCoreProperties_INTERFACE_DEFINED__

DEFINE_GUID(IID_IXpsOMCoreProperties, 0x3340fe8f, 0x4027, 0x4aa1, 0x8f,0x5f, 0xd3,0x5a,0xe4,0x5f,0xe5,0x97);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("3340fe8f-4027-4aa1-8f5f-d35ae45fe597")
IXpsOMCoreProperties : public IXpsOMPart
{
    virtual HRESULT STDMETHODCALLTYPE GetOwner(
        IXpsOMPackage **package) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetCategory(
        LPWSTR *category) = 0;

    virtual HRESULT STDMETHODCALLTYPE SetCategory(
        LPCWSTR category) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetContentStatus(
        LPWSTR *contentStatus) = 0;

    virtual HRESULT STDMETHODCALLTYPE SetContentStatus(
        LPCWSTR contentStatus) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetContentType(
        LPWSTR *contentType) = 0;

    virtual HRESULT STDMETHODCALLTYPE SetContentType(
        LPCWSTR contentType) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetCreated(
        SYSTEMTIME *created) = 0;

    virtual HRESULT STDMETHODCALLTYPE SetCreated(
        const SYSTEMTIME *created) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetCreator(
        LPWSTR *creator) = 0;

    virtual HRESULT STDMETHODCALLTYPE SetCreator(
        LPCWSTR creator) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetDescription(
        LPWSTR *description) = 0;

    virtual HRESULT STDMETHODCALLTYPE SetDescription(
        LPCWSTR description) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetIdentifier(
        LPWSTR *identifier) = 0;

    virtual HRESULT STDMETHODCALLTYPE SetIdentifier(
        LPCWSTR identifier) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetKeywords(
        LPWSTR *keywords) = 0;

    virtual HRESULT STDMETHODCALLTYPE SetKeywords(
        LPCWSTR keywords) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetLanguage(
        LPWSTR *language) = 0;

    virtual HRESULT STDMETHODCALLTYPE SetLanguage(
        LPCWSTR language) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetLastModifiedBy(
        LPWSTR *lastModifiedBy) = 0;

    virtual HRESULT STDMETHODCALLTYPE SetLastModifiedBy(
        LPCWSTR lastModifiedBy) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetLastPrinted(
        SYSTEMTIME *lastPrinted) = 0;

    virtual HRESULT STDMETHODCALLTYPE SetLastPrinted(
        const SYSTEMTIME *lastPrinted) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetModified(
        SYSTEMTIME *modified) = 0;

    virtual HRESULT STDMETHODCALLTYPE SetModified(
        const SYSTEMTIME *modified) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetRevision(
        LPWSTR *revision) = 0;

    virtual HRESULT STDMETHODCALLTYPE SetRevision(
        LPCWSTR revision) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetSubject(
        LPWSTR *subject) = 0;

    virtual HRESULT STDMETHODCALLTYPE SetSubject(
        LPCWSTR subject) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetTitle(
        LPWSTR *title) = 0;

    virtual HRESULT STDMETHODCALLTYPE SetTitle(
        LPCWSTR title) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetVersion(
        LPWSTR *version) = 0;

    virtual HRESULT STDMETHODCALLTYPE SetVersion(
        LPCWSTR version) = 0;

    virtual HRESULT STDMETHODCALLTYPE Clone(
        IXpsOMCoreProperties **coreProperties) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IXpsOMCoreProperties, 0x3340fe8f, 0x4027, 0x4aa1, 0x8f,0x5f, 0xd3,0x5a,0xe4,0x5f,0xe5,0x97)
#endif
#else
typedef struct IXpsOMCorePropertiesVtbl {
    BEGIN_INTERFACE

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

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

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

    /*** IXpsOMPart methods ***/
    HRESULT (STDMETHODCALLTYPE *GetPartName)(
        IXpsOMCoreProperties *This,
        IOpcPartUri **partUri);

    HRESULT (STDMETHODCALLTYPE *SetPartName)(
        IXpsOMCoreProperties *This,
        IOpcPartUri *partUri);

    /*** IXpsOMCoreProperties methods ***/
    HRESULT (STDMETHODCALLTYPE *GetOwner)(
        IXpsOMCoreProperties *This,
        IXpsOMPackage **package);

    HRESULT (STDMETHODCALLTYPE *GetCategory)(
        IXpsOMCoreProperties *This,
        LPWSTR *category);

    HRESULT (STDMETHODCALLTYPE *SetCategory)(
        IXpsOMCoreProperties *This,
        LPCWSTR category);

    HRESULT (STDMETHODCALLTYPE *GetContentStatus)(
        IXpsOMCoreProperties *This,
        LPWSTR *contentStatus);

    HRESULT (STDMETHODCALLTYPE *SetContentStatus)(
        IXpsOMCoreProperties *This,
        LPCWSTR contentStatus);

    HRESULT (STDMETHODCALLTYPE *GetContentType)(
        IXpsOMCoreProperties *This,
        LPWSTR *contentType);

    HRESULT (STDMETHODCALLTYPE *SetContentType)(
        IXpsOMCoreProperties *This,
        LPCWSTR contentType);

    HRESULT (STDMETHODCALLTYPE *GetCreated)(
        IXpsOMCoreProperties *This,
        SYSTEMTIME *created);

    HRESULT (STDMETHODCALLTYPE *SetCreated)(
        IXpsOMCoreProperties *This,
        const SYSTEMTIME *created);

    HRESULT (STDMETHODCALLTYPE *GetCreator)(
        IXpsOMCoreProperties *This,
        LPWSTR *creator);

    HRESULT (STDMETHODCALLTYPE *SetCreator)(
        IXpsOMCoreProperties *This,
        LPCWSTR creator);

    HRESULT (STDMETHODCALLTYPE *GetDescription)(
        IXpsOMCoreProperties *This,
        LPWSTR *description);

    HRESULT (STDMETHODCALLTYPE *SetDescription)(
        IXpsOMCoreProperties *This,
        LPCWSTR description);

    HRESULT (STDMETHODCALLTYPE *GetIdentifier)(
        IXpsOMCoreProperties *This,
        LPWSTR *identifier);

    HRESULT (STDMETHODCALLTYPE *SetIdentifier)(
        IXpsOMCoreProperties *This,
        LPCWSTR identifier);

    HRESULT (STDMETHODCALLTYPE *GetKeywords)(
        IXpsOMCoreProperties *This,
        LPWSTR *keywords);

    HRESULT (STDMETHODCALLTYPE *SetKeywords)(
        IXpsOMCoreProperties *This,
        LPCWSTR keywords);

    HRESULT (STDMETHODCALLTYPE *GetLanguage)(
        IXpsOMCoreProperties *This,
        LPWSTR *language);

    HRESULT (STDMETHODCALLTYPE *SetLanguage)(
        IXpsOMCoreProperties *This,
        LPCWSTR language);

    HRESULT (STDMETHODCALLTYPE *GetLastModifiedBy)(
        IXpsOMCoreProperties *This,
        LPWSTR *lastModifiedBy);

    HRESULT (STDMETHODCALLTYPE *SetLastModifiedBy)(
        IXpsOMCoreProperties *This,
        LPCWSTR lastModifiedBy);

    HRESULT (STDMETHODCALLTYPE *GetLastPrinted)(
        IXpsOMCoreProperties *This,
        SYSTEMTIME *lastPrinted);

    HRESULT (STDMETHODCALLTYPE *SetLastPrinted)(
        IXpsOMCoreProperties *This,
        const SYSTEMTIME *lastPrinted);

    HRESULT (STDMETHODCALLTYPE *GetModified)(
        IXpsOMCoreProperties *This,
        SYSTEMTIME *modified);

    HRESULT (STDMETHODCALLTYPE *SetModified)(
        IXpsOMCoreProperties *This,
        const SYSTEMTIME *modified);

    HRESULT (STDMETHODCALLTYPE *GetRevision)(
        IXpsOMCoreProperties *This,
        LPWSTR *revision);

    HRESULT (STDMETHODCALLTYPE *SetRevision)(
        IXpsOMCoreProperties *This,
        LPCWSTR revision);

    HRESULT (STDMETHODCALLTYPE *GetSubject)(
        IXpsOMCoreProperties *This,
        LPWSTR *subject);

    HRESULT (STDMETHODCALLTYPE *SetSubject)(
        IXpsOMCoreProperties *This,
        LPCWSTR subject);

    HRESULT (STDMETHODCALLTYPE *GetTitle)(
        IXpsOMCoreProperties *This,
        LPWSTR *title);

    HRESULT (STDMETHODCALLTYPE *SetTitle)(
        IXpsOMCoreProperties *This,
        LPCWSTR title);

    HRESULT (STDMETHODCALLTYPE *GetVersion)(
        IXpsOMCoreProperties *This,
        LPWSTR *version);

    HRESULT (STDMETHODCALLTYPE *SetVersion)(
        IXpsOMCoreProperties *This,
        LPCWSTR version);

    HRESULT (STDMETHODCALLTYPE *Clone)(
        IXpsOMCoreProperties *This,
        IXpsOMCoreProperties **coreProperties);

    END_INTERFACE
} IXpsOMCorePropertiesVtbl;

interface IXpsOMCoreProperties {
    CONST_VTBL IXpsOMCorePropertiesVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IXpsOMCoreProperties_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IXpsOMCoreProperties_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IXpsOMCoreProperties_Release(This) (This)->lpVtbl->Release(This)
/*** IXpsOMPart methods ***/
#define IXpsOMCoreProperties_GetPartName(This,partUri) (This)->lpVtbl->GetPartName(This,partUri)
#define IXpsOMCoreProperties_SetPartName(This,partUri) (This)->lpVtbl->SetPartName(This,partUri)
/*** IXpsOMCoreProperties methods ***/
#define IXpsOMCoreProperties_GetOwner(This,package) (This)->lpVtbl->GetOwner(This,package)
#define IXpsOMCoreProperties_GetCategory(This,category) (This)->lpVtbl->GetCategory(This,category)
#define IXpsOMCoreProperties_SetCategory(This,category) (This)->lpVtbl->SetCategory(This,category)
#define IXpsOMCoreProperties_GetContentStatus(This,contentStatus) (This)->lpVtbl->GetContentStatus(This,contentStatus)
#define IXpsOMCoreProperties_SetContentStatus(This,contentStatus) (This)->lpVtbl->SetContentStatus(This,contentStatus)
#define IXpsOMCoreProperties_GetContentType(This,contentType) (This)->lpVtbl->GetContentType(This,contentType)
#define IXpsOMCoreProperties_SetContentType(This,contentType) (This)->lpVtbl->SetContentType(This,contentType)
#define IXpsOMCoreProperties_GetCreated(This,created) (This)->lpVtbl->GetCreated(This,created)
#define IXpsOMCoreProperties_SetCreated(This,created) (This)->lpVtbl->SetCreated(This,created)
#define IXpsOMCoreProperties_GetCreator(This,creator) (This)->lpVtbl->GetCreator(This,creator)
#define IXpsOMCoreProperties_SetCreator(This,creator) (This)->lpVtbl->SetCreator(This,creator)
#define IXpsOMCoreProperties_GetDescription(This,description) (This)->lpVtbl->GetDescription(This,description)
#define IXpsOMCoreProperties_SetDescription(This,description) (This)->lpVtbl->SetDescription(This,description)
#define IXpsOMCoreProperties_GetIdentifier(This,identifier) (This)->lpVtbl->GetIdentifier(This,identifier)
#define IXpsOMCoreProperties_SetIdentifier(This,identifier) (This)->lpVtbl->SetIdentifier(This,identifier)
#define IXpsOMCoreProperties_GetKeywords(This,keywords) (This)->lpVtbl->GetKeywords(This,keywords)
#define IXpsOMCoreProperties_SetKeywords(This,keywords) (This)->lpVtbl->SetKeywords(This,keywords)
#define IXpsOMCoreProperties_GetLanguage(This,language) (This)->lpVtbl->GetLanguage(This,language)
#define IXpsOMCoreProperties_SetLanguage(This,language) (This)->lpVtbl->SetLanguage(This,language)
#define IXpsOMCoreProperties_GetLastModifiedBy(This,lastModifiedBy) (This)->lpVtbl->GetLastModifiedBy(This,lastModifiedBy)
#define IXpsOMCoreProperties_SetLastModifiedBy(This,lastModifiedBy) (This)->lpVtbl->SetLastModifiedBy(This,lastModifiedBy)
#define IXpsOMCoreProperties_GetLastPrinted(This,lastPrinted) (This)->lpVtbl->GetLastPrinted(This,lastPrinted)
#define IXpsOMCoreProperties_SetLastPrinted(This,lastPrinted) (This)->lpVtbl->SetLastPrinted(This,lastPrinted)
#define IXpsOMCoreProperties_GetModified(This,modified) (This)->lpVtbl->GetModified(This,modified)
#define IXpsOMCoreProperties_SetModified(This,modified) (This)->lpVtbl->SetModified(This,modified)
#define IXpsOMCoreProperties_GetRevision(This,revision) (This)->lpVtbl->GetRevision(This,revision)
#define IXpsOMCoreProperties_SetRevision(This,revision) (This)->lpVtbl->SetRevision(This,revision)
#define IXpsOMCoreProperties_GetSubject(This,subject) (This)->lpVtbl->GetSubject(This,subject)
#define IXpsOMCoreProperties_SetSubject(This,subject) (This)->lpVtbl->SetSubject(This,subject)
#define IXpsOMCoreProperties_GetTitle(This,title) (This)->lpVtbl->GetTitle(This,title)
#define IXpsOMCoreProperties_SetTitle(This,title) (This)->lpVtbl->SetTitle(This,title)
#define IXpsOMCoreProperties_GetVersion(This,version) (This)->lpVtbl->GetVersion(This,version)
#define IXpsOMCoreProperties_SetVersion(This,version) (This)->lpVtbl->SetVersion(This,version)
#define IXpsOMCoreProperties_Clone(This,coreProperties) (This)->lpVtbl->Clone(This,coreProperties)
#else
/*** IUnknown methods ***/
static __WIDL_INLINE HRESULT IXpsOMCoreProperties_QueryInterface(IXpsOMCoreProperties* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IXpsOMCoreProperties_AddRef(IXpsOMCoreProperties* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IXpsOMCoreProperties_Release(IXpsOMCoreProperties* This) {
    return This->lpVtbl->Release(This);
}
/*** IXpsOMPart methods ***/
static __WIDL_INLINE HRESULT IXpsOMCoreProperties_GetPartName(IXpsOMCoreProperties* This,IOpcPartUri **partUri) {
    return This->lpVtbl->GetPartName(This,partUri);
}
static __WIDL_INLINE HRESULT IXpsOMCoreProperties_SetPartName(IXpsOMCoreProperties* This,IOpcPartUri *partUri) {
    return This->lpVtbl->SetPartName(This,partUri);
}
/*** IXpsOMCoreProperties methods ***/
static __WIDL_INLINE HRESULT IXpsOMCoreProperties_GetOwner(IXpsOMCoreProperties* This,IXpsOMPackage **package) {
    return This->lpVtbl->GetOwner(This,package);
}
static __WIDL_INLINE HRESULT IXpsOMCoreProperties_GetCategory(IXpsOMCoreProperties* This,LPWSTR *category) {
    return This->lpVtbl->GetCategory(This,category);
}
static __WIDL_INLINE HRESULT IXpsOMCoreProperties_SetCategory(IXpsOMCoreProperties* This,LPCWSTR category) {
    return This->lpVtbl->SetCategory(This,category);
}
static __WIDL_INLINE HRESULT IXpsOMCoreProperties_GetContentStatus(IXpsOMCoreProperties* This,LPWSTR *contentStatus) {
    return This->lpVtbl->GetContentStatus(This,contentStatus);
}
static __WIDL_INLINE HRESULT IXpsOMCoreProperties_SetContentStatus(IXpsOMCoreProperties* This,LPCWSTR contentStatus) {
    return This->lpVtbl->SetContentStatus(This,contentStatus);
}
static __WIDL_INLINE HRESULT IXpsOMCoreProperties_GetContentType(IXpsOMCoreProperties* This,LPWSTR *contentType) {
    return This->lpVtbl->GetContentType(This,contentType);
}
static __WIDL_INLINE HRESULT IXpsOMCoreProperties_SetContentType(IXpsOMCoreProperties* This,LPCWSTR contentType) {
    return This->lpVtbl->SetContentType(This,contentType);
}
static __WIDL_INLINE HRESULT IXpsOMCoreProperties_GetCreated(IXpsOMCoreProperties* This,SYSTEMTIME *created) {
    return This->lpVtbl->GetCreated(This,created);
}
static __WIDL_INLINE HRESULT IXpsOMCoreProperties_SetCreated(IXpsOMCoreProperties* This,const SYSTEMTIME *created) {
    return This->lpVtbl->SetCreated(This,created);
}
static __WIDL_INLINE HRESULT IXpsOMCoreProperties_GetCreator(IXpsOMCoreProperties* This,LPWSTR *creator) {
    return This->lpVtbl->GetCreator(This,creator);
}
static __WIDL_INLINE HRESULT IXpsOMCoreProperties_SetCreator(IXpsOMCoreProperties* This,LPCWSTR creator) {
    return This->lpVtbl->SetCreator(This,creator);
}
static __WIDL_INLINE HRESULT IXpsOMCoreProperties_GetDescription(IXpsOMCoreProperties* This,LPWSTR *description) {
    return This->lpVtbl->GetDescription(This,description);
}
static __WIDL_INLINE HRESULT IXpsOMCoreProperties_SetDescription(IXpsOMCoreProperties* This,LPCWSTR description) {
    return This->lpVtbl->SetDescription(This,description);
}
static __WIDL_INLINE HRESULT IXpsOMCoreProperties_GetIdentifier(IXpsOMCoreProperties* This,LPWSTR *identifier) {
    return This->lpVtbl->GetIdentifier(This,identifier);
}
static __WIDL_INLINE HRESULT IXpsOMCoreProperties_SetIdentifier(IXpsOMCoreProperties* This,LPCWSTR identifier) {
    return This->lpVtbl->SetIdentifier(This,identifier);
}
static __WIDL_INLINE HRESULT IXpsOMCoreProperties_GetKeywords(IXpsOMCoreProperties* This,LPWSTR *keywords) {
    return This->lpVtbl->GetKeywords(This,keywords);
}
static __WIDL_INLINE HRESULT IXpsOMCoreProperties_SetKeywords(IXpsOMCoreProperties* This,LPCWSTR keywords) {
    return This->lpVtbl->SetKeywords(This,keywords);
}
static __WIDL_INLINE HRESULT IXpsOMCoreProperties_GetLanguage(IXpsOMCoreProperties* This,LPWSTR *language) {
    return This->lpVtbl->GetLanguage(This,language);
}
static __WIDL_INLINE HRESULT IXpsOMCoreProperties_SetLanguage(IXpsOMCoreProperties* This,LPCWSTR language) {
    return This->lpVtbl->SetLanguage(This,language);
}
static __WIDL_INLINE HRESULT IXpsOMCoreProperties_GetLastModifiedBy(IXpsOMCoreProperties* This,LPWSTR *lastModifiedBy) {
    return This->lpVtbl->GetLastModifiedBy(This,lastModifiedBy);
}
static __WIDL_INLINE HRESULT IXpsOMCoreProperties_SetLastModifiedBy(IXpsOMCoreProperties* This,LPCWSTR lastModifiedBy) {
    return This->lpVtbl->SetLastModifiedBy(This,lastModifiedBy);
}
static __WIDL_INLINE HRESULT IXpsOMCoreProperties_GetLastPrinted(IXpsOMCoreProperties* This,SYSTEMTIME *lastPrinted) {
    return This->lpVtbl->GetLastPrinted(This,lastPrinted);
}
static __WIDL_INLINE HRESULT IXpsOMCoreProperties_SetLastPrinted(IXpsOMCoreProperties* This,const SYSTEMTIME *lastPrinted) {
    return This->lpVtbl->SetLastPrinted(This,lastPrinted);
}
static __WIDL_INLINE HRESULT IXpsOMCoreProperties_GetModified(IXpsOMCoreProperties* This,SYSTEMTIME *modified) {
    return This->lpVtbl->GetModified(This,modified);
}
static __WIDL_INLINE HRESULT IXpsOMCoreProperties_SetModified(IXpsOMCoreProperties* This,const SYSTEMTIME *modified) {
    return This->lpVtbl->SetModified(This,modified);
}
static __WIDL_INLINE HRESULT IXpsOMCoreProperties_GetRevision(IXpsOMCoreProperties* This,LPWSTR *revision) {
    return This->lpVtbl->GetRevision(This,revision);
}
static __WIDL_INLINE HRESULT IXpsOMCoreProperties_SetRevision(IXpsOMCoreProperties* This,LPCWSTR revision) {
    return This->lpVtbl->SetRevision(This,revision);
}
static __WIDL_INLINE HRESULT IXpsOMCoreProperties_GetSubject(IXpsOMCoreProperties* This,LPWSTR *subject) {
    return This->lpVtbl->GetSubject(This,subject);
}
static __WIDL_INLINE HRESULT IXpsOMCoreProperties_SetSubject(IXpsOMCoreProperties* This,LPCWSTR subject) {
    return This->lpVtbl->SetSubject(This,subject);
}
static __WIDL_INLINE HRESULT IXpsOMCoreProperties_GetTitle(IXpsOMCoreProperties* This,LPWSTR *title) {
    return This->lpVtbl->GetTitle(This,title);
}
static __WIDL_INLINE HRESULT IXpsOMCoreProperties_SetTitle(IXpsOMCoreProperties* This,LPCWSTR title) {
    return This->lpVtbl->SetTitle(This,title);
}
static __WIDL_INLINE HRESULT IXpsOMCoreProperties_GetVersion(IXpsOMCoreProperties* This,LPWSTR *version) {
    return This->lpVtbl->GetVersion(This,version);
}
static __WIDL_INLINE HRESULT IXpsOMCoreProperties_SetVersion(IXpsOMCoreProperties* This,LPCWSTR version) {
    return This->lpVtbl->SetVersion(This,version);
}
static __WIDL_INLINE HRESULT IXpsOMCoreProperties_Clone(IXpsOMCoreProperties* This,IXpsOMCoreProperties **coreProperties) {
    return This->lpVtbl->Clone(This,coreProperties);
}
#endif
#endif

#endif


#endif  /* __IXpsOMCoreProperties_INTERFACE_DEFINED__ */

#endif
#if WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_DESKTOP)
/*****************************************************************************
 * IXpsOMThumbnailGenerator interface
 */
#ifndef __IXpsOMThumbnailGenerator_INTERFACE_DEFINED__
#define __IXpsOMThumbnailGenerator_INTERFACE_DEFINED__

DEFINE_GUID(IID_IXpsOMThumbnailGenerator, 0x15b873d5, 0x1971, 0x41e8, 0x83,0xa3, 0x65,0x78,0x40,0x30,0x64,0xc7);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("15b873d5-1971-41e8-83a3-6578403064c7")
IXpsOMThumbnailGenerator : public IUnknown
{
    virtual HRESULT STDMETHODCALLTYPE GenerateThumbnail(
        IXpsOMPage *page,
        XPS_IMAGE_TYPE thumbnailType,
        XPS_THUMBNAIL_SIZE thumbnailSize,
        IOpcPartUri *imageResourcePartName,
        IXpsOMImageResource **imageResource) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IXpsOMThumbnailGenerator, 0x15b873d5, 0x1971, 0x41e8, 0x83,0xa3, 0x65,0x78,0x40,0x30,0x64,0xc7)
#endif
#else
typedef struct IXpsOMThumbnailGeneratorVtbl {
    BEGIN_INTERFACE

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

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

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

    /*** IXpsOMThumbnailGenerator methods ***/
    HRESULT (STDMETHODCALLTYPE *GenerateThumbnail)(
        IXpsOMThumbnailGenerator *This,
        IXpsOMPage *page,
        XPS_IMAGE_TYPE thumbnailType,
        XPS_THUMBNAIL_SIZE thumbnailSize,
        IOpcPartUri *imageResourcePartName,
        IXpsOMImageResource **imageResource);

    END_INTERFACE
} IXpsOMThumbnailGeneratorVtbl;

interface IXpsOMThumbnailGenerator {
    CONST_VTBL IXpsOMThumbnailGeneratorVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IXpsOMThumbnailGenerator_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IXpsOMThumbnailGenerator_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IXpsOMThumbnailGenerator_Release(This) (This)->lpVtbl->Release(This)
/*** IXpsOMThumbnailGenerator methods ***/
#define IXpsOMThumbnailGenerator_GenerateThumbnail(This,page,thumbnailType,thumbnailSize,imageResourcePartName,imageResource) (This)->lpVtbl->GenerateThumbnail(This,page,thumbnailType,thumbnailSize,imageResourcePartName,imageResource)
#else
/*** IUnknown methods ***/
static __WIDL_INLINE HRESULT IXpsOMThumbnailGenerator_QueryInterface(IXpsOMThumbnailGenerator* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IXpsOMThumbnailGenerator_AddRef(IXpsOMThumbnailGenerator* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IXpsOMThumbnailGenerator_Release(IXpsOMThumbnailGenerator* This) {
    return This->lpVtbl->Release(This);
}
/*** IXpsOMThumbnailGenerator methods ***/
static __WIDL_INLINE HRESULT IXpsOMThumbnailGenerator_GenerateThumbnail(IXpsOMThumbnailGenerator* This,IXpsOMPage *page,XPS_IMAGE_TYPE thumbnailType,XPS_THUMBNAIL_SIZE thumbnailSize,IOpcPartUri *imageResourcePartName,IXpsOMImageResource **imageResource) {
    return This->lpVtbl->GenerateThumbnail(This,page,thumbnailType,thumbnailSize,imageResourcePartName,imageResource);
}
#endif
#endif

#endif


#endif  /* __IXpsOMThumbnailGenerator_INTERFACE_DEFINED__ */

#endif
#ifndef __MSXPS_LIBRARY_DEFINED__
#define __MSXPS_LIBRARY_DEFINED__

DEFINE_GUID(LIBID_MSXPS, 0xb47491a0, 0xcf33, 0x4fe4, 0x9a,0x48, 0xb0,0xac,0xda,0xe2,0x07,0xe8);

#if WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_APP)
/*****************************************************************************
 * XpsOMObjectFactory coclass
 */

DEFINE_GUID(CLSID_XpsOMObjectFactory, 0xe974d26d, 0x3d9b, 0x4d47, 0x88,0xcc, 0x38,0x72,0xf2,0xdc,0x35,0x85);

#ifdef __cplusplus
class DECLSPEC_UUID("e974d26d-3d9b-4d47-88cc-3872f2dc3585") XpsOMObjectFactory;
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(XpsOMObjectFactory, 0xe974d26d, 0x3d9b, 0x4d47, 0x88,0xcc, 0x38,0x72,0xf2,0xdc,0x35,0x85)
#endif
#endif

#endif
#if WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_DESKTOP)
/*****************************************************************************
 * XpsOMThumbnailGenerator coclass
 */

DEFINE_GUID(CLSID_XpsOMThumbnailGenerator, 0x7e4a23e2, 0xb969, 0x4761, 0xbe,0x35, 0x1a,0x8c,0xed,0x58,0xe3,0x23);

#ifdef __cplusplus
class DECLSPEC_UUID("7e4a23e2-b969-4761-be35-1a8ced58e323") XpsOMThumbnailGenerator;
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(XpsOMThumbnailGenerator, 0x7e4a23e2, 0xb969, 0x4761, 0xbe,0x35, 0x1a,0x8c,0xed,0x58,0xe3,0x23)
#endif
#endif

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


/* End additional prototypes */

#ifdef __cplusplus
}
#endif

#endif /* __xpsobjectmodel_h__ */
