Skip to main content

uefi_raw/protocol/hii/
image.rs

1// SPDX-License-Identifier: MIT OR Apache-2.0
2
3//! Bindings for HII Image protocols and data types
4
5use super::{HiiHandle, ImageId};
6use crate::protocol::console::{GraphicsOutputBltPixel, GraphicsOutputProtocol};
7use crate::{Guid, Status, guid};
8use core::fmt;
9
10bitflags::bitflags! {
11    /// EFI_HII_DRAW_FLAGS
12    #[derive(Clone, Copy, Debug, Eq, PartialEq, Ord, PartialOrd, Hash)]
13    #[repr(transparent)]
14    pub struct HiiDrawFlags: u32 {
15        const CLIP = 1 << 0;
16        const FORCE_TRANS = 1 << 4;
17        const FORCE_OPAQUE = 1 << 5;
18        const TRANSPARENT = Self::FORCE_TRANS.bits() | Self::FORCE_OPAQUE.bits();
19        const DIRECT_TO_SCREEN = 1 << 7;
20    }
21}
22
23impl HiiDrawFlags {
24    pub const DEFAULT: Self = Self::empty();
25}
26
27bitflags::bitflags! {
28    #[derive(Clone, Copy, Debug, Eq, PartialEq, Ord, PartialOrd, Hash)]
29    #[repr(transparent)]
30    pub struct ImageInputFlags: u32 {
31        const TRANSPARENT = 1 << 0;
32    }
33}
34
35/// EFI_IMAGE_INPUT
36#[derive(Debug)]
37#[repr(C)]
38pub struct ImageInput {
39    pub flags: ImageInputFlags,
40    pub width: u16,
41    pub height: u16,
42    pub bitmap: *const GraphicsOutputBltPixel,
43}
44
45#[repr(C)]
46pub union ImageOutputDest {
47    pub bitmap: *mut GraphicsOutputBltPixel,
48    pub screen: *mut GraphicsOutputProtocol,
49}
50
51impl fmt::Debug for ImageOutputDest {
52    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
53        // All union fields are pointers.
54        f.debug_struct("ImageOutputDest")
55            .field("bitmap", unsafe { &self.bitmap })
56            .field("screen", unsafe { &self.screen })
57            .finish()
58    }
59}
60
61impl Default for ImageOutputDest {
62    fn default() -> Self {
63        Self {
64            bitmap: core::ptr::null_mut(),
65        }
66    }
67}
68
69/// EFI_IMAGE_OUTPUT
70#[derive(Debug)]
71#[repr(C)]
72pub struct ImageOutput {
73    pub width: u16,
74    pub height: u16,
75    pub image: ImageOutputDest,
76}
77
78/// EFI_HII_IMAGE_PROTOCOL
79#[derive(Debug)]
80#[repr(C)]
81pub struct HiiImageProtocol {
82    pub new_image: unsafe extern "efiapi" fn(
83        this: *const Self,
84        package_list: HiiHandle,
85        image_id: *mut ImageId,
86        image: *const ImageInput,
87    ) -> Status,
88    pub get_image: unsafe extern "efiapi" fn(
89        this: *const Self,
90        package_list: HiiHandle,
91        image_id: ImageId,
92        image: *mut ImageInput,
93    ) -> Status,
94    pub set_image: unsafe extern "efiapi" fn(
95        this: *const Self,
96        package_list: HiiHandle,
97        image_id: ImageId,
98        image: *const ImageInput,
99    ) -> Status,
100    pub draw_image: unsafe extern "efiapi" fn(
101        this: *const Self,
102        flags: HiiDrawFlags,
103        image: *const ImageInput,
104        blt: *mut *mut ImageOutput,
105        blt_x: usize,
106        blt_y: usize,
107    ) -> Status,
108    pub draw_image_id: unsafe extern "efiapi" fn(
109        this: *const Self,
110        flags: HiiDrawFlags,
111        package_list: HiiHandle,
112        image_id: ImageId,
113        blt: *mut *mut ImageOutput,
114        blt_x: usize,
115        blt_y: usize,
116    ) -> Status,
117}
118
119impl HiiImageProtocol {
120    pub const GUID: Guid = guid!("31a6406a-6bdf-4e46-b2a2-ebaa89c40920");
121}
122
123/// EFI_HII_IMAGE_EX_PROTOCOL
124#[derive(Debug)]
125#[repr(C)]
126pub struct HiiImageExProtocol {
127    // NOTE: UEFI 2.11 declares `image` as an inout value; edk2 declares it as
128    // an input-only value, matching the non-extended protocol version.
129    pub new_image_ex: unsafe extern "efiapi" fn(
130        this: *const Self,
131        package_list: HiiHandle,
132        image_id: *mut ImageId,
133        image: *const ImageInput,
134    ) -> Status,
135    pub get_image_ex: unsafe extern "efiapi" fn(
136        this: *const Self,
137        package_list: HiiHandle,
138        image_id: ImageId,
139        image: *mut ImageInput,
140    ) -> Status,
141    pub set_image_ex: unsafe extern "efiapi" fn(
142        this: *const Self,
143        package_list: HiiHandle,
144        image_id: ImageId,
145        image: *const ImageInput,
146    ) -> Status,
147    pub draw_image_ex: unsafe extern "efiapi" fn(
148        this: *const Self,
149        flags: HiiDrawFlags,
150        image: *const ImageInput,
151        blt: *mut *mut ImageOutput,
152        blt_x: usize,
153        blt_y: usize,
154    ) -> Status,
155    pub draw_image_id_ex: unsafe extern "efiapi" fn(
156        this: *const Self,
157        flags: HiiDrawFlags,
158        package_list: HiiHandle,
159        image_id: ImageId,
160        blt: *mut *mut ImageOutput,
161        blt_x: usize,
162        blt_y: usize,
163    ) -> Status,
164    pub get_image_info: unsafe extern "efiapi" fn(
165        this: *const Self,
166        package_list: HiiHandle,
167        image_id: ImageId,
168        image: *mut ImageOutput,
169    ) -> Status,
170}
171
172impl HiiImageExProtocol {
173    pub const GUID: Guid = guid!("1a1241e6-8f19-41a9-bc0e-e8ef39e06546");
174}