/* -*- tab-width: 4 -*-
*
* Electric(tm) VLSI Design System
*
* File: SizeOffset.java
*
* Copyright (c) 2003 Sun Microsystems and Static Free Software
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 3 of the License, or
* (at your option) any later version.
*
* Electric(tm) is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with Electric(tm); see the file COPYING. If not, write to
* the Free Software Foundation, Inc., 59 Temple Place, Suite 330,
* Boston, Mass 02111-1307, USA.
*/
package com.sun.electric.technology;
import com.sun.electric.database.geometry.DBMath;
import java.awt.geom.Rectangle2D;
import java.io.Serializable;
/**
* The SizeOffset object describes the difference between the stored bounds of
* a NodeInst and the displayed/selected bounds.
* <P>
* In Electric, extra space may surround a NodeInst, in order to leave room
* for expansion of the definition. For example, in the MOCMOS technology,
* a metal-1/metal-2 contact is 5x5 (in memory) but when displayed, it is only
* 4x4. The extra space does not scale, meaning that if you stretch the node
* so that it appears to be 10x10, then it will be 11x11 in memory.
* <P>
* The distance from each edge is stored in a SizeOffset object. For the
* Via described above, all four offsets would be 0.5 to indicate a half-unit
* surround between the stored and displayed/selected bounds.
*/
public class SizeOffset implements Serializable
{
/** Offset with all zero distances. */
public static final SizeOffset ZERO_OFFSET = new SizeOffset(0, 0, 0, 0);
private final double lx, hx, ly, hy;
private final int gridLx, gridHx, gridLy, gridHy;
/**
* Constructor to create a SizeOffset from the specified parameters.
* @param lx the low-X offset (distance from left side to actual bounds).
* @param hx the high-X offset (distance from left side to actual bounds).
* @param ly the low-Y offset (distance from bottom side to actual bounds).
* @param hy the high-Y offset (distance from top side to actual bounds).
*/
public SizeOffset(double lx, double hx, double ly, double hy)
{
gridLx = (int)DBMath.lambdaToGrid(lx);
gridHx = (int)DBMath.lambdaToGrid(hx);
gridLy = (int)DBMath.lambdaToGrid(ly);
gridHy = (int)DBMath.lambdaToGrid(hy);
this.lx = DBMath.gridToLambda(gridLx);
this.hx = DBMath.gridToLambda(gridHx);
this.ly = DBMath.gridToLambda(gridLy);
this.hy = DBMath.gridToLambda(gridHy);
}
/**
* Method to return the low-X offset of this SizeOffset.
* The low-X offset is the distance from the left side to the acutal bounds.
* @return the low-X offset of this SizeOffset.
*/
public double getLowXOffset() { return lx; }
/**
* Method to return the high-X offset of this SizeOffset.
* The high-X offset is the distance from the right side to the acutal bounds.
* @return the high-X offset of this SizeOffset.
*/
public double getHighXOffset() { return hx; }
/**
* Method to return the low-Y offset of this SizeOffset.
* The low-Y offset is the distance from the bottom side to the acutal bounds.
* @return the low-Y offset of this SizeOffset.
*/
public double getLowYOffset() { return ly; }
/**
* Method to return the high-Y offset of this SizeOffset.
* The high-Y offset is the distance from the top side to the acutal bounds.
* @return the high-Y offset of this SizeOffset.
*/
public double getHighYOffset() { return hy; }
/**
* Method to return the low-X offset of this SizeOffset in grid units.
* The low-X offset is the distance from the left side to the acutal bounds.
* @return the low-X offset of this SizeOffset.
*/
public long getLowXGridOffset() { return gridLx; }
/**
* Method to return the high-X offset of this SizeOffset in grid units.
* The high-X offset is the distance from the right side to the acutal bounds.
* @return the high-X offset of this SizeOffset.
*/
public long getHighXGridOffset() { return gridHx; }
/**
* Method to return the low-Y offset of this SizeOffset in grid units.
* The low-Y offset is the distance from the bottom side to the acutal bounds.
* @return the low-Y offset of this SizeOffset.
*/
public long getLowYGridOffset() { return gridLy; }
/**
* Method to return the high-Y offset of this SizeOffset in grid units.
* The high-Y offset is the distance from the top side to the acutal bounds.
* @return the high-Y offset of this SizeOffset.
*/
public long getHighYGridOffset() { return gridHy; }
/**
* Returns a printable version of this SizeOffset.
* @return a printable version of this SizeOffset.
*/
public String toString()
{
return "SizeOffset {X:[" + lx + "," + hx + "] Y:[" + ly + "," + hy + "]}";
}
/**
* Returns a Rectangle2D representing bounds modified by
* this size offset. Note here that I use the convention that
* +x is to the left and +y is up, whereas in Java components
* +y is down.
* @param bounds the bounds to be modified
* @return the modified bounds
*/
public Rectangle2D modifyBounds(Rectangle2D bounds)
{
return new Rectangle2D.Double(bounds.getX()+lx, bounds.getY()+ly,
bounds.getWidth()-lx-hx, bounds.getHeight()-ly-hy);
}
}