/* * Copyright (c) 2014 tabletoptool.com team. * All rights reserved. This program and the accompanying materials * are made available under the terms of the GNU Public License v3.0 * which accompanies this distribution, and is available at * http://www.gnu.org/licenses/gpl.html * * Contributors: * rptools.com team - initial implementation * tabletoptool.com team - further development */ package com.t3.model.drawing; import java.awt.AlphaComposite; import java.awt.BasicStroke; import java.awt.Color; import java.awt.Composite; import java.awt.Graphics2D; import java.awt.Image; import java.awt.Stroke; import java.awt.image.ImageObserver; import com.t3.client.TabletopTool; import com.t3.guid.GUID; import com.t3.model.Zone; import com.t3.xstreamversioned.version.SerializationVersion; /** * Abstract drawing. This class takes care of setting up the Pen since that will be the same for all implementing * classes. */ @SerializationVersion(0) public abstract class AbstractDrawing implements Drawable, ImageObserver { /** * The unique identifier for this drawable. It is immutable. */ private final GUID id = new GUID(); private Zone.Layer layer; /* * (non-Javadoc) * * @see tabletoptool.model.drawing.Drawable#draw(java.awt.Graphics2D, tabletoptool.model.drawing.Pen) */ @Override public void draw(Graphics2D g, Pen pen) { if (pen == null) { pen = Pen.DEFAULT; } Stroke oldStroke = g.getStroke(); g.setStroke(new BasicStroke(pen.getThickness(), BasicStroke.CAP_ROUND, BasicStroke.JOIN_ROUND)); Composite oldComposite = g.getComposite(); if (pen.isEraser()) { g.setComposite(AlphaComposite.Clear); } else if (pen.getOpacity() != 1) { g.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_OVER, pen.getOpacity())); } if (pen.getBackgroundMode() == Pen.MODE_SOLID) { if (pen.getBackgroundPaint() != null) { g.setPaint(pen.getBackgroundPaint().getPaint(this)); } else { // **** Legacy support for 1.1 g.setColor(new Color(pen.getBackgroundColor())); } drawBackground(g); } if (pen.getForegroundMode() == Pen.MODE_SOLID) { if (pen.getPaint() != null) { g.setPaint(pen.getPaint().getPaint(this)); } else { // **** Legacy support for 1.1 g.setColor(new Color(pen.getColor())); } draw(g); } g.setComposite(oldComposite); g.setStroke(oldStroke); } protected abstract void draw(Graphics2D g); protected abstract void drawBackground(Graphics2D g); /** * Get the id for this AbstractDrawing. * * @return Returns the current value of id. */ @Override public GUID getId() { return id; } @Override public void setLayer(Zone.Layer layer) { this.layer = layer; } @Override public Zone.Layer getLayer() { return layer != null ? layer : Zone.Layer.BACKGROUND; } /** * Use the id for equals. * * @see java.lang.Object#equals(java.lang.Object) */ @Override public boolean equals(Object obj) { if (!(obj instanceof AbstractDrawing)) return false; return id.equals(obj); } /** * Use the id for hash code. * * @see java.lang.Object#hashCode() */ @Override public int hashCode() { return id.hashCode(); } //// // IMAGE OBSERVER @Override public boolean imageUpdate(Image img, int infoflags, int x, int y, int width, int height) { TabletopTool.getFrame().getCurrentZoneRenderer().flushDrawableRenderer(); TabletopTool.getFrame().refresh(); return true; } }