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