/* * $Id: VdmxTable.java,v 1.1 2007-01-30 05:25:35 davidsch Exp $ * * Typecast - The Font Development Environment * * Copyright (c) 2004-2007 David Schweinsberg * * Licensed 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. */ package jogamp.graph.font.typecast.ot.table; import java.io.DataInput; import java.io.IOException; /** * The Vertical Device Metrics table for TrueType outlines. * @author <a href="mailto:davidsch@dev.java.net">David Schweinsberg</a> * @version $Id: VdmxTable.java,v 1.1 2007-01-30 05:25:35 davidsch Exp $ */ public class VdmxTable implements Table { static class Ratio { private final byte _bCharSet; private final byte _xRatio; private final byte _yStartRatio; private final byte _yEndRatio; protected Ratio(final DataInput di) throws IOException { _bCharSet = di.readByte(); _xRatio = di.readByte(); _yStartRatio = di.readByte(); _yEndRatio = di.readByte(); } public byte getBCharSet() { return _bCharSet; } public byte getXRatio() { return _xRatio; } public byte getYStartRatio() { return _yStartRatio; } public byte getYEndRatio() { return _yEndRatio; } } static class VTableRecord { private final int _yPelHeight; private final short _yMax; private final short _yMin; protected VTableRecord(final DataInput di) throws IOException { _yPelHeight = di.readUnsignedShort(); _yMax = di.readShort(); _yMin = di.readShort(); } public int getYPelHeight() { return _yPelHeight; } public short getYMax() { return _yMax; } public short getYMin() { return _yMin; } } static class Group { private final int _recs; private final int _startsz; private final int _endsz; private final VTableRecord[] _entry; protected Group(final DataInput di) throws IOException { _recs = di.readUnsignedShort(); _startsz = di.readUnsignedByte(); _endsz = di.readUnsignedByte(); _entry = new VTableRecord[_recs]; for (int i = 0; i < _recs; ++i) { _entry[i] = new VTableRecord(di); } } public int getRecs() { return _recs; } public int getStartSZ() { return _startsz; } public int getEndSZ() { return _endsz; } public VTableRecord[] getEntry() { return _entry; } } private final DirectoryEntry _de; private final int _version; private final int _numRecs; private final int _numRatios; private final Ratio[] _ratRange; private final int _offset[]; private final Group[] _groups; /** Creates a new instance of VdmxTable */ protected VdmxTable(final DirectoryEntry de, final DataInput di) throws IOException { _de = (DirectoryEntry) de.clone(); _version = di.readUnsignedShort(); _numRecs = di.readUnsignedShort(); _numRatios = di.readUnsignedShort(); _ratRange = new Ratio[_numRatios]; for (int i = 0; i < _numRatios; ++i) { _ratRange[i] = new Ratio(di); } _offset = new int[_numRatios]; for (int i = 0; i < _numRatios; ++i) { _offset[i] = di.readUnsignedShort(); } _groups = new Group[_numRecs]; for (int i = 0; i < _numRecs; ++i) { _groups[i] = new Group(di); } } @Override public int getType() { return VDMX; } @Override public String toString() { final StringBuilder sb = new StringBuilder(); sb.append("'VDMX' Table - Precomputed Vertical Device Metrics\n") .append("--------------------------------------------------\n") .append(" Version: ").append(_version).append("\n") .append(" Number of Hgt Records: ").append(_numRecs).append("\n") .append(" Number of Ratio Records: ").append(_numRatios).append("\n"); for (int i = 0; i < _numRatios; ++i) { sb.append("\n Ratio Record #").append(i + 1).append("\n") .append("\tCharSetId ").append(_ratRange[i].getBCharSet()).append("\n") .append("\txRatio ").append(_ratRange[i].getXRatio()).append("\n") .append("\tyStartRatio ").append(_ratRange[i].getYStartRatio()).append("\n") .append("\tyEndRatio ").append(_ratRange[i].getYEndRatio()).append("\n") .append("\tRecord Offset ").append(_offset[i]).append("\n"); } sb.append("\n VDMX Height Record Groups\n") .append(" -------------------------\n"); for (int i = 0; i < _numRecs; ++i) { final Group group = _groups[i]; sb.append(" ").append(i + 1) .append(". Number of Hgt Records ").append(group.getRecs()).append("\n") .append(" Starting Y Pel Height ").append(group.getStartSZ()).append("\n") .append(" Ending Y Pel Height ").append(group.getEndSZ()).append("\n"); for (int j = 0; j < group.getRecs(); ++j) { sb.append("\n ").append(j + 1) .append(". Pel Height= ").append(group.getEntry()[j].getYPelHeight()).append("\n") .append(" yMax= ").append(group.getEntry()[j].getYMax()).append("\n") .append(" yMin= ").append(group.getEntry()[j].getYMin()).append("\n"); } } return sb.toString(); } /** * Get a directory entry for this table. This uniquely identifies the * table in collections where there may be more than one instance of a * particular table. * @return A directory entry */ @Override public DirectoryEntry getDirectoryEntry() { return _de; } }