/*
 * Copyright 2013 Nikolay Sivov for CodeWeavers
 *
 * This library is free software; you can redistribute it and/or
 * modify it under the terms of the GNU Lesser General Public
 * License as published by the Free Software Foundation; either
 * version 2.1 of the License, or (at your option) any later version.
 *
 * This library is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 * Lesser General Public License for more details.
 *
 * You should have received a copy of the GNU Lesser General Public
 * License along with this library; if not, write to the Free Software
 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
 */

import "unknwn.idl";
import "dcommon.h";
import "d2dbasetypes.h";
import "d3d10_1.idl";

cpp_quote("#ifdef WINE_NO_UNICODE_MACROS")
cpp_quote("#undef DrawText")
cpp_quote("#endif")

interface ID2D1Factory;
interface ID2D1RenderTarget;
interface ID2D1BitmapRenderTarget;
interface ID2D1Geometry;
interface ID2D1Brush;
interface IDWriteRenderingParams;
interface IDWriteTextFormat;
interface IDWriteTextLayout;
interface IWICBitmapSource;

typedef struct DWRITE_GLYPH_RUN DWRITE_GLYPH_RUN;

typedef D2D_POINT_2F D2D1_POINT_2F;
typedef D2D_MATRIX_3X2_F D2D1_MATRIX_3X2_F;
typedef D2D_RECT_F D2D1_RECT_F;
typedef D2D_SIZE_F D2D1_SIZE_F;
typedef UINT64 D2D1_TAG;
typedef D2D_SIZE_U D2D1_SIZE_U;
typedef D2D_POINT_2U D2D1_POINT_2U;
typedef D2D_RECT_U D2D1_RECT_U;
typedef D2D_COLOR_F D2D1_COLOR_F;

enum
{
    D2D1_INTERPOLATION_MODE_DEFINITION_NEAREST_NEIGHBOR = 0,
    D2D1_INTERPOLATION_MODE_DEFINITION_LINEAR = 1,
    D2D1_INTERPOLATION_MODE_DEFINITION_CUBIC = 2,
    D2D1_INTERPOLATION_MODE_DEFINITION_MULTI_SAMPLE_LINEAR = 3,
    D2D1_INTERPOLATION_MODE_DEFINITION_ANISOTROPIC = 4,
    D2D1_INTERPOLATION_MODE_DEFINITION_HIGH_QUALITY_CUBIC = 5,
    D2D1_INTERPOLATION_MODE_DEFINITION_FANT = 6,
    D2D1_INTERPOLATION_MODE_DEFINITION_MIPMAP_LINEAR = 7,
};

typedef enum D2D1_DEBUG_LEVEL
{
    D2D1_DEBUG_LEVEL_NONE = 0,
    D2D1_DEBUG_LEVEL_ERROR = 1,
    D2D1_DEBUG_LEVEL_WARNING = 2,
    D2D1_DEBUG_LEVEL_INFORMATION = 3,
    D2D1_DEBUG_LEVEL_FORCE_DWORD = 0xffffffff,
} D2D1_DEBUG_LEVEL;

typedef enum D2D1_FACTORY_TYPE
{
    D2D1_FACTORY_TYPE_SINGLE_THREADED = 0,
    D2D1_FACTORY_TYPE_MULTI_THREADED = 1,
    D2D1_FACTORY_TYPE_FORCE_DWORD = 0xfffffff,
} D2D1_FACTORY_TYPE;

typedef enum D2D1_FILL_MODE
{
    D2D1_FILL_MODE_ALTERNATE = 0,
    D2D1_FILL_MODE_WINDING = 1,
    D2D1_FILL_MODE_FORCE_DWORD = 0xffffffff
} D2D1_FILL_MODE;

typedef enum D2D1_PATH_SEGMENT
{
    D2D1_PATH_SEGMENT_NONE = 0,
    D2D1_PATH_SEGMENT_FORCE_UNSTROKED = 1,
    D2D1_PATH_SEGMENT_FORCE_ROUND_LINE_JOIN = 2,
    D2D1_PATH_SEGMENT_FORCE_DWORD = 0xffffffff
} D2D1_PATH_SEGMENT;

typedef enum D2D1_FIGURE_BEGIN
{
    D2D1_FIGURE_BEGIN_FILLED = 0,
    D2D1_FIGURE_BEGIN_HOLLOW = 1,
    D2D1_FIGURE_BEGIN_FORCE_DWORD = 0xffffffff
} D2D1_FIGURE_BEGIN;

typedef enum D2D1_FIGURE_END
{
    D2D1_FIGURE_END_OPEN = 0,
    D2D1_FIGURE_END_CLOSED = 1,
    D2D1_FIGURE_END_FORCE_DWORD = 0xffffffff
} D2D1_FIGURE_END;

typedef enum D2D1_CAP_STYLE
{
    D2D1_CAP_STYLE_FLAT = 0,
    D2D1_CAP_STYLE_SQUARE = 1,
    D2D1_CAP_STYLE_ROUND = 2,
    D2D1_CAP_STYLE_TRIANGLE = 3,
    D2D1_CAP_STYLE_FORCE_DWORD = 0xffffffff,
} D2D1_CAP_STYLE;

typedef enum D2D1_LINE_JOIN
{
    D2D1_LINE_JOIN_MITER = 0,
    D2D1_LINE_JOIN_BEVEL = 1,
    D2D1_LINE_JOIN_ROUND = 2,
    D2D1_LINE_JOIN_MITER_OR_BEVEL = 3,
    D2D1_LINE_JOIN_FORCE_DWORD = 0xffffffff,
} D2D1_LINE_JOIN;

typedef enum D2D1_DASH_STYLE
{
    D2D1_DASH_STYLE_SOLID = 0,
    D2D1_DASH_STYLE_DASH = 1,
    D2D1_DASH_STYLE_DOT = 2,
    D2D1_DASH_STYLE_DASH_DOT = 3,
    D2D1_DASH_STYLE_DASH_DOT_DOT = 4,
    D2D1_DASH_STYLE_CUSTOM = 5,
    D2D1_DASH_STYLE_FORCE_DWORD = 0xffffffff,
} D2D1_DASH_STYLE;

typedef enum D2D1_GEOMETRY_RELATION
{
    D2D1_GEOMETRY_RELATION_UNKNOWN = 0,
    D2D1_GEOMETRY_RELATION_DISJOINT = 1,
    D2D1_GEOMETRY_RELATION_IS_CONTAINED = 2,
    D2D1_GEOMETRY_RELATION_CONTAINS = 3,
    D2D1_GEOMETRY_RELATION_OVERLAP = 4,
    D2D1_GEOMETRY_RELATION_FORCE_DWORD = 0xffffffff,
} D2D1_GEOMETRY_RELATION;

typedef enum D2D1_GEOMETRY_SIMPLIFICATION_OPTION
{
    D2D1_GEOMETRY_SIMPLIFICATION_OPTION_CUBICS_AND_LINES = 0,
    D2D1_GEOMETRY_SIMPLIFICATION_OPTION_LINES = 1,
    D2D1_GEOMETRY_SIMPLIFICATION_OPTION_FORCE_DWORD = 0xffffffff,
} D2D1_GEOMETRY_SIMPLIFICATION_OPTION;

typedef enum D2D1_COMBINE_MODE
{
    D2D1_COMBINE_MODE_UNION = 0,
    D2D1_COMBINE_MODE_INTERSECT = 1,
    D2D1_COMBINE_MODE_XOR = 2,
    D2D1_COMBINE_MODE_EXCLUDE = 3,
    D2D1_COMBINE_MODE_FORCE_DWORD = 0xffffffff,
} D2D1_COMBINE_MODE;

typedef enum D2D1_SWEEP_DIRECTION
{
    D2D1_SWEEP_DIRECTION_COUNTER_CLOCKWISE = 0,
    D2D1_SWEEP_DIRECTION_CLOCKWISE = 1,
    D2D1_SWEEP_DIRECTION_FORCE_DWORD = 0xffffffff,
} D2D1_SWEEP_DIRECTION;

typedef enum D2D1_ARC_SIZE
{
    D2D1_ARC_SIZE_SMALL = 0,
    D2D1_ARC_SIZE_LARGE = 1,
    D2D1_ARC_SIZE_FORCE_DWORD = 0xffffffff,
} D2D1_ARC_SIZE;

typedef enum D2D1_ANTIALIAS_MODE
{
    D2D1_ANTIALIAS_MODE_PER_PRIMITIVE = 0,
    D2D1_ANTIALIAS_MODE_ALIASED = 1,
    D2D1_ANTIALIAS_MODE_FORCE_DWORD = 0xffffffff,
} D2D1_ANTIALIAS_MODE;

typedef enum D2D1_TEXT_ANTIALIAS_MODE
{
    D2D1_TEXT_ANTIALIAS_MODE_DEFAULT = 0,
    D2D1_TEXT_ANTIALIAS_MODE_CLEARTYPE = 1,
    D2D1_TEXT_ANTIALIAS_MODE_GRAYSCALE = 2,
    D2D1_TEXT_ANTIALIAS_MODE_ALIASED = 3,
    D2D1_TEXT_ANTIALIAS_MODE_FORCE_DWORD = 0xffffffff,
} D2D1_TEXT_ANTIALIAS_MODE;

typedef enum D2D1_EXTEND_MODE
{
    D2D1_EXTEND_MODE_CLAMP = 0,
    D2D1_EXTEND_MODE_WRAP = 1,
    D2D1_EXTEND_MODE_MIRROR = 2,
    D2D1_EXTEND_MODE_FORCE_DWORD = 0xffffffff,
} D2D1_EXTEND_MODE;

typedef enum D2D1_BITMAP_INTERPOLATION_MODE
{
    D2D1_BITMAP_INTERPOLATION_MODE_NEAREST_NEIGHBOR = D2D1_INTERPOLATION_MODE_DEFINITION_NEAREST_NEIGHBOR,
    D2D1_BITMAP_INTERPOLATION_MODE_LINEAR = D2D1_INTERPOLATION_MODE_DEFINITION_LINEAR,
    D2D1_BITMAP_INTERPOLATION_MODE_FORCE_DWORD = 0xffffffff,
} D2D1_BITMAP_INTERPOLATION_MODE;

typedef enum D2D1_GAMMA
{
    D2D1_GAMMA_2_2 = 0,
    D2D1_GAMMA_1_0 = 1,
    D2D1_GAMMA_FORCE_DWORD = 0xffffffff,
} D2D1_GAMMA;

typedef enum D2D1_COMPATIBLE_RENDER_TARGET_OPTIONS
{
    D2D1_COMPATIBLE_RENDER_TARGET_OPTIONS_NONE = 0x00000000,
    D2D1_COMPATIBLE_RENDER_TARGET_OPTIONS_GDI_COMPATIBLE = 0x00000001,
    D2D1_COMPATIBLE_RENDER_TARGET_OPTIONS_FORCE_DWORD = 0xffffffff,
} D2D1_COMPATIBLE_RENDER_TARGET_OPTIONS;

typedef enum D2D1_OPACITY_MASK_CONTENT
{
    D2D1_OPACITY_MASK_CONTENT_GRAPHICS = 0,
    D2D1_OPACITY_MASK_CONTENT_TEXT_NATURAL = 1,
    D2D1_OPACITY_MASK_CONTENT_TEXT_GDI_COMPATIBLE = 2,
    D2D1_OPACITY_MASK_CONTENT_FORCE_DWORD = 0xffffffff,
} D2D1_OPACITY_MASK_CONTENT;

typedef enum D2D1_DRAW_TEXT_OPTIONS
{
    D2D1_DRAW_TEXT_OPTIONS_NO_SNAP = 0x00000001,
    D2D1_DRAW_TEXT_OPTIONS_CLIP = 0x00000002,
    D2D1_DRAW_TEXT_OPTIONS_NONE = 0x00000000,
    D2D1_DRAW_TEXT_OPTIONS_FORCE_DWORD = 0xffffffff,
} D2D1_DRAW_TEXT_OPTIONS;

typedef enum D2D1_LAYER_OPTIONS
{
    D2D1_LAYER_OPTIONS_NONE = 0x00000000,
    D2D1_LAYER_OPTIONS_INITIALIZE_FOR_CLEARTYPE = 0x00000001,
    D2D1_LAYER_OPTIONS_FORCE_DWORD = 0xffffffff,
} D2D1_LAYER_OPTIONS;

typedef enum D2D1_RENDER_TARGET_TYPE
{
    D2D1_RENDER_TARGET_TYPE_DEFAULT = 0,
    D2D1_RENDER_TARGET_TYPE_SOFTWARE = 1,
    D2D1_RENDER_TARGET_TYPE_HARDWARE = 2,
    D2D1_RENDER_TARGET_TYPE_FORCE_DWORD = 0xffffffff,
} D2D1_RENDER_TARGET_TYPE;

typedef enum D2D1_RENDER_TARGET_USAGE
{
    D2D1_RENDER_TARGET_USAGE_NONE = 0x00000000,
    D2D1_RENDER_TARGET_USAGE_FORCE_BITMAP_REMOTING = 0x00000001,
    D2D1_RENDER_TARGET_USAGE_GDI_COMPATIBLE = 0x00000002,
    D2D1_RENDER_TARGET_USAGE_FORCE_DWORD = 0xffffffff,
} D2D1_RENDER_TARGET_USAGE;

typedef enum D2D1_FEATURE_LEVEL
{
    D2D1_FEATURE_LEVEL_DEFAULT = 0,
    D2D1_FEATURE_LEVEL_9 = D3D_FEATURE_LEVEL_9_1,
    D2D1_FEATURE_LEVEL_10 = D3D_FEATURE_LEVEL_10_0,
    D2D1_FEATURE_LEVEL_FORCE_DWORD = 0xffffffff,
} D2D1_FEATURE_LEVEL;

typedef struct D2D1_BEZIER_SEGMENT
{
    D2D1_POINT_2F point1;
    D2D1_POINT_2F point2;
    D2D1_POINT_2F point3;
} D2D1_BEZIER_SEGMENT;

typedef struct D2D1_FACTORY_OPTIONS
{
    D2D1_DEBUG_LEVEL debugLevel;
} D2D1_FACTORY_OPTIONS;

typedef struct D2D1_TRIANGLE
{
    D2D1_POINT_2F point1;
    D2D1_POINT_2F point2;
    D2D1_POINT_2F point3;
} D2D1_TRIANGLE;

typedef struct D2D1_ROUNDED_RECT
{
    D2D1_RECT_F rect;
    float radiusX;
    float radiusY;
} D2D1_ROUNDED_RECT;

typedef struct D2D1_ELLIPSE
{
    D2D1_POINT_2F point;
    float radiusX;
    float radiusY;
} D2D1_ELLIPSE;

typedef struct D2D1_QUADRATIC_BEZIER_SEGMENT
{
    D2D1_POINT_2F point1;
    D2D1_POINT_2F point2;
} D2D1_QUADRATIC_BEZIER_SEGMENT;

typedef struct D2D1_ARC_SEGMENT
{
    D2D1_POINT_2F point;
    D2D1_SIZE_F size;
    float rotationAngle;
    D2D1_SWEEP_DIRECTION sweepDirection;
    D2D1_ARC_SIZE arcSize;
} D2D1_ARC_SEGMENT;

typedef struct D2D1_DRAWING_STATE_DESCRIPTION
{
    D2D1_ANTIALIAS_MODE antialiasMode;
    D2D1_TEXT_ANTIALIAS_MODE textAntialiasMode;
    D2D1_TAG tag1;
    D2D1_TAG tag2;
    D2D1_MATRIX_3X2_F transform;
} D2D1_DRAWING_STATE_DESCRIPTION;

typedef struct D2D1_GRADIENT_STOP
{
    float position;
    D2D1_COLOR_F color;
} D2D1_GRADIENT_STOP;

typedef struct D2D1_BITMAP_PROPERTIES
{
    D2D1_PIXEL_FORMAT pixelFormat;
    float dpiX;
    float dpiY;
} D2D1_BITMAP_PROPERTIES;

typedef struct D2D1_BITMAP_BRUSH_PROPERTIES
{
    D2D1_EXTEND_MODE extendModeX;
    D2D1_EXTEND_MODE extendModeY;
    D2D1_BITMAP_INTERPOLATION_MODE interpolationMode;
} D2D1_BITMAP_BRUSH_PROPERTIES;

typedef struct D2D1_BRUSH_PROPERTIES
{
    float opacity;
    D2D1_MATRIX_3X2_F transform;
} D2D1_BRUSH_PROPERTIES;

typedef struct D2D1_LINEAR_GRADIENT_BRUSH_PROPERTIES
{
    D2D1_POINT_2F startPoint;
    D2D1_POINT_2F endPoint;
} D2D1_LINEAR_GRADIENT_BRUSH_PROPERTIES;

typedef struct D2D1_RADIAL_GRADIENT_BRUSH_PROPERTIES
{
    D2D1_POINT_2F center;
    D2D1_POINT_2F gradientOriginOffset;
    float radiusX;
    float radiusY;
} D2D1_RADIAL_GRADIENT_BRUSH_PROPERTIES;

typedef struct D2D1_LAYER_PARAMETERS
{
    D2D1_RECT_F contentBounds;
    ID2D1Geometry *geometricMask;
    D2D1_ANTIALIAS_MODE maskAntialiasMode;
    D2D1_MATRIX_3X2_F maskTransform;
    float opacity;
    ID2D1Brush *opacityBrush;
    D2D1_LAYER_OPTIONS layerOptions;
} D2D1_LAYER_PARAMETERS;

typedef struct D2D1_RENDER_TARGET_PROPERTIES
{
    D2D1_RENDER_TARGET_TYPE type;
    D2D1_PIXEL_FORMAT pixelFormat;
    float dpiX;
    float dpiY;
    D2D1_RENDER_TARGET_USAGE usage;
    D2D1_FEATURE_LEVEL minLevel;
} D2D1_RENDER_TARGET_PROPERTIES;

[
    local,
    object,
    uuid(2cd90691-12e2-11dc-9fed-001143a055f9)
]
interface ID2D1Resource : IUnknown
{
    void GetFactory(
        [out] ID2D1Factory **factory
    );
}

[
    local,
    object,
    uuid(2cd9069d-12e2-11dc-9fed-001143a055f9)
]
interface ID2D1StrokeStyle : ID2D1Resource
{
    D2D1_CAP_STYLE GetStartCap();
    D2D1_CAP_STYLE GetEndCap();
    D2D1_CAP_STYLE GetDashCap();
    float GetMiterLimit();
    D2D1_LINE_JOIN GetLineJoin();
    float GetDashOffset();
    D2D1_DASH_STYLE GetDashStyle();
    UINT32 GetDashesCount();
    void GetDashes(
        [out, size_is(count)] float *dashes,
        [in] UINT32 count
    );
}

[
    local,
    object,
    uuid(2cd9069e-12e2-11dc-9fed-001143a055f9)
]
interface ID2D1SimplifiedGeometrySink : IUnknown
{
    void SetFillMode(D2D1_FILL_MODE mode);
    void SetSegmentFlags(D2D1_PATH_SEGMENT vertexFlags);
    void BeginFigure(D2D1_POINT_2F startPoint, D2D1_FIGURE_BEGIN figureBegin);
    void AddLines(const D2D1_POINT_2F *points, UINT32 count);
    void AddBeziers(const D2D1_BEZIER_SEGMENT *beziers, UINT32 count);
    void EndFigure(D2D1_FIGURE_END figureEnd);
    HRESULT Close();
}

[
    local,
    object,
    uuid(2cd906c1-12e2-11dc-9fed-001143a055f9)
]
interface ID2D1TessellationSink : IUnknown
{
    void AddTriangles(
        [in, size_is(count)] const D2D1_TRIANGLE *triangles,
        [in] UINT32 count
    );
    HRESULT Close();
}

[
    local,
    object,
    uuid(2cd906a1-12e2-11dc-9fed-001143a055f9)
]
interface ID2D1Geometry : ID2D1Resource
{
    HRESULT GetBounds(
        [in] const D2D1_MATRIX_3X2_F *transform,
        [out] D2D1_RECT_F *bounds
    );
    HRESULT GetWidenedBounds(
        [in] float stroke_width,
        [in] ID2D1StrokeStyle *stroke_style,
        [in] const D2D1_MATRIX_3X2_F *transform,
        [in] float tolerance,
        [out] D2D1_RECT_F *bounds
    );
    HRESULT StrokeContainsPoint(
        [in] D2D1_POINT_2F point,
        [in] float stroke_width,
        [in] ID2D1StrokeStyle *stroke_style,
        [in] const D2D1_MATRIX_3X2_F *transform,
        [in] float tolerance,
        [out] BOOL *contains
    );
    HRESULT FillContainsPoint(
        [in] D2D1_POINT_2F point,
        [in] const D2D1_MATRIX_3X2_F *transform,
        [in] float tolerance,
        [out] BOOL *contains
    );
    HRESULT CompareWithGeometry(
        [in] ID2D1Geometry *geometry,
        [in] const D2D1_MATRIX_3X2_F *transform,
        [in] float tolerance,
        [out] D2D1_GEOMETRY_RELATION *relation
    );
    HRESULT Simplify(
        [in] D2D1_GEOMETRY_SIMPLIFICATION_OPTION option,
        [in] const D2D1_MATRIX_3X2_F *transform,
        [in] float tolerance,
        [in] ID2D1SimplifiedGeometrySink *sink
    );
    HRESULT Tessellate(
        [in] const D2D1_MATRIX_3X2_F *transform,
        [in] float tolerance,
        [in] ID2D1TessellationSink *sink
    );
    HRESULT CombineWithGeometry(
        [in] ID2D1Geometry *geometry,
        [in] D2D1_COMBINE_MODE combine_mode,
        [in] const D2D1_MATRIX_3X2_F *transform,
        [in] float tolerance,
        [in] ID2D1SimplifiedGeometrySink *sink
    );
    HRESULT Outline(
        [in] const D2D1_MATRIX_3X2_F *transform,
        [in] float tolerance,
        [in] ID2D1SimplifiedGeometrySink *sink
    );
    HRESULT ComputeArea(
        [in] const D2D1_MATRIX_3X2_F *transform,
        [in] float tolerance,
        [out] float *area
    );
    HRESULT ComputeLength(
        [in] const D2D1_MATRIX_3X2_F *transform,
        [in] float tolerance,
        [out] float *length
    );
    HRESULT ComputePointAtLength(
        [in] float length,
        [in] const D2D1_MATRIX_3X2_F *transform,
        [in] float tolerance,
        [out] D2D1_POINT_2F *point,
        [out] D2D1_POINT_2F *tangent
    );
    HRESULT Widen(
        [in] float stroke_width,
        [in] ID2D1StrokeStyle *stroke_style,
        [in] const D2D1_MATRIX_3X2_F *transform,
        [in] float tolerance,
        [in] ID2D1SimplifiedGeometrySink *sink
    );
}

[
    local,
    object,
    uuid(2cd906a2-12e2-11dc-9fed-001143a055f9)
]
interface ID2D1RectangleGeometry : ID2D1Geometry
{
    void GetRect(
        [out] D2D1_RECT_F *rect
    );
}

[
    local,
    object,
    uuid(2cd906a3-12e2-11dc-9fed-001143a055f9)
]
interface ID2D1RoundedRectangleGeometry : ID2D1Geometry
{
    void GetRoundedRect(
        [out] D2D1_ROUNDED_RECT *rect
    );
}

[
    local,
    object,
    uuid(2cd906a4-12e2-11dc-9fed-001143a055f9)
]
interface ID2D1EllipseGeometry : ID2D1Geometry
{
    void GetEllipse(
        [out] D2D1_ELLIPSE *ellipse
    );
}

[
    local,
    object,
    uuid(2cd906a6-12e2-11dc-9fed-001143a055f9)
]
interface ID2D1GeometryGroup : ID2D1Geometry
{
    D2D1_FILL_MODE GetFillMode();
    UINT32 GetSourceGeometryCount();
    void GetSourceGeometries(
        [out, size_is(geometry_count)] ID2D1Geometry **geometry,
        [in] UINT32 geometry_count
    );
}

[
    local,
    object,
    uuid(2cd906bb-12e2-11dc-9fed-001143a055f9)
]
interface ID2D1TransformedGeometry : ID2D1Geometry
{
    void GetSourceGeometry(
        [out] ID2D1Geometry **geometry
    );
    void GetTransform(
        [out] D2D1_MATRIX_3X2_F *transform
    );
}

[
    local,
    object,
    uuid(2cd9069f-12e2-11dc-9fed-001143a055f9)
]
interface ID2D1GeometrySink : ID2D1SimplifiedGeometrySink
{
    void AddLine(
        [in] D2D1_POINT_2F point
    );
    void AddBezier(
        [in] const D2D1_BEZIER_SEGMENT *bezier
    );
    void AddQuadraticBezier(
        [in] const D2D1_QUADRATIC_BEZIER_SEGMENT *bezier
    );
    void AddQuadraticBeziers(
        [in, size_is(bezier_count)] const D2D1_QUADRATIC_BEZIER_SEGMENT *beziers,
        [in] UINT32 bezier_count
    );
    void AddArc(
        [in] const D2D1_ARC_SEGMENT *arc
    );
}

[
    local,
    object,
    uuid(2cd906a5-12e2-11dc-9fed-001143a055f9)
]
interface ID2D1PathGeometry : ID2D1Geometry
{
    HRESULT Open(
        [out] ID2D1GeometrySink **sink
    );
    HRESULT Stream(
        [in] ID2D1GeometrySink *sink
    );
    HRESULT GetSegmentCount(
        [out] UINT32 *count
    );
    HRESULT GetFigureCount(
        [out] UINT32 *count
    );
}

[
    local,
    object,
    uuid(28506e39-ebf6-46a1-bb47-fd85565ab957)
]
interface ID2D1DrawingStateBlock : ID2D1Resource
{
    void GetDescription(
        [out] D2D1_DRAWING_STATE_DESCRIPTION *desc
    );
    void SetDescription(
        [in] const D2D1_DRAWING_STATE_DESCRIPTION *desc
    );
    void SetTextRenderingParams(
        [in] IDWriteRenderingParams *text_rendering_params
    );
    void GetTextRenderingParams(
        [out] IDWriteRenderingParams **text_rendering_params
    );
}

[
    local,
    object,
    uuid(65019f75-8da2-497c-b32c-dfa34e48ede6)
]
interface ID2D1Image : ID2D1Resource
{
}

[
    local,
    object,
    uuid(a2296057-ea42-4099-983b-539fb6505426)
]
interface ID2D1Bitmap : ID2D1Image
{
    D2D1_SIZE_F GetSize();
    D2D1_SIZE_U GetPixelSize();
    D2D1_PIXEL_FORMAT GetPixelFormat();
    void GetDpi(
        [out] float *dpi_x,
        [out] float *dpi_y
    );
    HRESULT CopyFromBitmap(
        [in] const D2D1_POINT_2U *dst_point,
        [in] ID2D1Bitmap *bitmap,
        [in] const D2D1_RECT_U *src_rect
    );
    HRESULT CopyFromRenderTarget(
        [in] const D2D1_POINT_2U *dst_point,
        [in] ID2D1RenderTarget *render_target,
        [in] const D2D1_RECT_U *src_rect
    );
    HRESULT CopyFromMemory(
        [in] const D2D1_RECT_U *dst_rect,
        [in] const void *src_data,
        [in] UINT32 pitch
    );
}

[
    local,
    object,
    uuid(2cd906a8-12e2-11dc-9fed-001143a055f9)
]
interface ID2D1Brush : ID2D1Resource
{
    void SetOpacity(
        [in] float opacity
    );
    void SetTransform(
        [in] const D2D1_MATRIX_3X2_F *transform
    );
    float GetOpacity();
    void GetTransform(
        [out] D2D1_MATRIX_3X2_F *transform
    );
}

[
    local,
    object,
    uuid(2cd906aa-12e2-11dc-9fed-001143a055f9)
]
interface ID2D1BitmapBrush : ID2D1Brush
{
    void SetExtendModeX(
        [in] D2D1_EXTEND_MODE mode
    );
    void SetExtendModeY(
        [in] D2D1_EXTEND_MODE mode
    );
    void SetInterpolationMode(
        [in] D2D1_BITMAP_INTERPOLATION_MODE mode
    );
    void SetBitmap(
        [in] ID2D1Bitmap *bitmap
    );
    D2D1_EXTEND_MODE GetExtendModeX();
    D2D1_EXTEND_MODE GetExtendModeY();
    D2D1_BITMAP_INTERPOLATION_MODE GetInterpolationMode();
    void GetBitmap(
        [out] ID2D1Bitmap **bitmap
    );
}

[
    local,
    object,
    uuid(2cd906a9-12e2-11dc-9fed-001143a055f9)
]
interface ID2D1SolidColorBrush : ID2D1Brush
{
    void SetColor(
        [in] const D2D1_COLOR_F *color
    );
    D2D1_COLOR_F GetColor();
}

[
    local,
    object,
    uuid(2cd906a7-12e2-11dc-9fed-001143a055f9)
]
interface ID2D1GradientStopCollection : ID2D1Resource
{
    UINT32 GetGradientStopCount();
    void GetGradientStops(
        [out] D2D1_GRADIENT_STOP *stops,
        [in] UINT32 stop_count
    );
    D2D1_GAMMA GetColorInterpolationGamma();
    D2D1_EXTEND_MODE GetExtendMode();
}

[
    local,
    object,
    uuid(2cd906ab-12e2-11dc-9fed-001143a055f9)
]
interface ID2D1LinearGradientBrush : ID2D1Brush
{
    void SetStartPoint(
        [in] D2D1_POINT_2F start_point
    );
    void SetEndPoint(
        [in] D2D1_POINT_2F end_point
    );
    D2D1_POINT_2F GetStartPoint();
    D2D1_POINT_2F GetEndPoint();
    void GetGradientStopCollection(
        [out] ID2D1GradientStopCollection **gradient
    );
}

[
    local,
    object,
    uuid(2cd906ac-12e2-11dc-9fed-001143a055f9)
]
interface ID2D1RadialGradientBrush : ID2D1Brush
{
    void SetCenter(
        [in] D2D1_POINT_2F center
    );
    void SetGradientOriginOffset(
        [in] D2D1_POINT_2F offset
    );
    void SetRadiusX(
        [in] float radius
    );
    void SetRadiusY(
        [in] float radius
    );
    D2D1_POINT_2F GetCenter();
    D2D1_POINT_2F GetGradientOriginOffset();
    float GetRadiusX();
    float GetRadiusY();
    void GetGradientStopCollection(
        [out] ID2D1GradientStopCollection **gradient
    );
}

[
    local,
    object,
    uuid(2cd9069b-12e2-11dc-9fed-001143a055f9)
]
interface ID2D1Layer : ID2D1Resource
{
    D2D1_SIZE_F GetSize();
}

[
    local,
    object,
    uuid(2cd906c2-12e2-11dc-9fed-001143a055f9)
]
interface ID2D1Mesh : ID2D1Resource
{
    HRESULT Open(
        [out] ID2D1TessellationSink **sink
    );
}

[
    local,
    object,
    uuid(2cd90694-12e2-11dc-9fed-001143a055f9)
]
interface ID2D1RenderTarget : ID2D1Resource
{
    HRESULT CreateBitmap(
        [in] D2D1_SIZE_U size,
        [in] const void *src_data,
        [in] UINT32 pitch,
        [in] const D2D1_BITMAP_PROPERTIES *desc,
        [out] ID2D1Bitmap **bitmap
    );
    HRESULT CreateBitmapFromWicBitmap(
        [in] IWICBitmapSource *bitmap_source,
        [in] const D2D1_BITMAP_PROPERTIES *desc,
        [out] ID2D1Bitmap **bitmap
    );
    HRESULT CreateSharedBitmap(
        [in] REFIID iid,
        [in, out] void *data,
        [in] const D2D1_BITMAP_PROPERTIES *desc,
        [out] ID2D1Bitmap **bitmap
    );
    HRESULT CreateBitmapBrush(
        [in] ID2D1Bitmap *bitmap,
        [in] const D2D1_BITMAP_BRUSH_PROPERTIES *bitmap_brush_desc,
        [in] const D2D1_BRUSH_PROPERTIES *brush_desc,
        [out] ID2D1BitmapBrush **brush
    );
    HRESULT CreateSolidColorBrush(
        [in] const D2D1_COLOR_F *color,
        [in] const D2D1_BRUSH_PROPERTIES *desc,
        [out] ID2D1SolidColorBrush **brush
    );
    HRESULT CreateGradientStopCollection(
        [in, size_is(stop_count)] const D2D1_GRADIENT_STOP *stops,
        [in] UINT32 stop_count,
        [in] D2D1_GAMMA gamma,
        [in] D2D1_EXTEND_MODE extend_mode,
        [out] ID2D1GradientStopCollection **gradient
    );
    HRESULT CreateLinearGradientBrush(
        [in] const D2D1_LINEAR_GRADIENT_BRUSH_PROPERTIES *gradient_brush_desc,
        [in] const D2D1_BRUSH_PROPERTIES *brush_desc,
        [in] ID2D1GradientStopCollection *gradient,
        [out] ID2D1LinearGradientBrush **brush
    );
    HRESULT CreateRadialGradientBrush(
        [in] const D2D1_RADIAL_GRADIENT_BRUSH_PROPERTIES *gradient_brush_desc,
        [in] const D2D1_BRUSH_PROPERTIES *brush_desc,
        [in] ID2D1GradientStopCollection *gradient,
        [out] ID2D1RadialGradientBrush **brush
    );
    HRESULT CreateCompatibleRenderTarget(
        [in] const D2D1_SIZE_F *size,
        [in] const D2D1_SIZE_U *pixel_size,
        [in] const D2D1_PIXEL_FORMAT *format,
        [in] D2D1_COMPATIBLE_RENDER_TARGET_OPTIONS options,
        [out] ID2D1BitmapRenderTarget **render_target
    );
    HRESULT CreateLayer(
        [in] const D2D1_SIZE_F *size,
        [out] ID2D1Layer **layer
    );
    HRESULT CreateMesh(
        [out] ID2D1Mesh **mesh
    );
    void DrawLine(
        [in] D2D1_POINT_2F p0,
        [in] D2D1_POINT_2F p1,
        [in] ID2D1Brush *brush,
        [in] float stroke_width,
        [in] ID2D1StrokeStyle *stroke_style
    );
    void DrawRectangle(
        [in] const D2D1_RECT_F *rect,
        [in] ID2D1Brush *brush,
        [in] float stroke_width,
        [in] ID2D1StrokeStyle *stroke_style
    );
    void FillRectangle(
        [in] const D2D1_RECT_F *rect,
        [in] ID2D1Brush *brush
    );
    void DrawRoundedRectangle(
        [in] const D2D1_ROUNDED_RECT *rect,
        [in] ID2D1Brush *brush,
        [in] float stroke_width,
        [in] ID2D1StrokeStyle *stroke_style
    );
    void FillRoundedRectangle(
        [in] const D2D1_ROUNDED_RECT *rect,
        [in] ID2D1Brush *brush
    );
    void DrawEllipse(
        [in] const D2D1_ELLIPSE *ellipse,
        [in] ID2D1Brush *brush,
        [in] float stroke_width,
        [in] ID2D1StrokeStyle *stroke_style
    );
    void FillEllipse(
        [in] const D2D1_ELLIPSE *ellipse,
        [in] ID2D1Brush *brush
    );
    void DrawGeometry(
        [in] ID2D1Geometry *geometry,
        [in] ID2D1Brush *brush,
        [in] float stroke_width,
        [in] ID2D1StrokeStyle *stroke_style
    );
    void FillGeometry(
        [in] ID2D1Geometry *geometry,
        [in] ID2D1Brush *brush,
        [in] ID2D1Brush *opacity_brush
    );
    void FillMesh(
        [in] ID2D1Mesh *mesh,
        [in] ID2D1Brush *brush
    );
    void FillOpacityMask(
        [in] ID2D1Bitmap *mask,
        [in] ID2D1Brush *brush,
        [in] D2D1_OPACITY_MASK_CONTENT content,
        [in] const D2D1_RECT_F *dst_rect,
        [in] const D2D1_RECT_F *src_rect
    );
    void DrawBitmap(
        [in] ID2D1Bitmap *bitmap,
        [in] const D2D1_RECT_F *dst_rect,
        [in] float opacity,
        [in] D2D1_BITMAP_INTERPOLATION_MODE interpolation_mode,
        [in] const D2D1_RECT_F *src_rect
    );
    void DrawText(
        [in, size_is(string_len)] const WCHAR *string,
        [in] UINT32 string_len,
        [in] IDWriteTextFormat *text_format,
        [in] const D2D1_RECT_F *layout_rect,
        [in] ID2D1Brush *brush,
        [in] D2D1_DRAW_TEXT_OPTIONS options,
        [in] DWRITE_MEASURING_MODE measuring_mode
    );
    void DrawTextLayout(
        [in] D2D1_POINT_2F origin,
        [in] IDWriteTextLayout *layout,
        [in] ID2D1Brush *brush,
        [in] D2D1_DRAW_TEXT_OPTIONS options
    );
    void DrawGlyphRun(
        [in] D2D1_POINT_2F baseline_origin,
        [in] const DWRITE_GLYPH_RUN *glyph_run,
        [in] ID2D1Brush *brush,
        [in] DWRITE_MEASURING_MODE measuring_mode
    );
    void SetTransform(
        [in] const D2D1_MATRIX_3X2_F *transform
    );
    void GetTransform(
        [out] D2D1_MATRIX_3X2_F *transform
    );
    void SetAntialiasMode(
        [in] D2D1_ANTIALIAS_MODE antialias_mode
    );
    D2D1_ANTIALIAS_MODE GetAntialiasMode();
    void SetTextAntialiasMode(
        [in] D2D1_TEXT_ANTIALIAS_MODE antialias_mode
    );
    D2D1_TEXT_ANTIALIAS_MODE GetTextAntialiasMode();
    void SetTextRenderingParams(
        [in] IDWriteRenderingParams *text_rendering_params
    );
    void GetTextRenderingParams(
        [out] IDWriteRenderingParams **text_rendering_params
    );
    void SetTags(
        [in] D2D1_TAG tag1,
        [in] D2D1_TAG tag2
    );
    void GetTags(
        [out] D2D1_TAG *tag1,
        [out] D2D1_TAG *tag2
    );
    void PushLayer(
        [in] const D2D1_LAYER_PARAMETERS *layer_parameters,
        [in] ID2D1Layer *layer
    );
    void PopLayer();
    HRESULT Flush(
        [out] D2D1_TAG *tag1,
        [out] D2D1_TAG *tag2
    );
    void SaveDrawingState(
        [in, out] ID2D1DrawingStateBlock *state_block
    );
    void RestoreDrawingState(
        [in] ID2D1DrawingStateBlock *state_block
    );
    void PushAxisAlignedClip(
        [in] const D2D1_RECT_F *clip_rect,
        [in] D2D1_ANTIALIAS_MODE antialias_mode
    );
    void PopAxisAlignedClip();
    void Clear(
        [in] const D2D1_COLOR_F *color
    );
    void BeginDraw();
    HRESULT EndDraw(
        [out] D2D1_TAG *tag1,
        [out] D2D1_TAG *tag2
    );
    D2D1_PIXEL_FORMAT GetPixelFormat();
    void SetDpi(
        [in] float dpi_x,
        [in] float dpi_y
    );
    void GetDpi(
        [out] float *dpi_x,
        [out] float *dpi_y
    );
    D2D1_SIZE_F GetSize();
    D2D1_SIZE_U GetPixelSize();
    UINT32 GetMaximumBitmapSize();
    BOOL IsSupported(
        [in] const D2D1_RENDER_TARGET_PROPERTIES *desc
    );
}

[
    local,
    object,
    uuid(2cd90695-12e2-11dc-9fed-001143a055f9)
]
interface ID2D1BitmapRenderTarget : ID2D1RenderTarget
{
    HRESULT GetBitmap(
        [out] ID2D1Bitmap **bitmap
    );
}

[local] HRESULT __stdcall D2D1CreateFactory(D2D1_FACTORY_TYPE factory_type, REFIID iid,
        const D2D1_FACTORY_OPTIONS *factory_options, void **factory);
