// Copyright 2004, FreeHEP. package org.freehep.postscript; import java.awt.Graphics; import java.awt.Graphics2D; import java.awt.Rectangle; import java.awt.event.ComponentEvent; import java.awt.event.ComponentListener; import java.awt.geom.AffineTransform; import java.awt.image.BufferedImage; import java.util.ArrayList; import java.util.Collection; import java.util.Iterator; /* * @author Mark Donszelmann * @version $Id: PSDevice.java 10178 2006-12-08 09:03:07Z duns $ */ public abstract class PSDevice implements DSCEventListener { private boolean valid = false; private AffineTransform mirror = null; private AffineTransform boundingBox = new AffineTransform(); private AffineTransform pageBoundingBox = null; private AffineTransform transform = new AffineTransform(); private Graphics2D graphics; private Collection/*<ComponentListener>*/ listeners = new ArrayList(); public void addComponentListener(ComponentListener l) { listeners.add(l); } public void removeComponentListener(ComponentListener l) { listeners.remove(l); } protected void fireComponentResizedEvent(ComponentEvent e) { valid = false; mirror = new AffineTransform(1, 0, 0, -1, 0, getHeight()); for (Iterator i=listeners.iterator(); i.hasNext(); ) { ((ComponentListener)i.next()).componentResized(e); } } public void dscCommentFound(DSCEvent event) { if (event.getComment().equals("BoundingBox:")) { Rectangle bb = (Rectangle)event.getArgs(); double s = Math.min(getWidth()/(double)bb.width, getHeight()/(double)bb.height); boundingBox = new AffineTransform(s, 0, 0, s, -bb.x*s, -bb.y*s); pageBoundingBox = null; valid = false; } if (event.getComment().equals("PageBoundingBox:")) { Rectangle bb = (Rectangle)event.getArgs(); double s = Math.min(getWidth()/(double)bb.width, getHeight()/(double)bb.height); pageBoundingBox = new AffineTransform(s, 0, 0, s, -bb.x*s, -bb.y*s); valid = false; } if (event.getComment().equals("Page:")) { pageBoundingBox = null; valid = false; } } public void setTransform(AffineTransform transform) { this.transform = (transform != null) ? transform : new AffineTransform(); valid = false; } public AffineTransform getTransform() { return transform; } public AffineTransform getMirrorTransform() { if (mirror == null) mirror = new AffineTransform(1, 0, 0, -1, 0, getHeight()); return mirror; } public AffineTransform getBoundingBoxTransform() { return (pageBoundingBox != null) ? pageBoundingBox : boundingBox; } // FIXME this method and the next seem clumsy. There must be a way // for deviceGraphics to remain untouched, and to just add new transforms // to graphics, BUT getDeviceGraphics().create() does not seem to work, // presumably because BufferedPanel probably copies a different buffer... public Graphics2D getGraphics() { if (!valid) { graphics = (Graphics2D)getDeviceGraphics(); graphics.setTransform(getDeviceTransform()); graphics.transform(getTransform()); graphics.transform(getMirrorTransform()); graphics.transform(getBoundingBoxTransform()); valid = true; } return graphics; } public void erasePage() { graphics = (Graphics2D)getDeviceGraphics(); graphics.setTransform(getDeviceTransform()); graphics.fillRect(0, 0, (int)getWidth(), (int)getHeight()); valid = false; } public abstract AffineTransform getDeviceTransform(); public abstract Graphics getDeviceGraphics(); public abstract double getWidth(); public abstract double getHeight(); public abstract BufferedImage convertToImage(int width, int height); public abstract void refresh(); }