/*
 * ImageList definitions
 *
 * Copyright 1998 Eric Kohl
 *
 * 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., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
 */

#ifndef __WINE_IMAGELIST_H
#define __WINE_IMAGELIST_H

#include <stdarg.h>

#include "windef.h"
#include "winbase.h"
#include "wingdi.h"

#include "pshpack1.h"

/* the ones with offsets at the end are the same as in Windows */
struct _IMAGELIST
{
    DWORD       magic;                  /* 00: 'SAMX' */
    INT         cCurImage;              /* 04: ImageCount */
    INT         cMaxImage;              /* 08: maximages */
    INT         cGrow;                  /* 0c: cGrow */
    INT         cx;                     /* 10: cx */
    INT         cy;                     /* 14: cy */
    DWORD       x4;
    UINT        flags;                  /* 1c: flags */
    COLORREF    clrFg;                  /* 20: foreground color */
    COLORREF    clrBk;                  /* 24: backgournd color */


    HBITMAP     hbmImage;               /* 30: images Bitmap */
    HBITMAP     hbmMask;                /* 34: masks  Bitmap */
    HDC         hdcImage;               /* 38: images MemDC  */
    HDC         hdcMask;                /* 3C: masks  MemDC  */
    INT         nOvlIdx[15];            /* 40: overlay images index */

    /* not yet found out */
    HBRUSH  hbrBlend25;
    HBRUSH  hbrBlend50;
    INT     cInitial;
    UINT    uBitsPixel;
};

#define IMAGELIST_MAGIC 0x53414D58

/* Header used by ImageList_Read() and ImageList_Write() */
typedef struct _ILHEAD
{
    USHORT	usMagic;
    USHORT	usVersion;
    WORD	cCurImage;
    WORD	cMaxImage;
    WORD	cGrow;
    WORD	cx;
    WORD	cy;
    COLORREF	bkcolor;
    WORD	flags;
    SHORT	ovls[4];
} ILHEAD;

#include "poppack.h"
#endif  /* __WINE_IMAGELIST_H */
