/*
* This program is free software; you can redistribute it and/or modify it under the
* terms of the GNU Lesser General Public License, version 2.1 as published by the Free Software
* Foundation.
*
* You should have received a copy of the GNU Lesser General Public License along with this
* program; if not, you can obtain a copy at http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html
* or from the Free Software Foundation, Inc.,
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
*
* This program 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 Lesser General Public License for more details.
*
* Copyright (c) 2001 - 2013 Object Refinery Ltd, Pentaho Corporation and Contributors.. All rights reserved.
*/
package org.pentaho.reporting.engine.classic.core.util.geom;
import org.pentaho.reporting.libraries.base.util.FloatDimension;
import java.awt.geom.Dimension2D;
import java.awt.geom.Rectangle2D;
/**
* This class is the heart of the alternative geometrics toolkit. It performs the neccessary conversions from and to the
* AWT classes to the Strict-classes.
*
* @author Thomas Morgner
*/
public strictfp class StrictGeomUtility {
public static final long MAX_AUTO = StrictGeomUtility.toInternalValue( 0x80000000000L );
/**
* This is the correction factor used to convert points into 'Micro-Points'.
*/
private static final double CORRECTION_FACTOR = 100000.0;
/**
* Hidden, non usable constructor.
*/
private StrictGeomUtility() {
}
/**
* Creates a StrictDimension from the given AWT sizes.
*
* @param w
* the width in points (1/72th inch).
* @param h
* the height in points (1/72th inch).
* @return the created dimension object.
*/
public static StrictDimension createDimension( final double w, final double h ) {
return new StrictDimension( toInternalValue( w ), toInternalValue( h ) );
}
/**
* Creates a StrictPoint from the given AWT coordinates.
*
* @param x
* the x coordinate in points (1/72th inch).
* @param y
* the y coordinate in points (1/72th inch).
* @return the created point object.
*/
public static StrictPoint createPoint( final double x, final double y ) {
return new StrictPoint( toInternalValue( x ), toInternalValue( y ) );
}
/**
* Creates a StrictBounds object from the given AWT sizes.
*
* @param x
* the x coordinate in points (1/72th inch).
* @param y
* the y coordinate in points (1/72th inch).
* @param width
* the width in points (1/72th inch).
* @param height
* the height in points (1/72th inch).
* @return the created dimension object.
*/
public static StrictBounds createBounds( final double x, final double y, final double width, final double height ) {
return new StrictBounds( toInternalValue( x ), toInternalValue( y ), toInternalValue( width ),
toInternalValue( height ) );
}
/**
* Creates an AWT-Dimension2D object from the given strict sizes.
*
* @param width
* the width in micro points.
* @param height
* the height in micro points.
* @return the created dimension object.
*/
public static Dimension2D createAWTDimension( final long width, final long height ) {
return new FloatDimension( (float) ( width / CORRECTION_FACTOR ), (float) ( height / CORRECTION_FACTOR ) );
}
/**
* Creates an AWT rectangle object from the given strict sizes.
*
* @param x
* the x coordinate in micro points.
* @param y
* the y coordinate in micro points.
* @param width
* the width in micro points.
* @param height
* the height in micro points.
* @return the created dimension object.
*/
public static Rectangle2D createAWTRectangle( final long x, final long y, final long width, final long height ) {
return new Rectangle2D.Double( x / CORRECTION_FACTOR, y / CORRECTION_FACTOR, width / CORRECTION_FACTOR, height
/ CORRECTION_FACTOR );
}
public static Rectangle2D createAWTRectangle( final StrictBounds bounds ) {
return createAWTRectangle( bounds.getX(), bounds.getY(), bounds.getWidth(), bounds.getHeight() );
}
/**
* Converts the given AWT value into a strict value.
*
* @param value
* the AWT point value.
* @return the internal micro point value.
*/
public static long toInternalValue( final double value ) {
final long rounded = StrictMath.round( value * 10000f );
return StrictMath.round( rounded * CORRECTION_FACTOR / 10000.0 );
}
/**
* Converts the given micro point value into an AWT value.
*
* @param value
* the micro point point value.
* @return the AWT point value.
*/
public static double toExternalValue( final long value ) {
return ( value / CORRECTION_FACTOR );
}
public static double toFontMetricsValue( final long value ) {
return ( value * 1000l / CORRECTION_FACTOR );
}
public static long fromFontMetricsValue( final long value ) {
final double rawValue = value / 1000.0;
return toInternalValue( rawValue );
}
public static long multiply( final long x, final long y ) {
if ( x < y ) {
return (long) ( x * ( y / CORRECTION_FACTOR ) );
}
return (long) ( y * ( x / CORRECTION_FACTOR ) );
}
}