/* * Copyright (c) 2005-2016 Substance Kirill Grouchnikov. All Rights Reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * o Redistributions of source code must retain the above copyright notice, * this list of conditions and the following disclaimer. * * o Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * * o Neither the name of Substance Kirill Grouchnikov nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, * EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ package org.pushingpixels.substance.internal.utils.icon; import java.awt.Color; import java.awt.Component; import java.awt.Graphics; import java.awt.Graphics2D; import java.awt.image.BufferedImage; import java.util.HashMap; import java.util.Map; import javax.swing.Icon; import javax.swing.ImageIcon; import org.pushingpixels.lafwidget.icon.HiDpiAwareIcon; import org.pushingpixels.lafwidget.icon.IsHiDpiAware; import org.pushingpixels.substance.internal.animation.IconGlowTracker; import org.pushingpixels.substance.internal.utils.SubstanceColorUtilities; import org.pushingpixels.substance.internal.utils.SubstanceCoreUtilities; public class GlowingIcon implements Icon, IsHiDpiAware { protected Icon delegate; protected IconGlowTracker iconGlowTracker; protected Map<Float, Icon> iconMap; public GlowingIcon(Icon delegate, IconGlowTracker iconGlowTracker) { this.delegate = delegate; this.iconGlowTracker = iconGlowTracker; this.iconMap = new HashMap<Float, Icon>(); } @Override public boolean isHiDpiAware() { return (this.delegate instanceof IsHiDpiAware) && ((IsHiDpiAware) this.delegate).isHiDpiAware(); } public Icon getDelegate() { return this.delegate; } /* * (non-Javadoc) * * @see javax.swing.Icon#getIconHeight() */ public int getIconHeight() { return this.delegate.getIconHeight(); } /* * (non-Javadoc) * * @see javax.swing.Icon#getIconWidth() */ public int getIconWidth() { return this.delegate.getIconWidth(); } /* * (non-Javadoc) * * @see javax.swing.Icon#paintIcon(java.awt.Component, java.awt.Graphics, * int, int) */ /* * (non-Javadoc) * * @see javax.swing.Icon#paintIcon(java.awt.Component, java.awt.Graphics, * int, int) */ public void paintIcon(Component c, Graphics g, int x, int y) { if (this.delegate == null) return; float fadePos = this.iconGlowTracker.getIconGlowPosition(); // System.out.println(fadePos); Icon toPaint = this.iconMap.get(fadePos); if (toPaint == null) { int width = this.getIconWidth(); int height = this.getIconHeight(); BufferedImage image = SubstanceCoreUtilities.getBlankImage(width, height); Graphics2D graphics = (Graphics2D) image.getGraphics(); //graphics.scale(1.0f / scale, 1.0f / scale); this.delegate.paintIcon(c, graphics, 0, 0); int pixelWidth = image.getWidth(); int pixelHeight = image.getHeight(); for (int i = 0; i < pixelWidth; i++) { for (int j = 0; j < pixelHeight; j++) { int rgba = image.getRGB(i, j); int transp = (rgba >>> 24) & 0xFF; double coef = Math.sin(2.0 * Math.PI * fadePos / 2.0) / 3.0; Color newColor = (coef >= 0.0) ? SubstanceColorUtilities .getLighterColor(new Color(rgba), coef) : SubstanceColorUtilities.getDarkerColor(new Color( rgba), -coef); image.setRGB(i, j, (transp << 24) | (newColor.getRed() << 16) | (newColor.getGreen() << 8) | newColor.getBlue()); } } toPaint = isHiDpiAware() ? new HiDpiAwareIcon(image) : new ImageIcon(image); this.iconMap.put(fadePos, toPaint); } Graphics2D g2d = (Graphics2D) g.create(); g2d.translate(x, y); toPaint.paintIcon(c, g, 0, 0); g2d.dispose(); } }