images: pcx make buffer const

This commit is contained in:
Denis Pauk 2024-07-15 00:39:15 +03:00
parent 2e32da65bd
commit 3ba0f35636

View file

@ -186,11 +186,12 @@ static void
PCX_Decode(const char *name, const byte *raw, int len, byte **pic, byte **palette, PCX_Decode(const char *name, const byte *raw, int len, byte **pic, byte **palette,
int *width, int *height, int *bitesPerPixel) int *width, int *height, int *bitesPerPixel)
{ {
pcx_t *pcx; const pcx_t *pcx;
int full_size; int full_size;
int pcx_width, pcx_height; int pcx_width, pcx_height, bytes_per_line;
qboolean image_issues = false; qboolean image_issues = false;
byte *out, *pix; byte *out, *pix;
const byte *data;
*pic = NULL; *pic = NULL;
*bitesPerPixel = 8; *bitesPerPixel = 8;
@ -206,21 +207,13 @@ PCX_Decode(const char *name, const byte *raw, int len, byte **pic, byte **palett
} }
/* parse the PCX file */ /* parse the PCX file */
pcx = (pcx_t *)raw; pcx = (const pcx_t *)raw;
pcx->xmin = LittleShort(pcx->xmin); data = &pcx->data;
pcx->ymin = LittleShort(pcx->ymin);
pcx->xmax = LittleShort(pcx->xmax);
pcx->ymax = LittleShort(pcx->ymax);
pcx->hres = LittleShort(pcx->hres);
pcx->vres = LittleShort(pcx->vres);
pcx->bytes_per_line = LittleShort(pcx->bytes_per_line);
pcx->palette_type = LittleShort(pcx->palette_type);
raw = &pcx->data; bytes_per_line = LittleShort(pcx->bytes_per_line);
pcx_width = LittleShort(pcx->xmax) - LittleShort(pcx->xmin);
pcx_width = pcx->xmax - pcx->xmin; pcx_height = LittleShort(pcx->ymax) - LittleShort(pcx->ymin);
pcx_height = pcx->ymax - pcx->ymin;
if ((pcx->manufacturer != 0x0a) || if ((pcx->manufacturer != 0x0a) ||
(pcx->version != 5) || (pcx->version != 5) ||
@ -265,29 +258,29 @@ PCX_Decode(const char *name, const byte *raw, int len, byte **pic, byte **palett
int x, y; int x, y;
byte *line; byte *line;
if (pcx->bytes_per_line <= pcx_width) if (bytes_per_line <= pcx_width)
{ {
pcx->bytes_per_line = pcx_width + 1; bytes_per_line = pcx_width + 1;
image_issues = true; image_issues = true;
} }
/* clean image alpha */ /* clean image alpha */
memset(pix, 255, full_size); memset(pix, 255, full_size);
line = malloc(pcx->bytes_per_line * pcx->color_planes); line = malloc(bytes_per_line * pcx->color_planes);
for (y = 0; y <= pcx_height; y++, pix += (pcx_width + 1) * 4) for (y = 0; y <= pcx_height; y++, pix += (pcx_width + 1) * 4)
{ {
raw = PCX_RLE_Decode(line, line + (pcx_width + 1) * pcx->color_planes, data = PCX_RLE_Decode(line, line + (pcx_width + 1) * pcx->color_planes,
raw, (byte *)pcx + len, data, (byte *)pcx + len,
pcx->bytes_per_line * pcx->color_planes); bytes_per_line * pcx->color_planes);
for (x = 0; x <= pcx_width; x++) { for (x = 0; x <= pcx_width; x++) {
int j; int j;
for (j = 0; j < pcx->color_planes; j++) for (j = 0; j < pcx->color_planes; j++)
{ {
pix[4 * x + j] = line[x + pcx->bytes_per_line * j]; pix[4 * x + j] = line[x + bytes_per_line * j];
} }
} }
} }
@ -313,15 +306,15 @@ PCX_Decode(const char *name, const byte *raw, int len, byte **pic, byte **palett
memcpy(*palette, pcx->palette, sizeof(pcx->palette)); memcpy(*palette, pcx->palette, sizeof(pcx->palette));
} }
line = malloc(pcx->bytes_per_line * pcx->color_planes); line = malloc(bytes_per_line * pcx->color_planes);
for (y = 0; y <= pcx_height; y++, pix += pcx_width + 1) for (y = 0; y <= pcx_height; y++, pix += pcx_width + 1)
{ {
int x; int x;
raw = PCX_RLE_Decode(line, line + pcx->bytes_per_line * pcx->color_planes, data = PCX_RLE_Decode(line, line + bytes_per_line * pcx->color_planes,
raw, (byte *)pcx + len, data, (byte *)pcx + len,
pcx->bytes_per_line * pcx->color_planes); bytes_per_line * pcx->color_planes);
for (x = 0; x <= pcx_width; x++) for (x = 0; x <= pcx_width; x++)
{ {
@ -332,7 +325,7 @@ PCX_Decode(const char *name, const byte *raw, int len, byte **pic, byte **palett
for (i = pcx->color_planes - 1; i >= 0; i--) { for (i = pcx->color_planes - 1; i >= 0; i--) {
v <<= 1; v <<= 1;
v += (line[i * pcx->bytes_per_line + (x >> 3)] & m) ? 1 : 0; v += (line[i * bytes_per_line + (x >> 3)] & m) ? 1 : 0;
} }
pix[x] = v; pix[x] = v;
} }
@ -369,17 +362,17 @@ PCX_Decode(const char *name, const byte *raw, int len, byte **pic, byte **palett
} }
} }
if (pcx->bytes_per_line <= pcx_width) if (bytes_per_line <= pcx_width)
{ {
pcx->bytes_per_line = pcx_width + 1; bytes_per_line = pcx_width + 1;
image_issues = true; image_issues = true;
} }
for (y = 0; y <= pcx_height; y++, pix += pcx_width + 1) for (y = 0; y <= pcx_height; y++, pix += pcx_width + 1)
{ {
raw = PCX_RLE_Decode(pix, pix + pcx_width + 1, data = PCX_RLE_Decode(pix, pix + pcx_width + 1,
raw, (byte *)pcx + len, data, (byte *)pcx + len,
pcx->bytes_per_line); bytes_per_line);
} }
} }
else else
@ -402,15 +395,15 @@ PCX_Decode(const char *name, const byte *raw, int len, byte **pic, byte **palett
memcpy(*palette, pcx->palette, sizeof(pcx->palette)); memcpy(*palette, pcx->palette, sizeof(pcx->palette));
} }
line = malloc(pcx->bytes_per_line); line = malloc(bytes_per_line);
for (y = 0; y <= pcx_height; y++, pix += pcx_width + 1) for (y = 0; y <= pcx_height; y++, pix += pcx_width + 1)
{ {
int x, mask, div; int x, mask, div;
raw = PCX_RLE_Decode(line, line + pcx->bytes_per_line, data = PCX_RLE_Decode(line, line + bytes_per_line,
raw, (byte *)pcx + len, data, (byte *)pcx + len,
pcx->bytes_per_line); bytes_per_line);
mask = (1 << pcx->bits_per_pixel) - 1; mask = (1 << pcx->bits_per_pixel) - 1;
div = 8 / pcx->bits_per_pixel; div = 8 / pcx->bits_per_pixel;
@ -442,7 +435,7 @@ PCX_Decode(const char *name, const byte *raw, int len, byte **pic, byte **palett
*pic = NULL; *pic = NULL;
} }
if (raw - (byte *)pcx > len) if (data - (byte *)pcx > len)
{ {
Com_DPrintf("%s: %s file was malformed\n", __func__, name); Com_DPrintf("%s: %s file was malformed\n", __func__, name);
free(*pic); free(*pic);