home *** CD-ROM | disk | FTP | other *** search
/ SuperHack / SuperHack CD.bin / CODING / WINDOWS / LENGINE.ZIP / DRDRAW.CPP < prev    next >
Encoding:
C/C++ Source or Header  |  1996-11-17  |  5.5 KB  |  265 lines

  1. #include "header.h"
  2.  
  3. DirectDraw::DirectDraw()
  4. {
  5. // Using emulation only so there shouldn't be a problem
  6.     lpDD = NULL;
  7.     DirectDrawEnumerate(DDDeviceCallback, &lpDD);
  8.  
  9.     if(lpDD == NULL)
  10.         DirectDrawCreate(NULL, &lpDD, NULL);
  11. };
  12.  
  13. DirectDraw::~DirectDraw()
  14. {
  15.     DeleteViewBuffers();
  16.     if(lpDD != NULL)
  17.     {
  18.         lpDD->Release();
  19.         lpDD = NULL;
  20.      }
  21. };
  22.     
  23. BOOL DirectDraw::SetDefaults(HWND hWnd, DWORD nDibs)
  24. {
  25.     hWindow = hWnd;
  26.     NewDib = 0;
  27.     NumDibs = nDibs;
  28.     lpDib = new LPDIRECTDRAWSURFACE[nDibs];
  29.     return(TRUE);    
  30. };
  31.  
  32. BOOL DirectDraw::SetMode(enum VIDEOMODE Mode)
  33. {
  34.     HRESULT Result;
  35.  
  36.     Result = lpDD->SetCooperativeLevel(hWindow, DDSCL_EXCLUSIVE |
  37.                                                 DDSCL_FULLSCREEN |
  38.                                                 DDSCL_ALLOWMODEX);
  39.     switch(Mode)
  40.     {
  41.         case M320x240x8:
  42.             Result = lpDD->SetDisplayMode(320, 240, 8);
  43.             Screen.x = 320;    Screen.y = 240;
  44.             HalfScreen.x = 160;    HalfScreen.y = 120;
  45.             break;
  46.         case M640x480x8:
  47.             Result = lpDD->SetDisplayMode(640, 480, 8);
  48.             Screen.x = 640;    Screen.y = 480;
  49.             HalfScreen.x = 320;    HalfScreen.y = 240;
  50.             break;
  51.         case M800x600x8:
  52.             Result = lpDD->SetDisplayMode(800, 600, 8);
  53.             Screen.x = 800;    Screen.y = 600;
  54.             HalfScreen.x = 400;    HalfScreen.y = 300;
  55.             break;
  56.         case M1024x768x8:
  57.             Result = lpDD->SetDisplayMode(1024, 768, 8);
  58.             Screen.x = 1024; Screen.y = 768;
  59.             HalfScreen.x = 512;    HalfScreen.y = 384;
  60.             break;
  61.         default:
  62.             Result = lpDD->SetDisplayMode(640, 480, 8);
  63.             Screen.x = 640;    Screen.y = 480;
  64.             HalfScreen.x = 320;    HalfScreen.y = 240;
  65.             break;
  66.     }
  67.     return(TRUE);    
  68. };
  69.  
  70. BOOL DirectDraw::CreateViewBuffers(void)
  71. {
  72.     DDSURFACEDESC       Desc;
  73.     DDSCAPS             Caps;
  74.     HRESULT             Result;
  75.     
  76.     memset(&Desc, 0, sizeof(Desc));
  77.     Desc.dwSize = sizeof(Desc);
  78.     Desc.dwFlags = DDSD_CAPS | DDSD_BACKBUFFERCOUNT;
  79.     Desc.dwBackBufferCount = 1;
  80.     Desc.ddsCaps.dwCaps = DDSCAPS_PRIMARYSURFACE |
  81.                           DDSCAPS_FLIP | 
  82.                           DDSCAPS_COMPLEX;
  83.     Result = lpDD->CreateSurface(&Desc, &lpFront, NULL);
  84.     
  85.     Caps.dwCaps = DDSCAPS_BACKBUFFER;
  86.     Result = lpFront->GetAttachedSurface(&Caps, &lpBack);
  87.     Result = lpDD->CreateClipper(0, &lpClip, NULL);
  88.     Result = lpClip->SetHWnd(0, hWindow);
  89.     Result = lpBack->SetClipper(lpClip);
  90.     Pitch = Desc.lPitch;
  91.     
  92.     return(TRUE);    
  93. };
  94.  
  95. BOOL DirectDraw::DeleteViewBuffers(void)
  96. {
  97.     if(lpFront)
  98.     {
  99.         lpFront->Release();
  100.         lpFront = NULL;
  101.     }
  102.     if(lpClip)
  103.     {
  104.         lpClip->Release();
  105.         lpClip = NULL;
  106.     }
  107.     if(lpPal)
  108.     {
  109.         lpPal->Release();
  110.         lpPal = NULL;
  111.     }
  112.     for(int i = 0; i < NumDibs; i++)
  113.         FreeBitmap(lpDib[i]);
  114.     if(lpDib)
  115.         delete lpDib;
  116.     return(TRUE);    
  117. };
  118.  
  119. IDirectDrawPalette *DirectDraw::ExtractPalette(HDIB Dib)
  120. {
  121.     PALETTEENTRY pe[256];
  122.     IDirectDrawPalette *lpP;
  123.     int i;
  124.  
  125.     for(i = 0; i < 256; i++)
  126.     {
  127.         pe[i] = Dib.Palette[i];
  128.         pe[i].peFlags = PC_RESERVED;
  129.     }
  130.     
  131.     lpDD->CreatePalette(DDPCAPS_8BIT, pe, &lpP, NULL);
  132.     return(lpP);
  133. };
  134.  
  135. BOOL DirectDraw::Flip(void)
  136. {
  137.     HRESULT Result;
  138.         
  139.     while(1)
  140.     {
  141.         Result = lpFront->Flip(NULL, DDFLIP_WAIT);
  142.  
  143.         if(Result == DD_OK)
  144.         {
  145.             break;
  146.         }
  147.  
  148.         if(Result == DDERR_SURFACELOST)
  149.         {
  150.             lpFront->Restore();
  151.             lpBack->Restore();
  152.         }
  153.  
  154.         if(Result != DDERR_WASSTILLDRAWING)
  155.         {
  156.             break;
  157.         }
  158.     }
  159.     return(TRUE);    
  160. };
  161.  
  162. BOOL DirectDraw::Clear(BYTE PalIndex)
  163. {
  164.     DDBLTFX ddbltfx;
  165.     ddbltfx.dwSize = sizeof(ddbltfx);
  166.     ddbltfx.dwFillColor = PalIndex;
  167.     lpBack->Blt(NULL, NULL, NULL,
  168.                 DDBLT_COLORFILL | DDBLT_WAIT,
  169.                 &ddbltfx);
  170.     return(TRUE);    
  171. };
  172.  
  173. BOOL DirectDraw::AddBitmap(char *file)
  174. {
  175.     HDIB db;
  176.     DDSURFACEDESC ddsd;
  177.     HRESULT Result;
  178.     DDSURFACEDESC Desc;
  179.     int dWidth, dHeight;
  180.     int h, i;
  181.     LPBYTE Src, Dest;
  182.     DWORD dPtch;
  183.         
  184.     if((NewDib >= NumDibs) || (!lpDib))
  185.         return(FALSE);
  186.  
  187.     db.Load(file);
  188.     memset(&ddsd, 0, sizeof(ddsd));
  189.     ddsd.dwSize = sizeof(ddsd);
  190.     ddsd.dwFlags = DDSD_CAPS | DDSD_HEIGHT | DDSD_WIDTH;
  191.     ddsd.ddsCaps.dwCaps = DDSCAPS_OFFSCREENPLAIN;
  192.     ddsd.dwHeight = db.Info.biHeight;
  193.     ddsd.dwWidth = db.Info.biWidth;
  194.     Result = lpDD->CreateSurface(&ddsd, &lpDib[NewDib], NULL);
  195.     if(Result != DD_OK)
  196.         MessageBeep(0);
  197. //    DIB2Surface(db, lpDib[NewDib]);
  198.     
  199.     dWidth = db.Info.biWidth;
  200.     dHeight = db.Info.biHeight;
  201.     Desc.dwSize = sizeof(Desc);
  202.     lpDib[NewDib]->Lock(NULL, &Desc, DDLOCK_WAIT, NULL);
  203.  
  204.     Dest = (LPBYTE)Desc.lpSurface;
  205.     Src = (LPBYTE)db.Data;
  206.     dPtch = Desc.lPitch - dWidth;
  207.  
  208.     for(h = 0; h < dHeight; h++)
  209.     {
  210.         for(i = 0; i < dWidth; i++)
  211.             *Dest++ = *Src++;
  212.         Dest += dPtch;
  213.     }
  214.  
  215.     lpDib[NewDib]->Unlock(NULL);
  216.     DDCOLORKEY ddck;
  217.     ddck.dwColorSpaceLowValue = 0;
  218.     ddck.dwColorSpaceHighValue = 0;
  219.     lpDib[NewDib]->SetColorKey(DDCKEY_SRCBLT, &ddck);
  220.  
  221.     NewDib++;
  222.     db.Free();
  223.     return(TRUE);
  224. };
  225.  
  226. BOOL DirectDraw::FreeBitmap(LPDIRECTDRAWSURFACE lpSurf)
  227. {
  228.     if(lpSurf)
  229.     {
  230.         lpSurf->Release();
  231.         lpSurf = NULL;
  232.     }
  233.     return(TRUE);
  234. };
  235.  
  236. BOOL DirectDraw::BltBitmap(LPDIRECTDRAWSURFACE lpSurf, RECT Src, RECT Dest)
  237. {
  238.     lpBack->Blt(&Dest, lpSurf, &Src, DDBLT_WAIT | DDBLT_KEYSRC, NULL);
  239.     return(TRUE);
  240. };
  241.  
  242. BOOL CALLBACK DDDeviceCallback(GUID FAR *lpGUID, LPSTR lpDriverDesc,
  243.                                LPSTR lpDriverName, LPVOID lpContext)
  244. {
  245.     LPDIRECTDRAW lpDD = NULL;
  246.     HRESULT Result;
  247.     
  248.     lpDriverDesc = lpDriverDesc;
  249.     lpDriverName = lpDriverName;
  250.     
  251.     if(!lpGUID)
  252.         return DDENUMRET_OK;
  253.  
  254.     Result = DirectDrawCreate(lpGUID, &lpDD, NULL);
  255.     if(Result != DD_OK)
  256.     {
  257.         lpDD = NULL;
  258.         return DDENUMRET_OK;
  259.     }
  260.  
  261.     *(LPDIRECTDRAW *)lpContext = lpDD;
  262.     return DDENUMRET_CANCEL;
  263. };
  264.  
  265.