Files
lime/project/src/math/ColorMatrix.cpp
2015-07-21 11:09:35 -07:00

167 lines
2.3 KiB
C++

#include <math/ColorMatrix.h>
#include <utils/Bytes.h>
namespace lime {
static int id_buffer;
static bool init = false;
ColorMatrix::ColorMatrix () {
for (int i = 0; i < 20; i++) {
if (i % 6 == 0) {
data[i] = 1;
} else {
data[i] = 0;
}
}
}
ColorMatrix::ColorMatrix (value colorMatrix) {
if (!init) {
id_buffer = val_id ("buffer");
init = true;
}
value buffer_value = val_field (colorMatrix, id_buffer);
Bytes bytes = Bytes (buffer_value);
float* src = (float*)bytes.Data ();
for (int i = 0; i < 20; i++) {
data[i] = src[i];
}
}
ColorMatrix::~ColorMatrix () {
}
float inline ColorMatrix::GetAlphaMultiplier () {
return data[18];
}
float inline ColorMatrix::GetAlphaOffset () {
return data[19] * 255;
}
void ColorMatrix::GetAlphaTable (unsigned char* table) {
GetDataTable (table, GetAlphaMultiplier (), GetAlphaOffset ());
}
float inline ColorMatrix::GetBlueMultiplier () {
return data[12];
}
float inline ColorMatrix::GetBlueOffset () {
return data[14] * 255;
}
void ColorMatrix::GetBlueTable (unsigned char* table) {
GetDataTable (table, GetBlueMultiplier (), GetBlueOffset ());
}
int32_t inline ColorMatrix::GetColor () {
return ((int (GetRedOffset ()) << 16) | (int (GetGreenOffset ()) << 8) | int (GetBlueOffset ()));
}
void inline ColorMatrix::GetDataTable (unsigned char* table, float multiplier, float offset) {
int32_t value;
for (int i = 0; i < 256; i++) {
value = (int)(i * multiplier + offset);
if (value > 0xFF) value = 0xFF;
if (value < 0) value = 0;
table[i] = value;
}
}
float inline ColorMatrix::GetGreenMultiplier () {
return data[6];
}
float inline ColorMatrix::GetGreenOffset () {
return data[9] * 255;
}
void ColorMatrix::GetGreenTable (unsigned char* table) {
GetDataTable (table, GetGreenMultiplier (), GetGreenOffset ());
}
float inline ColorMatrix::GetRedMultiplier () {
return data[0];
}
float inline ColorMatrix::GetRedOffset () {
return data[4] * 255;
}
void ColorMatrix::GetRedTable (unsigned char* table) {
GetDataTable (table, GetRedMultiplier (), GetRedOffset ());
}
}