Endian fixes to PCX loading.

git-svn-id: https://svn.code.sf.net/p/fteqw/code/trunk@1031 fc73d0e0-1445-4013-8a0c-d673dee63da5
This commit is contained in:
Mark Olsen 2005-05-19 00:13:59 +00:00
parent 0fc98d5021
commit 5a459212f1
1 changed files with 30 additions and 19 deletions

View File

@ -1102,7 +1102,6 @@ void WritePCXfile (char *filename, qbyte *data, int width, int height,
LoadPCX LoadPCX
============ ============
*/ */
//fixme: endian issues?
qbyte *ReadPCXFile(qbyte *buf, int length, int *width, int *height) qbyte *ReadPCXFile(qbyte *buf, int length, int *width, int *height)
{ {
pcx_t *pcx; pcx_t *pcx;
@ -1116,36 +1115,43 @@ qbyte *ReadPCXFile(qbyte *buf, int length, int *width, int *height)
qbyte *pcx_rgb; qbyte *pcx_rgb;
unsigned short xmin, ymin, xmax, ymax;
// //
// parse the PCX file // parse the PCX file
// //
pcx = (pcx_t *)buf; pcx = (pcx_t *)buf;
xmin = LittleShort(pcx->xmin);
ymin = LittleShort(pcx->ymin);
xmax = LittleShort(pcx->xmax);
ymax = LittleShort(pcx->ymax);
if (pcx->manufacturer != 0x0a if (pcx->manufacturer != 0x0a
|| pcx->version != 5 || pcx->version != 5
|| pcx->encoding != 1 || pcx->encoding != 1
|| pcx->bits_per_pixel != 8 || pcx->bits_per_pixel != 8
|| pcx->xmax >= 1024 || xmax >= 1024
|| pcx->ymax >= 1024) || ymax >= 1024)
{ {
return NULL; return NULL;
} }
*width = pcx->xmax-pcx->xmin+1; *width = xmax-xmin+1;
*height = pcx->ymax-pcx->ymin+1; *height = ymax-ymin+1;
palette = buf + length-768; palette = buf + length-768;
data = (char *)(pcx+1); data = (char *)(pcx+1);
count = (pcx->xmax+1) * (pcx->ymax+1); count = (xmax+1) * (ymax+1);
pcx_rgb = BZ_Malloc( count * 4); pcx_rgb = BZ_Malloc( count * 4);
for (y=0 ; y<=pcx->ymax ; y++) for (y=0 ; y<=ymax ; y++)
{ {
pix = pcx_rgb + 4*y*(pcx->xmax+1); pix = pcx_rgb + 4*y*(xmax+1);
for (x=0 ; x<=pcx->xmax ; ) for (x=0 ; x<=xmax ; )
{ {
dataByte = *data; dataByte = *data;
data++; data++;
@ -1176,7 +1182,6 @@ qbyte *ReadPCXFile(qbyte *buf, int length, int *width, int *height)
return pcx_rgb; return pcx_rgb;
} }
//fixme: endian issues?
qbyte *ReadPCXData(qbyte *buf, int length, int width, int height, qbyte *result) qbyte *ReadPCXData(qbyte *buf, int length, int width, int height, qbyte *result)
{ {
pcx_t *pcx; pcx_t *pcx;
@ -1188,12 +1193,19 @@ qbyte *ReadPCXData(qbyte *buf, int length, int width, int height, qbyte *result)
int count; int count;
qbyte *data; qbyte *data;
unsigned short xmin, ymin, xmax, ymax;
// //
// parse the PCX file // parse the PCX file
// //
pcx = (pcx_t *)buf; pcx = (pcx_t *)buf;
xmin = LittleShort(pcx->xmin);
ymin = LittleShort(pcx->ymin);
xmax = LittleShort(pcx->xmax);
ymax = LittleShort(pcx->ymax);
if (pcx->manufacturer != 0x0a if (pcx->manufacturer != 0x0a
|| pcx->version != 5 || pcx->version != 5
|| pcx->encoding != 1 || pcx->encoding != 1
@ -1202,8 +1214,8 @@ qbyte *ReadPCXData(qbyte *buf, int length, int width, int height, qbyte *result)
return NULL; return NULL;
} }
if (width != pcx->xmax-pcx->xmin+1 || if (width != xmax-xmin+1 ||
height > pcx->ymax-pcx->ymin+1) height > ymax-ymin+1)
return NULL; return NULL;
@ -1211,12 +1223,12 @@ qbyte *ReadPCXData(qbyte *buf, int length, int width, int height, qbyte *result)
data = (char *)(pcx+1); data = (char *)(pcx+1);
count = (pcx->xmax+1) * (pcx->ymax+1); count = (xmax+1) * (ymax+1);
for (y=0 ; y<height ; y++) for (y=0 ; y<height ; y++)
{ {
pix = result + y*(pcx->xmax+1); pix = result + y*(xmax+1);
for (x=0 ; x<=pcx->xmax ; ) for (x=0 ; x<=xmax ; )
{ {
dataByte = *data; dataByte = *data;
data++; data++;
@ -1241,7 +1253,6 @@ qbyte *ReadPCXData(qbyte *buf, int length, int width, int height, qbyte *result)
return result; return result;
} }
//fixme: endian issues?
qbyte *ReadPCXPalette(qbyte *buf, int len, qbyte *out) qbyte *ReadPCXPalette(qbyte *buf, int len, qbyte *out)
{ {
pcx_t *pcx; pcx_t *pcx;
@ -1257,8 +1268,8 @@ qbyte *ReadPCXPalette(qbyte *buf, int len, qbyte *out)
|| pcx->version != 5 || pcx->version != 5
|| pcx->encoding != 1 || pcx->encoding != 1
|| pcx->bits_per_pixel != 8 || pcx->bits_per_pixel != 8
|| pcx->xmax >= 1024 || LittleShort(pcx->xmax) >= 1024
|| pcx->ymax >= 1024) || LittleShort(pcx->ymax) >= 1024)
{ {
return NULL; return NULL;
} }