From 039bef575547b29ad23c76b538128da641b6c0e9 Mon Sep 17 00:00:00 2001
From: David Phillips <dbphillipsnz@gmail.com>
Date: Fri, 27 May 2016 11:45:58 +1200
Subject: Initial roughing of custom image location, mandelbrot only

---
 algorithms/mandelbrot.c | 16 +++++++++-------
 fractal-gen.c           | 26 +++++++++++++++++++++++++-
 fractal-gen.h           |  8 ++++++++
 3 files changed, 42 insertions(+), 8 deletions(-)

diff --git a/algorithms/mandelbrot.c b/algorithms/mandelbrot.c
index 67da2c6..51d0c43 100644
--- a/algorithms/mandelbrot.c
+++ b/algorithms/mandelbrot.c
@@ -31,19 +31,21 @@ void
 *generate_mandelbrot_section(void *section)
 {
 	data_section *d = (data_section*)section;
+	struct frame *f = &(d->parent_frame);
 	unsigned int x,y,i;
 	double a,b;
 	double complex z,c;
-	double size_units = 3.5f;
-	double top = -1.75f;
-	double left = -2.5f;
+
+	defaultsd(&d->parent_frame.top, -1.75f);
+	defaultsd(&d->parent_frame.left, -2.5f);
+	defaultsd(&d->parent_frame.scale, 3.5f);
 
 
 	/* FIXME document this */
-	b = clust_id*(size_units/size)+top; /* FIXME document this */
+	b = clust_id*(f->scale/size)+f->top; /* FIXME document this */
 
 	for (y = clust_id; y < size; y += clust_total) {
-		a = d->core*(size_units/size)+left;
+		a = d->core*(f->scale/size)+f->left;
 		for (x = d->core; x < size; x += cores) {
 			z = 0;
 			c = a + I*b;
@@ -54,9 +56,9 @@ void
 				z = cpow(z , power) + c;
 			}
 			d->data[d->idx++] = (255*i)/iterat;
-			a += cores*(size_units/size);
+			a += cores*(f->scale/size);
 		}
-		b += clust_total*(size_units/size);
+		b += clust_total*(f->scale/size);
 	}
 	return NULL;
 }
diff --git a/fractal-gen.c b/fractal-gen.c
index 0d2e1a3..c4be171 100644
--- a/fractal-gen.c
+++ b/fractal-gen.c
@@ -37,6 +37,8 @@
 #include <sys/mman.h>
 #include <string.h>
 
+struct frame f;
+
 static struct section_generator generators[] = {
 	{ "mandelbrot-gen" , &generate_mandelbrot_section },
 	{ "burning-ship-gen" , &generate_burning_ship_section },
@@ -48,6 +50,13 @@ char *ram_units[] = {
 };
 
 
+void
+defaultsd(double *who, double def)
+{
+	if (isnan(*who))
+		*who = def;
+}
+
 int
 main(int argc, char **argv)
 {
@@ -129,8 +138,12 @@ main(int argc, char **argv)
 			munmap(sections, sizeof(data_section)*cores);
 			return 1;
 		}
+		/* FIXME repetition */
 		sections[i].core = i;
 		sections[i].width = width;
+		sections[i].parent_frame.top = f.top;
+		sections[i].parent_frame.left = f.left;
+		sections[i].parent_frame.scale = f.scale;
 		sections[i].datasize = toalloc;
 		fprintf(stderr, " -> Thread %lu\r", i);
 		pthread_create(&sections[i].thread, NULL, generator, &(sections[i]));
@@ -195,20 +208,31 @@ parse_args(int argc, char **argv)
 	clust_id = 0;
 	clust_total = 1;
 
+	f.left = nan("");
+	f.top = nan("");
+	f.scale = nan("");
+
 	/* bail out early if no arguments are supplied */
 	if (argc <= 1)
 		return 1;
 
-	while ( (opt = getopt(argc, argv, "s:i:e:c:t:N:T:")) != -1 ) {
+	while ( (opt = getopt(argc, argv, "s:i:e:c:t:N:T:x:y:z:")) != -1 ) {
 		switch (opt)
 		{
 			case 's': size = atoi(optarg); break;
 			case 'i': iterat = atoi(optarg); break;
 			case 'e': power = atof(optarg); break;
+
 			case 'c': cores = atoi(optarg); break;
 			case 't': thread_mult = atof(optarg); break;
+
 			case 'N': clust_id = atoi(optarg); break;
 			case 'T': clust_total = atoi(optarg); break;
+
+			case 'x': f.left = atof(optarg); break;
+			case 'y': f.top = atof(optarg); break;
+			case 'z': f.scale = atof(optarg); break;
+
 			/* redundant case for '?', but explicitness is best */
 			case '?':
 			default:
diff --git a/fractal-gen.h b/fractal-gen.h
index 21d4ca5..a103d1f 100644
--- a/fractal-gen.h
+++ b/fractal-gen.h
@@ -28,8 +28,15 @@
 #include <stdbool.h>
 #include <pthread.h>
 
+struct frame {
+	double top;
+	double left;
+	double scale;
+};
+
 typedef struct {
 	volatile unsigned long idx;
+	struct frame parent_frame;
 	unsigned long core;
 	unsigned long width;
 	unsigned long datasize;
@@ -48,6 +55,7 @@ char *argv0;
 
 typedef void* (*generator_func)(void *);
 
+void defaultsd(double*, double);
 int parse_args(int argc, char **argv);
 generator_func select_generator(const char* name);
 void show_help();
-- 
cgit v1.1