///////////////////////////////////////////////////////////////////////////////
//  CFileImageMaker.cpp

#include "CFileImageMaker.h"

namespace fileimage {

CFileImageMaker::CFileImageMaker()
{

}

CFileImageMaker::~CFileImageMaker()
{

}

void CFileImageMaker::AddByte(unsigned char Data)
{
	m_ImageData.push_back(Data);

}

void CFileImageMaker::AddBool(bool Data)
{
	m_ImageData.push_back((Data) ? (1) : (0));

}

void CFileImageMaker::AddWord(unsigned short Data)
{
	m_ImageData.push_back(static_cast<unsigned char>(Data & 0xff));
	m_ImageData.push_back(static_cast<unsigned char>(Data >> 8));

}

void CFileImageMaker::AddInt(int Data)
{
	AddDWord(static_cast<unsigned int>(Data));

}

void CFileImageMaker::AddDWord(unsigned int Data)
{
	m_ImageData.push_back(static_cast<unsigned char>(Data & 0xff));
	m_ImageData.push_back(static_cast<unsigned char>((Data >> 8) & 0xff));
	m_ImageData.push_back(static_cast<unsigned char>((Data >> 16) & 0xff));
	m_ImageData.push_back(static_cast<unsigned char>((Data >> 24) & 0xff));

}

void CFileImageMaker::AddFloat(float Data)
{
	const unsigned int DWordData = *reinterpret_cast<const unsigned int*>(&Data);

	AddDWord(DWordData);

}

void CFileImageMaker::AddString(const std::string& Text)
{
	m_ImageData.insert(m_ImageData.end(), reinterpret_cast<const unsigned char*>(Text.c_str()),
		reinterpret_cast<const unsigned char*>(Text.c_str()) + Text.length());

}

void CFileImageMaker::AddZeroTerminatedString(const std::string& Text)
{
	AddString(Text);

	m_ImageData.push_back(static_cast<unsigned char>('\0'));
}

void CFileImageMaker::AddStringAligned4(const std::string& Text)
{
	AddZeroTerminatedString(Text);

	size_t WrittenLength = Text.length() + 1;

	while ((WrittenLength % 4) != 0) {
		m_ImageData.push_back(static_cast<unsigned char>('\0'));
		++WrittenLength;
	}
}

void CFileImageMaker::AddMemoryBlock(const unsigned char* pData, int Size)
{
	if (!pData) return;
	if (Size <= 0) return;

	m_ImageData.insert(m_ImageData.end(), pData, pData + Size);

}

const std::vector<unsigned char>& CFileImageMaker::GetImageData() const
{
	return m_ImageData;

}

} // end of namespace fileimage

