home *** CD-ROM | disk | FTP | other *** search
/ NEXT Generation 27 / NEXT27.iso / pc / demos / emperor / dx3.exe / SDK / SAMPLES / WORMHOLE / WORMHOLE.CPP < prev    next >
C/C++ Source or Header  |  1996-08-28  |  11KB  |  437 lines

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