19ba9a663a00c15d584a0a292bf74e154804240b5Jason Sams/*
29ba9a663a00c15d584a0a292bf74e154804240b5Jason Sams * Copyright (C) 2012 The Android Open Source Project
39ba9a663a00c15d584a0a292bf74e154804240b5Jason Sams *
49ba9a663a00c15d584a0a292bf74e154804240b5Jason Sams * Licensed under the Apache License, Version 2.0 (the "License");
59ba9a663a00c15d584a0a292bf74e154804240b5Jason Sams * you may not use this file except in compliance with the License.
69ba9a663a00c15d584a0a292bf74e154804240b5Jason Sams * You may obtain a copy of the License at
79ba9a663a00c15d584a0a292bf74e154804240b5Jason Sams *
89ba9a663a00c15d584a0a292bf74e154804240b5Jason Sams *      http://www.apache.org/licenses/LICENSE-2.0
99ba9a663a00c15d584a0a292bf74e154804240b5Jason Sams *
109ba9a663a00c15d584a0a292bf74e154804240b5Jason Sams * Unless required by applicable law or agreed to in writing, software
119ba9a663a00c15d584a0a292bf74e154804240b5Jason Sams * distributed under the License is distributed on an "AS IS" BASIS,
129ba9a663a00c15d584a0a292bf74e154804240b5Jason Sams * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
139ba9a663a00c15d584a0a292bf74e154804240b5Jason Sams * See the License for the specific language governing permissions and
149ba9a663a00c15d584a0a292bf74e154804240b5Jason Sams * limitations under the License.
159ba9a663a00c15d584a0a292bf74e154804240b5Jason Sams */
169ba9a663a00c15d584a0a292bf74e154804240b5Jason Sams
179ba9a663a00c15d584a0a292bf74e154804240b5Jason Sams#include "ip.rsh"
189ba9a663a00c15d584a0a292bf74e154804240b5Jason Sams#pragma rs_fp_relaxed
199ba9a663a00c15d584a0a292bf74e154804240b5Jason Sams
209ba9a663a00c15d584a0a292bf74e154804240b5Jason Samsrs_allocation gBlur;
219ba9a663a00c15d584a0a292bf74e154804240b5Jason Sams
229ba9a663a00c15d584a0a292bf74e154804240b5Jason Samsstatic float gOverWm1;
239ba9a663a00c15d584a0a292bf74e154804240b5Jason Samsstatic float gOverHm1;
249ba9a663a00c15d584a0a292bf74e154804240b5Jason Samsstatic uchar gLutR[256];
259ba9a663a00c15d584a0a292bf74e154804240b5Jason Samsstatic uchar gLutG[256];
269ba9a663a00c15d584a0a292bf74e154804240b5Jason Samsstatic uchar gLutB[256];
279ba9a663a00c15d584a0a292bf74e154804240b5Jason Sams
289ba9a663a00c15d584a0a292bf74e154804240b5Jason Samsvoid setup() {
299ba9a663a00c15d584a0a292bf74e154804240b5Jason Sams    int w = rsAllocationGetDimX(gBlur);
309ba9a663a00c15d584a0a292bf74e154804240b5Jason Sams    int h = rsAllocationGetDimY(gBlur);
319ba9a663a00c15d584a0a292bf74e154804240b5Jason Sams    gOverWm1 = 1.f / w;
329ba9a663a00c15d584a0a292bf74e154804240b5Jason Sams    gOverHm1 = 1.f / h;
339ba9a663a00c15d584a0a292bf74e154804240b5Jason Sams
349ba9a663a00c15d584a0a292bf74e154804240b5Jason Sams    for (int x=0; x < 256; x++) {
359ba9a663a00c15d584a0a292bf74e154804240b5Jason Sams        gLutR[x] = x;//255-x;
369ba9a663a00c15d584a0a292bf74e154804240b5Jason Sams        gLutG[x] = x;//255-x;
379ba9a663a00c15d584a0a292bf74e154804240b5Jason Sams        gLutB[x] = x;//255-x;
389ba9a663a00c15d584a0a292bf74e154804240b5Jason Sams    }
399ba9a663a00c15d584a0a292bf74e154804240b5Jason Sams}
409ba9a663a00c15d584a0a292bf74e154804240b5Jason Sams
41025b5f82971c431eb22df3c9d0f00b3cbe426bdbChris Wailesuchar4 RS_KERNEL process(uchar4 in, uint32_t x, uint32_t y) {
429ba9a663a00c15d584a0a292bf74e154804240b5Jason Sams    float2 xyDist;
439ba9a663a00c15d584a0a292bf74e154804240b5Jason Sams    xyDist.x = (x * gOverWm1 - 0.5f);
449ba9a663a00c15d584a0a292bf74e154804240b5Jason Sams    xyDist.y = (y * gOverHm1 - 0.5f);
459ba9a663a00c15d584a0a292bf74e154804240b5Jason Sams
469ba9a663a00c15d584a0a292bf74e154804240b5Jason Sams    // color
479ba9a663a00c15d584a0a292bf74e154804240b5Jason Sams    float4 v1 = rsUnpackColor8888(in);
489ba9a663a00c15d584a0a292bf74e154804240b5Jason Sams    float4 v2 = rsUnpackColor8888(rsGetElementAt_uchar4(gBlur, x, y));
499ba9a663a00c15d584a0a292bf74e154804240b5Jason Sams
509ba9a663a00c15d584a0a292bf74e154804240b5Jason Sams    float dist = dot(xyDist, xyDist) * 1.4f;
519ba9a663a00c15d584a0a292bf74e154804240b5Jason Sams    float pdist = native_powr(dist, 2.7f * 0.5f);
529ba9a663a00c15d584a0a292bf74e154804240b5Jason Sams    //float pdist = powr(dist, 2.7f * 0.5f);
539ba9a663a00c15d584a0a292bf74e154804240b5Jason Sams
549ba9a663a00c15d584a0a292bf74e154804240b5Jason Sams    pdist = clamp(pdist, 0.f, 1.f);
559ba9a663a00c15d584a0a292bf74e154804240b5Jason Sams    v1 = mix(v1, v2, dist * 2.f);
569ba9a663a00c15d584a0a292bf74e154804240b5Jason Sams    v1 *= 1.f - pdist;
579ba9a663a00c15d584a0a292bf74e154804240b5Jason Sams
589ba9a663a00c15d584a0a292bf74e154804240b5Jason Sams    // apply curve
599ba9a663a00c15d584a0a292bf74e154804240b5Jason Sams    uchar4 out = rsPackColorTo8888(v1);
609ba9a663a00c15d584a0a292bf74e154804240b5Jason Sams
619ba9a663a00c15d584a0a292bf74e154804240b5Jason Sams    out.r = gLutR[out.r];
629ba9a663a00c15d584a0a292bf74e154804240b5Jason Sams    out.g = gLutG[out.g];
639ba9a663a00c15d584a0a292bf74e154804240b5Jason Sams    out.b = gLutB[out.b];
649ba9a663a00c15d584a0a292bf74e154804240b5Jason Sams    return out;
659ba9a663a00c15d584a0a292bf74e154804240b5Jason Sams}
669ba9a663a00c15d584a0a292bf74e154804240b5Jason Sams
679ba9a663a00c15d584a0a292bf74e154804240b5Jason Sams
68