Combine ltr and rtl layout
This commit is contained in:
parent
22a0a2a3ed
commit
92c20fd6e1
2 changed files with 22 additions and 64 deletions
|
|
@ -230,6 +230,12 @@ impl<'a> FontMatches<'a> {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if para_rtl {
|
||||||
|
for word in words.iter_mut() {
|
||||||
|
word.glyphs.reverse();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
if para_rtl != span_rtl {
|
if para_rtl != span_rtl {
|
||||||
words.reverse();
|
words.reverse();
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -119,12 +119,11 @@ pub struct FontShapeLine<'a> {
|
||||||
}
|
}
|
||||||
|
|
||||||
impl<'a> FontShapeLine<'a> {
|
impl<'a> FontShapeLine<'a> {
|
||||||
|
pub fn layout(&self, font_size: i32, line_width: i32, layout_lines: &mut Vec<FontLayoutLine<'a>>, mut layout_i: usize) {
|
||||||
fn layout_ltr(&self, font_size: i32, line_width: i32, layout_lines: &mut Vec<FontLayoutLine<'a>>, mut layout_i: usize) {
|
|
||||||
let mut push_line = true;
|
let mut push_line = true;
|
||||||
let mut glyphs = Vec::new();
|
let mut glyphs = Vec::new();
|
||||||
|
|
||||||
let mut x = 0.0;
|
let mut x = if self.rtl { line_width as f32 } else { 0.0 };
|
||||||
let mut y = 0.0;
|
let mut y = 0.0;
|
||||||
for span in self.spans.iter() {
|
for span in self.spans.iter() {
|
||||||
for word in span.words.iter() {
|
for word in span.words.iter() {
|
||||||
|
|
@ -134,7 +133,12 @@ impl<'a> FontShapeLine<'a> {
|
||||||
}
|
}
|
||||||
|
|
||||||
//TODO: make wrapping optional
|
//TODO: make wrapping optional
|
||||||
if x + word_size > line_width as f32 && ! glyphs.is_empty() {
|
let wrap = if self.rtl {
|
||||||
|
x - word_size < 0.0
|
||||||
|
} else {
|
||||||
|
x + word_size > line_width as f32
|
||||||
|
};
|
||||||
|
if wrap && ! glyphs.is_empty() {
|
||||||
let mut glyphs_swap = Vec::new();
|
let mut glyphs_swap = Vec::new();
|
||||||
std::mem::swap(&mut glyphs, &mut glyphs_swap);
|
std::mem::swap(&mut glyphs, &mut glyphs_swap);
|
||||||
layout_lines.insert(layout_i, FontLayoutLine {
|
layout_lines.insert(layout_i, FontLayoutLine {
|
||||||
|
|
@ -143,7 +147,7 @@ impl<'a> FontShapeLine<'a> {
|
||||||
});
|
});
|
||||||
layout_i += 1;
|
layout_i += 1;
|
||||||
|
|
||||||
x = 0.0;
|
x = if self.rtl { line_width as f32 } else { 0.0 };
|
||||||
y = 0.0;
|
y = 0.0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -151,10 +155,16 @@ impl<'a> FontShapeLine<'a> {
|
||||||
let x_advance = font_size as f32 * glyph.x_advance;
|
let x_advance = font_size as f32 * glyph.x_advance;
|
||||||
let y_advance = font_size as f32 * glyph.y_advance;
|
let y_advance = font_size as f32 * glyph.y_advance;
|
||||||
|
|
||||||
|
if self.rtl {
|
||||||
|
x -= x_advance
|
||||||
|
}
|
||||||
|
|
||||||
glyphs.push(glyph.layout(font_size, x, y));
|
glyphs.push(glyph.layout(font_size, x, y));
|
||||||
push_line = true;
|
push_line = true;
|
||||||
|
|
||||||
x += x_advance;
|
if ! self.rtl {
|
||||||
|
x += x_advance;
|
||||||
|
}
|
||||||
y += y_advance;
|
y += y_advance;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
@ -167,62 +177,4 @@ impl<'a> FontShapeLine<'a> {
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
fn layout_rtl(&self, font_size: i32, line_width: i32, layout_lines: &mut Vec<FontLayoutLine<'a>>, mut layout_i: usize) {
|
|
||||||
let mut push_line = true;
|
|
||||||
let mut glyphs = Vec::new();
|
|
||||||
|
|
||||||
let mut x = line_width as f32;
|
|
||||||
let mut y = 0.0;
|
|
||||||
for span in self.spans.iter() {
|
|
||||||
for word in span.words.iter() {
|
|
||||||
let mut word_size = 0.0;
|
|
||||||
for glyph in word.glyphs.iter() {
|
|
||||||
word_size += font_size as f32 * glyph.x_advance;
|
|
||||||
}
|
|
||||||
|
|
||||||
//TODO: make wrapping optional
|
|
||||||
if x - word_size < 0.0 && ! glyphs.is_empty() {
|
|
||||||
let mut glyphs_swap = Vec::new();
|
|
||||||
std::mem::swap(&mut glyphs, &mut glyphs_swap);
|
|
||||||
layout_lines.insert(layout_i, FontLayoutLine {
|
|
||||||
line_i: self.line_i,
|
|
||||||
glyphs: glyphs_swap
|
|
||||||
});
|
|
||||||
layout_i += 1;
|
|
||||||
|
|
||||||
x = line_width as f32;
|
|
||||||
y = 0.0;
|
|
||||||
}
|
|
||||||
|
|
||||||
for glyph in word.glyphs.iter().rev() {
|
|
||||||
let x_advance = font_size as f32 * glyph.x_advance;
|
|
||||||
let y_advance = font_size as f32 * glyph.y_advance;
|
|
||||||
|
|
||||||
x -= x_advance;
|
|
||||||
|
|
||||||
glyphs.push(glyph.layout(font_size, x, y));
|
|
||||||
push_line = true;
|
|
||||||
|
|
||||||
y += y_advance;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if push_line {
|
|
||||||
layout_lines.insert(layout_i, FontLayoutLine {
|
|
||||||
line_i: self.line_i,
|
|
||||||
glyphs
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
pub fn layout(&self, font_size: i32, line_width: i32, layout_lines: &mut Vec<FontLayoutLine<'a>>, layout_i: usize) {
|
|
||||||
if self.rtl {
|
|
||||||
self.layout_rtl(font_size, line_width, layout_lines, layout_i);
|
|
||||||
} else {
|
|
||||||
self.layout_ltr(font_size, line_width, layout_lines, layout_i);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue