Slice TextRuns by byte range instead of char range

Fixes #6431
This commit is contained in:
Matt Brubeck 2015-06-23 09:55:13 -07:00
parent e869e8ad08
commit 83c73a5d91

View file

@ -240,19 +240,19 @@ impl TextRunScanner {
let run = runs[mapping.text_run_index].clone(); let run = runs[mapping.text_run_index].clone();
let requires_line_break_afterward_if_wrapping_on_newlines = let requires_line_break_afterward_if_wrapping_on_newlines =
run.text.char_at_reverse(mapping.range.end().get() as usize) == '\n'; run.text.char_at_reverse(mapping.byte_range.end()) == '\n';
if requires_line_break_afterward_if_wrapping_on_newlines { if requires_line_break_afterward_if_wrapping_on_newlines {
mapping.range.extend_by(CharIndex(-1)) mapping.char_range.extend_by(CharIndex(-1));
} }
let text_size = old_fragment.border_box.size; let text_size = old_fragment.border_box.size;
let mut new_text_fragment_info = box ScannedTextFragmentInfo::new( let mut new_text_fragment_info = box ScannedTextFragmentInfo::new(
run, run,
mapping.range, mapping.char_range,
text_size, text_size,
requires_line_break_afterward_if_wrapping_on_newlines); requires_line_break_afterward_if_wrapping_on_newlines);
let new_metrics = new_text_fragment_info.run.metrics_for_range(&mapping.range); let new_metrics = new_text_fragment_info.run.metrics_for_range(&mapping.char_range);
let writing_mode = old_fragment.style.writing_mode; let writing_mode = old_fragment.style.writing_mode;
let bounding_box_size = bounding_box_for_run_metrics(&new_metrics, writing_mode); let bounding_box_size = bounding_box_for_run_metrics(&new_metrics, writing_mode);
new_text_fragment_info.content_size = bounding_box_size; new_text_fragment_info.content_size = bounding_box_size;
@ -381,7 +381,9 @@ impl RunInfo {
#[derive(Copy, Clone, Debug)] #[derive(Copy, Clone, Debug)]
struct RunMapping { struct RunMapping {
/// The range of characters within the text fragment. /// The range of characters within the text fragment.
range: Range<CharIndex>, char_range: Range<CharIndex>,
/// The range of byte indices within the text fragment.
byte_range: Range<usize>,
/// The index of the unscanned text fragment that this mapping corresponds to. /// The index of the unscanned text fragment that this mapping corresponds to.
old_fragment_index: usize, old_fragment_index: usize,
/// The index of the text run we're going to create. /// The index of the text run we're going to create.
@ -395,7 +397,9 @@ impl RunMapping {
fn new(run_info_list: &[RunInfo], current_run_info: &RunInfo, fragment_index: usize) fn new(run_info_list: &[RunInfo], current_run_info: &RunInfo, fragment_index: usize)
-> RunMapping { -> RunMapping {
RunMapping { RunMapping {
range: Range::new(CharIndex(current_run_info.character_length as isize), CharIndex(0)), char_range: Range::new(CharIndex(current_run_info.character_length as isize),
CharIndex(0)),
byte_range: Range::new(0, 0),
old_fragment_index: fragment_index, old_fragment_index: fragment_index,
text_run_index: run_info_list.len(), text_run_index: run_info_list.len(),
} }
@ -432,7 +436,9 @@ impl RunMapping {
return return
} }
self.range.extend_by(CharIndex(character_count as isize)); let new_byte_length = run_info.text.len();
self.byte_range = Range::new(old_byte_length, new_byte_length - old_byte_length);
self.char_range.extend_by(CharIndex(character_count as isize));
mappings.push(self) mappings.push(self)
} }
} }