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