From bf96a9093133f8ff661086350a93512a6d2e4030 Mon Sep 17 00:00:00 2001 From: Sergey Malenkov Date: Tue, 5 Jul 2016 19:38:51 +0300 Subject: [PATCH] IDEA-157667 Editor's scrollbar thumb: alpha and colors use new values for alpha and colors extract painter to separate class --- .../ui/components/DefaultScrollBarUI.java | 4 +- .../intellij/ui/components/JBScrollPane.java | 328 +----------------- .../ui/components/MacScrollBarUI.java | 4 +- .../intellij/ui/components/ScrollPainter.java | 255 ++++++++++++++ .../util/resources/misc/registry.properties | 28 -- 5 files changed, 263 insertions(+), 356 deletions(-) create mode 100644 platform/platform-api/src/com/intellij/ui/components/ScrollPainter.java diff --git a/platform/platform-api/src/com/intellij/ui/components/DefaultScrollBarUI.java b/platform/platform-api/src/com/intellij/ui/components/DefaultScrollBarUI.java index 6e8272143272..6426d545c03b 100644 --- a/platform/platform-api/src/com/intellij/ui/components/DefaultScrollBarUI.java +++ b/platform/platform-api/src/com/intellij/ui/components/DefaultScrollBarUI.java @@ -121,7 +121,7 @@ class DefaultScrollBarUI extends ScrollBarUI { } void paintTrack(Graphics2D g, int x, int y, int width, int height, JComponent c) { - RegionPainter p = ScrollColorProducer.isDark(c) ? JBScrollPane.TRACK_DARK_PAINTER : JBScrollPane.TRACK_PAINTER; + RegionPainter p = ScrollColorProducer.isDark(c) ? ScrollPainter.Track.DARCULA : ScrollPainter.Track.DEFAULT; if (!isTrackExpandable() && Registry.is("ide.scroll.background.wide")) { p.paint(g, x, y, width, height, myTrackAnimator.myValue); return; // temporary registry key for designer @@ -130,7 +130,7 @@ class DefaultScrollBarUI extends ScrollBarUI { } void paintThumb(Graphics2D g, int x, int y, int width, int height, JComponent c) { - RegionPainter p = ScrollColorProducer.isDark(c) ? JBScrollPane.THUMB_DARK_PAINTER : JBScrollPane.THUMB_PAINTER; + RegionPainter p = ScrollColorProducer.isDark(c) ? ScrollPainter.Thumb.DARCULA : ScrollPainter.Thumb.DEFAULT; paint(p, g, x, y, width, height, c, myThumbAnimator.myValue, Registry.is("ide.scroll.thumb.small.if.opaque")); } diff --git a/platform/platform-api/src/com/intellij/ui/components/JBScrollPane.java b/platform/platform-api/src/com/intellij/ui/components/JBScrollPane.java index 2cf04c24af5b..b5e767233fb7 100644 --- a/platform/platform-api/src/com/intellij/ui/components/JBScrollPane.java +++ b/platform/platform-api/src/com/intellij/ui/components/JBScrollPane.java @@ -20,7 +20,6 @@ import com.intellij.openapi.util.Key; import com.intellij.openapi.util.SystemInfo; import com.intellij.openapi.util.registry.Registry; import com.intellij.openapi.wm.IdeGlassPane; -import com.intellij.ui.Gray; import com.intellij.ui.IdeBorderFactory; import com.intellij.util.ArrayUtil; import com.intellij.util.ReflectionUtil; @@ -44,9 +43,6 @@ import java.awt.event.InputEvent; import java.awt.event.MouseEvent; import java.awt.event.MouseWheelEvent; import java.awt.event.MouseWheelListener; -import java.awt.geom.Path2D; -import java.awt.geom.RoundRectangle2D; -import java.awt.image.*; import java.lang.reflect.Field; public class JBScrollPane extends JScrollPane { @@ -61,58 +57,16 @@ public class JBScrollPane extends JScrollPane { public static final Key BRIGHTNESS_FROM_VIEW = Key.create("JB_SCROLL_PANE_BRIGHTNESS_FROM_VIEW"); @Deprecated - public static final RegionPainter TRACK_PAINTER = new AlphaPainter(.0f, .1f, Gray.x80); + public static final RegionPainter THUMB_PAINTER = ScrollPainter.EditorThumb.DEFAULT; @Deprecated - public static final RegionPainter TRACK_DARK_PAINTER = new AlphaPainter(.0f, .1f, Gray.x80); + public static final RegionPainter THUMB_DARK_PAINTER = ScrollPainter.EditorThumb.DARCULA; @Deprecated - public static final RegionPainter THUMB_PAINTER = new ProtectedPainter( - new DefaultThumbPainter(new SubtractThumbPainter(.25f, .15f, Gray.x80, Gray.x8C), - new CachedValue("ide.scroll.thumb.windows.default.alpha", "0.25", .25f), - new CachedValue("ide.scroll.thumb.windows.default.delta", "0.15", .15f), - new CachedColor("ide.scroll.thumb.windows.default.color", "#808080", Gray.x80), - new CachedColor("ide.scroll.thumb.windows.default.border", "#8C8C8C", Gray.x8C)), - new DefaultThumbPainter(new ThumbPainter(.7f, .2f, Gray.x99, Gray.x8C), - new CachedValue("ide.scroll.thumb.linux.default.alpha", "0.70", .70f), - new CachedValue("ide.scroll.thumb.linux.default.delta", "0.20", .20f), - new CachedColor("ide.scroll.thumb.linux.default.color", "#999999", Gray.x99), - new CachedColor("ide.scroll.thumb.linux.default.border", "#8c8c8c", Gray.x8C))); - @Deprecated - public static final RegionPainter THUMB_DARK_PAINTER = new DefaultThumbPainter( - new ThumbPainter(.37f, .13f, Gray.xA6, Gray.x1A), - new CachedValue("ide.scroll.thumb.windows.darcula.alpha", "0.37", .37f), - new CachedValue("ide.scroll.thumb.windows.darcula.delta", "0.13", .13f), - new CachedColor("ide.scroll.thumb.windows.darcula.color", "#A6A6A6", Gray.xA6), - new CachedColor("ide.scroll.thumb.windows.darcula.border", "#1A1A1A", Gray.x1A)); + public static final RegionPainter MAC_THUMB_PAINTER = ScrollPainter.EditorThumb.Mac.DEFAULT; @Deprecated - public static final RegionPainter MAC_THUMB_PAINTER = new DefaultThumbPainter( - new RoundThumbPainter(2, .2f, .3f, Gray.x00, Gray.x00), - new CachedValue("ide.scroll.thumb.mac.classic.default.alpha", "0.20", .20f), - new CachedValue("ide.scroll.thumb.mac.classic.default.delta", "0.30", .30f), - new CachedColor("ide.scroll.thumb.mac.classic.default.color", "#000000", Gray.x00), - new CachedColor("ide.scroll.thumb.mac.classic.default.border", "", null)); - static final RegionPainter MAC_OVERLAY_THUMB_PAINTER = new DefaultThumbPainter( - new RoundThumbPainter(2, 0f, .5f, Gray.x00, Gray.x00), - new CachedValue("ide.scroll.thumb.mac.overlay.default.alpha", "0.00", .00f), - new CachedValue("ide.scroll.thumb.mac.overlay.default.delta", "0.50", .50f), - new CachedColor("ide.scroll.thumb.mac.overlay.default.color", "#000000", Gray.x00), - new CachedColor("ide.scroll.thumb.mac.overlay.default.border", "", null)); - - @Deprecated - public static final RegionPainter MAC_THUMB_DARK_PAINTER = new DefaultThumbPainter( - new RoundThumbPainter(1, .35f, .20f, Gray.xA6, Gray.x1A), - new CachedValue("ide.scroll.thumb.mac.classic.darcula.alpha", "0.35", .35f), - new CachedValue("ide.scroll.thumb.mac.classic.darcula.delta", "0.20", .20f), - new CachedColor("ide.scroll.thumb.mac.classic.darcula.color", "#A6A6A6", Gray.xA6), - new CachedColor("ide.scroll.thumb.mac.classic.darcula.border", "#1A1A1A", Gray.x1A)); - static final RegionPainter MAC_OVERLAY_THUMB_DARK_PAINTER = new DefaultThumbPainter( - new RoundThumbPainter(1, 0f, .55f, Gray.xA6, Gray.x1A), - new CachedValue("ide.scroll.thumb.mac.overlay.darcula.alpha", "0.00", .00f), - new CachedValue("ide.scroll.thumb.mac.overlay.darcula.delta", "0.55", .55f), - new CachedColor("ide.scroll.thumb.mac.overlay.darcula.color", "#A6A6A6", Gray.xA6), - new CachedColor("ide.scroll.thumb.mac.overlay.darcula.border", "#1A1A1A", Gray.x1A)); + public static final RegionPainter MAC_THUMB_DARK_PAINTER = ScrollPainter.EditorThumb.Mac.DARCULA; private static final Logger LOG = Logger.getInstance(JBScrollPane.class); @@ -861,188 +815,6 @@ public class JBScrollPane extends JScrollPane { } } - private static class ProtectedPainter implements RegionPainter { - private RegionPainter myPainter; - private RegionPainter myFallback; - - public ProtectedPainter(RegionPainter painter, RegionPainter fallback) { - myPainter = painter; - myFallback = fallback; - } - - @Override - public void paint(Graphics2D g, int x, int y, int width, int height, Float value) { - RegionPainter painter = myFallback; - if (myPainter != null) { - try { - myPainter.paint(g, x, y, width, height, value); - return; - } - catch (Throwable exception) { - // do not try to use myPainter again on other systems - if (!SystemInfo.isWindows) myPainter = null; - } - } - if (painter != null) { - painter.paint(g, x, y, width, height, value); - } - } - } - - private static class AlphaPainter extends RegionPainter.Alpha { - float myBase; - float myDelta; - Color myFillColor; - - private AlphaPainter(float base, float delta, Color fill) { - myBase = base; - myDelta = delta; - myFillColor = fill; - } - - @Override - protected void paint(Graphics2D g, int x, int y, int width, int height) { - if (myFillColor != null) { - g.setColor(myFillColor); - g.fillRect(x, y, width, height); - } - } - - @Override - protected float getAlpha(Float value) { - return value != null ? myBase + myDelta * value : 0; - } - } - - private static class RoundThumbPainter extends ThumbPainter { - private final int myBorder; - - private RoundThumbPainter(int border, float base, float delta, Color fill, Color draw) { - super(base, delta, fill, draw); - myBorder = border; - } - - @Override - protected void paint(Graphics2D g, int x, int y, int width, int height) { - Object old = g.getRenderingHint(RenderingHints.KEY_ANTIALIASING); - g.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON); - - x += myBorder; - y += myBorder; - width -= myBorder + myBorder; - height -= myBorder + myBorder; - - int arc = Math.min(width, height); - if (myFillColor != null) { - g.setColor(myFillColor); - g.fillRoundRect(x, y, width, height, arc, arc); - } - if (myDrawColor != null) { - Path2D path = new Path2D.Double(Path2D.WIND_EVEN_ODD); - path.append(new RoundRectangle2D.Double(x, y, width, height, arc, arc), false); - path.append(new RoundRectangle2D.Double(x + 1, y + 1, width - 2, height - 2, arc - 2, arc - 2), false); - g.setColor(myDrawColor); - g.fill(path); - } - g.setRenderingHint(RenderingHints.KEY_ANTIALIASING, old); - } - } - - private static class ThumbPainter extends AlphaPainter { - Color myDrawColor; - - private ThumbPainter(float base, float delta, Color fill, Color draw) { - super(base, delta, fill); - myDrawColor = draw; - } - - @Override - protected void paint(Graphics2D g, int x, int y, int width, int height) { - super.paint(g, x + 1, y + 1, width - 2, height - 2); - if (myDrawColor != null) { - g.setColor(myDrawColor); - if (Registry.is("ide.scroll.thumb.border.rounded")) { - g.drawLine(x + 1, y, x + width - 2, y); - g.drawLine(x + 1, y + height - 1, x + width - 2, y + height - 1); - g.drawLine(x, y + 1, x, y + height - 2); - g.drawLine(x + width - 1, y + 1, x + width - 1, y + height - 2); - } - else { - g.drawRect(x, y, width - 1, height - 1); - } - } - } - } - - private static class SubtractThumbPainter extends ThumbPainter { - public SubtractThumbPainter(float base, float delta, Color fill, Color draw) { - super(base, delta, fill, draw); - } - - @Override - protected Composite getComposite(float alpha) { - return alpha < 1 - ? new SubtractComposite(alpha) - : AlphaComposite.SrcOver; - } - } - - private static class SubtractComposite implements Composite, CompositeContext { - private final float myAlpha; - - private SubtractComposite(float alpha) { - myAlpha = alpha; - } - - private int subtract(int newValue, int oldValue) { - float value = (oldValue & 0xFF) - (newValue & 0xFF) * myAlpha; - return value <= 0 ? 0 : (int)value; - } - - @Override - public CompositeContext createContext(ColorModel src, ColorModel dst, RenderingHints hints) { - return isValid(src) && isValid(dst) ? this : AlphaComposite.SrcOver.derive(myAlpha).createContext(src, dst, hints); - } - - private static boolean isValid(ColorModel model) { - if (model instanceof DirectColorModel && DataBuffer.TYPE_INT == model.getTransferType()) { - DirectColorModel dcm = (DirectColorModel)model; - if (0x00FF0000 == dcm.getRedMask() && 0x0000FF00 == dcm.getGreenMask() && 0x000000FF == dcm.getBlueMask()) { - return 4 != dcm.getNumComponents() || 0xFF000000 == dcm.getAlphaMask(); - } - } - return false; - } - - @Override - public void compose(Raster srcIn, Raster dstIn, WritableRaster dstOut) { - int width = Math.min(srcIn.getWidth(), dstIn.getWidth()); - int height = Math.min(srcIn.getHeight(), dstIn.getHeight()); - - int[] srcPixels = new int[width]; - int[] dstPixels = new int[width]; - - for (int y = 0; y < height; y++) { - srcIn.getDataElements(0, y, width, 1, srcPixels); - dstIn.getDataElements(0, y, width, 1, dstPixels); - for (int x = 0; x < width; x++) { - int src = srcPixels[x]; - int dst = dstPixels[x]; - int a = subtract(src >> 24, dst >> 24) << 24; - int r = subtract(src >> 16, dst >> 16) << 16; - int g = subtract(src >> 8, dst >> 8) << 8; - int b = subtract(src, dst); - dstPixels[x] = a | r | g | b; - } - dstOut.setDataElements(0, y, width, 1, dstPixels); - } - } - - @Override - public void dispose() { - } - } - /** * Indicates whether the specified event is not consumed and does not have unexpected modifiers. * @@ -1058,96 +830,4 @@ public class JBScrollPane extends JScrollPane { private static final int SCROLL_MODIFIERS = // event modifiers allowed during scrolling ~InputEvent.SHIFT_MASK & ~InputEvent.SHIFT_DOWN_MASK & // for horizontal scrolling ~InputEvent.BUTTON1_MASK & ~InputEvent.BUTTON1_DOWN_MASK; // for selection - - private static class CachedColor { - private final String myKey; - private String myString; - private Color myColor; - - private CachedColor(String key, String string, Color color) { - myKey = key; - myString = string; - myColor = color; - } - - private Color get() { - String string = Registry.stringValue(myKey); - if (!string.equals(myString)) { - try { - myColor = Color.decode(string); - } - catch (Exception ignore) { - myColor = null; - } - finally { - myString = string; - } - } - return myColor; - } - } - - private static class CachedValue { - private final String myKey; - private String myString; - private float myValue; - - private CachedValue(String key, String string, float value) { - myKey = key; - myString = string; - myValue = value; - } - - private float get() { - String string = Registry.stringValue(myKey); - if (!string.equals(myString)) { - try { - myValue = Float.parseFloat(string); - } - catch (Exception ignore) { - } - finally { - myString = string; - } - } - return myValue; - } - } - - private static class ThumbPainterDelegate

implements RegionPainter { - final P myPainter; - private final CachedValue myBase; - private final CachedValue myDelta; - private final CachedColor myFillColor; - - private ThumbPainterDelegate(P painter, CachedValue base, CachedValue delta, CachedColor fill) { - myPainter = painter; - myBase = base; - myDelta = delta; - myFillColor = fill; - } - - @Override - public void paint(Graphics2D g, int x, int y, int width, int height, Float object) { - myPainter.myBase = myBase.get(); - myPainter.myDelta = myDelta.get(); - myPainter.myFillColor = myFillColor.get(); - myPainter.paint(g, x, y, width, height, object); - } - } - - private static class DefaultThumbPainter extends ThumbPainterDelegate { - private final CachedColor myDrawColor; - - private DefaultThumbPainter(ThumbPainter painter, CachedValue base, CachedValue delta, CachedColor fill, CachedColor draw) { - super(painter, base, delta, fill); - myDrawColor = draw; - } - - @Override - public final void paint(Graphics2D g, int x, int y, int width, int height, Float object) { - myPainter.myDrawColor = myDrawColor.get(); - super.paint(g, x, y, width, height, object); - } - } } diff --git a/platform/platform-api/src/com/intellij/ui/components/MacScrollBarUI.java b/platform/platform-api/src/com/intellij/ui/components/MacScrollBarUI.java index 9d5018f53004..7243898117ff 100644 --- a/platform/platform-api/src/com/intellij/ui/components/MacScrollBarUI.java +++ b/platform/platform-api/src/com/intellij/ui/components/MacScrollBarUI.java @@ -101,11 +101,11 @@ final class MacScrollBarUI extends DefaultScrollBarUI { @Override void paintThumb(Graphics2D g, int x, int y, int width, int height, JComponent c) { if (c.isOpaque()) { - RegionPainter p = ScrollColorProducer.isDark(c) ? JBScrollPane.MAC_THUMB_DARK_PAINTER : JBScrollPane.MAC_THUMB_PAINTER; + RegionPainter p = ScrollColorProducer.isDark(c) ? ScrollPainter.Thumb.Mac.DARCULA : ScrollPainter.Thumb.Mac.DEFAULT; paint(p, g, x, y, width, height, c, myThumbAnimator.myValue, true); } else if (myThumbAnimator.myValue > 0) { - RegionPainter p = ScrollColorProducer.isDark(c) ? JBScrollPane.MAC_OVERLAY_THUMB_DARK_PAINTER : JBScrollPane.MAC_OVERLAY_THUMB_PAINTER; + RegionPainter p = ScrollColorProducer.isDark(c) ? ScrollPainter.Thumb.Mac.Overlay.DARCULA : ScrollPainter.Thumb.Mac.Overlay.DEFAULT; paint(p, g, x, y, width, height, c, myThumbAnimator.myValue, false); } } diff --git a/platform/platform-api/src/com/intellij/ui/components/ScrollPainter.java b/platform/platform-api/src/com/intellij/ui/components/ScrollPainter.java new file mode 100644 index 000000000000..d06c76e86cc5 --- /dev/null +++ b/platform/platform-api/src/com/intellij/ui/components/ScrollPainter.java @@ -0,0 +1,255 @@ +/* + * Copyright 2000-2016 JetBrains s.r.o. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.intellij.ui.components; + +import com.intellij.openapi.util.SystemInfo; +import com.intellij.openapi.util.registry.Registry; +import com.intellij.ui.Gray; +import com.intellij.util.ui.RegionPainter; + +import java.awt.*; +import java.awt.geom.Path2D; +import java.awt.geom.RoundRectangle2D; +import java.awt.image.*; + +/** + * @author Sergey.Malenkov + */ +class ScrollPainter extends RegionPainter.Alpha { + + static final class Track { + static final RegionPainter DARCULA = new ScrollPainter(0, .0f, .1f, Gray.x80, null); + static final RegionPainter DEFAULT = DARCULA; + } + + static final class Thumb { + static final RegionPainter DARCULA = new ScrollPainter(0, .28f, .07f, Gray.xA6, Gray.x38); + static final RegionPainter DEFAULT = new Protected(new SubtractColor(0, .20f, .08f, Gray.x73, Gray.x91), + new ScrollPainter(0, .20f, .08f, Gray.x73, Gray.x59)); + + static final class Mac { + static final RegionPainter DARCULA = new Round(1, .35f, .20f, Gray.x80, Gray.x26); + static final RegionPainter DEFAULT = new Round(2, .20f, .30f, Gray.x00, Gray.x00); + + static final class Overlay { + static final RegionPainter DARCULA = new Round(1, 0f, .55f, Gray.x80, Gray.x26); + static final RegionPainter DEFAULT = new Round(2, 0f, .50f, Gray.x00, Gray.x00); + } + } + } + + static final class EditorThumb { + static final RegionPainter DARCULA = new ScrollPainter(0, .33f, .12f, Gray.xA6, Gray.x1A); + static final RegionPainter DEFAULT = new Protected(new SubtractColor(0, .25f, .15f, Gray.x80, Gray.xA6), + new ScrollPainter(0, .25f, .15f, Gray.x80, Gray.x59)); + + static final class Mac { + static final RegionPainter DARCULA = new Round(1, .35f, .20f, Gray.xA6, Gray.x0D); + static final RegionPainter DEFAULT = Thumb.DEFAULT; + + static final class Overlay { + static final RegionPainter DARCULA = new Round(1, 0f, .55f, Gray.xA6, Gray.x0D); + static final RegionPainter DEFAULT = Thumb.DEFAULT; + } + } + } + + private final int myOffset; + private final float myAlphaBase; + private final float myAlphaDelta; + private final Color myFillColor; + private final Color myDrawColor; + + private ScrollPainter(int offset, float base, float delta, Color fill, Color draw) { + myOffset = offset; + myAlphaBase = base; + myAlphaDelta = delta; + myFillColor = fill; + myDrawColor = draw; + } + + @Override + protected float getAlpha(Float value) { + return value != null ? myAlphaBase + myAlphaDelta * value : 0; + } + + @Override + protected void paint(Graphics2D g, int x, int y, int width, int height) { + if (myOffset > 0) { + x += myOffset; + y += myOffset; + width -= myOffset + myOffset; + height -= myOffset + myOffset; + } + if (width > 0 && height > 0) { + if (myFillColor != null) { + g.setColor(myFillColor); + fill(g, x, y, width, height, myDrawColor != null); + } + if (myDrawColor != null) { + g.setColor(myDrawColor); + draw(g, x, y, width, height); + } + } + } + + protected void fill(Graphics2D g, int x, int y, int width, int height, boolean border) { + if (border) { + g.fillRect(x + 1, y + 1, width - 2, height - 2); + } + else { + g.fillRect(x, y, width, height); + } + } + + protected void draw(Graphics2D g, int x, int y, int width, int height) { + if (Registry.is("ide.scroll.thumb.border.rounded")) { + g.drawLine(x + 1, y, x + width - 2, y); + g.drawLine(x + 1, y + height - 1, x + width - 2, y + height - 1); + g.drawLine(x, y + 1, x, y + height - 2); + g.drawLine(x + width - 1, y + 1, x + width - 1, y + height - 2); + } + else { + g.drawRect(x, y, width - 1, height - 1); + } + } + + private static class Round extends ScrollPainter { + private Round(int offset, float base, float delta, Color fill, Color draw) { + super(offset, base, delta, fill, draw); + } + + @Override + protected void paint(Graphics2D g, int x, int y, int width, int height) { + Object old = g.getRenderingHint(RenderingHints.KEY_ANTIALIASING); + g.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON); + super.paint(g, x, y, width, height); + g.setRenderingHint(RenderingHints.KEY_ANTIALIASING, old); + } + + @Override + protected void fill(Graphics2D g, int x, int y, int width, int height, boolean border) { + int arc = Math.min(width, height); + g.fillRoundRect(x, y, width, height, arc, arc); + } + + @Override + protected void draw(Graphics2D g, int x, int y, int width, int height) { + int arc = Math.min(width, height); + Path2D path = new Path2D.Double(Path2D.WIND_EVEN_ODD); + path.append(new RoundRectangle2D.Double(x, y, width, height, arc, arc), false); + path.append(new RoundRectangle2D.Double(x + 1, y + 1, width - 2, height - 2, arc - 2, arc - 2), false); + g.fill(path); + } + } + + private static class Protected implements RegionPainter { + private RegionPainter myPainter; + private RegionPainter myFallback; + + private Protected(RegionPainter painter, RegionPainter fallback) { + myPainter = painter; + myFallback = fallback; + } + + @Override + public void paint(Graphics2D g, int x, int y, int width, int height, Float value) { + RegionPainter painter = myFallback; + if (myPainter != null) { + try { + myPainter.paint(g, x, y, width, height, value); + return; + } + catch (Throwable exception) { + // do not try to use myPainter again on other systems + if (!SystemInfo.isWindows) myPainter = null; + } + } + if (painter != null) { + painter.paint(g, x, y, width, height, value); + } + } + } + + private static class SubtractColor extends ScrollPainter { + private SubtractColor(int offset, float base, float delta, Color fill, Color draw) { + super(offset, base, delta, fill, draw); + } + + @Override + protected Composite getComposite(float alpha) { + return alpha < 1 + ? new SubtractComposite(alpha) + : AlphaComposite.SrcOver; + } + } + + private static class SubtractComposite implements Composite, CompositeContext { + private final float myAlpha; + + private SubtractComposite(float alpha) { + myAlpha = alpha; + } + + private int subtract(int newValue, int oldValue) { + float value = (oldValue & 0xFF) - (newValue & 0xFF) * myAlpha; + return value <= 0 ? 0 : (int)value; + } + + @Override + public CompositeContext createContext(ColorModel src, ColorModel dst, RenderingHints hints) { + return isValid(src) && isValid(dst) ? this : AlphaComposite.SrcOver.derive(myAlpha).createContext(src, dst, hints); + } + + private static boolean isValid(ColorModel model) { + if (model instanceof DirectColorModel && DataBuffer.TYPE_INT == model.getTransferType()) { + DirectColorModel dcm = (DirectColorModel)model; + if (0x00FF0000 == dcm.getRedMask() && 0x0000FF00 == dcm.getGreenMask() && 0x000000FF == dcm.getBlueMask()) { + return 4 != dcm.getNumComponents() || 0xFF000000 == dcm.getAlphaMask(); + } + } + return false; + } + + @Override + public void compose(Raster srcIn, Raster dstIn, WritableRaster dstOut) { + int width = Math.min(srcIn.getWidth(), dstIn.getWidth()); + int height = Math.min(srcIn.getHeight(), dstIn.getHeight()); + + int[] srcPixels = new int[width]; + int[] dstPixels = new int[width]; + + for (int y = 0; y < height; y++) { + srcIn.getDataElements(0, y, width, 1, srcPixels); + dstIn.getDataElements(0, y, width, 1, dstPixels); + for (int x = 0; x < width; x++) { + int src = srcPixels[x]; + int dst = dstPixels[x]; + int a = subtract(src >> 24, dst >> 24) << 24; + int r = subtract(src >> 16, dst >> 16) << 16; + int g = subtract(src >> 8, dst >> 8) << 8; + int b = subtract(src, dst); + dstPixels[x] = a | r | g | b; + } + dstOut.setDataElements(0, y, width, 1, dstPixels); + } + } + + @Override + public void dispose() { + } + } +} diff --git a/platform/util/resources/misc/registry.properties b/platform/util/resources/misc/registry.properties index d9a15866356d..33f273bb4d17 100644 --- a/platform/util/resources/misc/registry.properties +++ b/platform/util/resources/misc/registry.properties @@ -118,34 +118,6 @@ ide.scroll.track.border.paint=false ide.scroll.thumb.border.rounded=false ide.scroll.thumb.small.if.opaque=true mac.scroll.new.ui=true -ide.scroll.thumb.windows.default.alpha=0.25 -ide.scroll.thumb.windows.default.delta=0.15 -ide.scroll.thumb.windows.default.color=#808080 -ide.scroll.thumb.windows.default.border=#8C8C8C -ide.scroll.thumb.linux.default.alpha=0.70 -ide.scroll.thumb.linux.default.delta=0.20 -ide.scroll.thumb.linux.default.color=#999999 -ide.scroll.thumb.linux.default.border=#8c8c8c -ide.scroll.thumb.windows.darcula.alpha=0.37 -ide.scroll.thumb.windows.darcula.delta=0.13 -ide.scroll.thumb.windows.darcula.color=#A6A6A6 -ide.scroll.thumb.windows.darcula.border=#1A1A1A -ide.scroll.thumb.mac.classic.default.alpha=0.20 -ide.scroll.thumb.mac.classic.default.delta=0.30 -ide.scroll.thumb.mac.classic.default.color=#000000 -ide.scroll.thumb.mac.classic.default.border= -ide.scroll.thumb.mac.overlay.default.alpha=0.00 -ide.scroll.thumb.mac.overlay.default.delta=0.50 -ide.scroll.thumb.mac.overlay.default.color=#000000 -ide.scroll.thumb.mac.overlay.default.border= -ide.scroll.thumb.mac.classic.darcula.alpha=0.35 -ide.scroll.thumb.mac.classic.darcula.delta=0.20 -ide.scroll.thumb.mac.classic.darcula.color=#A6A6A6 -ide.scroll.thumb.mac.classic.darcula.border=#1A1A1A -ide.scroll.thumb.mac.overlay.darcula.alpha=0.00 -ide.scroll.thumb.mac.overlay.darcula.delta=0.55 -ide.scroll.thumb.mac.overlay.darcula.color=#A6A6A6 -ide.scroll.thumb.mac.overlay.darcula.border=#1A1A1A ide.tooltip.callout=true ide.tooltip.animationCycle=150