/*
 * Copyright (c) 2009, Takeyuki Nagao
 * All rights reserved.
 * 
 * Redistribution and use in source and binary forms, with or
 * without modification, are permitted provided that the
 * following conditions are met:
 * 
 *  * Redistributions of source code must retain the above
 *    copyright notice, this list of conditions and the
 *    following disclaimer.
 *  * Redistributions in binary form must reproduce the above
 *    copyright notice, this list of conditions and the
 *    following disclaimer in the documentation and/or other
 *    materials provided with the distribution.
 *    
 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND
 * CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES,
 * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
 * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
 * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR
 * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
 * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
 * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
 * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
 * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE
 * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY
 * OF SUCH DAMAGE.
 */

package jp.sourceforge.dvibrowser.dvicore.font;

import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.util.Map;

import jp.sourceforge.dvibrowser.dvicore.DviException;
import jp.sourceforge.dvibrowser.dvicore.DviObject;
import jp.sourceforge.dvibrowser.dvicore.api.DviContextSupport;
import jp.sourceforge.dvibrowser.dvicore.api.DviFont;
import jp.sourceforge.dvibrowser.dvicore.api.Glyph;


public abstract class AbstractDynamicPkFont
extends DviObject
implements DviFont
{
  private static final long serialVersionUID = -7653383398207050528L;

  public AbstractDynamicPkFont(DviContextSupport dcs)
  throws DviException
  {
    super(dcs);
  }

  // TODO: make the GlyphCache hierarchical so that we can discard
  // glyphs of the same font simultaneously.
  public Glyph getGlyph(LogicalFont lf, int code)
  throws DviException
  {
    String key = lf.fontSpec().toString()
      + "--" + lf.dviUnit().toString() + "--" + lf.resolution().dpi()
      + "--" + code;
    
    Map<String, Glyph> cache = getDviContext().getGlyphCache();
    Glyph glyph = cache.get(key);
    if (glyph != null) return glyph;

    //System.out.println("generating glyph: lf=" + lf + " code=" + code);
    glyph = generatePkGlyph(lf, code);
    cache.put(key, glyph);

    return glyph;
  }
  
  protected abstract PkGlyph generatePkGlyph(LogicalFont lf, int code)
    throws DviException;

  private void writeObject(ObjectOutputStream s)
  throws IOException
  {
    s.defaultWriteObject();
  }

  private void readObject(ObjectInputStream s)
  throws IOException, ClassNotFoundException
  {
    s.defaultReadObject();
  }
}
