ENTRYPOINT void release_strange(ModeInfo * mi) { if (Root != NULL) { int screen; for (screen = 0; screen < MI_NUM_SCREENS(mi); ++screen) free_strange(MI_DISPLAY(mi), &Root[screen]); (void) free((void *) Root); Root = (ATTRACTOR *) NULL; } }
ENTRYPOINT void release_strange(ModeInfo * mi) { if (Root != NULL) { int screen; #ifdef useAccumulator int i; (void) free((void *) cols); for (i=0;i<Root->Width;i++) { (void) free((void *) Root->accMap[i]); } (void) free((void *) Root->accMap); #endif #ifdef POINTS_HISTORY free(oldPointsX); free(oldPointsY); #endif for (screen = 0; screen < MI_NUM_SCREENS(mi); ++screen) free_strange(MI_DISPLAY(mi), &Root[screen]); (void) free((void *) Root); Root = (ATTRACTOR *) NULL; } }
ENTRYPOINT void init_strange(ModeInfo * mi) { Display *display = MI_DISPLAY(mi); #ifndef NO_DBUF Window window = MI_WINDOW(mi); GC gc = MI_GC(mi); #endif ATTRACTOR *Attractor; if (Root == NULL) { if ((Root = (ATTRACTOR *) calloc(MI_NUM_SCREENS(mi), sizeof (ATTRACTOR))) == NULL) return; } Attractor = &Root[MI_SCREEN(mi)]; if (Attractor->Fold == NULL) { int i; if ((Attractor->Fold = (PRM *) calloc(UNIT2 + 1, sizeof (PRM))) == NULL) { free_strange(display, Attractor); return; } for (i = 0; i <= UNIT2; ++i) { DBL x; /* x = ( DBL )(i)/UNIT2; */ /* x = sin( M_PI/2.0*x ); */ /* x = sqrt( x ); */ /* x = x*x; */ /* x = x*(1.0-x)*4.0; */ x = (DBL) (i) / UNIT; x = sin(x); Attractor->Fold[i] = DBL_To_PRM(x); } } if (Attractor->Buffer1 == NULL) if ((Attractor->Buffer1 = (XPoint *) calloc(MAX_POINTS, sizeof (XPoint))) == NULL) { free_strange(display, Attractor); return; } if (Attractor->Buffer2 == NULL) if ((Attractor->Buffer2 = (XPoint *) calloc(MAX_POINTS, sizeof (XPoint))) == NULL) { free_strange(display, Attractor); return; } Attractor->Max_Pt = MAX_POINTS; Attractor->Width = MI_WIDTH(mi); Attractor->Height = MI_HEIGHT(mi); Attractor->Cur_Pt = 0; Attractor->Count = 0; Attractor->Col = NRAND(MI_NPIXELS(mi)); Attractor->Speed = 4; Attractor->Iterate = Funcs[NRAND(2)]; Random_Prm(Attractor->Prm1); Random_Prm(Attractor->Prm2); #ifndef NO_DBUF if (Attractor->dbuf != None) XFreePixmap(display, Attractor->dbuf); Attractor->dbuf = XCreatePixmap(display, window, Attractor->Width, Attractor->Height, 1); /* Allocation checked */ if (Attractor->dbuf != None) { XGCValues gcv; gcv.foreground = 0; gcv.background = 0; #ifndef HAVE_COCOA gcv.graphics_exposures = False; #endif /* HAVE_COCOA */ gcv.function = GXcopy; if (Attractor->dbuf_gc != None) XFreeGC(display, Attractor->dbuf_gc); if ((Attractor->dbuf_gc = XCreateGC(display, Attractor->dbuf, #ifndef HAVE_COCOA GCGraphicsExposures | #endif /* HAVE_COCOA */ GCFunction | GCForeground | GCBackground, &gcv)) == None) { XFreePixmap(display, Attractor->dbuf); Attractor->dbuf = None; } else { XFillRectangle(display, Attractor->dbuf, Attractor->dbuf_gc, 0, 0, Attractor->Width, Attractor->Height); XSetBackground(display, gc, MI_BLACK_PIXEL(mi)); XSetFunction(display, gc, GXcopy); } } #endif MI_CLEARWINDOW(mi); /* Do not want any exposure events from XCopyPlane */ XSetGraphicsExposures(display, MI_GC(mi), False); }
ENTRYPOINT void init_strange(ModeInfo * mi) { Display *display = MI_DISPLAY(mi); Window window = MI_WINDOW(mi); #ifndef NO_DBUF GC gc = MI_GC(mi); #endif ATTRACTOR *Attractor; #ifdef POINTS_HISTORY startedClearing=0; oldPointsIndex=0; #endif if (Root == NULL) { if ((Root = (ATTRACTOR *) calloc(MI_NUM_SCREENS(mi), sizeof (ATTRACTOR))) == NULL) return; } Attractor = &Root[MI_SCREEN(mi)]; if (Attractor->Fold == NULL) { int i; if ((Attractor->Fold = (PRM *) calloc(UNIT2 + 1, sizeof (PRM))) == NULL) { free_strange(display, Attractor); return; } for (i = 0; i <= UNIT2; ++i) { DBL x; /* x = ( DBL )(i)/UNIT2; */ /* x = sin( M_PI/2.0*x ); */ /* x = sqrt( x ); */ /* x = x*x; */ /* x = x*(1.0-x)*4.0; */ x = (DBL) (i) / UNIT; x = sin(x); Attractor->Fold[i] = DBL_To_PRM(x); } } Attractor->Max_Pt = points; if (Attractor->Buffer1 == NULL) if ((Attractor->Buffer1 = (XPoint *) calloc(Attractor->Max_Pt, sizeof (XPoint))) == NULL) { free_strange(display, Attractor); return; } if (Attractor->Buffer2 == NULL) if ((Attractor->Buffer2 = (XPoint *) calloc(Attractor->Max_Pt, sizeof (XPoint))) == NULL) { free_strange(display, Attractor); return; } Attractor->Width = MI_WIDTH(mi); Attractor->Height = MI_HEIGHT(mi); Attractor->Cur_Pt = 0; Attractor->Count = 0; Attractor->Col = NRAND(MI_NPIXELS(mi)); Attractor->Speed = 4; Attractor->Iterate = Funcs[NRAND(2)]; Random_Prm(Attractor->Prm1); Random_Prm(Attractor->Prm2); #ifndef NO_DBUF if (Attractor->dbuf != None) XFreePixmap(display, Attractor->dbuf); #ifdef useAccumulator #define colorDepth ( useAccumulator ? MI_DEPTH(mi) : 1 ) #else #define colorDepth 1 #endif Attractor->dbuf = XCreatePixmap(display, window, Attractor->Width, Attractor->Height, colorDepth); /* Allocation checked */ if (Attractor->dbuf != None) { XGCValues gcv; gcv.foreground = 0; gcv.background = 0; #ifndef HAVE_COCOA gcv.graphics_exposures = False; #endif /* HAVE_COCOA */ gcv.function = GXcopy; if (Attractor->dbuf_gc != None) XFreeGC(display, Attractor->dbuf_gc); if ((Attractor->dbuf_gc = XCreateGC(display, Attractor->dbuf, #ifndef HAVE_COCOA GCGraphicsExposures | #endif /* HAVE_COCOA */ GCFunction | GCForeground | GCBackground, &gcv)) == None) { XFreePixmap(display, Attractor->dbuf); Attractor->dbuf = None; } else { XFillRectangle(display, Attractor->dbuf, Attractor->dbuf_gc, 0, 0, Attractor->Width, Attractor->Height); XSetBackground(display, gc, MI_BLACK_PIXEL(mi)); XSetFunction(display, gc, GXcopy); } } #endif #ifdef useAccumulator #define A Attractor if (useAccumulator) { XWindowAttributes xgwa; int i,j; XGetWindowAttributes (display, window, &xgwa); /* cmap = xgwa.colormap; */ /* cmap = XCreateColormap(display, window, MI_VISUAL(mi), AllocAll); */ Attractor->accMap = (int**)calloc(Attractor->Width,sizeof(int*)); for (i=0;i<Attractor->Width;i++) { Attractor->accMap[i] = (int*)calloc(Attractor->Height,sizeof(int)); for (j=0;j<Attractor->Height;j++) { Attractor->accMap[i][j] = 0; } } #ifdef POINTS_HISTORY numOldPoints = A->Max_Pt * MERGE_FRAMES; oldPointsX = (int*)calloc(numOldPoints,sizeof(int)); oldPointsY = (int*)calloc(numOldPoints,sizeof(int)); #endif cols = (XColor*)calloc(NUM_COLS,sizeof(XColor)); for (i=0;i<NUM_COLS;i++) { float li; #define MINBLUE 1 #define FULLBLUE 128 li = MINBLUE + (255.0-MINBLUE) * log(1.0 + ACC_GAMMA*(float)i/NUM_COLS) / log(1.0 + ACC_GAMMA); if (li<FULLBLUE) { cols[i].red = 0; cols[i].green = 0; cols[i].blue = 65536*li/FULLBLUE; } else { cols[i].red = 65536*(li-FULLBLUE)/(256-FULLBLUE); cols[i].green = 65536*(li-FULLBLUE)/(256-FULLBLUE); cols[i].blue = 65535; } XAllocColor (display, xgwa.colormap, &cols[i]); /* if (!XAllocColor(MI_DISPLAY(mi), cmap, &cols[i])) { if (!XAllocColor(display, cmap, &cols[i])) { cols[i].pixel = WhitePixel (display, DefaultScreen (display)); cols[i].red = cols[i].green = cols[i].blue = 0xFFFF; } */ } /* XSetWindowColormap(display, window, cmap); (void) XSetWMColormapWindows(display, window, &window, 1); XInstallColormap(display, cmap); XStoreColors(display, cmap, cols, 256); */ } #undef A #endif MI_CLEARWINDOW(mi); /* Do not want any exposure events from XCopyPlane */ XSetGraphicsExposures(display, MI_GC(mi), False); }