#include "lut.h"
#include "utils.h"
void write_lut_binary(vector<vector<float>> &lut, const int lutSize, const char *name)
{
int rgbSize = 3 * sizeof(int);
ofstream outFile(name, ios::out | ios::binary);
outFile.write((char*)&lutSize, sizeof(int));
for (int i = 0; i < lut.size(); i++) {
vector<int> rgb;
rgb.push_back(lut[i][0] * 255);
rgb.push_back(lut[i][1] * 255);
rgb.push_back(lut[i][2] * 255);
outFile.write((char*)&rgb[0], rgbSize);
}
outFile.close();
}
void parse_lut_cube(const string &filename, const char *binaryName)
{
vector<vector<float>> lut;
bool cubeDataStart = false, sizeDataStart = false;
int lut3dSize = 0;
ifstream in(filename);
string line;
while (getline(in, line)){
if (cubeDataStart) {
vector<string> strList;
vector<float> rgbList;
Libutils::split(line, " ", strList);
for (int i = 0; i < 3; i++) {
rgbList.push_back(atof(strList[i].c_str()));
}
lut.push_back(rgbList);
}
if (sizeDataStart) {
sizeDataStart = false;
string size = line.substr(sizeof("LUT_3D_SIZE"), sizeof(int));
lut3dSize = atoi(size.c_str());
}
if (strncmp(line.c_str(), "#LUT data points", sizeof("#LUT data points")) == 0) {
cubeDataStart = true;
}
if (strncmp(line.c_str(), "#LUT size", sizeof("#LUT size")) == 0) {
sizeDataStart = true;
}
}
in.close();
write_lut_binary(lut, lut3dSize, binaryName);
}