Beispiel #1
0
static unsigned char* freadcolrs(RGBE *scan, unsigned char* mem, int xmax)
{
	int i, j, code, val;

	if ((xmax < MINELEN) | (xmax > MAXELEN)) return oldreadcolrs(scan, mem, xmax);

	i = *mem++;
	if (i != 2) return oldreadcolrs(scan, mem-1, xmax);

	scan[0][GRN] = *mem++;
	scan[0][BLU] = *mem++;

	i = *mem++;
	if (((scan[0][BLU] << 8) | i) != xmax) return NULL;

	for (i=0;i<4;i++)
		for (j=0;j<xmax;) {
			code = *mem++;
			if (code > 128) {
				code &= 127;
				val = *mem++;
				while (code--)
					scan[j++][i] = (unsigned char)val;
			}
			else
				while (code--)
					scan[j++][i] = *mem++;
		}
	return mem;
}
static const unsigned char *freadcolrs(RGBE *scan, const unsigned char *mem, int xmax, const unsigned char *mem_eof)
{
	int i, j, code, val;

	if (mem_eof - mem < 4) {
		return NULL;
	}

	if ((xmax < MINELEN) | (xmax > MAXELEN)) {
		return oldreadcolrs(scan, mem, xmax, mem_eof);
	}

	i = *mem++;
	if (i != 2) {
		return oldreadcolrs(scan, mem - 1, xmax, mem_eof);
	}

	scan[0][GRN] = *mem++;
	scan[0][BLU] = *mem++;

	i = *mem++;

	if (scan[0][GRN] != 2 || scan[0][BLU] & 128) {
		scan[0][RED] = 2;
		scan[0][EXP] = i;
		return oldreadcolrs(scan + 1, mem, xmax - 1, mem_eof);
	}

	if (((scan[0][BLU] << 8) | i) != xmax) {
		return NULL;
	}

	for (i = 0; i < 4; i++) {
		if (mem_eof - mem < 2) {
			return NULL;
		}
		for (j = 0; j < xmax; ) {
			code = *mem++;
			if (code > 128) {
				code &= 127;
				val = *mem++;
				while (code--) {
					scan[j++][i] = (unsigned char)val;
				}
			}
			else {
				if (mem_eof - mem < code) {
					return NULL;
				}
				while (code--) {
					scan[j++][i] = *mem++;
				}
			}
		}
	}

	return mem;
}
Beispiel #3
0
int
freadcolrs(			/* read in an encoded colr scanline */
	COLR  *scanline,
	int  len,
	FILE  *fp
)
{
	int  i, j;
	int  code, val;
					/* determine scanline type */
	if ((len < MINELEN) | (len > MAXELEN))
		return(oldreadcolrs(scanline, len, fp));
	if ((i = getc(fp)) == EOF)
		return(-1);
	if (i != 2) {
		ungetc(i, fp);
		return(oldreadcolrs(scanline, len, fp));
	}
	scanline[0][GRN] = getc(fp);
	scanline[0][BLU] = getc(fp);
	if ((i = getc(fp)) == EOF)
		return(-1);
	if ((scanline[0][GRN] != 2) | ((scanline[0][BLU] & 0x80) != 0)) {
		scanline[0][RED] = 2;
		scanline[0][EXP] = i;
		return(oldreadcolrs(scanline+1, len-1, fp));
	}
	if ((scanline[0][BLU]<<8 | i) != len)
		return(-1);		/* length mismatch! */
					/* read each component */
	for (i = 0; i < 4; i++)
	    for (j = 0; j < len; ) {
		if ((code = getc(fp)) == EOF)
		    return(-1);
		if (code > 128) {	/* run */
		    code &= 127;
		    if ((val = getc(fp)) == EOF)
			return -1;
		    if (j + code > len)
		    	return -1;	/* overrun */
		    while (code--)
			scanline[j++][i] = val;
		} else {		/* non-run */
		    if (j + code > len)
		    	return -1;	/* overrun */
		    while (code--) {
			if ((val = getc(fp)) == EOF)
			    return -1;
			scanline[j++][i] = val;
		    }
		}
	    }
	return(0);
}
Beispiel #4
0
int freadcolrs(COLR *scanline, int len, FILE *fp) { /* read in an encoded colr scanline */
    int  i, j;
    int  code;
    /* determine scanline type */
    if (len < MINELEN) {
        return(oldreadcolrs(scanline, len, fp));
    }
    if ((i = getc(fp)) == EOF) {
        return(-1);
    }
    if (i != 2) {
        ungetc(i, fp);
        return(oldreadcolrs(scanline, len, fp));
    }
    scanline[0][GRN] = getc(fp);
    scanline[0][BLU] = getc(fp);
    if ((i = getc(fp)) == EOF) {
        return(-1);
    }
    if (scanline[0][GRN] != 2 || scanline[0][BLU] & 128) {
        scanline[0][RED] = 2;
        scanline[0][EXP] = i;
        return(oldreadcolrs(scanline+1, len-1, fp));
    }
    if ((scanline[0][BLU]<<8 | i) != len) {
        return(-1);    /* length mismatch! */
    }
    /* read each component */
    for (i = 0; i < 4; i++)
        for (j = 0; j < len;) {
            if ((code = getc(fp)) == EOF) {
                return(-1);
            }
            if (code > 128) {        /* run */
                scanline[j++][i] = getc(fp);
                for (code &= 127; --code; j++) {
                    scanline[j][i] = scanline[j-1][i];
                }
            } else                        /* non-run */
                while (code--) {
                    scanline[j++][i] = getc(fp);
                }
        }
    return(feof(fp) ? -1 : 0);
}
Beispiel #5
0
static const unsigned char *freadcolrs(RGBE *scan, const unsigned char *mem, int xmax, const unsigned char *mem_eof)
{
	if (UNLIKELY(mem_eof - mem < 4)) {
		return NULL;
	}

	if (UNLIKELY((xmax < MINELEN) | (xmax > MAXELEN))) {
		return oldreadcolrs(scan, mem, xmax, mem_eof);
	}

	int val = *mem++;
	if (val != 2) {
		return oldreadcolrs(scan, mem - 1, xmax, mem_eof);
	}

	scan[0][GRN] = *mem++;
	scan[0][BLU] = *mem++;

	val = *mem++;

	if (scan[0][GRN] != 2 || scan[0][BLU] & 128) {
		scan[0][RED] = 2;
		scan[0][EXP] = val;
		return oldreadcolrs(scan + 1, mem, xmax - 1, mem_eof);
	}

	if (UNLIKELY(((scan[0][BLU] << 8) | val) != xmax)) {
		return NULL;
	}

	for (size_t i = 0; i < 4; i++) {
		if (UNLIKELY(mem_eof - mem < 2)) {
			return NULL;
		}
		for (size_t j = 0; j < xmax; ) {
			int code = *mem++;
			if (code > 128) {
				code &= 127;
				if (UNLIKELY(code + j > xmax)) {
					return NULL;
				}
				val = *mem++;
				while (code--) {
					scan[j++][i] = (unsigned char)val;
				}
			}
			else {
				if (UNLIKELY(mem_eof - mem < code)) {
					return NULL;
				}
				if (UNLIKELY(code + j > xmax)) {
					return NULL;
				}
				while (code--) {
					scan[j++][i] = *mem++;
				}
			}
		}
	}

	return mem;
}