@@ -13,28 +13,16 @@ use crate::error::{
1313use crate :: image:: { self , ImageDecoder , ImageFormat } ;
1414use crate :: ImageDecoderRect ;
1515
16+ use crate :: utils:: packed_color:: Bitfield ;
17+ use crate :: utils:: packed_color:: { BitfieldError , Bitfields } ;
18+
1619const BITMAPCOREHEADER_SIZE : u32 = 12 ;
1720const BITMAPINFOHEADER_SIZE : u32 = 40 ;
1821const BITMAPV2HEADER_SIZE : u32 = 52 ;
1922const BITMAPV3HEADER_SIZE : u32 = 56 ;
2023const BITMAPV4HEADER_SIZE : u32 = 108 ;
2124const BITMAPV5HEADER_SIZE : u32 = 124 ;
2225
23- static LOOKUP_TABLE_3_BIT_TO_8_BIT : [ u8 ; 8 ] = [ 0 , 36 , 73 , 109 , 146 , 182 , 219 , 255 ] ;
24- static LOOKUP_TABLE_4_BIT_TO_8_BIT : [ u8 ; 16 ] = [
25- 0 , 17 , 34 , 51 , 68 , 85 , 102 , 119 , 136 , 153 , 170 , 187 , 204 , 221 , 238 , 255 ,
26- ] ;
27- static LOOKUP_TABLE_5_BIT_TO_8_BIT : [ u8 ; 32 ] = [
28- 0 , 8 , 16 , 25 , 33 , 41 , 49 , 58 , 66 , 74 , 82 , 90 , 99 , 107 , 115 , 123 , 132 , 140 , 148 , 156 , 165 , 173 ,
29- 181 , 189 , 197 , 206 , 214 , 222 , 230 , 239 , 247 , 255 ,
30- ] ;
31- static LOOKUP_TABLE_6_BIT_TO_8_BIT : [ u8 ; 64 ] = [
32- 0 , 4 , 8 , 12 , 16 , 20 , 24 , 28 , 32 , 36 , 40 , 45 , 49 , 53 , 57 , 61 , 65 , 69 , 73 , 77 , 81 , 85 , 89 , 93 ,
33- 97 , 101 , 105 , 109 , 113 , 117 , 121 , 125 , 130 , 134 , 138 , 142 , 146 , 150 , 154 , 158 , 162 , 166 , 170 ,
34- 174 , 178 , 182 , 186 , 190 , 194 , 198 , 202 , 206 , 210 , 215 , 219 , 223 , 227 , 231 , 235 , 239 , 243 , 247 ,
35- 251 , 255 ,
36- ] ;
37-
3826static R5_G5_B5_COLOR_MASK : Bitfields = Bitfields {
3927 r : Bitfield { len : 5 , shift : 10 } ,
4028 g : Bitfield { len : 5 , shift : 5 } ,
@@ -120,14 +108,8 @@ enum DecoderError {
120108 // Failed to decompress RLE data.
121109 CorruptRleData ,
122110
123- /// The bitfield mask interleaves set and unset bits
124- BitfieldMaskNonContiguous ,
125- /// Bitfield mask invalid (e.g. too long for specified type)
126- BitfieldMaskInvalid ,
127- /// Bitfield (of the specified width – 16- or 32-bit) mask not present
128- BitfieldMaskMissing ( u32 ) ,
129111 /// Bitfield (of the specified width – 16- or 32-bit) masks not present
130- BitfieldMasksMissing ( u32 ) ,
112+ BitfieldError ( BitfieldError ) ,
131113
132114 /// BMP's "BM" signature wrong or missing
133115 BmpSignatureInvalid ,
@@ -164,13 +146,8 @@ impl fmt::Display for DecoderError {
164146 fn fmt ( & self , f : & mut fmt:: Formatter < ' _ > ) -> fmt:: Result {
165147 match self {
166148 DecoderError :: CorruptRleData => f. write_str ( "Corrupt RLE data" ) ,
167- DecoderError :: BitfieldMaskNonContiguous => f. write_str ( "Non-contiguous bitfield mask" ) ,
168- DecoderError :: BitfieldMaskInvalid => f. write_str ( "Invalid bitfield mask" ) ,
169- DecoderError :: BitfieldMaskMissing ( bb) => {
170- f. write_fmt ( format_args ! ( "Missing {bb}-bit bitfield mask" ) )
171- }
172- DecoderError :: BitfieldMasksMissing ( bb) => {
173- f. write_fmt ( format_args ! ( "Missing {bb}-bit bitfield masks" ) )
149+ DecoderError :: BitfieldError ( bb) => {
150+ f. write_fmt ( format_args ! ( "Bitfield error: {bb}" ) )
174151 }
175152 DecoderError :: BmpSignatureInvalid => f. write_str ( "BMP signature not found" ) ,
176153 DecoderError :: MoreThanOnePlane => f. write_str ( "More than one plane" ) ,
@@ -207,6 +184,15 @@ impl From<DecoderError> for ImageError {
207184 }
208185}
209186
187+ impl From < BitfieldError > for ImageError {
188+ fn from ( e : BitfieldError ) -> ImageError {
189+ ImageError :: Decoding ( DecodingError :: new (
190+ ImageFormat :: Bmp . into ( ) ,
191+ DecoderError :: BitfieldError ( e) ,
192+ ) )
193+ }
194+ }
195+
210196impl error:: Error for DecoderError { }
211197
212198/// Distinct image types whose saved channel width can be invalid
@@ -397,77 +383,6 @@ fn set_1bit_pixel_run<'a, T: Iterator<Item = &'a u8>>(
397383 }
398384}
399385
400- #[ derive( PartialEq , Eq ) ]
401- struct Bitfield {
402- shift : u32 ,
403- len : u32 ,
404- }
405-
406- impl Bitfield {
407- fn from_mask ( mask : u32 , max_len : u32 ) -> ImageResult < Bitfield > {
408- if mask == 0 {
409- return Ok ( Bitfield { shift : 0 , len : 0 } ) ;
410- }
411- let mut shift = mask. trailing_zeros ( ) ;
412- let mut len = ( !( mask >> shift) ) . trailing_zeros ( ) ;
413- if len != mask. count_ones ( ) {
414- return Err ( DecoderError :: BitfieldMaskNonContiguous . into ( ) ) ;
415- }
416- if len + shift > max_len {
417- return Err ( DecoderError :: BitfieldMaskInvalid . into ( ) ) ;
418- }
419- if len > 8 {
420- shift += len - 8 ;
421- len = 8 ;
422- }
423- Ok ( Bitfield { shift, len } )
424- }
425-
426- fn read ( & self , data : u32 ) -> u8 {
427- let data = data >> self . shift ;
428- match self . len {
429- 1 => ( ( data & 0b1 ) * 0xff ) as u8 ,
430- 2 => ( ( data & 0b11 ) * 0x55 ) as u8 ,
431- 3 => LOOKUP_TABLE_3_BIT_TO_8_BIT [ ( data & 0b00_0111 ) as usize ] ,
432- 4 => LOOKUP_TABLE_4_BIT_TO_8_BIT [ ( data & 0b00_1111 ) as usize ] ,
433- 5 => LOOKUP_TABLE_5_BIT_TO_8_BIT [ ( data & 0b01_1111 ) as usize ] ,
434- 6 => LOOKUP_TABLE_6_BIT_TO_8_BIT [ ( data & 0b11_1111 ) as usize ] ,
435- 7 => ( ( data & 0x7f ) << 1 | ( data & 0x7f ) >> 6 ) as u8 ,
436- 8 => ( data & 0xff ) as u8 ,
437- _ => panic ! ( ) ,
438- }
439- }
440- }
441-
442- #[ derive( PartialEq , Eq ) ]
443- struct Bitfields {
444- r : Bitfield ,
445- g : Bitfield ,
446- b : Bitfield ,
447- a : Bitfield ,
448- }
449-
450- impl Bitfields {
451- fn from_mask (
452- r_mask : u32 ,
453- g_mask : u32 ,
454- b_mask : u32 ,
455- a_mask : u32 ,
456- max_len : u32 ,
457- ) -> ImageResult < Bitfields > {
458- let bitfields = Bitfields {
459- r : Bitfield :: from_mask ( r_mask, max_len) ?,
460- g : Bitfield :: from_mask ( g_mask, max_len) ?,
461- b : Bitfield :: from_mask ( b_mask, max_len) ?,
462- a : Bitfield :: from_mask ( a_mask, max_len) ?,
463- } ;
464- if bitfields. r . len == 0 || bitfields. g . len == 0 || bitfields. b . len == 0 {
465- return Err ( DecoderError :: BitfieldMaskMissing ( max_len) . into ( ) ) ;
466- }
467- Ok ( bitfields)
468- }
469- }
470-
471386/// A bmp decoder
472387pub struct BmpDecoder < R > {
473388 reader : R ,
@@ -1308,7 +1223,7 @@ impl<R: BufRead + Seek> BmpDecoder<R> {
13081223 ImageType :: RLE4 => self . read_rle_data ( buf, ImageType :: RLE4 ) ,
13091224 ImageType :: Bitfields16 => match self . bitfields {
13101225 Some ( _) => self . read_16_bit_pixel_data ( buf, None ) ,
1311- None => Err ( DecoderError :: BitfieldMasksMissing ( 16 ) . into ( ) ) ,
1226+ None => Err ( BitfieldError :: MasksMissing ( 16 ) . into ( ) ) ,
13121227 } ,
13131228 ImageType :: Bitfields32 => match self . bitfields {
13141229 Some ( R8_G8_B8_COLOR_MASK ) => {
@@ -1318,7 +1233,7 @@ impl<R: BufRead + Seek> BmpDecoder<R> {
13181233 self . read_full_byte_pixel_data ( buf, & FormatFullBytes :: RGBA32 )
13191234 }
13201235 Some ( _) => self . read_32_bit_pixel_data ( buf) ,
1321- None => Err ( DecoderError :: BitfieldMasksMissing ( 32 ) . into ( ) ) ,
1236+ None => Err ( BitfieldError :: MasksMissing ( 32 ) . into ( ) ) ,
13221237 } ,
13231238 }
13241239 }
0 commit comments