initial commit
This commit is contained in:
@@ -4,7 +4,7 @@ use fontconfig::{FontConfig, OwnedPattern};
|
||||
use freetype::{bitmap::PixelMode, face::LoadFlag, Face, Library};
|
||||
use idmap::IdMap;
|
||||
use log::debug;
|
||||
use vulkano::{format::Format, command_buffer::CommandBufferUsage, image::ImmutableImage};
|
||||
use vulkano::{command_buffer::CommandBufferUsage, format::Format, image::ImmutableImage};
|
||||
|
||||
use crate::graphics::WlxGraphics;
|
||||
|
||||
@@ -23,9 +23,6 @@ struct FontCollection {
|
||||
|
||||
struct Font {
|
||||
face: Face,
|
||||
path: String,
|
||||
index: isize,
|
||||
size: isize,
|
||||
glyphs: IdMap<usize, Rc<Glyph>>,
|
||||
}
|
||||
|
||||
@@ -50,7 +47,12 @@ impl FontCache {
|
||||
}
|
||||
}
|
||||
|
||||
pub fn get_text_size(&mut self, text: &str, size: isize, graphics: Arc<WlxGraphics>) -> (f32, f32) {
|
||||
pub fn get_text_size(
|
||||
&mut self,
|
||||
text: &str,
|
||||
size: isize,
|
||||
graphics: Arc<WlxGraphics>,
|
||||
) -> (f32, f32) {
|
||||
let sizef = size as f32;
|
||||
|
||||
let height = sizef + ((text.lines().count() as f32) - 1f32) * (sizef * 1.5);
|
||||
@@ -59,7 +61,10 @@ impl FontCache {
|
||||
for line in text.lines() {
|
||||
let w: f32 = line
|
||||
.chars()
|
||||
.map(|c| self.get_glyph_for_cp(c as usize, size, graphics.clone()).advance)
|
||||
.map(|c| {
|
||||
self.get_glyph_for_cp(c as usize, size, graphics.clone())
|
||||
.advance
|
||||
})
|
||||
.sum();
|
||||
|
||||
if w > max_w {
|
||||
@@ -69,7 +74,12 @@ impl FontCache {
|
||||
(max_w, height)
|
||||
}
|
||||
|
||||
pub fn get_glyphs(&mut self, text: &str, size: isize, graphics: Arc<WlxGraphics>) -> Vec<Rc<Glyph>> {
|
||||
pub fn get_glyphs(
|
||||
&mut self,
|
||||
text: &str,
|
||||
size: isize,
|
||||
graphics: Arc<WlxGraphics>,
|
||||
) -> Vec<Rc<Glyph>> {
|
||||
let mut glyphs = Vec::new();
|
||||
for line in text.lines() {
|
||||
for c in line.chars() {
|
||||
@@ -143,13 +153,7 @@ impl FontCache {
|
||||
let mut glyphs = IdMap::new();
|
||||
glyphs.insert(0, zero_glyph);
|
||||
|
||||
let font = Font {
|
||||
face,
|
||||
path: path.to_string(),
|
||||
size,
|
||||
index: font_idx as _,
|
||||
glyphs,
|
||||
};
|
||||
let font = Font { face, glyphs };
|
||||
coll.fonts.push(font);
|
||||
|
||||
idx
|
||||
@@ -159,7 +163,12 @@ impl FontCache {
|
||||
}
|
||||
}
|
||||
|
||||
fn get_glyph_for_cp(&mut self, cp: usize, size: isize, graphics: Arc<WlxGraphics>) -> Rc<Glyph> {
|
||||
fn get_glyph_for_cp(
|
||||
&mut self,
|
||||
cp: usize,
|
||||
size: isize,
|
||||
graphics: Arc<WlxGraphics>,
|
||||
) -> Rc<Glyph> {
|
||||
let key = self.get_font_for_cp(cp, size);
|
||||
|
||||
let font = &mut self.collections[size].fonts[key];
|
||||
|
||||
@@ -4,16 +4,16 @@ use glam::{Vec2, Vec3};
|
||||
use vulkano::{
|
||||
command_buffer::{CommandBufferUsage, PrimaryAutoCommandBuffer},
|
||||
format::Format,
|
||||
image::{view::ImageView, AttachmentImage},
|
||||
image::{view::ImageView, AttachmentImage, ImageLayout, ImageViewAbstract},
|
||||
sampler::Filter,
|
||||
};
|
||||
|
||||
use crate::{
|
||||
graphics::{WlxCommandBuffer, WlxGraphics, WlxPass, WlxPipeline},
|
||||
overlays::{
|
||||
interactions::{InteractionHandler, PointerHit},
|
||||
OverlayBackend, OverlayRenderer,
|
||||
backend::{
|
||||
input::{InteractionHandler, PointerHit},
|
||||
overlay::{OverlayBackend, OverlayRenderer},
|
||||
},
|
||||
graphics::{WlxCommandBuffer, WlxGraphics, WlxPass, WlxPipeline},
|
||||
shaders::{frag_color, frag_glyph, frag_sprite, vert_common},
|
||||
state::AppState,
|
||||
};
|
||||
@@ -203,11 +203,8 @@ pub struct Canvas<D, S> {
|
||||
interact_stride: usize,
|
||||
interact_rows: usize,
|
||||
|
||||
tex_fg: Arc<AttachmentImage>,
|
||||
view_fg: Arc<ImageView<AttachmentImage>>,
|
||||
tex_bg: Arc<AttachmentImage>,
|
||||
view_bg: Arc<ImageView<AttachmentImage>>,
|
||||
tex_final: Arc<AttachmentImage>,
|
||||
view_final: Arc<ImageView<AttachmentImage>>,
|
||||
|
||||
pass_fg: WlxPass,
|
||||
@@ -284,11 +281,8 @@ impl<D, S> Canvas<D, S> {
|
||||
interact_map: vec![None; stride * rows],
|
||||
interact_stride: stride,
|
||||
interact_rows: rows,
|
||||
tex_fg,
|
||||
view_fg,
|
||||
tex_bg,
|
||||
view_bg,
|
||||
tex_final,
|
||||
view_final,
|
||||
pass_fg,
|
||||
pass_bg,
|
||||
@@ -323,7 +317,7 @@ impl<D, S> Canvas<D, S> {
|
||||
.canvas
|
||||
.graphics
|
||||
.create_command_buffer(CommandBufferUsage::OneTimeSubmit)
|
||||
.begin(self.view_bg.clone());
|
||||
.begin(self.view_bg.clone(), None);
|
||||
for c in self.controls.iter_mut() {
|
||||
if let Some(fun) = c.on_render_bg {
|
||||
fun(c, &self.canvas, app, &mut cmd_buffer);
|
||||
@@ -337,7 +331,7 @@ impl<D, S> Canvas<D, S> {
|
||||
.canvas
|
||||
.graphics
|
||||
.create_command_buffer(CommandBufferUsage::OneTimeSubmit)
|
||||
.begin(self.view_fg.clone());
|
||||
.begin(self.view_fg.clone(), None);
|
||||
for c in self.controls.iter_mut() {
|
||||
if let Some(fun) = c.on_render_fg {
|
||||
fun(c, &self.canvas, app, &mut cmd_buffer);
|
||||
@@ -352,32 +346,32 @@ impl<D, S> Canvas<D, S> {
|
||||
}
|
||||
|
||||
impl<D, S> InteractionHandler for Canvas<D, S> {
|
||||
fn on_left(&mut self, _app: &mut AppState, hand: usize) {
|
||||
self.hover_controls[hand] = None;
|
||||
fn on_left(&mut self, _app: &mut AppState, pointer: usize) {
|
||||
self.hover_controls[pointer] = None;
|
||||
}
|
||||
fn on_hover(&mut self, _app: &mut AppState, hit: &PointerHit) {
|
||||
if let Some(i) = self.interactive_get_idx(hit.uv) {
|
||||
self.hover_controls[hit.hand] = Some(i);
|
||||
self.hover_controls[hit.pointer] = Some(i);
|
||||
} else {
|
||||
self.hover_controls[hit.hand] = None;
|
||||
self.hover_controls[hit.pointer] = None;
|
||||
}
|
||||
}
|
||||
fn on_pointer(&mut self, app: &mut AppState, hit: &PointerHit, pressed: bool) {
|
||||
let idx = if pressed {
|
||||
self.interactive_get_idx(hit.uv)
|
||||
} else {
|
||||
self.pressed_controls[hit.hand]
|
||||
self.pressed_controls[hit.pointer]
|
||||
};
|
||||
|
||||
if let Some(idx) = idx {
|
||||
let c = &mut self.controls[idx];
|
||||
if pressed {
|
||||
if let Some(ref mut f) = c.on_press {
|
||||
self.pressed_controls[hit.hand] = Some(idx);
|
||||
self.pressed_controls[hit.pointer] = Some(idx);
|
||||
f(c, &mut self.canvas.data, app);
|
||||
}
|
||||
} else if let Some(ref mut f) = c.on_release {
|
||||
self.pressed_controls[hit.hand] = None;
|
||||
self.pressed_controls[hit.pointer] = None;
|
||||
f(c, &mut self.canvas.data, app);
|
||||
}
|
||||
}
|
||||
@@ -410,7 +404,10 @@ impl<D, S> OverlayRenderer for Canvas<D, S> {
|
||||
.canvas
|
||||
.graphics
|
||||
.create_command_buffer(CommandBufferUsage::OneTimeSubmit)
|
||||
.begin(self.view_final.clone());
|
||||
.begin(
|
||||
self.view_final.clone(),
|
||||
Some(ImageLayout::TransferSrcOptimal),
|
||||
);
|
||||
|
||||
if dirty {
|
||||
self.render_fg(app);
|
||||
@@ -437,8 +434,8 @@ impl<D, S> OverlayRenderer for Canvas<D, S> {
|
||||
|
||||
let _ = cmd_buffer.end_render_and_execute();
|
||||
}
|
||||
fn view(&mut self) -> Arc<dyn vulkano::image::ImageViewAbstract> {
|
||||
self.view_final.clone()
|
||||
fn view(&mut self) -> Option<Arc<dyn ImageViewAbstract>> {
|
||||
Some(self.view_final.clone())
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user