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;
}
Exemplo n.º 2
0
 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]);
             }
         }
     }
 }