841 lines
36 KiB
C
Raw Normal View History

2001-01-01 00:00:00 +01:00
/*
This is a dynamic link library that runs under Windows 3.00. Duties of
this library include saving screen image to a file, retrieving screen
image from file & displaying it on screen, and comparing two screen
images.
Routines in this module are responsible for copying screen image to the
clipboard or saving the image to a bitmap file (in Device-Independent
format).
For the usage of this libray, please refer to the WattScr user's guide,
WattScrU.doc. For the technical information, please refer to the
WattScr maintenance's guide, WattScrT.doc.
Revision History:
[ 0] 18-Apr-1990 AngelaCh: Created program
[ 1] 04-Map-1990 AngelaCh: added checking for existence
of DIB file
[ 2] 10-Map-1990 AngelaCh: initial fssScreen if saving
image clipboard or DIB
(bug #66)
[ 3] 03-Jul-1990 AngelaCh: added support for Video 7
and 8515/a (bug #64)
[ 4] 18-Jul-1991 DavidSc: Added WattDrvr TRAP support
******************************************************************************/
#include "windows.h"
#include <port1632.h>
#include "dump.h"
/******************************************************************************
* PURPOSE: Copy the image of a bitmap into the clipboard *
* RETURN: 0 will be returned if image is copied successfully *
* GLOBALS: None *
* CONDITIONS:hwnd is the valid handle to a window *
* bhm is valid handle to a bitmap *
******************************************************************************/
INT PRIVATE fCopyToCB(hwnd, hbm)
HWND hwnd ; /* handle of a window */
HBITMAP hbm ; /* handle of a device-dep bitmap */
{
if ( !(OpenClipboard(hwnd)) ) /* if clipboard is opened by another */
return OpenCB ; /* application */
if ( !(EmptyClipboard()) ) /* if existing data in clipboard is */
{ /* locked */
CloseClipboard () ;
return EmptyCB ;
}
if ( !(SetClipboardData(CF_BITMAP, hbm)) ) /* copy image to clipboard */
{
CloseClipboard () ;
return CopyToCB ;
}
if ( !(CloseClipboard()) )
return CloseCB ;
return NoError ;
}
/******************************************************************************
* PURPOSE: This is called everytime a request is received to copy the image*
* of a screen region onto the clipboard *
* RETURN: 0 will be returned if image is copied to the clipboard *
* GLOBALS: None *
* CONDITIONS:rnIn defines a screen region whose image will be copied to the *
* clipboard *
* hFlag is valid (0 no need to hide the calling app's window) *
******************************************************************************/
INT FARPUBLIC fDumpSrnToClipActivate(OpenKeys,CloseKeys,rnIn, hFlag)
LPSTR OpenKeys; /* keys to activate something */
LPSTR CloseKeys; /* keys to deactivate something */
REN FAR *rnIn ; /* coord of a screen region */
INT hFlag ; /* if window of the calling app needs
to be hidden */
{
INT ret;
HWND hWndCallingApp ; /* window of the calling application */
if ( hFlag && !(hWndCallingApp = HideApp()) )
return ErrorTrap(HideWin) ; /* can't hide the window */
if (LoadTESTEVT())
return ErrorTrap(LibLoadErr);
if (OpenKeys)
{
DoKeys(OpenKeys);
/* do some yields to allow keys to get to app and some time for it
** to respond.
*/
yield(); yield(); yield(); yield(); yield();
}
ret = fDumpSrnToClip(rnIn, FALSE);
if (CloseKeys)
DoKeys(CloseKeys);
if ( hFlag ) /* restore window of the calling app */
RestoreApp(hWndCallingApp) ;
FreeTESTEVT();
return NoTrap(ret);
}
/******************************************************************************
* PURPOSE: This is called everytime a request is received to copy the image*
* of a screen region onto the clipboard *
* RETURN: 0 will be returned if image is copied to the clipboard *
* GLOBALS: None *
* CONDITIONS:rnIn defines a screen region whose image will be copied to the *
* clipboard *
* hFlag is valid (0 no need to hide the calling app's window) *
******************************************************************************/
INT FARPUBLIC fDumpSrnToClip(rnIn, hFlag)
REN FAR *rnIn ; /* coord of a screen region */
INT hFlag ; /* if window of the calling app needs
to be hidden */
{
HWND hWndCallingApp ; /* window of the calling application */
HBITMAP hBitmap ; /* handle of a device-dep bitmap */
REN rn ;
INT i ;
rn = *rnIn ;
fssScreen.cscr = 0 ; /* no image has been saved [2] */
if ( (i = fGetScreenParams(&rn)) != 0 ) /* check if screen region is */
return ErrorTrap(i) ; /* valid */
if ( hFlag ) /* need to hide window of the */
{ /* calling application */
if ( !(hWndCallingApp = HideApp()) )
return ErrorTrap(HideWin) ; /* can't hide the window */
}
else /* otherwise, obtain the handle */
{ /* of the current active window */
// BabakJ: API changed
// if ( !(hWndCallingApp = GetActiveWindow()) )
if ( !(hWndCallingApp = GetForegroundWindow()) )
return ErrorTrap(InValWHand) ;
}
/* get a bitmap representing a */
if ( !(hBitmap = GetBMap(rn.col, rn.row, rn.width, rn.height)) )
return ErrorTrap(CreateDDB) ; /* screen region */
i = fCopyToCB(hWndCallingApp, hBitmap) ; /* copy image to the clipboard */
if ( hFlag ) /* restore window of the calling app */
RestoreApp(hWndCallingApp) ;
return ErrorTrap(i) ;
}
/******************************************************************************
* PURPOSE: This is called everytime a request is receieved to copy the *
* image of a window to the clipboard *
* RETURN: 0 will be returned if image is copied to the clipboard *
* GLOBALS: None *
* CONDITIONS:hWnd is a valid handle (Null is handle of the current active *
* window) *
* hFlag is valid (0 no need to hide the calling app's window) *
******************************************************************************/
INT FARPUBLIC fDumpWndToClipActivate(OpenKeys, CloseKeys, hFlag)
LPSTR OpenKeys ; /* dokeys string to bring up window */
LPSTR CloseKeys ; /* dokeys string to remove window */
INT hFlag ; /* if window of the calling app needs
to be hidden */
{
INT ret;
HWND hWndCallingApp ; /* window of the calling application */
if ( hFlag && !(hWndCallingApp = HideApp()) ) /* application first */
return ErrorTrap(HideWin) ;
if (LoadTESTEVT())
return ErrorTrap(LibLoadErr);
if (OpenKeys)
{
DoKeys(OpenKeys);
/* do some yields to allow keys to get to app and some time for it
** to respond.
*/
yield(); yield(); yield(); yield(); yield();
}
ret = fDumpWndToClip(NULL, FALSE);
if (CloseKeys)
DoKeys(CloseKeys);
if ( hFlag ) /* if window has been hidded */
RestoreApp(hWndCallingApp) ; /* restore it */
FreeTESTEVT();
return NoTrap(ret);
}
/******************************************************************************
* PURPOSE: This is called everytime a request is receieved to copy the *
* image of a window to the clipboard *
* RETURN: 0 will be returned if image is copied to the clipboard *
* GLOBALS: None *
* CONDITIONS:hWnd is a valid handle (Null is handle of the current active *
* window) *
* hFlag is valid (0 no need to hide the calling app's window) *
******************************************************************************/
INT FARPUBLIC fDumpWndToClip(hwnd, hFlag)
HWND hwnd ; /* handle of a particular window */
INT hFlag ; /* if window of the calling app needs
to be hidden */
{
REN rn ; /* coord of the window in concern */
HWND hWndCallingApp ; /* window of the calling application */
HBITMAP hBitmap ; /* handle of a device-dep bitmap */
INT i ;
if( FWinTrapCheckAndTrap( hwnd ))
return ErrorTrap(InValWHand) ;
// BabakJ: API changed
// if ( !(hWndCallingApp = GetActiveWindow()) ) /* obtain the handle */
if ( !(hWndCallingApp = GetForegroundWindow()) ) /* obtain the handle */
return ErrorTrap(InValWHand) ; /* of the current active window */
if ( !hwnd ) /* if handle of the window is unknown */
{ /* assume that it is the window of */
if ( hFlag ) /* the current active window */
{ /* need to hide window of the calling */
if ( !(hWndCallingApp = HideApp()) ) /* application first */
return ErrorTrap(HideWin) ;
}
// BabakJ: API changed
// hwnd = GetActiveWindow() ; /* get handle of the active window */
hwnd = GetForegroundWindow() ; /* get handle of the active window */
}
GetWindowRect(hwnd, (LPRECT)&rn) ; /* determine the coord of the window */
/* subtract 1 pixel from the lower- */
rn.width-- ; /* right corner - it seems that it */
rn.height--; /* returns 1 pixel many to the right */
/* and on the bottom */
fssScreen.cscr = 0 ; /* no image has been saved [2] */
if ( (i = fGetScreenParams((REN FAR *)&rn)) != 0 ) /* convert 2 pairs of */
return ErrorTrap(i) ; /* coord to upper-left, width, height */
if ( !(hBitmap = GetBMap(rn.col, rn.row, rn.width, rn.height)) )
return ErrorTrap(CreateDDB) ; /* create bitmap that represents the */
/* currently active window */
i = fCopyToCB(hWndCallingApp, hBitmap) ; /* copy image to the clipboard */
if ( hFlag ) /* if window has been hidded */
RestoreApp(hWndCallingApp) ; /* restore it */
return ErrorTrap(i) ;
}
/******************************************************************************
* PURPOSE: Create a bitmap in device-dependent format from a device- *
* independent bitmap *
* RETURN: Handle of the device-dependent bitmap if succeed *
* GLOBALS: fssScreen *
* CONDITIONS:fd is a valid file handle *
* pscr is pointing to a particular screen table *
******************************************************************************/
HBITMAP PRIVATE SetDiBToBM(fd, pscr)
FD fd ; /* handle to the screen file */
SCR *pscr ; /* pointer of a screen table */
{
LPBITMAPINFOHEADER lpbi ; /* point to the DiBitmap header */
BITMAPINFOHEADER bi ; /* header of a DiBitmap */
GLOBALHANDLE hGlobalMemory ; /* handle of a global memory area */
HBITMAP hbm ; /* handle of the DDBitmap */
HPALETTE hPalO ; /* handle of the existing color pal */
LPSTR lp ;
HDC hDC ;
INT oHeight, nHeight ;
INT y ;
INT IsComp ;
LONG fb ;
WORD cb ;
INT nStart ;
INT i = 0 , j = NoError ;
hDC = CreateDC("DISPLAY", NULL, NULL, NULL) ;
hbm = CreateCompatibleBitmap(hDC, pscr->ren.width, pscr->ren.height) ;
if ( IsPalDev ) /* this is a palette device, need */
{ /* to obtain a logical palette which */
hPal = CreatePalFromDIB(); /* represents the available colours */
/* [3] */
if ( hPal ) /* logical color palette is available */
{
hPalO = SelectPalette(hDC, hPal, FALSE) ;
RealizePalette(hDC) ;
}
else
// BabakJ: Casted the constant return code to prevent warning
return( (HBITMAP)CreatePal ); /* error in creating logical pal */
}
fb = sizeof(BITMAPINFOHEADER) + fssScreen.ClrUse + MaxSize ;
hGlobalMemory = GlobalAlloc (GMEM_MOVEABLE | GMEM_DISCARDABLE, fb) ;
if ( !hGlobalMemory ) /* no memory is allocated */
j = OutOMemory ;
else
{
lpbi = (LPBITMAPINFOHEADER) GlobalLock (hGlobalMemory) ;
lp = (LPSTR)lpbi+(WORD)sizeof(BITMAPINFOHEADER)+(WORD)fssScreen.ClrUse ;
oHeight = pscr->ren.height ;
y = 0 ;
nStart = oHeight ;
do /* read in bitmap as different 64k */
{ /* sub-bitmaps if the original image */
if ( pscr->cb[i] ) /* is saved as different sub-bitmaps */
{
nHeight = (INT)oHeight / (MaxCb-i) ;
IsComp = (1<<(i % 16)) & pscr->cbComp[i>>4] ; /* info about */
/* compression [3] */
cb = ReadDibBytes((LPSTR)lpbi, fd, pscr->ren.width, nHeight, pscr->cb[i], IsComp) ;
if ( !cb ) /* unsuccessfully reading the bytes */
j = ReadSrnFil ;
else
{ /* cb = actual size of the sub-bitmap */
pscr->cb[i] = cb ; /* need to paste the sub-bitmap whose */
nStart -= nHeight ; /* origin is lower-left bottom up */
bi = *lpbi ; /* also need to specify the height */
bi.biHeight = pscr->ren.height ; /* of the entire bitmap */
*lpbi = bi ;
/* get a DDB from a DIB */
if ( !(SetDIBits(hDC, hbm, nStart, (WORD)nHeight, lp,
(LPBITMAPINFO)lpbi, DIB_RGB_COLORS)) )
j = CreateDDB ; /* DDB from the DIB */
}
oHeight -= nHeight ;
y += nHeight ;
} /* if ( pscr->cb[i] ) */
i++ ;
} while (i < MaxCb && j == 0 ) ;
} /* if ( !hGlobalMemory ) */
if ( IsPalDev )
{
SelectPalette(hDC, hPalO, FALSE) ; /* restore old color palette */
DeleteObject(hPal) ;
}
DeleteDC(hDC) ; /* release memory before return */
if ( GlobalUnlock(hGlobalMemory) ) /* problem in releasing */
j = RelMemory ; /* memories */
if ( GlobalFree(hGlobalMemory) )
j = RelMemory ;
if ( j )
{
DeleteObject(hbm) ;
hbm = NULL ;
}
return hbm ;
}
/******************************************************************************
* PURPOSE: This is called everytime a request is receieved to copy the *
* image of a screen region that is stored in a screen file to *
* the clipboard *
* RETURN: 0 will be returned if image is copied to the clipboard *
* GLOBALS: None *
* CONDITIONS:FileName is name of file in correct format (8.3) *
* nscr is valid (> 0) *
******************************************************************************/
INT FARPUBLIC fDumpFileToClip(FileName, nscr)
LPSTR FileName ; /* name of the screen file */
INT nscr ; /* identify which screen to copy */
{
HBITMAP hBitmap ; /* handle of a device-dep bitmap */
HWND hWnd ; /* handle of a window */
FD fdScreen = fdNull ; /* handle of a file */
INT i ;
if ( (i = ProcessSrnFile(FileName, &fdScreen, nscr, omRead)) != 0 )
return ErrorTrap(i) ; /* open and read the screen file */
if ( DetermineMode(&i, &i) != fssScreen.vmd ) /* check video mode */
{
M_lclose(fdScreen) ;
return ErrorTrap(InValSrnMd) ;
}
/* read file and convert the bitmap to Device-Dependent format */
if ( !(hBitmap = SetDiBToBM(fdScreen, &rgscr[nscr-1])) )
return ErrorTrap(CreateDDB) ;
// BabakJ: API changed
// if ( !(hWnd = GetActiveWindow()) ) /* obtain the handle */
if ( !(hWnd = GetForegroundWindow()) ) /* obtain the handle */
return ErrorTrap(InValWHand) ; /* of the current active window */
return ErrorTrap(fCopyToCB(hWnd, hBitmap)) ; /* copy image to clipboard */
}
/******************************************************************************
* PURPOSE: Extract screen image from a screen file and save the image as *
* a Device-Independent Bitmap *
* RETURN: 0 will be returned if image is saved successfully *
* GLOBALS: None *
* CONDITIONS:fdIn and fdOut are valid file handles *
* pscr is pointer to the screen table corresponding to the screen *
* image to be saved *
******************************************************************************/
INT PRIVATE fWriteToDIB(fdIn, fdOut, pscr)
FD fdIn ; /* file handle of the input file */
FD fdOut ; /* file handle of the output file */
SCR *pscr ; /* pointer to the screen table */
{
GLOBALHANDLE hGMemIn ; /* handle of a global memory area */
GLOBALHANDLE hGMemOut ;
LPSTR lpIn ; /* pointer to the global memory area */
LPSTR lpOut ;
WORD cb ; /* number of bytes written */
LFO lfo ;
INT i ;
INT j = 0 ;
INT k ;
i = MaxCb - 1 ;
do /* copy bytes in at most 64K block */
{
if ( pscr->cb[i] ) /* if bytes exists */
{ /* allocate memory for reading data */
k = 0 ;
lfo = pscr->lfo ; /* origin of image store in file is */
while ( k < i ) /* the upper-left corner; however, */
lfo += (LFO)pscr->cb[k++] ; /* origin of a device-independent */
if ( M_llseek(fdIn, lfo, smFromBegin) != (LONG2DWORD)lfo ) /* bitmap is the */
j = ReadSrnFil ; /* lower left corner, so need to */
else /* move all the bytes from the */
{ /* bottom up */
hGMemIn = GlobalAlloc(GMEM_MOVEABLE | GMEM_DISCARDABLE, (DWORD)pscr->cb[i]) ;
if ( !hGMemIn ) /* no memory is available */
j = OutOMemory ;
else
{
lpIn = (LPSTR) GlobalLock(hGMemIn) ;
if ( M_lread(fdIn, lpIn, pscr->cb[i]) != (UINT)pscr->cb[i] )
j = ReadSrnFil ;
else
{
if ( (1 << (i % 16)) & pscr->cbComp[i>>4] ) /* compression's */
{ /* been performed need to decompress the data [3] */
hGMemOut = GlobalAlloc(GMEM_MOVEABLE | GMEM_DISCARDABLE, (DWORD)MaxSize) ;
if ( !hGMemOut ) /* first; so allocate memory for */
j = OutOMemory ; /* the decompressed data */
else
{
lpOut = (LPSTR) GlobalLock(hGMemOut) ;
cb = DeCompressBytes(lpIn, lpOut, pscr->cb[i]) ;
// Babakj: Bypassed compression by replacing lpOut with lpIn
// if ( M_lwrite(fdOut, lpOut, cb) != (UINT)cb )
if ( M_lwrite(fdOut, lpIn, cb) != (UINT)cb )
j = WSrnImage ;
pscr->cb[i] = cb ; /* actual size of the bitmap */
if ( GlobalUnlock(hGMemOut) || GlobalFree(hGMemOut) )
j = RelMemory ;
} /* if ( !hGMemOut ) */
} /* if ( 1 << i ) */
else /* no de-compression need to be */
if ( M_lwrite(fdOut, lpIn, pscr->cb[i]) != (UINT)pscr->cb[i] )
j = WSrnImage ; /* performed, copy the bytes */
} /* directly */
if ( GlobalUnlock(hGMemIn) || GlobalFree(hGMemIn) )
j = RelMemory ;
} /* if ( !hGMemIn ) */
} /* if LSeek */
} /* if pscr->cb[i] */
i-- ;
} while ( i >= 0 && j == 0 ) ;
return j ;
}
/******************************************************************************
* PURPOSE: Write header of the device-indpendent bitmap file to a bitmap *
* file before closing that file *
* RETURN: 0 will be returned if header is written to the file successfully*
* GLOBALS: None *
* CONDITIONS:fdIn and fdOut are valid file handles *
* pscr is pointer to the screen table corresponding to the screen *
* image to be copied *
******************************************************************************/
INT PRIVATE fCloseDIB(fd, pscr)
FD fd ; /* file handle of the DI-Bitmap file */
SCR *pscr ; /* pointer to the screen table */
{
BITMAPFILEHEADER bf ; /* header of the DI-bitmap file */
BITMAPINFOHEADER bi ; /* header of the DI-bitmap info */
DWORD lInfo ; /* size of headers + colour tables */
DWORD lfo = 0 ; /* size of bitmap bytes */
INT i ;
for (i = 0 ; i < MaxCb ; i++) /* size of the array representing */
lfo += (DWORD)pscr->cb[i] ; /* bytes of the bitmap */
lInfo = (DWORD)sizeof(BITMAPFILEHEADER)+sizeof(BITMAPINFOHEADER)+fssScreen.ClrUse ;
/* fill in information about the type, size and layout of the device
independent bitmap */
bf.bfType = (WORD) DIBid ; /* file type = BM */
bf.bfSize = lInfo + lfo ; /* file size = size of info + bytes */
bf.bfReserved1 = 0 ;
bf.bfReserved2 = 0 ;
bf.bfOffBits = lInfo ; /* offset to bytes = size of info */
/* fill in information about the dimension and colour format of the
device-independent bitmap */
bi.biSize = (DWORD)sizeof(BITMAPINFOHEADER) ; /* size of the info header */
bi.biWidth = (DWORD)pscr->ren.width ; /* width of bitmap */
bi.biHeight = (DWORD)pscr->ren.height ; /* height of bitmap */
bi.biPlanes = dbiPlanes ; /* number of planes - must be 1 */
bi.biBitCount = fssScreen.BitCount ;/* no of bit per pixel */
bi.biCompression = (DWORD)MaxComp ; /* Max compression style */
bi.biSizeImage = lfo ; /* size of the bitmap */
bi.biXPelsPerMeter = 0 ;
bi.biYPelsPerMeter = 0 ;
bi.biClrUsed = (DWORD)fssScreen.ClrUse / sizeof(RGBQUAD) ;
bi.biClrImportant = 0 ;
M_llseek(fd, 0L, smFromBegin) ; /* go the the beginning of file */
if ( M_lwrite(fd, (LPSTR)&bf, sizeof(BITMAPFILEHEADER)) != (UINT)sizeof(BITMAPFILEHEADER) )
{ /* and write out headers */
M_lclose(fd) ;
return WFileHead ;
}
if ( M_lwrite(fd, (LPSTR)&bi, sizeof(BITMAPINFOHEADER)) != (UINT)sizeof(BITMAPINFOHEADER) )
{
M_lclose(fd) ;
return WFileHead ;
}
M_lclose(fd) ;
return NoError ;
}
/******************************************************************************
* PURPOSE: This is called everytime a request is receieved to save a screen*
* image to a file in straight Device-Independent Bitmap format *
* RETURN: 0 will be returned if image is copied to the file successfully *
* GLOBALS: None *
* CONDITIONS:FileName is name of file in correct format (8.3) *
* rn defines a screen region whose image will be saved to file *
* hFlag is valid (0 no need to hide the calling app's window) *
******************************************************************************/
INT FARPUBLIC fSaveSrnToDIBActivate(FileName, OpenKeys,CloseKeys,rn, hFlag)
LPSTR FileName ; /* name of the bitmap file */
LPSTR OpenKeys; /* keys to activate something */
LPSTR CloseKeys; /* keys to deactivate something */
REN FAR *rn ; /* coord of a screen region */
INT hFlag ; /* need to hide wnd of calling app? */
{
INT ret;
HWND hWndCallingApp ; /* window of the calling application */
if ( hFlag && !(hWndCallingApp = HideApp()) ) /* application first */
return ErrorTrap(HideWin) ;
if (LoadTESTEVT())
return ErrorTrap(LibLoadErr);
if (OpenKeys)
{
DoKeys(OpenKeys);
/* do some yields to allow keys to get to app and some time for it
** to respond.
*/
yield(); yield(); yield(); yield(); yield();
}
ret = fSaveSrnToDIB(FileName,rn, FALSE);
if (CloseKeys)
DoKeys(CloseKeys);
if ( hFlag ) /* if window has been hidded */
RestoreApp(hWndCallingApp) ; /* restore it */
FreeTESTEVT();
return NoTrap(ret);
}
/******************************************************************************
* PURPOSE: This is called everytime a request is receieved to save a screen*
* image to a file in straight Device-Independent Bitmap format *
* RETURN: 0 will be returned if image is copied to the file successfully *
* GLOBALS: None *
* CONDITIONS:FileName is name of file in correct format (8.3) *
* rn defines a screen region whose image will be saved to file *
* hFlag is valid (0 no need to hide the calling app's window) *
******************************************************************************/
INT FARPUBLIC fSaveSrnToDIB(FileName, rn, hFlag)
LPSTR FileName ; /* name of the bitmap file */
REN FAR *rn ; /* coord of a screen region */
INT hFlag ; /* need to hide wnd of calling app? */
{
FD fdScreen = fdNull ; /* handle of the output file */
INT fFlag = DIBFirst ; /* type of file is DIB */
INT i ;
if ( (fdScreen = M_lopen(FileName,omRead)) != fdNull ) /* [1] */
{
M_lclose(fdScreen) ; /* file already exists */
return ErrorTrap(FileExist) ;
}
if ( (fdScreen = M_lcreat(FileName, 0)) == fdNull ) /* create output file */
return ErrorTrap(FileAccess) ;
fssScreen.cscr = 0 ; /* no image has been saved [2] */
rgscr[0].ren = *rn ;
rgscr[0].lfo = (LFO)sizeof(BITMAPFILEHEADER) + sizeof(BITMAPINFOHEADER) ;
/* write data to output file */
if ( (i = fAddScreen(fdScreen, &rgscr[0], hFlag, &fFlag)) != 0 )
{
M_lclose(fdScreen) ;
return ErrorTrap(i) ;
}
return ErrorTrap( fCloseDIB(fdScreen, &rgscr[0]) ) ; /* close file */
}
/******************************************************************************
* PURPOSE: This is called everytime a request is receieved to save image of*
* a window to file in straight Device-Independent Bitmap format *
* RETURN: 0 will be returned if image is copied to the file successfully *
* GLOBALS: None *
* CONDITIONS:FileName is name of file in correct format (8.3) *
* hwnd is valid handle of window *
* hFlag is valid (0 no need to hide the calling app's window) *
******************************************************************************/
INT FARPUBLIC fSaveWndToDIBActivate(FileName, OpenKeys, CloseKeys, hFlag)
LPSTR FileName ; /* name of the bitmap file */
LPSTR OpenKeys ; /* dokeys string to bring up window */
LPSTR CloseKeys ; /* dokeys string to remove window */
INT hFlag ; /* need to hide wnd of calling app? */
{
INT ret;
HWND hWndCallingApp ; /* window of the calling application */
if ( hFlag && !(hWndCallingApp = HideApp()) ) /* application first */
return ErrorTrap(HideWin) ;
if (LoadTESTEVT())
return ErrorTrap(LibLoadErr);
if (OpenKeys)
{
DoKeys(OpenKeys);
/* do some yields to allow keys to get to app and some time for it
** to respond.
*/
yield(); yield(); yield(); yield(); yield();
}
ret = fSaveWndToDIB(FileName,NULL, FALSE);
if (CloseKeys)
DoKeys(CloseKeys);
if ( hFlag ) /* if window has been hidded */
RestoreApp(hWndCallingApp) ; /* restore it */
FreeTESTEVT();
return NoTrap(ret);
}
/******************************************************************************
* PURPOSE: This is called everytime a request is receieved to save image of*
* a window to file in straight Device-Independent Bitmap format *
* RETURN: 0 will be returned if image is copied to the file successfully *
* GLOBALS: None *
* CONDITIONS:FileName is name of file in correct format (8.3) *
* hwnd is valid handle of window *
* hFlag is valid (0 no need to hide the calling app's window) *
******************************************************************************/
INT FARPUBLIC fSaveWndToDIB(FileName, hWnd, hFlag)
LPSTR FileName ; /* name of the bitmap file */
HWND hWnd ; /* handle of a window */
INT hFlag ; /* need to hide wnd of calling app? */
{
REN rn ; /* store coordinates of the window */
HWND hWndCallingApp = NULL ; /* handle of the calling app's window */
INT i ;
if( FWinTrapCheckAndTrap( hWnd ) )
return ErrorTrap(InValWHand) ;
/* get dimenions of the active window */
if ( (i = fGetWndDim(hWnd, &hWndCallingApp, &hFlag, (REN FAR *)&rn)) != 0 )
return ErrorTrap(i) ;
i = fSaveSrnToDIB(FileName, (REN FAR *)&rn, hFlag) ;
/* take picture of the screen region */
if ( hWndCallingApp ) /* need to restore the calling app's */
RestoreApp(hWndCallingApp) ; /* window if it has been hidden */
return NoTrap(i) ; // EventError already called in fSaveSrnToDIB
}
/******************************************************************************
* PURPOSE: This is called everytime a request is receieved to copy the *
* image of a screen region that is stored in a screen file to*
* another file in straight Device-Independent Bitmap format *
* RETURN: 0 will be returned if image is copied to the file successfully *
* GLOBALS: None *
* CONDITIONS:FileIn and FileOut are names of files in correct format (8.3) *
* nscr is valid (> 0) *
******************************************************************************/
INT FARPUBLIC fSaveFileToDIB(FileIn, nscr, FileOut)
LPSTR FileIn; /* name of the screen file */
INT nscr ; /* identify which screen to copy */
LPSTR FileOut ; /* name of bitmap file */
{
FD fdIn ; /* file handle of the input file */
FD fdOut = fdNull ; /* file handle of the output file */
LFO lfo ;
INT i ;
/* validate input file */
if ( (i = ProcessSrnFile(FileIn, &fdIn, nscr, omRead)) != 0)
return ErrorTrap(i) ;
if ( DetermineMode(&i, &i) != fssScreen.vmd ) /* validate screen mode */
{
M_lclose(fdIn) ;
return ErrorTrap(InValSrnMd) ;
}
if ( (fdOut = M_lopen(FileOut,omRead)) != fdNull ) /* [1] */
{
M_lclose(fdIn) ; /* file already exists */
M_lclose(fdOut) ;
return ErrorTrap(FileExist) ;
}
if ( (fdOut = M_lcreat(FileOut, 0)) == fdNull ) /* create bitmap file */
{
M_lclose(fdIn) ;
return ErrorTrap(FileAccess) ;
}
/* move pass the header for writing */
lfo = (LFO) sizeof(BITMAPFILEHEADER) + sizeof(BITMAPINFOHEADER) ;
if ( M_llseek(fdOut, lfo, smFromBegin) != (LONG2DWORD)lfo ) /* the colour table */
{
M_lclose(fdIn) ;
M_lclose(fdOut) ;
return ErrorTrap(RWColTable) ;
}
if ( M_lwrite(fdOut, (LPSTR)ClrTab, fssScreen.ClrUse) != (UINT)fssScreen.ClrUse )
{ /* write information about the colour */
M_lclose(fdIn) ; /* of the Device-Independent Bitmap */
M_lclose(fdOut) ; /* to the file */
return ErrorTrap(RWColTable) ;
}
i = fWriteToDIB(fdIn, fdOut, &rgscr[nscr-1]) ; /* write data to DIB file */
M_lclose(fdIn) ; /* (it is at the correct position) */
if ( i ) /* error occurs when writing to */
{ /* the bitmap file */
M_lclose(fdOut) ;
return ErrorTrap(i) ;
}
else /* otherwise, write header to the */
return ErrorTrap(fCloseDIB(fdOut, &rgscr[nscr-1])) ; /* bitmap file before */
/* closing the file */
}