From ad742eaf43027d5a0732c45d72a322a8c2a04c3a Mon Sep 17 00:00:00 2001 From: Ivan Posti Date: Mon, 21 Aug 2023 11:17:41 +0200 Subject: [PATCH] [Markdown][IDEA-326905] Use a local copy of the graphics object to ensure that antialiasing settings won't leak to other renderers GitOrigin-RevId: 70898237564ab43dc95d68fc79b66114c0306f27 --- .../editor/tables/ui/presentation/GraphicsUtils.kt | 9 +++++++++ .../ui/presentation/HorizontalBarPresentation.kt | 11 +++++++---- .../tables/ui/presentation/VerticalBarPresentation.kt | 11 +++++++---- 3 files changed, 23 insertions(+), 8 deletions(-) diff --git a/plugins/markdown/core/src/org/intellij/plugins/markdown/editor/tables/ui/presentation/GraphicsUtils.kt b/plugins/markdown/core/src/org/intellij/plugins/markdown/editor/tables/ui/presentation/GraphicsUtils.kt index d60bd7ee0de2..30396931ea66 100644 --- a/plugins/markdown/core/src/org/intellij/plugins/markdown/editor/tables/ui/presentation/GraphicsUtils.kt +++ b/plugins/markdown/core/src/org/intellij/plugins/markdown/editor/tables/ui/presentation/GraphicsUtils.kt @@ -37,4 +37,13 @@ internal object GraphicsUtils { val arc = Arc2D.Double(x.toDouble(), y.toDouble(), width.toDouble(), height.toDouble(), start, 180.0, Arc2D.PIE) fill(arc) } + + fun Graphics2D.useCopy(block: (Graphics2D) -> T): T { + val local = create() as Graphics2D + try { + return block(local) + } finally { + local.dispose() + } + } } diff --git a/plugins/markdown/core/src/org/intellij/plugins/markdown/editor/tables/ui/presentation/HorizontalBarPresentation.kt b/plugins/markdown/core/src/org/intellij/plugins/markdown/editor/tables/ui/presentation/HorizontalBarPresentation.kt index b8478aeb0825..fb710e81b155 100644 --- a/plugins/markdown/core/src/org/intellij/plugins/markdown/editor/tables/ui/presentation/HorizontalBarPresentation.kt +++ b/plugins/markdown/core/src/org/intellij/plugins/markdown/editor/tables/ui/presentation/HorizontalBarPresentation.kt @@ -11,6 +11,7 @@ import com.intellij.openapi.actionSystem.ActionGroup import com.intellij.openapi.actionSystem.ActionManager import com.intellij.openapi.actionSystem.ActionToolbar import com.intellij.openapi.actionSystem.DataProvider +import com.intellij.openapi.actionSystem.impl.ToolbarUtils import com.intellij.openapi.application.ModalityState import com.intellij.openapi.application.invokeLater import com.intellij.openapi.command.executeCommand @@ -29,11 +30,11 @@ import org.intellij.plugins.markdown.editor.tables.actions.TableActionKeys import org.intellij.plugins.markdown.editor.tables.actions.TableActionPlaces import org.intellij.plugins.markdown.editor.tables.selectColumn import org.intellij.plugins.markdown.editor.tables.ui.presentation.GraphicsUtils.clearOvalOverEditor +import org.intellij.plugins.markdown.editor.tables.ui.presentation.GraphicsUtils.useCopy import org.intellij.plugins.markdown.lang.MarkdownTokenTypes import org.intellij.plugins.markdown.lang.psi.impl.MarkdownTable import org.intellij.plugins.markdown.lang.psi.impl.MarkdownTableRow import org.intellij.plugins.markdown.lang.psi.util.hasType -import com.intellij.openapi.actionSystem.impl.ToolbarUtils import java.awt.* import java.awt.event.MouseEvent import java.lang.ref.WeakReference @@ -78,9 +79,11 @@ internal class HorizontalBarPresentation(private val editor: Editor, private val if (isInvalid) { return } - GraphicsUtil.setupAntialiasing(graphics) - GraphicsUtil.setupRoundedBorderAntialiasing(graphics) - paintBars(graphics) + graphics.useCopy { local -> + GraphicsUtil.setupAntialiasing(local) + GraphicsUtil.setupRoundedBorderAntialiasing(local) + paintBars(local) + } } override fun toString() = "HorizontalBarPresentation" diff --git a/plugins/markdown/core/src/org/intellij/plugins/markdown/editor/tables/ui/presentation/VerticalBarPresentation.kt b/plugins/markdown/core/src/org/intellij/plugins/markdown/editor/tables/ui/presentation/VerticalBarPresentation.kt index d20d2aa6aba0..a143482beab2 100644 --- a/plugins/markdown/core/src/org/intellij/plugins/markdown/editor/tables/ui/presentation/VerticalBarPresentation.kt +++ b/plugins/markdown/core/src/org/intellij/plugins/markdown/editor/tables/ui/presentation/VerticalBarPresentation.kt @@ -10,6 +10,7 @@ import com.intellij.openapi.actionSystem.ActionGroup import com.intellij.openapi.actionSystem.ActionManager import com.intellij.openapi.actionSystem.ActionToolbar import com.intellij.openapi.actionSystem.DataProvider +import com.intellij.openapi.actionSystem.impl.ToolbarUtils import com.intellij.openapi.application.ModalityState import com.intellij.openapi.application.invokeLater import com.intellij.openapi.command.executeCommand @@ -29,9 +30,9 @@ import org.intellij.plugins.markdown.editor.tables.actions.TableActionKeys import org.intellij.plugins.markdown.editor.tables.actions.TableActionPlaces import org.intellij.plugins.markdown.editor.tables.ui.presentation.GraphicsUtils.clearHalfOvalOverEditor import org.intellij.plugins.markdown.editor.tables.ui.presentation.GraphicsUtils.fillHalfOval +import org.intellij.plugins.markdown.editor.tables.ui.presentation.GraphicsUtils.useCopy import org.intellij.plugins.markdown.lang.psi.impl.MarkdownTableRow import org.intellij.plugins.markdown.lang.psi.impl.MarkdownTableSeparatorRow -import com.intellij.openapi.actionSystem.impl.ToolbarUtils import java.awt.Dimension import java.awt.Graphics2D import java.awt.Point @@ -101,9 +102,11 @@ internal class VerticalBarPresentation( if (!row.isValid || editor.isDisposed || boundsState == initialState) { return } - GraphicsUtil.setupAntialiasing(graphics) - GraphicsUtil.setupRoundedBorderAntialiasing(graphics) - paintRow(graphics, rowLocation) + graphics.useCopy { local -> + GraphicsUtil.setupAntialiasing(local) + GraphicsUtil.setupRoundedBorderAntialiasing(local) + paintRow(local, rowLocation) + } } private fun calculateBarRect(location: RowLocation): Rectangle {