GLMemDC.cpp
上传用户:donsun
上传日期:2022-08-10
资源大小:36k
文件大小:8k
源码类别:

OpenGL

开发平台:

Visual C++

  1. // GLMemDC.cpp: implementation of the CGLMemDC class.
  2. //
  3. //////////////////////////////////////////////////////////////////////
  4. #include "stdafx.h"
  5. #include "GLMemDC.h"
  6. #ifdef _DEBUG
  7. #undef THIS_FILE
  8. static char THIS_FILE[]=__FILE__;
  9. #define new DEBUG_NEW
  10. #endif
  11. //////////////////////////////////////////////////////////////////////
  12. // Construction/Destruction
  13. //////////////////////////////////////////////////////////////////////
  14. CGLMemoryDC::CGLMemoryDC()
  15. {
  16.     m_hBitmap = NULL;      
  17. memset(&m_DIBInfo, 0, sizeof(BITMAPINFO));  
  18.     m_hImage = NULL; 
  19. m_dwDataSize = 0;    
  20. }
  21. CGLMemoryDC::~CGLMemoryDC()
  22. {
  23. ClearMemory();
  24. }
  25. /********************************************************************/
  26. /* Get the color entries number of the image                  */
  27. /********************************************************************/
  28. int CGLMemoryDC::GetColorNumber(int nBitCount)
  29. {
  30. int ColorTableEntries;
  31.     switch(nBitCount)
  32. {
  33.     case 1:            //Black and White 
  34.         ColorTableEntries = 2;
  35.     case 4:            //16 colors 
  36.         ColorTableEntries = 16;
  37.     case 8:            //256 colors 
  38.         ColorTableEntries = 256;
  39.     case 16:             
  40.     case 24:            
  41.     case 32:            
  42. ColorTableEntries = 0;
  43. break;
  44. }
  45. return ColorTableEntries;
  46. }
  47. /********************************************************************/
  48. /* Clear all memory        */
  49. /********************************************************************/
  50. void CGLMemoryDC::ClearMemory(void)
  51. {
  52.     if(m_hBitmap)
  53. DeleteObject(m_hBitmap);
  54. m_hBitmap = NULL;      
  55. memset(&m_DIBInfo, 0, sizeof(BITMAPINFO));  
  56.     m_hImage = NULL; 
  57. m_dwDataSize = 0;    
  58. }
  59. /********************************************************************/
  60. /* Set the memory device size        */
  61. /********************************************************************/
  62. BOOL CGLMemoryDC::SetMemorySize(int width, int height)
  63. {
  64. //clear every thing
  65. ClearMemory();
  66. //set DIB image header information
  67. //just support true color bitmap
  68. m_DIBInfo.bmiHeader.biSize = sizeof(BITMAPINFOHEADER);
  69. m_DIBInfo.bmiHeader.biCompression = BI_RGB;
  70.     m_DIBInfo.bmiHeader.biPlanes = 1;
  71.     m_DIBInfo.bmiHeader.biBitCount = 32;
  72.     m_DIBInfo.bmiHeader.biWidth = width;
  73.     m_DIBInfo.bmiHeader.biHeight = height;
  74.     m_DIBInfo.bmiHeader.biSizeImage = width*height*4;
  75. //craete the BITMAP color data memory
  76.     m_hBitmap = CreateDIBSection(
  77.         NULL,
  78. &m_DIBInfo,
  79. DIB_RGB_COLORS,
  80. (void **)&m_hImage,
  81.                 NULL,
  82. NULL);
  83.     
  84. //if sucess
  85. if(m_hBitmap)
  86. return TRUE;
  87. else
  88.         return FALSE;   
  89. }
  90. /********************************************************************/
  91. /* Get the memory device size        */
  92. /********************************************************************/
  93. void CGLMemoryDC::GetMemorySize(int* width, int* height)
  94. {
  95.     *width = m_DIBInfo.bmiHeader.biWidth;
  96.     *height = m_DIBInfo.bmiHeader.biHeight;
  97. }
  98. /********************************************************************/
  99. /* Scan the image from the device context        */
  100. /********************************************************************/
  101. void CGLMemoryDC::CopyDataFromDC(CDC* pDC, CRect& rect)
  102. {
  103. CDC      dcBuffer;       //the compatible DC 
  104. CBitmap  bmBitmap;  //bitmap in memory for retreive data from DC
  105. CBitmap* pbmBitmapOld;
  106. //if the orignal bitmap did not set up
  107. if(!m_hBitmap)
  108.         return;
  109. //create compatible DC to copy image
  110. dcBuffer.CreateCompatibleDC(pDC);
  111. //create memory bitmap 
  112.     bmBitmap.CreateCompatibleBitmap(pDC,
  113.                   m_DIBInfo.bmiHeader.biWidth,
  114.                   m_DIBInfo.bmiHeader.biHeight);
  115.     
  116. //set memory bitmap to memory DC
  117. pbmBitmapOld = dcBuffer.SelectObject(&bmBitmap);
  118.     
  119. //copy source DC image to memory bitmap
  120. dcBuffer.StretchBlt(0, 0,  
  121.              m_DIBInfo.bmiHeader.biWidth,
  122.          m_DIBInfo.bmiHeader.biHeight,
  123.  pDC, 
  124.              rect.left,
  125.  rect.top,
  126.  rect.Width(),
  127.  rect.Height(),
  128.  SRCCOPY);
  129. //restore the orginal object in memory DC
  130.     dcBuffer.SelectObject(pbmBitmapOld);
  131. //copy image data from memory bitmap
  132. GetDIBits(pDC->m_hDC,
  133. (HBITMAP)bmBitmap, 
  134. 0, 
  135.         m_DIBInfo.bmiHeader.biHeight,
  136.         m_hImage,
  137. &m_DIBInfo,
  138. DIB_RGB_COLORS);
  139. }
  140. /********************************************************************/
  141. /* Copy image data to target DC                  */
  142. /*                                                                  */ 
  143. /* This function just support the color printer setting in Text     */
  144. /* mode */
  145. /********************************************************************/
  146. void CGLMemoryDC::CopyDataToDC(CDC* pDC, CRect& rect)
  147. {
  148.     ::StretchDIBits(pDC->m_hDC, 
  149.             rect.left, 
  150. rect.top, 
  151.             rect.Width(), 
  152. rect.Height(),
  153.                     0, 0, 
  154. m_DIBInfo.bmiHeader.biWidth, 
  155. m_DIBInfo.bmiHeader.biHeight,
  156.                     m_hImage,  
  157. &m_DIBInfo, 
  158. DIB_RGB_COLORS, 
  159. SRCCOPY);
  160. }
  161. /********************************************************************/
  162. /* Write image data directly to target DC              */
  163. /*                                                                  */ 
  164. /* This function just support the color printer setting in Photo    */
  165. /* quality mode */
  166. /********************************************************************/
  167. void CGLMemoryDC::WriteDataToDC(CDC* pDC, int startx, int starty)
  168. {
  169.     ::SetDIBitsToDevice(pDC->m_hDC, 
  170.                 startx, 
  171. starty,
  172.                         m_DIBInfo.bmiHeader.biWidth,
  173.                     m_DIBInfo.bmiHeader.biHeight,
  174.                         0, 0, 0,
  175.                     m_DIBInfo.bmiHeader.biHeight,
  176.                         m_hImage, 
  177. &m_DIBInfo, 
  178. DIB_RGB_COLORS);
  179.              
  180. }
  181. /********************************************************************/
  182. /* Write image data to a DIB file (disk file)       */
  183. /********************************************************************/
  184. void CGLMemoryDC::WriteDataToDIBfile(CFile* DIBFile)
  185. {
  186.     BITMAPFILEHEADER  bmFileHeader;
  187.     BITMAPINFOHEADER  bmInfoHeader;
  188.     int     nByte = sizeof(RGBQUAD)*GetColorNumber(m_DIBInfo.bmiHeader.biBitCount);
  189. void*   PaletteEntry;
  190. //prepare image header data
  191. bmFileHeader.bfType = 0x4d42;   
  192.     bmFileHeader.bfSize = 0;
  193. bmFileHeader.bfReserved1 = 0;
  194. bmFileHeader.bfReserved2 = 0;
  195. bmFileHeader.bfOffBits = sizeof(BITMAPFILEHEADER)
  196.                       + sizeof(BITMAPINFOHEADER)
  197.                      + nByte;
  198. //write image header data to DIB file
  199. DIBFile->Write((LPVOID)&bmFileHeader,sizeof(BITMAPFILEHEADER)); 
  200. //prepare image header information data
  201. bmInfoHeader.biSize = m_DIBInfo.bmiHeader.biSize;
  202. bmInfoHeader.biCompression = m_DIBInfo.bmiHeader.biCompression;
  203.     bmInfoHeader.biPlanes = m_DIBInfo.bmiHeader.biPlanes;
  204.     bmInfoHeader.biBitCount = m_DIBInfo.bmiHeader.biBitCount;
  205.     bmInfoHeader.biWidth = m_DIBInfo.bmiHeader.biWidth;
  206.     bmInfoHeader.biHeight = m_DIBInfo.bmiHeader.biHeight;
  207.     bmInfoHeader.biSizeImage = m_DIBInfo.bmiHeader.biSizeImage;
  208.     bmInfoHeader.biClrUsed = m_DIBInfo.bmiHeader.biClrUsed;
  209. //write image header information data to DIB file
  210. DIBFile->Write((LPVOID)&bmInfoHeader,sizeof(BITMAPINFOHEADER)); 
  211.     
  212.     nByte = sizeof(RGBQUAD)*GetColorNumber(m_DIBInfo.bmiHeader.biBitCount);
  213.     
  214. //wrtie the palette and color data to DIB file
  215. DIBFile->Write(PaletteEntry, nByte); 
  216. DIBFile->Write(m_hImage, m_DIBInfo.bmiHeader.biSizeImage);
  217. }