package org.newdawn.slick.font.effects;
import java.awt.Color;
import java.awt.GradientPaint;
import java.awt.Graphics2D;
import java.awt.image.BufferedImage;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import org.newdawn.slick.UnicodeFont;
import org.newdawn.slick.font.Glyph;
/**
* Paints glyphs with a gradient fill.
*
* @author Nathan Sweet <misc@n4te.com>
*/
public class GradientEffect implements ConfigurableEffect {
/** The top of gradients colour */
private Color topColor = Color.cyan;
/** The bottom of the gradient's colour */
private Color bottomColor = Color.blue;
/** The offset the gradient starts at */
private int offset = 0;
/** The scaling of the graident */
private float scale = 1;
/** True if the graident should cycle back and forth across the surface */
private boolean cyclic;
/**
* Default constructor for injection
*/
public GradientEffect() {
}
/**
* Create a new effect to apply a graident
*
* @param topColor The colour at the top of the graident
* @param bottomColor The colour at the bottom of the gradient
* @param scale The scale of the graident
*/
public GradientEffect(Color topColor, Color bottomColor, float scale) {
this.topColor = topColor;
this.bottomColor = bottomColor;
this.scale = scale;
}
/**
* @see org.newdawn.slick.font.effects.Effect#draw(java.awt.image.BufferedImage, java.awt.Graphics2D, org.newdawn.slick.UnicodeFont, org.newdawn.slick.font.Glyph)
*/
public void draw(BufferedImage image, Graphics2D g, UnicodeFont unicodeFont, Glyph glyph) {
int ascent = unicodeFont.getAscent();
float height = (ascent) * scale;
float top = -glyph.getYOffset() + unicodeFont.getDescent() + offset + ascent / 2 - height / 2;
g.setPaint(new GradientPaint(0, top, topColor, 0, top + height, bottomColor, cyclic));
g.fill(glyph.getShape());
}
/**
* Get the colour at the top of the graident
*
* @return The colour at the top of the gradient
*/
public Color getTopColor() {
return topColor;
}
/**
* Set the colour at the top of the graident
*
* @param topColor The colour at the top of the graident
*/
public void setTopColor(Color topColor) {
this.topColor = topColor;
}
/**
* Get the colour at the bottom of the graident
*
* @return The colour at the bottom of the gradient
*/
public Color getBottomColor () {
return bottomColor;
}
/**
* Set the colour at the bottom of the graident
*
* @param bottomColor The colour at the bottom of the graident
*/
public void setBottomColor(Color bottomColor) {
this.bottomColor = bottomColor;
}
/**
* Get the offset the gradients starts at
*
* @return The offset the gradient starts at
*/
public int getOffset() {
return offset;
}
/**
* Sets the pixel offset to move the gradient up or down.
* The gradient is normally centered on the glyph.
*
* @param offset The offset the gradient is moved by
*/
public void setOffset (int offset) {
this.offset = offset;
}
/**
* Get the percentage scaling being applied to the gradient across the surface
*
* @return The scale of the graident
*/
public float getScale() {
return scale;
}
/**
* Changes the height of the gradient by a percentage. The gradient is
* normally the height of most glyphs in the font.
*
* @param scale The scale to apply
*/
public void setScale (float scale) {
this.scale = scale;
}
/**
* Check if the graident is repeating
*
* @return True if the gradient is repeating
*/
public boolean isCyclic() {
return cyclic;
}
/**
* If set to true, the gradient will repeat.
*
* @param cyclic True if the graident repeats
*/
public void setCyclic(boolean cyclic) {
this.cyclic = cyclic;
}
/**
* @see java.lang.Object#toString()
*/
public String toString() {
return "Gradient";
}
/**
* @see org.newdawn.slick.font.effects.ConfigurableEffect#getValues()
*/
public List getValues() {
List values = new ArrayList();
values.add(EffectUtil.colorValue("Top color", topColor));
values.add(EffectUtil.colorValue("Bottom color", bottomColor));
values.add(EffectUtil.intValue("Offset", offset,
"This setting allows you to move the gradient up or down. The gradient is normally centered on the glyph."));
values.add(EffectUtil.floatValue("Scale", scale, 0, 1, "This setting allows you to change the height of the gradient by a"
+ "percentage. The gradient is normally the height of most glyphs in the font."));
values.add(EffectUtil.booleanValue("Cyclic", cyclic, "If this setting is checked, the gradient will repeat."));
return values;
}
/**
* @see org.newdawn.slick.font.effects.ConfigurableEffect#setValues(java.util.List)
*/
public void setValues(List values) {
for (Iterator iter = values.iterator(); iter.hasNext();) {
Value value = (Value)iter.next();
if (value.getName().equals("Top color")) {
topColor = (Color)value.getObject();
} else if (value.getName().equals("Bottom color")) {
bottomColor = (Color)value.getObject();
} else if (value.getName().equals("Offset")) {
offset = ((Integer)value.getObject()).intValue();
} else if (value.getName().equals("Scale")) {
scale = ((Float)value.getObject()).floatValue();
} else if (value.getName().equals("Cyclic")) {
cyclic = ((Boolean)value.getObject()).booleanValue();
}
}
}
}