|
|
|
@ -77,6 +77,8 @@ static int decode_rle(CamtasiaContext *c, unsigned int srcsize) |
|
|
|
|
unsigned char *src = c->decomp_buf; |
|
|
|
|
unsigned char *output, *output_end; |
|
|
|
|
int p1, p2, line=c->height, pos=0, i; |
|
|
|
|
uint16_t pix16; |
|
|
|
|
uint32_t pix32; |
|
|
|
|
|
|
|
|
|
output = c->pic.data[0] + (c->height - 1) * c->pic.linesize[0]; |
|
|
|
|
output_end = c->pic.data[0] + (c->height) * c->pic.linesize[0]; |
|
|
|
@ -107,6 +109,7 @@ static int decode_rle(CamtasiaContext *c, unsigned int srcsize) |
|
|
|
|
src += p2 * (c->bpp / 8); |
|
|
|
|
continue; |
|
|
|
|
} |
|
|
|
|
if ((c->bpp == 8) || (c->bpp == 24)) { |
|
|
|
|
for(i = 0; i < p2 * (c->bpp / 8); i++) { |
|
|
|
|
*output++ = *src++; |
|
|
|
|
} |
|
|
|
@ -114,23 +117,38 @@ static int decode_rle(CamtasiaContext *c, unsigned int srcsize) |
|
|
|
|
if(c->bpp == 8 && (p2 & 1)) { |
|
|
|
|
src++; |
|
|
|
|
} |
|
|
|
|
} else if (c->bpp == 16) { |
|
|
|
|
for(i = 0; i < p2; i++) { |
|
|
|
|
pix16 = LE_16(src); |
|
|
|
|
src += 2; |
|
|
|
|
*(uint16_t*)output = pix16; |
|
|
|
|
output += 2; |
|
|
|
|
} |
|
|
|
|
} else if (c->bpp == 32) { |
|
|
|
|
for(i = 0; i < p2; i++) { |
|
|
|
|
pix32 = LE_32(src); |
|
|
|
|
src += 4; |
|
|
|
|
*(uint32_t*)output = pix32; |
|
|
|
|
output += 4; |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
pos += p2; |
|
|
|
|
} else { //Run of pixels
|
|
|
|
|
int pix[4]; //original pixel
|
|
|
|
|
switch(c->bpp){ |
|
|
|
|
case 8: pix[0] = *src++; |
|
|
|
|
break; |
|
|
|
|
case 16: pix[0] = *src++; |
|
|
|
|
pix[1] = *src++; |
|
|
|
|
case 16: pix16 = LE_16(src); |
|
|
|
|
src += 2; |
|
|
|
|
*(uint16_t*)pix = pix16; |
|
|
|
|
break; |
|
|
|
|
case 24: pix[0] = *src++; |
|
|
|
|
pix[1] = *src++; |
|
|
|
|
pix[2] = *src++; |
|
|
|
|
break; |
|
|
|
|
case 32: pix[0] = *src++; |
|
|
|
|
pix[1] = *src++; |
|
|
|
|
pix[2] = *src++; |
|
|
|
|
pix[3] = *src++; |
|
|
|
|
case 32: pix32 = LE_32(src); |
|
|
|
|
src += 4; |
|
|
|
|
*(uint32_t*)pix = pix32; |
|
|
|
|
break; |
|
|
|
|
} |
|
|
|
|
if (output + p1 * (c->bpp / 8) > output_end) |
|
|
|
@ -139,17 +157,15 @@ static int decode_rle(CamtasiaContext *c, unsigned int srcsize) |
|
|
|
|
switch(c->bpp){ |
|
|
|
|
case 8: *output++ = pix[0]; |
|
|
|
|
break; |
|
|
|
|
case 16: *output++ = pix[0]; |
|
|
|
|
*output++ = pix[1]; |
|
|
|
|
case 16: *(uint16_t*)output = pix16; |
|
|
|
|
output += 2; |
|
|
|
|
break; |
|
|
|
|
case 24: *output++ = pix[0]; |
|
|
|
|
*output++ = pix[1]; |
|
|
|
|
*output++ = pix[2]; |
|
|
|
|
break; |
|
|
|
|
case 32: *output++ = pix[0]; |
|
|
|
|
*output++ = pix[1]; |
|
|
|
|
*output++ = pix[2]; |
|
|
|
|
*output++ = pix[3]; |
|
|
|
|
case 32: *(uint32_t*)output = pix32; |
|
|
|
|
output += 4; |
|
|
|
|
break; |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|