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

  1. /*===========================================================================*\
  2. |
  3. |  File:        cgbitbuf.h
  4. |
  5. |  Description: 
  6. |       
  7. |-----------------------------------------------------------------------------
  8. |
  9. |  Copyright (C) 1995-1996 Microsoft Corporation.  All Rights Reserved.
  10. |
  11. |  Written by Moss Bay Engineering, Inc. under contract to Microsoft Corporation
  12. |
  13. \*===========================================================================*/
  14.  
  15. /**************************************************************************
  16.  
  17.     (C) Copyright 1995-1996 Microsoft Corp.  All rights reserved.
  18.  
  19.     You have a royalty-free right to use, modify, reproduce and 
  20.     distribute the Sample Files (and/or any modified version) in 
  21.     any way you find useful, provided that you agree that 
  22.     Microsoft has no warranty obligations or liability for any 
  23.     Sample Application Files which are modified. 
  24.  
  25.     we do not recomend you base your game on IKlowns, start with one of
  26.     the other simpler sample apps in the GDK
  27.  
  28.  **************************************************************************/
  29.  
  30. #ifndef CGBITBUF_H
  31. #define CGBITBUF_H
  32.  
  33. #include <windows.h>
  34. #include <ddraw.h>
  35. #include "cgdib.h"
  36.  
  37. // We use this value to time out on waiting for Direct Draw so we don't infinite loop
  38. // It should be very big to keep us from timing out too soon & tearing
  39. #define DDRAW_RETRY 40000
  40. #if defined(__BORLANDC__) || defined(__WATCOMC__)
  41. extern "C" {
  42. #endif
  43. void
  44. #if defined(__WATCOMC__)
  45. _cdecl
  46. #endif
  47. TransCopyDIBBits(
  48.         LPBYTE pDest,       // destination
  49.         LPBYTE pSource,     //         ; source pointer
  50.         DWORD dwWidth,      //         ; width pixels
  51.         DWORD dwHeight,     //        ; height pixels
  52.         DWORD dwScanD,      //         ; width bytes dest
  53.         DWORD dwScanS,      //         ; width bytes source
  54.         BYTE bTranClr       //        ; transparent color
  55.     );
  56.  
  57. void
  58. #if defined(__WATCOMC__)
  59. _cdecl
  60. #endif
  61. CopyDIBBits(
  62.         LPBYTE pDest,   //           ; dest pointer
  63.         LPBYTE pSource, //         ; source pointer
  64.         DWORD dwWidth,  //         ; width pixels
  65.         DWORD dwHeight, //        ; height pixels
  66.         DWORD dwScanD,  //         ; width bytes dest
  67.         DWORD dwScanS   //         ; width bytes source
  68.     );
  69. #if defined(__BORLANDC__) || defined(__WATCOMC__)
  70. }
  71. #endif
  72.  
  73. class CGameDSBitBuffer;
  74. class CGameDDrawBitBuffer;
  75. enum BB_TYPE
  76. {
  77.     BB_ROOT,    // CGameBitBuffer -- abstract base class
  78.     BB_DDraw,   // CGameDDrawBitBuffer -- Direct Draw surfaces
  79.     BB_DS       // CGameDSBitBuffer -- DIBSections
  80. };
  81.  
  82. class CGameBitBuffer
  83. {
  84. public:
  85.     // construct a buffer from existing DIB, optionally stretching to fit new size
  86.     CGameBitBuffer(CGameDIB* pDIB, int width=0, int height=0, COLORREF trans=PALETTEINDEX(1));
  87.  
  88.     // construct an "empty" buffer with given size
  89.     CGameBitBuffer(int width, int height, HPALETTE hPal = NULL, COLORREF trans=PALETTEINDEX(1));
  90.  
  91.     // blt to this buffer from pSrcBuffer
  92.     virtual void Blt(
  93.             int xDest,
  94.             int yDest,
  95.             int wDest,
  96.             int hDest,
  97.             CGameBitBuffer* pSrcBuffer,
  98.             int xSrc,
  99.             int ySrc,
  100.             DWORD rop
  101.             )=0;
  102.  
  103.     // blt to pDestBuffer from this buffer
  104.     virtual void Blt(
  105.             CGameBitBuffer* pDestBuffer,
  106.             int xDest,
  107.             int yDest,
  108.             int wDest,
  109.             int hDest,
  110.             int xSrc,
  111.             int ySrc,
  112.             DWORD rop
  113.             )=0;
  114.  
  115.     // transparent blt to pSrcBuffer from this buffer
  116.     virtual void TransBlt(
  117.             CGameBitBuffer* pDestBuffer,
  118.             int xDest,
  119.             int yDest,
  120.             int wDest,
  121.             int hDest,
  122.             int xSrc,
  123.             int ySrc,
  124.             int transColor
  125.             )=0;
  126.  
  127.     // specific blit for a DDraw buffer
  128.     virtual void BltDDraw(
  129.             CGameDDrawBitBuffer* pDestBuffer,
  130.             int xDest,
  131.             int yDest,
  132.             int wDest,
  133.             int hDest,
  134.             int xSrc,
  135.             int ySrc,
  136.             DWORD rop
  137.             )=0;
  138.  
  139.     virtual void TransBltDDraw(
  140.             CGameDDrawBitBuffer* pDestBuffer,
  141.             int xDest,
  142.             int yDest,
  143.             int wDest,
  144.             int hDest,
  145.             int xSrc,
  146.             int ySrc,
  147.             int transColor
  148.             )=0;
  149.  
  150.     // specific blit for a dibsection buffer
  151.     virtual void BltDS(
  152.             CGameDSBitBuffer* pDestBuffer,
  153.             int xDest,
  154.             int yDest,
  155.             int wDest,
  156.             int hDest,
  157.             int xSrc,
  158.             int ySrc,
  159.             DWORD rop
  160.             )=0;
  161.  
  162.     virtual void TransBltDS(
  163.             CGameDSBitBuffer* pDestBuffer,
  164.             int xDest,
  165.             int yDest,
  166.             int wDest,
  167.             int hDest,
  168.             int xSrc,
  169.             int ySrc,
  170.             int transColor
  171.             )=0;
  172.  
  173.     virtual ~CGameBitBuffer();
  174.  
  175.     // returns mhPalette -- the hpalette we created
  176.     virtual HPALETTE GetHPalette()
  177.     {
  178.         return mhPalette;
  179.     }
  180.  
  181.     // destroys mhPalette & sets current palette leaving mhPalette NULL
  182.     virtual void SetPalette( HPALETTE )= 0;
  183.  
  184.     virtual COLORREF GetTransColor()
  185.     {
  186.         return mTransColor;
  187.     }
  188.  
  189.     // report whether this object is a valid bitbuffer
  190.     virtual BOOL IsValid()
  191.     {
  192.         return FALSE;   // default objects are not valid
  193.     }
  194.  
  195.     // report this object's type
  196.     virtual BB_TYPE TypeID()
  197.     {
  198.         return BB_ROOT;
  199.     }
  200.  
  201. protected:
  202.     HPALETTE mhPalette;
  203.     COLORREF mTransColor;       // transparency color
  204.     CGameBitBuffer() :
  205.         mhPalette( NULL )
  206.     {
  207.     }
  208. };
  209.  
  210. class CGameDDrawBitBuffer : public CGameBitBuffer
  211. {
  212. public:
  213.     // construct a buffer from existing DIB, optionally stretching to fit new size
  214.     CGameDDrawBitBuffer(CGameDIB* pDIB, int width=0, int height=0, COLORREF trans=PALETTEINDEX(1));
  215.  
  216.     // construct an "empty" buffer with given size
  217.     CGameDDrawBitBuffer(int width, int height, HPALETTE hPal = NULL, COLORREF trans=PALETTEINDEX(1));
  218.  
  219.     virtual ~CGameDDrawBitBuffer();
  220.  
  221.     // blt to this buffer
  222.     virtual void Blt(
  223.             int xDest,
  224.             int yDest,
  225.             int wDest,
  226.             int hDest,
  227.             CGameBitBuffer* pSrcBuffer,
  228.             int xSrc,
  229.             int ySrc,
  230.             DWORD rop
  231.             );
  232.  
  233.     // generic dest blitting calls can handle any type of bitbuffer
  234.     virtual void Blt(
  235.             CGameBitBuffer* pDestBuffer,
  236.             int xDest,
  237.             int yDest,
  238.             int wDest,
  239.             int hDest,
  240.             int xSrc,
  241.             int ySrc,
  242.             DWORD rop
  243.             );
  244.  
  245.     virtual void TransBlt(
  246.             CGameBitBuffer* pDestBuffer,
  247.             int xDest,
  248.             int yDest,
  249.             int wDest,
  250.             int hDest,
  251.             int xSrc,
  252.             int ySrc,
  253.             int transColor
  254.             );
  255.  
  256.     // specific blit for another DDraw buffer
  257.     virtual void BltDDraw(
  258.             CGameDDrawBitBuffer* pDestBuffer,
  259.             int xDest,
  260.             int yDest,
  261.             int wDest,
  262.             int hDest,
  263.             int xSrc,
  264.             int ySrc,
  265.             DWORD rop
  266.             );
  267.  
  268.     virtual void TransBltDDraw(
  269.             CGameDDrawBitBuffer* pDestBuffer,
  270.             int xDest,
  271.             int yDest,
  272.             int wDest,
  273.             int hDest,
  274.             int xSrc,
  275.             int ySrc,
  276.             int transColor
  277.             );
  278.  
  279.     // specific blit for a dibsection buffer
  280.     virtual void BltDS(
  281.             CGameDSBitBuffer* pDestBuffer,
  282.             int xDest,
  283.             int yDest,
  284.             int wDest,
  285.             int hDest,
  286.             int xSrc,
  287.             int ySrc,
  288.             DWORD rop
  289.             );
  290.  
  291.     virtual void TransBltDS(
  292.             CGameDSBitBuffer* pDestBuffer,
  293.             int xDest,
  294.             int yDest,
  295.             int wDest,
  296.             int hDest,
  297.             int xSrc,
  298.             int ySrc,
  299.             int transColor
  300.             );
  301.  
  302.     virtual void SetPalette( HPALETTE );
  303.  
  304.     // report whether this object is a valid bitbuffer
  305.     virtual BOOL IsValid()
  306.     {
  307.         return mIsValid;
  308.     }
  309.  
  310.     // report this object's type
  311.     virtual BB_TYPE TypeID()
  312.     {
  313.         return BB_DDraw;
  314.     }
  315.  
  316. protected:
  317.     // we keep a single ptr around to access DDraw
  318.     static LPDIRECTDRAW mpDDrawDriver;
  319.     static int mInstanceCount;  // for allocating/freeing mpDDrawDriver
  320.     BOOL mIsAttached;   // flag whether this is backbuffer
  321.     BOOL mIsValid;
  322.     long mPitch;
  323.  
  324.     LPDIRECTDRAWSURFACE mpSurface;      // ptr to our DDraw surface
  325.     DDSURFACEDESC mSurfD;           // cache the surface description
  326.  
  327.     char* mpFileName;       // we need to keep dib's filename around
  328.                     // in case we need to reload
  329.  
  330.     friend class CGameDDrawScreen;
  331.     friend class CGameDSBitBuffer;
  332.  
  333.     friend DWORD CALLBACK EnumCallback(LPVOID lpContext, LPDDSURFACEDESC lpDDrawSurfaceInfo);
  334.  
  335.     void InitDDraw();
  336.  
  337.     CGameDDrawBitBuffer() :
  338.         mpSurface( NULL ),
  339.         mIsAttached( FALSE ),
  340.         mIsValid( FALSE )
  341.     {
  342.     };
  343.  
  344.     // create this DDraw surface
  345.     virtual void CreateSurface(int width, int height);
  346.     // if surface is lost (e.g. from mode switch), call this to recreate it
  347.     virtual void ReCreate();
  348.  
  349.     void SetBits( CGameDIB* pSource );
  350.  
  351.     virtual LPBYTE GetLockedAddress( int x, int y );
  352.     virtual void Unlock();
  353. };
  354.  
  355. class CGameDDrawScreenBuffer : public CGameDDrawBitBuffer
  356. {
  357. public:
  358.     CGameDDrawScreenBuffer();
  359.  
  360.     // create an attached-buffer object from given primary surface
  361.     CGameDDrawScreenBuffer( CGameDDrawScreenBuffer* pFront );
  362.     virtual void SetMode( int width, int height, int bits );
  363.     virtual void ShowGDIPage();
  364.     virtual void RestoreMode();
  365.     virtual void SetPalette( LPPALETTEENTRY );
  366.     virtual void DeleteDDPalette();
  367.  
  368.     int GetVideoMemory();
  369.  
  370.     virtual ~CGameDDrawScreenBuffer();
  371.  
  372. protected:
  373.     // create the screen's primary surface
  374.     virtual void CreateSurface(int width, int height);
  375.     // if surface is lost (e.g. from mode switch), call this to recreate it
  376. //  virtual void ReCreate();
  377.     LPDIRECTDRAWPALETTE mpPalette;
  378.     LPDIRECTDRAWPALETTE mpOldPalette;
  379. };
  380.  
  381. class CGameDSBitBuffer : public CGameBitBuffer
  382. {
  383. public:
  384.     // construct a buffer from existing DIB, optionally stretching to fit new size
  385.     CGameDSBitBuffer(CGameDIB* pDIB, int width=0, int height=0, COLORREF trans=PALETTEINDEX(1));
  386.  
  387.     // construct an "empty" buffer with given size
  388.     CGameDSBitBuffer(int width, int height, HPALETTE hPal = NULL, COLORREF trans=PALETTEINDEX(1));
  389.  
  390.     virtual ~CGameDSBitBuffer();
  391.  
  392.     // blt to this buffer
  393.     virtual void Blt(
  394.             int xDest,
  395.             int yDest,
  396.             int wDest,
  397.             int hDest,
  398.             CGameBitBuffer* pSrcBuffer,
  399.             int xSrc,
  400.             int ySrc,
  401.             DWORD rop
  402.             );
  403.  
  404.     // generic dest blitting calls can handle any type of bitbuffer
  405.     virtual void Blt(
  406.             CGameBitBuffer* pDestBuffer,
  407.             int xDest,
  408.             int yDest,
  409.             int wDest,
  410.             int hDest,
  411.             int xSrc,
  412.             int ySrc,
  413.             DWORD rop
  414.             );
  415.  
  416.     virtual void TransBlt(
  417.             CGameBitBuffer* pDestBuffer,
  418.             int xDest,
  419.             int yDest,
  420.             int wDest,
  421.             int hDest,
  422.             int xSrc,
  423.             int ySrc,
  424.             int transColor
  425.             );
  426.  
  427.     // specific blit for a DDraw buffer
  428.     virtual void BltDDraw(
  429.             CGameDDrawBitBuffer* pDestBuffer,
  430.             int xDest,
  431.             int yDest,
  432.             int wDest,
  433.             int hDest,
  434.             int xSrc,
  435.             int ySrc,
  436.             DWORD rop
  437.             );
  438.  
  439.     virtual void TransBltDDraw(
  440.             CGameDDrawBitBuffer* pDestBuffer,
  441.             int xDest,
  442.             int yDest,
  443.             int wDest,
  444.             int hDest,
  445.             int xSrc,
  446.             int ySrc,
  447.             int transColor
  448.             );
  449.  
  450.     // specific blit for a dibsection buffer
  451.     virtual void BltDS(
  452.             CGameDSBitBuffer* pDestBuffer,
  453.             int xDest,
  454.             int yDest,
  455.             int wDest,
  456.             int hDest,
  457.             int xSrc,
  458.             int ySrc,
  459.             DWORD rop
  460.             );
  461.  
  462.     virtual void TransBltDS(
  463.             CGameDSBitBuffer* pDestBuffer,
  464.             int xDest,
  465.             int yDest,
  466.             int wDest,
  467.             int hDest,
  468.             int xSrc,
  469.             int ySrc,
  470.             int transColor
  471.             );
  472.  
  473.     virtual void SetPalette( HPALETTE );
  474.  
  475.     virtual HBITMAP GetHBitmap()
  476.     {
  477.         return mpDIB ? mpDIB->GetHBitmap() : NULL;
  478.     }
  479.  
  480.     virtual LPBYTE GetBits()
  481.     {
  482.         return mpBits;
  483.     }
  484.  
  485.     // report whether this object is a valid bitbuffer
  486.     virtual BOOL IsValid()
  487.     {
  488.         return mIsValid;
  489.     }
  490.  
  491.     // report this object's type
  492.     virtual BB_TYPE TypeID()
  493.     {
  494.         return BB_DS;
  495.     }
  496.  
  497. protected:
  498.     friend class CGameDSScreen;
  499.     friend class CGameDDrawBitBuffer;
  500.     LPBITMAPINFO mpBitmapInfo;
  501.     LPBYTE mpBits;
  502.     CGameDIB* mpDIB;
  503.     BOOL mIsValid;
  504.  
  505.     void SetBits( CGameDIB* pSource );
  506. };
  507.  
  508. #endif // CGBITBUF_H
  509.