stuff-from-scratch/src/image/Image.cpp
2022-11-25 09:43:14 +00:00

122 lines
2.2 KiB
C++

#include "Image.h"
#include "Color.h"
template<typename T>
Image<T>::Image(unsigned width, unsigned height)
: mWidth(width),
mHeight(height)
{
}
template<typename T>
Image<T>::~Image()
{
}
template<typename T>
void Image<T>::initialize()
{
mData = std::vector<T>(getBytesPerRow()*mHeight, 10);
}
template<typename T>
void Image<T>::setDataItem(std::size_t index, T item)
{
if(index >= mData.size())
{
return;
}
mData[index] = item;
}
template<typename T>
void Image<T>::setPixelValue(unsigned idx, unsigned jdx, const Color& color)
{
if (mData.empty())
{
initialize();
}
mData[jdx*getBytesPerRow() + idx*3] = static_cast<T>(color.getR());
mData[jdx*getBytesPerRow() + idx*3 + 1] = static_cast<T>(color.getG());
mData[jdx*getBytesPerRow() + idx*3 + 2] = static_cast<T>(color.getB());
}
template<typename T>
std::unique_ptr<Image<T> > Image<T>::Create(unsigned width, unsigned height)
{
return std::make_unique<Image<T> >(width, height);
}
template<typename T>
unsigned Image<T>::getBytesPerRow() const
{
const auto bitsPerEntry = mBitDepth <= 8 ? 1 : 2;
return mWidth * mNumChannels *bitsPerEntry;
}
template<typename T>
unsigned Image<T>::getWidth() const
{
return mWidth;
}
template<typename T>
unsigned Image<T>::getHeight() const
{
return mHeight;
}
template<typename T>
unsigned Image<T>::getBitDepth() const
{
return mBitDepth;
}
template<typename T>
T Image<T>::getByte(unsigned idx, unsigned jdx) const
{
return mData[jdx*getBytesPerRow() + idx];
}
template<typename T>
unsigned Image<T>::getNumChannels() const
{
return mNumChannels;
}
template<typename T>
void Image<T>::setData(const std::vector<T>& data)
{
mData = data;
}
template<typename T>
void Image<T>::setWidth(unsigned width)
{
mWidth = width;
}
template<typename T>
void Image<T>::setHeight(unsigned height)
{
mHeight = height;
}
template<typename T>
void Image<T>::setBitDepth(unsigned bitDepth)
{
mBitDepth = bitDepth;
}
template<typename T>
void Image<T>::setNumChannels(unsigned numChannels)
{
mNumChannels = numChannels;
}
template class Image<unsigned char>;
//template class Image<uint8_t>;