/*
 * (C) Copyright 2003-2004
 * Stefan Roese, esd gmbh germany, stefan.roese@esd-electronics.com
 *
 * See file CREDITS for list of people who contributed to this
 * project.
 *
 * This program is free software; you can redistribute it and/or
 * modify it under the terms of the GNU General Public License as
 * published by the Free Software Foundation; either version 2 of
 * the License, or (at your option) any later version.
 *
 * This program 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 General Public License for more details.
 *
 * You should have received a copy of the GNU General Public License
 * along with this program; if not, write to the Free Software
 * Foundation, Inc., 59 Temple Place, Suite 330, Boston,
 * MA 02111-1307 USA
 */

/*
 * Neutralize little endians.
 */
#define SWAP_LONG(data) ((unsigned long)                                  \
		         (((unsigned long)(data) >> 24)                 | \
			  ((unsigned long)(data)  << 24)                | \
			  (((unsigned long)(data) >> 8) & 0x0000ff00 )  | \
			   (((unsigned long)(data) << 8) & 0x00ff0000 )))
#define SWAP_SHORT(data) ((unsigned short)                                \
			  (((unsigned short)(data) >> 8 )  |              \
			   ((unsigned short)(data) << 8 )))
#define LOAD_LONG(data)   SWAP_LONG(data)
#define LOAD_SHORT(data)  SWAP_SHORT(data)

#ifndef FALSE
#define FALSE 0
#define TRUE (!FALSE)
#endif

#define S1D_WRITE_PALETTE(p,i,r,g,b)  \
  {  \
  ((volatile uchar*)(p))[palette_index] = (uchar)(i); \
  ((volatile uchar*)(p))[palette_value] = (uchar)(r); \
  ((volatile uchar*)(p))[palette_value] = (uchar)(g); \
  ((volatile uchar*)(p))[palette_value] = (uchar)(b); \
  }

typedef struct
{
    ushort Index;
    uchar  Value;
} S1D_REGS;

typedef struct                       /**** BMP file info structure ****/
{
	unsigned int   biSize;           /* Size of info header */
	int            biWidth;          /* Width of image */
	int            biHeight;         /* Height of image */
	unsigned short biPlanes;         /* Number of color planes */
	unsigned short biBitCount;       /* Number of bits per pixel */
	unsigned int   biCompression;    /* Type of compression to use */
	unsigned int   biSizeImage;      /* Size of image data */
	int            biXPelsPerMeter;  /* X pixels per meter */
	int            biYPelsPerMeter;  /* Y pixels per meter */
	unsigned int   biClrUsed;        /* Number of colors used */
	unsigned int   biClrImportant;   /* Number of important colors */
} BITMAPINFOHEADER;
