| 124 | } |
| 125 | |
| 126 | fn write_pixel(&mut self, x: usize, y: usize, intensity: u8) { |
| 127 | let pixel_offset = y * self.info.stride + x; |
| 128 | |
| 129 | let r = intensity; |
| 130 | let g = [intensity, 0][self.level]; |
| 131 | let b = [intensity / 2, 0][self.level]; |
| 132 | let color = match self.info.pixel_format { |
| 133 | PixelFormat::Rgb => [r, g, b, 0], |
| 134 | PixelFormat::Bgr => [b, g, r, 0], |
| 135 | PixelFormat::U8 => [if intensity > 200 { 0xf } else { 0 }, 0, 0, 0], |
| 136 | other => { |
| 137 | // set a supported (but invalid) pixel format before panicking to avoid a double |
| 138 | // panic; it might not be readable though |
| 139 | self.info.pixel_format = PixelFormat::Rgb; |
| 140 | panic!("pixel format {:?} not supported in logger", other) |
| 141 | } |
| 142 | }; |
| 143 | let bytes_per_pixel = self.info.bytes_per_pixel; |
| 144 | let byte_offset = pixel_offset * bytes_per_pixel; |
| 145 | self.framebuffer[byte_offset..(byte_offset + bytes_per_pixel)] |
| 146 | .copy_from_slice(&color[..bytes_per_pixel]); |
| 147 | let _ = unsafe { ptr::read_volatile(&self.framebuffer[byte_offset]) }; |
| 148 | } |
| 149 | } |
| 150 | |
| 151 | unsafe impl Send for FrameBufferWriter {} |