xref: /aosp_15_r20/frameworks/rs/toolkit/Lut.cpp (revision e1eccf28f96817838ad6867f7f39d2351ec11f56)
1*e1eccf28SAndroid Build Coastguard Worker /*
2*e1eccf28SAndroid Build Coastguard Worker  * Copyright (C) 2012 The Android Open Source Project
3*e1eccf28SAndroid Build Coastguard Worker  *
4*e1eccf28SAndroid Build Coastguard Worker  * Licensed under the Apache License, Version 2.0 (the "License");
5*e1eccf28SAndroid Build Coastguard Worker  * you may not use this file except in compliance with the License.
6*e1eccf28SAndroid Build Coastguard Worker  * You may obtain a copy of the License at
7*e1eccf28SAndroid Build Coastguard Worker  *
8*e1eccf28SAndroid Build Coastguard Worker  *      http://www.apache.org/licenses/LICENSE-2.0
9*e1eccf28SAndroid Build Coastguard Worker  *
10*e1eccf28SAndroid Build Coastguard Worker  * Unless required by applicable law or agreed to in writing, software
11*e1eccf28SAndroid Build Coastguard Worker  * distributed under the License is distributed on an "AS IS" BASIS,
12*e1eccf28SAndroid Build Coastguard Worker  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13*e1eccf28SAndroid Build Coastguard Worker  * See the License for the specific language governing permissions and
14*e1eccf28SAndroid Build Coastguard Worker  * limitations under the License.
15*e1eccf28SAndroid Build Coastguard Worker  */
16*e1eccf28SAndroid Build Coastguard Worker 
17*e1eccf28SAndroid Build Coastguard Worker #include <cstdint>
18*e1eccf28SAndroid Build Coastguard Worker 
19*e1eccf28SAndroid Build Coastguard Worker #include "RenderScriptToolkit.h"
20*e1eccf28SAndroid Build Coastguard Worker #include "TaskProcessor.h"
21*e1eccf28SAndroid Build Coastguard Worker #include "Utils.h"
22*e1eccf28SAndroid Build Coastguard Worker 
23*e1eccf28SAndroid Build Coastguard Worker #define LOG_TAG "renderscript.toolkit.Lut"
24*e1eccf28SAndroid Build Coastguard Worker 
25*e1eccf28SAndroid Build Coastguard Worker namespace android {
26*e1eccf28SAndroid Build Coastguard Worker namespace renderscript {
27*e1eccf28SAndroid Build Coastguard Worker 
28*e1eccf28SAndroid Build Coastguard Worker class LutTask : public Task {
29*e1eccf28SAndroid Build Coastguard Worker     const uchar4* mIn;
30*e1eccf28SAndroid Build Coastguard Worker     uchar4* mOut;
31*e1eccf28SAndroid Build Coastguard Worker     const uchar* mRedTable;
32*e1eccf28SAndroid Build Coastguard Worker     const uchar* mGreenTable;
33*e1eccf28SAndroid Build Coastguard Worker     const uchar* mBlueTable;
34*e1eccf28SAndroid Build Coastguard Worker     const uchar* mAlphaTable;
35*e1eccf28SAndroid Build Coastguard Worker 
36*e1eccf28SAndroid Build Coastguard Worker     // Process a 2D tile of the overall work. threadIndex identifies which thread does the work.
37*e1eccf28SAndroid Build Coastguard Worker     virtual void processData(int threadIndex, size_t startX, size_t startY, size_t endX,
38*e1eccf28SAndroid Build Coastguard Worker                              size_t endY) override;
39*e1eccf28SAndroid Build Coastguard Worker 
40*e1eccf28SAndroid Build Coastguard Worker    public:
LutTask(const uint8_t * input,uint8_t * output,size_t sizeX,size_t sizeY,const uint8_t * red,const uint8_t * green,const uint8_t * blue,const uint8_t * alpha,const Restriction * restriction)41*e1eccf28SAndroid Build Coastguard Worker     LutTask(const uint8_t* input, uint8_t* output, size_t sizeX, size_t sizeY, const uint8_t* red,
42*e1eccf28SAndroid Build Coastguard Worker             const uint8_t* green, const uint8_t* blue, const uint8_t* alpha,
43*e1eccf28SAndroid Build Coastguard Worker             const Restriction* restriction)
44*e1eccf28SAndroid Build Coastguard Worker         : Task{sizeX, sizeY, 4, true, restriction},
45*e1eccf28SAndroid Build Coastguard Worker           mIn{reinterpret_cast<const uchar4*>(input)},
46*e1eccf28SAndroid Build Coastguard Worker           mOut{reinterpret_cast<uchar4*>(output)},
47*e1eccf28SAndroid Build Coastguard Worker           mRedTable{red},
48*e1eccf28SAndroid Build Coastguard Worker           mGreenTable{green},
49*e1eccf28SAndroid Build Coastguard Worker           mBlueTable{blue},
50*e1eccf28SAndroid Build Coastguard Worker           mAlphaTable{alpha} {}
51*e1eccf28SAndroid Build Coastguard Worker };
52*e1eccf28SAndroid Build Coastguard Worker 
processData(int,size_t startX,size_t startY,size_t endX,size_t endY)53*e1eccf28SAndroid Build Coastguard Worker void LutTask::processData(int /* threadIndex */, size_t startX, size_t startY, size_t endX,
54*e1eccf28SAndroid Build Coastguard Worker                           size_t endY) {
55*e1eccf28SAndroid Build Coastguard Worker     for (size_t y = startY; y < endY; y++) {
56*e1eccf28SAndroid Build Coastguard Worker         size_t offset = mSizeX * y + startX;
57*e1eccf28SAndroid Build Coastguard Worker         const uchar4* in = mIn + offset;
58*e1eccf28SAndroid Build Coastguard Worker         uchar4* out = mOut + offset;
59*e1eccf28SAndroid Build Coastguard Worker         for (size_t x = startX; x < endX; x++) {
60*e1eccf28SAndroid Build Coastguard Worker             auto v = *in;
61*e1eccf28SAndroid Build Coastguard Worker             *out = uchar4{mRedTable[v.x], mGreenTable[v.y], mBlueTable[v.z], mAlphaTable[v.w]};
62*e1eccf28SAndroid Build Coastguard Worker             in++;
63*e1eccf28SAndroid Build Coastguard Worker             out++;
64*e1eccf28SAndroid Build Coastguard Worker         }
65*e1eccf28SAndroid Build Coastguard Worker     }
66*e1eccf28SAndroid Build Coastguard Worker }
67*e1eccf28SAndroid Build Coastguard Worker 
lut(const uint8_t * input,uint8_t * output,size_t sizeX,size_t sizeY,const uint8_t * red,const uint8_t * green,const uint8_t * blue,const uint8_t * alpha,const Restriction * restriction)68*e1eccf28SAndroid Build Coastguard Worker void RenderScriptToolkit::lut(const uint8_t* input, uint8_t* output, size_t sizeX, size_t sizeY,
69*e1eccf28SAndroid Build Coastguard Worker                               const uint8_t* red, const uint8_t* green, const uint8_t* blue,
70*e1eccf28SAndroid Build Coastguard Worker                               const uint8_t* alpha, const Restriction* restriction) {
71*e1eccf28SAndroid Build Coastguard Worker #ifdef ANDROID_RENDERSCRIPT_TOOLKIT_VALIDATE
72*e1eccf28SAndroid Build Coastguard Worker     if (!validRestriction(LOG_TAG, sizeX, sizeY, restriction)) {
73*e1eccf28SAndroid Build Coastguard Worker         return;
74*e1eccf28SAndroid Build Coastguard Worker     }
75*e1eccf28SAndroid Build Coastguard Worker #endif
76*e1eccf28SAndroid Build Coastguard Worker 
77*e1eccf28SAndroid Build Coastguard Worker     LutTask task(input, output, sizeX, sizeY, red, green, blue, alpha, restriction);
78*e1eccf28SAndroid Build Coastguard Worker     processor->doTask(&task);
79*e1eccf28SAndroid Build Coastguard Worker }
80*e1eccf28SAndroid Build Coastguard Worker 
81*e1eccf28SAndroid Build Coastguard Worker }  // namespace renderscript
82*e1eccf28SAndroid Build Coastguard Worker }  // namespace android
83