- int i;
- FRACTAL *Fractal;
-
- if (Root == NULL) {
- Root = (FRACTAL *) calloc(
- MI_NUM_SCREENS(mi), sizeof (FRACTAL));
- if (Root == NULL)
- return;
- }
- Fractal = &Root[MI_SCREEN(mi)];
-
- if (Fractal->Max_Pt) {
- free(Fractal->Buffer1);
- free(Fractal->Buffer2);
- }
- i = (NRAND(4)) + 2; /* Number of centers */
- switch (i) {
- case 3:
- Fractal->Depth = MAX_DEPTH_3;
- Fractal->r_mean = .6;
- Fractal->dr_mean = .4;
- Fractal->dr2_mean = .3;
- break;
-
- case 4:
- Fractal->Depth = MAX_DEPTH_4;
- Fractal->r_mean = .5;
- Fractal->dr_mean = .4;
- Fractal->dr2_mean = .3;
- break;
-
- case 5:
- Fractal->Depth = MAX_DEPTH_5;
- Fractal->r_mean = .5;
- Fractal->dr_mean = .4;
- Fractal->dr2_mean = .3;
- break;
-
- default:
- case 2:
- Fractal->Depth = MAX_DEPTH_2;
- Fractal->r_mean = .7;
- Fractal->dr_mean = .3;
- Fractal->dr2_mean = .4;
- break;
- }
- /* (void) fprintf( stderr, "N=%d\n", i ); */
- Fractal->Nb_Simi = i;
- Fractal->Max_Pt = Fractal->Nb_Simi - 1;
- for (i = 0; i <= Fractal->Depth + 2; ++i)
- Fractal->Max_Pt *= Fractal->Nb_Simi;
-
- Fractal->Buffer1 = (XPoint *) calloc(Fractal->Max_Pt, sizeof (XPoint));
- if (Fractal->Buffer1 == NULL)
- goto Abort;
- Fractal->Buffer2 = (XPoint *) calloc(Fractal->Max_Pt, sizeof (XPoint));
- if (Fractal->Buffer2 == NULL)
- goto Abort;
-
- Fractal->Speed = 6;
- Fractal->Width = MI_WIN_WIDTH(mi);
- Fractal->Height = MI_WIN_HEIGHT(mi);
- Fractal->Cur_Pt = 0;
- Fractal->Count = 0;
- Fractal->Lx = (Fractal->Width - 1) / 2;
- Fractal->Ly = (Fractal->Height - 1) / 2;
- Fractal->Col = NRAND(MI_NPIXELS(mi) - 1) + 1;
-
- Random_Simis(Fractal, Fractal->Components, 5 * MAX_SIMI);
-
- Fractal->dbuf = XCreatePixmap(MI_DISPLAY(mi), MI_WINDOW(mi),
- Fractal->Width, Fractal->Height, 1);
- if (Fractal->dbuf)
- {
- XGCValues gcv;
- gcv.foreground = 0;
- gcv.background = 0;
- gcv.function = GXcopy;
- Fractal->dbuf_gc = XCreateGC(MI_DISPLAY(mi), Fractal->dbuf,
- GCForeground|GCBackground|GCFunction,
- &gcv);
- XFillRectangle(MI_DISPLAY(mi), Fractal->dbuf,
- Fractal->dbuf_gc, 0,0, Fractal->Width, Fractal->Height);
-
- XSetBackground(MI_DISPLAY(mi), MI_GC(mi), MI_WIN_BLACK_PIXEL(mi));
- XSetFunction(MI_DISPLAY(mi), MI_GC(mi), GXcopy);
- }
-
- XClearWindow(MI_DISPLAY(mi), MI_WINDOW(mi));
- return;
-
- Abort:
- if (Fractal->Buffer1 != NULL)
- free(Fractal->Buffer1);
- if (Fractal->Buffer2 != NULL)
- free(Fractal->Buffer2);
- Fractal->Buffer1 = NULL;
- Fractal->Buffer2 = NULL;
- Fractal->Max_Pt = 0;
- return;