home *** CD-ROM | disk | FTP | other *** search
/ Tricks of the Windows Gam…ming Gurus (2nd Edition) / Disc2.iso / msdn_vcb / samples / vc98 / sdk / graphics / directx / foxbear / bmp.c < prev    next >
C/C++ Source or Header  |  1997-07-14  |  4KB  |  136 lines

  1. /*==========================================================================
  2.  *
  3.  *  Copyright (C) 1995-1997 Microsoft Corporation. All Rights Reserved.
  4.  *  Copyright (C) 1994-1995 ATI Technologies Inc. All Rights Reserved.
  5.  *
  6.  *  File:    bmp.c
  7.  *  Content:    Bitmap reader
  8.  *
  9.  ***************************************************************************/
  10. #include "foxbear.h"
  11.  
  12. /*
  13.  * gfxLoadBitmap
  14.  */
  15. GFX_HBM gfxLoadBitmap(LPSTR szFileName)
  16. {
  17.     HFASTFILE                  pfile;   
  18.     BITMAPFILEHEADER UNALIGNED *pbf;
  19.     BITMAPINFOHEADER UNALIGNED *pbi;
  20.     GFX_HBM                    hbm; 
  21.     BOOL                       trans = FALSE;
  22.  
  23.     pfile = FastFileOpen( szFileName );
  24.  
  25.     if( pfile == NULL )
  26.     {
  27.     return NULL;
  28.     }
  29.  
  30.     pbf = (BITMAPFILEHEADER *)FastFileLock(pfile, 0, 0);
  31.     pbi = (BITMAPINFOHEADER *)(pbf+1);
  32.  
  33.     if (pbf->bfType != 0x4d42 ||
  34.         pbi->biSize != sizeof(BITMAPINFOHEADER))
  35.     {
  36.         Msg("Failed to load");
  37.         Msg(szFileName);
  38.     FastFileClose( pfile );
  39.     return NULL;
  40.     }
  41.  
  42.     /*
  43.      * TOTAL HACK for FoxBear, FoxBear does not use any masks, it draws
  44.      * sprites with transparent colors, but the code still loads the masks
  45.      * if a mask exists the sprite is transparent, else it is not, so
  46.      * you cant get rid of the masks or nothing will be transparent!!
  47.      *
  48.      * if the code tries to load a mask, just return a non-zero value.
  49.      */
  50.  
  51.     if( pbi->biBitCount == 1 )
  52.     {
  53.         Msg("some code is still using masks, stop that!");
  54.     FastFileClose( pfile );
  55.         return NULL;
  56.     }
  57.  
  58.     /*
  59.      * ANOTHER TOTAL HACK for FoxBear, some of the bitmaps in FoxBear
  60.      * are a solid color, detect these and dont waste VRAM on them.
  61.      */
  62.     if( !bTransDest && pbi->biBitCount == 8 )
  63.     {
  64.         int x,y;
  65.         BYTE c;
  66.         BYTE UNALIGNED *pb = (LPBYTE)pbi + pbi->biSize + 256 * sizeof(COLORREF);
  67.         RGBQUAD UNALIGNED *prgb = (RGBQUAD *)((LPBYTE)pbi + pbi->biSize);
  68.         COLORREF rgb;
  69.  
  70.         c = *pb;
  71.  
  72.         for(y=0; y<(int)pbi->biHeight; y++ )
  73.         {
  74.             for( x=0; x<(int)pbi->biWidth; x++ )
  75.             {
  76.                 if (c != *pb++)
  77.                     goto not_solid;
  78.             }
  79.             pb += ((pbi->biWidth + 3) & ~3) - pbi->biWidth;
  80.         }
  81.  
  82.         rgb = RGB(prgb[c].rgbRed,prgb[c].rgbGreen,prgb[c].rgbBlue);
  83.         hbm = gfxCreateSolidColorBitmap(rgb);
  84.  
  85.         FastFileClose( pfile );
  86.         return hbm;
  87.     }
  88. not_solid:
  89.  
  90.     /*
  91.      * figure out iff the bitmap has the transparent color in it.
  92.      */
  93.     if( pbi->biBitCount == 8 )
  94.     {
  95.         int x,y;
  96.         BYTE UNALIGNED *pb = (LPBYTE)pbi + pbi->biSize + 256 * sizeof(COLORREF);
  97.         DWORD UNALIGNED *prgb = (DWORD *)((LPBYTE)pbi + pbi->biSize);
  98.  
  99.         for(y=0; y<(int)pbi->biHeight && !trans; y++ )
  100.         {
  101.             for( x=0; x<(int)pbi->biWidth && !trans; x++ )
  102.             {
  103.                 if (prgb[*pb++] == 0x00FFFFFF)
  104.                     trans=TRUE;
  105.             }
  106.             pb += ((pbi->biWidth + 3) & ~3) - pbi->biWidth;
  107.         }
  108.     }
  109.  
  110.     hbm = gfxCreateVramBitmap(pbi, trans);
  111.  
  112.     if( hbm == NULL )
  113.     {
  114.     FastFileClose( pfile );
  115.         return GFX_FALSE;
  116.     }
  117.  
  118. #if 0
  119.     {
  120.         DDSCAPS ddscaps;
  121.  
  122.         IDirectDrawSurface_GetCaps(((GFX_BITMAP *)hbm)->lpSurface, &ddscaps);
  123.  
  124.         if( !(ddscaps.dwCaps & DDSCAPS_VIDEOMEMORY) )
  125.     {
  126.         Msg( "%s is in system memory", szFileName );
  127.     }
  128.     }
  129. #endif
  130.  
  131.     FastFileClose( pfile );
  132.  
  133.     return hbm;
  134.  
  135. } /* gfxLoadBitmap */
  136.