15ab5155f7e0e0904f8c11cd0dbdbf7832e3ac948Yang Ni/*
25ab5155f7e0e0904f8c11cd0dbdbf7832e3ac948Yang Ni * Copyright (C) 2012 The Android Open Source Project
35ab5155f7e0e0904f8c11cd0dbdbf7832e3ac948Yang Ni *
45ab5155f7e0e0904f8c11cd0dbdbf7832e3ac948Yang Ni * Licensed under the Apache License, Version 2.0 (the "License");
55ab5155f7e0e0904f8c11cd0dbdbf7832e3ac948Yang Ni * you may not use this file except in compliance with the License.
65ab5155f7e0e0904f8c11cd0dbdbf7832e3ac948Yang Ni * You may obtain a copy of the License at
75ab5155f7e0e0904f8c11cd0dbdbf7832e3ac948Yang Ni *
85ab5155f7e0e0904f8c11cd0dbdbf7832e3ac948Yang Ni *      http://www.apache.org/licenses/LICENSE-2.0
95ab5155f7e0e0904f8c11cd0dbdbf7832e3ac948Yang Ni *
105ab5155f7e0e0904f8c11cd0dbdbf7832e3ac948Yang Ni * Unless required by applicable law or agreed to in writing, software
115ab5155f7e0e0904f8c11cd0dbdbf7832e3ac948Yang Ni * distributed under the License is distributed on an "AS IS" BASIS,
125ab5155f7e0e0904f8c11cd0dbdbf7832e3ac948Yang Ni * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
135ab5155f7e0e0904f8c11cd0dbdbf7832e3ac948Yang Ni * See the License for the specific language governing permissions and
145ab5155f7e0e0904f8c11cd0dbdbf7832e3ac948Yang Ni * limitations under the License.
155ab5155f7e0e0904f8c11cd0dbdbf7832e3ac948Yang Ni */
165ab5155f7e0e0904f8c11cd0dbdbf7832e3ac948Yang Ni
175ab5155f7e0e0904f8c11cd0dbdbf7832e3ac948Yang Nifloat inBlack;
185ab5155f7e0e0904f8c11cd0dbdbf7832e3ac948Yang Nifloat outBlack;
195ab5155f7e0e0904f8c11cd0dbdbf7832e3ac948Yang Nifloat inWMinInB;
205ab5155f7e0e0904f8c11cd0dbdbf7832e3ac948Yang Nifloat outWMinOutB;
215ab5155f7e0e0904f8c11cd0dbdbf7832e3ac948Yang Nifloat overInWMinInB;
225ab5155f7e0e0904f8c11cd0dbdbf7832e3ac948Yang Nirs_matrix3x3 colorMat;
235ab5155f7e0e0904f8c11cd0dbdbf7832e3ac948Yang Ni/*
245ab5155f7e0e0904f8c11cd0dbdbf7832e3ac948Yang Niuchar4 __attribute__((kernel)) root(uchar4 in) {
255ab5155f7e0e0904f8c11cd0dbdbf7832e3ac948Yang Ni    uchar4 out;
265ab5155f7e0e0904f8c11cd0dbdbf7832e3ac948Yang Ni    float3 pixel = convert_float4(in).rgb;
275ab5155f7e0e0904f8c11cd0dbdbf7832e3ac948Yang Ni    pixel = rsMatrixMultiply(&colorMat, pixel);
285ab5155f7e0e0904f8c11cd0dbdbf7832e3ac948Yang Ni    pixel = clamp(pixel, 0.f, 255.f);
295ab5155f7e0e0904f8c11cd0dbdbf7832e3ac948Yang Ni    pixel = (pixel - inBlack) * overInWMinInB;
305ab5155f7e0e0904f8c11cd0dbdbf7832e3ac948Yang Ni    pixel = pixel * outWMinOutB + outBlack;
315ab5155f7e0e0904f8c11cd0dbdbf7832e3ac948Yang Ni    pixel = clamp(pixel, 0.f, 255.f);
325ab5155f7e0e0904f8c11cd0dbdbf7832e3ac948Yang Ni    out.xyz = convert_uchar3(pixel);
335ab5155f7e0e0904f8c11cd0dbdbf7832e3ac948Yang Ni    out.w = 0xff;
345ab5155f7e0e0904f8c11cd0dbdbf7832e3ac948Yang Ni    return out;
355ab5155f7e0e0904f8c11cd0dbdbf7832e3ac948Yang Ni}
365ab5155f7e0e0904f8c11cd0dbdbf7832e3ac948Yang Ni*/
375ab5155f7e0e0904f8c11cd0dbdbf7832e3ac948Yang Ni
385ab5155f7e0e0904f8c11cd0dbdbf7832e3ac948Yang Nivoid initialize(float inBlack_, float outBlack_, float inWMinInB_, float outWMinOutB_,
395ab5155f7e0e0904f8c11cd0dbdbf7832e3ac948Yang Ni                float overInWMinInB_, rs_matrix3x3 colorMat_) {
405ab5155f7e0e0904f8c11cd0dbdbf7832e3ac948Yang Ni    inBlack = inBlack_;
415ab5155f7e0e0904f8c11cd0dbdbf7832e3ac948Yang Ni    outBlack = outBlack_;
425ab5155f7e0e0904f8c11cd0dbdbf7832e3ac948Yang Ni    inWMinInB = inWMinInB_;
435ab5155f7e0e0904f8c11cd0dbdbf7832e3ac948Yang Ni    outWMinOutB = outWMinOutB_;
445ab5155f7e0e0904f8c11cd0dbdbf7832e3ac948Yang Ni    overInWMinInB = overInWMinInB_;
455ab5155f7e0e0904f8c11cd0dbdbf7832e3ac948Yang Ni    colorMat = colorMat_;
465ab5155f7e0e0904f8c11cd0dbdbf7832e3ac948Yang Ni}
475ab5155f7e0e0904f8c11cd0dbdbf7832e3ac948Yang Ni
485ab5155f7e0e0904f8c11cd0dbdbf7832e3ac948Yang Nifloat4 __attribute__((kernel)) levels_v4(float4 in) {
495ab5155f7e0e0904f8c11cd0dbdbf7832e3ac948Yang Ni    float4 pixel;
505ab5155f7e0e0904f8c11cd0dbdbf7832e3ac948Yang Ni    pixel.rgb = rsMatrixMultiply(&colorMat, in.rgb);
515ab5155f7e0e0904f8c11cd0dbdbf7832e3ac948Yang Ni    pixel = clamp(pixel, 0.f, 255.f);
525ab5155f7e0e0904f8c11cd0dbdbf7832e3ac948Yang Ni    pixel = (pixel - inBlack) * overInWMinInB;
535ab5155f7e0e0904f8c11cd0dbdbf7832e3ac948Yang Ni    pixel = pixel * outWMinOutB + outBlack;
545ab5155f7e0e0904f8c11cd0dbdbf7832e3ac948Yang Ni    return pixel;
555ab5155f7e0e0904f8c11cd0dbdbf7832e3ac948Yang Ni}
565ab5155f7e0e0904f8c11cd0dbdbf7832e3ac948Yang Ni
57