RasMol2
|
Announce,
ChangeLog,
ChangeLog.1,
ChangeLog.2,
ChangeLog.3,
ChangeLog.4,
INSTALL,
Imakefile,
Makefile,
Makefile.bak,
Makefile.in,
Makefile.nt,
Makefile.pc,
PROJECTS,
README,
TODO,
abstree.c,
abstree.h,
applemac.c,
bitmaps.h,
command.c,
command.h,
data,
doc,
font.h,
graphics.h,
molecule.c,
molecule.h,
mswin,
mswin31.c,
outfile.c,
outfile.h,
pixutils.c,
pixutils.h,
rasmac.c,
rasmol.c,
rasmol.h,
rasmol.hlp,
rasmol.sh,
raswin.c,
render.c,
render.h,
script.c,
script.h,
tokens.h,
transfor.c,
transfor.h,
vms,
x11win.c,
|
|
|
/* mswin31.c
* RasMol2 Molecular Graphics
* Roger Sayle, October 1994
* Version 2.5
*/
#include
#include
#include
#include
#include
#define GRAPHICS
#include "rasmol.h"
#include "graphics.h"
#include "render.h"
static int ColCount;
static BITMAPINFO __far *BitInfo;
static HCURSOR WaitCursor;
static HCURSOR OldCursor;
static HMENU hMenu;
void AllocateColourMap()
{
register COLORREF ref;
register int i;
if( ColourMap )
DeleteObject(ColourMap);
ColCount = 0;
for( i=0; i<256; i++ )
if( ULut[i] )
{ Palette->palPalEntry[ColCount].peFlags = 0;
Palette->palPalEntry[ColCount].peRed = RLut[i];
Palette->palPalEntry[ColCount].peGreen = GLut[i];
Palette->palPalEntry[ColCount].peBlue = BLut[i];
BitInfo->bmiColors[ColCount].rgbBlue = BLut[i];
BitInfo->bmiColors[ColCount].rgbGreen = GLut[i];
BitInfo->bmiColors[ColCount].rgbRed = RLut[i];
BitInfo->bmiColors[ColCount].rgbReserved = 0;
ColCount++;
}
Palette->palNumEntries = ColCount;
BitInfo->bmiHeader.biClrUsed = ColCount;
ColourMap = CreatePalette(Palette);
for( i=0; i<256; i++ )
if( ULut[i] )
{ ref = RGB(RLut[i],GLut[i],BLut[i]);
Lut[i] = GetNearestPaletteIndex(ColourMap,ref);
}
}
int CreateImage()
{
register Long size;
if( FBufHandle ) GlobalFree(FBufHandle);
size = (Long)XRange*YRange*sizeof(Pixel)+16;
FBufHandle = GlobalAlloc(GMEM_MOVEABLE,size);
return( (int)FBufHandle );
}
void TransferImage()
{
HPALETTE OldCMap;
HDC hDC;
if( PixMap )
DeleteObject(PixMap);
BitInfo->bmiHeader.biWidth = XRange;
BitInfo->bmiHeader.biHeight = YRange;
hDC = GetDC(NULL);
FBuffer = (Pixel __huge*)GlobalLock(FBufHandle);
/* CreateBitMap(XRange,YRange,1,8,FBuffer); */
if( ColourMap )
{ OldCMap = SelectPalette(hDC,ColourMap,FALSE);
RealizePalette(hDC); /* GDI Bug?? */
}
PixMap = CreateDIBitmap( hDC, (BITMAPINFOHEADER __far *)BitInfo,
CBM_INIT, FBuffer, BitInfo, DIB_RGB_COLORS);
if( ColourMap && OldCMap )
SelectPalette(hDC,OldCMap,False);
GlobalUnlock(FBufHandle);
ReleaseDC(NULL,hDC);
InvalidateRect(CanvWin,NULL,FALSE);
UpdateWindow(CanvWin);
}
void ClearImage()
{
RECT rect;
HDC hDC;
hDC = GetDC(CanvWin);
GetClientRect(CanvWin,&rect);
FillRect(hDC,&rect,GetStockObject(BLACK_BRUSH));
ReleaseDC(CanvWin,hDC);
if( PixMap )
{ DeleteObject(PixMap);
PixMap = NULL;
}
}
int PrintImage()
{
register char *device, *driver, *output;
register int xsize, ysize, xres, yres;
register int dx, dy, caps;
char printer[80];
DOCINFO info;
RECT rect;
HDC hDC;
GetProfileString("windows","device", "", printer, 80 );
if( !(device = strtok(printer,",")) ) return( False );
if( !(driver = strtok((char*)NULL,", ")) ) return( False );
if( !(output = strtok((char*)NULL,", ")) ) return( False );
hDC = CreateDC(driver,device,output,NULL);
if( !hDC ) return( False );
caps = GetDeviceCaps( hDC, RASTERCAPS );
if( !(caps & RC_STRETCHDIB) ) return( False );
xres = GetDeviceCaps( hDC, LOGPIXELSX );
yres = GetDeviceCaps( hDC, LOGPIXELSY );
xsize = GetDeviceCaps( hDC, HORZRES );
ysize = GetDeviceCaps( hDC, VERTRES );
dx = xsize - xres;
dy = (int)(((long)dx*YRange)/XRange);
/* Should set printer abort procedure */
/* Position Image on Printed Page */
rect.top = yres; rect.bottom = rect.top + dy;
rect.left = xres>>1; rect.right = rect.left + dx;
Escape( hDC, SET_BOUNDS, sizeof(RECT), (char __far*)&rect, NULL );
/* Start RasWin Document */
info.cbSize = sizeof(DOCINFO);
info.lpszDocName = "RasWin";
info.lpszOutput = NULL;
StartDoc( hDC, &info );
StartPage( hDC );
BitInfo->bmiHeader.biWidth = XRange;
BitInfo->bmiHeader.biHeight = YRange;
FBuffer = (Pixel __huge*)GlobalLock(FBufHandle);
StretchDIBits( hDC, xres>>1, yres, dx, dy,
0, 0, XRange, YRange,
FBuffer, BitInfo, DIB_RGB_COLORS, SRCCOPY );
GlobalUnlock(FBufHandle);
EndPage( hDC );
EndDoc( hDC );
DeleteDC( hDC );
return( True );
}
int ClipboardImage()
{
register BITMAPINFO __far *bitmap;
register char __huge *src;
register char __huge *dst;
register long size,len;
register HANDLE hand;
register int i;
if( OpenClipboard(CanvWin) )
{ EmptyClipboard();
/* SetClipboardData(CF_DIB,NULL); */
/* SetClipboardData(CF_PALETTE,NULL); */
if( PixMap )
{ len = (long)XRange*YRange*sizeof(Pixel);
size = sizeof(BITMAPINFOHEADER) + 256*sizeof(RGBQUAD);
if( (hand=GlobalAlloc(GHND,size+len)) )
{ bitmap = (BITMAPINFO __far *)GlobalLock(hand);
bitmap->bmiHeader.biSize = sizeof(BITMAPINFOHEADER);
bitmap->bmiHeader.biWidth = XRange;
bitmap->bmiHeader.biHeight = YRange;
bitmap->bmiHeader.biPlanes = 1;
bitmap->bmiHeader.biBitCount = 8;
bitmap->bmiHeader.biCompression = BI_RGB;
bitmap->bmiHeader.biSizeImage = len;
bitmap->bmiHeader.biXPelsPerMeter = 0;
bitmap->bmiHeader.biYPelsPerMeter = 0;
bitmap->bmiHeader.biClrImportant = 0;
bitmap->bmiHeader.biClrUsed = 0;
for( i=0; i<256; i++ )
if( ULut[i] )
{ bitmap->bmiColors[Lut[i]].rgbBlue = BLut[i];
bitmap->bmiColors[Lut[i]].rgbGreen = GLut[i];
bitmap->bmiColors[Lut[i]].rgbRed = RLut[i];
}
src = (Pixel __huge*)GlobalLock(FBufHandle);
dst = ((Pixel __huge*)bitmap)+size;
/* Transfer the frame buffer */
while( len-- ) *dst++ = *src++;
GlobalUnlock(FBufHandle);
GlobalUnlock(hand);
SetClipboardData(CF_DIB,hand);
}
}
if( ColourMap )
{ if( (hand = CreatePalette(Palette)) )
SetClipboardData(CF_PALETTE,hand);
}
CloseClipboard();
return( True );
} else return( False );
}
void UpdateScrollBars()
{
register int pos;
pos = 50-(int)(50.0*DialValue[0]);
SetScrollPos(CanvWin,SB_VERT,pos,TRUE);
pos = (int)(50.0*DialValue[1])+50;
SetScrollPos(CanvWin,SB_HORZ,pos,TRUE);
}
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;
{
if( flag )
{ SetMenu(CanvWin,hMenu);
} else SetMenu(CanvWin,0);
DisableMenu = !flag;
}
int OpenDisplay( instance, mode )
HANDLE instance; int mode;
{
register int i,size;
long style;
RECT rect;
PixMap = NULL;
ColourMap = NULL;
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 = InitialWide; WRange = XRange>>1;
YRange = InitialHigh; HRange = YRange>>1;
Range = MinFun(XRange,YRange);
rect.top = 0; rect.bottom = YRange;
rect.left = 0; rect.right = XRange;
style = WS_OVERLAPPEDWINDOW | WS_HSCROLL | WS_VSCROLL;
hMenu = LoadMenu(instance,"RasWinMenu");
AdjustWindowRect(&rect,style,TRUE);
CanvWin = CreateWindow("RasWinClass","RasMol Version 2.5", style,
CW_USEDEFAULT, CW_USEDEFAULT,
rect.right-rect.left,
rect.bottom-rect.top,
NULL,hMenu,instance,NULL);
WaitCursor = LoadCursor(NULL,IDC_WAIT);
size = sizeof(LOGPALETTE) + 256*sizeof(PALETTEENTRY);
Palette = (LOGPALETTE __far*)_fmalloc( size );
size = sizeof(BITMAPINFOHEADER) + 256*sizeof(RGBQUAD);
BitInfo = (BITMAPINFO __far*)_fmalloc( size );
if( !CanvWin || !Palette || !BitInfo )
return( False );
Palette->palVersion = 0x300;
BitInfo->bmiHeader.biSize = sizeof(BITMAPINFOHEADER);
BitInfo->bmiHeader.biCompression = BI_RGB;
BitInfo->bmiHeader.biXPelsPerMeter = 0;
BitInfo->bmiHeader.biYPelsPerMeter = 0;
BitInfo->bmiHeader.biClrImportant = 0;
BitInfo->bmiHeader.biSizeImage = 0;
BitInfo->bmiHeader.biBitCount = 8;
BitInfo->bmiHeader.biPlanes = 1;
/* Initialise Palette! */
for( i=1; i<256; i++ )
ULut[i] = False;
AllocateColourMap();
ShowWindow(CanvWin,mode);
UpdateScrollBars();
UpdateWindow(CanvWin);
return(True);
}
void BeginWait()
{
if( UseHourGlass )
OldCursor = SetCursor(WaitCursor);
}
void EndWait()
{
if( UseHourGlass )
SetCursor(OldCursor);
}
void CloseDisplay()
{
if( ColourMap )
DeleteObject(ColourMap);
if( PixMap )
DeleteObject(PixMap);
}
|