mirror of
https://github.com/GoogleChromeLabs/squoosh.git
synced 2025-11-14 17:49:52 +00:00
optimize srgb -> linear preparation by using lookup table
This commit is contained in:
@@ -5,12 +5,21 @@
|
|||||||
using namespace emscripten;
|
using namespace emscripten;
|
||||||
using namespace butteraugli;
|
using namespace butteraugli;
|
||||||
|
|
||||||
|
#define GAMMA 2.2
|
||||||
|
|
||||||
|
static double SrgbToLinear[256];
|
||||||
|
|
||||||
|
inline void gammaLookupTable() {
|
||||||
|
for (int i = 1; i < 256; ++i) {
|
||||||
|
SrgbToLinear[i] = pow(i / 255.0, GAMMA);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// Turns an interleaved RGBA buffer into 4 planes for each color channel
|
// Turns an interleaved RGBA buffer into 4 planes for each color channel
|
||||||
void planarize(std::vector<ImageF>& img,
|
void planarize(std::vector<ImageF>& img,
|
||||||
const uint8_t* rgba,
|
const uint8_t* rgba,
|
||||||
int width,
|
int width,
|
||||||
int height,
|
int height) {
|
||||||
float gamma = 2.2) {
|
|
||||||
assert(img.size() == 0);
|
assert(img.size() == 0);
|
||||||
img.push_back(ImageF(width, height));
|
img.push_back(ImageF(width, height));
|
||||||
img.push_back(ImageF(width, height));
|
img.push_back(ImageF(width, height));
|
||||||
@@ -22,10 +31,10 @@ void planarize(std::vector<ImageF>& img,
|
|||||||
float* const row_b = img[2].Row(y);
|
float* const row_b = img[2].Row(y);
|
||||||
float* const row_a = img[3].Row(y);
|
float* const row_a = img[3].Row(y);
|
||||||
for (int x = 0; x < width; x++) {
|
for (int x = 0; x < width; x++) {
|
||||||
row_r[x] = 255.0 * pow(rgba[(y * width + x) * 4 + 0] / 255.0, gamma);
|
row_r[x] = static_cast<float>(255.0 * SrgbToLinear[rgba[(y * width + x) * 4 + 0]]);
|
||||||
row_g[x] = 255.0 * pow(rgba[(y * width + x) * 4 + 1] / 255.0, gamma);
|
row_g[x] = static_cast<float>(255.0 * SrgbToLinear[rgba[(y * width + x) * 4 + 1]]);
|
||||||
row_b[x] = 255.0 * pow(rgba[(y * width + x) * 4 + 2] / 255.0, gamma);
|
row_b[x] = static_cast<float>(255.0 * SrgbToLinear[rgba[(y * width + x) * 4 + 2]]);
|
||||||
row_a[x] = 255.0 * pow(rgba[(y * width + x) * 4 + 3] / 255.0, gamma);
|
row_a[x] = static_cast<float>(255.0 * SrgbToLinear[rgba[(y * width + x) * 4 + 3]]);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -37,6 +46,7 @@ class VisDiff {
|
|||||||
|
|
||||||
public:
|
public:
|
||||||
VisDiff(std::string ref_img, int width, int height) {
|
VisDiff(std::string ref_img, int width, int height) {
|
||||||
|
gammaLookupTable();
|
||||||
planarize(this->ref_img, (uint8_t*)ref_img.c_str(), width, height);
|
planarize(this->ref_img, (uint8_t*)ref_img.c_str(), width, height);
|
||||||
this->width = width;
|
this->width = width;
|
||||||
this->height = height;
|
this->height = height;
|
||||||
|
|||||||
Reference in New Issue
Block a user