
XImage *ReadRaw(Display *disp, char Name[], int width, int height)
{
	FILE *f;

	XImage *Res = NULL;

	char *Data;

	int depth, i;


	f = fopen(Name, "r");

	if (f != NULL)
	{
		depth = 4;

		Data = (char *)calloc(width * height * depth / 8, 1);

		if (Data != NULL)
		{
			Res = XCreateImage(disp,
			                   DefaultVisual(disp, DefaultScreen(disp)),
			                   depth, XYPixmap, 0, Data,
			                   width, height, 8, 0);

			if (Res != NULL)
			{
				for (i=0; i<4; i++)
				{
					fread(Data+(3-i)*(width*height/8), width>>3, height, f);
				}
			}
			else
			{
				free(Data);
			}
		}

		fclose(f);
	}

	return Res;
}


XImage *RemapColors(Display *disp, XImage *Im, unsigned long ColT[])
{
	XImage *Tmp = NULL;

	char *Data;

	int width, height, depth;

	int x, y;


	width = Im->width;
	height = Im->height;

	depth = DefaultDepth(disp, DefaultScreen(disp));

	x = 1;
	y = (depth-1) >> 2;

	while (y>>=1) x<<=1;

	Data = (char *)malloc(width * height * x);

	if (Data != NULL)
	{
		Tmp = XCreateImage(disp,
		                   DefaultVisual(disp, DefaultScreen(disp)),
		                   depth, ZPixmap, 0, Data, width, height,
		                   32, 0);

		if (Tmp != NULL)
		{
			for (y=0; y<height; y++)
			{
				for (x=0; x<width; x++)
				{
					XPutPixel(Tmp, x, y, ColT[ 16 + XGetPixel(Im, x, y) ]);
				}
			}
		}
		else
		{
			free(Data);
		}
	}

	return Tmp;
}


XImage *ResizeImage(Display *disp, XImage *Im, int ix, int iy, int ox, int oy)
{
	int width1, height1, width2, height2;
	int x1, x2, y1, y2, Tx, Ty;
	int *px1, *px2, *dx1, *dx2;
	int *py1, *py2, *dy1, *dy2;

	XImage *Tmp;

	char *Data;


	width1 = Im->width;
	height1 = Im->height;

	width2 = ox * width1 / ix;
	height2 = oy * height1 / iy;

	Data = (char *)malloc(width2 * height2 * Im->bits_per_pixel / 8);

	Tmp = XCreateImage(disp,
	                   DefaultVisual(disp, DefaultScreen(disp)),
	                   Im->depth, ZPixmap, 0, Data, width2, height2,
	                   32, 0);

	if (ix > ox)
	{
		px1 = &x1;
		px2 = &x2;
		dx1 = &ix;
		dx2 = &ox;
	}
	else
	{
		px1 = &x2;
		px2 = &x1;
		dx1 = &ox;
		dx2 = &ix;
	}

	if (iy > oy)
	{
		py1 = &y1;
		py2 = &y2;
		dy1 = &iy;
		dy2 = &oy;
	}
	else
	{
		py1 = &y2;
		py2 = &y1;
		dy1 = &oy;
		dy2 = &iy;
	}

	Ty = *dy1;

	for (y1=0, y2=0; (y1 < height1) && (y2 < height2); )
	{
		Tx = *dx1;

		for (x1=0, x2=0; (x1 < width1) && (x2 < width2); )
		{
			XPutPixel(Tmp, x2, y2, XGetPixel(Im, x1, y1));

			(*px1)++;

			Tx -= *dx2;
			if (Tx < 0)
			{
				Tx += *dx1;
				(*px2)++;
			}
		}

		(*py1)++;

		Ty -= *dy2;
		if (Ty < 0)
		{
			Ty += *dy1;
			(*py2)++;
		}      
	}

	return Tmp;
}


