package prefuse.action.animate;
import prefuse.action.ItemAction;
import prefuse.util.ColorLib;
import prefuse.util.PrefuseLib;
import prefuse.util.collections.CopyOnWriteArrayList;
import prefuse.visual.VisualItem;
/**
* Animator that linearly interpolates between starting and ending colors
* for VisualItems during an animation. By default, interpolates the three
* primary color fields: {@link VisualItem#STROKECOLOR stroke color},
* {@link VisualItem#FILLCOLOR fill color}, and
* {@link VisualItem#TEXTCOLOR text color}.
*
* @author <a href="http://jheer.org">jeffrey heer</a>
*/
public class ColorAnimator extends ItemAction {
private static final String[] DEFAULTS = new String[] {
VisualItem.STROKECOLOR, VisualItem.FILLCOLOR,
VisualItem.TEXTCOLOR };
private CopyOnWriteArrayList m_colorFields;
/**
* Create a new ColorAnimator that processes all data groups.
*/
public ColorAnimator() {
super();
setColorFields(DEFAULTS);
}
/**
* Create a new ColorAnimator that processes the specified group.
* @param group the data group to process
*/
public ColorAnimator(String group) {
super(group);
setColorFields(DEFAULTS);
}
/**
* Create a new ColorAnimator that processes the specified group and
* color field.
* @param group the data group to process
* @param field the color field to interpolate
*/
public ColorAnimator(String group, String field) {
super(group);
setColorFields(new String[] {field});
}
/**
* Create a new ColorAnimator that processes the specified group and
* color fields.
* @param group the data group to process
* @param fields the color fields to interpolate
*/
public ColorAnimator(String group, String[] fields) {
super(group);
setColorFields(fields);
}
/**
* Sets the color fields to interpolate.
* @param fields the color fields to interpolate
*/
public void setColorFields(String[] fields) {
if ( fields == null ) {
throw new IllegalArgumentException();
}
if ( m_colorFields == null )
m_colorFields = new CopyOnWriteArrayList();
else
m_colorFields.clear();
for ( int i=0; i<fields.length; ++i ) {
m_colorFields.add(fields[i]);
m_colorFields.add(PrefuseLib.getStartField(fields[i]));
m_colorFields.add(PrefuseLib.getEndField(fields[i]));
}
}
/**
* @see prefuse.action.ItemAction#process(prefuse.visual.VisualItem, double)
*/
public void process(VisualItem item, double frac) {
if ( m_colorFields == null ) return;
Object[] fields = m_colorFields.getArray();
for ( int i=0; i<fields.length; i += 3 ) {
String f = (String)fields[i];
String sf = (String)fields[i+1];
String ef = (String)fields[i+2];
int sc = item.getInt(sf), ec = item.getInt(ef);
int cc = ColorLib.interp(sc, ec, frac);
item.setInt(f, cc);
}
}
} // end of class ColorAnimator