This is RasView.m in view mode; [Download] [Up]
#import <dpsclient/event.h> #include <objc/NXBundle.h> #include <dpsclient/psops.h> #define NEXT #import <appkit/OpenPanel.h> #import <appkit/ClipView.h> #import <appkit/ScrollView.h> #import <appkit/Scroller.h> #import <appkit/Matrix.h> #import "RasView.h" #ifdef TWOBIT char *tbuf; #endif @implementation RasView // - initFrame:(const NXRect *) frameRect { [(self = [super initFrame:frameRect]) allocateGState]; bm = nil; #if IMAGE image = nil; #endif meters = nil; text = nil; rasView = self; XRange = frameRect->size.width; YRange = frameRect->size.height; [NXApp setDelegate:self]; return self; } - initBitmap { if (bm) [bm free]; #ifdef TWOBIT if (bm) free(tbuf); tbuf = malloc(((XRange>>2)+1)*YRange); bm = [[NXBitmapImageRep alloc] initData:(unsigned char*)tbuf pixelsWide:XRange pixelsHigh:YRange bitsPerSample:2 samplesPerPixel:1 hasAlpha:NO isPlanar:NO colorSpace:NX_OneIsWhiteColorSpace bytesPerRow:((XRange>>2)+1) bitsPerPixel:2 ]; #else #ifdef EIGHTBIT // printf("Initialize 8bit\n"); bm = [[NXBitmapImageRep alloc] initData:(unsigned char*)FBuffer pixelsWide:XRange pixelsHigh:YRange bitsPerSample:8 samplesPerPixel:1 hasAlpha:NO isPlanar:NO colorSpace:NX_OneIsWhiteColorSpace bytesPerRow:0 bitsPerPixel:0 ]; #else #ifdef SIXTEENBIT // printf("Initialize 12bit\n"); bm = [[NXBitmapImageRep alloc] initData:(unsigned char*)FBuffer pixelsWide:XRange pixelsHigh:YRange bitsPerSample:4 samplesPerPixel:3 hasAlpha:NO isPlanar:NO colorSpace:NX_RGBColorSpace bytesPerRow:0 bitsPerPixel:16 ]; #else // printf("Initialize 24bit\n"); bm = [[NXBitmapImageRep alloc] initData:(unsigned char*)FBuffer pixelsWide:XRange pixelsHigh:YRange bitsPerSample:8 samplesPerPixel:3 hasAlpha:NO isPlanar:NO colorSpace:NX_OneIsWhiteColorSpace bytesPerRow:0 bitsPerPixel:32 ]; #endif #endif #endif #if IMAGE { NXSize sz; [bm getSize:&sz]; image=[[NXImage alloc] initSize:&sz]; if (![image useRepresentation:bm]) printf("Representation error\n"); // [image setUnique:YES]; /* make caches disjoint */ // [image setBackgroundColor:NX_COLORBLACK]; } #endif return self; } #define Button1Mask 1 #define Button2Mask 2 #define Button3Mask 4 #define ACTIVEBUTTONMASK \ (NX_MOUSEUPMASK|NX_MOUSEDRAGGEDMASK| \ NX_RMOUSEUPMASK|NX_RMOUSEDRAGGEDMASK) extern void MouseMove( int status, int dx, int dy ); - (BOOL)acceptsFirstMouse { return YES; } - resetMeter:(int)i { [[meters cellAt:i :0] setStringValue:""]; return self; } - setMeter:(int)i value:(Real)t { char buf[32]; sprintf(buf, "%7.4f", t); [[meters cellAt:i :0] setStringValue:buf]; return self; } - keyDown:(NXEvent *)theEvent { [super keyDown:theEvent]; // printf("keyDown:\n"); return self; } - mouseDown:(NXEvent *)theEvent { int oldMask; NXPoint oldMouse, newMouse, dMouse; unsigned int status, buttons=0; Real t, t0; // track the mouse until a mouseUp event occurs, updating the display // as tracking happens. if (theEvent->type==NX_LMOUSEDOWN) buttons = Button1Mask; else if (theEvent->type==NX_RMOUSEDOWN) buttons = Button2Mask; [self lockFocus]; oldMask = [window addToEventMask:ACTIVEBUTTONMASK]; oldMouse = theEvent->location; [self convertPoint:&oldMouse fromView:nil]; [self setMeter:1 value:0.0]; t = t0 = realtime(); while (1) { newMouse = theEvent->location; [self convertPoint:&newMouse fromView:nil]; dMouse.x = newMouse.x - oldMouse.x; dMouse.y = newMouse.y - oldMouse.y; if (dMouse.x != 0.0 || dMouse.y != 0.0) { status = (theEvent->flags & (65535<<16)) | buttons; MouseMove(status, (int)dMouse.x, -(int)dMouse.y); theEvent = [NXApp peekAndGetNextEvent:ACTIVEBUTTONMASK]; if (!theEvent) { RefreshScreen(); [self setMeter:1 value:realtime()-t0-t]; t = realtime()-t0; } } else theEvent = NULL; if (!theEvent) theEvent = [NXApp getNextEvent:ACTIVEBUTTONMASK]; if (theEvent->type==NX_MOUSEUP || theEvent->type==NX_RMOUSEUP) break; oldMouse = newMouse; } [self unlockFocus]; [self resetMeter:1]; [window setEventMask:oldMask]; return self; } - rightMouseDown:(NXEvent *)theEvent { return [self mouseDown:theEvent]; } - superviewSizeChanged:(const NXSize *)oldSize { [super superviewSizeChanged:oldSize]; XRange = bounds.size.width; YRange = bounds.size.height; WRange = XRange>>1; HRange = YRange>>1; Range = MinFun(XRange,YRange); printf("Change size to: %d %d\n", XRange, YRange); ReDrawFlag |= RFReSize; RefreshScreen(); return self; } int drawCount=0; - drawSelf:(const NXRect *) rects :(int)count { #if IMAGE NXPoint origin = {0.0,0.0}; [image recache]; [image composite:NX_SOVER toPoint:&origin]; #else [bm draw]; #endif drawCount++; return self; } - (BOOL)openFile:(const char *)fn { if( fn && FetchFile(FileFormat,True, (char *)fn) ) { ReDrawFlag |= RFRefresh | RFColour; if( InfoBondCount < 1 ) EnableBackbone(CylinderFlag,80); else EnableWireframe(CylinderFlag,80); CPKColourAttrib(); RefreshScreen(); } else { NXRunAlertPanel(NULL,"Couldn't get molecule from %s", NULL,NULL,NULL, fn); fn = NULL; } if( !CommandActive ) ResetCommandLine(0); [self update]; return fn!=0; } - open:sender { // const char *const types[] = {{"pdb"}, (const char *) NULL}; id pan = [OpenPanel new]; const char *const *filenames; char filename[FILENAME_MAX]; if (![pan runModal]) return NO; if ((filenames = [pan filenames]) == NULL) return NO; sprintf(filename,"%s/%s", [pan directory], filenames[0]); [self openFile:filename]; return self; } - update { RefreshScreen(); return self; } - setText:aText { text = aText; [text setDelegate:self]; [text setMonoFont:FALSE]; [text setCharFilter:NXFieldFilter]; ras_init(); FBClear = False; ReDrawFlag |= RFRefresh; RefreshScreen(); if (text) [[meters window] setNextResponder:text]; [self setNextResponder:text]; [window makeFirstResponder:self]; [window makeKeyAndOrderFront:self]; return self; } - text { return text; } - setMeters:aMatrix; { meters = aMatrix; if (text) [[meters window] setNextResponder:text]; return self; } - meters { return meters; } - break { int len; line[lineIndex] = '\0'; len = [text charLength]; [text setSel:len :len]; [text setSelFontStyle:NX_UNBOLD]; [text replaceSel:line]; [text scrollSelToVisible]; lineIndex = 0; return self; } - putChar:(char)ch { line[lineIndex++] = ch; if (ch=='\n' || lineIndex>=linebuflength-1) [self break]; return self; } - show:(char *)str { while(*str) [self putChar:*(str++)]; [self break]; return self; } // Application's delegate methods - (BOOL)appAcceptsAnotherFile:sender { return YES; } - (int)app:sender openFile:(const char *)filename type:(const char *)type { [self close:sender]; return [self openFile:filename]; } // Text's delegate method - textDidEnd:sender endChar:(unsigned short)whyEnd { NXSelPt start, end; int len, ln, cp; char *buf; [window makeFirstResponder:text]; if (whyEnd==NX_RETURN) { [sender getSel:&start :&end]; ln = [sender lineFromPosition:end.cp-1]; cp = [sender positionFromLine:ln]; len = end.cp-cp; buf = malloc(len+2); [sender getSubstring:buf start:cp length:len]; ln = 0; if (strncmp(buf, CurPrompt, strlen(CurPrompt))==0) ln+=strlen(CurPrompt); [text setSel:cp+ln :end.cp]; [text setSelFontStyle:NX_BOLD]; buf[len] = '\n'; buf[len+1] = '\0'; [self putChar:'\n']; for (cp=ln; buf[cp]; cp++) if(ProcessCharacter(buf[cp]) && ProcessCommand()) exit(0); if( !CommandActive ) ResetCommandLine(0); RefreshScreen(); free(buf); } return self; } - setValue:sender { switch([sender selectedRow]){ case 0: ColourDepth = (int)[[sender cellAt:0 :0] floatValue]; printf("ColourDepth: %d\n", ColourDepth); break; case 1: Ambient = [[sender cellAt:1 :0] floatValue]; printf("Ambient: %g\n", Ambient); break; default: ; } return self; } - testPattern:sender { int i, j, k, dn; Real t; Pixel c; NXEvent theEvent; printf("Test pattern\n"); ClearBuffers(); dn = YRange/(LastShade+3); for (i=0; i<XRange; i++) { c = 1<<(i*32/(XRange+1)); for (j=0; j<dn; j++) FBuffer[j*XRange+i] = c; c = Lut[i*LutSize/(XRange+1)]; for (j=dn; j<2*dn; j++) FBuffer[j*XRange+i] = c; for (k=0; k<LastShade; k++) { c = Lut[Shade2Colour(k)+i*ColourDepth/(XRange+1)]; for (j=0; j<dn && j<YRange-dn; j++) FBuffer[((2+k)*dn+j)*XRange+i] = c; } } [self setMeter:0 value:0.0]; [self setMeter:3 value:0.0]; t = realtime(); for (k=0; ![NXApp peekNextEvent:NX_KEYDOWNMASK into:&theEvent]; k++) { for (i=0; i<XRange; i++) { c = Lut[LutSize-1-((i+k*XRange/32)%XRange)*LutSize/(XRange+1)]; for (j=YRange-dn; j<YRange; j++) FBuffer[j*XRange+i] = c; } // [self display]; TransferImage(); if (k%10==0) { [self setMeter:0 value:10.0/(realtime()-t)]; [self setMeter:3 value:(Real)drawCount]; t = realtime(); } } [self resetMeter:0]; [self resetMeter:3]; FBClear = False; ReDrawFlag |= RFRefresh; RefreshScreen(); return self; } - testRotate:sender; { int k; Real t, tf; NXEvent theEvent; [self setMeter:0 value:0.0]; [self setMeter:1 value:0.0]; [self setMeter:3 value:0.0]; t = tf = realtime(); for (k=0; ![NXApp peekNextEvent:NX_KEYDOWNMASK|NX_MOUSEDOWNMASK into:&theEvent]; k++) { MouseMove( Button1Mask, 5, 0 ); RefreshScreen(); [self setMeter:1 value:realtime()-t]; t = realtime(); if (k%10==0) { [self setMeter:0 value:10.0/(realtime()-tf)]; [self setMeter:3 value:drawCount]; tf = realtime(); } } [self resetMeter:0]; [self resetMeter:1]; [self resetMeter:3]; return self; } - close:sender { ZapDatabase(); return [self update]; } - wireFrame: sender { DisableSpacefill(); EnableWireframe(WireFlag,0); SetRibbonStatus(False,0,0); DisableBackbone(); ReDrawFlag |= RFRefresh; return [self update]; } - backBone: sender { DisableSpacefill(); DisableWireframe(); SetRibbonStatus(False,0,0); EnableBackbone(CylinderFlag,80); ReDrawFlag |= RFRefresh; return [self update]; } - sticks: sender { DisableSpacefill(); if( MainAtomCount<256 ) { EnableWireframe(CylinderFlag,40); } else EnableWireframe(CylinderFlag,80); SetRibbonStatus(False,0,0); ReDrawFlag |= RFRefresh; DisableBackbone(); return [self update]; } - spheres: sender { SetVanWaalRadius(); SetVanWaalRadius(); DisableWireframe(); SetRibbonStatus(False,0,0); DisableBackbone(); ReDrawFlag |= RFRefresh; return [self update]; } - ballAndStick: sender { SetRadiusValue(120); EnableWireframe(CylinderFlag,40); SetRibbonStatus(False,0,0); DisableBackbone(); ReDrawFlag |= RFRefresh; return [self update]; } - ribbons: sender { DisableSpacefill(); DisableWireframe(); SetRibbonStatus(True,RibbonFlag,0); DisableBackbone(); ReDrawFlag |= RFRefresh; return [self update]; } - strands: sender { DisableSpacefill(); DisableWireframe(); SetRibbonStatus(True,StrandFlag,0); DisableBackbone(); ReDrawFlag |= RFRefresh; return [self update]; } - cartoons: sender { DisableSpacefill(); DisableWireframe(); SetRibbonCartoons(); DisableBackbone(); ReDrawFlag |= RFRefresh; return [self update]; } - mono: sender { MonoColourAttrib(255,255,255); ReDrawFlag |= RFColour; return [self update]; } - cpk: sender { CPKColourAttrib(); ReDrawFlag |= RFColour; return [self update]; } - shapely: sender { ShapelyColourAttrib(); ReDrawFlag |= RFColour; return [self update]; } - group: sender { ScaleColourAttrib( GroupAttr ); ReDrawFlag |= RFColour; return [self update]; } - chain: sender { ScaleColourAttrib( ChainAttr ); ReDrawFlag |= RFColour; return [self update]; } - temp: sender { ScaleColourAttrib( TempAttr ); ReDrawFlag |= RFColour; return [self update]; } - struct: sender { StructColourAttrib(); ReDrawFlag |= RFColour; return [self update]; } - user: sender { UserMaskAttrib(MaskColourFlag); ReDrawFlag |= RFColour; return [self update]; } - slabbing: sender { ReDrawFlag |= RFRefresh; UseSlabPlane = !UseSlabPlane; if( UseSlabPlane ) UseShadow = False; return [self update]; } - hydrogens: sender { int mask = NormAtomFlag; if( HetaGroups ) mask |= HeteroFlag; Hydrogens = !Hydrogens; ReDrawFlag |= RFRefresh; if( Hydrogens ) SelectZone(mask|HydrogenFlag); else RestrictZone(mask); return [self update]; } - hetero: sender { int mask = NormAtomFlag; if( Hydrogens ) mask |= HydrogenFlag; HetaGroups = !HetaGroups; ReDrawFlag |= RFRefresh; if( HetaGroups ) SelectZone(mask|HeteroFlag); else RestrictZone(mask); return [self update]; } - specular: sender { FakeSpecular = !FakeSpecular; ReDrawFlag |= RFColour; return [self update]; } - shadows: sender { ReDrawFlag |= RFRefresh; UseShadow = !UseShadow; if( UseShadow ) { ReviseInvMatrix(); VoxelsClean = False; UseSlabPlane = False; ReAllocBuffers(); } return [self update]; } - stereo: sender { if( UseStereo ) { SetStereoMode(False); } else SetStereoMode(True); ReDrawFlag |= RFRefresh; return [self update]; } - labels: sender { LabelOptFlag = !LabelOptFlag; DefaultLabels(LabelOptFlag); ReDrawFlag |= RFRefresh; return [self update]; } - export: sender { ResetCommandLine(3); return self; } - help: sender { return self; } @end
These are the contents of the former NiCE NeXT User Group NeXTSTEP/OpenStep software archive, currently hosted by Netfuture.ch.