/*
 * Copyright 2014 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 "dwrite_1.idl";

typedef enum DWRITE_OPTICAL_ALIGNMENT
{
    DWRITE_OPTICAL_ALIGNMENT_NONE,
    DWRITE_OPTICAL_ALIGNMENT_NO_SIDE_BEARINGS
} DWRITE_OPTICAL_ALIGNMENT;

typedef enum DWRITE_GRID_FIT_MODE
{
    DWRITE_GRID_FIT_MODE_DEFAULT,
    DWRITE_GRID_FIT_MODE_DISABLED,
    DWRITE_GRID_FIT_MODE_ENABLED
} DWRITE_GRID_FIT_MODE;

typedef struct DWRITE_TEXT_METRICS1
{
    /* DWRITE_TEXT_METRICS fields */
    FLOAT left;
    FLOAT top;
    FLOAT width;
    FLOAT widthIncludingTrailingWhitespace;
    FLOAT height;
    FLOAT layoutWidth;
    FLOAT layoutHeight;
    UINT32 maxBidiReorderingDepth;
    UINT32 lineCount;
    /* DWRITE_TEXT_METRICS1 fields */
    FLOAT heightIncludingTrailingWhitespace;
} DWRITE_TEXT_METRICS1;

typedef struct _D3DCOLORVALUE
{
    union {
        FLOAT r;
        FLOAT dvR;
    };
    union {
        FLOAT g;
        FLOAT dvG;
    };
    union {
        FLOAT b;
        FLOAT dvB;
    };
    union {
        FLOAT a;
        FLOAT dvA;
    };
} D3DCOLORVALUE;

typedef D3DCOLORVALUE DWRITE_COLOR_F;

typedef struct DWRITE_COLOR_GLYPH_RUN
{
    DWRITE_GLYPH_RUN glyphRun;
    DWRITE_GLYPH_RUN_DESCRIPTION* glyphRunDescription;
    FLOAT baselineOriginX;
    FLOAT baselineOriginY;
    DWRITE_COLOR_F runColor;
    UINT16 paletteIndex;
} DWRITE_COLOR_GLYPH_RUN;

[
    local,
    object,
    uuid(d3e0e934-22a0-427e-aae4-7d9574b59db1)
]
interface IDWriteTextRenderer1 : IDWriteTextRenderer
{
    HRESULT DrawGlyphRun(void *context,
                         FLOAT originX,
                         FLOAT originY,
                         DWRITE_GLYPH_ORIENTATION_ANGLE angle,
                         DWRITE_MEASURING_MODE mode,
                         DWRITE_GLYPH_RUN const *run,
                         DWRITE_GLYPH_RUN_DESCRIPTION const *rundescr,
                         IUnknown *effect);

    HRESULT DrawUnderline(void *context,
                          FLOAT originX,
                          FLOAT originY,
                          DWRITE_GLYPH_ORIENTATION_ANGLE angle,
                          DWRITE_UNDERLINE const *underline,
                          IUnknown *effect);

    HRESULT DrawStrikethrough(void *context,
                              FLOAT originX,
                              FLOAT originY,
                              DWRITE_GLYPH_ORIENTATION_ANGLE angle,
                              DWRITE_STRIKETHROUGH const *strikethrough,
                              IUnknown *effect
                             );

    HRESULT DrawInlineObject(void *context,
                             FLOAT originX,
                             FLOAT originY,
                             DWRITE_GLYPH_ORIENTATION_ANGLE angle,
                             IDWriteInlineObject *inlineObject,
                             BOOL is_sideways,
                             BOOL is_rtl,
                             IUnknown *effect
                            );
}

[
    local,
    object,
    uuid(efa008f9-f7a1-48bf-b05c-f224713cc0ff)
]
interface IDWriteFontFallback : IUnknown
{
    HRESULT MapCharacters(IDWriteTextAnalysisSource *source,
                          UINT32 position,
                          UINT32 length,
                          IDWriteFontCollection *basecollection,
                          const WCHAR *baseFamilyName,
                          DWRITE_FONT_WEIGHT baseWeight,
                          DWRITE_FONT_STYLE baseStyle,
                          DWRITE_FONT_STRETCH baseStretch,
                          UINT32 *mappedLength,
                          IDWriteFont **mappedFont,
                          FLOAT *scale
                         );
}

[
    local,
    object,
    uuid(5f174b49-0d8b-4cfb-8bca-f1cce9d06c67)
]
interface IDWriteTextFormat1 : IDWriteTextFormat
{
    HRESULT SetVerticalGlyphOrientation(DWRITE_VERTICAL_GLYPH_ORIENTATION orientation);
    DWRITE_VERTICAL_GLYPH_ORIENTATION GetVerticalGlyphOrientation();
    HRESULT SetLastLineWrapping(BOOL lastline_wrapping_enabled);
    BOOL GetLastLineWrapping();
    HRESULT SetOpticalAlignment(DWRITE_OPTICAL_ALIGNMENT alignment);
    DWRITE_OPTICAL_ALIGNMENT GetOpticalAlignment();
    HRESULT SetFontFallback(IDWriteFontFallback *fallback);
    HRESULT GetFontFallback(IDWriteFontFallback **fallback);
}

[
    local,
    object,
    uuid(1093c18f-8d5e-43f0-b064-0917311b525e)
]
interface IDWriteTextLayout2 : IDWriteTextLayout1
{
    HRESULT GetMetrics(DWRITE_TEXT_METRICS1 *metrics);
    HRESULT SetVerticalGlyphOrientation(DWRITE_VERTICAL_GLYPH_ORIENTATION orientation);
    DWRITE_VERTICAL_GLYPH_ORIENTATION GetVerticalGlyphOrientation();
    HRESULT SetLastLineWrapping(BOOL lastline_wrapping_enabled);
    BOOL GetLastLineWrapping();
    HRESULT SetOpticalAlignment(DWRITE_OPTICAL_ALIGNMENT alignment);
    DWRITE_OPTICAL_ALIGNMENT GetOpticalAlignment();
    HRESULT SetFontFallback(IDWriteFontFallback *fallback);
    HRESULT GetFontFallback(IDWriteFontFallback **fallback);
}

[
    local,
    object,
    uuid(553a9ff3-5693-4df7-b52b-74806f7f2eb9)
]
interface IDWriteTextAnalyzer2 : IDWriteTextAnalyzer1
{
    HRESULT GetGlyphOrientationTransform(DWRITE_GLYPH_ORIENTATION_ANGLE angle,
                                         BOOL is_sideways,
                                         FLOAT originX,
                                         FLOAT originY,
                                         DWRITE_MATRIX *transform
                                        );
    HRESULT GetTypographicFeatures(IDWriteFontFace *fontface,
                                   DWRITE_SCRIPT_ANALYSIS analysis,
                                   const WCHAR *localeName,
                                   UINT32 max_tagcount,
                                   UINT32 *actual_tagcount,
                                   DWRITE_FONT_FEATURE_TAG *tags
                                  );

    HRESULT CheckTypographicFeature(IDWriteFontFace *fontface,
                                    DWRITE_SCRIPT_ANALYSIS analysis,
                                    const WCHAR *localeName,
                                    DWRITE_FONT_FEATURE_TAG feature,
                                    UINT32 glyph_count,
                                    const UINT16 *indices,
                                    UINT8 *feature_applies
                                   );
}

[
    local,
    object,
    uuid(fd882d06-8aba-4fb8-b849-8be8b73e14de)
]
interface IDWriteFontFallbackBuilder : IUnknown
{
    HRESULT AddMapping(const DWRITE_UNICODE_RANGE *ranges,
                       UINT32 rangesCount,
                       WCHAR const **targetFamilyNames,
                       UINT32 targetFamilyNamesCount,
                       [defaultvalue(NULL)] IDWriteFontCollection *collection,
                       [defaultvalue(NULL)] WCHAR const *localeName,
                       [defaultvalue(NULL)] WCHAR const *baseFamilyName,
                       [defaultvalue(1)] FLOAT scale
                      );
    HRESULT AddMappings(IDWriteFontFallback *fallback);
    HRESULT CreateFontFallback(IDWriteFontFallback **fallback);
}

[
    local,
    object,
    uuid(29748ed6-8c9c-4a6a-be0b-d912e8538944)
]
interface IDWriteFont2 : IDWriteFont1
{
    BOOL IsColorFont();
}

[
    local,
    object,
    uuid(d8b768ff-64bc-4e66-982b-ec8e87f693f7)
]
interface IDWriteFontFace2 : IDWriteFontFace1
{
    BOOL IsColorFont();
    UINT32 GetColorPaletteCount();
    UINT32 GetPaletteEntryCount();
    HRESULT GetPaletteEntries(UINT32 palette_index,
                              UINT32 first_entry_index,
                              UINT32 entry_count,
                              DWRITE_COLOR_F *entries
                             );
    HRESULT GetRecommendedRenderingMode(FLOAT fontEmSize,
                                        FLOAT dpiX,
                                        FLOAT dpiY,
                                        DWRITE_MATRIX const *transform,
                                        BOOL is_sideways,
                                        DWRITE_OUTLINE_THRESHOLD threshold,
                                        DWRITE_MEASURING_MODE measuringmode,
                                        IDWriteRenderingParams *params,
                                        DWRITE_RENDERING_MODE *renderingmode,
                                        DWRITE_GRID_FIT_MODE *gridfitmode
                                       );
}

[
    local,
    object,
    uuid(d31fbe17-f157-41a2-8d24-cb779e0560e8)
]
interface IDWriteColorGlyphRunEnumerator : IUnknown
{
    HRESULT MoveNext(BOOL *hasRun);
    HRESULT GetCurrentRun(DWRITE_COLOR_GLYPH_RUN const **run);
}

[
    local,
    object,
    uuid(f9d711c3-9777-40ae-87e8-3e5aF9bf0948)
]
interface IDWriteRenderingParams2 : IDWriteRenderingParams1
{
    DWRITE_GRID_FIT_MODE GetGridFitMode();
};

[
    local,
    object,
    uuid(0439fc60-ca44-4994-8dee-3a9af7b732ec)
]
interface IDWriteFactory2 : IDWriteFactory1
{
    HRESULT GetSystemFontFallback(IDWriteFontFallback **fallback);
    HRESULT CreateFontFallbackBuilder(IDWriteFontFallbackBuilder **fallbackbuilder);
    HRESULT TranslateColorGlyphRun(FLOAT originX,
                                   FLOAT originY,
                                   const DWRITE_GLYPH_RUN *run,
                                   const DWRITE_GLYPH_RUN_DESCRIPTION *rundescr,
                                   DWRITE_MEASURING_MODE mode,
                                   const DWRITE_MATRIX *transform,
                                   UINT32 palette_index,
                                   IDWriteColorGlyphRunEnumerator **colorlayers
                                  );

    HRESULT CreateCustomRenderingParams(FLOAT gamma,
                                        FLOAT contrast,
                                        FLOAT grayscalecontrast,
                                        FLOAT cleartypeLevel,
                                        DWRITE_PIXEL_GEOMETRY pixelGeometry,
                                        DWRITE_RENDERING_MODE renderingMode,
                                        DWRITE_GRID_FIT_MODE gridFitMode,
                                        IDWriteRenderingParams2 **params
                                       );

    HRESULT CreateGlyphRunAnalysis(const DWRITE_GLYPH_RUN *run,
                                   const DWRITE_MATRIX *transform,
                                   DWRITE_RENDERING_MODE renderingMode,
                                   DWRITE_MEASURING_MODE measuringMode,
                                   DWRITE_GRID_FIT_MODE gridFitMode,
                                   DWRITE_TEXT_ANTIALIAS_MODE antialiasMode,
                                   FLOAT originX,
                                   FLOAT originY,
                                   IDWriteGlyphRunAnalysis **analysis
                                  );
}
