aboutsummaryrefslogtreecommitdiffstats
path: root/src/org/apache/fop/fonts/PFMFile.java
diff options
context:
space:
mode:
Diffstat (limited to 'src/org/apache/fop/fonts/PFMFile.java')
-rw-r--r--src/org/apache/fop/fonts/PFMFile.java407
1 files changed, 0 insertions, 407 deletions
diff --git a/src/org/apache/fop/fonts/PFMFile.java b/src/org/apache/fop/fonts/PFMFile.java
deleted file mode 100644
index 9dce84478..000000000
--- a/src/org/apache/fop/fonts/PFMFile.java
+++ /dev/null
@@ -1,407 +0,0 @@
-/*
- * $Id$
- * Copyright (C) 2001 The Apache Software Foundation. All rights reserved.
- * For details on use and redistribution please refer to the
- * LICENSE file included with these sources.
- */
-
-package org.apache.fop.fonts;
-
-import java.io.*;
-import java.util.HashMap;
-
-/**
- * This class represents a PFM file (or parts of it) as a Java object.
- *
- * @author jeremias.maerki@outline.ch
- */
-public class PFMFile {
-
- // Header stuff
- private String windowsName;
- private String postscriptName;
- private short dfItalic;
- private int dfWeight;
- private short dfCharSet;
- private short dfPitchAndFamily;
- private int dfAvgWidth;
- private int dfMaxWidth;
- private int dfMinWidth;
- private short dfFirstChar;
- private short dfLastChar;
-
- // Extension stuff
- // ---
-
- // Extend Text Metrics
- private int etmCapHeight;
- private int etmXHeight;
- private int etmLowerCaseAscent;
- private int etmLowerCaseDescent;
-
- // Extent table
- private int[] extentTable;
-
- private HashMap kerningTab;
- public PFMFile() {
- kerningTab = new HashMap();
- }
-
- /**
- * Parses a PFM file
- *
- * @param inStream The stream from which to read the PFM file.
- */
- public void load(InputStream inStream) throws IOException {
- InputStream bufin = new BufferedInputStream(inStream, 1024);
- bufin.mark(1024);
- PFMInputStream in = new PFMInputStream(bufin);
- int version = in.readShort();
- long filesize = in.readInt();
- bufin.reset();
-
- byte[] buf = new byte[(int)filesize];
- bufin.read(buf, 0, (int)filesize);
-
- bufin = new ByteArrayInputStream(buf);
- in = new PFMInputStream(bufin);
- loadHeader(in);
- loadExtension(in);
- }
-
- /**
- * Parses the header of the PFM file.
- *
- * @param inStream The stream from which to read the PFM file.
- */
- private void loadHeader(PFMInputStream inStream) throws IOException {
- inStream.skip(80);
- dfItalic = inStream.readByte();
- inStream.skip(2);
- dfWeight = inStream.readShort();
- dfCharSet = inStream.readByte();
- inStream.skip(4);
- dfPitchAndFamily = inStream.readByte();
- dfAvgWidth = inStream.readShort();
- dfMaxWidth = inStream.readShort();
- dfFirstChar = inStream.readByte();
- dfLastChar = inStream.readByte();
- inStream.skip(8);
- long faceOffset = inStream.readInt();
-
- inStream.reset();
- inStream.skip(faceOffset);
- windowsName = inStream.readString();
-
- inStream.reset();
- inStream.skip(117);
- }
-
- /**
- * Parses the extension part of the PFM file.
- *
- * @param inStream The stream from which to read the PFM file.
- */
- private void loadExtension(PFMInputStream inStream) throws IOException {
- int size = inStream.readShort();
- long extMetricsOffset = inStream.readInt();
- long extentTableOffset = inStream.readInt();
- inStream.skip(4);
- long kernPairOffset = inStream.readInt();
- long kernTrackOffset = inStream.readInt();
- long driverInfoOffset = inStream.readInt();
-
- if (kernPairOffset > 0) {
- inStream.reset();
- inStream.skip(kernPairOffset);
- loadKernPairs(inStream);
- }
-
- inStream.reset();
- inStream.skip(driverInfoOffset);
- postscriptName = inStream.readString();
-
- if (extMetricsOffset != 0) {
- inStream.reset();
- inStream.skip(extMetricsOffset);
- loadExtMetrics(inStream);
- }
- if (extentTableOffset != 0) {
- inStream.reset();
- inStream.skip(extentTableOffset);
- loadExtentTable(inStream);
- }
-
- }
-
- /**
- * Parses the kernPairs part of the pfm file
- *
- * @param inStream The stream from which to read the PFM file.
- */
- private void loadKernPairs(PFMInputStream inStream) throws IOException {
- int i = inStream.readShort();
-
-
- System.out.println(i + " kerning pairs");
- while (i > 0) {
- int g1 = (int)inStream.readByte();
- i--;
- // System.out.print ("Char no: ("+g1+", ");
-
- int g2 = (int)inStream.readByte();
- // System.out.print (g2+") kern");
-
- int adj = inStream.readShort();
- if (adj > 0x8000)
- adj = -(0x10000 - adj);
- // System.out.println (": " + adj);
-
- String glyph1 = Glyphs.tex8r[g1];
- String glyph2 = Glyphs.tex8r[g2];
-
- HashMap adjTab = (HashMap)kerningTab.get(new Integer(g1));
- if (adjTab == null)
- adjTab = new HashMap();
- adjTab.put(new Integer(g2), new Integer(adj));
- kerningTab.put(new Integer(g1), adjTab);
- }
- }
-
- /**
- * Parses the extended metrics part of the PFM file.
- *
- * @param inStream The stream from which to read the PFM file.
- */
- private void loadExtMetrics(PFMInputStream inStream) throws IOException {
- int size = inStream.readShort();
- inStream.skip(12);
- etmCapHeight = inStream.readShort();
- etmXHeight = inStream.readShort();
- etmLowerCaseAscent = inStream.readShort();
- etmLowerCaseDescent = inStream.readShort();
- }
-
- /**
- * Parses the extent table of the PFM file.
- *
- * @param inStream The stream from which to read the PFM file.
- */
- private void loadExtentTable(PFMInputStream inStream) throws IOException {
- extentTable = new int[dfLastChar - dfFirstChar + 1];
- dfMinWidth = dfMaxWidth;
- for (short i = dfFirstChar; i <= dfLastChar; i++) {
- extentTable[i - dfFirstChar] = inStream.readShort();
- if (extentTable[i - dfFirstChar] < dfMinWidth) {
- dfMinWidth = extentTable[i - dfFirstChar];
- }
- }
- }
-
- /**
- * Returns the Windows name of the font.
- *
- * @return The Windows name.
- */
- public String getWindowsName() {
- return windowsName;
- }
-
- /**
- * Return the kerning table. The kerning table is a hastable with
- * strings with glyphnames as keys, containing hashtables as value.
- * The value hashtable contain a glyph name string key and an Integer value
- */
- public HashMap getKerning() {
- return kerningTab;
- }
-
- /**
- * Returns the Postscript name of the font.
- *
- * @return The Postscript name.
- */
- public String getPostscriptName() {
- return postscriptName;
- }
-
- /**
- * Returns the charset used for the font.
- *
- * @return The charset (0=WinAnsi).
- */
- public short getCharSet() {
- return dfCharSet;
- }
-
- /**
- * Returns the charset of the font as a string.
- *
- * @return The name of the charset.
- */
- public String getCharSetName() {
- switch (dfCharSet) {
- case 0:
- return "WinAnsi";
- case 128:
- return "Shift-JIS (Japanese)";
- default:
- return "Unknown";
- }
- }
-
- /**
- * Returns the number of the character that defines
- * the first entry in the widths list.
- *
- * @return The number of the first character.
- */
- public short getFirstChar() {
- return dfFirstChar;
- }
-
- /**
- * Returns the number of the character that defines
- * the last entry in the widths list.
- *
- * @return The number of the last character.
- */
- public short getLastChar() {
- return dfLastChar;
- }
-
- /**
- * Returns the CapHeight parameter for the font (height of uppercase H).
- *
- * @return The CapHeight parameter.
- */
- public int getCapHeight() {
- return etmCapHeight;
- }
-
- /**
- * Returns the XHeight parameter for the font (height of lowercase x).
- *
- * @return The CapHeight parameter.
- */
- public int getXHeight() {
- return etmXHeight;
- }
-
- /**
- * Returns the LowerCaseAscent parameter for the font (height of lowercase d).
- *
- * @return The LowerCaseAscent parameter.
- */
- public int getLowerCaseAscent() {
- return etmLowerCaseAscent;
- }
-
- /**
- * Returns the LowerCaseDescent parameter for the font (height of lowercase p).
- *
- * @return The LowerCaseDescent parameter.
- */
- public int getLowerCaseDescent() {
- return etmLowerCaseDescent;
- }
-
- /**
- * Tells whether the font has proportional character spacing.
- *
- * @return ex. true for Times, false for Courier.
- */
- public boolean getIsProportional() {
- return ((dfPitchAndFamily & 1) == 1);
- }
-
- /**
- * Returns the bounding box for the font.
- * Note: this value is just an approximation,
- * it does not really exist in the PFM file.
- *
- * @return The calculated Font BBox.
- */
- public int[] getFontBBox() {
- int[] bbox = new int[4];
-
- // Just guessing....
- if (!getIsProportional() && (dfAvgWidth == dfMaxWidth)) {
- bbox[0] = -20;
- } else {
- bbox[0] = -100;
- }
- bbox[1] = -(getLowerCaseDescent() + 5);
- bbox[2] = dfMaxWidth + 10;
- bbox[3] = getLowerCaseAscent() + 5;
- return bbox;
- }
-
- /**
- * Returns the characteristics flags for the font as
- * needed for a PDF font descriptor (See PDF specs).
- *
- * @return The characteristics flags.
- */
- public int getFlags() {
- int flags = 0;
- if (!getIsProportional()) {
- flags |= 1;
- }
- if ((dfPitchAndFamily & 16) == 16) {
- flags |= 2;
- }
- if ((dfPitchAndFamily & 64) == 64) {
- flags |= 4;
- }
- if (dfCharSet == 0) {
- flags |= 6;
- }
- if (dfItalic != 0) {
- flags |= 7;
- }
- return flags;
- }
-
- /**
- * Returns the width of the dominant vertical stems of the font.
- * Note: this value is just an approximation,
- * it does not really exist in the PFM file.
- *
- * @return The vertical stem width.
- */
- public int getStemV() {
- // Just guessing....
- if (dfItalic != 0) {
- return (int)Math.round(dfMinWidth * 0.25);
- } else {
- return (int)Math.round(dfMinWidth * 0.6);
- }
- }
-
- /**
- * Returns the italic angle of the font.
- * Note: this value is just an approximation,
- * it does not really exist in the PFM file.
- *
- * @return The italic angle.
- */
- public int getItalicAngle() {
- if (dfItalic != 0) {
- return -16; // Just guessing....
- } else {
- return 0;
- }
- }
-
- /**
- * Returns the width of a character
- *
- * @param which The number of the character for which the width is requested.
- * @return The width of a character.
- */
- public int getCharWidth(short which) {
- return extentTable[which - dfFirstChar];
- }
-
-}