1ebefb2c3d8efda845e5e9a9eba66e0a341b4db82Jason Sams/*
2ebefb2c3d8efda845e5e9a9eba66e0a341b4db82Jason Sams * Copyright (C) 2012 The Android Open Source Project
3ebefb2c3d8efda845e5e9a9eba66e0a341b4db82Jason Sams *
4ebefb2c3d8efda845e5e9a9eba66e0a341b4db82Jason Sams * Licensed under the Apache License, Version 2.0 (the "License");
5ebefb2c3d8efda845e5e9a9eba66e0a341b4db82Jason Sams * you may not use this file except in compliance with the License.
6ebefb2c3d8efda845e5e9a9eba66e0a341b4db82Jason Sams * You may obtain a copy of the License at
7ebefb2c3d8efda845e5e9a9eba66e0a341b4db82Jason Sams *
8ebefb2c3d8efda845e5e9a9eba66e0a341b4db82Jason Sams *      http://www.apache.org/licenses/LICENSE-2.0
9ebefb2c3d8efda845e5e9a9eba66e0a341b4db82Jason Sams *
10ebefb2c3d8efda845e5e9a9eba66e0a341b4db82Jason Sams * Unless required by applicable law or agreed to in writing, software
11ebefb2c3d8efda845e5e9a9eba66e0a341b4db82Jason Sams * distributed under the License is distributed on an "AS IS" BASIS,
12ebefb2c3d8efda845e5e9a9eba66e0a341b4db82Jason Sams * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13ebefb2c3d8efda845e5e9a9eba66e0a341b4db82Jason Sams * See the License for the specific language governing permissions and
14ebefb2c3d8efda845e5e9a9eba66e0a341b4db82Jason Sams * limitations under the License.
15ebefb2c3d8efda845e5e9a9eba66e0a341b4db82Jason Sams */
16ebefb2c3d8efda845e5e9a9eba66e0a341b4db82Jason Sams
17ebefb2c3d8efda845e5e9a9eba66e0a341b4db82Jason Samsfloat inBlack;
18ebefb2c3d8efda845e5e9a9eba66e0a341b4db82Jason Samsfloat outBlack;
19ebefb2c3d8efda845e5e9a9eba66e0a341b4db82Jason Samsfloat inWMinInB;
20ebefb2c3d8efda845e5e9a9eba66e0a341b4db82Jason Samsfloat outWMinOutB;
21ebefb2c3d8efda845e5e9a9eba66e0a341b4db82Jason Samsfloat overInWMinInB;
22ebefb2c3d8efda845e5e9a9eba66e0a341b4db82Jason Samsrs_matrix3x3 colorMat;
23ebefb2c3d8efda845e5e9a9eba66e0a341b4db82Jason Sams
24ebefb2c3d8efda845e5e9a9eba66e0a341b4db82Jason Samsvoid root(const uchar4 *in, uchar4 *out, uint32_t x, uint32_t y) {
25ebefb2c3d8efda845e5e9a9eba66e0a341b4db82Jason Sams    float3 pixel = convert_float4(in[0]).rgb;
26ebefb2c3d8efda845e5e9a9eba66e0a341b4db82Jason Sams    pixel = rsMatrixMultiply(&colorMat, pixel);
27ebefb2c3d8efda845e5e9a9eba66e0a341b4db82Jason Sams    pixel = clamp(pixel, 0.f, 255.f);
28ebefb2c3d8efda845e5e9a9eba66e0a341b4db82Jason Sams    pixel = (pixel - inBlack) * overInWMinInB;
29ebefb2c3d8efda845e5e9a9eba66e0a341b4db82Jason Sams    pixel = pixel * outWMinOutB + outBlack;
30ebefb2c3d8efda845e5e9a9eba66e0a341b4db82Jason Sams    pixel = clamp(pixel, 0.f, 255.f);
31ebefb2c3d8efda845e5e9a9eba66e0a341b4db82Jason Sams    out->xyz = convert_uchar3(pixel);
32ebefb2c3d8efda845e5e9a9eba66e0a341b4db82Jason Sams    out->w = 0xff;
33ebefb2c3d8efda845e5e9a9eba66e0a341b4db82Jason Sams}
34ebefb2c3d8efda845e5e9a9eba66e0a341b4db82Jason Sams
35ebefb2c3d8efda845e5e9a9eba66e0a341b4db82Jason Samsvoid root4(const uchar4 *in, uchar4 *out, uint32_t x, uint32_t y) {
36ebefb2c3d8efda845e5e9a9eba66e0a341b4db82Jason Sams    float4 pixel = convert_float4(in[0]);
37ebefb2c3d8efda845e5e9a9eba66e0a341b4db82Jason Sams    pixel.rgb = rsMatrixMultiply(&colorMat, pixel.rgb);
38ebefb2c3d8efda845e5e9a9eba66e0a341b4db82Jason Sams    pixel = clamp(pixel, 0.f, 255.f);
39ebefb2c3d8efda845e5e9a9eba66e0a341b4db82Jason Sams    pixel = (pixel - inBlack) * overInWMinInB;
40ebefb2c3d8efda845e5e9a9eba66e0a341b4db82Jason Sams    pixel = pixel * outWMinOutB + outBlack;
41ebefb2c3d8efda845e5e9a9eba66e0a341b4db82Jason Sams    pixel = clamp(pixel, 0.f, 255.f);
42ebefb2c3d8efda845e5e9a9eba66e0a341b4db82Jason Sams    out->xyzw = convert_uchar4(pixel);
43ebefb2c3d8efda845e5e9a9eba66e0a341b4db82Jason Sams}
44ebefb2c3d8efda845e5e9a9eba66e0a341b4db82Jason Sams
45