Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit f063fa0c authored by Jason Sams's avatar Jason Sams Committed by Android (Google) Code Review
Browse files

Merge "Add fisheye filter to Image Processing benchmark" into jb-mr1-dev

parents bad7eed8 bb2c9476
Loading
Loading
Loading
Loading
+106 −0
Original line number Diff line number Diff line
/*
 * Copyright (C) 2012 The Android Open Source Project
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

package com.android.rs.image;

import android.renderscript.Allocation;
import android.renderscript.Element;
import android.renderscript.Sampler;
import android.renderscript.Type;
import android.widget.SeekBar;
import android.widget.TextView;

public class Fisheye extends TestBase {
    private ScriptC_fisheye_full mScript_full = null;
    private ScriptC_fisheye_relaxed mScript_relaxed = null;
    private final boolean relaxed;
    private float center_x = 0.5f;
    private float center_y = 0.5f;
    private float scale = 0.5f;

    public Fisheye(boolean relaxed) {
        this.relaxed = relaxed;
    }

    public boolean onBar1Setup(SeekBar b, TextView t) {
        t.setText("Scale");
        b.setMax(100);
        b.setProgress(25);
        return true;
    }
    public boolean onBar2Setup(SeekBar b, TextView t) {
        t.setText("Shift center X");
        b.setMax(100);
        b.setProgress(50);
        return true;
    }
    public boolean onBar3Setup(SeekBar b, TextView t) {
        t.setText("Shift center Y");
        b.setMax(100);
        b.setProgress(50);
        return true;
    }

    public void onBar1Changed(int progress) {
        scale = progress / 50.0f;
        do_init();
    }
    public void onBar2Changed(int progress) {
        center_x = progress / 100.0f;
        do_init();
    }
    public void onBar3Changed(int progress) {
        center_y = progress / 100.0f;
        do_init();
    }

    private void do_init() {
        if (relaxed)
            mScript_relaxed.invoke_init_filter(
                    mInPixelsAllocation.getType().getX(),
                    mInPixelsAllocation.getType().getY(), center_x, center_y,
                    scale);
        else
            mScript_full.invoke_init_filter(
                    mInPixelsAllocation.getType().getX(),
                    mInPixelsAllocation.getType().getY(), center_x, center_y,
                    scale);
    }

    public void createTest(android.content.res.Resources res) {
        if (relaxed) {
            mScript_relaxed = new ScriptC_fisheye_relaxed(mRS, res,
                    R.raw.fisheye_relaxed);
            mScript_relaxed.set_in_alloc(mInPixelsAllocation);
            mScript_relaxed.set_sampler(Sampler.CLAMP_LINEAR(mRS));
        } else {
            mScript_full = new ScriptC_fisheye_full(mRS, res,
                    R.raw.fisheye_full);
            mScript_full.set_in_alloc(mInPixelsAllocation);
            mScript_full.set_sampler(Sampler.CLAMP_LINEAR(mRS));
        }
        do_init();
    }

    public void runTest() {
        if (relaxed)
            mScript_relaxed.forEach_root(mOutPixelsAllocation);
        else
            mScript_full.forEach_root(mOutPixelsAllocation);
    }

}
+9 −1
Original line number Diff line number Diff line
@@ -143,6 +143,12 @@ public class ImageProcessingActivity extends Activity
        case 6:
            mTest = new Grain();
            break;
        case 7:
            mTest = new Fisheye(false);
            break;
        case 8:
            mTest = new Fisheye(true);
            break;
        }

        mTest.createBaseTest(this, mBitmapIn);
@@ -155,7 +161,7 @@ public class ImageProcessingActivity extends Activity
    }

    void setupTests() {
        mTestNames = new String[7];
        mTestNames = new String[9];
        mTestNames[0] = "Levels Vec3 Relaxed";
        mTestNames[1] = "Levels Vec4 Relaxed";
        mTestNames[2] = "Levels Vec3 Full";
@@ -163,6 +169,8 @@ public class ImageProcessingActivity extends Activity
        mTestNames[4] = "Blur radius 25";
        mTestNames[5] = "Greyscale";
        mTestNames[6] = "Grain";
        mTestNames[7] = "Fisheye Full";
        mTestNames[8] = "Fisheye Relaxed";
        mTestSpinner.setAdapter(new ArrayAdapter<String>(
            this, R.layout.spinner_layout, mTestNames));
    }
+63 −0
Original line number Diff line number Diff line
/*
 * Copyright (C) 2012 The Android Open Source Project
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

rs_allocation in_alloc;
rs_sampler sampler;

static float2 center, dimensions;
static float2 scale;
static float alpha;
static float radius2;
static float factor;

void init_filter(uint32_t dim_x, uint32_t dim_y, float focus_x, float focus_y, float k) {
    center.x = focus_x;
    center.y = focus_y;
    dimensions.x = (float)dim_x;
    dimensions.y = (float)dim_y;

    alpha = k * 2.0 + 0.75;
    float bound2 = 0.25;
    if (dim_x > dim_y) {
        scale.x = 1.0;
        scale.y = dimensions.y / dimensions.x;
        bound2 *= (scale.y*scale.y + 1);
    } else {
        scale.x = dimensions.x / dimensions.y;
        scale.y = 1.0;
        bound2 *= (scale.x*scale.x + 1);
    }
    const float bound = sqrt(bound2);
    const float radius = 1.15 * bound;
    radius2 = radius*radius;
    const float max_radian = 0.5f * M_PI - atan(alpha / bound * sqrt(radius2 - bound2));
    factor = bound / max_radian;
}

void root(uchar4 *out, uint32_t x, uint32_t y) {
    // Convert x and y to floating point coordinates with center as origin
    float2 coord;
    coord.x = (float)x / dimensions.x;
    coord.y = (float)y / dimensions.y;
    coord -= center;
    const float dist = length(scale * coord);
    const float radian = M_PI_2 - atan((alpha * sqrt(radius2 - dist * dist)) / dist);
    const float scalar = radian * factor / dist;
    const float2 new_coord = coord * scalar + center;
    const float4 fout = rsSample(in_alloc, sampler, new_coord);
    *out = rsPackColorTo8888(fout);
}
+21 −0
Original line number Diff line number Diff line
/*
 * Copyright (C) 2012 The Android Open Source Project
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

#pragma version(1)
#pragma rs java_package_name(com.android.rs.image)

#include "fisheye.rsh"
+22 −0
Original line number Diff line number Diff line
/*
 * Copyright (C) 2012 The Android Open Source Project
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

#pragma version(1)
#pragma rs java_package_name(com.android.rs.image)
#pragma rs_fp_relaxed

#include "fisheye.rsh"