aboutsummaryrefslogtreecommitdiffstats
path: root/demos/applications/combo/mandelbrot.c
diff options
context:
space:
mode:
Diffstat (limited to 'demos/applications/combo/mandelbrot.c')
-rw-r--r--demos/applications/combo/mandelbrot.c99
1 files changed, 99 insertions, 0 deletions
diff --git a/demos/applications/combo/mandelbrot.c b/demos/applications/combo/mandelbrot.c
new file mode 100644
index 00000000..68ee1fae
--- /dev/null
+++ b/demos/applications/combo/mandelbrot.c
@@ -0,0 +1,99 @@
+/*
+ * Copyright (c) 2012, 2013, Joel Bodenmann aka Tectu <joel@unormal.org>
+ * Copyright (c) 2012, 2013, Andrew Hannam aka inmarket
+ *
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ * * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * * Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ * * Neither the name of the <organization> nor the
+ * names of its contributors may be used to endorse or promote products
+ * derived from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+ * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL <COPYRIGHT HOLDER> BE LIABLE FOR ANY
+ * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+ * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#include "gfx.h"
+#include "tasks.h"
+
+static volatile bool_t run;
+static GHandle gh;
+static gfxThreadHandle thread;
+
+static void mandelbrot(float x1, float y1, float x2, float y2) {
+ unsigned int i,j, width, height;
+ uint16_t iter;
+ float fwidth, fheight;
+
+ float sy = y2 - y1;
+ float sx = x2 - x1;
+ const int MAX = 512;
+
+ width = (unsigned int)gwinGetWidth(gh);
+ height = (unsigned int)gwinGetHeight(gh);
+ fwidth = width;
+ fheight = height;
+
+ for(i = 0; i < width; i++) {
+ for(j = 0; j < height; j++) {
+ float cy = j * sy / fheight + y1;
+ float cx = i * sx / fwidth + x1;
+ float x=0.0f, y=0.0f, xx=0.0f, yy=0.0f;
+ gfxYield();
+ for(iter=0; iter <= MAX && xx+yy<4.0f; iter++) {
+ xx = x*x;
+ yy = y*y;
+ y = 2.0f*x*y + cy;
+ x = xx - yy + cx;
+ }
+ gwinSetColor(gh, RGB2COLOR(iter<<7, iter<<4, iter));
+ gwinDrawPixel(gh, i, j);
+ }
+ }
+}
+
+static DECLARE_THREAD_FUNCTION(task, param) {
+ float cx, cy;
+ float zoom = 1.0f;
+ (void) param;
+
+ /* where to zoom in */
+ cx = -0.086f;
+ cy = 0.85f;
+
+ while(run) {
+ mandelbrot(-2.0f*zoom+cx, -1.5f*zoom+cy, 2.0f*zoom+cx, 1.5f*zoom+cy);
+
+ zoom *= 0.7f;
+ if(zoom <= 0.00001f)
+ zoom = 1.0f;
+ }
+ return 0;
+}
+
+void doMandlebrot(GHandle parent, bool_t start) {
+ if (start) {
+ run = TRUE;
+ gh = parent;
+ thread = gfxThreadCreate(0, 0x400, LOW_PRIORITY, task, 0);
+ } else if (run) {
+ run = FALSE;
+ gfxThreadWait(thread);
+ }
+}
+
+