001: /*
002: * $Id: CurvedEdgeRecord.java,v 1.2 2002/02/15 23:44:28 skavish Exp $
003: *
004: * ==========================================================================
005: *
006: * The JGenerator Software License, Version 1.0
007: *
008: * Copyright (c) 2000 Dmitry Skavish (skavish@usa.net). All rights reserved.
009: *
010: * Redistribution and use in source and binary forms, with or without
011: * modification, are permitted provided that the following conditions are met:
012: *
013: * 1. Redistributions of source code must retain the above copyright
014: * notice, this list of conditions and the following disclaimer.
015: *
016: * 2. Redistributions in binary form must reproduce the above copyright
017: * notice, this list of conditions and the following disclaimer in
018: * the documentation and/or other materials provided with the
019: * distribution.
020: *
021: * 3. The end-user documentation included with the redistribution, if
022: * any, must include the following acknowlegement:
023: * "This product includes software developed by Dmitry Skavish
024: * (skavish@usa.net, http://www.flashgap.com/)."
025: * Alternately, this acknowlegement may appear in the software itself,
026: * if and wherever such third-party acknowlegements normally appear.
027: *
028: * 4. The name "The JGenerator" must not be used to endorse or promote
029: * products derived from this software without prior written permission.
030: * For written permission, please contact skavish@usa.net.
031: *
032: * 5. Products derived from this software may not be called "The JGenerator"
033: * nor may "The JGenerator" appear in their names without prior written
034: * permission of Dmitry Skavish.
035: *
036: * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
037: * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
038: * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
039: * DISCLAIMED. IN NO EVENT SHALL DMITRY SKAVISH OR THE OTHER
040: * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
041: * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
042: * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
043: * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
044: * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
045: * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
046: * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
047: * SUCH DAMAGE.
048: *
049: */
050:
051: package org.openlaszlo.iv.flash.api.shape;
052:
053: import org.openlaszlo.iv.flash.util.*;
054: import java.io.PrintStream;
055: import org.openlaszlo.iv.flash.api.*;
056:
057: /**
058: * CurveEdge record.
059: * <P>
060: * SWF differs from most vector file formats by using Quadratic Bezier
061: * curves rather than Cubic Bezier curves. PostScript uses Cubic Beziers,
062: * as do most drawing applications, such as Illustrator, FreeHand and Corel Draw.
063: * SWF uses Quadratic Bezier curves because they can be stored more compactly,
064: * and can be rendered more efficiently.
065: * <P>
066: * A Quadratic Bezier curve has 3 points. Two on-curve anchor points, and one off-curve
067: * control point. A Cubic Bezier curve has 4 points. Two on-curve anchor points,
068: * and two off-curve control points.
069: * <P>
070: * The curved-edge record stores the edge as two X-Y deltas.
071: * The three points that define the Quadratic Bezier are calculated like this:
072: * <UL>
073: * <LI>The first anchor point is the current drawing position.
074: * <LI>The control point is the current drawing position + ControlDelta.
075: * <LI>The last anchor point is the current drawing position + ControlDelta + AnchorDelta.
076: * </UL>
077: * The last anchor point becomes the current drawing position.
078: *
079: * @author Dmitry Skavish
080: */
081: public final class CurvedEdgeRecord extends FlashItem {
082:
083: private int controlDeltaX;
084: private int controlDeltaY;
085: private int anchorDeltaX;
086: private int anchorDeltaY;
087:
088: public CurvedEdgeRecord() {
089: }
090:
091: public CurvedEdgeRecord(int controlDeltaX, int controlDeltaY,
092: int anchorDeltaX, int anchorDeltaY) {
093: setControlDeltaX(controlDeltaX);
094: setControlDeltaY(controlDeltaY);
095: setAnchorDeltaX(anchorDeltaX);
096: setAnchorDeltaY(anchorDeltaY);
097: }
098:
099: public int getControlDeltaX() {
100: return controlDeltaX;
101: }
102:
103: public void setControlDeltaX(int controlDeltaX) {
104: this .controlDeltaX = controlDeltaX;
105: }
106:
107: public int getControlDeltaY() {
108: return controlDeltaY;
109: }
110:
111: public void setControlDeltaY(int controlDeltaY) {
112: this .controlDeltaY = controlDeltaY;
113: }
114:
115: public int getAnchorDeltaX() {
116: return anchorDeltaX;
117: }
118:
119: public void setAnchorDeltaX(int anchorDeltaX) {
120: this .anchorDeltaX = anchorDeltaX;
121: }
122:
123: public int getAnchorDeltaY() {
124: return anchorDeltaY;
125: }
126:
127: public void setAnchorDeltaY(int anchorDeltaY) {
128: this .anchorDeltaY = anchorDeltaY;
129: }
130:
131: public void write(FlashOutput fob) {
132: fob.writeBits(0x2, 2);
133: int nBits = Util.getMinBitsS(Util.getMax(controlDeltaX,
134: controlDeltaY, anchorDeltaX, anchorDeltaY));
135: if (nBits < 3)
136: nBits = 3;
137: fob.writeBits(nBits - 2, 4);
138: fob.writeBits(controlDeltaX, nBits);
139: fob.writeBits(controlDeltaY, nBits);
140: fob.writeBits(anchorDeltaX, nBits);
141: fob.writeBits(anchorDeltaY, nBits);
142: }
143:
144: public void printContent(PrintStream out, String indent) {
145: out.println(indent + " curve (" + controlDeltaX + ","
146: + controlDeltaY + "," + anchorDeltaX + ","
147: + anchorDeltaY + ")");
148: }
149:
150: protected FlashItem copyInto(FlashItem item, ScriptCopier copier) {
151: ((CurvedEdgeRecord) item).controlDeltaX = controlDeltaX;
152: ((CurvedEdgeRecord) item).controlDeltaY = controlDeltaY;
153: ((CurvedEdgeRecord) item).anchorDeltaX = anchorDeltaX;
154: ((CurvedEdgeRecord) item).anchorDeltaY = anchorDeltaY;
155: return item;
156: }
157:
158: public FlashItem getCopy(ScriptCopier copier) {
159: return copyInto(new CurvedEdgeRecord(), copier);
160: }
161: }
|