package com.kreative.paint.document.draw;
import java.awt.AlphaComposite;
import java.awt.BasicStroke;
import java.awt.Composite;
import java.awt.Font;
import java.awt.Graphics2D;
import java.awt.Paint;
import java.awt.RenderingHints;
import java.awt.Stroke;
public class PaintSettings {
public static PaintSettings forGraphicsFill(Graphics2D g) {
Object aa = g.getRenderingHint(RenderingHints.KEY_ANTIALIASING);
Object taa = g.getRenderingHint(RenderingHints.KEY_TEXT_ANTIALIASING);
return new PaintSettings(
g.getPaint(),
g.getComposite(),
(aa == RenderingHints.VALUE_ANTIALIAS_ON),
null,
g.getComposite(),
g.getStroke(),
(aa == RenderingHints.VALUE_ANTIALIAS_ON),
g.getFont(),
TextAlignment.LEFT,
(taa == RenderingHints.VALUE_TEXT_ANTIALIAS_ON)
);
}
public static PaintSettings forGraphicsDraw(Graphics2D g) {
Object aa = g.getRenderingHint(RenderingHints.KEY_ANTIALIASING);
Object taa = g.getRenderingHint(RenderingHints.KEY_TEXT_ANTIALIASING);
return new PaintSettings(
null,
g.getComposite(),
(aa == RenderingHints.VALUE_ANTIALIAS_ON),
g.getPaint(),
g.getComposite(),
g.getStroke(),
(aa == RenderingHints.VALUE_ANTIALIAS_ON),
g.getFont(),
TextAlignment.LEFT,
(taa == RenderingHints.VALUE_TEXT_ANTIALIAS_ON)
);
}
public static PaintSettings forGraphicsClear(Graphics2D g) {
Object aa = g.getRenderingHint(RenderingHints.KEY_ANTIALIASING);
Object taa = g.getRenderingHint(RenderingHints.KEY_TEXT_ANTIALIASING);
return new PaintSettings(
g.getBackground(),
AlphaComposite.SrcOver,
false,
null,
g.getComposite(),
g.getStroke(),
(aa == RenderingHints.VALUE_ANTIALIAS_ON),
g.getFont(),
TextAlignment.LEFT,
(taa == RenderingHints.VALUE_TEXT_ANTIALIAS_ON)
);
}
public static PaintSettings forGraphicsDrawImage(Graphics2D g) {
Object aa = g.getRenderingHint(RenderingHints.KEY_ANTIALIASING);
Object taa = g.getRenderingHint(RenderingHints.KEY_TEXT_ANTIALIASING);
return new PaintSettings(
null,
g.getComposite(),
(aa == RenderingHints.VALUE_ANTIALIAS_ON),
null,
g.getComposite(),
g.getStroke(),
(aa == RenderingHints.VALUE_ANTIALIAS_ON),
g.getFont(),
TextAlignment.LEFT,
(taa == RenderingHints.VALUE_TEXT_ANTIALIAS_ON)
);
}
public final Paint fillPaint;
public final Composite fillComposite;
public final boolean fillAntiAliased;
public final Paint drawPaint;
public final Composite drawComposite;
public final Stroke drawStroke;
public final boolean drawAntiAliased;
public final Font textFont;
public final TextAlignment textAlignment;
public final boolean textAntiAliased;
public PaintSettings(Paint fill, Paint draw) {
this(fill, draw, new BasicStroke(1));
}
public PaintSettings(Paint fill, Paint draw, Stroke stroke) {
this(fill, draw, stroke, new Font("SansSerif", Font.PLAIN, 12));
}
public PaintSettings(Paint fill, Paint draw, Stroke stroke, Font font) {
this(
fill, AlphaComposite.SrcOver, false,
draw, AlphaComposite.SrcOver, stroke, false,
font, TextAlignment.LEFT, false
);
}
public PaintSettings(
Paint fillPaint,
Composite fillComposite,
boolean fillAntiAliased,
Paint drawPaint,
Composite drawComposite,
Stroke drawStroke,
boolean drawAntiAliased,
Font textFont,
TextAlignment textAlignment,
boolean textAntiAliased
) {
this.fillPaint = fillPaint;
this.fillComposite = fillComposite;
this.fillAntiAliased = fillAntiAliased;
this.drawPaint = drawPaint;
this.drawComposite = drawComposite;
this.drawStroke = drawStroke;
this.drawAntiAliased = drawAntiAliased;
this.textFont = textFont;
this.textAlignment = textAlignment;
this.textAntiAliased = textAntiAliased;
}
public boolean isFilled() {
return fillPaint != null && fillComposite != null;
}
public boolean isDrawn() {
return drawPaint != null && drawComposite != null && drawStroke != null;
}
public PaintSettings deriveFillPaint(Paint fillPaint) {
return new PaintSettings(
fillPaint, fillComposite, fillAntiAliased,
drawPaint, drawComposite, drawStroke, drawAntiAliased,
textFont, textAlignment, textAntiAliased
);
}
public PaintSettings deriveFillComposite(Composite fillComposite) {
return new PaintSettings(
fillPaint, fillComposite, fillAntiAliased,
drawPaint, drawComposite, drawStroke, drawAntiAliased,
textFont, textAlignment, textAntiAliased
);
}
public PaintSettings deriveFillAntiAliased(boolean fillAntiAliased) {
return new PaintSettings(
fillPaint, fillComposite, fillAntiAliased,
drawPaint, drawComposite, drawStroke, drawAntiAliased,
textFont, textAlignment, textAntiAliased
);
}
public PaintSettings deriveDrawPaint(Paint drawPaint) {
return new PaintSettings(
fillPaint, fillComposite, fillAntiAliased,
drawPaint, drawComposite, drawStroke, drawAntiAliased,
textFont, textAlignment, textAntiAliased
);
}
public PaintSettings deriveDrawComposite(Composite drawComposite) {
return new PaintSettings(
fillPaint, fillComposite, fillAntiAliased,
drawPaint, drawComposite, drawStroke, drawAntiAliased,
textFont, textAlignment, textAntiAliased
);
}
public PaintSettings deriveDrawStroke(Stroke drawStroke) {
return new PaintSettings(
fillPaint, fillComposite, fillAntiAliased,
drawPaint, drawComposite, drawStroke, drawAntiAliased,
textFont, textAlignment, textAntiAliased
);
}
public PaintSettings deriveDrawAntiAliased(boolean drawAntiAliased) {
return new PaintSettings(
fillPaint, fillComposite, fillAntiAliased,
drawPaint, drawComposite, drawStroke, drawAntiAliased,
textFont, textAlignment, textAntiAliased
);
}
public PaintSettings deriveTextFont(Font textFont) {
return new PaintSettings(
fillPaint, fillComposite, fillAntiAliased,
drawPaint, drawComposite, drawStroke, drawAntiAliased,
textFont, textAlignment, textAntiAliased
);
}
public PaintSettings deriveTextAlignment(TextAlignment textAlignment) {
return new PaintSettings(
fillPaint, fillComposite, fillAntiAliased,
drawPaint, drawComposite, drawStroke, drawAntiAliased,
textFont, textAlignment, textAntiAliased
);
}
public PaintSettings deriveTextAntiAliased(boolean textAntiAliased) {
return new PaintSettings(
fillPaint, fillComposite, fillAntiAliased,
drawPaint, drawComposite, drawStroke, drawAntiAliased,
textFont, textAlignment, textAntiAliased
);
}
public void applyFill(Graphics2D g) {
g.setPaint(fillPaint);
g.setComposite(fillComposite);
g.setRenderingHint(
RenderingHints.KEY_ANTIALIASING,
fillAntiAliased
? RenderingHints.VALUE_ANTIALIAS_ON
: RenderingHints.VALUE_ANTIALIAS_OFF
);
g.setFont(textFont);
g.setRenderingHint(
RenderingHints.KEY_TEXT_ANTIALIASING,
textAntiAliased
? RenderingHints.VALUE_TEXT_ANTIALIAS_ON
: RenderingHints.VALUE_TEXT_ANTIALIAS_OFF
);
}
public void applyDraw(Graphics2D g) {
g.setPaint(drawPaint);
g.setComposite(drawComposite);
g.setStroke(drawStroke);
g.setRenderingHint(
RenderingHints.KEY_ANTIALIASING,
drawAntiAliased
? RenderingHints.VALUE_ANTIALIAS_ON
: RenderingHints.VALUE_ANTIALIAS_OFF
);
g.setFont(textFont);
g.setRenderingHint(
RenderingHints.KEY_TEXT_ANTIALIASING,
textAntiAliased
? RenderingHints.VALUE_TEXT_ANTIALIAS_ON
: RenderingHints.VALUE_TEXT_ANTIALIAS_OFF
);
}
@Override
public boolean equals(Object that) {
if (that instanceof PaintSettings) {
return equals(this.fillPaint, ((PaintSettings)that).fillPaint)
&& equals(this.fillComposite, ((PaintSettings)that).fillComposite)
&& (this.fillAntiAliased == ((PaintSettings)that).fillAntiAliased)
&& equals(this.drawPaint, ((PaintSettings)that).drawPaint)
&& equals(this.drawComposite, ((PaintSettings)that).drawComposite)
&& equals(this.drawStroke, ((PaintSettings)that).drawStroke)
&& (this.drawAntiAliased == ((PaintSettings)that).drawAntiAliased)
&& equals(this.textFont, ((PaintSettings)that).textFont)
&& (this.textAlignment == ((PaintSettings)that).textAlignment)
&& (this.textAntiAliased == ((PaintSettings)that).textAntiAliased);
} else {
return false;
}
}
@Override
public int hashCode() {
return ((this.fillPaint != null) ? this.fillPaint.hashCode() : 0)
^ ((this.fillComposite != null) ? this.fillComposite.hashCode() : 0)
^ (this.fillAntiAliased ? 0x11111111 : 0)
^ ((this.drawPaint != null) ? this.drawPaint.hashCode() : 0)
^ ((this.drawComposite != null) ? this.drawComposite.hashCode() : 0)
^ ((this.drawStroke != null) ? this.drawStroke.hashCode() : 0)
^ (this.drawAntiAliased ? 0x22222222 : 0)
^ ((this.textFont != null) ? this.textFont.hashCode() : 0)
^ ((this.textAlignment != null) ? this.textAlignment.hashCode() : 0)
^ (this.textAntiAliased ? 0x44444444 : 0);
}
private static boolean equals(Object dis, Object dat) {
if (dis == null) return (dat == null);
if (dat == null) return (dis == null);
return dis.equals(dat);
}
}