mirror of
https://github.com/beefytech/Beef.git
synced 2025-06-10 12:32:20 +02:00
Initial checkin
This commit is contained in:
parent
c74712dad9
commit
078564ac9e
3242 changed files with 1616395 additions and 0 deletions
129
BeefySysLib/img/ImageData.cpp
Normal file
129
BeefySysLib/img/ImageData.cpp
Normal file
|
@ -0,0 +1,129 @@
|
|||
#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 NULL;
|
||||
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;
|
||||
}
|
||||
}
|
||||
}
|
Loading…
Add table
Add a link
Reference in a new issue