@ -26,6 +26,7 @@
# include "s3tc.h"
static inline void dxt1_decode_pixels ( GetByteContext * gb , uint32_t * d ,
unsigned int w , unsigned int h ,
unsigned int qstride , unsigned int flag ,
uint64_t alpha ) {
unsigned int x , y , c0 , c1 , a = ( ! flag * 255u ) < < 24 ;
@ -62,14 +63,16 @@ static inline void dxt1_decode_pixels(GetByteContext *gb, uint32_t *d,
colors [ 2 ] = rb2 + g2 + a ;
pixels = bytestream2_get_le32 ( gb ) ;
for ( y = 0 ; y < 4 ; y + + ) {
for ( x = 0 ; x < 4 ; x + + ) {
for ( y = 0 ; y < h ; y + + ) {
for ( x = 0 ; x < w ; x + + ) {
a = ( alpha & 0x0f ) < < 28 ;
a + = a > > 4 ;
d [ x ] = a + colors [ pixels & 3 ] ;
pixels > > = 2 ;
alpha > > = 4 ;
}
for ( ; x < 4 ; x + + )
pixels > > = 2 ;
d + = qstride ;
}
}
@ -77,21 +80,21 @@ static inline void dxt1_decode_pixels(GetByteContext *gb, uint32_t *d,
void ff_decode_dxt1 ( GetByteContext * gb , uint8_t * dst ,
const unsigned int w , const unsigned int h ,
const unsigned int stride ) {
unsigned int b x, b y, qstride = stride / 4 ;
unsigned int x , y , qstride = stride / 4 ;
uint32_t * d = ( uint32_t * ) dst ;
for ( b y= 0 ; b y < h / 4 ; by + + , d + = stride - w )
for ( b x = 0 ; b x < w / 4 ; bx + + , d + = 4 )
dxt1_decode_pixels ( gb , d , qstride , 0 , 0LL ) ;
for ( y = 0 ; y < h ; y + = 4 , d + = stride - w )
for ( x = 0 ; x < w ; d + = FFMIN ( 4 , w - x ) , x + = 4 )
dxt1_decode_pixels ( gb , d , FFMIN ( 4 , w - x ) , FFMIN ( 4 , h - y ) , qstride , 0 , 0LL ) ;
}
void ff_decode_dxt3 ( GetByteContext * gb , uint8_t * dst ,
const unsigned int w , const unsigned int h ,
const unsigned int stride ) {
unsigned int b x, b y, qstride = stride / 4 ;
unsigned int x , y , qstride = stride / 4 ;
uint32_t * d = ( uint32_t * ) dst ;
for ( b y= 0 ; b y < h / 4 ; by + + , d + = stride - w )
for ( b x = 0 ; b x < w / 4 ; bx + + , d + = 4 )
dxt1_decode_pixels ( gb , d , qstride , 1 , bytestream2_get_le64 ( gb ) ) ;
for ( y = 0 ; y < h ; y + = 4 , d + = stride - w )
for ( x = 0 ; x < w ; d + = FFMIN ( 4 , w - x ) , x + = 4 )
dxt1_decode_pixels ( gb , d , FFMIN ( 4 , w - x ) , FFMIN ( 4 , h - y ) , qstride , 1 , bytestream2_get_le64 ( gb ) ) ;
}