// Copyright © 2018 winapi-rs developers
// Licensed under the Apache License, Version 2.0
// <LICENSE-APACHE or http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
// <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your option.
// All files in the project carrying such notice may not be copied, modified, or distributed
// except according to those terms.
//! Mappings for the contents of d2d1svg.h
use ctypes::c_void;
use shared::basetsd::UINT32;
use shared::guiddef::REFIID;
use shared::minwindef::{BOOL, FLOAT};
use shared::ntdef::{PCWSTR, PWSTR, WCHAR};
use shared::winerror::HRESULT;
use um::d2d1::{
    D2D1_CAP_STYLE_FLAT, D2D1_CAP_STYLE_ROUND, D2D1_CAP_STYLE_SQUARE, D2D1_COLOR_F, D2D1_FILL_MODE,
    D2D1_LINE_JOIN_BEVEL, D2D1_LINE_JOIN_MITER_OR_BEVEL, D2D1_LINE_JOIN_ROUND, D2D1_POINT_2F,
    D2D1_SIZE_F, ID2D1Resource, ID2D1ResourceVtbl
};
use um::d2d1_1::ID2D1PathGeometry1;
use um::objidlbase::IStream;
ENUM!{enum D2D1_SVG_PAINT_TYPE {
    D2D1_SVG_PAINT_TYPE_NONE = 0,
    D2D1_SVG_PAINT_TYPE_COLOR = 1,
    D2D1_SVG_PAINT_TYPE_CURRENT_COLOR = 2,
    D2D1_SVG_PAINT_TYPE_URI = 3,
    D2D1_SVG_PAINT_TYPE_URI_NONE = 4,
    D2D1_SVG_PAINT_TYPE_URI_COLOR = 5,
    D2D1_SVG_PAINT_TYPE_URI_CURRENT_COLOR = 6,
}}
ENUM!{enum D2D1_SVG_LENGTH_UNITS {
    D2D1_SVG_LENGTH_UNITS_NUMBER = 0,
    D2D1_SVG_LENGTH_UNITS_PERCENTAGE = 1,
}}
ENUM!{enum D2D1_SVG_DISPLAY {
    D2D1_SVG_DISPLAY_INLINE = 0,
    D2D1_SVG_DISPLAY_NONE = 1,
}}
ENUM!{enum D2D1_SVG_VISIBILITY {
    D2D1_SVG_VISIBILITY_VISIBLE = 0,
    D2D1_SVG_VISIBILITY_HIDDEN = 1,
}}
ENUM!{enum D2D1_SVG_OVERFLOW {
    D2D1_SVG_OVERFLOW_VISIBLE = 0,
    D2D1_SVG_OVERFLOW_HIDDEN = 1,
}}
ENUM!{enum D2D1_SVG_LINE_CAP {
    D2D1_SVG_LINE_CAP_BUTT = D2D1_CAP_STYLE_FLAT,
    D2D1_SVG_LINE_CAP_SQUARE = D2D1_CAP_STYLE_SQUARE,
    D2D1_SVG_LINE_CAP_ROUND = D2D1_CAP_STYLE_ROUND,
}}
ENUM!{enum D2D1_SVG_LINE_JOIN {
    D2D1_SVG_LINE_JOIN_BEVEL = D2D1_LINE_JOIN_BEVEL,
    D2D1_SVG_LINE_JOIN_MITER = D2D1_LINE_JOIN_MITER_OR_BEVEL,
    D2D1_SVG_LINE_JOIN_ROUND = D2D1_LINE_JOIN_ROUND,
}}
ENUM!{enum D2D1_SVG_ASPECT_ALIGN {
    D2D1_SVG_ASPECT_ALIGN_NONE = 0,
    D2D1_SVG_ASPECT_ALIGN_X_MIN_Y_MIN = 1,
    D2D1_SVG_ASPECT_ALIGN_X_MID_Y_MIN = 2,
    D2D1_SVG_ASPECT_ALIGN_X_MAX_Y_MIN = 3,
    D2D1_SVG_ASPECT_ALIGN_X_MIN_Y_MID = 4,
    D2D1_SVG_ASPECT_ALIGN_X_MID_Y_MID = 5,
    D2D1_SVG_ASPECT_ALIGN_X_MAX_Y_MID = 6,
    D2D1_SVG_ASPECT_ALIGN_X_MIN_Y_MAX = 7,
    D2D1_SVG_ASPECT_ALIGN_X_MID_Y_MAX = 8,
    D2D1_SVG_ASPECT_ALIGN_X_MAX_Y_MAX = 9,
}}
ENUM!{enum D2D1_SVG_ASPECT_SCALING {
    D2D1_SVG_ASPECT_SCALING_MEET = 0,
    D2D1_SVG_ASPECT_SCALING_SLICE = 1,
}}
ENUM!{enum D2D1_SVG_PATH_COMMAND {
    D2D1_SVG_PATH_COMMAND_CLOSE_PATH = 0,
    D2D1_SVG_PATH_COMMAND_MOVE_ABSOLUTE = 1,
    D2D1_SVG_PATH_COMMAND_MOVE_RELATIVE = 2,
    D2D1_SVG_PATH_COMMAND_LINE_ABSOLUTE = 3,
    D2D1_SVG_PATH_COMMAND_LINE_RELATIVE = 4,
    D2D1_SVG_PATH_COMMAND_CUBIC_ABSOLUTE = 5,
    D2D1_SVG_PATH_COMMAND_CUBIC_RELATIVE = 6,
    D2D1_SVG_PATH_COMMAND_QUADRADIC_ABSOLUTE = 7,
    D2D1_SVG_PATH_COMMAND_QUADRADIC_RELATIVE = 8,
    D2D1_SVG_PATH_COMMAND_ARC_ABSOLUTE = 9,
    D2D1_SVG_PATH_COMMAND_ARC_RELATIVE = 10,
    D2D1_SVG_PATH_COMMAND_HORIZONTAL_ABSOLUTE = 11,
    D2D1_SVG_PATH_COMMAND_HORIZONTAL_RELATIVE = 12,
    D2D1_SVG_PATH_COMMAND_VERTICAL_ABSOLUTE = 13,
    D2D1_SVG_PATH_COMMAND_VERTICAL_RELATIVE = 14,
    D2D1_SVG_PATH_COMMAND_CUBIC_SMOOTH_ABSOLUTE = 15,
    D2D1_SVG_PATH_COMMAND_CUBIC_SMOOTH_RELATIVE = 16,
    D2D1_SVG_PATH_COMMAND_QUADRADIC_SMOOTH_ABSOLUTE = 17,
    D2D1_SVG_PATH_COMMAND_QUADRADIC_SMOOTH_RELATIVE = 18,
}}
ENUM!{enum D2D1_SVG_UNIT_TYPE {
    D2D1_SVG_UNIT_TYPE_USER_SPACE_ON_USE = 0,
    D2D1_SVG_UNIT_TYPE_OBJECT_BOUNDING_BOX = 1,
}}
ENUM!{enum D2D1_SVG_ATTRIBUTE_STRING_TYPE {
    D2D1_SVG_ATTRIBUTE_STRING_TYPE_SVG = 0,
    D2D1_SVG_ATTRIBUTE_STRING_TYPE_ID = 1,
}}
ENUM!{enum D2D1_SVG_ATTRIBUTE_POD_TYPE {
    D2D1_SVG_ATTRIBUTE_POD_TYPE_FLOAT = 0,
    D2D1_SVG_ATTRIBUTE_POD_TYPE_COLOR = 1,
    D2D1_SVG_ATTRIBUTE_POD_TYPE_FILL_MODE = 2,
    D2D1_SVG_ATTRIBUTE_POD_TYPE_DISPLAY = 3,
    D2D1_SVG_ATTRIBUTE_POD_TYPE_OVERFLOW = 4,
    D2D1_SVG_ATTRIBUTE_POD_TYPE_LINE_CAP = 5,
    D2D1_SVG_ATTRIBUTE_POD_TYPE_LINE_JOIN = 6,
    D2D1_SVG_ATTRIBUTE_POD_TYPE_VISIBILITY = 7,
    D2D1_SVG_ATTRIBUTE_POD_TYPE_MATRIX = 8,
    D2D1_SVG_ATTRIBUTE_POD_TYPE_UNIT_TYPE = 9,
    D2D1_SVG_ATTRIBUTE_POD_TYPE_EXTEND_MODE = 10,
    D2D1_SVG_ATTRIBUTE_POD_TYPE_PRESERVE_ASPECT_RATIO = 11,
    D2D1_SVG_ATTRIBUTE_POD_TYPE_VIEWBOX = 12,
    D2D1_SVG_ATTRIBUTE_POD_TYPE_LENGTH = 13,
}}
STRUCT!{struct D2D1_SVG_LENGTH {
    value: FLOAT,
    units: D2D1_SVG_LENGTH_UNITS,
}}
STRUCT!{struct D2D1_SVG_PRESERVE_ASPECT_RATIO {
    defer: BOOL,
    align: D2D1_SVG_ASPECT_ALIGN,
    meetOrSlice: D2D1_SVG_ASPECT_SCALING,
}}
STRUCT!{struct D2D1_SVG_VIEWBOX {
    x: FLOAT,
    y: FLOAT,
    width: FLOAT,
    height: FLOAT,
}}
DEFINE_GUID!{IID_ID2D1SvgAttribute,
    0xc9cdb0dd, 0xf8c9, 0x4e70, 0xb7, 0xc2, 0x30, 0x1c, 0x80, 0x29, 0x2c, 0x5e}
DEFINE_GUID!{IID_ID2D1SvgPaint,
    0xd59bab0a, 0x68a2, 0x455b, 0xa5, 0xdc, 0x9e, 0xb2, 0x85, 0x4e, 0x24, 0x90}
DEFINE_GUID!{IID_ID2D1SvgStrokeDashArray,
    0xf1c0ca52, 0x92a3, 0x4f00, 0xb4, 0xce, 0xf3, 0x56, 0x91, 0xef, 0xd9, 0xd9}
DEFINE_GUID!{IID_ID2D1SvgPointCollection,
    0x9dbe4c0d, 0x3572, 0x4dd9, 0x98, 0x25, 0x55, 0x30, 0x81, 0x3b, 0xb7, 0x12}
DEFINE_GUID!{IID_ID2D1SvgPathData,
    0xc095e4f4, 0xbb98, 0x43d6, 0x97, 0x45, 0x4d, 0x1b, 0x84, 0xec, 0x98, 0x88}
DEFINE_GUID!{IID_ID2D1SvgElement,
    0xac7b67a6, 0x183e, 0x49c1, 0xa8, 0x23, 0x0e, 0xbe, 0x40, 0xb0, 0xdb, 0x29}
DEFINE_GUID!{IID_ID2D1SvgDocument,
    0x86b88e4d, 0xafa4, 0x4d7b, 0x88, 0xe4, 0x68, 0xa5, 0x1c, 0x4a, 0x0a, 0xec}
RIDL!{#[uuid(0xc9cdb0dd, 0xf8c9, 0x4e70, 0xb7, 0xc2, 0x30, 0x1c, 0x80, 0x29, 0x2c, 0x5e)]
interface ID2D1SvgAttribute(ID2D1SvgAttributeVtbl): ID2D1Resource(ID2D1ResourceVtbl) {
    fn GetElement(
        element: *mut *mut ID2D1SvgElement,
    ) -> (),
    fn Clone(
        attribute: *mut *mut ID2D1SvgAttribute,
    ) -> HRESULT,
}}
RIDL!{#[uuid(0xd59bab0a, 0x68a2, 0x455b, 0xa5, 0xdc, 0x9e, 0xb2, 0x85, 0x4e, 0x24, 0x90)]
interface ID2D1SvgPaint(ID2D1SvgPaintVtbl): ID2D1SvgAttribute(ID2D1SvgAttributeVtbl) {
    fn SetPaintType(
        paintType: D2D1_SVG_PAINT_TYPE,
    ) -> HRESULT,
    fn GetPaintType() -> D2D1_SVG_PAINT_TYPE,
    fn SetColor(
        color: D2D1_COLOR_F,
    ) -> HRESULT,
    fn GetColor(
        color: *mut D2D1_COLOR_F,
    ) -> (),
    fn SetId(
        id: PCWSTR,
    ) -> HRESULT,
    fn GetId(
        id: PWSTR,
        idCount: UINT32,
    ) -> HRESULT,
    fn GetIdLength() -> UINT32,
}}
RIDL!{#[uuid(0xf1c0ca52, 0x92a3, 0x4f00, 0xb4, 0xce, 0xf3, 0x56, 0x91, 0xef, 0xd9, 0xd9)]
interface ID2D1SvgStrokeDashArray(ID2D1SvgStrokeDashArrayVtbl):
    ID2D1SvgAttribute(ID2D1SvgAttributeVtbl) {
    fn RemoveDashesAtEnd(
        dashesCount: UINT32,
    ) -> HRESULT,
    fn UpdateDashes_1(
        dashes: *const D2D1_SVG_LENGTH,
        dashesCount: UINT32,
        startIndex: UINT32,
    ) -> HRESULT,
    fn UpdateDashes_2(
        dashes: *const FLOAT,
        dashesCount: UINT32,
        startIndex: UINT32,
    ) -> HRESULT,
    fn GetDashes_1(
        dashes: *mut D2D1_SVG_LENGTH,
        dashesCount: UINT32,
        startIndex: UINT32,
    ) -> HRESULT,
    fn GetDashes_2(
        dashes: *mut FLOAT,
        dashesCount: UINT32,
        startIndex: UINT32,
    ) -> HRESULT,
    fn GetDashesCount() -> UINT32,
}}
RIDL!{#[uuid(0x9dbe4c0d, 0x3572, 0x4dd9, 0x98, 0x25, 0x55, 0x30, 0x81, 0x3b, 0xb7, 0x12)]
interface ID2D1SvgPointCollection(ID2D1SvgPointCollectionVtbl):
    ID2D1SvgAttribute(ID2D1SvgAttributeVtbl) {
    fn RemovePointsAtEnd(
        pointsCount: UINT32,
    ) -> HRESULT,
    fn UpdatePoints(
        points: *const D2D1_POINT_2F,
        pointsCount: UINT32,
        startIndex: UINT32,
    ) -> HRESULT,
    fn GetPoints(
        points: *mut D2D1_POINT_2F,
        pointsCount: UINT32,
        startIndex: UINT32,
    ) -> HRESULT,
    fn GetPointsCount() -> UINT32,
}}
RIDL!{#[uuid(0xc095e4f4, 0xbb98, 0x43d6, 0x97, 0x45, 0x4d, 0x1b, 0x84, 0xec, 0x98, 0x88)]
interface ID2D1SvgPathData(ID2D1SvgPathDataVtbl): ID2D1SvgAttribute(ID2D1SvgAttributeVtbl) {
    fn RemoveSegmentDataAtEnd(
        dataCount: UINT32,
    ) -> HRESULT,
    fn UpdateSegmentData(
        data: *const FLOAT,
        dataCount: UINT32,
        startIndex: UINT32,
    ) -> HRESULT,
    fn GetSegmentData(
        data: *mut FLOAT,
        dataCount: UINT32,
        startIndex: UINT32,
    ) -> HRESULT,
    fn GetSegmentDataCount() -> UINT32,
    fn RemoveCommandsAtEnd(
        commandsCount: UINT32,
    ) -> HRESULT,
    fn UpdateCommands(
        commands: *const D2D1_SVG_PATH_COMMAND,
        commandsCount: UINT32,
        startIndex: UINT32,
    ) -> HRESULT,
    fn GetCommands(
        commands: *mut D2D1_SVG_PATH_COMMAND,
        commandsCount: UINT32,
        startIndex: UINT32,
    ) -> HRESULT,
    fn GetCommandsCount() -> UINT32,
    fn CreatePathGeometry(
        fillMode: D2D1_FILL_MODE,
        pathGeometry: *mut *mut ID2D1PathGeometry1,
    ) -> HRESULT,
}}
RIDL!{#[uuid(0xac7b67a6, 0x183e, 0x49c1, 0xa8, 0x23, 0x0e, 0xbe, 0x40, 0xb0, 0xdb, 0x29)]
interface ID2D1SvgElement(ID2D1SvgElementVtbl): ID2D1Resource(ID2D1ResourceVtbl) {
    fn GetDocument(
        document: *mut *mut ID2D1SvgDocument,
    ) -> (),
    fn GetTagName(
        name: PWSTR,
        nameCount: UINT32,
    ) -> HRESULT,
    fn GetTagNameLength() -> UINT32,
    fn IsTextContent() -> BOOL,
    fn GetParent(
        parent: *mut *mut ID2D1SvgElement,
    ) -> (),
    fn HasChildren() -> BOOL,
    fn GetFirstChild(
        child: *mut *mut ID2D1SvgElement,
    ) -> (),
    fn GetLastChild(
        child: *mut *mut ID2D1SvgElement,
    ) -> (),
    fn GetPreviousChild(
        referenceChild: *mut ID2D1SvgElement,
        previousChild: *mut *mut ID2D1SvgElement,
    ) -> HRESULT,
    fn GetNextChild(
        referenceChild: *mut ID2D1SvgElement,
        nextChild: *mut *mut ID2D1SvgElement,
    ) -> HRESULT,
    fn InsertChildBefore(
        newChild: *mut ID2D1SvgElement,
        referenceChild: *mut ID2D1SvgElement,
    ) -> HRESULT,
    fn AppendChild(
        newChild: *mut ID2D1SvgElement,
    ) -> HRESULT,
    fn ReplaceChild(
        newChild: *mut ID2D1SvgElement,
        oldChild: *mut ID2D1SvgElement,
    ) -> HRESULT,
    fn RemoveChild(
        oldChild: *mut ID2D1SvgElement,
    ) -> HRESULT,
    fn IsAttributeSpecified(
        name: PCWSTR, inherited: *mut BOOL,
    ) -> BOOL,
    fn GetSpecifiedAttributeCount() -> UINT32,
    fn GetSpecifiedAttributeName(
        index: UINT32,
        name: PWSTR,
        nameCount: UINT32,
        inherited: *mut BOOL,
    ) -> HRESULT,
    fn GetSpecifiedAttributeNameLength(
        index: UINT32,
        nameLength: *mut UINT32,
        inherited: *mut BOOL,
    ) -> HRESULT,
    fn RemoveAttribute(
        name: PCWSTR,
    ) -> HRESULT,
    fn SetTextValue(
        name: *const WCHAR,
        nameCount: UINT32,
    ) -> HRESULT,
    fn GetTextValue(
        name: PWSTR,
        nameCount: UINT32,
    ) -> HRESULT,
    fn GetTextValueLength() -> UINT32,
    fn SetAttributeValue_1(
        name: PCWSTR,
        value: *mut ID2D1SvgAttribute,
    ) -> HRESULT,
    fn SetAttributeValue_2(
        name: PCWSTR,
        type_: D2D1_SVG_ATTRIBUTE_POD_TYPE,
        value: *const c_void,
        valueSizeInBytes: UINT32,
    ) -> HRESULT,
    fn SetAttributeValue_3(
        name: PCWSTR,
        type_: D2D1_SVG_ATTRIBUTE_STRING_TYPE,
        value: PCWSTR,
    ) -> HRESULT,
    fn GetAttributeValue_1(
        name: PCWSTR,
        riid: REFIID,
        value: *mut *mut c_void,
    ) -> HRESULT,
    fn GetAttributeValue_2(
        name: PCWSTR,
        type_: D2D1_SVG_ATTRIBUTE_POD_TYPE,
        value: *mut c_void,
        valueSizeInBytes: UINT32,
    ) -> HRESULT,
    fn GetAttributeValue_3(
        name: PCWSTR,
        type_: D2D1_SVG_ATTRIBUTE_STRING_TYPE,
        value: PWSTR,
        valueCount: UINT32,
    ) -> HRESULT,
    fn GetAttributeValueLength(
        name: PCWSTR,
        type_: D2D1_SVG_ATTRIBUTE_STRING_TYPE,
        valueLength: *mut UINT32,
    ) -> HRESULT,
}}
RIDL!{#[uuid(0x86b88e4d, 0xafa4, 0x4d7b, 0x88, 0xe4, 0x68, 0xa5, 0x1c, 0x4a, 0x0a, 0xec)]
interface ID2D1SvgDocument(ID2D1SvgDocumentVtbl): ID2D1Resource(ID2D1ResourceVtbl) {
    fn SetViewportSize(
        viewportSize: D2D1_SIZE_F,
    ) -> HRESULT,
    fn GetViewportSize() -> D2D1_SIZE_F,
    fn SetRoot(
        root: *mut ID2D1SvgElement,
    ) -> HRESULT,
    fn GetRoot(
        root: *mut *mut ID2D1SvgElement,
    ) -> (),
    fn FindElementById(
        id: PCWSTR,
        svgElement: *mut *mut ID2D1SvgElement,
    ) -> HRESULT,
    fn Serialize(
        outputXmlStream: *mut IStream,
        subtree: *mut ID2D1SvgElement,
    ) -> HRESULT,
    fn Deserialize(
        inputXmlStream: *mut IStream,
        subtree: *mut *mut ID2D1SvgElement,
    ) -> HRESULT,
    fn CreatePaint(
        paintType: D2D1_SVG_PAINT_TYPE,
        color: *const D2D1_COLOR_F,
        id: PCWSTR,
        paint: *mut *mut ID2D1SvgPaint,
    ) -> HRESULT,
    fn CreateStrokeDashArray(
        dashes: *const D2D1_SVG_LENGTH,
        dashesCount: UINT32,
        strokeDashArray: *mut *mut ID2D1SvgStrokeDashArray,
    ) -> HRESULT,
    fn CreatePointCollection(
        points: *const D2D1_POINT_2F,
        pountsCount: UINT32,
        pointCollection: *mut ID2D1SvgPointCollection,
    ) -> HRESULT,
    fn CreatePathData(
        segmentData: *const FLOAT,
        segmentDataCount: UINT32,
        commands: *const D2D1_SVG_PATH_COMMAND,
        commandsCount: UINT32,
        pathData: *mut *mut ID2D1SvgPathData,
    ) -> HRESULT,
}}
