Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions Cargo.lock

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

1 change: 1 addition & 0 deletions Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@ license = "GPL-3.0-only"
lto = true

[dependencies]
bitflags = "2.13"
orbclient = { version = "=0.3.51", default-features = false }
orbfont = { version = "0.1.12", default-features = false, features = ["no-std"] }
redox_uefi_std = "0.1.14"
Expand Down
62 changes: 2 additions & 60 deletions src/fde.rs
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@
#![allow(clippy::collapsible_if)]
#![allow(clippy::collapsible_match)]

use core::{char, cmp, mem, ptr, slice};
use core::{cmp, mem, ptr, slice};
use orbclient::{Color, Renderer};
use orbfont::Text;
use std::ffi;
Expand All @@ -18,68 +18,10 @@ use std::uefi::hii::{AnimationId, ImageId, StringId};
use std::uefi::text::TextInputKey;

use crate::display::{Display, Output};
use crate::hii::string::HiiStringProtocol;
use crate::key::{Key, raw_key};
use crate::ui::Ui;

// TODO: Move to uefi library {
pub const HII_STRING_PROTOCOL_GUID: Guid = guid!("0fd96974-23aa-4cdc-b9cb-98d17750322a");

#[repr(C)]
pub struct HiiStringProtocol {
pub NewString: extern "efiapi" fn(), //TODO
pub GetString: extern "efiapi" fn(
&HiiStringProtocol,
Language: *const u8,
PackageList: HiiHandle,
StringId: StringId,
String: *mut u16,
StringSize: &mut usize,
StringFontInfo: usize, // TODO
) -> Status,
pub SetString: extern "efiapi" fn(), //TODO
pub GetLanguages: extern "efiapi" fn(), //TODO
pub GetSecondaryLanguages: extern "efiapi" fn(), //TODO
}

impl HiiStringProtocol {
pub fn string(&self, PackageList: HiiHandle, StringId: StringId) -> Result<String> {
let mut data = vec![0u16; 4096];
let mut len = data.len();
Result::from((self.GetString)(
self,
c"en-US".as_ptr() as *const u8,
PackageList,
StringId,
data.as_mut_ptr(),
&mut len,
0,
))?;
data.truncate(len);

let mut string = String::new();
for &w in data.iter() {
if w == 0 {
break;
}
let c = unsafe { char::from_u32_unchecked(w as u32) };
string.push(c);
}
Ok(string)
}
}

impl Protocol<HiiStringProtocol> for &'static mut HiiStringProtocol {
fn guid() -> Guid {
HII_STRING_PROTOCOL_GUID
}

fn new(inner: &'static mut HiiStringProtocol) -> Self {
inner
}
}

// } TODO: Move to uefi library

// TODO: move to uefi library {
#[repr(C)]
pub struct ListEntry<T> {
Expand Down
31 changes: 31 additions & 0 deletions src/hii/font.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,31 @@
// SPDX-License-Identifier: GPL-3.0-only

// TODO: Move to uefi library

bitflags::bitflags! {
/// `EFI_HII_FONT_STYLE`
#[derive(Clone, Copy, Debug, Eq, PartialEq, Ord, PartialOrd, Hash)]
#[repr(transparent)]
pub struct HiiFontStyle: u32 {
const BOLD = 1 << 0;
const ITALIC = 1 << 1;
const EMBOSS = 1 << 16;
const OUTLINE = 1 << 17;
const SHADOW = 1 << 18;
const UNDERLINE = 1 << 19;
const DBL_UNDER = 1 << 20;
}
}

impl HiiFontStyle {
pub const NORMAL: Self = Self::empty();
}

/// `EFI_FONT_INFO`
#[repr(C)]
#[derive(Debug)]
pub struct FontInfo {
pub font_style: HiiFontStyle,
pub font_size: u16,
pub font_name: [u16; 0],
}
3 changes: 3 additions & 0 deletions src/hii.rs → src/hii/mod.rs
Original file line number Diff line number Diff line change
@@ -1,5 +1,8 @@
// SPDX-License-Identifier: GPL-3.0-only

pub mod font;
pub mod string;

use std::prelude::*;
use std::proto::Protocol;
use std::uefi::hii::database::HiiDatabase;
Expand Down
95 changes: 95 additions & 0 deletions src/hii/string.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,95 @@
// SPDX-License-Identifier: GPL-3.0-only

// TODO: Move to uefi library

use super::font::FontInfo;
use std::prelude::*;
use std::proto::Protocol;
use std::uefi::hii::StringId;
use std::uefi::hii::database::HiiHandle;

/// `EFI_HII_STRING_PROTOCOL`
#[repr(C)]
#[derive(Debug)]
pub struct HiiStringProtocol {
pub new_string: unsafe extern "efiapi" fn(
this: *const Self,
package_list: HiiHandle,
string_id: *mut StringId,
language: *const u8,
language_name: *const u16,
string: *const u16,
string_font_info: *const FontInfo,
) -> Status,
pub get_string: unsafe extern "efiapi" fn(
this: *const Self,
language: *const u8,
package_list: HiiHandle,
string_id: StringId,
string: *mut u16,
string_size: *mut usize,
string_font_info: *mut *mut FontInfo,
) -> Status,
pub set_string: unsafe extern "efiapi" fn(
this: *const Self,
package_list: HiiHandle,
string_id: StringId,
language: *const u8,
string: *const u16,
string_font_info: *const FontInfo,
) -> Status,
pub get_languages: unsafe extern "efiapi" fn(
this: *const Self,
package_list: HiiHandle,
languages: *mut u8,
languages_size: *mut usize,
) -> Status,
pub get_secondary_languages: unsafe extern "efiapi" fn(
this: *const Self,
package_list: HiiHandle,
primary_language: *const u8,
secondary_languages: *mut u8,
secondary_languages_size: *mut usize,
) -> Status,
}

impl HiiStringProtocol {
pub const GUID: Guid = guid!("0fd96974-23aa-4cdc-b9cb-98d17750322a");

pub fn string(&self, package_list: HiiHandle, string_id: StringId) -> Result<String> {
let mut data = vec![0u16; 4096];
let mut len = data.len();
unsafe {
Result::from((self.get_string)(
self,
c"en-US".as_ptr() as *const u8,
package_list,
string_id,
data.as_mut_ptr(),
&mut len,
core::ptr::null_mut(),
))?;
}
data.truncate(len);

let mut string = String::new();
for &w in data.iter() {
if w == 0 {
break;
}
let c = unsafe { core::char::from_u32_unchecked(w as u32) };
string.push(c);
}
Ok(string)
}
}

impl Protocol<HiiStringProtocol> for &'static mut HiiStringProtocol {
fn guid() -> Guid {
HiiStringProtocol::GUID
}

fn new(inner: &'static mut HiiStringProtocol) -> Self {
inner
}
}
Loading