mirror of
https://github.com/penpot/penpot.git
synced 2025-12-11 22:14:05 +01:00
Refactoring texts
This commit is contained in:
@@ -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(¶graph_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(¶graph_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);
|
||||
|
||||
Reference in New Issue
Block a user