+ }
+ break;
+ case 10:
+ // BGR or BGRA, RLE
+ if (targa_header.pixel_size == 32 && alphabits)
+ {
+ for (y = 0;y < image_height;y++, pixbuf += row_inc)
+ {
+ for (x = 0;x < image_width;)
+ {
+ if (fin >= enddata)
+ break; // error - truncated file
+ runlen = *fin++;
+ if (runlen & 0x80)
+ {
+ // RLE - all pixels the same color
+ runlen += 1 - 0x80;
+ if (fin + pix_inc > enddata)
+ break; // error - truncated file
+ if (x + runlen > image_width)
+ break; // error - line exceeds width
+ red = fin[2];
+ green = fin[1];
+ blue = fin[0];
+ alpha = fin[3];
+ fin += pix_inc;
+ for (;runlen--;x++)
+ {
+ *pixbuf++ = red;
+ *pixbuf++ = green;
+ *pixbuf++ = blue;
+ *pixbuf++ = alpha;
+ }
+ }
+ else
+ {
+ // uncompressed - all pixels different color
+ runlen++;
+ if (fin + pix_inc * runlen > enddata)
+ break; // error - truncated file
+ if (x + runlen > image_width)
+ break; // error - line exceeds width
+ for (;runlen--;x++, fin += pix_inc)
+ {
+ *pixbuf++ = fin[2];
+ *pixbuf++ = fin[1];
+ *pixbuf++ = fin[0];
+ *pixbuf++ = fin[3];
+ }
+ }
+ }
+ }
+ }
+ else
+ {
+ for (y = 0;y < image_height;y++, pixbuf += row_inc)