This is GradientView.m in view mode; [Download] [Up]
/*** GradientView by J. Shan Bell Nov 7, 1993 v1.1 There are no restrictions on this code, it's in the public domain. I accept no responsibility for it's fitness for any particular use. ***/ #import "GradientView.h" #import "Thinker.h" #import <math.h> #import <libc.h> #import <dpsclient/wraps.h> #define STEPS 256 /* number of gradation steps */ #define LEN 256 /* length of a string, as in the default database strings */ @implementation GradientView - initFrame:(const NXRect *)rect { [super initFrame: rect]; topColor = NX_COLORBLUE; bottomColor = NXChangeBrightnessComponent(NX_COLORBLUE, 0.1); [self readTopColor: self]; [self readBottomColor: self]; aColorWellHasChanged = YES; doingScreenSaver = NO; return self; } - oneStep { usleep(1000000 * 1/2 ); //sleep a while (yuck!) // this time should be short enough that BackSpace remains // somewhat responsive if an event does occur. Unfortunately, // waking up keeps BackSpace hotter than I would prefer (ie paged in) return self; } - drawSelf:(const NXRect *)rects :(int)rectCount { static int i; static float stepWidth; static NXRect fillArea; static NXColor currentFill; static float redInc, greenInc, blueInc; static float redValue, greenValue, blueValue; /* if we're in screen saver mode, then just black out the screen */ if (doingScreenSaver) { PSsetgray(NX_BLACK); NXRectFill(&bounds); return self; /* don't do anything, leave it black */ } /* We're doing the gradient, calculate the width of each step */ stepWidth = bounds.size.height/STEPS; bcopy(&bounds, &fillArea, sizeof(NXRect)); fillArea.size.height = stepWidth; bcopy(&bottomColor, ¤tFill, sizeof(NXColor)); /* We're going to do a linear interpolation between each component */ redValue = NXRedComponent(currentFill); greenValue = NXGreenComponent(currentFill); blueValue = NXBlueComponent(currentFill); if (aColorWellHasChanged) { /* Calculate the increment value, this has only change if the color wells changed */ redInc = (NXRedComponent(topColor) - redValue)/STEPS; greenInc = (NXGreenComponent(topColor) - greenValue)/STEPS; blueInc = (NXBlueComponent(topColor) - blueValue)/STEPS; aColorWellHasChanged = NO; } for (i = 0; i < STEPS; i++) { NXSetColor(currentFill); NXRectFill(&fillArea); fillArea.origin.y = stepWidth*(i + 1); redValue += redInc; greenValue += greenInc; blueValue += blueInc; currentFill = NXChangeRedComponent(currentFill, redValue); currentFill = NXChangeGreenComponent(currentFill, greenValue); currentFill = NXChangeBlueComponent(currentFill, blueValue); } return self; } - (BOOL)isBoringScreenSaver { return YES; } - getBottomColor: sender { bottomColor = [bottomColorWell color]; return self; } - getTopColor: sender { topColor = [topColorWell color]; return self; } - apply: sender { aColorWellHasChanged = YES; [self getBottomColor: self]; [self getTopColor: self]; [self writeColors: self]; [self update]; return self; } - inspector: sender { char buf[MAXPATHLEN]; if (!inspectorPanel) { sprintf(buf, "%s/gradient.nib", [sender moduleDirectory: "Gradient"]); [NXApp loadNibFile: buf owner: self withNames: NO]; [topColorWell setColor: topColor]; [bottomColorWell setColor: bottomColor]; } return inspectorPanel; } - (BOOL) useBufferedWindow { return YES; } - writeColors: sender { [self writeTopColor: self]; [self writeBottomColor: self]; return self; } - writeTopColor: sender { static char str[LEN]; sprintf(str, "%1.5f %1.5f %1.5f", NXRedComponent(topColor), NXGreenComponent(topColor), NXBlueComponent(topColor)); NXWriteDefault([NXApp appName], "Gradient top color", str); return self; } - readTopColor: sender { static const char *str; static float r,g,b; if ((str = NXReadDefault([NXApp appName], "Gradient top color")) == NULL) return nil; if (sscanf(str, "%f%f%f", &r, &g, &b) != 3) { NXLogError("Could not read default for top color.\n"); return nil; } topColor = NXChangeRedComponent(topColor, r); topColor = NXChangeGreenComponent(topColor, g); topColor = NXChangeBlueComponent(topColor, b); return self; } - writeBottomColor: sender { static char str[LEN]; sprintf(str, "%1.5f %1.5f %1.5f", NXRedComponent(bottomColor), NXGreenComponent(bottomColor), NXBlueComponent(bottomColor)); NXWriteDefault([NXApp appName], "Gradient bottom color", str); return self; } - readBottomColor: sender { static const char *str; static float r,g,b; if ((str = NXReadDefault([NXApp appName], "Gradient bottom color")) == NULL) return nil; if (sscanf(str, "%f%f%f", &r, &g, &b) != 3) { NXLogError("Could not read default for bottom color.\n"); return nil; } bottomColor = NXChangeRedComponent(bottomColor, r); bottomColor = NXChangeGreenComponent(bottomColor, g); bottomColor = NXChangeBlueComponent(bottomColor, b); return self; } - enteredScreenSaverMode { doingScreenSaver = YES; [self update]; return self; } - willExitScreenSaverMode { doingScreenSaver = NO; [self update]; return self; } @end
These are the contents of the former NiCE NeXT User Group NeXTSTEP/OpenStep software archive, currently hosted by Netfuture.ch.