164 lines
3.7 KiB
C++
164 lines
3.7 KiB
C++
#include "StdAfx.h"
|
|
#include "DibBar.h"
|
|
#include "BlockTexture.h"
|
|
|
|
void CDibBar::Invalidate()
|
|
{
|
|
RECT rect = {0, 0, m_dwWidth, m_dwHeight};
|
|
|
|
std::vector<CBlockTexture *>::iterator itor = m_kVec_pkBlockTexture.begin();
|
|
for (; itor != m_kVec_pkBlockTexture.end(); ++itor)
|
|
{
|
|
CBlockTexture * pTexture = *itor;
|
|
pTexture->InvalidateRect(rect);
|
|
}
|
|
}
|
|
|
|
void CDibBar::SetClipRect(const RECT & c_rRect)
|
|
{
|
|
std::vector<CBlockTexture *>::iterator itor = m_kVec_pkBlockTexture.begin();
|
|
for (; itor != m_kVec_pkBlockTexture.end(); ++itor)
|
|
{
|
|
CBlockTexture * pTexture = *itor;
|
|
assert(pTexture);
|
|
if (!pTexture)
|
|
continue;
|
|
pTexture->SetClipRect(c_rRect);
|
|
}
|
|
}
|
|
|
|
void CDibBar::ClearBar()
|
|
{
|
|
DWORD * pdwBuf = (DWORD *)m_dib.GetPointer();
|
|
memset(pdwBuf, 0, m_dib.GetWidth()*m_dib.GetHeight()*4);
|
|
Invalidate();
|
|
}
|
|
|
|
void CDibBar::Render(int ix, int iy)
|
|
{
|
|
std::vector<CBlockTexture *>::iterator itor = m_kVec_pkBlockTexture.begin();
|
|
for (; itor != m_kVec_pkBlockTexture.end(); ++itor)
|
|
{
|
|
CBlockTexture * pTexture = *itor;
|
|
pTexture->Render(ix, iy);
|
|
}
|
|
}
|
|
|
|
DWORD CDibBar::__NearTextureSize(DWORD dwSize)
|
|
{
|
|
if ((dwSize & (dwSize-1)) == 0)
|
|
return dwSize;
|
|
|
|
DWORD dwRet = 2;
|
|
while (dwRet < dwSize)
|
|
{
|
|
dwRet <<= 1;
|
|
}
|
|
|
|
return dwRet;
|
|
}
|
|
|
|
void CDibBar::__DivideTextureSize(DWORD dwSize, DWORD dwMax, DWORD * pdwxStep, DWORD * pdwxCount, DWORD * pdwxRest)
|
|
{
|
|
if (dwSize<dwMax)
|
|
{
|
|
*pdwxStep = dwMax;
|
|
*pdwxCount = 0;
|
|
*pdwxRest = dwSize%dwMax;
|
|
return;
|
|
}
|
|
|
|
*pdwxStep = dwMax;
|
|
*pdwxCount = dwSize/dwMax;
|
|
*pdwxRest = dwSize%dwMax;
|
|
}
|
|
|
|
CBlockTexture * CDibBar::__BuildTextureBlock(DWORD dwxPos, DWORD dwyPos, DWORD dwImageWidth, DWORD dwImageHeight, DWORD dwTextureWidth, DWORD dwTextureHeight)
|
|
{
|
|
if (dwTextureWidth == 0 || dwTextureHeight == 0)
|
|
return NULL;
|
|
|
|
RECT posRect = {dwxPos, dwyPos, dwxPos+dwImageWidth, dwyPos+dwImageHeight};
|
|
|
|
CBlockTexture * pBlockTexture = new CBlockTexture;
|
|
if (!pBlockTexture->Create(&m_dib, posRect, dwTextureWidth, dwTextureHeight))
|
|
{
|
|
delete pBlockTexture;
|
|
return NULL;
|
|
}
|
|
|
|
return pBlockTexture;
|
|
}
|
|
|
|
void CDibBar::__BuildTextureBlockList(DWORD dwWidth, DWORD dwHeight, DWORD dwMax)
|
|
{
|
|
DWORD dwxStep, dwyStep;
|
|
DWORD dwxCount, dwyCount;
|
|
DWORD dwxRest, dwyRest;
|
|
__DivideTextureSize(dwWidth, dwMax, &dwxStep, &dwxCount, &dwxRest);
|
|
__DivideTextureSize(dwHeight, dwMax, &dwyStep, &dwyCount, &dwyRest);
|
|
DWORD dwxTexRest = __NearTextureSize(dwxRest);
|
|
DWORD dwyTexRest = __NearTextureSize(dwyRest);
|
|
|
|
for (DWORD y = 0; y < dwyCount; ++y)
|
|
{
|
|
for (DWORD x = 0; x < dwxCount; ++x)
|
|
{
|
|
CBlockTexture * pTexture = __BuildTextureBlock(x*dwxStep, y*dwyStep,
|
|
dwxStep, dwyStep,
|
|
dwMax, dwMax);
|
|
if (pTexture)
|
|
m_kVec_pkBlockTexture.push_back(pTexture);
|
|
}
|
|
|
|
CBlockTexture * pTexture = __BuildTextureBlock(dwxCount*dwxStep, y*dwyStep,
|
|
dwxRest, dwyStep,
|
|
dwxTexRest, dwMax);
|
|
|
|
if (pTexture)
|
|
m_kVec_pkBlockTexture.push_back(pTexture);
|
|
}
|
|
|
|
for (DWORD x = 0; x < dwxCount; ++x)
|
|
{
|
|
CBlockTexture * pTexture = __BuildTextureBlock(x*dwxStep, dwyCount*dwyStep,
|
|
dwxStep, dwyRest,
|
|
dwMax, dwyTexRest);
|
|
if (pTexture)
|
|
m_kVec_pkBlockTexture.push_back(pTexture);
|
|
}
|
|
|
|
if (dwxRest > 0 && dwyRest > 0)
|
|
{
|
|
CBlockTexture * pTexture = __BuildTextureBlock(dwxCount*dwxStep, dwyCount*dwyStep,
|
|
dwxRest, dwyRest,
|
|
dwxTexRest, dwyTexRest);
|
|
if (pTexture)
|
|
m_kVec_pkBlockTexture.push_back(pTexture);
|
|
}
|
|
}
|
|
|
|
bool CDibBar::Create(HDC hdc, DWORD dwWidth, DWORD dwHeight)
|
|
{
|
|
if (!m_dib.Create(hdc, dwWidth, dwHeight))
|
|
{
|
|
Tracef(" Failed to create CDibBar\n");
|
|
return false;
|
|
}
|
|
|
|
m_dwWidth = dwWidth;
|
|
m_dwHeight = dwHeight;
|
|
|
|
__BuildTextureBlockList(dwWidth, dwHeight);
|
|
OnCreate();
|
|
|
|
return true;
|
|
}
|
|
|
|
CDibBar::CDibBar()
|
|
{
|
|
}
|
|
CDibBar::~CDibBar()
|
|
{
|
|
}
|