From af468e0761cb05fda1d5eb3a8bbe6d4e5df00f1e Mon Sep 17 00:00:00 2001 From: Thomas Singer Date: Tue, 3 Sep 2024 11:32:04 +0200 Subject: [PATCH] #414: slow StyledTextRenderer for unicode and unprintable control characters This test replaces the characters 0x00-0x1F with some alternative character (by default '?') for rendering. This improves the performance significantly. --- .../win32/org/eclipse/swt/graphics/TextLayout.java | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/bundles/org.eclipse.swt/Eclipse SWT/win32/org/eclipse/swt/graphics/TextLayout.java b/bundles/org.eclipse.swt/Eclipse SWT/win32/org/eclipse/swt/graphics/TextLayout.java index 4ec71e5988b..2cc726f481d 100644 --- a/bundles/org.eclipse.swt/Eclipse SWT/win32/org/eclipse/swt/graphics/TextLayout.java +++ b/bundles/org.eclipse.swt/Eclipse SWT/win32/org/eclipse/swt/graphics/TextLayout.java @@ -2854,6 +2854,13 @@ public boolean isDisposed () { return device == null; } +private static char replaceBelowSpaceCharacters(char chr) { + return chr >= ' ' + ? chr + //: (char)(0x2400 + chr); + : '?'; +} + /* * Itemize the receiver text */ @@ -2881,6 +2888,9 @@ StyleItem[] itemize () { int[] pcItems = new int[1]; char[] chars = new char[length]; segmentsText.getChars(0, length, chars, 0); + for (int i = 0; i < length; i++) { + chars[i] = replaceBelowSpaceCharacters(chars[i]); + } // enable font ligatures scriptControl.fMergeNeutralItems = true; /* @@ -3740,6 +3750,9 @@ void shape (GC gc, final long hdc, final StyleItem run) { final int[] buffer = new int[1]; final char[] chars = new char[run.length]; segmentsText.getChars(run.start, run.start + run.length, chars, 0); + for (int i = 0; i < chars.length; i++) { + chars[i] = replaceBelowSpaceCharacters(chars[i]); + } final int maxGlyphs = (chars.length * 3 / 2) + 16; long hHeap = OS.GetProcessHeap();