@@ -97,7 +97,8 @@ pub fn render_document(
97
97
doc : & Document ,
98
98
offset : ViewPosition ,
99
99
doc_annotations : & TextAnnotations ,
100
- highlight_iter : impl Iterator < Item = HighlightEvent > ,
100
+ syntax_highlight_iter : impl Iterator < Item = HighlightEvent > ,
101
+ overlay_highlight_iter : impl Iterator < Item = HighlightEvent > ,
101
102
theme : & Theme ,
102
103
line_decoration : & mut [ Box < dyn LineDecoration + ' _ > ] ,
103
104
translated_positions : & mut [ TranslatedPosition ] ,
@@ -109,7 +110,8 @@ pub fn render_document(
109
110
offset,
110
111
& doc. text_format ( viewport. width , Some ( theme) ) ,
111
112
doc_annotations,
112
- highlight_iter,
113
+ syntax_highlight_iter,
114
+ overlay_highlight_iter,
113
115
theme,
114
116
line_decoration,
115
117
translated_positions,
@@ -157,7 +159,8 @@ pub fn render_text<'t>(
157
159
offset : ViewPosition ,
158
160
text_fmt : & TextFormat ,
159
161
text_annotations : & TextAnnotations ,
160
- highlight_iter : impl Iterator < Item = HighlightEvent > ,
162
+ syntax_highlight_iter : impl Iterator < Item = HighlightEvent > ,
163
+ overlay_highlight_iter : impl Iterator < Item = HighlightEvent > ,
161
164
theme : & Theme ,
162
165
line_decorations : & mut [ Box < dyn LineDecoration + ' _ > ] ,
163
166
translated_positions : & mut [ TranslatedPosition ] ,
@@ -178,10 +181,16 @@ pub fn render_text<'t>(
178
181
179
182
let ( mut formatter, mut first_visible_char_idx) =
180
183
DocumentFormatter :: new_at_prev_checkpoint ( text, text_fmt, text_annotations, offset. anchor ) ;
181
- let mut styles = StyleIter {
184
+ let mut syntax_styles = StyleIter {
182
185
text_style : renderer. text_style ,
183
186
active_highlights : Vec :: with_capacity ( 64 ) ,
184
- highlight_iter,
187
+ highlight_iter : syntax_highlight_iter,
188
+ theme,
189
+ } ;
190
+ let mut overlay_styles = StyleIter {
191
+ text_style : renderer. text_style ,
192
+ active_highlights : Vec :: with_capacity ( 64 ) ,
193
+ highlight_iter : overlay_highlight_iter,
185
194
theme,
186
195
} ;
187
196
@@ -193,7 +202,10 @@ pub fn render_text<'t>(
193
202
} ;
194
203
let mut is_in_indent_area = true ;
195
204
let mut last_line_indent_level = 0 ;
196
- let mut style_span = styles
205
+ let mut syntax_style_span = syntax_styles
206
+ . next ( )
207
+ . unwrap_or_else ( || ( Style :: default ( ) , usize:: MAX ) ) ;
208
+ let mut overlay_style_span = overlay_styles
197
209
. next ( )
198
210
. unwrap_or_else ( || ( Style :: default ( ) , usize:: MAX ) ) ;
199
211
@@ -221,9 +233,16 @@ pub fn render_text<'t>(
221
233
222
234
// skip any graphemes on visual lines before the block start
223
235
if pos. row < row_off {
224
- if char_pos >= style_span. 1 {
225
- style_span = if let Some ( style_span) = styles. next ( ) {
226
- style_span
236
+ if char_pos >= syntax_style_span. 1 {
237
+ syntax_style_span = if let Some ( syntax_style_span) = syntax_styles. next ( ) {
238
+ syntax_style_span
239
+ } else {
240
+ break ;
241
+ }
242
+ }
243
+ if char_pos >= overlay_style_span. 1 {
244
+ overlay_style_span = if let Some ( overlay_style_span) = overlay_styles. next ( ) {
245
+ overlay_style_span
227
246
} else {
228
247
break ;
229
248
}
@@ -260,8 +279,15 @@ pub fn render_text<'t>(
260
279
}
261
280
262
281
// acquire the correct grapheme style
263
- if char_pos >= style_span. 1 {
264
- style_span = styles. next ( ) . unwrap_or ( ( Style :: default ( ) , usize:: MAX ) ) ;
282
+ if char_pos >= syntax_style_span. 1 {
283
+ syntax_style_span = syntax_styles
284
+ . next ( )
285
+ . unwrap_or ( ( Style :: default ( ) , usize:: MAX ) ) ;
286
+ }
287
+ if char_pos >= overlay_style_span. 1 {
288
+ overlay_style_span = overlay_styles
289
+ . next ( )
290
+ . unwrap_or ( ( Style :: default ( ) , usize:: MAX ) ) ;
265
291
}
266
292
char_pos += grapheme. doc_chars ( ) ;
267
293
@@ -275,22 +301,25 @@ pub fn render_text<'t>(
275
301
pos,
276
302
) ;
277
303
278
- let grapheme_style = if let GraphemeSource :: VirtualText { highlight } = grapheme. source {
279
- let style = renderer. text_style ;
280
- if let Some ( highlight) = highlight {
281
- style. patch ( theme. highlight ( highlight. 0 ) )
304
+ let ( syntax_style, overlay_style) =
305
+ if let GraphemeSource :: VirtualText { highlight } = grapheme. source {
306
+ let mut style = renderer. text_style ;
307
+ if let Some ( highlight) = highlight {
308
+ style = style. patch ( theme. highlight ( highlight. 0 ) )
309
+ }
310
+ ( style, Style :: default ( ) )
282
311
} else {
283
- style
284
- }
285
- } else {
286
- style_span. 0
287
- } ;
312
+ ( syntax_style_span. 0 , overlay_style_span. 0 )
313
+ } ;
288
314
289
- let virt = grapheme. is_virtual ( ) ;
315
+ let is_virtual = grapheme. is_virtual ( ) ;
290
316
renderer. draw_grapheme (
291
317
grapheme. grapheme ,
292
- grapheme_style,
293
- virt,
318
+ GraphemeStyle {
319
+ syntax_style,
320
+ overlay_style,
321
+ } ,
322
+ is_virtual,
294
323
& mut last_line_indent_level,
295
324
& mut is_in_indent_area,
296
325
pos,
@@ -322,6 +351,11 @@ pub struct TextRenderer<'a> {
322
351
pub viewport : Rect ,
323
352
}
324
353
354
+ pub struct GraphemeStyle {
355
+ syntax_style : Style ,
356
+ overlay_style : Style ,
357
+ }
358
+
325
359
impl < ' a > TextRenderer < ' a > {
326
360
pub fn new (
327
361
surface : & ' a mut Surface ,
@@ -395,7 +429,7 @@ impl<'a> TextRenderer<'a> {
395
429
pub fn draw_grapheme (
396
430
& mut self ,
397
431
grapheme : Grapheme ,
398
- mut style : Style ,
432
+ grapheme_style : GraphemeStyle ,
399
433
is_virtual : bool ,
400
434
last_indent_level : & mut usize ,
401
435
is_in_indent_area : & mut bool ,
@@ -405,9 +439,11 @@ impl<'a> TextRenderer<'a> {
405
439
let is_whitespace = grapheme. is_whitespace ( ) ;
406
440
407
441
// TODO is it correct to apply the whitespace style to all unicode white spaces?
442
+ let mut style = grapheme_style. syntax_style ;
408
443
if is_whitespace {
409
444
style = style. patch ( self . whitespace_style ) ;
410
445
}
446
+ style = style. patch ( grapheme_style. overlay_style ) ;
411
447
412
448
let width = grapheme. width ( ) ;
413
449
let space = if is_virtual { " " } else { & self . space } ;
0 commit comments