use crate::{ | |
sdt::{SdtHeader, Signature}, | |
AcpiTable, | |
}; | |
use bit_field::BitField; | |
/// The BGRT table contains information about a boot graphic that was displayed | |
/// by firmware. | |
#[repr(C, packed)] | |
#[derive(Debug, Clone, Copy)] | |
pub struct Bgrt { | |
header: SdtHeader, | |
pub version: u16, | |
status: u8, | |
image_type: u8, | |
pub image_address: u64, | |
image_offset_x: u32, | |
image_offset_y: u32, | |
} | |
/// ### Safety: Implementation properly represents a valid BGRT. | |
unsafe impl AcpiTable for Bgrt { | |
const SIGNATURE: Signature = Signature::BGRT; | |
fn header(&self) -> &SdtHeader { | |
&self.header | |
} | |
} | |
impl Bgrt { | |
pub fn image_type(&self) -> ImageType { | |
let img_type = self.image_type; | |
match img_type { | |
0 => ImageType::Bitmap, | |
_ => ImageType::Reserved, | |
} | |
} | |
/// Gets the orientation offset of the image. | |
/// Degrees are clockwise from the images default orientation. | |
pub fn orientation_offset(&self) -> u16 { | |
let status = self.status; | |
match status.get_bits(1..3) { | |
0 => 0, | |
1 => 90, | |
2 => 180, | |
3 => 270, | |
_ => unreachable!(), // will never happen | |
} | |
} | |
pub fn was_displayed(&self) -> bool { | |
let status = self.status; | |
status.get_bit(0) | |
} | |
pub fn image_offset(&self) -> (u32, u32) { | |
let x = self.image_offset_x; | |
let y = self.image_offset_y; | |
(x, y) | |
} | |
} | |
#[repr(u8)] | |
#[derive(Clone, Copy, Debug, Eq, PartialEq, Ord, PartialOrd, Hash)] | |
pub enum ImageType { | |
Bitmap, | |
Reserved, | |
} |