123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333 |
- #include "stdafx.h"
- #include "CeXDib.h"
- #ifdef _DEBUG
- #undef THIS_FILE
- static char THIS_FILE[]=__FILE__;
- #define new DEBUG_NEW
- #endif
- CCeXDib::CCeXDib()
- {
- m_hDib = NULL;
- m_dwLineWidth = 0;
- m_wColors = 0;
- m_hMemDC = NULL;
- m_hBitmap = NULL;
- m_lpBits = NULL;
- FreeResources();
- }
- CCeXDib::~CCeXDib()
- {
- FreeResources();
- }
- void CCeXDib::FreeResources()
- {
- if (m_hMemDC) ::DeleteDC(m_hMemDC);
- if (m_hBitmap) ::DeleteObject(m_hBitmap);
- if (m_hDib) delete m_hDib;
- m_hDib = NULL;
- m_hMemDC = NULL;
- m_hBitmap = NULL;
- m_lpBits = NULL;
- memset(&m_bi, 0, sizeof(m_bi));
- }
- HDIB CCeXDib::Create(DWORD dwWidth, DWORD dwHeight, WORD wBitCount)
- {
- LPBITMAPINFOHEADER lpbi = NULL;
- DWORD dwLen = 0;
- FreeResources();
-
-
- switch (wBitCount)
- {
- case 1: m_wColors = 2; break;
- #ifdef _WIN32_WCE
- case 2: m_wColors = 4; break;
- #endif
- case 4: m_wColors = 16; break;
- case 8: m_wColors = 256; break;
- case 16:
- case 24:
- case 32: m_wColors = 0; break;
- default:
- m_wColors = 0;
- }
- m_dwLineWidth = WIDTHBYTES(wBitCount * dwWidth);
-
- m_bi.biSize = sizeof(BITMAPINFOHEADER);
- m_bi.biWidth = dwWidth;
- m_bi.biHeight = dwHeight;
- m_bi.biPlanes = 1;
- m_bi.biBitCount = wBitCount;
- m_bi.biCompression = BI_RGB;
- m_bi.biSizeImage = m_dwLineWidth * dwHeight;
- m_bi.biXPelsPerMeter = 0;
- m_bi.biYPelsPerMeter = 0;
- m_bi.biClrUsed = 0;
- m_bi.biClrImportant = 0;
-
-
-
- dwLen = GetSize();
- m_hDib = new HDIB[dwLen];
- if (m_hDib == NULL) return NULL;
-
-
- lpbi = (LPBITMAPINFOHEADER)(m_hDib);
- *lpbi = m_bi;
- return m_hDib;
- }
- DWORD CCeXDib::GetSize()
- {
- return m_bi.biSize + m_bi.biSizeImage + GetPaletteSize();
- }
- DWORD CCeXDib::GetPaletteSize()
- {
- return (m_wColors * sizeof(RGBQUAD));
- }
- LPBYTE CCeXDib::GetBits()
- {
- if (m_hDib) return ((LPBYTE)m_hDib + *(LPDWORD)m_hDib + GetPaletteSize());
- return NULL;
- }
- DWORD CCeXDib::GetWidth()
- {
- return m_bi.biWidth;
- }
- DWORD CCeXDib::GetHeight()
- {
- return m_bi.biHeight;
- }
- DWORD CCeXDib::GetLineWidth()
- {
- return m_dwLineWidth;
- }
- void CCeXDib::BlendPalette(COLORREF crColor, DWORD dwPerc)
- {
- if (m_hDib == NULL || m_wColors == 0) return;
- LPBYTE iDst = (LPBYTE)(m_hDib) + sizeof(BITMAPINFOHEADER);
- long i,r,g,b;
- RGBQUAD* pPal = (RGBQUAD*)iDst;
- r = GetRValue(crColor);
- g = GetGValue(crColor);
- b = GetBValue(crColor);
- if (dwPerc > 100) dwPerc = 100;
- for (i = 0; i < m_wColors; i++)
- {
- pPal[i].rgbBlue = (BYTE)((pPal[i].rgbBlue * (100 - dwPerc) + b * dwPerc) / 100);
- pPal[i].rgbGreen = (BYTE)((pPal[i].rgbGreen * (100 - dwPerc) + g * dwPerc) / 100);
- pPal[i].rgbRed = (BYTE)((pPal[i].rgbRed * (100 - dwPerc) + r * dwPerc) / 100);
- }
- }
- void CCeXDib::Clear(BYTE byVal)
- {
- if (m_hDib) memset(GetBits(), byVal, m_bi.biSizeImage);
- }
- void CCeXDib::SetPixelIndex(DWORD dwX, DWORD dwY, BYTE byI)
- {
- if ((m_hDib == NULL) || (m_wColors == 0) ||
- ((long)dwX < 0) || ((long)dwY < 0) || (dwX >= (DWORD)m_bi.biWidth) || (dwY >= (DWORD)m_bi.biHeight)) return;
- LPBYTE iDst = GetBits();
- iDst[(m_bi.biHeight - dwY - 1) * m_dwLineWidth + dwX] = byI;
- }
- void CCeXDib::Clone(CCeXDib* src)
- {
- Create(src->GetWidth(), src->GetHeight(), src->GetBitCount());
- if (m_hDib) memcpy(m_hDib, src->m_hDib, GetSize());
- }
- WORD CCeXDib::GetBitCount()
- {
- return m_bi.biBitCount;
- }
- void CCeXDib::SetPaletteIndex(BYTE byIdx, BYTE byR, BYTE byG, BYTE byB)
- {
- if (m_hDib && m_wColors)
- {
- LPBYTE iDst = (LPBYTE)(m_hDib) + sizeof(BITMAPINFOHEADER);
- if ((byIdx >= 0) && (byIdx < m_wColors))
- {
- long ldx = byIdx * sizeof(RGBQUAD);
- iDst[ldx++] = (BYTE)byB;
- iDst[ldx++] = (BYTE)byG;
- iDst[ldx++] = (BYTE)byR;
- iDst[ldx] = (BYTE)0;
- }
- }
- }
- void CCeXDib::Draw(HDC hDC, DWORD dwX, DWORD dwY)
- {
- HBITMAP hBitmap = NULL;
- HBITMAP hOldBitmap = NULL;
- HDC hMemDC = NULL;
- if (m_hBitmap == NULL)
- {
- m_hBitmap = CreateDIBSection(hDC, (BITMAPINFO*)m_hDib, DIB_RGB_COLORS, &m_lpBits, NULL, 0);
- if (m_hBitmap == NULL) return;
- if (m_lpBits == NULL)
- {
- ::DeleteObject(m_hBitmap);
- m_hBitmap = NULL;
- return;
- }
- }
- memcpy(m_lpBits, GetBits(), m_bi.biSizeImage);
- if (m_hMemDC == NULL)
- {
- m_hMemDC = CreateCompatibleDC(hDC);
- if (m_hMemDC == NULL) return;
- }
- hOldBitmap = (HBITMAP)SelectObject(m_hMemDC, m_hBitmap);
- BitBlt(hDC, dwX, dwY, m_bi.biWidth, m_bi.biHeight, m_hMemDC, 0, 0, SRCCOPY);
- SelectObject(m_hMemDC, hOldBitmap);
- }
- void CCeXDib::SetGrayPalette()
- {
- RGBQUAD pal[256];
- RGBQUAD* ppal;
- LPBYTE iDst;
- int ni;
- if (m_hDib == NULL || m_wColors == 0) return;
- ppal = (RGBQUAD*)&pal[0];
- iDst = (LPBYTE)(m_hDib) + sizeof(BITMAPINFOHEADER);
- for (ni = 0; ni < m_wColors; ni++)
- {
- pal[ni] = RGB2RGBQUAD(RGB(ni,ni,ni));
- }
- pal[0] = RGB2RGBQUAD(RGB(0,0,0));
- pal[m_wColors-1] = RGB2RGBQUAD(RGB(255,255,255));
- memcpy(iDst, ppal, GetPaletteSize());
- }
- RGBQUAD CCeXDib::RGB2RGBQUAD(COLORREF cr)
- {
- RGBQUAD c;
- c.rgbRed = GetRValue(cr);
- c.rgbGreen = GetGValue(cr);
- c.rgbBlue = GetBValue(cr);
- c.rgbReserved=0;
- return c;
- }
- WORD CCeXDib::GetNumColors()
- {
- return m_wColors;
- }
- BOOL CCeXDib::WriteBMP(LPCTSTR bmpFileName)
- {
- BITMAPFILEHEADER hdr;
- HANDLE hFile;
- DWORD nByteWrite;
- if (*bmpFileName == _T('\0') || m_hDib == 0) return 0;
- hFile=CreateFile(
- bmpFileName,
- GENERIC_WRITE,
- 0,
- NULL,
- CREATE_ALWAYS,
- FILE_ATTRIBUTE_NORMAL,
- NULL
- );
- if (hFile == INVALID_HANDLE_VALUE) return FALSE;
-
- hdr.bfType = BFT_BITMAP;
- hdr.bfSize = GetSize() + sizeof(BITMAPFILEHEADER);
- hdr.bfReserved1 = hdr.bfReserved2 = 0;
- hdr.bfOffBits = (DWORD) sizeof(BITMAPFILEHEADER)+
- m_bi.biSize + GetPaletteSize();
-
- WriteFile(
- hFile,
- (LPSTR) &hdr,
- sizeof(BITMAPFILEHEADER),
- &nByteWrite,
- NULL
- );
-
- WriteFile(
- hFile,
- (LPSTR) m_hDib,
- GetSize(),
- &nByteWrite,
- NULL
- );
- CloseHandle(hFile);
- return TRUE;
- }
|