1*2755467cS曾俊 use core::slice::Iter; 2*2755467cS曾俊 3*2755467cS曾俊 pub struct BitIter<'a> { 4*2755467cS曾俊 fgcolor: u32, 5*2755467cS曾俊 bkcolor: u32, 6*2755467cS曾俊 _color_pattern: EndianPattern, 7*2755467cS曾俊 _dst_pattern: EndianPattern, 8*2755467cS曾俊 src: Iter<'a, u8>, 9*2755467cS曾俊 read_mask: u8, 10*2755467cS曾俊 byte_per_pixel: u32, 11*2755467cS曾俊 buffer: u32, 12*2755467cS曾俊 current: u8, 13*2755467cS曾俊 left_byte: u32, 14*2755467cS曾俊 done: bool, 15*2755467cS曾俊 consumed_bit: u32, 16*2755467cS曾俊 image_width: u32, 17*2755467cS曾俊 } 18*2755467cS曾俊 19*2755467cS曾俊 impl<'a> BitIter<'a> { new( fgcolor: u32, bkcolor: u32, dst_pattern: EndianPattern, color_pattern: EndianPattern, byte_per_pixel: u32, src: Iter<'a, u8>, image_width: u32, ) -> Self20*2755467cS曾俊 pub fn new( 21*2755467cS曾俊 fgcolor: u32, 22*2755467cS曾俊 bkcolor: u32, 23*2755467cS曾俊 dst_pattern: EndianPattern, 24*2755467cS曾俊 color_pattern: EndianPattern, 25*2755467cS曾俊 byte_per_pixel: u32, 26*2755467cS曾俊 src: Iter<'a, u8>, 27*2755467cS曾俊 image_width: u32, 28*2755467cS曾俊 ) -> Self { 29*2755467cS曾俊 let mut fgcolor = fgcolor; 30*2755467cS曾俊 let mut bkcolor = bkcolor; 31*2755467cS曾俊 if dst_pattern != color_pattern { 32*2755467cS曾俊 fgcolor = Self::reverse(fgcolor, byte_per_pixel); 33*2755467cS曾俊 bkcolor = Self::reverse(bkcolor, byte_per_pixel); 34*2755467cS曾俊 } 35*2755467cS曾俊 36*2755467cS曾俊 let mut ans = Self { 37*2755467cS曾俊 fgcolor, 38*2755467cS曾俊 bkcolor, 39*2755467cS曾俊 _color_pattern: color_pattern, 40*2755467cS曾俊 _dst_pattern: dst_pattern, 41*2755467cS曾俊 src, 42*2755467cS曾俊 read_mask: 0b10000000, 43*2755467cS曾俊 byte_per_pixel, 44*2755467cS曾俊 buffer: 0, 45*2755467cS曾俊 current: 0, 46*2755467cS曾俊 left_byte: 0, 47*2755467cS曾俊 done: false, 48*2755467cS曾俊 consumed_bit: 0, 49*2755467cS曾俊 image_width, 50*2755467cS曾俊 }; 51*2755467cS曾俊 ans.current = *ans.src.next().unwrap(); 52*2755467cS曾俊 return ans; 53*2755467cS曾俊 } 54*2755467cS曾俊 reverse(num: u32, byte_per_pixel: u32) -> u3255*2755467cS曾俊 fn reverse(num: u32, byte_per_pixel: u32) -> u32 { 56*2755467cS曾俊 let mask = 0x000000ff; 57*2755467cS曾俊 let mut ans = 0; 58*2755467cS曾俊 let mut num = num; 59*2755467cS曾俊 for _ in 0..3 { 60*2755467cS曾俊 ans |= mask & num; 61*2755467cS曾俊 ans <<= 8; 62*2755467cS曾俊 num >>= 8; 63*2755467cS曾俊 } 64*2755467cS曾俊 ans |= mask & num; 65*2755467cS曾俊 ans >>= (4 - byte_per_pixel) * 8; 66*2755467cS曾俊 return ans; 67*2755467cS曾俊 } 68*2755467cS曾俊 move_mask(&mut self) -> bool69*2755467cS曾俊 fn move_mask(&mut self) -> bool { 70*2755467cS曾俊 self.consumed_bit += 1; 71*2755467cS曾俊 self.read_mask >>= 1; 72*2755467cS曾俊 if self.read_mask == 0b000000000 { 73*2755467cS曾俊 self.read_mask = 0b10000000; 74*2755467cS曾俊 self.current = match self.src.next() { 75*2755467cS曾俊 Some(x) => *x, 76*2755467cS曾俊 None => { 77*2755467cS曾俊 return false; 78*2755467cS曾俊 } 79*2755467cS曾俊 }; 80*2755467cS曾俊 return true; 81*2755467cS曾俊 } else { 82*2755467cS曾俊 return true; 83*2755467cS曾俊 } 84*2755467cS曾俊 } 85*2755467cS曾俊 full_buffer(&mut self) -> Result<PixelLineStatus, PixelLineStatus>86*2755467cS曾俊 fn full_buffer(&mut self) -> Result<PixelLineStatus, PixelLineStatus> { 87*2755467cS曾俊 let same_endian = if self._dst_pattern == self._color_pattern { 88*2755467cS曾俊 1 89*2755467cS曾俊 } else { 90*2755467cS曾俊 -1 91*2755467cS曾俊 }; 92*2755467cS曾俊 let mut color = self.read_bit() << (self.left_byte << 3); 93*2755467cS曾俊 let mut buffer_pointer = if self._dst_pattern == self._color_pattern { 94*2755467cS曾俊 0 95*2755467cS曾俊 } else { 96*2755467cS曾俊 3 97*2755467cS曾俊 }; 98*2755467cS曾俊 let mask = 0x000000ff << ((self.byte_per_pixel - 1) << 3); 99*2755467cS曾俊 let mut temp; 100*2755467cS曾俊 // while buffer_pointer >= 0 && buffer_pointer <= 3 { 101*2755467cS曾俊 while (0..=3).contains(&buffer_pointer) { 102*2755467cS曾俊 if self.consumed_bit >= self.image_width { 103*2755467cS曾俊 self.consumed_bit = 0; 104*2755467cS曾俊 return Ok(PixelLineStatus::Full(self.buffer)); 105*2755467cS曾俊 } 106*2755467cS曾俊 temp = color & mask; 107*2755467cS曾俊 color <<= 8; 108*2755467cS曾俊 temp <<= (4 - self.byte_per_pixel) * 8; 109*2755467cS曾俊 temp >>= buffer_pointer * 8; 110*2755467cS曾俊 self.buffer |= temp; 111*2755467cS曾俊 buffer_pointer += same_endian; 112*2755467cS曾俊 self.left_byte += 1; 113*2755467cS曾俊 if self.left_byte >= self.byte_per_pixel { 114*2755467cS曾俊 self.left_byte = 0; 115*2755467cS曾俊 if !self.move_mask() { 116*2755467cS曾俊 return Err(PixelLineStatus::Full(self.buffer)); 117*2755467cS曾俊 } 118*2755467cS曾俊 color = self.read_bit(); 119*2755467cS曾俊 } 120*2755467cS曾俊 } 121*2755467cS曾俊 if self.consumed_bit >= self.image_width { 122*2755467cS曾俊 self.consumed_bit = 0; 123*2755467cS曾俊 return Ok(PixelLineStatus::Full(self.buffer)); 124*2755467cS曾俊 } 125*2755467cS曾俊 return Ok(PixelLineStatus::NotFull(self.buffer)); 126*2755467cS曾俊 } 127*2755467cS曾俊 read_bit(&self) -> u32128*2755467cS曾俊 fn read_bit(&self) -> u32 { 129*2755467cS曾俊 match self.read_mask & self.current { 130*2755467cS曾俊 0 => self.bkcolor, 131*2755467cS曾俊 _ => self.fgcolor, 132*2755467cS曾俊 } 133*2755467cS曾俊 } 134*2755467cS曾俊 } 135*2755467cS曾俊 136*2755467cS曾俊 impl Iterator for BitIter<'_> { 137*2755467cS曾俊 type Item = (u32, bool); next(&mut self) -> Option<Self::Item>138*2755467cS曾俊 fn next(&mut self) -> Option<Self::Item> { 139*2755467cS曾俊 if self.done { 140*2755467cS曾俊 return None; 141*2755467cS曾俊 } 142*2755467cS曾俊 match self.full_buffer() { 143*2755467cS曾俊 Ok(x) => { 144*2755467cS曾俊 self.buffer = 0; 145*2755467cS曾俊 return Some(x.unwarp()); 146*2755467cS曾俊 } 147*2755467cS曾俊 Err(x) => { 148*2755467cS曾俊 self.done = true; 149*2755467cS曾俊 return Some(x.unwarp()); 150*2755467cS曾俊 } 151*2755467cS曾俊 } 152*2755467cS曾俊 } 153*2755467cS曾俊 } 154*2755467cS曾俊 #[derive(PartialEq, PartialOrd)] 155*2755467cS曾俊 pub enum EndianPattern { 156*2755467cS曾俊 Big, 157*2755467cS曾俊 Little, 158*2755467cS曾俊 } 159*2755467cS曾俊 160*2755467cS曾俊 pub enum PixelLineStatus { 161*2755467cS曾俊 Full(u32), 162*2755467cS曾俊 NotFull(u32), 163*2755467cS曾俊 } 164*2755467cS曾俊 165*2755467cS曾俊 impl PixelLineStatus { unwarp(self) -> (u32, bool)166*2755467cS曾俊 pub fn unwarp(self) -> (u32, bool) { 167*2755467cS曾俊 match self { 168*2755467cS曾俊 PixelLineStatus::Full(x) => (x, true), 169*2755467cS曾俊 PixelLineStatus::NotFull(x) => (x, false), 170*2755467cS曾俊 } 171*2755467cS曾俊 } 172*2755467cS曾俊 } 173