144 lines
2.4 KiB
C++
144 lines
2.4 KiB
C++
|
#include "StdAfx.h"
|
||
|
|
||
|
#include <assert.h>
|
||
|
#include "Image.h"
|
||
|
|
||
|
CImage::CImage(CImage & image)
|
||
|
{
|
||
|
Initialize();
|
||
|
|
||
|
int w = image.GetWidth();
|
||
|
int h = image.GetHeight();
|
||
|
|
||
|
Create(w, h);
|
||
|
|
||
|
DWORD * pdwDest = GetBasePointer();
|
||
|
DWORD * pdwSrc = image.GetBasePointer();
|
||
|
|
||
|
memcpy(pdwDest, pdwSrc, w * h * sizeof(DWORD));
|
||
|
}
|
||
|
|
||
|
void CImage::SetFileName(const char* c_szFileName)
|
||
|
{
|
||
|
m_stFileName = c_szFileName;
|
||
|
}
|
||
|
|
||
|
const std::string& CImage::GetFileNameString()
|
||
|
{
|
||
|
return m_stFileName;
|
||
|
}
|
||
|
|
||
|
void CImage::PutImage(int x, int y, CImage* pImage)
|
||
|
{
|
||
|
assert(x >= 0 && x + pImage->GetWidth() <= GetWidth());
|
||
|
assert(y >= 0 && y + pImage->GetHeight() <= GetHeight());
|
||
|
|
||
|
int len = pImage->GetWidth() * sizeof(DWORD);
|
||
|
|
||
|
for (int j = 0; j < pImage->GetHeight(); ++j)
|
||
|
{
|
||
|
DWORD * pdwDest = GetLinePointer(y + j) + x;
|
||
|
memcpy(pdwDest, pImage->GetLinePointer(j), len);
|
||
|
}
|
||
|
}
|
||
|
|
||
|
DWORD* CImage::GetBasePointer()
|
||
|
{
|
||
|
assert(m_pdwColors != NULL);
|
||
|
return m_pdwColors;
|
||
|
}
|
||
|
|
||
|
DWORD* CImage::GetLinePointer(int line)
|
||
|
{
|
||
|
assert(m_pdwColors != NULL);
|
||
|
return m_pdwColors + line * m_width;
|
||
|
}
|
||
|
|
||
|
int CImage::GetWidth() const
|
||
|
{
|
||
|
assert(m_pdwColors != NULL);
|
||
|
return m_width;
|
||
|
}
|
||
|
|
||
|
int CImage::GetHeight() const
|
||
|
{
|
||
|
assert(m_pdwColors != NULL);
|
||
|
return m_height;
|
||
|
}
|
||
|
|
||
|
void CImage::Clear(DWORD color)
|
||
|
{
|
||
|
assert(m_pdwColors != NULL);
|
||
|
|
||
|
for (int y = 0; y < m_height; ++y)
|
||
|
{
|
||
|
DWORD * colorLine = &m_pdwColors[y * m_width];
|
||
|
|
||
|
for (int x = 0; x < m_width; ++x)
|
||
|
colorLine[x] = color;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
void CImage::Create(int width, int height)
|
||
|
{
|
||
|
Destroy();
|
||
|
|
||
|
m_width = width;
|
||
|
m_height = height;
|
||
|
m_pdwColors = new DWORD[m_width*m_height];
|
||
|
}
|
||
|
|
||
|
void CImage::Destroy()
|
||
|
{
|
||
|
if (m_pdwColors)
|
||
|
{
|
||
|
delete [] m_pdwColors;
|
||
|
m_pdwColors = NULL;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
void CImage::Initialize()
|
||
|
{
|
||
|
m_pdwColors = NULL;
|
||
|
m_width = 0;
|
||
|
m_height = 0;
|
||
|
}
|
||
|
|
||
|
bool CImage::IsEmpty() const
|
||
|
{
|
||
|
return (m_pdwColors == NULL) ? true : false;
|
||
|
}
|
||
|
|
||
|
void CImage::FlipTopToBottom()
|
||
|
{
|
||
|
DWORD * swap = new DWORD[m_width * m_height];
|
||
|
|
||
|
int row;
|
||
|
UINT width = GetWidth();
|
||
|
UINT height = GetHeight();
|
||
|
DWORD * end_row;
|
||
|
DWORD * start_row;
|
||
|
|
||
|
for (row = 0; row < GetHeight() / 2; row++)
|
||
|
{
|
||
|
end_row = &(m_pdwColors[width * (height - row - 1)]);
|
||
|
start_row = &(m_pdwColors[width * row]);
|
||
|
|
||
|
memcpy(swap, end_row, width * sizeof(DWORD));
|
||
|
memcpy(end_row, start_row, width * sizeof(DWORD));
|
||
|
memcpy(start_row, swap, width * sizeof(DWORD));
|
||
|
}
|
||
|
|
||
|
delete [] swap;
|
||
|
}
|
||
|
|
||
|
CImage::CImage()
|
||
|
{
|
||
|
Initialize();
|
||
|
}
|
||
|
|
||
|
CImage::~CImage()
|
||
|
{
|
||
|
Destroy();
|
||
|
}
|