diff options
author | Harvey Harrison <[email protected]> | 2015-04-19 21:02:06 -0700 |
---|---|---|
committer | Harvey Harrison <[email protected]> | 2015-04-19 21:02:06 -0700 |
commit | 7a2e20caac9db6f789a7b3fab344b9758af45335 (patch) | |
tree | b5236ff2570178de356eab569225108948eb4d30 /src/javax/media/j3d/FontExtrusion.java | |
parent | f76ce302c4bb2a9f03bbee571ec5d05c29633023 (diff) |
j3dcore: flatten the directory structure a bit
Signed-off-by: Harvey Harrison <[email protected]>
Diffstat (limited to 'src/javax/media/j3d/FontExtrusion.java')
-rw-r--r-- | src/javax/media/j3d/FontExtrusion.java | 255 |
1 files changed, 255 insertions, 0 deletions
diff --git a/src/javax/media/j3d/FontExtrusion.java b/src/javax/media/j3d/FontExtrusion.java new file mode 100644 index 0000000..d326154 --- /dev/null +++ b/src/javax/media/j3d/FontExtrusion.java @@ -0,0 +1,255 @@ +/* + * Copyright 1997-2008 Sun Microsystems, Inc. All Rights Reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Sun designates this + * particular file as subject to the "Classpath" exception as provided + * by Sun in the LICENSE file that accompanied this code. + * + * This code 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 General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + * + */ + +package javax.media.j3d; +import java.awt.Shape; +import java.awt.geom.PathIterator; +import java.util.ArrayList; + +import javax.vecmath.Point2f; + + /** + * The FontExtrusion object is used to describe the extrusion path + * for a Font3D object. The extrusion path is used in conjunction + * with a Font2D object. The extrusion path defines the edge contour + * of 3D text. This contour is perpendicular to the face of the text. + * The extrusion has it's origin at the edge of the glyph with 1.0 being + * the height of the tallest glyph. Contour must be monotonic in x. + * <P> + * The shape of the extrusion path is, by default, a straight line + * from 0.0 to 0.2 (known as a straight bevel). The shape may be + * modified via the extrusionShape parameter, a Shape object that + * describes the 3D contour of a Font3D object. + * <P> + * User is responsible for data sanity and must make sure that + * extrusionShape does not cause intersection of adjacent glyphs + * or within single glyph. Else undefined output may be generated. + * + * @see java.awt.Font + * @see Font3D + */ +public class FontExtrusion extends Object { + + // Default FontExtrusion is a straight line of length .2 + float length = 0.2f; + Shape shape; + Point2f [] pnts; + + double tessellationTolerance = 0.01; + + /** + * Constructs a FontExtrusion object with default parameters. The + * default parameters are as follows: + * + * <ul> + * extrusion shape : null<br> + * tessellation tolerance : 0.01<br> + * </ul> + * + * A null extrusion shape specifies that a straight line from 0.0 + * to 0.2 (straight bevel) is used. + * + * @see Font3D + */ + public FontExtrusion() { + shape = null; + } + + /** + * Constructs a FontExtrusion object with the specified shape, using + * the default tessellation tolerance. The + * specified shape is used to construct the edge + * contour of a Font3D object. Each shape begins with an implicit + * point at 0.0. Contour must be monotonic in x. + * + * @param extrusionShape the shape object to use to generate the + * extrusion path. + * A null shape specifies that a straight line from 0.0 to 0.2 + * (straight bevel) is used. + * + * @exception IllegalArgumentException if multiple contours in + * extrusionShape, or contour is not monotonic or least x-value + * of a contour point is not 0.0f + * + * @see Font3D + */ + public FontExtrusion(Shape extrusionShape) { + setExtrusionShape(extrusionShape); + } + + + /** + * Constructs a FontExtrusion object with the specified shape, using + * the specified tessellation tolerance. The + * specified shape is used to construct the edge + * contour of a Font3D object. Each shape begins with an implicit + * point at 0.0. Contour must be monotonic in x. + * + * @param extrusionShape the shape object to use to generate the + * extrusion path. + * A null shape specifies that a straight line from 0.0 to 0.2 + * (straight bevel) is used. + * @param tessellationTolerance the tessellation tolerance value + * used in tessellating the extrusion shape. + * This corresponds to the <code>flatness</code> parameter in + * the <code>java.awt.Shape.getPathIterator</code> method. + * + * @exception IllegalArgumentException if multiple contours in + * extrusionShape, or contour is not monotonic or least x-value + * of a contour point is not 0.0f + * + * @see Font3D + * + * @since Java 3D 1.2 + */ + public FontExtrusion(Shape extrusionShape, + double tessellationTolerance) { + + this.tessellationTolerance = tessellationTolerance; + setExtrusionShape(extrusionShape); + } + + + /** + * Sets the FontExtrusion's shape parameter. This + * parameter is used to construct the 3D contour of a Font3D object. + * + * @param extrusionShape the shape object to use to generate the + * extrusion path. + * A null shape specifies that a straight line from 0.0 to 0.2 + * (straight bevel) is used. + * + * @exception IllegalArgumentException if multiple contours in + * extrusionShape, or contour is not monotonic or least x-value + * of a contour point is not 0.0f + * + * @see Font3D + * @see java.awt.Shape + */ + public void setExtrusionShape(Shape extrusionShape) { + shape = extrusionShape; + if (shape == null) return; + + PathIterator pIt = shape.getPathIterator(null, tessellationTolerance); + ArrayList coords = new ArrayList(); + float tmpCoords[] = new float[6], prevX = 0.0f; + int flag, n = 0, inc = -1; + + // Extrusion shape is restricted to be single contour, monotonous + // increasing, non-self-intersecting curve. Throw exception otherwise + while (!pIt.isDone()) { + Point2f vertex = new Point2f(); + flag = pIt.currentSegment(tmpCoords); + if (flag == PathIterator.SEG_LINETO){ + vertex.x = tmpCoords[0]; + vertex.y = tmpCoords[1]; + if (inc == -1){ + if (prevX < vertex.x) inc = 0; + else if (prevX > vertex.x) inc = 1; + } + //Flag 'inc' indicates if curve is monotonic increasing or + // monotonic decreasing. It is set to -1 initially and remains + // -1 if consecutive x values are same. Once 'inc' is set to + // 1 or 0, exception is thrown is curve changes direction. + if (((inc == 0) && (prevX > vertex.x)) || + ((inc == 1) && (prevX < vertex.x))) + throw new IllegalArgumentException(J3dI18N.getString("FontExtrusion0")); + + prevX = vertex.x; + n++; + coords.add(vertex); + }else if (flag == PathIterator.SEG_MOVETO){ + if (n != 0) + throw new IllegalArgumentException(J3dI18N.getString("FontExtrusion3")); + + vertex.x = tmpCoords[0]; + vertex.y = tmpCoords[1]; + prevX = vertex.x; + n++; + coords.add(vertex); + } + pIt.next(); + } + + //if (inc == 1){ + //Point2f vertex = new Point2f(0.0f, 0.0f); + //coords.add(vertex); + //} + int i, num = coords.size(); + pnts = new Point2f[num]; + //System.err.println("num "+num+" inc "+inc); + if (inc == 0){ + for (i=0;i < num;i++){ + pnts[i] = (Point2f)coords.get(i); + //System.err.println("i "+i+" x "+ pnts[i].x+" y "+pnts[i].y); + } + } + else { + for (i=0;i < num;i++) { + pnts[i] = (Point2f)coords.get(num - i -1); + //System.err.println("i "+i+" x "+ pnts[i].x+" y "+pnts[i].y); + } + } + + //Force last y to be zero until Text3D face scaling is implemented + pnts[num-1].y = 0.0f; + if (pnts[0].x != 0.0f) + throw new IllegalArgumentException(J3dI18N.getString("FontExtrusion1")); + + //Compute straight line distance between first and last points. + float dx = (pnts[0].x - pnts[num-1].x); + float dy = (pnts[0].y - pnts[num-1].y); + length = (float)Math.sqrt(dx*dx + dy*dy); + } + + + /** + * Gets the FontExtrusion's shape parameter. This + * parameter is used to construct the 3D contour of a Font3D object. + * + * @return extrusionShape the shape object used to generate the + * extrusion path + * + * @see Font3D + * @see java.awt.Shape + */ + public Shape getExtrusionShape() { + return shape; + } + + + /** + * Returns the tessellation tolerance with which this FontExtrusion was + * created. + * @return the tessellation tolerance used by this FontExtrusion + * + * @since Java 3D 1.2 + */ + public double getTessellationTolerance() { + return tessellationTolerance; + } + +} |