mirror of https://github.com/GNOME/gimp.git
plug-ins/flame/flame.c Applied modified patch by Luis Barrancos that adds
2008-04-26 Martin Nordholts <martinn@svn.gnome.org> * plug-ins/flame/flame.c * plug-ins/flame/libifs.[ch]: Applied modified patch by Luis Barrancos that adds 22 new variations to the flame plugin (bug #389004). svn path=/trunk/; revision=25527
This commit is contained in:
parent
f532e425e0
commit
a2f9d1e5f7
|
@ -1,3 +1,10 @@
|
||||||
|
2008-04-26 Martin Nordholts <martinn@svn.gnome.org>
|
||||||
|
|
||||||
|
* plug-ins/flame/flame.c
|
||||||
|
* plug-ins/flame/libifs.[ch]: Applied
|
||||||
|
modified patch by Luis Barrancos that adds 22 new variations to
|
||||||
|
the flame plugin (bug #389004).
|
||||||
|
|
||||||
2008-04-25 Michael Natterer <mitch@gimp.org>
|
2008-04-25 Michael Natterer <mitch@gimp.org>
|
||||||
|
|
||||||
* app/paint/gimppaintoptions.c (gimp_paint_options_get_jitter):
|
* app/paint/gimppaintoptions.c (gimp_paint_options_get_jitter):
|
||||||
|
|
|
@ -742,15 +742,37 @@ edit_callback (GtkWidget *widget,
|
||||||
G_CALLBACK (randomize_callback),
|
G_CALLBACK (randomize_callback),
|
||||||
NULL);
|
NULL);
|
||||||
|
|
||||||
combo = gimp_int_combo_box_new (_("Same"), VARIATION_SAME,
|
combo = gimp_int_combo_box_new (_("Same"), VARIATION_SAME,
|
||||||
_("Random"), variation_random,
|
_("Random"), variation_random,
|
||||||
_("Linear"), 0,
|
_("Linear"), 0,
|
||||||
_("Sinusoidal"), 1,
|
_("Sinusoidal"), 1,
|
||||||
_("Spherical"), 2,
|
_("Spherical"), 2,
|
||||||
_("Swirl"), 3,
|
_("Swirl"), 3,
|
||||||
_("Horseshoe"), 4,
|
_("Horseshoe"), 4,
|
||||||
_("Polar"), 5,
|
_("Polar"), 5,
|
||||||
_("Bent"), 6,
|
_("Bent"), 6,
|
||||||
|
_("Handkerchief"), 7,
|
||||||
|
_("Heart"), 8,
|
||||||
|
_("Disc"), 9,
|
||||||
|
_("Spiral"), 10,
|
||||||
|
_("Hyperbolic"), 11,
|
||||||
|
_("Diamond"), 12,
|
||||||
|
_("Ex"), 13,
|
||||||
|
_("Julia"), 14,
|
||||||
|
_("Waves"), 15,
|
||||||
|
_("Fisheye"), 16,
|
||||||
|
_("Popcorn"), 17,
|
||||||
|
_("Exponential"), 18,
|
||||||
|
_("Power"), 19,
|
||||||
|
_("Cosine"), 20,
|
||||||
|
_("Rings"), 21,
|
||||||
|
_("Fan"), 22,
|
||||||
|
_("Eyefish"), 23,
|
||||||
|
_("Bubble"), 24,
|
||||||
|
_("Cylinder"), 25,
|
||||||
|
_("Noise"), 26,
|
||||||
|
_("Blur"), 27,
|
||||||
|
_("Gaussian"), 28,
|
||||||
NULL);
|
NULL);
|
||||||
|
|
||||||
gimp_int_combo_box_set_active (GIMP_INT_COMBO_BOX (combo),
|
gimp_int_combo_box_set_active (GIMP_INT_COMBO_BOX (combo),
|
||||||
|
|
|
@ -28,6 +28,8 @@
|
||||||
|
|
||||||
#define CHOOSE_XFORM_GRAIN 100
|
#define CHOOSE_XFORM_GRAIN 100
|
||||||
|
|
||||||
|
static int flam3_random_bit(void);
|
||||||
|
static double flam3_random01(void);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* run the function system described by CP forward N generations.
|
* run the function system described by CP forward N generations.
|
||||||
|
@ -114,7 +116,7 @@ void iterate(cp, n, fuse, points)
|
||||||
|
|
||||||
v = vari[2];
|
v = vari[2];
|
||||||
if (v > 0.0) {
|
if (v > 0.0) {
|
||||||
/* complex */
|
/* spherical */
|
||||||
double nx, ny;
|
double nx, ny;
|
||||||
double r2 = tx * tx + ty * ty + 1e-6;
|
double r2 = tx * tx + ty * ty + 1e-6;
|
||||||
nx = tx / r2;
|
nx = tx / r2;
|
||||||
|
@ -154,6 +156,7 @@ void iterate(cp, n, fuse, points)
|
||||||
|
|
||||||
v = vari[5];
|
v = vari[5];
|
||||||
if (v > 0.0) {
|
if (v > 0.0) {
|
||||||
|
/* polar */
|
||||||
double nx, ny;
|
double nx, ny;
|
||||||
if (tx < -EPS || tx > EPS ||
|
if (tx < -EPS || tx > EPS ||
|
||||||
ty < -EPS || ty > EPS)
|
ty < -EPS || ty > EPS)
|
||||||
|
@ -178,6 +181,318 @@ void iterate(cp, n, fuse, points)
|
||||||
p[1] += v * ny;
|
p[1] += v * ny;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
v = vari[7];
|
||||||
|
if (v > 0.0) {
|
||||||
|
/* folded handkerchief */
|
||||||
|
double theta, r2, nx, ny;
|
||||||
|
if (tx < -EPS || tx > EPS ||
|
||||||
|
ty < -EPS || ty > EPS)
|
||||||
|
theta = atan2( tx, ty );
|
||||||
|
else
|
||||||
|
theta = 0.0;
|
||||||
|
r2 = sqrt( tx * tx + ty * ty);
|
||||||
|
nx = sin(theta + r2) * r2;
|
||||||
|
ny = cos(theta - r2) * r2;
|
||||||
|
p[0] += v * nx;
|
||||||
|
p[1] += v * ny;
|
||||||
|
}
|
||||||
|
|
||||||
|
v = vari[8];
|
||||||
|
if (v > 0.0) {
|
||||||
|
/* heart */
|
||||||
|
double theta, r2, nx, ny;
|
||||||
|
if (tx < -EPS || tx > EPS ||
|
||||||
|
ty < -EPS || ty > EPS)
|
||||||
|
theta = atan2( tx, ty );
|
||||||
|
else
|
||||||
|
theta = 0.0;
|
||||||
|
r2 = sqrt( tx * tx + ty * ty );
|
||||||
|
theta *= r2;
|
||||||
|
nx = sin(theta) * r2;
|
||||||
|
ny = cos(theta) * -r2;
|
||||||
|
p[0] += v * nx;
|
||||||
|
p[1] += v * ny;
|
||||||
|
}
|
||||||
|
|
||||||
|
v = vari[9];
|
||||||
|
if (v > 0.0) {
|
||||||
|
/* disc */
|
||||||
|
double theta, r2, nx, ny;
|
||||||
|
if ( tx < -EPS || tx > EPS ||
|
||||||
|
ty < - EPS || ty > EPS)
|
||||||
|
theta = atan2( tx, ty );
|
||||||
|
else
|
||||||
|
theta = 0.0;
|
||||||
|
nx = tx * G_PI;
|
||||||
|
ny = ty * G_PI;
|
||||||
|
r2 = sqrt( nx * nx * ny * ny );
|
||||||
|
p[0] += v * sin(r2) * theta / G_PI;
|
||||||
|
p[1] += v * cos(r2) * theta / G_PI;
|
||||||
|
}
|
||||||
|
|
||||||
|
v = vari[10];
|
||||||
|
if ( v > 0.0 ) {
|
||||||
|
/* spiral */
|
||||||
|
double theta, r2;
|
||||||
|
if (tx < -EPS || tx > EPS ||
|
||||||
|
ty < -EPS || ty > EPS)
|
||||||
|
theta = atan2( tx, ty );
|
||||||
|
else
|
||||||
|
theta = 0.0;
|
||||||
|
r2 = sqrt( tx * tx + ty * ty ) + 1e-6;
|
||||||
|
p[0] += v * ( cos(theta) + sin(r2)) / r2;
|
||||||
|
p[1] += v * ( cos(theta) + cos(r2)) / r2;
|
||||||
|
}
|
||||||
|
|
||||||
|
v = vari[11];
|
||||||
|
if (v > 0.0) {
|
||||||
|
/* hyperbolic */
|
||||||
|
double theta, r2;
|
||||||
|
if (tx < -EPS || tx > EPS ||
|
||||||
|
ty < -EPS || ty > EPS)
|
||||||
|
theta = atan2( tx, ty );
|
||||||
|
else
|
||||||
|
theta = 0.0;
|
||||||
|
r2 = sqrt( tx * tx + ty * ty) + 1e-6;
|
||||||
|
p[0] += v * sin(theta) / r2;
|
||||||
|
p[1] += v * cos(theta) * r2;
|
||||||
|
}
|
||||||
|
|
||||||
|
v = vari[12];
|
||||||
|
if (v > 0.0 ) {
|
||||||
|
double theta, r2;
|
||||||
|
/* diamond */
|
||||||
|
if ( tx < -EPS || tx > EPS ||
|
||||||
|
ty < -EPS || ty > EPS)
|
||||||
|
theta = atan2( tx, ty );
|
||||||
|
else
|
||||||
|
theta = 0.0;
|
||||||
|
r2 = sqrt( tx * tx + ty * ty );
|
||||||
|
p[0] += v * sin(theta) * cos(r2);
|
||||||
|
p[1] += v * cos(theta) * sin(r2);
|
||||||
|
}
|
||||||
|
|
||||||
|
v = vari[13];
|
||||||
|
if ( v > 0.0 ) {
|
||||||
|
/* ex */
|
||||||
|
double theta, r2, n0, n1, m0, m1;
|
||||||
|
if ( tx < -EPS || tx > EPS ||
|
||||||
|
ty < -EPS || ty > EPS)
|
||||||
|
theta = atan2( tx, ty );
|
||||||
|
else
|
||||||
|
theta = 0.0;
|
||||||
|
r2 = sqrt( tx * tx + ty * ty );
|
||||||
|
n0 = sin(theta + r2);
|
||||||
|
n1 = cos(theta - r2);
|
||||||
|
m0 = n0 * n0 * n0 * r2;
|
||||||
|
m1 = n1 * n1 * n1 * r2;
|
||||||
|
p[0] += v * (m0 + m1);
|
||||||
|
p[1] += v * (m0 - m1);
|
||||||
|
}
|
||||||
|
|
||||||
|
v = vari[14];
|
||||||
|
if ( v > 0.0) {
|
||||||
|
double theta, r2, nx, ny;
|
||||||
|
/* julia */
|
||||||
|
if (tx < -EPS || tx > EPS ||
|
||||||
|
ty < -EPS || ty > EPS)
|
||||||
|
theta = atan2( tx, ty );
|
||||||
|
else
|
||||||
|
theta = 0.0;
|
||||||
|
if (flam3_random_bit()) theta += G_PI;
|
||||||
|
r2 = pow( tx * tx + ty * ty, 0.25);
|
||||||
|
nx = r2 * cos(theta);
|
||||||
|
ny = r2 * sin(theta);
|
||||||
|
p[0] += v * nx;
|
||||||
|
p[1] += v * ny;
|
||||||
|
}
|
||||||
|
|
||||||
|
v = vari[15];
|
||||||
|
if ( v > 0.0 ) {
|
||||||
|
/* waves */
|
||||||
|
double dx, dy, nx, ny;
|
||||||
|
dx = coef[2][0];
|
||||||
|
dy = coef[2][1];
|
||||||
|
nx = tx + coef[1][0] * sin(ty / ((dx*dx)+EPS));
|
||||||
|
ny = ty + coef[1][1] * sin(tx / ((dy*dy)+EPS));
|
||||||
|
p[0] += v * nx;
|
||||||
|
p[1] += v * ny;
|
||||||
|
}
|
||||||
|
|
||||||
|
v = vari[16];
|
||||||
|
if ( v > 0.0 ) {
|
||||||
|
/* fisheye */
|
||||||
|
double theta, r2, nx, ny;
|
||||||
|
if (tx < -EPS || tx > EPS ||
|
||||||
|
ty < -EPS || ty > EPS)
|
||||||
|
theta = atan2( tx, ty );
|
||||||
|
else
|
||||||
|
theta = 0.0;
|
||||||
|
r2 = sqrt( tx * tx + ty * ty );
|
||||||
|
r2 = 2 * r2 / (r2 + 1);
|
||||||
|
nx = r2 * cos(theta);
|
||||||
|
ny = r2 * sin(theta);
|
||||||
|
p[0] += v * nx;
|
||||||
|
p[1] += v * ny;
|
||||||
|
}
|
||||||
|
|
||||||
|
v = vari[17];
|
||||||
|
if (v > 0.0) {
|
||||||
|
/* popcorn */
|
||||||
|
double dx, dy, nx, ny;
|
||||||
|
dx = tan(3*ty);
|
||||||
|
dy = tan(3*tx);
|
||||||
|
nx = tx + coef[2][0] * sin(dx);
|
||||||
|
ny = ty + coef[2][1] * sin(dy);
|
||||||
|
p[0] += v * nx;
|
||||||
|
p[1] += v * ny;
|
||||||
|
}
|
||||||
|
|
||||||
|
v = vari[18];
|
||||||
|
if (v > 0.0) {
|
||||||
|
/* exponential */
|
||||||
|
double dx, dy, nx, ny;
|
||||||
|
dx = exp( tx - 1.0);
|
||||||
|
dy = G_PI * ty;
|
||||||
|
nx = cos(dy) * dx;
|
||||||
|
ny = sin(dy) * dx;
|
||||||
|
p[0] += v * nx;
|
||||||
|
p[1] += v * ny;
|
||||||
|
}
|
||||||
|
|
||||||
|
v = vari[19];
|
||||||
|
if (v > 0.0) {
|
||||||
|
/* power */
|
||||||
|
double theta, r2, tsin, tcos, nx, ny;
|
||||||
|
if (tx < -EPS || tx > EPS ||
|
||||||
|
ty < -EPS || ty > EPS)
|
||||||
|
theta = atan2( tx, ty );
|
||||||
|
else
|
||||||
|
theta = 0.0;
|
||||||
|
tsin = sin(theta);
|
||||||
|
tcos = cos(theta);
|
||||||
|
r2 = sqrt( tx * tx + ty * ty );
|
||||||
|
r2 = pow( r2, tsin);
|
||||||
|
nx = r2 * tcos;;
|
||||||
|
ny = r2 * tsin;
|
||||||
|
p[0] += v * nx;
|
||||||
|
p[1] += v * ny;
|
||||||
|
}
|
||||||
|
|
||||||
|
v = vari[20];
|
||||||
|
if (v > 0.0) {
|
||||||
|
/* cosine */
|
||||||
|
double nx, ny;
|
||||||
|
nx = cos(tx * G_PI) * cosh(ty);
|
||||||
|
ny = -sin(tx * G_PI) * sinh(ty);
|
||||||
|
p[0] += v * nx;
|
||||||
|
p[1] += v * ny;
|
||||||
|
}
|
||||||
|
|
||||||
|
v = vari[21];
|
||||||
|
if (v > 0.0) {
|
||||||
|
/* rings */
|
||||||
|
double theta, r2, dx, nx, ny;
|
||||||
|
if (tx < -EPS || tx > EPS ||
|
||||||
|
ty < -EPS || ty > EPS)
|
||||||
|
theta = atan2( tx, ty );
|
||||||
|
else
|
||||||
|
theta = 0;
|
||||||
|
dx = coef[2][0];
|
||||||
|
dx = dx * dx + EPS;
|
||||||
|
r2 = sqrt( tx * tx + ty * ty );
|
||||||
|
r2 = fmod( r2 + dx, 2 * dx) - dx + r2 * (1-dx);
|
||||||
|
nx = cos(theta) * r2;
|
||||||
|
ny = sin(theta) * r2;
|
||||||
|
p[0] += v * nx;
|
||||||
|
p[1] += v * ny;
|
||||||
|
}
|
||||||
|
|
||||||
|
v = vari[22];
|
||||||
|
if (v > 0.0) {
|
||||||
|
/* fan */
|
||||||
|
double theta, r2, dx, dy, dx2, nx, ny;
|
||||||
|
if (tx < -EPS || tx > EPS ||
|
||||||
|
ty < -EPS || ty > EPS)
|
||||||
|
theta = atan2( tx, ty );
|
||||||
|
else
|
||||||
|
theta = 0.0;
|
||||||
|
dx = coef[2][0];
|
||||||
|
dy = coef[2][1];
|
||||||
|
dx = G_PI * (dx * dx + EPS);
|
||||||
|
dx2 = dx / 2;
|
||||||
|
r2 = sqrt( tx * tx + ty * ty );
|
||||||
|
theta += (fmod(theta + dy, dx) > dx2) ? -dx2: dx2;
|
||||||
|
nx = cos(theta) * r2;
|
||||||
|
ny = sin(theta) * r2;
|
||||||
|
p[0] += v * nx;
|
||||||
|
p[1] += v * ny;
|
||||||
|
}
|
||||||
|
|
||||||
|
v = vari[23];
|
||||||
|
if (v > 0.0) {
|
||||||
|
/* eyefish */
|
||||||
|
double r2;
|
||||||
|
r2 = 2.0 * v / ( sqrt( tx * tx + ty * ty ) + 1.0 );
|
||||||
|
p[0] += r2 * tx;
|
||||||
|
p[1] += r2 * ty;
|
||||||
|
}
|
||||||
|
|
||||||
|
v = vari[24];
|
||||||
|
if (v > 0.0) {
|
||||||
|
/* bubble */
|
||||||
|
double r2;
|
||||||
|
r2 = v / ( (tx * tx + ty * ty) / 4 + 1 );
|
||||||
|
p[0] += r2 * tx;
|
||||||
|
p[1] += r2 * ty;
|
||||||
|
}
|
||||||
|
|
||||||
|
v = vari[25];
|
||||||
|
if (v > 0.0) {
|
||||||
|
/* cylinder */
|
||||||
|
double nx;
|
||||||
|
nx = sin(tx);
|
||||||
|
p[0] += v * nx;
|
||||||
|
p[1] += v * ty;
|
||||||
|
}
|
||||||
|
|
||||||
|
v = vari[26];
|
||||||
|
if (v > 0.0) {
|
||||||
|
/* noise */
|
||||||
|
double rx, sinr, cosr, nois;
|
||||||
|
rx = flam3_random01() * 2 * G_PI;
|
||||||
|
sinr = sin(rx);
|
||||||
|
cosr = cos(rx);
|
||||||
|
nois = flam3_random01();
|
||||||
|
p[0] += v * nois * tx * cosr;
|
||||||
|
p[1] += v * nois * ty * sinr;
|
||||||
|
}
|
||||||
|
|
||||||
|
v = vari[27];
|
||||||
|
if (v > 0.0) {
|
||||||
|
/* blur */
|
||||||
|
double rx, sinr, cosr, nois;
|
||||||
|
rx = flam3_random01() * 2 * G_PI;
|
||||||
|
sinr = sin(rx);
|
||||||
|
cosr = cos(rx);
|
||||||
|
nois = flam3_random01();
|
||||||
|
p[0] += v * nois * cosr;
|
||||||
|
p[1] += v * nois * sinr;
|
||||||
|
}
|
||||||
|
|
||||||
|
v = vari[28];
|
||||||
|
if (v > 0.0) {
|
||||||
|
/* gaussian */
|
||||||
|
double ang, sina, cosa, r2;
|
||||||
|
ang = flam3_random01() * 2 * G_PI;
|
||||||
|
sina = sin(ang);
|
||||||
|
cosa = cos(ang);
|
||||||
|
r2 = v * ( flam3_random01() + flam3_random01() + flam3_random01() +
|
||||||
|
flam3_random01() - 2.0 );
|
||||||
|
p[0] += r2 * cosa;
|
||||||
|
p[1] += r2 * sina;
|
||||||
|
}
|
||||||
|
|
||||||
/* if fuse over, store it */
|
/* if fuse over, store it */
|
||||||
if (i >= 0) {
|
if (i >= 0) {
|
||||||
points[i][0] = p[0];
|
points[i][0] = p[0];
|
||||||
|
@ -1172,3 +1487,23 @@ main()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
static int flam3_random_bit(void)
|
||||||
|
{
|
||||||
|
static int n = 0;
|
||||||
|
static int l;
|
||||||
|
if (0 == n) {
|
||||||
|
l = random();
|
||||||
|
n = 20;
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
l = l >> 1;
|
||||||
|
n--;
|
||||||
|
}
|
||||||
|
return l & 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
static double flam3_random01(void)
|
||||||
|
{
|
||||||
|
return (random() & 0xfffffff) / (double) 0xfffffff;
|
||||||
|
}
|
||||||
|
|
|
@ -31,7 +31,7 @@
|
||||||
|
|
||||||
#define variation_random (-1)
|
#define variation_random (-1)
|
||||||
|
|
||||||
#define NVARS 7
|
#define NVARS 29
|
||||||
#define NXFORMS 6
|
#define NXFORMS 6
|
||||||
|
|
||||||
typedef double point[3];
|
typedef double point[3];
|
||||||
|
|
Loading…
Reference in New Issue