static SkData* make_3Dlut(int* cubeDimension, bool invR, bool invG, bool invB) { int size = 4 << R(5); SkData* data = SkData::NewUninitialized(sizeof(SkColor) * size * size * size); SkColor* pixels = (SkColor*)(data->writable_data()); SkAutoTMalloc<uint8_t> lutMemory(size); SkAutoTMalloc<uint8_t> invLutMemory(size); uint8_t* lut = lutMemory.get(); uint8_t* invLut = invLutMemory.get(); const int maxIndex = size - 1; for (int i = 0; i < size; i++) { lut[i] = (i * 255) / maxIndex; invLut[i] = ((maxIndex - i) * 255) / maxIndex; } for (int r = 0; r < size; ++r) { for (int g = 0; g < size; ++g) { for (int b = 0; b < size; ++b) { pixels[(size * ((size * b) + g)) + r] = SkColorSetARGB(0xFF, invR ? invLut[r] : lut[r], invG ? invLut[g] : lut[g], invB ? invLut[b] : lut[b]); } } } if (cubeDimension) { *cubeDimension = size; } return data; }
void makeCubeData() { fCubeDimension = 32; fCubeData = SkData::NewUninitialized(sizeof(SkColor) * fCubeDimension * fCubeDimension * fCubeDimension); SkColor* pixels = (SkColor*)(fCubeData->writable_data()); SkAutoTMalloc<uint8_t> lutMemory(fCubeDimension); uint8_t* lut = lutMemory.get(); const int maxIndex = fCubeDimension - 1; for (int i = 0; i < fCubeDimension; ++i) { // Make an invert lut, but the content of // the lut shouldn't affect performance. lut[i] = ((maxIndex - i) * 255) / maxIndex; } for (int r = 0; r < fCubeDimension; ++r) { for (int g = 0; g < fCubeDimension; ++g) { for (int b = 0; b < fCubeDimension; ++b) { pixels[(fCubeDimension * ((fCubeDimension * b) + g)) + r] = SkColorSetARGB(0xFF, lut[r], lut[g], lut[b]); } } } }
void make_3Dlut(SkData** data, int size, bool invR, bool invG, bool invB) { *data = SkData::NewUninitialized(sizeof(SkColor) * size * size * size); SkColor* pixels = (SkColor*)((*data)->writable_data()); SkAutoMalloc lutMemory(size); SkAutoMalloc invLutMemory(size); uint8_t* lut = (uint8_t*)lutMemory.get(); uint8_t* invLut = (uint8_t*)invLutMemory.get(); const int maxIndex = size - 1; for (int i = 0; i < size; i++) { lut[i] = (i * 255) / maxIndex; invLut[i] = ((maxIndex - i) * 255) / maxIndex; } for (int r = 0; r < size; ++r) { for (int g = 0; g < size; ++g) { for (int b = 0; b < size; ++b) { pixels[(size * ((size * b) + g)) + r] = SkColorSetARGB(0xFF, invR ? invLut[r] : lut[r], invG ? invLut[g] : lut[g], invB ? invLut[b] : lut[b]); } } } }