CCL Home Page
Up Directory CCL mswin31
/* 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);
}

Modified: Mon Oct 24 16:00:00 1994 GMT
Page accessed 6552 times since Sat Apr 17 21:38:24 1999 GMT