--- psiconv/trunk/lib/psiconv/parse_image.c 1999/10/11 18:19:09 13 +++ psiconv/trunk/lib/psiconv/parse_image.c 1999/10/13 15:02:21 15 @@ -100,14 +100,15 @@ picsize = (*result)->ysize * (*result)->xsize * 2; linelen = (*result)->xsize; - psiconv_progress(lev+2,off+len,"Going to read 6 unused longs"); + psiconv_progress(lev+2,off+len,"Going to read 6 unknown longs"); for (i = 0 ; i < 6; i++) { temp = psiconv_read_u32(buf,lev+2,off+len); - if (temp != 0x00) { + if (temp != (i==2?0x02:i==5?0x01:0x00)) { psiconv_warn(lev+2,off+len, "Paint data section prologue has unknown values"); psiconv_debug(lev+2,off+len, - "offset %02x: read %08x, expected %08x",i,temp,0x00); + "offset %02x: read %08x, expected %08x",i,temp, + i==2?0x02:i==5?0x01:0x00); res = -1; } len += 4; @@ -130,70 +131,94 @@ datanr ++; if (marker >= 0x80) { /* 0x100 - marker bytes of data follow */ - if ((0x100 - marker + datanr > datasize) || - ((0x100 - marker) * 4 + pixelnr > picsize)) { - psiconv_warn(lev+3,off+len+datanr,"Corrupted picture data"); - psiconv_debug(lev+3,off+len+datanr, - "Picsize: %08x, Datasize: %08x, Pixelnr: %08x," - "Datanr: %08x, marker: %02x",picsize,datasize,pixelnr, - datanr,marker); - res = -1; - read_err = 1; - } else { - for (i = 0; i < 0x100-marker; i++) { - temp = psiconv_read_u8(buf,lev+3,off+len+datanr+i); - (*result)->red[pixelnr + i*4] = - (*result)->green[pixelnr + i*4] = - (*result)->blue[pixelnr + i*4] = - (temp & 0x03) * (1.0/3.0); - (*result)->red[pixelnr + i*4 + 1] = - (*result)->green[pixelnr + i*4 +1] = - (*result)->blue[pixelnr + i*4 + 1] = - ((temp >> 2) & 0x03) * (1.0/3.0); - (*result)->red[pixelnr + i*4 + 2] = - (*result)->green[pixelnr + i*4 +2] = - (*result)->blue[pixelnr + i*4 + 2] = - ((temp >> 4) & 0x03) * (1.0/3.0); - (*result)->red[pixelnr + i*4 + 3] = - (*result)->green[pixelnr + i*4 +3] = - (*result)->blue[pixelnr + i*4 + 3] = - ((temp >> 6) & 0x03) * (1.0/3.0); + for (i = 0; i < 0x100-marker; i++,datanr++) { + if ((picsize == pixelnr) || (datasize == datanr)) { + psiconv_warn(lev+3,off+len+datanr,"Corrupted picture data"); + psiconv_debug(lev+3,off+len+datanr, + "Picsize: %08x, Datasize: %08x, Pixelnr: %08x," + "Datanr: %08x, marker: %02x",picsize,datasize,pixelnr, + datanr,marker); + read_err = 1; + res = -1; + break; } + temp = psiconv_read_u8(buf,lev+3,off+len+datanr); + (*result)->red[pixelnr] = + (*result)->green[pixelnr] = + (*result)->blue[pixelnr] = + (temp & 0x03) * (1.0/3.0); + pixelnr ++; + if (pixelnr % linelen == 0) + continue; + (*result)->red[pixelnr] = + (*result)->green[pixelnr] = + (*result)->blue[pixelnr] = + ((temp >> 2) & 0x03) * (1.0/3.0); + pixelnr ++; + if (pixelnr % linelen == 0) + continue; + (*result)->red[pixelnr] = + (*result)->green[pixelnr] = + (*result)->blue[pixelnr] = + ((temp >> 4) & 0x03) * (1.0/3.0); + pixelnr ++; + if (pixelnr % linelen == 0) + continue; + (*result)->red[pixelnr] = + (*result)->green[pixelnr] = + (*result)->blue[pixelnr] = + ((temp >> 6) & 0x03) * (1.0/3.0); } - pixelnr += (0x100 - marker) * 4; - datanr += (0x100 - marker); - } else { /* marker < 0x080 */ - if ((datanr + 1 > datasize) || - (marker * 4 + pixelnr > picsize)) { + } else { /* marker < 0x080 */ + if (datasize == datanr) { psiconv_warn(lev+3,off+len+datanr,"Corrupted picture data"); psiconv_debug(lev+3,off+len+datanr, "Picsize: %08x, Datasize: %08x, Pixelnr: %08x," "Datanr: %08x, marker: %02x",picsize,datasize,pixelnr, datanr,marker); - res = -1; read_err = 1; + res = -1; } else { temp = psiconv_read_u8(buf,lev+3,off+len+datanr); - for (i = 0; i < marker; i++) { - (*result)->red[pixelnr + i*4] = - (*result)->green[pixelnr + i*4] = - (*result)->blue[pixelnr + i*4] = - (temp & 0x03) * (1.0/3.0); - (*result)->red[pixelnr + i*4 + 1] = - (*result)->green[pixelnr + i*4 +1] = - (*result)->blue[pixelnr + i*4 + 1] = - ((temp >> 2) & 0x03) * (1.0/3.0); - (*result)->red[pixelnr + i*4 + 2] = - (*result)->green[pixelnr + i*4 +2] = - (*result)->blue[pixelnr + i*4 + 2] = - ((temp >> 4) & 0x03) * (1.0/3.0); - (*result)->red[pixelnr + i*4 + 3] = - (*result)->green[pixelnr + i*4 +3] = - (*result)->blue[pixelnr + i*4 + 3] = - ((temp >> 6) & 0x03) * (1.0/3.0); + for (i = 0; i <= marker; i++) { + if (picsize == pixelnr) { + psiconv_warn(lev+3,off+len+datanr,"Corrupted picture data"); + psiconv_debug(lev+3,off+len+datanr, + "Picsize: %08x, Datasize: %08x, Pixelnr: %08x," + "Datanr: %08x, marker: %02x",picsize,datasize,pixelnr, + datanr,marker); + read_err = 1; + res = -1; + break; + } + (*result)->red[pixelnr] = + (*result)->green[pixelnr] = + (*result)->blue[pixelnr] = + (temp & 0x03) * (1.0/3.0); + pixelnr ++; + if (pixelnr % linelen == 0) + continue; + (*result)->red[pixelnr] = + (*result)->green[pixelnr] = + (*result)->blue[pixelnr] = + ((temp >> 2) & 0x03) * (1.0/3.0); + pixelnr ++; + if (pixelnr % linelen == 0) + continue; + (*result)->red[pixelnr] = + (*result)->green[pixelnr] = + (*result)->blue[pixelnr] = + ((temp >> 4) & 0x03) * (1.0/3.0); + pixelnr ++; + if (pixelnr % linelen == 0) + continue; + (*result)->red[pixelnr] = + (*result)->green[pixelnr] = + (*result)->blue[pixelnr] = + ((temp >> 6) & 0x03) * (1.0/3.0); + pixelnr ++; } } - pixelnr += marker * 4; datanr += 1; } }