/* FontMetrics.java -- Information about about a fonts display characteristics
   Copyright (C) 1999, 2002 Free Software Foundation, Inc.

This file is part of GNU Classpath.

GNU Classpath 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 2, or (at your option)
any later version.

GNU Classpath 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 GNU Classpath; see the file COPYING.  If not, write to the
Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
02111-1307 USA.

Linking this library statically or dynamically with other modules is
making a combined work based on this library.  Thus, the terms and
conditions of the GNU General Public License cover the whole
combination.

As a special exception, the copyright holders of this library give you
permission to link this library with independent modules to produce an
executable, regardless of the license terms of these independent
modules, and to copy and distribute the resulting executable under
terms of your choice, provided that you also meet, for each linked
independent module, the terms and conditions of the license of that
module.  An independent module is a module which is not derived from
or based on this library.  If you modify this library, you may extend
this exception to your version of the library, but you are not
obligated to do so.  If you do not wish to do so, delete this
exception statement from your version. */


package java.awt;

import java.awt.font.FontRenderContext;
import java.awt.font.LineMetrics;
import java.text.CharacterIterator;

// FIXME: I leave many methods basically unimplemented.  This
// should be reviewed.

/**
  * This class returns information about the display characteristics of
  * a font.  It is abstract, and concrete subclasses should implement at
  * least the following methods:
  * <p>
  * <ul>
  * <li>getAscent()</li>
  * <li>getDescent()</li>
  * <li>getLeading()</li>
  * <li>getMaxAdvance()</li>
  * <li>charWidth(char)</li>
  * <li>charsWidth(char[], int, int)</li>
  * </ul>
  *
  * @author Aaron M. Renn (arenn@urbanophile.com)
  */
public abstract class FontMetrics implements java.io.Serializable
{

/*
 * Static Variables
 */

// Serialization constant
private static final long serialVersionUID = 1681126225205050147L;

/*************************************************************************/

/*
 * Instance Variables
 */

/**
  * This is the font for which metrics will be returned.
  */
protected Font font;

/*************************************************************************/

/*
 * Constructors
 */

/**
  * Initializes a new instance of <code>FontMetrics</code> for the
  * specified font.
  *
  * @param font The font to return metric information for.
  */
protected
FontMetrics(Font font)
{
  this.font = font;
}

/*************************************************************************/

/*
 * Instance Methods
 */

/**
  * Returns the font that this object is creating metric information fo.
  *
  * @return The font for this object.
  */
public Font
getFont()
{
  return(font);
}

/*************************************************************************/

/**
  * Returns the leading, or spacing between lines, for this font.
  *
  * @return The font leading.
  */
public int
getLeading()
{
  return(0);
}

/*************************************************************************/

/**
  * Returns the ascent of the font, which is the distance from the base
  * to the top of the majority of characters in the set.  Some characters
  * can exceed this value however.
  *
  * @return The font ascent.
  */
public int
getAscent()
{
  return(1);
}

/*************************************************************************/

/**
  * Returns the descent of the font, which is the distance from the base
  * to the bottom of the majority of characters in the set.  Some characters
  * can exceed this value however.
  *
  * @return The font descent.
  */
public int
getDescent()
{
  return(1);
}

/*************************************************************************/

/**
  * Returns the height of a line in this font.  This will be the sum
  * of the leading, the ascent, and the descent.
  *
  * @return The height of the font.
  */
public int
getHeight()
{
  return(getAscent() + getDescent() + getLeading());
}

/*************************************************************************/

/**
  * Returns the maximum ascent value.  This is the maximum distance any
  * character in the font rised above the baseline.
  *
  * @return The maximum ascent for this font.
  */
public int
getMaxAscent()
{
  return(getAscent());
}

/*************************************************************************/

/**
  * Returns the maximum descent value.  This is the maximum distance any
  * character in the font extends below the baseline.
  *
  * @return The maximum descent for this font.
  */
public int
getMaxDescent()
{
  return getMaxDecent ();
}

/*************************************************************************/

/**
  * Returns the maximum descent value.  This is the maximum distance any
  * character in the font extends below the baseline.
  *
  * @return The maximum descent for this font.
  *
  * @deprecated This method is deprecated in favor of
  * <code>getMaxDescent()</code>.
  */
public int
getMaxDecent()
{
  return getDescent ();
}

/*************************************************************************/

/**
  * Returns the width of the widest character in the font.
  *
  * @return The width of the widest character in the font.
  */
public int
getMaxAdvance()
{
  return(-1);
}

/*************************************************************************/

/**
  * Returns the width of the specified character.
  *
  * @param ch The character to return the width of.
  *
  * @return The width of the specified character.
  */
public int
charWidth(int ch)
{
  return(charWidth((char)ch));
}

/*************************************************************************/

/**
  * Returns the width of the specified character.
  *
  * @param ch The character to return the width of.
  *
  * @return The width of the specified character.
  */
public int
charWidth(char ch)
{
  return(1);
}

/*************************************************************************/

/**
  * Returns the total width of the specified string
  *
  * @param str The string to return the width of.
  *
  * @return The width of the string.
  */
public int
stringWidth(String str)
{
  char[] buf = new char[str.length()];
  str.getChars(0, str.length(), buf, 0);

  return(charsWidth(buf, 0, buf.length));
}

/*************************************************************************/

/**
  * Returns the total width of the specified character array.
  *
  * @param buf The character array containing the data.
  * @param offset The offset into the array to start calculating from.
  * @param len The total number of bytes to process.
  *
  * @return The width of the requested characters.
  */
public int
charsWidth(char buf[], int offset, int len)
{
  int total_width = 0;
  for (int i = offset; i < len; i++)
    total_width += charWidth(buf[i]);
  return(total_width);
}

/*************************************************************************/

/**
  * Returns the total width of the specified byte array.
  *
  * @param buf The byte array containing the data.
  * @param offset The offset into the array to start calculating from.
  * @param len The total number of bytes to process.
  *
  * @return The width of the requested characters.
  */
public int
bytesWidth(byte buf[], int offset, int len)
{
  int total_width = 0;
  for (int i = offset; i < len; i++)
    total_width = charWidth((char)buf[i]);

  return(total_width);
}

/*************************************************************************/

/**
  * Returns the widths of the first 256 characters in the font.
  *
  * @return The widths of the first 256 characters in the font.
  */
public int[]
getWidths()
{
  int [] result = new int[256];
  for(char i = 0; i < 256; i++)
  {
    result[i]= charWidth(i);
  }
  return(result);
}

/*************************************************************************/

/**
  * Returns a string representation of this object.
  *
  * @return A string representation of this object.
  */
public String
toString()
{
  return (this.getClass() + "[font=" + font + ",ascent=" + getAscent() 
	  + ",descent=" + getDescent() + ",height=" + getHeight() + "]");
}


// Generic FontRenderContext used when getLineMetrics is called with a
// plain Graphics object.
private static final FontRenderContext gRC = new FontRenderContext(null,
								   false,
								   false);

/**
  * Returns a {@link LineMetrics} object constructed with the
  * specified text and the {@link FontRenderContext} of the Graphics
  * object when it is an instance of Graphics2D or a generic
  * FontRenderContext with a null transform, not anti-aliased and not
  * using fractional metrics.
  *
  * @param text The string to calculate metrics from.
  * @param g The Graphics object that will be used.
  *
  * @return A new {@link LineMetrics} object.
  */
public LineMetrics getLineMetrics(String text, Graphics g)
{
  return getLineMetrics(text, 0, text.length(), g);
}

/**
 * Returns a {@link LineMetrics} object constructed with the
 * specified text and the {@link FontRenderContext} of the Graphics
 * object when it is an instance of Graphics2D or a generic
 * FontRenderContext with a null transform, not anti-aliased and not
 * using fractional metrics.
 *
 * @param text The string to calculate metrics from.
 * @param begin Index of first character in <code>text</code> to measure.
 * @param limit Index of last character in <code>text</code> to measure.
 * @param g The Graphics object that will be used.
 *
 * @return A new {@link LineMetrics} object.
 *
 * @throws IndexOutOfBoundsException if the range [begin, limit] is
 * invalid in <code>text</code>.
 */
public LineMetrics getLineMetrics(String text, int begin, 
				  int limit, Graphics g)
{
  FontRenderContext rc;
  if (g instanceof Graphics2D)
    rc = ((Graphics2D) g).getFontRenderContext();
  else
    rc = gRC;
  return font.getLineMetrics(text, begin, limit, rc);
}

/**
 * Returns a {@link LineMetrics} object constructed with the
 * specified text and the {@link FontRenderContext} of the Graphics
 * object when it is an instance of Graphics2D or a generic
 * FontRenderContext with a null transform, not anti-aliased and not
 * using fractional metrics.
 *
 * @param chars The string to calculate metrics from.
 * @param begin Index of first character in <code>text</code> to measure.
 * @param limit Index of last character in <code>text</code> to measure.
 * @param g The Graphics object that will be used.
 *
 * @return A new {@link LineMetrics} object.
 *
 * @throws IndexOutOfBoundsException if the range [begin, limit] is
 * invalid in <code>text</code>.
 */
public LineMetrics getLineMetrics(char[] chars, int begin, 
				  int limit, Graphics g)
{
  FontRenderContext rc;
  if (g instanceof Graphics2D)
    rc = ((Graphics2D) g).getFontRenderContext();
  else
    rc = gRC;
  return font.getLineMetrics(chars, begin, limit, rc);
}

/**
 * Returns a {@link LineMetrics} object constructed with the
 * specified text and the {@link FontRenderContext} of the Graphics
 * object when it is an instance of Graphics2D or a generic
 * FontRenderContext with a null transform, not anti-aliased and not
 * using fractional metrics.
 *
 * @param ci An iterator over the string to calculate metrics from.
 * @param begin Index of first character in <code>text</code> to measure.
 * @param limit Index of last character in <code>text</code> to measure.
 * @param g The Graphics object that will be used.
 *
 * @return A new {@link LineMetrics} object.
 *
 * @throws IndexOutOfBoundsException if the range [begin, limit] is
 * invalid in <code>text</code>.
 */
public LineMetrics getLineMetrics(CharacterIterator ci, int begin, 
				  int limit, Graphics g)
{
  FontRenderContext rc;
  if (g instanceof Graphics2D)
    rc = ((Graphics2D) g).getFontRenderContext();
  else
    rc = gRC;
  return font.getLineMetrics(ci, begin, limit, rc);
}
}
