Web   ·   Wiki   ·   Activities   ·   Blog   ·   Lists   ·   Chat   ·   Meeting   ·   Bugs   ·   Git   ·   Translate   ·   Archive   ·   People   ·   Donate
summaryrefslogtreecommitdiffstats
path: root/src/engine/formulas.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/engine/formulas.c')
-rw-r--r--src/engine/formulas.c3038
1 files changed, 3038 insertions, 0 deletions
diff --git a/src/engine/formulas.c b/src/engine/formulas.c
new file mode 100644
index 0000000..239ff10
--- /dev/null
+++ b/src/engine/formulas.c
@@ -0,0 +1,3038 @@
+/*
+ * XaoS, a fast portable realtime fractal zoomer
+ * Copyright (C) 1996,1997 by
+ *
+ * Jan Hubicka (hubicka@paru.cas.cz)
+ * Thomas Marsh (tmarsh@austin.ibm.com)
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program 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 General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ */
+#ifdef _plan9_
+#include <u.h>
+#include <libc.h>
+#include <stdio.h>
+#else
+/* Hello reader!
+ * code you are looking at is dangerous for both you and your hardware! PLEASE
+ * CLOSE THIS FILE UNLESS YOU REALY KNOW WHAT YOU ARE DOING.
+ *
+ * Main purpose of this file is to generate optimal caluclation loops for
+ * various formulas/algorithms. It heavily includes docalc.c - set of
+ * caluclation loops, that then uses macros instad of formulas. This lets me
+ * to change calculation loops easily. At the other hand it looks very ugly.
+ * You have been warned :)
+ */
+
+// Some help can be read below about line 700. :-)
+
+
+#ifndef _MAC
+#include <aconfig.h>
+#endif
+
+#ifdef HAVE_LIMITS_H
+#include <limits.h>
+#endif
+#include <string.h>
+#include <stdlib.h>
+#include <math.h>
+#include <float.h>
+#ifdef __EMX__
+#include <sys/cdefs.h>
+#endif
+#include <stdio.h>
+#endif /*plan9 */
+#include <archaccel.h>
+#include <config.h>
+#include <complex.h>
+#include <filter.h>
+#include <fractal.h>
+#include "julia.h"
+#include <ui_helper.h>
+#ifndef M_PI
+#define M_PI 3.1415
+#endif
+
+#ifdef SLOWFUNCPTR
+#define FUNCTYPE INLINE
+#else
+#define FUNCTYPE
+#endif
+
+#ifdef SFFE_USING
+#include "sffe.h"
+
+extern struct uih_context *globaluih; // to be able to use sffe parser
+#endif
+
+CONST char *CONST incolorname[] = {
+ "0",
+ "zmag",
+ "Decomposition-like",
+ "real/imag",
+ "abs(abs(c)-abs(r))",
+ "cos(mag)",
+ "mag*cos(real^2)",
+ "sin(real^2-imag^2)",
+ "atan(real*imag*creal*cimag)",
+ "squares",
+ "True-color",
+ NULL
+};
+
+CONST char *CONST outcolorname[] = {
+ "iter",
+ "iter+real",
+ "iter+imag",
+ "iter+real/imag",
+ "iter+real+imag+real/imag",
+ "binary decomposition",
+ "biomorphs",
+ "potential",
+ "color decomposition",
+ "smooth",
+ "True-color",
+ NULL
+};
+
+CONST char *CONST tcolorname[] = {
+ "black",
+ "re*im sin(re^2) angle",
+ "sin(re) sin(im) sin(square)",
+ "hsv",
+ "hsv2",
+ "cos(re^c) cos(im^2) cos(square)",
+ "abs(re^2) abs(im^2) abs(square)",
+ "re*im re*re im*im",
+ "abs(im*cim) abs(re*cre) abs(re*cim)",
+ "abs(re*im-csqr) abs(re^2-csqr) abs(im^2-csqr)",
+ "angle angle2 angle",
+ "Disable truecolor colouring",
+ "simple red (for education purposes)",
+ "simple blue (for education purposes)",
+ NULL
+};
+
+#define SHIFT 8
+#define SMUL 256
+
+#define __GNUC__EGCS
+/* i386 fp comparsions are incredibly slow. We get much better results when we
+ do it in integer unit. This trick works well for numbers>0*/
+#ifdef __GNUC__EGCS
+#ifdef __i386__121
+
+/* Use union to be alias-analysis correct. */
+typedef union {
+ unsigned int *i;
+ float *f;
+} fpint;
+#define less_than_4(x) ({float tmp=(x); fpint ptr; ptr.f=&tmp;*ptr.i<0x40800000U;})
+#define less_than_0(x) ({float tmp=(x); fpint ptr; ptr.f=&tmp;*ptr.i&0x80000000U;})
+#define greater_then_1Em6(x) ({float tmp=(x); fpint ptr; ptr.f=&tmp;*ptr.i>(unsigned int)0x358637bdU;})
+#define abs_less_than(x,y) ({float tmp=(x), tmp2=(y); fpint ptr, ptr2; ptr.f=&tmp; ptr2.f=&tmp2;(*ptr.i&~0x80000000U)<*ptr2.i;})
+#define greater_than(x,y) ({float tmp=(x), tmp2=(y); fpint ptr, ptr2; ptr.f=&tmp; ; ptr2.f=&tmp2;*ptr.i>*ptr2.i;})
+#endif
+#endif
+#ifndef less_than_4
+#define less_than_0(x) ((x)<0)
+#define less_than_4(x) ((x)<cfractalc.bailout)
+#define greater_then_1Em6(n) ((n)>1E-6)
+#define abs_less_than(x,y) (myabs(x)<y)
+#define greater_than(x,y) ((x)>(y))
+#endif
+
+
+
+#define PERIINOUTPUT() STAT(nperi++;ninside2++);return(cpalette.pixels[0])
+
+#define OUTOUTPUT() STAT(niter2+=iter);return(!cfractalc.coloringmode?cpalette.pixels[(iter%(cpalette.size-1))+1]:color_output(zre,zim,iter))
+#define INOUTPUT() STAT(niter1+=iter;ninside2++);return(cfractalc.incoloringmode?incolor_output(zre,zim,pre,pim,iter):cpalette.pixels[0])
+
+#define OUTPUT() if(iter>=(unsigned int)cfractalc.maxiter)\
+ { \
+ if(cfractalc.incoloringmode==10) return(truecolor_output(zre,zim,pre,pim,cfractalc.intcolor,1)); \
+ INOUTPUT(); \
+ } \
+ else { \
+ if(cfractalc.coloringmode==10) return(truecolor_output(zre,zim,pre,pim,cfractalc.outtcolor,0)); \
+ OUTOUTPUT(); \
+ }
+
+#define SMOOTHOUTPUT() {PRESMOOTH;zre+=0.000001;szmag+=0.000001; \
+ iter=(int)(((cfractalc.maxiter-iter)*256+log((double)(cfractalc.bailout/(szmag)))/log((double)((zre)/(szmag)))*256)); \
+ if (iter < 0) {\
+ iter = (((unsigned int)(cpalette.size - 1)) << 8) - ((-iter) % (((unsigned int)(cpalette.size - 1)) << 8))-1; \
+ if (iter < 0) iter=0; \
+ } \
+ iter %= ((unsigned int)(cpalette.size - 1)) << 8; \
+ \
+ if ((cpalette.type & (C256 | SMALLITER)) || !(iter & 255)) \
+ return (cpalette.pixels[1 + (iter >> 8)]); \
+ { \
+ unsigned int i1, i2; \
+ i1 = cpalette.pixels[1 + (iter >> 8)]; \
+ if ((iter >> 8) == (unsigned int)(cpalette.size - 2)) \
+ i2 = cpalette.pixels[1]; \
+ else \
+ i2 = cpalette.pixels[2 + (iter >> 8)]; \
+ iter &= 255; \
+ return (interpoltype (cpalette, i2, i1, iter)); \
+ } \
+ }
+/* 2009-07-30 JB Langston:
+ * Fixing bug #3: HSV modes are completely black when compiled with GCC 4...
+ * Removed CONSTF qualifier from hsv_to_rgb declaration. CONSTF macro is
+ * defined to __attribute__((__const__)), on which I found some more details
+ * here: http://unixwiz.net/techtips/gnu-c-attributes.html#const. Apparently
+ * this should never be used with a function that takes a pointer or relies on
+ * side-effects, and hsv_to_rgb does both. Therefore, it should never have
+ * been declared this way in the first place.
+ */
+
+static INLINE void
+hsv_to_rgb(int h, int s, int v, int *red, int *green, int *blue) /*CONSTF*/;
+static INLINE void
+hsv_to_rgb(int h, int s, int v, int *red, int *green, int *blue)
+{
+ int hue;
+ int f, p, q, t;
+
+ if (s == 0) {
+ *red = v;
+ *green = v;
+ *blue = v;
+ } else {
+ h %= 256;
+ if (h < 0)
+ h += 256;
+ hue = h * 6;
+
+ f = hue & 255;
+ p = v * (256 - s) / 256;
+ q = v * (256 - (s * f) / 256) >> 8;
+ t = v * (256 * 256 - (s * (256 - f))) >> 16;
+
+ switch ((int) (hue / 256)) {
+ case 0:
+ *red = v;
+ *green = t;
+ *blue = p;
+ break;
+ case 1:
+ *red = q;
+ *green = v;
+ *blue = p;
+ break;
+ case 2:
+ *red = p;
+ *green = v;
+ *blue = t;
+ break;
+ case 3:
+ *red = p;
+ *green = q;
+ *blue = v;
+ break;
+ case 4:
+ *red = t;
+ *green = p;
+ *blue = v;
+ break;
+ case 5:
+ *red = v;
+ *green = p;
+ *blue = q;
+ break;
+ }
+ }
+}
+
+static unsigned int
+truecolor_output(number_t zre, number_t zim, number_t pre, number_t pim,
+ int mode, int inset)
+CONSTF REGISTERS(3);
+REGISTERS(3)
+static unsigned int
+truecolor_output(number_t zre, number_t zim, number_t pre,
+ number_t pim, int mode, int inset)
+{
+ /* WARNING: r and b fields are swapped for HISTORICAL REASONS (BUG :),
+ * in other words: use r for blue and b for red. */
+ int r = 0, g = 0, b = 0, w = 0;
+
+ switch (mode) {
+ case 0:
+ break;
+ case 1:
+ b = (int) ((sin((double) atan2((double) zre, (double) zim) * 20) +
+ 1) * 127);
+ w = (int) ((sin((double) zim / zre)) * 127);
+ r = (int) ((int) (zre * zim));
+ g = (int) ((sin((double) (zre * zre) / 2) + 1) * 127);
+ break;
+ case 2:
+ if (!inset) {
+ r = (int) ((sin((double) zre * 2) + 1) * 127);
+ g = (int) ((sin((double) zim * 2) + 1) * 127);
+ b = (int) ((sin((double) (zim * zim + zre * zre) / 2) +
+ 1) * 127);
+ } else {
+ r = (int) ((sin((double) zre * 50) + 1) * 127);
+ g = (int) ((sin((double) zim * 50) + 1) * 127);
+ b = (int) ((sin((double) (zim * zim + zre * zre) * 50) +
+ 1) * 127);
+ }
+ w = (int) ((sin((double) zim / zre)) * 127);
+ break;
+ case 3:
+ if (inset)
+ hsv_to_rgb((int)
+ (atan2((double) zre, (double) zim) * 256 / M_PI),
+ (int) ((sin((double) (zre * 50)) + 1) * 128),
+ (int) ((sin((double) (zim * 50)) + 1) * 128), &r,
+ &g, &b);
+ else
+ hsv_to_rgb((int)
+ (atan2((double) zre, (double) zim) * 256 / M_PI),
+ (int) ((sin((double) zre) + 1) * 128),
+ (int) ((sin((double) zim) + 1) * 128), &r, &g, &b);
+ break;
+ case 4:
+ if (inset)
+ hsv_to_rgb((int)
+ (sin((double) (zre * zre + zim * zim) * 0.1) * 256),
+ (int) (sin(atan2((double) zre, (double) zim) * 10) *
+ 128 + 128),
+ (int) ((sin((double) (zre + zim) * 10)) * 65 + 128),
+ &r, &g, &b);
+ else
+ hsv_to_rgb((int)
+ (sin((double) (zre * zre + zim * zim) * 0.01) *
+ 256),
+ (int) (sin(atan2((double) zre, (double) zim) * 10) *
+ 128 + 128),
+ (int) ((sin((double) (zre + zim) * 0.3)) * 65 +
+ 128), &r, &g, &b);
+ break;
+ case 5:
+ {
+ if (!inset) {
+ r = (int) (cos((double) myabs(zre * zre)) * 128) + 128;
+ g = (int) (cos((double) myabs(zre * zim)) * 128) + 128;
+ b = (int) (cos((double) myabs(zim * zim + zre * zre)) *
+ 128) + 128;
+ } else {
+ r = (int) (cos((double) myabs(zre * zre) * 10) * 128) +
+ 128;
+ g = (int) (cos((double) myabs(zre * zim) * 10) * 128) +
+ 128;
+ b = (int) (cos((double) myabs(zim * zim + zre * zre) * 10)
+ * 128) + 128;
+ }
+ }
+ break;
+ case 6:
+ {
+ if (!inset) {
+ r = (int) (zre * zim * 64);
+ g = (int) (zre * zre * 64);
+ b = (int) (zim * zim * 64);
+ } else
+ r = (int) (zre * zim * 256);
+ g = (int) (zre * zre * 256);
+ b = (int) (zim * zim * 256);
+ }
+ break;
+ case 7:
+ {
+ if (!inset) {
+ r = (int) ((zre * zre + zim * zim - pre * pre -
+ pim * pim) * 16);
+ g = (int) ((zre * zre * 2 - pre * pre - pim * pim) * 16);
+ b = (int) ((zim * zim * 2 - pre * pre - pim * pim) * 16);
+ } else {
+ r = (int) ((zre * zre + zim * zim - pre * pre -
+ pim * pim) * 256);
+ g = (int) ((zre * zre * 2 - pre * pre - pim * pim) * 256);
+ b = (int) ((zim * zim * 2 - pre * pre - pim * pim) * 256);
+ }
+ }
+ break;
+ case 8:
+ {
+ if (!inset) {
+ r = (int) ((myabs(zim * pim)) * 64);
+ g = (int) ((myabs(zre * pre)) * 64);
+ b = (int) ((myabs(zre * pim)) * 64);
+ } else {
+ r = (int) ((myabs(zim * pim)) * 256);
+ g = (int) ((myabs(zre * pre)) * 256);
+ b = (int) ((myabs(zre * pim)) * 256);
+ }
+ }
+ break;
+ case 9:
+ {
+ if (!inset) {
+ r = (int) ((myabs(zre * zim - pre * pre - pim * pim)) *
+ 64);
+ g = (int) ((myabs(zre * zre - pre * pre - pim * pim)) *
+ 64);
+ b = (int) ((myabs(zim * zim - pre * pre - pim * pim)) *
+ 64);
+ } else {
+ r = (int) ((myabs(zre * zim - pre * pre - pim * pim)) *
+ 256);
+ g = (int) ((myabs(zre * zre - pre * pre - pim * pim)) *
+ 256);
+ b = (int) ((myabs(zim * zim - pre * pre - pim * pim)) *
+ 256);
+ }
+ }
+ break;
+ case 10:
+ {
+ r = (int) (atan2((double) zre, (double) zim) * 128 / M_PI) +
+ 128;
+ g = (int) (atan2((double) zre, (double) zim) * 128 / M_PI) +
+ 128;
+ b = (int) (atan2((double) zim, (double) zre) * 128 / M_PI) +
+ 128;
+ }
+ break;
+ // case 11 is for disabling truecolor mode
+ case 12:
+ {
+ b = 255;
+ g = 0;
+ r = 0;
+ w = 50;
+ }
+ break;
+ case 13:
+ {
+ r = 255;
+ g = 0;
+ b = 0;
+ w = 0;
+ }
+ break;
+ }
+
+ r += w;
+ g += w;
+ b += w;
+ if (r < 0)
+ r = 0;
+ else if (r > 255)
+ r = 255;
+ if (g < 0)
+ g = 0;
+ else if (g > 255)
+ g = 255;
+ if (b < 0)
+ b = 0;
+ else if (b > 255)
+ b = 255;
+
+ switch (cpalette.type) {
+ case GRAYSCALE:
+ return ((unsigned int) (r * 76 + g * 151 + b * 29) *
+ (cpalette.end - cpalette.start) >> 16) + cpalette.start;
+ case TRUECOLOR:
+ case TRUECOLOR24:
+ case TRUECOLOR16:
+ r >>= cpalette.info.truec.bprec;
+ g >>= cpalette.info.truec.gprec;
+ b >>= cpalette.info.truec.rprec;
+ return ((r << cpalette.info.truec.bshift) +
+ (g << cpalette.info.truec.gshift) +
+ (b << cpalette.info.truec.rshift));
+ }
+
+ return cpalette.pixels[inset];
+}
+
+#ifdef __alpha__
+#define __TEST__
+#endif
+static unsigned int
+color_output(number_t zre, number_t zim, unsigned int iter)
+CONSTF REGISTERS(3);
+static unsigned int
+REGISTERS(3) color_output(number_t zre, number_t zim, unsigned int iter)
+{
+ int i;
+ iter <<= SHIFT;
+ i = iter;
+
+ switch (cfractalc.coloringmode) {
+ case 9:
+ break;
+ case 1: /* real */
+ i = (int) (iter + zre * SMUL);
+ break;
+ case 2: /* imag */
+ i = (int) (iter + zim * SMUL);
+ break;
+ case 3: /* real / imag */
+#ifdef __TEST__
+ if (zim != 0)
+#endif
+ i = (int) (iter + (zre / zim) * SMUL);
+ break;
+ case 4: /* all of the above */
+#ifdef __TEST__
+ if (zim != 0)
+#endif
+ i = (int) (iter + (zre + zim + zre / zim) * SMUL);
+ break;
+ case 5:
+ if (zim > 0)
+ i = ((cfractalc.maxiter << SHIFT) - iter);
+ break;
+ case 6:
+ if (myabs(zim) < 2.0 || myabs(zre) < 2.0)
+ i = ((cfractalc.maxiter << SHIFT) - iter);
+ break;
+ case 7:
+ zre = zre * zre + zim * zim;
+#ifdef __TEST__
+ if (zre < 1 || !i)
+ i = 0;
+ else
+#endif
+ i = (int) (sqrt(log((double) zre) / i) * 256 * 256);
+ break;
+ default:
+ case 8:
+ i = (int) ((atan2((double) zre, (double) zim) / (M_PI + M_PI) +
+ 0.75) * 20000);
+ break;
+ }
+
+ if (i < 0) {
+ i = (((unsigned int) (cpalette.size - 1)) << 8) -
+ ((-i) % (((unsigned int) (cpalette.size - 1) << 8))) - 1;
+ if (i < 0)
+ i = 0;
+ }
+ iter = ((unsigned int) i) % ((cpalette.size - 1) << 8);
+ if ((cpalette.type & (C256 | SMALLITER)) || !(iter & 255))
+ return (cpalette.pixels[1 + (iter >> 8)]);
+ {
+ unsigned int i1, i2;
+
+ i1 = cpalette.pixels[1 + (iter >> 8)];
+
+ if ((int) (iter >> 8) == cpalette.size - 2)
+ i2 = cpalette.pixels[1];
+ else
+ i2 = cpalette.pixels[2 + (iter >> 8)];
+
+ iter &= 255;
+ return (interpoltype(cpalette, i2, i1, iter));
+ }
+
+}
+
+static unsigned int
+incolor_output(number_t zre, number_t zim, number_t pre, number_t pim,
+ unsigned int iter)
+CONSTF REGISTERS(3);
+REGISTERS(3)
+static unsigned int
+incolor_output(number_t zre, number_t zim, number_t pre, number_t pim,
+ unsigned int iter)
+{
+ int i = iter;
+ switch (cfractalc.incoloringmode) {
+ case 1: /* zmag */
+ i = (int) (((zre * zre + zim * zim) *
+ (number_t) (cfractalc.maxiter >> 1) * SMUL + SMUL));
+ break;
+ case 2: /* real */
+ i = (int) (((atan2((double) zre, (double) zim) / (M_PI + M_PI) +
+ 0.75) * 20000));
+ break;
+ default:
+ break;
+ case 3: /* real / imag */
+ i = (int) (100 + (zre / zim) * SMUL * 10);
+ break;
+ case 4:
+ zre = myabs(zre);
+ zim = myabs(zim);
+ pre = myabs(pre);
+ pre = myabs(pim);
+ i += (int) (myabs(pre - zre) * 256 * 64);
+ i += (int) (myabs(pim - zim) * 256 * 64);
+ break;
+ case 5:
+ if (((int) ((zre * zre + zim * zim) * 10)) % 2)
+ i = (int) (cos((double) (zre * zim * pre * pim)) * 256 * 256);
+ else
+ i = (int) (sin((double) (zre * zim * pre * pim)) * 256 * 256);
+ break;
+ case 6:
+ i = (int) ((zre * zre +
+ zim * zim) * cos((double) (zre * zre)) * 256 * 256);
+ break;
+ case 7:
+ i = (int) (sin((double) (zre * zre - zim * zim)) * 256 * 256);
+ break;
+ case 8:
+ i = (int) (atan((double) (zre * zim * pre * pim)) * 256 * 64);
+ break;
+ case 9:
+ if ((abs((int) (zre * 40)) % 2) ^ (abs((int) (zim * 40)) % 2))
+ i = (int) (((atan2((double) zre, (double) zim) /
+ (M_PI + M_PI) + 0.75)
+ * 20000));
+ else
+ i = (int) (((atan2((double) zim, (double) zre) /
+ (M_PI + M_PI) + 0.75)
+ * 20000));
+ break;
+ };
+
+ if (i < 0) {
+ i = (((unsigned int) (cpalette.size - 1)) << 8) -
+ ((-i) % (((unsigned int) (cpalette.size - 1) << 8))) - 1;
+ if (i < 0)
+ i = 0;
+ }
+ iter = ((unsigned int) i) % ((cpalette.size - 1) << 8);
+
+ if ((cpalette.type & (C256 | SMALLITER)) || !(iter & 255))
+ return (cpalette.pixels[1 + ((unsigned int) iter >> 8)]);
+ {
+ unsigned int i1, i2;
+ i1 = cpalette.pixels[1 + ((unsigned int) iter >> 8)];
+ if (((unsigned int) iter >> 8) ==
+ (unsigned int) (cpalette.size - 2))
+ i2 = cpalette.pixels[1];
+ else
+ i2 = cpalette.pixels[2 + ((unsigned int) iter >> 8)];
+ iter &= 255;
+ return (interpoltype(cpalette, i2, i1, iter));
+ }
+
+}
+
+#define VARIABLES
+#define INIT
+#define UNCOMPRESS
+#define USEHACKS
+#define PRETEST 0
+#define FORMULA \
+ zim=(zim*zre)*2+pim; \
+ zre = rp - ip + pre; \
+ ip=zim*zim; \
+ rp=zre*zre;
+#ifdef _NEVER_
+#ifdef __GNUC__
+#ifdef __i386__
+#ifndef NOASSEMBLY
+/* The hand optimized internal loops can save extra 9% of CPU speed compared
+ to latest GCC snapshot. */
+
+/* GCC has ugly support for asm statements with fp input/output, so we use
+ * memory. */
+#define NSFORMULALOOP(iter) \
+{ int tmp; \
+asm( \
+"movl %%edx, %1\n\t" \
+"fldt %9\n\t" \
+"fxch %%st(2)\n\t" \
+"fldt %8\n\t" \
+"fxch %%st(2)\n\t" \
+"fld %%st(0)\n\t" \
+".align 16\n\t" \
+"1:\n\t" \
+"fld %%st(0)\n\t" /* zre zre zim pre pim */ \
+"fxch %%st(2)\n\t" /* zim zre zre ... */ \
+"fmul %%st(0),%%st(2)\n\t" /* zim zre zim*zre */ \
+"movl %1,%%eax\n\t" \
+"fmul %%st(0),%%st(0)\n\t" /* zim*zim zre zim*zre */ \
+"fxch %%st(2)\n\t" /* zim*zre zre zim*zim */ \
+"fadd %%st(0),%%st(0)\n\t" /* 2*zre*zim zre zim*zim */ \
+"fxch %%st(1)\n\t" /* zre 2*zre*zim zim*zim */ \
+"fmul %%st(0),%%st(0)\n\t" /* zre*zre 2*zre*zim zim*zim */ \
+"fxch %%st(1)\n\t" /* 2*zre*zim zre*zre zim*zim */ \
+"fld %%st(2)\n\t" /* zim*zim 2*zre*zim zre*zre zim*zim */ \
+"fsub %%st(4),%%st(0)\n\t" /* zim*zim-pre 2*zre*zim zre*zre zim*zim */ \
+"fxch %%st(3)\n\t" /* zim*zim 2*zre*zim zre*zre zim*zim-pre */ \
+"fadd %%st(2),%%st(0)\n\t" /* zim*zim+zre*zre 2*zre*zim zre*zre zim*zim-pre */ \
+"fxch %%st(1)\n\t" /* 2*zre*zim zim*zim+zre*zre zre*zre zim*zim-pre */ \
+"fadd %%st(5),%%st(0)\n\t" /* 2*zre*zim*pim zim*zim+zre*zre zre*zre zim*zim-pre*/ \
+"fxch %%st(3)\n\t" /* zim*zim-pre zim*zim+zre*zre zre*zre 2*zre*zim+pim */ \
+"fsubp %%st(0),%%st(2)\n\t" /* zim*zim+zre*zre zre*zre-zim*zim+pre 2*zre*zim+pim */ \
+"cmpl %%edx,%%eax\n\t" \
+"ja 2f\n\t" /* cond branch */ \
+"fstps %1\n\t" /* aa-bb+r 2ab+i r i */ \
+"decl %%ecx\n\t" /* */ \
+"jnz 1b\n\t" /* */ \
+"fld %%st(0)\n\t" \
+"2:\n\t" \
+"fstp %%st(0)\n\t" \
+"fstp %%st(2)\n\t" \
+"fstp %%st(2)\n\t" \
+:"=c"(iter),"=m"(tmp),"=&t"(zim),"=&u"(zre) \
+:"d"(0x40800000),"0"(iter),"2"(zre),"3"(zim),"m"(pre),"m"(pim) \
+:"eax","st(2)","st(3)","st(4)","st(5)"); \
+}
+
+pacalc(long double zre, long double zim, long double pre, long double pim)
+{
+ int iter = 1000000;
+ NSFORMULALOOP(iter);
+ return iter;
+}
+#endif
+#endif
+#endif
+#endif
+
+/* Some help for the brave ones. :-)
+ *
+ * Mandelbrot's original formula is z=z^2+c which means
+ * z[next]=z[previous]^2+c.
+ * Here c is the pixel coordinates from the screen and z[0] is usually 0
+ * (if not perturbation was added.)
+ * In the following code z[previous] is described by (zre;zim)
+ * and z[next] will also be zre and zim.
+ * c is described by (pre;pim).
+ * Finally rp and ip are helper variables, mostly for checking the bailout
+ * (which usually means abs(z)>=4, see BTEST).
+ *
+ * Both basic operations and some other functions (c_mul, c_pow3, ...) can
+ * be used. For a "detailed" description refer to ../include/complex.h.
+ *
+ * If you add/modify fractals, please note that struct formula_formulas
+ * (at line cca. 1300) should be also edited for proper initialization
+ * and for menu entries. However it is not self-explanatory, just copy-paste
+ * existing tables and give it a try.
+ *
+ * Finally, please also edit the calculateswitch function and
+ * the nmformulas constant (at the end of this file).
+ *
+ * -- Zoltan, 2009-07-30
+ */
+
+
+#define BTEST less_than_4(rp+ip)
+#define SMOOTH
+#define SCALC smand_calc
+#define SPERI smand_peri
+#define CALC mand_calc
+#define PERI mand_peri
+#define JULIA mand_julia
+#define RANGE 2
+#define RPIP
+#include "docalc.c"
+
+#ifdef __i386__
+#define UNCOMPRESS
+#endif
+#define USEHACKS
+#define PRETEST 0
+#define FORMULA \
+ rp = zre * (rp - 3 * ip); \
+ zim = zim * (3 * zre * zre - ip) + pim; \
+ zre = rp + pre; \
+ rp = zre * zre; \
+ ip = zim * zim;
+#define BTEST less_than_4(rp+ip)
+#define SMOOTH
+#define SCALC smand3_calc
+#define SPERI smand3_peri
+#define CALC mand3_calc
+#define PERI mand3_peri
+#define JULIA mand3_julia
+#define RANGE 2
+#define RPIP
+#include "docalc.c"
+
+
+#define UNCOMPRESS
+#define VARIABLES number_t br,tmp;
+#define FORMULA \
+ br = zre + zre + pre - 2; \
+ tmp = zre * zim; \
+ zre = rp - ip + pre - 1; \
+ ip = zim + zim + pim; \
+ zim = tmp + tmp + pim; \
+ tmp = 1 / (br * br + ip * ip); \
+ rp = (zre * br + zim * ip) * tmp; \
+ ip = (zim * br - zre * ip) * tmp; \
+ zre = (rp + ip) * (rp - ip); \
+ zim = rp * ip; \
+ zim += zim; \
+ rp = zre - 1; \
+ ip = zim * zim; \
+ rp = zre * zre;
+#define BTEST (rp+ip<(number_t)100*100&&(rp-2*zre+ip)>0.04/cfractalc.bailout-1)
+#define POSTCALC \
+ if(rp-2*zre+ip>0.04/cfractalc.bailout-1){ \
+ zre *= 0.08/cfractalc.bailout, zim *= 0.08/cfractalc.bailout; \
+ if(iter) \
+ iter = cfractalc.maxiter - iter + 1; \
+ }
+#define CALC magnet_calc
+#define PERI magnet_peri
+#define SCALC smagnet_calc
+#define SPERI smagnet_peri
+#define SMOOTH
+#define PRESMOOTH szmag/=100*100/4;zre=(rp+ip)/(100*100*4);
+#define JULIA magnet_julia
+#define RANGE 4
+#define RPIP
+#include "docalc.c"
+
+#define UNCOMPRESS
+#define VARIABLES number_t inre,inim,tmp1,tmp2,dnre,nmre,dnim;
+#define INIT \
+ inre = pre*pre - pim*pim - pre - pre - pre; \
+ inim = pre*pim; \
+ inim = inim + inim - pim - pim - pim;
+#define FORMULA \
+ tmp1 = rp - ip; \
+ tmp2 = zre*pre - zim*pim - zre; \
+ dnre = tmp1 + tmp1 + tmp1 + tmp2 + tmp2 + tmp2 - zre - zre - zre + inre + 3; \
+ tmp1 = zre*ip;\
+ nmre = zre*rp - tmp1 - tmp1 - tmp1 + tmp2 + tmp2 + tmp2 + inre + 2; \
+ tmp1 = zre*zim; \
+ tmp2 = zre*pim + zim*pre - zim; \
+ dnim = tmp1 + tmp1 + tmp1 + tmp1 + tmp1 + tmp1 + tmp2 + tmp2 + tmp2 - zim - zim - zim + inim; \
+ tmp1 = zim*rp; \
+ zim = tmp1 + tmp1 + tmp1 - zim*ip + tmp2 + tmp2 + tmp2 + inim; \
+ zre = nmre; \
+ ip = dnim; \
+ tmp1 = 1 / (dnre * dnre + ip * ip); \
+ rp = (zre * dnre + zim * ip) * tmp1; \
+ ip = (zim * dnre - zre * ip) * tmp1; \
+ zre = (rp + ip) * (rp - ip); \
+ zim = rp * ip; \
+ zim += zim; \
+ ip = zim * zim; \
+ rp = zre * zre;
+#define BTEST (rp+ip<(number_t)100*100&&(rp-2*zre+ip)>0.04/cfractalc.bailout-1)
+#define POSTCALC \
+ if(rp-2*zre+ip>0.04/cfractalc.bailout-1){ \
+ zre *= 0.08/cfractalc.bailout, zim *= 0.08/cfractalc.bailout; \
+ if(iter) \
+ iter = cfractalc.maxiter - iter + 1; \
+ }
+#define CALC magnet2_calc
+#define PERI magnet2_peri
+#define SCALC smagnet2_calc
+#define SPERI smagnet2_peri
+#define SMOOTH
+#define PRESMOOTH szmag/=100*100/4;zre=(rp+ip)/(100*100*4);
+#define JULIA magnet2_julia
+#define RANGE 2
+#define RPIP
+#include "docalc.c"
+
+#ifdef __i386__
+#define UNCOMPRESS
+#endif
+#define BTEST less_than_4(rp+ip)
+#define FORMULA \
+ rp = rp * rp - 6 * rp * ip + ip * ip + pre; \
+ zim = 4 * zre * zre * zre * zim - 4 * zre * ip * zim + pim; \
+ zre = rp; \
+ rp = zre * zre; \
+ ip = zim * zim;
+#define SMOOTH
+#define SCALC smand4_calc
+#define SPERI smand4_peri
+#define CALC mand4_calc
+#define PERI mand4_peri
+#define JULIA mand4_julia
+#define RANGE 2
+#define RPIP
+#include "docalc.c"
+
+#define VARIABLES register number_t t;
+#define BTEST less_than_4(rp+ip)
+#define FORMULA \
+ c_pow4(zre, zim, rp, ip); \
+ c_mul(zre, zim, rp, ip, t, zim); \
+ zre = t + pre; \
+ zim += pim; \
+ rp = zre * zre; \
+ ip = zim * zim;
+#define SMOOTH
+#define SCALC smand5_calc
+#define SPERI smand5_peri
+#define CALC mand5_calc
+#define PERI mand5_peri
+#define JULIA mand5_julia
+#define RANGE 2
+#define RPIP
+#include "docalc.c"
+
+
+#define VARIABLES register number_t t;
+#define BTEST less_than_4(rp+ip)
+#define FORMULA \
+ c_pow3(zre, zim, rp, ip); \
+ c_mul(rp, ip, rp, ip, t, zim); \
+ zre = t + pre; \
+ zim += pim; \
+ rp = zre * zre; \
+ ip = zim * zim;
+#define SMOOTH
+#define SCALC smand6_calc
+#define SPERI smand6_peri
+#define CALC mand6_calc
+#define PERI mand6_peri
+#define JULIA mand6_julia
+#define RANGE 2
+#define RPIP
+#include "docalc.c"
+
+
+#define VARIABLES register number_t t;
+#define BTEST less_than_4(rp+ip)
+#define FORMULA \
+ c_pow3(zre, zim, rp, ip); \
+ c_pow3(rp, ip, t, zim); \
+ zre = t + pre; \
+ zim += pim; \
+ rp = zre * zre; \
+ ip = zim * zim;
+#define SMOOTH
+#define SCALC smand9_calc
+#define SPERI smand9_peri
+#define CALC mand9_calc
+#define PERI mand9_peri
+#define JULIA mand9_julia
+#define RANGE 2
+#define RPIP
+#include "docalc.c"
+
+/* formulas from here to the next comment are not tested under plan9 compiler */
+
+#define VARIABLES
+#define BTEST less_than_4(rp+ip)
+#define FORMULA \
+ zim=zre*zim+zim/2+pim; \
+ zre=(rp-ip+zre)/2+pre; \
+ rp=zre*zre; \
+ ip=zim*zim;
+#define SMOOTH
+#define SCALC strice_calc
+#define SPERI strice_peri
+#define CALC trice_calc
+#define PERI trice_peri
+#define RANGE 2
+#define RPIP
+#include "docalc.c"
+
+#define VARIABLES register number_t zor,zoi;
+/* 2009-08-01 JB Langston
+ * On Mac OS X, for some reason Cat's Eye renders as an empty circle unless
+ * the bailout is slightly more than 4. This doesn't appear to happen on any
+ * other operating systems, and it's not processor specific. It's probably
+ * a compiler bug, but I haven't been able to figure out exactly what's
+ * happening. I can work around it by subtracting LDBL_MIN from the amount
+ * before performing the bailout test.
+ */
+// #define LDBL_MIN 0.00000001
+#define BTEST less_than_4(rp+ip-LDBL_MIN)
+#define FORMULA \
+ c_div(pre,pim,zre,zim,rp,ip); \
+ c_div(zre,zim,pre,pim,zor,zoi); \
+ zre=zor+rp; \
+ zim=zoi+ip; \
+ rp=zre*zre; \
+ ip=zim*zim;
+#define SMOOTH
+#define SCALC scatseye_calc
+#define SPERI scatseye_peri
+#define CALC catseye_calc
+#define PERI catseye_peri
+#define RANGE 2
+#define RPIP
+#include "docalc.c"
+
+#define VARIABLES
+#define BTEST less_than_4(rp+ip)
+#define FORMULA \
+ zim=(zim*zre)*(-2.0)+pim; \
+ zre=rp-ip+pre; \
+ ip=zim*zim; \
+ rp=zre*zre;
+#define SMOOTH
+#define SCALC smbar_calc
+#define SPERI smbar_peri
+#define CALC mbar_calc
+#define PERI mbar_peri
+#define JULIA mbar_julia
+#define RANGE 2
+#define RPIP
+#include "docalc.c"
+
+#define VARIABLES
+#define INIT \
+ rp=zre;zre=pre;pre=rp; \
+ ip=zim;zim=pim;pim=ip;
+#define BTEST less_than_4(rp+ip)
+#define FORMULA \
+ rp=ip-rp+zre; \
+ ip=zim-2*zre*zim; \
+ c_mul(rp,ip,pre,pim,zre,zim); \
+ rp=zre*zre; \
+ ip=zim*zim;
+#define SMOOTH
+#define SCALC smlambda_calc
+#define SPERI smlambda_peri
+#define CALC mlambda_calc
+#define PERI mlambda_peri
+#define RANGE 2
+#define RPIP
+#include "docalc.c"
+
+#define VARIABLES register number_t zre1,zim1,zre2,zim2;
+#define INIT zre1=zre;zim1=zim;
+#define BTEST less_than_4(rp+ip)
+#define FORMULA \
+ zre2=zre;zim2=zim; \
+ zim=(zim*zre)*2+pim+zim1; \
+ zre=rp-ip+pre+zre1; \
+ zre1=zre2; \
+ zim1=zim2; \
+ ip=zim*zim; \
+ rp=zre*zre;
+#define SMOOTH
+#define SCALC smanowar_calc
+#define CALC manowar_calc
+#define RANGE 2
+#define RPIP
+#include "docalc.c"
+
+#define VARIABLES register number_t zre1,zim1;
+#define INIT zre1=pre;zim1=pim;
+#define BTEST less_than_4(rp+ip)
+#define FORMULA \
+ zim=(zim*zre)*2+zim1; \
+ zre=rp-ip+zre1; \
+ zre1=zre1/2+zre; \
+ zim1=zim1/2+zim; \
+ ip=zim*zim; \
+ rp=zre*zre;
+#define SMOOTH
+#define SCALC sspider_calc
+#define CALC spider_calc
+#define RANGE 2
+#define RPIP
+#include "docalc.c"
+
+#define VARIABLES
+#define INIT \
+ if((zre==pre)&&(zim==pim)){pre=0.5;pim=0.8660254;} \
+ if(pim<0)pim=(-pim); \
+ if(((pim*zre-pre*zim)<0)||(zim<0)){zre=2*pre+2;zim=2*pim;}
+#define BTEST ((pim*zre+(1-pre)*zim)<pim)
+#define FORMULA \
+ zre=2*zre;zim=2*zim; \
+ if((pim*zre-pre*zim)>pim)zre=zre-1; \
+ if(zim>pim){zim=zim-pim;zre=zre-pre;}
+#define CALC sier_calc
+#define RANGE 2
+#define RPIP
+#include "docalc.c"
+
+#define VARIABLES
+#define INIT \
+ if((zre==pre)&&(zim==pim)){pre=0.5;pim=0.8660254;} \
+ if(pim<0)pim=(-pim); \
+ if(((pim*zre-pre*zim)<0)||(zim<0)){zre=2*pre+2;zim=2*pim;}
+#define BTEST ((pim*zre+(1-pre)*zim)<pim)
+#define FORMULA \
+ zre=1.6180339*zre;zim=1.6180339*zim; \
+ if((pim*zre-pre*zim)>pim*0.6180339)zre=zre-0.6180339; \
+ if(zim>pim*0.6180339){zim=zim-pim*0.6180339;zre=zre-pre*0.6180339;}
+#define CALC goldsier_calc
+#define RANGE 2
+#define RPIP
+#include "docalc.c"
+
+#define VARIABLES
+#define INIT
+#define BTEST (zre*zre+zim*zim<1)
+#define FORMULA \
+ zre=3*zre;zim=3*zim; \
+ if((zim-2)*(zim-2)+zre*zre<1)zim=zim-2; \
+ if((zim+2)*(zim+2)+zre*zre<1)zim=zim+2; \
+ if((zim-1)*(zim-1)+(zre-1.7320508)*(zre-1.7320508)<1){zim=zim-1;zre=zre-1.7320508;} \
+ if((zim+1)*(zim+1)+(zre-1.7320508)*(zre-1.7320508)<1){zim=zim+1;zre=zre-1.7320508;} \
+ if((zim-1)*(zim-1)+(zre+1.7320508)*(zre+1.7320508)<1){zim=zim-1;zre=zre+1.7320508;} \
+ if((zim+1)*(zim+1)+(zre+1.7320508)*(zre+1.7320508)<1){zim=zim+1;zre=zre+1.7320508;}
+#define CALC circle7_calc
+#define RANGE 2
+#define RPIP
+#include "docalc.c"
+
+#define VARIABLES
+#define INIT
+#define BTEST less_than_4((rp+ip)/4.0)
+#define FORMULA \
+ if (less_than_0 (zre)) { \
+ rp = zre + 1; \
+ } else { \
+ rp = zre - 1; \
+ } \
+ if (less_than_0 (zim)) { \
+ ip = zim + 1; \
+ } else { \
+ ip = zim - 1; \
+ } \
+ c_mul(rp, ip, pre, pim, zre, zim); \
+ rp = zre * zre; \
+ ip = zim * zim;
+#define SMOOTH
+#define CALC symbarn_calc
+#define JULIA symbarn_julia
+#define RANGE 2
+#define RPIP
+#include "docalc.c"
+
+#define VARIABLES
+#define INIT \
+ if((zre==pre)&&(zim==pim)){pre=1;pim=1;} \
+ if(pre<0)pre=(-pre);if(pim<0)pim=(-pim); \
+ if((zre<0)||(zre>pre)){zre=pre/2;zim=pim/2;} \
+ if((zim<0)||(zim>pim)){zre=pre/2;zim=pim/2;}
+#define BTEST \
+ ((zre<pre/3)||(zre>2*pre/3)|| \
+ (zim<pim/3)||(zim>2*pim/3))
+#define FORMULA \
+ zre=3*zre;zim=3*zim; \
+ if(zre>2*pre)zre=zre-2*pre;else if(zre>pre)zre=zre-pre; \
+ if(zim>2*pim)zim=zim-2*pim;else if(zim>pim)zim=zim-pim;
+#define CALC carpet_calc
+#define RANGE 2
+#define RPIP
+#include "docalc.c"
+
+
+#define VARIABLES
+#define BTEST \
+ ((((1.5*zre+0.8660254038*zim)>0.8660254038)|| \
+ ((0.8660254038*zim-1.5*zre)>0.8660254038)|| \
+ (zim<(-0.5)))&& \
+ (((1.5*zre+0.8660254038*zim)<-0.8660254038)|| \
+ ((0.8660254038*zim-1.5*zre)<-0.8660254038)|| \
+ (zim>0.5)))
+#define FORMULA \
+ zre=3*zre;zim=3*zim; \
+ if((0.2886751346*zim-0.5*zre)>0.0){ \
+ if((0.2886751346*zim+0.5*zre)>0.0){ \
+ zim=zim-2.0;\
+ }else{ \
+ if(zim>0){zre=zre+1.732050808;zim=zim-1.0;} \
+ else{zre=zre+1.732050808;zim=zim+1.0;} \
+ } \
+ }else{ \
+ if((0.2886751346*zim+0.5*zre)<0.0){ \
+ zim=zim+2.0;\
+ }else{ \
+ if(zim>0){zre=zre-1.732050808;zim=zim-1.0;} \
+ else{zre=zre-1.732050808;zim=zim+1.0;} \
+ } \
+ }
+#define CALC koch_calc
+#define RANGE 2
+#define RPIP
+#include "docalc.c"
+
+#define VARIABLES register number_t zre1, zim1;
+#define INIT pim=fabs(pim); zre=pre; zim=pim;
+#define BTEST \
+ (!((zre<0)&&(zim>0)&&(-1.0*zre+1.732050808*zim<1.732050808)))
+#define FORMULA \
+ zre1=1.5*zre-0.866+0.866*zim; \
+ zim1=-1.5+1.5*zim-0.866*zre; \
+ zre=zre1; zim=zim1;
+#define CALC hornflake_calc
+#define RANGE 2
+#define RPIP
+#include "docalc.c"
+
+/* plan9 compiler has problem with rest of formulas files. Hope that will be fixed later */
+
+#define VARIABLES
+#define BTEST less_than_4(rp+ip)
+#define FORMULA \
+ if (less_than_0 (zre)) { \
+ rp = zre + 1; \
+ } else { \
+ rp = zre - 1; \
+ } \
+ c_mul(rp, zim, pre, pim, zre, zim); \
+ rp = zre * zre; \
+ ip = zim * zim;
+#define SMOOTH
+#define SCALC sbarnsley1_calc
+#define CALC barnsley1_calc
+#define JULIA barnsley1_julia
+#define RANGE 2
+#define RPIP
+#include "docalc.c"
+
+
+#define VARIABLES
+#define BTEST less_than_4(rp+ip)
+#define FORMULA \
+ if (less_than_0 (zre*pim + zim*pre)) { \
+ rp = zre + 1; \
+ } else { \
+ rp = zre - 1; \
+ } \
+ c_mul(rp, zim, pre, pim, zre, zim); \
+ rp = zre * zre; \
+ ip = zim * zim;
+#define SMOOTH
+#define SCALC sbarnsley2_calc
+#define CALC barnsley2_calc
+#define JULIA barnsley2_julia
+#define RANGE 2
+#define RPIP
+#include "docalc.c"
+
+#define VARIABLES
+#define BTEST less_than_4(rp+ip)
+#define FORMULA \
+ if (!less_than_0 (-zre)) { \
+ zim = 2*zre*zim + pim*zre; \
+ zre = rp - ip - 1 + pre*zre; \
+ } else { \
+ zim = 2*zre*zim; \
+ zre = rp - ip - 1; \
+ } \
+ rp = zre * zre; \
+ ip = zim * zim;
+#define SMOOTH
+#define SCALC sbarnsley3_calc
+#define CALC barnsley3_calc
+#define JULIA barnsley3_julia
+#define RANGE 2
+#define RPIP
+#include "docalc.c"
+
+
+#define VARIABLES register number_t n,sqrr,sqri,zre1,zim1;
+#define INIT sqri=zim*zim,n=zre,zre=pre,pre=n,n=zim,zim=pim,pim=n,n=(number_t)1;
+#define BTEST greater_then_1Em6(n)
+#define FORMULA \
+ zre1 = zre; \
+ zim1 = zim; \
+ n = zim * zim; \
+ sqri = zre * zre; \
+ sqrr = sqri - n; \
+ sqri = n + sqri; \
+ n = 0.3333333333 / ((sqri * sqri)); \
+ zim = (0.66666666) * zim - (zre + zre) * zim * n + pim; \
+ zre = (0.66666666) * zre + (sqrr) * n + pre; \
+ zre1 -= zre; \
+ zim1 -= zim; \
+ n = zre1 * zre1 + zim1 * zim1;
+#define CALC newton_calc
+#include "docalc.c"
+
+
+#define VARIABLES register number_t n,sqrr,sqri,zre1,zim1;
+#define INIT sqri=zim*zim,n=zre,zre=pre,pre=n,n=zim,zim=pim,pim=n,n=(number_t)1;
+#define BTEST greater_then_1Em6(n)
+#define FORMULA \
+ zre1 = zre; \
+ zim1 = zim; \
+ sqrr = zre * zre; \
+ sqri = zim * zim; \
+ n = sqri + sqrr; \
+ n = 1 / ((n * n * n)); \
+ zim = (0.25) * zim * (3 + (sqri - 3 * sqrr) * n) + pim; \
+ zre = (0.25) * zre * (3 + (sqrr - 3 * sqri) * n) + pre; \
+ zre1 -= zre; \
+ zim1 -= zim; \
+ n = zre1 * zre1 + zim1 * zim1;
+#define CALC newton4_calc
+#include "docalc.c"
+
+
+#define VARIABLES register number_t zpr,zip;
+#define SAVEVARIABLES register number_t szpr,szip;
+#define SAVE szpr=zpr,szip=zip;
+#define RESTORE zpr=szpr,zip=szip;
+#define INIT zpr=zip=(number_t)0;
+#define BTEST less_than_4(rp+ip)
+#define FORMULA \
+ rp = rp - ip + pre + pim * zpr; \
+ ip = 2 * zre * zim + pim * zip; \
+ zpr = zre, zip = zim; \
+ zre = rp; \
+ zim = ip; \
+ rp = zre * zre, ip = zim * zim;
+#define SMOOTH
+#define SCALC sphoenix_calc
+#define SPERI sphoenix_peri
+#define CALC phoenix_calc
+#define PERI phoenix_peri
+#define RPIP
+#include "docalc.c"
+
+
+#define VARIABLES register number_t tr,ti,zpr,zpm,rp1,ip1;
+#define INIT zpr=zpm=0,tr=zre,zre=pre,pre=tr,tr=zim,zim=pim,pim=tr,tr=1;
+#define BTEST less_than_4(zpr*zpr+zpm*zpm)
+#define FORMULA \
+ rp1 = zre; \
+ ip1 = zim; \
+ c_pow3(zre, zim, tr, ti); \
+ c_add(tr, ti, zpr, zpm, zre, zim); \
+ zpr = rp1 + pre; \
+ zpm = ip1 + pim;
+#define CALC octo_calc
+#define SCALC socto_calc
+#define SMOOTH
+#define CUSTOMSAVEZMAG szmag=zpr*zpr+zpm*zpm
+#define PRESMOOTH zre=zpr*zpr+zpm*zpm
+#include "docalc.c"
+
+
+#define VARIABLES register number_t yre, yim, re1tmp, re2tmp, im1tmp;
+#define BTEST (rp+ip<9||(yre*yre+yim*yim)<4*(rp+ip))
+#define INIT yre=pre; yim=pim;
+#define FORMULA \
+ re1tmp=zre; \
+ re2tmp=yre; \
+ im1tmp=zim; \
+ zre=re1tmp+yre; \
+ zim=im1tmp+yim; \
+ yre=(re1tmp*re2tmp-im1tmp*yim ); \
+ yim=(re1tmp*yim +re2tmp*im1tmp); \
+ rp=zre*zre; \
+ ip=zim*zim;
+#define CALC beryl_calc
+#define JULIA beryl_julia
+#define PERI beryl_peri
+#define RANGE 2
+#define RPIP
+#include "docalc.c"
+
+
+
+#ifdef SFFE_USING
+ /* SFFE - malczak */
+ //#define VARIABLES sffe *p = globaluih->parser;
+#define INIT cmplxset(pZ,0,0); cmplxset(C,pre,pim); \
+ if (globaluih->pinit) Z=sffe_eval(globaluih->pinit); else cmplxset(Z,zre,zim);
+ //#define SAVE cmplxset(pZ,real(Z),imag(Z));
+ //#define PRETEST 0
+#define FORMULA \
+ Z = sffe_eval(globaluih->parser);\
+ cmplxset(pZ,zre,zim); \
+ zre = real( Z ); \
+ zim = imag( Z );
+#define BTEST less_than_4(zre*zre+zim*zim)
+ //less_than_4(rp+ip)
+#define CALC sffe_calc
+#define JULIA sffe_julia
+#define SCALC ssffe_calc
+ //#define SMOOTH
+#include "docalc.c"
+#endif
+
+
+static CONST symetrytype sym6[] = {
+ {0, 1.73205080758},
+ {0, -1.73205080758}
+};
+
+static CONST symetrytype sym8[] = {
+ {0, 1},
+ {0, -1}
+};
+
+static CONST symetrytype sym16[] = {
+ {0, 1},
+ {0, -1},
+ {0, 0.414214},
+ {0, -0.414214},
+ {0, 2.414214},
+ {0, -2.414214}
+};
+
+CONST struct formula formulas[] = {
+ { /* 0 */
+ FORMULAMAGIC,
+#ifndef SLOWFUNCPTR
+ mand_calc,
+ mand_peri,
+ smand_calc,
+ smand_peri,
+#endif
+ mand_julia,
+ {"Mandelbrot", "Julia"},
+ "mandel",
+ /*{0.5, -2.0, 1.25, -1.25}, */
+ {-0.75, 0.0, 2.5, 2.5},
+ 1, 1, 0.0, 0.0,
+ {
+ {INT_MAX, 0, 0, NULL},
+ {INT_MAX, 0, 0, NULL},
+ {INT_MAX, INT_MAX, 0, NULL},
+ {INT_MAX, INT_MAX, 0, NULL},
+ {INT_MAX, INT_MAX, 0, NULL},
+ {INT_MAX, INT_MAX, 0, NULL},
+ {INT_MAX, 0, 0, NULL},
+ {INT_MAX, 0, 0, NULL},
+ {INT_MAX, INT_MAX, 0, NULL},
+ {INT_MAX, 0, 0, NULL},
+ {INT_MAX, INT_MAX, 0, NULL},
+ },
+ {
+ {INT_MAX, 0, 0, NULL},
+ {INT_MAX, 0, 0, NULL},
+ {INT_MAX, INT_MAX, 0, NULL},
+ {INT_MAX, INT_MAX, 0, NULL},
+ {INT_MAX, INT_MAX, 0, NULL},
+ {INT_MAX, INT_MAX, 0, NULL},
+ {INT_MAX, INT_MAX, 0, NULL},
+ {INT_MAX, INT_MAX, 0, NULL},
+ {INT_MAX, INT_MAX, 0, NULL},
+ {INT_MAX, INT_MAX, 0, NULL},
+ {INT_MAX, INT_MAX, 0, NULL},
+ },
+ MANDEL_BTRACE,
+ },
+ { /* 1 */
+ FORMULAMAGIC,
+#ifndef SLOWFUNCPTR
+ mand3_calc,
+ mand3_peri,
+ smand3_calc,
+ smand3_peri,
+#endif
+ mand3_julia,
+ {"Mandelbrot^3", "Julia^3"},
+ "mandel3",
+ /*{1.25, -1.25, 1.25, -1.25}, */
+ {0.0, 0.0, 2.5, 2.5},
+ 1, 1, 0.0, 0.0,
+ {
+ {0, 0, 0, NULL},
+ {INT_MAX, 0, 0, NULL},
+ {0, INT_MAX, 0, NULL},
+ {INT_MAX, INT_MAX, 0, NULL},
+ {INT_MAX, INT_MAX, 0, NULL},
+ {0, INT_MAX, 0, NULL},
+ {0, 0, 0, NULL},
+ {0, 0, 0, NULL},
+ {INT_MAX, INT_MAX, 0, NULL},
+ {0, 0, 0, NULL},
+ {INT_MAX, INT_MAX, 0, NULL},
+ },
+ {
+ {0, 0, 0, NULL},
+ {0, 0, 0, NULL},
+ {INT_MAX, INT_MAX, 0, NULL},
+ {0, INT_MAX, 0, NULL},
+ {INT_MAX, INT_MAX, 0, NULL},
+ {INT_MAX, INT_MAX, 0, NULL},
+ {INT_MAX, INT_MAX, 0, NULL},
+ {INT_MAX, INT_MAX, 0, NULL},
+ {INT_MAX, INT_MAX, 0, NULL},
+ {INT_MAX, INT_MAX, 0, NULL},
+ {INT_MAX, INT_MAX, 0, NULL},
+ },
+ MANDEL_BTRACE,
+ },
+ { /* 2 */
+ FORMULAMAGIC,
+#ifndef SLOWFUNCPTR
+ mand4_calc,
+ mand4_peri,
+ smand4_calc,
+ smand4_peri,
+#endif
+ mand4_julia,
+ {"Mandelbrot^4", "Julia^4"},
+ "mandel4",
+ /*{1.25, -1.25, 1.25, -1.25}, */
+ {0.0, 0.0, 2.5, 2.5},
+ 1, 1, 0.0, 0.0,
+ {
+ {INT_MAX, 0, 2, sym6},
+ {INT_MAX, 0, 0, NULL},
+ {INT_MAX, INT_MAX, 0, NULL},
+ {INT_MAX, INT_MAX, 0, NULL},
+ {INT_MAX, INT_MAX, 0, NULL},
+ {INT_MAX, INT_MAX, 0, NULL},
+ {INT_MAX, 0, 0, NULL},
+ {INT_MAX, 0, 2, sym6},
+ {INT_MAX, INT_MAX, 0, NULL},
+ {INT_MAX, 0, 2, sym6},
+ {INT_MAX, INT_MAX, 0, NULL},
+ },
+ {
+ {INT_MAX, 0, 2, sym6},
+ {INT_MAX, 0, 2, sym6},
+ {INT_MAX, INT_MAX, 0, NULL},
+ {INT_MAX, INT_MAX, 0, NULL},
+ {INT_MAX, INT_MAX, 0, NULL},
+ {INT_MAX, INT_MAX, 0, NULL},
+ {INT_MAX, INT_MAX, 0, NULL},
+ {INT_MAX, INT_MAX, 0, NULL},
+ {INT_MAX, INT_MAX, 0, NULL},
+ {INT_MAX, INT_MAX, 0, NULL},
+ {INT_MAX, INT_MAX, 0, NULL},
+ },
+ MANDEL_BTRACE,
+ },
+ { /* 3 */
+ FORMULAMAGIC,
+#ifndef SLOWFUNCPTR
+ mand5_calc,
+ mand5_peri,
+ smand5_calc,
+ smand5_peri,
+#endif
+ mand5_julia,
+ {"Mandelbrot^5", "Julia^5"},
+ "mandel5",
+ /*{1.25, -1.25, 1.25, -1.25}, */
+ {0.0, 0.0, 2.5, 2.5},
+ 1, 1, 0.0, 0.0,
+ {
+ {0, 0, 2, sym8},
+ {INT_MAX, 0, 0, NULL},
+ {0, INT_MAX, 0, NULL},
+ {INT_MAX, INT_MAX, 0, NULL},
+ {INT_MAX, INT_MAX, 0, NULL},
+ {0, INT_MAX, 0, NULL},
+ {0, 0, 2, sym8},
+ {0, 0, 2, sym8},
+ {INT_MAX, INT_MAX, 0, NULL},
+ {0, 0, 2, sym8},
+ {INT_MAX, INT_MAX, 0, NULL},
+ },
+ {
+ {0, 0, 2, sym8},
+ {0, 0, 2, sym8},
+ {INT_MAX, INT_MAX, 0, NULL},
+ {INT_MAX, INT_MAX, 0, NULL},
+ {INT_MAX, INT_MAX, 0, NULL},
+ {INT_MAX, INT_MAX, 0, NULL},
+ {INT_MAX, INT_MAX, 0, NULL},
+ {INT_MAX, INT_MAX, 0, NULL},
+ {INT_MAX, INT_MAX, 0, NULL},
+ {INT_MAX, INT_MAX, 0, NULL},
+ {INT_MAX, INT_MAX, 0, NULL},
+ },
+ MANDEL_BTRACE,
+ },
+ { /* 4 */
+ FORMULAMAGIC,
+#ifndef SLOWFUNCPTR
+ mand6_calc,
+ mand6_peri,
+ smand6_calc,
+ smand6_peri,
+#endif
+ mand6_julia,
+ {"Mandelbrot^6", "Julia^6"},
+ "mandel6",
+ /*{1.25, -1.25, 1.25, -1.25}, */
+ {0.0, 0.0, 2.5, 2.5},
+ 1, 1, 0.0, 0.0,
+ {
+ {INT_MAX, 0, 2, sym6},
+ {INT_MAX, 0, 0, NULL},
+ {INT_MAX, INT_MAX, 0, NULL},
+ {INT_MAX, INT_MAX, 0, NULL},
+ {INT_MAX, INT_MAX, 0, NULL},
+ {INT_MAX, INT_MAX, 0, NULL},
+ {INT_MAX, 0, 0, NULL},
+ {INT_MAX, 0, 2, sym6},
+ {INT_MAX, INT_MAX, 0, NULL},
+ {INT_MAX, 0, 2, sym6},
+ {INT_MAX, INT_MAX, 0, NULL},
+ },
+ {
+ {INT_MAX, 0, 2, sym6},
+ {INT_MAX, 0, 2, sym6},
+ {INT_MAX, INT_MAX, 0, NULL},
+ {INT_MAX, INT_MAX, 0, NULL},
+ {INT_MAX, INT_MAX, 0, NULL},
+ {INT_MAX, INT_MAX, 0, NULL},
+ {INT_MAX, INT_MAX, 0, NULL},
+ {INT_MAX, INT_MAX, 0, NULL},
+ {INT_MAX, INT_MAX, 0, NULL},
+ {INT_MAX, INT_MAX, 0, NULL},
+ {INT_MAX, INT_MAX, 0, NULL},
+ },
+ MANDEL_BTRACE,
+ },
+ { /* 5 */
+ FORMULAMAGIC,
+#ifndef SLOWFUNCPTR
+ newton_calc,
+ NULL,
+ NULL,
+ NULL,
+#endif
+ NULL,
+ {"Newton", "Newton julia?"},
+ "newton",
+ /*{1.25, -1.25, 1.25, -1.25}, */
+ {0.0, 0.0, 2.5, 2.5},
+ 0, 1, 1.0199502202048319698, 0.0,
+ {
+ {INT_MAX, 0, 2, sym6},
+ {INT_MAX, 0, 0, NULL},
+ {INT_MAX, INT_MAX, 0, NULL},
+ {INT_MAX, INT_MAX, 0, NULL},
+ {INT_MAX, INT_MAX, 0, NULL},
+ {INT_MAX, INT_MAX, 0, NULL},
+ {INT_MAX, 0, 2, sym6},
+ {INT_MAX, 0, 2, sym6},
+ {INT_MAX, INT_MAX, 0, NULL},
+ {INT_MAX, 0, 2, sym6},
+ {INT_MAX, INT_MAX, 0, NULL},
+ },
+ {
+ {INT_MAX, 0, 2, sym6},
+ {INT_MAX, 0, 2, sym6},
+ {INT_MAX, INT_MAX, 0, NULL},
+ {INT_MAX, INT_MAX, 0, NULL},
+ {INT_MAX, INT_MAX, 0, NULL},
+ {INT_MAX, INT_MAX, 0, NULL},
+ {INT_MAX, INT_MAX, 0, NULL},
+ {INT_MAX, INT_MAX, 0, NULL},
+ {INT_MAX, INT_MAX, 0, NULL},
+ {INT_MAX, INT_MAX, 0, NULL},
+ {INT_MAX, INT_MAX, 0, NULL},
+ },
+ STARTZERO,
+ },
+ { /* formula added by Andreas Madritsch *//* 6 */
+ FORMULAMAGIC,
+#ifndef SLOWFUNCPTR
+ newton4_calc,
+ NULL,
+ NULL,
+ NULL,
+#endif
+ NULL,
+ {"Newton^4", "Newton^4 julia?"},
+ "newton4",
+ /*{1.25, -1.25, 1.25, -1.25}, */
+ {0.0, 0.0, 2.5, 2.5},
+ 0, 1, 1.0199502202048319698, 0.0,
+ {
+ {INT_MAX, 0, 2, sym6},
+ {INT_MAX, 0, 0, NULL},
+ {INT_MAX, INT_MAX, 0, NULL},
+ {INT_MAX, INT_MAX, 0, NULL},
+ {INT_MAX, INT_MAX, 0, NULL},
+ {INT_MAX, INT_MAX, 0, NULL},
+ {INT_MAX, 0, 2, sym6},
+ {INT_MAX, 0, 2, sym6},
+ {INT_MAX, INT_MAX, 0, NULL},
+ {INT_MAX, 0, 2, sym6},
+ {INT_MAX, INT_MAX, 0, NULL},
+ },
+ {
+ {INT_MAX, 0, 2, sym6},
+ {INT_MAX, 0, 2, sym6},
+ {INT_MAX, INT_MAX, 0, NULL},
+ {INT_MAX, INT_MAX, 0, NULL},
+ {INT_MAX, INT_MAX, 0, NULL},
+ {INT_MAX, INT_MAX, 0, NULL},
+ {INT_MAX, INT_MAX, 0, NULL},
+ {INT_MAX, INT_MAX, 0, NULL},
+ {INT_MAX, INT_MAX, 0, NULL},
+ {INT_MAX, INT_MAX, 0, NULL},
+ {INT_MAX, INT_MAX, 0, NULL},
+ },
+ STARTZERO,
+ },
+ { /* 7 */
+ FORMULAMAGIC,
+#ifndef SLOWFUNCPTR
+ barnsley1_calc,
+ NULL,
+ sbarnsley1_calc,
+ NULL,
+#endif
+ barnsley1_julia,
+ {"Barnsley1 Mandelbrot", "Barnsley1"},
+ "barnsley",
+ /*{1.25, -1.25, 1.25, -1.25}, */
+ {0.0, 0.0, 2.5, 2.5},
+ 0, 0, -0.6, 1.1,
+ {
+ {INT_MAX, INT_MAX, 0, NULL},
+ {INT_MAX, INT_MAX, 0, NULL},
+ {INT_MAX, INT_MAX, 0, NULL},
+ {INT_MAX, INT_MAX, 0, NULL},
+ {INT_MAX, INT_MAX, 0, NULL},
+ {INT_MAX, INT_MAX, 0, NULL},
+ {INT_MAX, INT_MAX, 0, NULL},
+ {INT_MAX, INT_MAX, 0, NULL},
+ {INT_MAX, INT_MAX, 0, NULL},
+ {INT_MAX, INT_MAX, 0, NULL},
+ {INT_MAX, INT_MAX, 0, NULL},
+ },
+ {
+ {INT_MAX, INT_MAX, 0, NULL},
+ {INT_MAX, INT_MAX, 0, NULL},
+ {INT_MAX, INT_MAX, 0, NULL},
+ {INT_MAX, INT_MAX, 0, NULL},
+ {INT_MAX, INT_MAX, 0, NULL},
+ {INT_MAX, INT_MAX, 0, NULL},
+ {INT_MAX, INT_MAX, 0, NULL},
+ {INT_MAX, INT_MAX, 0, NULL},
+ {INT_MAX, INT_MAX, 0, NULL},
+ {INT_MAX, INT_MAX, 0, NULL},
+ {INT_MAX, INT_MAX, 0, NULL},
+ },
+ STARTZERO | MANDEL_BTRACE,
+ },
+ { /* formula added by Andreas Madritsch *//* 8 */
+ FORMULAMAGIC,
+#ifndef SLOWFUNCPTR
+ barnsley2_calc,
+ NULL,
+ sbarnsley2_calc,
+ NULL,
+#endif
+ barnsley2_julia,
+ {"Barnsley2 Mandelbrot", "Barnsley2"},
+ "barnsley2",
+ /*{1.25, -1.25, 1.25, -1.25}, */
+ {0.0, 0.0, 2.5, 5.5},
+ 0, 0, -0.6, 1.1,
+ {
+ {INT_MAX, INT_MAX, 0, NULL},
+ {INT_MAX, INT_MAX, 0, NULL},
+ {INT_MAX, INT_MAX, 0, NULL},
+ {INT_MAX, INT_MAX, 0, NULL},
+ {INT_MAX, INT_MAX, 0, NULL},
+ {INT_MAX, INT_MAX, 0, NULL},
+ {INT_MAX, INT_MAX, 0, NULL},
+ {INT_MAX, INT_MAX, 0, NULL},
+ {INT_MAX, INT_MAX, 0, NULL},
+ {INT_MAX, INT_MAX, 0, NULL},
+ {INT_MAX, INT_MAX, 0, NULL},
+ },
+ {
+ {INT_MAX, INT_MAX, 0, NULL},
+ {INT_MAX, INT_MAX, 0, NULL},
+ {INT_MAX, INT_MAX, 0, NULL},
+ {INT_MAX, INT_MAX, 0, NULL},
+ {INT_MAX, INT_MAX, 0, NULL},
+ {INT_MAX, INT_MAX, 0, NULL},
+ {INT_MAX, INT_MAX, 0, NULL},
+ {INT_MAX, INT_MAX, 0, NULL},
+ {INT_MAX, INT_MAX, 0, NULL},
+ {INT_MAX, INT_MAX, 0, NULL},
+ {INT_MAX, INT_MAX, 0, NULL},
+ },
+ STARTZERO | MANDEL_BTRACE,
+ },
+ { /* formula added by Arpad Fekete *//* 9 */
+ FORMULAMAGIC,
+#ifndef SLOWFUNCPTR
+ barnsley3_calc,
+ NULL,
+ sbarnsley3_calc,
+ NULL,
+#endif
+ barnsley3_julia,
+ {"Barnsley3 Mandelbrot", "Barnsley3"},
+ "barnsley3",
+ /*{1.25, -1.25, 1.25, -1.25}, */
+ {0.0, 0.0, 2.5, 3.5},
+ 0, 0, 0.0, 0.4,
+ {
+ {INT_MAX, INT_MAX, 0, NULL},
+ {INT_MAX, INT_MAX, 0, NULL},
+ {INT_MAX, INT_MAX, 0, NULL},
+ {INT_MAX, INT_MAX, 0, NULL},
+ {INT_MAX, INT_MAX, 0, NULL},
+ {INT_MAX, INT_MAX, 0, NULL},
+ {INT_MAX, INT_MAX, 0, NULL},
+ {INT_MAX, INT_MAX, 0, NULL},
+ {INT_MAX, INT_MAX, 0, NULL},
+ {INT_MAX, INT_MAX, 0, NULL},
+ {INT_MAX, INT_MAX, 0, NULL},
+ },
+ {
+ {INT_MAX, INT_MAX, 0, NULL},
+ {INT_MAX, INT_MAX, 0, NULL},
+ {INT_MAX, INT_MAX, 0, NULL},
+ {INT_MAX, INT_MAX, 0, NULL},
+ {INT_MAX, INT_MAX, 0, NULL},
+ {INT_MAX, INT_MAX, 0, NULL},
+ {INT_MAX, INT_MAX, 0, NULL},
+ {INT_MAX, INT_MAX, 0, NULL},
+ {INT_MAX, INT_MAX, 0, NULL},
+ {INT_MAX, INT_MAX, 0, NULL},
+ {INT_MAX, INT_MAX, 0, NULL},
+ },
+ STARTZERO | MANDEL_BTRACE,
+ },
+ { /* 10 */
+ FORMULAMAGIC,
+#ifndef SLOWFUNCPTR
+ octo_calc,
+ /*octo_peri, */ NULL,
+ socto_calc,
+ /*socto_peri, */ NULL,
+#endif
+ NULL,
+ {"Octal", "Octal"},
+ "octal",
+ /*{1.25, -1.25, 1.25, -1.25}, */
+ {0.0, 0.0, 2.5, 2.5},
+ 0, 1, 0.0, 0.0,
+ {
+ {0, 0, 6, sym16},
+ {INT_MAX, 0, 0, NULL},
+ {0, INT_MAX, 0, NULL},
+ {INT_MAX, INT_MAX, 0, NULL},
+ {INT_MAX, INT_MAX, 0, NULL},
+ {0, INT_MAX, 0, NULL},
+ {0, 0, 0, NULL},
+ {0, 0, 6, sym16},
+ {INT_MAX, INT_MAX, 0, NULL},
+ {0, 0, 6, sym16},
+ {INT_MAX, INT_MAX, 0, NULL},
+ },
+ {
+ {0, 0, 6, sym16},
+ {0, 0, 6, sym16},
+ {INT_MAX, INT_MAX, 0, NULL},
+ {INT_MAX, INT_MAX, 0, NULL},
+ {INT_MAX, INT_MAX, 0, NULL},
+ {INT_MAX, INT_MAX, 0, NULL},
+ {INT_MAX, INT_MAX, 0, NULL},
+ {INT_MAX, INT_MAX, 0, NULL},
+ {INT_MAX, INT_MAX, 0, NULL},
+ {INT_MAX, INT_MAX, 0, NULL},
+ {INT_MAX, INT_MAX, 0, NULL},
+ },
+ MANDEL_BTRACE | STARTZERO,
+ },
+ { /* 11 */
+ FORMULAMAGIC,
+#ifndef SLOWFUNCPTR
+ phoenix_calc,
+ phoenix_peri,
+ sphoenix_calc,
+ sphoenix_peri,
+#endif
+ NULL,
+ {"MandPhoenix", "Phoenix"},
+ "phoenix",
+ /*{1.25, -1.25, 1.25, -1.25}, */
+ {0.0, 0.0, 2.5, 2.5},
+ 1, 0, 0.56667000000000001, -0.5,
+ {
+ {INT_MAX, 0, 0, NULL},
+ {INT_MAX, 0, 0, NULL},
+ {INT_MAX, INT_MAX, 0, NULL},
+ {INT_MAX, INT_MAX, 0, NULL},
+ {INT_MAX, INT_MAX, 0, NULL},
+ {INT_MAX, INT_MAX, 0, NULL},
+ {INT_MAX, 0, 0, NULL},
+ {INT_MAX, 0, 0, NULL},
+ {INT_MAX, INT_MAX, 0, NULL},
+ {INT_MAX, 0, 0, NULL},
+ {INT_MAX, INT_MAX, 0, NULL},
+ },
+ {
+ {INT_MAX, 0, 0, NULL},
+ {INT_MAX, 0, 0, NULL},
+ {INT_MAX, INT_MAX, 0, NULL},
+ {INT_MAX, INT_MAX, 0, NULL},
+ {INT_MAX, INT_MAX, 0, NULL},
+ {INT_MAX, INT_MAX, 0, NULL},
+ {INT_MAX, INT_MAX, 0, NULL},
+ {INT_MAX, INT_MAX, 0, NULL},
+ {INT_MAX, INT_MAX, 0, NULL},
+ {INT_MAX, INT_MAX, 0, NULL},
+ {INT_MAX, INT_MAX, 0, NULL},
+ },
+ MANDEL_BTRACE,
+ },
+ { /* 12 */
+ FORMULAMAGIC,
+#ifndef SLOWFUNCPTR
+ magnet_calc,
+ magnet_peri,
+ smagnet_calc,
+ smagnet_peri,
+#endif
+ magnet_julia,
+ {"Magnet", "Magnet"},
+ "magnet",
+ /*{3, 0, 2.2, -2.2}, */
+ {1.5, 0.0, 3.0, 4.4},
+ 1, 1, 0.0, 0.0,
+ {
+ {INT_MAX, 0, 0, NULL},
+ {INT_MAX, 0, 0, NULL},
+ {INT_MAX, INT_MAX, 0, NULL},
+ {INT_MAX, INT_MAX, 0, NULL},
+ {INT_MAX, INT_MAX, 0, NULL},
+ {INT_MAX, INT_MAX, 0, NULL},
+ {INT_MAX, 0, 0, NULL},
+ {INT_MAX, 0, 0, NULL},
+ {INT_MAX, INT_MAX, 0, NULL},
+ {INT_MAX, 0, 0, NULL},
+ {INT_MAX, INT_MAX, 0, NULL},
+ },
+ {
+ {INT_MAX, 0, 0, NULL},
+ {INT_MAX, 0, 0, NULL},
+ {INT_MAX, INT_MAX, 0, NULL},
+ {INT_MAX, INT_MAX, 0, NULL},
+ {INT_MAX, INT_MAX, 0, NULL},
+ {INT_MAX, INT_MAX, 0, NULL},
+ {INT_MAX, INT_MAX, 0, NULL},
+ {INT_MAX, INT_MAX, 0, NULL},
+ {INT_MAX, INT_MAX, 0, NULL},
+ {INT_MAX, INT_MAX, 0, NULL},
+ {INT_MAX, INT_MAX, 0, NULL},
+ },
+ STARTZERO,
+ },
+ { /* formula added by Andreas Madritsch *//* 13 */
+ FORMULAMAGIC,
+#ifndef SLOWFUNCPTR
+ magnet2_calc,
+ magnet2_peri,
+ smagnet2_calc,
+ smagnet2_peri,
+#endif
+ magnet2_julia,
+ {"Magnet2", "Magnet2"},
+ "magnet2",
+ /*{3, 0, 2.2, -2.2}, */
+ {1.0, 0.0, 3.0, 3.2},
+ 1, 1, 0.0, 0.0,
+ {
+ {INT_MAX, 0, 0, NULL},
+ {INT_MAX, 0, 0, NULL},
+ {INT_MAX, INT_MAX, 0, NULL},
+ {INT_MAX, INT_MAX, 0, NULL},
+ {INT_MAX, INT_MAX, 0, NULL},
+ {INT_MAX, INT_MAX, 0, NULL},
+ {INT_MAX, 0, 0, NULL},
+ {INT_MAX, 0, 0, NULL},
+ {INT_MAX, INT_MAX, 0, NULL},
+ {INT_MAX, 0, 0, NULL},
+ {INT_MAX, INT_MAX, 0, NULL},
+ },
+ {
+ {INT_MAX, 0, 0, NULL},
+ {INT_MAX, 0, 0, NULL},
+ {INT_MAX, INT_MAX, 0, NULL},
+ {INT_MAX, INT_MAX, 0, NULL},
+ {INT_MAX, INT_MAX, 0, NULL},
+ {INT_MAX, INT_MAX, 0, NULL},
+ {INT_MAX, INT_MAX, 0, NULL},
+ {INT_MAX, INT_MAX, 0, NULL},
+ {INT_MAX, INT_MAX, 0, NULL},
+ {INT_MAX, INT_MAX, 0, NULL},
+ {INT_MAX, INT_MAX, 0, NULL},
+ },
+ STARTZERO,
+ },
+ { /* formula added by Arpad Fekete *//* 14 */
+ FORMULAMAGIC,
+#ifndef SLOWFUNCPTR
+ trice_calc,
+ trice_peri,
+ strice_calc,
+ strice_peri,
+#endif
+ NULL,
+ {"Triceratops", "Triceratops Julia"},
+ "trice",
+ {0.0, 0.0, 2.5, 4.5},
+ 1, 1, 0.0, 0.0,
+ {
+ {INT_MAX, 0, 0, NULL},
+ {INT_MAX, 0, 0, NULL},
+ {INT_MAX, INT_MAX, 0, NULL},
+ {INT_MAX, INT_MAX, 0, NULL},
+ {INT_MAX, INT_MAX, 0, NULL},
+ {INT_MAX, INT_MAX, 0, NULL},
+ {INT_MAX, 0, 0, NULL},
+ {INT_MAX, 0, 0, NULL},
+ {INT_MAX, INT_MAX, 0, NULL},
+ {INT_MAX, 0, 0, NULL},
+ {INT_MAX, INT_MAX, 0, NULL},
+ },
+ {
+ {INT_MAX, 0, 0, NULL},
+ {INT_MAX, 0, 0, NULL},
+ {INT_MAX, INT_MAX, 0, NULL},
+ {INT_MAX, INT_MAX, 0, NULL},
+ {INT_MAX, INT_MAX, 0, NULL},
+ {INT_MAX, 0, 0, NULL},
+ {INT_MAX, 0, 0, NULL},
+ {INT_MAX, 0, 0, NULL},
+ {INT_MAX, 0, 0, NULL},
+ {INT_MAX, INT_MAX, 0, NULL},
+ {INT_MAX, INT_MAX, 0, NULL},
+ },
+ MANDEL_BTRACE,
+ },
+ { /* formula added by Arpad Fekete *//* 15 */
+ FORMULAMAGIC,
+#ifndef SLOWFUNCPTR
+ catseye_calc,
+ catseye_peri,
+ scatseye_calc,
+ scatseye_peri,
+#endif
+ NULL,
+ {"Catseye", "Catseye Julia"},
+ "catseye",
+ {0.0, 0.0, 2.5, 4.5},
+ 1, 1, 0.0, 0.0,
+ {
+ {0, 0, 0, NULL},
+ {INT_MAX, 0, 0, NULL},
+ {INT_MAX, INT_MAX, 0, NULL},
+ {INT_MAX, INT_MAX, 0, NULL},
+ {INT_MAX, INT_MAX, 0, NULL},
+ {INT_MAX, INT_MAX, 0, NULL},
+ {0, 0, 0, NULL},
+ {0, 0, 0, NULL},
+ {INT_MAX, INT_MAX, 0, NULL},
+ {0, 0, 0, NULL},
+ {INT_MAX, INT_MAX, 0, NULL},
+ },
+ {
+ {0, 0, 0, NULL},
+ {0, 0, 0, NULL},
+ {INT_MAX, INT_MAX, 0, NULL},
+ {INT_MAX, INT_MAX, 0, NULL},
+ {INT_MAX, INT_MAX, 0, NULL},
+ {0, 0, 0, NULL},
+ {0, 0, 0, NULL},
+ {0, 0, 0, NULL},
+ {0, 0, 0, NULL},
+ {INT_MAX, INT_MAX, 0, NULL},
+ {INT_MAX, INT_MAX, 0, NULL},
+ },
+ MANDEL_BTRACE,
+ },
+ { /*formula added by Arpad Fekete *//* 16 */
+ /*in Gnofract4d from mathworld.wolfram.com */
+ FORMULAMAGIC,
+#ifndef SLOWFUNCPTR
+ mbar_calc,
+ mbar_peri,
+ smbar_calc,
+ smbar_peri,
+#endif
+ mbar_julia,
+ {"Mandelbar", "Mandelbar Julia"},
+ "mbar",
+ {0.0, 0.0, 2.5, 3.5},
+ 1, 1, 0.0, 0.0,
+ {
+ {INT_MAX, 0, 2, sym6},
+ {INT_MAX, 0, 0, NULL},
+ {INT_MAX, INT_MAX, 0, NULL},
+ {INT_MAX, INT_MAX, 0, NULL},
+ {INT_MAX, INT_MAX, 0, NULL},
+ {INT_MAX, INT_MAX, 0, NULL},
+ {INT_MAX, 0, 0, NULL},
+ {INT_MAX, 0, 2, sym6},
+ {INT_MAX, INT_MAX, 0, NULL},
+ {INT_MAX, 0, 2, sym6},
+ {INT_MAX, INT_MAX, 0, NULL},
+ },
+ {
+ {INT_MAX, 0, 2, sym6},
+ {INT_MAX, 0, 2, sym6},
+ {INT_MAX, INT_MAX, 0, NULL},
+ {INT_MAX, INT_MAX, 0, NULL},
+ {INT_MAX, INT_MAX, 0, NULL},
+ {INT_MAX, 0, 0, NULL},
+ {INT_MAX, 0, 0, NULL},
+ {INT_MAX, 0, 0, NULL},
+ {INT_MAX, 0, 0, NULL},
+ {INT_MAX, INT_MAX, 0, NULL},
+ {INT_MAX, INT_MAX, 0, NULL},
+ },
+ MANDEL_BTRACE,
+ },
+ { /* formula added by Arpad Fekete (from fractint) *//* 17 */
+ FORMULAMAGIC,
+#ifndef SLOWFUNCPTR
+ mlambda_calc,
+ mlambda_peri,
+ smlambda_calc,
+ smlambda_peri,
+#endif
+ NULL,
+ {"Lambda Mandelbrot", "Lambda"},
+ "mlambda",
+ {0.5, 0.0, 2.5, 5.5},
+ 0, 0, 0.5, 0.0,
+ {
+ {INT_MAX, INT_MAX, 0, NULL},
+ {INT_MAX, INT_MAX, 0, NULL},
+ {INT_MAX, INT_MAX, 0, NULL},
+ {INT_MAX, INT_MAX, 0, NULL},
+ {INT_MAX, INT_MAX, 0, NULL},
+ {INT_MAX, INT_MAX, 0, NULL},
+ {INT_MAX, INT_MAX, 0, NULL},
+ {INT_MAX, INT_MAX, 0, NULL},
+ {INT_MAX, INT_MAX, 0, NULL},
+ {INT_MAX, INT_MAX, 0, NULL},
+ {INT_MAX, INT_MAX, 0, NULL},
+ },
+ {
+ {INT_MAX, INT_MAX, 0, NULL},
+ {INT_MAX, INT_MAX, 0, NULL},
+ {INT_MAX, INT_MAX, 0, NULL},
+ {INT_MAX, INT_MAX, 0, NULL},
+ {INT_MAX, INT_MAX, 0, NULL},
+ {INT_MAX, INT_MAX, 0, NULL},
+ {INT_MAX, INT_MAX, 0, NULL},
+ {INT_MAX, INT_MAX, 0, NULL},
+ {INT_MAX, INT_MAX, 0, NULL},
+ {INT_MAX, INT_MAX, 0, NULL},
+ {INT_MAX, INT_MAX, 0, NULL},
+ },
+ MANDEL_BTRACE,
+ },
+ { /* formula added by Arpad Fekete (from fractint) *//* 18 */
+ FORMULAMAGIC,
+#ifndef SLOWFUNCPTR
+ manowar_calc,
+ NULL,
+ smanowar_calc,
+ NULL,
+#endif
+ NULL,
+ {"Manowar", "Manowar Julia"},
+ "manowar",
+ {0.0, 0.0, 2.5, 2.5},
+ 1, 1, 0.0, 0.0,
+ {
+ {INT_MAX, 0, 0, NULL},
+ {INT_MAX, 0, 0, NULL},
+ {INT_MAX, INT_MAX, 0, NULL},
+ {INT_MAX, INT_MAX, 0, NULL},
+ {INT_MAX, INT_MAX, 0, NULL},
+ {INT_MAX, INT_MAX, 0, NULL},
+ {INT_MAX, 0, 0, NULL},
+ {INT_MAX, 0, 0, NULL},
+ {INT_MAX, INT_MAX, 0, NULL},
+ {INT_MAX, 0, 0, NULL},
+ {INT_MAX, INT_MAX, 0, NULL},
+ },
+ {
+ {INT_MAX, 0, 0, NULL},
+ {INT_MAX, 0, 0, NULL},
+ {INT_MAX, INT_MAX, 0, NULL},
+ {INT_MAX, INT_MAX, 0, NULL},
+ {INT_MAX, INT_MAX, 0, NULL},
+ {INT_MAX, 0, 0, NULL},
+ {INT_MAX, 0, 0, NULL},
+ {INT_MAX, 0, 0, NULL},
+ {INT_MAX, 0, 0, NULL},
+ {INT_MAX, INT_MAX, 0, NULL},
+ {INT_MAX, INT_MAX, 0, NULL},
+ },
+ MANDEL_BTRACE,
+ },
+ { /* formula added by Arpad Fekete (from fractint) *//* 19 */
+ FORMULAMAGIC,
+#ifndef SLOWFUNCPTR
+ spider_calc,
+ NULL,
+ sspider_calc,
+ NULL,
+#endif
+ NULL,
+ {"Spider", "Spider Julia"},
+ "spider",
+ {0.0, 0.0, 2.5, 4.5},
+ 1, 1, 0.0, 0.0,
+ {
+ {INT_MAX, 0, 0, NULL},
+ {INT_MAX, 0, 0, NULL},
+ {INT_MAX, INT_MAX, 0, NULL},
+ {INT_MAX, INT_MAX, 0, NULL},
+ {INT_MAX, INT_MAX, 0, NULL},
+ {INT_MAX, INT_MAX, 0, NULL},
+ {INT_MAX, 0, 0, NULL},
+ {INT_MAX, 0, 0, NULL},
+ {INT_MAX, INT_MAX, 0, NULL},
+ {INT_MAX, 0, 0, NULL},
+ {INT_MAX, INT_MAX, 0, NULL},
+ },
+ {
+ {INT_MAX, 0, 0, NULL},
+ {INT_MAX, 0, 0, NULL},
+ {INT_MAX, INT_MAX, 0, NULL},
+ {INT_MAX, INT_MAX, 0, NULL},
+ {INT_MAX, INT_MAX, 0, NULL},
+ {INT_MAX, 0, 0, NULL},
+ {INT_MAX, 0, 0, NULL},
+ {INT_MAX, 0, 0, NULL},
+ {INT_MAX, 0, 0, NULL},
+ {INT_MAX, INT_MAX, 0, NULL},
+ {INT_MAX, INT_MAX, 0, NULL},
+ },
+ MANDEL_BTRACE,
+ },
+ { /* formula added by Arpad Fekete, method from fractint *//* 20 */
+ FORMULAMAGIC,
+#ifndef SLOWFUNCPTR
+ sier_calc,
+ NULL,
+ NULL,
+ NULL,
+#endif
+ NULL,
+ {"Sierpinski", "Sierpinski"},
+ "sier",
+ {0.5, 0.43, 1.5, 1.0},
+ 0, 0, 0.5, 0.8660254,
+ {
+ {INT_MAX, INT_MAX, 0, NULL},
+ {INT_MAX, INT_MAX, 0, NULL},
+ {INT_MAX, INT_MAX, 0, NULL},
+ {INT_MAX, INT_MAX, 0, NULL},
+ {INT_MAX, INT_MAX, 0, NULL},
+ {INT_MAX, INT_MAX, 0, NULL},
+ {INT_MAX, INT_MAX, 0, NULL},
+ {INT_MAX, INT_MAX, 0, NULL},
+ {INT_MAX, INT_MAX, 0, NULL},
+ {INT_MAX, INT_MAX, 0, NULL},
+ {INT_MAX, INT_MAX, 0, NULL},
+ },
+ {
+ {INT_MAX, INT_MAX, 0, NULL},
+ {INT_MAX, INT_MAX, 0, NULL},
+ {INT_MAX, INT_MAX, 0, NULL},
+ {INT_MAX, INT_MAX, 0, NULL},
+ {INT_MAX, INT_MAX, 0, NULL},
+ {INT_MAX, INT_MAX, 0, NULL},
+ {INT_MAX, INT_MAX, 0, NULL},
+ {INT_MAX, INT_MAX, 0, NULL},
+ {INT_MAX, INT_MAX, 0, NULL},
+ {INT_MAX, INT_MAX, 0, NULL},
+ {INT_MAX, INT_MAX, 0, NULL},
+ },
+ MANDEL_BTRACE,
+ },
+ { /* formula added by Arpad Fekete, method from fractint *//* 21 */
+ FORMULAMAGIC,
+#ifndef SLOWFUNCPTR
+ carpet_calc,
+ NULL,
+ NULL,
+ NULL,
+#endif
+ NULL,
+ {"S.Carpet", "S.Carpet"},
+ "carpet",
+ {0.5, 0.5, 1.5, 1.5},
+ 0, 0, 1, 1,
+ {
+ {INT_MAX, INT_MAX, 0, NULL},
+ {INT_MAX, INT_MAX, 0, NULL},
+ {INT_MAX, INT_MAX, 0, NULL},
+ {INT_MAX, INT_MAX, 0, NULL},
+ {INT_MAX, INT_MAX, 0, NULL},
+ {INT_MAX, INT_MAX, 0, NULL},
+ {INT_MAX, INT_MAX, 0, NULL},
+ {INT_MAX, INT_MAX, 0, NULL},
+ {INT_MAX, INT_MAX, 0, NULL},
+ {INT_MAX, INT_MAX, 0, NULL},
+ {INT_MAX, INT_MAX, 0, NULL},
+ },
+ {
+ {INT_MAX, INT_MAX, 0, NULL},
+ {INT_MAX, INT_MAX, 0, NULL},
+ {INT_MAX, INT_MAX, 0, NULL},
+ {INT_MAX, INT_MAX, 0, NULL},
+ {INT_MAX, INT_MAX, 0, NULL},
+ {INT_MAX, INT_MAX, 0, NULL},
+ {INT_MAX, INT_MAX, 0, NULL},
+ {INT_MAX, INT_MAX, 0, NULL},
+ {INT_MAX, INT_MAX, 0, NULL},
+ {INT_MAX, INT_MAX, 0, NULL},
+ {INT_MAX, INT_MAX, 0, NULL},
+ },
+ MANDEL_BTRACE,
+ },
+ { /* formula added by Arpad Fekete, method from fractint *//* 22 */
+ FORMULAMAGIC,
+#ifndef SLOWFUNCPTR
+ koch_calc,
+ NULL,
+ NULL,
+ NULL,
+#endif
+ NULL,
+ {"Koch Snowflake", "Koch Snowflake"},
+ "koch",
+ {0.0, 0.0, 2.5, 2.5},
+ 0, 1, 0, 0,
+ {
+ {INT_MAX, INT_MAX, 0, NULL},
+ {INT_MAX, INT_MAX, 0, NULL},
+ {INT_MAX, INT_MAX, 0, NULL},
+ {INT_MAX, INT_MAX, 0, NULL},
+ {INT_MAX, INT_MAX, 0, NULL},
+ {INT_MAX, INT_MAX, 0, NULL},
+ {INT_MAX, INT_MAX, 0, NULL},
+ {INT_MAX, INT_MAX, 0, NULL},
+ {INT_MAX, INT_MAX, 0, NULL},
+ {INT_MAX, INT_MAX, 0, NULL},
+ {INT_MAX, INT_MAX, 0, NULL},
+ },
+ {
+ {INT_MAX, INT_MAX, 0, NULL},
+ {INT_MAX, INT_MAX, 0, NULL},
+ {INT_MAX, INT_MAX, 0, NULL},
+ {INT_MAX, INT_MAX, 0, NULL},
+ {INT_MAX, INT_MAX, 0, NULL},
+ {INT_MAX, INT_MAX, 0, NULL},
+ {INT_MAX, INT_MAX, 0, NULL},
+ {INT_MAX, INT_MAX, 0, NULL},
+ {INT_MAX, INT_MAX, 0, NULL},
+ {INT_MAX, INT_MAX, 0, NULL},
+ {INT_MAX, INT_MAX, 0, NULL},
+ },
+ MANDEL_BTRACE,
+ },
+ { /* formula added by Z. Kovacs *//* 23 */
+ FORMULAMAGIC,
+#ifndef SLOWFUNCPTR
+ hornflake_calc,
+ NULL,
+ NULL,
+ NULL,
+#endif
+ NULL,
+ {"Spidron hornflake", "Spidron hornflake"},
+ "hornflake",
+ {-0.75, 0, 3.8756, 3.8756},
+ 0, 1, 0, 0,
+ {
+ {INT_MAX, INT_MAX, 0, NULL},
+ {INT_MAX, INT_MAX, 0, NULL},
+ {INT_MAX, INT_MAX, 0, NULL},
+ {INT_MAX, INT_MAX, 0, NULL},
+ {INT_MAX, INT_MAX, 0, NULL},
+ {INT_MAX, INT_MAX, 0, NULL},
+ {INT_MAX, INT_MAX, 0, NULL},
+ {INT_MAX, INT_MAX, 0, NULL},
+ {INT_MAX, INT_MAX, 0, NULL},
+ {INT_MAX, INT_MAX, 0, NULL},
+ {INT_MAX, INT_MAX, 0, NULL},
+ },
+ {
+ {INT_MAX, INT_MAX, 0, NULL},
+ {INT_MAX, INT_MAX, 0, NULL},
+ {INT_MAX, INT_MAX, 0, NULL},
+ {INT_MAX, INT_MAX, 0, NULL},
+ {INT_MAX, INT_MAX, 0, NULL},
+ {INT_MAX, INT_MAX, 0, NULL},
+ {INT_MAX, INT_MAX, 0, NULL},
+ {INT_MAX, INT_MAX, 0, NULL},
+ {INT_MAX, INT_MAX, 0, NULL},
+ {INT_MAX, INT_MAX, 0, NULL},
+ {INT_MAX, INT_MAX, 0, NULL},
+ },
+ MANDEL_BTRACE,
+ },
+ { /* formula added by Z. Kovacs, originally mand6 but it was mand9 by accident *//* 24 */
+ FORMULAMAGIC,
+#ifndef SLOWFUNCPTR
+ mand9_calc,
+ mand9_peri,
+ smand9_calc,
+ smand9_peri,
+#endif
+ mand9_julia,
+ {"Mandelbrot^9", "Julia^9"},
+ "mandel9",
+ /*{1.25, -1.25, 1.25, -1.25}, */
+ {0.0, 0.0, 2.5, 2.5},
+ 1, 1, 0.0, 0.0,
+ {
+ {0, 0, 6, sym16},
+ {INT_MAX, 0, 0, NULL},
+ {0, INT_MAX, 0, NULL},
+ {INT_MAX, INT_MAX, 0, NULL},
+ {INT_MAX, INT_MAX, 0, NULL},
+ {0, INT_MAX, 0, NULL},
+ {0, 0, 0, NULL},
+ {0, 0, 6, sym16},
+ {INT_MAX, INT_MAX, 0, NULL},
+ {0, 0, 6, sym16},
+ {INT_MAX, INT_MAX, 0, NULL},
+ },
+ {
+ {0, 0, 6, sym16},
+ {0, 0, 6, sym16},
+ {INT_MAX, INT_MAX, 0, NULL},
+ {INT_MAX, INT_MAX, 0, NULL},
+ {INT_MAX, INT_MAX, 0, NULL},
+ {INT_MAX, INT_MAX, 0, NULL},
+ {INT_MAX, INT_MAX, 0, NULL},
+ {INT_MAX, INT_MAX, 0, NULL},
+ {INT_MAX, INT_MAX, 0, NULL},
+ {INT_MAX, INT_MAX, 0, NULL},
+ {INT_MAX, INT_MAX, 0, NULL},
+ },
+ MANDEL_BTRACE,
+ },
+
+ { /* formula added by S. Bizien *//* 25 */
+ FORMULAMAGIC,
+#ifndef SLOWFUNCPTR
+ beryl_calc,
+ beryl_peri,
+ NULL,
+ NULL,
+#endif
+ NULL,
+ {"Beryl", "Beryl"},
+ "beryl",
+ {-0.6, 0, 2, 2},
+ 0, 0, 1.0, 0.0,
+ {
+ {INT_MAX, INT_MAX, 0, NULL},
+ {INT_MAX, INT_MAX, 0, NULL},
+ {INT_MAX, INT_MAX, 0, NULL},
+ {INT_MAX, INT_MAX, 0, NULL},
+ {INT_MAX, INT_MAX, 0, NULL},
+ {INT_MAX, INT_MAX, 0, NULL},
+ {INT_MAX, INT_MAX, 0, NULL},
+ {INT_MAX, INT_MAX, 0, NULL},
+ {INT_MAX, INT_MAX, 0, NULL},
+ {INT_MAX, INT_MAX, 0, NULL},
+ {INT_MAX, INT_MAX, 0, NULL},
+ },
+ {
+ {INT_MAX, INT_MAX, 0, NULL},
+ {INT_MAX, INT_MAX, 0, NULL},
+ {INT_MAX, INT_MAX, 0, NULL},
+ {INT_MAX, INT_MAX, 0, NULL},
+ {INT_MAX, INT_MAX, 0, NULL},
+ {INT_MAX, INT_MAX, 0, NULL},
+ {INT_MAX, INT_MAX, 0, NULL},
+ {INT_MAX, INT_MAX, 0, NULL},
+ {INT_MAX, INT_MAX, 0, NULL},
+ {INT_MAX, INT_MAX, 0, NULL},
+ {INT_MAX, INT_MAX, 0, NULL},
+ },
+ MANDEL_BTRACE,
+ },
+ { /* formula added by Arpad Fekete *//* 26 */
+ FORMULAMAGIC,
+#ifndef SLOWFUNCPTR
+ goldsier_calc,
+ NULL,
+ NULL,
+ NULL,
+#endif
+ NULL,
+ {"Golden Sierpinski", "Golden Sierpinski"},
+ "goldsier",
+ {0.5, 0.43, 1.5, 1.0},
+ 0, 0, 0.5, 0.8660254,
+ {
+ {INT_MAX, INT_MAX, 0, NULL},
+ {INT_MAX, INT_MAX, 0, NULL},
+ {INT_MAX, INT_MAX, 0, NULL},
+ {INT_MAX, INT_MAX, 0, NULL},
+ {INT_MAX, INT_MAX, 0, NULL},
+ {INT_MAX, INT_MAX, 0, NULL},
+ {INT_MAX, INT_MAX, 0, NULL},
+ {INT_MAX, INT_MAX, 0, NULL},
+ {INT_MAX, INT_MAX, 0, NULL},
+ {INT_MAX, INT_MAX, 0, NULL},
+ {INT_MAX, INT_MAX, 0, NULL},
+ },
+ {
+ {INT_MAX, INT_MAX, 0, NULL},
+ {INT_MAX, INT_MAX, 0, NULL},
+ {INT_MAX, INT_MAX, 0, NULL},
+ {INT_MAX, INT_MAX, 0, NULL},
+ {INT_MAX, INT_MAX, 0, NULL},
+ {INT_MAX, INT_MAX, 0, NULL},
+ {INT_MAX, INT_MAX, 0, NULL},
+ {INT_MAX, INT_MAX, 0, NULL},
+ {INT_MAX, INT_MAX, 0, NULL},
+ {INT_MAX, INT_MAX, 0, NULL},
+ {INT_MAX, INT_MAX, 0, NULL},
+ },
+ MANDEL_BTRACE,
+ },
+ { /* formula added by Arpad Fekete *//* 27 */
+ FORMULAMAGIC,
+#ifndef SLOWFUNCPTR
+ circle7_calc,
+ NULL,
+ NULL,
+ NULL,
+#endif
+ NULL,
+ {"Circle 7", "Circle 7"},
+ "circle7",
+ {0.0, 0.0, 2.5, 2.5},
+ 0, 0, 0.0, 0.0,
+ {
+ {INT_MAX, INT_MAX, 0, NULL},
+ {INT_MAX, INT_MAX, 0, NULL},
+ {INT_MAX, INT_MAX, 0, NULL},
+ {INT_MAX, INT_MAX, 0, NULL},
+ {INT_MAX, INT_MAX, 0, NULL},
+ {INT_MAX, INT_MAX, 0, NULL},
+ {INT_MAX, INT_MAX, 0, NULL},
+ {INT_MAX, INT_MAX, 0, NULL},
+ {INT_MAX, INT_MAX, 0, NULL},
+ {INT_MAX, INT_MAX, 0, NULL},
+ {INT_MAX, INT_MAX, 0, NULL},
+ },
+ {
+ {INT_MAX, INT_MAX, 0, NULL},
+ {INT_MAX, INT_MAX, 0, NULL},
+ {INT_MAX, INT_MAX, 0, NULL},
+ {INT_MAX, INT_MAX, 0, NULL},
+ {INT_MAX, INT_MAX, 0, NULL},
+ {INT_MAX, INT_MAX, 0, NULL},
+ {INT_MAX, INT_MAX, 0, NULL},
+ {INT_MAX, INT_MAX, 0, NULL},
+ {INT_MAX, INT_MAX, 0, NULL},
+ {INT_MAX, INT_MAX, 0, NULL},
+ {INT_MAX, INT_MAX, 0, NULL},
+ },
+ MANDEL_BTRACE,
+ },
+ { /* formula added by Arpad Fekete *//* 28 */
+ FORMULAMAGIC,
+#ifndef SLOWFUNCPTR
+ symbarn_calc,
+ NULL,
+ NULL,
+ NULL,
+#endif
+ symbarn_julia,
+ {"Sym. Barnsley M.", "Sym. Barnsley"},
+ "symbarn",
+ {0.0, 0.0, 8.0, 1.0},
+ 0, 0, 1.3, 1.3,
+ /* Arpad hasn't created the symmetry properties, */
+ /* because he doesn't considered it to be important */
+ {
+ {INT_MAX, INT_MAX, 0, NULL},
+ {INT_MAX, INT_MAX, 0, NULL},
+ {INT_MAX, INT_MAX, 0, NULL},
+ {INT_MAX, INT_MAX, 0, NULL},
+ {INT_MAX, INT_MAX, 0, NULL},
+ {INT_MAX, INT_MAX, 0, NULL},
+ {INT_MAX, INT_MAX, 0, NULL},
+ {INT_MAX, INT_MAX, 0, NULL},
+ {INT_MAX, INT_MAX, 0, NULL},
+ {INT_MAX, INT_MAX, 0, NULL},
+ {INT_MAX, INT_MAX, 0, NULL},
+ },
+ {
+ {INT_MAX, INT_MAX, 0, NULL},
+ {INT_MAX, INT_MAX, 0, NULL},
+ {INT_MAX, INT_MAX, 0, NULL},
+ {INT_MAX, INT_MAX, 0, NULL},
+ {INT_MAX, INT_MAX, 0, NULL},
+ {INT_MAX, INT_MAX, 0, NULL},
+ {INT_MAX, INT_MAX, 0, NULL},
+ {INT_MAX, INT_MAX, 0, NULL},
+ {INT_MAX, INT_MAX, 0, NULL},
+ {INT_MAX, INT_MAX, 0, NULL},
+ {INT_MAX, INT_MAX, 0, NULL},
+ },
+ MANDEL_BTRACE,
+ }
+
+#ifdef SFFE_USING
+ , { /* formula added by M. Malczak - SFFE *//* 29 */
+ FORMULAMAGIC,
+#ifndef SLOWFUNCPTR
+ sffe_calc,
+ NULL,
+ NULL,
+ NULL,
+#endif
+ sffe_julia,
+ {"User defined", "User defined"},
+ "user",
+ /*{0.5, -2.0, 1.25, -1.25}, */
+ /*{-0.75, 0.0, 1, 1},*/
+ /* 2009-08-01 JB Langston
+ * Changed default zoom level to match Mandelbrot
+ */
+ {-0.75, 0.0, 2.5, 2.5},
+ 0, 1, 0.0, 0.0,
+ {
+ {INT_MAX, INT_MAX, 0, NULL},
+ {INT_MAX, INT_MAX, 0, NULL},
+ {INT_MAX, INT_MAX, 0, NULL},
+ {INT_MAX, INT_MAX, 0, NULL},
+ {INT_MAX, INT_MAX, 0, NULL},
+ {INT_MAX, INT_MAX, 0, NULL},
+ {INT_MAX, INT_MAX, 0, NULL},
+ {INT_MAX, INT_MAX, 0, NULL},
+ {INT_MAX, INT_MAX, 0, NULL},
+ {INT_MAX, INT_MAX, 0, NULL},
+ {INT_MAX, INT_MAX, 0, NULL},
+ },
+ {
+ {INT_MAX, INT_MAX, 0, NULL},
+ {INT_MAX, INT_MAX, 0, NULL},
+ {INT_MAX, INT_MAX, 0, NULL},
+ {INT_MAX, INT_MAX, 0, NULL},
+ {INT_MAX, INT_MAX, 0, NULL},
+ {INT_MAX, INT_MAX, 0, NULL},
+ {INT_MAX, INT_MAX, 0, NULL},
+ {INT_MAX, INT_MAX, 0, NULL},
+ {INT_MAX, INT_MAX, 0, NULL},
+ {INT_MAX, INT_MAX, 0, NULL},
+ {INT_MAX, INT_MAX, 0, NULL},
+ },
+ MANDEL_BTRACE | SFFE_FRACTAL,
+ }
+#endif
+
+};
+
+#ifdef SLOWFUNCPTR
+unsigned int
+calculateswitch(register number_t x1, register number_t y1,
+ register number_t x2, register number_t y2,
+ int periodicity)
+{
+ if (periodicity && cfractalc.periodicity)
+ if (cfractalc.coloringmode == 9)
+ switch (cfractalc.currentformula - formulas) { /* periodicity checking and smoothmode SPERI */
+ case 0:
+ return (smand_peri(x1, y1, x2, y2));
+ break;
+ case 1:
+ return (smand3_peri(x1, y1, x2, y2));
+ break;
+ case 2:
+ return (smand4_peri(x1, y1, x2, y2));
+ break;
+ case 3:
+ return (smand5_peri(x1, y1, x2, y2));
+ break;
+ case 4:
+ return (smand6_peri(x1, y1, x2, y2));
+ break;
+ case 5:
+ return (newton_calc(x1, y1, x2, y2));
+ break;
+ case 6:
+ return (newton4_calc(x1, y1, x2, y2));
+ break;
+ case 7:
+ return (sbarnsley1_calc(x1, y1, x2, y2));
+ break;
+ case 8:
+ return (sbarnsley2_calc(x1, y1, x2, y2));
+ break;
+ case 9:
+ return (sbarnsley3_calc(x1, y1, x2, y2));
+ break;
+ case 10:
+ return (octo_calc(x1, y1, x2, y2));
+ break;
+ case 11:
+ return (sphoenix_peri(x1, y1, x2, y2));
+ break;
+ case 12:
+ return (smagnet_peri(x1, y1, x2, y2));
+ break;
+ case 13:
+ return (smagnet2_peri(x1, y1, x2, y2));
+ break;
+ case 14:
+ return (strice_peri(x1, y1, x2, y2));
+ break;
+ case 15:
+ return (scatseye_peri(x1, y1, x2, y2));
+ break;
+ case 16:
+ return (smbar_peri(x1, y1, x2, y2));
+ break;
+ case 17:
+ return (smlambda_peri(x1, y1, x2, y2));
+ break;
+ case 18:
+ return (smanowar_calc(x1, y1, x2, y2));
+ break;
+ case 19:
+ return (sspider_calc(x1, y1, x2, y2));
+ break;
+ case 20:
+ return (sier_calc(x1, y1, x2, y2));
+ break;
+ case 21:
+ return (carpet_calc(x1, y1, x2, y2));
+ break;
+ case 22:
+ return (koch_calc(x1, y1, x2, y2));
+ break;
+ case 23:
+ return (hornflake_calc(x1, y1, x2, y2));
+ break;
+ case 24:
+ return (smand9_peri(x1, y1, x2, y2));
+ break;
+ case 25:
+ return (beryl_calc(x1, y1, x2, y2));
+ break;
+ case 26:
+ return (goldsier_calc(x1, y1, x2, y2));
+ break;
+ case 27:
+ return (circle7_calc(x1, y1, x2, y2));
+ break;
+ case 28:
+ return (symbarn_calc(x1, y1, x2, y2));
+ break;
+
+#ifdef SFFE_USING
+ case 29:
+ return (sffe_calc(x1, y1, x2, y2));
+ break;
+#endif
+ } else
+ switch (cfractalc.currentformula - formulas) { /* periodicity checking and no smoothmode PERI */
+ case 0:
+ return (mand_peri(x1, y1, x2, y2));
+ break;
+ case 1:
+ return (mand3_peri(x1, y1, x2, y2));
+ break;
+ case 2:
+ return (mand4_peri(x1, y1, x2, y2));
+ break;
+ case 3:
+ return (mand5_peri(x1, y1, x2, y2));
+ break;
+ case 4:
+ return (mand6_peri(x1, y1, x2, y2));
+ break;
+ case 5:
+ return (newton_calc(x1, y1, x2, y2));
+ break;
+ case 6:
+ return (newton4_calc(x1, y1, x2, y2));
+ break;
+ case 7:
+ return (barnsley1_calc(x1, y1, x2, y2));
+ break;
+ case 8:
+ return (barnsley2_calc(x1, y1, x2, y2));
+ break;
+ case 9:
+ return (barnsley3_calc(x1, y1, x2, y2));
+ break;
+ case 10:
+ return (octo_calc(x1, y1, x2, y2));
+ break;
+ case 11:
+ return (phoenix_peri(x1, y1, x2, y2));
+ break;
+ case 12:
+ return (magnet_peri(x1, y1, x2, y2));
+ break;
+ case 13:
+ return (magnet2_peri(x1, y1, x2, y2));
+ break;
+ case 14:
+ return (trice_peri(x1, y1, x2, y2));
+ break;
+ case 15:
+ return (catseye_peri(x1, y1, x2, y2));
+ break;
+ case 16:
+ return (mbar_peri(x1, y1, x2, y2));
+ break;
+ case 17:
+ return (mlambda_peri(x1, y1, x2, y2));
+ break;
+ case 18:
+ return (manowar_calc(x1, y1, x2, y2));
+ break;
+ case 19:
+ return (spider_calc(x1, y1, x2, y2));
+ break;
+ case 20:
+ return (sier_calc(x1, y1, x2, y2));
+ break;
+ case 21:
+ return (carpet_calc(x1, y1, x2, y2));
+ break;
+ case 22:
+ return (koch_calc(x1, y1, x2, y2));
+ break;
+ case 23:
+ return (hornflake_calc(x1, y1, x2, y2));
+ break;
+ case 24:
+ return (mand9_peri(x1, y1, x2, y2));
+ break;
+ case 25:
+ return (beryl_peri(x1, y1, x2, y2));
+ break;
+ case 26:
+ return (goldsier_calc(x1, y1, x2, y2));
+ break;
+ case 27:
+ return (circle7_calc(x1, y1, x2, y2));
+ break;
+ case 28:
+ return (symbarn_calc(x1, y1, x2, y2));
+ break;
+
+#ifdef SFFE_USING
+ case 29:
+ return (sffe_calc(x1, y1, x2, y2));
+ break;
+#endif
+ } else if (cfractalc.coloringmode == 9)
+ switch (cfractalc.currentformula - formulas) { /* no periodicity checking and smoothmode SCALC */
+ case 0:
+ return (smand_calc(x1, y1, x2, y2));
+ break;
+ case 1:
+ return (smand3_calc(x1, y1, x2, y2));
+ break;
+ case 2:
+ return (smand4_calc(x1, y1, x2, y2));
+ break;
+ case 3:
+ return (smand5_calc(x1, y1, x2, y2));
+ break;
+ case 4:
+ return (smand6_calc(x1, y1, x2, y2));
+ break;
+ case 5:
+ return (newton_calc(x1, y1, x2, y2));
+ break;
+ case 6:
+ return (newton4_calc(x1, y1, x2, y2));
+ break;
+ case 7:
+ return (sbarnsley1_calc(x1, y1, x2, y2));
+ break;
+ case 8:
+ return (sbarnsley2_calc(x1, y1, x2, y2));
+ break;
+ case 9:
+ return (sbarnsley3_calc(x1, y1, x2, y2));
+ break;
+ case 10:
+ return (socto_calc(x1, y1, x2, y2));
+ break;
+ case 11:
+ return (sphoenix_calc(x1, y1, x2, y2));
+ break;
+ case 12:
+ return (smagnet_calc(x1, y1, x2, y2));
+ break;
+ case 13:
+ return (smagnet2_calc(x1, y1, x2, y2));
+ break;
+ case 14:
+ return (strice_calc(x1, y1, x2, y2));
+ break;
+ case 15:
+ return (scatseye_calc(x1, y1, x2, y2));
+ break;
+ case 16:
+ return (smbar_calc(x1, y1, x2, y2));
+ break;
+ case 17:
+ return (smlambda_calc(x1, y1, x2, y2));
+ break;
+ case 18:
+ return (smanowar_calc(x1, y1, x2, y2));
+ break;
+ case 19:
+ return (sspider_calc(x1, y1, x2, y2));
+ break;
+ case 20:
+ return (sier_calc(x1, y1, x2, y2));
+ break;
+ case 21:
+ return (carpet_calc(x1, y1, x2, y2));
+ break;
+ case 22:
+ return (koch_calc(x1, y1, x2, y2));
+ break;
+ case 23:
+ return (hornflake_calc(x1, y1, x2, y2));
+ break;
+ case 24:
+ return (smand6_calc(x1, y1, x2, y2));
+ break;
+ case 25:
+ return (beryl_calc(x1, y1, x2, y2));
+ break;
+ case 26:
+ return (goldsier_calc(x1, y1, x2, y2));
+ break;
+ case 27:
+ return (circle7_calc(x1, y1, x2, y2));
+ break;
+ case 28:
+ return (symbarn_calc(x1, y1, x2, y2));
+ break;
+
+#ifdef SFFE_USING
+ case 29:
+ return (sffe_calc(x1, y1, x2, y2));
+ break;
+#endif
+ } else
+ switch (cfractalc.currentformula - formulas) { /* no periodicity checking and no smoothmode CALC */
+ case 0:
+ return (mand_calc(x1, y1, x2, y2));
+ break;
+ case 1:
+ return (mand3_calc(x1, y1, x2, y2));
+ break;
+ case 2:
+ return (mand4_calc(x1, y1, x2, y2));
+ break;
+ case 3:
+ return (mand5_calc(x1, y1, x2, y2));
+ break;
+ case 4:
+ return (mand6_calc(x1, y1, x2, y2));
+ break;
+ case 5:
+ return (newton_calc(x1, y1, x2, y2));
+ break;
+ case 6:
+ return (newton4_calc(x1, y1, x2, y2));
+ break;
+ case 7:
+ return (barnsley1_calc(x1, y1, x2, y2));
+ break;
+ case 8:
+ return (barnsley2_calc(x1, y1, x2, y2));
+ break;
+ case 9:
+ return (barnsley3_calc(x1, y1, x2, y2));
+ break;
+ case 10:
+ return (octo_calc(x1, y1, x2, y2));
+ break;
+ case 11:
+ return (phoenix_calc(x1, y1, x2, y2));
+ break;
+ case 12:
+ return (magnet_calc(x1, y1, x2, y2));
+ break;
+ case 13:
+ return (magnet2_calc(x1, y1, x2, y2));
+ break;
+ case 14:
+ return (trice_calc(x1, y1, x2, y2));
+ break;
+ case 15:
+ return (catseye_calc(x1, y1, x2, y2));
+ break;
+ case 16:
+ return (mbar_calc(x1, y1, x2, y2));
+ break;
+ case 17:
+ return (mlambda_calc(x1, y1, x2, y2));
+ break;
+ case 18:
+ return (manowar_calc(x1, y1, x2, y2));
+ break;
+ case 19:
+ return (spider_calc(x1, y1, x2, y2));
+ break;
+ case 20:
+ return (sier_calc(x1, y1, x2, y2));
+ break;
+ case 21:
+ return (carpet_calc(x1, y1, x2, y2));
+ break;
+ case 22:
+ return (koch_calc(x1, y1, x2, y2));
+ break;
+ case 23:
+ return (hornflake_calc(x1, y1, x2, y2));
+ break;
+ case 24:
+ return (mand9_calc(x1, y1, x2, y2));
+ break;
+ case 25:
+ return (beryl_peri(x1, y1, x2, y2));
+ break;
+ case 26:
+ return (goldsier_calc(x1, y1, x2, y2));
+ break;
+ case 27:
+ return (circle7_calc(x1, y1, x2, y2));
+ break;
+ case 28:
+ return (symbarn_calc(x1, y1, x2, y2));
+ break;
+
+#ifdef SFFE_USING
+ case 29:
+ return (sffe_calc(x1, y1, x2, y2));
+ break;
+#endif
+ }
+ return 0;
+}
+#endif
+
+CONST struct formula *currentformula;
+CONST int nformulas = sizeof(formulas) / sizeof(struct formula);
+CONST int nmformulas = 16; // Is this correct here? -- Zoltan, 2009-07-30