# HG changeset patch # User melanson # Date 1139763366 0 # Node ID 99cbff5f80386fa738a5fe61f35bc058e9f2437a # Parent 1d184d61e714a13b3a663d08c28fb9135d661e1d make TSCC endian-safe, PPC testing courtesy of Diego B. diff -r 1d184d61e714 -r 99cbff5f8038 tscc.c --- a/tscc.c Sun Feb 12 08:53:29 2006 +0000 +++ b/tscc.c Sun Feb 12 16:56:06 2006 +0000 @@ -77,6 +77,8 @@ 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,12 +109,28 @@ src += p2 * (c->bpp / 8); continue; } - for(i = 0; i < p2 * (c->bpp / 8); i++) { - *output++ = *src++; - } - // RLE8 copy is actually padded - and runs are not! - if(c->bpp == 8 && (p2 & 1)) { - src++; + if ((c->bpp == 8) || (c->bpp == 24)) { + for(i = 0; i < p2 * (c->bpp / 8); i++) { + *output++ = *src++; + } + // RLE8 copy is actually padded - and runs are not! + 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 @@ -120,17 +138,17 @@ 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 @@ 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; } }