home *** CD-ROM | disk | FTP | other *** search
/ Total Destruction / Total_Destruction.iso / addons / Lccwin32.exe / Lccwin32 / lccpub / demo / ddraw / wormhole / wormhole.c < prev    next >
Encoding:
C/C++ Source or Header  |  1997-05-08  |  10.7 KB  |  438 lines

  1. /***************************************************************************
  2.  *  Copyright (C) 1995-1996 Microsoft Corporation. All Rights Reserved.
  3.  ***************************************************************************/
  4. #define _WCHAR_T_DEFINED
  5. #include <windows.h>
  6. #include "ddraw.h"
  7.  
  8. HWND            hWnd;
  9. PALETTEENTRY    pe[256];
  10. BOOL            bActive;                                            
  11. BOOL            bIsInitialized=FALSE;
  12.  
  13. LPDIRECTDRAW            lpDD;           
  14. LPDIRECTDRAWSURFACE     lpDDSPrimary;   
  15. LPDIRECTDRAWSURFACE     lpDDSOne;       
  16. LPDIRECTDRAWCLIPPER     lpClipper;      
  17. LPDIRECTDRAWPALETTE     lpDDPal;        
  18.  
  19. BOOL restoreAll();
  20. void updateFrame();
  21. static void finiObjects();
  22. long FAR PASCAL WindowProc(HWND,UINT,WPARAM,LPARAM);
  23. BOOL initFail(HWND);
  24. static BOOL doInit(HINSTANCE, int);
  25. void CyclePalette();
  26. BOOL readBMPIntoSurfaces();
  27. int PASCAL WinMain(HINSTANCE,HINSTANCE,LPSTR,int);
  28.  
  29. BOOL restoreAll()
  30. {
  31.     BOOL bResult;
  32.  
  33.     bResult=IDirectDrawSurface_Restore(lpDDSPrimary) == DD_OK &&
  34.             IDirectDrawSurface_Restore(lpDDSOne)     == DD_OK;
  35.  
  36.     readBMPIntoSurfaces();
  37.  
  38.     return(bResult);
  39.  
  40. void updateFrame()
  41. {
  42.     RECT                rcRect;
  43.     RECT                destRect;
  44.     HRESULT             ddrval;
  45.     POINT               pt;
  46.  
  47.     rcRect.left=0;
  48.     rcRect.top=0;
  49.     rcRect.right=640;
  50.     rcRect.bottom=480;
  51.  
  52.     GetClientRect(hWnd,&destRect);
  53.  
  54.     pt.x=pt.y=0;
  55.     ClientToScreen(hWnd,&pt);
  56.     OffsetRect(&destRect,pt.x,pt.y);
  57.  
  58.     while(1)
  59.     {
  60.         ddrval=IDirectDrawSurface_Blt(lpDDSPrimary,&destRect,lpDDSOne,&rcRect,0,NULL);
  61.  
  62.         if(ddrval==DD_OK)
  63.         {
  64.             break;
  65.         }
  66.         if(ddrval==DDERR_SURFACELOST)
  67.         {
  68.             if(!restoreAll())
  69.             {
  70.                 return;
  71.             }
  72.             continue;
  73.         }
  74.         if(ddrval!=DDERR_WASSTILLDRAWING)
  75.         {
  76.             return;
  77.         }
  78.     }
  79.  
  80. static void finiObjects()
  81. {
  82.     if(lpDD!=NULL)
  83.     {
  84.         if(lpDDSPrimary!=NULL)
  85.         {
  86.             IDirectDrawSurface_Release(lpDDSPrimary);
  87.             lpDDSPrimary=NULL;
  88.         }
  89.         if(lpDDSOne!=NULL)
  90.         {
  91.             IDirectDrawSurface_Release(lpDDSOne);
  92.             lpDDSOne=NULL;
  93.         }
  94.         if(lpDDPal!=NULL)
  95.         {
  96.             IDirectDrawSurface_Release(lpDDPal);
  97.             lpDDPal=NULL;
  98.         }
  99.         IDirectDrawSurface_Release(lpDD);
  100.         lpDD=NULL;
  101.     }
  102.  
  103. long FAR PASCAL WindowProc(HWND hWnd,UINT message, 
  104.                            WPARAM wParam,LPARAM lParam )
  105. {
  106.     switch(message)
  107.     {
  108.         case WM_ACTIVATE:
  109.             bActive = wParam;
  110.             break;
  111.  
  112.         case WM_CREATE:
  113.  
  114.             break;
  115.  
  116.         case WM_SETCURSOR:
  117.  
  118.             SetCursor(NULL);
  119.             if( bIsInitialized )
  120.             {
  121.                 updateFrame();
  122.                 IDirectDrawPalette_GetEntries(lpDDPal,0,0,256,pe);
  123.             }
  124.             break;
  125.  
  126.         case WM_KEYDOWN:
  127.  
  128.             switch(wParam)
  129.             {
  130.                 case VK_ESCAPE:
  131.                 
  132.                 case VK_F12:
  133.                     
  134.                     PostMessage(hWnd,WM_CLOSE,0,0);
  135.                     break;
  136.             }
  137.             break;
  138.   
  139.         case WM_DESTROY:
  140.  
  141.             finiObjects();
  142.             PostQuitMessage(0);
  143.             break;
  144.     }
  145.     return DefWindowProc(hWnd,message,wParam,lParam);
  146.  
  147. BOOL initFail(HWND hWnd)
  148. {
  149.     finiObjects();
  150.     MessageBox(hWnd,"DirectDraw Init FAILED","WormHole",MB_OK);
  151.     DestroyWindow(hWnd);
  152.     return FALSE;
  153.  
  154. static BOOL doInit(HINSTANCE hInstance,int nCmdShow)
  155. {
  156.     WNDCLASS            wc;
  157.     DDSURFACEDESC       ddsd;
  158.     HRESULT             ddrval;
  159.  
  160.     wc.style=          CS_HREDRAW|CS_VREDRAW;
  161.     wc.lpfnWndProc=    WindowProc;
  162.     wc.cbClsExtra=     0;
  163.     wc.cbWndExtra=     0;
  164.     wc.hInstance=      hInstance;
  165.     wc.hIcon=          LoadIcon(hInstance,IDI_APPLICATION);
  166.     wc.hCursor=        LoadCursor(NULL,IDC_ARROW);
  167.     wc.hbrBackground=  NULL;
  168.     wc.lpszMenuName=   NULL;
  169.     wc.lpszClassName=  "WormHole";
  170.     RegisterClass(&wc);
  171.     
  172.     hWnd=CreateWindowEx(
  173.         0,
  174.         "WormHole",
  175.         "WormHole",
  176.         WS_POPUP,
  177.         0,
  178.         0,
  179.         GetSystemMetrics(SM_CXSCREEN),
  180.         GetSystemMetrics(SM_CYSCREEN),
  181.         NULL,
  182.         NULL,
  183.         hInstance,
  184.         NULL );
  185.  
  186.     if(!hWnd)
  187.     {
  188.         return FALSE;
  189.     }
  190.  
  191.     ShowWindow(hWnd,nCmdShow);
  192.     UpdateWindow(hWnd);
  193.  
  194.     ddrval=DirectDrawCreate(NULL,&lpDD,NULL);
  195.  
  196.     if(ddrval!=DD_OK)
  197.     {
  198.         return initFail(hWnd);
  199.     }
  200.  
  201.     ddrval=IDirectDraw_SetCooperativeLevel(lpDD,hWnd,DDSCL_EXCLUSIVE|DDSCL_FULLSCREEN);
  202.     ddrval=IDirectDraw_SetDisplayMode(lpDD,640,480,8);
  203.  
  204.     if(ddrval!=DD_OK)
  205.     {
  206.         return initFail(hWnd);
  207.     }
  208.  
  209.     ddsd.dwSize=sizeof(ddsd);
  210.     ddsd.dwFlags=DDSD_CAPS;
  211.     ddsd.ddsCaps.dwCaps=DDSCAPS_PRIMARYSURFACE;
  212.  
  213.     ddrval=IDirectDraw_CreateSurface(lpDD,&ddsd,&lpDDSPrimary,NULL);
  214.  
  215.     if(ddrval!=DD_OK)
  216.     {
  217.         return initFail(hWnd);
  218.     }
  219.  
  220.     ddsd.dwSize=sizeof(ddsd);
  221.     ddsd.dwFlags=DDSD_CAPS|DDSD_HEIGHT|DDSD_WIDTH;
  222.     ddsd.ddsCaps.dwCaps=DDSCAPS_OFFSCREENPLAIN;
  223.     ddsd.dwWidth=640;
  224.     ddsd.dwHeight=480;
  225.  
  226.     IDirectDraw_CreateSurface(lpDD,&ddsd,&lpDDSOne,NULL);    
  227.     if(lpDDSOne==NULL)
  228.     {
  229.         return initFail(hWnd);
  230.     }
  231.  
  232.     bIsInitialized = TRUE;
  233.     return TRUE;
  234.  
  235. void CyclePalette()
  236. {
  237.     int                 reg[15];
  238.     int                 k;
  239.        
  240.     for(k=0;k<15;k++)
  241.     {
  242.         reg[k]=pe[k+30].peRed;
  243.     }
  244.     for(k=45;k<255;k++)
  245.     {                                                            
  246.         pe[k-15].peRed=pe[k].peRed;
  247.     }
  248.     for(k=0;k<15;k++)
  249.     {
  250.         pe[k+240].peRed=reg[k];
  251.     }
  252.     for(k=0;k<15;k++)
  253.     {
  254.         reg[k]=pe[k+30].peGreen;
  255.     }
  256.     for(k=45;k<255;k++)
  257.     {
  258.         pe[k-15].peGreen=pe[k].peGreen;
  259.     }
  260.     for(k=0;k<15;k++)
  261.     {
  262.         pe[k+240].peGreen=reg[k];
  263.     }
  264.     for(k=0;k<15;k++)
  265.     {
  266.         reg[k]=pe[k+30].peBlue;
  267.     }
  268.     for(k=45;k<255;k++)
  269.     {
  270.         pe[k-15].peBlue=pe[k].peBlue;
  271.     }
  272.     for(k=0;k<15;k++)
  273.     {
  274.         pe[k+240].peBlue=reg[k];
  275.     }
  276.  
  277.     for(k=2;k<17;k++)
  278.     {
  279.         reg[k-2]=pe[15*k+14].peRed;
  280.         pe[15*k+14].peRed=pe[15*k+13].peRed;
  281.         pe[15*k+13].peRed=pe[15*k+12].peRed;
  282.         pe[15*k+12].peRed=pe[15*k+11].peRed;
  283.         pe[15*k+11].peRed=pe[15*k+10].peRed;
  284.         pe[15*k+10].peRed=pe[15*k+9].peRed;
  285.         pe[15*k+9].peRed=pe[15*k+8].peRed;
  286.         pe[15*k+8].peRed=pe[15*k+7].peRed;
  287.         pe[15*k+7].peRed=pe[15*k+6].peRed;
  288.         pe[15*k+6].peRed=pe[15*k+5].peRed;
  289.         pe[15*k+5].peRed=pe[15*k+4].peRed;
  290.         pe[15*k+4].peRed=pe[15*k+3].peRed;
  291.         pe[15*k+3].peRed=pe[15*k+2].peRed;
  292.         pe[15*k+2].peRed=pe[15*k+1].peRed;
  293.         pe[15*k+1].peRed=pe[15*k].peRed;
  294.         pe[15*k].peRed=reg[k-2];
  295.         reg[k-2]=pe[15*k+14].peGreen;
  296.         pe[15*k+14].peGreen=pe[15*k+13].peGreen;
  297.         pe[15*k+13].peGreen=pe[15*k+12].peGreen;
  298.         pe[15*k+12].peGreen=pe[15*k+11].peGreen;
  299.         pe[15*k+11].peGreen=pe[15*k+10].peGreen;
  300.         pe[15*k+10].peGreen=pe[15*k+9].peGreen;
  301.         pe[15*k+9].peGreen=pe[15*k+8].peGreen;
  302.         pe[15*k+8].peGreen=pe[15*k+7].peGreen;
  303.         pe[15*k+7].peGreen=pe[15*k+6].peGreen;
  304.         pe[15*k+6].peGreen=pe[15*k+5].peGreen;
  305.         pe[15*k+5].peGreen=pe[15*k+4].peGreen;
  306.         pe[15*k+4].peGreen=pe[15*k+3].peGreen;
  307.         pe[15*k+3].peGreen=pe[15*k+2].peGreen;
  308.         pe[15*k+2].peGreen=pe[15*k+1].peGreen;
  309.         pe[15*k+1].peGreen=pe[15*k].peGreen;
  310.         pe[15*k].peGreen=reg[k-2];
  311.         reg[k-2]=pe[15*k+14].peBlue;
  312.         pe[15*k+14].peBlue=pe[15*k+13].peBlue;
  313.         pe[15*k+13].peBlue=pe[15*k+12].peBlue;
  314.         pe[15*k+12].peBlue=pe[15*k+11].peBlue;
  315.         pe[15*k+11].peBlue=pe[15*k+10].peBlue;
  316.         pe[15*k+10].peBlue=pe[15*k+9].peBlue;
  317.         pe[15*k+9].peBlue=pe[15*k+8].peBlue;
  318.         pe[15*k+8].peBlue=pe[15*k+7].peBlue;
  319.         pe[15*k+7].peBlue=pe[15*k+6].peBlue;
  320.         pe[15*k+6].peBlue=pe[15*k+5].peBlue;
  321.         pe[15*k+5].peBlue=pe[15*k+4].peBlue;
  322.         pe[15*k+4].peBlue=pe[15*k+3].peBlue;
  323.         pe[15*k+3].peBlue=pe[15*k+2].peBlue;
  324.         pe[15*k+2].peBlue=pe[15*k+1].peBlue;
  325.         pe[15*k+1].peBlue=pe[15*k].peBlue;
  326.         pe[15*k].peBlue=reg[k-2];
  327.     }
  328.             
  329.     IDirectDraw_WaitForVerticalBlank(lpDD,DDWAITVB_BLOCKBEGIN,NULL);
  330.  
  331.     if(IDirectDrawPalette_SetEntries(lpDDPal,0,0,256,pe)!=DD_OK)
  332.     {
  333.         return;
  334.     }
  335. }
  336.  
  337. BOOL readBMPIntoSurfaces()
  338. {
  339.     HRESULT             ddrval;
  340.     HRSRC               hBMP;
  341.     RGBQUAD             Palette[256];
  342.     PALETTEENTRY        pe[256];
  343.     DDSURFACEDESC       DDSDesc;
  344.     LPSTR               lpBits;
  345.     LPSTR               lpSrc;
  346.     BYTE                *lpBMP;
  347.     int                 i;
  348.  
  349.     hBMP=FindResource(NULL,MAKEINTRESOURCE(10),RT_BITMAP);    
  350.     if( hBMP == NULL )
  351.     {
  352.         return FALSE;
  353.     }
  354.  
  355.     lpBMP=(BYTE *)LockResource(LoadResource(NULL, hBMP));
  356.     
  357.     memcpy(Palette,&lpBMP[sizeof(BITMAPINFOHEADER)],sizeof(Palette));
  358.  
  359.     FreeResource(hBMP);
  360.  
  361.     for(i=0;i<256;i++)
  362.     {
  363.         pe[i].peRed=Palette[i].rgbRed;
  364.         pe[i].peGreen=Palette[i].rgbGreen;
  365.         pe[i].peBlue=Palette[i].rgbBlue;
  366.     }   
  367.  
  368.     ddrval=IDirectDraw_CreatePalette(lpDD,DDPCAPS_8BIT,pe,&lpDDPal,NULL);
  369.  
  370.     if(ddrval!=DD_OK)
  371.     {
  372.         return FALSE;
  373.     }
  374.  
  375.     IDirectDrawSurface_SetPalette(lpDDSPrimary,lpDDPal);
  376.  
  377.     DDSDesc.dwSize=sizeof(DDSDesc);
  378.     ddrval=IDirectDrawSurface_Lock(lpDDSOne,NULL,&DDSDesc,0,NULL);
  379.     if(ddrval!=DD_OK)
  380.     {
  381.         return FALSE;
  382.     }
  383.  
  384.     lpBits=(LPSTR)DDSDesc.lpSurface;
  385.     lpSrc=(LPSTR)
  386.           (&lpBMP[sizeof(BITMAPINFOHEADER)+sizeof(Palette)+(640*480)]);
  387.     for(i=0;i<480;i++)
  388.     {
  389.         memcpy(lpBits,lpSrc,640);
  390.         lpBits+=DDSDesc.lPitch;
  391.         lpSrc-=640;
  392.     }
  393.     IDirectDrawSurface_Unlock(lpDDSOne,NULL);
  394.  
  395.     return TRUE;
  396. }
  397.  
  398. int PASCAL WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,
  399.                    LPSTR lpCmdLine,int nCmdShow)
  400. {
  401.     MSG         msg;
  402.  
  403.     if(!doInit(hInstance,nCmdShow))
  404.     {
  405.         return FALSE;
  406.     }
  407.  
  408.     readBMPIntoSurfaces();    
  409.     updateFrame();
  410.  
  411.     while(1)
  412.     {
  413.         if(PeekMessage(&msg,NULL,0,0,PM_NOREMOVE))
  414.         {
  415.             if(!GetMessage(&msg,NULL,0,0))
  416.             {
  417.                 return msg.wParam;
  418.             }
  419.             TranslateMessage(&msg);
  420.             DispatchMessage(&msg);
  421.         }
  422.         else if(bActive)
  423.         {
  424.             CyclePalette();
  425.         }
  426.         else
  427.         {
  428.             WaitMessage();
  429.         }
  430.     }
  431.