package com.kreative.paint.document.draw;
import java.awt.AlphaComposite;
import java.awt.Color;
import java.awt.Graphics2D;
public class ShadowSettings {
public static final int SHADOW_TYPE_NONE = 0;
public static final int SHADOW_TYPE_STROKE = 1;
public static final int SHADOW_TYPE_FILL = 2;
public static final int SHADOW_TYPE_BLACK = 3;
public static final int SHADOW_TYPE_GRAY = 4;
public static final int SHADOW_TYPE_WHITE = 5;
public final int shadowType;
public final int shadowOpacity;
public final int xOffset;
public final int yOffset;
public ShadowSettings(int type, int opacity, int x, int y) {
this.shadowType = type;
this.shadowOpacity = opacity;
this.xOffset = x;
this.yOffset = y;
}
public boolean isShadowed() {
if (shadowType == 0 || shadowOpacity == 0) return false;
if (xOffset == 0 && yOffset == 0) return false;
return true;
}
public ShadowSettings deriveShadowType(int shadowType) {
return new ShadowSettings(shadowType, shadowOpacity, xOffset, yOffset);
}
public ShadowSettings deriveShadowOpacity(int shadowOpacity) {
return new ShadowSettings(shadowType, shadowOpacity, xOffset, yOffset);
}
public ShadowSettings deriveShadowXOffset(int xOffset) {
return new ShadowSettings(shadowType, shadowOpacity, xOffset, yOffset);
}
public ShadowSettings deriveShadowYOffset(int yOffset) {
return new ShadowSettings(shadowType, shadowOpacity, xOffset, yOffset);
}
public void apply(Graphics2D g, PaintSettings ps) {
switch (shadowType) {
case SHADOW_TYPE_NONE:
g.setPaint(new Color(0, true));
g.setComposite(AlphaComposite.SrcOver);
break;
case SHADOW_TYPE_STROKE:
ps.applyDraw(g);
if (shadowOpacity < 255 && g.getComposite() instanceof AlphaComposite) {
AlphaComposite cx = (AlphaComposite)g.getComposite();
g.setComposite(AlphaComposite.getInstance(cx.getRule(), cx.getAlpha() * shadowOpacity / 255f));
}
break;
case SHADOW_TYPE_FILL:
ps.applyFill(g);
if (shadowOpacity < 255 && g.getComposite() instanceof AlphaComposite) {
AlphaComposite cx = (AlphaComposite)g.getComposite();
g.setComposite(AlphaComposite.getInstance(cx.getRule(), cx.getAlpha() * shadowOpacity / 255f));
}
break;
case SHADOW_TYPE_BLACK:
g.setPaint(new Color((shadowOpacity << 24), true));
g.setComposite(AlphaComposite.SrcOver);
break;
case SHADOW_TYPE_GRAY:
g.setPaint(new Color((shadowOpacity << 24) | 0x808080, true));
g.setComposite(AlphaComposite.SrcOver);
break;
case SHADOW_TYPE_WHITE:
g.setPaint(new Color((shadowOpacity << 24) | 0xFFFFFF, true));
g.setComposite(AlphaComposite.SrcOver);
break;
default:
int a = ((shadowType >> 24) & 0xFF) * shadowOpacity / 255;
g.setPaint(new Color((a << 24) | (shadowType & 0xFFFFFF), true));
g.setComposite(AlphaComposite.SrcOver);
break;
}
g.translate(xOffset, yOffset);
}
@Override
public boolean equals(Object that) {
if (that instanceof ShadowSettings) {
return (this.shadowType == ((ShadowSettings)that).shadowType)
&& (this.shadowOpacity == ((ShadowSettings)that).shadowOpacity)
&& (this.xOffset == ((ShadowSettings)that).xOffset)
&& (this.yOffset == ((ShadowSettings)that).yOffset);
} else {
return false;
}
}
@Override
public int hashCode() {
return shadowType + shadowOpacity + xOffset + yOffset;
}
}