1
0
Fork 0
mirror of https://github.com/beefytech/Beef.git synced 2025-06-08 19:48:20 +02:00
Beef/BeefySysLib/img/ImageData.cpp
Brian Fiete 22ec4a86b8 Initial macOS changes
Many changes are related to fixing warnings
2019-10-14 14:08:29 -07:00

129 lines
No EOL
2.4 KiB
C++

#include "ImageData.h"
#include "ImageUtils.h"
USING_NS_BF;
ImageData::ImageData()
{
mSrcData = NULL;
mOwnsSrcData = false;
mKeepSrcDataValid = false;
mBits = NULL;
mHWBitsType = 0;
mHWBitsLength = 0;
mHWBits = NULL;
mX = 0;
mY = 0;
mWidth = 0;
mHeight = 0;
mWantsAlphaPremultiplied = true;
mAlphaPremultiplied = false;
mIsAdditive = false;
mSrcDataLen = 0;
}
ImageData::~ImageData()
{
delete [] mBits;
delete [] mSrcData;
}
void ImageData::SwapRAndB()
{
int aSize = mWidth*mHeight;
uint32* aPtr = mBits;
for (int i = 0; i < aSize; i++)
{
uint32 aColor = *aPtr;
int a = (aColor & 0xFF000000) >> 24;
int r = (aColor & 0x00FF0000) >> 16;
int g = (aColor & 0x0000FF00) >> 8;
int b = (aColor & 0x000000FF);
*(aPtr++) = (a << 24) | (b << 16) | (g << 8) | r;
}
}
void ImageData::CreateNew(int x, int y, int width, int height, bool clear)
{
CreateNew(width, height, clear);
mX = x;
mY = y;
}
void ImageData::CreateNew(int width, int height, bool clear)
{
mWidth = width;
mHeight = height;
mBits = new uint32[mWidth*mHeight];
if (clear)
memset(mBits, 0, mWidth*mHeight*sizeof(uint32));
}
void ImageData::Fill(uint32 color)
{
int size = mWidth*mHeight;
for (int i = 0; i < size; i++)
mBits[i] = color;
}
ImageData* ImageData::Duplicate()
{
ImageData* copy = new ImageData();
copy->CreateNew(mWidth, mHeight);
copy->mX = mX;
copy->mY = mY;
copy->mAlphaPremultiplied = mAlphaPremultiplied;
copy->mIsAdditive = mIsAdditive;
memcpy(copy->mBits, mBits, mWidth*mHeight*sizeof(uint32));
return copy;
}
bool ImageData::LoadFromFile(const StringImpl& path)
{
int size = 0;
uint8* aData = LoadBinaryData(path, &size);
if (aData == NULL)
return false;
SetSrcData(aData, size);
bool result = ReadData();
if (mKeepSrcDataValid)
{
mOwnsSrcData = true;
}
else
{
delete [] mSrcData;
mSrcData = NULL;
}
return result;
}
void ImageData::SetSrcData(uint8* data, int dataLen)
{
mSrcData = data;
mSrcDataLen = dataLen;
}
void ImageData::PremultiplyAlpha()
{
if (mBits == NULL)
return;
if (!mAlphaPremultiplied)
{
mAlphaPremultiplied = true;
int size = mWidth*mHeight;
for (int i = 0; i < size; i++)
{
PackedColor* packedColor = (PackedColor*) (mBits + i);
packedColor->r = (packedColor->r * packedColor->a) / 255;
packedColor->g = (packedColor->g * packedColor->a) / 255;
packedColor->b = (packedColor->b * packedColor->a) / 255;
if (mIsAdditive)
packedColor->a = 0;
}
}
}