/*
* Copyright (c) 2005, the JUNG Project and the Regents of the University of
* California All rights reserved.
*
* This software is open-source under the BSD license; see either "license.txt"
* or http://jung.sourceforge.net/license.txt for a description.
*
* Created on Jul 11, 2005
*/
package edu.uci.ics.jung.visualization.transform.shape;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Image;
import java.awt.Rectangle;
import java.awt.Shape;
import java.awt.geom.AffineTransform;
import java.awt.geom.Rectangle2D;
import java.awt.image.ImageObserver;
import edu.uci.ics.jung.visualization.transform.BidirectionalTransformer;
/**
* subclassed to pass certain operations thru the transformer
* before the base class method is applied
* This is useful when you want to apply non-affine transformations
* to the Graphics2D used to draw elements of the graph.
*
* @author Tom Nelson
*
*
*/
public class TransformingGraphics extends GraphicsDecorator {
/**
* the transformer to apply
*/
protected BidirectionalTransformer transformer;
public TransformingGraphics(BidirectionalTransformer transformer) {
this(transformer, null);
}
public TransformingGraphics(BidirectionalTransformer transformer, Graphics2D delegate) {
super(delegate);
this.transformer = transformer;
}
/**
* @return Returns the transformer.
*/
public BidirectionalTransformer getTransformer() {
return transformer;
}
/**
* @param transformer The transformer to set.
*/
public void setTransformer(BidirectionalTransformer transformer) {
this.transformer = transformer;
}
/**
* transform the shape before letting the delegate draw it
*/
public void draw(Shape s) {
Shape shape = ((ShapeTransformer)transformer).transform(s);
delegate.draw(shape);
}
public void draw(Shape s, float flatness) {
Shape shape = null;
if(transformer instanceof ShapeFlatnessTransformer) {
shape = ((ShapeFlatnessTransformer)transformer).transform(s, flatness);
} else {
shape = ((ShapeTransformer)transformer).transform(s);
}
delegate.draw(shape);
}
/**
* transform the shape before letting the delegate fill it
*/
public void fill(Shape s) {
Shape shape = ((ShapeTransformer)transformer).transform(s);
delegate.fill(shape);
}
public void fill(Shape s, float flatness) {
Shape shape = null;
if(transformer instanceof ShapeFlatnessTransformer) {
shape = ((ShapeFlatnessTransformer)transformer).transform(s, flatness);
} else {
shape = ((ShapeTransformer)transformer).transform(s);
}
delegate.fill(shape);
}
public boolean drawImage(Image img, int x, int y, ImageObserver observer) {
Image image = null;
if(transformer instanceof ShapeFlatnessTransformer) {
Rectangle2D r = new Rectangle2D.Double(x,y,img.getWidth(observer),img.getHeight(observer));
Rectangle2D s = ((ShapeTransformer)transformer).transform(r).getBounds2D();
image = img.getScaledInstance((int)s.getWidth(), (int)s.getHeight(), Image.SCALE_SMOOTH);
x = (int) s.getMinX();
y = (int) s.getMinY();
} else {
image = img;
}
return delegate.drawImage(image, x, y, observer);
}
public boolean drawImage(Image img, AffineTransform at, ImageObserver observer) {
Image image = null;
int x = (int)at.getTranslateX();
int y = (int)at.getTranslateY();
if(transformer instanceof ShapeFlatnessTransformer) {
Rectangle2D r = new Rectangle2D.Double(x,y,img.getWidth(observer),img.getHeight(observer));
Rectangle2D s = ((ShapeTransformer)transformer).transform(r).getBounds2D();
image = img.getScaledInstance((int)s.getWidth(), (int)s.getHeight(), Image.SCALE_SMOOTH);
x = (int) s.getMinX();
y = (int) s.getMinY();
at.setToTranslation(s.getMinX(), s.getMinY());
} else {
image = img;
}
return delegate.drawImage(image, at, observer);
}
/**
* transform the shape before letting the delegate apply 'hit'
* with it
*/
public boolean hit(Rectangle rect, Shape s, boolean onStroke) {
Shape shape = ((ShapeTransformer)transformer).transform(s);
return delegate.hit(rect, shape, onStroke);
}
public Graphics create() {
return delegate.create();
}
public void dispose() {
delegate.dispose();
}
}