Click here to Skip to main content
15,897,891 members
Articles / Desktop Programming / Win32

Windows Development in C++, Working with Menus

Rate me:
Please Sign up or sign in to vote.
4.96/5 (60 votes)
3 Jan 2015CPOL19 min read 173.4K   4.1K   163  
Windows API, menus, C++ lambda expressions, std::enable_shared_from_this
#pragma once
#ifndef __HWINGRAPHICS_H__
#define __HWINGRAPHICS_H__

#include "hwindef.h"
#include "hwincom.h"
#include "hwinexception.h"


namespace harlinn
{
    namespace windows
    {
        class Control;

        namespace graphics
        {
#define HARLINN_WINDOWS_GRAPHICS_STANDARD_METHODS_IMPL( classType, baseClassType , interfaceType, baseInterfaceType ) \
public: \
typedef interfaceType InterfaceType; \
typedef baseInterfaceType BaseInterfaceType; \
private: \
 InterfaceType * GetInterface() const { HWIN_TRACE(); if(!unknown) { ThrowNoInterface(); } return reinterpret_cast< InterfaceType *>( unknown ); } \
public: \
classType () \
 : baseClassType ( ) \
 { HWIN_TRACE(); } \
explicit classType (interfaceType * theInterface, bool addref = false ) \
 : baseClassType ( reinterpret_cast< baseInterfaceType *>( theInterface ), addref ) \
 { HWIN_TRACE(); } \
protected: \
classType (REFIID iid, const Unknown& theUnknown, bool throwIfNoInterface = true ) \
 : baseClassType ( iid, reinterpret_cast< const baseClassType & > (theUnknown), throwIfNoInterface ) \
 { HWIN_TRACE(); } \
public: \
classType ( const Unknown& theUnknown, bool throwIfNoInterface = true ) \
 : baseClassType ( __uuidof(interfaceType), reinterpret_cast< const baseClassType & > (theUnknown),throwIfNoInterface ) \
 { HWIN_TRACE(); } \
classType (const classType & other) \
 : baseClassType ( reinterpret_cast< const baseClassType & > (other) ) \
 { HWIN_TRACE(); } \
classType (classType && other) \
 : baseClassType ( reinterpret_cast< baseClassType && >( other ) ) \
 { HWIN_TRACE(); } \
classType & operator = (const classType & other) \
 { \
   HWIN_TRACE(); \
   baseClassType :: operator = ( reinterpret_cast< const baseClassType & > (other) ); \
   return *this; \
 } \
classType & operator = (classType && other) \
 { \
   HWIN_TRACE(); \
   baseClassType :: operator = ( reinterpret_cast< baseClassType && > (other) ); \
   return *this; \
 } \
operator interfaceType * ( ) const\
 { \
   HWIN_TRACE(); \
   return reinterpret_cast< interfaceType * >( unknown ); \
 }




            class Factory;
            class BitmapRenderTarget;

            class Resource : public Unknown
            {
            public:
                typedef Unknown Base;

                HARLINN_WINDOWS_GRAPHICS_STANDARD_METHODS_IMPL(Resource,Unknown,ID2D1Resource,IUnknown)

            public:


                HWIN_EXPORT Factory GetFactory();
            };


            class Image : public Resource
            {
            public:
                typedef Resource Base;

                HARLINN_WINDOWS_GRAPHICS_STANDARD_METHODS_IMPL(Image, Resource,ID2D1Image,ID2D1Resource)

            };

            class Bitmap : public Image
            {
            public:
                typedef Image Base;

                HARLINN_WINDOWS_GRAPHICS_STANDARD_METHODS_IMPL(Bitmap, Image,ID2D1Bitmap,ID2D1Image)


                //
                // Returns the size of the bitmap in resolution independent units.
                //
                HWIN_EXPORT D2D1_SIZE_F GetSize( ) const;
    
    
                //
                // Returns the size of the bitmap in resolution dependent units, (pixels).
                //
                HWIN_EXPORT D2D1_SIZE_U GetPixelSize( ) const;
    
    
                //
                // Retrieve the format of the bitmap.
                //
                HWIN_EXPORT D2D1_PIXEL_FORMAT GetPixelFormat( ) const;
    
    
                //
                // Return the DPI of the bitmap.
                //
                HWIN_EXPORT const Bitmap& GetDpi(FLOAT *dpiX, FLOAT *dpiY ) const;

                const Bitmap& GetDpi(FLOAT& dpiX, FLOAT& dpiY ) const
                {
                    HWIN_TRACE();
                    return GetDpi(&dpiX, &dpiY);
                }

                D2D1_SIZE_F GetDpi( ) const
                {
                    HWIN_TRACE();
                    D2D1_SIZE_F result = {0,};
                    GetDpi(result.width,result.height);
                    return result;
                }
    
                HWIN_EXPORT Bitmap& CopyFromBitmap(const D2D1_POINT_2U *destPoint, ID2D1Bitmap *bitmap,const D2D1_RECT_U *srcRect );
    
                HWIN_EXPORT Bitmap& CopyFromRenderTarget(const D2D1_POINT_2U *destPoint, ID2D1RenderTarget *renderTarget,const D2D1_RECT_U *srcRect );
    
                HWIN_EXPORT Bitmap& CopyFromMemory(const D2D1_RECT_U *dstRect,const void *srcData,UINT32 pitch );

            };


            class GradientStopCollection : public Resource
            {
            public:
                typedef Resource Base;

                HARLINN_WINDOWS_GRAPHICS_STANDARD_METHODS_IMPL(GradientStopCollection, Resource,ID2D1GradientStopCollection,ID2D1Resource)


                //
                // Returns the number of stops in the gradient.
                //
                HWIN_EXPORT UINT32 GetGradientStopCount() const;
    
    
                //
                // Copies the gradient stops from the collection into the caller's interface.  The
                // returned colors have straight alpha.
                //
                HWIN_EXPORT const GradientStopCollection& GetGradientStops(D2D1_GRADIENT_STOP *gradientStops,UINT32 gradientStopsCount ) const;
    
    
                //
                // Returns whether the interpolation occurs with 1.0 or 2.2 gamma.
                //
                HWIN_EXPORT D2D1_GAMMA GetColorInterpolationGamma() const;
    
                HWIN_EXPORT D2D1_EXTEND_MODE GetExtendMode() const;

            };

            class Brush : public Resource
            {
            public:
                typedef Resource Base;

                HARLINN_WINDOWS_GRAPHICS_STANDARD_METHODS_IMPL(Brush, Resource,ID2D1Brush,ID2D1Resource)


                //
                // Sets the opacity for when the brush is drawn over the entire fill of the brush.
                //
                HWIN_EXPORT Brush& SetOpacity(FLOAT opacity );
    
    
                //
                // Sets the transform that applies to everything drawn by the brush.
                //
                HWIN_EXPORT Brush& SetTransform(const D2D1_MATRIX_3X2_F *transform );
    
                HWIN_EXPORT FLOAT GetOpacity() const;
    
                HWIN_EXPORT const Brush& GetTransform(D2D1_MATRIX_3X2_F *transform ) const;
    
                
                Brush& SetTransform(const D2D1_MATRIX_3X2_F &transform )  
                {
                    HWIN_TRACE();
                    SetTransform(&transform);
                }

            };

            class BitmapBrush : public Brush
            {
            public:
                typedef Brush Base;

                HARLINN_WINDOWS_GRAPHICS_STANDARD_METHODS_IMPL(BitmapBrush, Brush,ID2D1BitmapBrush,ID2D1Brush)

                //
                // Sets how the bitmap is to be treated outside of its natural extent on the X
                // axis.
                //
                HWIN_EXPORT BitmapBrush& SetExtendModeX(D2D1_EXTEND_MODE extendModeX );
    
    
                //
                // Sets how the bitmap is to be treated outside of its natural extent on the X
                // axis.
                //
                HWIN_EXPORT BitmapBrush& SetExtendModeY(D2D1_EXTEND_MODE extendModeY );
    
    
                //
                // Sets the interpolation mode used when this brush is used.
                //
                HWIN_EXPORT BitmapBrush& SetInterpolationMode(D2D1_BITMAP_INTERPOLATION_MODE interpolationMode );
    
    
                //
                // Sets the bitmap associated as the source of this brush.
                //
                HWIN_EXPORT BitmapBrush& SetBitmap(ID2D1Bitmap *bitmap );
    
                HWIN_EXPORT D2D1_EXTEND_MODE GetExtendModeX() const;
    
                HWIN_EXPORT D2D1_EXTEND_MODE GetExtendModeY() const;
    
                HWIN_EXPORT D2D1_BITMAP_INTERPOLATION_MODE GetInterpolationMode() const;
    
                HWIN_EXPORT Bitmap GetBitmap( ) const;

            };


            class SolidColorBrush : public Brush
            {
            public:
                typedef Brush Base;

                HARLINN_WINDOWS_GRAPHICS_STANDARD_METHODS_IMPL(SolidColorBrush, Brush,ID2D1SolidColorBrush,ID2D1Brush)

                HWIN_EXPORT SolidColorBrush& SetColor(const D2D1_COLOR_F *color );
    
                HWIN_EXPORT D2D1_COLOR_F GetColor() const;
    
                SolidColorBrush& SetColor(const D2D1_COLOR_F &color )  
                {
                    HWIN_TRACE();
                    return SetColor(&color);
                }
            };


            class LinearGradientBrush : public Brush
            {
            public:
                typedef Brush Base;

                HARLINN_WINDOWS_GRAPHICS_STANDARD_METHODS_IMPL(LinearGradientBrush, Brush,ID2D1LinearGradientBrush,ID2D1Brush)

                HWIN_EXPORT LinearGradientBrush& SetStartPoint(D2D1_POINT_2F startPoint );
    
    
                //
                // Sets the end point of the gradient in local coordinate space. This is not
                // influenced by the geometry being filled.
                //
                HWIN_EXPORT LinearGradientBrush& SetEndPoint(D2D1_POINT_2F endPoint );
    
                HWIN_EXPORT D2D1_POINT_2F GetStartPoint() const;
    
                HWIN_EXPORT D2D1_POINT_2F GetEndPoint() const;
    
                HWIN_EXPORT GradientStopCollection GetGradientStopCollection(  ) const;

            };


            class RadialGradientBrush : public Brush
            {
            public:
                typedef Brush Base;

                HARLINN_WINDOWS_GRAPHICS_STANDARD_METHODS_IMPL(RadialGradientBrush, Brush,ID2D1RadialGradientBrush,ID2D1Brush)

                //
                // Sets the center of the radial gradient. This will be in local coordinates and
                // will not depend on the geometry being filled.
                //
                HWIN_EXPORT RadialGradientBrush& SetCenter(D2D1_POINT_2F center );
    
    
                //
                // Sets offset of the origin relative to the radial gradient center.
                //
                HWIN_EXPORT RadialGradientBrush& SetGradientOriginOffset(D2D1_POINT_2F gradientOriginOffset );
    
                HWIN_EXPORT RadialGradientBrush& SetRadiusX(FLOAT radiusX );
    
                HWIN_EXPORT RadialGradientBrush& SetRadiusY(FLOAT radiusY );
    
                HWIN_EXPORT D2D1_POINT_2F GetCenter() const;
    
                HWIN_EXPORT D2D1_POINT_2F GetGradientOriginOffset() const;
    
                HWIN_EXPORT FLOAT GetRadiusX() const;
    
                HWIN_EXPORT FLOAT GetRadiusY() const;
    
                HWIN_EXPORT GradientStopCollection GetGradientStopCollection( ) const;

            };


            class StrokeStyle : public Resource
            {
            public:
                typedef Resource Base;

                HARLINN_WINDOWS_GRAPHICS_STANDARD_METHODS_IMPL(StrokeStyle, Resource,ID2D1StrokeStyle,ID2D1Resource)

                HWIN_EXPORT D2D1_CAP_STYLE GetStartCap() const;
    
                HWIN_EXPORT D2D1_CAP_STYLE GetEndCap() const;
    
                HWIN_EXPORT D2D1_CAP_STYLE GetDashCap() const;
    
                HWIN_EXPORT FLOAT GetMiterLimit() const;
    
                HWIN_EXPORT D2D1_LINE_JOIN GetLineJoin() const;
    
                HWIN_EXPORT FLOAT GetDashOffset() const;
    
                HWIN_EXPORT D2D1_DASH_STYLE GetDashStyle() const;
    
                HWIN_EXPORT UINT32 GetDashesCount() const;
    
    
                //
                // Returns the dashes from the object into a user allocated array. The user must
                // call GetDashesCount to retrieve the required size.
                //
                HWIN_EXPORT const StrokeStyle& GetDashes(FLOAT *dashes,UINT32 dashesCount ) const;

            };


            class Geometry : public Resource
            {
            public:
                typedef Resource Base;

                HARLINN_WINDOWS_GRAPHICS_STANDARD_METHODS_IMPL(Geometry, Resource,ID2D1Geometry,ID2D1Resource)


                //
                // Retrieve the bounds of the geometry, with an optional applied transform.
                //
                HWIN_EXPORT const Geometry& GetBounds(const D2D1_MATRIX_3X2_F *worldTransform, D2D1_RECT_F *bounds ) const;
    
    
                //
                // Get the bounds of the corresponding geometry after it has been widened or have
                // an optional pen style applied.
                //
                HWIN_EXPORT const Geometry& GetWidenedBounds(FLOAT strokeWidth,ID2D1StrokeStyle *strokeStyle,const D2D1_MATRIX_3X2_F *worldTransform,FLOAT flatteningTolerance,D2D1_RECT_F *bounds ) const;
    
    
                //
                // Checks to see whether the corresponding penned and widened geometry contains the
                // given point.
                //
                HWIN_EXPORT const Geometry& StrokeContainsPoint(D2D1_POINT_2F point,FLOAT strokeWidth,ID2D1StrokeStyle *strokeStyle,const D2D1_MATRIX_3X2_F *worldTransform,FLOAT flatteningTolerance,BOOL *contains ) const;
    
    
                //
                // Test whether the given fill of this geometry would contain this point.
                //
                HWIN_EXPORT const Geometry& FillContainsPoint(D2D1_POINT_2F point,const D2D1_MATRIX_3X2_F *worldTransform,FLOAT flatteningTolerance, BOOL *contains ) const;
    
    
                //
                // Compare how one geometry intersects or contains another geometry.
                //
                HWIN_EXPORT const Geometry& CompareWithGeometry(ID2D1Geometry *inputGeometry,const D2D1_MATRIX_3X2_F *inputGeometryTransform,FLOAT flatteningTolerance, D2D1_GEOMETRY_RELATION *relation ) const;
    
    
                //
                // Converts a geometry to a simplified geometry that has arcs and quadratic beziers
                // removed.
                //
                HWIN_EXPORT const Geometry& Simplify(D2D1_GEOMETRY_SIMPLIFICATION_OPTION simplificationOption,const D2D1_MATRIX_3X2_F *worldTransform,FLOAT flatteningTolerance, ID2D1SimplifiedGeometrySink *geometrySink ) const;
    
    
                //
                // Tessellates a geometry into triangles.
                //
                HWIN_EXPORT const Geometry& Tessellate(const D2D1_MATRIX_3X2_F *worldTransform,FLOAT flatteningTolerance, ID2D1TessellationSink *tessellationSink ) const;
    
    
                //
                // Performs a combine operation between the two geometries to produce a resulting
                // geometry.
                //
                HWIN_EXPORT const Geometry& CombineWithGeometry( ID2D1Geometry *inputGeometry,D2D1_COMBINE_MODE combineMode,const D2D1_MATRIX_3X2_F *inputGeometryTransform,FLOAT flatteningTolerance, ID2D1SimplifiedGeometrySink *geometrySink ) const;
    
    
                //
                // Computes the outline of the geometry. The result is written back into a
                // simplified geometry sink.
                //
                HWIN_EXPORT const Geometry& Outline(const D2D1_MATRIX_3X2_F *worldTransform,FLOAT flatteningTolerance, ID2D1SimplifiedGeometrySink *geometrySink ) const;
    
    
                //
                // Computes the area of the geometry.
                //
                HWIN_EXPORT const Geometry& ComputeArea(const D2D1_MATRIX_3X2_F *worldTransform,FLOAT flatteningTolerance, FLOAT *area ) const;
    
    
                //
                // Computes the length of the geometry.
                //
                HWIN_EXPORT const Geometry& ComputeLength(const D2D1_MATRIX_3X2_F *worldTransform,FLOAT flatteningTolerance, FLOAT *length ) const;
    
    
                //
                // Computes the point and tangent a given distance along the path.
                //
                HWIN_EXPORT const Geometry& ComputePointAtLength(FLOAT length,const D2D1_MATRIX_3X2_F *worldTransform,FLOAT flatteningTolerance, D2D1_POINT_2F *point, D2D1_POINT_2F *unitTangentVector ) const;
    
    
                //
                // Get the geometry and widen it as well as apply an optional pen style.
                //
                HWIN_EXPORT const Geometry& Widen(FLOAT strokeWidth,ID2D1StrokeStyle *strokeStyle,const D2D1_MATRIX_3X2_F *worldTransform,FLOAT flatteningTolerance, ID2D1SimplifiedGeometrySink *geometrySink ) const;
    
    
                //
                // Retrieve the bounds of the geometry, with an optional applied transform.
                //
                
                const Geometry& GetBounds(const D2D1_MATRIX_3X2_F &worldTransform, D2D1_RECT_F *bounds ) const  
                {
                    HWIN_TRACE();
                    return GetBounds(&worldTransform, bounds);
                }
    
    
                //
                // Get the bounds of the corresponding geometry after it has been widened or have
                // an optional pen style applied.
                //
                
                const Geometry& GetWidenedBounds(FLOAT strokeWidth,ID2D1StrokeStyle *strokeStyle, const D2D1_MATRIX_3X2_F &worldTransform, FLOAT flatteningTolerance, D2D1_RECT_F *bounds ) const
                {
                    HWIN_TRACE();
                    return GetWidenedBounds(strokeWidth, strokeStyle, &worldTransform, flatteningTolerance, bounds);
                }
    
    
                //
                // Get the bounds of the corresponding geometry after it has been widened or have
                // an optional pen style applied.
                //
                
                const Geometry& GetWidenedBounds(FLOAT strokeWidth,ID2D1StrokeStyle *strokeStyle,const D2D1_MATRIX_3X2_F *worldTransform,D2D1_RECT_F *bounds ) const  
                {
                    HWIN_TRACE();
                    return GetWidenedBounds(strokeWidth, strokeStyle, worldTransform, D2D1_DEFAULT_FLATTENING_TOLERANCE, bounds);
                }
    
    
                //
                // Get the bounds of the corresponding geometry after it has been widened or have
                // an optional pen style applied.
                //
                
                const Geometry& GetWidenedBounds(FLOAT strokeWidth,ID2D1StrokeStyle *strokeStyle,const D2D1_MATRIX_3X2_F &worldTransform,D2D1_RECT_F *bounds) const  
                {
                    HWIN_TRACE();
                    return GetWidenedBounds(strokeWidth, strokeStyle, &worldTransform, D2D1_DEFAULT_FLATTENING_TOLERANCE, bounds);
                }
    
                
                const Geometry& StrokeContainsPoint(D2D1_POINT_2F point, FLOAT strokeWidth, ID2D1StrokeStyle *strokeStyle, const D2D1_MATRIX_3X2_F &worldTransform, FLOAT flatteningTolerance, BOOL *contains ) const  
                {
                    HWIN_TRACE();
                    return StrokeContainsPoint(point, strokeWidth, strokeStyle, &worldTransform, flatteningTolerance, contains);
                }
    
    
                //
                // Checks to see whether the corresponding penned and widened geometry contains the
                // given point.
                //
                const Geometry& StrokeContainsPoint(D2D1_POINT_2F point, FLOAT strokeWidth, ID2D1StrokeStyle *strokeStyle, const D2D1_MATRIX_3X2_F *worldTransform, BOOL *contains ) const  
                {
                    HWIN_TRACE();
                    return StrokeContainsPoint(point, strokeWidth, strokeStyle, worldTransform, D2D1_DEFAULT_FLATTENING_TOLERANCE, contains);
                }
    
                
                const Geometry& StrokeContainsPoint( D2D1_POINT_2F point, FLOAT strokeWidth, ID2D1StrokeStyle *strokeStyle, const D2D1_MATRIX_3X2_F &worldTransform, BOOL *contains ) const  
                {
                    HWIN_TRACE();
                    return StrokeContainsPoint(point, strokeWidth, strokeStyle, &worldTransform, D2D1_DEFAULT_FLATTENING_TOLERANCE, contains);
                }
    
                const Geometry& FillContainsPoint( D2D1_POINT_2F point, const D2D1_MATRIX_3X2_F &worldTransform, FLOAT flatteningTolerance, BOOL *contains ) const  
                {
                    HWIN_TRACE();
                    return FillContainsPoint(point, &worldTransform, flatteningTolerance, contains);
                }
    
    
                //
                // Test whether the given fill of this geometry would contain this point.
                //
                const Geometry& FillContainsPoint(D2D1_POINT_2F point,const D2D1_MATRIX_3X2_F *worldTransform, BOOL *contains ) const  
                {
                    HWIN_TRACE();
                    return FillContainsPoint(point, worldTransform, D2D1_DEFAULT_FLATTENING_TOLERANCE, contains);
                }
    
                const Geometry& FillContainsPoint( D2D1_POINT_2F point, const D2D1_MATRIX_3X2_F &worldTransform, BOOL *contains ) const  
                {
                    HWIN_TRACE();
                    return FillContainsPoint(point, &worldTransform, D2D1_DEFAULT_FLATTENING_TOLERANCE, contains);
                }
    
    
                //
                // Compare how one geometry intersects or contains another geometry.
                //
                
                const Geometry& CompareWithGeometry(ID2D1Geometry *inputGeometry, const D2D1_MATRIX_3X2_F &inputGeometryTransform, FLOAT flatteningTolerance, D2D1_GEOMETRY_RELATION *relation) const  
                {
                    HWIN_TRACE();
                    return CompareWithGeometry(inputGeometry, &inputGeometryTransform, flatteningTolerance, relation);
                }
    
    
                //
                // Compare how one geometry intersects or contains another geometry.
                //
                
                const Geometry& CompareWithGeometry( ID2D1Geometry *inputGeometry,const D2D1_MATRIX_3X2_F *inputGeometryTransform, D2D1_GEOMETRY_RELATION *relation ) const  
                {
                    HWIN_TRACE();
                    return CompareWithGeometry(inputGeometry, inputGeometryTransform, D2D1_DEFAULT_FLATTENING_TOLERANCE, relation);
                }
    
    
                //
                // Compare how one geometry intersects or contains another geometry.
                //
                const Geometry& CompareWithGeometry(ID2D1Geometry *inputGeometry, const D2D1_MATRIX_3X2_F &inputGeometryTransform, D2D1_GEOMETRY_RELATION *relation ) const  
                {
                    HWIN_TRACE();
                    return CompareWithGeometry(inputGeometry, &inputGeometryTransform, D2D1_DEFAULT_FLATTENING_TOLERANCE, relation);
                }
    
    
                //
                // Converts a geometry to a simplified geometry that has arcs and quadratic beziers
                // removed.
                //
                const Geometry& Simplify( D2D1_GEOMETRY_SIMPLIFICATION_OPTION simplificationOption, const D2D1_MATRIX_3X2_F &worldTransform, FLOAT flatteningTolerance, ID2D1SimplifiedGeometrySink *geometrySink ) const  
                {
                    HWIN_TRACE();
                    return Simplify(simplificationOption, &worldTransform, flatteningTolerance, geometrySink);
                }
    
    
                //
                // Converts a geometry to a simplified geometry that has arcs and quadratic beziers
                // removed.
                //
                
                const Geometry& Simplify(D2D1_GEOMETRY_SIMPLIFICATION_OPTION simplificationOption, const D2D1_MATRIX_3X2_F *worldTransform, ID2D1SimplifiedGeometrySink *geometrySink ) const  
                {
                    HWIN_TRACE();
                    return Simplify(simplificationOption, worldTransform, D2D1_DEFAULT_FLATTENING_TOLERANCE, geometrySink);
                }
    
    
                //
                // Converts a geometry to a simplified geometry that has arcs and quadratic beziers
                // removed.
                //
                const Geometry& Simplify( D2D1_GEOMETRY_SIMPLIFICATION_OPTION simplificationOption, const D2D1_MATRIX_3X2_F &worldTransform, ID2D1SimplifiedGeometrySink *geometrySink ) const  
                {
                    HWIN_TRACE();
                    return Simplify(simplificationOption, &worldTransform, D2D1_DEFAULT_FLATTENING_TOLERANCE, geometrySink);
                }
    
    
                //
                // Tessellates a geometry into triangles.
                //
                
                const Geometry& Tessellate(const D2D1_MATRIX_3X2_F &worldTransform, FLOAT flatteningTolerance, ID2D1TessellationSink *tessellationSink ) const  
                {
                    HWIN_TRACE();
                    return Tessellate(&worldTransform, flatteningTolerance, tessellationSink);
                }
    
    
                //
                // Tessellates a geometry into triangles.
                //
                
                const Geometry& Tessellate(const D2D1_MATRIX_3X2_F *worldTransform, ID2D1TessellationSink *tessellationSink ) const  
                {
                    HWIN_TRACE();
                    return Tessellate(worldTransform, D2D1_DEFAULT_FLATTENING_TOLERANCE, tessellationSink);
                }
    
    
                //
                // Tessellates a geometry into triangles.
                //
                
                const Geometry& Tessellate(const D2D1_MATRIX_3X2_F &worldTransform, ID2D1TessellationSink *tessellationSink) const  
                {
                    HWIN_TRACE();
                    return Tessellate(&worldTransform, D2D1_DEFAULT_FLATTENING_TOLERANCE, tessellationSink);
                }
    
    
                //
                // Performs a combine operation between the two geometries to produce a resulting
                // geometry.
                //
                const Geometry& CombineWithGeometry( ID2D1Geometry *inputGeometry, D2D1_COMBINE_MODE combineMode, const D2D1_MATRIX_3X2_F &inputGeometryTransform, FLOAT flatteningTolerance, ID2D1SimplifiedGeometrySink *geometrySink ) const  
                {
                    HWIN_TRACE();
                    return CombineWithGeometry(inputGeometry, combineMode, &inputGeometryTransform, flatteningTolerance, geometrySink);
                }
    
    
                //
                // Performs a combine operation between the two geometries to produce a resulting
                // geometry.
                //
                const Geometry& CombineWithGeometry( ID2D1Geometry *inputGeometry, D2D1_COMBINE_MODE combineMode, const D2D1_MATRIX_3X2_F *inputGeometryTransform, ID2D1SimplifiedGeometrySink *geometrySink ) const  
                {
                    HWIN_TRACE();
                    return CombineWithGeometry(inputGeometry, combineMode, inputGeometryTransform, D2D1_DEFAULT_FLATTENING_TOLERANCE, geometrySink);
                }
    
    
                //
                // Performs a combine operation between the two geometries to produce a resulting
                // geometry.
                //
                
                const Geometry& CombineWithGeometry(ID2D1Geometry *inputGeometry, D2D1_COMBINE_MODE combineMode, const D2D1_MATRIX_3X2_F &inputGeometryTransform, ID2D1SimplifiedGeometrySink *geometrySink ) const  
                {
                    HWIN_TRACE();
                    return CombineWithGeometry(inputGeometry, combineMode, &inputGeometryTransform, D2D1_DEFAULT_FLATTENING_TOLERANCE, geometrySink);
                }
    
    
                //
                // Computes the outline of the geometry. The result is written back into a
                // simplified geometry sink.
                //
                
                const Geometry& Outline(const D2D1_MATRIX_3X2_F &worldTransform,FLOAT flatteningTolerance, ID2D1SimplifiedGeometrySink *geometrySink ) const  
                {
                    HWIN_TRACE();
                    return Outline(&worldTransform, flatteningTolerance, geometrySink);
                }
    
    
                //
                // Computes the outline of the geometry. The result is written back into a
                // simplified geometry sink.
                //
                
                const Geometry& Outline(const D2D1_MATRIX_3X2_F *worldTransform, ID2D1SimplifiedGeometrySink *geometrySink ) const  
                {
                    HWIN_TRACE();
                    return Outline(worldTransform, D2D1_DEFAULT_FLATTENING_TOLERANCE, geometrySink);
                }
    
    
                //
                // Computes the outline of the geometry. The result is written back into a
                // simplified geometry sink.
                //
                
                const Geometry& Outline(const D2D1_MATRIX_3X2_F &worldTransform, ID2D1SimplifiedGeometrySink *geometrySink ) const  
                {
                    HWIN_TRACE();
                    return Outline(&worldTransform, D2D1_DEFAULT_FLATTENING_TOLERANCE, geometrySink);
                }
    
    
                //
                // Computes the area of the geometry.
                //
                
                const Geometry& ComputeArea(const D2D1_MATRIX_3X2_F &worldTransform,FLOAT flatteningTolerance,FLOAT *area ) const  
                {
                    HWIN_TRACE();
                    return ComputeArea(&worldTransform, flatteningTolerance, area);
                }
    
    
                //
                // Computes the area of the geometry.
                //
                
                const Geometry& ComputeArea( const D2D1_MATRIX_3X2_F *worldTransform, FLOAT *area ) const  
                {
                    HWIN_TRACE();
                    return ComputeArea(worldTransform, D2D1_DEFAULT_FLATTENING_TOLERANCE, area);
                }
    
    
                //
                // Computes the area of the geometry.
                //
                const Geometry& ComputeArea( const D2D1_MATRIX_3X2_F &worldTransform, FLOAT *area ) const  
                {
                    HWIN_TRACE();
                    return ComputeArea(&worldTransform, D2D1_DEFAULT_FLATTENING_TOLERANCE, area);
                }
    
    
                //
                // Computes the length of the geometry.
                //
                
                const Geometry& ComputeLength(const D2D1_MATRIX_3X2_F &worldTransform,FLOAT flatteningTolerance, FLOAT *length) const  
                {
                    HWIN_TRACE();
                    return ComputeLength(&worldTransform, flatteningTolerance, length);
                }
    
    
                //
                // Computes the length of the geometry.
                //
                
                const Geometry& ComputeLength(const D2D1_MATRIX_3X2_F *worldTransform,FLOAT *length ) const  
                {
                    HWIN_TRACE();
                    return ComputeLength(worldTransform, D2D1_DEFAULT_FLATTENING_TOLERANCE, length);
                }
    
    
                //
                // Computes the length of the geometry.
                //
                
                const Geometry& ComputeLength(const D2D1_MATRIX_3X2_F &worldTransform, FLOAT *length ) const  
                {
                    HWIN_TRACE();
                    return ComputeLength(&worldTransform, D2D1_DEFAULT_FLATTENING_TOLERANCE, length);
                }
    
    
                //
                // Computes the point and tangent a given distance along the path.
                //
                
                const Geometry& ComputePointAtLength(FLOAT length, const D2D1_MATRIX_3X2_F &worldTransform, FLOAT flatteningTolerance, D2D1_POINT_2F *point, D2D1_POINT_2F *unitTangentVector) const  
                {
                    HWIN_TRACE();
                    return ComputePointAtLength(length, &worldTransform, flatteningTolerance, point, unitTangentVector);
                }
    
    
                //
                // Computes the point and tangent a given distance along the path.
                //
                
                const Geometry& ComputePointAtLength( FLOAT length, const D2D1_MATRIX_3X2_F *worldTransform, D2D1_POINT_2F *point, D2D1_POINT_2F *unitTangentVector ) const  
                {
                    HWIN_TRACE();
                    return ComputePointAtLength(length, worldTransform, D2D1_DEFAULT_FLATTENING_TOLERANCE, point, unitTangentVector);
                }
    
    
                //
                // Computes the point and tangent a given distance along the path.
                //
                
                const Geometry& ComputePointAtLength(FLOAT length, const D2D1_MATRIX_3X2_F &worldTransform, D2D1_POINT_2F *point, D2D1_POINT_2F *unitTangentVector ) const  
                {
                    HWIN_TRACE();
                    return ComputePointAtLength(length, &worldTransform, D2D1_DEFAULT_FLATTENING_TOLERANCE, point, unitTangentVector);
                }
    
    
                //
                // Get the geometry and widen it as well as apply an optional pen style.
                //
                
                const Geometry& Widen(FLOAT strokeWidth, ID2D1StrokeStyle *strokeStyle,const D2D1_MATRIX_3X2_F &worldTransform, FLOAT flatteningTolerance, ID2D1SimplifiedGeometrySink *geometrySink ) const  
                {
                    HWIN_TRACE();
                    return Widen(strokeWidth, strokeStyle, &worldTransform, flatteningTolerance, geometrySink);
                }
    
    
                //
                // Get the geometry and widen it as well as apply an optional pen style.
                //
                
                const Geometry& Widen(FLOAT strokeWidth, ID2D1StrokeStyle *strokeStyle, const D2D1_MATRIX_3X2_F *worldTransform, ID2D1SimplifiedGeometrySink *geometrySink) const  
                {
                    HWIN_TRACE();
                    return Widen(strokeWidth, strokeStyle, worldTransform, D2D1_DEFAULT_FLATTENING_TOLERANCE, geometrySink);
                }
    
    
                //
                // Get the geometry and widen it as well as apply an optional pen style.
                //
                
                const Geometry& Widen(FLOAT strokeWidth, ID2D1StrokeStyle *strokeStyle, const D2D1_MATRIX_3X2_F &worldTransform, ID2D1SimplifiedGeometrySink *geometrySink) const  
                {
                    HWIN_TRACE();
                    return Widen(strokeWidth, strokeStyle, &worldTransform, D2D1_DEFAULT_FLATTENING_TOLERANCE, geometrySink);
                }

            };

            class RectangleGeometry : public Geometry
            {
            public:
                typedef Geometry Base;

                HARLINN_WINDOWS_GRAPHICS_STANDARD_METHODS_IMPL(RectangleGeometry, Geometry,ID2D1RectangleGeometry,ID2D1Geometry)

                HWIN_EXPORT const RectangleGeometry& GetRect( D2D1_RECT_F *rect ) const;

                const RectangleGeometry& GetRect( D2D1_RECT_F& rect ) const
                {
                    HWIN_TRACE();
                    return GetRect(&rect);
                }


                const D2D1_RECT_F GetRect( ) const
                {
                    HWIN_TRACE();
                    D2D1_RECT_F result = {0,};
                    GetRect(&result);
                    return result;
                }

            };

            class RoundedRectangleGeometry : public Geometry
            {
            public:
                typedef Geometry Base;

                HARLINN_WINDOWS_GRAPHICS_STANDARD_METHODS_IMPL(RoundedRectangleGeometry, Geometry,ID2D1RoundedRectangleGeometry,ID2D1Geometry)


                HWIN_EXPORT const RoundedRectangleGeometry& GetRoundedRect(D2D1_ROUNDED_RECT *roundedRect ) const;

                const RoundedRectangleGeometry& GetRoundedRect(D2D1_ROUNDED_RECT& roundedRect ) const
                {
                    HWIN_TRACE();
                    return GetRoundedRect(&roundedRect);
                }

                const D2D1_ROUNDED_RECT GetRoundedRect( ) const
                {
                    HWIN_TRACE();
                    D2D1_ROUNDED_RECT result = {0,};
                    GetRoundedRect(&result);
                    return result;
                }


            };

            class EllipseGeometry : public Geometry
            {
            public:
                typedef Geometry Base;

                HARLINN_WINDOWS_GRAPHICS_STANDARD_METHODS_IMPL(EllipseGeometry, Geometry,ID2D1EllipseGeometry,ID2D1Geometry)


                HWIN_EXPORT const EllipseGeometry& GetEllipse(D2D1_ELLIPSE *ellipse ) const;


                const EllipseGeometry& GetEllipse(D2D1_ELLIPSE& ellipse ) const
                {
                    HWIN_TRACE();
                    return GetEllipse(&ellipse);
                }

                D2D1_ELLIPSE GetEllipse( ) const
                {
                    HWIN_TRACE();
                    D2D1_ELLIPSE result = {0,};
                    GetEllipse(&result);
                    return result;
                }


            };


            class GeometryGroup : public Geometry
            {
            public:
                typedef Geometry Base;

                HARLINN_WINDOWS_GRAPHICS_STANDARD_METHODS_IMPL(GeometryGroup, Geometry,ID2D1GeometryGroup,ID2D1Geometry)

                HWIN_EXPORT D2D1_FILL_MODE GetFillMode() const;
    
                HWIN_EXPORT UINT32 GetSourceGeometryCount( ) const;
    
                HWIN_EXPORT const GeometryGroup& GetSourceGeometries( ID2D1Geometry **geometries, UINT32 geometriesCount ) const;

            };


            class TransformedGeometry : public Geometry
            {
            public:
                typedef Geometry Base;

                HARLINN_WINDOWS_GRAPHICS_STANDARD_METHODS_IMPL(TransformedGeometry, Geometry,ID2D1TransformedGeometry,ID2D1Geometry)


                HWIN_EXPORT const TransformedGeometry& GetSourceGeometry( ID2D1Geometry **sourceGeometry ) const;
    
                HWIN_EXPORT const TransformedGeometry& GetTransform( D2D1_MATRIX_3X2_F *transform ) const;

            };


            class SimplifiedGeometrySink : public Unknown
            {
            public:
                typedef Unknown Base;

                HARLINN_WINDOWS_GRAPHICS_STANDARD_METHODS_IMPL(SimplifiedGeometrySink,Unknown,ID2D1SimplifiedGeometrySink,IUnknown)


                HWIN_EXPORT SimplifiedGeometrySink& SetFillMode(D2D1_FILL_MODE fillMode );
    
                HWIN_EXPORT SimplifiedGeometrySink& SetSegmentFlags(D2D1_PATH_SEGMENT vertexFlags );
    
                HWIN_EXPORT SimplifiedGeometrySink& BeginFigure(D2D1_POINT_2F startPoint,D2D1_FIGURE_BEGIN figureBegin );
    
                HWIN_EXPORT SimplifiedGeometrySink& AddLines(const D2D1_POINT_2F *points,UINT32 pointsCount );
    
                HWIN_EXPORT SimplifiedGeometrySink& AddBeziers(const D2D1_BEZIER_SEGMENT *beziers,UINT32 beziersCount );
    
                HWIN_EXPORT SimplifiedGeometrySink& EndFigure(D2D1_FIGURE_END figureEnd );
    
                HWIN_EXPORT SimplifiedGeometrySink& Close();
            };


            class GeometrySink : public SimplifiedGeometrySink
            {
            public:
                typedef SimplifiedGeometrySink Base;

                HARLINN_WINDOWS_GRAPHICS_STANDARD_METHODS_IMPL(GeometrySink,SimplifiedGeometrySink,ID2D1GeometrySink,ID2D1SimplifiedGeometrySink)


                HWIN_EXPORT GeometrySink& AddLine(D2D1_POINT_2F point);
    
                HWIN_EXPORT GeometrySink& AddBezier(const D2D1_BEZIER_SEGMENT *bezier);
    
                HWIN_EXPORT GeometrySink& AddQuadraticBezier(const D2D1_QUADRATIC_BEZIER_SEGMENT *bezier );
    
                HWIN_EXPORT GeometrySink& AddQuadraticBeziers(const D2D1_QUADRATIC_BEZIER_SEGMENT *beziers,UINT32 beziersCount );
    
                HWIN_EXPORT GeometrySink& AddArc(const D2D1_ARC_SEGMENT *arc );
    
                GeometrySink& AddBezier(const D2D1_BEZIER_SEGMENT &bezier)  
                {
                    HWIN_TRACE();
                    return AddBezier(&bezier);
                }
    
                GeometrySink& AddQuadraticBezier(const D2D1_QUADRATIC_BEZIER_SEGMENT &bezier )  
                {
                    HWIN_TRACE();
                    return AddQuadraticBezier(&bezier);
                }
    
                GeometrySink& AddArc( const D2D1_ARC_SEGMENT &arc )  
                {
                    HWIN_TRACE();
                    return AddArc(&arc);
                }

            };


            class TessellationSink : public Unknown
            {
            public:
                typedef Unknown Base;

                HARLINN_WINDOWS_GRAPHICS_STANDARD_METHODS_IMPL(TessellationSink,Unknown,ID2D1TessellationSink,IUnknown)

                HWIN_EXPORT TessellationSink& AddTriangles(const D2D1_TRIANGLE *triangles, UINT32 trianglesCount );
    
                HWIN_EXPORT TessellationSink& Close();

            };


            class PathGeometry : public Geometry
            {
            public:
                typedef Geometry Base;

                HARLINN_WINDOWS_GRAPHICS_STANDARD_METHODS_IMPL(PathGeometry, Geometry,ID2D1PathGeometry,ID2D1Geometry)

                //
                // Opens a geometry sink that will be used to create this path geometry.
                //
                HWIN_EXPORT PathGeometry& Open(ID2D1GeometrySink **geometrySink);

                HWIN_EXPORT GeometrySink Open( );
    
    
                //
                // Retrieve the contents of this geometry. The caller passes an implementation of a
                // ID2D1GeometrySink interface to receive the data.
                //
                HWIN_EXPORT const PathGeometry& Stream(ID2D1GeometrySink *geometrySink) const;
    
                HWIN_EXPORT const PathGeometry& GetSegmentCount(UINT32 *count) const;
                HWIN_EXPORT UINT32 GetSegmentCount( ) const;
    
                HWIN_EXPORT const PathGeometry& GetFigureCount(UINT32 *count) const;
                HWIN_EXPORT UINT32 GetFigureCount( ) const;
            };

            class Mesh : public Resource
            {
            public:
                typedef Resource Base;

                HARLINN_WINDOWS_GRAPHICS_STANDARD_METHODS_IMPL(Mesh, Resource,ID2D1Mesh,ID2D1Resource)


                //
                // Opens the mesh for population.
                //
                HWIN_EXPORT Mesh& Open(ID2D1TessellationSink **tessellationSink );
                HWIN_EXPORT TessellationSink Open( );

            };

            class Layer : public Resource
            {
            public:
                typedef Resource Base;

                HARLINN_WINDOWS_GRAPHICS_STANDARD_METHODS_IMPL(Layer, Resource,ID2D1Layer,ID2D1Resource)

                HWIN_EXPORT D2D1_SIZE_F GetSize() const;

            };

            class DrawingStateBlock : public Resource
            {
            public:
                typedef Resource Base;

                HARLINN_WINDOWS_GRAPHICS_STANDARD_METHODS_IMPL(DrawingStateBlock, Resource,ID2D1DrawingStateBlock,ID2D1Resource)

                //
                // Retrieves the state currently contained within this state block resource.
                //
                HWIN_EXPORT const DrawingStateBlock& GetDescription(D2D1_DRAWING_STATE_DESCRIPTION *stateDescription ) const;
    
    
                //
                // Sets the state description of this state block resource.
                //
                HWIN_EXPORT DrawingStateBlock& SetDescription(const D2D1_DRAWING_STATE_DESCRIPTION *stateDescription );
    
    
                //
                // Sets the text rendering parameters of this state block resource.
                //
                HWIN_EXPORT DrawingStateBlock& SetTextRenderingParams(IDWriteRenderingParams *textRenderingParams = NULL );
    
    
                //
                // Retrieves the text rendering parameters contained within this state block
                // resource. If a NULL text rendering parameter was specified, NULL will be
                // returned.
                //
                HWIN_EXPORT const DrawingStateBlock& GetTextRenderingParams(IDWriteRenderingParams **textRenderingParams ) const;
    
                DrawingStateBlock& SetDescription(CONST D2D1_DRAWING_STATE_DESCRIPTION &stateDescription )  
                {
                    HWIN_TRACE();
                    SetDescription(&stateDescription);
                }


            };


            class RenderTarget : public Resource
            {
            public:
                typedef Resource Base;
            public:
                HARLINN_WINDOWS_GRAPHICS_STANDARD_METHODS_IMPL(RenderTarget, Resource,ID2D1RenderTarget,ID2D1Resource)

                //
                // Create a D2D bitmap by copying from memory, or create uninitialized.
                //
                HWIN_EXPORT Bitmap CreateBitmap(D2D1_SIZE_U size, const void *srcData, UINT32 pitch, const D2D1_BITMAP_PROPERTIES* bitmapProperties);
                HWIN_EXPORT Bitmap CreateBitmap(D2D1_SIZE_U size, const void *srcData, UINT32 pitch, const D2D1_BITMAP_PROPERTIES& bitmapProperties);

                HWIN_EXPORT Bitmap CreateBitmap(D2D1_SIZE_U size, const D2D1_BITMAP_PROPERTIES* bitmapProperties);
                HWIN_EXPORT Bitmap CreateBitmap(D2D1_SIZE_U size, const D2D1_BITMAP_PROPERTIES& bitmapProperties);
    
    
                //
                // Create a D2D bitmap by copying a WIC bitmap.
                //
                HWIN_EXPORT Bitmap CreateBitmapFromWicBitmap(IWICBitmapSource *wicBitmapSource,const D2D1_BITMAP_PROPERTIES* bitmapProperties);
                HWIN_EXPORT Bitmap CreateBitmapFromWicBitmap(IWICBitmapSource *wicBitmapSource,const D2D1_BITMAP_PROPERTIES& bitmapProperties);
                HWIN_EXPORT Bitmap CreateBitmapFromWicBitmap(IWICBitmapSource *wicBitmapSource );
    
    
                //
                // Create a D2D bitmap by sharing bits from another resource. The bitmap must be
                // compatible with the render target for the call to succeed.
                // For example, an IWICBitmap can be shared with a software target, or a DXGI
                // surface can be shared with a DXGI render target.
                //
                HWIN_EXPORT Bitmap CreateSharedBitmap(REFIID riid,void *data,const D2D1_BITMAP_PROPERTIES* bitmapProperties);
                HWIN_EXPORT Bitmap CreateSharedBitmap(REFIID riid,void *data,const D2D1_BITMAP_PROPERTIES& bitmapProperties);
    
    
                //
                // Creates a bitmap brush. The bitmap is scaled, rotated, skewed or tiled to fill
                // or pen a geometry.
                //
                HWIN_EXPORT BitmapBrush CreateBitmapBrush(ID2D1Bitmap *bitmap,const D2D1_BITMAP_BRUSH_PROPERTIES* bitmapBrushProperties,const D2D1_BRUSH_PROPERTIES* brushProperties);
                HWIN_EXPORT BitmapBrush CreateBitmapBrush(ID2D1Bitmap *bitmap,const D2D1_BITMAP_BRUSH_PROPERTIES& bitmapBrushProperties,const D2D1_BRUSH_PROPERTIES* brushProperties);
                HWIN_EXPORT BitmapBrush CreateBitmapBrush(ID2D1Bitmap *bitmap,const D2D1_BITMAP_BRUSH_PROPERTIES* bitmapBrushProperties,const D2D1_BRUSH_PROPERTIES& brushProperties);
                HWIN_EXPORT BitmapBrush CreateBitmapBrush(ID2D1Bitmap *bitmap,const D2D1_BITMAP_BRUSH_PROPERTIES& bitmapBrushProperties,const D2D1_BRUSH_PROPERTIES& brushProperties);
                HWIN_EXPORT BitmapBrush CreateBitmapBrush(ID2D1Bitmap *bitmap,const D2D1_BRUSH_PROPERTIES* brushProperties);
                HWIN_EXPORT BitmapBrush CreateBitmapBrush(ID2D1Bitmap *bitmap,const D2D1_BRUSH_PROPERTIES& brushProperties);
                HWIN_EXPORT BitmapBrush CreateBitmapBrush(ID2D1Bitmap *bitmap,const D2D1_BITMAP_BRUSH_PROPERTIES* bitmapBrushProperties);
                HWIN_EXPORT BitmapBrush CreateBitmapBrush(ID2D1Bitmap *bitmap,const D2D1_BITMAP_BRUSH_PROPERTIES& bitmapBrushProperties);
                HWIN_EXPORT BitmapBrush CreateBitmapBrush(ID2D1Bitmap *bitmap );
    


                HWIN_EXPORT SolidColorBrush CreateSolidColorBrush(const D2D1_COLOR_F* color,const D2D1_BRUSH_PROPERTIES* brushProperties);
                HWIN_EXPORT SolidColorBrush CreateSolidColorBrush(const D2D1_COLOR_F& color,const D2D1_BRUSH_PROPERTIES* brushProperties);
                HWIN_EXPORT SolidColorBrush CreateSolidColorBrush(const D2D1_COLOR_F* color,const D2D1_BRUSH_PROPERTIES& brushProperties);
                HWIN_EXPORT SolidColorBrush CreateSolidColorBrush(const D2D1_COLOR_F& color,const D2D1_BRUSH_PROPERTIES& brushProperties);
                HWIN_EXPORT SolidColorBrush CreateSolidColorBrush(const D2D1_COLOR_F* color);
                HWIN_EXPORT SolidColorBrush CreateSolidColorBrush(const D2D1_COLOR_F& color);
    
    
                //
                // A gradient stop collection represents a set of stops in an ideal unit length.
                // This is the source resource for a linear gradient and radial gradient brush.
                //
                HWIN_EXPORT GradientStopCollection CreateGradientStopCollection(const D2D1_GRADIENT_STOP *gradientStops,
                    UINT32 gradientStopsCount,
                    D2D1_GAMMA colorInterpolationGamma, // Specifies which space the color interpolation occurs in.
                    D2D1_EXTEND_MODE extendMode); // Specifies how the gradient will be extended outside of the unit length.

                HWIN_EXPORT GradientStopCollection CreateGradientStopCollection(const D2D1_GRADIENT_STOP *gradientStops, UINT32 gradientStopsCount);
    


                HWIN_EXPORT LinearGradientBrush CreateLinearGradientBrush(const D2D1_LINEAR_GRADIENT_BRUSH_PROPERTIES* linearGradientBrushProperties, const D2D1_BRUSH_PROPERTIES* brushProperties, ID2D1GradientStopCollection* gradientStopCollection);
                HWIN_EXPORT LinearGradientBrush CreateLinearGradientBrush(const D2D1_LINEAR_GRADIENT_BRUSH_PROPERTIES& linearGradientBrushProperties, const D2D1_BRUSH_PROPERTIES* brushProperties, ID2D1GradientStopCollection* gradientStopCollection);
                HWIN_EXPORT LinearGradientBrush CreateLinearGradientBrush(const D2D1_LINEAR_GRADIENT_BRUSH_PROPERTIES* linearGradientBrushProperties, const D2D1_BRUSH_PROPERTIES& brushProperties, ID2D1GradientStopCollection* gradientStopCollection);
                HWIN_EXPORT LinearGradientBrush CreateLinearGradientBrush(const D2D1_LINEAR_GRADIENT_BRUSH_PROPERTIES& linearGradientBrushProperties, const D2D1_BRUSH_PROPERTIES& brushProperties, ID2D1GradientStopCollection* gradientStopCollection);

                HWIN_EXPORT LinearGradientBrush CreateLinearGradientBrush(const D2D1_LINEAR_GRADIENT_BRUSH_PROPERTIES* linearGradientBrushProperties, ID2D1GradientStopCollection* gradientStopCollection);
                HWIN_EXPORT LinearGradientBrush CreateLinearGradientBrush(const D2D1_LINEAR_GRADIENT_BRUSH_PROPERTIES& linearGradientBrushProperties, ID2D1GradientStopCollection* gradientStopCollection);
                HWIN_EXPORT LinearGradientBrush CreateLinearGradientBrush(const D2D1_POINT_2F& startPoint, const D2D1_POINT_2F& endPoint, ID2D1GradientStopCollection* gradientStopCollection);



    
                HWIN_EXPORT RadialGradientBrush CreateRadialGradientBrush(const D2D1_RADIAL_GRADIENT_BRUSH_PROPERTIES* radialGradientBrushProperties, const D2D1_BRUSH_PROPERTIES* brushProperties, ID2D1GradientStopCollection* gradientStopCollection);
                HWIN_EXPORT RadialGradientBrush CreateRadialGradientBrush(const D2D1_RADIAL_GRADIENT_BRUSH_PROPERTIES& radialGradientBrushProperties, const D2D1_BRUSH_PROPERTIES* brushProperties, ID2D1GradientStopCollection* gradientStopCollection);
                HWIN_EXPORT RadialGradientBrush CreateRadialGradientBrush(const D2D1_RADIAL_GRADIENT_BRUSH_PROPERTIES* radialGradientBrushProperties, const D2D1_BRUSH_PROPERTIES& brushProperties, ID2D1GradientStopCollection* gradientStopCollection);
                HWIN_EXPORT RadialGradientBrush CreateRadialGradientBrush(const D2D1_RADIAL_GRADIENT_BRUSH_PROPERTIES& radialGradientBrushProperties, const D2D1_BRUSH_PROPERTIES& brushProperties, ID2D1GradientStopCollection* gradientStopCollection);
    
                HWIN_EXPORT RadialGradientBrush CreateRadialGradientBrush(const D2D1_RADIAL_GRADIENT_BRUSH_PROPERTIES* radialGradientBrushProperties, ID2D1GradientStopCollection* gradientStopCollection);
                HWIN_EXPORT RadialGradientBrush CreateRadialGradientBrush(const D2D1_RADIAL_GRADIENT_BRUSH_PROPERTIES& radialGradientBrushProperties, ID2D1GradientStopCollection* gradientStopCollection);

                HWIN_EXPORT RadialGradientBrush CreateRadialGradientBrush(const D2D1_POINT_2F& center, const D2D1_POINT_2F& gradientOriginOffset, FLOAT radiusX, FLOAT radiusY, ID2D1GradientStopCollection* gradientStopCollection);

    
                //
                // Creates a bitmap render target whose bitmap can be used as a source for
                // rendering in the API.
                //
                HWIN_EXPORT BitmapRenderTarget CreateCompatibleRenderTarget(
        
                    //
                    // The requested size of the target in DIPs. If the pixel size is not specified,
                    // the DPI is inherited from the parent target. However, the render target will
                    // never contain a fractional number of pixels.
                    //
                    const D2D1_SIZE_F *desiredSize,
        
                    //
                    // The requested size of the render target in pixels. If the DIP size is also
                    // specified, the DPI is calculated from these two values. If the desired size is
                    // not specified, the DPI is inherited from the parent render target. If neither
                    // value is specified, the compatible render target will be the same size and have
                    // the same DPI as the parent target.
                    //
                    const D2D1_SIZE_U *desiredPixelSize,
        
                    //
                    // The desired pixel format. The format must be compatible with the parent render
                    // target type. If the format is not specified, it will be inherited from the
                    // parent render target.
                    //
                    const D2D1_PIXEL_FORMAT *desiredFormat,
        
                    // Allows the caller to retrieve a GDI compatible render target.
                    D2D1_COMPATIBLE_RENDER_TARGET_OPTIONS options); 
    
                HWIN_EXPORT BitmapRenderTarget CreateCompatibleRenderTarget(const D2D1_SIZE_F* desiredSize, const D2D1_SIZE_U* desiredPixelSize, const D2D1_PIXEL_FORMAT& desiredFormat, D2D1_COMPATIBLE_RENDER_TARGET_OPTIONS options);
                HWIN_EXPORT BitmapRenderTarget CreateCompatibleRenderTarget(const D2D1_SIZE_F* desiredSize, const D2D1_SIZE_U& desiredPixelSize, const D2D1_PIXEL_FORMAT* desiredFormat, D2D1_COMPATIBLE_RENDER_TARGET_OPTIONS options);
                HWIN_EXPORT BitmapRenderTarget CreateCompatibleRenderTarget(const D2D1_SIZE_F* desiredSize, const D2D1_SIZE_U& desiredPixelSize, const D2D1_PIXEL_FORMAT& desiredFormat, D2D1_COMPATIBLE_RENDER_TARGET_OPTIONS options);
                HWIN_EXPORT BitmapRenderTarget CreateCompatibleRenderTarget(const D2D1_SIZE_F& desiredSize, const D2D1_SIZE_U* desiredPixelSize, const D2D1_PIXEL_FORMAT* desiredFormat, D2D1_COMPATIBLE_RENDER_TARGET_OPTIONS options);
                HWIN_EXPORT BitmapRenderTarget CreateCompatibleRenderTarget(const D2D1_SIZE_F& desiredSize, const D2D1_SIZE_U* desiredPixelSize, const D2D1_PIXEL_FORMAT& desiredFormat, D2D1_COMPATIBLE_RENDER_TARGET_OPTIONS options);
                HWIN_EXPORT BitmapRenderTarget CreateCompatibleRenderTarget(const D2D1_SIZE_F& desiredSize, const D2D1_SIZE_U& desiredPixelSize, const D2D1_PIXEL_FORMAT& desiredFormat, D2D1_COMPATIBLE_RENDER_TARGET_OPTIONS options);

                HWIN_EXPORT BitmapRenderTarget CreateCompatibleRenderTarget(const D2D1_SIZE_F* desiredSize, const D2D1_SIZE_U* desiredPixelSize, const D2D1_PIXEL_FORMAT& desiredFormat);
                HWIN_EXPORT BitmapRenderTarget CreateCompatibleRenderTarget(const D2D1_SIZE_F* desiredSize, const D2D1_SIZE_U& desiredPixelSize, const D2D1_PIXEL_FORMAT* desiredFormat);
                HWIN_EXPORT BitmapRenderTarget CreateCompatibleRenderTarget(const D2D1_SIZE_F* desiredSize, const D2D1_SIZE_U& desiredPixelSize, const D2D1_PIXEL_FORMAT& desiredFormat);
                HWIN_EXPORT BitmapRenderTarget CreateCompatibleRenderTarget(const D2D1_SIZE_F& desiredSize, const D2D1_SIZE_U* desiredPixelSize, const D2D1_PIXEL_FORMAT* desiredFormat);
                HWIN_EXPORT BitmapRenderTarget CreateCompatibleRenderTarget(const D2D1_SIZE_F& desiredSize, const D2D1_SIZE_U* desiredPixelSize, const D2D1_PIXEL_FORMAT& desiredFormat);
                HWIN_EXPORT BitmapRenderTarget CreateCompatibleRenderTarget(const D2D1_SIZE_F& desiredSize, const D2D1_SIZE_U& desiredPixelSize, const D2D1_PIXEL_FORMAT& desiredFormat);


                HWIN_EXPORT BitmapRenderTarget CreateCompatibleRenderTarget(const D2D1_SIZE_F* desiredSize, const D2D1_SIZE_U* desiredPixelSize);
                HWIN_EXPORT BitmapRenderTarget CreateCompatibleRenderTarget(const D2D1_SIZE_F* desiredSize, const D2D1_PIXEL_FORMAT* desiredFormat);
                HWIN_EXPORT BitmapRenderTarget CreateCompatibleRenderTarget(const D2D1_SIZE_F* desiredSize);
                
                HWIN_EXPORT BitmapRenderTarget CreateCompatibleRenderTarget(const D2D1_SIZE_F& desiredSize, const D2D1_SIZE_U* desiredPixelSize);
                HWIN_EXPORT BitmapRenderTarget CreateCompatibleRenderTarget(const D2D1_SIZE_F& desiredSize, const D2D1_SIZE_U& desiredPixelSize);
                HWIN_EXPORT BitmapRenderTarget CreateCompatibleRenderTarget(const D2D1_SIZE_F& desiredSize, const D2D1_PIXEL_FORMAT* desiredFormat);
                HWIN_EXPORT BitmapRenderTarget CreateCompatibleRenderTarget(const D2D1_SIZE_F& desiredSize, const D2D1_PIXEL_FORMAT& desiredFormat);
                HWIN_EXPORT BitmapRenderTarget CreateCompatibleRenderTarget(const D2D1_SIZE_F& desiredSize);

                HWIN_EXPORT BitmapRenderTarget CreateCompatibleRenderTarget( );




    
                //
                // Creates a layer resource that can be used on any target and which will resize
                // under the covers if necessary.
                //
                HWIN_EXPORT Layer CreateLayer(
                    //
                    // The resolution independent minimum size hint for the layer resource. Specify
                    // this to prevent unwanted reallocation of the layer backing store. The size is in
                    // DIPs, but, it is unaffected by the current world transform. If the size is
                    // unspecified, the returned resource is a placeholder and the backing store will
                    // be allocated to be the minimum size that can hold the content when the layer is
                    // pushed.
                    //
                    const D2D1_SIZE_F *size);

                HWIN_EXPORT Layer CreateLayer(const D2D1_SIZE_F& size);
                HWIN_EXPORT Layer CreateLayer( );
    
    
                //
                // Create a D2D mesh.
                //
                HWIN_EXPORT Mesh CreateMesh( );
    
                HWIN_EXPORT RenderTarget& DrawLine( D2D1_POINT_2F point0, D2D1_POINT_2F point1, ID2D1Brush *brush, FLOAT strokeWidth = 1.0f, ID2D1StrokeStyle *strokeStyle = NULL );
    
                HWIN_EXPORT RenderTarget& DrawRectangle(const D2D1_RECT_F* rect, ID2D1Brush *brush, FLOAT strokeWidth = 1.0f, ID2D1StrokeStyle *strokeStyle = NULL );
                HWIN_EXPORT RenderTarget& DrawRectangle(const D2D1_RECT_F& rect, ID2D1Brush *brush, FLOAT strokeWidth = 1.0f, ID2D1StrokeStyle *strokeStyle = NULL );
    
                HWIN_EXPORT RenderTarget& FillRectangle(const D2D1_RECT_F* rect, ID2D1Brush *brush );
                HWIN_EXPORT RenderTarget& FillRectangle(const D2D1_RECT_F& rect, ID2D1Brush *brush );
    
                HWIN_EXPORT RenderTarget& DrawRoundedRectangle(const D2D1_ROUNDED_RECT* roundedRect, ID2D1Brush *brush, FLOAT strokeWidth = 1.0f, ID2D1StrokeStyle *strokeStyle = NULL );
                HWIN_EXPORT RenderTarget& DrawRoundedRectangle(const D2D1_ROUNDED_RECT& roundedRect, ID2D1Brush *brush, FLOAT strokeWidth = 1.0f, ID2D1StrokeStyle *strokeStyle = NULL );
    
                HWIN_EXPORT RenderTarget& FillRoundedRectangle(const D2D1_ROUNDED_RECT* roundedRect, ID2D1Brush *brush );
                HWIN_EXPORT RenderTarget& FillRoundedRectangle(const D2D1_ROUNDED_RECT& roundedRect, ID2D1Brush *brush );
    
                HWIN_EXPORT RenderTarget& DrawEllipse(const D2D1_ELLIPSE* ellipse, ID2D1Brush *brush, FLOAT strokeWidth = 1.0f, ID2D1StrokeStyle *strokeStyle = NULL );
                HWIN_EXPORT RenderTarget& DrawEllipse(const D2D1_ELLIPSE& ellipse, ID2D1Brush *brush, FLOAT strokeWidth = 1.0f, ID2D1StrokeStyle *strokeStyle = NULL );
    
                HWIN_EXPORT RenderTarget& FillEllipse(const D2D1_ELLIPSE* ellipse, ID2D1Brush *brush );
                HWIN_EXPORT RenderTarget& FillEllipse(const D2D1_ELLIPSE& ellipse, ID2D1Brush *brush );
    
                HWIN_EXPORT RenderTarget& DrawGeometry( ID2D1Geometry *geometry, ID2D1Brush *brush, FLOAT strokeWidth = 1.0f, ID2D1StrokeStyle *strokeStyle = NULL );
    
                HWIN_EXPORT RenderTarget& FillGeometry( ID2D1Geometry *geometry, ID2D1Brush *brush,
                                                // An optionally specified opacity brush. Only the alpha channel of the
                                                // corresponding brush will be sampled and will be applied to the entire fill of
                                                // the geometry. If this brush is specified, the fill brush must be a bitmap brush
                                                // with an extend mode of D2D1_EXTEND_MODE_CLAMP.
                                                ID2D1Brush *opacityBrush = NULL );
    
    
                //
                // Fill a mesh. Since meshes can only render aliased content, the render target
                // antialiasing mode must be set to aliased.
                //
                HWIN_EXPORT RenderTarget& FillMesh(ID2D1Mesh *mesh, ID2D1Brush *brush);
    
    
                //
                // Fill using the alpha channel of the supplied opacity mask bitmap. The brush
                // opacity will be modulated by the mask. The render target antialiasing mode must
                // be set to aliased.
                //
                HWIN_EXPORT RenderTarget& FillOpacityMask(ID2D1Bitmap *opacityMask, ID2D1Brush *brush,
                                                            D2D1_OPACITY_MASK_CONTENT content, 
                                                            const D2D1_RECT_F *destinationRectangle = NULL, 
                                                            const D2D1_RECT_F *sourceRectangle = NULL );
    
                HWIN_EXPORT RenderTarget& DrawBitmap(ID2D1Bitmap *bitmap, const D2D1_RECT_F *destinationRectangle = NULL,
                                                            FLOAT opacity = 1.0f, 
                                                            D2D1_BITMAP_INTERPOLATION_MODE interpolationMode = D2D1_BITMAP_INTERPOLATION_MODE_LINEAR,
                                                            const D2D1_RECT_F *sourceRectangle = NULL );
    
    
                //
                // Draws the text within the given layout rectangle and by default also snaps and
                // clips it to the content bounds.
                //
                HWIN_EXPORT RenderTarget& DrawText( const WCHAR *string,
                                                            UINT32 stringLength,
                                                            IDWriteTextFormat *textFormat,
                                                            const D2D1_RECT_F *layoutRect,
                                                            ID2D1Brush *defaultForegroundBrush,
                                                            D2D1_DRAW_TEXT_OPTIONS options = D2D1_DRAW_TEXT_OPTIONS_NONE,
                                                            DWRITE_MEASURING_MODE measuringMode = DWRITE_MEASURING_MODE_NATURAL );
                RenderTarget& DrawText(const WCHAR *string,UINT32 stringLength,IDWriteTextFormat *textFormat,const D2D1_RECT_F &layoutRect,ID2D1Brush *defaultForegroundBrush,D2D1_DRAW_TEXT_OPTIONS options = D2D1_DRAW_TEXT_OPTIONS_NONE,DWRITE_MEASURING_MODE measuringMode = DWRITE_MEASURING_MODE_NATURAL )  
                {
                    HWIN_TRACE();
                    return DrawText(string, stringLength, textFormat, &layoutRect, defaultForegroundBrush, options, measuringMode);
                }

                HWIN_EXPORT RenderTarget& DrawText( const String& theText,
                                                            IDWriteTextFormat *textFormat,
                                                            const D2D1_RECT_F *layoutRect,
                                                            ID2D1Brush *defaultForegroundBrush,
                                                            D2D1_DRAW_TEXT_OPTIONS options = D2D1_DRAW_TEXT_OPTIONS_NONE,
                                                            DWRITE_MEASURING_MODE measuringMode = DWRITE_MEASURING_MODE_NATURAL );
    
                RenderTarget& DrawText(const String& theText,IDWriteTextFormat *textFormat,const D2D1_RECT_F &layoutRect,ID2D1Brush *defaultForegroundBrush,D2D1_DRAW_TEXT_OPTIONS options = D2D1_DRAW_TEXT_OPTIONS_NONE,DWRITE_MEASURING_MODE measuringMode = DWRITE_MEASURING_MODE_NATURAL )  
                {
                    HWIN_TRACE();
                    return DrawText(theText, textFormat, &layoutRect, defaultForegroundBrush, options, measuringMode);
                }

    
                //
                // Draw a snapped text layout object. Since the layout is not subsequently changed,
                // this can be more efficient than DrawText when drawing the same layout
                // repeatedly.
                //
                HWIN_EXPORT RenderTarget& DrawTextLayout(D2D1_POINT_2F origin,
                                                            IDWriteTextLayout *textLayout,
                                                            ID2D1Brush *defaultForegroundBrush,
        
                                                            //
                                                            // The specified text options. NOTE: By default the text is clipped to the layout
                                                            // bounds. This is derived from the origin and the layout bounds of the
                                                            // corresponding IDWriteTextLayout object.
                                                            //
                                                            D2D1_DRAW_TEXT_OPTIONS options = D2D1_DRAW_TEXT_OPTIONS_NONE );
    
                HWIN_EXPORT RenderTarget& DrawGlyphRun(D2D1_POINT_2F baselineOrigin,const DWRITE_GLYPH_RUN *glyphRun,
                                                            ID2D1Brush *foregroundBrush, 
                                                            DWRITE_MEASURING_MODE measuringMode = DWRITE_MEASURING_MODE_NATURAL );
    
                HWIN_EXPORT RenderTarget& SetTransform(const D2D1_MATRIX_3X2_F *transform );

                RenderTarget& SetTransform(const D2D1_MATRIX_3X2_F& transform )
                {
                    HWIN_TRACE();
                    return SetTransform(&transform);
                }

    
                HWIN_EXPORT const RenderTarget& GetTransform(D2D1_MATRIX_3X2_F *transform ) const;



                D2D1_MATRIX_3X2_F GetTransform( ) const
                {
                    HWIN_TRACE();
                    D2D1_MATRIX_3X2_F result = {0,};
                    GetTransform(&result);
                    return result;
                }

    
                HWIN_EXPORT RenderTarget& SetAntialiasMode( D2D1_ANTIALIAS_MODE antialiasMode );
    
                HWIN_EXPORT D2D1_ANTIALIAS_MODE GetAntialiasMode( ) const;
    
                HWIN_EXPORT RenderTarget& SetTextAntialiasMode( D2D1_TEXT_ANTIALIAS_MODE textAntialiasMode );
    
                HWIN_EXPORT D2D1_TEXT_ANTIALIAS_MODE GetTextAntialiasMode( ) const;
    
                HWIN_EXPORT RenderTarget& SetTextRenderingParams( IDWriteRenderingParams *textRenderingParams = NULL);
    
    
                //
                // Retrieve the text render parameters. NOTE: If NULL is specified to
                // SetTextRenderingParameters, NULL will be returned.
                //
                HWIN_EXPORT const RenderTarget& GetTextRenderingParams( IDWriteRenderingParams **textRenderingParams ) const;
    
    
                //
                // Set a tag to correspond to the succeeding primitives. If an error occurs
                // rendering a primitive, the tags can be returned from the Flush or EndDraw call.
                //
                HWIN_EXPORT RenderTarget& SetTags(D2D1_TAG tag1, D2D1_TAG tag2);
    
    
                //
                // Retrieves the currently set tags. This does not retrieve the tags corresponding
                // to any primitive that is in error.
                //
                HWIN_EXPORT const RenderTarget& GetTags( D2D1_TAG *tag1 = NULL, D2D1_TAG *tag2 = NULL ) const;
    
    
                //
                // Start a layer of drawing calls. The way in which the layer must be resolved is
                // specified first as well as the logical resource that stores the layer
                // parameters. The supplied layer resource might grow if the specified content
                // cannot fit inside it. The layer will grow monotonically on each axis.  If a NULL
                // ID2D1Layer is provided, then a layer resource will be allocated automatically.
                //
                HWIN_EXPORT RenderTarget& PushLayer(const D2D1_LAYER_PARAMETERS *layerParameters, ID2D1Layer *layer );
    
    
                //
                // Ends a layer that was defined with particular layer resources.
                //
                HWIN_EXPORT RenderTarget& PopLayer( );
    
                HWIN_EXPORT RenderTarget& Flush(D2D1_TAG *tag1 = NULL, D2D1_TAG *tag2 = NULL );
    
    
                //
                // Gets the current drawing state and saves it into the supplied
                // IDrawingStatckBlock.
                //
                HWIN_EXPORT RenderTarget& SaveDrawingState(ID2D1DrawingStateBlock *drawingStateBlock);
    
    
                //
                // Copies the state stored in the block interface.
                //
                HWIN_EXPORT RenderTarget& RestoreDrawingState( ID2D1DrawingStateBlock *drawingStateBlock);
    
    
                //
                // Pushes a clip. The clip can be antialiased. The clip must be axis aligned. If
                // the current world transform is not axis preserving, then the bounding box of the
                // transformed clip rect will be used. The clip will remain in effect until a
                // PopAxisAligned clip call is made.
                //
                HWIN_EXPORT RenderTarget& PushAxisAlignedClip(const D2D1_RECT_F *clipRect, D2D1_ANTIALIAS_MODE antialiasMode );
    
                HWIN_EXPORT RenderTarget& PopAxisAlignedClip( );
    
                HWIN_EXPORT RenderTarget& Clear(const D2D1_COLOR_F *clearColor = NULL);
    
    
                //
                // Start drawing on this render target. Draw calls can only be issued between a
                // BeginDraw and EndDraw call.
                //
                HWIN_EXPORT RenderTarget& BeginDraw( );
    
    
                //
                // Ends drawing on the render target, error results can be retrieved at this time,
                // or when calling flush.
                //
                HWIN_EXPORT RenderTarget& EndDraw( D2D1_TAG *tag1 = NULL, D2D1_TAG *tag2 = NULL );
    
                HWIN_EXPORT D2D1_PIXEL_FORMAT GetPixelFormat( ) const;
    
    
                //
                // Sets the DPI on the render target. This results in the render target being
                // interpreted to a different scale. Neither DPI can be negative. If zero is
                // specified for both, the system DPI is chosen. If one is zero and the other
                // unspecified, the DPI is not changed.
                //
                HWIN_EXPORT RenderTarget& SetDpi( FLOAT dpiX, FLOAT dpiY );
    
    
                //
                // Return the current DPI from the target.
                //
                HWIN_EXPORT const RenderTarget& GetDpi( FLOAT *dpiX, FLOAT *dpiY ) const;
    
    
                //
                // Returns the size of the render target in DIPs.
                //
                HWIN_EXPORT D2D1_SIZE_F GetSize( ) const;
    
    
                //
                // Returns the size of the render target in pixels.
                //
                HWIN_EXPORT D2D1_SIZE_U GetPixelSize( ) const;
    
    
                //
                // Returns the maximum bitmap and render target size that is guaranteed to be
                // supported by the render target.
                //
                HWIN_EXPORT UINT32 GetMaximumBitmapSize( ) const;
    
    
                //
                // Returns true if the given properties are supported by this render target. The
                // DPI is ignored. NOTE: If the render target type is software, then neither
                // D2D1_FEATURE_LEVEL_9 nor D2D1_FEATURE_LEVEL_10 will be considered to be
                // supported.
                //
                HWIN_EXPORT bool IsSupported(const D2D1_RENDER_TARGET_PROPERTIES *renderTargetProperties ) const;
                
    
                
                RenderTarget& FillOpacityMask(ID2D1Bitmap *opacityMask,ID2D1Brush *brush, D2D1_OPACITY_MASK_CONTENT content,const D2D1_RECT_F &destinationRectangle,const D2D1_RECT_F &sourceRectangle )
                {
                    HWIN_TRACE();
                    return FillOpacityMask(opacityMask, brush, content, &destinationRectangle, &sourceRectangle);
                }
    
                
                RenderTarget& DrawBitmap(ID2D1Bitmap *bitmap,const D2D1_RECT_F &destinationRectangle,FLOAT opacity = 1.0f, D2D1_BITMAP_INTERPOLATION_MODE interpolationMode = D2D1_BITMAP_INTERPOLATION_MODE_LINEAR,const D2D1_RECT_F *sourceRectangle = NULL)
                {
                    HWIN_TRACE();
                    return DrawBitmap(bitmap, &destinationRectangle, opacity, interpolationMode, sourceRectangle);
                }
    
                
                RenderTarget& DrawBitmap(ID2D1Bitmap *bitmap,const D2D1_RECT_F &destinationRectangle,FLOAT opacity, D2D1_BITMAP_INTERPOLATION_MODE interpolationMode,const D2D1_RECT_F &sourceRectangle )  
                {
                    HWIN_TRACE();
                    return DrawBitmap(bitmap, &destinationRectangle, opacity, interpolationMode, &sourceRectangle);
                }
    
                
                RenderTarget& PushLayer(const D2D1_LAYER_PARAMETERS &layerParameters,ID2D1Layer *layer )  
                {
                    HWIN_TRACE();
                    return PushLayer(&layerParameters, layer);
                }
    
                
                RenderTarget& PushAxisAlignedClip(const D2D1_RECT_F &clipRect,D2D1_ANTIALIAS_MODE antialiasMode )  
                {
                    HWIN_TRACE();
                    return PushAxisAlignedClip(&clipRect, antialiasMode);
                }
    
                
                RenderTarget& Clear(const D2D1_COLOR_F &clearColor )  
                {
                    HWIN_TRACE();
                    return Clear(&clearColor);
                }
    
    
                //
                // Draws the text within the given layout rectangle and by default also snaps and
                // clips it.
                //
                
                
    
                
                bool IsSupported(const D2D1_RENDER_TARGET_PROPERTIES &renderTargetProperties) const 
                {
                    HWIN_TRACE();
                    return IsSupported(&renderTargetProperties);
                }

            };

            class BitmapRenderTarget : public RenderTarget
            {
            public:
                typedef RenderTarget Base;

                HARLINN_WINDOWS_GRAPHICS_STANDARD_METHODS_IMPL(BitmapRenderTarget, RenderTarget,ID2D1BitmapRenderTarget,ID2D1RenderTarget)


                HWIN_EXPORT const BitmapRenderTarget& GetBitmap(ID2D1Bitmap **bitmap ) const;

                HWIN_EXPORT Bitmap GetBitmap( ) const;

            };


            class ControlRenderTarget : public RenderTarget
            {
            public:
                typedef RenderTarget Base;

                HARLINN_WINDOWS_GRAPHICS_STANDARD_METHODS_IMPL(ControlRenderTarget, RenderTarget,ID2D1HwndRenderTarget,ID2D1RenderTarget)

                HWIN_EXPORT D2D1_WINDOW_STATE CheckWindowState( );
    
    
                //
                // Resize the buffer underlying the render target. This operation might fail if
                // there is insufficient video memory or system memory, or if the render target is
                // resized beyond the maximum bitmap size. If the method fails, the render target
                // will be placed in a zombie state and D2DERR_RECREATE_TARGET will be returned
                // from it when EndDraw is called. In addition an appropriate failure result will
                // be returned from Resize.
                //
                HWIN_EXPORT ControlRenderTarget& Resize(const D2D1_SIZE_U *pixelSize );
    
                HWIN_EXPORT HWND GetHwnd( ) const;
    
                
                ControlRenderTarget& Resize(const D2D1_SIZE_U &pixelSize )  
                {
                    HWIN_TRACE();
                    return Resize(&pixelSize);
                }

            };

            class GdiInteropRenderTarget : public RenderTarget
            {
            public:
                typedef RenderTarget Base;

                HARLINN_WINDOWS_GRAPHICS_STANDARD_METHODS_IMPL(GdiInteropRenderTarget, RenderTarget,ID2D1GdiInteropRenderTarget,ID2D1RenderTarget)

                HWIN_EXPORT GdiInteropRenderTarget& GetDC(D2D1_DC_INITIALIZE_MODE mode, HDC *hdc );
    
                HWIN_EXPORT GdiInteropRenderTarget& ReleaseDC(const RECT *update );

            };


            class DeviceContextRenderTarget : public RenderTarget
            {
            public:
                typedef RenderTarget Base;

                HARLINN_WINDOWS_GRAPHICS_STANDARD_METHODS_IMPL(DeviceContextRenderTarget, RenderTarget,ID2D1DCRenderTarget,ID2D1RenderTarget)


                HWIN_EXPORT DeviceContextRenderTarget& BindDC(const HDC hDC,const RECT *pSubRect );

                HWIN_EXPORT DeviceContextRenderTarget& BindDC(const HDC hDC,const RECT& pSubRect );

            };





            
            class Factory : public Unknown
            {
            public:
                typedef Unknown Base;

                HARLINN_WINDOWS_GRAPHICS_STANDARD_METHODS_IMPL(Factory,Unknown,ID2D1Factory,IUnknown)

                HWIN_EXPORT Factory(D2D1_FACTORY_TYPE factoryType);


                HWIN_EXPORT Factory& ReloadSystemMetrics();

                HWIN_EXPORT const Factory& GetDesktopDpi(FLOAT *dpiX, FLOAT *dpiY) const;
                HWIN_EXPORT const Factory& GetDesktopDpi(FLOAT& dpiX, FLOAT& dpiY) const;
                HWIN_EXPORT D2D1_SIZE_F GetDesktopDpi() const;

                HWIN_EXPORT RectangleGeometry CreateRectangleGeometry(const D2D1_RECT_F* rectangle) const;
                HWIN_EXPORT RectangleGeometry CreateRectangleGeometry(const D2D1_RECT_F& rectangle) const;
                HWIN_EXPORT RectangleGeometry CreateRectangleGeometry(const D2D1_POINT_2F* position, const D2D1_SIZE_F* size) const;
                HWIN_EXPORT RectangleGeometry CreateRectangleGeometry(const D2D1_POINT_2F& position, const D2D1_SIZE_F& size) const;
                HWIN_EXPORT RectangleGeometry CreateRectangleGeometry(FLOAT left,FLOAT top,FLOAT right, FLOAT bottom) const;
                

                HWIN_EXPORT RoundedRectangleGeometry CreateRoundedRectangleGeometry(const D2D1_ROUNDED_RECT* rectangle) const;
                HWIN_EXPORT RoundedRectangleGeometry CreateRoundedRectangleGeometry(const D2D1_ROUNDED_RECT& rectangle) const;
                HWIN_EXPORT RoundedRectangleGeometry CreateRoundedRectangleGeometry(const D2D1_RECT_F* rectangle, FLOAT radiusX, FLOAT readiusY ) const;
                HWIN_EXPORT RoundedRectangleGeometry CreateRoundedRectangleGeometry(const D2D1_RECT_F& rectangle, FLOAT radiusX, FLOAT readiusY ) const;
                HWIN_EXPORT RoundedRectangleGeometry CreateRoundedRectangleGeometry(const D2D1_POINT_2F* position, const D2D1_SIZE_F* size, FLOAT radiusX, FLOAT readiusY) const;
                HWIN_EXPORT RoundedRectangleGeometry CreateRoundedRectangleGeometry(const D2D1_POINT_2F& position, const D2D1_SIZE_F& size, FLOAT radiusX, FLOAT readiusY) const;
                HWIN_EXPORT RoundedRectangleGeometry CreateRoundedRectangleGeometry(FLOAT left,FLOAT top,FLOAT right, FLOAT bottom, FLOAT radiusX, FLOAT readiusY) const;

    
                HWIN_EXPORT EllipseGeometry CreateEllipseGeometry(const D2D1_ELLIPSE *ellipse);
    
    
                //
                // Create a geometry which holds other geometries.
                //
                HWIN_EXPORT GeometryGroup CreateGeometryGroup(D2D1_FILL_MODE fillMode,ID2D1Geometry **geometries, UINT32 geometriesCount );
    
                HWIN_EXPORT TransformedGeometry CreateTransformedGeometry(ID2D1Geometry *sourceGeometry,const D2D1_MATRIX_3X2_F *transform );
    
    
                //
                // Returns an initially empty path geometry interface. A geometry sink is created
                // off the interface to populate it.
                //
                HWIN_EXPORT PathGeometry CreatePathGeometry( );
    
    
                //
                // Allows a non-default stroke style to be specified for a given geometry at draw
                // time.
                //
                HWIN_EXPORT StrokeStyle CreateStrokeStyle(const D2D1_STROKE_STYLE_PROPERTIES* strokeStyleProperties,const FLOAT* dashes, UINT32 dashesCount );
                HWIN_EXPORT StrokeStyle CreateStrokeStyle(const D2D1_STROKE_STYLE_PROPERTIES* strokeStyleProperties);
    
    
                //
                // Creates a new drawing state block, this can be used in subsequent
                // SaveDrawingState and RestoreDrawingState operations on the render target.
                //
                HWIN_EXPORT DrawingStateBlock CreateDrawingStateBlock(const D2D1_DRAWING_STATE_DESCRIPTION* drawingStateDescription, IDWriteRenderingParams* textRenderingParams );
                HWIN_EXPORT DrawingStateBlock CreateDrawingStateBlock(const D2D1_DRAWING_STATE_DESCRIPTION* drawingStateDescription  );
                HWIN_EXPORT DrawingStateBlock CreateDrawingStateBlock(const D2D1_DRAWING_STATE_DESCRIPTION& drawingStateDescription  );
                HWIN_EXPORT DrawingStateBlock CreateDrawingStateBlock(IDWriteRenderingParams *textRenderingParams );
                HWIN_EXPORT DrawingStateBlock CreateDrawingStateBlock( );
    
    
                //
                // Creates a render target which is a source of bitmaps.
                //
                HWIN_EXPORT RenderTarget CreateWicBitmapRenderTarget(IWICBitmap *target,const D2D1_RENDER_TARGET_PROPERTIES* renderTargetProperties);
                HWIN_EXPORT RenderTarget CreateWicBitmapRenderTarget(IWICBitmap *target,const D2D1_RENDER_TARGET_PROPERTIES& renderTargetProperties);

                HWIN_EXPORT ControlRenderTarget CreateControlRenderTarget( std::shared_ptr<Control> control ) const;
                HWIN_EXPORT ControlRenderTarget CreateControlRenderTarget( HWND hwnd ) const;


                //
                // Creates a render target that draws to a DXGI Surface. The device that owns the
                // surface is used for rendering.
                //
                HWIN_EXPORT RenderTarget CreateDxgiSurfaceRenderTarget(IDXGISurface *dxgiSurface,const D2D1_RENDER_TARGET_PROPERTIES* renderTargetProperties );
                HWIN_EXPORT RenderTarget CreateDxgiSurfaceRenderTarget(IDXGISurface *dxgiSurface,const D2D1_RENDER_TARGET_PROPERTIES& renderTargetProperties );
                HWIN_EXPORT RenderTarget CreateDxgiSurfaceRenderTarget(IDXGISurface *dxgiSurface );
    
    
                //
                // Creates a render target that draws to a GDI device context.
                //
                HWIN_EXPORT DeviceContextRenderTarget CreateDCRenderTarget(const D2D1_RENDER_TARGET_PROPERTIES* renderTargetProperties);
                HWIN_EXPORT DeviceContextRenderTarget CreateDCRenderTarget(const D2D1_RENDER_TARGET_PROPERTIES& renderTargetProperties);
                HWIN_EXPORT DeviceContextRenderTarget CreateDCRenderTarget( );
    
            public:
            };


            class WriteFontFileStream;
            class WriteFontFileLoader : public Unknown
            {
            public:
                typedef Unknown Base;

                HARLINN_WINDOWS_GRAPHICS_STANDARD_METHODS_IMPL(WriteFontFileLoader,Unknown,IDWriteFontFileLoader,IUnknown)

                HWIN_EXPORT WriteFontFileLoader& CreateStreamFromKey(void const* fontFileReferenceKey,UINT32 fontFileReferenceKeySize,_Out_ IDWriteFontFileStream** fontFileStream);
                HWIN_EXPORT WriteFontFileStream CreateStreamFromKey(void const* fontFileReferenceKey,UINT32 fontFileReferenceKeySize);
            };

            class WriteLocalFontFileLoader : public WriteFontFileLoader
            {
            public:
                typedef WriteFontFileLoader Base;

                HARLINN_WINDOWS_GRAPHICS_STANDARD_METHODS_IMPL(WriteLocalFontFileLoader,WriteFontFileLoader,IDWriteLocalFontFileLoader,IDWriteFontFileLoader)

                HWIN_EXPORT WriteLocalFontFileLoader& GetFilePathLengthFromKey(void const* fontFileReferenceKey,UINT32 fontFileReferenceKeySize,_Out_ UINT32* filePathLength);
                HWIN_EXPORT UINT32 GetFilePathLengthFromKey(void const* fontFileReferenceKey,UINT32 fontFileReferenceKeySize);

                HWIN_EXPORT WriteLocalFontFileLoader& GetFilePathFromKey(void const* fontFileReferenceKey,UINT32 fontFileReferenceKeySize, WCHAR* filePath,UINT32 filePathSize);
                HWIN_EXPORT std::shared_ptr<String> GetFilePathFromKey(void const* fontFileReferenceKey,UINT32 fontFileReferenceKeySize);

                HWIN_EXPORT WriteLocalFontFileLoader& GetLastWriteTimeFromKey(void const* fontFileReferenceKey,UINT32 fontFileReferenceKeySize,_Out_ FILETIME* lastWriteTime);
                HWIN_EXPORT FILETIME GetLastWriteTimeFromKey(void const* fontFileReferenceKey,UINT32 fontFileReferenceKeySize);
            };

            class WriteFontFileStream : public Unknown
            {
            public:
                typedef Unknown Base;

                HARLINN_WINDOWS_GRAPHICS_STANDARD_METHODS_IMPL(WriteFontFileStream,Unknown,IDWriteFontFileStream,IUnknown)

                HWIN_EXPORT WriteFontFileStream& ReadFileFragment(void const** fragmentStart,UINT64 fileOffset,UINT64 fragmentSize,_Out_ void** fragmentContext);
                HWIN_EXPORT WriteFontFileStream& ReleaseFileFragment(void* fragmentContext);

                HWIN_EXPORT WriteFontFileStream& GetFileSize(_Out_ UINT64* fileSize);
                HWIN_EXPORT UINT64 GetFileSize( );

                HWIN_EXPORT WriteFontFileStream& GetLastWriteTime(_Out_ UINT64* lastWriteTime);
                HWIN_EXPORT UINT64 GetLastWriteTime();
            };


            class WriteFontFile : public Unknown
            {
            public:
                typedef Unknown Base;

                HARLINN_WINDOWS_GRAPHICS_STANDARD_METHODS_IMPL(WriteFontFile,Unknown,IDWriteFontFile,IUnknown)

                HWIN_EXPORT WriteFontFile& GetReferenceKey(void const** fontFileReferenceKey,_Out_ UINT32* fontFileReferenceKeySize);
                HWIN_EXPORT WriteFontFile& GetLoader(_Out_ IDWriteFontFileLoader** fontFileLoader);
                HWIN_EXPORT WriteFontFileLoader GetLoader( );
                HWIN_EXPORT WriteFontFile& Analyze(_Out_ BOOL* isSupportedFontType,_Out_ DWRITE_FONT_FILE_TYPE* fontFileType, _Out_opt_ DWRITE_FONT_FACE_TYPE* fontFaceType, _Out_ UINT32* numberOfFaces);
                HWIN_EXPORT WriteFontFile& Analyze(_Out_ BOOL& isSupportedFontType,_Out_ DWRITE_FONT_FILE_TYPE& fontFileType, _Out_opt_ DWRITE_FONT_FACE_TYPE& fontFaceType, _Out_ UINT32& numberOfFaces);
                HWIN_EXPORT WriteFontFile& Analyze(_Out_ BOOL& isSupportedFontType,_Out_ DWRITE_FONT_FILE_TYPE& fontFileType, _Out_ UINT32& numberOfFaces);
            };


            class WriteRenderingParams : public Unknown
            {
            public:
                typedef Unknown Base;

                HARLINN_WINDOWS_GRAPHICS_STANDARD_METHODS_IMPL(WriteRenderingParams,Unknown,IDWriteRenderingParams,IUnknown)

                HWIN_EXPORT FLOAT GetGamma();
                HWIN_EXPORT FLOAT GetEnhancedContrast();
                HWIN_EXPORT FLOAT GetClearTypeLevel();
                HWIN_EXPORT DWRITE_PIXEL_GEOMETRY GetPixelGeometry();
                HWIN_EXPORT DWRITE_RENDERING_MODE GetRenderingMode();
            };



            class WriteFontFace : public Unknown
            {
            public:
                typedef Unknown Base;

                HARLINN_WINDOWS_GRAPHICS_STANDARD_METHODS_IMPL(WriteFontFace,Unknown,IDWriteFontFace,IUnknown)

                HWIN_EXPORT DWRITE_FONT_FACE_TYPE GetType();
                HWIN_EXPORT WriteFontFace& GetFiles(_Inout_ UINT32* numberOfFiles, IDWriteFontFile** fontFiles);
                HWIN_EXPORT UINT32 GetNumberOfFiles( );
                HWIN_EXPORT std::shared_ptr< std::vector<WriteFontFile> > GetFiles( );

                HWIN_EXPORT UINT32 GetIndex();
                HWIN_EXPORT DWRITE_FONT_SIMULATIONS GetSimulations();
                HWIN_EXPORT BOOL IsSymbolFont();
                HWIN_EXPORT WriteFontFace& GetMetrics(_Out_ DWRITE_FONT_METRICS* fontFaceMetrics);
                HWIN_EXPORT WriteFontFace& GetMetrics(_Out_ DWRITE_FONT_METRICS& fontFaceMetrics);
                HWIN_EXPORT UINT16 GetGlyphCount();
                HWIN_EXPORT WriteFontFace& GetDesignGlyphMetrics(UINT16 const* glyphIndices, UINT32 glyphCount, DWRITE_GLYPH_METRICS* glyphMetrics, BOOL isSideways = FALSE);
                HWIN_EXPORT WriteFontFace& GetGlyphIndices(UINT32 const* codePoints, UINT32 codePointCount, UINT16* glyphIndices);
                HWIN_EXPORT WriteFontFace& TryGetFontTable( _In_ UINT32 openTypeTableTag, const void** tableData, _Out_ UINT32* tableSize, _Out_ void** tableContext, _Out_ BOOL* exists);
                HWIN_EXPORT WriteFontFace& ReleaseFontTable(_In_ void* tableContext);
                HWIN_EXPORT WriteFontFace& GetGlyphRunOutline(FLOAT emSize, UINT16 const* glyphIndices, FLOAT const* glyphAdvances, DWRITE_GLYPH_OFFSET const* glyphOffsets, UINT32 glyphCount, BOOL isSideways, BOOL isRightToLeft, IDWriteGeometrySink* geometrySink);
                HWIN_EXPORT WriteFontFace& GetRecommendedRenderingMode(FLOAT emSize, FLOAT pixelsPerDip, DWRITE_MEASURING_MODE measuringMode, IDWriteRenderingParams* renderingParams, _Out_ DWRITE_RENDERING_MODE* renderingMode);
                HWIN_EXPORT DWRITE_RENDERING_MODE GetRecommendedRenderingMode(FLOAT emSize, FLOAT pixelsPerDip, DWRITE_MEASURING_MODE measuringMode, IDWriteRenderingParams* renderingParams);

                HWIN_EXPORT WriteFontFace& GetGdiCompatibleMetrics(FLOAT emSize,FLOAT pixelsPerDip,_In_opt_ DWRITE_MATRIX const* transform, _Out_ DWRITE_FONT_METRICS* fontFaceMetrics);
                HWIN_EXPORT WriteFontFace& GetGdiCompatibleGlyphMetrics( FLOAT emSize, FLOAT pixelsPerDip, _In_opt_ DWRITE_MATRIX const* transform, BOOL useGdiNatural, UINT16 const* glyphIndices, UINT32 glyphCount, DWRITE_GLYPH_METRICS* glyphMetrics, BOOL isSideways = FALSE);
            };

            class WriteFontFileEnumerator;
            class WriteFontCollectionLoader : public Unknown
            {
            public:
                typedef Unknown Base;

                HARLINN_WINDOWS_GRAPHICS_STANDARD_METHODS_IMPL(WriteFontCollectionLoader,Unknown,IDWriteFontCollectionLoader,IUnknown)

                HWIN_EXPORT WriteFontCollectionLoader& CreateEnumeratorFromKey(IDWriteFactory* factory,void const* collectionKey,UINT32 collectionKeySize, _Out_ IDWriteFontFileEnumerator** fontFileEnumerator);
                HWIN_EXPORT WriteFontFileEnumerator CreateEnumeratorFromKey(IDWriteFactory* factory,void const* collectionKey,UINT32 collectionKeySize);
            };

            class WriteFontFileEnumerator : public Unknown
            {
            public:
                typedef Unknown Base;

                HARLINN_WINDOWS_GRAPHICS_STANDARD_METHODS_IMPL(WriteFontFileEnumerator,Unknown,IDWriteFontFileEnumerator,IUnknown)

                HWIN_EXPORT WriteFontFileEnumerator& MoveNext(_Out_ BOOL* hasCurrentFile);
                HWIN_EXPORT bool MoveNext( );

                HWIN_EXPORT WriteFontFileEnumerator& GetCurrentFontFile(_Out_ IDWriteFontFile** fontFile);
                HWIN_EXPORT WriteFontFile GetCurrentFontFile();
            };


            class WriteLocalizedStrings : public Unknown
            {
            public:
                typedef Unknown Base;

                HARLINN_WINDOWS_GRAPHICS_STANDARD_METHODS_IMPL(WriteLocalizedStrings,Unknown,IDWriteLocalizedStrings,IUnknown)

                HWIN_EXPORT UINT32 GetCount();
                HWIN_EXPORT WriteLocalizedStrings& FindLocaleName(_In_z_ WCHAR const* localeName,_Out_ UINT32* index,_Out_ BOOL* exists);
                HWIN_EXPORT bool FindLocaleName(_In_z_ WCHAR const* localeName,_Out_ UINT32* index);

                HWIN_EXPORT WriteLocalizedStrings& GetLocaleNameLength(UINT32 index,_Out_ UINT32* length);
                HWIN_EXPORT UINT32 GetLocaleNameLength(UINT32 index);

                HWIN_EXPORT WriteLocalizedStrings& GetLocaleName(UINT32 index,WCHAR* localeName, UINT32 size);
                HWIN_EXPORT std::shared_ptr<String> GetLocaleName(UINT32 index);

                HWIN_EXPORT WriteLocalizedStrings& GetStringLength(UINT32 index,_Out_ UINT32* length);
                HWIN_EXPORT UINT32 GetStringLength(UINT32 index);

                HWIN_EXPORT WriteLocalizedStrings& GetString(UINT32 index,WCHAR* stringBuffer,UINT32 size);
                HWIN_EXPORT std::shared_ptr<String> GetString(UINT32 index);
            };

            class WriteFontFamily;
            class WriteFont;
            class WriteFontCollection : public Unknown
            {
            public:
                typedef Unknown Base;

                HARLINN_WINDOWS_GRAPHICS_STANDARD_METHODS_IMPL(WriteFontCollection,Unknown,IDWriteFontCollection,IUnknown)

                HWIN_EXPORT UINT32 GetFontFamilyCount();
                HWIN_EXPORT WriteFontCollection& GetFontFamily( UINT32 index, IDWriteFontFamily** fontFamily);
                HWIN_EXPORT WriteFontFamily GetFontFamily( UINT32 index );
                HWIN_EXPORT std::shared_ptr< std::vector<WriteFontFamily> > GetFontFamilies();

                HWIN_EXPORT WriteFontCollection& FindFamilyName(_In_z_ WCHAR const* familyName,_Out_ UINT32* index,_Out_ BOOL* exists);
                HWIN_EXPORT bool FindFamilyName(_In_z_ WCHAR const* familyName,_Out_ UINT32* index);

                HWIN_EXPORT WriteFontCollection& GetFontFromFontFace(IDWriteFontFace* fontFace,_Out_ IDWriteFont** font);
                HWIN_EXPORT WriteFont GetFontFromFontFace(IDWriteFontFace* fontFace);
            };

            class WriteFontList : public Unknown
            {
            public:
                typedef Unknown Base;

                HARLINN_WINDOWS_GRAPHICS_STANDARD_METHODS_IMPL(WriteFontList,Unknown,IDWriteFontList,IUnknown)

                HWIN_EXPORT WriteFontList& GetFontCollection(_Out_ IDWriteFontCollection** fontCollection);
                HWIN_EXPORT WriteFontCollection GetFontCollection( );
                HWIN_EXPORT UINT32 GetFontCount();
                HWIN_EXPORT WriteFontList& GetFont(UINT32 index, _Out_ IDWriteFont** font);
                HWIN_EXPORT WriteFont GetFont(UINT32 index);
            };


            class WriteFontFamily : public WriteFontList
            {
            public:
                typedef WriteFontList Base;

                HARLINN_WINDOWS_GRAPHICS_STANDARD_METHODS_IMPL(WriteFontFamily,WriteFontList,IDWriteFontFamily,IDWriteFontList)

                HWIN_EXPORT WriteFontFamily& GetFamilyNames(_Out_ IDWriteLocalizedStrings** names);
                HWIN_EXPORT WriteLocalizedStrings GetFamilyNames( );

                HWIN_EXPORT WriteFontFamily& GetFirstMatchingFont(DWRITE_FONT_WEIGHT  weight,DWRITE_FONT_STRETCH stretch,DWRITE_FONT_STYLE style,_Out_ IDWriteFont** matchingFont);
                HWIN_EXPORT WriteFont GetFirstMatchingFont(DWRITE_FONT_WEIGHT  weight,DWRITE_FONT_STRETCH stretch,DWRITE_FONT_STYLE style);

                HWIN_EXPORT WriteFontFamily& GetMatchingFonts(DWRITE_FONT_WEIGHT weight,DWRITE_FONT_STRETCH stretch,DWRITE_FONT_STYLE style,_Out_ IDWriteFontList** matchingFonts);
                HWIN_EXPORT WriteFontList GetMatchingFonts(DWRITE_FONT_WEIGHT weight,DWRITE_FONT_STRETCH stretch,DWRITE_FONT_STYLE style);
            };


            class WriteFont : public Unknown
            {
            public:
                typedef Unknown Base;

                HARLINN_WINDOWS_GRAPHICS_STANDARD_METHODS_IMPL(WriteFont,Unknown,IDWriteFont,IUnknown)

                HWIN_EXPORT WriteFont& GetFontFamily(_Out_ IDWriteFontFamily** fontFamily);
                HWIN_EXPORT WriteFontFamily GetFontFamily( );
                HWIN_EXPORT DWRITE_FONT_WEIGHT GetWeight();
                HWIN_EXPORT DWRITE_FONT_STRETCH GetStretch();
                HWIN_EXPORT DWRITE_FONT_STYLE GetStyle();
                HWIN_EXPORT bool IsSymbolFont();
                HWIN_EXPORT WriteFont& GetFaceNames(_Out_ IDWriteLocalizedStrings** names);
                HWIN_EXPORT WriteLocalizedStrings GetFaceNames();
                HWIN_EXPORT WriteFont& GetInformationalStrings(DWRITE_INFORMATIONAL_STRING_ID informationalStringID,_Out_ IDWriteLocalizedStrings** informationalStrings,_Out_ BOOL* exists);
                HWIN_EXPORT DWRITE_FONT_SIMULATIONS GetSimulations();
                HWIN_EXPORT WriteFont& GetMetrics(_Out_ DWRITE_FONT_METRICS* fontMetrics);
                HWIN_EXPORT WriteFont& HasCharacter(UINT32 unicodeValue,_Out_ BOOL* exists);
                HWIN_EXPORT bool HasCharacter(UINT32 unicodeValue);
                HWIN_EXPORT WriteFont& CreateFontFace(_Out_ IDWriteFontFace** fontFace);
                HWIN_EXPORT WriteFontFace CreateFontFace( );
            };


            class WriteInlineObject;
            class WriteTextFormat : public Unknown
            {
            public:
                typedef Unknown Base;

                HARLINN_WINDOWS_GRAPHICS_STANDARD_METHODS_IMPL(WriteTextFormat,Unknown,IDWriteTextFormat,IUnknown)

                HWIN_EXPORT WriteTextFormat& SetTextAlignment(DWRITE_TEXT_ALIGNMENT textAlignment);
                HWIN_EXPORT WriteTextFormat& SetParagraphAlignment(DWRITE_PARAGRAPH_ALIGNMENT paragraphAlignment);
                HWIN_EXPORT WriteTextFormat& SetWordWrapping(DWRITE_WORD_WRAPPING wordWrapping);
                HWIN_EXPORT WriteTextFormat& SetReadingDirection(DWRITE_READING_DIRECTION readingDirection);
                HWIN_EXPORT WriteTextFormat& SetFlowDirection(DWRITE_FLOW_DIRECTION flowDirection);
                HWIN_EXPORT WriteTextFormat& SetIncrementalTabStop(FLOAT incrementalTabStop);
                HWIN_EXPORT WriteTextFormat& SetTrimming(_In_ DWRITE_TRIMMING const* trimmingOptions,IDWriteInlineObject* trimmingSign);
                HWIN_EXPORT WriteTextFormat& SetLineSpacing(DWRITE_LINE_SPACING_METHOD lineSpacingMethod,FLOAT lineSpacing,FLOAT baseline);
                HWIN_EXPORT DWRITE_TEXT_ALIGNMENT GetTextAlignment();
                HWIN_EXPORT DWRITE_PARAGRAPH_ALIGNMENT GetParagraphAlignment();
                HWIN_EXPORT DWRITE_WORD_WRAPPING GetWordWrapping();
                HWIN_EXPORT DWRITE_READING_DIRECTION GetReadingDirection();
                HWIN_EXPORT DWRITE_FLOW_DIRECTION GetFlowDirection();
                HWIN_EXPORT FLOAT GetIncrementalTabStop();
                HWIN_EXPORT WriteTextFormat& GetTrimming(_Out_ DWRITE_TRIMMING* trimmingOptions,_Out_ IDWriteInlineObject** trimmingSign);
                HWIN_EXPORT WriteInlineObject GetTrimming(_Out_ DWRITE_TRIMMING& trimmingOptions);
                HWIN_EXPORT WriteTextFormat& GetLineSpacing(_Out_ DWRITE_LINE_SPACING_METHOD* lineSpacingMethod,_Out_ FLOAT* lineSpacing,_Out_ FLOAT* baseline);
                HWIN_EXPORT WriteTextFormat& GetFontCollection(_Out_ IDWriteFontCollection** fontCollection);
                HWIN_EXPORT WriteFontCollection GetFontCollection( );
                HWIN_EXPORT UINT32 GetFontFamilyNameLength();
                HWIN_EXPORT WriteTextFormat& GetFontFamilyName(WCHAR* fontFamilyName,UINT32 nameSize);
                HWIN_EXPORT std::shared_ptr<String> GetFontFamilyName( );
                HWIN_EXPORT DWRITE_FONT_WEIGHT GetFontWeight();
                HWIN_EXPORT DWRITE_FONT_STYLE GetFontStyle();
                HWIN_EXPORT DWRITE_FONT_STRETCH GetFontStretch();
                HWIN_EXPORT FLOAT GetFontSize();
                HWIN_EXPORT UINT32 GetLocaleNameLength();
                HWIN_EXPORT WriteTextFormat& GetLocaleName(WCHAR* localeName,UINT32 nameSize);
                HWIN_EXPORT std::shared_ptr<String> GetLocaleName( );
            };


            class WriteTypography : public Unknown
            {
            public:
                typedef Unknown Base;

                HARLINN_WINDOWS_GRAPHICS_STANDARD_METHODS_IMPL(WriteTypography,Unknown,IDWriteTypography,IUnknown)

                HWIN_EXPORT WriteTypography& AddFontFeature(DWRITE_FONT_FEATURE fontFeature);
                HWIN_EXPORT WriteTypography& AddFontFeatures(std::shared_ptr< std::vector<DWRITE_FONT_FEATURE> > fontFeatures);
                HWIN_EXPORT UINT32 GetFontFeatureCount();
                HWIN_EXPORT WriteTypography& GetFontFeature(UINT32 fontFeatureIndex,_Out_ DWRITE_FONT_FEATURE* fontFeature);
                HWIN_EXPORT DWRITE_FONT_FEATURE GetFontFeature(UINT32 fontFeatureIndex);
                HWIN_EXPORT std::shared_ptr< std::vector<DWRITE_FONT_FEATURE> > GetFontFeatures( );
            };


            class WriteTextAnalysisSource : public Unknown
            {
            public:
                typedef Unknown Base;

                HARLINN_WINDOWS_GRAPHICS_STANDARD_METHODS_IMPL(WriteTextAnalysisSource,Unknown,IDWriteTextAnalysisSource,IUnknown)

                HWIN_EXPORT WriteTextAnalysisSource& GetTextAtPosition(UINT32 textPosition,WCHAR const** textString,_Out_ UINT32* textLength);
                HWIN_EXPORT WriteTextAnalysisSource& GetTextBeforePosition(UINT32 textPosition,WCHAR const** textString,_Out_ UINT32* textLength);
                HWIN_EXPORT DWRITE_READING_DIRECTION GetParagraphReadingDirection();
                HWIN_EXPORT WriteTextAnalysisSource& GetLocaleName(UINT32 textPosition,_Out_ UINT32* textLength, _Outptr_result_z_ WCHAR const** localeName);
                HWIN_EXPORT WriteTextAnalysisSource& GetNumberSubstitution(UINT32 textPosition,_Out_ UINT32* textLength,_Outptr_ IDWriteNumberSubstitution** numberSubstitution);
            };


            class WriteTextAnalysisSink : public Unknown
            {
            public:
                typedef Unknown Base;

                HARLINN_WINDOWS_GRAPHICS_STANDARD_METHODS_IMPL(WriteTextAnalysisSink,Unknown,IDWriteTextAnalysisSink,IUnknown)

                HWIN_EXPORT WriteTextAnalysisSink& SetScriptAnalysis(UINT32 textPosition,UINT32 textLength,_In_ DWRITE_SCRIPT_ANALYSIS const* scriptAnalysis);
                HWIN_EXPORT WriteTextAnalysisSink& SetLineBreakpoints(UINT32 textPosition,UINT32 textLength,DWRITE_LINE_BREAKPOINT const* lineBreakpoints);
                HWIN_EXPORT WriteTextAnalysisSink& SetBidiLevel(UINT32 textPosition,UINT32 textLength,UINT8 explicitLevel,UINT8 resolvedLevel);
                HWIN_EXPORT WriteTextAnalysisSink& SetNumberSubstitution(UINT32 textPosition,UINT32 textLength,_In_ IDWriteNumberSubstitution* numberSubstitution);
            };

            class WriteTextAnalyzer : public Unknown
            {
            public:
                typedef Unknown Base;

                HARLINN_WINDOWS_GRAPHICS_STANDARD_METHODS_IMPL(WriteTextAnalyzer,Unknown,IDWriteTextAnalyzer,IUnknown)

                HWIN_EXPORT WriteTextAnalyzer& AnalyzeScript(
                    IDWriteTextAnalysisSource* analysisSource,
                    UINT32 textPosition,
                    UINT32 textLength,
                    IDWriteTextAnalysisSink* analysisSink);

                HWIN_EXPORT WriteTextAnalyzer& AnalyzeBidi(
                    IDWriteTextAnalysisSource* analysisSource,
                    UINT32 textPosition,
                    UINT32 textLength,
                    IDWriteTextAnalysisSink* analysisSink);

                HWIN_EXPORT WriteTextAnalyzer& AnalyzeNumberSubstitution(
                    IDWriteTextAnalysisSource* analysisSource,
                    UINT32 textPosition,
                    UINT32 textLength,
                    IDWriteTextAnalysisSink* analysisSink);

                HWIN_EXPORT WriteTextAnalyzer& AnalyzeLineBreakpoints(
                    IDWriteTextAnalysisSource* analysisSource,
                    UINT32 textPosition,
                    UINT32 textLength,
                    IDWriteTextAnalysisSink* analysisSink);

                HWIN_EXPORT WriteTextAnalyzer& GetGlyphs(
                    WCHAR const* textString,
                    UINT32 textLength,
                    IDWriteFontFace* fontFace,
                    BOOL isSideways,
                    BOOL isRightToLeft,
                    _In_ DWRITE_SCRIPT_ANALYSIS const* scriptAnalysis,
                    _In_opt_z_ WCHAR const* localeName,
                    _In_opt_ IDWriteNumberSubstitution* numberSubstitution,
                    DWRITE_TYPOGRAPHIC_FEATURES const** features,
                    UINT32 const* featureRangeLengths,
                    UINT32 featureRanges,
                    UINT32 maxGlyphCount,
                    UINT16* clusterMap,
                    DWRITE_SHAPING_TEXT_PROPERTIES* textProps,
                    UINT16* glyphIndices,
                    DWRITE_SHAPING_GLYPH_PROPERTIES* glyphProps,
                    _Out_ UINT32* actualGlyphCount);

                HWIN_EXPORT WriteTextAnalyzer& GetGlyphPlacements(
                    WCHAR const* textString,
                    UINT16 const* clusterMap,
                    DWRITE_SHAPING_TEXT_PROPERTIES* textProps,
                    UINT32 textLength,
                    UINT16 const* glyphIndices,
                    DWRITE_SHAPING_GLYPH_PROPERTIES const* glyphProps,
                    UINT32 glyphCount,
                    IDWriteFontFace * fontFace,
                    FLOAT fontEmSize,
                    BOOL isSideways,
                    BOOL isRightToLeft,
                    _In_ DWRITE_SCRIPT_ANALYSIS const* scriptAnalysis,
                    _In_opt_z_ WCHAR const* localeName,
                    DWRITE_TYPOGRAPHIC_FEATURES const** features,
                    UINT32 const* featureRangeLengths,
                    UINT32 featureRanges,
                    FLOAT* glyphAdvances,
                    DWRITE_GLYPH_OFFSET* glyphOffsets);

                HWIN_EXPORT WriteTextAnalyzer& GetGdiCompatibleGlyphPlacements(
                    WCHAR const* textString,
                    UINT16 const* clusterMap,
                    DWRITE_SHAPING_TEXT_PROPERTIES* textProps,
                    UINT32 textLength,
                    UINT16 const* glyphIndices,
                    DWRITE_SHAPING_GLYPH_PROPERTIES const* glyphProps,
                    UINT32 glyphCount,
                    IDWriteFontFace * fontFace,
                    FLOAT fontEmSize,
                    FLOAT pixelsPerDip,
                    _In_opt_ DWRITE_MATRIX const* transform,
                    BOOL useGdiNatural,
                    BOOL isSideways,
                    BOOL isRightToLeft,
                    _In_ DWRITE_SCRIPT_ANALYSIS const* scriptAnalysis,
                    _In_opt_z_ WCHAR const* localeName,
                    DWRITE_TYPOGRAPHIC_FEATURES const** features,
                    UINT32 const* featureRangeLengths,
                    UINT32 featureRanges,
                    FLOAT* glyphAdvances,
                    DWRITE_GLYPH_OFFSET* glyphOffsets);
            };

            class WriteInlineObject : public Unknown
            {
            public:
                typedef Unknown Base;

                HARLINN_WINDOWS_GRAPHICS_STANDARD_METHODS_IMPL(WriteInlineObject,Unknown,IDWriteInlineObject,IUnknown)

                HWIN_EXPORT WriteInlineObject& Draw(_In_opt_ void* clientDrawingContext,IDWriteTextRenderer* renderer,FLOAT originX,FLOAT originY,BOOL isSideways,BOOL isRightToLeft,_In_opt_ IUnknown* clientDrawingEffect);

                HWIN_EXPORT WriteInlineObject& GetMetrics(_Out_ DWRITE_INLINE_OBJECT_METRICS* metrics);

                HWIN_EXPORT WriteInlineObject& GetOverhangMetrics(_Out_ DWRITE_OVERHANG_METRICS* overhangs);

                HWIN_EXPORT WriteInlineObject& GetBreakConditions(_Out_ DWRITE_BREAK_CONDITION* breakConditionBefore,_Out_ DWRITE_BREAK_CONDITION* breakConditionAfter);
            };

            class WritePixelSnapping : public Unknown
            {
            public:
                typedef Unknown Base;

                HARLINN_WINDOWS_GRAPHICS_STANDARD_METHODS_IMPL(WritePixelSnapping,Unknown,IDWritePixelSnapping,IUnknown)

                HWIN_EXPORT WritePixelSnapping& IsPixelSnappingDisabled(_In_opt_ void* clientDrawingContext,_Out_ BOOL* isDisabled);

                HWIN_EXPORT WritePixelSnapping& GetCurrentTransform(_In_opt_ void* clientDrawingContext,_Out_ DWRITE_MATRIX* transform);

                HWIN_EXPORT WritePixelSnapping& GetPixelsPerDip(_In_opt_ void* clientDrawingContext,_Out_ FLOAT* pixelsPerDip);
            };


            class WriteTextRenderer : public WritePixelSnapping
            {
            public:
                typedef WritePixelSnapping Base;

                HARLINN_WINDOWS_GRAPHICS_STANDARD_METHODS_IMPL(WriteTextRenderer,WritePixelSnapping,IDWriteTextRenderer,IDWritePixelSnapping)

                HWIN_EXPORT WriteTextRenderer& DrawGlyphRun(_In_opt_ void* clientDrawingContext,FLOAT baselineOriginX,FLOAT baselineOriginY,DWRITE_MEASURING_MODE measuringMode,_In_ DWRITE_GLYPH_RUN const* glyphRun,_In_ DWRITE_GLYPH_RUN_DESCRIPTION const* glyphRunDescription,_In_opt_ IUnknown* clientDrawingEffect);

                HWIN_EXPORT WriteTextRenderer& DrawUnderline(_In_opt_ void* clientDrawingContext,FLOAT baselineOriginX,FLOAT baselineOriginY,_In_ DWRITE_UNDERLINE const* underline,_In_opt_ IUnknown* clientDrawingEffect);

                HWIN_EXPORT WriteTextRenderer& DrawStrikethrough(_In_opt_ void* clientDrawingContext,FLOAT baselineOriginX,FLOAT baselineOriginY,_In_ DWRITE_STRIKETHROUGH const* strikethrough,_In_opt_ IUnknown* clientDrawingEffect);

                HWIN_EXPORT WriteTextRenderer& DrawInlineObject(_In_opt_ void* clientDrawingContext,FLOAT originX,FLOAT originY,IDWriteInlineObject* inlineObject,BOOL isSideways,BOOL isRightToLeft,_In_opt_ IUnknown* clientDrawingEffect);
            };


            class WriteTextLayout : public WriteTextFormat
            {
            public:
                typedef Unknown Base;

                HARLINN_WINDOWS_GRAPHICS_STANDARD_METHODS_IMPL(WriteTextLayout,WriteTextFormat,IDWriteTextLayout,IDWriteTextFormat)

                HWIN_EXPORT WriteTextLayout& SetMaxWidth(FLOAT maxWidth);
                HWIN_EXPORT WriteTextLayout& SetMaxHeight(FLOAT maxHeight);

                HWIN_EXPORT WriteTextLayout& SetFontCollection(IDWriteFontCollection* fontCollection,DWRITE_TEXT_RANGE textRange);

                HWIN_EXPORT WriteTextLayout& SetFontFamilyName(_In_z_ WCHAR const* fontFamilyName,DWRITE_TEXT_RANGE textRange);

                HWIN_EXPORT WriteTextLayout& SetFontWeight(DWRITE_FONT_WEIGHT fontWeight,DWRITE_TEXT_RANGE textRange);

                HWIN_EXPORT WriteTextLayout& SetFontStyle(DWRITE_FONT_STYLE fontStyle,DWRITE_TEXT_RANGE textRange);

                HWIN_EXPORT WriteTextLayout& SetFontStretch(DWRITE_FONT_STRETCH fontStretch,DWRITE_TEXT_RANGE textRange);

                HWIN_EXPORT WriteTextLayout& SetFontSize(FLOAT fontSize,DWRITE_TEXT_RANGE textRange);

                HWIN_EXPORT WriteTextLayout& SetUnderline(BOOL hasUnderline,DWRITE_TEXT_RANGE textRange);

                HWIN_EXPORT WriteTextLayout& SetStrikethrough(BOOL hasStrikethrough,DWRITE_TEXT_RANGE textRange);

                HWIN_EXPORT WriteTextLayout& SetDrawingEffect(IUnknown* drawingEffect,DWRITE_TEXT_RANGE textRange);

                HWIN_EXPORT WriteTextLayout& SetInlineObject(IDWriteInlineObject* inlineObject,DWRITE_TEXT_RANGE textRange);

                HWIN_EXPORT WriteTextLayout& SetTypography(IDWriteTypography* typography,DWRITE_TEXT_RANGE textRange);

                HWIN_EXPORT WriteTextLayout& SetLocaleName(_In_z_ WCHAR const* localeName,DWRITE_TEXT_RANGE textRange);

                HWIN_EXPORT FLOAT GetMaxWidth();

                HWIN_EXPORT FLOAT GetMaxHeight();

                HWIN_EXPORT WriteTextLayout& GetFontCollection(UINT32 currentPosition,_Out_ IDWriteFontCollection** fontCollection,_Out_opt_ DWRITE_TEXT_RANGE* textRange = NULL);

                HWIN_EXPORT WriteTextLayout& GetFontFamilyNameLength(UINT32 currentPosition,_Out_ UINT32* nameLength,_Out_opt_ DWRITE_TEXT_RANGE* textRange = NULL);

                HWIN_EXPORT WriteTextLayout& GetFontFamilyName(UINT32 currentPosition,_Out_writes_z_(nameSize) WCHAR* fontFamilyName,UINT32 nameSize,_Out_opt_ DWRITE_TEXT_RANGE* textRange = NULL);

                HWIN_EXPORT WriteTextLayout& GetFontWeight(UINT32 currentPosition,_Out_ DWRITE_FONT_WEIGHT* fontWeight,_Out_opt_ DWRITE_TEXT_RANGE* textRange = NULL);

                HWIN_EXPORT WriteTextLayout& GetFontStyle(UINT32 currentPosition,_Out_ DWRITE_FONT_STYLE* fontStyle,_Out_opt_ DWRITE_TEXT_RANGE* textRange = NULL);

                HWIN_EXPORT WriteTextLayout& GetFontStretch(UINT32 currentPosition,_Out_ DWRITE_FONT_STRETCH* fontStretch,_Out_opt_ DWRITE_TEXT_RANGE* textRange = NULL);

                HWIN_EXPORT WriteTextLayout& GetFontSize(UINT32 currentPosition,_Out_ FLOAT* fontSize,_Out_opt_ DWRITE_TEXT_RANGE* textRange = NULL);

                HWIN_EXPORT WriteTextLayout& GetUnderline(UINT32 currentPosition,_Out_ BOOL* hasUnderline,_Out_opt_ DWRITE_TEXT_RANGE* textRange = NULL);

                HWIN_EXPORT WriteTextLayout& GetStrikethrough(UINT32 currentPosition,_Out_ BOOL* hasStrikethrough,_Out_opt_ DWRITE_TEXT_RANGE* textRange = NULL);

                HWIN_EXPORT WriteTextLayout& GetDrawingEffect(UINT32 currentPosition,_Out_ IUnknown** drawingEffect,_Out_opt_ DWRITE_TEXT_RANGE* textRange = NULL);

                HWIN_EXPORT WriteTextLayout& GetInlineObject(UINT32 currentPosition,_Out_ IDWriteInlineObject** inlineObject,_Out_opt_ DWRITE_TEXT_RANGE* textRange = NULL);

                HWIN_EXPORT WriteTextLayout& GetTypography(UINT32 currentPosition,_Out_ IDWriteTypography** typography,_Out_opt_ DWRITE_TEXT_RANGE* textRange = NULL);

                HWIN_EXPORT WriteTextLayout& GetLocaleNameLength(UINT32 currentPosition,_Out_ UINT32* nameLength,_Out_opt_ DWRITE_TEXT_RANGE* textRange = NULL);

                HWIN_EXPORT WriteTextLayout& GetLocaleName(UINT32 currentPosition,_Out_writes_z_(nameSize) WCHAR* localeName,UINT32 nameSize,_Out_opt_ DWRITE_TEXT_RANGE* textRange = NULL);

                HWIN_EXPORT WriteTextLayout& Draw(_In_opt_ void* clientDrawingContext,IDWriteTextRenderer* renderer,FLOAT originX,FLOAT originY);

                HWIN_EXPORT WriteTextLayout& GetLineMetrics(DWRITE_LINE_METRICS* lineMetrics,UINT32 maxLineCount,_Out_ UINT32* actualLineCount);

                HWIN_EXPORT WriteTextLayout& GetMetrics(_Out_ DWRITE_TEXT_METRICS* textMetrics);

                HWIN_EXPORT WriteTextLayout& GetOverhangMetrics(_Out_ DWRITE_OVERHANG_METRICS* overhangs);

                HWIN_EXPORT WriteTextLayout& GetClusterMetrics(_Out_writes_opt_(maxClusterCount) DWRITE_CLUSTER_METRICS* clusterMetrics,UINT32 maxClusterCount,_Out_ UINT32* actualClusterCount);

                HWIN_EXPORT WriteTextLayout& DetermineMinWidth(_Out_ FLOAT* minWidth);

                HWIN_EXPORT WriteTextLayout& HitTestPoint(FLOAT pointX,FLOAT pointY,_Out_ BOOL* isTrailingHit,_Out_ BOOL* isInside,_Out_ DWRITE_HIT_TEST_METRICS* hitTestMetrics);

                HWIN_EXPORT WriteTextLayout& HitTestTextPosition(UINT32 textPosition,BOOL isTrailingHit,_Out_ FLOAT* pointX,_Out_ FLOAT* pointY,_Out_ DWRITE_HIT_TEST_METRICS* hitTestMetrics);

                HWIN_EXPORT WriteTextLayout& HitTestTextRange(UINT32 textPosition,UINT32 textLength,FLOAT originX,FLOAT originY,DWRITE_HIT_TEST_METRICS* hitTestMetrics,UINT32 maxHitTestMetricsCount,_Out_ UINT32* actualHitTestMetricsCount);
            };


            class WriteBitmapRenderTarget : public Unknown
            {
            public:
                typedef Unknown Base;

                HARLINN_WINDOWS_GRAPHICS_STANDARD_METHODS_IMPL(WriteBitmapRenderTarget,Unknown,IDWriteBitmapRenderTarget,IUnknown)

                HWIN_EXPORT WriteBitmapRenderTarget& DrawGlyphRun(FLOAT baselineOriginX,FLOAT baselineOriginY,DWRITE_MEASURING_MODE measuringMode,_In_ DWRITE_GLYPH_RUN const* glyphRun,IDWriteRenderingParams* renderingParams,COLORREF textColor,_Out_opt_ RECT* blackBoxRect = NULL);

                HWIN_EXPORT HDC GetMemoryDC();

                HWIN_EXPORT FLOAT GetPixelsPerDip();

                HWIN_EXPORT WriteBitmapRenderTarget& SetPixelsPerDip(FLOAT pixelsPerDip);

                HWIN_EXPORT WriteBitmapRenderTarget& GetCurrentTransform(_Out_ DWRITE_MATRIX* transform);

                HWIN_EXPORT WriteBitmapRenderTarget& SetCurrentTransform(_In_opt_ DWRITE_MATRIX const* transform);

                HWIN_EXPORT WriteBitmapRenderTarget& GetSize(_Out_ SIZE* size);

                HWIN_EXPORT WriteBitmapRenderTarget& Resize(UINT32 width,UINT32 height);
            };


            class WriteGdiInterop : public Unknown
            {
            public:
                typedef Unknown Base;

                HARLINN_WINDOWS_GRAPHICS_STANDARD_METHODS_IMPL(WriteGdiInterop,Unknown,IDWriteGdiInterop,IUnknown)

                HWIN_EXPORT WriteGdiInterop& CreateFontFromLOGFONT(_In_ LOGFONTW const* logFont,_Out_ IDWriteFont** font);

                HWIN_EXPORT WriteGdiInterop& ConvertFontToLOGFONT(IDWriteFont* font,_Out_ LOGFONTW* logFont,_Out_ BOOL* isSystemFont);

                HWIN_EXPORT WriteGdiInterop& ConvertFontFaceToLOGFONT(IDWriteFontFace* font,_Out_ LOGFONTW* logFont);

                HWIN_EXPORT WriteGdiInterop& CreateFontFaceFromHdc(HDC hdc,_Out_ IDWriteFontFace** fontFace);

                HWIN_EXPORT WriteGdiInterop& CreateBitmapRenderTarget(_In_opt_ HDC hdc,UINT32 width,UINT32 height,_Out_ IDWriteBitmapRenderTarget** renderTarget);
            };


            class WriteGlyphRunAnalysis : public Unknown
            {
            public:
                typedef Unknown Base;

                HARLINN_WINDOWS_GRAPHICS_STANDARD_METHODS_IMPL(WriteGlyphRunAnalysis,Unknown,IDWriteGlyphRunAnalysis,IUnknown)

                HWIN_EXPORT WriteGlyphRunAnalysis& GetAlphaTextureBounds(DWRITE_TEXTURE_TYPE textureType,_Out_ RECT* textureBounds);

                HWIN_EXPORT WriteGlyphRunAnalysis& CreateAlphaTexture(DWRITE_TEXTURE_TYPE textureType,_In_ RECT const* textureBounds,BYTE* alphaValues, UINT32 bufferSize);

                HWIN_EXPORT WriteGlyphRunAnalysis& GetAlphaBlendParams(IDWriteRenderingParams* renderingParams,_Out_ FLOAT* blendGamma,_Out_ FLOAT* blendEnhancedContrast,_Out_ FLOAT* blendClearTypeLevel);
            };


            class WriteFactory : public Unknown
            {
            public:
                typedef Unknown Base;

                HARLINN_WINDOWS_GRAPHICS_STANDARD_METHODS_IMPL(WriteFactory,Unknown,IDWriteFactory,IUnknown)

                HWIN_EXPORT WriteFactory(DWRITE_FACTORY_TYPE factoryType);
                    
                HWIN_EXPORT WriteFactory& GetSystemFontCollection(_Out_ IDWriteFontCollection** fontCollection, BOOL checkForUpdates = FALSE);
                HWIN_EXPORT WriteFontCollection GetSystemFontCollection(bool checkForUpdates = false);

                HWIN_EXPORT WriteFactory& CreateCustomFontCollection( IDWriteFontCollectionLoader* collectionLoader, void const* collectionKey, UINT32 collectionKeySize, _Out_ IDWriteFontCollection** fontCollection);
                HWIN_EXPORT WriteFontCollection CreateCustomFontCollection( IDWriteFontCollectionLoader* collectionLoader, void const* collectionKey, UINT32 collectionKeySize);

                HWIN_EXPORT WriteFactory& RegisterFontCollectionLoader( IDWriteFontCollectionLoader* fontCollectionLoader);
                HWIN_EXPORT WriteFactory& UnregisterFontCollectionLoader(IDWriteFontCollectionLoader* fontCollectionLoader);

                HWIN_EXPORT WriteFactory& CreateFontFileReference(_In_z_ WCHAR const* filePath,_In_opt_ FILETIME const* lastWriteTime,_Out_ IDWriteFontFile** fontFile);
                HWIN_EXPORT WriteFontFile CreateFontFileReference(_In_z_ WCHAR const* filePath,_In_opt_ FILETIME const* lastWriteTime = nullptr);

                HWIN_EXPORT WriteFactory& CreateCustomFontFileReference(void const* fontFileReferenceKey, UINT32 fontFileReferenceKeySize, IDWriteFontFileLoader* fontFileLoader, _Out_ IDWriteFontFile** fontFile);
                HWIN_EXPORT WriteFontFile CreateCustomFontFileReference(void const* fontFileReferenceKey, UINT32 fontFileReferenceKeySize, IDWriteFontFileLoader* fontFileLoader);

                HWIN_EXPORT WriteFactory& CreateFontFace(DWRITE_FONT_FACE_TYPE fontFaceType,UINT32 numberOfFiles, IDWriteFontFile* const* fontFiles, UINT32 faceIndex, DWRITE_FONT_SIMULATIONS fontFaceSimulationFlags,_Out_ IDWriteFontFace** fontFace);
                HWIN_EXPORT WriteFontFace CreateFontFace(DWRITE_FONT_FACE_TYPE fontFaceType,UINT32 numberOfFiles, IDWriteFontFile* const* fontFiles, UINT32 faceIndex, DWRITE_FONT_SIMULATIONS fontFaceSimulationFlags);

                HWIN_EXPORT WriteFactory& CreateRenderingParams(_Out_ IDWriteRenderingParams** renderingParams);
                HWIN_EXPORT WriteRenderingParams CreateRenderingParams( );

                HWIN_EXPORT WriteFactory& CreateMonitorRenderingParams(HMONITOR monitor,_Out_ IDWriteRenderingParams** renderingParams);
                HWIN_EXPORT WriteRenderingParams CreateMonitorRenderingParams(HMONITOR monitor);

                HWIN_EXPORT WriteFactory& CreateCustomRenderingParams(FLOAT gamma,FLOAT enhancedContrast,FLOAT clearTypeLevel,DWRITE_PIXEL_GEOMETRY pixelGeometry,DWRITE_RENDERING_MODE renderingMode,_Out_ IDWriteRenderingParams** renderingParams);
                HWIN_EXPORT WriteRenderingParams CreateCustomRenderingParams(FLOAT gamma,FLOAT enhancedContrast,FLOAT clearTypeLevel,DWRITE_PIXEL_GEOMETRY pixelGeometry,DWRITE_RENDERING_MODE renderingMode);

                HWIN_EXPORT WriteFactory& RegisterFontFileLoader(IDWriteFontFileLoader* fontFileLoader);
                HWIN_EXPORT WriteFactory& UnregisterFontFileLoader(IDWriteFontFileLoader* fontFileLoader);

                HWIN_EXPORT WriteFactory& CreateTextFormat(_In_z_ WCHAR const* fontFamilyName, _In_opt_ IDWriteFontCollection* fontCollection, DWRITE_FONT_WEIGHT fontWeight, DWRITE_FONT_STYLE fontStyle, DWRITE_FONT_STRETCH fontStretch, FLOAT fontSize,_In_z_ WCHAR const* localeName,_Out_ IDWriteTextFormat** textFormat);
                HWIN_EXPORT WriteTextFormat CreateTextFormat(_In_z_ WCHAR const* fontFamilyName, _In_opt_ IDWriteFontCollection* fontCollection, DWRITE_FONT_WEIGHT fontWeight, DWRITE_FONT_STYLE fontStyle, DWRITE_FONT_STRETCH fontStretch, FLOAT fontSize,_In_z_ WCHAR const* localeName);
                HWIN_EXPORT WriteTextFormat CreateTextFormat(_In_z_ WCHAR const* fontFamilyName, FLOAT fontSize);

                HWIN_EXPORT WriteFactory& CreateTypography(_Out_ IDWriteTypography** typography);
                HWIN_EXPORT WriteTypography CreateTypography();

                HWIN_EXPORT WriteFactory& GetGdiInterop(_Out_ IDWriteGdiInterop** gdiInterop);
                HWIN_EXPORT WriteGdiInterop GetGdiInterop();

                HWIN_EXPORT WriteFactory& CreateTextLayout(WCHAR const* string, UINT32 stringLength, IDWriteTextFormat* textFormat,FLOAT maxWidth, FLOAT maxHeight,_Out_ IDWriteTextLayout** textLayout);
                HWIN_EXPORT WriteTextLayout CreateTextLayout(WCHAR const* string, UINT32 stringLength, IDWriteTextFormat* textFormat,FLOAT maxWidth, FLOAT maxHeight);

                HWIN_EXPORT WriteFactory& CreateGdiCompatibleTextLayout(WCHAR const* string, UINT32 stringLength, IDWriteTextFormat* textFormat, FLOAT layoutWidth, FLOAT layoutHeight, FLOAT pixelsPerDip,_In_opt_ DWRITE_MATRIX const* transform, BOOL useGdiNatural, _Out_ IDWriteTextLayout** textLayout);
                HWIN_EXPORT WriteTextLayout CreateGdiCompatibleTextLayout(WCHAR const* string, UINT32 stringLength, IDWriteTextFormat* textFormat, FLOAT layoutWidth, FLOAT layoutHeight, FLOAT pixelsPerDip,_In_opt_ DWRITE_MATRIX const* transform, BOOL useGdiNatural);

                HWIN_EXPORT WriteFactory& CreateEllipsisTrimmingSign( IDWriteTextFormat* textFormat,_Out_ IDWriteInlineObject** trimmingSign);
                HWIN_EXPORT WriteInlineObject CreateEllipsisTrimmingSign( IDWriteTextFormat* textFormat);

                HWIN_EXPORT WriteFactory& CreateTextAnalyzer(_Out_ IDWriteTextAnalyzer** textAnalyzer);
                HWIN_EXPORT WriteTextAnalyzer CreateTextAnalyzer( );

                HWIN_EXPORT WriteFactory& CreateNumberSubstitution(_In_ DWRITE_NUMBER_SUBSTITUTION_METHOD substitutionMethod, _In_z_ WCHAR const* localeName, _In_ BOOL ignoreUserOverride, _Out_ IDWriteNumberSubstitution** numberSubstitution);

                HWIN_EXPORT WriteFactory& CreateGlyphRunAnalysis(_In_ DWRITE_GLYPH_RUN const* glyphRun,FLOAT pixelsPerDip,_In_opt_ DWRITE_MATRIX const* transform, DWRITE_RENDERING_MODE renderingMode, DWRITE_MEASURING_MODE measuringMode, FLOAT baselineOriginX, FLOAT baselineOriginY, _Out_ IDWriteGlyphRunAnalysis** glyphRunAnalysis);
                HWIN_EXPORT WriteGlyphRunAnalysis CreateGlyphRunAnalysis(_In_ DWRITE_GLYPH_RUN const* glyphRun,FLOAT pixelsPerDip,_In_opt_ DWRITE_MATRIX const* transform, DWRITE_RENDERING_MODE renderingMode, DWRITE_MEASURING_MODE measuringMode, FLOAT baselineOriginX, FLOAT baselineOriginY);

            };


        };
    };
};

#endif //__HWINGRAPHICS_H__

By viewing downloads associated with this article you agree to the Terms of Service and the article's licence.

If a file you wish to view isn't highlighted, and is a text file (not binary), please let us know and we'll add colourisation support for it.

License

This article, along with any associated source code and files, is licensed under The Code Project Open License (CPOL)


Written By
Architect Sea Surveillance AS
Norway Norway
Chief Architect - Sea Surveillance AS.

Specializing in integrated operations and high performance computing solutions.

I’ve been fooling around with computers since the early eighties, I’ve even done work on CP/M and MP/M.

Wrote my first “real” program on a BBC micro model B based on a series in a magazine at that time. It was fun and I got hooked on this thing called programming ...

A few Highlights:

  • High performance application server development
  • Model Driven Architecture and Code generators
  • Real-Time Distributed Solutions
  • C, C++, C#, Java, TSQL, PL/SQL, Delphi, ActionScript, Perl, Rexx
  • Microsoft SQL Server, Oracle RDBMS, IBM DB2, PostGreSQL
  • AMQP, Apache qpid, RabbitMQ, Microsoft Message Queuing, IBM WebSphereMQ, Oracle TuxidoMQ
  • Oracle WebLogic, IBM WebSphere
  • Corba, COM, DCE, WCF
  • AspenTech InfoPlus.21(IP21), OsiSoft PI


More information about what I do for a living can be found at: harlinn.com or LinkedIn

You can contact me at espen@harlinn.no

Comments and Discussions