This is OutputView.m in view mode; [Download] [Up]
/* Generated by Interface Builder */ #import "OutputView.h" #import <appkit/appkit.h> #import "constants.h" #import <math.h> #import "ControlObject.h" id parser; void outputPoints(PointList *p) { int s; Point *pt; for(s=gotoPointInList(p,0,&pt);s;s=gotoNextPointInList(p,&pt)) { ("x : %f |y: %f |pen: %d |colour: %f\n",pt->x,pt->y,pt->pen,pt->pencolour); } } DPSTimedEntryProc handlerfunction(DPSTimedEntry te,double now,void *userdata) { [parser doEntry]; } void doMapping(PointList *p) { int t; Point *pt; int lastpen = UP; float lastcol = NX_LTGRAY; PSsetgray(NX_LTGRAY); PSsetlinewidth(0.0); for(t=gotoPointInList(p,0,&pt);(t);t=gotoNextPointInList(p,&pt)) { if (lastpen == DOWN) PSlineto(pt->x,pt->y); else PSmoveto(pt->x,pt->y); if (lastcol != pt->pencolour) { PSstroke(); PSnewpath(); PSmoveto(pt->x,pt->y); PSsetgray(pt->pencolour); lastcol = pt->pencolour; } lastpen = pt->pen; } PSstroke(); } @implementation OutputView - setItUp:sender { int i; NXRect r; [self setDrawSize:(ORight-OLeft) :(OTop-OBottom)]; [self setDrawOrigin:OLeft :OBottom]; animating = STOPPED; currentFrame = 0; parser = self; stepValue = 0.0; maxFrame = 0; alertWindow = [sender alertWindow]; alertText = [sender alertText]; return self; } - (BOOL)gridState { return GridOn; } - setGridState:(BOOL)newGridState { oldGridOn = GridOn; GridOn = newGridState; return self; } - drawSelf:(const NXRect *)rects :(int)rectCount { Point *pt; int s; if (animating) { currentFrame= currentFrame + animating; if (currentFrame >= maxFrame) currentFrame = 0; else if (currentFrame < 0) currentFrame = (maxFrame-1); [outputFrames[currentFrame] composite:NX_COPY toPoint:&(bounds.origin)]; } else { NXEraseRect(&bounds); doMapping(&stillPoints); } return self; } - doStill:(ProjParam *)params :(PointList *)pts { newPointList(&stillPoints); convertPoints(pts,&stillPoints,GridOn,params); [self display]; freePointList(&stillPoints); return self; } - doEntry { [self display]; return self; } - setupAnimation:(ProjParam *)params :(float)step :(PointList *)pts :(int)force { int i; float g,h,l; PointList outputPoints; char outstr[100]; if ((!force) && (step == stepValue) && (params->phi1 == currentParams.phi1) && (params->proj == currentParams.proj) && (params->radius == currentParams.radius) && (oldGridOn == GridOn)) { g = ((params->lon0*180)/PI); h = ((currentParams.lon0*180)/PI); l = (h-g)/step; if ((l > (round(l)-0.001)) && (l < (round(l)+0.001))){ currentFrame = -1*(round(l) + round(h/step)); if (currentFrame < 0) currentFrame += maxFrame; if (currentFrame >= maxFrame) currentFrame -= maxFrame; return self; } } oldGridOn = GridOn; maxFrame = (360/step); currentParams = *params; stepValue = step; currentFrame = 0; [alertWindow makeKeyAndOrderFront:self]; for(i = 0;(i<maxFrame);i++) { sprintf(outstr,"Frame %d of %d.",(i+1),maxFrame); [alertText setStringValue:outstr]; newPointList(&outputPoints); convertPoints(pts,&outputPoints,GridOn,params); params->lon0 = params->lon0+((step/180)*PI); if (!(outputFrames[i])) { outputFrames[i] = [Bitmap newSize:frame.size.width :frame.size.height type:NX_UNIQUEBITMAP]; [outputFrames[i] setFlip:NO]; } [outputFrames[i] lockFocus]; PSscale((frame.size.width)/(ORight-OLeft),(frame.size.height)/(OTop-OBottom)); PStranslate(ORight,OTop); NXEraseRect(&bounds); doMapping(&outputPoints); [outputFrames[i] unlockFocus]; freePointList(&outputPoints); } [alertText setStringValue:" "]; [alertWindow close]; return self; } - (int)animation { return animating; } - stopAnimating:(float *)angle; { if (animnum) DPSRemoveTimedEntry(animnum); animnum = 0; animating = STOPPED; *angle = (currentFrame*stepValue) + ((currentParams.lon0*180)/PI); return self; } - startAnimating:(int)amate { animnum = DPSAddTimedEntry(rate,(DPSTimedEntryProc)handlerfunction,NULL,NX_BASETHRESHOLD); animating = amate; return self; } - rateChanged:(float)f { rate = f; if (animnum) { DPSRemoveTimedEntry(animnum); animnum = DPSAddTimedEntry(rate,(DPSTimedEntryProc)handlerfunction,NULL,NX_BASETHRESHOLD); } return self; } - (BOOL)shouldRunPrintPanel:sender { return YES; } - doPrint:(ProjParam *)params :(PointList *)pts { int holder; holder = animating; animating = STOPPED; newPointList(&stillPoints); convertPoints(pts,&stillPoints,GridOn,params); [self printPSCode:self]; freePointList(&stillPoints); animating = holder; return self; } @end
These are the contents of the former NiCE NeXT User Group NeXTSTEP/OpenStep software archive, currently hosted by Netfuture.ch.