blob: f563059c32684a9d7b5504b94c8a6270447a5cfa [file] [log] [blame]
/*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF licenses this file to You under the Apache License, Version 2.0
* (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
/* $Id$ */
package org.apache.fop.fonts.type1;
import java.io.EOFException;
import java.io.IOException;
import java.io.InputStream;
import java.io.DataInputStream;
import java.io.InputStreamReader;
/**
* This is a helper class for reading PFM files. It defines functions for
* extracting specific values out of the stream.
*/
public class PFMInputStream extends java.io.FilterInputStream {
private final DataInputStream datain;
/**
* Constructs a PFMInputStream based on an InputStream representing the
* PFM file.
*
* @param in The stream from which to read the PFM file
*/
public PFMInputStream(InputStream in) {
super(in);
datain = new DataInputStream(in);
}
/**
* Parses a one byte value out of the stream.
*
* @return The value extracted
* @throws IOException In case of an I/O problem
*/
public short readByte() throws IOException {
short s = datain.readByte();
// Now, we've got to trick Java into forgetting the sign
int s1 = (((s & 0xF0) >>> 4) << 4) + (s & 0x0F);
return (short)s1;
}
/**
* Parses a two byte value out of the stream.
*
* @return The value extracted
* @throws IOException In case of an I/O problem
*/
public int readShort() throws IOException {
int i = datain.readShort();
// Change byte order
int high = (i & 0xFF00) >>> 8;
int low = (i & 0x00FF) << 8;
return low + high;
}
/**
* Parses a four byte value out of the stream.
*
* @return The value extracted
* @throws IOException In case of an I/O problem
*/
public long readInt() throws IOException {
int i = datain.readInt();
// Change byte order
int i1 = (i & 0xFF000000) >>> 24;
int i2 = (i & 0x00FF0000) >>> 8;
int i3 = (i & 0x0000FF00) << 8;
int i4 = (i & 0x000000FF) << 24;
return i1 + i2 + i3 + i4;
}
/**
* Parses a zero-terminated string out of the stream.
*
* @return The value extracted
* @throws IOException In case of an I/O problem
*/
public String readString() throws IOException {
InputStreamReader reader = new InputStreamReader(in, "ISO-8859-1");
StringBuffer buf = new StringBuffer();
int ch = reader.read();
while (ch > 0) {
buf.append((char)ch);
ch = reader.read();
}
if (ch == -1) {
throw new EOFException("Unexpected end of stream reached");
}
return buf.toString();
}
}