use crate::FontGroup;
use crate::Image;
use fonterator::PathOp::{self, *};
type Generator<'b> = Fn(
usize,
&mut [u8; 5],
)
-> &'b [(&'b [([u8; 4], &'b [PathOp])], &'b str)];
pub struct Gui<'a> {
#[allow(unused)] scroll: u32,
size: u32,
#[allow(unused)] ydif_id: Vec<(u32, u32)>,
font: FontGroup<'a>,
}
impl<'a> Gui<'a> {
pub fn new(font: FontGroup<'a>) -> Gui<'a> {
Gui {
scroll: 0,
size: 36,
ydif_id: vec![],
font,
}
}
pub fn head<'b>(
&mut self,
image: &mut Image,
buffer: &mut [u8],
generator: &Generator<'b>,
) {
let crate::Size(w, _h) = image.size();
let mut x = 0.0;
let y = 0.0; let mut color = [0; 5];
let w = f32::from(w);
let iter = generator(0, &mut color);
let bg = [color[0], color[1], color[2], color[3]];
let fg = fgcolor_from_bg(bg);
let shape = [
Move(0.0, 0.0),
Line(w, 0.0),
Line(w, (self.size + 1) as f32),
Line(0.0, (self.size + 1) as f32),
];
image.fill(bg , &shape , buffer );
draw_window_border(image, buffer, (self.size) as f32, color[4]);
for (g, t) in iter {
for p in g.iter() {
image.fill(
p.0, p.1, buffer,
);
}
x += image
.text(
fg,
(
x + (self.size as f32 * 0.125),
y + (self.size as f32 * 0.125),
self.size as f32 * 0.75,
),
&self.font,
t,
buffer,
)
.0;
}
}
pub fn page<'b>(
&mut self,
image: &mut Image,
buffer: &mut [u8],
generator: &Generator<'b>,
) {
let crate::Size(w, _h) = image.size();
let mut x = 0.0;
let y = 0.0; let mut color = [0; 5];
let w = f32::from(w);
let size: f32 = self.size as f32;
let double_size = 2.0 * size;
let iter = generator(0, &mut color);
let bg = [color[0], color[1], color[2], color[3]];
let fg = fgcolor_from_bg(bg);
let shape = [
Move(0.0, size),
Line(w, size),
Line(w, double_size),
Line(0.0, double_size),
];
image.fill(bg , &shape , buffer );
draw_window_border(image, buffer, (self.size * 2 - 1) as f32, color[4]);
for (g, t) in iter {
for p in g.iter() {
image.fill(
p.0, p.1, buffer,
);
}
x += image
.text(
fg,
(
x + (self.size as f32 * 0.125),
y + (self.size as f32 * 1.125),
self.size as f32 * 0.75,
),
&self.font,
t,
buffer,
)
.0;
}
}
}
fn fgcolor_from_bg(bg: [u8; 4]) -> [u8; 4] {
let mut brightness = 0;
for i in bg.iter() {
brightness += u32::from(*i);
}
if brightness > 512 {
[0, 0, 0, 255]
} else {
[255, 255, 255, 255]
}
}
fn draw_window_border(
image: &mut Image,
buffer: &mut [u8],
y: f32,
separator: u8,
) {
let crate::Size(w, h) = image.size();
let w = f32::from(w);
let h = f32::from(h);
if separator == 0 {
image.stroke(
[0, 0, 0, 255],
&[
PenWidth(2.0),
Move(0.0, 0.0),
Line(w, 0.0),
Line(w, h),
Line(0.0, h),
Line(0.0, 0.0),
],
buffer,
);
} else {
image.stroke(
[0, 0, 0, 255],
&[
PenWidth(2.0),
Move(0.0, 0.0),
Line(w, 0.0),
Line(w, h),
Line(0.0, h),
Line(0.0, 0.0),
Close(),
PenWidth(0.5),
Move(0.0, y),
Line(w, y),
Close(),
],
buffer,
);
}
}