mirror of
https://github.com/servo/servo.git
synced 2025-06-06 16:45:39 +00:00
Auto merge of #25289 - pcwalton:glyph-cap, r=jdm
Cap the number of glyphs per WebRender text run to avoid overflowing WR's limit. Closes #17230. r? @jdm --- <!-- Thank you for contributing to Servo! Please replace each `[ ]` by `[X]` when the step is complete, and replace `___` with appropriate data: --> - [x] `./mach build -d` does not report any errors - [x] `./mach test-tidy` does not report any errors - [x] These changes fix #___ (GitHub issue number if applicable) <!-- Either: --> - [x] There are tests for these changes OR - [ ] These changes do not require tests because ___ <!-- Also, please make sure that "Allow edits from maintainers" checkbox is checked, so that we can help you if you get stuck somewhere along the way.--> <!-- Pull requests that do not address these steps are welcome, but they will require additional verification as part of the review process. -->
This commit is contained in:
commit
3f663d7ab2
1 changed files with 23 additions and 8 deletions
|
@ -124,6 +124,11 @@ static THREAD_TINT_COLORS: [ColorF; 8] = [
|
||||||
},
|
},
|
||||||
];
|
];
|
||||||
|
|
||||||
|
// An internal WebRender limit.
|
||||||
|
//
|
||||||
|
// See: https://github.com/servo/servo/issues/17230#issuecomment-564307277
|
||||||
|
const MAX_GLYPHS_PER_TEXT_RUN: usize = 2000;
|
||||||
|
|
||||||
pub struct InlineNodeBorderInfo {
|
pub struct InlineNodeBorderInfo {
|
||||||
is_first_fragment_of_element: bool,
|
is_first_fragment_of_element: bool,
|
||||||
is_last_fragment_of_element: bool,
|
is_last_fragment_of_element: bool,
|
||||||
|
@ -2069,12 +2074,12 @@ impl Fragment {
|
||||||
}
|
}
|
||||||
|
|
||||||
// Text
|
// Text
|
||||||
let glyphs = convert_text_run_to_glyphs(
|
let mut glyphs = convert_text_run_to_glyphs(
|
||||||
text_fragment.run.clone(),
|
text_fragment.run.clone(),
|
||||||
text_fragment.range,
|
text_fragment.range,
|
||||||
baseline_origin,
|
baseline_origin,
|
||||||
);
|
);
|
||||||
if !glyphs.is_empty() {
|
|
||||||
let indexable_text = IndexableTextItem {
|
let indexable_text = IndexableTextItem {
|
||||||
origin: stacking_relative_content_box.origin,
|
origin: stacking_relative_content_box.origin,
|
||||||
text_run: text_fragment.run.clone(),
|
text_run: text_fragment.run.clone(),
|
||||||
|
@ -2083,6 +2088,14 @@ impl Fragment {
|
||||||
};
|
};
|
||||||
state.indexable_text.insert(self.node, indexable_text);
|
state.indexable_text.insert(self.node, indexable_text);
|
||||||
|
|
||||||
|
// Process glyphs in chunks to avoid overflowing WebRender's internal limits (#17230).
|
||||||
|
while !glyphs.is_empty() {
|
||||||
|
let mut rest_of_glyphs = vec![];
|
||||||
|
if glyphs.len() > MAX_GLYPHS_PER_TEXT_RUN {
|
||||||
|
rest_of_glyphs = glyphs[MAX_GLYPHS_PER_TEXT_RUN..].to_vec();
|
||||||
|
glyphs.truncate(MAX_GLYPHS_PER_TEXT_RUN);
|
||||||
|
};
|
||||||
|
|
||||||
state.add_display_item(DisplayItem::Text(CommonDisplayItem::with_data(
|
state.add_display_item(DisplayItem::Text(CommonDisplayItem::with_data(
|
||||||
base.clone(),
|
base.clone(),
|
||||||
webrender_api::TextDisplayItem {
|
webrender_api::TextDisplayItem {
|
||||||
|
@ -2094,6 +2107,8 @@ impl Fragment {
|
||||||
},
|
},
|
||||||
glyphs,
|
glyphs,
|
||||||
)));
|
)));
|
||||||
|
|
||||||
|
glyphs = rest_of_glyphs;
|
||||||
}
|
}
|
||||||
|
|
||||||
// TODO(#17715): emit text-emphasis marks here.
|
// TODO(#17715): emit text-emphasis marks here.
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue