void () { if (myPlainSpaceWidth >= 0) return; Font font = myEditor.getColorsScheme().getFont(EditorFontType.PLAIN); FontMetrics fm = FontInfo.getFontMetrics(font, myFontRenderContext); float width = FontLayoutService.getInstance().charWidth2D(fm, ' '); myPlainSpaceWidth = width > 0 ? width : 1; myCharHeight = FontLayoutService.getInstance().charWidth(fm, 'a'); float verticalScalingFactor = getVerticalScalingFactor(); int fontMetricsHeight = FontLayoutService.getInstance().getHeight(fm); int lineHeight; if (Registry.is("editor.text.xcode.vertical.spacing")) { //Here we approximate line calculation to the variant used in Xcode 9 editor LineMetrics metrics = font.getLineMetrics("", myFontRenderContext); double height = Math.ceil(metrics.getHeight()) + metrics.getLeading(); double delta = verticalScalingFactor - 1; int spacing; if (Math.round((height * delta) / 2) <= 1) { spacing = delta > 0 ? 2 : 0; } else { spacing = ((int)Math.ceil((height * delta) / 2)) * 2; } lineHeight = (int)Math.ceil(height) + spacing; } else if (Registry.is("editor.text.vertical.spacing.correct.rounding")) { if (verticalScalingFactor == 1f) { lineHeight = fontMetricsHeight; } else { Font scaledFont = font.deriveFont(font.getSize() * verticalScalingFactor); FontMetrics scaledMetrics = FontInfo.getFontMetrics(scaledFont, myFontRenderContext); lineHeight = FontLayoutService.getInstance().getHeight(scaledMetrics); } } else { lineHeight = (int)Math.ceil(fontMetricsHeight * verticalScalingFactor); } myLineHeight = Math.max(1, lineHeight); int descent = FontLayoutService.getInstance().getDescent(fm); myDescent = descent + (myLineHeight - fontMetricsHeight) / 2; myTopOverhang = fontMetricsHeight - myLineHeight + myDescent - descent; myBottomOverhang = descent - myDescent; // assuming that bold italic 'W' gives a good approximation of font's widest character FontMetrics fmBI = FontInfo.getFontMetrics(myEditor.getColorsScheme().getFont(EditorFontType.BOLD_ITALIC), myFontRenderContext); myMaxCharWidth = FontLayoutService.getInstance().charWidth2D(fmBI, 'W'); myCapHeight = (int)font.createGlyphVector(myFontRenderContext, "H").getVisualBounds().getHeight(); }