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