/*
 * Copyright 2016 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 "propidl.idl";

cpp_quote("#ifndef _GDIPLUSPIXELFORMATS_H")
typedef DWORD PixelFormat;
cpp_quote("#endif")

cpp_quote("#ifndef _GDIPLUSENUMS_H")
typedef DWORD InterpolationMode;
cpp_quote("#endif")

cpp_quote("#ifndef _GDIPLUSHEADERS_H")
typedef BYTE EncoderParameters;
typedef BYTE Image;
cpp_quote("#endif")

[
    object,
    uuid(53fb8e58-50c0-4003-b4aa-0c8df28e7f3a)
]
interface IShellImageDataAbort : IUnknown
{
    HRESULT QueryAbort();
}

[
    object,
    local,
    uuid(bfdeec12-8040-4403-a5ea-9e07dafcf530)
]
interface IShellImageData : IUnknown
{
    HRESULT Decode([in] DWORD flags, [in] ULONG cx_desired, [in] ULONG cy_desired);
    HRESULT Draw([in] HDC hdc, [in] RECT *dest, [in] RECT *src);
    HRESULT NextFrame();
    HRESULT NextPage();
    HRESULT PrevPage();
    HRESULT IsTransparent();
    HRESULT IsAnimated();
    HRESULT IsVector();
    HRESULT IsMultipage();
    HRESULT IsEditable();
    HRESULT IsPrintable();
    HRESULT IsDecoded();
    HRESULT GetCurrentPage([out] ULONG *page);
    HRESULT GetPageCount([out] ULONG *count);
    HRESULT SelectPage([in] ULONG page);
    HRESULT GetSize([out] SIZE *size);
    HRESULT GetRawDataFormat([out] GUID *format);
    HRESULT GetPixelFormat([out] PixelFormat *format);
    HRESULT GetDelay([out] DWORD *delay);
    HRESULT GetProperties([in] DWORD mode, [out] IPropertySetStorage **props);
    HRESULT Rotate([in] DWORD angle);
    HRESULT Scale([in] ULONG cx, [in] ULONG cy, [in] InterpolationMode mode);
    HRESULT DiscardEdit();
    HRESULT SetEncoderParams([in] IPropertyBag *params);
    HRESULT DisplayName([size_is(count), in, out] LPWSTR name, UINT count);
    HRESULT GetResolution([out] ULONG *res_x, [out] ULONG *res_y);
    HRESULT GetEncoderParams([in] GUID *format, [out] EncoderParameters **params);
    HRESULT RegisterAbort([in] IShellImageDataAbort *abort, [out] IShellImageDataAbort **prev);
    HRESULT CloneFrame([out] Image **frame);
    HRESULT ReplaceFrame([in] Image *frame);
}

[
    object,
    uuid(9be8ed5c-edab-4d75-90f3-bd5bdbb21c82)
]
interface IShellImageDataFactory : IUnknown
{
    HRESULT CreateIShellImageData([out] IShellImageData **data);
    HRESULT CreateImageFromFile([in] LPCWSTR path, [out] IShellImageData **data);
    HRESULT CreateImageFromStream([in] IStream *stream, [out] IShellImageData **data);
    HRESULT GetDataFormatFromPath([in] LPCWSTR path, [out] GUID *format);
}
