use tiny_skia::Transform;
use crate::pipeline::shaping::ShapedText;
use crate::pipeline::TextData;
use crate::utils::RenderError;
mod blur;
mod decorations;
mod fills;
mod prepare;
struct TextRun {
paths: Vec<tiny_skia::Path>,
base_transform: Transform,
baseline_y: f32,
shaped: ShapedText,
clip_mask: Option<tiny_skia::Mask>,
blur_radius: Option<f32>,
outline_info: Option<([u8; 4], f32, f32)>,
shadow_info: Option<([u8; 4], f32, f32)>,
edge_blur_radius: Option<f32>,
karaoke_info: Option<(f32, u8, [u8; 4])>,
merged_base: Option<tiny_skia::Path>,
text_paint: tiny_skia::Paint<'static>,
bold: bool,
italic: bool,
underline: bool,
strikethrough: bool,
}
impl super::SoftwareBackend {
pub(super) fn draw_text_layer(&mut self, data: &TextData) -> Result<(), RenderError> {
let Some(run) = self.prepare_text_run(data)? else {
return Ok(());
};
self.draw_text_shadow(&run);
self.draw_opaque_box(data, &run);
self.draw_text_outline(data, &run);
if let Some(radius) = run.blur_radius {
self.draw_blurred_text(data, &run, radius);
} else if let Some(karaoke) = run.karaoke_info {
self.draw_karaoke_text(data, &run, karaoke);
} else {
self.draw_plain_text(&run);
}
self.draw_text_decorations(data, &run);
Ok(())
}
}