Source code: com/arranger/jarl/filter/paint/Plasma.java
1 package com.arranger.jarl.filter.paint;
2
3 import com.arranger.jarl.base.IContext;
4 import com.arranger.jarl.base.IGradientManager;
5 import com.arranger.jarl.base.IJarlObjectInfo;
6 import com.arranger.jarl.util.InterpolateUtil;
7 import com.arranger.jarl.util.ObjectUtil;
8 import com.arranger.jarl.util.WidgetConfigSegment;
9 import com.arranger.jarl.util.JarlInfoUtil;
10 import com.jhlabs.image.Gradient;
11 import com.jhlabs.image.PlasmaFilter;
12 import org.w3c.dom.Element;
13
14 /**
15 * Plasma created on Apr 3, 2003
16 *
17 * @filterAttribute turbulence ## xs:float ## amount of turbulence (between 1 & ??)
18 * @filterAttribute gradientIndex ## xs:integer ## the gradientIndex
19 * @filterAttribute seed ## xs:integer ## the seed (between 1 & Integer.MaxInteger)
20 *
21 * @filterAttribute startTurbulence ## xs:float ## starting amount of turbulence (between 1 & ??)
22 * @filterAttribute startGradientIndex ## xs:integer ## the starting gradientIndex
23 * @filterAttribute startSeed ## xs:integer ## the starting seed (between 1 & Integer.MaxInteger)
24 * @filterAttribute endTurbulence ## xs:float ## ending amount of turbulence (between 1 & ??)
25 * @filterAttribute endGradientIndex ## xs:integer ## the ending gradientIndex
26 * @filterAttribute endSeed ## xs:integer ## the ending seed (between 1 & Integer.MaxInteger)
27 */
28 public class Plasma extends BasePaintFilter {
29
30 protected float m_turbulence = Float.NEGATIVE_INFINITY;
31 protected int m_gradientIndex = Integer.MAX_VALUE;
32 protected int m_seed = Integer.MAX_VALUE;
33
34 protected float m_startTurbulence = Float.NEGATIVE_INFINITY;
35 protected int m_startGradientIndex = Integer.MAX_VALUE;
36 protected int m_startSeed = Integer.MAX_VALUE;
37 protected float m_endTurbulence = Float.NEGATIVE_INFINITY;
38 protected int m_endGradientIndex = Integer.MAX_VALUE;
39 protected int m_endSeed = Integer.MAX_VALUE;
40
41 /**
42 * @return the name of the underlying filter class
43 */
44 protected String getImageFilterClassName() {
45 return PlasmaFilter.class.getName();
46 }
47
48 /**
49 * Prepare the filter with any changes as necessary
50 * @param context the current context
51 */
52 protected void prepareFilter(IContext context) {
53 PlasmaFilter plasmaFilter = (PlasmaFilter) getImageFilter();
54 IGradientManager gradientManager = context.getGradientManager();
55
56 float turbulence;
57 Gradient gradient;
58 long seed;
59
60 if (m_turbulence != Float.NEGATIVE_INFINITY) {
61 turbulence = m_turbulence;
62 } else if (m_startTurbulence != Float.NEGATIVE_INFINITY &&
63 m_endTurbulence != Float.NEGATIVE_INFINITY) {
64 turbulence = (float) InterpolateUtil.interpolate(m_startTime,
65 m_endTime,
66 m_startTurbulence,
67 m_endTurbulence,
68 context.getTime());
69 } else {
70 PlasmaConfigSegment plasmaConfigSegment = (PlasmaConfigSegment) getCurrentSegment(context);
71 double currentTimePct = getCurrentSegmentTimePct(context, plasmaConfigSegment);
72
73 turbulence = (float) InterpolateUtil.interpolate(0,
74 1,
75 plasmaConfigSegment.getStartTurbulence(),
76 plasmaConfigSegment.getEndTurbulence(),
77 currentTimePct);
78 }
79
80 if (m_gradientIndex != Integer.MAX_VALUE) {
81 gradient = gradientManager.getGradient(m_gradientIndex);
82 } else if (m_startGradientIndex != Integer.MAX_VALUE &&
83 m_endGradientIndex != Integer.MAX_VALUE) {
84 Gradient gradient1 = gradientManager.getGradient(m_startGradientIndex);
85 Gradient gradient2 = gradientManager.getGradient(m_endGradientIndex);
86 double currentTimePct = InterpolateUtil.interpolate(this, context.getTime());
87 gradient = gradientManager.interpolate(gradient1, gradient2, currentTimePct);
88 } else {
89 PlasmaConfigSegment plasmaConfigSegment = (PlasmaConfigSegment) getCurrentSegment(context);
90 double currentTimePct = getCurrentSegmentTimePct(context, plasmaConfigSegment);
91 Gradient gradient1 = gradientManager.getGradient(plasmaConfigSegment.getStartGradientIndex());
92 Gradient gradient2 = gradientManager.getGradient(plasmaConfigSegment.getEndGradientIndex());
93 gradient = gradientManager.interpolate(gradient1, gradient2, currentTimePct);
94 }
95
96 if (m_seed != Integer.MAX_VALUE) {
97 seed = m_seed;
98 } else if (m_startSeed != Integer.MAX_VALUE && m_endSeed != Integer.MAX_VALUE) {
99 seed = (long) InterpolateUtil.interpolate(getStartTime(), getEndTime(),
100 m_startSeed, m_endSeed, context.getTime());
101 } else {
102 PlasmaConfigSegment plasmaConfigSegment = (PlasmaConfigSegment) getCurrentSegment(context);
103 double currentTimePct = getCurrentSegmentTimePct(context, plasmaConfigSegment);
104
105 seed = (long) InterpolateUtil.interpolate(0, 1,
106 plasmaConfigSegment.getStartSeed(),
107 plasmaConfigSegment.getEndSeed(),
108 currentTimePct);
109 }
110
111 plasmaFilter.setTurbulence(turbulence);
112 plasmaFilter.setColormap(gradient);
113 try {
114 ObjectUtil.setPrivilegedProperty(plasmaFilter, PlasmaFilter.class, "seed", new Long(seed));
115 } catch (IllegalAccessException e) {
116 throw new IllegalStateException(e.getMessage());
117 }
118 }
119
120
121 /**
122 * Always remember some attrs might not be there
123 * @param context
124 */
125 protected void initAttributes(IContext context) {
126 super.initAttributes(context);
127
128 ObjectUtil.initializeField("gradientIndex", m_configElement, this, ObjectUtil.PRIMITIVE_CONVERSION);
129 ObjectUtil.initializeField("turbulence", m_configElement, this, ObjectUtil.PRIMITIVE_CONVERSION);
130 ObjectUtil.initializeField("seed", m_configElement, this, ObjectUtil.PRIMITIVE_CONVERSION);
131
132 ObjectUtil.initializeField("startGradientIndex", m_configElement, this, ObjectUtil.PRIMITIVE_CONVERSION);
133 ObjectUtil.initializeField("startTurbulence", m_configElement, this, ObjectUtil.PRIMITIVE_CONVERSION);
134 ObjectUtil.initializeField("startSeed", m_configElement, this, ObjectUtil.PRIMITIVE_CONVERSION);
135 ObjectUtil.initializeField("endGradientIndex", m_configElement, this, ObjectUtil.PRIMITIVE_CONVERSION);
136 ObjectUtil.initializeField("endTurbulence", m_configElement, this, ObjectUtil.PRIMITIVE_CONVERSION);
137 ObjectUtil.initializeField("endSeed", m_configElement, this, ObjectUtil.PRIMITIVE_CONVERSION);
138 }
139
140 protected void addJarlObjectInfo(IJarlObjectInfo jarlObjectInfo) {
141 super.addJarlObjectInfo(jarlObjectInfo);
142 populateInfo(jarlObjectInfo, "gradientIndex", "Gradient Index", JarlInfoUtil.PRIMITIVE_DISPLAY);
143 populateInfo(jarlObjectInfo, "turbulence", "Turbulence", JarlInfoUtil.PRIMITIVE_DISPLAY);
144 populateInfo(jarlObjectInfo, "seed", "Random Seed", JarlInfoUtil.PRIMITIVE_DISPLAY);
145
146 populateInfo(jarlObjectInfo, "startGradientIndex", "Start Gradient Index", JarlInfoUtil.PRIMITIVE_DISPLAY);
147 populateInfo(jarlObjectInfo, "endGradientIndex", "End Gradient Index", JarlInfoUtil.PRIMITIVE_DISPLAY);
148 populateInfo(jarlObjectInfo, "startTurbulence", "Start Turbulence", JarlInfoUtil.PRIMITIVE_DISPLAY);
149 populateInfo(jarlObjectInfo, "endTurbulence", "End Turbulence", JarlInfoUtil.PRIMITIVE_DISPLAY);
150 populateInfo(jarlObjectInfo, "startSeed", "Start Random Seed", JarlInfoUtil.PRIMITIVE_DISPLAY);
151 populateInfo(jarlObjectInfo, "endSeed", "End Random Seed", JarlInfoUtil.PRIMITIVE_DISPLAY);
152 }
153
154 /**
155 * Create a concrete {@link com.arranger.jarl.util.WidgetConfigSegment} based on this element
156 * @param element
157 * @return a specific {@link com.arranger.jarl.util.WidgetConfigSegment}
158 */
159 public WidgetConfigSegment createSegment(Element element) {
160 return new PlasmaConfigSegment(element);
161 }
162
163 public static class PlasmaConfigSegment extends WidgetConfigSegment {
164
165 protected float m_startTurbulence = Float.NEGATIVE_INFINITY;
166 protected int m_startGradientIndex = Integer.MAX_VALUE;
167 protected int m_startSeed = Integer.MAX_VALUE;
168 protected float m_endTurbulence = Float.NEGATIVE_INFINITY;
169 protected int m_endGradientIndex = Integer.MAX_VALUE;
170 protected int m_endSeed = Integer.MAX_VALUE;
171
172 public PlasmaConfigSegment(Element element) {
173 super(element);
174
175 ObjectUtil.initializeFieldStrict("startGradientIndex", element, this, ObjectUtil.PRIMITIVE_CONVERSION);
176 ObjectUtil.initializeFieldStrict("startTurbulence", element, this, ObjectUtil.PRIMITIVE_CONVERSION);
177 ObjectUtil.initializeFieldStrict("startSeed", element, this, ObjectUtil.PRIMITIVE_CONVERSION);
178 ObjectUtil.initializeFieldStrict("endGradientIndex", element, this, ObjectUtil.PRIMITIVE_CONVERSION);
179 ObjectUtil.initializeFieldStrict("endTurbulence", element, this, ObjectUtil.PRIMITIVE_CONVERSION);
180 ObjectUtil.initializeFieldStrict("endSeed", element, this, ObjectUtil.PRIMITIVE_CONVERSION);
181 }
182
183 protected void addJarlObjectInfo(IJarlObjectInfo jarlObjectInfo) {
184 super.addJarlObjectInfo(jarlObjectInfo);
185 populateInfo(jarlObjectInfo, "startGradientIndex", "Start Gradient Index", JarlInfoUtil.PRIMITIVE_DISPLAY);
186 populateInfo(jarlObjectInfo, "endGradientIndex", "End Gradient Index", JarlInfoUtil.PRIMITIVE_DISPLAY);
187 populateInfo(jarlObjectInfo, "startTurbulence", "Start Turbulence", JarlInfoUtil.PRIMITIVE_DISPLAY);
188 populateInfo(jarlObjectInfo, "endTurbulence", "End Turbulence", JarlInfoUtil.PRIMITIVE_DISPLAY);
189 populateInfo(jarlObjectInfo, "startSeed", "Start Random Seed", JarlInfoUtil.PRIMITIVE_DISPLAY);
190 populateInfo(jarlObjectInfo, "endSeed", "End Random Seed", JarlInfoUtil.PRIMITIVE_DISPLAY);
191 }
192
193 public float getStartTurbulence() {
194 return m_startTurbulence;
195 }
196
197 public int getStartGradientIndex() {
198 return m_startGradientIndex;
199 }
200
201 public int getStartSeed() {
202 return m_startSeed;
203 }
204
205 public float getEndTurbulence() {
206 return m_endTurbulence;
207 }
208
209 public int getEndGradientIndex() {
210 return m_endGradientIndex;
211 }
212
213 public int getEndSeed() {
214 return m_endSeed;
215 }
216 }
217 }