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; }
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); }
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); }
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; }