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:
bors-servo 2019-12-13 23:41:00 -05:00 committed by GitHub
commit 3f663d7ab2
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23

View file

@ -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 {
is_first_fragment_of_element: bool,
is_last_fragment_of_element: bool,
@ -2069,12 +2074,12 @@ impl Fragment {
}
// Text
let glyphs = convert_text_run_to_glyphs(
let mut glyphs = convert_text_run_to_glyphs(
text_fragment.run.clone(),
text_fragment.range,
baseline_origin,
);
if !glyphs.is_empty() {
let indexable_text = IndexableTextItem {
origin: stacking_relative_content_box.origin,
text_run: text_fragment.run.clone(),
@ -2083,6 +2088,14 @@ impl Fragment {
};
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(
base.clone(),
webrender_api::TextDisplayItem {
@ -2094,6 +2107,8 @@ impl Fragment {
},
glyphs,
)));
glyphs = rest_of_glyphs;
}
// TODO(#17715): emit text-emphasis marks here.