// Copyright 2002, FreeHEP. package org.freehep.graphicsio.emf.gdi; import com.google.code.appengine.awt.geom.AffineTransform; import java.io.IOException; import org.freehep.graphicsio.emf.EMFConstants; import org.freehep.graphicsio.emf.EMFInputStream; import org.freehep.graphicsio.emf.EMFOutputStream; import org.freehep.graphicsio.emf.EMFTag; import org.freehep.graphicsio.emf.EMFRenderer; /** * ModifyWorldTransform TAG. * * @author Mark Donszelmann * @version $Id: ModifyWorldTransform.java 10377 2007-01-23 15:44:34Z duns $ */ public class ModifyWorldTransform extends EMFTag implements EMFConstants { private AffineTransform transform; private int mode; public ModifyWorldTransform() { super(36, 1); } public ModifyWorldTransform(AffineTransform transform, int mode) { this(); this.transform = transform; this.mode = mode; } public EMFTag read(int tagID, EMFInputStream emf, int len) throws IOException { return new ModifyWorldTransform( emf.readXFORM(), emf.readDWORD()); } public void write(int tagID, EMFOutputStream emf) throws IOException { emf.writeXFORM(transform); emf.writeDWORD(mode); } public String toString() { return super.toString() + "\n transform: " + transform + "\n mode: " + mode; } /** * displays the tag using the renderer * * @param renderer EMFRenderer storing the drawing session data */ public void render(EMFRenderer renderer) { // MWT_IDENTITY Resets the current world transformation by using // the identity matrix. If this mode is specified, the XFORM structure // pointed to by lpXform is ignored. if (mode == EMFConstants.MWT_IDENTITY) { if (renderer.getPath() != null) { renderer.setPathTransform(new AffineTransform()); } else { renderer.resetTransformation(); } } // MWT_LEFTMULTIPLY Multiplies the current transformation by the // data in the XFORM structure. (The data in the XFORM structure becomes // the left multiplicand, and the data for the current transformation // becomes the right multiplicand.) else if (mode == EMFConstants.MWT_LEFTMULTIPLY) { if (renderer.getPath() != null) { renderer.getPathTransform().concatenate(transform); renderer.transform(transform); } else { renderer.transform(transform); } } // MWT_RIGHTMULTIPLY Multiplies the current transformation by the data // in the XFORM structure. (The data in the XFORM structure becomes the // right multiplicand, and the data for the current transformation // becomes the left multiplicand.) else if (mode != EMFConstants.MWT_RIGHTMULTIPLY) { // TODO expected that this should work but it doesn't // doing nothing renders the right emf embedding /* if (renderer.getPath() != null) { AffineTransform transform = new AffineTransform(this.transform); transform.concatenate(renderer.getPathTransform()); renderer.setPathTransform(transform); } else { AffineTransform transform = new AffineTransform(this.transform); transform.concatenate(renderer.getTransform()); renderer.resetTransformation(); renderer.transform(transform); }*/ } // Unknown mode else { logger.warning("unsupport transform mode " + toString()); } } }