/*
 * Copyright 2010 Damjan Jovanovic
 *
 * 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
 */

#pragma makedep proxy
#pragma makedep register

#include "wincodec.idl"

[
    threading(both),
    uuid(00000301-a8f2-4877-ba0a-fd2b6645fb94)  /* IWICFormatConverter */
]
coclass PSFactoryBuffer { interface IFactoryBuffer; }

[
    helpstring("WIC Imaging Factory"),
    threading(both),
    uuid(cacaf262-9370-4615-a13b-9f5539da4c0a)
]
coclass WICImagingFactory { interface IWICImagingFactory; }

[
    helpstring("WIC BMP Decoder"),
    threading(both),
    uuid(6b462062-7cbf-400d-9fdb-813dd10f2778)
]
coclass WICBmpDecoder { interface IWICBitmapDecoder; }

[
    helpstring("WIC PNG Decoder"),
    threading(both),
    uuid(389ea17b-5078-4cde-b6ef-25c15175c751)
]
coclass WICPngDecoder { interface IWICBitmapDecoder; }

[
    helpstring("WIC PNG Encoder"),
    threading(both),
    uuid(27949969-876a-41d7-9447-568f6a35a4dc)
]
coclass WICPngEncoder { interface IWICBitmapEncoder; }

[
    helpstring("WIC BMP Encoder"),
    threading(apartment),
    uuid(69be8bb4-d66d-47c8-865a-ed1589433782)
]
coclass WICBmpEncoder { interface IWICBitmapEncoder; }

[
    helpstring("WIC GIF Decoder"),
    threading(both),
    uuid(381dda3c-9ce9-4834-a23e-1f98f8fc52be)
]
coclass WICGifDecoder { interface IWICBitmapDecoder; }

[
    helpstring("WIC ICO Decoder"),
    threading(both),
    uuid(c61bfcdf-2e0f-4aad-a8d7-e06bafebcdfe)
]
coclass WICIcoDecoder { interface IWICBitmapDecoder; }

[
    helpstring("WIC JPEG Decoder"),
    threading(both),
    uuid(9456a480-e88b-43ea-9e73-0b2d9b71b1ca)
]
coclass WICJpegDecoder { interface IWICBitmapDecoder; }

[
    helpstring("WIC JPEG Encoder"),
    threading(both),
    uuid(1a34f5c1-4a5a-46dc-b644-1f4567e7a676)
]
coclass WICJpegEncoder { interface IWICBitmapEncoder; }

[
    helpstring("WIC TIFF Decoder"),
    threading(both),
    uuid(b54e85d9-fe23-499f-8b88-6acea713752b)
]
coclass WICTiffDecoder { interface IWICBitmapDecoder; }

[
    helpstring("WIC TIFF Encoder"),
    threading(both),
    uuid(0131be10-2001-4c5f-a9b0-cc88fab64ce8)
]
coclass WICTiffEncoder { interface IWICBitmapEncoder; }

[
    helpstring("WIC ICNS Encoder"),
    threading(both),
    uuid(312fb6f1-b767-409d-8a6d-0fc154d4f05c)
]
coclass WICIcnsEncoder { interface IWICBitmapEncoder; }

[
    helpstring("WIC Default Format Converter"),
    threading(both),
    uuid(1a3f11dc-b514-4b17-8c5f-2154513852f1)
]
coclass WICDefaultFormatConverter { interface IWICFormatConverter; }

[
    helpstring("WIC TGA Decoder"),
    threading(both),
    uuid(b11fc79a-67cc-43e6-a9ce-e3d54945d304)
]
coclass WineTgaDecoder { interface IWICBitmapDecoder; }

[
    helpstring("WIC Unknown Metadata Reader"),
    threading(both),
    uuid(699745c2-5066-4b82-a8e3-d40478dbec8c)
]
coclass WICUnknownMetadataReader { interface IWICMetadataReader; }

[
    helpstring("WIC Ifd Metadata Reader"),
    threading(both),
    uuid(8f914656-9d0a-4eb2-9019-0bf96d8a9ee6)
]
coclass WICIfdMetadataReader { interface IWICIfdMetadataReader; }

[
    helpstring("WIC Png tEXt Metadata Reader"),
    threading(both),
    uuid(4b59afcc-b8c3-408a-b670-89e5fab6fda7)
]
coclass WICPngTextMetadataReader { interface IWICMetadataReader; }

[
    helpstring("WIC LSD Metadata Reader"),
    threading(both),
    uuid(41070793-59e4-479a-a1f7-954adc2ef5fc)
]
coclass WICLSDMetadataReader { interface IWICMetadataReader; }

[
    helpstring("WIC IMD Metadata Reader"),
    threading(both),
    uuid(7447a267-0015-42c8-a8f1-fb3b94c68361)
]
coclass WICIMDMetadataReader { interface IWICMetadataReader; }

[
    helpstring("WIC GCE Metadata Reader"),
    threading(both),
    uuid(b92e345d-f52d-41f3-b562-081bc772e3b9)
]
coclass WICGCEMetadataReader { interface IWICMetadataReader; }

[
    helpstring("WIC Application Extension Reader"),
    threading(both),
    uuid(1767b93a-b021-44ea-920f-863c11f4f768)
]
coclass WICAPEMetadataReader { interface IWICMetadataReader; }

[
    helpstring("WIC Comment Extension Reader"),
    threading(both),
    uuid(32557d3b-69dc-4f95-836e-f5972b2f6159)
]
coclass WICGifCommentMetadataReader { interface IWICMetadataReader; }
