/*
JWildfire - an image and animation processor written in Java
Copyright (C) 1995-2013 Andreas Maschke
This is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser
General Public License as published by the Free Software Foundation; either version 2.1 of the
License, or (at your option) any later version.
This software 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
Lesser General Public License for more details.
You should have received a copy of the GNU Lesser General Public License along with this software;
if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
02110-1301 USA, or see the FSF site: http://www.fsf.org.
*/
package org.jwildfire.create.tina.variation;
import static org.jwildfire.base.mathlib.MathLib.M_PI;
import static org.jwildfire.base.mathlib.MathLib.cos;
import static org.jwildfire.base.mathlib.MathLib.exp;
import static org.jwildfire.base.mathlib.MathLib.log;
import static org.jwildfire.base.mathlib.MathLib.sin;
import static org.jwildfire.base.mathlib.MathLib.sqrt;
import java.awt.Graphics2D;
import java.awt.RenderingHints;
import java.io.StringReader;
import java.util.ArrayList;
import java.util.List;
import org.jwildfire.base.Tools;
import org.jwildfire.create.tina.base.Layer;
import org.jwildfire.create.tina.base.XForm;
import org.jwildfire.create.tina.base.XYZPoint;
import org.jwildfire.create.tina.palette.RenderColor;
import org.jwildfire.image.Pixel;
import org.jwildfire.image.SimpleImage;
import com.kitfox.svg.SVGDiagram;
import com.kitfox.svg.SVGUniverse;
public class SVGWFFunc extends VariationFunc {
private static final long serialVersionUID = 1L;
private static final String PARAM_SCALEX = "scale_x";
private static final String PARAM_SCALEY = "scale_y";
private static final String PARAM_OFFSETX = "offset_x";
private static final String PARAM_OFFSETY = "offset_y";
private static final String PARAM_RESOLUTION_MULTIPLIER = "resolution_multiplier";
private static final String PARAM_PRE_ANTIALIAS = "pre_antialias";
private static final String PARAM_ANTIALIAS_RADIUS = "antialias_radius";
private static final String PARAM_TRUE_COLOR = "true_color";
private static final String RESSOURCE_SVG = "svg";
private static final String[] paramNames = { PARAM_ANTIALIAS_RADIUS, PARAM_RESOLUTION_MULTIPLIER, PARAM_TRUE_COLOR, PARAM_PRE_ANTIALIAS, PARAM_SCALEX, PARAM_SCALEY, PARAM_OFFSETX, PARAM_OFFSETY };
private static final String[] ressourceNames = { RESSOURCE_SVG };
private double antialias_radius = 0.5;
private double resolution_multiplier = 2.0;
private double scale_x = 1.0;
private double scale_y = 1.0;
private double offset_x = 0.0;
private double offset_y = 0.0;
private int true_color = 1;
private int pre_antialias = 1;
private String svg = "<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"no\"?>\r\n"
+
"<!-- Created with Inkscape (http://www.inkscape.org/) -->\r\n"
+
"\r\n"
+
"<svg\r\n"
+
" xmlns:dc=\"http://purl.org/dc/elements/1.1/\"\r\n"
+
" xmlns:cc=\"http://creativecommons.org/ns#\"\r\n"
+
" xmlns:rdf=\"http://www.w3.org/1999/02/22-rdf-syntax-ns#\"\r\n"
+
" xmlns:svg=\"http://www.w3.org/2000/svg\"\r\n"
+
" xmlns=\"http://www.w3.org/2000/svg\"\r\n"
+
" xmlns:sodipodi=\"http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd\"\r\n"
+
" xmlns:inkscape=\"http://www.inkscape.org/namespaces/inkscape\"\r\n"
+
" width=\"744.09448819\"\r\n"
+
" height=\"1052.3622047\"\r\n"
+
" id=\"svg2\"\r\n"
+
" version=\"1.1\"\r\n"
+
" inkscape:version=\"0.48.2 r9819\"\r\n"
+
" sodipodi:docname=\"drawing-1.svg\">\r\n"
+
" <defs\r\n"
+
" id=\"defs4\">\r\n"
+
" <inkscape:perspective\r\n"
+
" sodipodi:type=\"inkscape:persp3d\"\r\n"
+
" inkscape:vp_x=\"0 : 52.18109 : 1\"\r\n"
+
" inkscape:vp_y=\"0 : 100 : 0\"\r\n"
+
" inkscape:vp_z=\"74.09448 : 52.18109 : 1\"\r\n"
+
" inkscape:persp3d-origin=\"372.04724 : 350.78739 : 1\"\r\n"
+
" id=\"perspective2987\" />\r\n"
+
" </defs>\r\n"
+
" <sodipodi:namedview\r\n"
+
" id=\"base\"\r\n"
+
" pagecolor=\"#ffffff\"\r\n"
+
" bordercolor=\"#666666\"\r\n"
+
" borderopacity=\"1.0\"\r\n"
+
" inkscape:pageopacity=\"0.0\"\r\n"
+
" inkscape:pageshadow=\"2\"\r\n"
+
" inkscape:zoom=\"1.01\"\r\n"
+
" inkscape:cx=\"375\"\r\n"
+
" inkscape:cy=\"520\"\r\n"
+
" inkscape:document-units=\"px\"\r\n"
+
" inkscape:current-layer=\"layer1\"\r\n"
+
" showgrid=\"false\"\r\n"
+
" inkscape:object-paths=\"true\"\r\n"
+
" inkscape:window-width=\"1443\"\r\n"
+
" inkscape:window-height=\"752\"\r\n"
+
" inkscape:window-x=\"150\"\r\n"
+
" inkscape:window-y=\"150\"\r\n"
+
" inkscape:window-maximized=\"0\"\r\n"
+
" inkscape:snap-bbox=\"true\"\r\n"
+
" inkscape:snap-midpoints=\"true\"\r\n"
+
" inkscape:snap-page=\"true\" />\r\n"
+
" <metadata\r\n"
+
" id=\"metadata7\">\r\n"
+
" <rdf:RDF>\r\n"
+
" <cc:Work\r\n"
+
" rdf:about=\"\">\r\n"
+
" <dc:format>image/svg+xml</dc:format>\r\n"
+
" <dc:type\r\n"
+
" rdf:resource=\"http://purl.org/dc/dcmitype/StillImage\" />\r\n"
+
" </cc:Work>\r\n"
+
" </rdf:RDF>\r\n"
+
" </metadata>\r\n"
+
" <g\r\n"
+
" inkscape:label=\"Layer 1\"\r\n"
+
" inkscape:groupmode=\"layer\"\r\n"
+
" id=\"layer1\">\r\n"
+
" <path\r\n"
+
" style=\"fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1\"\r\n"
+
" d=\"m 127.72277,485.03545 c 31.90334,-18.92185 63.46475,-48.29786 100.9901,-55.44554 21.75599,25.44064 16.13838,57.96746 39.60396,80.19802\"\r\n"
+
" id=\"path3017\"\r\n"
+
" inkscape:connector-curvature=\"0\" />\r\n"
+
" <path\r\n"
+
" style=\"fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1\"\r\n"
+
" d=\"m 127.72277,485.03545 c 27.40577,12.60743 72.69091,20.82793 91.08911,28.71287 -29.68845,20.50926 -71.04375,23.76238 -99.0099,23.76238 62.2892,24.4275 116.71191,41.88104 145.54455,-7.92079 33.52518,62.25451 -11.68309,144.01327 -7.92079,147.52475 28.77833,-34.01701 31.87688,-78.4653 35.64357,-121.78218 31.45011,21.19881 22.7596,69.38298 16.83168,104.95049 22.50757,-46.98595 52.65168,-86.60691 16.83168,-130.69306 52.80883,8.51464 97.39876,98.58484 48.51485,125.74257 49.48087,-26.93421 22.7019,-71.65663 14.85149,-112.87129 58.32891,8.25915 61.24665,56.12934 57.42574,101.9802 27.7207,-43.16363 -0.11028,-90.13658 -12.87128,-132.67327 19.59577,37.42338 34.68607,61.69074 55.44554,98.01981 -5.86952,-35.46895 4.35123,-77.40751 -34.65347,-89.10892 82.02245,-30.00642 188.8403,-60.02123 274.25743,-74.25742 -152.49819,15.97231 -313.88105,29.84243 -461.38614,63.36634\"\r\n"
+
" id=\"path3019\"\r\n"
+
" inkscape:connector-curvature=\"0\" />\r\n"
+
" <path\r\n"
+
" sodipodi:type=\"spiral\"\r\n"
+
" style=\"fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1\"\r\n"
+
" id=\"path3025\"\r\n"
+
" sodipodi:cx=\"204.9505\"\r\n"
+
" sodipodi:cy=\"475.13446\"\r\n"
+
" sodipodi:expansion=\"1\"\r\n"
+
" sodipodi:revolution=\"5\"\r\n"
+
" sodipodi:radius=\"16.238831\"\r\n"
+
" sodipodi:argument=\"-30.760231\"\r\n"
+
" sodipodi:t0=\"0\"\r\n"
+
" d=\"m 204.9505,475.13446 c 0.38721,0.29785 -0.21046,0.6689 -0.49505,0.64356 -0.77121,-0.0687 -1.01692,-1.01295 -0.79208,-1.63366 0.40218,-1.1103 1.78298,-1.41433 2.77228,-0.94059 1.45184,0.69522 1.82182,2.56282 1.08911,3.91089 -0.9766,1.79676 -3.34609,2.23352 -5.04951,1.23762 -2.14357,-1.25323 -2.64736,-4.13096 -1.38614,-6.18812 1.52751,-2.49149 4.91673,-3.06244 7.32674,-1.53465 2.8401,1.80045 3.4783,5.70306 1.68317,8.46535 -2.07256,3.18917 -6.48977,3.89468 -9.60396,1.83168 -3.53855,-2.34411 -4.31143,-7.27673 -1.9802,-10.74257 2.61528,-3.88816 8.06389,-4.72844 11.88118,-2.12872 4.23793,2.88618 5.14564,8.8512 2.27723,13.0198 -3.15687,4.58783 -9.63861,5.563 -14.15841,2.42575 -4.93782,-3.42741 -5.98048,-10.42612 -2.57426,-15.29703 3.69781,-5.2879 11.21369,-6.39805 16.43564,-2.72278 5.63804,3.96812 6.8157,12.00133 2.87129,17.57426 -4.23834,5.98823 -12.789,7.23341 -18.71287,3.01981 -6.33847,-4.50851 -7.65117,-13.57673 -3.16832,-19.85149 4.77861,-6.68874 14.36448,-8.06898 20.9901,-3.31683 7.03904,5.04867 8.48683,15.15226 3.46535,22.12871\"\r\n"
+
" transform=\"translate(4.950495,0)\" />\r\n"
+
" <path\r\n"
+
" style=\"fill:#800080;stroke:none\"\r\n"
+
" d=\"m 259.7745,671.52373 c -0.0121,-0.29779 1.77946,-5.86709 3.98127,-12.37624 17.90134,-52.92115 19.47647,-92.83961 4.92438,-124.79897 -2.66807,-5.85964 -3.28148,-6.60301 -4.2879,-5.19639 -7.91178,11.05784 -10.41104,14.0805 -14.36895,17.37813 -6.6834,5.56845 -10.55999,7.71557 -19.47875,10.78862 -7.1563,2.46579 -9.21085,2.72511 -21.28712,2.68695 -19.52734,-0.0617 -38.59802,-4.51269 -70.62899,-16.48429 l -13.6983,-5.11975 13.32065,-0.63117 c 19.83444,-0.93981 37.86643,-4.24096 53.73152,-9.83671 13.80316,-4.8685 29.24786,-13.15091 27.53741,-14.76729 -1.26158,-1.19218 -16.33493,-5.84504 -45.90586,-14.17027 -14.43069,-4.06273 -30.11005,-8.88823 -34.84301,-10.72335 l -8.60538,-3.33656 25.2744,-16.83168 c 13.90092,-9.25743 29.3575,-19.18049 34.34796,-22.05125 9.27209,-5.33377 25.15646,-12.01966 33.57323,-14.1313 4.44237,-1.11453 4.80439,-1.05119 6.66088,1.16535 4.10823,4.90494 10.88635,19.71727 15.34427,33.53205 7.91773,24.53645 11.54719,32.23102 19.00914,40.29999 l 3.79297,4.10153 25.24752,-5.39621 c 60.93776,-13.02437 140.15376,-25.51264 228.21782,-35.97816 49.70987,-5.90752 163.71048,-17.94296 168.50195,-17.78934 l 2.78518,0.0893 -2.97029,0.80131 c -1.63367,0.44073 -10.54456,2.43115 -19.80199,4.42316 -38.45101,8.27389 -94.05431,23.11307 -140.59405,37.52116 -22.47655,6.95845 -71.36253,23.51517 -74.32215,25.17146 -1.61102,0.90158 -1.38602,1.19905 1.96646,2.5998 2.0821,0.86996 3.98987,1.58174 4.23951,1.58174 0.24962,0 2.85422,1.59327 5.78801,3.5406 3.37896,2.24283 6.80072,5.73684 9.3353,9.5324 6.30269,9.43835 8.26043,18.00156 9.91365,43.36264 0.55023,8.4406 1.24858,17.35149 1.55191,19.80198 0.54067,4.36801 0.43148,4.25144 -5.56436,-5.94059 -11.28784,-19.18761 -33.24238,-57.80367 -40.10699,-70.54455 -6.3928,-11.86521 -8.3459,-14.49874 -8.3459,-11.25349 0,0.75366 3.76341,12.04762 8.36312,25.09769 9.8071,27.82419 13.9566,43.07393 15.30389,56.24291 1.56345,15.28188 -1.04154,31.12073 -6.90571,41.98807 l -1.89882,3.51888 0.60016,-10.89109 c 0.71246,-12.92882 -0.88185,-30.78412 -3.66487,-41.04449 -6.70107,-24.70534 -26.19073,-41.76446 -51.64925,-45.20814 -4.00419,-0.54162 -4.70297,-0.38785 -4.70297,1.03492 0,0.9191 2.96187,13.11759 6.58193,27.10776 6.32531,24.44495 6.58588,25.9192 6.68316,37.81292 0.0845,10.32808 -0.24203,13.28141 -1.97302,17.84587 -2.06582,5.4474 -7.15705,14.34195 -7.82627,13.67274 -0.19341,-0.19341 0.47799,-2.79739 1.49198,-5.78661 8.48133,-25.00274 -3.8623,-59.9723 -30.15348,-85.42491 -5.44816,-5.2744 -16.03273,-12.55006 -21.93908,-15.08058 -4.48822,-1.92293 -16.54734,-5.43878 -17.02305,-4.96308 -0.1787,0.1787 1.7747,3.37818 4.34088,7.10995 9.6284,14.0017 12.7554,24.5587 11.98088,40.4484 -0.52932,10.85903 -2.33075,18.90281 -6.76292,30.19802 -3.06826,7.81932 -21.62517,45.88806 -22.12491,45.38832 -0.2308,-0.23081 0.31412,-4.85691 1.21095,-10.28022 2.45258,-14.83135 2.39384,-49.34462 -0.0977,-57.38533 -3.16873,-10.22626 -8.31497,-18.87809 -14.80058,-24.88261 -7.22075,-6.68515 -6.84782,-7.21034 -8.52928,12.01132 -3.63966,41.60701 -10.5748,68.85165 -22.72723,89.28374 -3.93742,6.62007 -7.9696,12.23814 -8.01323,11.16494 l 4e-5,0 z M 216.88262,487.45177 c 4.70973,-2.87169 6.57895,-7.20624 5.96672,-13.83625 l -0.50889,-5.51076 1.45462,3.39549 c 1.42763,3.3325 1.09171,6.75339 -1.21112,12.33367 -0.56691,1.37374 -0.40456,1.7457 0.61376,1.40625 0.76151,-0.25383 1.96779,-2.52654 2.68065,-5.05045 4.1868,-14.8237 -11.95208,-26.50793 -24.89784,-18.02554 -5.92045,3.87922 -7.88812,12.50757 -4.40291,19.30691 3.82127,7.45497 13.30557,10.24849 20.30501,5.98068 z\"\r\n"
+
" id=\"path3039\"\r\n" +
" inkscape:connector-curvature=\"0\" />\r\n" +
" </g>\r\n" +
"</svg>\r\n" +
"";
// private String svg = "<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"no\"?>\r\n"
// +
// "<!-- Created with Inkscape (http://www.inkscape.org/) -->\r\n"
// +
// "\r\n"
// +
// "<svg\r\n"
// +
// " xmlns:dc=\"http://purl.org/dc/elements/1.1/\"\r\n"
// +
// " xmlns:cc=\"http://creativecommons.org/ns#\"\r\n"
// +
// " xmlns:rdf=\"http://www.w3.org/1999/02/22-rdf-syntax-ns#\"\r\n"
// +
// " xmlns:svg=\"http://www.w3.org/2000/svg\"\r\n"
// +
// " xmlns=\"http://www.w3.org/2000/svg\"\r\n"
// +
// " xmlns:sodipodi=\"http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd\"\r\n"
// +
// " xmlns:inkscape=\"http://www.inkscape.org/namespaces/inkscape\"\r\n"
// +
// " width=\"744.09448819\"\r\n"
// +
// " height=\"1052.3622047\"\r\n"
// +
// " id=\"svg3073\"\r\n"
// +
// " version=\"1.1\"\r\n"
// +
// " inkscape:version=\"0.48.2 r9819\"\r\n"
// +
// " sodipodi:docname=\"New document 2\">\r\n"
// +
// " <defs\r\n"
// +
// " id=\"defs3075\" />\r\n"
// +
// " <sodipodi:namedview\r\n"
// +
// " id=\"base\"\r\n"
// +
// " pagecolor=\"#ffffff\"\r\n"
// +
// " bordercolor=\"#666666\"\r\n"
// +
// " borderopacity=\"1.0\"\r\n"
// +
// " inkscape:pageopacity=\"0.0\"\r\n"
// +
// " inkscape:pageshadow=\"2\"\r\n"
// +
// " inkscape:zoom=\"0.35\"\r\n"
// +
// " inkscape:cx=\"-67.857143\"\r\n"
// +
// " inkscape:cy=\"520\"\r\n"
// +
// " inkscape:document-units=\"px\"\r\n"
// +
// " inkscape:current-layer=\"layer1\"\r\n"
// +
// " showgrid=\"false\"\r\n"
// +
// " inkscape:window-width=\"1103\"\r\n"
// +
// " inkscape:window-height=\"779\"\r\n"
// +
// " inkscape:window-x=\"50\"\r\n"
// +
// " inkscape:window-y=\"50\"\r\n"
// +
// " inkscape:window-maximized=\"0\" />\r\n"
// +
// " <metadata\r\n"
// +
// " id=\"metadata3078\">\r\n"
// +
// " <rdf:RDF>\r\n"
// +
// " <cc:Work\r\n"
// +
// " rdf:about=\"\">\r\n"
// +
// " <dc:format>image/svg+xml</dc:format>\r\n"
// +
// " <dc:type\r\n"
// +
// " rdf:resource=\"http://purl.org/dc/dcmitype/StillImage\" />\r\n"
// +
// " <dc:title></dc:title>\r\n"
// +
// " </cc:Work>\r\n"
// +
// " </rdf:RDF>\r\n"
// +
// " </metadata>\r\n"
// +
// " <g\r\n"
// +
// " inkscape:label=\"Layer 1\"\r\n"
// +
// " inkscape:groupmode=\"layer\"\r\n"
// +
// " id=\"layer1\">\r\n"
// +
// " <path\r\n"
// +
// " sodipodi:type=\"spiral\"\r\n"
// +
// " style=\"fill:none;stroke:#ca0000;stroke-width:16.5;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none\"\r\n"
// +
// " id=\"path3083\"\r\n"
// +
// " sodipodi:cx=\"151.42857\"\r\n"
// +
// " sodipodi:cy=\"240.93361\"\r\n"
// +
// " sodipodi:expansion=\"1\"\r\n"
// +
// " sodipodi:revolution=\"5\"\r\n"
// +
// " sodipodi:radius=\"189.90868\"\r\n"
// +
// " sodipodi:argument=\"-30.630527\"\r\n"
// +
// " sodipodi:t0=\"0\"\r\n"
// +
// " d=\"m 151.42857,240.93361 c 4.03972,4.03973 -3.45241,7.43852 -6.71429,6.71428 -8.83948,-1.96265 -10.26047,-13.28493 -6.71427,-20.14286 6.34334,-12.26725 22.81557,-13.70434 33.57144,-6.71426 15.78467,10.25822 17.25027,32.4755 6.71424,47.00001 -14.04286,19.35888 -42.18132,20.83969 -60.42857,6.71423 -22.962309,-17.77545 -24.451617,-51.90903 -6.71422,-73.85715 21.48235,-26.58212 61.64905,-28.07656 87.28571,-6.71421 30.21193,25.17479 31.70969,71.39676 6.7142,100.71429 -28.85828,33.84826 -81.14958,35.34827 -114.14286,6.71419 -37.489056,-32.53587 -38.990671,-90.90602 -6.714174,-127.57144 36.209354,-41.13305 100.665074,-42.63584 141.000004,-6.71416 44.77941,39.87987 46.28308,110.42612 6.71415,154.42858 -43.54818,48.42756 -120.18868,49.93192 -167.857146,6.71414 C 12.065671,281.00445 10.560779,198.2668 57.428657,146.93353 108.30875,91.205765 197.14583,89.700442 252.14295,140.21941 c 59.3793,54.54434 60.88497,149.48269 6.7141,208.14286 -58.20772,63.03157 -159.248846,64.53753 -221.571432,6.71409 -66.684436,-61.87039 -68.190635,-169.01554 -6.71408,-235 65.532497,-70.337805 178.782712,-71.844205 248.428572,-6.71407 73.9916,69.19411 75.49818,188.55026 6.71406,261.85715\"\r\n"
// +
// " transform=\"translate(222.85714,262.85715)\" />\r\n" +
// " </g>\r\n" +
// "</svg>\r\n" +
// "";
@Override
public String[] getParameterNames() {
return paramNames;
}
@Override
public Object[] getParameterValues() {
return new Object[] { antialias_radius, resolution_multiplier, true_color, pre_antialias, scale_x, scale_y, offset_x, offset_y };
}
@Override
public void setParameter(String pName, double pValue) {
if (PARAM_ANTIALIAS_RADIUS.equalsIgnoreCase(pName))
antialias_radius = pValue;
else if (PARAM_RESOLUTION_MULTIPLIER.equalsIgnoreCase(pName)) {
resolution_multiplier = pValue;
if (resolution_multiplier < 0.1) {
resolution_multiplier = 0.1;
}
else if (resolution_multiplier > 100.0) {
resolution_multiplier = 100.0;
}
}
else if (PARAM_SCALEX.equalsIgnoreCase(pName))
scale_x = pValue;
else if (PARAM_SCALEY.equalsIgnoreCase(pName))
scale_y = pValue;
else if (PARAM_OFFSETX.equalsIgnoreCase(pName))
offset_x = pValue;
else if (PARAM_OFFSETY.equalsIgnoreCase(pName))
offset_y = pValue;
else if (PARAM_TRUE_COLOR.equalsIgnoreCase(pName))
true_color = Tools.FTOI(pValue);
else if (PARAM_PRE_ANTIALIAS.equalsIgnoreCase(pName))
pre_antialias = Tools.FTOI(pValue);
else
throw new IllegalArgumentException(pName);
}
private class Point {
private final double x, y;
private final int r, g, b;
public Point(double pX, double pY, int pR, int pG, int pB) {
x = pX;
y = pY;
r = pR;
g = pG;
b = pB;
}
}
private List<Point> _points;
private RenderColor[] renderColors;
private boolean previewMode = false;
@Override
public void init(FlameTransformationContext pContext, Layer pLayer, XForm pXForm, double pAmount) {
// renderColors = pContext.getFlameRenderer().getColorMap();
// TODO optimize
renderColors = pLayer.getPalette().createRenderPalette(pContext.getFlameRenderer().getFlame().getWhiteLevel());
lastR = lastG = lastB = -1;
previewMode = pContext.isPreview();
if (previewMode) {
resolution_multiplier = 0.25;
if (scale_x > 1.0) {
scale_x = 1.0;
}
if (scale_y > 1.0) {
scale_y = 1.0;
}
true_color = 1;
pre_antialias = 0;
}
}
private String makeRessourceKey() {
return getName() + "#" + resolution_multiplier + "#" + pre_antialias + "#" + svg;
}
@SuppressWarnings("unchecked")
private List<Point> getPoints() {
if (_points == null) {
String key = makeRessourceKey();
_points = (List<Point>) RessourceManager.getRessource(key);
if (_points == null) {
try {
SVGUniverse svgUniverse = new SVGUniverse();
StringReader reader = new StringReader(svg);
SVGDiagram diagram = svgUniverse.getDiagram(svgUniverse.loadSVG(reader, "svgImage"));
int imgWidth = Tools.FTOI(diagram.getWidth() * resolution_multiplier);
int imgHeight = Tools.FTOI(diagram.getHeight() * resolution_multiplier);
// SVGRoot root = diagram.getRoot();
// root.setAttribute("width", AnimationElement.AT_XML, Integer.toString(imgWidth));
// root.setAttribute("height", AnimationElement.AT_XML, Integer.toString(imgHeight));
// root.build();
SimpleImage imgMap = new SimpleImage(imgWidth, imgHeight);
Graphics2D g = imgMap.getBufferedImg().createGraphics();
g.scale(resolution_multiplier, resolution_multiplier);
if (pre_antialias != 0) {
g.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
g.setRenderingHint(RenderingHints.KEY_INTERPOLATION, RenderingHints.VALUE_INTERPOLATION_BICUBIC);
}
else {
g.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_OFF);
g.setRenderingHint(RenderingHints.KEY_INTERPOLATION, RenderingHints.VALUE_INTERPOLATION_BILINEAR);
}
diagram.render(g);
Pixel pixel = new Pixel();
_points = new ArrayList<Point>();
int xMin = imgMap.getImageWidth() - 1, xMax = 0;
int yMin = imgMap.getImageHeight() - 1, yMax = 0;
for (int i = 0; i < imgMap.getImageHeight(); i++) {
for (int j = 0; j < imgMap.getImageWidth(); j++) {
int argb = imgMap.getARGBValue(j, i);
if (argb != 0) {
if (j < xMin) {
xMin = j;
}
else if (j > xMax) {
xMax = j;
}
if (i < yMin) {
yMin = i;
}
else if (i > yMax) {
yMax = i;
}
}
}
}
int xSize = xMax - xMin;
int ySize = yMax - yMin;
int maxSize = xSize > ySize ? xSize : ySize;
if (maxSize > 0) {
for (int i = 0; i < imgMap.getImageHeight(); i++) {
for (int j = 0; j < imgMap.getImageWidth(); j++) {
int argb = imgMap.getARGBValue(j, i);
if (argb != 0) {
double x = ((j - xMin) - xSize / 2.0) / (double) maxSize;
double y = ((i - yMin) - ySize / 2.0) / (double) maxSize;
pixel.setARGBValue(argb);
_points.add(new Point(x, y, pixel.r, pixel.g, pixel.b));
}
}
}
}
}
catch (Exception ex) {
ex.printStackTrace();
_points = new ArrayList<Point>();
}
RessourceManager.putRessource(key, _points);
}
}
return _points;
}
@Override
public String[] getRessourceNames() {
return ressourceNames;
}
@Override
public byte[][] getRessourceValues() {
return new byte[][] { (svg != null ? svg.getBytes() : null) };
}
@Override
public void setRessource(String pName, byte[] pValue) {
if (RESSOURCE_SVG.equalsIgnoreCase(pName)) {
svg = pValue != null ? new String(pValue) : "";
_points = null;
}
else
throw new IllegalArgumentException(pName);
}
@Override
public RessourceType getRessourceType(String pName) {
if (RESSOURCE_SVG.equalsIgnoreCase(pName)) {
return RessourceType.SVG_FILE;
}
else
throw new IllegalArgumentException(pName);
}
@Override
public void transform(FlameTransformationContext pContext, XForm pXForm, XYZPoint pAffineTP, XYZPoint pVarTP, double pAmount) {
List<Point> points = getPoints();
if (points.size() > 1) {
Point point = points.get(pContext.random(points.size()));
double rawX = point.x;
double rawY = point.y;
if (antialias_radius > 0.01) {
double dr = (exp(antialias_radius * sqrt(-log(pContext.random()))) - 1.0) * 0.001;
double da = pContext.random() * 2.0 * M_PI;
rawX += dr * cos(da);
rawY += dr * sin(da);
}
pVarTP.x += (rawX * scale_x + offset_x);
pVarTP.y += (rawY * scale_y + offset_y);
if (true_color == 1) {
pVarTP.rgbColor = true;
pVarTP.redColor = point.r;
pVarTP.greenColor = point.g;
pVarTP.blueColor = point.b;
}
pVarTP.color = getColorIdx(point.r, point.g, point.b);
}
else {
pVarTP.x += pContext.random();
pVarTP.y += pContext.random();
pVarTP.rgbColor = true;
pVarTP.redColor = 0;
pVarTP.greenColor = 0;
pVarTP.blueColor = 0;
}
}
@Override
public String getName() {
return "svg_wf";
}
private double lastR, lastG, lastB;
private double lastColorIdx;
private double getColorIdx(double pR, double pG, double pB) {
if (pR == lastR && pG == lastG && pB == lastB) {
return lastColorIdx;
}
int nearestIdx = 0;
RenderColor color = renderColors[0];
double dr, dg, db;
dr = (color.red - pR);
dg = (color.green - pG);
db = (color.blue - pB);
double nearestDist = sqrt(dr * dr + dg * dg + db * db);
for (int i = 1; i < renderColors.length; i++) {
color = renderColors[i];
dr = (color.red - pR);
dg = (color.green - pG);
db = (color.blue - pB);
double dist = sqrt(dr * dr + dg * dg + db * db);
if (dist < nearestDist) {
nearestDist = dist;
nearestIdx = i;
}
}
lastColorIdx = (double) nearestIdx / (double) (renderColors.length - 1);
lastR = pR;
lastG = pG;
lastB = pB;
return lastColorIdx;
}
}