From 36d5a9e33252c03674e52742560caff23cdeefb7 Mon Sep 17 00:00:00 2001 From: Sebastian Schmidt Date: Mon, 9 Jun 2025 13:48:11 +0300 Subject: [PATCH] Use default SVG font rendering for sequence names in legend. --- lib_tsshow/src/lib.rs | 6 +++++- lib_tsshow/src/svg.rs | 17 +++-------------- lib_tsshow/src/svg/font.rs | 15 ++++++++++++++- 3 files changed, 22 insertions(+), 16 deletions(-) diff --git a/lib_tsshow/src/lib.rs b/lib_tsshow/src/lib.rs index 41bd5a43..ebdd81de 100644 --- a/lib_tsshow/src/lib.rs +++ b/lib_tsshow/src/lib.rs @@ -1,3 +1,5 @@ +use resvg::usvg::Options; + pub mod error; pub mod plain_text; pub mod svg; @@ -6,7 +8,9 @@ pub mod ts_arrangement; pub fn svg_to_png(svg_in: &[u8], zoom: f32) -> Vec { log::info!("Converting SVG to PNG"); - let svg = resvg::usvg::Tree::from_data(svg_in, &Default::default()).unwrap(); + let mut options = Options::default(); + options.fontdb_mut().load_system_fonts(); + let svg = resvg::usvg::Tree::from_data(svg_in, &options).unwrap(); let raster_image_size = svg.size(); let raster_image_width = (raster_image_size.width().ceil() * zoom) as u32; diff --git a/lib_tsshow/src/svg.rs b/lib_tsshow/src/svg.rs index 425839ee..edeadad9 100644 --- a/lib_tsshow/src/svg.rs +++ b/lib_tsshow/src/svg.rs @@ -20,6 +20,7 @@ use svg::{ use crate::{ error::{Error, Result}, plain_text::mutlipair_alignment_renderer::Character, + svg::font::svg_text, ts_arrangement::{ TsArrangement, character::Char, @@ -913,26 +914,14 @@ fn legend(reference_name: &str, query_name: &str, scale: f32) -> (Group, f32, f3 let label_width = label_width + typewriter::FONT.character_width; y = headline_height; - result = result.add(svg_string( - reference_name - .chars() - .map(Character::::new_char_with_default), - &SvgLocation { x: label_width, y }, - &sans_serif_mono::FONT, - )); + result = result.add(svg_text(reference_name, &SvgLocation { x: label_width, y })); explanation_width = explanation_width .max(reference_name.chars().count() as f32 * sans_serif_mono::FONT.character_width); y += typewriter::FONT .character_height .max(sans_serif_mono::FONT.character_height); - result = result.add(svg_string( - query_name - .chars() - .map(Character::::new_char_with_default), - &SvgLocation { x: label_width, y }, - &sans_serif_mono::FONT, - )); + result = result.add(svg_text(query_name, &SvgLocation { x: label_width, y })); explanation_width = explanation_width .max(query_name.chars().count() as f32 * sans_serif_mono::FONT.character_width); y += typewriter::FONT diff --git a/lib_tsshow/src/svg/font.rs b/lib_tsshow/src/svg/font.rs index e3372c5e..9c5732be 100644 --- a/lib_tsshow/src/svg/font.rs +++ b/lib_tsshow/src/svg/font.rs @@ -1,6 +1,6 @@ use std::{borrow::Borrow, collections::HashMap, fmt::Debug}; -use svg::node::element::{Group, Path}; +use svg::node::element::{Group, Path, Text}; use crate::plain_text::mutlipair_alignment_renderer::{Character, NoCharacterData}; @@ -94,6 +94,19 @@ where group } +/// Renders text with non-monospace sans-serif font. +/// The width of the text depends on the font used by the SVG renderer. +pub fn svg_text(text: impl Into, location: &SvgLocation) -> Group { + let mut group = Group::new(); + group = group.set("transform", location.as_transform()); + group = group.add( + Text::new(text) + .set("font-family", "sans-serif") + .set("font-size", "3"), + ); + group +} + impl CharacterData { pub fn new_colored(color: impl ToString) -> Self { #[allow(clippy::needless_update)]