From 32f2ed3e9005b767c9415592f799236d255eebbf Mon Sep 17 00:00:00 2001 From: Dmitry Batrak Date: Tue, 24 Nov 2015 13:19:47 +0300 Subject: [PATCH] speed up text rendering - perform full text layout only for complex text --- .../editor/impl/view/FontLayoutService.java | 16 +++++++++++++++- 1 file changed, 15 insertions(+), 1 deletion(-) diff --git a/platform/platform-impl/src/com/intellij/openapi/editor/impl/view/FontLayoutService.java b/platform/platform-impl/src/com/intellij/openapi/editor/impl/view/FontLayoutService.java index fc99cddf03fe..bf33bb503158 100644 --- a/platform/platform-impl/src/com/intellij/openapi/editor/impl/view/FontLayoutService.java +++ b/platform/platform-impl/src/com/intellij/openapi/editor/impl/view/FontLayoutService.java @@ -22,6 +22,7 @@ import org.jetbrains.annotations.TestOnly; import java.awt.*; import java.awt.font.FontRenderContext; import java.awt.font.GlyphVector; +import java.util.Arrays; /** * Encapsulates logic related to font metrics. Mock instance can be used in tests to make them independent on font properties on particular @@ -55,7 +56,20 @@ public abstract class FontLayoutService { @Override public GlyphVector layoutGlyphVector(@NotNull Font font, @NotNull FontRenderContext fontRenderContext, @NotNull char[] chars, int start, int end, boolean isRtl) { - return font.layoutGlyphVector(fontRenderContext, chars, start, end, isRtl ? Font.LAYOUT_RIGHT_TO_LEFT : Font.LAYOUT_LEFT_TO_RIGHT); + if (isRtl || font.hasLayoutAttributes() || isComplexText(chars, start, end)) { + return font.layoutGlyphVector(fontRenderContext, chars, start, end, isRtl ? Font.LAYOUT_RIGHT_TO_LEFT : Font.LAYOUT_LEFT_TO_RIGHT); + } + else { + return font.createGlyphVector(fontRenderContext, Arrays.copyOfRange(chars, start, end)); + } + } + + // a simplified version of sun.font.FontUtilities.isComplexText + private static boolean isComplexText(char[] chars, int start, int end) { + for (int i = start; i < end; i++) { + if (chars[i] >= 0x0300) return true; + } + return false; } @Override