1use super::{HiiHandle, ImageId};
6use crate::protocol::console::{GraphicsOutputBltPixel, GraphicsOutputProtocol};
7use crate::{Guid, Status, guid};
8use core::fmt;
9
10bitflags::bitflags! {
11 #[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#[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 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#[derive(Debug)]
71#[repr(C)]
72pub struct ImageOutput {
73 pub width: u16,
74 pub height: u16,
75 pub image: ImageOutputDest,
76}
77
78#[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#[derive(Debug)]
125#[repr(C)]
126pub struct HiiImageExProtocol {
127 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}