Search in sources :

Example 1 with FontLayoutService

use of com.intellij.openapi.editor.impl.view.FontLayoutService in project intellij-community by JetBrains.

the class ImmediatePainter method paintImmediately.

private void paintImmediately(final Graphics g, final int offset, final char c2) {
    final EditorImpl editor = myEditor;
    final Document document = editor.getDocument();
    final LexerEditorHighlighter highlighter = (LexerEditorHighlighter) myEditor.getHighlighter();
    final EditorSettings settings = editor.getSettings();
    final boolean isBlockCursor = editor.isInsertMode() == settings.isBlockCursor();
    final int lineHeight = editor.getLineHeight();
    final int ascent = editor.getAscent();
    final int topOverhang = editor.myView.getTopOverhang();
    final int bottomOverhang = editor.myView.getBottomOverhang();
    final char c1 = offset == 0 ? ' ' : document.getCharsSequence().charAt(offset - 1);
    final List<TextAttributes> attributes = highlighter.getAttributesForPreviousAndTypedChars(document, offset, c2);
    updateAttributes(editor, offset, attributes);
    final TextAttributes attributes1 = attributes.get(0);
    final TextAttributes attributes2 = attributes.get(1);
    if (!(canRender(attributes1) && canRender(attributes2))) {
        return;
    }
    FontLayoutService fontLayoutService = FontLayoutService.getInstance();
    final float width1 = fontLayoutService.charWidth2D(editor.getFontMetrics(attributes1.getFontType()), c1);
    final float width2 = fontLayoutService.charWidth2D(editor.getFontMetrics(attributes2.getFontType()), c2);
    final Font font1 = EditorUtil.fontForChar(c1, attributes1.getFontType(), editor).getFont();
    final Font font2 = EditorUtil.fontForChar(c1, attributes2.getFontType(), editor).getFont();
    final Point2D p2 = editor.offsetToXY(offset, false);
    float p2x = (float) p2.getX();
    int p2y = (int) p2.getY();
    int width1i = (int) (p2x) - (int) (p2x - width1);
    int width2i = (int) (p2x + width2) - (int) p2x;
    Caret caret = editor.getCaretModel().getPrimaryCaret();
    //noinspection ConstantConditions
    final int caretWidth = isBlockCursor ? editor.getCaretLocations(false)[0].myWidth : JBUI.scale(caret.getVisualAttributes().getWidth(settings.getLineCursorWidth()));
    final float caretShift = isBlockCursor ? 0 : caretWidth == 1 ? 0 : 1 / JBUI.sysScale((Graphics2D) g);
    final Rectangle2D caretRectangle = new Rectangle2D.Float((int) (p2x + width2) - caretShift, p2y - topOverhang, caretWidth, lineHeight + topOverhang + bottomOverhang + (isBlockCursor ? -1 : 0));
    final Rectangle rectangle1 = new Rectangle((int) (p2x - width1), p2y, width1i, lineHeight);
    final Rectangle rectangle2 = new Rectangle((int) p2x, p2y, (int) (width2i + caretWidth - caretShift), lineHeight);
    final Consumer<Graphics> painter = graphics -> {
        EditorUIUtil.setupAntialiasing(graphics);
        fillRect(graphics, rectangle2, attributes2.getBackgroundColor());
        drawChar(graphics, c2, p2x, p2y + ascent, font2, attributes2.getForegroundColor());
        fillRect(graphics, caretRectangle, getCaretColor(editor));
        fillRect(graphics, rectangle1, attributes1.getBackgroundColor());
        drawChar(graphics, c1, p2x - width1, p2y + ascent, font1, attributes1.getForegroundColor());
    };
    final Shape originalClip = g.getClip();
    g.setClip(new Rectangle2D.Float((int) p2x - caretShift, p2y, width2i + caretWidth, lineHeight));
    if (DOUBLE_BUFFERING.asBoolean()) {
        paintWithDoubleBuffering(g, painter);
    } else {
        painter.consume(g);
    }
    g.setClip(originalClip);
    if (PIPELINE_FLUSH.asBoolean()) {
        Toolkit.getDefaultToolkit().sync();
    }
    if (DEBUG.asBoolean()) {
        pause();
    }
}
Also used : RegistryValue(com.intellij.openapi.util.registry.RegistryValue) UIUtil(com.intellij.util.ui.UIUtil) Point2D(java.awt.geom.Point2D) com.intellij.openapi.editor(com.intellij.openapi.editor) EditorUtil(com.intellij.openapi.editor.ex.util.EditorUtil) Rectangle2D(java.awt.geom.Rectangle2D) ContainerUtil(com.intellij.util.containers.ContainerUtil) ArrayList(java.util.ArrayList) RangeHighlighterEx(com.intellij.openapi.editor.ex.RangeHighlighterEx) JBUI(com.intellij.util.ui.JBUI) HighlighterLayer(com.intellij.openapi.editor.markup.HighlighterLayer) EffectType(com.intellij.openapi.editor.markup.EffectType) Disposer(com.intellij.openapi.util.Disposer) LexerEditorHighlighter(com.intellij.openapi.editor.ex.util.LexerEditorHighlighter) IterationState(com.intellij.openapi.editor.impl.view.IterationState) FontLayoutService(com.intellij.openapi.editor.impl.view.FontLayoutService) EditorTextField(com.intellij.ui.EditorTextField) BufferedImage(java.awt.image.BufferedImage) HighlighterTargetArea(com.intellij.openapi.editor.markup.HighlighterTargetArea) java.awt(java.awt) VolatileImage(java.awt.image.VolatileImage) EditorUIUtil(com.intellij.openapi.editor.ex.util.EditorUIUtil) List(java.util.List) EditorColors(com.intellij.openapi.editor.colors.EditorColors) TextAttributes(com.intellij.openapi.editor.markup.TextAttributes) Processor(com.intellij.util.Processor) ApplicationManager(com.intellij.openapi.application.ApplicationManager) Registry(com.intellij.openapi.util.registry.Registry) Gray(com.intellij.ui.Gray) JBColor(com.intellij.ui.JBColor) Consumer(com.intellij.util.Consumer) javax.swing(javax.swing) Rectangle2D(java.awt.geom.Rectangle2D) LexerEditorHighlighter(com.intellij.openapi.editor.ex.util.LexerEditorHighlighter) Point2D(java.awt.geom.Point2D) FontLayoutService(com.intellij.openapi.editor.impl.view.FontLayoutService) TextAttributes(com.intellij.openapi.editor.markup.TextAttributes)

Aggregations

ApplicationManager (com.intellij.openapi.application.ApplicationManager)1 com.intellij.openapi.editor (com.intellij.openapi.editor)1 EditorColors (com.intellij.openapi.editor.colors.EditorColors)1 RangeHighlighterEx (com.intellij.openapi.editor.ex.RangeHighlighterEx)1 EditorUIUtil (com.intellij.openapi.editor.ex.util.EditorUIUtil)1 EditorUtil (com.intellij.openapi.editor.ex.util.EditorUtil)1 LexerEditorHighlighter (com.intellij.openapi.editor.ex.util.LexerEditorHighlighter)1 FontLayoutService (com.intellij.openapi.editor.impl.view.FontLayoutService)1 IterationState (com.intellij.openapi.editor.impl.view.IterationState)1 EffectType (com.intellij.openapi.editor.markup.EffectType)1 HighlighterLayer (com.intellij.openapi.editor.markup.HighlighterLayer)1 HighlighterTargetArea (com.intellij.openapi.editor.markup.HighlighterTargetArea)1 TextAttributes (com.intellij.openapi.editor.markup.TextAttributes)1 Disposer (com.intellij.openapi.util.Disposer)1 Registry (com.intellij.openapi.util.registry.Registry)1 RegistryValue (com.intellij.openapi.util.registry.RegistryValue)1 EditorTextField (com.intellij.ui.EditorTextField)1 Gray (com.intellij.ui.Gray)1 JBColor (com.intellij.ui.JBColor)1 Consumer (com.intellij.util.Consumer)1