Cdib.cpp
Upload User: szkelitina
Upload Date: 2022-05-21
Package Size: 6797k
Code Size: 4k
Category:

Special Effects

Development Platform:

Visual C++

  1. #include "stdafx.h"
  2. #include "cdib.h"
  3. #include "windowsx.h"
  4. #include "math.h"
  5. #define WIDTHBYTES(bits)    (((bits) + 31) / 32 * 4) 
  6. CDib::CDib()
  7. {
  8. size=0;
  9. }
  10. CDib::~CDib()
  11. {
  12.     GlobalFreePtr(m_pBitmapInfo);
  13. }
  14. void CDib::LoadFile(const char* dibFileName)
  15. {
  16. strcpy(m_fileName,dibFileName);
  17.     CFile dibFile(m_fileName, CFile::modeRead);
  18.     dibFile.Read((void*)&bitmapFileHeader,sizeof(BITMAPFILEHEADER));
  19.     if (bitmapFileHeader.bfType == 0x4d42)
  20.     {
  21.         DWORD fileLength = dibFile.GetLength();    
  22. size = fileLength -sizeof(BITMAPFILEHEADER);
  23. pDib =(BYTE*)GlobalAllocPtr(GMEM_MOVEABLE, size);
  24.         dibFile.Read((void*)pDib, size);
  25.         dibFile.Close();
  26.         m_pBitmapInfo = (BITMAPINFO*) pDib;
  27.         m_pBitmapInfoHeader = (BITMAPINFOHEADER*) pDib;
  28.         m_pRGB = (RGBQUAD*)(pDib +
  29. m_pBitmapInfoHeader->biSize);
  30.         int m_numberOfColors = GetNumberOfColors();
  31.         if (m_pBitmapInfoHeader->biClrUsed == 0)
  32.             m_pBitmapInfoHeader->biClrUsed =
  33. m_numberOfColors;
  34.         DWORD colorTableSize = m_numberOfColors *
  35.             sizeof(RGBQUAD);
  36.         m_pData = pDib + m_pBitmapInfoHeader->biSize
  37.             + colorTableSize;
  38. if (m_pRGB == (RGBQUAD*)m_pData) // No color table
  39. m_pRGB = NULL;
  40.         m_pBitmapInfoHeader->biSizeImage = GetSize();
  41. m_valid = TRUE;
  42.     }    
  43.     else
  44.     {
  45.         m_valid = FALSE;
  46.         AfxMessageBox("This isn't a bitmap file!");
  47.     }
  48. }
  49. BOOL CDib::IsValid()
  50. {
  51.     return m_valid;
  52. }
  53.         
  54. char* CDib::GetFileName()
  55. {
  56.     return m_fileName;
  57. }
  58.         
  59. UINT CDib::GetWidth()
  60. {
  61.     return (UINT) m_pBitmapInfoHeader->biWidth;
  62. }
  63.         
  64. UINT CDib::GetHeight()
  65. {
  66.     return (UINT) m_pBitmapInfoHeader->biHeight;
  67. }
  68.         
  69. DWORD CDib::GetSize()
  70. {
  71.     if (m_pBitmapInfoHeader->biSizeImage != 0)
  72.         return m_pBitmapInfoHeader->biSizeImage;
  73. else
  74.     {
  75.         DWORD height = (DWORD) GetHeight();
  76.         DWORD width = (DWORD) GetWidth();
  77.         return height * width;
  78.     }
  79. }
  80. UINT CDib::GetNumberOfColors()
  81. {
  82. int numberOfColors;
  83.     if ((m_pBitmapInfoHeader->biClrUsed == 0) &&
  84. (m_pBitmapInfoHeader->biBitCount < 9))
  85. {
  86. switch (m_pBitmapInfoHeader->biBitCount)
  87. {
  88. case 1: numberOfColors = 2; break;
  89. case 4: numberOfColors = 16; break;
  90. case 8: numberOfColors = 256;
  91. }
  92. }
  93.     else
  94. numberOfColors = (int) m_pBitmapInfoHeader->biClrUsed;
  95.     return numberOfColors;
  96. }
  97. DWORD CDib::GetDibWidthBytes()
  98. {  
  99. byBitCount=m_pBitmapInfoHeader->biBitCount;
  100. LONG nWidth=m_pBitmapInfoHeader->biWidth;
  101. dwWidthBytes = (DWORD)m_pBitmapInfoHeader->biWidth; //8-bits
  102. if(byBitCount == 1) dwWidthBytes = (nWidth + 7) / 8;
  103. else if(byBitCount == 4) dwWidthBytes = (nWidth + 1) / 2;
  104. else if(byBitCount == 24) dwWidthBytes = 3 * nWidth ;
  105. while((dwWidthBytes & 3) != 0)dwWidthBytes++;
  106. return dwWidthBytes;
  107. }  
  108. BYTE* CDib::GetData()
  109. {
  110.     return m_pData;
  111. }
  112. RGBQUAD* CDib::GetRGB()
  113. {
  114.     return m_pRGB;
  115. }
  116. BITMAPINFO* CDib::GetInfo()
  117. {
  118.     return m_pBitmapInfo;
  119. }
  120. WORD CDib::PaletteSize(LPBYTE lpDIB) 
  121.     return (DIBNumColors(lpDIB) * sizeof(RGBTRIPLE)); 
  122. WORD CDib::DIBNumColors(LPBYTE lpDIB) 
  123.     WORD wBitCount;  // DIB bit count 
  124.     wBitCount = ((LPBITMAPCOREHEADER)lpDIB)->bcBitCount; 
  125.     switch (wBitCount) 
  126.     { 
  127. case 1: 
  128. return 2; 
  129. case 4: 
  130. return 16; 
  131. case 8: 
  132. return 256; 
  133. default: 
  134. return 0; 
  135.     } 
  136. void CDib::SaveFile(const CString filename)
  137. strcpy(m_fileName,filename);
  138.     CFile dibFile(m_fileName, CFile::modeCreate|CFile::modeWrite);
  139.     dibFile.Write((void*)&bitmapFileHeader,sizeof(BITMAPFILEHEADER));
  140.     dibFile.Write((void*)pDib, size);
  141.     dibFile.Close();
  142. }