Skip to content

Commit ce84c3c

Browse files
committed
Issue #932: StyledText: painting entire background before content
Needed to avoid clipping tall unicode characters in fixedLineMetrics mode. Signed-off-by: Alexandr Miloslavskiy <[email protected]>
1 parent bd76f9f commit ce84c3c

File tree

1 file changed

+40
-2
lines changed

1 file changed

+40
-2
lines changed

bundles/org.eclipse.swt/Eclipse SWT Custom Widgets/common/org/eclipse/swt/custom/StyledTextRenderer.java

Lines changed: 40 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -471,10 +471,48 @@ private LineDrawInfo makeLineDrawInfo(int lineIndex) {
471471
}
472472

473473
int drawLines(int startLine, int endLine, int begX, int begY, int endY, GC gc, Color widgetBackground, Color widgetForeground) {
474-
final boolean drawBackBeforeFore = false;
474+
// When fixed line metrics is in effect, tall unicode characters
475+
// will not always fit line's height. In this case, they will
476+
// draw out of line's bounds. To prevent them from being clipped
477+
// by next line's background, paint entire background before any
478+
// foreground.
479+
// I considered to make this mode default, but was worried about
480+
// potential regressions in various legacy code. For example, it
481+
// could change something about line heights/colors during
482+
// painting. While this doesn't sound like a good thing to do, yet
483+
// still, I'd rather stay safe.
484+
final boolean drawBackBeforeFore = (fixedLineMetrics != null);
475485

476486
if (drawBackBeforeFore) {
477-
return 0;
487+
// Cache drawing information
488+
final List<LineDrawInfo> drawInfos = new ArrayList<>();
489+
int y = begY;
490+
for (int iLine = startLine; y < endY && iLine < endLine; iLine++) {
491+
LineDrawInfo lineInfo = makeLineDrawInfo(iLine);
492+
drawInfos.add(lineInfo);
493+
y += lineInfo.height;
494+
}
495+
496+
// Draw background
497+
y = begY;
498+
for (LineDrawInfo lineInfo : drawInfos) {
499+
drawLineBackground(lineInfo, y, gc, widgetBackground);
500+
y += lineInfo.height;
501+
}
502+
503+
// Draw foreground
504+
y = begY;
505+
for (LineDrawInfo lineInfo : drawInfos) {
506+
drawLineForeground(lineInfo, begX, y, gc, widgetForeground);
507+
y += lineInfo.height;
508+
}
509+
510+
// cleanup
511+
for (LineDrawInfo lineInfo : drawInfos) {
512+
disposeTextLayout(lineInfo.layout);
513+
}
514+
515+
return y - begY;
478516
}
479517

480518
int y = begY;

0 commit comments

Comments
 (0)