Refactoring texts

This commit is contained in:
Alejandro Alonso
2024-10-10 09:35:50 +02:00
parent 43903014c6
commit 88722bcf4f
3 changed files with 98 additions and 69 deletions

View File

@@ -5,10 +5,11 @@ use skia_safe::{
FontMgr, Paint, Path, PaintStyle
};
static ROBOTO_REGULAR: &[u8] = include_bytes!("RobotoMono-Regular.ttf");
use skia_safe as skia;
static ROBOTO_REGULAR: &[u8] = include_bytes!("RobotoMono-Regular.ttf");
static TYPEFACE_ALIAS: &str = "roboto-regular";
extern "C" {
pub fn emscripten_GetProcAddress(
name: *const ::std::os::raw::c_char,
@@ -27,11 +28,13 @@ struct GpuState {
pub struct State {
gpu_state: GpuState,
surface: skia::Surface,
typeface_font_provider: TypefaceFontProvider,
default_font: skia_safe::Font,
}
impl State {
fn new(gpu_state: GpuState, surface: skia::Surface) -> Self {
State { gpu_state, surface }
fn new(gpu_state: GpuState, surface: skia::Surface, typeface_font_provider: TypefaceFontProvider, default_font: skia_safe::Font) -> Self {
State { gpu_state, surface, typeface_font_provider, default_font }
}
fn set_surface(&mut self, surface: skia::Surface) {
@@ -98,7 +101,22 @@ fn render_rect(surface: &mut skia::Surface, rect: skia::Rect, color: skia::Color
pub extern "C" fn init(width: i32, height: i32) -> Box<State> {
let mut gpu_state = create_gpu_state();
let surface = create_surface(&mut gpu_state, width, height);
let state = State::new(gpu_state, surface);
// skia_safe::Font::default() is empty, let's use something better
let font_mgr = skia_safe::FontMgr::new();
let typeface = font_mgr
.new_from_data(ROBOTO_REGULAR, None)
.expect("Failed to load ROBOTO font");
let default_font = skia_safe::Font::new(typeface.clone(), 4.0);
let typeface_font_provider = {
let mut typeface_font_provider = TypefaceFontProvider::new();
// We need a system font manager to be able to load typefaces.
typeface_font_provider.register_typeface(typeface, TYPEFACE_ALIAS);
typeface_font_provider
};
let state = State::new(gpu_state, surface, typeface_font_provider, default_font);
Box::new(state)
}
@@ -181,6 +199,7 @@ pub unsafe extern "C" fn scale(state: *mut State, sx: f32, sy: f32) {
#[no_mangle]
pub unsafe extern "C" fn reset_canvas(state: *mut State) {
(*state).surface.canvas().clear(skia_safe::Color::TRANSPARENT);
(*state).surface.canvas().reset_matrix();
}
@@ -193,13 +212,6 @@ pub unsafe extern "C" fn draw_shapes(state: *mut State, ptr: *mut Rect, len: usi
// create a `Vec<Rect>` from the pointer to the linear memory and length
let buf = Vec::<Rect>::from_raw_parts(ptr, len, len);
// skia_safe::Font::default() is empty, let's use something better
let font_mgr = skia_safe::FontMgr::new();
let typeface = font_mgr
.new_from_data(ROBOTO_REGULAR, None)
.expect("Failed to load ROBOTO font");
let default_font = skia_safe::Font::new(typeface, 10.0);
let mut text_paint = skia::Paint::default();
text_paint.set_anti_alias(true);
text_paint.set_style(skia_safe::paint::Style::StrokeAndFill);
@@ -217,38 +229,26 @@ pub unsafe extern "C" fn draw_shapes(state: *mut State, ptr: *mut Rect, len: usi
render_rect(&mut state.surface, r, color);
text_paint.set_color(color);
state.surface.canvas().draw_str("SKIA TEXT", (rect.left, rect.top), &default_font, &text_paint);
state.surface.canvas().draw_str("SKIA TEXT", (rect.left, rect.top), &state.default_font, &text_paint);
let mut path = Path::new();
path.move_to((rect.left, rect.top));
path.line_to((rect.right, rect.bottom));
state.surface.canvas().draw_path(&path, &path_paint);
// // https://github.com/rust-skia/rust-skia/blob/02c89a87649af8d2870fb631aae4a5e171887367/skia-org/src/skparagraph_example.rs#L18
// const TYPEFACE_ALIAS: &str = "ubuntu-regular";
// let typeface_font_provider = {
// let mut typeface_font_provider = TypefaceFontProvider::new();
// // We need a system font manager to be able to load typefaces.
// let font_mgr = FontMgr::new();
// let typeface = font_mgr
// .new_from_data(ROBOTO_REGULAR, None)
// .expect("Failed to load ROBOTO font");
// typeface_font_provider.register_typeface(typeface, TYPEFACE_ALIAS);
// typeface_font_provider
// };
// let mut font_collection = FontCollection::new();
// font_collection.set_default_font_manager(Some(typeface_font_provider.into()), None);
// let paragraph_style = ParagraphStyle::new();
// let mut paragraph_builder = ParagraphBuilder::new(&paragraph_style, font_collection);
// let mut ts = TextStyle::new();
// ts.set_foreground_paint(&Paint::default())
// .set_font_families(&[TYPEFACE_ALIAS]);
// paragraph_builder.push_style(&ts);
// paragraph_builder.add_text("Other skia text");
// let mut paragraph = paragraph_builder.build();
// paragraph.layout(256.0);
// paragraph.paint(state.surface.canvas(), (rect.left, rect.top));
// https://github.com/rust-skia/rust-skia/blob/02c89a87649af8d2870fb631aae4a5e171887367/skia-org/src/skparagraph_example.rs#L18
let mut font_collection = FontCollection::new();
font_collection.set_default_font_manager(Some(state.typeface_font_provider.clone().into()), None);
let paragraph_style = ParagraphStyle::new();
let mut paragraph_builder = ParagraphBuilder::new(&paragraph_style, font_collection);
let mut ts = TextStyle::new();
ts.set_foreground_paint(&Paint::default())
.set_font_families(&[TYPEFACE_ALIAS]);
paragraph_builder.push_style(&ts);
paragraph_builder.add_text("Other skia text");
let mut paragraph = paragraph_builder.build();
paragraph.layout(256.0);
paragraph.paint(state.surface.canvas(), (rect.left, rect.top));
}
flush(state);
std::mem::forget(buf);