Package org.pentaho.reporting.engine.classic.core.testsupport.font

Source Code of org.pentaho.reporting.engine.classic.core.testsupport.font.LocalFontMetricsBase

/*!
* 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) 2002-2013 Pentaho Corporation..  All rights reserved.
*/

package org.pentaho.reporting.engine.classic.core.testsupport.font;

import java.io.Serializable;
import java.util.HashMap;

import org.pentaho.reporting.libraries.fonts.registry.BaselineInfo;

public class LocalFontMetricsBase implements Serializable
{
  private static class KerningKey implements Serializable
  {
    private int prev;
    private int codepoint;

    private KerningKey(final int prev, final int codepoint)
    {
      this.prev = prev;
      this.codepoint = codepoint;
    }

    public boolean equals(final Object o)
    {
      if (this == o)
      {
        return true;
      }
      if (o == null || getClass() != o.getClass())
      {
        return false;
      }

      final KerningKey that = (KerningKey) o;

      if (codepoint != that.codepoint)
      {
        return false;
      }
      if (prev != that.prev)
      {
        return false;
      }

      return true;
    }

    public int hashCode()
    {
      int result = prev;
      result = 31 * result + codepoint;
      return result;
    }
  }

  private int[] charWidth;
  private HashMap<KerningKey, Integer> kerningMap;

  private long ascent;
  private long descent;
  private long leading;
  private long xheight;
  private long overlinePosition;
  private long underlinePosition;
  private long strikethroughPosition;
  private long maxAscent;
  private long maxDescent;
  private long maxHeight;
  private long maxCharAdvance;
  private long italicAngle;
  private boolean uniformFontMetrics;

  public LocalFontMetricsBase()
  {
    charWidth = new int[65535];
    kerningMap = new HashMap<KerningKey, Integer>();
  }

  public long getAscent()
  {
    return ascent;
  }

  public void setAscent(final long ascent)
  {
    this.ascent = ascent;
  }

  public long getDescent()
  {
    return descent;
  }

  public void setDescent(final long descent)
  {
    this.descent = descent;
  }

  public long getLeading()
  {
    return leading;
  }

  public void setLeading(final long leading)
  {
    this.leading = leading;
  }

  public long getXHeight()
  {
    return xheight;
  }

  public void setXHeight(final long xheight)
  {
    this.xheight = xheight;
  }

  public long getOverlinePosition()
  {
    return overlinePosition;
  }

  public void setOverlinePosition(final long overlinePosition)
  {
    this.overlinePosition = overlinePosition;
  }

  public long getUnderlinePosition()
  {
    return underlinePosition;
  }

  public void setUnderlinePosition(final long underlinePosition)
  {
    this.underlinePosition = underlinePosition;
  }

  public long getStrikeThroughPosition()
  {
    return strikethroughPosition;
  }

  public void setStrikeThroughPosition(final long strikethroughPosition)
  {
    this.strikethroughPosition = strikethroughPosition;
  }

  public long getMaxAscent()
  {
    return maxAscent;
  }

  public void setMaxAscent(final long maxAscent)
  {
    this.maxAscent = maxAscent;
  }

  public long getMaxDescent()
  {
    return maxDescent;
  }

  public void setMaxDescent(final long maxDescent)
  {
    this.maxDescent = maxDescent;
  }

  public long getMaxHeight()
  {
    return maxHeight;
  }

  public void setMaxHeight(final long maxHeight)
  {
    this.maxHeight = maxHeight;
  }

  public long getMaxCharAdvance()
  {
    return maxCharAdvance;
  }

  public void setMaxCharAdvance(final long maxCharAdvance)
  {
    this.maxCharAdvance = maxCharAdvance;
  }

  public long getItalicAngle()
  {
    return italicAngle;
  }

  public void setItalicAngle(final long italicAngle)
  {
    this.italicAngle = italicAngle;
  }

  public boolean isUniformFontMetrics()
  {
    return uniformFontMetrics;
  }

  public void setUniformFontMetrics(final boolean uniformFontMetrics)
  {
    this.uniformFontMetrics = uniformFontMetrics;
  }

  public long getCharWidth(final int codePoint)
  {
    if (codePoint < 0 || codePoint >= charWidth.length)
    {
      throw new IndexOutOfBoundsException("Code-point '" + codePoint + "' is greater than maximum of " + charWidth.length);
    }
    return charWidth[codePoint];
  }

  public long getKerning(final int previous, final int codePoint)
  {
    final Integer o = kerningMap.get(new KerningKey(previous, codePoint));
    if (o == null)
    {
      return 0;
    }
    return o.longValue();
  }

  public BaselineInfo getBaselines(final int codePoint, BaselineInfo info)
  {
    if (info == null)
    {
      info = new BaselineInfo();
    }

    // If we had more data, we could surely create something better. Well, this has to be enough ..
    final long maxAscent = getMaxAscent();
    info.setBaseline(BaselineInfo.MATHEMATICAL, maxAscent - getXHeight());
    info.setBaseline(BaselineInfo.IDEOGRAPHIC, getMaxHeight());
    info.setBaseline(BaselineInfo.MIDDLE, maxAscent / 2);
    info.setBaseline(BaselineInfo.ALPHABETIC, maxAscent);
    info.setBaseline(BaselineInfo.CENTRAL, maxAscent / 2);
    info.setBaseline(BaselineInfo.HANGING, maxAscent - getXHeight());
    info.setDominantBaseline(BaselineInfo.ALPHABETIC);

    final BaselineInfo cached = new BaselineInfo();
    cached.update(info);
    return info;
  }

  public void setCharWidth(final int codepoint, final int value)
  {
    charWidth[codepoint] = value;
  }

  public void setKerning(final int codepoint, final int prev, final int value)
  {
    kerningMap.put(new KerningKey(prev, codepoint), value);
  }
}
TOP

Related Classes of org.pentaho.reporting.engine.classic.core.testsupport.font.LocalFontMetricsBase

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.