/*
 * $Id: PDFFont.java,v 1.3 2007/08/26 19:00:11 gil1 Exp $
 *
 * $Date: 2007/08/26 19:00:11 $
 *
 * 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 
 */
package pdf;

import java.awt.Font;
import java.io.IOException;
import java.io.OutputStream;
import java.io.Serializable;

/**
 * This class defines a font within a PDF document.
 *
 * @author Peter T Mount,http://www.retep.org.uk/pdf/
 * @author Eric Z. Beard, ericzbeard@hotmail.com
 * @author Gilbert DeLeeuw, gil1@users.sourceforge.net
 * @version $Revision: 1.3 $, $Date: 2007/08/26 19:00:11 $
 */
public class PDFFont extends PDFObject implements Serializable
{

  /*
   * NOTE: The original class is the work of Peter T. Mount, who released it 
   * in the uk.org.retep.pdf package.  It was modified by Eric Z. Beard as 
   * follows: 
   * The package name was changed to gnu.pdf.  
   * The formatting was changed a little bit
   * It is still licensed under the LGPL.
   */
  
  /**
   * The PDF document name of the font
   */
  private String name;
  
  /**
   * The PDF type of the font, usually /Type1
   */
  private String type;
  
  /**
   * The font's real name
   */
  private String font;
  
  /**
   * The name of the equivalent Java font
   */
  private String javaFont;
  
  /** 
   * The PDF Style, ie: BOLD, ITALIC, etc
   */
  private int style;
  
  /**
   * This constructs a default PDFFont. In this case Helvetica
   */
  protected PDFFont() {
    this("/F1","/Type1","Helvetica",Font.PLAIN);
  }
  
  /**
   * Constructs a PDFFont. This will attempt to map the font from a known
   * Java font name to that in PDF, defaulting to Helvetica if not possible.
   *
   * @param name The document name, ie /F1
   * @param type The pdf type, ie /Type1
   * @param font The font name, ie Helvetica
   * @param style The java.awt.Font style, ie: Font.PLAIN
   */
  public PDFFont(String name,String type,String font,int style) {
    super("/Font");
    this.name = name;
    this.type = type;
    this.style = style;
    
    String f = font.toLowerCase();
    
    // default PDF Font name
//    this.font = base14[0][1];
//    this.javaFont = base14[0][0];
    this.font = font;
    this.javaFont = "/" + font;
    
    // attempt to translate the font name from Java to PDF
    for(int i=0;i<base14.length;i++) {
      if(base14[i][0].equals(f)) {
        this.javaFont = base14[i][0];
        this.font =  base14[i][1+style];
        //System.out.println("Setting a font style to: " + this.font);
        break;
      }
    }
  }
  
  /**
   * This is the most common method to use.
   * @return the Font name within the PDF document.
   */
  public String getName() {
    return name;
  }
  
  /**
   * @return the Font's PDF type
   */
  public String getType() {
    return type;
  }
  
  /**
   * @return The PDF Font name
   */
  public String getFont() {
    return font;
  }
  
  /**
   * @return the font style.
   * @see java.awt.Font
   */
  public int getStyle() {
    return style;
  }
  
  /**
   * @param os OutputStream to send the object to
   * @exception IOException on error
   */
  public void write(OutputStream os) throws IOException {
    // Write the object header
    writeStart(os);
    
    // now the objects body
    os.write("/Subtype ".getBytes());
    os.write(type.getBytes());
    os.write("\n/Name ".getBytes());
    os.write(name.getBytes());
    os.write("\n/BaseFont ".getBytes());
    os.write(font.getBytes());
    // The performance problem in Bug#106693 comments out the
    // encoding line, and removes the /WinAnsiEncoding. I'm going
    // to leave them in, as the Encoding fixes another problem.
    os.write("\n/Encoding ".getBytes());
    os.write("/WinAnsiEncoding".getBytes());
    //os.write(encoding.getBytes());
    os.write("\n".getBytes());
    
    // finish off with its footer
    writeEnd(os);
  }
  
  /**
   * This is used by the PDF and PDFPage classes to compare font names
   *
   * @param type The pdf type, ie /Type1
   * @param font The font name, ie Helvetica
   * @param style The java.awt.Font style, ie: Font.PLAIN
   * @return true if this object is identical to this font's spec
   */
  protected boolean equals(String type,String font,int style) {
    return this.type.equals(type)
      && (this.font.equalsIgnoreCase(font)
          || this.javaFont.equalsIgnoreCase(font));
    // new styles not being picked up - ezb june 6 2001
    // || this.javaFont.equalsIgnoreCase(font));
    
    // Removed in fix for Bug#106693
    //why? - ezb - can't find bug in bug tracker
    //&& this.style==style;
  }
  
  /**
   * This maps the standard JDK1.1 font names and styles to
   * the base 14 PDF fonts
   */
  private static String[][] base14 = {
	// java name    
		// NORMAL          
		// BOLD            
		// ITALIC                  
		// BOLD+ITALIC
		{
			"arial",
			"/Helvetica",
			"/Helvetica-Bold",
			"/Helvetica-Oblique",
			"/Helvetica-BoldOblique" },
		{
			"sansserif",
			"/Helvetica",
			"/Helvetica-Bold",
			"/Helvetica-Oblique",
			"/Helvetica-BoldOblique" },
		{
			"monospaced",
			"/Courier",
			"/Courier-Bold",
			"/Courier-Oblique",
			"/Courier-BoldOblique" },
		{
			"timesroman",
			"/Times-Roman",
			"/Times-Bold",
			"/Times-Italic",
			"/Times-BoldItalic" },
		{
			"courier",
			"/Courier",
			"/Courier-Bold",
			"/Courier-Oblique",
			"/Courier-BoldOblique" },
		{
			"helvetica",
			"/Helvetica",
			"/Helvetica-Bold",
			"/Helvetica-Oblique",
			"/Helvetica-BoldOblique" },
		{
			"dialog",
			"/Courier",
			"/Courier-Bold",
			"/Courier-Oblique",
			"/Courier-BoldOblique" },
		{
			"dialoginput",
			"/Courier",
			"/Courier-Bold",
			"/Courier-Oblique",
			"/Courier-BoldOblique" }, };
  
}

