which included commits to RCS files with non-trunk default branches. git-svn-id: svn://10.65.10.50/trunk@976 c028cbd2-c16b-5b4b-a496-9718f37d4682
		
			
				
	
	
		
			326 lines
		
	
	
		
			7.2 KiB
		
	
	
	
		
			C
		
	
	
		
			Executable File
		
	
	
	
	
			
		
		
	
	
			326 lines
		
	
	
		
			7.2 KiB
		
	
	
	
		
			C
		
	
	
		
			Executable File
		
	
	
	
	
| /* r4bit.c   (c)Copyright Sequiter Software Inc., 1991-1994.  All rights reserved. */
 | |
| 
 | |
| #include "d4all.h"
 | |
| 
 | |
| #ifdef S4WINDOWS
 | |
| 
 | |
| #define ABS(x)                ((x<0)?-1*(x):x)
 | |
| #define MIN(a,b) (((a) < (b)) ? (a) : (b))
 | |
| #define MAX(a,b) (((a) > (b)) ? (a) : (b))
 | |
| 
 | |
| #define DIB_HEADER_MARKER   ((WORD) ('M' << 8) | 'B')
 | |
| #define BYTES_PER_READ  32767
 | |
| 
 | |
| 
 | |
| #define WIDTHBYTES(bits)      (((bits) + 31) / 32 * 4)
 | |
| #define IS_WIN30_DIB(lpbi)  ((*(LPDWORD) (lpbi)) == sizeof (BITMAPINFOHEADER))
 | |
| 
 | |
| 
 | |
| DWORD PASCAL kwrite ( int, VOID FAR *, DWORD );
 | |
| 
 | |
| WORD S4FUNCTION DIBNumColors (LPSTR lpbi)
 | |
| {
 | |
|   WORD wBitCount;
 | |
| 
 | |
| 
 | |
|   /* If this is a Windows style DIB, the number of colors in the  */
 | |
|   /*  color table can be less than the number of bits per pixel   */
 | |
|   /*  allows for (i.e. lpbi->biClrUsed can be set to some value). */
 | |
|   /*  If this is the case, return the appropriate value.          */
 | |
| 
 | |
|   if (IS_WIN30_DIB (lpbi))
 | |
|   {
 | |
|     DWORD dwClrUsed;
 | |
| 
 | |
|     dwClrUsed = ((LPBITMAPINFOHEADER) lpbi)->biClrUsed;
 | |
| 
 | |
|     if (dwClrUsed)
 | |
|       return (WORD) dwClrUsed;
 | |
|   }
 | |
| 
 | |
| 
 | |
|   /* Calculate the number of colors in the color table based on */
 | |
|   /*  the number of bits per pixel for the DIB.                 */
 | |
| 
 | |
|   if (IS_WIN30_DIB (lpbi))
 | |
|     wBitCount = ((LPBITMAPINFOHEADER) lpbi)->biBitCount;
 | |
|   else
 | |
|     wBitCount = ((LPBITMAPCOREHEADER) lpbi)->bcBitCount;
 | |
| 
 | |
|   switch (wBitCount)
 | |
|   {
 | |
|   case 1:
 | |
|     return 2;
 | |
| 
 | |
|   case 4:
 | |
|     return 16;
 | |
| 
 | |
|   case 8:
 | |
|     return 256;
 | |
| 
 | |
|   default:
 | |
|     return 0;
 | |
|   }
 | |
| }
 | |
| 
 | |
| 
 | |
| WORD S4FUNCTION PaletteSize (LPSTR lpbi)
 | |
| {
 | |
|   if (IS_WIN30_DIB (lpbi))
 | |
|     return (DIBNumColors (lpbi) * sizeof (RGBQUAD));
 | |
|   else
 | |
|     return (DIBNumColors (lpbi) * sizeof (RGBTRIPLE));
 | |
| }
 | |
| 
 | |
| LPSTR S4FUNCTION FindDIBBits (LPSTR lpbi)
 | |
| {
 | |
|   return (lpbi + *(LPDWORD)lpbi + PaletteSize (lpbi));
 | |
| }
 | |
| 
 | |
| 
 | |
| 
 | |
| HANDLE S4FUNCTION GetDIB ( LPSTR fname, CODE4 *code_base )
 | |
| {
 | |
| 
 | |
|   int      hFile;
 | |
|   OFSTRUCT ofs;
 | |
|   HANDLE   hDIB;
 | |
|   char     fname2[14];
 | |
|   FILE4    file;
 | |
| 
 | |
|   u4name_piece( fname2, sizeof(fname2), fname, 0, 1 );
 | |
|   SetCursor(LoadCursor(NULL, IDC_WAIT));
 | |
| 
 | |
|   if( file4open( &file, code_base, fname2, 1 ) == 0 )
 | |
|   {
 | |
|     file4close( &file );
 | |
|     if ((hFile = OpenFile (fname2, &ofs, OF_READ)) != -1)
 | |
|     {
 | |
|       hDIB = ReadDIBFile (hFile);
 | |
|       _lclose (hFile);
 | |
|       SetCursor(LoadCursor(NULL, IDC_ARROW));
 | |
|       return hDIB;
 | |
|     }
 | |
|   }
 | |
|   else
 | |
|     e4set( code_base, 0 );
 | |
| 
 | |
| 
 | |
| 
 | |
|   if ((hFile = OpenFile (fname, &ofs, OF_READ)) != -1)
 | |
|   {
 | |
|     hDIB = ReadDIBFile (hFile);
 | |
|     _lclose (hFile);
 | |
|     SetCursor(LoadCursor(NULL, IDC_ARROW));
 | |
|     return hDIB;
 | |
|   }
 | |
| 
 | |
|   SetCursor(LoadCursor(NULL, IDC_ARROW));
 | |
|   return NULL;
 | |
| }
 | |
| 
 | |
| /*************************************************************************
 | |
| 
 | |
|   Function:  MyRead (int, LPSTR, DWORD)
 | |
| 
 | |
|   Purpose:  Routine to read files greater than 64K in size.
 | |
| 
 | |
|   Returns:  TRUE if successful.
 | |
|   FALSE if an error occurs.
 | |
| 
 | |
|   Comments:
 | |
| 
 | |
|   History:   Date     Reason
 | |
| 
 | |
|   6/1/91    Created
 | |
| 
 | |
|   *************************************************************************/
 | |
| 
 | |
| BOOL MyRead (int hFile, LPSTR lpBuffer, DWORD dwSize)
 | |
| {
 | |
| #ifndef S4WIN32
 | |
|   char huge *lpInBuf = (char huge *) lpBuffer;
 | |
| #else
 | |
|   char *lpInBuf = (char *) lpBuffer;
 | |
| #endif
 | |
|   int       nBytes;
 | |
| 
 | |
| 
 | |
|   while (dwSize)
 | |
|   {
 | |
|     nBytes = (int) (dwSize > (DWORD) BYTES_PER_READ ? BYTES_PER_READ :
 | |
|                     LOWORD (dwSize));
 | |
| 
 | |
|     if (_lread (hFile, (LPSTR) lpInBuf, nBytes) != (WORD) nBytes)
 | |
|       return FALSE;
 | |
| 
 | |
|     dwSize  -= nBytes;
 | |
|     lpInBuf += nBytes;
 | |
|   }
 | |
| 
 | |
|   return TRUE;
 | |
| }
 | |
| 
 | |
| 
 | |
| /*************************************************************************
 | |
| 
 | |
|   Function:  ReadDIBFile (int)
 | |
| 
 | |
|   Purpose:  Reads in the specified DIB file into a global chunk of
 | |
|   memory.
 | |
| 
 | |
|   Returns:  A handle to a dib (hDIB) if successful.
 | |
|   NULL if an error occurs.
 | |
| 
 | |
|   Comments:  BITMAPFILEHEADER is stripped off of the DIB.  Everything
 | |
|   from the end of the BITMAPFILEHEADER structure on is
 | |
|   returned in the global memory handle.
 | |
| 
 | |
|   History:   Date      Author      Reason
 | |
| 
 | |
|   6/1/91    Created
 | |
|   6/27/91   Removed PM bitmap conversion routines.
 | |
|   6/31/91   Removed logic which overallocated memory
 | |
|   (to account for bad display drivers).
 | |
|   11/08/91   Again removed logic which overallocated
 | |
|   memory (it had creeped back in!)
 | |
| 
 | |
|   *************************************************************************/
 | |
| 
 | |
| HANDLE S4FUNCTION ReadDIBFile (int hFile)
 | |
| {
 | |
|   BITMAPFILEHEADER   bmfHeader;
 | |
|   DWORD              dwBitsSize;
 | |
|   HANDLE             hDIB;
 | |
|   LPSTR              pDIB;
 | |
| 
 | |
| 
 | |
|   /* get length of DIB in bytes for use when reading */
 | |
| 
 | |
|   dwBitsSize = filelength (hFile);
 | |
| 
 | |
|   /* Go read the DIB file header and check if it's valid. */
 | |
| 
 | |
|   if ((_lread (hFile, (LPSTR) &bmfHeader, sizeof (bmfHeader)) != sizeof (bmfHeader)) ||
 | |
|       (bmfHeader.bfType != DIB_HEADER_MARKER))
 | |
|   {
 | |
|     /*      DIBError (ERR_NOT_DIB); */
 | |
|     return NULL;
 | |
|   }
 | |
| 
 | |
|   /* Allocate memory for DIB */
 | |
| 
 | |
|   hDIB = GlobalAlloc (GMEM_MOVEABLE | GMEM_ZEROINIT, dwBitsSize - sizeof(BITMAPFILEHEADER));
 | |
| 
 | |
|   if (hDIB == 0)
 | |
|   {
 | |
|     /*     DIBError (ERR_MEMORY); */
 | |
|     return NULL;
 | |
|   }
 | |
| 
 | |
|   pDIB = GlobalLock (hDIB);
 | |
| 
 | |
|   /* Go read the bits. */
 | |
| 
 | |
|   if (!MyRead (hFile, pDIB, dwBitsSize - sizeof(BITMAPFILEHEADER)))
 | |
|   {
 | |
|     GlobalUnlock (hDIB);
 | |
|     GlobalFree   (hDIB);
 | |
|     return NULL;
 | |
|   }
 | |
| 
 | |
| 
 | |
|   GlobalUnlock (hDIB);
 | |
|   return hDIB;
 | |
| }
 | |
| 
 | |
| /****************************************************************************
 | |
| 
 | |
|   FUNCTION   : lwrite(int fh, VOID FAR *pv, DWORD ul)
 | |
| 
 | |
|   PURPOSE    : Writes data in steps of 32k till all the data is written.
 | |
| 
 | |
|   RETURNS    : 0 - If write did not proceed correctly.
 | |
|   number of bytes written otherwise.
 | |
| 
 | |
|   ****************************************************************************/
 | |
| DWORD PASCAL kwrite (int fh, VOID FAR *pv, DWORD ul)
 | |
| {
 | |
|   DWORD     ulT = ul;
 | |
| #ifndef S4WIN32
 | |
|   BYTE huge *hp = (unsigned char huge *)pv;
 | |
| #else
 | |
|   BYTE *hp = pv;
 | |
| #endif
 | |
|   while (ul > BYTES_PER_READ)
 | |
|   {
 | |
|     if (_lwrite(fh, (LPSTR)hp, (WORD)BYTES_PER_READ) != BYTES_PER_READ)
 | |
|       return 0;
 | |
| 
 | |
|     ul -= BYTES_PER_READ;
 | |
|     hp += BYTES_PER_READ;
 | |
|   }
 | |
| 
 | |
|   if (_lwrite(fh, (LPSTR)hp, (WORD)ul) != (WORD)ul)
 | |
|     return 0;
 | |
| 
 | |
|   return ulT;
 | |
| }
 | |
| 
 | |
| 
 | |
| /****************************************************************************
 | |
| 
 | |
|   FUNCTION   : WriteDIB(LPSTR szFile,HANDLE hdib)
 | |
| 
 | |
|   PURPOSE    : Write a global handle in CF_DIB format to a file.
 | |
| 
 | |
|   RETURNS    : TRUE  - if successful.
 | |
|   FALSE - otherwise
 | |
| 
 | |
|   ****************************************************************************/
 | |
| BOOL S4FUNCTION WriteDIB (LPSTR szFile, HANDLE hdib)
 | |
| {
 | |
|   BITMAPFILEHEADER    hdr;
 | |
|   LPBITMAPINFOHEADER  lpbi;
 | |
|   int                 fh;
 | |
|   OFSTRUCT            of;
 | |
| 
 | |
|   if (!hdib)
 | |
|     return FALSE;
 | |
| 
 | |
|   fh = OpenFile (szFile, &of, OF_CREATE|OF_READWRITE);
 | |
|   if (fh == -1)
 | |
|     return FALSE;
 | |
| 
 | |
|   lpbi = (LPBITMAPINFOHEADER)GlobalLock (hdib);
 | |
| 
 | |
|   /* Fill in the fields of the file header */
 | |
|   hdr.bfType          = DIB_HEADER_MARKER;
 | |
|   hdr.bfSize          = GlobalSize (hdib) + sizeof (BITMAPFILEHEADER);
 | |
|   hdr.bfReserved1     = 0;
 | |
|   hdr.bfReserved2     = 0;
 | |
|   hdr.bfOffBits       = (DWORD)sizeof(BITMAPFILEHEADER) + lpbi->biSize +
 | |
|     PaletteSize((LPSTR)lpbi);
 | |
| 
 | |
|   /* Write the file header */
 | |
|   if (!_lwrite (fh, (LPSTR)&hdr, sizeof (BITMAPFILEHEADER)))
 | |
|   {
 | |
|     GlobalUnlock (hdib);
 | |
|     _lclose (fh);
 | |
|     return FALSE;
 | |
|   }
 | |
| 
 | |
|   /* Write the DIB header and the bits */
 | |
|   if (!kwrite (fh, (LPSTR)lpbi, GlobalSize (hdib)))
 | |
|   {
 | |
|     GlobalUnlock (hdib);
 | |
|     _lclose (fh);
 | |
|     return FALSE;
 | |
|   }
 | |
| 
 | |
|   GlobalUnlock (hdib);
 | |
|   _lclose (fh);
 | |
|   return TRUE;
 | |
| }
 | |
| #endif
 |