211 int pixel_block_size = (tga->
bits / 8);
212 int image_block_size;
213 int* decompression_buffer =
NULL;
214 unsigned char* conversion_buffer =
NULL;
215 int buffer_caret = 0;
216 int bitmap_caret = 0;
229 image_block_size = (tga->
width * tga->
height) * pixel_block_size;
230 if(
overflow2(image_block_size,
sizeof(
int))) {
251 conversion_buffer = (
unsigned char *)
gdMalloc(image_block_size *
sizeof(
unsigned char));
252 if (conversion_buffer ==
NULL) {
256 if (
gdGetBuf(conversion_buffer, image_block_size, ctx) != image_block_size) {
257 gd_error(
"gd-tga: premature end of image data\n");
258 gdFree(conversion_buffer);
262 while (buffer_caret < image_block_size) {
263 tga->
bitmap[buffer_caret] = (int) conversion_buffer[buffer_caret];
267 gdFree(conversion_buffer);
274 decompression_buffer = (
int*)
gdMalloc(image_block_size *
sizeof(
int));
275 if (decompression_buffer ==
NULL) {
278 conversion_buffer = (
unsigned char *)
gdMalloc(image_block_size *
sizeof(
unsigned char));
279 if (conversion_buffer ==
NULL) {
280 gd_error(
"gd-tga: premature end of image data\n");
281 gdFree( decompression_buffer );
285 rle_size =
gdGetBuf(conversion_buffer, image_block_size, ctx);
287 gdFree(conversion_buffer);
288 gdFree(decompression_buffer);
294 while( buffer_caret < rle_size) {
295 decompression_buffer[buffer_caret] = (int)conversion_buffer[buffer_caret];
301 while( bitmap_caret < image_block_size ) {
303 if (buffer_caret + pixel_block_size > rle_size) {
304 gdFree( decompression_buffer );
305 gdFree( conversion_buffer );
310 encoded_pixels = ( ( decompression_buffer[ buffer_caret ] &
~TGA_RLE_FLAG ) + 1 );
313 if ((bitmap_caret + (encoded_pixels * pixel_block_size)) > image_block_size
314 || buffer_caret + pixel_block_size > rle_size) {
315 gdFree( decompression_buffer );
316 gdFree( conversion_buffer );
320 for (i = 0; i < encoded_pixels; i++) {
321 memcpy(tga->
bitmap + bitmap_caret, decompression_buffer + buffer_caret, pixel_block_size *
sizeof(
int));
322 bitmap_caret += pixel_block_size;
324 buffer_caret += pixel_block_size;
327 encoded_pixels = decompression_buffer[ buffer_caret ] + 1;
330 if ((bitmap_caret + (encoded_pixels * pixel_block_size)) > image_block_size
331 || buffer_caret + (encoded_pixels * pixel_block_size) > rle_size) {
332 gdFree( decompression_buffer );
333 gdFree( conversion_buffer );
337 memcpy(tga->
bitmap + bitmap_caret, decompression_buffer + buffer_caret, encoded_pixels * pixel_block_size *
sizeof(
int));
338 bitmap_caret += (encoded_pixels * pixel_block_size);
339 buffer_caret += (encoded_pixels * pixel_block_size);
342 gdFree( decompression_buffer );
343 gdFree( conversion_buffer );