com.hfg.graphics.TextUtil Maven / Gradle / Ivy
Go to download
Show more of this group Show more artifacts with this name
Show all versions of com_hfg Show documentation
Show all versions of com_hfg Show documentation
com.hfg xml, html, svg, and bioinformatics utility library
package com.hfg.graphics;
import java.awt.Font;
import java.awt.Rectangle;
import java.awt.font.FontRenderContext;
import java.awt.geom.Rectangle2D;
import java.awt.geom.AffineTransform;
import com.hfg.graphics.units.DisplayPPI;
//------------------------------------------------------------------------------
/**
* Text utility functions.
*
* @author J. Alex Taylor, hairyfatguy.com
*
*/
//------------------------------------------------------------------------------
// com.hfg XML/HTML Coding Library
//
// This library is free software; you can redistribute it and/or
// modify it under the terms of the GNU Lesser General Public
// License as published by the Free Software Foundation; either
// version 2.1 of the License, or (at your option) any later version.
//
// This library 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.
//
// You should have received a copy of the GNU Lesser General Public
// License along with this library; if not, write to the Free Software
// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
//
// J. Alex Taylor, President, Founder, CEO, COO, CFO, OOPS hairyfatguy.com
// [email protected]
//------------------------------------------------------------------------------
public class TextUtil
{
private static FontRenderContext sFRC = new FontRenderContext(new AffineTransform(), true, true);
private static DisplayPPI sDefaultDisplayPPI = DisplayPPI._96;
//--------------------------------------------------------------------------
/**
Calculate the bounding rectangle for the specified string and font using the default of 96 ppi.
@param inString the text for which to calculate the bounding rectangle
@param inFont the text for which to calculate the bounding rectangle
@return the bounding rectangle for the specified text and font
*/
public static Rectangle getStringRect(String inString, Font inFont)
{
return getStringRect(inString, inFont, sDefaultDisplayPPI);
}
//--------------------------------------------------------------------------
/**
Calculate the bounding rectangle for the specified string and font.
@param inString the text for which to calculate the bounding rectangle
@param inFont the text for which to calculate the bounding rectangle
@return the bounding rectangle for the specified text and font
*/
public static Rectangle getStringRect(String inString, Font inFont, DisplayPPI inPPI)
{
Rectangle2D rect = inFont.getStringBounds(inString, 0, inString.length(), sFRC);
float scalingFactor = (inPPI != null ? inPPI : sDefaultDisplayPPI).intValue() / 72f;
return new Rectangle((int) (rect.getWidth() * scalingFactor), (int) (rect.getHeight() * scalingFactor));
}
//--------------------------------------------------------------------------
/**
Calculate the bounding rectangle for the specified string and font where the bottom of the
rectangle is at the baseline and using the default of 96 ppi. Even strings that don't contain
characters that go below the baseline will still have a descent area included in the bounding
rectangle if the standard getStringRect() is used.
@param inString the text for which to calculate the bounding rectangle
@param inFont the text for which to calculate the bounding rectangle
@return the bounding baselined rectangle for the specified text and font
*/
public static Rectangle getStringBaselineRect(String inString, Font inFont)
{
return getStringBaselineRect(inString, inFont, sDefaultDisplayPPI);
}
//--------------------------------------------------------------------------
/**
Calculate the bounding rectangle for the specified string and font where the bottom of the
rectangle is at the baseline. Even strings that don't contain characters that go below the baseline
will still have a descent area included in the bounding rectangle if the standard getStringRect() is used.
@param inString the text for which to calculate the bounding rectangle
@param inFont the text for which to calculate the bounding rectangle
@param inPPI the pixels per inch of the display device
@return the bounding baselined rectangle for the specified text and font
*/
public static Rectangle getStringBaselineRect(String inString, Font inFont, DisplayPPI inPPI)
{
Rectangle2D rect = inFont.getStringBounds(inString, 0, inString.length(), sFRC);
// Subtract the descent (the portion below the baseline)
float descent = inFont.getLineMetrics(inString, 0, inString.length(), sFRC).getDescent();
float scalingFactor = (inPPI != null ? inPPI : sDefaultDisplayPPI).intValue() / 72f;
return new Rectangle((int) (rect.getWidth() * scalingFactor), (int) ((rect.getHeight() - descent) * scalingFactor));
}
}