001: /*
002: * $Id: Gradient.java,v 1.1 2002/02/15 23:46:26 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 org.openlaszlo.iv.flash.api.*;
055: import org.openlaszlo.iv.flash.parser.Parser;
056: import java.io.PrintStream;
057:
058: /**
059: * Gradient
060: * <P>
061: * Here is an overview of the Macromedia Flash (SWF) gradient model:<BR>
062: * <UL>
063: * <LI>There are two styles of gradient - Linear and Radial.
064: * <LI>Each gradient has its own transformation matrix, and can be transformed independently of its parent shape.
065: * <LI>A gradient can have up to eight control points. Colors are interpolated between the control
066: * points to create the color ramp.
067: * <LI>Each control point is defined by a ratio and an RGBA color. The ratio determines the position of
068: * the control point in the gradient, the RGBA value determines its color.
069: * </UL>
070: *
071: * @author Dmitry Skavish
072: */
073: public final class Gradient extends FlashItem {
074:
075: private int nGrads;
076: private int[] ratios = new int[8];
077: private Color[] colors = new Color[8];
078:
079: /**
080: * Creates empty gradient
081: */
082: public Gradient() {
083: nGrads = 0;
084: }
085:
086: /**
087: * Creates gradient with one transition
088: *
089: * @param ratio specified retio
090: * @param color specified color
091: */
092: public Gradient(int ratio, Color color) {
093: nGrads = 0;
094: addTransition(ratio, color);
095: }
096:
097: public Color[] getColors() {
098: return colors;
099: }
100:
101: public int[] getRatios() {
102: return ratios;
103: }
104:
105: public int getNumber() {
106: return nGrads;
107: }
108:
109: /**
110: * Adds transition
111: *
112: * @param ratio the transition's ratio
113: * @param color the transition's color
114: */
115: public void addTransition(int ratio, Color color) {
116: ratios[nGrads] = ratio;
117: colors[nGrads] = color;
118: nGrads++;
119: }
120:
121: public static Gradient parse(Parser p, boolean withAlpha) {
122: Gradient g = new Gradient();
123: int nGrads = p.getUByte();
124: for (int i = 0; i < nGrads; i++) {
125: int ratio = p.getUByte();
126: Color color = Color.parse(p, withAlpha);
127: g.addTransition(ratio, color);
128: }
129: return g;
130: }
131:
132: public void write(FlashOutput fob) {
133: fob.writeByte(nGrads);
134: if (fob.getUserData() instanceof Shape) {
135: if (((Shape) fob.getUserData()).isWithAlpha()) {
136: for (int i = 0; i < nGrads; i++) {
137: fob.writeByte(ratios[i]);
138: colors[i].writeRGBA(fob);
139: }
140: } else {
141: for (int i = 0; i < nGrads; i++) {
142: fob.writeByte(ratios[i]);
143: colors[i].writeRGB(fob);
144: }
145: }
146: } else {
147: for (int i = 0; i < nGrads; i++) {
148: fob.writeByte(ratios[i]);
149: colors[i].write(fob);
150: }
151: }
152: }
153:
154: public void printContent(PrintStream out, String indent) {
155: out.println(indent + "Gradient: num=" + nGrads);
156: for (int i = 0; i < nGrads; i++) {
157: out.println(indent + " ratio[" + i + "]=" + ratios[i]);
158: out.print(indent + " color[" + i + "]=");
159: colors[i].printContent(out, "");
160: }
161: }
162:
163: protected FlashItem copyInto(FlashItem item, ScriptCopier copier) {
164: ((Gradient) item).nGrads = nGrads;
165: int[] r = new int[8];
166: System.arraycopy(ratios, 0, r, 0, 8);
167: Color[] c = new Color[8];
168: for (int i = 0; i < nGrads; i++) {
169: c[i] = (Color) colors[i].getCopy(copier);
170: }
171: ((Gradient) item).ratios = r;
172: ((Gradient) item).colors = c;
173: return item;
174: }
175:
176: public FlashItem getCopy(ScriptCopier copier) {
177: return copyInto(new Gradient(), copier);
178: }
179: }
|