package com.limegroup.gnutella.gui;
import java.awt.Graphics;
import java.awt.Image;
import java.awt.Toolkit;
import java.awt.image.BufferedImage;
import java.awt.image.FilteredImageSource;
import java.awt.image.ImageFilter;
import java.awt.image.ImageProducer;
import java.awt.image.RGBImageFilter;
import javax.swing.GrayFilter;
import javax.swing.Icon;
import javax.swing.ImageIcon;
import javax.swing.JLabel;
import javax.swing.plaf.IconUIResource;
/**
* Utility class for manipulating images & icons.
*/
public class ImageManipulator extends RGBImageFilter {
/**
* Whether or not we are going to brighten the image.
*/
private boolean brighter;
/**
* The percentage to darken or brighten the image.
*/
private int percent;
/**
* Constucts a new manipulator.
*/
private ImageManipulator(boolean b, int p) {
brighter = b;
percent = p;
canFilterIndexColorModel = true;
}
/**
* Filters a pixel.
*/
public int filterRGB(int x, int y, int rgb) {
return (rgb & 0xff000000) |
(filter(rgb >> 16) << 16) |
(filter(rgb >> 8) << 8 ) |
(filter(rgb));
}
/**
* Brighens or darkens a single r/g/b value.
*/
private int filter(int color) {
color = color & 0xff;
if (brighter) {
color = (255 - ((255 - color) * (100 - percent) / 100));
} else {
color = (color * (100 - percent) / 100);
}
if (color < 0) color = 0;
if (color > 255) color = 255;
return color;
}
/**
* Returns a slightly brighter version of the icon.
*/
public static Icon brighten(Icon icon) {
Image img = getImage(icon);
if(img == null)
return icon;
img = brighten(img);
return new IconUIResource(new ImageIcon(img));
}
/**
* Returns a slightly darker version of the icon.
*/
public static Icon darken(Icon icon) {
Image img = getImage(icon);
if(img == null)
return icon;
img = darken(img);
return new IconUIResource(new ImageIcon(img));
}
/**
* Returns a grayed version of the icon.
*/
public static Icon gray(Icon icon) {
Image img = getImage(icon);
if(img == null)
return icon;
img = gray(img);
return new IconUIResource(new ImageIcon(img));
}
/**
* Manipulates an icon.
*/
public static Icon manipulate(Icon icon, boolean brighten, int percent) {
Image img = getImage(icon);
if(img == null)
return icon;
img = manipulate(img, brighten, percent);
return new IconUIResource(new ImageIcon(img));
}
/**
* Brightens an image.
*/
public static Image brighten(Image img) {
return manipulate(img, true, 20);
}
/**
* Darkens an image.
*/
public static Image darken(Image img) {
return manipulate(img, false, 10);
}
/**
* Grays an image.
*/
public static Image gray(Image img) {
return GrayFilter.createDisabledImage(img);
}
/**
* Manipulates an image.
*/
public static Image manipulate(Image img, boolean brighten, int percent) {
ImageFilter filter = new ImageManipulator(brighten, percent);
ImageProducer prod = new FilteredImageSource(img.getSource(), filter);
return Toolkit.getDefaultToolkit().createImage(prod);
}
/**
* Resizes an icon.
*/
public static Icon resize(Icon icon, int width, int height) {
Image image = getImage(icon);
if(image == null)
return icon;
image = image.getScaledInstance(width, height, Image.SCALE_SMOOTH);
return new ImageIcon(image);
}
/**
* Creates an image from an icon.
*/
private static Image getImage(Icon icon) {
if(icon instanceof ImageIcon) {
return ((ImageIcon)icon).getImage();
} else {
BufferedImage buffer = new BufferedImage(
icon.getIconWidth(), icon.getIconHeight(),
BufferedImage.TYPE_INT_ARGB);
Graphics g = buffer.getGraphics();
icon.paintIcon(new JLabel(), g, 0,0);
g.dispose();
return buffer;
}
}
}