diff --git a/platform/core-ui/api-dump.txt b/platform/core-ui/api-dump.txt index 01325b6be20c..ac87d7a8581b 100644 --- a/platform/core-ui/api-dump.txt +++ b/platform/core-ui/api-dump.txt @@ -441,10 +441,12 @@ f:com.intellij.util.IconUtil - sf:brighter(javax.swing.Icon,I):javax.swing.Icon - sf:colorize(java.awt.Graphics2D,javax.swing.Icon,java.awt.Color):javax.swing.Icon - sf:colorize(java.awt.Graphics2D,javax.swing.Icon,java.awt.Color,Z):javax.swing.Icon +- sf:colorize(java.awt.Graphics2D,javax.swing.Icon,java.awt.Color,Z,Z):javax.swing.Icon - sf:colorize(javax.swing.Icon,java.awt.Color):javax.swing.Icon - sf:colorize(javax.swing.Icon,java.awt.Color,Z):javax.swing.Icon -- bs:colorize$default(java.awt.Graphics2D,javax.swing.Icon,java.awt.Color,Z,I,java.lang.Object):javax.swing.Icon -- bs:colorize$default(javax.swing.Icon,java.awt.Color,Z,I,java.lang.Object):javax.swing.Icon +- sf:colorize(javax.swing.Icon,java.awt.Color,Z,Z):javax.swing.Icon +- bs:colorize$default(java.awt.Graphics2D,javax.swing.Icon,java.awt.Color,Z,Z,I,java.lang.Object):javax.swing.Icon +- bs:colorize$default(javax.swing.Icon,java.awt.Color,Z,Z,I,java.lang.Object):javax.swing.Icon - sf:computeBaseFileIcon(com.intellij.openapi.vfs.VirtualFile):javax.swing.Icon - sf:computeFileIcon(com.intellij.openapi.vfs.VirtualFile,I,com.intellij.openapi.project.Project):javax.swing.Icon - sf:copy(javax.swing.Icon,java.awt.Component):javax.swing.Icon diff --git a/platform/core-ui/src/util/IconUtil.kt b/platform/core-ui/src/util/IconUtil.kt index 1b63e618fbaf..82ba3351dc73 100644 --- a/platform/core-ui/src/util/IconUtil.kt +++ b/platform/core-ui/src/util/IconUtil.kt @@ -27,6 +27,7 @@ import com.intellij.ui.scale.ScaleType import com.intellij.ui.svg.paintIconWithSelection import com.intellij.util.IconUtil.ICON_FLAG_IGNORE_MASK import com.intellij.util.IconUtil.computeFileIcon +import com.intellij.util.IconUtil.scale import com.intellij.util.ui.* import org.jetbrains.annotations.ApiStatus import org.jetbrains.annotations.ApiStatus.Internal @@ -439,18 +440,23 @@ object IconUtil { return scaleByIcon(icon = icon, ancestor = ancestor, defaultIcon = defaultIcon) { it.iconWidth } } + /** + * @param keepGray if false - the saturation is fully taken from [color] + * @param keepBrightness if false - the brightness is fully taken from [color]. + * If left true - 'gray color + gray icon' will produce a nearly black resulting icon. + */ @JvmOverloads @JvmStatic - fun colorize(source: Icon, color: Color, keepGray: Boolean = false): Icon { + fun colorize(source: Icon, color: Color, keepGray: Boolean = false, keepBrightness: Boolean = true): Icon { return filterIcon(icon = source, filterSupplier = object : RgbImageFilterSupplier { - override fun getFilter() = ColorFilter(color = color, keepGray = keepGray) + override fun getFilter() = ColorFilter(color = color, keepGray = keepGray, keepBrightness = keepBrightness) }) } @JvmOverloads @JvmStatic - fun colorize(g: Graphics2D?, source: Icon, color: Color, keepGray: Boolean = false): Icon { - return filterIcon(g = g, source = source, filter = ColorFilter(color = color, keepGray = keepGray)) + fun colorize(g: Graphics2D?, source: Icon, color: Color, keepGray: Boolean = false, keepBrightness: Boolean = true): Icon { + return filterIcon(g = g, source = source, filter = ColorFilter(color = color, keepGray = keepGray, keepBrightness = keepBrightness)) } @JvmStatic @@ -650,7 +656,7 @@ class CropIcon internal constructor(val sourceIcon: Icon, val crop: Rectangle) : } @Internal -class ColorFilter(val color: Color, val keepGray: Boolean) : RGBImageFilter() { +class ColorFilter(val color: Color, val keepGray: Boolean, val keepBrightness: Boolean) : RGBImageFilter() { private val base = Color.RGBtoHSB(color.red, color.green, color.blue, null) override fun filterRGB(x: Int, y: Int, rgba: Int): Int { @@ -659,7 +665,9 @@ class ColorFilter(val color: Color, val keepGray: Boolean) : RGBImageFilter() { val b = rgba and 0xff val hsb = FloatArray(3) Color.RGBtoHSB(r, g, b, hsb) - val rgb = Color.HSBtoRGB(base[0], base[1] * if (keepGray) hsb[1] else 1.0f, base[2] * hsb[2]) + val rgb = Color.HSBtoRGB(base[0], + base[1] * if (keepGray) hsb[1] else 1.0f, + base[2] * if (keepBrightness) hsb[2] else 1.0f) return rgba and -0x1000000 or (rgb and 0xffffff) } } diff --git a/platform/platform-impl/src/com/intellij/openapi/wm/impl/headertoolbar/ProjectToolbarWidgetAction.kt b/platform/platform-impl/src/com/intellij/openapi/wm/impl/headertoolbar/ProjectToolbarWidgetAction.kt index 820b8a131675..487763a5aef0 100644 --- a/platform/platform-impl/src/com/intellij/openapi/wm/impl/headertoolbar/ProjectToolbarWidgetAction.kt +++ b/platform/platform-impl/src/com/intellij/openapi/wm/impl/headertoolbar/ProjectToolbarWidgetAction.kt @@ -356,7 +356,7 @@ private class ProjectWidgetRenderer : ListCellRenderer