/***********************************************************
* Artsoft Retro-Game Library                               *
*----------------------------------------------------------*
* (c) 1994-2006 Artsoft Entertainment                      *
*               Holger Schemel                             *
*               Detmolder Strasse 189                      *
*               33604 Bielefeld                            *
*               Germany                                    *
*               e-mail: info@artsoft.org                   *
*----------------------------------------------------------*
* image.h                                                  *
***********************************************************/

#ifndef IMAGE_H
#define IMAGE_H

#include "system.h"


#if defined(TARGET_X11)

#define MAX_COLORS	256	/* maximal number of colors for each image */

typedef unsigned short Intensity;	/* RGB intensity for X11 */

typedef struct
{
  Display  *display;		/* destination display             */
  int       depth;		/* depth of destination drawable   */
  Pixel     index[MAX_COLORS];	/* array of pixel values           */
  int       no;			/* number of pixels in the array   */
  Colormap  cmap;		/* colormap used for image         */
  Pixmap   pixmap;		/* final pixmap                    */
  Pixmap   pixmap_mask;		/* final pixmap of mask            */
} XImageInfo;

struct RGBMap
{
  unsigned int used;			/* number of colors used in RGB map */
  Intensity    red[MAX_COLORS];		/* color values in X style          */
  Intensity    green[MAX_COLORS];
  Intensity    blue[MAX_COLORS];
  boolean      color_used[MAX_COLORS];	/* flag if color cell is used       */
};

typedef struct
{
  unsigned int  type;		/* type of image (True-Color etc.)     */
  struct RGBMap rgb;		/* RGB map of image if IRGB type       */
  unsigned int  width;		/* width of image in pixels            */
  unsigned int  height;		/* height of image in pixels           */
  unsigned int  depth;		/* depth of image in bits if IRGB type */
  unsigned int  bytes_per_pixel;/* (depth + 7) / 8                     */
  unsigned int  bytes_per_row;	/* width * bytes_per_pixel             */
  byte         *data;		/* image data                          */
} Image;

#define IMAGETYPE_BITMAP	0	/* monochrome bitmap       */
#define IMAGETYPE_RGB		1	/* RGB image with colormap */
#define IMAGETYPE_TRUECOLOR	2	/* true-color image        */

#define TRUECOLOR_RED(pixel)	(((unsigned long)((pixel) & 0xff0000)) >> 16)
#define TRUECOLOR_GREEN(pixel)	(((unsigned long)((pixel) & 0xff00)) >> 8)
#define TRUECOLOR_BLUE(pixel)	( (unsigned long)((pixel) & 0xff))
#define RGB_TO_TRUECOLOR(r,g,b)	((((unsigned long)((r) & 0xff00)) << 8) | ((g) & 0xff00) | (((unsigned short)(b)) >> 8))

Image *newImage(unsigned int, unsigned int, unsigned int);
void freeImage(Image *);
void freeXImage(Image *, XImageInfo *);

Pixmap Pixmap_to_Mask(Pixmap, int, int);

void ZoomPixmap(Display *, GC, Pixmap, Pixmap, int, int, int, int);

int Read_PCX_to_Pixmap(Display *, Window, GC, char *, Pixmap *, Pixmap *);

#endif /* TARGET_X11 */

int getImageListSize();
struct FileInfo *getImageListEntryFromImageID(int);
Bitmap *getBitmapFromImageID(int);
int getOriginalImageWidthFromImageID(int);
int getOriginalImageHeightFromImageID(int);
char *getTokenFromImageID(int);
int getImageIDFromToken(char *);
char *getImageConfigFilename();
int getImageListPropertyMappingSize();
struct PropertyMapping *getImageListPropertyMapping();
void InitImageList(struct ConfigInfo *, int, struct ConfigTypeInfo *,
		   char **, char **, char **, char **, char **);

void ReloadCustomImages();
void CreateImageWithSmallImages(int, int);
void ScaleImage(int, int);

void FreeAllImages();

#endif	/* IMAGE_H */
