Module lmp2pcx: Change committed

havoc at icculus.org havoc at icculus.org
Tue Oct 1 07:45:15 EDT 2002


Commiter   : havoc
CVSROOT    : /cvs/cvsroot/twilight
Module     : lmp2pcx
Commit time: 2002-10-01 11:45:15 UTC

Log message:

fix pcx writer to write compliant pcx files (rle spans can not cross lines, lines must be padded to even number of pixels)

Modified files:
     lmp2pcx.c

------=MIME.d3e5abce9374f598f0282b182a6732c1
Content-Type: text/plain; name="lmp2pcx.20021001.114515.havoc.diff"
Content-Disposition: attachment; filename="lmp2pcx.20021001.114515.havoc.diff"
Content-Transfer-Encoding: 8bit

Index: lmp2pcx/lmp2pcx.c
diff -u lmp2pcx/lmp2pcx.c:1.1.1.1 lmp2pcx/lmp2pcx.c:1.2
--- lmp2pcx/lmp2pcx.c:1.1.1.1	Thu Sep 12 09:28:06 2002
+++ lmp2pcx/lmp2pcx.c	Tue Oct  1 07:45:05 2002
@@ -328,9 +328,9 @@
 
 void WritePCX(char *filename, unsigned char *data, int width, int height, unsigned char *palette)
 {
-	int 	i, run, pix;
-	pcx_t	*pcx;
-	unsigned char	*pack;
+	int i, y, run, pix;
+	pcx_t *pcx;
+	unsigned char *pack, *dataend;
 
 	pcx = malloc(width * height * 2 + 1000);
 	if (!pcx)
@@ -350,80 +350,32 @@
 	pcx->ymax = LittleShort ((short) (height - 1));
 	pcx->hres = LittleShort ((short) width);
 	pcx->vres = LittleShort ((short) height);
-//	memset (pcx->palette, 0, sizeof (pcx->palette));
 	pcx->color_planes = 1;				// chunky image
-	pcx->bytes_per_line = LittleShort ((short) width);
+	pcx->bytes_per_line = LittleShort ((short) ((width + 1) & ~1));
 	pcx->palette_type = LittleShort (2);	// not a grey scale
-//	memset (pcx->filler, 0, sizeof (pcx->filler));
 
 	// pack the image
 	pack = (unsigned char*)&pcx[1];
 
-	run = 0xC1;
-	pix = *data++;
-	for (i = 1;i < width*height;i++)
+	for (y = 0;y < height;y++)
 	{
-		if (*data == pix && run < 0xFF)
-			run++;
-		else
+		for (dataend = data + width;data < dataend;)
 		{
-			if (run == 0xC1 && pix < 0xC0) // single pixel
-				*pack++ = pix;
-			else
-			{
+			for (pix = *data++, run = 0xC1;data < dataend && run < 0xFF && *data == pix;data++, run++);
+			if (run > 0xC1 || pix >= 0xC0)
 				*pack++ = run;
-				*pack++ = pix;
-			}
-			run = 0xC1;
-			pix = *data;
-		}
-		data++;
-	}
-	if (run == 0xC1 && pix < 0xC0) // single pixel
-		*pack++ = pix;
-	else
-	{
-		*pack++ = run;
-		*pack++ = pix;
-	}
-	/*
-	for (i = 0; i < height; i++)
-	{
-		run = 0xC1;
-		pix = *data++;
-		for (j = 1; j < width; j++)
-		{
-			if (*data == pix && run < 0xFF)
-				run++;
-			else
-			{
-				if (run == 0xC1 && pix < 0xC0) // single pixel
-					*pack++ = pix;
-				else
-				{
-					*pack++ = run;
-					*pack++ = pix;
-				}
-				run = 0xC1;
-				pix = *data;
-			}
-		}
-		if (run == 0xC1 && pix < 0xC0) // single pixel
-			*pack++ = pix;
-		else
-		{
-			*pack++ = run;
 			*pack++ = pix;
 		}
+		if (width & 1)
+			*pack++ = 0;
 	}
-	*/
 
 	// write the palette
 	*pack++ = 0x0c;						// palette ID byte
 	for (i = 0; i < 768; i++)
 		*pack++ = *palette++;
 
-	// write output file 
+	// write output file
 	writefile(filename, pcx, pack - (unsigned char *) pcx);
 
 	free(pcx);


More information about the twilight-commits mailing list