/*
 * 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 cHRM Metadata Reader"),
    threading(both),
    uuid(f90b5f36-367b-402a-9dd1-bc0fd59d8f62)
]
coclass WICPngChrmMetadataReader { interface IWICMetadataReader; }

[
    helpstring("WIC Png gAMA Metadata Reader"),
    threading(both),
    uuid(3692ca39-e082-4350-9e1f-3704cb083cd5)
]
coclass WICPngGamaMetadataReader { interface IWICMetadataReader; }

[
    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; }
