use crate::{HeaderTagFlag, HeaderTagHeader, HeaderTagType};
use core::mem;
use multiboot2_common::{MaybeDynSized, Tag};
#[derive(Copy, Clone, Debug, PartialEq, Eq, PartialOrd, Ord, Hash)]
#[repr(C, align(8))]
pub struct FramebufferHeaderTag {
header: HeaderTagHeader,
width: u32,
height: u32,
depth: u32,
}
impl FramebufferHeaderTag {
#[must_use]
pub const fn new(flags: HeaderTagFlag, width: u32, height: u32, depth: u32) -> Self {
let header =
HeaderTagHeader::new(HeaderTagType::Framebuffer, flags, Self::BASE_SIZE as u32);
Self {
header,
width,
height,
depth,
}
}
#[must_use]
pub const fn typ(&self) -> HeaderTagType {
self.header.typ()
}
#[must_use]
pub const fn flags(&self) -> HeaderTagFlag {
self.header.flags()
}
#[must_use]
pub const fn size(&self) -> u32 {
self.header.size()
}
#[must_use]
pub const fn width(&self) -> u32 {
self.width
}
#[must_use]
pub const fn height(&self) -> u32 {
self.height
}
#[must_use]
pub const fn depth(&self) -> u32 {
self.depth
}
}
impl MaybeDynSized for FramebufferHeaderTag {
type Header = HeaderTagHeader;
const BASE_SIZE: usize = mem::size_of::<HeaderTagHeader>() + 3 * mem::size_of::<u32>();
fn dst_len(_header: &Self::Header) -> Self::Metadata {}
}
impl Tag for FramebufferHeaderTag {
type IDType = HeaderTagType;
const ID: HeaderTagType = HeaderTagType::Framebuffer;
}