/*
 * Copyright (c) 1998-2008 Caucho Technology -- all rights reserved
 *
 * This file is part of Resin(R) Open Source
 *
 * Each copy or derived work must preserve the copyright notice and this
 * notice unmodified.
 *
 * Resin Open Source 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 of the License, or
 * (at your option) any later version.
 *
 * Resin Open Source 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, or any warranty
 * of NON-INFRINGEMENT.  See the GNU General Public License for more
 * details.
 *
 * You should have received a copy of the GNU General Public License
 * along with Resin Open Source; if not, write to the
 *
 *   Free Software Foundation, Inc.
 *   59 Temple Place, Suite 330
 *   Boston, MA 02111-1307  USA
 *
 * @author Scott Ferguson
 */

package com.caucho.quercus.lib.pdf;

/**
 * font
 */
public class Font {
  private String _fontName;
  private String _weight;

  private double _llxBBox;
  private double _llyBBox;
  private double _urxBBox;
  private double _uryBBox;

  private double _capHeight;
  private double _xHeight;
  private double _ascender;
  private double _descender;

  private double _underlinePosition;
  private double _underlineThickness;
  private double _italicAngle;

  private FontChar []_chars = new FontChar[256];

  public String getFontName()
  {
    return _fontName;
  }

  void setFontName(String name)
  {
    _fontName = name;
  }

  public String getWeight()
  {
    return _weight;
  }

  void setWeight(String weight)
  {
    _weight = weight;
  }

  void setBBox(double llx, double lly, double urx, double ury)
  {
    _llxBBox = llx;
    _llyBBox = lly;
    _urxBBox = urx;
    _uryBBox = ury;
  }

  public double getCapHeight()
  {
    return _capHeight;
  }

  void setCapHeight(double height)
  {
    _capHeight = height;
  }

  public double getXHeight()
  {
    return _xHeight;
  }

  void setXHeight(double height)
  {
    _xHeight = height;
  }

  public double getAscender()
  {
    return _ascender;
  }

  void setAscender(double ascender)
  {
    _ascender = ascender;
  }

  public double getDescender()
  {
    return _descender;
  }

  void setDescender(double descender)
  {
    _descender = descender;
  }

  public double getUnderlinePosition()
  {
    return _underlinePosition;
  }

  void setUnderlinePosition(double underlinePosition)
  {
    _underlinePosition = underlinePosition;
  }

  public double getUnderlineThickness()
  {
    return _underlineThickness;
  }

  void setUnderlineThickness(double underlineThickness)
  {
    _underlineThickness = underlineThickness;
  }

  public double getItalicAngle()
  {
    return _italicAngle;
  }

  void setItalicAngle(double italicAngle)
  {
    _italicAngle = italicAngle;
  }

  void addChar(FontChar fontChar)
  {
    int code = fontChar.getCode();

    if (code >= 0 && code < _chars.length)
      _chars[code] = fontChar;
  }

  public double stringWidth(String text)
  {
    double width = 0;

    int len = text.length();
    char prevChar = 0;

    for (int i = 0; i < len; i++) {
      char ch = text.charAt(i);

      if (ch >= 256)
        continue;

      FontChar fontChar = _chars[ch];

      if (fontChar == null)
        continue;

      width += fontChar.getWidth();

      // XXX: kerning

      prevChar = ch;
    }

    return width;
  }
}
