Exploring noise
Inexpensive noise generation pioneered by Ken Perlin has earned him an Oscar award in 1997. See this page for a background of Perlin noise generator and transformations that can be applied to the resulting images in order to imitate various textures such as wood or marble.
In its original form, the 2D Perlin noise looks like this:

Not much to see here, but this is only the beginning. Following an idea similar to that of SwingX painters (hopefully this will not aggravate commercial Swing vendors - read the comments on this entry in Romain's blog), we can apply a chain of filters on this base noise to create some interesting textures. First, we start with the base interface for the noide filter:
<font color="#7f0055"><b>public interface </b></font><font color="#000000">NoiseFilter </font><font color="#000000">{</font><br/>
<font color="#ffffff"> </font><font color="#3f5fbf">/**</font><br/>
<font color="#ffffff"> </font><font color="#3f5fbf">* Applies filter on the noise at the specified location.</font><br/>
<font color="#ffffff"> </font><font color="#3f5fbf">* </font><br/>
<font color="#ffffff"> </font><font color="#3f5fbf">* </font><font color="#7f9fbf">@param </font><font color="#3f5fbf">x</font><br/>
<font color="#ffffff"> </font><font color="#3f5fbf">* X coordinate.</font><br/>
<font color="#ffffff"> </font><font color="#3f5fbf">* </font><font color="#7f9fbf">@param </font><font color="#3f5fbf">y</font><br/>
<font color="#ffffff"> </font><font color="#3f5fbf">* Y coordinate.</font><br/>
<font color="#ffffff"> </font><font color="#3f5fbf">* </font><font color="#7f9fbf">@param </font><font color="#3f5fbf">z</font><br/>
<font color="#ffffff"> </font><font color="#3f5fbf">* Z coordinate.</font><br/>
<font color="#ffffff"> </font><font color="#3f5fbf">* </font><font color="#7f9fbf">@param </font><font color="#3f5fbf">origValue</font><br/>
<font color="#ffffff"> </font><font color="#3f5fbf">* The original noise value.</font><br/>
<font color="#ffffff"> </font><font color="#3f5fbf">* </font><font color="#7f9fbf">@return </font><font color="#3f5fbf">New noise value.</font><br/>
<font color="#ffffff"> </font><font color="#3f5fbf">*/</font><br/>
<font color="#ffffff"> </font><font color="#7f0055"><b>public </b></font><font color="#7f0055"><b>double </b></font><font color="#000000">apply</font><font color="#000000">(</font><font color="#7f0055"><b>double </b></font><font color="#000000">x, </font><font color="#7f0055"><b>double </b></font><font color="#000000">y, </font><font color="#7f0055"><b>double </b></font><font color="#000000">z, </font><font color="#7f0055"><b>double </b></font><font color="#000000">origValue</font><font color="#000000">)</font><font color="#000000">;</font><br/>
<font color="#ffffff"></font><br/>
<font color="#ffffff"> </font><font color="#3f5fbf">/**</font><br/>
<font color="#ffffff"> </font><font color="#3f5fbf">* Kind of trigonometric function.</font><br/>
<font color="#ffffff"> </font><font color="#3f5fbf">* </font><br/>
<font color="#ffffff"> </font><font color="#3f5fbf">* </font><font color="#7f9fbf">@author </font><font color="#3f5fbf">Kirill Grouchnikov</font><br/>
<font color="#ffffff"> </font><font color="#3f5fbf">*/</font><br/>
<font color="#ffffff"> </font><font color="#7f0055"><b>public enum </b></font><font color="#000000">TrigKind </font><font color="#000000">{</font><br/>
<font color="#ffffff"> </font><font color="#000000">SINE, COSINE</font><br/>
<font color="#ffffff"> </font><font color="#000000">}</font><br/>
<font color="#000000">}</font>
Simple implementation would be that of a sharpening filter:
<font color="#7f0055"><b>public class </b></font><font color="#000000">SharpenFilter </font><font color="#7f0055"><b>implements </b></font><font color="#000000">NoiseFilter </font><font color="#000000">{</font><br/>
<font color="#ffffff"> </font><font color="#3f7f5f">/*</font><br/>
<font color="#ffffff"> </font><font color="#3f7f5f">* (non-Javadoc)</font><br/>
<font color="#ffffff"> </font><font color="#3f7f5f">* </font><br/>
<font color="#ffffff"> </font><font color="#3f7f5f">* @see org.jvnet.substance.painter.noise.NoiseFilter#apply(double, double,</font><br/>
<font color="#ffffff"> </font><font color="#3f7f5f">* double, double)</font><br/>
<font color="#ffffff"> </font><font color="#3f7f5f">*/</font><br/>
<font color="#ffffff"> </font><font color="#7f0055"><b>public </b></font><font color="#7f0055"><b>double </b></font><font color="#000000">apply</font><font color="#000000">(</font><font color="#7f0055"><b>double </b></font><font color="#000000">x, </font><font color="#7f0055"><b>double </b></font><font color="#000000">y, </font><font color="#7f0055"><b>double </b></font><font color="#000000">z, </font><font color="#7f0055"><b>double </b></font><font color="#000000">origValue</font><font color="#000000">) {</font><br/>
<font color="#ffffff"> </font><font color="#7f0055"><b>return </b></font><font color="#000000">Math.sqrt</font><font color="#000000">(</font><font color="#000000">origValue</font><font color="#000000">)</font><font color="#000000">;</font><br/>
<font color="#ffffff"> </font><font color="#000000">}</font><br/>
<font color="#000000">}</font>Another implementation focuses on the medium values and subdues values around 0 and 1 (effectively doubling the number of original noise features):
<font color="#7f0055"><b>public class </b></font><font color="#000000">MedianBeakFilter </font><font color="#7f0055"><b>implements </b></font><font color="#000000">NoiseFilter </font><font color="#000000">{</font><br/>
<font color="#ffffff"> </font><font color="#3f7f5f">/*</font><br/>
<font color="#ffffff"> </font><font color="#3f7f5f">* (non-Javadoc)</font><br/>
<font color="#ffffff"> </font><font color="#3f7f5f">* </font><br/>
<font color="#ffffff"> </font><font color="#3f7f5f">* @see org.jvnet.substance.painter.noise.NoiseFilter#apply(double, double,</font><br/>
<font color="#ffffff"> </font><font color="#3f7f5f">* double, double)</font><br/>
<font color="#ffffff"> </font><font color="#3f7f5f">*/</font><br/>
<font color="#ffffff"> </font><font color="#7f0055"><b>public </b></font><font color="#7f0055"><b>double </b></font><font color="#000000">apply</font><font color="#000000">(</font><font color="#7f0055"><b>double </b></font><font color="#000000">x, </font><font color="#7f0055"><b>double </b></font><font color="#000000">y, </font><font color="#7f0055"><b>double </b></font><font color="#000000">z, </font><font color="#7f0055"><b>double </b></font><font color="#000000">origValue</font><font color="#000000">) {</font><br/>
<font color="#ffffff"> </font><font color="#7f0055"><b>return </b></font><font color="#000000">Math.sqrt</font><font color="#000000">(</font><font color="#000000">Math.abs</font><font color="#000000">(</font><font color="#990000">2 </font><font color="#000000">* origValue - </font><font color="#990000">1</font><font color="#000000">))</font><font color="#000000">;</font><br/>
<font color="#ffffff"> </font><font color="#000000">}</font><br/>
<font color="#000000">}</font>Now we introduce a compound noise filter which is really a chain of simple or compound filters applied one after another:
<font color="#7f0055"><b>public class </b></font><font color="#000000">CompoundNoiseFilter </font><font color="#7f0055"><b>implements </b></font><font color="#000000">NoiseFilter </font><font color="#000000">{</font><br/>
<font color="#ffffff"> </font><font color="#3f5fbf">/**</font><br/>
<font color="#ffffff"> </font><font color="#3f5fbf">* Filter chain.</font><br/>
<font color="#ffffff"> </font><font color="#3f5fbf">*/</font><br/>
<font color="#ffffff"> </font><font color="#7f0055"><b>protected </b></font><font color="#000000">LinkedList<NoiseFilter> chain;</font><br/>
<font color="#ffffff"></font><br/>
<font color="#ffffff"> </font><font color="#3f5fbf">/**</font><br/>
<font color="#ffffff"> </font><font color="#3f5fbf">* Creates a new compound filter.</font><br/>
<font color="#ffffff"> </font><font color="#3f5fbf">* </font><br/>
<font color="#ffffff"> </font><font color="#3f5fbf">* </font><font color="#7f9fbf">@param </font><font color="#3f5fbf">chain</font><br/>
<font color="#ffffff"> </font><font color="#3f5fbf">* Filter chain.</font><br/>
<font color="#ffffff"> </font><font color="#3f5fbf">*/</font><br/>
<font color="#ffffff"> </font><font color="#7f0055"><b>public </b></font><font color="#000000">CompoundNoiseFilter</font><font color="#000000">(</font><font color="#000000">NoiseFilter... chain</font><font color="#000000">) {</font><br/>
<font color="#ffffff"> </font><font color="#7f0055"><b>this</b></font><font color="#000000">.chain = </font><font color="#7f0055"><b>new </b></font><font color="#000000">LinkedList<NoiseFilter></font><font color="#000000">()</font><font color="#000000">;</font><br/>
<font color="#ffffff"> </font><font color="#7f0055"><b>for </b></font><font color="#000000">(</font><font color="#000000">NoiseFilter link : chain</font><font color="#000000">) {</font><br/>
<font color="#ffffff"> </font><font color="#7f0055"><b>this</b></font><font color="#000000">.chain.add</font><font color="#000000">(</font><font color="#000000">link</font><font color="#000000">)</font><font color="#000000">;</font><br/>
<font color="#ffffff"> </font><font color="#000000">}</font><br/>
<font color="#ffffff"> </font><font color="#000000">}</font><br/>
<font color="#ffffff"></font><br/>
<font color="#ffffff"> </font><font color="#3f7f5f">/*</font><br/>
<font color="#ffffff"> </font><font color="#3f7f5f">* (non-Javadoc)</font><br/>
<font color="#ffffff"> </font><font color="#3f7f5f">* </font><br/>
<font color="#ffffff"> </font><font color="#3f7f5f">* @see org.jvnet.substance.painter.noise.NoiseFilter#apply(double, double,</font><br/>
<font color="#ffffff"> </font><font color="#3f7f5f">* double, double)</font><br/>
<font color="#ffffff"> </font><font color="#3f7f5f">*/</font><br/>
<font color="#ffffff"> </font><font color="#7f0055"><b>public </b></font><font color="#7f0055"><b>double </b></font><font color="#000000">apply</font><font color="#000000">(</font><font color="#7f0055"><b>double </b></font><font color="#000000">x, </font><font color="#7f0055"><b>double </b></font><font color="#000000">y, </font><font color="#7f0055"><b>double </b></font><font color="#000000">z, </font><font color="#7f0055"><b>double </b></font><font color="#000000">origValue</font><font color="#000000">) {</font><br/>
<font color="#ffffff"> </font><font color="#7f0055"><b>double </b></font><font color="#000000">val = origValue;</font><br/>
<font color="#ffffff"> </font><font color="#7f0055"><b>for </b></font><font color="#000000">(</font><font color="#000000">NoiseFilter link : </font><font color="#7f0055"><b>this</b></font><font color="#000000">.chain</font><font color="#000000">)</font><br/>
<font color="#ffffff"> </font><font color="#000000">val = link.apply</font><font color="#000000">(</font><font color="#000000">x, y, z, val</font><font color="#000000">)</font><font color="#000000">;</font><br/>
<font color="#ffffff"> </font><font color="#7f0055"><b>return </b></font><font color="#000000">val;</font><br/>
<font color="#ffffff"> </font><font color="#000000">}</font><br/>
<font color="#000000">}</font>Now we are ready to create two simple noise images based on the above filters:

is created by applying the median filter and sharpening the result (which brings out maze-like structure of values that were close to 0.5 in the original noise map):
<font color="#7f0055"><b>public class </b></font><font color="#000000">SubstanceMazeWatermark </font><font color="#7f0055"><b>extends </b></font><font color="#000000">SubstanceNoiseWatermark </font><font color="#000000">{</font><br/>
<font color="#ffffff"> </font><font color="#7f0055"><b>public </b></font><font color="#000000">SubstanceMazeWatermark</font><font color="#000000">() {</font><br/>
<font color="#ffffff"> </font><font color="#7f0055"><b>super</b></font><font color="#000000">(</font><font color="#000000">SubstanceMazeWatermark.getName</font><font color="#000000">()</font><font color="#000000">, </font><font color="#990000">0.1</font><font color="#000000">, </font><font color="#990000">0.1</font><font color="#000000">, false,</font><br/>
<font color="#ffffff"> </font><font color="#7f0055"><b>new </b></font><font color="#000000">CompoundNoiseFilter</font><font color="#000000">(</font><font color="#7f0055"><b>new </b></font><font color="#000000">MedianBeakFilter</font><font color="#000000">()</font><font color="#000000">,</font><br/>
<font color="#ffffff"> </font><font color="#7f0055"><b>new </b></font><font color="#000000">SharpenFilter</font><font color="#000000">())</font><font color="#000000">, </font><font color="#7f0055"><b>false</b></font><font color="#000000">)</font><font color="#000000">;</font><br/>
<font color="#ffffff"> </font><font color="#000000">}</font><br/>
<font color="#ffffff"></font><br/>
<font color="#ffffff"> </font><font color="#7f0055"><b>public static </b></font><font color="#000000">String getName</font><font color="#000000">() {</font><br/>
<font color="#ffffff"> </font><font color="#7f0055"><b>return </b></font><font color="#2a00ff">"Maze"</font><font color="#000000">;</font><br/>
<font color="#ffffff"> </font><font color="#000000">}</font><br/>
<font color="#000000">}</font>

is created by applying the median filter twice (which quadruples the number of noise features and sharpens them as well):
<font color="#7f0055"><b>public class </b></font><font color="#000000">SubstancePlanktonWatermark </font><font color="#7f0055"><b>extends </b></font><font color="#000000">SubstanceNoiseWatermark </font><font color="#000000">{</font><br/>
<font color="#ffffff"> </font><font color="#7f0055"><b>public </b></font><font color="#000000">SubstancePlanktonWatermark</font><font color="#000000">() {</font><br/>
<font color="#ffffff"> </font><font color="#7f0055"><b>super</b></font><font color="#000000">(</font><font color="#000000">SubstancePlanktonWatermark.getName</font><font color="#000000">()</font><font color="#000000">, </font><font color="#990000">0.1</font><font color="#000000">, </font><font color="#990000">0.1</font><font color="#000000">, false,</font><br/>
<font color="#ffffff"> </font><font color="#7f0055"><b>new </b></font><font color="#000000">CompoundNoiseFilter</font><font color="#000000">(</font><font color="#7f0055"><b>new </b></font><font color="#000000">MedianBeakFilter</font><font color="#000000">()</font><font color="#000000">,</font><br/>
<font color="#ffffff"> </font><font color="#7f0055"><b>new </b></font><font color="#000000">MedianBeakFilter</font><font color="#000000">())</font><font color="#000000">, </font><font color="#7f0055"><b>false</b></font><font color="#000000">)</font><font color="#000000">;</font><br/>
<font color="#ffffff"> </font><font color="#000000">}</font><br/>
<font color="#ffffff"></font><br/>
<font color="#ffffff"> </font><font color="#7f0055"><b>public static </b></font><font color="#000000">String getName</font><font color="#000000">() {</font><br/>
<font color="#ffffff"> </font><font color="#7f0055"><b>return </b></font><font color="#2a00ff">"Plankton"</font><font color="#000000">;</font><br/>
<font color="#ffffff"> </font><font color="#000000">}</font><br/>
<font color="#000000">}</font>Now we can introduce another noise filter - this filter creates a wood-like texture:
<font color="#7f0055"><b>public class </b></font><font color="#000000">WoodFilter </font><font color="#7f0055"><b>implements </b></font><font color="#000000">NoiseFilter </font><font color="#000000">{</font><br/>
<font color="#ffffff"> </font><font color="#3f5fbf">/**</font><br/>
<font color="#ffffff"> </font><font color="#3f5fbf">* Stretch factor.</font><br/>
<font color="#ffffff"> </font><font color="#3f5fbf">*/</font><br/>
<font color="#ffffff"> </font><font color="#7f0055"><b>protected </b></font><font color="#7f0055"><b>double </b></font><font color="#000000">factor;</font><br/>
<font color="#ffffff"></font><br/>
<font color="#ffffff"> </font><font color="#3f5fbf">/**</font><br/>
<font color="#ffffff"> </font><font color="#3f5fbf">* Creates new wood filter with default stretch factor.</font><br/>
<font color="#ffffff"> </font><font color="#3f5fbf">*/</font><br/>
<font color="#ffffff"> </font><font color="#7f0055"><b>public </b></font><font color="#000000">WoodFilter</font><font color="#000000">() {</font><br/>
<font color="#ffffff"> </font><font color="#7f0055"><b>this</b></font><font color="#000000">(</font><font color="#990000">20.0</font><font color="#000000">)</font><font color="#000000">;</font><br/>
<font color="#ffffff"> </font><font color="#000000">}</font><br/>
<font color="#ffffff"></font><br/>
<font color="#ffffff"> </font><font color="#3f5fbf">/**</font><br/>
<font color="#ffffff"> </font><font color="#3f5fbf">* Create new wood filter.</font><br/>
<font color="#ffffff"> </font><font color="#3f5fbf">* </font><br/>
<font color="#ffffff"> </font><font color="#3f5fbf">* </font><font color="#7f9fbf">@param </font><font color="#3f5fbf">factor</font><br/>
<font color="#ffffff"> </font><font color="#3f5fbf">* Stretch factor.</font><br/>
<font color="#ffffff"> </font><font color="#3f5fbf">*/</font><br/>
<font color="#ffffff"> </font><font color="#7f0055"><b>public </b></font><font color="#000000">WoodFilter</font><font color="#000000">(</font><font color="#7f0055"><b>double </b></font><font color="#000000">factor</font><font color="#000000">) {</font><br/>
<font color="#ffffff"> </font><font color="#7f0055"><b>this</b></font><font color="#000000">.factor = factor;</font><br/>
<font color="#ffffff"> </font><font color="#000000">}</font><br/>
<font color="#ffffff"></font><br/>
<font color="#ffffff"> </font><font color="#3f7f5f">/*</font><br/>
<font color="#ffffff"> </font><font color="#3f7f5f">* (non-Javadoc)</font><br/>
<font color="#ffffff"> </font><font color="#3f7f5f">* </font><br/>
<font color="#ffffff"> </font><font color="#3f7f5f">* @see org.jvnet.substance.painter.noise.NoiseFilter#apply(double, double,</font><br/>
<font color="#ffffff"> </font><font color="#3f7f5f">* double, double)</font><br/>
<font color="#ffffff"> </font><font color="#3f7f5f">*/</font><br/>
<font color="#ffffff"> </font><font color="#7f0055"><b>public </b></font><font color="#7f0055"><b>double </b></font><font color="#000000">apply</font><font color="#000000">(</font><font color="#7f0055"><b>double </b></font><font color="#000000">x, </font><font color="#7f0055"><b>double </b></font><font color="#000000">y, </font><font color="#7f0055"><b>double </b></font><font color="#000000">z, </font><font color="#7f0055"><b>double </b></font><font color="#000000">origValue</font><font color="#000000">) {</font><br/>
<font color="#ffffff"> </font><font color="#7f0055"><b>return this</b></font><font color="#000000">.factor * origValue - </font><font color="#000000">(</font><font color="#7f0055"><b>int</b></font><font color="#000000">) (</font><font color="#7f0055"><b>this</b></font><font color="#000000">.factor * origValue</font><font color="#000000">)</font><font color="#000000">;</font><br/>
<font color="#ffffff"> </font><font color="#000000">}</font><br/>
<font color="#000000">}</font>

is created by simply applying the above filter:
<font color="#7f0055"><b>public class </b></font><font color="#000000">SubstanceWoodWatermark </font><font color="#7f0055"><b>extends </b></font><font color="#000000">SubstanceNoiseWatermark </font><font color="#000000">{</font><br/>
<font color="#ffffff"> </font><font color="#7f0055"><b>public </b></font><font color="#000000">SubstanceWoodWatermark</font><font color="#000000">() {</font><br/>
<font color="#ffffff"> </font><font color="#7f0055"><b>super</b></font><font color="#000000">(</font><font color="#000000">SubstanceWoodWatermark.getName</font><font color="#000000">()</font><font color="#000000">, </font><font color="#990000">0.01</font><font color="#000000">, </font><font color="#990000">0.01</font><font color="#000000">, false,</font><br/>
<font color="#ffffff"> </font><font color="#7f0055"><b>new </b></font><font color="#000000">WoodFilter</font><font color="#000000">(</font><font color="#990000">30.0</font><font color="#000000">)</font><font color="#000000">, </font><font color="#7f0055"><b>true</b></font><font color="#000000">)</font><font color="#000000">;</font><br/>
<font color="#ffffff"> </font><font color="#000000">}</font><br/>
<font color="#ffffff"></font><br/>
<font color="#ffffff"> </font><font color="#7f0055"><b>public static </b></font><font color="#000000">String getName</font><font color="#000000">() {</font><br/>
<font color="#ffffff"> </font><font color="#7f0055"><b>return </b></font><font color="#2a00ff">"Wood"</font><font color="#000000">;</font><br/>
<font color="#ffffff"> </font><font color="#000000">}</font><br/>
<font color="#000000">}</font>

is created by applying a wood filter followed by median filter:
<font color="#7f0055"><b>public class </b></font><font color="#000000">SubstanceMagneticFieldWatermark </font><font color="#7f0055"><b>extends </b></font><font color="#000000">SubstanceNoiseWatermark </font><font color="#000000">{</font><br/>
<font color="#ffffff"> </font><font color="#7f0055"><b>public </b></font><font color="#000000">SubstanceMagneticFieldWatermark</font><font color="#000000">() {</font><br/>
<font color="#ffffff"> </font><font color="#7f0055"><b>super</b></font><font color="#000000">(</font><font color="#000000">SubstanceMagneticFieldWatermark.getName</font><font color="#000000">()</font><font color="#000000">, </font><font color="#990000">0.01</font><font color="#000000">, </font><font color="#990000">0.01</font><font color="#000000">, false,</font><br/>
<font color="#ffffff"> </font><font color="#7f0055"><b>new </b></font><font color="#000000">CompoundNoiseFilter</font><font color="#000000">(</font><font color="#7f0055"><b>new </b></font><font color="#000000">WoodFilter</font><font color="#000000">(</font><font color="#990000">15.0</font><font color="#000000">)</font><font color="#000000">,</font><br/>
<font color="#ffffff"> </font><font color="#7f0055"><b>new </b></font><font color="#000000">MedianBeakFilter</font><font color="#000000">())</font><font color="#000000">, </font><font color="#7f0055"><b>true</b></font><font color="#000000">)</font><font color="#000000">;</font><br/>
<font color="#ffffff"> </font><font color="#000000">}</font><br/>
<font color="#ffffff"></font><br/>
<font color="#ffffff"> </font><font color="#7f0055"><b>public static </b></font><font color="#000000">String getName</font><font color="#000000">() {</font><br/>
<font color="#ffffff"> </font><font color="#7f0055"><b>return </b></font><font color="#2a00ff">"Magnetic Field"</font><font color="#000000">;</font><br/>
<font color="#ffffff"> </font><font color="#000000">}</font><br/>
<font color="#000000">}</font>Another simple noise filter uses trigonometric functions to produce marble-like structure:
<font color="#7f0055"><b>public class </b></font><font color="#000000">MarbleFilter </font><font color="#7f0055"><b>extends </b></font><font color="#000000">BaseNoiseFilter </font><font color="#000000">{</font><br/>
<font color="#ffffff"> </font><font color="#3f5fbf">/**</font><br/>
<font color="#ffffff"> </font><font color="#3f5fbf">* Creates a new marble filter.</font><br/>
<font color="#ffffff"> </font><font color="#3f5fbf">* </font><br/>
<font color="#ffffff"> </font><font color="#3f5fbf">* </font><font color="#7f9fbf">@param </font><font color="#3f5fbf">xFactor</font><br/>
<font color="#ffffff"> </font><font color="#3f5fbf">* Stretch factor for X axis.</font><br/>
<font color="#ffffff"> </font><font color="#3f5fbf">* </font><font color="#7f9fbf">@param </font><font color="#3f5fbf">yFactor</font><br/>
<font color="#ffffff"> </font><font color="#3f5fbf">* Stretch factor for Y axis.</font><br/>
<font color="#ffffff"> </font><font color="#3f5fbf">* </font><font color="#7f9fbf">@param </font><font color="#3f5fbf">zFactor</font><br/>
<font color="#ffffff"> </font><font color="#3f5fbf">* Stretch factor for Z axis.</font><br/>
<font color="#ffffff"> </font><font color="#3f5fbf">* </font><font color="#7f9fbf">@param </font><font color="#3f5fbf">trigKind</font><br/>
<font color="#ffffff"> </font><font color="#3f5fbf">* Trigonometry function.</font><br/>
<font color="#ffffff"> </font><font color="#3f5fbf">*/</font><br/>
<font color="#ffffff"> </font><font color="#7f0055"><b>public </b></font><font color="#000000">MarbleFilter</font><font color="#000000">(</font><font color="#7f0055"><b>double </b></font><font color="#000000">xFactor, </font><font color="#7f0055"><b>double </b></font><font color="#000000">yFactor, </font><font color="#7f0055"><b>double </b></font><font color="#000000">zFactor,</font><br/>
<font color="#ffffff"> </font><font color="#000000">TrigKind trigKind</font><font color="#000000">) {</font><br/>
<font color="#ffffff"> </font><font color="#7f0055"><b>super</b></font><font color="#000000">(</font><font color="#000000">xFactor, yFactor, zFactor, </font><font color="#990000">1.0</font><font color="#000000">, trigKind</font><font color="#000000">)</font><font color="#000000">;</font><br/>
<font color="#ffffff"> </font><font color="#000000">}</font><br/>
<font color="#ffffff"></font><br/>
<font color="#ffffff"> </font><font color="#3f7f5f">/*</font><br/>
<font color="#ffffff"> </font><font color="#3f7f5f">* (non-Javadoc)</font><br/>
<font color="#ffffff"> </font><font color="#3f7f5f">* </font><br/>
<font color="#ffffff"> </font><font color="#3f7f5f">* @see org.jvnet.substance.painter.noise.NoiseFilter#apply(double, double,</font><br/>
<font color="#ffffff"> </font><font color="#3f7f5f">* double, double)</font><br/>
<font color="#ffffff"> </font><font color="#3f7f5f">*/</font><br/>
<font color="#ffffff"> </font><font color="#7f0055"><b>public </b></font><font color="#7f0055"><b>double </b></font><font color="#000000">apply</font><font color="#000000">(</font><font color="#7f0055"><b>double </b></font><font color="#000000">x, </font><font color="#7f0055"><b>double </b></font><font color="#000000">y, </font><font color="#7f0055"><b>double </b></font><font color="#000000">z, </font><font color="#7f0055"><b>double </b></font><font color="#000000">origValue</font><font color="#000000">) {</font><br/>
<font color="#ffffff"> </font><font color="#7f0055"><b>double </b></font><font color="#000000">trans = </font><font color="#7f0055"><b>this</b></font><font color="#000000">.xFactor * x + </font><font color="#7f0055"><b>this</b></font><font color="#000000">.yFactor * y + </font><font color="#7f0055"><b>this</b></font><font color="#000000">.zFactor * z</font><br/>
<font color="#ffffff"> </font><font color="#000000">+ origValue;</font><br/>
<font color="#ffffff"> </font><font color="#7f0055"><b>double </b></font><font color="#000000">trig = </font><font color="#000000">(</font><font color="#7f0055"><b>this</b></font><font color="#000000">.trigKind == TrigKind.COSINE</font><font color="#000000">) </font><font color="#000000">? Math.cos</font><font color="#000000">(</font><font color="#000000">trans</font><font color="#000000">)</font><br/>
<font color="#ffffff"> </font><font color="#000000">: Math.sin</font><font color="#000000">(</font><font color="#000000">trans</font><font color="#000000">)</font><font color="#000000">;</font><br/>
<font color="#ffffff"> </font><font color="#7f0055"><b>return </b></font><font color="#990000">0.5 </font><font color="#000000">+ </font><font color="#990000">0.5 </font><font color="#000000">* trig;</font><br/>
<font color="#ffffff"> </font><font color="#000000">}</font>

is created by applying the above filter followed by a median filter:
<font color="#7f0055"><b>public class </b></font><font color="#000000">SubstanceMarbleVeinWatermark </font><font color="#7f0055"><b>extends </b></font><font color="#000000">SubstanceNoiseWatermark </font><font color="#000000">{</font><br/>
<font color="#ffffff"> </font><font color="#7f0055"><b>public </b></font><font color="#000000">SubstanceMarbleVeinWatermark</font><font color="#000000">() {</font><br/>
<font color="#ffffff"> </font><font color="#7f0055"><b>super</b></font><font color="#000000">(</font><font color="#000000">SubstanceMarbleVeinWatermark.getName</font><font color="#000000">()</font><font color="#000000">, </font><font color="#990000">0.1</font><font color="#000000">, </font><font color="#990000">0.1</font><font color="#000000">, false,</font><br/>
<font color="#ffffff"> </font><font color="#7f0055"><b>new </b></font><font color="#000000">CompoundNoiseFilter</font><font color="#000000">(</font><font color="#000000">MarbleFilter.getXFilter</font><font color="#000000">(</font><font color="#990000">0.1</font><font color="#000000">,</font><br/>
<font color="#ffffff"> </font><font color="#000000">TrigKind.COSINE</font><font color="#000000">)</font><font color="#000000">, </font><font color="#7f0055"><b>new </b></font><font color="#000000">MedianBeakFilter</font><font color="#000000">())</font><font color="#000000">, </font><font color="#7f0055"><b>false</b></font><font color="#000000">)</font><font color="#000000">;</font><br/>
<font color="#ffffff"> </font><font color="#000000">}</font><br/>
<font color="#ffffff"></font><br/>
<font color="#ffffff"> </font><font color="#7f0055"><b>public static </b></font><font color="#000000">String getName</font><font color="#000000">() {</font><br/>
<font color="#ffffff"> </font><font color="#7f0055"><b>return </b></font><font color="#2a00ff">"Marble Vein"</font><font color="#000000">;</font><br/>
<font color="#ffffff"> </font><font color="#000000">}</font><br/>
<font color="#000000">}</font>The last filter produces a fabric-like texture. It is in itself a chain of filters, each one producing an oriented fabric texture. Applying two differently oriented textures produces the following mix:

which is created by
<font color="#7f0055"><b>public class </b></font><font color="#000000">SubstanceFabricWatermark </font><font color="#7f0055"><b>extends </b></font><font color="#000000">SubstanceNoiseWatermark </font><font color="#000000">{</font><br/>
<font color="#ffffff"> </font><font color="#7f0055"><b>public </b></font><font color="#000000">SubstanceFabricWatermark</font><font color="#000000">() {</font><br/>
<font color="#ffffff"> </font><font color="#7f0055"><b>super</b></font><font color="#000000">(</font><font color="#000000">SubstanceFabricWatermark.getName</font><font color="#000000">()</font><font color="#000000">, </font><font color="#990000">0.1</font><font color="#000000">, </font><font color="#990000">0.1</font><font color="#000000">, false,</font><br/>
<font color="#ffffff"> </font><font color="#7f0055"><b>new </b></font><font color="#000000">FabricFilter</font><font color="#000000">(</font><font color="#000000">FabricFilterLink.getXLink</font><font color="#000000">(</font><font color="#990000">1.0</font><font color="#000000">, </font><font color="#990000">10.0</font><font color="#000000">,</font><br/>
<font color="#ffffff"> </font><font color="#000000">TrigKind.SINE</font><font color="#000000">)</font><font color="#000000">, FabricFilterLink.getYLink</font><font color="#000000">(</font><font color="#990000">1.0</font><font color="#000000">, </font><font color="#990000">10.0</font><font color="#000000">,</font><br/>
<font color="#ffffff"> </font><font color="#000000">TrigKind.COSINE</font><font color="#000000">))</font><font color="#000000">, </font><font color="#7f0055"><b>false</b></font><font color="#000000">)</font><font color="#000000">;</font><br/>
<font color="#ffffff"> </font><font color="#000000">}</font><br/>
<font color="#ffffff"></font><br/>
<font color="#ffffff"> </font><font color="#7f0055"><b>public static </b></font><font color="#000000">String getName</font><font color="#000000">() {</font><br/>
<font color="#ffffff"> </font><font color="#7f0055"><b>return </b></font><font color="#2a00ff">"Fabric"</font><font color="#000000">;</font><br/>
<font color="#ffffff"> </font><font color="#000000">}</font><br/>
<font color="#000000">}</font>The last transformation (and my favourite one) imitates copperplate engraving

and is created by a chain of wood, fabric and median filters:
<font color="#7f0055"><b>public class </b></font><font color="#000000">SubstanceCopperplateEngravingWatermark </font><font color="#7f0055"><b>extends</b></font><br/>
<font color="#ffffff"> </font><font color="#000000">SubstanceNoiseWatermark </font><font color="#000000">{</font><br/>
<font color="#ffffff"> </font><font color="#7f0055"><b>public </b></font><font color="#000000">SubstanceCopperplateEngravingWatermark</font><font color="#000000">() {</font><br/>
<font color="#ffffff"> </font><font color="#7f0055"><b>super</b></font><font color="#000000">(</font><font color="#000000">SubstanceCopperplateEngravingWatermark.getName</font><font color="#000000">()</font><font color="#000000">, </font><font color="#990000">0.01</font><font color="#000000">, </font><font color="#990000">0.01</font><font color="#000000">,</font><br/>
<font color="#ffffff"> </font><font color="#000000">false, </font><font color="#7f0055"><b>new </b></font><font color="#000000">CompoundNoiseFilter</font><font color="#000000">(</font><font color="#7f0055"><b>new </b></font><font color="#000000">WoodFilter</font><font color="#000000">(</font><font color="#990000">15.0</font><font color="#000000">)</font><font color="#000000">,</font><br/>
<font color="#ffffff"> </font><font color="#7f0055"><b>new </b></font><font color="#000000">FabricFilter</font><font color="#000000">(</font><font color="#000000">FabricFilterLink.getXLink</font><font color="#000000">(</font><font color="#990000">1.0</font><font color="#000000">, </font><font color="#990000">10.0</font><font color="#000000">,</font><br/>
<font color="#ffffff"> </font><font color="#000000">TrigKind.SINE</font><font color="#000000">)</font><font color="#000000">, FabricFilterLink.getYLink</font><font color="#000000">(</font><font color="#990000">1.0</font><font color="#000000">,</font><br/>
<font color="#ffffff"> </font><font color="#990000">10.0</font><font color="#000000">, TrigKind.COSINE</font><font color="#000000">))</font><font color="#000000">, </font><font color="#7f0055"><b>new </b></font><font color="#000000">MedianBeakFilter</font><font color="#000000">())</font><font color="#000000">,</font><br/>
<font color="#ffffff"> </font><font color="#7f0055"><b>true</b></font><font color="#000000">)</font><font color="#000000">;</font><br/>
<font color="#ffffff"> </font><font color="#000000">}</font><br/>
<font color="#ffffff"></font><br/>
<font color="#ffffff"> </font><font color="#7f0055"><b>public static </b></font><font color="#000000">String getName</font><font color="#000000">() {</font><br/>
<font color="#ffffff"> </font><font color="#7f0055"><b>return </b></font><font color="#2a00ff">"Copperplate Engraving"</font><font color="#000000">;</font><br/>
<font color="#ffffff"> </font><font color="#000000">}</font><br/>
<font color="#000000">}</font>In your application you can either use the above noise-based watermarks or create your own base and compound filters in just a few lines of code.
- Login or register to post comments
- Printer-friendly version
- kirillcool's blog
- 1320 reads





