@@ -549,6 +549,8 @@ static gif_result gif_error_from_lzw(lzw_result l_res)
549
549
[LZW_BAD_ICODE ] = GIF_FRAME_DATA_ERROR ,
550
550
[LZW_BAD_CODE ] = GIF_FRAME_DATA_ERROR ,
551
551
};
552
+ assert (l_res != LZW_BAD_PARAM );
553
+ assert (l_res != LZW_NO_COLOUR );
552
554
return g_res [l_res ];
553
555
}
554
556
@@ -638,9 +640,8 @@ gif__decode_complex(gif_animation *gif,
638
640
lzw_result res ;
639
641
640
642
/* Initialise the LZW decoding */
641
- res = lzw_decode_init (gif -> lzw_ctx , gif -> gif_data ,
642
- gif -> buffer_size , gif -> buffer_position ,
643
- minimum_code_size );
643
+ res = lzw_decode_init (gif -> lzw_ctx , minimum_code_size ,
644
+ gif -> gif_data , gif -> buffer_size , gif -> buffer_position );
644
645
if (res != LZW_OK ) {
645
646
return gif_error_from_lzw (res );
646
647
}
@@ -675,20 +676,28 @@ gif__decode_complex(gif_animation *gif,
675
676
}
676
677
break ;
677
678
}
678
- res = lzw_decode_continuous (gif -> lzw_ctx ,
679
+ res = lzw_decode (gif -> lzw_ctx ,
679
680
& uncompressed , & available );
680
681
}
681
682
682
683
row_available = x < available ? x : available ;
683
684
x -= row_available ;
684
685
available -= row_available ;
685
- while (row_available -- > 0 ) {
686
- register unsigned int colour ;
687
- colour = * uncompressed ++ ;
688
- if (colour != transparency_index ) {
689
- * frame_scanline = colour_table [colour ];
686
+ if (transparency_index > 0xFF ) {
687
+ while (row_available -- > 0 ) {
688
+ * frame_scanline ++ =
689
+ colour_table [* uncompressed ++ ];
690
+ }
691
+ } else {
692
+ while (row_available -- > 0 ) {
693
+ register unsigned int colour ;
694
+ colour = * uncompressed ++ ;
695
+ if (colour != transparency_index ) {
696
+ * frame_scanline =
697
+ colour_table [colour ];
698
+ }
699
+ frame_scanline ++ ;
690
700
}
691
- frame_scanline ++ ;
692
701
}
693
702
}
694
703
}
@@ -710,23 +719,22 @@ gif__decode_simple(gif_animation *gif,
710
719
gif_result ret = GIF_OK ;
711
720
lzw_result res ;
712
721
722
+ transparency_index = gif -> frames [frame ].transparency ?
723
+ gif -> frames [frame ].transparency_index :
724
+ GIF_NO_TRANSPARENCY ;
725
+
713
726
/* Initialise the LZW decoding */
714
- res = lzw_decode_init (gif -> lzw_ctx , gif -> gif_data ,
715
- gif -> buffer_size , gif -> buffer_position ,
716
- minimum_code_size );
727
+ res = lzw_decode_init_map (gif -> lzw_ctx ,
728
+ minimum_code_size , transparency_index , colour_table ,
729
+ gif -> gif_data , gif -> buffer_size , gif -> buffer_position );
717
730
if (res != LZW_OK ) {
718
731
return gif_error_from_lzw (res );
719
732
}
720
733
721
- transparency_index = gif -> frames [frame ].transparency ?
722
- gif -> frames [frame ].transparency_index :
723
- GIF_NO_TRANSPARENCY ;
724
-
725
734
frame_data += (offset_y * gif -> width );
726
735
727
736
while (pixels > 0 ) {
728
- res = lzw_decode_map_continuous (gif -> lzw_ctx ,
729
- transparency_index , colour_table ,
737
+ res = lzw_decode_map (gif -> lzw_ctx ,
730
738
frame_data , pixels , & written );
731
739
pixels -= written ;
732
740
frame_data += written ;
0 commit comments