001: /*
002: * $Id: Glyf.java,v 1.2 2007/12/20 18:33:31 rbair Exp $
003: *
004: * Copyright 2004 Sun Microsystems, Inc., 4150 Network Circle,
005: * Santa Clara, California 95054, U.S.A. All rights reserved.
006: *
007: * This library is free software; you can redistribute it and/or
008: * modify it under the terms of the GNU Lesser General Public
009: * License as published by the Free Software Foundation; either
010: * version 2.1 of the License, or (at your option) any later version.
011: *
012: * This library is distributed in the hope that it will be useful,
013: * but WITHOUT ANY WARRANTY; without even the implied warranty of
014: * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
015: * Lesser General Public License for more details.
016: *
017: * You should have received a copy of the GNU Lesser General Public
018: * License along with this library; if not, write to the Free Software
019: * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
020: */
021:
022: package com.sun.pdfview.font.ttf;
023:
024: import java.nio.ByteBuffer;
025:
026: /**
027: * A single glyph in a pdf font. May be simple or compound via subclasses
028: */
029: public class Glyf {
030: /** If true, the glyf is compound */
031: private boolean isCompound;
032:
033: /** the number of contours */
034: private short numContours;
035:
036: /** the minimum x value */
037: private short minX;
038:
039: /** the minimum y value */
040: private short minY;
041:
042: /** the maximum x value */
043: private short maxX;
044:
045: /** the maximum y value */
046: private short maxY;
047:
048: /**
049: * Creates a new instance of glyf
050: * Don't use this directly, use <code>Glyf.getGlyf()</code>
051: */
052: protected Glyf() {
053: }
054:
055: /**
056: * Get a map from the given data
057: *
058: * This method reads the format, data and length variables of
059: * the map.
060: */
061: public static Glyf getGlyf(ByteBuffer data) {
062: short numContours = data.getShort();
063:
064: Glyf g = null;
065: if (numContours == 0) {
066: // no glyph data
067: g = new Glyf();
068: } else if (numContours == -1) {
069: // compound glyf
070: g = new GlyfCompound();
071: } else if (numContours > 0) {
072: // simple glyf
073: g = new GlyfSimple();
074: } else {
075: throw new IllegalArgumentException("Unknown glyf type: "
076: + numContours);
077: }
078:
079: g.setNumContours(numContours);
080: g.setMinX(data.getShort());
081: g.setMinY(data.getShort());
082: g.setMaxX(data.getShort());
083: g.setMaxY(data.getShort());
084:
085: // do glyphtype-specific parsing
086: g.setData(data);
087:
088: return g;
089: }
090:
091: /**
092: * Set the data for this glyf. Do nothing, since a glyf with
093: * no contours has no glyf data.
094: */
095: public void setData(ByteBuffer data) {
096: return;
097: }
098:
099: /**
100: * Get the data in this glyf as a byte buffer. Return the basic
101: * glyf data only, since there is no specific data. This method returns
102: * the data un-flipped, so subclasses can simply append to the allocated
103: * buffer.
104: */
105: public ByteBuffer getData() {
106: ByteBuffer buf = ByteBuffer.allocate(getLength());
107:
108: buf.putShort(getNumContours());
109: buf.putShort(getMinX());
110: buf.putShort(getMinY());
111: buf.putShort(getMaxX());
112: buf.putShort(getMaxY());
113:
114: // don't flip the buffer, since it may be used by subclasses
115: return buf;
116: }
117:
118: /**
119: * Get the length of this glyf. A glyf with no data has a length
120: * of 10 (2 bytes each for 5 short values)
121: */
122: public short getLength() {
123: return 10;
124: }
125:
126: /**
127: * Get whether this is a simple or compound glyf
128: */
129: public boolean isCompound() {
130: return isCompound;
131: }
132:
133: /**
134: * Set whether this is a simple or compound glyf
135: */
136: protected void setCompound(boolean isCompound) {
137: this .isCompound = isCompound;
138: }
139:
140: /**
141: * Get the number of contours in this glyf
142: */
143: public short getNumContours() {
144: return numContours;
145: }
146:
147: /**
148: * Set the number of contours in this glyf
149: */
150: protected void setNumContours(short numContours) {
151: this .numContours = numContours;
152: }
153:
154: /**
155: * Get the minimum x in this glyf
156: */
157: public short getMinX() {
158: return minX;
159: }
160:
161: /**
162: * Set the minimum X in this glyf
163: */
164: protected void setMinX(short minX) {
165: this .minX = minX;
166: }
167:
168: /**
169: * Get the minimum y in this glyf
170: */
171: public short getMinY() {
172: return minY;
173: }
174:
175: /**
176: * Set the minimum Y in this glyf
177: */
178: protected void setMinY(short minY) {
179: this .minY = minY;
180: }
181:
182: /**
183: * Get the maximum x in this glyf
184: */
185: public short getMaxX() {
186: return maxX;
187: }
188:
189: /**
190: * Set the maximum X in this glyf
191: */
192: protected void setMaxX(short maxX) {
193: this .maxX = maxX;
194: }
195:
196: /**
197: * Get the maximum y in this glyf
198: */
199: public short getMaxY() {
200: return maxY;
201: }
202:
203: /**
204: * Set the maximum Y in this glyf
205: */
206: protected void setMaxY(short maxY) {
207: this.maxY = maxY;
208: }
209: }
|