This is SlideShowViewPart.m in view mode; [Download] [Up]
/* * SlideShowView - version 1.0 * * brighton@phuket.nbn.com, 13 Nov 91 */ #import <appkit/NXImage.h> // NXImage #import <appkit/Panel.h> // NXRunAlertPanel #import <dpsclient/wraps.h> // PSsetgray() #import <defaults.h> // NXDefaults stuff #import <libc.h> // lots of sys stuff #import <math.h> // floor() #import <string.h> // strcmp(), index() #import <c.h> // TRUE, FALSE, etc #import "SlideShowViewPart.h" #import "PrefController.h" #import "Thinker.h" static const char *module = "SlideShow"; static int needUpdate = 0; int defaultIntValue(const char *answer) { if (strcasecmp(answer, "yes") == 0) return 1; if (strcasecmp(answer, "on") == 0) return 1; return atoi(answer); // returns zero if no digits encountered } void pRect(rect) NXRect *rect; { printf("[O %.0f,%.0f],[S %.0f,%.0f]\n", rect->origin.x, rect->origin.y, rect->size.width, rect->size.height); } @implementation SlideShowView - imageSet { image = [imageList objectAt:currentFrame]; [image getSize:&imageRect.size]; [self setImageConstraints]; // sets maxCoord return self; } - initFrame:(NXRect *)frameRect { broken = FALSE; randomize = FALSE; fancy = FALSE; slide = FALSE; debug = 0; [super initFrame:frameRect]; [self resetState]; [self loadTiffFiles]; currentFrame = 0; [self imageSet]; slideDelta.x = randBetween(0.5, 4.0); slideDelta.y = randBetween(0.5, 4.0); if (debug) { printf("initFrame: %d, imageList 0x%x, image 0x%x, imageRect ", currentFrame, imageList, image); pRect(&imageRect); } return self; } - drawSelf:(const NXRect *)rects :(int)rectCount { NXPoint p; if (!rects || !rectCount) return self; [super drawSelf:rects :rectCount]; p.x = floor(imageRect.origin.x); p.y = floor(imageRect.origin.y); if (debug) { int i; printf("drawSelf: "); pRect(&imageRect); for (i = 0; i < rectCount; i++) { printf("\trects[%d] ", i); pRect(&rects[i]); } } if (broken) return self; if (fancy) [image2 dissolve:(1.0-fadeDelta) toPoint:&altRect.origin]; [image dissolve:fadeDelta toPoint:&p]; return self; } - oneStep { if (![self timePassed: steptime]) return self; if (broken) return self; switch (state) { case FV_Move: case FV_FancyMove: if (needUpdate) { needUpdate = 0; [self resetState]; [self resetFiles]; } break; default: break; } switch (state) { case FV_FadeIn: [self fadeIn]; break; case FV_FadeOut: [self fadeOut]; break; case FV_Move: [self fadeMove]; break; case FV_FancyMove: [self fancyMove]; break; case FV_FancyFade: [self fancyFade]; break; } return self; } - fadeIn { fadeDelta += defFadeDelta; if (fadeDelta >= 1.0) { fadeDelta = 1.0; state = FV_FadeOut; steptime = defWaitTime; } if (debug > 1) { printf("in 0x%x %.2f: ", image, fadeDelta); pRect(&imageRect); } PSsetgray(0.0); NXRectFill(&imageRect); [image dissolve:fadeDelta toPoint:&imageRect.origin]; return self; } - fadeOut { fadeDelta -= defFadeDelta; if (fadeDelta <= 0.0) { fadeDelta = 0.0; state = FV_Move; } if (debug > 1) { printf("out 0x%x %.2f: ", image, fadeDelta); pRect(&imageRect); } PSsetgray(0.0); NXRectFill(&imageRect); [image dissolve:fadeDelta toPoint:&imageRect.origin]; steptime = defStepTime; return self; } - fadeMove { if (randomize) currentFrame = (int)floor(randBetween(0, numberOfFrames)); else if (++currentFrame >= numberOfFrames) currentFrame = 0; image = [imageList objectAt:currentFrame]; [image getSize:&imageRect.size]; [self setImageConstraints]; if (slide) { [self slideImageRectOrigin]; } else { imageRect.origin.x = floor(randBetween(0, maxCoord.x)); imageRect.origin.y = floor(randBetween(0, maxCoord.y)); } if (debug) { printf("\nfadeMove: frame %d, imageList 0x%x, image 0x%x\n", currentFrame, fadeDelta, imageList, image); printf("\timageRect "); pRect(&imageRect); printf("\tmaxCoord [%.0f,%.0f]\n\n", maxCoord.x, maxCoord.y); } state = FV_FadeIn; steptime = defStepTime; return self; } - fancyMove { if (randomize) currentFrame = (int)floor(randBetween(0, numberOfFrames)); else if (++currentFrame >= numberOfFrames) currentFrame = 0; // set fadeout image to previously faded-in image // set fadein image to new image image2 = image; altRect = imageRect; image = [imageList objectAt:currentFrame]; [image getSize:&imageRect.size]; [self setImageConstraints]; if (slide) { [self slideImageRectOrigin]; } else { imageRect.origin.x = floor(randBetween(0, maxCoord.x)); imageRect.origin.y = floor(randBetween(0, maxCoord.y)); } if (debug) { printf("fancyMove: frame %d, imageList 0x%x, image 0x%x\n", currentFrame, imageList, image); printf("\t altRect "); pRect(&altRect); printf("\timageRect "); pRect(&imageRect); } fadeDelta = 0.0; state = FV_FancyFade; steptime = defStepTime; return self; } - fancyFade { float delta_out; // fade out one image while fading in another fadeDelta += defFadeDelta; if (fadeDelta >= 1.0) { fadeDelta = 1.0; state = FV_FancyMove; steptime = defWaitTime; } delta_out = 1.0 - fadeDelta; if (debug > 1) printf("ffade: %.2f(%.2f)\n", fadeDelta, delta_out); PSsetgray(0.0); NXRectFill(&altRect); [image2 dissolve:delta_out toPoint:&altRect.origin]; [image dissolve:fadeDelta toPoint:&imageRect.origin]; return self; } - slideImageRectOrigin { float rand; NXPoint p; p.x = imageRect.origin.x + slideDelta.x; p.y = imageRect.origin.y + slideDelta.y; rand = randBetween(0.5, 4.0); if (p.x < 0) { p.x = 0; slideDelta.x = rand; } else if (p.x > maxCoord.x) { p.x = maxCoord.x; slideDelta.x = -rand; } rand = randBetween(0.5, 4.0); if (p.y < 0) { p.y = 0; slideDelta.y = rand; } else if (p.y > maxCoord.y) { p.y = maxCoord.y; slideDelta.y = -rand; } imageRect.origin.x = p.x; imageRect.origin.y = p.y; return self; } - resetState { oldfilelist = filelist; [self getDefaults]; steptime = defStepTime; if (fancy) state = FV_FancyMove; else state = FV_Move; return self; } #ifdef ENABLE_RELOAD // This code almost works, but if the filelist has changed, // we get a SIGBUS when the window changes. - resetFiles { if (oldfilelist && strcmp(oldfilelist, filelist) != 0) { if (debug) printf("resetFiles: new filelist: %s\n", filelist); oldfilelist = filelist; [self freeTiffFiles]; [self loadTiffFiles]; currentFrame = 0; [self imageSet]; } return self; } - freeTiffFiles { const char *method = "freeTiffFiles"; if (debug) printf("%s: imageList 0x%x, count %d", method, imageList, [imageList count]); [imageList freeObjects]; [imageList free]; return self; } #else - resetFiles { if (oldfilelist && strcmp(oldfilelist, filelist) != 0) { if (debug) printf("resetFiles: new filelist: %s\n", filelist); oldfilelist = filelist; NXRunAlertPanel(module, "You must restart BackSpace to enable new Filelist", NULL, NULL, NULL); } return self; } #endif - loadTiffFiles { char buf[MAXPATHLEN], *b, *p; int linenumber, fd; id local_image; NXSize s; FILE *fp; const char *method = "loadTiffFiles"; const char *alertmsg = "Could not open %s\n\nUse \"dwrite %s Filelist filename\""; static BOOL firstload = TRUE; if ((fp = fopen(filelist, "r")) == (FILE *)NULL) { if (firstload) { NXRunAlertPanel(module, alertmsg, NULL, NULL, NULL, filelist, module); firstload = FALSE; } broken = TRUE; return self; } imageList = [[List alloc] init]; if (debug) printf("%s: imageList 0x%x\n", method, imageList); numberOfFrames = 0; linenumber = 0; while ((b = fgets(buf, MAXPATHLEN-1, fp)) != (char *)NULL) { linenumber++; // strip newline if ((p = index(buf, '\n')) != (char *)NULL) *p = '\0'; // ignore blank lines and comments if (strlen(buf) == 0) continue; if (buf[0] == '#') continue; // sanity if (buf[0] != '/') { fprintf(stderr, "%s: %s: line %d: must start with '/'\n", module, filelist, linenumber); continue; } // check access if ((fd = open(buf, O_RDONLY)) < 0) { fprintf(stderr, "%s: ", module); perror(buf); continue; } close(fd); if (local_image = [NXImage findImageNamed:buf]) { if (debug) printf("%s: findImageNamed: %s\n", method, buf); } else { if (debug) printf("%s: initFromFile: %s\n", method, buf); if (!(local_image = [[NXImage alloc] initFromFile:buf])) { fprintf(stderr, "%s: initFromFile failed: %s\n", module, buf); continue; } // make sure it's really an image [local_image getSize:&s]; if (s.width == 0 || s.height == 0) { fprintf(stderr, "%s: not an image: %s\n", module, buf); continue; } [local_image setName:buf]; } [imageList addObject:local_image]; numberOfFrames++; } if (numberOfFrames == 0) { if (!broken) { NXRunAlertPanel(module, "Could not open any frames listed in \"%s\"", NULL, NULL, NULL, filelist); broken = TRUE; } return self; } return self; } - getDefaults { const char *app = module; // "SlideShow" const char *method = "getDefaults"; NXUpdateDefaults(); filelist = NXGetDefaultValue(app, "Filelist"); defStepTime = atoi(NXGetDefaultValue(app, "Steptime")); defWaitTime = atoi(NXGetDefaultValue(app, "Waittime")); defFadeDelta = atof(NXGetDefaultValue(app, "FadeDelta")); if (defaultIntValue(NXGetDefaultValue(app, "Randomize"))) randomize = TRUE; else randomize = FALSE; if (defaultIntValue(NXGetDefaultValue(app, "Fancy"))) fancy = TRUE; else fancy = FALSE; if (defaultIntValue(NXGetDefaultValue(app, "Slide"))) slide = TRUE; else slide = FALSE; if (debug = defaultIntValue(NXGetDefaultValue(app, "Debug"))) printf("%s: %s: debug %d\n", module, method, debug); return self; } + updateSettings { needUpdate++; NXUpdateDefaults(); return self; } + initialize { static NXDefaultsVector SlideShowDefaults = { { "Filelist", "/LocalLibrary/Images/SlideShow.list" }, { "Steptime", "50" }, { "Waittime", "2000" }, { "FadeDelta", "0.05" }, { "Randomize", "NO" }, { "Fancy", "NO" }, { "Slide", "NO" }, { "Debug", "0" }, { NULL } }; NXRegisterDefaults(module, SlideShowDefaults); return self; } - doViewPref:sender { const char *nibfile = "SlideShowPref.nib"; if (!prefPanel) prefPanel = [NXApp loadNibSection:nibfile owner:self]; if (!prefPanel) { NXRunAlertPanel(module, "Cannot open %s", NULL, NULL, NULL, nibfile); return self; } [prefPanel makeKeyAndOrderFront:sender]; [PrefController updatePanel]; return self; } // override this method so that Thinker can't set the default image. - setImage:newImage { return self; } // override - (BOOL) useBufferedWindow { return YES; } @end
These are the contents of the former NiCE NeXT User Group NeXTSTEP/OpenStep software archive, currently hosted by Netfuture.ch.