using System;
using System.Runtime.CompilerServices;
using System.Runtime.InteropServices;
using System.Runtime.InteropServices.ComTypes;
using Vanara.InteropServices;
using static Vanara.PInvoke.Opc;
using static Vanara.PInvoke.UrlMon;

using XPS_POINT = System.Drawing.PointF;
using XPS_RECT = System.Drawing.RectangleF;

namespace Vanara.PInvoke
{
	/// <summary>Interfaces and supporting enums and structures for XPS programming.</summary>
	// https://docs.microsoft.com/en-us/windows/win32/printdocs/xps-programming-reference
	public static partial class XpsObjectModel
	{
		/// <summary>
		/// Defines objects that are used to paint graphical objects. Classes that derive from <c>IXpsOMBrush</c> describe how the area is painted.
		/// </summary>
		// https://docs.microsoft.com/en-us/windows/win32/api/xpsobjectmodel/nn-xpsobjectmodel-ixpsombrush
		[PInvokeData("xpsobjectmodel.h", MSDNShortId = "43cb56db-e09e-47cb-b50b-7827131659fd")]
		[ComImport, Guid("56A3F80C-EA4C-4187-A57B-A2A473B2B42B"), InterfaceType(ComInterfaceType.InterfaceIsIUnknown)]
		public interface IXpsOMBrush : IXpsOMShareable
		{
			/// <summary>Gets the <c>IUnknown</c> interface of the parent.</summary>
			/// <returns>A pointer to the <c>IUnknown</c> interface of the parent.</returns>
			// https://docs.microsoft.com/en-us/windows/win32/api/xpsobjectmodel/nf-xpsobjectmodel-ixpsomshareable-getowner HRESULT
			// GetOwner( IUnknown **owner );
			[return: MarshalAs(UnmanagedType.IUnknown)]
			new object GetOwner();

			/// <summary>Gets the object type of the interface.</summary>
			/// <returns>The XPS_OBJECT_TYPE value that describes the interface that is derived from IXpsOMShareable.</returns>
			// https://docs.microsoft.com/en-us/windows/win32/api/xpsobjectmodel/nf-xpsobjectmodel-ixpsomshareable-gettype HRESULT GetType(
			// XPS_OBJECT_TYPE *type );
			new XPS_OBJECT_TYPE GetType();

			/// <summary>Gets the opacity of the brush.</summary>
			/// <returns>The opacity value of the brush.</returns>
			/// <remarks>
			/// opacity is expressed as a value between 0.0 and 1.0; 0.0 indicates that the brush is completely transparent, 0.5 that it is
			/// 50 percent opaque, and 1.0 that it is completely opaque.
			/// </remarks>
			// https://docs.microsoft.com/en-us/windows/win32/api/xpsobjectmodel/nf-xpsobjectmodel-ixpsombrush-getopacity HRESULT
			// GetOpacity( FLOAT *opacity );
			float GetOpacity();

			/// <summary>Sets the opacity of the brush.</summary>
			/// <param name="opacity">The opacity value of the brush.</param>
			/// <remarks>
			/// <para>
			/// opacity is expressed as a value between 0.0 and 1.0; 0.0 indicates that the brush is completely transparent, 0.5 that it is
			/// 50 percent opaque, and 1.0 that it is completely opaque.
			/// </para>
			/// <para>If opacity is less than 0.0 or greater than 1.0, the method returns an error.</para>
			/// </remarks>
			// https://docs.microsoft.com/en-us/windows/win32/api/xpsobjectmodel/nf-xpsobjectmodel-ixpsombrush-setopacity HRESULT
			// SetOpacity( FLOAT opacity );
			void SetOpacity([In] float opacity);
		}

		/// <summary>A group of visual elements and related properties.</summary>
		/// <remarks>The code example that follows illustrates how to create an instance of this interface.</remarks>
		// https://docs.microsoft.com/en-us/windows/win32/api/xpsobjectmodel/nn-xpsobjectmodel-ixpsomcanvas
		[PInvokeData("xpsobjectmodel.h", MSDNShortId = "3cb0e1b3-88a8-4724-a3c5-0df416294e62")]
		[ComImport, Guid("221D1452-331E-47C6-87E9-6CCEFB9B5BA3"), InterfaceType(ComInterfaceType.InterfaceIsIUnknown)]
		public interface IXpsOMCanvas : IXpsOMVisual
		{
			/// <summary>Gets the <c>IUnknown</c> interface of the parent.</summary>
			/// <returns>A pointer to the <c>IUnknown</c> interface of the parent.</returns>
			// https://docs.microsoft.com/en-us/windows/win32/api/xpsobjectmodel/nf-xpsobjectmodel-ixpsomshareable-getowner HRESULT
			// GetOwner( IUnknown **owner );
			[return: MarshalAs(UnmanagedType.IUnknown)]
			new object GetOwner();

			/// <summary>Gets the object type of the interface.</summary>
			/// <returns>The XPS_OBJECT_TYPE value that describes the interface that is derived from IXpsOMShareable.</returns>
			// https://docs.microsoft.com/en-us/windows/win32/api/xpsobjectmodel/nf-xpsobjectmodel-ixpsomshareable-gettype HRESULT GetType(
			// XPS_OBJECT_TYPE *type );
			new XPS_OBJECT_TYPE GetType();

			/// <summary>Gets a pointer to the IXpsOMMatrixTransform interface that contains the visual's resolved matrix transform.</summary>
			/// <returns>
			/// <para>
			/// A pointer to the IXpsOMMatrixTransform interface that contains the visual's resolved matrix transform. If a matrix transform
			/// has not been set, a <c>NULL</c> pointer is returned.
			/// </para>
			/// <para>The value that is returned in this parameter depends on which method has most recently been called to set the transform.</para>
			/// <list type="table">
			/// <listheader>
			/// <term>Most recent method called</term>
			/// <term>Object that is returned in matrixTransform</term>
			/// </listheader>
			/// <item>
			/// <term>SetTransformLocal</term>
			/// <term>The local transform that is set by SetTransformLocal.</term>
			/// </item>
			/// <item>
			/// <term>SetTransformLookup</term>
			/// <term>
			/// The shared transform that gets retrieved, with a lookup key that matches the key that is set by SetTransformLookup, from the
			/// resource directory.
			/// </term>
			/// </item>
			/// <item>
			/// <term>Neither SetTransformLocal nor SetTransformLookup has been called yet.</term>
			/// <term>NULL pointer.</term>
			/// </item>
			/// </list>
			/// </returns>
			// https://docs.microsoft.com/en-us/windows/win32/api/xpsobjectmodel/nf-xpsobjectmodel-ixpsomvisual-gettransform HRESULT
			// GetTransform( IXpsOMMatrixTransform **matrixTransform );
			[MethodImpl(MethodImplOptions.InternalCall)]
			new IXpsOMMatrixTransform GetTransform();

			/// <summary>
			/// Gets a pointer to the IXpsOMMatrixTransform interface that contains the local, unshared, resolved matrix transform for the visual.
			/// </summary>
			/// <returns>
			/// <para>
			/// A pointer to the IXpsOMMatrixTransform interface that contains the local, unshared, resolved matrix transform for the
			/// visual. If a matrix transform lookup key has not been set, or if a local matrix transform has been set, a <c>NULL</c>
			/// pointer is returned.
			/// </para>
			/// <list type="table">
			/// <listheader>
			/// <term>Most recent method called</term>
			/// <term>Object that is returned in matrixTransform</term>
			/// </listheader>
			/// <item>
			/// <term>SetTransformLocal</term>
			/// <term>The local transform that is set by SetTransformLocal.</term>
			/// </item>
			/// <item>
			/// <term>SetTransformLookup</term>
			/// <term>NULL pointer.</term>
			/// </item>
			/// <item>
			/// <term>Neither SetTransformLocal nor SetTransformLookup has been called yet.</term>
			/// <term>NULL pointer.</term>
			/// </item>
			/// </list>
			/// </returns>
			// https://docs.microsoft.com/en-us/windows/win32/api/xpsobjectmodel/nf-xpsobjectmodel-ixpsomvisual-gettransformlocal HRESULT
			// GetTransformLocal( IXpsOMMatrixTransform **matrixTransform );
			[MethodImpl(MethodImplOptions.InternalCall)]
			new IXpsOMMatrixTransform GetTransformLocal();

			/// <summary>Sets the local, unshared matrix transform.</summary>
			/// <param name="matrixTransform">
			/// A pointer to the IXpsOMMatrixTransform interface to be set as the local, unshared matrix transform. A <c>NULL</c> pointer
			/// releases the previously assigned transform.
			/// </param>
			/// <remarks>
			/// <para>
			/// After you call <c>SetTransformLocal</c>, the transform lookup key is released and GetTransformLookup returns a <c>NULL</c>
			/// pointer in the key parameter. The table that follows explains the relationship between the local and lookup values of this property.
			/// </para>
			/// <list type="table">
			/// <listheader>
			/// <term>Most recent method called</term>
			/// <term>Object that is returned in transform by GetTransform</term>
			/// <term>Object that is returned in matrixTransform by GetTransformLocal</term>
			/// <term>Object that is returned in key by GetTransformLookup</term>
			/// </listheader>
			/// <item>
			/// <term>SetTransformLocal (this method)</term>
			/// <term>The local transform that is set by SetTransformLocal.</term>
			/// <term>The local transform set by SetTransformLocal.</term>
			/// <term>NULL pointer.</term>
			/// </item>
			/// <item>
			/// <term>SetTransformLookup</term>
			/// <term>
			/// The shared transform that gets retrieved, with a lookup key that matches the key that is set by SetTransformLookup, from the
			/// resource directory.
			/// </term>
			/// <term>NULL pointer.</term>
			/// <term>The lookup key that is set by SetTransformLookup.</term>
			/// </item>
			/// <item>
			/// <term>Neither SetTransformLocal nor SetTransformLookup has been called yet.</term>
			/// <term>NULL pointer.</term>
			/// <term>NULL pointer.</term>
			/// <term>NULL pointer.</term>
			/// </item>
			/// </list>
			/// </remarks>
			// https://docs.microsoft.com/en-us/windows/win32/api/xpsobjectmodel/nf-xpsobjectmodel-ixpsomvisual-settransformlocal HRESULT
			// SetTransformLocal( IXpsOMMatrixTransform *matrixTransform );
			[MethodImpl(MethodImplOptions.InternalCall)]
			new void SetTransformLocal([In] IXpsOMMatrixTransform matrixTransform);

			/// <summary>
			/// Gets the lookup key name of the IXpsOMMatrixTransform interface in a resource dictionary that contains the resolved matrix
			/// transform for the visual.
			/// </summary>
			/// <returns>
			/// <para>
			/// The lookup key name for the IXpsOMMatrixTransform interface in a resource dictionary that contains the resolved matrix
			/// transform for the visual. If a matrix transform lookup key has not been set, or if a local matrix transform has been set, a
			/// <c>NULL</c> pointer is returned.
			/// </para>
			/// <list type="table">
			/// <listheader>
			/// <term>Most recent method called</term>
			/// <term>Object that is returned in key</term>
			/// </listheader>
			/// <item>
			/// <term>SetTransformLocal</term>
			/// <term>NULL pointer.</term>
			/// </item>
			/// <item>
			/// <term>SetTransformLookup</term>
			/// <term>The lookup key that is set by SetTransformLookup.</term>
			/// </item>
			/// <item>
			/// <term>Neither SetTransformLocal nor SetTransformLookup has been called yet.</term>
			/// <term>NULL pointer.</term>
			/// </item>
			/// </list>
			/// </returns>
			// https://docs.microsoft.com/en-us/windows/win32/api/xpsobjectmodel/nf-xpsobjectmodel-ixpsomvisual-gettransformlookup HRESULT
			// GetTransformLookup( LPWSTR *key );
			[MethodImpl(MethodImplOptions.InternalCall)]
			new SafeCoTaskMemString GetTransformLookup();

			/// <summary>Sets the lookup key name of a shared matrix transform in a resource dictionary.</summary>
			/// <param name="key">The lookup key name of the matrix transform in the dictionary.</param>
			/// <remarks>
			/// <para>
			/// After you call <c>SetTransformLookup</c>, the local transform is released and GetTransformLocal returns a <c>NULL</c>
			/// pointer in the matrixTransform parameter. The table that follows explains the relationship between the local and lookup
			/// values of this property.
			/// </para>
			/// <list type="table">
			/// <listheader>
			/// <term>Most recent method called</term>
			/// <term>Object that is returned in transform by GetTransform</term>
			/// <term>Object that is returned in matrixTransform by GetTransformLocal</term>
			/// <term>Object that is returned in key by GetTransformLookup</term>
			/// </listheader>
			/// <item>
			/// <term>SetTransformLocal</term>
			/// <term>The local transform that is set by SetTransformLocal.</term>
			/// <term>The local transform that is set by SetTransformLocal.</term>
			/// <term>NULL pointer.</term>
			/// </item>
			/// <item>
			/// <term>SetTransformLookup (this method)</term>
			/// <term>
			/// The shared transform that gets retrieved—with a lookup key that matches the key that is set by SetTransformLookup—from the
			/// resource directory.
			/// </term>
			/// <term>NULL pointer.</term>
			/// <term>The lookup key that is set by SetTransformLookup.</term>
			/// </item>
			/// <item>
			/// <term>Neither SetTransformLocal nor SetTransformLookup has been called yet.</term>
			/// <term>NULL pointer.</term>
			/// <term>NULL pointer.</term>
			/// <term>NULL pointer.</term>
			/// </item>
			/// </list>
			/// </remarks>
			// https://docs.microsoft.com/en-us/windows/win32/api/xpsobjectmodel/nf-xpsobjectmodel-ixpsomvisual-settransformlookup HRESULT
			// SetTransformLookup( LPCWSTR key );
			[MethodImpl(MethodImplOptions.InternalCall)]
			new void SetTransformLookup([In, MarshalAs(UnmanagedType.LPWStr)] string key);

			/// <summary>
			/// Gets a pointer to the IXpsOMGeometry interface that contains the resolved geometry of the visual's clipping region.
			/// </summary>
			/// <returns>
			/// <para>
			/// A pointer to the IXpsOMGeometry interface that contains the resolved geometry of the visual's clipping region. If the clip
			/// geometry has not been set, a <c>NULL</c> pointer is returned.
			/// </para>
			/// <para>The value that is returned in this parameter depends on which method has most recently been called to set the geometry.</para>
			/// <list type="table">
			/// <listheader>
			/// <term>Most recent method called</term>
			/// <term>Object that is returned in clipGeometry</term>
			/// </listheader>
			/// <item>
			/// <term>SetClipGeometryLocal</term>
			/// <term>The local clip geometry that is set by SetClipGeometryLocal.</term>
			/// </item>
			/// <item>
			/// <term>SetClipGeometryLookup</term>
			/// <term>
			/// The shared clip geometry that gets retrieved, with a lookup key that matches the key that is set by SetClipGeometryLookup,
			/// from the resource directory.
			/// </term>
			/// </item>
			/// <item>
			/// <term>Neither SetClipGeometryLocal nor SetClipGeometryLookup has been called yet.</term>
			/// <term>NULL pointer.</term>
			/// </item>
			/// </list>
			/// </returns>
			// https://docs.microsoft.com/en-us/windows/win32/api/xpsobjectmodel/nf-xpsobjectmodel-ixpsomvisual-getclipgeometry HRESULT
			// GetClipGeometry( IXpsOMGeometry **clipGeometry );
			[MethodImpl(MethodImplOptions.InternalCall)]
			new IXpsOMGeometry GetClipGeometry();

			/// <summary>
			/// Gets a pointer to the IXpsOMGeometry interface that contains the local, unshared geometry of the visual's clipping region.
			/// </summary>
			/// <returns>
			/// <para>
			/// A pointer to the IXpsOMGeometry interface that contains the local, unshared geometry of the visual's clipping region. If a
			/// clip geometry lookup key has been set, or if a local clip geometry has not been set, a <c>NULL</c> pointer is returned.
			/// </para>
			/// <list type="table">
			/// <listheader>
			/// <term>Most recent method called</term>
			/// <term>Object that is returned in clipGeometry</term>
			/// </listheader>
			/// <item>
			/// <term>SetClipGeometryLocal</term>
			/// <term>The local clip geometry that is set by SetClipGeometryLocal.</term>
			/// </item>
			/// <item>
			/// <term>SetClipGeometryLookup</term>
			/// <term>NULL pointer.</term>
			/// </item>
			/// <item>
			/// <term>Neither SetClipGeometryLocal nor SetClipGeometryLookup has been called yet.</term>
			/// <term>NULL pointer.</term>
			/// </item>
			/// </list>
			/// </returns>
			// https://docs.microsoft.com/en-us/windows/win32/api/xpsobjectmodel/nf-xpsobjectmodel-ixpsomvisual-getclipgeometrylocal HRESULT
			// GetClipGeometryLocal( IXpsOMGeometry **clipGeometry );
			[MethodImpl(MethodImplOptions.InternalCall)]
			new IXpsOMGeometry GetClipGeometryLocal();

			/// <summary>Sets the local, unshared clipping region for the visual.</summary>
			/// <param name="clipGeometry">
			/// A pointer to the IXpsOMGeometry interface to be set as the local, unshared clipping region for the visual. A <c>NULL</c>
			/// pointer releases the previously assigned geometry interface.
			/// </param>
			/// <remarks>
			/// <para>
			/// After you call <c>SetClipGeometryLocal</c>, the clip geometry lookup key is released and GetClipGeometryLookup returns a
			/// <c>NULL</c> pointer in the key parameter. The table that follows explains the relationship between the local and lookup
			/// values of this property.
			/// </para>
			/// <list type="table">
			/// <listheader>
			/// <term>Most recent method called</term>
			/// <term>Object that is returned in clipGeometry by GetClipGeometry</term>
			/// <term>Object that is returned in clipGeometry by GetClipGeometryLocal</term>
			/// <term>String that is returned in key by GetClipGeometryLookup</term>
			/// </listheader>
			/// <item>
			/// <term>SetClipGeometryLocal (this method)</term>
			/// <term>The local clip geometry that is set by SetClipGeometryLocal.</term>
			/// <term>The local clip geometry that is set by SetClipGeometryLocal.</term>
			/// <term>NULL pointer.</term>
			/// </item>
			/// <item>
			/// <term>SetClipGeometryLookup</term>
			/// <term>
			/// The shared clip geometry that gets retrieved, with a lookup key that matches the key that is set by SetClipGeometryLookup,
			/// from the resource directory.
			/// </term>
			/// <term>NULL pointer.</term>
			/// <term>The lookup key that is set by SetClipGeometryLookup.</term>
			/// </item>
			/// <item>
			/// <term>Neither SetClipGeometryLookup nor SetClipGeometryLocal has been called yet.</term>
			/// <term>NULL pointer.</term>
			/// <term>NULL pointer.</term>
			/// <term>NULL pointer.</term>
			/// </item>
			/// </list>
			/// </remarks>
			// https://docs.microsoft.com/en-us/windows/win32/api/xpsobjectmodel/nf-xpsobjectmodel-ixpsomvisual-setclipgeometrylocal HRESULT
			// SetClipGeometryLocal( IXpsOMGeometry *clipGeometry );
			[MethodImpl(MethodImplOptions.InternalCall)]
			new void SetClipGeometryLocal([In] IXpsOMGeometry clipGeometry);

			/// <summary>
			/// Gets the lookup key for the IXpsOMGeometry interface in a resource dictionary that contains the visual's clipping region.
			/// </summary>
			/// <returns>
			/// <para>
			/// The lookup key for the IXpsOMGeometry interface in a resource dictionary that contains the visual's clipping region. If a
			/// lookup key for the clip geometry has not been set, or if a local clip geometry has been set, a <c>NULL</c> pointer is returned.
			/// </para>
			/// <list type="table">
			/// <listheader>
			/// <term>Most recent method called</term>
			/// <term>Lookup key string that is returned in key</term>
			/// </listheader>
			/// <item>
			/// <term>SetClipGeometryLocal</term>
			/// <term>NULL pointer.</term>
			/// </item>
			/// <item>
			/// <term>SetClipGeometryLookup</term>
			/// <term>The lookup key that is set by SetClipGeometryLookup.</term>
			/// </item>
			/// <item>
			/// <term>Neither SetClipGeometryLocal nor SetClipGeometryLookup has been called yet.</term>
			/// <term>NULL pointer.</term>
			/// </item>
			/// </list>
			/// </returns>
			// https://docs.microsoft.com/en-us/windows/win32/api/xpsobjectmodel/nf-xpsobjectmodel-ixpsomvisual-getclipgeometrylookup
			// HRESULT GetClipGeometryLookup( LPWSTR *key );
			[MethodImpl(MethodImplOptions.InternalCall)]
			new SafeCoTaskMemString GetClipGeometryLookup();

			/// <summary>Sets the lookup key name of a shared clip geometry in a resource dictionary.</summary>
			/// <param name="key">
			/// The lookup key name of the clip geometry in the dictionary. A <c>NULL</c> pointer clears the previously assigned key name.
			/// </param>
			/// <remarks>
			/// <para>
			/// After you call <c>SetClipGeometryLookup</c>, the local clip geometry is released and GetClipGeometryLocal returns a
			/// <c>NULL</c> pointer in the clipGeometry parameter. The table that follows explains the relationship between the local and
			/// lookup values of this property.
			/// </para>
			/// <list type="table">
			/// <listheader>
			/// <term>Most recent method called</term>
			/// <term>Object that is returned in clipGeometry by GetClipGeometry</term>
			/// <term>Object that is returned in clipGeometry by GetClipGeometryLocal</term>
			/// <term>String that is returned in key by GetClipGeometryLookup</term>
			/// </listheader>
			/// <item>
			/// <term>SetClipGeometryLocal</term>
			/// <term>The local clip geometry that is set by SetClipGeometryLocal.</term>
			/// <term>The local clip geometry that is set by SetClipGeometryLocal.</term>
			/// <term>NULL pointer.</term>
			/// </item>
			/// <item>
			/// <term>SetClipGeometryLookup (this method)</term>
			/// <term>
			/// The shared clip geometry that gets retrieved, with a lookup key that matches the key that is set by SetClipGeometryLookup,
			/// from the resource directory.
			/// </term>
			/// <term>NULL pointer.</term>
			/// <term>The lookup key that is set by SetClipGeometryLookup.</term>
			/// </item>
			/// <item>
			/// <term>Neither SetClipGeometryLookup nor SetClipGeometryLocal has been called yet.</term>
			/// <term>NULL pointer.</term>
			/// <term>NULL pointer.</term>
			/// <term>NULL pointer.</term>
			/// </item>
			/// </list>
			/// </remarks>
			// https://docs.microsoft.com/en-us/windows/win32/api/xpsobjectmodel/nf-xpsobjectmodel-ixpsomvisual-setclipgeometrylookup
			// HRESULT SetClipGeometryLookup( LPCWSTR key );
			[MethodImpl(MethodImplOptions.InternalCall)]
			new void SetClipGeometryLookup([In, MarshalAs(UnmanagedType.LPWStr)] string key);

			/// <summary>Gets the opacity value of this visual.</summary>
			/// <returns>The opacity value.</returns>
			// https://docs.microsoft.com/en-us/windows/win32/api/xpsobjectmodel/nf-xpsobjectmodel-ixpsomvisual-getopacity HRESULT
			// GetOpacity( FLOAT *opacity );
			[MethodImpl(MethodImplOptions.InternalCall)]
			new float GetOpacity();

			/// <summary>Sets the opacity value of the visual.</summary>
			/// <param name="opacity">
			/// <para>The opacity value to be set for the visual.</para>
			/// <para>
			/// The range of allowed values for this parameter is 0.0 to 1.0; with 0.0 the visual is completely transparent, and with 1.0 it
			/// is completely opaque.
			/// </para>
			/// </param>
			// https://docs.microsoft.com/en-us/windows/win32/api/xpsobjectmodel/nf-xpsobjectmodel-ixpsomvisual-setopacity HRESULT
			// SetOpacity( FLOAT opacity );
			[MethodImpl(MethodImplOptions.InternalCall)]
			new void SetOpacity([In] float opacity);

			/// <summary>Gets a pointer to the IXpsOMBrush interface of the visual's opacity mask brush.</summary>
			/// <returns>
			/// <para>
			/// A pointer to the IXpsOMBrush interface of the visual's opacity mask brush. If an opacity mask brush has not been set for
			/// this visual, a <c>NULL</c> pointer is returned.
			/// </para>
			/// <para>The value that is returned in this parameter depends on which method has most recently been called to set the brush.</para>
			/// <list type="table">
			/// <listheader>
			/// <term>Most recent method called</term>
			/// <term>Object that is returned in opacityMaskBrush</term>
			/// </listheader>
			/// <item>
			/// <term>SetOpacityMaskBrushLocal</term>
			/// <term>The local opacity mask brush that is set by SetOpacityMaskBrushLocal.</term>
			/// </item>
			/// <item>
			/// <term>SetOpacityMaskBrushLookup</term>
			/// <term>
			/// The shared opacity mask brush that gets retrieved, with a lookup key that matches the key that is set by
			/// SetOpacityMaskBrushLookup, from the resource directory.
			/// </term>
			/// </item>
			/// <item>
			/// <term>Neither SetOpacityMaskBrushLocal nor SetOpacityMaskBrushLookup has been called yet.</term>
			/// <term>NULL pointer.</term>
			/// </item>
			/// </list>
			/// </returns>
			// https://docs.microsoft.com/en-us/windows/win32/api/xpsobjectmodel/nf-xpsobjectmodel-ixpsomvisual-getopacitymaskbrush HRESULT
			// GetOpacityMaskBrush( IXpsOMBrush **opacityMaskBrush );
			[MethodImpl(MethodImplOptions.InternalCall)]
			new IXpsOMBrush GetOpacityMaskBrush();

			/// <summary>Gets the local, unshared opacity mask brush for the visual.</summary>
			/// <returns>
			/// <para>
			/// A pointer to the IXpsOMBrush interface of the visual's opacity mask brush. If an opacity mask brush lookup key has been set,
			/// or if a local opacity mask brush has not been set, a <c>NULL</c> pointer is returned.
			/// </para>
			/// <list type="table">
			/// <listheader>
			/// <term>Most recent method called</term>
			/// <term>Object that is returned in opacityMaskBrush</term>
			/// </listheader>
			/// <item>
			/// <term>SetOpacityMaskBrushLocal</term>
			/// <term>The local opacity mask brush that is set by SetOpacityMaskBrushLocal.</term>
			/// </item>
			/// <item>
			/// <term>SetOpacityMaskBrushLookup</term>
			/// <term>NULL pointer.</term>
			/// </item>
			/// <item>
			/// <term>Neither SetOpacityMaskBrushLocal nor SetOpacityMaskBrushLookup has been called yet.</term>
			/// <term>NULL pointer.</term>
			/// </item>
			/// </list>
			/// </returns>
			// https://docs.microsoft.com/en-us/windows/win32/api/xpsobjectmodel/nf-xpsobjectmodel-ixpsomvisual-getopacitymaskbrushlocal
			// HRESULT GetOpacityMaskBrushLocal( IXpsOMBrush **opacityMaskBrush );
			[MethodImpl(MethodImplOptions.InternalCall)]
			new IXpsOMBrush GetOpacityMaskBrushLocal();

			/// <summary>Sets the IXpsOMBrush interface pointer as the local, unshared opacity mask brush.</summary>
			/// <param name="opacityMaskBrush">
			/// A pointer to the IXpsOMBrush interface to be set as the local, unshared opacity mask brush. A <c>NULL</c> pointer clears the
			/// previously assigned opacity mask brush.
			/// </param>
			/// <remarks>
			/// <para>
			/// After you call <c>SetOpacityMaskBrushLocal</c>, the opacity mask brush lookup key is released and GetOpacityMaskBrushLookup
			/// returns a <c>NULL</c> pointer in the key parameter. The table that follows explains the relationship between the local and
			/// lookup values of this property.
			/// </para>
			/// <list type="table">
			/// <listheader>
			/// <term>Most recent method called</term>
			/// <term>Object that is returned in opacityMaskBrush by GetOpacityMaskBrush</term>
			/// <term>Object that is returned in opacityMaskBrush by GetOpacityMaskBrushLocal</term>
			/// <term>String that is returned in key by GetOpacityMaskBrushLookup</term>
			/// </listheader>
			/// <item>
			/// <term>SetOpacityMaskBrushLocal (this method)</term>
			/// <term>The local opacity mask brush that is set by SetOpacityMaskBrushLocal.</term>
			/// <term>The local opacity mask brush that is set by SetOpacityMaskBrushLocal.</term>
			/// <term>NULL pointer.</term>
			/// </item>
			/// <item>
			/// <term>SetOpacityMaskBrushLookup</term>
			/// <term>
			/// The shared opacity mask brush that gets retrieved, with a lookup key that matches the key that is set by
			/// SetOpacityMaskBrushLookup, from the resource directory.
			/// </term>
			/// <term>NULL pointer.</term>
			/// <term>The lookup key that is set by SetOpacityMaskBrushLookup.</term>
			/// </item>
			/// <item>
			/// <term>Neither SetOpacityMaskBrushLocal nor SetOpacityMaskBrushLookup has been called yet.</term>
			/// <term>NULL pointer.</term>
			/// <term>NULL pointer.</term>
			/// <term>NULL pointer.</term>
			/// </item>
			/// </list>
			/// </remarks>
			// https://docs.microsoft.com/en-us/windows/win32/api/xpsobjectmodel/nf-xpsobjectmodel-ixpsomvisual-setopacitymaskbrushlocal
			// HRESULT SetOpacityMaskBrushLocal( IXpsOMBrush *opacityMaskBrush );
			[MethodImpl(MethodImplOptions.InternalCall)]
			new void SetOpacityMaskBrushLocal([In] IXpsOMBrush opacityMaskBrush);

			/// <summary>Gets the name of the lookup key of the shared opacity mask brush in a resource dictionary.</summary>
			/// <returns>
			/// <para>
			/// The name of the lookup key of the shared opacity mask brush in a resource dictionary. If the lookup key of an opacity mask
			/// brush has not been set, or if a local opacity mask brush has been set, a <c>NULL</c> pointer is returned.
			/// </para>
			/// <list type="table">
			/// <listheader>
			/// <term>Most recent method called</term>
			/// <term>Object that is returned in key</term>
			/// </listheader>
			/// <item>
			/// <term>SetOpacityMaskBrushLocal</term>
			/// <term>NULL pointer.</term>
			/// </item>
			/// <item>
			/// <term>SetOpacityMaskBrushLookup</term>
			/// <term>The lookup key that is set by SetOpacityMaskBrushLookup.</term>
			/// </item>
			/// <item>
			/// <term>Neither SetOpacityMaskBrushLocal nor SetOpacityMaskBrushLookup has been called yet.</term>
			/// <term>NULL pointer.</term>
			/// </item>
			/// </list>
			/// </returns>
			// https://docs.microsoft.com/en-us/windows/win32/api/xpsobjectmodel/nf-xpsobjectmodel-ixpsomvisual-getopacitymaskbrushlookup
			// HRESULT GetOpacityMaskBrushLookup( LPWSTR *key );
			[MethodImpl(MethodImplOptions.InternalCall)]
			new SafeCoTaskMemString GetOpacityMaskBrushLookup();

			/// <summary>Sets the lookup key name of a shared opacity mask brush in a resource dictionary.</summary>
			/// <param name="key">
			/// The lookup key name of the opacity mask brush in the dictionary. A <c>NULL</c> pointer clears the previously assigned key name.
			/// </param>
			/// <remarks>
			/// <para>
			/// After you call <c>SetOpacityMaskBrushLookup</c>, the local opacity mask brush is released and GetOpacityMaskBrushLocal
			/// returns a <c>NULL</c> pointer in the opacityMaskBrush parameter. The table that follows explains the relationship between
			/// the local and lookup values of this property.
			/// </para>
			/// <list type="table">
			/// <listheader>
			/// <term>Most recent method called</term>
			/// <term>Object that is returned in opacityMaskBrush by GetOpacityMaskBrush</term>
			/// <term>Object that is returned in opacityMaskBrush by GetOpacityMaskBrushLocal</term>
			/// <term>String that is returned in key by GetOpacityMaskBrushLookup</term>
			/// </listheader>
			/// <item>
			/// <term>SetOpacityMaskBrushLocal</term>
			/// <term>The local opacity mask brush that is set by SetOpacityMaskBrushLocal.</term>
			/// <term>The local opacity mask brush that is set by SetOpacityMaskBrushLocal.</term>
			/// <term>NULL pointer.</term>
			/// </item>
			/// <item>
			/// <term>SetOpacityMaskBrushLookup (this method)</term>
			/// <term>
			/// The shared opacity mask brush that gets retrieved—with a lookup key that matches the key that is set by
			/// SetOpacityMaskBrushLookup—from the resource directory.
			/// </term>
			/// <term>NULL pointer.</term>
			/// <term>The lookup key that is set by SetOpacityMaskBrushLookup.</term>
			/// </item>
			/// <item>
			/// <term>Neither SetOpacityMaskBrushLocal nor SetOpacityMaskBrushLookup has been called yet.</term>
			/// <term>NULL pointer.</term>
			/// <term>NULL pointer.</term>
			/// <term>NULL pointer.</term>
			/// </item>
			/// </list>
			/// </remarks>
			// https://docs.microsoft.com/en-us/windows/win32/api/xpsobjectmodel/nf-xpsobjectmodel-ixpsomvisual-setopacitymaskbrushlookup
			// HRESULT SetOpacityMaskBrushLookup( LPCWSTR key );
			[MethodImpl(MethodImplOptions.InternalCall)]
			new void SetOpacityMaskBrushLookup([In, MarshalAs(UnmanagedType.LPWStr)] string key);

			/// <summary>Gets the <c>Name</c> property of the visual.</summary>
			/// <returns>The <c>Name</c> property string. If the <c>Name</c> property has not been set, a <c>NULL</c> pointer is returned.</returns>
			// https://docs.microsoft.com/en-us/windows/win32/api/xpsobjectmodel/nf-xpsobjectmodel-ixpsomvisual-getname HRESULT GetName(
			// LPWSTR *name );
			[MethodImpl(MethodImplOptions.InternalCall)]
			new SafeCoTaskMemString GetName();

			/// <summary>Sets the <c>Name</c> property of the visual.</summary>
			/// <param name="name">The name of the visual. A <c>NULL</c> pointer clears the <c>Name</c> property.</param>
			/// <remarks>
			/// <para>Names must be unique.</para>
			/// <para>
			/// Clearing the <c>Name</c> property by passing a <c>NULL</c> pointer in name sets the <c>IsHyperlinkTarget</c> property to <c>FALSE</c>.
			/// </para>
			/// </remarks>
			// https://docs.microsoft.com/en-us/windows/win32/api/xpsobjectmodel/nf-xpsobjectmodel-ixpsomvisual-setname HRESULT SetName(
			// LPCWSTR name );
			[MethodImpl(MethodImplOptions.InternalCall)]
			new void SetName([In, MarshalAs(UnmanagedType.LPWStr)] string name);

			/// <summary>Gets a value that indicates whether the visual is the target of a hyperlink.</summary>
			/// <returns>
			/// <para>The Boolean value that indicates whether the visual is the target of a hyperlink.</para>
			/// <list type="table">
			/// <listheader>
			/// <term>Value</term>
			/// <term>Meaning</term>
			/// </listheader>
			/// <item>
			/// <term>TRUE</term>
			/// <term>The visual is the target of a hyperlink.</term>
			/// </item>
			/// <item>
			/// <term>FALSE</term>
			/// <term>The visual is not the target of a hyperlink.</term>
			/// </item>
			/// </list>
			/// </returns>
			// https://docs.microsoft.com/en-us/windows/win32/api/xpsobjectmodel/nf-xpsobjectmodel-ixpsomvisual-getishyperlinktarget HRESULT
			// GetIsHyperlinkTarget( BOOL *isHyperlink );
			[MethodImpl(MethodImplOptions.InternalCall)]
			[return: MarshalAs(UnmanagedType.Bool)]
			new bool GetIsHyperlinkTarget();

			/// <summary>Specifies whether the visual is the target of a hyperlink.</summary>
			/// <param name="isHyperlink">
			/// <para>The Boolean value that specifies whether the visual is the target of a hyperlink.</para>
			/// <list type="table">
			/// <listheader>
			/// <term>Value</term>
			/// <term>Meaning</term>
			/// </listheader>
			/// <item>
			/// <term>TRUE</term>
			/// <term>The visual is the target of a hyperlink.</term>
			/// </item>
			/// <item>
			/// <term>FALSE</term>
			/// <term>The visual is not the target of a hyperlink.</term>
			/// </item>
			/// </list>
			/// </param>
			/// <remarks>The visual must be named before it can be set as the target of a hyperlink.</remarks>
			// https://docs.microsoft.com/en-us/windows/win32/api/xpsobjectmodel/nf-xpsobjectmodel-ixpsomvisual-setishyperlinktarget HRESULT
			// SetIsHyperlinkTarget( BOOL isHyperlink );
			[MethodImpl(MethodImplOptions.InternalCall)]
			new void SetIsHyperlinkTarget([In, MarshalAs(UnmanagedType.Bool)] bool isHyperlink);

			/// <summary>Gets a pointer to the IUri interface to which this visual object links.</summary>
			/// <returns>
			/// A pointer to the IUri interface that contains the destination URI for the link. If a URI has not been set for this object, a
			/// <c>NULL</c> pointer is returned.
			/// </returns>
			// https://docs.microsoft.com/en-us/windows/win32/api/xpsobjectmodel/nf-xpsobjectmodel-ixpsomvisual-gethyperlinknavigateuri
			// HRESULT GetHyperlinkNavigateUri( IUri **hyperlinkUri );
			[MethodImpl(MethodImplOptions.InternalCall)]
			new IUri GetHyperlinkNavigateUri();

			/// <summary>Sets the destination URI of the visual's hyperlink.</summary>
			/// <param name="hyperlinkUri">The IUri interface that contains the destination URI of the visual's hyperlink.</param>
			/// <remarks>
			/// Setting an object's URI makes the object a hyperlink. When activated or clicked, the object will navigate to the destination
			/// that is specified by the URI in hyperlinkUri.
			/// </remarks>
			// https://docs.microsoft.com/en-us/windows/win32/api/xpsobjectmodel/nf-xpsobjectmodel-ixpsomvisual-sethyperlinknavigateuri
			// HRESULT SetHyperlinkNavigateUri( IUri *hyperlinkUri );
			[MethodImpl(MethodImplOptions.InternalCall)]
			new void SetHyperlinkNavigateUri([In] IUri hyperlinkUri);

			/// <summary>Gets the <c>Language</c> property of the visual and of its contents.</summary>
			/// <returns>
			/// The language string that specifies the language of the page. If a language has not been set, a <c>NULL</c> pointer is returned.
			/// </returns>
			/// <remarks>
			/// <para>The <c>Language</c> property that is set by this method specifies the language of the resource content.</para>
			/// <para>Internet Engineering Task Force (IETF) RFC 3066 specifies the recommended encoding for the <c>Language</c> property.</para>
			/// </remarks>
			// https://docs.microsoft.com/en-us/windows/win32/api/xpsobjectmodel/nf-xpsobjectmodel-ixpsomvisual-getlanguage HRESULT
			// GetLanguage( LPWSTR *language );
			[MethodImpl(MethodImplOptions.InternalCall)]
			new SafeCoTaskMemString GetLanguage();

			/// <summary>Sets the <c>Language</c> property of the visual.</summary>
			/// <param name="language">
			/// The language string that specifies the language of the visual and of its contents. A <c>NULL</c> pointer clears the
			/// <c>Language</c> property.
			/// </param>
			/// <remarks>
			/// The recommended encoding for the <c>Language</c> property is specified in Internet Engineering Task Force (IETF) RFC 3066r.
			/// </remarks>
			// https://docs.microsoft.com/en-us/windows/win32/api/xpsobjectmodel/nf-xpsobjectmodel-ixpsomvisual-setlanguage HRESULT
			// SetLanguage( LPCWSTR language );
			[MethodImpl(MethodImplOptions.InternalCall)]
			new void SetLanguage([In, MarshalAs(UnmanagedType.LPWStr)] string language);

			/// <summary>
			/// Gets a pointer to an IXpsOMVisualCollection interface that contains a collection of the visual objects in the canvas.
			/// </summary>
			/// <returns>
			/// The collection of the visual objects in the canvas. If no visual objects are attached to the canvas, an empty collection is returned.
			/// </returns>
			// https://docs.microsoft.com/en-us/windows/win32/api/xpsobjectmodel/nf-xpsobjectmodel-ixpsomcanvas-getvisuals HRESULT
			// GetVisuals( IXpsOMVisualCollection **visuals );
			IXpsOMVisualCollection GetVisuals();

			/// <summary>
			/// Gets a Boolean value that determines whether the edges of the objects in the canvas are to be rendered using the aliased
			/// edge mode.
			/// </summary>
			/// <returns>
			/// <para>The Boolean value that determines whether the objects in the canvas are to be rendered using the aliased edge mode.</para>
			/// <list type="table">
			/// <listheader>
			/// <term>Value</term>
			/// <term>Meaning</term>
			/// </listheader>
			/// <item>
			/// <term>TRUE</term>
			/// <term>
			/// The edges of objects in the canvas are to be rendered without anti-aliasing using the aliased edge mode. This includes any
			/// objects in the canvas that have useAliasedEdgeMode set to FALSE. In the document markup, this corresponds to the
			/// RenderOptions.EdgeMode attribute having a value of Aliased.
			/// </term>
			/// </item>
			/// <item>
			/// <term>FALSE</term>
			/// <term>
			/// The edges of objects in the canvas are to be rendered in the default manner. In the document markup, this corresponds to the
			/// RenderOptions.EdgeMode attribute being absent.
			/// </term>
			/// </item>
			/// </list>
			/// </returns>
			/// <remarks>
			/// The property that is returned by this method corresponds to the <c>RenderOptions.EdgeMode</c> attribute of the <c>Canvas</c>
			/// element in the document markup.
			/// </remarks>
			// https://docs.microsoft.com/en-us/windows/win32/api/xpsobjectmodel/nf-xpsobjectmodel-ixpsomcanvas-getusealiasededgemode
			// HRESULT GetUseAliasedEdgeMode( BOOL *useAliasedEdgeMode );
			[return: MarshalAs(UnmanagedType.Bool)]
			bool GetUseAliasedEdgeMode();

			/// <summary>
			/// Sets the value that determines whether the edges of objects in this canvas will be rendered using the aliased edge mode.
			/// </summary>
			/// <param name="useAliasedEdgeMode">
			/// <para>
			/// The Boolean value that determines whether the edges of child objects in this canvas will be rendered using the aliased edge mode.
			/// </para>
			/// <list type="table">
			/// <listheader>
			/// <term>Value</term>
			/// <term>Meaning</term>
			/// </listheader>
			/// <item>
			/// <term>TRUE</term>
			/// <term>
			/// The edges of objects in the canvas are to be rendered without anti-aliasing using the aliased edge mode. This includes any
			/// objects that have this value set to FALSE. In the document markup, this corresponds to the RenderOptions.EdgeMode attribute
			/// having the value of Aliased.
			/// </term>
			/// </item>
			/// <item>
			/// <term>FALSE</term>
			/// <term>
			/// The edges of objects in the canvas are to be rendered in the default manner. In the document markup, this corresponds to the
			/// RenderOptions.EdgeMode attribute being absent.
			/// </term>
			/// </item>
			/// </list>
			/// </param>
			/// <remarks>
			/// This property corresponds to the <c>RenderOptions.EdgeMode</c> attribute of the <c>Canvas</c> element in the document markup.
			/// </remarks>
			// https://docs.microsoft.com/en-us/windows/win32/api/xpsobjectmodel/nf-xpsobjectmodel-ixpsomcanvas-setusealiasededgemode
			// HRESULT SetUseAliasedEdgeMode( BOOL useAliasedEdgeMode );
			void SetUseAliasedEdgeMode([MarshalAs(UnmanagedType.Bool)] bool useAliasedEdgeMode);

			/// <summary>
			/// Gets a short textual description of the object's contents. This text is used by accessibility clients to describe the object.
			/// </summary>
			/// <returns>
			/// The short textual description of the object's contents. If this description is not set, a <c>NULL</c> pointer is returned.
			/// </returns>
			/// <remarks>
			/// <para>
			/// The property returned by this method corresponds to the <c>AutomationProperties.Name</c> attribute of the <c>Canvas</c>
			/// element in the document markup.
			/// </para>
			/// </remarks>
			// https://docs.microsoft.com/en-us/windows/win32/api/xpsobjectmodel/nf-xpsobjectmodel-ixpsomcanvas-getaccessibilityshortdescription
			// HRESULT GetAccessibilityShortDescription( LPWSTR *shortDescription );
			SafeCoTaskMemString GetAccessibilityShortDescription();

			/// <summary>
			/// Sets the short textual description of the object's contents. This text is used by accessibility clients to describe the object.
			/// </summary>
			/// <param name="shortDescription">
			/// The short textual description of the object's contents. A <c>NULL</c> pointer clears the previously assigned text.
			/// </param>
			/// <remarks>
			/// The property that is set by this method corresponds to the <c>AutomationProperties.HelpText</c> attribute of the
			/// <c>Canvas</c> element in the document markup.
			/// </remarks>
			// https://docs.microsoft.com/en-us/windows/win32/api/xpsobjectmodel/nf-xpsobjectmodel-ixpsomcanvas-setaccessibilityshortdescription
			// HRESULT SetAccessibilityShortDescription( LPCWSTR shortDescription );
			void SetAccessibilityShortDescription([In, MarshalAs(UnmanagedType.LPWStr)] string shortDescription);

			/// <summary>
			/// Gets the long (detailed) textual description of the object's contents. This text is used by accessibility clients to
			/// describe the object.
			/// </summary>
			/// <returns>
			/// The long (detailed) textual description of the object's contents. A <c>NULL</c> pointer is returned if this text has not
			/// been set.
			/// </returns>
			/// <remarks>
			/// <para>
			/// The property returned by this method corresponds to the <c>AutomationProperties.HelpText</c> attribute of the <c>Canvas</c>
			/// element in the document markup.
			/// </para>
			/// </remarks>
			// https://docs.microsoft.com/en-us/windows/win32/api/xpsobjectmodel/nf-xpsobjectmodel-ixpsomcanvas-getaccessibilitylongdescription
			// HRESULT GetAccessibilityLongDescription( LPWSTR *longDescription );
			SafeCoTaskMemString GetAccessibilityLongDescription();

			/// <summary>
			/// Sets the long (detailed) textual description of the object's contents. This text is used by accessibility clients to
			/// describe the object.
			/// </summary>
			/// <param name="longDescription">
			/// The long (detailed) textual description of the object's contents. A <c>NULL</c> pointer clears the previously assigned value.
			/// </param>
			/// <remarks>
			/// The property that is set by this method corresponds to the <c>AutomationProperties.HelpText</c> attribute of the
			/// <c>Canvas</c> element in the document markup.
			/// </remarks>
			// https://docs.microsoft.com/en-us/windows/win32/api/xpsobjectmodel/nf-xpsobjectmodel-ixpsomcanvas-setaccessibilitylongdescription
			// HRESULT SetAccessibilityLongDescription( LPCWSTR longDescription );
			void SetAccessibilityLongDescription([In, MarshalAs(UnmanagedType.LPWStr)] string longDescription);

			/// <summary>Gets a pointer to the resolved IXpsOMDictionary interface of the dictionary associated with the canvas.</summary>
			/// <returns>
			/// <para>A pointer to the resolved IXpsOMDictionary interface of the dictionary.</para>
			/// <para>The value that is returned in this parameter depends on which method has been most recently called to set the dictionary.</para>
			/// <list type="table">
			/// <listheader>
			/// <term>Most recent method called</term>
			/// <term>Object returned in resourceDictionary</term>
			/// </listheader>
			/// <item>
			/// <term>SetDictionaryLocal</term>
			/// <term>The local dictionary that is set by SetDictionaryLocal.</term>
			/// </item>
			/// <item>
			/// <term>SetDictionaryResource</term>
			/// <term>The shared dictionary in the dictionary resource that is set by SetDictionaryResource.</term>
			/// </item>
			/// <item>
			/// <term>Neither SetDictionaryLocal nor SetDictionaryResource has been called yet.</term>
			/// <term>NULL pointer.</term>
			/// </item>
			/// </list>
			/// </returns>
			/// <remarks>
			/// <para>
			/// <c>GetDictionary</c> can return the interface pointer of a local or remote dictionary. GetOwner can be called to determine
			/// whether the dictionary is local or remote.
			/// </para>
			/// <para>
			/// After loading and parsing the resource into the XPS OM, this method might return an error that applies to another resource.
			/// This occurs because all of the relationships are parsed when a resource is loaded.
			/// </para>
			/// </remarks>
			// https://docs.microsoft.com/en-us/windows/win32/api/xpsobjectmodel/nf-xpsobjectmodel-ixpsomcanvas-getdictionary HRESULT
			// GetDictionary( IXpsOMDictionary **resourceDictionary );
			IXpsOMDictionary GetDictionary();

			/// <summary>Gets a pointer to the IXpsOMDictionary interface of the local, unshared dictionary.</summary>
			/// <returns>
			/// <para>
			/// The IXpsOMDictionary interface pointer to the local, unshared dictionary, if one has been set. If a local dictionary has not
			/// been set or if a remote dictionary resource has been set, a <c>NULL</c> pointer is returned.
			/// </para>
			/// <list type="table">
			/// <listheader>
			/// <term>Most recent method called</term>
			/// <term>Object returned in resourceDictionary</term>
			/// </listheader>
			/// <item>
			/// <term>SetDictionaryLocal</term>
			/// <term>The local dictionary that is set by SetDictionaryLocal.</term>
			/// </item>
			/// <item>
			/// <term>SetDictionaryResource</term>
			/// <term>NULL pointer.</term>
			/// </item>
			/// <item>
			/// <term>Neither SetDictionaryLocal nor SetDictionaryResource has been called yet.</term>
			/// <term>NULL pointer.</term>
			/// </item>
			/// </list>
			/// </returns>
			/// <remarks>
			/// <para>
			/// When this method loads and parses the resource into the XPS OM, it might return an error that applies to another resource.
			/// This can occur because all of the relationships are parsed when the resource is loaded.
			/// </para>
			/// <para>For more information about other return values that might be returned by this method, see XPS Document Errors.</para>
			/// </remarks>
			// https://docs.microsoft.com/en-us/windows/win32/api/xpsobjectmodel/nf-xpsobjectmodel-ixpsomcanvas-getdictionarylocal HRESULT
			// GetDictionaryLocal( IXpsOMDictionary **resourceDictionary );
			IXpsOMDictionary GetDictionaryLocal();

			/// <summary>Sets the IXpsOMDictionary interface pointer of the local, unshared dictionary.</summary>
			/// <param name="resourceDictionary">
			/// The IXpsOMDictionary interface of the local, unshared dictionary. A <c>NULL</c> pointer releases any previously assigned
			/// local dictionary.
			/// </param>
			/// <remarks>
			/// <para>
			/// After you call <c>SetDictionaryLocal</c>, the remote dictionary resource is released and GetDictionaryResource returns a
			/// <c>NULL</c> pointer in the remoteDictionaryResource parameter. The table that follows explains the relationship between the
			/// local and remote values of this property.
			/// </para>
			/// <list type="table">
			/// <listheader>
			/// <term>Most recent method called</term>
			/// <term>Object that is returned in resourceDictionary by GetDictionary</term>
			/// <term>Object that is returned in resourceDictionary by GetDictionaryLocal</term>
			/// <term>Object that is returned in remoteDictionaryResource by GetDictionaryResource</term>
			/// </listheader>
			/// <item>
			/// <term>SetDictionaryLocal (this method)</term>
			/// <term>The local dictionary that is set by SetDictionaryLocal.</term>
			/// <term>The local dictionary that is set by SetDictionaryLocal.</term>
			/// <term>NULL pointer.</term>
			/// </item>
			/// <item>
			/// <term>SetDictionaryResource</term>
			/// <term>The shared dictionary in the dictionary resource that is set by SetDictionaryResource.</term>
			/// <term>NULL pointer.</term>
			/// <term>The remote dictionary resource that is set by SetDictionaryResource.</term>
			/// </item>
			/// <item>
			/// <term>Neither SetDictionaryLocal nor SetDictionaryResource has been called yet.</term>
			/// <term>NULL pointer.</term>
			/// <term>NULL pointer.</term>
			/// <term>NULL pointer.</term>
			/// </item>
			/// </list>
			/// </remarks>
			// https://docs.microsoft.com/en-us/windows/win32/api/xpsobjectmodel/nf-xpsobjectmodel-ixpsomcanvas-setdictionarylocal HRESULT
			// SetDictionaryLocal( IXpsOMDictionary *resourceDictionary );
			void SetDictionaryLocal([In] IXpsOMDictionary resourceDictionary);

			/// <summary>Gets a pointer to the IXpsOMRemoteDictionaryResource interface of the remote dictionary resource.</summary>
			/// <returns>
			/// <para>
			/// The IXpsOMRemoteDictionaryResource interface pointer to the remote dictionary resource, if one has been set. If a remote
			/// dictionary resource has not been set or if a local dictionary resource has been set, a <c>NULL</c> pointer is returned.
			/// </para>
			/// <list type="table">
			/// <listheader>
			/// <term>Most recent method called</term>
			/// <term>Object returned in remoteDictionaryResource</term>
			/// </listheader>
			/// <item>
			/// <term>SetDictionaryLocal</term>
			/// <term>NULL pointer.</term>
			/// </item>
			/// <item>
			/// <term>SetDictionaryResource</term>
			/// <term>The remote dictionary resource that is set by SetDictionaryResource.</term>
			/// </item>
			/// <item>
			/// <term>Neither SetDictionaryLocal nor SetDictionaryResource has been called yet.</term>
			/// <term>NULL pointer.</term>
			/// </item>
			/// </list>
			/// </returns>
			/// <remarks>
			/// After loading and parsing the resource into the XPS OM, this method might return an error that applies to another resource.
			/// This occurs because all of the relationships are parsed when a resource is loaded.
			/// </remarks>
			// https://docs.microsoft.com/en-us/windows/win32/api/xpsobjectmodel/nf-xpsobjectmodel-ixpsomcanvas-getdictionaryresource
			// HRESULT GetDictionaryResource( IXpsOMRemoteDictionaryResource **remoteDictionaryResource );
			IXpsOMRemoteDictionaryResource GetDictionaryResource();

			/// <summary>Sets the IXpsOMRemoteDictionaryResource interface pointer of the remote dictionary resource.</summary>
			/// <param name="remoteDictionaryResource">
			/// The IXpsOMRemoteDictionaryResource interface of the remote dictionary resource. A <c>NULL</c> pointer releases any
			/// previously assigned dictionary resource.
			/// </param>
			/// <remarks>
			/// <para>After calling this method, GetDictionaryLocal returns a <c>NULL</c> pointer in the resourceDictionary parameter.</para>
			/// <list type="table">
			/// <listheader>
			/// <term>Most recent method called</term>
			/// <term>Object that is returned in resourceDictionary by GetDictionary</term>
			/// <term>Object that is returned in resourceDictionary by GetDictionaryLocal</term>
			/// <term>Object that is returned in remoteDictionaryResource by GetDictionaryResource</term>
			/// </listheader>
			/// <item>
			/// <term>SetDictionaryLocal</term>
			/// <term>The local dictionary that is set by SetDictionaryLocal.</term>
			/// <term>The local dictionary that is set by SetDictionaryLocal.</term>
			/// <term>NULL pointer.</term>
			/// </item>
			/// <item>
			/// <term>SetDictionaryResource (this method)</term>
			/// <term>The shared dictionary in the dictionary resource that is set by SetDictionaryResource.</term>
			/// <term>NULL pointer.</term>
			/// <term>The remote dictionary resource that is set by SetDictionaryResource.</term>
			/// </item>
			/// <item>
			/// <term>Neither SetDictionaryLocal nor SetDictionaryResource has been called yet.</term>
			/// <term>NULL pointer.</term>
			/// <term>NULL pointer.</term>
			/// <term>NULL pointer.</term>
			/// </item>
			/// </list>
			/// </remarks>
			// https://docs.microsoft.com/en-us/windows/win32/api/xpsobjectmodel/nf-xpsobjectmodel-ixpsomcanvas-setdictionaryresource
			// HRESULT SetDictionaryResource( IXpsOMRemoteDictionaryResource *remoteDictionaryResource );
			void SetDictionaryResource([In] IXpsOMRemoteDictionaryResource remoteDictionaryResource);

			/// <summary>Makes a deep copy of the interface.</summary>
			/// <returns>A pointer to the copy of the interface.</returns>
			/// <remarks>The owner of the new interface is <c>NULL</c>.</remarks>
			// https://docs.microsoft.com/en-us/windows/win32/api/xpsobjectmodel/nf-xpsobjectmodel-ixpsomcanvas-clone HRESULT Clone(
			// IXpsOMCanvas **canvas );
			IXpsOMCanvas Clone();
		}

		/// <summary>Provides an IStream interface to a color profile resource.</summary>
		/// <remarks>The code example that follows illustrates how to create an instance of this interface.</remarks>
		// https://docs.microsoft.com/en-us/windows/win32/api/xpsobjectmodel/nn-xpsobjectmodel-ixpsomcolorprofileresource
		[PInvokeData("xpsobjectmodel.h", MSDNShortId = "8a344300-c3fc-4225-bfa5-d5d33798a094")]
		[ComImport, Guid("67BD7D69-1EEF-4BB1-B5E7-6F4F87BE8ABE"), InterfaceType(ComInterfaceType.InterfaceIsIUnknown)]
		public interface IXpsOMColorProfileResource : IXpsOMResource
		{
			/// <summary>Gets the name that will be used when the part is serialized.</summary>
			/// <returns>
			/// A pointer to the IOpcPartUri interface that contains the part name. If the part name has not been set (by the SetPartName
			/// method), a <c>NULL</c> pointer is returned.
			/// </returns>
			// https://docs.microsoft.com/en-us/windows/win32/api/xpsobjectmodel/nf-xpsobjectmodel-ixpsompart-getpartname HRESULT
			// GetPartName( IOpcPartUri **partUri );
			[MethodImpl(MethodImplOptions.InternalCall)]
			new IOpcPartUri GetPartName();

			/// <summary>Sets the name that will be used when the part is serialized.</summary>
			/// <param name="partUri">
			/// A pointer to the IOpcPartUri interface that contains the name of this part. This parameter cannot be <c>NULL</c>.
			/// </param>
			/// <remarks>
			/// IXpsOMPackageWriter will generate an error if it encounters an XPS document part whose name is the same as that of a part it
			/// has previously serialized.
			/// </remarks>
			// https://docs.microsoft.com/en-us/windows/win32/api/xpsobjectmodel/nf-xpsobjectmodel-ixpsompart-setpartname HRESULT
			// SetPartName( IOpcPartUri *partUri );
			[MethodImpl(MethodImplOptions.InternalCall)]
			new void SetPartName([In] IOpcPartUri partUri);

			/// <summary>Gets a new, read-only copy of the stream that is associated with this resource.</summary>
			/// <returns>A new, read-only copy of the stream that is associated with this resource.</returns>
			/// <remarks>
			/// <para>
			/// The IStream object returned by this method might return an error of E_PENDING, which indicates that the stream length has
			/// not been determined yet. This behavior is different from that of a standard <c>IStream</c> object.
			/// </para>
			/// <para>
			/// This method calls the stream's <c>Clone</c> method to create the stream returned in stream. As a result, the performance of
			/// this method will depend on that of the stream's <c>Clone</c> method.
			/// </para>
			/// </remarks>
			// https://docs.microsoft.com/en-us/windows/win32/api/xpsobjectmodel/nf-xpsobjectmodel-ixpsomcolorprofileresource-getstream
			// HRESULT GetStream( IStream **stream );
			[MethodImpl(MethodImplOptions.InternalCall)]
			IStream GetStream();

			/// <summary>Sets the read-only stream to be associated with this resource.</summary>
			/// <param name="sourceStream">The read-only stream to be associated with this resource.</param>
			/// <param name="partName">The part name to be assigned to this resource.</param>
			/// <remarks>
			/// <para>
			/// The calling method should treat this stream as a single-threaded apartment (STA) model object and not re-enter any of the
			/// stream interface's methods.
			/// </para>
			/// <para>
			/// Because GetStream gets a clone of the stream that is set by this method, the provided stream should have an efficient
			/// cloning method. A stream with an inefficient cloning method will reduce the performance of <c>GetStream</c>.
			/// </para>
			/// </remarks>
			// https://docs.microsoft.com/en-us/windows/win32/api/xpsobjectmodel/nf-xpsobjectmodel-ixpsomcolorprofileresource-setcontent
			// HRESULT SetContent( IStream *sourceStream, IOpcPartUri *partName );
			[MethodImpl(MethodImplOptions.InternalCall)]
			void SetContent([In] IStream sourceStream, [In] IOpcPartUri partName);
		}

		/// <summary>A collection of IXpsOMColorProfileResource interface pointers.</summary>
		/// <remarks>For more information about the collection methods, see Working with XPS OM Collection Interfaces.</remarks>
		// https://docs.microsoft.com/en-us/windows/win32/api/xpsobjectmodel/nn-xpsobjectmodel-ixpsomcolorprofileresourcecollection
		[PInvokeData("xpsobjectmodel.h", MSDNShortId = "cb9253f3-461e-47a3-820b-bb6bf5e30210")]
		[ComImport, Guid("12759630-5FBA-4283-8F7D-CCA849809EDB"), InterfaceType(ComInterfaceType.InterfaceIsIUnknown)]
		public interface IXpsOMColorProfileResourceCollection
		{
			/// <summary>Gets the number of IXpsOMColorProfileResource interface pointers in the collection.</summary>
			/// <returns>The number of IXpsOMColorProfileResource interface pointers in the collection.</returns>
			/// <remarks>For more information about the collection methods, see Working with XPS OM Collection Interfaces.</remarks>
			// https://docs.microsoft.com/en-us/windows/win32/api/xpsobjectmodel/nf-xpsobjectmodel-ixpsomcolorprofileresourcecollection-getcount
			// HRESULT GetCount( UINT32 *count );
			[MethodImpl(MethodImplOptions.InternalCall)]
			uint GetCount();

			/// <summary>Gets an IXpsOMColorProfileResource interface pointer from a specified location in the collection.</summary>
			/// <param name="index">The zero-based index of the IXpsOMColorProfileResource interface pointer to be obtained.</param>
			/// <returns>The IXpsOMColorProfileResource interface pointer at the location specified by index.</returns>
			/// <remarks>For more information about the collection methods, see Working with XPS OM Collection Interfaces.</remarks>
			// https://docs.microsoft.com/en-us/windows/win32/api/xpsobjectmodel/nf-xpsobjectmodel-ixpsomcolorprofileresourcecollection-getat
			// HRESULT GetAt( UINT32 index, IXpsOMColorProfileResource **object );
			[MethodImpl(MethodImplOptions.InternalCall)]
			IXpsOMColorProfileResource GetAt([In] uint index);

			/// <summary>Inserts an IXpsOMColorProfileResource interface pointer at a specified location in the collection.</summary>
			/// <param name="index">
			/// The zero-based index in the collection where the interface pointer that is passed in object is to be inserted.
			/// </param>
			/// <param name="object">
			/// The IXpsOMColorProfileResource interface pointer that is to be inserted in the location specified by index.
			/// </param>
			/// <remarks>
			/// <para>
			/// At the location specified by index, this method inserts the IXpsOMColorProfileResource interface pointer that is passed in
			/// object. Prior to the insertion, the pointer in this and all subsequent locations is moved up by one index.
			/// </para>
			/// <para>For more information about the collection methods, see Working with XPS OM Collection Interfaces.</para>
			/// </remarks>
			// https://docs.microsoft.com/en-us/windows/win32/api/xpsobjectmodel/nf-xpsobjectmodel-ixpsomcolorprofileresourcecollection-insertat
			// HRESULT InsertAt( UINT32 index, IXpsOMColorProfileResource *object );
			[MethodImpl(MethodImplOptions.InternalCall)]
			void InsertAt([In] uint index, [In] IXpsOMColorProfileResource @object);

			/// <summary>Removes and releases an IXpsOMColorProfileResource interface pointer from a specified location in the collection.</summary>
			/// <param name="index">
			/// The zero-based index in the collection from which an IXpsOMColorProfileResource interface pointer is to be removed and released.
			/// </param>
			/// <remarks>
			/// <para>
			/// This method releases the interface referenced by the pointer at the location specified by index. After releasing the
			/// interface, this method compacts the collection by reducing by 1 the index of each pointer subsequent to index.
			/// </para>
			/// <para>For more information about the collection methods, see Working with XPS OM Collection Interfaces.</para>
			/// </remarks>
			// https://docs.microsoft.com/en-us/windows/win32/api/xpsobjectmodel/nf-xpsobjectmodel-ixpsomcolorprofileresourcecollection-removeat
			// HRESULT RemoveAt( UINT32 index );
			[MethodImpl(MethodImplOptions.InternalCall)]
			void RemoveAt([In] uint index);

			/// <summary>Replaces an IXpsOMColorProfileResource interface pointer at a specified location in the collection.</summary>
			/// <param name="index">
			/// The zero-based index in the collection where an IXpsOMColorProfileResource interface pointer is to be replaced.
			/// </param>
			/// <param name="object">
			/// The IXpsOMColorProfileResource interface pointer that will replace current contents at the location specified by index.
			/// </param>
			/// <remarks>
			/// <para>
			/// At the location specified by index, this method releases the IXpsOMColorProfileResource interface referenced by the existing
			/// pointer, then writes the pointer that is passed in object.
			/// </para>
			/// <para>For more information about the collection methods, see Working with XPS OM Collection Interfaces.</para>
			/// </remarks>
			// https://docs.microsoft.com/en-us/windows/win32/api/xpsobjectmodel/nf-xpsobjectmodel-ixpsomcolorprofileresourcecollection-setat
			// HRESULT SetAt( UINT32 index, IXpsOMColorProfileResource *object );
			[MethodImpl(MethodImplOptions.InternalCall)]
			void SetAt([In] uint index, [In] IXpsOMColorProfileResource @object);

			/// <summary>Appends an IXpsOMColorProfileResource interface pointer to the end of the collection.</summary>
			/// <param name="object">A pointer to the IXpsOMColorProfileResource interface that is to be appended to the collection.</param>
			/// <remarks>For more information about the collection methods, see Working with XPS OM Collection Interfaces.</remarks>
			// https://docs.microsoft.com/en-us/windows/win32/api/xpsobjectmodel/nf-xpsobjectmodel-ixpsomcolorprofileresourcecollection-append
			// HRESULT Append( IXpsOMColorProfileResource *object );
			[MethodImpl(MethodImplOptions.InternalCall)]
			void Append([In] IXpsOMColorProfileResource @object);

			/// <summary>Gets an IXpsOMColorProfileResource interface pointer from the collection by matching the interface's part name.</summary>
			/// <param name="partName">The part name of the IXpsOMColorProfileResource interface to be found in the collection.</param>
			/// <returns>
			/// A pointer to the IXpsOMColorProfileResource interface whose part name matches partName. If a matching interface is not found
			/// in the collection, a <c>NULL</c> pointer is returned.
			/// </returns>
			// https://docs.microsoft.com/en-us/windows/win32/api/xpsobjectmodel/nf-xpsobjectmodel-ixpsomcolorprofileresourcecollection-getbypartname
			// HRESULT GetByPartName( IOpcPartUri *partName, IXpsOMColorProfileResource **part );
			[MethodImpl(MethodImplOptions.InternalCall)]
			IXpsOMColorProfileResource GetByPartName([In] IOpcPartUri partName);
		}

		/// <summary>A collection of XPS_DASH structures.</summary>
		/// <remarks>For more information about the collection methods, see Working with XPS OM Collection Interfaces.</remarks>
		// https://docs.microsoft.com/en-us/windows/win32/api/xpsobjectmodel/nn-xpsobjectmodel-ixpsomdashcollection
		[PInvokeData("xpsobjectmodel.h", MSDNShortId = "02a152a1-e117-42fb-8428-a2b28e6540a9")]
		[ComImport, Guid("081613F4-74EB-48F2-83B3-37A9CE2D7DC6"), InterfaceType(ComInterfaceType.InterfaceIsIUnknown)]
		public interface IXpsOMDashCollection
		{
			/// <summary>Gets the number of XPS_DASH structures in the collection.</summary>
			/// <returns>The number of XPS_DASH structures in the collection.</returns>
			/// <remarks>For more information about the collection methods, see Working with XPS OM Collection Interfaces.</remarks>
			// https://docs.microsoft.com/en-us/windows/win32/api/xpsobjectmodel/nf-xpsobjectmodel-ixpsomdashcollection-getcount HRESULT
			// GetCount( UINT32 *count );
			uint GetCount();

			/// <summary>Gets an XPS_DASH structure from a specified location in the collection.</summary>
			/// <param name="index">The zero-based index in the collection where an XPS_DASH structure is to be obtained.</param>
			/// <returns>The XPS_DASH structure that is found at the location specified by index.</returns>
			/// <remarks>For more information about the collection methods, see Working with XPS OM Collection Interfaces.</remarks>
			// https://docs.microsoft.com/en-us/windows/win32/api/xpsobjectmodel/nf-xpsobjectmodel-ixpsomdashcollection-getat HRESULT GetAt(
			// UINT32 index, XPS_DASH *dash );
			XPS_DASH GetAt([In] uint index);

			/// <summary>Inserts an XPS_DASH structure at a specified location in the collection.</summary>
			/// <param name="index">The zero-based index in the collection where the structure that is referenced by dash is to be inserted.</param>
			/// <param name="dash">A pointer to the XPS_DASH structure that is to be inserted at the location specified by index.</param>
			/// <remarks>
			/// <para>
			/// At the location specified by index, this method inserts the XPS_DASH structure that is passed in dash. Prior to insertion,
			/// the structure in this and all subsequent locations is moved up by one index.
			/// </para>
			/// <para>The figure that follows illustrates how the collection is changed by the <c>InsertAt</c> method.</para>
			/// </remarks>
			// https://docs.microsoft.com/en-us/windows/win32/api/xpsobjectmodel/nf-xpsobjectmodel-ixpsomdashcollection-insertat HRESULT
			// InsertAt( UINT32 index, const XPS_DASH *dash );
			void InsertAt([In] uint index, in XPS_DASH dash);

			/// <summary>Removes and frees an XPS_DASH structure from a specified location in the collection.</summary>
			/// <param name="index">The zero-based index in the collection from which an XPS_DASH structure is to be removed and freed.</param>
			/// <remarks>
			/// <para>
			/// This method removes and frees the XPS_DASH structure referenced by the pointer at the location specified by index. After
			/// freeing the structure, this method compacts the collection by reducing by 1 the index of each pointer subsequent to index.
			/// </para>
			/// <para>The figure that follows illustrates how the collection is changed by the <c>RemoveAt</c> method.</para>
			/// </remarks>
			// https://docs.microsoft.com/en-us/windows/win32/api/xpsobjectmodel/nf-xpsobjectmodel-ixpsomdashcollection-removeat HRESULT
			// RemoveAt( UINT32 index );
			void RemoveAt([In] uint index);

			/// <summary>Replaces an XPS_DASH structure at a specified location in the collection.</summary>
			/// <param name="index">The zero-based index in the collection where an XPS_DASH structure is to be replaced.</param>
			/// <param name="dash">
			/// A pointer to the XPS_DASH structure that will replace the current contents at the location specified by index.
			/// </param>
			/// <remarks>
			/// <para>
			/// At the location specified by index, this method frees the existing XPS_DASH structure then replaces it with the structure
			/// that is passed in dash.
			/// </para>
			/// <para>The figure that follows illustrates how the collection is changed by the <c>SetAt</c> method.</para>
			/// </remarks>
			// https://docs.microsoft.com/en-us/windows/win32/api/xpsobjectmodel/nf-xpsobjectmodel-ixpsomdashcollection-setat HRESULT SetAt(
			// UINT32 index, const XPS_DASH *dash );
			void SetAt([In] uint index, in XPS_DASH dash);

			/// <summary>Appends an XPS_DASH structure to the end of the collection.</summary>
			/// <param name="dash">A pointer to the XPS_DASH structure that is to be appended to the collection.</param>
			/// <remarks>The figure that follows illustrates how the collection is changed by the <c>Append</c> method.</remarks>
			// https://docs.microsoft.com/en-us/windows/win32/api/xpsobjectmodel/nf-xpsobjectmodel-ixpsomdashcollection-append HRESULT
			// Append( const XPS_DASH *dash );
			void Append(in XPS_DASH dash);
		}

		/// <summary>The dictionary is used by an XPS package to share resources.</summary>
		/// <remarks>
		/// <para>
		/// The interface pointers stored in a dictionary will usually point to interfaces, such as IXpsOMBrush and IXpsOMVisual, that are
		/// derived from the IXpsOMShareable interface. To determine the interface type, call the IXpsOMShareable::GetType method.
		/// </para>
		/// <para>A dictionary cannot contain duplicate interface pointers.</para>
		/// </remarks>
		// https://docs.microsoft.com/en-us/windows/win32/api/xpsobjectmodel/nn-xpsobjectmodel-ixpsomdictionary
		[PInvokeData("xpsobjectmodel.h", MSDNShortId = "f887e3d3-973c-4267-a785-6bc190c13082")]
		[ComImport, Guid("897C86B8-8EAF-4AE3-BDDE-56419FCF4236"), InterfaceType(ComInterfaceType.InterfaceIsIUnknown)]
		public interface IXpsOMDictionary
		{
			/// <summary>Gets a pointer to the interface that contains the dictionary.</summary>
			/// <returns>The <c>IUnknown</c> interface of the interface that contains the dictionary.</returns>
			// https://docs.microsoft.com/en-us/windows/win32/api/xpsobjectmodel/nf-xpsobjectmodel-ixpsomdictionary-getowner HRESULT
			// GetOwner( IUnknown **owner );
			[return: MarshalAs(UnmanagedType.IUnknown)]
			object GetOwner();

			/// <summary>Gets the number of entries in the dictionary.</summary>
			/// <returns>The number of entries in the dictionary.</returns>
			// https://docs.microsoft.com/en-us/windows/win32/api/xpsobjectmodel/nf-xpsobjectmodel-ixpsomdictionary-getcount HRESULT
			// GetCount( UINT32 *count );
			uint GetCount();

			/// <summary>
			/// Gets the IXpsOMShareable interface pointer and the key name string of the entry at a specified index in the dictionary.
			/// </summary>
			/// <param name="index">The zero-based index of the dictionary entry that is to be obtained.</param>
			/// <param name="key">The key string that is found at the location specified by index.</param>
			/// <returns>The IXpsOMShareable interface pointer that is found at the location specified by index.</returns>
			/// <remarks>
			/// <para>
			/// The interface pointers that are stored in a dictionary will usually point to interfaces, such as IXpsOMBrush and
			/// IXpsOMVisual, that are derived from the IXpsOMShareable interface. To determine the interface type, call the
			/// IXpsOMShareable::GetType method.
			/// </para>
			/// </remarks>
			// https://docs.microsoft.com/en-us/windows/win32/api/xpsobjectmodel/nf-xpsobjectmodel-ixpsomdictionary-getat HRESULT GetAt(
			// UINT32 index, LPWSTR *key, IXpsOMShareable **entry );
			IXpsOMShareable GetAt([In] uint index, out SafeCoTaskMemString key);

			/// <summary>Gets the IXpsOMShareable interface pointer of the entry that contains the specified key.</summary>
			/// <param name="key">The entry's key to be found in the dictionary.</param>
			/// <param name="beforeEntry">
			/// The IXpsOMShareable interface pointer to the last entry in the dictionary which is to be searched for key. If beforeEntry is
			/// <c>NULL</c> or is an interface pointer to an entry that is not in the dictionary, the entire dictionary will be searched.
			/// </param>
			/// <returns>The interface pointer to the dictionary entry whose key matches key.</returns>
			/// <remarks>
			/// The interface pointers stored in a dictionary will usually point to interfaces, such as IXpsOMBrush and IXpsOMVisual, that
			/// are derived from the IXpsOMShareable interface. To determine the interface type, call the IXpsOMShareable::GetType method.
			/// </remarks>
			// https://docs.microsoft.com/en-us/windows/win32/api/xpsobjectmodel/nf-xpsobjectmodel-ixpsomdictionary-getbykey HRESULT
			// GetByKey( LPCWSTR key, IXpsOMShareable *beforeEntry, IXpsOMShareable **entry );
			IXpsOMShareable GetByKey([In, MarshalAs(UnmanagedType.LPWStr)] string key, [In] IXpsOMShareable beforeEntry);

			/// <summary>Gets the index of an IXpsOMShareable interface from the dictionary.</summary>
			/// <param name="entry">The IXpsOMShareable interface pointer to be found in the dictionary.</param>
			/// <returns>The zero-based index of entry in the dictionary.</returns>
			// https://docs.microsoft.com/en-us/windows/win32/api/xpsobjectmodel/nf-xpsobjectmodel-ixpsomdictionary-getindex HRESULT
			// GetIndex( IXpsOMShareable *entry, UINT32 *index );
			uint GetIndex([In] IXpsOMShareable entry);

			/// <summary>Appends an IXpsOMShareable interface along with its key to the end of the dictionary.</summary>
			/// <param name="key">
			/// <para>The key to be used for this entry.</para>
			/// <para>The string referenced by key must be unique in the dictionary.</para>
			/// </param>
			/// <param name="entry">
			/// <para>A pointer to the IXpsOMShareable interface that is to be appended to the dictionary.</para>
			/// <para>
			/// A dictionary cannot contain duplicate interface pointers. This parameter must contain an interface pointer that is not
			/// already in the dictionary.
			/// </para>
			/// </param>
			/// <remarks>
			/// <para>
			/// The interface pointers stored in a dictionary will usually point to interfaces, such as IXpsOMBrush and IXpsOMVisual, that
			/// are derived from the IXpsOMShareable interface. To determine the interface type, call the IXpsOMShareable::GetType method.
			/// </para>
			/// <para>The figure that follows illustrates how the dictionary is changed by the <c>Append</c> method.</para>
			/// </remarks>
			// https://docs.microsoft.com/en-us/windows/win32/api/xpsobjectmodel/nf-xpsobjectmodel-ixpsomdictionary-append HRESULT Append(
			// LPCWSTR key, IXpsOMShareable *entry );
			void Append([In, MarshalAs(UnmanagedType.LPWStr)] string key, [In] IXpsOMShareable entry);

			/// <summary>
			/// Inserts an IXpsOMShareable interface at a specified location in the dictionary and sets the key to identify the interface.
			/// </summary>
			/// <param name="index">The zero-based index in the dictionary where the IXpsOMShareable interface is to be inserted.</param>
			/// <param name="key">
			/// <para>The key to be used to identify the IXpsOMShareable interface in the dictionary.</para>
			/// <para>The string referenced by key must be unique in the dictionary.</para>
			/// </param>
			/// <param name="entry">
			/// <para>The IXpsOMShareable interface pointer to be inserted at the location specified by index.</para>
			/// <para>
			/// A dictionary cannot contain duplicate interface pointers. This parameter must contain an interface pointer that is not
			/// already in the dictionary.
			/// </para>
			/// </param>
			/// <remarks>
			/// <para>
			/// The interface pointers stored in the dictionary will usually be pointers to interfaces, such as IXpsOMBrush and
			/// IXpsOMVisual, that are derived from the IXpsOMShareable interface. To determine the interface type, call the
			/// IXpsOMShareable::GetType method.
			/// </para>
			/// <para>
			/// At the location specified by index, this method inserts the IXpsOMShareable interface pointer and sets the key; the
			/// interface pointer and key are passed in value and key, respectively. Before value and key are inserted, the interface
			/// pointer and the key at this and all subsequent locations are moved up by one index.
			/// </para>
			/// <para>The figure that follows illustrates how the dictionary is changed by the <c>InsertAt</c> method.</para>
			/// </remarks>
			// https://docs.microsoft.com/en-us/windows/win32/api/xpsobjectmodel/nf-xpsobjectmodel-ixpsomdictionary-insertat HRESULT
			// InsertAt( UINT32 index, LPCWSTR key, IXpsOMShareable *entry );
			void InsertAt([In] uint index, [In, MarshalAs(UnmanagedType.LPWStr)] string key, [In] IXpsOMShareable entry);

			/// <summary>Removes and releases the entry from a specified location in the dictionary.</summary>
			/// <param name="index">The zero-based index in the dictionary from which an entry is to be removed and released.</param>
			/// <remarks>
			/// <para>
			/// At the location specified by index, this method releases the interface referenced by the pointer. After releasing the
			/// interface, this method compacts the dictionary by reducing by 1 the index of each pointer subsequent to index.
			/// </para>
			/// <para>The figure that follows illustrates how the dictionary is changed by the <c>RemoveAt</c> method.</para>
			/// </remarks>
			// https://docs.microsoft.com/en-us/windows/win32/api/xpsobjectmodel/nf-xpsobjectmodel-ixpsomdictionary-removeat HRESULT
			// RemoveAt( UINT32 index );
			void RemoveAt([In] uint index);

			/// <summary>Replaces the entry at a specified location in the dictionary.</summary>
			/// <param name="index">The zero-based index in the dictionary in which an entry is to be replaced.</param>
			/// <param name="key">
			/// <para>The key to be used for the new entry.</para>
			/// <para>The string referenced by key must be unique in the dictionary.</para>
			/// </param>
			/// <param name="entry">
			/// <para>The IXpsOMShareable interface pointer that will replace current contents at the location specified by index.</para>
			/// <para>
			/// A dictionary cannot contain duplicate interface pointers. This parameter must contain an interface pointer that is not
			/// already in the dictionary.
			/// </para>
			/// </param>
			/// <remarks>
			/// <para>
			/// At the location specified by index, this method releases the IXpsOMShareable interface referenced by the existing pointer,
			/// then replaces it with the interface pointer that is passed in entry and assigns it the key passed in key.
			/// </para>
			/// <para>
			/// The interface pointers stored in a dictionary will usually point to interfaces, such as IXpsOMBrush and IXpsOMVisual, that
			/// are derived from the IXpsOMShareable interface. To determine the interface type, call the GetType method.
			/// </para>
			/// <para>The figure that follows illustrates how the dictionary is changed by the <c>SetAt</c> method.</para>
			/// </remarks>
			// https://docs.microsoft.com/en-us/windows/win32/api/xpsobjectmodel/nf-xpsobjectmodel-ixpsomdictionary-setat HRESULT SetAt(
			// UINT32 index, LPCWSTR key, IXpsOMShareable *entry );
			void SetAt([In] uint index, [In, MarshalAs(UnmanagedType.LPWStr)] string key, [In] IXpsOMShareable entry);

			/// <summary>Makes a deep copy of the interface.</summary>
			/// <returns>A pointer to the copy of the interface.</returns>
			// https://docs.microsoft.com/en-us/windows/win32/api/xpsobjectmodel/nf-xpsobjectmodel-ixpsomdictionary-clone HRESULT Clone(
			// IXpsOMDictionary **dictionary );
			IXpsOMDictionary Clone();
		}

		/// <summary>
		/// Provides access to the XML content of the resource stream of the DocumentStructure part.The
		/// <c>IXpsOMDocumentStructureResource</c> interface enables a program to read and replace the XML content of the DocumentStructure part.
		/// </summary>
		/// <remarks>
		/// <para>
		/// The DocumentStructure part of an XPS document contains the document outline, which, along with the StoryFragments parts, defines
		/// the reading order of every element that appears in the fixed pages of the document.
		/// </para>
		/// <para>
		/// The reading order of an XPS document is organized into semantic blocks called stories. Stories are logical units of the
		/// document, in the same way that articles are units in a magazine. Stories are made up of one or more StoryFragments parts;
		/// StoryFragments parts contain the XML markup that defines the story's semantic blocks, which describe the structure of the
		/// document's content. Examples of a story's semantic blocks include paragraphs and tables.
		/// </para>
		/// <para>The XML markup in the DocumentStructure and StoryFragments parts is described in the XML Paper Specification.</para>
		/// </remarks>
		// https://docs.microsoft.com/en-us/windows/win32/api/xpsobjectmodel/nn-xpsobjectmodel-ixpsomdocumentstructureresource
		[PInvokeData("xpsobjectmodel.h", MSDNShortId = "a0cc8748-08b2-4471-9961-603786e983a4")]
		[ComImport, Guid("85FEBC8A-6B63-48A9-AF07-7064E4ECFF30"), InterfaceType(ComInterfaceType.InterfaceIsIUnknown)]
		public interface IXpsOMDocumentStructureResource : IXpsOMResource
		{
			/// <summary>Gets the name that will be used when the part is serialized.</summary>
			/// <returns>
			/// A pointer to the IOpcPartUri interface that contains the part name. If the part name has not been set (by the SetPartName
			/// method), a <c>NULL</c> pointer is returned.
			/// </returns>
			// https://docs.microsoft.com/en-us/windows/win32/api/xpsobjectmodel/nf-xpsobjectmodel-ixpsompart-getpartname HRESULT
			// GetPartName( IOpcPartUri **partUri );
			[MethodImpl(MethodImplOptions.InternalCall)]
			new IOpcPartUri GetPartName();

			/// <summary>Sets the name that will be used when the part is serialized.</summary>
			/// <param name="partUri">
			/// A pointer to the IOpcPartUri interface that contains the name of this part. This parameter cannot be <c>NULL</c>.
			/// </param>
			/// <remarks>
			/// IXpsOMPackageWriter will generate an error if it encounters an XPS document part whose name is the same as that of a part it
			/// has previously serialized.
			/// </remarks>
			// https://docs.microsoft.com/en-us/windows/win32/api/xpsobjectmodel/nf-xpsobjectmodel-ixpsompart-setpartname HRESULT
			// SetPartName( IOpcPartUri *partUri );
			[MethodImpl(MethodImplOptions.InternalCall)]
			new void SetPartName([In] IOpcPartUri partUri);

			/// <summary>Gets a pointer to the IXpsOMDocument interface that contains the resource.</summary>
			/// <returns>
			/// A pointer to the IXpsOMDocument interface that contains the resource. If the resource is not part of a document, a NULL
			/// pointer is returned.
			/// </returns>
			// https://docs.microsoft.com/en-us/windows/win32/api/xpsobjectmodel/nf-xpsobjectmodel-ixpsomdocumentstructureresource-getowner
			[MethodImpl(MethodImplOptions.InternalCall)]
			IXpsOMDocument GetOwner();

			/// <summary>Gets a new, read-only copy of the stream that is associated with this resource.</summary>
			/// <returns>A new, read-only copy of the stream that is associated with this resource.</returns>
			/// <remarks>
			/// <para>
			/// The IStream object returned by this method might return an error of E_PENDING, which indicates that the stream length has
			/// not been determined yet. This behavior is different from that of a standard <c>IStream</c> object.
			/// </para>
			/// <para>For more information about the content of DocumentStructure part, see the XML Paper Specification.</para>
			/// <para>
			/// This method calls the stream's <c>Clone</c> method to create the stream returned in stream. As a result, the performance of
			/// this method will depend on that of the stream's <c>Clone</c> method.
			/// </para>
			/// </remarks>
			// https://docs.microsoft.com/en-us/windows/win32/api/xpsobjectmodel/nf-xpsobjectmodel-ixpsomdocumentstructureresource-getstream
			// HRESULT GetStream( IStream **stream );
			[MethodImpl(MethodImplOptions.InternalCall)]
			IStream GetStream();

			/// <summary>Sets the read-only stream to be associated with this resource.</summary>
			/// <param name="sourceStream">The read-only stream to be associated with this resource.</param>
			/// <param name="partName">The part name to be assigned to this resource.</param>
			/// <remarks>
			/// <para>
			/// The calling method should treat this stream as a single-threaded apartment (STA) model object and not re-enter any of the
			/// stream interface's methods.
			/// </para>
			/// <para>For more information about the content of DocumentStructure part, see the XML Paper Specification.</para>
			/// <para>
			/// Because GetStream gets a clone of the stream that is set by this method, the provided stream should have an efficient
			/// cloning method. A stream with an inefficient cloning method will reduce the performance of <c>GetStream</c>.
			/// </para>
			/// </remarks>
			// https://docs.microsoft.com/en-us/windows/win32/api/xpsobjectmodel/nf-xpsobjectmodel-ixpsomdocumentstructureresource-setcontent
			// HRESULT SetContent( IStream *sourceStream, IOpcPartUri *partName );
			[MethodImpl(MethodImplOptions.InternalCall)]
			void SetContent([In] IStream sourceStream, [In] IOpcPartUri partName);
		}

		/// <summary>Provides an IStream interface to a font resource.</summary>
		/// <remarks>The code example that follows illustrates how to create an instance of this interface.</remarks>
		// https://docs.microsoft.com/en-us/windows/win32/api/xpsobjectmodel/nn-xpsobjectmodel-ixpsomfontresource
		[PInvokeData("xpsobjectmodel.h", MSDNShortId = "dd0ce1c0-1c04-46a8-9075-93de9b3e3062")]
		[ComImport, Guid("A8C45708-47D9-4AF4-8D20-33B48C9B8485"), InterfaceType(ComInterfaceType.InterfaceIsIUnknown)]
		public interface IXpsOMFontResource : IXpsOMResource
		{
			/// <summary>Gets the name that will be used when the part is serialized.</summary>
			/// <returns>
			/// A pointer to the IOpcPartUri interface that contains the part name. If the part name has not been set (by the SetPartName
			/// method), a <c>NULL</c> pointer is returned.
			/// </returns>
			// https://docs.microsoft.com/en-us/windows/win32/api/xpsobjectmodel/nf-xpsobjectmodel-ixpsompart-getpartname HRESULT
			// GetPartName( IOpcPartUri **partUri );
			[MethodImpl(MethodImplOptions.InternalCall)]
			new IOpcPartUri GetPartName();

			/// <summary>Sets the name that will be used when the part is serialized.</summary>
			/// <param name="partUri">
			/// A pointer to the IOpcPartUri interface that contains the name of this part. This parameter cannot be <c>NULL</c>.
			/// </param>
			/// <remarks>
			/// IXpsOMPackageWriter will generate an error if it encounters an XPS document part whose name is the same as that of a part it
			/// has previously serialized.
			/// </remarks>
			// https://docs.microsoft.com/en-us/windows/win32/api/xpsobjectmodel/nf-xpsobjectmodel-ixpsompart-setpartname HRESULT
			// SetPartName( IOpcPartUri *partUri );
			[MethodImpl(MethodImplOptions.InternalCall)]
			new void SetPartName([In] IOpcPartUri partUri);

			/// <summary>Gets a new, read-only copy of the stream that is associated with this resource.</summary>
			/// <returns>A new, read-only copy of the stream that is associated with this resource.</returns>
			/// <remarks>
			/// <para>
			/// The IStream object returned by this method might return an error of E_PENDING, which indicates that the stream length has
			/// not been determined yet. This behavior is different from that of a standard <c>IStream</c> object.
			/// </para>
			/// <para>
			/// This method calls the stream's <c>Clone</c> method to create the stream returned in stream. As a result, the performance of
			/// this method will depend on that of the stream's <c>Clone</c> method.
			/// </para>
			/// </remarks>
			// https://docs.microsoft.com/en-us/windows/win32/api/xpsobjectmodel/nf-xpsobjectmodel-ixpsomfontresource-getstream HRESULT
			// GetStream( IStream **readerStream );
			[MethodImpl(MethodImplOptions.InternalCall)]
			IStream GetStream();

			/// <summary>Sets the read-only stream to be associated with this resource.</summary>
			/// <param name="sourceStream">The read-only stream to be associated with this resource.</param>
			/// <param name="embeddingOption">
			/// <para>The XPS_FONT_EMBEDDING value that describes how the resource is to be obfuscated.</para>
			/// <list type="table">
			/// <listheader>
			/// <term>Value</term>
			/// <term>Meaning</term>
			/// </listheader>
			/// <item>
			/// <term>XPS_FONT_EMBEDDING_NORMAL</term>
			/// <term>Font resource is neither obfuscated nor restricted.</term>
			/// </item>
			/// <item>
			/// <term>XPS_FONT_EMBEDDING_OBFUSCATED</term>
			/// <term>Font resource is obfuscated but not restricted.</term>
			/// </item>
			/// <item>
			/// <term>XPS_FONT_EMBEDDING_RESTRICTED</term>
			/// <term>Font resource is both obfuscated and restricted.</term>
			/// </item>
			/// </list>
			/// </param>
			/// <param name="partName">The part name to be assigned to this resource.</param>
			/// <remarks>
			/// <para>
			/// The calling method should treat this stream as a single-threaded apartment (STA) model object and not re-enter any of the
			/// stream interface's methods.
			/// </para>
			/// <para>
			/// The stream assigned to this resource should not be obfuscated. Obfuscation of the font resource takes place during serialization.
			/// </para>
			/// <para>
			/// Providing an obfuscated font stream while setting the embeddingOption to XPS_FONT_EMBEDDING_OBFUSCATED will result in a font
			/// that is not obfuscated in the serialized XPS document.
			/// </para>
			/// <para>
			/// partName resets the part name for this object and is checked against the value of embeddingOption for the proper obfuscation syntax.
			/// </para>
			/// <para>
			/// Because GetStream gets a clone of the stream that is set by this method, the provided stream should have an efficient
			/// cloning method. A stream with an inefficient cloning method will reduce the performance of <c>GetStream</c>.
			/// </para>
			/// </remarks>
			// https://docs.microsoft.com/en-us/windows/win32/api/xpsobjectmodel/nf-xpsobjectmodel-ixpsomfontresource-setcontent HRESULT
			// SetContent( IStream *sourceStream, XPS_FONT_EMBEDDING embeddingOption, IOpcPartUri *partName );
			[MethodImpl(MethodImplOptions.InternalCall)]
			void SetContent([In] IStream sourceStream, [In] XPS_FONT_EMBEDDING embeddingOption, [In] IOpcPartUri partName);

			/// <summary>Gets the embedding option that will be applied when the resource is serialized.</summary>
			/// <returns>
			/// <para>The stream's embedding option.</para>
			/// <para>
			/// The XPS_FONT_EMBEDDING value describes how the resource is obfuscated. The following possible values are returned in this parameter:
			/// </para>
			/// <list type="table">
			/// <listheader>
			/// <term>Value</term>
			/// <term>Meaning</term>
			/// </listheader>
			/// <item>
			/// <term>XPS_FONT_EMBEDDING_NORMAL</term>
			/// <term>Font resource is neither obfuscated nor restricted.</term>
			/// </item>
			/// <item>
			/// <term>XPS_FONT_EMBEDDING_OBFUSCATED</term>
			/// <term>Font resource is obfuscated but not restricted.</term>
			/// </item>
			/// <item>
			/// <term>XPS_FONT_EMBEDDING_RESTRICTED</term>
			/// <term>Font resource is both obfuscated and restricted.</term>
			/// </item>
			/// </list>
			/// </returns>
			// https://docs.microsoft.com/en-us/windows/win32/api/xpsobjectmodel/nf-xpsobjectmodel-ixpsomfontresource-getembeddingoption
			// HRESULT GetEmbeddingOption( XPS_FONT_EMBEDDING *embeddingOption );
			[MethodImpl(MethodImplOptions.InternalCall)]
			XPS_FONT_EMBEDDING GetEmbeddingOption();
		}

		/// <summary>A collection of IXpsOMFontResource interface pointers.</summary>
		/// <remarks>For more information about the collection methods, see Working with XPS OM Collection Interfaces.</remarks>
		// https://docs.microsoft.com/en-us/windows/win32/api/xpsobjectmodel/nn-xpsobjectmodel-ixpsomfontresourcecollection
		[PInvokeData("xpsobjectmodel.h", MSDNShortId = "71153c4c-631b-4f7a-9dd5-8537dcaca150")]
		[ComImport, Guid("70B4A6BB-88D4-4FA8-AAF9-6D9C596FDBAD"), InterfaceType(ComInterfaceType.InterfaceIsIUnknown)]
		public interface IXpsOMFontResourceCollection
		{
			/// <summary>Gets the number of IXpsOMFontResource interface pointers in the collection.</summary>
			/// <returns>The number of IXpsOMFontResource interface pointers in the collection.</returns>
			/// <remarks>For more information about the collection methods, see Working with XPS OM Collection Interfaces.</remarks>
			// https://docs.microsoft.com/en-us/windows/win32/api/xpsobjectmodel/nf-xpsobjectmodel-ixpsomfontresourcecollection-getcount
			// HRESULT GetCount( UINT32 *count );
			[MethodImpl(MethodImplOptions.InternalCall)]
			uint GetCount();

			/// <summary>Gets an IXpsOMFontResource interface pointer from a specified location in the collection.</summary>
			/// <param name="index">The zero-based index of the IXpsOMFontResource interface pointer to be obtained.</param>
			/// <returns>The IXpsOMFontResource interface pointer at the location specified by index.</returns>
			/// <remarks>For more information about the collection methods, see Working with XPS OM Collection Interfaces.</remarks>
			// https://docs.microsoft.com/en-us/windows/win32/api/xpsobjectmodel/nf-xpsobjectmodel-ixpsomfontresourcecollection-getat
			// HRESULT GetAt( UINT32 index, IXpsOMFontResource **value );
			[MethodImpl(MethodImplOptions.InternalCall)]
			IXpsOMFontResource GetAt([In] uint index);

			/// <summary>Replaces an IXpsOMFontResource interface pointer at a specified location in the collection.</summary>
			/// <param name="index">The zero-based index in the collection where an IXpsOMFontResource interface pointer is to be replaced.</param>
			/// <param name="value">
			/// The IXpsOMFontResource interface pointer that will replace current contents at the location specified by index.
			/// </param>
			/// <remarks>
			/// <para>
			/// At the location specified by index, this method releases the IXpsOMFontResource interface referenced by the existing
			/// pointer, then writes the pointer that is passed in value.
			/// </para>
			/// <para>For more information about the collection methods, see Working with XPS OM Collection Interfaces.</para>
			/// </remarks>
			// https://docs.microsoft.com/en-us/windows/win32/api/xpsobjectmodel/nf-xpsobjectmodel-ixpsomfontresourcecollection-setat
			// HRESULT SetAt( UINT32 index, IXpsOMFontResource *value );
			[MethodImpl(MethodImplOptions.InternalCall)]
			void SetAt([In] uint index, [In] IXpsOMFontResource value);

			/// <summary>Inserts an IXpsOMFontResource interface pointer at a specified location in the collection.</summary>
			/// <param name="index">
			/// The zero-based index in the collection where the interface pointer that is passed in value is to be inserted.
			/// </param>
			/// <param name="value">The IXpsOMFontResource interface pointer that is to be inserted at the location specified by index.</param>
			/// <remarks>
			/// <para>
			/// At the location specified by index, this method inserts the IXpsOMFontResource interface pointer that is passed in value.
			/// Prior to the insertion, the pointer in this and all subsequent locations is moved up by one index.
			/// </para>
			/// <para>For more information about the collection methods, see Working with XPS OM Collection Interfaces.</para>
			/// </remarks>
			// https://docs.microsoft.com/en-us/windows/win32/api/xpsobjectmodel/nf-xpsobjectmodel-ixpsomfontresourcecollection-insertat
			// HRESULT InsertAt( UINT32 index, IXpsOMFontResource *value );
			[MethodImpl(MethodImplOptions.InternalCall)]
			void InsertAt([In] uint index, [In] IXpsOMFontResource value);

			/// <summary>Appends an IXpsOMFontResource interface to the end of the collection.</summary>
			/// <param name="value">A pointer to the IXpsOMFontResource interface that is to be appended to the collection.</param>
			/// <remarks>For more information about the collection methods, see Working with XPS OM Collection Interfaces.</remarks>
			// https://docs.microsoft.com/en-us/windows/win32/api/xpsobjectmodel/nf-xpsobjectmodel-ixpsomfontresourcecollection-append
			// HRESULT Append( IXpsOMFontResource *value );
			[MethodImpl(MethodImplOptions.InternalCall)]
			void Append([In] IXpsOMFontResource value);

			/// <summary>Removes and releases an IXpsOMFontResource interface pointer from a specified location in the collection.</summary>
			/// <param name="index">
			/// The zero-based index in the collection from which an IXpsOMFontResource interface pointer is to be removed and released.
			/// </param>
			/// <remarks>
			/// <para>
			/// This method releases the interface referenced by the pointer at the location specified by index. After releasing the
			/// interface, this method compacts the collection by reducing by 1 the index of each pointer subsequent to index.
			/// </para>
			/// <para>For more information about the collection methods, see Working with XPS OM Collection Interfaces.</para>
			/// </remarks>
			// https://docs.microsoft.com/en-us/windows/win32/api/xpsobjectmodel/nf-xpsobjectmodel-ixpsomfontresourcecollection-removeat
			// HRESULT RemoveAt( UINT32 index );
			[MethodImpl(MethodImplOptions.InternalCall)]
			void RemoveAt([In] uint index);

			/// <summary>Gets an IXpsOMFontResource interface pointer from the collection by matching the interface's part name.</summary>
			/// <param name="partName">The part name of the IXpsOMFontResource interface to be found in the collection.</param>
			/// <returns>
			/// A pointer to the IXpsOMFontResource interface that has the matching part name. If a matching interface is not found in the
			/// collection, a <c>NULL</c> pointer is returned.
			/// </returns>
			// https://docs.microsoft.com/en-us/windows/win32/api/xpsobjectmodel/nf-xpsobjectmodel-ixpsomfontresourcecollection-getbypartname
			// HRESULT GetByPartName( IOpcPartUri *partName, IXpsOMFontResource **part );
			[MethodImpl(MethodImplOptions.InternalCall)]
			IXpsOMFontResource GetByPartName([In] IOpcPartUri partName);
		}

		/// <summary>Describes the shape of a path or of a clipping region.</summary>
		/// <remarks>The code example that follows illustrates how to create an instance of this interface.</remarks>
		// https://docs.microsoft.com/en-us/windows/win32/api/xpsobjectmodel/nn-xpsobjectmodel-ixpsomgeometry
		[PInvokeData("xpsobjectmodel.h", MSDNShortId = "d3f74c1e-49ef-40ee-a2f4-b6d198b57624")]
		[ComImport, Guid("64FCF3D7-4D58-44BA-AD73-A13AF6492072"), InterfaceType(ComInterfaceType.InterfaceIsIUnknown)]
		public interface IXpsOMGeometry : IXpsOMShareable
		{
			/// <summary>Gets the <c>IUnknown</c> interface of the parent.</summary>
			/// <returns>A pointer to the <c>IUnknown</c> interface of the parent.</returns>
			// https://docs.microsoft.com/en-us/windows/win32/api/xpsobjectmodel/nf-xpsobjectmodel-ixpsomshareable-getowner HRESULT
			// GetOwner( IUnknown **owner );
			[return: MarshalAs(UnmanagedType.IUnknown)]
			new object GetOwner();

			/// <summary>Gets the object type of the interface.</summary>
			/// <returns>The XPS_OBJECT_TYPE value that describes the interface that is derived from IXpsOMShareable.</returns>
			// https://docs.microsoft.com/en-us/windows/win32/api/xpsobjectmodel/nf-xpsobjectmodel-ixpsomshareable-gettype HRESULT GetType(
			// XPS_OBJECT_TYPE *type );
			new XPS_OBJECT_TYPE GetType();

			/// <summary>
			/// Gets a pointer to the geometry's IXpsOMGeometryFigureCollection interface, which contains the collection of figures that
			/// make up this geometry.
			/// </summary>
			/// <returns>A pointer to the IXpsOMGeometryFigureCollection interface.</returns>
			// https://docs.microsoft.com/en-us/windows/win32/api/xpsobjectmodel/nf-xpsobjectmodel-ixpsomgeometry-getfigures HRESULT
			// GetFigures( IXpsOMGeometryFigureCollection **figures );
			IXpsOMGeometryFigureCollection GetFigures();

			/// <summary>Gets the XPS_FILL_RULE value that describes the fill rule to be used.</summary>
			/// <returns>The XPS_FILL_RULE value that describes the fill rule to be used.</returns>
			/// <remarks>
			/// <para>For more information about how the file rule determines whether a point is inside the fill region, see XPS_FILL_RULE.</para>
			/// <para>
			/// The value that is returned in fillRule corresponds to the <c>FillRule</c> attribute of the <c>PathGeometry</c> element in
			/// the document markup.
			/// </para>
			/// </remarks>
			// https://docs.microsoft.com/en-us/windows/win32/api/xpsobjectmodel/nf-xpsobjectmodel-ixpsomgeometry-getfillrule HRESULT
			// GetFillRule( XPS_FILL_RULE *fillRule );
			XPS_FILL_RULE GetFillRule();

			/// <summary>Sets the XPS_FILL_RULE value that describes the fill rule to be used.</summary>
			/// <param name="fillRule">The XPS_FILL_RULE value that describes the fill rule to be used.</param>
			/// <remarks>
			/// <para>For more information about how the file rule determines whether a point is inside the fill region, see XPS_FILL_RULE.</para>
			/// <para>In the document markup, this value corresponds to the <c>FillRule</c> attribute of the <c>PathGeometry</c> element.</para>
			/// </remarks>
			// https://docs.microsoft.com/en-us/windows/win32/api/xpsobjectmodel/nf-xpsobjectmodel-ixpsomgeometry-setfillrule HRESULT
			// SetFillRule( XPS_FILL_RULE fillRule );
			void SetFillRule([In] XPS_FILL_RULE fillRule);

			/// <summary>
			/// Gets a pointer to the geometry's IXpsOMMatrixTransform interface, which contains the resolved matrix transform for the geometry.
			/// </summary>
			/// <returns>
			/// <para>
			/// A pointer to the geometry's IXpsOMMatrixTransform interface, which contains the resolved matrix transform for the geometry.
			/// If a matrix transform has not been set, a <c>NULL</c> pointer will be returned.
			/// </para>
			/// <para>The value that is returned in this parameter depends on which method has most recently been called to set the transform.</para>
			/// <list type="table">
			/// <listheader>
			/// <term>Most recent method called</term>
			/// <term>Object that is returned in transform</term>
			/// </listheader>
			/// <item>
			/// <term>SetTransformLocal</term>
			/// <term>The local transform that is set by SetTransformLocal.</term>
			/// </item>
			/// <item>
			/// <term>SetTransformLookup</term>
			/// <term>
			/// The shared transform retrieved, with a lookup key that matches the key that is set by SetTransformLookup, from the resource directory.
			/// </term>
			/// </item>
			/// <item>
			/// <term>Neither SetTransformLocal nor SetTransformLookup has been called yet.</term>
			/// <term>NULL pointer.</term>
			/// </item>
			/// </list>
			/// </returns>
			// https://docs.microsoft.com/en-us/windows/win32/api/xpsobjectmodel/nf-xpsobjectmodel-ixpsomgeometry-gettransform HRESULT
			// GetTransform( IXpsOMMatrixTransform **transform );
			IXpsOMMatrixTransform GetTransform();

			/// <summary>
			/// Gets a pointer to the IXpsOMMatrixTransform interface that contains the local, unshared matrix transform for the geometry.
			/// </summary>
			/// <returns>
			/// <para>
			/// A pointer to the IXpsOMMatrixTransform interface that contains the local, unshared matrix transform for the geometry. A
			/// <c>NULL</c> pointer is returned if a local matrix transform has not been set or a matrix transform lookup key has been set.
			/// </para>
			/// <para>The value that is returned in this parameter depends on which method has most recently been called to set the transform.</para>
			/// <list type="table">
			/// <listheader>
			/// <term>Most recent method called</term>
			/// <term>Object that is returned in transform</term>
			/// </listheader>
			/// <item>
			/// <term>SetTransformLocal</term>
			/// <term>The local transform that is set by SetTransformLocal.</term>
			/// </item>
			/// <item>
			/// <term>SetTransformLookup</term>
			/// <term>NULL pointer.</term>
			/// </item>
			/// <item>
			/// <term>Neither SetTransformLocal nor SetTransformLookup has been called yet.</term>
			/// <term>NULL pointer.</term>
			/// </item>
			/// </list>
			/// </returns>
			// https://docs.microsoft.com/en-us/windows/win32/api/xpsobjectmodel/nf-xpsobjectmodel-ixpsomgeometry-gettransformlocal HRESULT
			// GetTransformLocal( IXpsOMMatrixTransform **transform );
			IXpsOMMatrixTransform GetTransformLocal();

			/// <summary>Sets the local, unshared matrix transform.</summary>
			/// <param name="transform">
			/// A pointer to the IXpsOMMatrixTransform interface to be set as the local, unshared matrix transform for the geometry.
			/// </param>
			/// <remarks>
			/// <para>
			/// After you call <c>SetTransformLocal</c>, the transform lookup key is released and GetTransformLookup returns a <c>NULL</c>
			/// pointer in the lookup parameter. The table that follows explains the relationship between the local and lookup values of
			/// this property.
			/// </para>
			/// <list type="table">
			/// <listheader>
			/// <term>Most recent method called</term>
			/// <term>Object that is returned in transform by GetTransform</term>
			/// <term>Object that is returned in transform by GetTransformLocal</term>
			/// <term>Object that is returned in lookup by GetTransformLookup</term>
			/// </listheader>
			/// <item>
			/// <term>SetTransformLocal (this method)</term>
			/// <term>The local transform that is set by SetTransformLocal.</term>
			/// <term>The local transform that is set by SetTransformLocal.</term>
			/// <term>NULL pointer.</term>
			/// </item>
			/// <item>
			/// <term>SetTransformLookup</term>
			/// <term>
			/// The shared transform retrieved, with a lookup key that matches the key that is set by SetTransformLookup, from the resource directory.
			/// </term>
			/// <term>NULL pointer.</term>
			/// <term>The lookup key that is set by SetTransformLookup.</term>
			/// </item>
			/// <item>
			/// <term>Neither SetTransformLocal nor SetTransformLookup has been called yet.</term>
			/// <term>NULL pointer.</term>
			/// <term>NULL pointer.</term>
			/// <term>NULL pointer.</term>
			/// </item>
			/// </list>
			/// </remarks>
			// https://docs.microsoft.com/en-us/windows/win32/api/xpsobjectmodel/nf-xpsobjectmodel-ixpsomgeometry-settransformlocal HRESULT
			// SetTransformLocal( IXpsOMMatrixTransform *transform );
			void SetTransformLocal([In] IXpsOMMatrixTransform transform);

			/// <summary>
			/// Gets the lookup key for the IXpsOMMatrixTransform interface that contains the resolved matrix transform for the geometry.
			/// The matrix transform is stored in a resource dictionary.
			/// </summary>
			/// <returns>
			/// <para>
			/// The lookup key for the IXpsOMMatrixTransform interface in a resource dictionary. A <c>NULL</c> pointer is returned if a
			/// matrix transform lookup key has not been set or if a local matrix transform has been set.
			/// </para>
			/// <para>The value that is returned in this parameter depends on which method has most recently been called to set the transform.</para>
			/// <list type="table">
			/// <listheader>
			/// <term>Most recent method called</term>
			/// <term>Object that is returned in lookup</term>
			/// </listheader>
			/// <item>
			/// <term>SetTransformLocal</term>
			/// <term>NULL pointer.</term>
			/// </item>
			/// <item>
			/// <term>SetTransformLookup</term>
			/// <term>The lookup key set by SetTransformLookup.</term>
			/// </item>
			/// <item>
			/// <term>Neither SetTransformLocal nor SetTransformLookup has been called yet.</term>
			/// <term>NULL pointer.</term>
			/// </item>
			/// </list>
			/// </returns>
			// https://docs.microsoft.com/en-us/windows/win32/api/xpsobjectmodel/nf-xpsobjectmodel-ixpsomgeometry-gettransformlookup HRESULT
			// GetTransformLookup( LPWSTR *lookup );
			SafeCoTaskMemString GetTransformLookup();

			/// <summary>Sets the lookup key name of a shared matrix transform in a resource dictionary.</summary>
			/// <param name="lookup">The key name of the shared matrix transform in the resource dictionary.</param>
			/// <remarks>
			/// <para>
			/// After you call <c>SetTransformLookup</c>, the local transform is released and GetTransformLocal returns a <c>NULL</c>
			/// pointer in the transform parameter. The table that follows explains the relationship between the local and lookup values of
			/// this property.
			/// </para>
			/// <list type="table">
			/// <listheader>
			/// <term>Most recent method called</term>
			/// <term>Object that is returned in transform by GetTransform</term>
			/// <term>Object that is returned in transform by GetTransformLocal</term>
			/// <term>Object that is returned in lookup by GetTransformLookup</term>
			/// </listheader>
			/// <item>
			/// <term>SetTransformLocal</term>
			/// <term>The local transform that is set by SetTransformLocal.</term>
			/// <term>The local transform that is set by SetTransformLocal.</term>
			/// <term>NULL pointer.</term>
			/// </item>
			/// <item>
			/// <term>SetTransformLookup (this method)</term>
			/// <term>
			/// The shared transform retrieved, with a lookup key that matches the key set by SetTransformLookup, from the resource directory.
			/// </term>
			/// <term>NULL pointer.</term>
			/// <term>The lookup key that is set by SetTransformLookup.</term>
			/// </item>
			/// <item>
			/// <term>Neither SetTransformLocal nor SetTransformLookup has been called yet.</term>
			/// <term>NULL pointer.</term>
			/// <term>NULL pointer.</term>
			/// <term>NULL pointer.</term>
			/// </item>
			/// </list>
			/// </remarks>
			// https://docs.microsoft.com/en-us/windows/win32/api/xpsobjectmodel/nf-xpsobjectmodel-ixpsomgeometry-settransformlookup HRESULT
			// SetTransformLookup( LPCWSTR lookup );
			void SetTransformLookup([In, MarshalAs(UnmanagedType.LPWStr)] string lookup);

			/// <summary>Makes a deep copy of the interface.</summary>
			/// <returns>A pointer to the copy of the interface.</returns>
			// https://docs.microsoft.com/en-us/windows/win32/api/xpsobjectmodel/nf-xpsobjectmodel-ixpsomgeometry-clone HRESULT Clone(
			// IXpsOMGeometry **geometry );
			IXpsOMGeometry Clone();
		}

		/// <summary>Describes one portion of the path or clipping region that is specified by an IXpsOMGeometry interface.</summary>
		/// <remarks>
		/// <para>The <c>IXpsOMGeometryFigure</c> corresponds to the <c>PathFigure</c> element in XPS markup.</para>
		/// <para>The code example that follows illustrates how to create an instance of this interface.</para>
		/// </remarks>
		// https://docs.microsoft.com/en-us/windows/win32/api/xpsobjectmodel/nn-xpsobjectmodel-ixpsomgeometryfigure
		[PInvokeData("xpsobjectmodel.h", MSDNShortId = "e76a14ce-cfc3-4a50-855e-f5779b9fc261")]
		[ComImport, Guid("D410DC83-908C-443E-8947-B1795D3C165A"), InterfaceType(ComInterfaceType.InterfaceIsIUnknown)]
		public interface IXpsOMGeometryFigure
		{
			/// <summary>Gets a pointer to the IXpsOMGeometry interface that contains the geometry figure.</summary>
			/// <returns>
			/// A pointer to the IXpsOMGeometry interface that contains the geometry figure. If the interface is not assigned to a geometry,
			/// a <c>NULL</c> pointer is returned.
			/// </returns>
			// https://docs.microsoft.com/en-us/windows/win32/api/xpsobjectmodel/nf-xpsobjectmodel-ixpsomgeometryfigure-getowner HRESULT
			// GetOwner( IXpsOMGeometry **owner );
			IXpsOMGeometry GetOwner();

			/// <summary>Gets the segment data points for the geometry figure.</summary>
			/// <param name="dataCount">
			/// <para>The size of the array referenced by the segmentData parameter.</para>
			/// <para>
			/// If the method returns successfully, dataCount will contain the number of elements returned in the array that is referenced
			/// by segmentData.
			/// </para>
			/// <para>If segmentData is set to <c>NULL</c> when the method is called, dataCount must be set to zero.</para>
			/// <para>
			/// If a <c>NULL</c> pointer is returned in segmentData, dataCount will contain the required buffer size as the number of elements.
			/// </para>
			/// </param>
			/// <param name="segmentData">
			/// <para>
			/// The address of an array that has the same number of elements as specified in dataCount. This value can be set to <c>NULL</c>
			/// if the caller requires that the method return only the required buffer size in dataCount.
			/// </para>
			/// <para>
			/// If the array is large enough, this method copies the segment data points into the array and returns, in dataCount, the
			/// number of data points that are copied. If segmentData is set to <c>NULL</c> or references a buffer that is not large enough,
			/// a <c>NULL</c> pointer will be returned, no data will be copied, and dataCount will contain the required buffer size
			/// specified as the number of elements.
			/// </para>
			/// </param>
			/// <remarks>
			/// <para>To determine the required size of the segment data array before calling this method, call GetSegmentDataCount.</para>
			/// <para>
			/// A geometry segment is described by the start point, the segment type, and additional parameters whose values are determined
			/// by the segment type. The coordinates for the start point of the first segment are a property of the geometry figure and are
			/// set by calling SetStartPoint. The start point of each subsequent segment is the end point of the preceding segment.
			/// </para>
			/// <para>
			/// The values in the array returned in the segmentData parameter will correspond with the XPS_SEGMENT_TYPE values in the array
			/// returned by the GetSegmentTypes method in the segmentTypes parameter. To read the segment data values correctly, you will
			/// need to know the type of each segment in the geometry figure. For example, if the first line segment has a segment type
			/// value of <c>XPS_SEGMENT_TYPE_LINE</c>, the first two data values in the segmentData array will be the x and y coordinates of
			/// the end point of that segment; if the next segment has a segment type value of <c>XPS_SEGMENT_TYPE_BEZIER</c>, the next six
			/// values in the segmentData array will describe the characteristics of that segment; and so on for each line segment in the
			/// geometry figure.
			/// </para>
			/// <para>
			/// The table that follows describes the specific set of data values that are returned for each segment type. For an example of
			/// how to access this data in a program, see the code example that follows.
			/// </para>
			/// <list type="table">
			/// <listheader>
			/// <term>Segment type</term>
			/// <term>Required data values</term>
			/// </listheader>
			/// <item>
			/// <term>XPS_SEGMENT_TYPE_LINE</term>
			/// <term>Two data values: x-coordinate of the segment line's end point. y-coordinate of the segment line's end point.</term>
			/// </item>
			/// <item>
			/// <term>XPS_SEGMENT_TYPE_ARC_LARGE_CLOCKWISE</term>
			/// <term>
			/// Five data values: x-coordinate of the arc's end point. y-coordinate of the arc's end point. Length of the ellipse's radius
			/// along the x-axis. Length of the ellipse's radius along the y-axis. Rotation angle.
			/// </term>
			/// </item>
			/// <item>
			/// <term>XPS_SEGMENT_TYPE_ARC_SMALL_CLOCKWISE</term>
			/// <term>
			/// Five data values: x-coordinate of the arc's end point. y-coordinate of the arc's end point. Length of the ellipse's radius
			/// along the x-axis. Length of the ellipse's radius along the y-axis. Rotation angle.
			/// </term>
			/// </item>
			/// <item>
			/// <term>XPS_SEGMENT_TYPE_ARC_LARGE_COUNTERCLOCKWISE</term>
			/// <term>
			/// Five data values: x-coordinate of the arc's end point. y-coordinate of the arc's end point. Length of the ellipse's radius
			/// along the x-axis. Length of the ellipse's radius along the y-axis. Rotation angle.
			/// </term>
			/// </item>
			/// <item>
			/// <term>XPS_SEGMENT_TYPE_ARC_SMALL_COUNTERCLOCKWISE</term>
			/// <term>
			/// Five data values: x-coordinate of the arc's end point. y-coordinate of the arc's end point. Length of the ellipse's radius
			/// along the x-axis. Length of the ellipse's radius along the y-axis. Rotation angle.
			/// </term>
			/// </item>
			/// <item>
			/// <term>XPS_SEGMENT_TYPE_BEZIER</term>
			/// <term>
			/// Six data values: x-coordinate of the Bezier curve's first control point. y-coordinate of the Bezier curve's first control
			/// point. x-coordinate of the Bezier curve's second control point. y-coordinate of the Bezier curve's second control point.
			/// x-coordinate of the Bezier curve's end point. y-coordinate of the Bezier curve's end point.
			/// </term>
			/// </item>
			/// <item>
			/// <term>XPS_SEGMENT_TYPE_QUADRATIC_BEZIER</term>
			/// <term>
			/// Four data values: x-coordinate of the Quad Bezier curve's control point. y-coordinate of the Quad Bezier curve's control
			/// point. x-coordinate of the Quad Bezier curve's end point. y-coordinate of the Quad Bezier curve's end point.
			/// </term>
			/// </item>
			/// </list>
			/// <para>The following code example accesses the different data points of each segment type in a geometry figure.</para>
			/// </remarks>
			// https://docs.microsoft.com/en-us/windows/win32/api/xpsobjectmodel/nf-xpsobjectmodel-ixpsomgeometryfigure-getsegmentdata
			// HRESULT GetSegmentData( UINT32 *dataCount, FLOAT *segmentData );
			void GetSegmentData([In, Out] ref uint dataCount, [In, Out] float[] segmentData);

			/// <summary>Gets the types of segments in the figure.</summary>
			/// <param name="segmentCount">
			/// <para>The size of the array that is referenced by segmentTypes (see below). This parameter must not be <c>NULL</c>.</para>
			/// <para>
			/// If the method returns successfully, segmentCount will contain the number of elements that are returned in the array
			/// referenced by segmentTypes.
			/// </para>
			/// <para>If segmentTypes is <c>NULL</c> when the method is called, segmentCount must be set to zero.</para>
			/// <para>
			/// If a <c>NULL</c> pointer is returned in segmentTypes, the value of segmentCount will contain the required buffer size,
			/// specified as the number of elements.
			/// </para>
			/// </param>
			/// <param name="segmentTypes">
			/// <para>
			/// An array of XPS_SEGMENT_TYPE values that has the same number of elements as specified in segmentCount. If the caller
			/// requires that only the specified buffer size be returned, set this value to <c>NULL</c>.
			/// </para>
			/// <para>
			/// If the array is large enough, this method will copy the XPS_SEGMENT_TYPE values into the array and return, in segmentCount,
			/// the number of the copied values. If segmentTypes is <c>NULL</c> or references a buffer that is not large enough, a
			/// <c>NULL</c> pointer will be returned, no data will be copied, and segmentCount will contain the required buffer size, which
			/// is specified as the number of elements.
			/// </para>
			/// </param>
			/// <remarks>For an example of how to use this method in a program, see the code example in GetSegmentData.</remarks>
			// https://docs.microsoft.com/en-us/windows/win32/api/xpsobjectmodel/nf-xpsobjectmodel-ixpsomgeometryfigure-getsegmenttypes
			// HRESULT GetSegmentTypes( UINT32 *segmentCount, XPS_SEGMENT_TYPE *segmentTypes );
			void GetSegmentTypes([In, Out] ref uint segmentCount, [In, Out] XPS_SEGMENT_TYPE[] segmentTypes);

			/// <summary>Gets stroke definitions for the figure's segments.</summary>
			/// <param name="segmentCount">
			/// <para>The size of the array that is referenced by segmentStrokes. This parameter must not be <c>NULL</c>.</para>
			/// <para>
			/// If the method returns successfully, segmentCount will contain the number of elements that are returned in the array
			/// referenced by segmentStrokes.
			/// </para>
			/// <para>If segmentStrokes is <c>NULL</c> when the method is called, segmentCount must be set to zero.</para>
			/// <para>
			/// If a <c>NULL</c> pointer is returned in segmentStrokes, the value of segmentCount will contain the required buffer size,
			/// specified as the number of elements.
			/// </para>
			/// </param>
			/// <param name="segmentStrokes">
			/// <para>
			/// An array that has the same number of elements as specified in segmentCount. If the caller requires that this method return
			/// only the required buffer size, set this value to <c>NULL</c>.
			/// </para>
			/// <para>
			/// If the array is large enough, this method copies the segment stroke values into the array and returns, in segmentCount, the
			/// number of copied segment stroke values. If segmentData is <c>NULL</c> or references a buffer that is not large enough, a
			/// <c>NULL</c> pointer will be returned, no data will be copied, and segmentCount will contain the required buffer size that is
			/// specified as the number of elements.
			/// </para>
			/// <para>The following table shows the possible values of an element in the array that is referenced by segmentStrokes.</para>
			/// <list type="table">
			/// <listheader>
			/// <term>Value</term>
			/// <term>Meaning</term>
			/// </listheader>
			/// <item>
			/// <term>TRUE</term>
			/// <term>The segment is stroked.</term>
			/// </item>
			/// <item>
			/// <term>FALSE</term>
			/// <term>The segment is not stroked.</term>
			/// </item>
			/// </list>
			/// </param>
			// https://docs.microsoft.com/en-us/windows/win32/api/xpsobjectmodel/nf-xpsobjectmodel-ixpsomgeometryfigure-getsegmentstrokes
			// HRESULT GetSegmentStrokes( UINT32 *segmentCount, BOOL *segmentStrokes );
			void GetSegmentStrokes([In, Out] ref uint segmentCount, [In, Out, MarshalAs(UnmanagedType.LPArray, ArraySubType = UnmanagedType.Bool)] bool[] segmentStrokes);

			/// <summary>Sets the segment information and data points for segments in the figure.</summary>
			/// <param name="segmentCount">
			/// <para>The number of segments.</para>
			/// <para>This value is also the number of elements in the arrays that are referenced by segmentTypes and segmentStrokes.</para>
			/// </param>
			/// <param name="segmentDataCount">
			/// <para>The number of segment data points.</para>
			/// <para>This value is also the number of elements in the array that is referenced by segmentData.</para>
			/// </param>
			/// <param name="segmentTypes">
			/// An array of XPS_SEGMENT_TYPE variables. The value of segmentCount specifies the number of elements in this array.
			/// </param>
			/// <param name="segmentData">
			/// An array of segment data values. The value of segmentDataCount specifies the number of elements in this array.
			/// </param>
			/// <param name="segmentStrokes">
			/// An array of segment stroke values. The value of segmentCount specifies the number of elements in this array.
			/// </param>
			/// <remarks>
			/// <para>
			/// A geometry segment is described by the start point, the segment type, and additional parameters whose values are determined
			/// by the segment type. The coordinates for the start point of the first segment are a property of the geometry figure and are
			/// set by calling SetStartPoint. The start point of each subsequent segment is the end point of the preceding segment.
			/// </para>
			/// <para>
			/// The number of data values that define a line segment depends on the segment type. The table that follows describes the
			/// specific set of required data values that must be used for each segment type. The values in the segment data array that is
			/// passed in the segmentData parameter must correspond with the XPS_SEGMENT_TYPE values in the array that is passed in the
			/// segmentTypes parameter. For example, if the first line segment has a segment type value of <c>XPS_SEGMENT_TYPE_LINE</c>, the
			/// first two data values in the segmentData array will be the x and y coordinates of the end point of that segment; if the next
			/// segment has a segment type value of <c>XPS_SEGMENT_TYPE_BEZIER</c>, the next six values in the segmentData array will
			/// describe the characteristics of that segment; and so on for each line segment in the geometry figure.
			/// </para>
			/// <list type="table">
			/// <listheader>
			/// <term>Segment type</term>
			/// <term>Required data values</term>
			/// </listheader>
			/// <item>
			/// <term>XPS_SEGMENT_TYPE_LINE</term>
			/// <term>Two data values: x-coordinate of the segment line's end point. y-coordinate of the segment line's end point.</term>
			/// </item>
			/// <item>
			/// <term>XPS_SEGMENT_TYPE_ARC_LARGE_CLOCKWISE</term>
			/// <term>
			/// Five data values: x-coordinate of the arc's end point. y-coordinate of the arc's end point. Length of the ellipse's radius
			/// along the x-axis. Length of the ellipse's radius along the y-axis. Rotation angle.
			/// </term>
			/// </item>
			/// <item>
			/// <term>XPS_SEGMENT_TYPE_ARC_SMALL_CLOCKWISE</term>
			/// <term>
			/// Five data values: x-coordinate of the arc's end point. y-coordinate of the arc's end point. Length of the ellipse's radius
			/// along the x-axis. Length of the ellipse's radius along the y-axis. Rotation angle.
			/// </term>
			/// </item>
			/// <item>
			/// <term>XPS_SEGMENT_TYPE_ARC_LARGE_COUNTERCLOCKWISE</term>
			/// <term>
			/// Five data values: x-coordinate of the arc's end point. y-coordinate of the arc's end point. Length of the ellipse's radius
			/// along the x-axis. Length of the ellipse's radius along the y-axis. Rotation angle.
			/// </term>
			/// </item>
			/// <item>
			/// <term>XPS_SEGMENT_TYPE_ARC_SMALL_COUNTERCLOCKWISE</term>
			/// <term>
			/// Five data values: x-coordinate of the arc's end point. y-coordinate of the arc's end point. Length of the ellipse's radius
			/// along the x-axis. Length of the ellipse's radius along the y-axis. Rotation angle.
			/// </term>
			/// </item>
			/// <item>
			/// <term>XPS_SEGMENT_TYPE_BEZIER</term>
			/// <term>
			/// Six data values: x-coordinate of the Bezier curve's first control point. y-coordinate of the Bezier curve's first control
			/// point. x-coordinate of the Bezier curve's second control point. y-coordinate of the Bezier curve's second control point.
			/// x-coordinate of the Bezier curve's end point. y-coordinate of the Bezier curve's end point.
			/// </term>
			/// </item>
			/// <item>
			/// <term>XPS_SEGMENT_TYPE_QUADRATIC_BEZIER</term>
			/// <term>
			/// Four data values: x-coordinate of the Quad Bezier curve's control point. y-coordinate of the Quad Bezier curve's control
			/// point. x-coordinate of the Quad Bezier curve's end point. y-coordinate of the Quad Bezier curve's end point.
			/// </term>
			/// </item>
			/// </list>
			/// <para>To get the segment types in the figure, call GetSegmentTypes.</para>
			/// <para>The following code examples demonstrate one way to create and populate the buffers required by <c>SetSegments</c>.</para>
			/// <para>
			/// In the first code example, the <c>AddSegmentDataToArrays</c> method takes the data points that describe a single segment and
			/// stores them in the three different data buffers required by the <c>SetSegments</c> method. The data buffers that are passed
			/// as arguments to <c>AddSegmentDataToArrays</c> are managed by the calling method as shown in the code example that follows <c>AddSegmentDataToArrays</c>.
			/// </para>
			/// <para>
			/// In this code example, <c>UpdateSegmentData</c> creates the data buffers required by the <c>SetSegments</c> method and calls
			/// the <c>AddSegmentDataToArrays</c> method from the preceding code example to populate them with the segment data. After the
			/// buffers have been populated, <c>SetSegments</c> is called to add this data to the geometry figure.
			/// </para>
			/// </remarks>
			// https://docs.microsoft.com/en-us/windows/win32/api/xpsobjectmodel/nf-xpsobjectmodel-ixpsomgeometryfigure-setsegments HRESULT
			// SetSegments( UINT32 segmentCount, UINT32 segmentDataCount, const XPS_SEGMENT_TYPE *segmentTypes, const FLOAT *segmentData,
			// const BOOL *segmentStrokes );
			void SetSegments([In] uint segmentCount, [In] uint segmentDataCount, [In] XPS_SEGMENT_TYPE[] segmentTypes, [In] float[] segmentData, [In, MarshalAs(UnmanagedType.LPArray, ArraySubType = UnmanagedType.Bool)] bool[] segmentStrokes);

			/// <summary>Gets the starting point of the figure.</summary>
			/// <returns>The coordinates of the starting point of the figure.</returns>
			/// <remarks>
			/// In the document markup, the value returned in startPoint corresponds to that of the <c>StartPoint</c> attribute of the
			/// <c>PathFigure</c> element.
			/// </remarks>
			// https://docs.microsoft.com/en-us/windows/win32/api/xpsobjectmodel/nf-xpsobjectmodel-ixpsomgeometryfigure-getstartpoint
			// HRESULT GetStartPoint( XPS_POINT *startPoint );
			XPS_POINT GetStartPoint();

			/// <summary>Sets the starting point of the figure.</summary>
			/// <param name="startPoint">The coordinates of the starting point of the figure.</param>
			// https://docs.microsoft.com/en-us/windows/win32/api/xpsobjectmodel/nf-xpsobjectmodel-ixpsomgeometryfigure-setstartpoint
			// HRESULT SetStartPoint( const XPS_POINT *startPoint );
			void SetStartPoint(in XPS_POINT startPoint);

			/// <summary>Gets a value that indicates whether the figure is closed.</summary>
			/// <returns>
			/// <para>The Boolean value that indicates whether the figure is closed.</para>
			/// <list type="table">
			/// <listheader>
			/// <term>Value</term>
			/// <term>Meaning</term>
			/// </listheader>
			/// <item>
			/// <term>TRUE</term>
			/// <term>
			/// The figure is closed. The line segment between the start and end points of the figure will be stroked to close the shape.
			/// </term>
			/// </item>
			/// <item>
			/// <term>FALSE</term>
			/// <term>The figure is open. No line segment will be stroked between the start and end points of the figure.</term>
			/// </item>
			/// </list>
			/// </returns>
			/// <remarks>
			/// <para>This value only applies if the <c>PathFigure</c> attribute is used in the <c>Path</c> element that specifies a stroke.</para>
			/// <para>A closed figure adds a line segment between the start point and the end point of the figure to close the shape.</para>
			/// <para>This value corresponds to that of the <c>IsClosed</c> element of the <c>PathFigure</c> element in the document markup.</para>
			/// </remarks>
			// https://docs.microsoft.com/en-us/windows/win32/api/xpsobjectmodel/nf-xpsobjectmodel-ixpsomgeometryfigure-getisclosed HRESULT
			// GetIsClosed( BOOL *isClosed );
			[return: MarshalAs(UnmanagedType.Bool)]
			bool GetIsClosed();

			/// <summary>Sets a value that indicates whether the figure is closed.</summary>
			/// <param name="isClosed">
			/// <para>The value to be set.</para>
			/// <list type="table">
			/// <listheader>
			/// <term>Value</term>
			/// <term>Meaning</term>
			/// </listheader>
			/// <item>
			/// <term>TRUE</term>
			/// <term>The figure is closed. A line segment between the start point and the last point defined in the figure will be stroked.</term>
			/// </item>
			/// <item>
			/// <term>FALSE</term>
			/// <term>The figure is open. There is no line segment between the start point and the last point defined in the figure.</term>
			/// </item>
			/// </list>
			/// </param>
			/// <remarks>
			/// <para>This value only applies if the <c>PathFigure</c> attribute is used in the <c>Path</c> element that specifies a stroke.</para>
			/// <para>A closed figure adds a line segment between the start point and the end point of the figure to close the shape.</para>
			/// <para>This value corresponds to that of the <c>IsClosed</c> element of the <c>PathFigure</c> element in the document markup.</para>
			/// </remarks>
			// https://docs.microsoft.com/en-us/windows/win32/api/xpsobjectmodel/nf-xpsobjectmodel-ixpsomgeometryfigure-setisclosed HRESULT
			// SetIsClosed( BOOL isClosed );
			void SetIsClosed([In, MarshalAs(UnmanagedType.Bool)] bool isClosed);

			/// <summary>Gets a value that indicates whether the figure is filled.</summary>
			/// <returns>
			/// <para>The Boolean value that indicates whether the figure is filled.</para>
			/// <list type="table">
			/// <listheader>
			/// <term>Value</term>
			/// <term>Meaning</term>
			/// </listheader>
			/// <item>
			/// <term>TRUE</term>
			/// <term>The figure is filled by a brush.</term>
			/// </item>
			/// <item>
			/// <term>FALSE</term>
			/// <term>The figure is not filled.</term>
			/// </item>
			/// </list>
			/// </returns>
			/// <remarks>
			/// This value corresponds to that of the <c>IsFilled</c> attribute of the <c>PathFigure</c> element in the document markup.
			/// </remarks>
			// https://docs.microsoft.com/en-us/windows/win32/api/xpsobjectmodel/nf-xpsobjectmodel-ixpsomgeometryfigure-getisfilled HRESULT
			// GetIsFilled( BOOL *isFilled );
			[return: MarshalAs(UnmanagedType.Bool)]
			bool GetIsFilled();

			/// <summary>Sets a value that indicates whether the figure is filled.</summary>
			/// <param name="isFilled">
			/// <para>The value to be set.</para>
			/// <list type="table">
			/// <listheader>
			/// <term>Value</term>
			/// <term>Meaning</term>
			/// </listheader>
			/// <item>
			/// <term>TRUE</term>
			/// <term>The figure is filled by a brush.</term>
			/// </item>
			/// <item>
			/// <term>FALSE</term>
			/// <term>The figure is not filled.</term>
			/// </item>
			/// </list>
			/// </param>
			/// <remarks>
			/// In the document markup, the value returned in isFilled corresponds to that of the <c>IsFilled</c> attribute of the
			/// <c>PathFigure</c> element.
			/// </remarks>
			// https://docs.microsoft.com/en-us/windows/win32/api/xpsobjectmodel/nf-xpsobjectmodel-ixpsomgeometryfigure-setisfilled HRESULT
			// SetIsFilled( BOOL isFilled );
			void SetIsFilled([In, MarshalAs(UnmanagedType.Bool)] bool isFilled);

			/// <summary>Gets the number of segments in the figure.</summary>
			/// <returns>The number of segments in the figure.</returns>
			/// <remarks>For an example of how to use this method in a program, see the code example in GetSegmentData.</remarks>
			// https://docs.microsoft.com/en-us/windows/win32/api/xpsobjectmodel/nf-xpsobjectmodel-ixpsomgeometryfigure-getsegmentcount
			// HRESULT GetSegmentCount( UINT32 *segmentCount );
			uint GetSegmentCount();

			/// <summary>Gets the number of segment data points in the figure.</summary>
			/// <returns>The number of segment data points. segmentDataCount must not be <c>NULL</c> when the method is called.</returns>
			/// <remarks>
			/// <para>To get the segment data points, call GetSegmentData.</para>
			/// <para>For an example of how to use this method in a program, see the code example in GetSegmentData.</para>
			/// </remarks>
			// https://docs.microsoft.com/en-us/windows/win32/api/xpsobjectmodel/nf-xpsobjectmodel-ixpsomgeometryfigure-getsegmentdatacount
			// HRESULT GetSegmentDataCount( UINT32 *segmentDataCount );
			uint GetSegmentDataCount();

			/// <summary>Gets the XPS_SEGMENT_STROKE_PATTERN value that indicates whether the segments in the figure are stroked.</summary>
			/// <returns>The XPS_SEGMENT_STROKE_PATTERN value that indicates whether the segments in the figure are stroked.</returns>
			// https://docs.microsoft.com/en-us/windows/win32/api/xpsobjectmodel/nf-xpsobjectmodel-ixpsomgeometryfigure-getsegmentstrokepattern
			// HRESULT GetSegmentStrokePattern( XPS_SEGMENT_STROKE_PATTERN *segmentStrokePattern );
			XPS_SEGMENT_STROKE_PATTERN GetSegmentStrokePattern();

			/// <summary>Makes a deep copy of the interface.</summary>
			/// <returns>A pointer to the copy of the interface.</returns>
			/// <remarks>The owner of the copy is <c>NULL</c>.</remarks>
			// https://docs.microsoft.com/en-us/windows/win32/api/xpsobjectmodel/nf-xpsobjectmodel-ixpsomgeometryfigure-clone HRESULT Clone(
			// IXpsOMGeometryFigure **geometryFigure );
			IXpsOMGeometryFigure Clone();
		}

		/// <summary>A collection of IXpsOMGeometryFigure interface pointers.</summary>
		/// <remarks>For more information about the collection methods, see Working with XPS OM Collection Interfaces.</remarks>
		// https://docs.microsoft.com/en-us/windows/win32/api/xpsobjectmodel/nn-xpsobjectmodel-ixpsomgeometryfigurecollection
		[PInvokeData("xpsobjectmodel.h", MSDNShortId = "24ed79ff-9160-4e9b-b322-c538b30f113b")]
		[ComImport, Guid("FD48C3F3-A58E-4B5A-8826-1DE54ABE72B2"), InterfaceType(ComInterfaceType.InterfaceIsIUnknown)]
		public interface IXpsOMGeometryFigureCollection
		{
			/// <summary>Gets the number of IXpsOMGeometryFigure interface pointers in the collection.</summary>
			/// <returns>The number of IXpsOMGeometryFigure interface pointers in the collection.</returns>
			/// <remarks>For more information about the collection methods, see Working with XPS OM Collection Interfaces.</remarks>
			// https://docs.microsoft.com/en-us/windows/win32/api/xpsobjectmodel/nf-xpsobjectmodel-ixpsomgeometryfigurecollection-getcount
			// HRESULT GetCount( UINT32 *count );
			uint GetCount();

			/// <summary>Gets an IXpsOMGeometryFigure interface pointer from a specified location in the collection.</summary>
			/// <param name="index">The zero-based index of the IXpsOMGeometryFigure interface pointer to be obtained.</param>
			/// <returns>The IXpsOMGeometryFigure interface pointer at the location specified by index.</returns>
			/// <remarks>For more information about the collection methods, see Working with XPS OM Collection Interfaces.</remarks>
			// https://docs.microsoft.com/en-us/windows/win32/api/xpsobjectmodel/nf-xpsobjectmodel-ixpsomgeometryfigurecollection-getat
			// HRESULT GetAt( UINT32 index, IXpsOMGeometryFigure **geometryFigure );
			IXpsOMGeometryFigure GetAt([In] uint index);

			/// <summary>Inserts an IXpsOMGeometryFigure interface pointer at a specified location in the collection.</summary>
			/// <param name="index">
			/// The zero-based index in the collection where the interface pointer that is passed in geometryFigure is to be inserted.
			/// </param>
			/// <param name="geometryFigure">
			/// The IXpsOMGeometryFigure interface pointer that is to be inserted at the location specified by index.
			/// </param>
			/// <remarks>
			/// <para>
			/// At the location specified by index, this method inserts the IXpsOMGeometryFigure interface pointer that is passed in
			/// geometryFigure. Prior to the insertion, the pointer in this and all subsequent locations is moved up by one index.
			/// </para>
			/// <para>For more information about the collection methods, see Working with XPS OM Collection Interfaces.</para>
			/// </remarks>
			// https://docs.microsoft.com/en-us/windows/win32/api/xpsobjectmodel/nf-xpsobjectmodel-ixpsomgeometryfigurecollection-insertat
			// HRESULT InsertAt( UINT32 index, IXpsOMGeometryFigure *geometryFigure );
			void InsertAt([In] uint index, [In] IXpsOMGeometryFigure geometryFigure);

			/// <summary>Removes and releases an IXpsOMGeometryFigure interface pointer from a specified location in the collection.</summary>
			/// <param name="index">
			/// The zero-based index in the collection from which an IXpsOMGeometryFigure interface pointer is to be removed and released.
			/// </param>
			/// <remarks>
			/// <para>
			/// This method releases the interface referenced by the pointer at the location specified by index. After releasing the
			/// interface, this method compacts the collection by reducing by 1 the index of each pointer subsequent to index.
			/// </para>
			/// <para>For more information about the collection methods, see Working with XPS OM Collection Interfaces.</para>
			/// </remarks>
			// https://docs.microsoft.com/en-us/windows/win32/api/xpsobjectmodel/nf-xpsobjectmodel-ixpsomgeometryfigurecollection-removeat
			// HRESULT RemoveAt( UINT32 index );
			void RemoveAt([In] uint index);

			/// <summary>Replaces an IXpsOMGeometryFigure interface pointer at a specified location in the collection.</summary>
			/// <param name="index">The zero-based index in the collection where an IXpsOMGeometryFigure interface pointer is to be replaced.</param>
			/// <param name="geometryFigure">
			/// The IXpsOMGeometryFigure interface pointer that will replace current contents at the location specified by index.
			/// </param>
			/// <remarks>
			/// <para>
			/// At the location specified by index, this method releases the IXpsOMGeometryFigure interface referenced by the existing
			/// pointer, then writes the pointer that is passed in geometryFigure.
			/// </para>
			/// <para>For more information about the collection methods, see Working with XPS OM Collection Interfaces.</para>
			/// </remarks>
			// https://docs.microsoft.com/en-us/windows/win32/api/xpsobjectmodel/nf-xpsobjectmodel-ixpsomgeometryfigurecollection-setat
			// HRESULT SetAt( UINT32 index, IXpsOMGeometryFigure *geometryFigure );
			void SetAt([In] uint index, [In] IXpsOMGeometryFigure geometryFigure);

			/// <summary>Appends an IXpsOMGeometryFigure interface to the end of the collection.</summary>
			/// <param name="geometryFigure">A pointer to the IXpsOMGeometryFigure interface that is to be appended to the collection.</param>
			/// <remarks>For more information about the collection methods, see Working with XPS OM Collection Interfaces.</remarks>
			// https://docs.microsoft.com/en-us/windows/win32/api/xpsobjectmodel/nf-xpsobjectmodel-ixpsomgeometryfigurecollection-append
			// HRESULT Append( IXpsOMGeometryFigure *geometryFigure );
			void Append([In] IXpsOMGeometryFigure geometryFigure);
		}

		/// <summary>
		/// <para>Describes the text that appears on a page.</para>
		/// <para>The IXpsOMGlyphsEditor interface is used to modify the text that is described by this interface.</para>
		/// </summary>
		/// <remarks>The code example that follows illustrates how to create an instance of this interface.</remarks>
		// https://docs.microsoft.com/en-us/windows/win32/api/xpsobjectmodel/nn-xpsobjectmodel-ixpsomglyphs
		[PInvokeData("xpsobjectmodel.h", MSDNShortId = "6d2cda65-c719-46f2-97c9-8aee7b5f84b9")]
		[ComImport, Guid("819B3199-0A5A-4B64-BEC7-A9E17E780DE2"), InterfaceType(ComInterfaceType.InterfaceIsIUnknown)]
		public interface IXpsOMGlyphs : IXpsOMVisual
		{
			/// <summary>Gets the <c>IUnknown</c> interface of the parent.</summary>
			/// <returns>A pointer to the <c>IUnknown</c> interface of the parent.</returns>
			// https://docs.microsoft.com/en-us/windows/win32/api/xpsobjectmodel/nf-xpsobjectmodel-ixpsomshareable-getowner HRESULT
			// GetOwner( IUnknown **owner );
			[return: MarshalAs(UnmanagedType.IUnknown)]
			new object GetOwner();

			/// <summary>Gets the object type of the interface.</summary>
			/// <returns>The XPS_OBJECT_TYPE value that describes the interface that is derived from IXpsOMShareable.</returns>
			// https://docs.microsoft.com/en-us/windows/win32/api/xpsobjectmodel/nf-xpsobjectmodel-ixpsomshareable-gettype HRESULT GetType(
			// XPS_OBJECT_TYPE *type );
			new XPS_OBJECT_TYPE GetType();

			/// <summary>Gets a pointer to the IXpsOMMatrixTransform interface that contains the visual's resolved matrix transform.</summary>
			/// <returns>
			/// <para>
			/// A pointer to the IXpsOMMatrixTransform interface that contains the visual's resolved matrix transform. If a matrix transform
			/// has not been set, a <c>NULL</c> pointer is returned.
			/// </para>
			/// <para>The value that is returned in this parameter depends on which method has most recently been called to set the transform.</para>
			/// <list type="table">
			/// <listheader>
			/// <term>Most recent method called</term>
			/// <term>Object that is returned in matrixTransform</term>
			/// </listheader>
			/// <item>
			/// <term>SetTransformLocal</term>
			/// <term>The local transform that is set by SetTransformLocal.</term>
			/// </item>
			/// <item>
			/// <term>SetTransformLookup</term>
			/// <term>
			/// The shared transform that gets retrieved, with a lookup key that matches the key that is set by SetTransformLookup, from the
			/// resource directory.
			/// </term>
			/// </item>
			/// <item>
			/// <term>Neither SetTransformLocal nor SetTransformLookup has been called yet.</term>
			/// <term>NULL pointer.</term>
			/// </item>
			/// </list>
			/// </returns>
			// https://docs.microsoft.com/en-us/windows/win32/api/xpsobjectmodel/nf-xpsobjectmodel-ixpsomvisual-gettransform HRESULT
			// GetTransform( IXpsOMMatrixTransform **matrixTransform );
			[MethodImpl(MethodImplOptions.InternalCall)]
			new IXpsOMMatrixTransform GetTransform();

			/// <summary>
			/// Gets a pointer to the IXpsOMMatrixTransform interface that contains the local, unshared, resolved matrix transform for the visual.
			/// </summary>
			/// <returns>
			/// <para>
			/// A pointer to the IXpsOMMatrixTransform interface that contains the local, unshared, resolved matrix transform for the
			/// visual. If a matrix transform lookup key has not been set, or if a local matrix transform has been set, a <c>NULL</c>
			/// pointer is returned.
			/// </para>
			/// <list type="table">
			/// <listheader>
			/// <term>Most recent method called</term>
			/// <term>Object that is returned in matrixTransform</term>
			/// </listheader>
			/// <item>
			/// <term>SetTransformLocal</term>
			/// <term>The local transform that is set by SetTransformLocal.</term>
			/// </item>
			/// <item>
			/// <term>SetTransformLookup</term>
			/// <term>NULL pointer.</term>
			/// </item>
			/// <item>
			/// <term>Neither SetTransformLocal nor SetTransformLookup has been called yet.</term>
			/// <term>NULL pointer.</term>
			/// </item>
			/// </list>
			/// </returns>
			// https://docs.microsoft.com/en-us/windows/win32/api/xpsobjectmodel/nf-xpsobjectmodel-ixpsomvisual-gettransformlocal HRESULT
			// GetTransformLocal( IXpsOMMatrixTransform **matrixTransform );
			[MethodImpl(MethodImplOptions.InternalCall)]
			new IXpsOMMatrixTransform GetTransformLocal();

			/// <summary>Sets the local, unshared matrix transform.</summary>
			/// <param name="matrixTransform">
			/// A pointer to the IXpsOMMatrixTransform interface to be set as the local, unshared matrix transform. A <c>NULL</c> pointer
			/// releases the previously assigned transform.
			/// </param>
			/// <remarks>
			/// <para>
			/// After you call <c>SetTransformLocal</c>, the transform lookup key is released and GetTransformLookup returns a <c>NULL</c>
			/// pointer in the key parameter. The table that follows explains the relationship between the local and lookup values of this property.
			/// </para>
			/// <list type="table">
			/// <listheader>
			/// <term>Most recent method called</term>
			/// <term>Object that is returned in transform by GetTransform</term>
			/// <term>Object that is returned in matrixTransform by GetTransformLocal</term>
			/// <term>Object that is returned in key by GetTransformLookup</term>
			/// </listheader>
			/// <item>
			/// <term>SetTransformLocal (this method)</term>
			/// <term>The local transform that is set by SetTransformLocal.</term>
			/// <term>The local transform set by SetTransformLocal.</term>
			/// <term>NULL pointer.</term>
			/// </item>
			/// <item>
			/// <term>SetTransformLookup</term>
			/// <term>
			/// The shared transform that gets retrieved, with a lookup key that matches the key that is set by SetTransformLookup, from the
			/// resource directory.
			/// </term>
			/// <term>NULL pointer.</term>
			/// <term>The lookup key that is set by SetTransformLookup.</term>
			/// </item>
			/// <item>
			/// <term>Neither SetTransformLocal nor SetTransformLookup has been called yet.</term>
			/// <term>NULL pointer.</term>
			/// <term>NULL pointer.</term>
			/// <term>NULL pointer.</term>
			/// </item>
			/// </list>
			/// </remarks>
			// https://docs.microsoft.com/en-us/windows/win32/api/xpsobjectmodel/nf-xpsobjectmodel-ixpsomvisual-settransformlocal HRESULT
			// SetTransformLocal( IXpsOMMatrixTransform *matrixTransform );
			[MethodImpl(MethodImplOptions.InternalCall)]
			new void SetTransformLocal([In] IXpsOMMatrixTransform matrixTransform);

			/// <summary>
			/// Gets the lookup key name of the IXpsOMMatrixTransform interface in a resource dictionary that contains the resolved matrix
			/// transform for the visual.
			/// </summary>
			/// <returns>
			/// <para>
			/// The lookup key name for the IXpsOMMatrixTransform interface in a resource dictionary that contains the resolved matrix
			/// transform for the visual. If a matrix transform lookup key has not been set, or if a local matrix transform has been set, a
			/// <c>NULL</c> pointer is returned.
			/// </para>
			/// <list type="table">
			/// <listheader>
			/// <term>Most recent method called</term>
			/// <term>Object that is returned in key</term>
			/// </listheader>
			/// <item>
			/// <term>SetTransformLocal</term>
			/// <term>NULL pointer.</term>
			/// </item>
			/// <item>
			/// <term>SetTransformLookup</term>
			/// <term>The lookup key that is set by SetTransformLookup.</term>
			/// </item>
			/// <item>
			/// <term>Neither SetTransformLocal nor SetTransformLookup has been called yet.</term>
			/// <term>NULL pointer.</term>
			/// </item>
			/// </list>
			/// </returns>
			// https://docs.microsoft.com/en-us/windows/win32/api/xpsobjectmodel/nf-xpsobjectmodel-ixpsomvisual-gettransformlookup HRESULT
			// GetTransformLookup( LPWSTR *key );
			[MethodImpl(MethodImplOptions.InternalCall)]
			new SafeCoTaskMemString GetTransformLookup();

			/// <summary>Sets the lookup key name of a shared matrix transform in a resource dictionary.</summary>
			/// <param name="key">The lookup key name of the matrix transform in the dictionary.</param>
			/// <remarks>
			/// <para>
			/// After you call <c>SetTransformLookup</c>, the local transform is released and GetTransformLocal returns a <c>NULL</c>
			/// pointer in the matrixTransform parameter. The table that follows explains the relationship between the local and lookup
			/// values of this property.
			/// </para>
			/// <list type="table">
			/// <listheader>
			/// <term>Most recent method called</term>
			/// <term>Object that is returned in transform by GetTransform</term>
			/// <term>Object that is returned in matrixTransform by GetTransformLocal</term>
			/// <term>Object that is returned in key by GetTransformLookup</term>
			/// </listheader>
			/// <item>
			/// <term>SetTransformLocal</term>
			/// <term>The local transform that is set by SetTransformLocal.</term>
			/// <term>The local transform that is set by SetTransformLocal.</term>
			/// <term>NULL pointer.</term>
			/// </item>
			/// <item>
			/// <term>SetTransformLookup (this method)</term>
			/// <term>
			/// The shared transform that gets retrieved—with a lookup key that matches the key that is set by SetTransformLookup—from the
			/// resource directory.
			/// </term>
			/// <term>NULL pointer.</term>
			/// <term>The lookup key that is set by SetTransformLookup.</term>
			/// </item>
			/// <item>
			/// <term>Neither SetTransformLocal nor SetTransformLookup has been called yet.</term>
			/// <term>NULL pointer.</term>
			/// <term>NULL pointer.</term>
			/// <term>NULL pointer.</term>
			/// </item>
			/// </list>
			/// </remarks>
			// https://docs.microsoft.com/en-us/windows/win32/api/xpsobjectmodel/nf-xpsobjectmodel-ixpsomvisual-settransformlookup HRESULT
			// SetTransformLookup( LPCWSTR key );
			[MethodImpl(MethodImplOptions.InternalCall)]
			new void SetTransformLookup([In, MarshalAs(UnmanagedType.LPWStr)] string key);

			/// <summary>
			/// Gets a pointer to the IXpsOMGeometry interface that contains the resolved geometry of the visual's clipping region.
			/// </summary>
			/// <returns>
			/// <para>
			/// A pointer to the IXpsOMGeometry interface that contains the resolved geometry of the visual's clipping region. If the clip
			/// geometry has not been set, a <c>NULL</c> pointer is returned.
			/// </para>
			/// <para>The value that is returned in this parameter depends on which method has most recently been called to set the geometry.</para>
			/// <list type="table">
			/// <listheader>
			/// <term>Most recent method called</term>
			/// <term>Object that is returned in clipGeometry</term>
			/// </listheader>
			/// <item>
			/// <term>SetClipGeometryLocal</term>
			/// <term>The local clip geometry that is set by SetClipGeometryLocal.</term>
			/// </item>
			/// <item>
			/// <term>SetClipGeometryLookup</term>
			/// <term>
			/// The shared clip geometry that gets retrieved, with a lookup key that matches the key that is set by SetClipGeometryLookup,
			/// from the resource directory.
			/// </term>
			/// </item>
			/// <item>
			/// <term>Neither SetClipGeometryLocal nor SetClipGeometryLookup has been called yet.</term>
			/// <term>NULL pointer.</term>
			/// </item>
			/// </list>
			/// </returns>
			// https://docs.microsoft.com/en-us/windows/win32/api/xpsobjectmodel/nf-xpsobjectmodel-ixpsomvisual-getclipgeometry HRESULT
			// GetClipGeometry( IXpsOMGeometry **clipGeometry );
			[MethodImpl(MethodImplOptions.InternalCall)]
			new IXpsOMGeometry GetClipGeometry();

			/// <summary>
			/// Gets a pointer to the IXpsOMGeometry interface that contains the local, unshared geometry of the visual's clipping region.
			/// </summary>
			/// <returns>
			/// <para>
			/// A pointer to the IXpsOMGeometry interface that contains the local, unshared geometry of the visual's clipping region. If a
			/// clip geometry lookup key has been set, or if a local clip geometry has not been set, a <c>NULL</c> pointer is returned.
			/// </para>
			/// <list type="table">
			/// <listheader>
			/// <term>Most recent method called</term>
			/// <term>Object that is returned in clipGeometry</term>
			/// </listheader>
			/// <item>
			/// <term>SetClipGeometryLocal</term>
			/// <term>The local clip geometry that is set by SetClipGeometryLocal.</term>
			/// </item>
			/// <item>
			/// <term>SetClipGeometryLookup</term>
			/// <term>NULL pointer.</term>
			/// </item>
			/// <item>
			/// <term>Neither SetClipGeometryLocal nor SetClipGeometryLookup has been called yet.</term>
			/// <term>NULL pointer.</term>
			/// </item>
			/// </list>
			/// </returns>
			// https://docs.microsoft.com/en-us/windows/win32/api/xpsobjectmodel/nf-xpsobjectmodel-ixpsomvisual-getclipgeometrylocal HRESULT
			// GetClipGeometryLocal( IXpsOMGeometry **clipGeometry );
			[MethodImpl(MethodImplOptions.InternalCall)]
			new IXpsOMGeometry GetClipGeometryLocal();

			/// <summary>Sets the local, unshared clipping region for the visual.</summary>
			/// <param name="clipGeometry">
			/// A pointer to the IXpsOMGeometry interface to be set as the local, unshared clipping region for the visual. A <c>NULL</c>
			/// pointer releases the previously assigned geometry interface.
			/// </param>
			/// <remarks>
			/// <para>
			/// After you call <c>SetClipGeometryLocal</c>, the clip geometry lookup key is released and GetClipGeometryLookup returns a
			/// <c>NULL</c> pointer in the key parameter. The table that follows explains the relationship between the local and lookup
			/// values of this property.
			/// </para>
			/// <list type="table">
			/// <listheader>
			/// <term>Most recent method called</term>
			/// <term>Object that is returned in clipGeometry by GetClipGeometry</term>
			/// <term>Object that is returned in clipGeometry by GetClipGeometryLocal</term>
			/// <term>String that is returned in key by GetClipGeometryLookup</term>
			/// </listheader>
			/// <item>
			/// <term>SetClipGeometryLocal (this method)</term>
			/// <term>The local clip geometry that is set by SetClipGeometryLocal.</term>
			/// <term>The local clip geometry that is set by SetClipGeometryLocal.</term>
			/// <term>NULL pointer.</term>
			/// </item>
			/// <item>
			/// <term>SetClipGeometryLookup</term>
			/// <term>
			/// The shared clip geometry that gets retrieved, with a lookup key that matches the key that is set by SetClipGeometryLookup,
			/// from the resource directory.
			/// </term>
			/// <term>NULL pointer.</term>
			/// <term>The lookup key that is set by SetClipGeometryLookup.</term>
			/// </item>
			/// <item>
			/// <term>Neither SetClipGeometryLookup nor SetClipGeometryLocal has been called yet.</term>
			/// <term>NULL pointer.</term>
			/// <term>NULL pointer.</term>
			/// <term>NULL pointer.</term>
			/// </item>
			/// </list>
			/// </remarks>
			// https://docs.microsoft.com/en-us/windows/win32/api/xpsobjectmodel/nf-xpsobjectmodel-ixpsomvisual-setclipgeometrylocal HRESULT
			// SetClipGeometryLocal( IXpsOMGeometry *clipGeometry );
			[MethodImpl(MethodImplOptions.InternalCall)]
			new void SetClipGeometryLocal([In] IXpsOMGeometry clipGeometry);

			/// <summary>
			/// Gets the lookup key for the IXpsOMGeometry interface in a resource dictionary that contains the visual's clipping region.
			/// </summary>
			/// <returns>
			/// <para>
			/// The lookup key for the IXpsOMGeometry interface in a resource dictionary that contains the visual's clipping region. If a
			/// lookup key for the clip geometry has not been set, or if a local clip geometry has been set, a <c>NULL</c> pointer is returned.
			/// </para>
			/// <list type="table">
			/// <listheader>
			/// <term>Most recent method called</term>
			/// <term>Lookup key string that is returned in key</term>
			/// </listheader>
			/// <item>
			/// <term>SetClipGeometryLocal</term>
			/// <term>NULL pointer.</term>
			/// </item>
			/// <item>
			/// <term>SetClipGeometryLookup</term>
			/// <term>The lookup key that is set by SetClipGeometryLookup.</term>
			/// </item>
			/// <item>
			/// <term>Neither SetClipGeometryLocal nor SetClipGeometryLookup has been called yet.</term>
			/// <term>NULL pointer.</term>
			/// </item>
			/// </list>
			/// </returns>
			// https://docs.microsoft.com/en-us/windows/win32/api/xpsobjectmodel/nf-xpsobjectmodel-ixpsomvisual-getclipgeometrylookup
			// HRESULT GetClipGeometryLookup( LPWSTR *key );
			[MethodImpl(MethodImplOptions.InternalCall)]
			new SafeCoTaskMemString GetClipGeometryLookup();

			/// <summary>Sets the lookup key name of a shared clip geometry in a resource dictionary.</summary>
			/// <param name="key">
			/// The lookup key name of the clip geometry in the dictionary. A <c>NULL</c> pointer clears the previously assigned key name.
			/// </param>
			/// <remarks>
			/// <para>
			/// After you call <c>SetClipGeometryLookup</c>, the local clip geometry is released and GetClipGeometryLocal returns a
			/// <c>NULL</c> pointer in the clipGeometry parameter. The table that follows explains the relationship between the local and
			/// lookup values of this property.
			/// </para>
			/// <list type="table">
			/// <listheader>
			/// <term>Most recent method called</term>
			/// <term>Object that is returned in clipGeometry by GetClipGeometry</term>
			/// <term>Object that is returned in clipGeometry by GetClipGeometryLocal</term>
			/// <term>String that is returned in key by GetClipGeometryLookup</term>
			/// </listheader>
			/// <item>
			/// <term>SetClipGeometryLocal</term>
			/// <term>The local clip geometry that is set by SetClipGeometryLocal.</term>
			/// <term>The local clip geometry that is set by SetClipGeometryLocal.</term>
			/// <term>NULL pointer.</term>
			/// </item>
			/// <item>
			/// <term>SetClipGeometryLookup (this method)</term>
			/// <term>
			/// The shared clip geometry that gets retrieved, with a lookup key that matches the key that is set by SetClipGeometryLookup,
			/// from the resource directory.
			/// </term>
			/// <term>NULL pointer.</term>
			/// <term>The lookup key that is set by SetClipGeometryLookup.</term>
			/// </item>
			/// <item>
			/// <term>Neither SetClipGeometryLookup nor SetClipGeometryLocal has been called yet.</term>
			/// <term>NULL pointer.</term>
			/// <term>NULL pointer.</term>
			/// <term>NULL pointer.</term>
			/// </item>
			/// </list>
			/// </remarks>
			// https://docs.microsoft.com/en-us/windows/win32/api/xpsobjectmodel/nf-xpsobjectmodel-ixpsomvisual-setclipgeometrylookup
			// HRESULT SetClipGeometryLookup( LPCWSTR key );
			[MethodImpl(MethodImplOptions.InternalCall)]
			new void SetClipGeometryLookup([In, MarshalAs(UnmanagedType.LPWStr)] string key);

			/// <summary>Gets the opacity value of this visual.</summary>
			/// <returns>The opacity value.</returns>
			// https://docs.microsoft.com/en-us/windows/win32/api/xpsobjectmodel/nf-xpsobjectmodel-ixpsomvisual-getopacity HRESULT
			// GetOpacity( FLOAT *opacity );
			[MethodImpl(MethodImplOptions.InternalCall)]
			new float GetOpacity();

			/// <summary>Sets the opacity value of the visual.</summary>
			/// <param name="opacity">
			/// <para>The opacity value to be set for the visual.</para>
			/// <para>
			/// The range of allowed values for this parameter is 0.0 to 1.0; with 0.0 the visual is completely transparent, and with 1.0 it
			/// is completely opaque.
			/// </para>
			/// </param>
			// https://docs.microsoft.com/en-us/windows/win32/api/xpsobjectmodel/nf-xpsobjectmodel-ixpsomvisual-setopacity HRESULT
			// SetOpacity( FLOAT opacity );
			[MethodImpl(MethodImplOptions.InternalCall)]
			new void SetOpacity([In] float opacity);

			/// <summary>Gets a pointer to the IXpsOMBrush interface of the visual's opacity mask brush.</summary>
			/// <returns>
			/// <para>
			/// A pointer to the IXpsOMBrush interface of the visual's opacity mask brush. If an opacity mask brush has not been set for
			/// this visual, a <c>NULL</c> pointer is returned.
			/// </para>
			/// <para>The value that is returned in this parameter depends on which method has most recently been called to set the brush.</para>
			/// <list type="table">
			/// <listheader>
			/// <term>Most recent method called</term>
			/// <term>Object that is returned in opacityMaskBrush</term>
			/// </listheader>
			/// <item>
			/// <term>SetOpacityMaskBrushLocal</term>
			/// <term>The local opacity mask brush that is set by SetOpacityMaskBrushLocal.</term>
			/// </item>
			/// <item>
			/// <term>SetOpacityMaskBrushLookup</term>
			/// <term>
			/// The shared opacity mask brush that gets retrieved, with a lookup key that matches the key that is set by
			/// SetOpacityMaskBrushLookup, from the resource directory.
			/// </term>
			/// </item>
			/// <item>
			/// <term>Neither SetOpacityMaskBrushLocal nor SetOpacityMaskBrushLookup has been called yet.</term>
			/// <term>NULL pointer.</term>
			/// </item>
			/// </list>
			/// </returns>
			// https://docs.microsoft.com/en-us/windows/win32/api/xpsobjectmodel/nf-xpsobjectmodel-ixpsomvisual-getopacitymaskbrush HRESULT
			// GetOpacityMaskBrush( IXpsOMBrush **opacityMaskBrush );
			[MethodImpl(MethodImplOptions.InternalCall)]
			new IXpsOMBrush GetOpacityMaskBrush();

			/// <summary>Gets the local, unshared opacity mask brush for the visual.</summary>
			/// <returns>
			/// <para>
			/// A pointer to the IXpsOMBrush interface of the visual's opacity mask brush. If an opacity mask brush lookup key has been set,
			/// or if a local opacity mask brush has not been set, a <c>NULL</c> pointer is returned.
			/// </para>
			/// <list type="table">
			/// <listheader>
			/// <term>Most recent method called</term>
			/// <term>Object that is returned in opacityMaskBrush</term>
			/// </listheader>
			/// <item>
			/// <term>SetOpacityMaskBrushLocal</term>
			/// <term>The local opacity mask brush that is set by SetOpacityMaskBrushLocal.</term>
			/// </item>
			/// <item>
			/// <term>SetOpacityMaskBrushLookup</term>
			/// <term>NULL pointer.</term>
			/// </item>
			/// <item>
			/// <term>Neither SetOpacityMaskBrushLocal nor SetOpacityMaskBrushLookup has been called yet.</term>
			/// <term>NULL pointer.</term>
			/// </item>
			/// </list>
			/// </returns>
			// https://docs.microsoft.com/en-us/windows/win32/api/xpsobjectmodel/nf-xpsobjectmodel-ixpsomvisual-getopacitymaskbrushlocal
			// HRESULT GetOpacityMaskBrushLocal( IXpsOMBrush **opacityMaskBrush );
			[MethodImpl(MethodImplOptions.InternalCall)]
			new IXpsOMBrush GetOpacityMaskBrushLocal();

			/// <summary>Sets the IXpsOMBrush interface pointer as the local, unshared opacity mask brush.</summary>
			/// <param name="opacityMaskBrush">
			/// A pointer to the IXpsOMBrush interface to be set as the local, unshared opacity mask brush. A <c>NULL</c> pointer clears the
			/// previously assigned opacity mask brush.
			/// </param>
			/// <remarks>
			/// <para>
			/// After you call <c>SetOpacityMaskBrushLocal</c>, the opacity mask brush lookup key is released and GetOpacityMaskBrushLookup
			/// returns a <c>NULL</c> pointer in the key parameter. The table that follows explains the relationship between the local and
			/// lookup values of this property.
			/// </para>
			/// <list type="table">
			/// <listheader>
			/// <term>Most recent method called</term>
			/// <term>Object that is returned in opacityMaskBrush by GetOpacityMaskBrush</term>
			/// <term>Object that is returned in opacityMaskBrush by GetOpacityMaskBrushLocal</term>
			/// <term>String that is returned in key by GetOpacityMaskBrushLookup</term>
			/// </listheader>
			/// <item>
			/// <term>SetOpacityMaskBrushLocal (this method)</term>
			/// <term>The local opacity mask brush that is set by SetOpacityMaskBrushLocal.</term>
			/// <term>The local opacity mask brush that is set by SetOpacityMaskBrushLocal.</term>
			/// <term>NULL pointer.</term>
			/// </item>
			/// <item>
			/// <term>SetOpacityMaskBrushLookup</term>
			/// <term>
			/// The shared opacity mask brush that gets retrieved, with a lookup key that matches the key that is set by
			/// SetOpacityMaskBrushLookup, from the resource directory.
			/// </term>
			/// <term>NULL pointer.</term>
			/// <term>The lookup key that is set by SetOpacityMaskBrushLookup.</term>
			/// </item>
			/// <item>
			/// <term>Neither SetOpacityMaskBrushLocal nor SetOpacityMaskBrushLookup has been called yet.</term>
			/// <term>NULL pointer.</term>
			/// <term>NULL pointer.</term>
			/// <term>NULL pointer.</term>
			/// </item>
			/// </list>
			/// </remarks>
			// https://docs.microsoft.com/en-us/windows/win32/api/xpsobjectmodel/nf-xpsobjectmodel-ixpsomvisual-setopacitymaskbrushlocal
			// HRESULT SetOpacityMaskBrushLocal( IXpsOMBrush *opacityMaskBrush );
			[MethodImpl(MethodImplOptions.InternalCall)]
			new void SetOpacityMaskBrushLocal([In] IXpsOMBrush opacityMaskBrush);

			/// <summary>Gets the name of the lookup key of the shared opacity mask brush in a resource dictionary.</summary>
			/// <returns>
			/// <para>
			/// The name of the lookup key of the shared opacity mask brush in a resource dictionary. If the lookup key of an opacity mask
			/// brush has not been set, or if a local opacity mask brush has been set, a <c>NULL</c> pointer is returned.
			/// </para>
			/// <list type="table">
			/// <listheader>
			/// <term>Most recent method called</term>
			/// <term>Object that is returned in key</term>
			/// </listheader>
			/// <item>
			/// <term>SetOpacityMaskBrushLocal</term>
			/// <term>NULL pointer.</term>
			/// </item>
			/// <item>
			/// <term>SetOpacityMaskBrushLookup</term>
			/// <term>The lookup key that is set by SetOpacityMaskBrushLookup.</term>
			/// </item>
			/// <item>
			/// <term>Neither SetOpacityMaskBrushLocal nor SetOpacityMaskBrushLookup has been called yet.</term>
			/// <term>NULL pointer.</term>
			/// </item>
			/// </list>
			/// </returns>
			// https://docs.microsoft.com/en-us/windows/win32/api/xpsobjectmodel/nf-xpsobjectmodel-ixpsomvisual-getopacitymaskbrushlookup
			// HRESULT GetOpacityMaskBrushLookup( LPWSTR *key );
			[MethodImpl(MethodImplOptions.InternalCall)]
			new SafeCoTaskMemString GetOpacityMaskBrushLookup();

			/// <summary>Sets the lookup key name of a shared opacity mask brush in a resource dictionary.</summary>
			/// <param name="key">
			/// The lookup key name of the opacity mask brush in the dictionary. A <c>NULL</c> pointer clears the previously assigned key name.
			/// </param>
			/// <remarks>
			/// <para>
			/// After you call <c>SetOpacityMaskBrushLookup</c>, the local opacity mask brush is released and GetOpacityMaskBrushLocal
			/// returns a <c>NULL</c> pointer in the opacityMaskBrush parameter. The table that follows explains the relationship between
			/// the local and lookup values of this property.
			/// </para>
			/// <list type="table">
			/// <listheader>
			/// <term>Most recent method called</term>
			/// <term>Object that is returned in opacityMaskBrush by GetOpacityMaskBrush</term>
			/// <term>Object that is returned in opacityMaskBrush by GetOpacityMaskBrushLocal</term>
			/// <term>String that is returned in key by GetOpacityMaskBrushLookup</term>
			/// </listheader>
			/// <item>
			/// <term>SetOpacityMaskBrushLocal</term>
			/// <term>The local opacity mask brush that is set by SetOpacityMaskBrushLocal.</term>
			/// <term>The local opacity mask brush that is set by SetOpacityMaskBrushLocal.</term>
			/// <term>NULL pointer.</term>
			/// </item>
			/// <item>
			/// <term>SetOpacityMaskBrushLookup (this method)</term>
			/// <term>
			/// The shared opacity mask brush that gets retrieved—with a lookup key that matches the key that is set by
			/// SetOpacityMaskBrushLookup—from the resource directory.
			/// </term>
			/// <term>NULL pointer.</term>
			/// <term>The lookup key that is set by SetOpacityMaskBrushLookup.</term>
			/// </item>
			/// <item>
			/// <term>Neither SetOpacityMaskBrushLocal nor SetOpacityMaskBrushLookup has been called yet.</term>
			/// <term>NULL pointer.</term>
			/// <term>NULL pointer.</term>
			/// <term>NULL pointer.</term>
			/// </item>
			/// </list>
			/// </remarks>
			// https://docs.microsoft.com/en-us/windows/win32/api/xpsobjectmodel/nf-xpsobjectmodel-ixpsomvisual-setopacitymaskbrushlookup
			// HRESULT SetOpacityMaskBrushLookup( LPCWSTR key );
			[MethodImpl(MethodImplOptions.InternalCall)]
			new void SetOpacityMaskBrushLookup([In, MarshalAs(UnmanagedType.LPWStr)] string key);

			/// <summary>Gets the <c>Name</c> property of the visual.</summary>
			/// <returns>The <c>Name</c> property string. If the <c>Name</c> property has not been set, a <c>NULL</c> pointer is returned.</returns>
			// https://docs.microsoft.com/en-us/windows/win32/api/xpsobjectmodel/nf-xpsobjectmodel-ixpsomvisual-getname HRESULT GetName(
			// LPWSTR *name );
			[MethodImpl(MethodImplOptions.InternalCall)]
			new SafeCoTaskMemString GetName();

			/// <summary>Sets the <c>Name</c> property of the visual.</summary>
			/// <param name="name">The name of the visual. A <c>NULL</c> pointer clears the <c>Name</c> property.</param>
			/// <remarks>
			/// <para>Names must be unique.</para>
			/// <para>
			/// Clearing the <c>Name</c> property by passing a <c>NULL</c> pointer in name sets the <c>IsHyperlinkTarget</c> property to <c>FALSE</c>.
			/// </para>
			/// </remarks>
			// https://docs.microsoft.com/en-us/windows/win32/api/xpsobjectmodel/nf-xpsobjectmodel-ixpsomvisual-setname HRESULT SetName(
			// LPCWSTR name );
			[MethodImpl(MethodImplOptions.InternalCall)]
			new void SetName([In, MarshalAs(UnmanagedType.LPWStr)] string name);

			/// <summary>Gets a value that indicates whether the visual is the target of a hyperlink.</summary>
			/// <returns>
			/// <para>The Boolean value that indicates whether the visual is the target of a hyperlink.</para>
			/// <list type="table">
			/// <listheader>
			/// <term>Value</term>
			/// <term>Meaning</term>
			/// </listheader>
			/// <item>
			/// <term>TRUE</term>
			/// <term>The visual is the target of a hyperlink.</term>
			/// </item>
			/// <item>
			/// <term>FALSE</term>
			/// <term>The visual is not the target of a hyperlink.</term>
			/// </item>
			/// </list>
			/// </returns>
			// https://docs.microsoft.com/en-us/windows/win32/api/xpsobjectmodel/nf-xpsobjectmodel-ixpsomvisual-getishyperlinktarget HRESULT
			// GetIsHyperlinkTarget( BOOL *isHyperlink );
			[MethodImpl(MethodImplOptions.InternalCall)]
			[return: MarshalAs(UnmanagedType.Bool)]
			new bool GetIsHyperlinkTarget();

			/// <summary>Specifies whether the visual is the target of a hyperlink.</summary>
			/// <param name="isHyperlink">
			/// <para>The Boolean value that specifies whether the visual is the target of a hyperlink.</para>
			/// <list type="table">
			/// <listheader>
			/// <term>Value</term>
			/// <term>Meaning</term>
			/// </listheader>
			/// <item>
			/// <term>TRUE</term>
			/// <term>The visual is the target of a hyperlink.</term>
			/// </item>
			/// <item>
			/// <term>FALSE</term>
			/// <term>The visual is not the target of a hyperlink.</term>
			/// </item>
			/// </list>
			/// </param>
			/// <remarks>The visual must be named before it can be set as the target of a hyperlink.</remarks>
			// https://docs.microsoft.com/en-us/windows/win32/api/xpsobjectmodel/nf-xpsobjectmodel-ixpsomvisual-setishyperlinktarget HRESULT
			// SetIsHyperlinkTarget( BOOL isHyperlink );
			[MethodImpl(MethodImplOptions.InternalCall)]
			new void SetIsHyperlinkTarget([In, MarshalAs(UnmanagedType.Bool)] bool isHyperlink);

			/// <summary>Gets a pointer to the IUri interface to which this visual object links.</summary>
			/// <returns>
			/// A pointer to the IUri interface that contains the destination URI for the link. If a URI has not been set for this object, a
			/// <c>NULL</c> pointer is returned.
			/// </returns>
			// https://docs.microsoft.com/en-us/windows/win32/api/xpsobjectmodel/nf-xpsobjectmodel-ixpsomvisual-gethyperlinknavigateuri
			// HRESULT GetHyperlinkNavigateUri( IUri **hyperlinkUri );
			[MethodImpl(MethodImplOptions.InternalCall)]
			new IUri GetHyperlinkNavigateUri();

			/// <summary>Sets the destination URI of the visual's hyperlink.</summary>
			/// <param name="hyperlinkUri">The IUri interface that contains the destination URI of the visual's hyperlink.</param>
			/// <remarks>
			/// Setting an object's URI makes the object a hyperlink. When activated or clicked, the object will navigate to the destination
			/// that is specified by the URI in hyperlinkUri.
			/// </remarks>
			// https://docs.microsoft.com/en-us/windows/win32/api/xpsobjectmodel/nf-xpsobjectmodel-ixpsomvisual-sethyperlinknavigateuri
			// HRESULT SetHyperlinkNavigateUri( IUri *hyperlinkUri );
			[MethodImpl(MethodImplOptions.InternalCall)]
			new void SetHyperlinkNavigateUri([In] IUri hyperlinkUri);

			/// <summary>Gets the <c>Language</c> property of the visual and of its contents.</summary>
			/// <returns>
			/// The language string that specifies the language of the page. If a language has not been set, a <c>NULL</c> pointer is returned.
			/// </returns>
			/// <remarks>
			/// <para>The <c>Language</c> property that is set by this method specifies the language of the resource content.</para>
			/// <para>Internet Engineering Task Force (IETF) RFC 3066 specifies the recommended encoding for the <c>Language</c> property.</para>
			/// </remarks>
			// https://docs.microsoft.com/en-us/windows/win32/api/xpsobjectmodel/nf-xpsobjectmodel-ixpsomvisual-getlanguage HRESULT
			// GetLanguage( LPWSTR *language );
			[MethodImpl(MethodImplOptions.InternalCall)]
			new SafeCoTaskMemString GetLanguage();

			/// <summary>Sets the <c>Language</c> property of the visual.</summary>
			/// <param name="language">
			/// The language string that specifies the language of the visual and of its contents. A <c>NULL</c> pointer clears the
			/// <c>Language</c> property.
			/// </param>
			/// <remarks>
			/// The recommended encoding for the <c>Language</c> property is specified in Internet Engineering Task Force (IETF) RFC 3066r.
			/// </remarks>
			// https://docs.microsoft.com/en-us/windows/win32/api/xpsobjectmodel/nf-xpsobjectmodel-ixpsomvisual-setlanguage HRESULT
			// SetLanguage( LPCWSTR language );
			[MethodImpl(MethodImplOptions.InternalCall)]
			new void SetLanguage([In, MarshalAs(UnmanagedType.LPWStr)] string language);

			/// <summary>Gets the text in unescaped UTF-16 scalar values.</summary>
			/// <returns>The UTF-16 Unicode string of the text to be displayed. If the string is empty, a <c>NULL</c> pointer is returned.</returns>
			// https://docs.microsoft.com/en-us/windows/win32/api/xpsobjectmodel/nf-xpsobjectmodel-ixpsomglyphs-getunicodestring HRESULT
			// GetUnicodeString( LPWSTR *unicodeString );
			SafeCoTaskMemString GetUnicodeString();

			/// <summary>Gets the number of Glyph indices.</summary>
			/// <returns>The number of glyph indices.</returns>
			/// <remarks>GetGlyphIndices gets the glyph indices.</remarks>
			// https://docs.microsoft.com/en-us/windows/win32/api/xpsobjectmodel/nf-xpsobjectmodel-ixpsomglyphs-getglyphindexcount HRESULT
			// GetGlyphIndexCount( UINT32 *indexCount );
			uint GetGlyphIndexCount();

			/// <summary>Gets an array of XPS_GLYPH_INDEX structures that describe the specific glyph indices in the font.</summary>
			/// <param name="indexCount">
			/// The number of XPS_GLYPH_INDEX structures that will fit in the array that is referenced by glyphIndices. When the method
			/// returns, indexCount will contain the number of <c>XPS_GLYPH_INDEX</c> structures that are returned in the array referenced
			/// by glyphIndices.
			/// </param>
			/// <param name="glyphIndices">The address of an array of XPS_GLYPH_INDEX structures that receive the glyph indices.</param>
			/// <remarks>
			/// <para>GetGlyphIndexCount gets the number of elements in the glyph index array.</para>
			/// <para>
			/// The glyph indices override the default <c>cmap</c> mapping from the <c>UnicodeString</c> to the glyph index. The
			/// XPS_GLYPH_INDEX structure also contains advance width as well as vertical and horizontal offset information.
			/// </para>
			/// </remarks>
			// https://docs.microsoft.com/en-us/windows/win32/api/xpsobjectmodel/nf-xpsobjectmodel-ixpsomglyphs-getglyphindices HRESULT
			// GetGlyphIndices( UINT32 *indexCount, XPS_GLYPH_INDEX *glyphIndices );
			void GetGlyphIndices(ref uint indexCount, [In, Out] XPS_GLYPH_INDEX[] glyphIndices);

			/// <summary>Gets the number of glyph mappings.</summary>
			/// <returns>The number of glyph mappings.</returns>
			/// <remarks>GetGlyphMappings gets the glyph mappings.</remarks>
			// https://docs.microsoft.com/en-us/windows/win32/api/xpsobjectmodel/nf-xpsobjectmodel-ixpsomglyphs-getglyphmappingcount HRESULT
			// GetGlyphMappingCount( UINT32 *glyphMappingCount );
			uint GetGlyphMappingCount();

			/// <summary>
			/// Gets an array of XPS_GLYPH_MAPPING structures that describe how to map UTF-16 scalar values to entries in the array of
			/// XPS_GLYPH_INDEX structures, which is returned by GetGlyphIndices.
			/// </summary>
			/// <param name="glyphMappingCount">
			/// The number of XPS_GLYPH_MAPPING structures that will fit in the array referenced by glyphMappings. When the method returns,
			/// glyphMappingCount contains the number of values returned in the array referenced by glyphMappings.
			/// </param>
			/// <param name="glyphMappings">An array of XPS_GLYPH_MAPPING structures that contain the glyph mapping values.</param>
			/// <remarks>GetGlyphMappingCount gets the number of glyph mappings.</remarks>
			// https://docs.microsoft.com/en-us/windows/win32/api/xpsobjectmodel/nf-xpsobjectmodel-ixpsomglyphs-getglyphmappings HRESULT
			// GetGlyphMappings( UINT32 *glyphMappingCount, XPS_GLYPH_MAPPING *glyphMappings );
			void GetGlyphMappings(ref uint glyphMappingCount, [In, Out] XPS_GLYPH_MAPPING[] glyphMappings);

			/// <summary>Gets the number of prohibited caret stops.</summary>
			/// <returns>The number of prohibited caret stops.</returns>
			/// <remarks>
			/// <para>GetProhibitedCaretStops gets the prohibited caret stops.</para>
			/// <para>
			/// Each caret stop index corresponds to the scalar values of a UTF-16 <c>UnicodeString</c> property. Index 0 represents the
			/// location just before the first UTF-16 scalar value of <c>UnicodeString</c>; index 1 represents the location between the
			/// first and second UTF-16 scalar values, and so on. There is an additional index at the end of <c>UnicodeString</c>. Any
			/// unspecified index is a valid caret stop location.
			/// </para>
			/// </remarks>
			// https://docs.microsoft.com/en-us/windows/win32/api/xpsobjectmodel/nf-xpsobjectmodel-ixpsomglyphs-getprohibitedcaretstopcount
			// HRESULT GetProhibitedCaretStopCount( UINT32 *prohibitedCaretStopCount );
			uint GetProhibitedCaretStopCount();

			/// <summary>Gets an array of prohibited caret stop locations.</summary>
			/// <param name="prohibitedCaretStopCount">
			/// The number of prohibited caret stop locations that will fit in the array referenced by prohibitedCaretStops. When the method
			/// returns, prohibitedCaretStopCount will contain the number of values returned in the array referenced by prohibitedCaretStops.
			/// </param>
			/// <param name="prohibitedCaretStops">
			/// An array of prohibited caret stop locations; if such are not defined, a <c>NULL</c> pointer is returned.
			/// </param>
			/// <remarks>
			/// <para>
			/// Each caret stop index corresponds to the scalar values of a UTF-16 <c>UnicodeString</c> property. Index 0 represents the
			/// location just before the first UTF-16 scalar value of <c>UnicodeString</c>; index 1 represents the location between the
			/// first and second UTF-16 scalar values, and so on. There is an additional index at the end of <c>UnicodeString</c>. Any
			/// unspecified index is a valid caret stop location.
			/// </para>
			/// <para>GetProhibitedCaretStopCount gets the number of prohibited caret stops.</para>
			/// <para>A caret stop is the index of the UTF-16 code point in the <c>UnicodeString</c> property of the glyph.</para>
			/// </remarks>
			// https://docs.microsoft.com/en-us/windows/win32/api/xpsobjectmodel/nf-xpsobjectmodel-ixpsomglyphs-getprohibitedcaretstops
			// HRESULT GetProhibitedCaretStops( UINT32 *prohibitedCaretStopCount, UINT32 *prohibitedCaretStops );
			void GetProhibitedCaretStops(ref uint prohibitedCaretStopCount, [In, Out] uint[] prohibitedCaretStops);

			/// <summary>Gets the level of bidirectional text.</summary>
			/// <returns>
			/// <para>The level of bidirectional text.</para>
			/// <para>Range: 0–61</para>
			/// </returns>
			/// <remarks>
			/// <para>
			/// The bidirectional text level, or <c>BidiLevel</c>, specifies the nesting level of the Unicode bidirectional algorithm. Even
			/// values imply the left-to-right layout and odd values the right-to-left layout, which places the run origin on the right side
			/// of the first glyph. Advance widths that are positive will move to the left, allowing subsequent glyphs to be placed to the
			/// left of the previous glyph.
			/// </para>
			/// <para>The range of allowed values for this property is between 0 and 61, inclusive, and the default value is 0.</para>
			/// </remarks>
			// https://docs.microsoft.com/en-us/windows/win32/api/xpsobjectmodel/nf-xpsobjectmodel-ixpsomglyphs-getbidilevel HRESULT
			// GetBidiLevel( UINT32 *bidiLevel );
			uint GetBidiLevel();

			/// <summary>Gets a Boolean value that indicates whether the text is to be rendered with the glyphs rotated sideways.</summary>
			/// <returns>
			/// <para>The Boolean value that indicates whether the text is to be rendered with the glyphs rotated sideways.</para>
			/// <list type="table">
			/// <listheader>
			/// <term>Value</term>
			/// <term>Meaning</term>
			/// </listheader>
			/// <item>
			/// <term>TRUE</term>
			/// <term>Render the glyphs sideways to produce sideways text.</term>
			/// </item>
			/// <item>
			/// <term>FALSE</term>
			/// <term>Do not render the glyphs sideways to produce normal text.</term>
			/// </item>
			/// </list>
			/// </returns>
			/// <remarks>The default value for this property is <c>FALSE</c>.</remarks>
			// https://docs.microsoft.com/en-us/windows/win32/api/xpsobjectmodel/nf-xpsobjectmodel-ixpsomglyphs-getissideways HRESULT
			// GetIsSideways( BOOL *isSideways );
			[return: MarshalAs(UnmanagedType.Bool)]
			bool GetIsSideways();

			/// <summary>Gets the name of the device font.</summary>
			/// <returns>
			/// The string that contains the unescaped name of the device font. If the name has not been set, a <c>NULL</c> pointer will be returned.
			/// </returns>
			/// <remarks>
			/// <para>
			/// The device font name uniquely identifies a specific device font and is typically defined by a hardware vendor or font vendor.
			/// </para>
			/// <para>The escaped version of the device font name is created when the object is serialized.</para>
			/// </remarks>
			// https://docs.microsoft.com/en-us/windows/win32/api/xpsobjectmodel/nf-xpsobjectmodel-ixpsomglyphs-getdevicefontname HRESULT
			// GetDeviceFontName( LPWSTR *deviceFontName );
			SafeCoTaskMemString GetDeviceFontName();

			/// <summary>Gets the style simulations that will be applied when rendering the glyphs.</summary>
			/// <returns>The XPS_STYLE_SIMULATION value that describes the style simulations to be applied.</returns>
			// https://docs.microsoft.com/en-us/windows/win32/api/xpsobjectmodel/nf-xpsobjectmodel-ixpsomglyphs-getstylesimulations HRESULT
			// GetStyleSimulations( XPS_STYLE_SIMULATION *styleSimulations );
			XPS_STYLE_SIMULATION GetStyleSimulations();

			/// <summary>Sets the style simulations that will be applied when the glyphs are rendered.</summary>
			/// <param name="styleSimulations">The XPS_STYLE_SIMULATION value that specifies the style simulation to be applied.</param>
			// https://docs.microsoft.com/en-us/windows/win32/api/xpsobjectmodel/nf-xpsobjectmodel-ixpsomglyphs-setstylesimulations HRESULT
			// SetStyleSimulations( XPS_STYLE_SIMULATION styleSimulations );
			void SetStyleSimulations([In] XPS_STYLE_SIMULATION styleSimulations);

			/// <summary>Gets the starting position of the text.</summary>
			/// <returns>The XPS_POINT structure that receives the starting position of the text.</returns>
			/// <remarks>
			/// In the units of the effective coordinate space, the origin specifies the x and y coordinates of the first glyph in the run.
			/// The glyph is placed such that its baseline and the leading edge of its advance vector intersect with the point defined by
			/// origin.x and origin.y.
			/// </remarks>
			// https://docs.microsoft.com/en-us/windows/win32/api/xpsobjectmodel/nf-xpsobjectmodel-ixpsomglyphs-getorigin HRESULT GetOrigin(
			// XPS_POINT *origin );
			XPS_POINT GetOrigin();

			/// <summary>Sets the starting position of the text.</summary>
			/// <param name="origin">The XPS_POINT structure that contains the coordinates to be set as the text's starting position.</param>
			/// <remarks>
			/// In the units of the effective coordinate space, the origin specifies the x and y coordinates of the first glyph in the run.
			/// The glyph is placed such that its baseline and the leading edge of its advance vector intersect with the point defined by
			/// origin.x and origin.y.
			/// </remarks>
			// https://docs.microsoft.com/en-us/windows/win32/api/xpsobjectmodel/nf-xpsobjectmodel-ixpsomglyphs-setorigin HRESULT SetOrigin(
			// const XPS_POINT *origin );
			void SetOrigin(in XPS_POINT origin);

			/// <summary>Gets the font size.</summary>
			/// <returns>The font size.</returns>
			/// <remarks>
			/// <para>
			/// The em size that is returned in fontRenderingEmSize specifies the font size in the drawing surface units. The drawing
			/// surface units are expressed as floating-point values in the effective coordinate space.
			/// </para>
			/// <para>In new glyph objects, the default value of fontRenderingEmSize is 10.0.</para>
			/// <para>If the value of fontRenderingEmSize is 0.0, no text is displayed.</para>
			/// </remarks>
			// https://docs.microsoft.com/en-us/windows/win32/api/xpsobjectmodel/nf-xpsobjectmodel-ixpsomglyphs-getfontrenderingemsize
			// HRESULT GetFontRenderingEmSize( FLOAT *fontRenderingEmSize );
			float GetFontRenderingEmSize();

			/// <summary>Sets the font size of the text.</summary>
			/// <param name="fontRenderingEmSize">The font size.</param>
			/// <remarks>
			/// <para>
			/// The em size returned in fontRenderingEmSize specifies the font size in drawing surface units. Drawing surface units are
			/// expressed as floating-point values in the units of the effective coordinate space.
			/// </para>
			/// <para>In new glyph objects, the default value of fontRenderingEmSize is 10.0.</para>
			/// <para>If the value of fontRenderingEmSize is 0.0, no text is displayed.</para>
			/// <para>A value of 0.0 results in no visible text being displayed.</para>
			/// </remarks>
			// https://docs.microsoft.com/en-us/windows/win32/api/xpsobjectmodel/nf-xpsobjectmodel-ixpsomglyphs-setfontrenderingemsize
			// HRESULT SetFontRenderingEmSize( FLOAT fontRenderingEmSize );
			void SetFontRenderingEmSize([In] float fontRenderingEmSize);

			/// <summary>Gets a pointer to the IXpsOMFontResource interface of the font resource object required for this text.</summary>
			/// <returns>A pointer to the IXpsOMFontResource interface of the font resource.</returns>
			/// <remarks>
			/// After loading and parsing the resource into the XPS OM, this method might return an error that applies to another resource.
			/// This occurs because all of the relationships are parsed when a resource is loaded.
			/// </remarks>
			// https://docs.microsoft.com/en-us/windows/win32/api/xpsobjectmodel/nf-xpsobjectmodel-ixpsomglyphs-getfontresource HRESULT
			// GetFontResource( IXpsOMFontResource **fontResource );
			IXpsOMFontResource GetFontResource();

			/// <summary>Sets the pointer to the IXpsOMFontResource interface of the font resource object that is required for this text.</summary>
			/// <param name="fontResource">The pointer to the IXpsOMFontResource interface to be used.</param>
			/// <remarks>fontResource must not be a <c>NULL</c> pointer; a glyph object must have a font resource.</remarks>
			// https://docs.microsoft.com/en-us/windows/win32/api/xpsobjectmodel/nf-xpsobjectmodel-ixpsomglyphs-setfontresource HRESULT
			// SetFontResource( IXpsOMFontResource *fontResource );
			void SetFontResource([In] IXpsOMFontResource fontResource);

			/// <summary>
			/// <para>Gets the index of the font face to be used.</para>
			/// <para>
			/// This value is only used when GetFontResource returns an IXpsOMFontResource interface that represents a <c>TrueType</c> font collection.
			/// </para>
			/// </summary>
			/// <returns>The index value of the font face. If the font face has not been set, –1 is returned.</returns>
			/// <remarks>
			/// <para>The font resource is obtained by calling the GetFontResource method.</para>
			/// <para>
			/// If a font face has not been set or is not supported by the font, a value of –1 is returned in fontFaceIndex. When the glyph
			/// is loaded from an existing XPS document file, a fontFaceIndex value of –1 indicates that the <c>FontUri</c> attribute did
			/// not include a <c>#index</c> fragment.
			/// </para>
			/// <para>
			/// In the following markup of a FixedPage, the <c>FontUri</c> attribute of the <c>Glyphs</c> element has a value of . In this
			/// case, <c>GetFontFaceIndex</c> would return a value of 1 in fontFaceIndex.
			/// </para>
			/// </remarks>
			// https://docs.microsoft.com/en-us/windows/win32/api/xpsobjectmodel/nf-xpsobjectmodel-ixpsomglyphs-getfontfaceindex HRESULT
			// GetFontFaceIndex( SHORT *fontFaceIndex );
			short GetFontFaceIndex();

			/// <summary>
			/// <para>Sets the index of the font face to be used.</para>
			/// <para>
			/// This value is only used when GetFontResource returns an IXpsOMFontResource interface that represents a <c>TrueType</c> font collection.
			/// </para>
			/// </summary>
			/// <param name="fontFaceIndex">The index value of the font face to be used.</param>
			/// <remarks>
			/// <para>
			/// The default value of the font face index property is –1, which means that a font index has not been set or the font resource
			/// is not a <c>TrueType</c> font collection.
			/// </para>
			/// <para>
			/// If this value is specified and is not –1, "#&lt;Index&gt;" is appended to the Font URI during serialization. Here,
			/// &lt;Index&gt; is the value that is set by <c>SetFontFaceIndex</c>.
			/// </para>
			/// <para>
			/// The following markup of a FixedPage shows the result of setting the fontFaceIndex to 1. Notice that the <c>FontUri</c>
			/// attribute of the <c>Glyphs</c> element has a value of , which includes the index of the font face.
			/// </para>
			/// </remarks>
			// https://docs.microsoft.com/en-us/windows/win32/api/xpsobjectmodel/nf-xpsobjectmodel-ixpsomglyphs-setfontfaceindex HRESULT
			// SetFontFaceIndex( SHORT fontFaceIndex );
			void SetFontFaceIndex([In] short fontFaceIndex);

			/// <summary>Gets a pointer to the resolved IXpsOMBrush interface of the fill brush to be used for the text.</summary>
			/// <returns>
			/// <para>
			/// A pointer to the resolved IXpsOMBrush interface of the fill brush to be used for the text. If a fill brush has not been set,
			/// a <c>NULL</c> pointer will be returned.
			/// </para>
			/// <para>The value that is returned in this parameter depends on which method has most recently been called to set the brush.</para>
			/// <list type="table">
			/// <listheader>
			/// <term>Most recent method called</term>
			/// <term>Object that is returned in fillBrush</term>
			/// </listheader>
			/// <item>
			/// <term>SetFillBrushLocal</term>
			/// <term>The local brush that is set by SetFillBrushLocal.</term>
			/// </item>
			/// <item>
			/// <term>SetFillBrushLookup</term>
			/// <term>
			/// The shared brush retrieved, with a lookup key that matches the key that is set by SetFillBrushLookup, from the local or
			/// resource directory.
			/// </term>
			/// </item>
			/// <item>
			/// <term>Neither SetFillBrushLocal nor SetFillBrushLookup has been called yet.</term>
			/// <term>NULL pointer.</term>
			/// </item>
			/// </list>
			/// </returns>
			/// <remarks>The fill brush is used to fill the shape of the rendered glyphs.</remarks>
			// https://docs.microsoft.com/en-us/windows/win32/api/xpsobjectmodel/nf-xpsobjectmodel-ixpsomglyphs-getfillbrush HRESULT
			// GetFillBrush( IXpsOMBrush **fillBrush );
			IXpsOMBrush GetFillBrush();

			/// <summary>Gets a pointer to the local, unshared IXpsOMBrush interface of the fill brush to be used for the text.</summary>
			/// <returns>
			/// <para>
			/// A pointer to the local, unshared IXpsOMBrush interface of the fill brush to be used for the text. If a fill brush lookup key
			/// has been set or if a local fill brush has not been set, a <c>NULL</c> pointer will be returned.
			/// </para>
			/// <list type="table">
			/// <listheader>
			/// <term>Most recent method called</term>
			/// <term>Object that is returned in fillBrush</term>
			/// </listheader>
			/// <item>
			/// <term>SetFillBrushLocal</term>
			/// <term>The local brush that is set by SetFillBrushLocal.</term>
			/// </item>
			/// <item>
			/// <term>SetFillBrushLookup</term>
			/// <term>NULL pointer.</term>
			/// </item>
			/// <item>
			/// <term>Neither SetFillBrushLocal nor SetFillBrushLookup has been called yet.</term>
			/// <term>NULL pointer.</term>
			/// </item>
			/// </list>
			/// </returns>
			// https://docs.microsoft.com/en-us/windows/win32/api/xpsobjectmodel/nf-xpsobjectmodel-ixpsomglyphs-getfillbrushlocal HRESULT
			// GetFillBrushLocal( IXpsOMBrush **fillBrush );
			IXpsOMBrush GetFillBrushLocal();

			/// <summary>Sets the IXpsOMBrush interface pointer to a local, unshared fill brush.</summary>
			/// <param name="fillBrush">
			/// The IXpsOMBrush interface pointer to be set as the local, unshared fill brush. A <c>NULL</c> pointer releases any previously
			/// assigned brushes.
			/// </param>
			/// <remarks>
			/// <para>
			/// After you call <c>SetFillBrushLocal</c>, the fill brush lookup key is released and GetFillBrushLookup returns a <c>NULL</c>
			/// pointer in the key parameter. The table that follows explains the relationship between the local and lookup values of this property.
			/// </para>
			/// <list type="table">
			/// <listheader>
			/// <term>Most recent method called</term>
			/// <term>Object that is returned in fillBrush by GetFillBrush</term>
			/// <term>Object that is returned in fillBrush by GetFillBrushLocal</term>
			/// <term>String that is returned in key by GetFillBrushLookup</term>
			/// </listheader>
			/// <item>
			/// <term>SetFillBrushLocal (this method)</term>
			/// <term>The local brush that is set by SetFillBrushLocal.</term>
			/// <term>The local brush that is set by SetFillBrushLocal.</term>
			/// <term>NULL pointer.</term>
			/// </item>
			/// <item>
			/// <term>SetFillBrushLookup</term>
			/// <term>
			/// The shared brush that gets retrieved, with a lookup key matching the key that is set by SetFillBrushLookup, from the
			/// resource directory.
			/// </term>
			/// <term>NULL pointer.</term>
			/// <term>The lookup key that is set by SetFillBrushLookup.</term>
			/// </item>
			/// <item>
			/// <term>Neither SetFillBrushLocal nor SetFillBrushLookup has been called yet.</term>
			/// <term>NULL pointer.</term>
			/// <term>NULL pointer.</term>
			/// <term>NULL pointer.</term>
			/// </item>
			/// </list>
			/// </remarks>
			// https://docs.microsoft.com/en-us/windows/win32/api/xpsobjectmodel/nf-xpsobjectmodel-ixpsomglyphs-setfillbrushlocal HRESULT
			// SetFillBrushLocal( IXpsOMBrush *fillBrush );
			void SetFillBrushLocal([In] IXpsOMBrush fillBrush);

			/// <summary>
			/// Gets the lookup key of the IXpsOMBrush interface that is stored in a resource dictionary and will be used as the fill brush.
			/// </summary>
			/// <returns>
			/// <para>
			/// The lookup key for the brush that is stored in a resource dictionary and will be used as the fill brush. If a fill brush
			/// lookup key has not been set or if a local fill brush has been set, a <c>NULL</c> pointer will be returned.
			/// </para>
			/// <list type="table">
			/// <listheader>
			/// <term>Most recent method called</term>
			/// <term>String that is returned in key</term>
			/// </listheader>
			/// <item>
			/// <term>SetFillBrushLocal</term>
			/// <term>NULL pointer.</term>
			/// </item>
			/// <item>
			/// <term>SetFillBrushLookup</term>
			/// <term>The lookup key that is set by SetFillBrushLookup.</term>
			/// </item>
			/// <item>
			/// <term>Neither SetFillBrushLocal nor SetFillBrushLookup has been called yet.</term>
			/// <term>NULL pointer.</term>
			/// </item>
			/// </list>
			/// </returns>
			// https://docs.microsoft.com/en-us/windows/win32/api/xpsobjectmodel/nf-xpsobjectmodel-ixpsomglyphs-getfillbrushlookup HRESULT
			// GetFillBrushLookup( LPWSTR *key );
			SafeCoTaskMemString GetFillBrushLookup();

			/// <summary>Sets the lookup key name of a shared fill brush.</summary>
			/// <param name="key">
			/// A string variable that contains the key name of the fill brush that is stored in the resource dictionary and will be used as
			/// the shared fill brush. A <c>NULL</c> pointer clears any previously assigned key string.
			/// </param>
			/// <remarks>
			/// <para>
			/// After you call <c>SetFillBrushLookup</c>, the local fill brush is released and GetFillBrushLocal returns a <c>NULL</c>
			/// pointer in the fillBrush parameter. The table that follows explains the relationship between the local and lookup values of
			/// this property.
			/// </para>
			/// <list type="table">
			/// <listheader>
			/// <term>Most recent method called</term>
			/// <term>Object that is returned in fillBrush by GetFillBrush</term>
			/// <term>Object that is returned in fillBrush by GetFillBrushLocal</term>
			/// <term>String that is returned in key by GetFillBrushLookup</term>
			/// </listheader>
			/// <item>
			/// <term>SetFillBrushLocal</term>
			/// <term>The local brush that is set by SetFillBrushLocal.</term>
			/// <term>The local brush that is set by SetFillBrushLocal.</term>
			/// <term>NULL pointer.</term>
			/// </item>
			/// <item>
			/// <term>SetFillBrushLookup (this method)</term>
			/// <term>
			/// The shared brush that gets retrieved, with a lookup key matching the key that is set by SetFillBrushLookup, from the
			/// resource directory.
			/// </term>
			/// <term>NULL pointer.</term>
			/// <term>The lookup key that is set by SetFillBrushLookup.</term>
			/// </item>
			/// <item>
			/// <term>Neither SetFillBrushLocal nor SetFillBrushLookup has been called yet.</term>
			/// <term>NULL pointer.</term>
			/// <term>NULL pointer.</term>
			/// <term>NULL pointer.</term>
			/// </item>
			/// </list>
			/// </remarks>
			// https://docs.microsoft.com/en-us/windows/win32/api/xpsobjectmodel/nf-xpsobjectmodel-ixpsomglyphs-setfillbrushlookup HRESULT
			// SetFillBrushLookup( LPCWSTR key );
			void SetFillBrushLookup([In, MarshalAs(UnmanagedType.LPWStr)] string key);

			/// <summary>Gets a pointer to the IXpsOMGlyphsEditor interface that will be used to edit the glyphs in the object.</summary>
			/// <returns>A pointer to the IXpsOMGlyphsEditor interface.</returns>
			/// <remarks>An IXpsOMGlyphsEditor interface is required to edit the read-only properties of the IXpsOMGlyphs interface.</remarks>
			// https://docs.microsoft.com/en-us/windows/win32/api/xpsobjectmodel/nf-xpsobjectmodel-ixpsomglyphs-getglyphseditor HRESULT
			// GetGlyphsEditor( IXpsOMGlyphsEditor **editor );
			IXpsOMGlyphsEditor GetGlyphsEditor();

			/// <summary>Makes a deep copy of the interface.</summary>
			/// <returns>A pointer to the copy of the interface.</returns>
			/// <remarks>This method does not update any of the resource pointers in the copy of the interface.</remarks>
			// https://docs.microsoft.com/en-us/windows/win32/api/xpsobjectmodel/nf-xpsobjectmodel-ixpsomglyphs-clone HRESULT Clone(
			// IXpsOMGlyphs **glyphs );
			IXpsOMGlyphs Clone();
		}

		/// <summary>Allows batch modification of properties that affect the text content in an IXpsOMGlyphs interface.</summary>
		// https://docs.microsoft.com/en-us/windows/win32/api/xpsobjectmodel/nn-xpsobjectmodel-ixpsomglyphseditor
		[PInvokeData("xpsobjectmodel.h", MSDNShortId = "5bdf2892-ce6f-4560-b638-e441166fc309")]
		[ComImport, Guid("A5AB8616-5B16-4B9F-9629-89B323ED7909"), InterfaceType(ComInterfaceType.InterfaceIsIUnknown)]
		public interface IXpsOMGlyphsEditor
		{
			/// <summary>Performs cross-property validation and then copies the changes to the parent IXpsOMGlyphs interface.</summary>
			/// <remarks>
			/// The IXpsOMGlyphsEditor interface remains valid after this method is called, allowing for additional modifications to be made.
			/// </remarks>
			// https://docs.microsoft.com/en-us/windows/win32/api/xpsobjectmodel/nf-xpsobjectmodel-ixpsomglyphseditor-applyedits HRESULT ApplyEdits();
			void ApplyEdits();

			/// <summary>Gets the text in unescaped UTF-16 scalar values.</summary>
			/// <returns>The UTF-16 Unicode string. If the string is empty, a <c>NULL</c> pointer is returned.</returns>
			// https://docs.microsoft.com/en-us/windows/win32/api/xpsobjectmodel/nf-xpsobjectmodel-ixpsomglyphseditor-getunicodestring
			// HRESULT GetUnicodeString( LPWSTR *unicodeString );
			SafeCoTaskMemString GetUnicodeString();

			/// <summary>Sets the text in unescaped UTF-16 scalar values.</summary>
			/// <param name="unicodeString">The address of a UTF-16 Unicode string. A <c>NULL</c> pointer clears the property.</param>
			// https://docs.microsoft.com/en-us/windows/win32/api/xpsobjectmodel/nf-xpsobjectmodel-ixpsomglyphseditor-setunicodestring
			// HRESULT SetUnicodeString( LPCWSTR unicodeString );
			void SetUnicodeString([In, MarshalAs(UnmanagedType.LPWStr)] string unicodeString);

			/// <summary>Gets the number of glyph indices.</summary>
			/// <returns>The glyph index count.</returns>
			/// <remarks>To get the glyph indices, call GetGlyphIndices.</remarks>
			// https://docs.microsoft.com/en-us/windows/win32/api/xpsobjectmodel/nf-xpsobjectmodel-ixpsomglyphseditor-getglyphindexcount
			// HRESULT GetGlyphIndexCount( UINT32 *indexCount );
			uint GetGlyphIndexCount();

			/// <summary>Gets an array of XPS_GLYPH_INDEX structures that describe the specific glyph indices in the font.</summary>
			/// <param name="indexCount">
			/// The number of elements that will fit in the array referenced by the glyphIndices parameter. When the method returns,
			/// indexCount will contain the number of XPS_GLYPH_INDEX structures that are returned in the array referenced by glyphIndices.
			/// </param>
			/// <param name="glyphIndices">The XPS_GLYPH_INDEX structure array that receives the glyph indices.</param>
			/// <remarks>
			/// <para>
			/// The glyph indices that are returned in glyphIndices override the default cmap mapping from the <c>UnicodeString</c> property
			/// to the glyph index. Each XPS_GLYPH_INDEX structure also contains advance width and vertical and horizontal offset information.
			/// </para>
			/// <para>GetGlyphIndexCount gets the number of elements in the glyph index array.</para>
			/// </remarks>
			// https://docs.microsoft.com/en-us/windows/win32/api/xpsobjectmodel/nf-xpsobjectmodel-ixpsomglyphseditor-getglyphindices
			// HRESULT GetGlyphIndices( UINT32 *indexCount, XPS_GLYPH_INDEX *glyphIndices );
			void GetGlyphIndices(ref uint indexCount, [In, Out] XPS_GLYPH_INDEX[] glyphIndices);

			/// <summary>Sets an XPS_GLYPH_INDEX structure array that describes which glyph indices are to be used in the font.</summary>
			/// <param name="indexCount">
			/// The number of XPS_GLYPH_INDEX structures in the array that is referenced by glyphIndices. The value of 0 clears the property.
			/// </param>
			/// <param name="glyphIndices">
			/// An array of XPS_GLYPH_INDEX structures that contain the glyph indices. If indexCount is 0, this parameter is ignored.
			/// </param>
			/// <remarks>
			/// The glyph indices that are passed in glyphIndices override the default cmap mapping from the <c>UnicodeString</c> property
			/// to the glyph index. Each XPS_GLYPH_INDEX structure also has advance width and vertical and horizontal offset information.
			/// </remarks>
			// https://docs.microsoft.com/en-us/windows/win32/api/xpsobjectmodel/nf-xpsobjectmodel-ixpsomglyphseditor-setglyphindices
			// HRESULT SetGlyphIndices( UINT32 indexCount, const XPS_GLYPH_INDEX *glyphIndices );
			void SetGlyphIndices([In] uint indexCount, [In] XPS_GLYPH_INDEX[] glyphIndices);

			/// <summary>Gets the number of glyph mappings.</summary>
			/// <returns>The number of glyph mappings.</returns>
			/// <remarks>To get the glyph mappings, call GetGlyphMappings.</remarks>
			// https://docs.microsoft.com/en-us/windows/win32/api/xpsobjectmodel/nf-xpsobjectmodel-ixpsomglyphseditor-getglyphmappingcount
			// HRESULT GetGlyphMappingCount( UINT32 *glyphMappingCount );
			uint GetGlyphMappingCount();

			/// <summary>
			/// Gets an array of XPS_GLYPH_MAPPING structures that describe how to map UTF-16 scalar values to entries in the array of
			/// XPS_GLYPH_INDEX structures, which is returned by GetGlyphIndices.
			/// </summary>
			/// <param name="glyphMappingCount">
			/// The number of XPS_GLYPH_MAPPING structures that will fit in the array referenced by glyphMappings. When the method returns,
			/// glyphMappingCount will contain the number of values in that array.
			/// </param>
			/// <param name="glyphMappings">An array of XPS_GLYPH_MAPPING structures that receives the glyph mapping values.</param>
			/// <remarks>GetGlyphMappingCount gets the number of glyph mappings.</remarks>
			// https://docs.microsoft.com/en-us/windows/win32/api/xpsobjectmodel/nf-xpsobjectmodel-ixpsomglyphseditor-getglyphmappings
			// HRESULT GetGlyphMappings( UINT32 *glyphMappingCount, XPS_GLYPH_MAPPING *glyphMappings );
			void GetGlyphMappings(ref uint glyphMappingCount, [In, Out] XPS_GLYPH_MAPPING[] glyphMappings);

			/// <summary>
			/// Sets an array of XPS_GLYPH_MAPPING structures that describe how to map the UTF-16 scalar values in the <c>UnicodeString</c>
			/// property to entries in the array of XPS_GLYPH_INDEX structures.
			/// </summary>
			/// <param name="glyphMappingCount">
			/// The number of XPS_GLYPH_MAPPING structures in the array that is referenced by glyphMappings. A value of 0 clears the property.
			/// </param>
			/// <param name="glyphMappings">
			/// An XPS_GLYPH_MAPPING structure array that contains the glyph mapping values. If glyphMappingCount is 0, this parameter is
			/// ignored and can be set to <c>NULL</c>.
			/// </param>
			// https://docs.microsoft.com/en-us/windows/win32/api/xpsobjectmodel/nf-xpsobjectmodel-ixpsomglyphseditor-setglyphmappings
			// HRESULT SetGlyphMappings( UINT32 glyphMappingCount, const XPS_GLYPH_MAPPING *glyphMappings );
			void SetGlyphMappings([In] uint glyphMappingCount, [In] XPS_GLYPH_MAPPING[] glyphMappings);

			/// <summary>Gets the number of prohibited caret stops.</summary>
			/// <returns>The number of prohibited caret stops.</returns>
			/// <remarks>
			/// <para>To get the prohibited caret stops, call GetProhibitedCaretStops.</para>
			/// <para>
			/// Each caret stop index corresponds to the scalar values of a UTF-16 <c>UnicodeString</c> property. Index 0 represents the
			/// location just before the first UTF-16 scalar value of <c>UnicodeString</c>; index 1 represents the location between the
			/// first and second UTF-16 scalar values, and so on. There is an additional index at the end of <c>UnicodeString</c>. Any
			/// unspecified index is a valid caret stop location.
			/// </para>
			/// </remarks>
			// https://docs.microsoft.com/en-us/windows/win32/api/xpsobjectmodel/nf-xpsobjectmodel-ixpsomglyphseditor-getprohibitedcaretstopcount
			// HRESULT GetProhibitedCaretStopCount( UINT32 *prohibitedCaretStopCount );
			uint GetProhibitedCaretStopCount();

			/// <summary>Gets an array of prohibited caret stop locations.</summary>
			/// <param name="count">
			/// The number of prohibited caret stop values that will fit in the array that is referenced by the prohibitedCaretStops
			/// parameter. When the method returns, prohibitedCaretStopCount will contain the number of values in that array.
			/// </param>
			/// <param name="prohibitedCaretStops">
			/// An array of glyph mapping values. If no prohibited caret stops have been defined, a <c>NULL</c> pointer is returned.
			/// </param>
			/// <remarks>
			/// <para>
			/// Each caret stop index corresponds to the scalar values of a UTF-16 <c>UnicodeString</c> property. Index 0 represents the
			/// location just before the first UTF-16 scalar value of <c>UnicodeString</c>; index 1 represents the location between the
			/// first and second UTF-16 scalar values, and so on. There is an additional index at the end of <c>UnicodeString</c>. Any
			/// unspecified index is a valid caret stop location.
			/// </para>
			/// <para>GetProhibitedCaretStopCount gets the number of prohibited caret stops.</para>
			/// <para>A caret stop is the index of the UTF-16 code point in the <c>UnicodeString</c> property of the glyph.</para>
			/// </remarks>
			// https://docs.microsoft.com/en-us/windows/win32/api/xpsobjectmodel/nf-xpsobjectmodel-ixpsomglyphseditor-getprohibitedcaretstops
			// HRESULT GetProhibitedCaretStops( UINT32 *count, UINT32 *prohibitedCaretStops );
			void GetProhibitedCaretStops(ref uint count, [In, Out] uint[] prohibitedCaretStops);

			/// <summary>Sets an array of prohibited caret stop locations.</summary>
			/// <param name="count">
			/// The number of prohibited caret stop locations in the array that is referenced by prohibitedCaretStops. A value of 0 clears
			/// the property.
			/// </param>
			/// <param name="prohibitedCaretStops">
			/// The array of prohibited caret stop locations to be set. If count is 0, this parameter is ignored and can be set to <c>NULL</c>.
			/// </param>
			/// <remarks>
			/// Each caret stop index corresponds to the scalar values of a UTF-16 <c>UnicodeString</c> property. Index 0 represents the
			/// location just before the first UTF-16 scalar value of <c>UnicodeString</c>; index 1 represents the location between the
			/// first and second UTF-16 scalar values, and so on. There is an additional index at the end of <c>UnicodeString</c>. Any
			/// unspecified index is a valid caret stop location.
			/// </remarks>
			// https://docs.microsoft.com/en-us/windows/win32/api/xpsobjectmodel/nf-xpsobjectmodel-ixpsomglyphseditor-setprohibitedcaretstops
			// HRESULT SetProhibitedCaretStops( UINT32 count, const UINT32 *prohibitedCaretStops );
			void SetProhibitedCaretStops([In] uint count, [In] uint[] prohibitedCaretStops);

			/// <summary>Gets the bidirectional text level of the parent IXpsOMGlyphs interface.</summary>
			/// <returns>
			/// <para>The bidirectional text level.</para>
			/// <para>Range: 0–61</para>
			/// </returns>
			/// <remarks>
			/// <para>
			/// The <c>BidiLevel</c> property specifies the bidirectional nesting level of the Unicode algorithm. Even values imply the
			/// left-to-right layout and odd values the right-to-left layout. Right-to-left layout places the run origin at the right side
			/// of the first glyph. Advance widths that are positive will move to the left, allowing subsequent glyphs to be placed to the
			/// left of the previous glyph.
			/// </para>
			/// <para>The range of allowed values for this property is between 0 and 61, inclusive, and the default value is 0.</para>
			/// </remarks>
			// https://docs.microsoft.com/en-us/windows/win32/api/xpsobjectmodel/nf-xpsobjectmodel-ixpsomglyphseditor-getbidilevel HRESULT
			// GetBidiLevel( UINT32 *bidiLevel );
			uint GetBidiLevel();

			/// <summary>Sets the level of bidirectional text.</summary>
			/// <param name="bidiLevel">
			/// <para>The level of bidirectional text.</para>
			/// <para>Range: 0–61</para>
			/// </param>
			/// <remarks>
			/// <para>
			/// The <c>BidiLevel</c> property specifies the bidirectional nesting level of the Unicode algorithm. Even values imply the
			/// left-to-right layout and odd values the right-to-left layout. Right-to-left layout places the run origin on the right side
			/// of the first glyph. Advance widths that are positive will move to the left, allowing subsequent glyphs to be placed to the
			/// left of the previous glyph.
			/// </para>
			/// <para>The range of allowed values for this property is between 0 and 61, inclusive, and the default value is 0.</para>
			/// </remarks>
			// https://docs.microsoft.com/en-us/windows/win32/api/xpsobjectmodel/nf-xpsobjectmodel-ixpsomglyphseditor-setbidilevel HRESULT
			// SetBidiLevel( UINT32 bidiLevel );
			void SetBidiLevel([In] uint bidiLevel);

			/// <summary>Gets a Boolean value that indicates whether the text is to be rendered with the glyphs rotated sideways.</summary>
			/// <returns>
			/// <para>The Boolean value that indicates whether the text is to be rendered with the glyphs rotated sideways.</para>
			/// <list type="table">
			/// <listheader>
			/// <term>Value</term>
			/// <term>Meaning</term>
			/// </listheader>
			/// <item>
			/// <term>TRUE</term>
			/// <term>Rotate the glyphs sideways. Produces sideways text.</term>
			/// </item>
			/// <item>
			/// <term>FALSE</term>
			/// <term>Do not rotate the glyphs sideways. Produces normal text.</term>
			/// </item>
			/// </list>
			/// </returns>
			/// <remarks>The default value for this property is <c>false</c>.</remarks>
			// https://docs.microsoft.com/en-us/windows/win32/api/xpsobjectmodel/nf-xpsobjectmodel-ixpsomglyphseditor-getissideways HRESULT
			// GetIsSideways( BOOL *isSideways );
			[return: MarshalAs(UnmanagedType.Bool)]
			bool GetIsSideways();

			/// <summary>Sets the value that indicates whether the text is to be rendered with the glyphs rotated sideways.</summary>
			/// <param name="isSideways">
			/// <para>The Boolean value that indicates whether the text is to be rendered with the glyphs rotated sideways.</para>
			/// <list type="table">
			/// <listheader>
			/// <term>Value</term>
			/// <term>Meaning</term>
			/// </listheader>
			/// <item>
			/// <term>TRUE</term>
			/// <term>Rotate the glyphs sideways. Produces sideways text.</term>
			/// </item>
			/// <item>
			/// <term>FALSE</term>
			/// <term>Do not rotate the glyphs sideways. Produces normal text.</term>
			/// </item>
			/// </list>
			/// </param>
			// https://docs.microsoft.com/en-us/windows/win32/api/xpsobjectmodel/nf-xpsobjectmodel-ixpsomglyphseditor-setissideways HRESULT
			// SetIsSideways( BOOL isSideways );
			void SetIsSideways([In, MarshalAs(UnmanagedType.Bool)] bool isSideways);

			/// <summary>Gets the name of the device font.</summary>
			/// <returns>The name of the device font; if not specified, a <c>NULL</c> pointer will be returned.</returns>
			/// <remarks>
			/// <para>The device font name is created as an escaped name when the object is serialized.</para>
			/// <para>The device font name uniquely identifies a specific device font and is typically defined by a hardware or font vendor.</para>
			/// </remarks>
			// https://docs.microsoft.com/en-us/windows/win32/api/xpsobjectmodel/nf-xpsobjectmodel-ixpsomglyphseditor-getdevicefontname
			// HRESULT GetDeviceFontName( LPWSTR *deviceFontName );
			SafeCoTaskMemString GetDeviceFontName();

			/// <summary>Sets the name of the device font.</summary>
			/// <param name="deviceFontName">
			/// A pointer to the string that contains the name of the device font in its unescaped form. A <c>NULL</c> pointer clears the property.
			/// </param>
			/// <remarks>
			/// The device font name that is passed in deviceFontName can be set in its unescaped form; it will be converted to its escaped
			/// form when the document is serialized.
			/// </remarks>
			// https://docs.microsoft.com/en-us/windows/win32/api/xpsobjectmodel/nf-xpsobjectmodel-ixpsomglyphseditor-setdevicefontname
			// HRESULT SetDeviceFontName( LPCWSTR deviceFontName );
			void SetDeviceFontName([In, MarshalAs(UnmanagedType.LPWStr)] string deviceFontName);
		}

		/// <summary>
		/// <para>
		/// This interface describes a gradient that is made up of gradient stops. Classes that inherit from <c>IXpsOMGradientBrush</c>
		/// specify different ways of interpreting gradient stops.
		/// </para>
		/// <para><c>IXpsOMGradientBrush</c> is the base interface for the IXpsOMLinearGradientBrush and IXpsOMRadialGradientBrush interfaces.</para>
		/// </summary>
		/// <remarks>
		/// <para>
		/// The methods of this interface define the basic parameters of a gradient. The gradient type, which can be linear or radial,
		/// determines how these parameters are applied.
		/// </para>
		/// <para>
		/// As shown in the figure that follows, the start and end points of a linear gradient mark the end points of the gradient path. The
		/// gradient path is the straight line that connects the start and end points. The gradient region of a linear gradient consists of
		/// the area between the start and end points, including those points, and extends in both directions at a right angle to the
		/// gradient path. The spread area is the area outside the gradient region.
		/// </para>
		/// <para>
		/// Gradient stops define the color at specific locations along the gradient path; the color is interpolated along the gradient path
		/// between the gradient stops, as shown in the following illustration.
		/// </para>
		/// <para>
		/// As shown in the figure that follows, the gradient region of a radial gradient is the area enclosed by the ellipse that is
		/// described by the center point and the x and y radii that extend from the center point. The spread area is the area outside of
		/// that ellipse. The gradient path is a radial line that sweeps the entire gradient region from the gradient origin to the ellipse
		/// that bounds the gradient region. In the following illustration, the gradient path is not shown.
		/// </para>
		/// <para>
		/// The spread method describes how the spread area is filled. Implementation of the spread method depends on the gradient type
		/// (linear or radial). The following illustration shows several examples of how the spread area can be filled. For information
		/// about different spread methods, see XPS_SPREAD_METHOD.
		/// </para>
		/// <para>
		/// The transform determines how the resulting gradient is transformed. The visible part of the gradient that is ultimately rendered
		/// in the image is determined by the path, stroke, or glyph that is using the gradient brush.
		/// </para>
		/// </remarks>
		// https://docs.microsoft.com/en-us/windows/win32/api/xpsobjectmodel/nn-xpsobjectmodel-ixpsomgradientbrush
		[PInvokeData("xpsobjectmodel.h", MSDNShortId = "d381b813-5368-4ffe-a9a1-0f5027ae9d80")]
		[ComImport, Guid("EDB59622-61A2-42C3-BACE-ACF2286C06BF"), InterfaceType(ComInterfaceType.InterfaceIsIUnknown)]
		public interface IXpsOMGradientBrush : IXpsOMBrush
		{
			/// <summary>Gets the <c>IUnknown</c> interface of the parent.</summary>
			/// <returns>A pointer to the <c>IUnknown</c> interface of the parent.</returns>
			// https://docs.microsoft.com/en-us/windows/win32/api/xpsobjectmodel/nf-xpsobjectmodel-ixpsomshareable-getowner HRESULT
			// GetOwner( IUnknown **owner );
			[return: MarshalAs(UnmanagedType.IUnknown)]
			new object GetOwner();

			/// <summary>Gets the object type of the interface.</summary>
			/// <returns>The XPS_OBJECT_TYPE value that describes the interface that is derived from IXpsOMShareable.</returns>
			// https://docs.microsoft.com/en-us/windows/win32/api/xpsobjectmodel/nf-xpsobjectmodel-ixpsomshareable-gettype HRESULT GetType(
			// XPS_OBJECT_TYPE *type );
			new XPS_OBJECT_TYPE GetType();

			/// <summary>Gets the opacity of the brush.</summary>
			/// <returns>The opacity value of the brush.</returns>
			/// <remarks>
			/// opacity is expressed as a value between 0.0 and 1.0; 0.0 indicates that the brush is completely transparent, 0.5 that it is
			/// 50 percent opaque, and 1.0 that it is completely opaque.
			/// </remarks>
			// https://docs.microsoft.com/en-us/windows/win32/api/xpsobjectmodel/nf-xpsobjectmodel-ixpsombrush-getopacity HRESULT
			// GetOpacity( FLOAT *opacity );
			new float GetOpacity();

			/// <summary>Sets the opacity of the brush.</summary>
			/// <param name="opacity">The opacity value of the brush.</param>
			/// <remarks>
			/// <para>
			/// opacity is expressed as a value between 0.0 and 1.0; 0.0 indicates that the brush is completely transparent, 0.5 that it is
			/// 50 percent opaque, and 1.0 that it is completely opaque.
			/// </para>
			/// <para>If opacity is less than 0.0 or greater than 1.0, the method returns an error.</para>
			/// </remarks>
			// https://docs.microsoft.com/en-us/windows/win32/api/xpsobjectmodel/nf-xpsobjectmodel-ixpsombrush-setopacity HRESULT
			// SetOpacity( FLOAT opacity );
			new void SetOpacity([In] float opacity);

			/// <summary>
			/// Gets a pointer to an IXpsOMGradientStopCollection interface that contains the collection of IXpsOMGradientStop interfaces
			/// that define the gradient.
			/// </summary>
			/// <returns>A pointer to the IXpsOMGradientStopCollection interface that contains the collection of IXpsOMGradientStop interfaces.</returns>
			/// <remarks>
			/// <para>
			/// Gradient stops, which are described in the XPS OM by an IXpsOMGradientStop interface, are used to define the color at a
			/// specific location along a gradient path; the color is interpolated between the gradient stops. The illustration that follows
			/// shows the gradient path and gradient stops of a linear gradient.
			/// </para>
			/// <para>
			/// The illustration that follows shows the gradient stops of a radial gradient. In this example, the gradient region is the
			/// area enclosed by the outer ellipse, and the radial gradient is using the <c>XPS_SPREAD_METHOD_REFLECT</c> spread method to
			/// fill the space outside of the gradient region.
			/// </para>
			/// </remarks>
			// https://docs.microsoft.com/en-us/windows/win32/api/xpsobjectmodel/nf-xpsobjectmodel-ixpsomgradientbrush-getgradientstops
			// HRESULT GetGradientStops( IXpsOMGradientStopCollection **gradientStops );
			IXpsOMGradientStopCollection GetGradientStops();

			/// <summary>Gets a pointer to the IXpsOMMatrixTransform interface that contains the resolved matrix transform for the brush.</summary>
			/// <returns>
			/// <para>
			/// A pointer to the IXpsOMMatrixTransform interface that contains the resolved matrix transform for the brush. If the transform
			/// has not been set, a <c>NULL</c> pointer is returned.
			/// </para>
			/// <para>The value that is returned in this parameter depends on which method has been most recently called to set the transform.</para>
			/// <list type="table">
			/// <listheader>
			/// <term>Most recent method called</term>
			/// <term>Object that is returned in transform</term>
			/// </listheader>
			/// <item>
			/// <term>SetTransformLocal</term>
			/// <term>The local transform that is set by SetTransformLocal.</term>
			/// </item>
			/// <item>
			/// <term>SetTransformLookup</term>
			/// <term>
			/// The shared transform that is retrieved, with a lookup key that matches the key set by SetTransformLookup, from the resource directory.
			/// </term>
			/// </item>
			/// <item>
			/// <term>Neither SetTransformLocal nor SetTransformLookup has been called yet.</term>
			/// <term>NULL pointer.</term>
			/// </item>
			/// </list>
			/// </returns>
			/// <remarks>
			/// The transform determines how the gradient is transformed. The visible part of the gradient that is ultimately rendered in
			/// the image is determined by the path, stroke, or glyph that is using the gradient brush.
			/// </remarks>
			// https://docs.microsoft.com/en-us/windows/win32/api/xpsobjectmodel/nf-xpsobjectmodel-ixpsomgradientbrush-gettransform HRESULT
			// GetTransform( IXpsOMMatrixTransform **transform );
			IXpsOMMatrixTransform GetTransform();

			/// <summary>
			/// Gets a pointer to the IXpsOMMatrixTransform interface that contains the local, unshared, resolved matrix transform for the brush.
			/// </summary>
			/// <returns>
			/// <para>
			/// A pointer to the IXpsOMMatrixTransform interface that contains the local, unshared, resolved matrix transform for the brush.
			/// If the transform has not been set or if a matrix transform lookup key has been set, a <c>NULL</c> pointer is returned.
			/// </para>
			/// <para>The value that is returned in this parameter depends on which method has been most recently called to set the transform.</para>
			/// <list type="table">
			/// <listheader>
			/// <term>Most recent method called</term>
			/// <term>Object that is returned in transform</term>
			/// </listheader>
			/// <item>
			/// <term>SetTransformLocal</term>
			/// <term>The local transform that is set by SetTransformLocal.</term>
			/// </item>
			/// <item>
			/// <term>SetTransformLookup</term>
			/// <term>NULL pointer.</term>
			/// </item>
			/// <item>
			/// <term>Neither SetTransformLocal nor SetTransformLookup has been called yet.</term>
			/// <term>NULL pointer.</term>
			/// </item>
			/// </list>
			/// </returns>
			/// <remarks>
			/// The transform determines how the gradient is transformed. The visible part of the gradient that is ultimately rendered in
			/// the image is determined by the path, stroke, or glyph that is using the gradient brush.
			/// </remarks>
			// https://docs.microsoft.com/en-us/windows/win32/api/xpsobjectmodel/nf-xpsobjectmodel-ixpsomgradientbrush-gettransformlocal
			// HRESULT GetTransformLocal( IXpsOMMatrixTransform **transform );
			IXpsOMMatrixTransform GetTransformLocal();

			/// <summary>
			/// Sets the IXpsOMMatrixTransform interface pointer to a local, unshared matrix transform that is to be used for the brush.
			/// </summary>
			/// <param name="transform">
			/// A pointer to the IXpsOMMatrixTransform interface of the local, unshared matrix transform that is to be used for the brush. A
			/// <c>NULL</c> pointer releases any previously set interface.
			/// </param>
			/// <remarks>
			/// <para>
			/// After you call <c>SetTransformLocal</c>, the transform lookup key is released and GetTransformLocal returns a <c>NULL</c>
			/// pointer in the transform parameter. The table that follows explains the relationship between the local and lookup values of
			/// this property.
			/// </para>
			/// <list type="table">
			/// <listheader>
			/// <term>Most recent method called</term>
			/// <term>Object that is returned in transform by GetTransform</term>
			/// <term>Object that is returned in transform by GetTransformLocal</term>
			/// <term>Object that is returned in key by GetTransformLookup</term>
			/// </listheader>
			/// <item>
			/// <term>SetTransformLocal (this method)</term>
			/// <term>The local transform that is set by SetTransformLocal.</term>
			/// <term>The local transform that is set by SetTransformLocal.</term>
			/// <term>NULL pointer.</term>
			/// </item>
			/// <item>
			/// <term>SetTransformLookup</term>
			/// <term>
			/// The shared transform retrieved, with a lookup key that matches the key that is set by SetTransformLookup, from the resource directory.
			/// </term>
			/// <term>NULL pointer.</term>
			/// <term>The lookup key that is set by SetTransformLookup.</term>
			/// </item>
			/// <item>
			/// <term>Neither SetTransformLocal nor SetTransformLookup has been called yet.</term>
			/// <term>NULL pointer.</term>
			/// <term>NULL pointer.</term>
			/// <term>NULL pointer.</term>
			/// </item>
			/// </list>
			/// <para>
			/// The transform passed in transform determines how the gradient is transformed. The visible part of the gradient that is
			/// ultimately rendered in the image is determined by the path, stroke, or glyph that is using the gradient brush.
			/// </para>
			/// </remarks>
			// https://docs.microsoft.com/en-us/windows/win32/api/xpsobjectmodel/nf-xpsobjectmodel-ixpsomgradientbrush-settransformlocal
			// HRESULT SetTransformLocal( IXpsOMMatrixTransform *transform );
			void SetTransformLocal([In] IXpsOMMatrixTransform transform);

			/// <summary>
			/// <para>Gets the name of the lookup key of the shared matrix transform interface that is to be used for the brush.</para>
			/// <para>The key name identifies a shared resource in a resource dictionary.</para>
			/// </summary>
			/// <returns>
			/// <para>
			/// The name of the lookup key of the shared matrix transform interface that is to be used for the brush. If the lookup key name
			/// has not been set or if the local matrix transform has been set, a <c>NULL</c> pointer is returned.
			/// </para>
			/// <para>
			/// The value that is returned in this parameter depends on which method has been most recently called to set the lookup key or
			/// the transform.
			/// </para>
			/// <list type="table">
			/// <listheader>
			/// <term>Most recent method called</term>
			/// <term>String that is returned in key</term>
			/// </listheader>
			/// <item>
			/// <term>SetTransformLocal</term>
			/// <term>NULL pointer.</term>
			/// </item>
			/// <item>
			/// <term>SetTransformLookup</term>
			/// <term>The key that is set by SetTransformLookup.</term>
			/// </item>
			/// <item>
			/// <term>Neither SetTransformLocal nor SetTransformLookup has been called yet.</term>
			/// <term>NULL pointer.</term>
			/// </item>
			/// </list>
			/// </returns>
			/// <remarks>
			/// <para>
			/// This method does not return an IXpsOMMatrixTransform interface pointer; to retrieve this pointer from the dictionary, call IXpsOMDictionary::GetByKey.
			/// </para>
			/// <para>
			/// The transform determines how the gradient is transformed. The visible part of the gradient that is ultimately rendered in
			/// the image is determined by the path, stroke, or glyph that is using the gradient brush.
			/// </para>
			/// </remarks>
			// https://docs.microsoft.com/en-us/windows/win32/api/xpsobjectmodel/nf-xpsobjectmodel-ixpsomgradientbrush-gettransformlookup
			// HRESULT GetTransformLookup( LPWSTR *key );
			SafeCoTaskMemString GetTransformLookup();

			/// <summary>
			/// <para>Sets the name of the lookup key of a shared matrix transform that is to be used for the brush.</para>
			/// <para>The key name identifies a shared resource in a resource dictionary.</para>
			/// </summary>
			/// <param name="key">The name of the lookup key of the matrix transform that is to be used for the brush.</param>
			/// <remarks>
			/// <para>
			/// After you call <c>SetTransformLookup</c>, the local transform is released and GetTransformLocal returns a <c>NULL</c>
			/// pointer in the transform parameter. The table that follows explains the relationship between the local and lookup values of
			/// this property.
			/// </para>
			/// <list type="table">
			/// <listheader>
			/// <term>Most recent method called</term>
			/// <term>Object that is returned in transform by GetTransform</term>
			/// <term>Object that is returned in transform by GetTransformLocal</term>
			/// <term>Object that is returned in key by GetTransformLookup</term>
			/// </listheader>
			/// <item>
			/// <term>SetTransformLocal</term>
			/// <term>The local transform that is set by SetTransformLocal.</term>
			/// <term>The local transform that is set by SetTransformLocal.</term>
			/// <term>NULL pointer.</term>
			/// </item>
			/// <item>
			/// <term>SetTransformLookup (this method)</term>
			/// <term>
			/// The shared transform retrieved, with a lookup key that matches the key that is set by SetTransformLookup, from the resource directory.
			/// </term>
			/// <term>NULL pointer.</term>
			/// <term>The lookup key that is set by SetTransformLookup.</term>
			/// </item>
			/// <item>
			/// <term>Neither SetTransformLocal nor SetTransformLookup has been called yet.</term>
			/// <term>NULL pointer.</term>
			/// <term>NULL pointer.</term>
			/// <term>NULL pointer.</term>
			/// </item>
			/// </list>
			/// <para>
			/// The transform referenced by key determines how the gradient is transformed. The visible part of the gradient that is
			/// ultimately rendered in the image is determined by the path, stroke, or glyph that is using the brush.
			/// </para>
			/// </remarks>
			// https://docs.microsoft.com/en-us/windows/win32/api/xpsobjectmodel/nf-xpsobjectmodel-ixpsomgradientbrush-settransformlookup
			// HRESULT SetTransformLookup( LPCWSTR key );
			void SetTransformLookup([In, MarshalAs(UnmanagedType.LPWStr)] string key);

			/// <summary>Gets the XPS_SPREAD_METHOD value, which describes how the area outside of the gradient region will be rendered.</summary>
			/// <returns>
			/// The XPS_SPREAD_METHOD value that describes how the area outside of the gradient region will be rendered. The gradient region
			/// is defined by the linear-gradient brush or radial-gradient brush that inherits this interface.
			/// </returns>
			/// <remarks>For more information about different types of spread methods, see XPS_SPREAD_METHOD.</remarks>
			// https://docs.microsoft.com/en-us/windows/win32/api/xpsobjectmodel/nf-xpsobjectmodel-ixpsomgradientbrush-getspreadmethod
			// HRESULT GetSpreadMethod( XPS_SPREAD_METHOD *spreadMethod );
			XPS_SPREAD_METHOD GetSpreadMethod();

			/// <summary>
			/// Sets the XPS_SPREAD_METHOD value, which describes how the area outside of the gradient region is to be rendered. The
			/// gradient region is defined by the start and end points of the gradient.
			/// </summary>
			/// <param name="spreadMethod">
			/// The XPS_SPREAD_METHOD value that describes how the area outside of the gradient region is to be rendered. The gradient
			/// region is defined by the linear-gradient brush or radial-gradient brush that inherits this interface.
			/// </param>
			/// <remarks>For more information about different types of spread methods, see XPS_SPREAD_METHOD.</remarks>
			// https://docs.microsoft.com/en-us/windows/win32/api/xpsobjectmodel/nf-xpsobjectmodel-ixpsomgradientbrush-setspreadmethod
			// HRESULT SetSpreadMethod( XPS_SPREAD_METHOD spreadMethod );
			void SetSpreadMethod([In] XPS_SPREAD_METHOD spreadMethod);

			/// <summary>Gets the gamma function to be used for color interpolation.</summary>
			/// <returns>The XPS_COLOR_INTERPOLATION value that describes the gamma function to be used for color interpolation.</returns>
			// https://docs.microsoft.com/en-us/windows/win32/api/xpsobjectmodel/nf-xpsobjectmodel-ixpsomgradientbrush-getcolorinterpolationmode
			// HRESULT GetColorInterpolationMode( XPS_COLOR_INTERPOLATION *colorInterpolationMode );
			XPS_COLOR_INTERPOLATION GetColorInterpolationMode();

			/// <summary>Sets the XPS_COLOR_INTERPOLATION value, which describes the gamma function to be used for color interpolation.</summary>
			/// <param name="colorInterpolationMode">
			/// The XPS_COLOR_INTERPOLATION value, which describes the gamma function to be used for color interpolation.
			/// </param>
			// https://docs.microsoft.com/en-us/windows/win32/api/xpsobjectmodel/nf-xpsobjectmodel-ixpsomgradientbrush-setcolorinterpolationmode
			// HRESULT SetColorInterpolationMode( XPS_COLOR_INTERPOLATION colorInterpolationMode );
			void SetColorInterpolationMode([In] XPS_COLOR_INTERPOLATION colorInterpolationMode);
		}

		/// <summary>Represents a single color and location within a gradient.</summary>
		/// <remarks>
		/// <para>
		/// A gradient stop is a specific color that is defined for a location within the gradient region. The color of the gradient changes
		/// between the gradient stops of the gradient. The area and absolute location of the gradient is defined by the gradient interface.
		/// The offset is a relative location within the gradient region and is measured between 0.0 and 1.0. An offset of 0.0 is the
		/// beginning of the gradient and 1.0 is the end. Gradient stops can be defined for any offset within the range, including the end
		/// points. This interface describes one and only one stop in a gradient.
		/// </para>
		/// <para>
		/// The gradient path is the straight line that connects the start point and the end point of a linear gradient. The gradient region
		/// of a linear gradient consists of the area between the start point and the end point, including those points, and extends in both
		/// directions at a right angle to the gradient path. The spread area is the area outside the gradient region.
		/// </para>
		/// <para>
		/// Gradient stops define the color at a specific location along the gradient path; the color is interpolated along the gradient
		/// path between the gradient stops. In the example that follows, the gradient region fills the image, so there is no spread area.
		/// </para>
		/// <para>
		/// For gradient stops used in linear-gradient brushes, the offset value of 0.0 corresponds to the start point of the gradient path,
		/// and the offset value of 1.0 corresponds to the end point. To determine the location of a gradient stop between these two points,
		/// intermediate offset values are interpolated between them. The following illustration shows two intermediate gradient stops, one
		/// at an offset of 0.25 and another at 0.75.
		/// </para>
		/// <para>
		/// For gradient stops used in radial-gradient brushes, the offset value of 0.0 corresponds to the gradient origin location, and the
		/// offset value of 1.0 corresponds to the circumference of the ellipse that bounds the gradient. Offsets between 0.0 and 1.0 define
		/// an ellipse that is interpolated between the gradient origin and the bounding ellipse. The illustration that follows has one
		/// intermediate gradient stop at an offset of 0.50 (Gradient stop 1). The gradient is using the <c>XPS_SPREAD_METHOD_REFLECT</c>
		/// spread method to fill the space outside of the gradient region.
		/// </para>
		/// <para>The calculations that are used to render a gradient are described in the XML Paper Specification.</para>
		/// <para>The code example that follows illustrates how to create an instance of this interface.</para>
		/// </remarks>
		// https://docs.microsoft.com/en-us/windows/win32/api/xpsobjectmodel/nn-xpsobjectmodel-ixpsomgradientstop
		[PInvokeData("xpsobjectmodel.h", MSDNShortId = "e115d806-70c1-4c6a-810e-e6a058628b44")]
		[ComImport, Guid("5CF4F5CC-3969-49B5-A70A-5550B618FE49"), InterfaceType(ComInterfaceType.InterfaceIsIUnknown)]
		public interface IXpsOMGradientStop
		{
			/// <summary>Gets a pointer to the IXpsOMGradientBrush interface that contains the gradient stop.</summary>
			/// <returns>
			/// A pointer to the IXpsOMGradientBrush interface that contains the gradient stop. If the gradient stop is not assigned to a
			/// gradient brush, a <c>NULL</c> pointer is returned.
			/// </returns>
			// https://docs.microsoft.com/en-us/windows/win32/api/xpsobjectmodel/nf-xpsobjectmodel-ixpsomgradientstop-getowner HRESULT
			// GetOwner( IXpsOMGradientBrush **owner );
			IXpsOMGradientBrush GetOwner();

			/// <summary>Gets the offset value of the gradient stop.</summary>
			/// <returns>The offset value of the gradient stop, expressed as a fraction of the gradient path.</returns>
			/// <remarks>
			/// The valid range of values returned in offset is 0.0–1.0. 0.0 is the start point of the gradient, 1.0 is the end point, and a
			/// value between 0.0 and 1.0 is a location that is linearly interpolated between the start point and the end point.
			/// </remarks>
			// https://docs.microsoft.com/en-us/windows/win32/api/xpsobjectmodel/nf-xpsobjectmodel-ixpsomgradientstop-getoffset HRESULT
			// GetOffset( FLOAT *offset );
			float GetOffset();

			/// <summary>Sets the offset location of the gradient stop.</summary>
			/// <param name="offset">
			/// <para>The offset value that describes the location of the gradient stop as a fraction of the gradient path.</para>
			/// <para>The valid range of this parameter is 0.0 &lt;= offset &lt;= 1.0.</para>
			/// </param>
			// https://docs.microsoft.com/en-us/windows/win32/api/xpsobjectmodel/nf-xpsobjectmodel-ixpsomgradientstop-setoffset HRESULT
			// SetOffset( FLOAT offset );
			void SetOffset([In] float offset);

			/// <summary>Gets the color value and color profile of the gradient stop.</summary>
			/// <param name="color">The color value of the gradient stop.</param>
			/// <returns>
			/// A pointer to the IXpsOMColorProfileResource interface that contains the color profile to be used. If no color profile
			/// resource has been set, a <c>NULL</c> pointer is returned. See remarks.
			/// </returns>
			/// <remarks>A color profile is only returned when the color type of color is XPS_COLOR_TYPE_CONTEXT.</remarks>
			// https://docs.microsoft.com/en-us/windows/win32/api/xpsobjectmodel/nf-xpsobjectmodel-ixpsomgradientstop-getcolor HRESULT
			// GetColor( XPS_COLOR *color, IXpsOMColorProfileResource **colorProfile );
			IXpsOMColorProfileResource GetColor(out XPS_COLOR color);

			/// <summary>Sets the color value and color profile of the gradient stop.</summary>
			/// <param name="color">
			/// <para>The color value to be set at the gradient stop.</para>
			/// <para>
			/// If the value of the <c>colorType</c> field in the XPS_COLOR structure that is passed in this parameter is
			/// XPS_COLOR_TYPE_CONTEXT, a valid color profile must be provided in the colorProfile parameter.
			/// </para>
			/// </param>
			/// <param name="colorProfile">
			/// <para>The color profile to be used with color.</para>
			/// <para>
			/// A color profile is required when the value of the <c>colorType</c> field in the XPS_COLOR structure that is passed in the
			/// color parameter is XPS_COLOR_TYPE_CONTEXT. If the value of the <c>colorType</c> field is not <c>XPS_COLOR_TYPE_CONTEXT</c>,
			/// this parameter must be set to <c>NULL</c>.
			/// </para>
			/// </param>
			/// <remarks>A color profile is only required when the color type of color is XPS_COLOR_TYPE_CONTEXT.</remarks>
			// https://docs.microsoft.com/en-us/windows/win32/api/xpsobjectmodel/nf-xpsobjectmodel-ixpsomgradientstop-setcolor HRESULT
			// SetColor( const XPS_COLOR *color, IXpsOMColorProfileResource *colorProfile );
			void SetColor(in XPS_COLOR color, [In] IXpsOMColorProfileResource colorProfile);

			/// <summary>Makes a deep copy of the IXpsOMGradientStop interface.</summary>
			/// <returns>A pointer to the copy of the interface.</returns>
			/// <remarks>
			/// <para>The owner of the new interface is <c>NULL</c>.</para>
			/// <para>This method does not update any of the resource pointers in the IXpsOMGradientStop interface returned in gradientStop.</para>
			/// </remarks>
			// https://docs.microsoft.com/en-us/windows/win32/api/xpsobjectmodel/nf-xpsobjectmodel-ixpsomgradientstop-clone HRESULT Clone(
			// IXpsOMGradientStop **gradientStop );
			IXpsOMGradientStop Clone();
		}

		/// <summary>A collection of IXpsOMGradientStop interface pointers.</summary>
		/// <remarks>For more information about the collection methods, see Working with XPS OM Collection Interfaces.</remarks>
		// https://docs.microsoft.com/en-us/windows/win32/api/xpsobjectmodel/nn-xpsobjectmodel-ixpsomgradientstopcollection
		[PInvokeData("xpsobjectmodel.h", MSDNShortId = "1f51f818-e9bb-4d88-9795-4e6890d24b8c")]
		[ComImport, Guid("C9174C3A-3CD3-4319-BDA4-11A39392CEEF"), InterfaceType(ComInterfaceType.InterfaceIsIUnknown)]
		public interface IXpsOMGradientStopCollection
		{
			/// <summary>Gets the number of IXpsOMGradientStop interface pointers in the collection.</summary>
			/// <returns>The number of IXpsOMGradientStop interface pointers in the collection.</returns>
			/// <remarks>For more information about the collection methods, see Working with XPS OM Collection Interfaces.</remarks>
			// https://docs.microsoft.com/en-us/windows/win32/api/xpsobjectmodel/nf-xpsobjectmodel-ixpsomgradientstopcollection-getcount
			// HRESULT GetCount( UINT32 *count );
			uint GetCount();

			/// <summary>Gets an IXpsOMGradientStop interface pointer from a specified location in the collection.</summary>
			/// <param name="index">The zero-based index of the IXpsOMGradientStop interface pointer to be obtained.</param>
			/// <returns>The IXpsOMGradientStop interface pointer at the location specified by index.</returns>
			/// <remarks>For more information about the collection methods, see Working with XPS OM Collection Interfaces.</remarks>
			// https://docs.microsoft.com/en-us/windows/win32/api/xpsobjectmodel/nf-xpsobjectmodel-ixpsomgradientstopcollection-getat
			// HRESULT GetAt( UINT32 index, IXpsOMGradientStop **stop );
			IXpsOMGradientStop GetAt([In] uint index);

			/// <summary>Inserts an IXpsOMGradientStop interface pointer at a specified location in the collection.</summary>
			/// <param name="index">
			/// The zero-based index in the collection where the interface pointer that is passed in stop is to be inserted.
			/// </param>
			/// <param name="stop">The IXpsOMGradientStop interface pointer to be inserted at the location specified by index.</param>
			/// <remarks>
			/// <para>
			/// At the location specified by index, this method inserts the IXpsOMGradientStop interface pointer that is passed in stop.
			/// Prior to the insertion, the pointer in this and all subsequent locations is moved up by one index.
			/// </para>
			/// <para>For more information about the collection methods, see Working with XPS OM Collection Interfaces.</para>
			/// </remarks>
			// https://docs.microsoft.com/en-us/windows/win32/api/xpsobjectmodel/nf-xpsobjectmodel-ixpsomgradientstopcollection-insertat
			// HRESULT InsertAt( UINT32 index, IXpsOMGradientStop *stop );
			void InsertAt([In] uint index, [In] IXpsOMGradientStop stop);

			/// <summary>Removes and releases an IXpsOMGradientStop interface pointer from a specified location in the collection.</summary>
			/// <param name="index">
			/// The zero-based index in the collection from which an IXpsOMGradientStop interface pointer is to be removed and released.
			/// </param>
			/// <remarks>
			/// <para>
			/// This method releases the IXpsOMGradientStop interface referenced by the pointer at the location specified by index. After
			/// releasing the interface, this method compacts the collection by reducing by 1 the index of each pointer subsequent to index.
			/// </para>
			/// <para>For more information about the collection methods, see Working with XPS OM Collection Interfaces.</para>
			/// </remarks>
			// https://docs.microsoft.com/en-us/windows/win32/api/xpsobjectmodel/nf-xpsobjectmodel-ixpsomgradientstopcollection-removeat
			// HRESULT RemoveAt( UINT32 index );
			void RemoveAt([In] uint index);

			/// <summary>Replaces an IXpsOMGradientStop interface pointer at a specified location in the collection.</summary>
			/// <param name="index">The zero-based index in the collection where an IXpsOMGradientStop interface pointer is to be replaced.</param>
			/// <param name="stop">
			/// The IXpsOMGradientStop interface pointer that will replace current contents at the location specified by index.
			/// </param>
			/// <remarks>
			/// <para>
			/// At the location specified by index, this method releases the IXpsOMGradientStop interface referenced by the existing
			/// pointer, then writes the pointer that is passed in stop.
			/// </para>
			/// <para>For more information about the collection methods, see Working with XPS OM Collection Interfaces.</para>
			/// </remarks>
			// https://docs.microsoft.com/en-us/windows/win32/api/xpsobjectmodel/nf-xpsobjectmodel-ixpsomgradientstopcollection-setat
			// HRESULT SetAt( UINT32 index, IXpsOMGradientStop *stop );
			void SetAt([In] uint index, [In] IXpsOMGradientStop stop);

			/// <summary>Appends an IXpsOMGradientStop interface to the end of the collection.</summary>
			/// <param name="stop">A pointer to the IXpsOMGradientStop interface that is to be appended to the collection.</param>
			/// <remarks>For more information about the collection methods, see Working with XPS OM Collection Interfaces.</remarks>
			// https://docs.microsoft.com/en-us/windows/win32/api/xpsobjectmodel/nf-xpsobjectmodel-ixpsomgradientstopcollection-append
			// HRESULT Append( IXpsOMGradientStop *stop );
			void Append([In] IXpsOMGradientStop stop);
		}

		/// <summary>A brush that uses a raster image as a source.</summary>
		/// <remarks>
		/// <para>
		/// The image used by this brush is defined in a coordinate space that is specified by the image's resolution. The image type must
		/// be JPEG, PNG, TIFF 6.0, or HD Photo.
		/// </para>
		/// <para>The code example that follows illustrates how to create an instance of this interface.</para>
		/// </remarks>
		// https://docs.microsoft.com/en-us/windows/win32/api/xpsobjectmodel/nn-xpsobjectmodel-ixpsomimagebrush
		[PInvokeData("xpsobjectmodel.h", MSDNShortId = "f5478582-466b-496e-b7f3-42fb8caa6814")]
		[ComImport, Guid("3DF0B466-D382-49EF-8550-DD94C80242E4"), InterfaceType(ComInterfaceType.InterfaceIsIUnknown)]
		public interface IXpsOMImageBrush : IXpsOMTileBrush
		{
			/// <summary>Gets the <c>IUnknown</c> interface of the parent.</summary>
			/// <returns>A pointer to the <c>IUnknown</c> interface of the parent.</returns>
			// https://docs.microsoft.com/en-us/windows/win32/api/xpsobjectmodel/nf-xpsobjectmodel-ixpsomshareable-getowner HRESULT
			// GetOwner( IUnknown **owner );
			[return: MarshalAs(UnmanagedType.IUnknown)]
			new object GetOwner();

			/// <summary>Gets the object type of the interface.</summary>
			/// <returns>The XPS_OBJECT_TYPE value that describes the interface that is derived from IXpsOMShareable.</returns>
			// https://docs.microsoft.com/en-us/windows/win32/api/xpsobjectmodel/nf-xpsobjectmodel-ixpsomshareable-gettype HRESULT GetType(
			// XPS_OBJECT_TYPE *type );
			new XPS_OBJECT_TYPE GetType();

			/// <summary>Gets the opacity of the brush.</summary>
			/// <returns>The opacity value of the brush.</returns>
			/// <remarks>
			/// opacity is expressed as a value between 0.0 and 1.0; 0.0 indicates that the brush is completely transparent, 0.5 that it is
			/// 50 percent opaque, and 1.0 that it is completely opaque.
			/// </remarks>
			// https://docs.microsoft.com/en-us/windows/win32/api/xpsobjectmodel/nf-xpsobjectmodel-ixpsombrush-getopacity HRESULT
			// GetOpacity( FLOAT *opacity );
			new float GetOpacity();

			/// <summary>Sets the opacity of the brush.</summary>
			/// <param name="opacity">The opacity value of the brush.</param>
			/// <remarks>
			/// <para>
			/// opacity is expressed as a value between 0.0 and 1.0; 0.0 indicates that the brush is completely transparent, 0.5 that it is
			/// 50 percent opaque, and 1.0 that it is completely opaque.
			/// </para>
			/// <para>If opacity is less than 0.0 or greater than 1.0, the method returns an error.</para>
			/// </remarks>
			// https://docs.microsoft.com/en-us/windows/win32/api/xpsobjectmodel/nf-xpsobjectmodel-ixpsombrush-setopacity HRESULT
			// SetOpacity( FLOAT opacity );
			new void SetOpacity([In] float opacity);

			/// <summary>Gets a pointer to the IXpsOMMatrixTransform interface that contains the resolved matrix transform for the brush.</summary>
			/// <returns>
			/// <para>
			/// A pointer to the IXpsOMMatrixTransform interface that contains the resolved matrix transform for the brush. If a matrix
			/// transform has not been set, a <c>NULL</c> pointer is returned.
			/// </para>
			/// <para>The value that is returned in this parameter depends on which method has most recently been called to set the transform.</para>
			/// <list type="table">
			/// <listheader>
			/// <term>Most recent method called</term>
			/// <term>Object that is returned in transform</term>
			/// </listheader>
			/// <item>
			/// <term>SetTransformLocal</term>
			/// <term>The transform that is set by SetTransformLocal.</term>
			/// </item>
			/// <item>
			/// <term>SetTransformLookup</term>
			/// <term>
			/// The transform which is retrieved, using a lookup key that matches the key that is set by SetTransformLookup, from the
			/// resource directory.
			/// </term>
			/// </item>
			/// <item>
			/// <term>Neither SetTransformLocal nor SetTransformLookup has been called yet.</term>
			/// <term>NULL pointer.</term>
			/// </item>
			/// </list>
			/// </returns>
			/// <remarks>
			/// The transform determines how the output area is transformed before the brush image is rendered in the path, stroke, or glyph
			/// that is using the tile brush.
			/// </remarks>
			// https://docs.microsoft.com/en-us/windows/win32/api/xpsobjectmodel/nf-xpsobjectmodel-ixpsomtilebrush-gettransform HRESULT
			// GetTransform( IXpsOMMatrixTransform **transform );
			new IXpsOMMatrixTransform GetTransform();

			/// <summary>
			/// Gets a pointer to the IXpsOMMatrixTransform interface that contains the local, unshared resolved matrix transform for the brush.
			/// </summary>
			/// <returns>
			/// <para>
			/// A pointer to the IXpsOMMatrixTransform interface that contains the local, unshared resolved matrix transform for the brush.
			/// If a local matrix transform has not been set or if a matrix transform lookup key has been set, a <c>NULL</c> pointer is returned.
			/// </para>
			/// <list type="table">
			/// <listheader>
			/// <term>Most recent method called</term>
			/// <term>Object that is returned in transform</term>
			/// </listheader>
			/// <item>
			/// <term>SetTransformLocal</term>
			/// <term>The transform that is set by SetTransformLocal.</term>
			/// </item>
			/// <item>
			/// <term>SetTransformLookup</term>
			/// <term>NULL pointer.</term>
			/// </item>
			/// <item>
			/// <term>Neither SetTransformLocal nor SetTransformLookup has been called yet.</term>
			/// <term>NULL pointer.</term>
			/// </item>
			/// </list>
			/// </returns>
			/// <remarks>
			/// The transform determines how the output area is transformed before the brush image is rendered in the path, stroke, or glyph
			/// that is using the tile brush.
			/// </remarks>
			// https://docs.microsoft.com/en-us/windows/win32/api/xpsobjectmodel/nf-xpsobjectmodel-ixpsomtilebrush-gettransformlocal HRESULT
			// GetTransformLocal( IXpsOMMatrixTransform **transform );
			new IXpsOMMatrixTransform GetTransformLocal();

			/// <summary>Sets the IXpsOMMatrixTransform interface pointer to a local, unshared matrix transform.</summary>
			/// <param name="transform">
			/// A pointer to the IXpsOMMatrixTransform interface to be set as the local, unshared matrix transform. If a local transform has
			/// been set, a <c>NULL</c> pointer will release it.
			/// </param>
			/// <remarks>
			/// <para>
			/// The transform determines how the output area is transformed before the brush image is rendered in the path, stroke, or glyph
			/// that is using the tile brush.
			/// </para>
			/// <para>
			/// After you call <c>SetTransformLocal</c>, the transform lookup key is released and GetTransformLookup returns a <c>NULL</c>
			/// pointer in the key parameter. The table that follows explains the relationship between the local and lookup values of this property.
			/// </para>
			/// <list type="table">
			/// <listheader>
			/// <term>Most recent method called</term>
			/// <term>Object that is returned in transform by GetTransform</term>
			/// <term>Object that is returned in transform by GetTransformLocal</term>
			/// <term>String that is returned in key by GetTransformLookup</term>
			/// </listheader>
			/// <item>
			/// <term>SetTransformLocal (this method)</term>
			/// <term>The transform that is set by SetTransformLocal.</term>
			/// <term>The transform that is set by SetTransformLocal.</term>
			/// <term>NULL pointer.</term>
			/// </item>
			/// <item>
			/// <term>SetTransformLookup</term>
			/// <term>
			/// The transform which is retrieved, using a lookup key that matches the key that is set by SetTransformLookup, from the
			/// resource directory.
			/// </term>
			/// <term>NULL pointer.</term>
			/// <term>The lookup key that is set by SetTransformLookup.</term>
			/// </item>
			/// <item>
			/// <term>Neither SetTransformLocal nor SetTransformLookup has been called yet.</term>
			/// <term>NULL pointer.</term>
			/// <term>NULL pointer.</term>
			/// <term>NULL pointer.</term>
			/// </item>
			/// </list>
			/// </remarks>
			// https://docs.microsoft.com/en-us/windows/win32/api/xpsobjectmodel/nf-xpsobjectmodel-ixpsomtilebrush-settransformlocal HRESULT
			// SetTransformLocal( IXpsOMMatrixTransform *transform );
			new void SetTransformLocal([In] IXpsOMMatrixTransform transform);

			/// <summary>
			/// Gets the lookup key that identifies the IXpsOMMatrixTransform interface in a resource dictionary that contains the resolved
			/// matrix transform for the brush.
			/// </summary>
			/// <returns>
			/// <para>
			/// The lookup key that identifies the IXpsOMMatrixTransform interface in a resource dictionary that contains the resolved
			/// matrix transform for the brush. If a matrix transform lookup key has not been set or if a local matrix transform has been
			/// set, a <c>NULL</c> pointer is returned.
			/// </para>
			/// <list type="table">
			/// <listheader>
			/// <term>Most recent method called</term>
			/// <term>Object that is returned in key</term>
			/// </listheader>
			/// <item>
			/// <term>SetTransformLocal</term>
			/// <term>NULL pointer.</term>
			/// </item>
			/// <item>
			/// <term>SetTransformLookup</term>
			/// <term>The lookup key set by SetTransformLookup.</term>
			/// </item>
			/// <item>
			/// <term>Neither SetTransformLocal nor SetTransformLookup has been called yet.</term>
			/// <term>NULL pointer.</term>
			/// </item>
			/// </list>
			/// </returns>
			/// <remarks>
			/// <para>
			/// The transform determines how the output area is transformed before the brush image is rendered in the path, stroke, or glyph
			/// that is using the tile brush.
			/// </para>
			/// </remarks>
			// https://docs.microsoft.com/en-us/windows/win32/api/xpsobjectmodel/nf-xpsobjectmodel-ixpsomtilebrush-gettransformlookup
			// HRESULT GetTransformLookup( LPWSTR *key );
			new SafeCoTaskMemString GetTransformLookup();

			/// <summary>
			/// Sets the lookup key name of a shared matrix transform that will be used as the transform for this brush.The shared matrix
			/// transform that is referenced by the lookup key is stored in the resource dictionary.
			/// </summary>
			/// <param name="key">
			/// A string variable that contains the lookup key name of a shared matrix transform in the resource dictionary. If a lookup key
			/// has already been set, a <c>NULL</c> pointer will clear it.
			/// </param>
			/// <remarks>
			/// <para>
			/// The transform is applied before the brush image is rendered in the path, stroke, or glyph that is using the tile brush. The
			/// tile brush has only one transform, which can be local or remote.
			/// </para>
			/// <para>
			/// After you call <c>SetTransformLookup</c>, the local transform is released and GetTransformLocal returns a <c>NULL</c>
			/// pointer in the transform parameter. The table that follows explains the relationship between the local and lookup values of
			/// this property.
			/// </para>
			/// <list type="table">
			/// <listheader>
			/// <term>Most recent method called</term>
			/// <term>Object that is returned in transform by GetTransform</term>
			/// <term>Object that is returned in transform by GetTransformLocal</term>
			/// <term>String that is returned in key by GetTransformLookup</term>
			/// </listheader>
			/// <item>
			/// <term>SetTransformLocal</term>
			/// <term>The transform that is set by SetTransformLocal.</term>
			/// <term>The transform that is set by SetTransformLocal.</term>
			/// <term>NULL pointer.</term>
			/// </item>
			/// <item>
			/// <term>SetTransformLookup (this method)</term>
			/// <term>
			/// The transform which is retrieved—using a lookup key that matches the key that is set by SetTransformLookup— from the
			/// resource directory.
			/// </term>
			/// <term>NULL pointer.</term>
			/// <term>The lookup key that is set by SetTransformLookup.</term>
			/// </item>
			/// <item>
			/// <term>Neither SetTransformLocal nor SetTransformLookup has been called yet.</term>
			/// <term>NULL pointer.</term>
			/// <term>NULL pointer.</term>
			/// <term>NULL pointer.</term>
			/// </item>
			/// </list>
			/// </remarks>
			// https://docs.microsoft.com/en-us/windows/win32/api/xpsobjectmodel/nf-xpsobjectmodel-ixpsomtilebrush-settransformlookup
			// HRESULT SetTransformLookup( LPCWSTR key );
			new void SetTransformLookup([In, MarshalAs(UnmanagedType.LPWStr)] string key);

			/// <summary>Gets the portion of the source image to be used by the tile.</summary>
			/// <returns>The XPS_RECT structure that describes the area of the source content to be used by the tile.</returns>
			/// <remarks>
			/// <para>The brush's viewbox specifies the portion of a source image or visual to be used as the tile image.</para>
			/// <para>
			/// The coordinates of the brush's viewbox are relative to the source content, such that (0,0) specifies the upper-left corner
			/// of the source content. For images, dimensions specified by the brush's viewbox are expressed in the units of 1/96". The
			/// corresponding pixel coordinates in the source image are calculated as follows:
			/// </para>
			/// <para>
			/// In the illustration that follows, the image on the left is an example of a source image, the image in the center shows the
			/// selected viewbox, and the image on the right shows the resulting brush.
			/// </para>
			/// <para>
			/// If the source image resolution is 96 by 96 dots per inch and image dimensions are 96 by 96 pixels, the values of fields in
			/// the viewbox parameter would be:
			/// </para>
			/// <para>The preceding parameter values correspond to the source image as:</para>
			/// </remarks>
			// https://docs.microsoft.com/en-us/windows/win32/api/xpsobjectmodel/nf-xpsobjectmodel-ixpsomtilebrush-getviewbox HRESULT
			// GetViewbox( XPS_RECT *viewbox );
			new XPS_RECT GetViewbox();

			/// <summary>Sets the portion of the source content to be used as the tile image.</summary>
			/// <param name="viewbox">An XPS_RECT structure that describes the portion of the source content to be used as the tile image.</param>
			/// <remarks>
			/// <para>The brush's viewbox specifies the portion of a source image or visual to be used as the tile image.</para>
			/// <para>
			/// The coordinates of the brush's viewbox are relative to the source content, such that (0,0) specifies the upper-left corner
			/// of the source content. For images, dimensions specified by the brush's viewbox are expressed in the units of 1/96". The
			/// corresponding pixel coordinates in the source image are calculated as follows:
			/// </para>
			/// <para>
			/// In the illustration that follows, the image on the left is an example of a source image, while that on the right is the
			/// source image with the selected viewbox for the brush shown as a red rectangle. In this example, the part of the source image
			/// that is used as the content for the tile brush is the area within the red rectangle. The shaded area of the image is not
			/// used by the brush.
			/// </para>
			/// <para>
			/// If the source image resolution is 96 by 96 dots per inch and image dimensions are 96 by 96 pixels, the values of fields in
			/// the viewbox parameter would be:
			/// </para>
			/// <para>The preceding parameter values correspond to the source image as:</para>
			/// </remarks>
			// https://docs.microsoft.com/en-us/windows/win32/api/xpsobjectmodel/nf-xpsobjectmodel-ixpsomtilebrush-setviewbox HRESULT
			// SetViewbox( const XPS_RECT *viewbox );
			new void SetViewbox(in XPS_RECT viewbox);

			/// <summary>Gets the portion of the destination geometry that is covered by a single tile.</summary>
			/// <returns>The XPS_RECT structure that describes the portion of the destination geometry that is covered by a single tile.</returns>
			/// <remarks>
			/// The viewport is the portion of the output area where the first tile is drawn. In the illustration, the viewport is outlined
			/// by the purple rectangle inside the red, dotted rectangle. The tile mode of the brush determines how the rest of the tiles
			/// are drawn in the output area.
			/// </remarks>
			// https://docs.microsoft.com/en-us/windows/win32/api/xpsobjectmodel/nf-xpsobjectmodel-ixpsomtilebrush-getviewport HRESULT
			// GetViewport( XPS_RECT *viewport );
			new XPS_RECT GetViewport();

			/// <summary>Sets the portion of the destination geometry that is covered by a single tile.</summary>
			/// <param name="viewport">
			/// An XPS_RECT structure that describes the portion of the destination geometry that is covered by a single tile.
			/// </param>
			/// <remarks>
			/// The viewport is the portion of the output area where the tile is drawn. In the following illustration, the viewport is
			/// outlined by the blue rectangle inside the red, dotted rectangle. The tile mode of the brush determines how other tiles are
			/// drawn in the output area.
			/// </remarks>
			// https://docs.microsoft.com/en-us/windows/win32/api/xpsobjectmodel/nf-xpsobjectmodel-ixpsomtilebrush-setviewport HRESULT
			// SetViewport( const XPS_RECT *viewport );
			new void SetViewport(in XPS_RECT viewport);

			/// <summary>Gets the XPS_TILE_MODE value that describes the tile mode of the brush.</summary>
			/// <returns>The XPS_TILE_MODE value that describes the tile mode of the brush.</returns>
			/// <remarks>
			/// The tile mode determines how the tile image is repeated to fill the output area. If the tile mode value is
			/// XPS_TILE_MODE_NONE, the tile image is drawn only once. The following illustration shows examples of how the tile image
			/// appears in several tile modes.
			/// </remarks>
			// https://docs.microsoft.com/en-us/windows/win32/api/xpsobjectmodel/nf-xpsobjectmodel-ixpsomtilebrush-gettilemode HRESULT
			// GetTileMode( XPS_TILE_MODE *tileMode );
			new XPS_TILE_MODE GetTileMode();

			/// <summary>Sets the XPS_TILE_MODE value that describes the tiling mode of the brush.</summary>
			/// <param name="tileMode">The XPS_TILE_MODE value to be set.</param>
			/// <remarks>
			/// The tile mode determines how the tile image is repeated to fill the output area. If the tile mode value is
			/// XPS_TILE_MODE_NONE, the tile image is drawn only once.
			/// </remarks>
			// https://docs.microsoft.com/en-us/windows/win32/api/xpsobjectmodel/nf-xpsobjectmodel-ixpsomtilebrush-settilemode HRESULT
			// SetTileMode( XPS_TILE_MODE tileMode );
			new void SetTileMode([In] XPS_TILE_MODE tileMode);

			/// <summary>
			/// Gets a pointer to the IXpsOMImageResource interface, which contains the image resource to be used as the source for the brush.
			/// </summary>
			/// <returns>
			/// A pointer to the IXpsOMImageResource interface that contains the image resource to be used as the source for the brush.
			/// </returns>
			/// <remarks>
			/// After loading and parsing the resource into the XPS OM, this method might return an error that applies to another resource.
			/// This occurs because all of the relationships are parsed when a resource is loaded.
			/// </remarks>
			// https://docs.microsoft.com/en-us/windows/win32/api/xpsobjectmodel/nf-xpsobjectmodel-ixpsomimagebrush-getimageresource HRESULT
			// GetImageResource( IXpsOMImageResource **imageResource );
			IXpsOMImageResource GetImageResource();

			/// <summary>
			/// Sets a pointer to the IXpsOMImageResource interface that contains the image resource to be used as the source for the brush.
			/// </summary>
			/// <param name="imageResource">
			/// The image resource to be used as the source for the brush. This parameter must not be a <c>NULL</c> pointer.
			/// </param>
			/// <remarks>The image resource must be of type JPEG, PNG, TIFF 6.0, or HD Photo.</remarks>
			// https://docs.microsoft.com/en-us/windows/win32/api/xpsobjectmodel/nf-xpsobjectmodel-ixpsomimagebrush-setimageresource HRESULT
			// SetImageResource( IXpsOMImageResource *imageResource );
			void SetImageResource([In] IXpsOMImageResource imageResource);

			/// <summary>
			/// Gets a pointer to the IXpsOMColorProfileResource interface, which contains the color profile resource that is associated
			/// with the image.
			/// </summary>
			/// <returns>
			/// A pointer to the IXpsOMColorProfileResource interface that contains the color profile resource that is associated with the
			/// image. If no color profile resource has been set, a <c>NULL</c> pointer is returned.
			/// </returns>
			/// <remarks>
			/// After loading and parsing the resource into the XPS OM, this method might return an error that applies to another resource.
			/// This occurs because all of the relationships are parsed when a resource is loaded.
			/// </remarks>
			// https://docs.microsoft.com/en-us/windows/win32/api/xpsobjectmodel/nf-xpsobjectmodel-ixpsomimagebrush-getcolorprofileresource
			// HRESULT GetColorProfileResource( IXpsOMColorProfileResource **colorProfileResource );
			IXpsOMColorProfileResource GetColorProfileResource();

			/// <summary>
			/// Sets a pointer to the IXpsOMColorProfileResource interface, which contains the color profile resource that is associated
			/// with the image.
			/// </summary>
			/// <param name="colorProfileResource">
			/// The color profile resource that is associated with the image. A <c>NULL</c> pointer will release any previously set color
			/// profile resources.
			/// </param>
			// https://docs.microsoft.com/en-us/windows/win32/api/xpsobjectmodel/nf-xpsobjectmodel-ixpsomimagebrush-setcolorprofileresource
			// HRESULT SetColorProfileResource( IXpsOMColorProfileResource *colorProfileResource );
			void SetColorProfileResource([In] IXpsOMColorProfileResource colorProfileResource);

			/// <summary>Makes a deep copy of the interface.</summary>
			/// <returns>A pointer to the copy of the interface.</returns>
			/// <remarks>This method does not update any of the resource pointers in the copy.</remarks>
			// https://docs.microsoft.com/en-us/windows/win32/api/xpsobjectmodel/nf-xpsobjectmodel-ixpsomimagebrush-clone HRESULT Clone(
			// IXpsOMImageBrush **imageBrush );
			IXpsOMImageBrush Clone();
		}

		/// <summary>Provides an IStream interface to an image resource.</summary>
		/// <remarks>The code example that follows illustrates how to create an instance of this interface.</remarks>
		// https://docs.microsoft.com/en-us/windows/win32/api/xpsobjectmodel/nn-xpsobjectmodel-ixpsomimageresource
		[PInvokeData("xpsobjectmodel.h", MSDNShortId = "89a1530e-fa87-45bf-a1da-c8656ec09ba3")]
		[ComImport, Guid("3DB8417D-AE50-485E-9A44-D7758F78A23F"), InterfaceType(ComInterfaceType.InterfaceIsIUnknown)]
		public interface IXpsOMImageResource : IXpsOMResource
		{
			/// <summary>Gets the name that will be used when the part is serialized.</summary>
			/// <returns>
			/// A pointer to the IOpcPartUri interface that contains the part name. If the part name has not been set (by the SetPartName
			/// method), a <c>NULL</c> pointer is returned.
			/// </returns>
			// https://docs.microsoft.com/en-us/windows/win32/api/xpsobjectmodel/nf-xpsobjectmodel-ixpsompart-getpartname HRESULT
			// GetPartName( IOpcPartUri **partUri );
			[MethodImpl(MethodImplOptions.InternalCall)]
			new IOpcPartUri GetPartName();

			/// <summary>Sets the name that will be used when the part is serialized.</summary>
			/// <param name="partUri">
			/// A pointer to the IOpcPartUri interface that contains the name of this part. This parameter cannot be <c>NULL</c>.
			/// </param>
			/// <remarks>
			/// IXpsOMPackageWriter will generate an error if it encounters an XPS document part whose name is the same as that of a part it
			/// has previously serialized.
			/// </remarks>
			// https://docs.microsoft.com/en-us/windows/win32/api/xpsobjectmodel/nf-xpsobjectmodel-ixpsompart-setpartname HRESULT
			// SetPartName( IOpcPartUri *partUri );
			[MethodImpl(MethodImplOptions.InternalCall)]
			new void SetPartName([In] IOpcPartUri partUri);

			/// <summary>Gets a new, read-only copy of the stream that is associated with this resource.</summary>
			/// <returns>A new, read-only copy of the stream that is associated with this resource.</returns>
			/// <remarks>
			/// <para>
			/// The IStream object returned by this method might return an error of E_PENDING, which indicates that the stream length has
			/// not been determined yet. This behavior is different from that of a standard <c>IStream</c> object.
			/// </para>
			/// <para>
			/// This method calls the stream's <c>Clone</c> method to create the stream returned in stream. As a result, the performance of
			/// this method will depend on that of the stream's <c>Clone</c> method.
			/// </para>
			/// </remarks>
			// https://docs.microsoft.com/en-us/windows/win32/api/xpsobjectmodel/nf-xpsobjectmodel-ixpsomimageresource-getstream HRESULT
			// GetStream( IStream **readerStream );
			[MethodImpl(MethodImplOptions.InternalCall)]
			IStream GetStream();

			/// <summary>Sets the read-only stream to be associated with this resource.</summary>
			/// <param name="sourceStream">The read-only stream to be associated with this resource.</param>
			/// <param name="imageType">The XPS_IMAGE_TYPE value that describes the type of image in the stream.</param>
			/// <param name="partName">The part name to be assigned to this resource.</param>
			/// <remarks>
			/// <para>
			/// The calling method should treat this stream as a single-threaded apartment (STA) model object and not re-enter any of the
			/// stream interface's methods.
			/// </para>
			/// <para>
			/// Because GetStream gets a clone of the stream that is set by this method, the provided stream should have an efficient
			/// cloning method. A stream with an inefficient cloning method will reduce the performance of <c>GetStream</c>.
			/// </para>
			/// </remarks>
			// https://docs.microsoft.com/en-us/windows/win32/api/xpsobjectmodel/nf-xpsobjectmodel-ixpsomimageresource-setcontent HRESULT
			// SetContent( IStream *sourceStream, XPS_IMAGE_TYPE imageType, IOpcPartUri *partName );
			[MethodImpl(MethodImplOptions.InternalCall)]
			void SetContent([In] IStream sourceStream, [In] XPS_IMAGE_TYPE imageType, [In] IOpcPartUri partName);

			/// <summary>Gets the type of image resource.</summary>
			/// <returns>The XPS_IMAGE_TYPE value that describes the image type in the stream.</returns>
			// https://docs.microsoft.com/en-us/windows/win32/api/xpsobjectmodel/nf-xpsobjectmodel-ixpsomimageresource-getimagetype HRESULT
			// GetImageType( XPS_IMAGE_TYPE *imageType );
			[MethodImpl(MethodImplOptions.InternalCall)]
			XPS_IMAGE_TYPE GetImageType();
		}
	}
}