All Downloads are FREE. Search and download functionalities are using the official Maven repository.

com.hfg.graphics.TextUtil Maven / Gradle / Ivy

There is a newer version: 20240423
Show newest version
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)); } }




© 2015 - 2024 Weber Informatics LLC | Privacy Policy