xref: /DragonOS/kernel/src/driver/video/fbdev/base/render_helper.rs (revision 2755467c790d6510fa97cbf052ce8e91ad1372c6)
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