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