aboutsummaryrefslogtreecommitdiff
path: root/libavcodec/targa.c
diff options
context:
space:
mode:
authorCarl Eugen Hoyos2011-12-03 12:22:12 +0100
committerCarl Eugen Hoyos2011-12-03 12:22:12 +0100
commit88bbabcc006edf7fb4c8ba339d4a64a8b5b8c3d8 (patch)
treeaa76fbb41be52cad6e64fb198ccd12616353e4d1 /libavcodec/targa.c
parent90bfd511c4b6098d247341227059bdd714fb62ba (diff)
Support decoding right-to-left targa files.
Fixes ticket #698.
Diffstat (limited to 'libavcodec/targa.c')
-rw-r--r--libavcodec/targa.c23
1 files changed, 23 insertions, 0 deletions
diff --git a/libavcodec/targa.c b/libavcodec/targa.c
index 884bae6cc9..f60524dc84 100644
--- a/libavcodec/targa.c
+++ b/libavcodec/targa.c
@@ -231,6 +231,29 @@ static int decode_frame(AVCodecContext *avctx,
}
}
}
+ if(flags & 0x10){ // right-to-left, needs horizontal flip
+ int x;
+ for(y = 0; y < s->height; y++){
+ void *line = &p->data[0][y * p->linesize[0]];
+ for(x = 0; x < s->width >> 1; x++){
+ switch(s->bpp){
+ case 32:
+ FFSWAP(uint32_t, ((uint32_t *)line)[x], ((uint32_t *)line)[s->width - x]);
+ break;
+ case 24:
+ FFSWAP(uint8_t, ((uint8_t *)line)[3 * x ], ((uint8_t *)line)[3 * s->width - 3 * x ]);
+ FFSWAP(uint8_t, ((uint8_t *)line)[3 * x + 1], ((uint8_t *)line)[3 * s->width - 3 * x + 1]);
+ FFSWAP(uint8_t, ((uint8_t *)line)[3 * x + 2], ((uint8_t *)line)[3 * s->width - 3 * x + 2]);
+ break;
+ case 16:
+ FFSWAP(uint16_t, ((uint16_t *)line)[x], ((uint16_t *)line)[s->width - x]);
+ break;
+ case 8:
+ FFSWAP(uint8_t, ((uint8_t *)line)[x], ((uint8_t *)line)[s->width - x]);
+ }
+ }
+ }
+ }
*picture= *(AVFrame*)&s->picture;
*data_size = sizeof(AVPicture);