diff --git a/Kernel/Core/metadevs/video/bootvideo.rs b/Kernel/Core/metadevs/video/bootvideo.rs index cc2bb81918b65a5b13590706e8a47bf26a241149..2b3777c0ca3f610a188c3da04862622a2da39f81 100644 --- a/Kernel/Core/metadevs/video/bootvideo.rs +++ b/Kernel/Core/metadevs/video/bootvideo.rs @@ -196,31 +196,29 @@ impl super::Framebuffer for Framebuffer let bpp = output_fmt.bytes_per_pixel(); // Iterate across destination row nums and source rows //for (row,src) in Iterator::zip( dst.top() .. dst.bottom(), buf.chunks(src_pitch) ) - for (row,src) in ::lib::ExactZip::new( dst.top() .. dst.bottom(), buf.chunks(src_pitch) ) + match output_fmt { - let seg = self.buffer.scanline_slice(row as usize, dst.left() as usize, dst.right() as usize); - match output_fmt + VideoFormat::X8R8G8B8 => { + assert!(bpp == 4); + // This mode corresponds to the internal format, so can use fast operations (raw byte copy) + for (row,src) in ::lib::ExactZip::new( dst.top() .. dst.bottom(), buf.chunks(src_pitch) ) { - VideoFormat::X8R8G8B8 => { - // TODO: Find a faster way of bliting. - for (px,&col) in ::lib::ExactZip::new( seg.chunks_mut(bpp), src.iter() ) - { - px[0] = ((col >> 0) & 0xFF) as u8; - px[1] = ((col >> 8) & 0xFF) as u8; - px[2] = ((col >> 16) & 0xFF) as u8; - //px[3] = ((col >> 24) & 0xFF) as u8; - } - }, - VideoFormat::R5G6B5 => { + let seg = self.buffer.scanline_slice(row as usize, dst.left() as usize, dst.right() as usize); + seg.copy_from_slice( ::lib::as_byte_slice(src) ); + } + }, + VideoFormat::R5G6B5 => + for (row,src) in ::lib::ExactZip::new( dst.top() .. dst.bottom(), buf.chunks(src_pitch) ) + { + let seg = self.buffer.scanline_slice(row as usize, dst.left() as usize, dst.right() as usize); for (px,&col) in ::lib::ExactZip::new( seg.chunks_mut(bpp), src.iter() ) { let col16 = output_fmt.col_from_xrgb(col); px[0] = ((col16 >> 0) & 0xFF) as u8; px[1] = ((col16 >> 8) & 0xFF) as u8; } - }, - fmt @ _ => todo!("Framebuffer::blit_buf - {:?}", fmt), - } + }, + fmt @ _ => todo!("Framebuffer::blit_buf - {:?}", fmt), } if redraw_cursor {