/*
 * Copyright (C) 2024 Biswapriyo Nath
 *
 * 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
 */

#ifdef __WIDL__
#pragma winrt ns_prefix
#endif

import "inspectable.idl";
import "asyncinfo.idl";
import "eventtoken.idl";
import "windowscontracts.idl";
import "windows.foundation.idl";
import "windows.graphics.directx.direct3d11.idl";
import "windows.storage.streams.idl";

namespace Windows.Graphics.Imaging {
    typedef enum BitmapAlphaMode BitmapAlphaMode;
    typedef enum BitmapBufferAccessMode BitmapBufferAccessMode;
    typedef enum BitmapPixelFormat BitmapPixelFormat;
    typedef struct BitmapBounds BitmapBounds;
    typedef struct BitmapPlaneDescription BitmapPlaneDescription;
    typedef struct BitmapSize BitmapSize;

    interface IBitmapBuffer;
    interface ISoftwareBitmap;
    interface ISoftwareBitmapFactory;
    interface ISoftwareBitmapStatics;

    runtimeclass BitmapBuffer;
    runtimeclass SoftwareBitmap;

    declare {
        interface Windows.Foundation.Collections.IIterable<Windows.Graphics.Imaging.BitmapPixelFormat>;
        interface Windows.Foundation.Collections.IIterable<Windows.Graphics.Imaging.SoftwareBitmap *>;
        interface Windows.Foundation.Collections.IIterator<Windows.Graphics.Imaging.BitmapPixelFormat>;
        interface Windows.Foundation.Collections.IIterator<Windows.Graphics.Imaging.SoftwareBitmap *>;
        interface Windows.Foundation.Collections.IVectorView<Windows.Graphics.Imaging.BitmapPixelFormat>;
        interface Windows.Foundation.IAsyncOperation<Windows.Graphics.Imaging.SoftwareBitmap *>;
        interface Windows.Foundation.AsyncOperationCompletedHandler<Windows.Graphics.Imaging.SoftwareBitmap *>;
        interface Windows.Foundation.IReference<Windows.Graphics.Imaging.BitmapBounds>;
    }

    [contract(Windows.Foundation.UniversalApiContract, 1.0)]
    enum BitmapAlphaMode
    {
        Premultiplied = 0,
        Straight      = 1,
        Ignore        = 2,
    };

    [contract(Windows.Foundation.UniversalApiContract, 1.0)]
    enum BitmapBufferAccessMode
    {
        Read      = 0,
        ReadWrite = 1,
        Write     = 2,
    };

    [contract(Windows.Foundation.UniversalApiContract, 1.0)]
    enum BitmapPixelFormat
    {
        Unknown = 0,
        Rgba16  = 12,
        Rgba8   = 30,
        [contract(Windows.Foundation.UniversalApiContract, 1.0)]
        Gray16  = 57,
        [contract(Windows.Foundation.UniversalApiContract, 1.0)]
        Gray8   = 62,
        Bgra8   = 87,
        [contract(Windows.Foundation.UniversalApiContract, 1.0)]
        Nv12    = 103,
        [contract(Windows.Foundation.UniversalApiContract, 6.0)]
        P010    = 104,
        [contract(Windows.Foundation.UniversalApiContract, 1.0)]
        Yuy2    = 107,
    };

    [contract(Windows.Foundation.UniversalApiContract, 1.0)]
    struct BitmapBounds
    {
        UINT32 X;
        UINT32 Y;
        UINT32 Width;
        UINT32 Height;
    };

    [contract(Windows.Foundation.UniversalApiContract, 1.0)]
    struct BitmapPlaneDescription
    {
        INT32 StartIndex;
        INT32 Width;
        INT32 Height;
        INT32 Stride;
    };

    [contract(Windows.Foundation.UniversalApiContract, 1.0)]
    struct BitmapSize
    {
        UINT32 Width;
        UINT32 Height;
    };

    [
        contract(Windows.Foundation.UniversalApiContract, 1.0),
        exclusiveto(Windows.Graphics.Imaging.BitmapBuffer),
        uuid(a53e04c4-399c-438c-b28f-a63a6b83d1a1)
    ]
    interface IBitmapBuffer : IInspectable
        requires Windows.Foundation.IMemoryBuffer, Windows.Foundation.IClosable
    {
        HRESULT GetPlaneCount([out, retval] INT32 *value);
        HRESULT GetPlaneDescription([in] INT32 index, [out, retval] Windows.Graphics.Imaging.BitmapPlaneDescription *value);
    }

    [
        contract(Windows.Foundation.UniversalApiContract, 1.0),
        exclusiveto(Windows.Graphics.Imaging.SoftwareBitmap),
        uuid(689e0708-7eef-483f-963f-da938818e073)
    ]
    interface ISoftwareBitmap : IInspectable
        requires Windows.Foundation.IClosable
    {
        [propget] HRESULT BitmapPixelFormat([out, retval] Windows.Graphics.Imaging.BitmapPixelFormat *value);
        [propget] HRESULT BitmapAlphaMode([out, retval] Windows.Graphics.Imaging.BitmapAlphaMode *value);
        [propget] HRESULT PixelWidth([out, retval] INT32 *value);
        [propget] HRESULT PixelHeight([out, retval] INT32 *value);
        [propget] HRESULT IsReadOnly([out, retval] boolean *value);
        [propput] HRESULT DpiX([in] DOUBLE value);
        [propget] HRESULT DpiX([out, retval] DOUBLE *value);
        [propput] HRESULT DpiY([in] DOUBLE value);
        [propget] HRESULT DpiY([out, retval] DOUBLE *value);
        HRESULT LockBuffer([in] Windows.Graphics.Imaging.BitmapBufferAccessMode mode,
            [out, retval] Windows.Graphics.Imaging.BitmapBuffer **value);
        HRESULT CopyTo([in] Windows.Graphics.Imaging.SoftwareBitmap *bitmap);
        HRESULT CopyFromBuffer([in] Windows.Storage.Streams.IBuffer *buffer);
        HRESULT CopyToBuffer([in] Windows.Storage.Streams.IBuffer *buffer);
        HRESULT GetReadOnlyView([out, retval] Windows.Graphics.Imaging.SoftwareBitmap **value);
    }

    [
        contract(Windows.Foundation.UniversalApiContract, 1.0),
        exclusiveto(Windows.Graphics.Imaging.SoftwareBitmap),
        uuid(c99feb69-2d62-4d47-a6b3-4fdb6a07fdf8)
    ]
    interface ISoftwareBitmapFactory : IInspectable
    {
        HRESULT Create(
            [in] Windows.Graphics.Imaging.BitmapPixelFormat format,
            [in] INT32 width,
            [in] INT32 height,
            [out, retval] Windows.Graphics.Imaging.SoftwareBitmap **value);
        HRESULT CreateWithAlpha(
            [in] Windows.Graphics.Imaging.BitmapPixelFormat format,
            [in] INT32 width,
            [in] INT32 height,
            [in] Windows.Graphics.Imaging.BitmapAlphaMode alpha,
            [out, retval] Windows.Graphics.Imaging.SoftwareBitmap **value);
    }

    [
        contract(Windows.Foundation.UniversalApiContract, 1.0),
        exclusiveto(Windows.Graphics.Imaging.SoftwareBitmap),
        uuid(df0385db-672f-4a9d-806e-c2442f343e86)
    ]
    interface ISoftwareBitmapStatics : IInspectable
    {
        HRESULT Copy(
            [in] Windows.Graphics.Imaging.SoftwareBitmap *source,
            [out, retval] Windows.Graphics.Imaging.SoftwareBitmap **value);
        [overload("Convert")]
        HRESULT Convert(
            [in] Windows.Graphics.Imaging.SoftwareBitmap *source,
            [in] Windows.Graphics.Imaging.BitmapPixelFormat format,
            [out, retval] Windows.Graphics.Imaging.SoftwareBitmap **value);
        [overload("Convert")]
        HRESULT ConvertWithAlpha(
            [in] Windows.Graphics.Imaging.SoftwareBitmap *source,
            [in] Windows.Graphics.Imaging.BitmapPixelFormat format,
            [in] Windows.Graphics.Imaging.BitmapAlphaMode alpha,
            [out, retval] Windows.Graphics.Imaging.SoftwareBitmap **value);
        [overload("CreateCopyFromBuffer")]
        HRESULT CreateCopyFromBuffer(
            [in] Windows.Storage.Streams.IBuffer *source,
            [in] Windows.Graphics.Imaging.BitmapPixelFormat format,
            [in] INT32 width,
            [in] INT32 height,
            [out, retval] Windows.Graphics.Imaging.SoftwareBitmap **value);
        [overload("CreateCopyFromBuffer")]
        HRESULT CreateCopyWithAlphaFromBuffer(
            [in] Windows.Storage.Streams.IBuffer *source,
            [in] Windows.Graphics.Imaging.BitmapPixelFormat format,
            [in] INT32 width,
            [in] INT32 height,
            [in] Windows.Graphics.Imaging.BitmapAlphaMode alpha,
            [out, retval] Windows.Graphics.Imaging.SoftwareBitmap **value);
        [overload("CreateCopyFromSurfaceAsync")]
        HRESULT CreateCopyFromSurfaceAsync(
            [in] Windows.Graphics.DirectX.Direct3D11.IDirect3DSurface *surface,
            [out, retval] Windows.Foundation.IAsyncOperation<Windows.Graphics.Imaging.SoftwareBitmap *> **value);
        [overload("CreateCopyFromSurfaceAsync")]
        HRESULT CreateCopyWithAlphaFromSurfaceAsync(
            [in] Windows.Graphics.DirectX.Direct3D11.IDirect3DSurface *surface,
            [in] Windows.Graphics.Imaging.BitmapAlphaMode alpha,
            [out, retval] Windows.Foundation.IAsyncOperation<Windows.Graphics.Imaging.SoftwareBitmap *> **value);
    }

    [
        contract(Windows.Foundation.UniversalApiContract, 1.0),
        marshaling_behavior(agile),
        threading(both)
    ]
    runtimeclass BitmapBuffer
    {
        [default] interface Windows.Graphics.Imaging.IBitmapBuffer;
        interface Windows.Foundation.IMemoryBuffer;
        interface Windows.Foundation.IClosable;
    }

    [
        activatable(Windows.Graphics.Imaging.ISoftwareBitmapFactory, Windows.Foundation.UniversalApiContract, 1.0),
        contract(Windows.Foundation.UniversalApiContract, 1.0),
        marshaling_behavior(agile),
        static(Windows.Graphics.Imaging.ISoftwareBitmapStatics, Windows.Foundation.UniversalApiContract, 1.0),
        threading(both)
    ]
    runtimeclass SoftwareBitmap
    {
        [default] interface Windows.Graphics.Imaging.ISoftwareBitmap;
        interface Windows.Foundation.IClosable;
    }
}
