import "oleidl.idl";
import "shobjidl.idl";
import "propidl.idl";

interface IShellImageDataFactory;
interface IShellImageData;
interface IShellImageDataAbort;
interface IHWEventHandler;

// external definitions
cpp_quote("#if !defined(_GDIPLUSPIXELFORMATS_H)")
typedef DWORD PixelFormat;
cpp_quote("#endif")

cpp_quote("#if !defined(_GDIPLUSENUMS_H)")
typedef DWORD InterpolationMode;
cpp_quote("#endif")

cpp_quote("#if !defined(_GDIPLUSHEADERS_H)")
typedef BYTE EncoderParameters;
typedef BYTE Image;
cpp_quote("#endif")

// property bag strings for SetEncoderParams
cpp_quote("#define  SHIMGKEY_QUALITY    L\"Compression\"")
cpp_quote("#define  SHIMGKEY_RAWFORMAT  L\"RawDataFormat\"")
cpp_quote("")

// Decode() flags (bit fields)
cpp_quote("#define  SHIMGDEC_DEFAULT            0x00000000")    // creates a full Image
cpp_quote("#define  SHIMGDEC_THUMBNAIL          0x00000001")    // decodes only thumbnail image
cpp_quote("#define  SHIMGDEC_LOADFULL           0x00000002")    // load the whole file into memory

// Some custom error codes
cpp_quote("#define  E_NOTVALIDFORANIMATEDIMAGE  MAKE_HRESULT(SEVERITY_ERROR, FACILITY_ITF, 0x01)")  // operation is not valid for animated images, for example IShellImageData::Rotate will fail for animated images with this code


[
    helpstring("IShellImageDataFactory"),
    uuid(9be8ed5c-edab-4d75-90f3-bd5bdbb21c82),
    object,
    pointer_default(unique)
]
interface IShellImageDataFactory : IUnknown
{
    HRESULT CreateIShellImageData(
        [out] IShellImageData **ppshimg);

    // Easy functions for loading and saving from a file or stream

    HRESULT CreateImageFromFile( 
        [in] LPCWSTR pszPath,
        [out] IShellImageData **ppshimg);

    HRESULT CreateImageFromStream( 
        [in] IStream *pStream,
        [out] IShellImageData **ppshimg);
        
    // looks up the extension in the registry, gets the content type, and looks up the appropriate IMGFMT_*
    // value.
    HRESULT GetDataFormatFromPath(
        [in] LPCWSTR pszPath,
        [out] GUID *pDataFormat);
}

[
    helpstring("IShellImageData"),
    uuid(bfdeec12-8040-4403-a5ea-9e07dafcf530),
    object,
    pointer_default(unique)
]
interface IShellImageData : IUnknown
{
   // Start the decode process setting state (for thumbnails etc)

    HRESULT Decode(
        [in] DWORD dwFlags,
        [in] ULONG cxDesired,
        [in] ULONG cyDesired);

   // Draw the current image to the screen

    HRESULT Draw(
        [in] HDC hdc, 
        [in] LPRECT prcDest, 
        [in] LPRECT prcSrc);

    // Multipage support

    // switches to next frame if it's available
    // starts decoder and returns E_PENDING if next frame is not available yet
    // will loop or return E_NOMOREDATA based on the image contents

    HRESULT NextFrame();

    // dumps any animation data, switchs to the next page, and resets the animation data for that page.  
    // Returns E_NOMOREDATA if there is no next page.    

    HRESULT NextPage();     
    HRESULT PrevPage();
    
    //
    // Query functions.  They return S_OK if condition is true, S_FALSE if not.  Use should be 
    // self-explanatory from function name...
    //
    
    HRESULT IsTransparent();
    HRESULT IsAnimated();
    HRESULT IsVector();
    HRESULT IsMultipage();
    HRESULT IsEditable();
    HRESULT IsPrintable();
    HRESULT IsDecoded();

    // step through the pages in the image 

    HRESULT GetCurrentPage(
      [out] ULONG *pnPage);

    HRESULT GetPageCount(
      [out] ULONG *pcPages);

    HRESULT SelectPage(
      [in] ULONG iPage);

    // Fetch information on image
    HRESULT GetSize(
      [out] SIZE *pSize);

    HRESULT GetRawDataFormat(
      [out] GUID *pDataFormat);

    HRESULT GetPixelFormat(
      [out] PixelFormat *pFormat);

    HRESULT GetDelay(
      [out] DWORD *pdwDelay);        // delay can be different for every frame

    // dwMode is STGM_* flags
    HRESULT GetProperties(
        [in] DWORD dwMode,
        [out] IPropertySetStorage **ppPropSet);
        
    //
    // Rotate with specified angle in 90 degree increments
    //

    HRESULT Rotate(
      [in] DWORD dwAngle);
        
    // Scale with aspect correction when one of the scale factors is 0.  
    // Scale to specified dimensions if both values are non-zero
    // examples: Scale(300, 0) sets X to 300 and Y to the correct scaled value based on X
    //           Scale(0, 200) sets Y to 200 and X to the correct scaled value based on Y
    //           Scale(150, 75) sets X to 150 and Y to 75
    
    HRESULT Scale(
      [in] ULONG cx, 
      [in] ULONG cy, 
      [in] InterpolationMode hints);
             
    HRESULT DiscardEdit();

    //
    // KENSY 
    //   Instead of Commit we will depend on people to do IPersistFile::Save, IPersistStream::Save,
    // etc.  Need to give them control over output format and quality among other things...
    //

    HRESULT SetEncoderParams(
        [in] IPropertyBag *pbagEnc);

    HRESULT DisplayName(
      [in, out] LPWSTR wszName, 
      [in] UINT cch);

    HRESULT GetResolution( // DPI
       [out] ULONG *puResolutionX, 
       [out] ULONG *puResolutionY);

    HRESULT GetEncoderParams( // possible values for encoder params, given a format
       [in] GUID *pguidFmt,
       [out] EncoderParameters **ppEncParams);

   // Set a callback abort object; optionally returns previous
    HRESULT RegisterAbort(
        [in] IShellImageDataAbort *pAbort,
        [out,optional] IShellImageDataAbort **ppAbortPrev);

    HRESULT CloneFrame( // return a clone of the GDI+ Image being worked on
       [out] Image **ppImg);

    HRESULT ReplaceFrame( // replace the current frame with a new Image
       [in] Image *pImg);
}

[
    helpstring("IShellImageDataAbort"),
    uuid(53fb8e58-50c0-4003-b4aa-0c8df28e7f3a),
    object,
    pointer_default(unique)
]
interface IShellImageDataAbort : IUnknown
{
    HRESULT QueryAbort();  // S_OK = continue; S_FALSE = abort
}



[
    uuid(0b8aff06-8df0-4f13-8e25-25b2319c436a), // LIBID_ShellImageData
    helpstring("Microsoft Shell Image library"),
    lcid(0x0000),
    version(1.0)
]
library ShellImageData
{
    // CLSID_ShellImageDataFactory
    [ uuid(66e4e4fb-f385-4dd0-8d74-a2efd1bc6178) ] coclass ShellImageDataFactory { [default] interface IShellImageDataFactory; }

    // CLSID_AutoplayForSlideShow
    [ uuid(00E7B358-F65B-4dcf-83DF-CD026B94BFD4) ] coclass AutoplayForSlideShow { [default] interface IHWEventHandler; }
};
