/* applemac.c * RasMol2 Molecular Graphics * Roger Sayle, October 1994 * Version 2.5 */ #include #include #include #include #include #include #ifdef __CONDITIONALMACROS__ #include #else #include #endif #include #include #include #include #include #include #define GRAPHICS #include "rasmol.h" #include "graphics.h" #include "molecule.h" #include "transfor.h" #include "render.h" static PixPatHandle BackHand; static PaletteHandle CMap; static PixMap *PixelMap; static int CMapClean; int CreateImage() { register Long size; if( FBuffer ) _ffree(FBuffer); size = (Long)XRange*YRange*sizeof(Pixel); FBuffer = (Pixel*)_fmalloc( size+32 ); #ifdef EIGHTBIT PixelMap->rowBytes = XRange | 0x8000; #else PixelMap->rowBytes = (XRange<<2) | 0x8000; #endif PixelMap->baseAddr = (Ptr)FBuffer; PixelMap->bounds.right = XRange; PixelMap->bounds.bottom = YRange; return( (int)FBuffer ); } void TransferImage() { register PixMapHandle pmHand; register GDHandle gdHand; register int mode; GrafPtr savePort; Rect rect; GetPort(&savePort); SetPort(CanvWin); ForeColor(blackColor); BackColor(whiteColor); rect.top = 0; rect.bottom = YRange; rect.left = 0; rect.right = XRange; gdHand = GetMaxDevice(&CanvWin->portRect); pmHand = (**gdHand).gdPMap; if( (**pmHand).pixelSize < (sizeof(Pixel)<<3) ) { mode = srcCopy+ditherCopy; } else mode = srcCopy; /* ClipRect(&rect); */ CopyBits((BitMap*)PixelMap, (BitMap*)&CanvWin->portBits, &rect,&rect,mode,(RgnHandle)0); BackColor(blackColor); SetPort(savePort); } void ClearImage() { GrafPtr savePort; RGBColor col; Rect rect; GetPort(&savePort); SetPort(CanvWin); rect.bottom = CanvWin->portRect.bottom-15; rect.right = CanvWin->portRect.right-15; rect.left = 0; rect.top = 0; col.red = BackR<<8 | BackR; col.green = BackG<<8 | BackG; col.blue = BackB<<8 | BackB; MakeRGBPat(BackHand,&col); FillCRect(&rect,BackHand); SetPort(savePort); } static PicHandle CreateMacPicture() { GrafPtr savePort; RgnHandle saveRgn; PicHandle pict; Rect rect; saveRgn = NewRgn(); GetPort(&savePort); SetPort(CanvWin); GetClip( saveRgn ); rect.top = 0; rect.bottom = YRange; rect.left = 0; rect.right = XRange; pict = OpenPicture(&rect); ForeColor(blackColor); BackColor(whiteColor); ClipRect( &rect ); CopyBits((BitMap*)PixelMap, (BitMap*)&CanvWin->portBits, &rect,&rect,srcCopy,(RgnHandle)0); ClosePicture(); SetClip(saveRgn); BackColor(blackColor); DisposeRgn(saveRgn); SetPort(savePort); return pict; } int PrintImage() { register int xsize,ysize; register int high,wide; TPrStatus prStatus; TPPrPort printPort; GrafPtr savePort; PicHandle pict; short prErr; Rect *page; Rect rect; PrOpen(); if( !PrintHand ) { PrintHand = (THPrint)NewHandle(sizeof(TPrint)); PrintDefault(PrintHand); } if( PrJobDialog(PrintHand) ) { pict = CreateMacPicture(); printPort = PrOpenDoc(PrintHand,0,0); GetPort(&savePort); SetPort(&printPort->gPort); PrOpenPage( printPort, 0 ); page = &(**PrintHand).prInfo.rPage; wide = page->right - page->left; high = page->bottom - page->top; xsize = XRange; ysize = YRange; if( xsize > wide ) { ysize = (int)(((Long)ysize*wide)/xsize); xsize = wide; } if( ysize > high ) { xsize = (int)(((Long)xsize*high)/ysize); ysize = high; } rect.top = page->top + (high-ysize)>>1; rect.left = page->left + (wide-xsize)>>1; rect.bottom = rect.top + ysize; rect.right = rect.left + xsize; DrawPicture( pict, &rect ); PrClosePage( printPort ); SetPort(savePort); PrCloseDoc(printPort); KillPicture(pict); if( !(prErr = PrError()) ) if( (*PrintHand)->prJob.bJDocLoop == bSpoolLoop ) { PrPicFile(PrintHand,0,0,0,&prStatus); prErr = PrError(); } } else prErr = False; /* Cancel Print */ PrClose(); return( !prErr ); } int ClipboardImage() { register long clipErr; register long length; PicHandle pict; register int i; register FILE *fp; ZeroScrap(); pict = CreateMacPicture(); HLock((Handle)pict); length = (long)GetHandleSize((Handle)pict); clipErr = PutScrap(length,'PICT',(Ptr)*pict); HUnlock((Handle)pict); KillPicture(pict); return( !clipErr ); } void AllocateColourMap() { #ifdef EIGHTBIT register PixMapHandle pmHand; register GDHandle gdHand; register CTabHandle cmap; register int i; RGBColor col; ULut[0] = True; ULut[255] = True; HLock((Handle)CMap); cmap = PixelMap->pmTable; (**cmap).ctSeed = GetCTSeed(); for( i=0; i<256; i++ ) { if( ULut[i] ) { col.red = RLut[i]<<8 | RLut[i]; col.green = GLut[i]<<8 | GLut[i]; col.blue = BLut[i]<<8 | BLut[i]; Lut[i] = i; } else col.red = col.green = col.blue = 0; (**cmap).ctTable[i].rgb = col; SetEntryColor(CMap,i,&col); } HUnlock((Handle)CMap); gdHand = GetMaxDevice(&CanvWin->portRect); pmHand = (**gdHand).gdPMap; if( (**pmHand).pixelSize >= 8 ) { ActivatePalette(CanvWin); CMapClean = False; } FBClear = False; #endif } void UpdateScrollBars() { register int pos; pos = 50+(int)(50.0*DialValue[1]); SetCtlValue(HScroll,pos); pos = 50+(int)(50.0*DialValue[0]); SetCtlValue(VScroll,pos); } void SetMouseMode( mode ) int mode; { MouseMode = mode; } int LookUpColour( name, r, g, b ) char *name; int *r, *g, *b; { return( False ); } void EnableMenus( flag ) int flag; { register int i; MenuHandle hand; long offset; /* File Menu */ hand = GetMHandle(141); if( flag && !Database ) { EnableItem(hand,1); } else DisableItem(hand,1); if( Database && flag ) { EnableItem(hand,2); EnableItem(hand,3); EnableItem(hand,5); EnableItem(hand,6); } else { DisableItem(hand,2); DisableItem(hand,3); DisableItem(hand,5); DisableItem(hand,6); } /* Edit Menu */ hand = GetMHandle(142); if( Database ) { EnableItem(hand,3); } else DisableItem(hand,3); if( flag && (GetScrap(0,'TEXT',&offset)>0) ) { EnableItem(hand,4); } else DisableItem(hand,4); if( flag && Database ) { EnableItem(hand,7); } else DisableItem(hand,7); /* Middle Menus */ if( Database && flag ) { EnableItem(GetMHandle(143),0); EnableItem(GetMHandle(144),0); EnableItem(GetMHandle(145),0); } else { DisableItem(GetMHandle(143),0); DisableItem(GetMHandle(144),0); DisableItem(GetMHandle(145),0); } /* Export Menu */ hand = GetMHandle(146); if( Database ) { EnableItem(hand,0); } else DisableItem(hand,0); DisableMenu = !flag; DrawMenuBar(); } static void DefineMenus() { MenuHandle hand; register long region; register int i; /* Apple Menu */ hand = GetMenu(140); AddResMenu(hand,'DRVR'); InsertMenu(hand,0); for( i=141; i<148; i++ ) InsertMenu( GetMenu(i), 0 ); /* if( GetEnvirons(smRegionCode) == verUS ) */ /* SetItem(GetMHandle(144),0,'\pColors"); */ EnableMenus( True ); } int OpenDisplay( x, y ) int x, y; { #ifndef EIGHTBIT register CTabHandle cmap; #endif register int i; Rect rect; UseHourGlass = True; MouseMode = MMRasMol; DisableMenu = False; for( i=0; i<8; i++ ) DialValue[i] = 0.0; ULut[0] = ULut[255] = True; RLut[255] = GLut[255] = BLut[255] = 0; RLut[0] = GLut[0] = BLut[0] = 255; XRange = x; WRange = XRange>>1; YRange = y; HRange = YRange>>1; Range = MinFun(XRange,YRange); CanvWin = GetNewCWindow(150,0,(WindowPtr)-1); SetPort(CanvWin); SizeWindow(CanvWin,x+15,y+15,TRUE); ShowWindow(CanvWin); /* Load Cursors */ CanvCursor = GetCursor(160); CmndCursor = GetCursor(1); WaitCursor = GetCursor(4); /* Create Scroll Bars */ rect.left = -1; rect.right = x+1; rect.top = y; rect.bottom = y+16; HScroll = NewControl(CanvWin,&rect,"\p",TRUE, 50,0,100,scrollBarProc,0L); rect.left = x; rect.right = x+16; rect.top = -1; rect.bottom = y+1; VScroll = NewControl(CanvWin,&rect,"\p",TRUE, 50,0,100,scrollBarProc,0L); DrawGrowIcon(CanvWin); /* PixMap! */ PixelMap = (PixMap*)NewPtr(sizeof(PixMap)); if( !PixelMap ) return( True ); /* 72.0 DPI Resolution! */ PixelMap->hRes = 72; PixelMap->vRes = 72; PixelMap->bounds.left = 0; PixelMap->bounds.top = 0; PixelMap->cmpSize = 8; PixelMap->planeBytes = 0; PixelMap->pmReserved = 0; PixelMap->pmVersion = 0; PixelMap->packType = 0; PixelMap->packSize = 0; #ifdef EIGHTBIT /* Indexed PixMap */ PixelMap->pixelSize = 8; PixelMap->pixelType = 0; PixelMap->cmpCount = 1; PixelMap->pmTable = GetCTable(8); (**PixelMap->pmTable).ctSeed = GetCTSeed(); CMap = NewPalette(256,(CTabHandle)0,pmTolerant,0); SetPalette(CanvWin,CMap,True); CMapClean = True; #else /* Direct PixMap */ PixelMap->pixelSize = 32; PixelMap->cmpSize = 8; PixelMap->pixelType = RGBDirect; PixelMap->cmpCount = 3; i = sizeof(ColorTable) - sizeof(CSpecArray); cmap = (CTabHandle)NewHandle(i); (**cmap).ctSeed = 32; (**cmap).ctFlags = 0; (**cmap).ctSize = 0; PixelMap->pmTable = cmap; #endif /* Initialise Palette! */ for( i=1; i<255; i++ ) ULut[i] = False; AllocateColourMap(); PrintHand = (THPrint)NULL; BackHand = NewPixPat(); DefineMenus(); return(False); } void CloseDisplay() { } void BeginWait() { register WindowPtr win; if( UseHourGlass ) { win = FrontWindow(); if( win==CanvWin || win==CmndWin ) SetCursor(*WaitCursor); } } #ifdef __CONDITIONALMACROS__ #define ArrowCursor SetCursor(&qd.arrow) #else #define ArrowCursor SetCursor(&arrow) #endif void EndWait() { register WindowPtr win; GrafPtr savePort; Point pos; /* if( UseHourGlass )? */ win = FrontWindow(); if( win==CanvWin ) { GetPort(&savePort); SetPort(CanvWin); GetMouse(&pos); if( (pos.h>0) && (pos.v>0) && (pos.vportRect.bottom-15) && (pos.hportRect.right-15) ) { SetCursor(*CanvCursor); } else ArrowCursor; SetPort(savePort); } else if( win==CmndWin ) { GetPort(&savePort); SetPort(CmndWin); GetMouse(&pos); if( (pos.h>0) && (pos.v>0) && (pos.vportRect.bottom) && (pos.hportRect.right-15) ) { SetCursor(*CmndCursor); } else ArrowCursor; SetPort(savePort); } }