chore: add unit test and improve comment
This commit is contained in:
parent
8c8c41b05b
commit
d391a3a166
3 changed files with 34 additions and 31 deletions
|
|
@ -826,7 +826,10 @@ impl ShapeSpan {
|
||||||
|
|
||||||
let mut start_word = 0;
|
let mut start_word = 0;
|
||||||
for (end_lb, _) in unicode_linebreak::linebreaks(span) {
|
for (end_lb, _) in unicode_linebreak::linebreaks(span) {
|
||||||
// Workaround for broken |> ligature in code fonts
|
// The unicode-linebreak crate treats the pipe character '|' as a break opportunity (BA/AL class).
|
||||||
|
// This causes ShapeSpan::build to split text like '|>' into separate ShapeWords.
|
||||||
|
// When these words are shaped independently, the font shaping engine cannot form ligatures that cross the word boundary.
|
||||||
|
// We manually check for the '|>' sequence during segmentation and skip the break opportunity to ensure they remain in the same shaping run.
|
||||||
if end_lb > 0 && end_lb < span.len() {
|
if end_lb > 0 && end_lb < span.len() {
|
||||||
let b = span.as_bytes();
|
let b = span.as_bytes();
|
||||||
if b[end_lb - 1] == b'|' && b[end_lb] == b'>' {
|
if b[end_lb - 1] == b'|' && b[end_lb] == b'>' {
|
||||||
|
|
|
||||||
|
|
@ -1,30 +0,0 @@
|
||||||
use cosmic_text::{Attrs, Buffer, FontSystem, Metrics, Shaping};
|
|
||||||
|
|
||||||
#[test]
|
|
||||||
fn ligature_segmentation() {
|
|
||||||
let mut font_system =
|
|
||||||
FontSystem::new_with_locale_and_db("en-US".into(), fontdb::Database::new());
|
|
||||||
let font = std::fs::read("fonts/Inter-Regular.ttf").unwrap();
|
|
||||||
font_system.db_mut().load_font_data(font);
|
|
||||||
let metrics = Metrics::new(14.0, 20.0);
|
|
||||||
|
|
||||||
let mut buffer = Buffer::new(&mut font_system, metrics);
|
|
||||||
let mut buffer = buffer.borrow_with(&mut font_system);
|
|
||||||
|
|
||||||
buffer.set_text("|>", &Attrs::new(), Shaping::Advanced, None);
|
|
||||||
buffer.shape_until_scroll(false);
|
|
||||||
|
|
||||||
let line = &buffer.lines[0];
|
|
||||||
let shape = line.shape_opt().expect("ShapeLine not found");
|
|
||||||
let span = &shape.spans[0];
|
|
||||||
|
|
||||||
// The pipe character | is typically a line break opportunity.
|
|
||||||
// This test ensures that our patch prevents splitting |> into separate words,
|
|
||||||
// which would break ligature formation in fonts that support it.
|
|
||||||
assert_eq!(
|
|
||||||
span.words.len(),
|
|
||||||
1,
|
|
||||||
"Expected '|>' to be a single word (preserved for ligature), but found {} words.",
|
|
||||||
span.words.len()
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
@ -73,3 +73,33 @@ fn test_english_mixed_with_arabic_paragraph_rendering() {
|
||||||
.canvas(400, 110)
|
.canvas(400, 110)
|
||||||
.validate_text_rendering();
|
.validate_text_rendering();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn test_ligature_segmentation() {
|
||||||
|
use cosmic_text::{Buffer, FontSystem, Metrics, Shaping};
|
||||||
|
|
||||||
|
let mut font_system = FontSystem::new_with_locale_and_db("en-US".into(), fontdb::Database::new());
|
||||||
|
let font = std::fs::read("fonts/Inter-Regular.ttf").unwrap();
|
||||||
|
font_system.db_mut().load_font_data(font);
|
||||||
|
let metrics = Metrics::new(14.0, 20.0);
|
||||||
|
|
||||||
|
let mut buffer = Buffer::new(&mut font_system, metrics);
|
||||||
|
let mut buffer = buffer.borrow_with(&mut font_system);
|
||||||
|
|
||||||
|
buffer.set_text("|>", &Attrs::new(), Shaping::Advanced, None);
|
||||||
|
buffer.shape_until_scroll(false);
|
||||||
|
|
||||||
|
let line = &buffer.lines[0];
|
||||||
|
let shape = line.shape_opt().expect("ShapeLine not found");
|
||||||
|
let span = &shape.spans[0];
|
||||||
|
|
||||||
|
// The pipe character | is typically a line break opportunity.
|
||||||
|
// This test ensures that our patch prevents splitting |> into separate words,
|
||||||
|
// which would break ligature formation in fonts that support it.
|
||||||
|
assert_eq!(
|
||||||
|
span.words.len(),
|
||||||
|
1,
|
||||||
|
"Expected '|>' to be a single word (preserved for ligature), but found {} words.",
|
||||||
|
span.words.len()
|
||||||
|
);
|
||||||
|
}
|
||||||
Loading…
Add table
Add a link
Reference in a new issue