This is rasnext.m in view mode; [Download] [Up]
/* * NEXTSTEP specific routines for RasMol * (c) 1995 Andreas Windemuth */ #import "objc/NXBundle.h" #define GRAPHICS #include "rasnext/RasView.h" // Link back to RasView object RasView *rasView=NULL; // direct character output to text port void NXWriteChar(char ch) { [rasView putChar:ch]; } void NXWriteString(char *ptr) { [rasView show:ptr]; } // Timing function Real realtime(void) { struct timeval tv; struct timezone tzv; gettimeofday(&tv, &tzv); /* debug("Time: %d seconds, %d microseconds, % 15.3f\n", tv.tv_sec, tv.tv_usec, (double)tv.tv_sec + 1e-6*(double)tv.tv_usec); */ return (Real)tv.tv_sec + 1e-6*(Real)tv.tv_usec; } // Find bundeled files such as rasmol.hlp FILE *openResourceFile(const char *fn, char *path, int len) { char buf[MAXPATHLEN+1]; if (![[NXBundle mainBundle] getPath:buf forResource:fn ofType:NULL]) return NULL; if (path) { if (strlen(buf)>len) { if( CommandActive ) WriteChar('\n'); CommandActive = False; WriteString("Unable to find RasMol help file!\n"); } strcpy(path, buf); } return fopen(buf, "r"); } // no color maps void AllocateColourMap() { } // This should be in rasmol core, I guess int CreateImage() { register Long size, temp; if( FBuffer ) free(FBuffer); size = (Long)XRange*YRange*sizeof(Pixel); FBuffer = (Pixel*)malloc( size+32 ); [rasView initBitmap]; return( (int)FBuffer ); } // Flush to screen void TransferImage() { Real t = realtime(); #ifdef TWOBIT { int i, j; Byte *p, *q; q = FBuffer; for (i=0; i<YRange; i++) { p = tbuf + i*((XRange>>2)+1); for (j=0; j<(XRange>>2); j++) { *p = *(q++)&192; *p |= (*(q++)&192)>>2; *p |= (*(q++)&192)>>4; *(p++) |= (*(q++)&192)>>6; } *p = 0; for (j=0; j<(XRange%4); j++) *p |= (*(q++)&192)>>(j<<1); } } // printf("Buffer transferred: %g\n", realtime()-t); #endif [rasView display]; NXPing(); [rasView setMeter:2 value:realtime()-t]; } void ClearImage() { } // Replaced by NEXTSTEP print mechanism int PrintImage() { return( True ); } int ClipboardImage() { } void UpdateScrollBars() { } void SetMouseMode( mode ) int mode; { } int LookUpColour( name, r, g, b ) char *name; int *r, *g, *b; { return( False ); } void EnableMenus( flag ) int flag; { } int OpenDisplay( x, y ) int x, y; { int i; UseHourGlass = True; DisableMenu = False; MouseMode = MMRasMol; for( i=0; i<8; i++ ) DialValue[i] = 0.0; ULut[0] = True; RLut[0] = GLut[0] = BLut[0] = 0; XRange = x; WRange = XRange>>1; YRange = y; HRange = YRange>>1; Range = MinFun(XRange,YRange); /* Initialise Palette! */ for( i=1; i<256; i++ ) ULut[i] = False; AllocateColourMap(); UpdateScrollBars(); if (!rasView) return False; return(True); } void BeginWait() { } void EndWait() { } void CloseDisplay() { } int FetchEvent( wait ) int wait; { } void ClampDial( dial, value ) int dial; Real value; { register Real temp; temp = DialValue[dial] + value; if( temp > 1.0 ) { DialValue[dial] = 1.0; } else if( temp < -1.0 ) { DialValue[dial] = -1.0; } else DialValue[dial] = temp; } void WrapDial( dial, value ) int dial; Real value; { register Real temp; temp = DialValue[dial] + value; while( temp < -1.0 ) temp += 2.0; while( temp > 1.0 ) temp -= 2.0; DialValue[dial] = temp; } // MouseMove lifted almost unmodified from X-windows version: #define ShiftMask NX_SHIFTMASK #define ControlMask NX_CONTROLMASK #define Button1Mask 1 #define Button2Mask 2 #define Button3Mask 4 void MouseMove( int status, int dx, int dy ) { register int index; /* printf("MouseMove %x %d %d\n", status, dx, dy); printf(" RasMol: %d, Shift: %d, But1: %d, But2: %d, Ctrl: %d\n", MouseMode == MMRasMol, status & ShiftMask, status & Button1Mask, status & Button2Mask, status & ControlMask); */ if( MouseMode == MMRasMol ) { if( status & ShiftMask ) { if( status & Button1Mask ) { if( dy ) /* Zoom Vertical */ { ClampDial( 3, (Real)dy/HRange ); ReDrawFlag |= RFZoom; } } else if( status & (Button2Mask|Button3Mask) ) if( dx ) /* Z Rotation Horizontal */ { WrapDial( 2, (Real)dx/WRange ); ReDrawFlag |= RFRotateZ; } } else if( status & ControlMask ) { if( status & Button1Mask ) { if( dy ) /* Slab Vertical */ { ClampDial( 7, (Real)dy/YRange ); ReDrawFlag |= RFSlab; } } } else /* Unmodified! */ if( status & Button1Mask ) { if( dx ) /* Rotate Y Horizontal */ { WrapDial( 1, (Real)dx/WRange ); index = (DialValue[1]+1.0)*(XRange-48); /* NewScrlX = (index>>1)+16; */ ReDrawFlag |= RFRotateY; } if( dy ) /* Rotate X Vertical */ { WrapDial( 0, (Real)dy/HRange ); index = (DialValue[0]+1.0)*(YRange-48); /* NewScrlY = (index>>1)+16; */ ReDrawFlag |= RFRotateX; } } else if( status & (Button2Mask|Button3Mask) ) { if( dx ) /* Translate X Horizontal */ { ClampDial( 4, (Real)dx/XRange ); ReDrawFlag |= RFTransX; } if( dy ) /* Translate Y Vertical */ { ClampDial( 5, (Real)dy/YRange ); ReDrawFlag |= RFTransY; } } } else if( MouseMode==MMQuanta ) { if( status & ShiftMask ) { if( status & Button1Mask ) { if( dy ) /* Slab Vertical */ { ClampDial( 7, (Real)dy/YRange ); ReDrawFlag |= RFSlab; } } else if( status & Button2Mask ) { if( dx ) /* Translate X Horizontal */ { ClampDial( 4, (Real)dx/XRange ); ReDrawFlag |= RFTransX; } if( dy ) /* Translate Y Vertical */ { ClampDial( 5, (Real)dy/YRange ); ReDrawFlag |= RFTransY; } } else if( !(status & Button3Mask) ) if( dy ) /* Zoom Vertical */ { ClampDial( 3, (Real)dy/HRange ); ReDrawFlag |= RFZoom; } } else if( status & Button2Mask ) { if( dx ) /* Rotate Y Horizontal */ { WrapDial( 1, (Real)dx/WRange ); index = (DialValue[1]+1.0)*(XRange-48); /* NewScrlX = (index>>1)+16; */ ReDrawFlag |= RFRotateY; } if( dy ) /* Rotate X Vertical */ { WrapDial( 0, (Real)dy/HRange ); index = (DialValue[0]+1.0)*(YRange-48); /* NewScrlY = (index>>1)+16; */ ReDrawFlag |= RFRotateX; } } else if( status & Button3Mask ) if( dx ) /* Z Rotation Horizontal */ { WrapDial( 2, (Real)dx/WRange ); ReDrawFlag |= RFRotateZ; } } else /* MMInsight */ switch( status & (Button1Mask|Button2Mask|Button3Mask) ) { case( Button1Mask ): if( dx ) /* Rotate Y Horizontal */ { WrapDial( 1, (Real)dx/WRange ); index = (DialValue[1]+1.0)*(XRange-48); /* NewScrlX = (index>>1)+16; */ ReDrawFlag |= RFRotateY; } if( dy ) /* Rotate X Vertical */ { WrapDial( 0, (Real)dy/HRange ); index = (DialValue[0]+1.0)*(YRange-48); /* NewScrlY = (index>>1)+16; */ ReDrawFlag |= RFRotateX; } break; case( Button2Mask ): if( dx ) /* Translate X Horizontal */ { ClampDial( 4, (Real)dx/XRange ); ReDrawFlag |= RFTransX; } if( dy ) /* Translate Y Vertical */ { ClampDial( 5, (Real)dy/YRange ); ReDrawFlag |= RFTransY; } break; case( Button1Mask|Button2Mask ): ClampDial( 3, (Real)dx/WRange - (Real)dy/HRange ); ReDrawFlag |= RFZoom; break; case( Button1Mask|Button3Mask ): WrapDial( 2, (Real)dx/WRange - (Real)dy/HRange ); ReDrawFlag |= RFRotateZ; break; case( Button1Mask|Button2Mask|Button3Mask ): ClampDial( 7, (Real)dx/XRange - (Real)dy/YRange ); ReDrawFlag |= RFSlab; break; } }
These are the contents of the former NiCE NeXT User Group NeXTSTEP/OpenStep software archive, currently hosted by Netfuture.ch.