Merge "Testing java compat lib for RS." into jb-mr1-dev
This commit is contained in:
35
tests/RenderScriptTests/ImageProcessing2/Android.mk
Normal file
35
tests/RenderScriptTests/ImageProcessing2/Android.mk
Normal file
@@ -0,0 +1,35 @@
|
|||||||
|
#
|
||||||
|
# Copyright (C) 2009 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.
|
||||||
|
#
|
||||||
|
|
||||||
|
LOCAL_PATH := $(call my-dir)
|
||||||
|
include $(CLEAR_VARS)
|
||||||
|
|
||||||
|
LOCAL_MODULE_TAGS := tests
|
||||||
|
|
||||||
|
LOCAL_SRC_FILES := $(call all-java-files-under, src) \
|
||||||
|
$(call all-renderscript-files-under, src)
|
||||||
|
|
||||||
|
LOCAL_STATIC_JAVA_LIBRARIES := android.support.v8.renderscript
|
||||||
|
|
||||||
|
LOCAL_PACKAGE_NAME := ImageProcessing2
|
||||||
|
|
||||||
|
LOCAL_RENDERSCRIPT_FLAGS := -rs-package-name=android.support.v8.renderscript
|
||||||
|
LOCAL_REQUIRED_MODULES := librsjni
|
||||||
|
|
||||||
|
include $(BUILD_PACKAGE)
|
||||||
|
|
||||||
|
#include $(call all-makefiles-under, $(LOCAL_PATH))
|
||||||
|
|
||||||
15
tests/RenderScriptTests/ImageProcessing2/AndroidManifest.xml
Normal file
15
tests/RenderScriptTests/ImageProcessing2/AndroidManifest.xml
Normal file
@@ -0,0 +1,15 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
|
||||||
|
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
|
||||||
|
package="com.android.rs.image2">
|
||||||
|
<uses-sdk android:minSdkVersion="11" />
|
||||||
|
<application android:label="IP GB"
|
||||||
|
android:hardwareAccelerated="true">
|
||||||
|
<activity android:name="ImageProcessingActivity2">
|
||||||
|
<intent-filter>
|
||||||
|
<action android:name="android.intent.action.MAIN" />
|
||||||
|
<category android:name="android.intent.category.LAUNCHER" />
|
||||||
|
</intent-filter>
|
||||||
|
</activity>
|
||||||
|
</application>
|
||||||
|
</manifest>
|
||||||
Binary file not shown.
|
After Width: | Height: | Size: 597 KiB |
130
tests/RenderScriptTests/ImageProcessing2/res/layout/main.xml
Normal file
130
tests/RenderScriptTests/ImageProcessing2/res/layout/main.xml
Normal file
@@ -0,0 +1,130 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<!-- Copyright (C) 2009 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.
|
||||||
|
-->
|
||||||
|
|
||||||
|
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
|
||||||
|
android:orientation="vertical"
|
||||||
|
android:layout_width="fill_parent"
|
||||||
|
android:layout_height="fill_parent"
|
||||||
|
android:id="@+id/toplevel">
|
||||||
|
<SurfaceView
|
||||||
|
android:id="@+id/surface"
|
||||||
|
android:layout_width="1dip"
|
||||||
|
android:layout_height="1dip" />
|
||||||
|
<ScrollView
|
||||||
|
android:layout_width="fill_parent"
|
||||||
|
android:layout_height="fill_parent">
|
||||||
|
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
|
||||||
|
android:orientation="vertical"
|
||||||
|
android:layout_width="fill_parent"
|
||||||
|
android:layout_height="fill_parent">
|
||||||
|
<ImageView
|
||||||
|
android:id="@+id/display"
|
||||||
|
android:layout_width="wrap_content"
|
||||||
|
android:layout_height="wrap_content" />
|
||||||
|
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
|
||||||
|
android:orientation="horizontal"
|
||||||
|
android:layout_width="fill_parent"
|
||||||
|
android:layout_height="wrap_content">
|
||||||
|
<Button
|
||||||
|
android:layout_width="wrap_content"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:text="@string/benchmark"
|
||||||
|
android:onClick="benchmark"/>
|
||||||
|
<TextView
|
||||||
|
android:id="@+id/benchmarkText"
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:textSize="8pt"
|
||||||
|
android:text="@string/saturation"/>
|
||||||
|
</LinearLayout>
|
||||||
|
<Spinner
|
||||||
|
android:id="@+id/filterselection"
|
||||||
|
android:layout_width="fill_parent"
|
||||||
|
android:layout_height="wrap_content"/>
|
||||||
|
<TextView
|
||||||
|
android:id="@+id/slider1Text"
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:textSize="8pt"
|
||||||
|
android:layout_marginLeft="10sp"
|
||||||
|
android:layout_marginTop="15sp"
|
||||||
|
android:text="@string/saturation"/>
|
||||||
|
<SeekBar
|
||||||
|
android:id="@+id/slider1"
|
||||||
|
android:layout_marginLeft="10sp"
|
||||||
|
android:layout_marginRight="10sp"
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="wrap_content"/>
|
||||||
|
<TextView
|
||||||
|
android:id="@+id/slider2Text"
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:textSize="8pt"
|
||||||
|
android:layout_marginLeft="10sp"
|
||||||
|
android:layout_marginTop="15sp"
|
||||||
|
android:text="@string/gamma"/>
|
||||||
|
<SeekBar
|
||||||
|
android:id="@+id/slider2"
|
||||||
|
android:layout_marginLeft="10sp"
|
||||||
|
android:layout_marginRight="10sp"
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="wrap_content"/>
|
||||||
|
<TextView
|
||||||
|
android:id="@+id/slider3Text"
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:layout_marginLeft="10sp"
|
||||||
|
android:layout_marginTop="15sp"
|
||||||
|
android:textSize="8pt"
|
||||||
|
android:text="@string/out_white"/>
|
||||||
|
<SeekBar
|
||||||
|
android:id="@+id/slider3"
|
||||||
|
android:layout_marginLeft="10sp"
|
||||||
|
android:layout_marginRight="10sp"
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="wrap_content"/>
|
||||||
|
<TextView
|
||||||
|
android:id="@+id/slider4Text"
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:textSize="8pt"
|
||||||
|
android:layout_marginLeft="10sp"
|
||||||
|
android:layout_marginTop="15sp"
|
||||||
|
android:text="@string/in_white"/>
|
||||||
|
<SeekBar
|
||||||
|
android:id="@+id/slider4"
|
||||||
|
android:layout_marginLeft="10sp"
|
||||||
|
android:layout_marginRight="10sp"
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="wrap_content"/>
|
||||||
|
<TextView
|
||||||
|
android:id="@+id/slider5Text"
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:textSize="8pt"
|
||||||
|
android:layout_marginLeft="10sp"
|
||||||
|
android:layout_marginTop="15sp"
|
||||||
|
android:text="@string/in_white"/>
|
||||||
|
<SeekBar
|
||||||
|
android:id="@+id/slider5"
|
||||||
|
android:layout_marginLeft="10sp"
|
||||||
|
android:layout_marginRight="10sp"
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="wrap_content"/>
|
||||||
|
</LinearLayout>
|
||||||
|
</ScrollView>
|
||||||
|
</LinearLayout>
|
||||||
|
|
||||||
@@ -0,0 +1,23 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
|
||||||
|
<!-- 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.
|
||||||
|
-->
|
||||||
|
|
||||||
|
<TextView xmlns:android="http://schemas.android.com/apk/res/android"
|
||||||
|
android:layout_width="fill_parent"
|
||||||
|
android:layout_height="fill_parent"
|
||||||
|
android:padding="10dp"
|
||||||
|
android:textSize="16sp"
|
||||||
|
/>
|
||||||
@@ -0,0 +1,33 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<!--
|
||||||
|
/*
|
||||||
|
* Copyright (C) 2008 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.
|
||||||
|
*/
|
||||||
|
-->
|
||||||
|
|
||||||
|
<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
|
||||||
|
<!-- General -->
|
||||||
|
<skip />
|
||||||
|
<!--slider label -->
|
||||||
|
<string name="blur_description">Blur Radius</string>
|
||||||
|
<string name="in_white">In White</string>
|
||||||
|
<string name="out_white">Out White</string>
|
||||||
|
<string name="in_black">In Black</string>
|
||||||
|
<string name="out_black">Out Black</string>
|
||||||
|
<string name="gamma">Gamma</string>
|
||||||
|
<string name="saturation">Saturation</string>
|
||||||
|
<string name="benchmark">Benchmark</string>
|
||||||
|
|
||||||
|
</resources>
|
||||||
@@ -0,0 +1,101 @@
|
|||||||
|
/*
|
||||||
|
* 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.image2;
|
||||||
|
|
||||||
|
import java.lang.Math;
|
||||||
|
|
||||||
|
import android.support.v8.renderscript.*;
|
||||||
|
import android.util.Log;
|
||||||
|
import android.widget.SeekBar;
|
||||||
|
import android.widget.TextView;
|
||||||
|
|
||||||
|
public class Blur25 extends TestBase {
|
||||||
|
private int MAX_RADIUS = 25;
|
||||||
|
private ScriptC_threshold mScript;
|
||||||
|
private ScriptC_vertical_blur mScriptVBlur;
|
||||||
|
private ScriptC_horizontal_blur mScriptHBlur;
|
||||||
|
private int mRadius = MAX_RADIUS;
|
||||||
|
private float mSaturation = 1.0f;
|
||||||
|
private Allocation mScratchPixelsAllocation1;
|
||||||
|
private Allocation mScratchPixelsAllocation2;
|
||||||
|
|
||||||
|
|
||||||
|
public boolean onBar1Setup(SeekBar b, TextView t) {
|
||||||
|
t.setText("Radius");
|
||||||
|
b.setProgress(100);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
public boolean onBar2Setup(SeekBar b, TextView t) {
|
||||||
|
b.setProgress(50);
|
||||||
|
t.setText("Saturation");
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
public void onBar1Changed(int progress) {
|
||||||
|
float fRadius = progress / 100.0f;
|
||||||
|
fRadius *= (float)(MAX_RADIUS);
|
||||||
|
mRadius = (int)fRadius;
|
||||||
|
mScript.set_radius(mRadius);
|
||||||
|
}
|
||||||
|
public void onBar2Changed(int progress) {
|
||||||
|
mSaturation = (float)progress / 50.0f;
|
||||||
|
mScriptVBlur.invoke_setSaturation(mSaturation);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
public void createTest(android.content.res.Resources res) {
|
||||||
|
int width = mInPixelsAllocation.getType().getX();
|
||||||
|
int height = mInPixelsAllocation.getType().getY();
|
||||||
|
|
||||||
|
Type.Builder tb = new Type.Builder(mRS, Element.F32_4(mRS));
|
||||||
|
tb.setX(width);
|
||||||
|
tb.setY(height);
|
||||||
|
mScratchPixelsAllocation1 = Allocation.createTyped(mRS, tb.create());
|
||||||
|
mScratchPixelsAllocation2 = Allocation.createTyped(mRS, tb.create());
|
||||||
|
|
||||||
|
mScriptVBlur = new ScriptC_vertical_blur(mRS, res, R.raw.vertical_blur);
|
||||||
|
mScriptHBlur = new ScriptC_horizontal_blur(mRS, res, R.raw.horizontal_blur);
|
||||||
|
|
||||||
|
mScript = new ScriptC_threshold(mRS, res, R.raw.threshold);
|
||||||
|
mScript.set_width(width);
|
||||||
|
mScript.set_height(height);
|
||||||
|
mScript.set_radius(mRadius);
|
||||||
|
|
||||||
|
mScriptVBlur.invoke_setSaturation(mSaturation);
|
||||||
|
|
||||||
|
mScript.bind_InPixel(mInPixelsAllocation);
|
||||||
|
mScript.bind_OutPixel(mOutPixelsAllocation);
|
||||||
|
mScript.bind_ScratchPixel1(mScratchPixelsAllocation1);
|
||||||
|
mScript.bind_ScratchPixel2(mScratchPixelsAllocation2);
|
||||||
|
|
||||||
|
mScript.set_vBlurScript(mScriptVBlur);
|
||||||
|
mScript.set_hBlurScript(mScriptHBlur);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void runTest() {
|
||||||
|
mScript.invoke_filter();
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setupBenchmark() {
|
||||||
|
mScript.set_radius(MAX_RADIUS);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void exitBenchmark() {
|
||||||
|
mScript.set_radius(mRadius);
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,103 @@
|
|||||||
|
/*
|
||||||
|
* 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.image2;
|
||||||
|
|
||||||
|
import android.support.v8.renderscript.*;
|
||||||
|
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);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
@@ -0,0 +1,68 @@
|
|||||||
|
/*
|
||||||
|
* 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.image2;
|
||||||
|
|
||||||
|
import java.lang.Math;
|
||||||
|
|
||||||
|
import android.support.v8.renderscript.*;
|
||||||
|
import android.util.Log;
|
||||||
|
import android.widget.SeekBar;
|
||||||
|
import android.widget.TextView;
|
||||||
|
|
||||||
|
public class Grain extends TestBase {
|
||||||
|
private ScriptC_grain mScript;
|
||||||
|
private Allocation mNoise;
|
||||||
|
private Allocation mNoise2;
|
||||||
|
|
||||||
|
|
||||||
|
public boolean onBar1Setup(SeekBar b, TextView t) {
|
||||||
|
t.setText("Strength");
|
||||||
|
b.setProgress(50);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void onBar1Changed(int progress) {
|
||||||
|
float s = progress / 100.0f;
|
||||||
|
mScript.set_gNoiseStrength(s);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void createTest(android.content.res.Resources res) {
|
||||||
|
int width = mInPixelsAllocation.getType().getX();
|
||||||
|
int height = mInPixelsAllocation.getType().getY();
|
||||||
|
|
||||||
|
Type.Builder tb = new Type.Builder(mRS, Element.U8(mRS));
|
||||||
|
tb.setX(width);
|
||||||
|
tb.setY(height);
|
||||||
|
mNoise = Allocation.createTyped(mRS, tb.create());
|
||||||
|
mNoise2 = Allocation.createTyped(mRS, tb.create());
|
||||||
|
|
||||||
|
mScript = new ScriptC_grain(mRS, res, R.raw.grain);
|
||||||
|
mScript.set_gWidth(width);
|
||||||
|
mScript.set_gHeight(height);
|
||||||
|
mScript.set_gNoiseStrength(0.5f);
|
||||||
|
mScript.set_gBlendSource(mNoise);
|
||||||
|
mScript.set_gNoise(mNoise2);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void runTest() {
|
||||||
|
mScript.forEach_genRand(mNoise);
|
||||||
|
mScript.forEach_blend9(mNoise2);
|
||||||
|
mScript.forEach_root(mInPixelsAllocation, mOutPixelsAllocation);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
@@ -0,0 +1,35 @@
|
|||||||
|
/*
|
||||||
|
* 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.image2;
|
||||||
|
|
||||||
|
import java.lang.Math;
|
||||||
|
|
||||||
|
import android.support.v8.renderscript.*;
|
||||||
|
import android.util.Log;
|
||||||
|
|
||||||
|
public class Greyscale extends TestBase {
|
||||||
|
private ScriptC_greyscale mScript;
|
||||||
|
|
||||||
|
public void createTest(android.content.res.Resources res) {
|
||||||
|
mScript = new ScriptC_greyscale(mRS, res, R.raw.greyscale);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void runTest() {
|
||||||
|
mScript.forEach_root(mInPixelsAllocation, mOutPixelsAllocation);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
@@ -0,0 +1,87 @@
|
|||||||
|
/*
|
||||||
|
* 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.image2;
|
||||||
|
|
||||||
|
import java.lang.Math;
|
||||||
|
|
||||||
|
import android.support.v8.renderscript.*;
|
||||||
|
import android.util.Log;
|
||||||
|
|
||||||
|
public class GroupTest extends TestBase {
|
||||||
|
private ScriptC_convolve3x3 mConvolve;
|
||||||
|
private ScriptC_colormatrix mMatrix;
|
||||||
|
|
||||||
|
private Allocation mScratchPixelsAllocation1;
|
||||||
|
private ScriptGroup mGroup;
|
||||||
|
|
||||||
|
private int mWidth;
|
||||||
|
private int mHeight;
|
||||||
|
private boolean mUseNative;
|
||||||
|
|
||||||
|
|
||||||
|
public GroupTest(boolean useNative) {
|
||||||
|
mUseNative = useNative;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void createTest(android.content.res.Resources res) {
|
||||||
|
mWidth = mInPixelsAllocation.getType().getX();
|
||||||
|
mHeight = mInPixelsAllocation.getType().getY();
|
||||||
|
|
||||||
|
mConvolve = new ScriptC_convolve3x3(mRS, res, R.raw.convolve3x3);
|
||||||
|
mMatrix = new ScriptC_colormatrix(mRS, res, R.raw.colormatrix);
|
||||||
|
|
||||||
|
float f[] = new float[9];
|
||||||
|
f[0] = 0.f; f[1] = -1.f; f[2] = 0.f;
|
||||||
|
f[3] = -1.f; f[4] = 5.f; f[5] = -1.f;
|
||||||
|
f[6] = 0.f; f[7] = -1.f; f[8] = 0.f;
|
||||||
|
mConvolve.set_gCoeffs(f);
|
||||||
|
|
||||||
|
Matrix4f m = new Matrix4f();
|
||||||
|
m.set(1, 0, 0.2f);
|
||||||
|
m.set(1, 1, 0.9f);
|
||||||
|
m.set(1, 2, 0.2f);
|
||||||
|
mMatrix.invoke_setMatrix(m);
|
||||||
|
|
||||||
|
Type.Builder tb = new Type.Builder(mRS, Element.U8_4(mRS));
|
||||||
|
tb.setX(mWidth);
|
||||||
|
tb.setY(mHeight);
|
||||||
|
Type connect = tb.create();
|
||||||
|
|
||||||
|
if (mUseNative) {
|
||||||
|
ScriptGroup.Builder b = new ScriptGroup.Builder(mRS);
|
||||||
|
b.addConnection(connect, mConvolve, mMatrix, null);
|
||||||
|
mGroup = b.create();
|
||||||
|
|
||||||
|
} else {
|
||||||
|
mScratchPixelsAllocation1 = Allocation.createTyped(mRS, connect);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public void runTest() {
|
||||||
|
mConvolve.set_gIn(mInPixelsAllocation);
|
||||||
|
mConvolve.set_gWidth(mWidth);
|
||||||
|
mConvolve.set_gHeight(mHeight);
|
||||||
|
if (mUseNative) {
|
||||||
|
mGroup.setOutput(mMatrix, mOutPixelsAllocation);
|
||||||
|
mGroup.execute();
|
||||||
|
} else {
|
||||||
|
mConvolve.forEach_root(mScratchPixelsAllocation1);
|
||||||
|
mMatrix.forEach_root(mScratchPixelsAllocation1, mOutPixelsAllocation);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
@@ -0,0 +1,291 @@
|
|||||||
|
/*
|
||||||
|
* 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.image2;
|
||||||
|
|
||||||
|
import android.app.Activity;
|
||||||
|
import android.os.Bundle;
|
||||||
|
import android.graphics.BitmapFactory;
|
||||||
|
import android.graphics.Bitmap;
|
||||||
|
import android.graphics.Canvas;
|
||||||
|
import android.support.v8.renderscript.*;
|
||||||
|
import android.view.SurfaceView;
|
||||||
|
import android.view.SurfaceHolder;
|
||||||
|
import android.widget.AdapterView;
|
||||||
|
import android.widget.ArrayAdapter;
|
||||||
|
import android.widget.ImageView;
|
||||||
|
import android.widget.SeekBar;
|
||||||
|
import android.widget.Spinner;
|
||||||
|
import android.widget.TextView;
|
||||||
|
import android.view.View;
|
||||||
|
import android.util.Log;
|
||||||
|
import java.lang.Math;
|
||||||
|
|
||||||
|
public class ImageProcessingActivity2 extends Activity
|
||||||
|
implements SeekBar.OnSeekBarChangeListener {
|
||||||
|
private final String TAG = "Img";
|
||||||
|
Bitmap mBitmapIn;
|
||||||
|
Bitmap mBitmapOut;
|
||||||
|
String mTestNames[];
|
||||||
|
|
||||||
|
private SeekBar mBar1;
|
||||||
|
private SeekBar mBar2;
|
||||||
|
private SeekBar mBar3;
|
||||||
|
private SeekBar mBar4;
|
||||||
|
private SeekBar mBar5;
|
||||||
|
private TextView mText1;
|
||||||
|
private TextView mText2;
|
||||||
|
private TextView mText3;
|
||||||
|
private TextView mText4;
|
||||||
|
private TextView mText5;
|
||||||
|
|
||||||
|
private float mSaturation = 1.0f;
|
||||||
|
|
||||||
|
private TextView mBenchmarkResult;
|
||||||
|
private Spinner mTestSpinner;
|
||||||
|
|
||||||
|
private SurfaceView mSurfaceView;
|
||||||
|
private ImageView mDisplayView;
|
||||||
|
|
||||||
|
private boolean mDoingBenchmark;
|
||||||
|
|
||||||
|
private TestBase mTest;
|
||||||
|
|
||||||
|
|
||||||
|
public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) {
|
||||||
|
if (fromUser) {
|
||||||
|
|
||||||
|
if (seekBar == mBar1) {
|
||||||
|
mTest.onBar1Changed(progress);
|
||||||
|
} else if (seekBar == mBar2) {
|
||||||
|
mTest.onBar2Changed(progress);
|
||||||
|
} else if (seekBar == mBar3) {
|
||||||
|
mTest.onBar3Changed(progress);
|
||||||
|
} else if (seekBar == mBar4) {
|
||||||
|
mTest.onBar4Changed(progress);
|
||||||
|
} else if (seekBar == mBar5) {
|
||||||
|
mTest.onBar5Changed(progress);
|
||||||
|
}
|
||||||
|
|
||||||
|
mTest.runTest();
|
||||||
|
mTest.updateBitmap(mBitmapOut);
|
||||||
|
mDisplayView.invalidate();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public void onStartTrackingTouch(SeekBar seekBar) {
|
||||||
|
}
|
||||||
|
|
||||||
|
public void onStopTrackingTouch(SeekBar seekBar) {
|
||||||
|
}
|
||||||
|
|
||||||
|
void setupBars() {
|
||||||
|
mBar1.setVisibility(View.VISIBLE);
|
||||||
|
mText1.setVisibility(View.VISIBLE);
|
||||||
|
mTest.onBar1Setup(mBar1, mText1);
|
||||||
|
|
||||||
|
mBar2.setVisibility(View.VISIBLE);
|
||||||
|
mText2.setVisibility(View.VISIBLE);
|
||||||
|
mTest.onBar2Setup(mBar2, mText2);
|
||||||
|
|
||||||
|
mBar3.setVisibility(View.VISIBLE);
|
||||||
|
mText3.setVisibility(View.VISIBLE);
|
||||||
|
mTest.onBar3Setup(mBar3, mText3);
|
||||||
|
|
||||||
|
mBar4.setVisibility(View.VISIBLE);
|
||||||
|
mText4.setVisibility(View.VISIBLE);
|
||||||
|
mTest.onBar4Setup(mBar4, mText4);
|
||||||
|
|
||||||
|
mBar5.setVisibility(View.VISIBLE);
|
||||||
|
mText5.setVisibility(View.VISIBLE);
|
||||||
|
mTest.onBar5Setup(mBar5, mText5);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void changeTest(int testID) {
|
||||||
|
switch(testID) {
|
||||||
|
case 0:
|
||||||
|
mTest = new LevelsV4(false, false);
|
||||||
|
break;
|
||||||
|
case 1:
|
||||||
|
mTest = new LevelsV4(false, true);
|
||||||
|
break;
|
||||||
|
case 2:
|
||||||
|
mTest = new LevelsV4(true, false);
|
||||||
|
break;
|
||||||
|
case 3:
|
||||||
|
mTest = new LevelsV4(true, true);
|
||||||
|
break;
|
||||||
|
case 4:
|
||||||
|
mTest = new Blur25();
|
||||||
|
break;
|
||||||
|
case 5:
|
||||||
|
mTest = new Greyscale();
|
||||||
|
break;
|
||||||
|
case 6:
|
||||||
|
mTest = new Grain();
|
||||||
|
break;
|
||||||
|
case 7:
|
||||||
|
mTest = new Fisheye(false);
|
||||||
|
break;
|
||||||
|
case 8:
|
||||||
|
mTest = new Fisheye(true);
|
||||||
|
break;
|
||||||
|
case 9:
|
||||||
|
mTest = new Vignette(false);
|
||||||
|
break;
|
||||||
|
case 10:
|
||||||
|
mTest = new Vignette(true);
|
||||||
|
break;
|
||||||
|
case 11:
|
||||||
|
mTest = new GroupTest(false);
|
||||||
|
break;
|
||||||
|
case 12:
|
||||||
|
mTest = new GroupTest(true);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
mTest.createBaseTest(this, mBitmapIn);
|
||||||
|
setupBars();
|
||||||
|
|
||||||
|
mTest.runTest();
|
||||||
|
mTest.updateBitmap(mBitmapOut);
|
||||||
|
mDisplayView.invalidate();
|
||||||
|
mBenchmarkResult.setText("Result: not run");
|
||||||
|
}
|
||||||
|
|
||||||
|
void setupTests() {
|
||||||
|
mTestNames = new String[13];
|
||||||
|
mTestNames[0] = "Levels Vec3 Relaxed";
|
||||||
|
mTestNames[1] = "Levels Vec4 Relaxed";
|
||||||
|
mTestNames[2] = "Levels Vec3 Full";
|
||||||
|
mTestNames[3] = "Levels Vec4 Full";
|
||||||
|
mTestNames[4] = "Blur radius 25";
|
||||||
|
mTestNames[5] = "Greyscale";
|
||||||
|
mTestNames[6] = "Grain";
|
||||||
|
mTestNames[7] = "Fisheye Full";
|
||||||
|
mTestNames[8] = "Fisheye Relaxed";
|
||||||
|
mTestNames[9] = "Vignette Full";
|
||||||
|
mTestNames[10] = "Vignette Relaxed";
|
||||||
|
mTestNames[11] = "Group Test (emulated)";
|
||||||
|
mTestNames[12] = "Group Test (native)";
|
||||||
|
mTestSpinner.setAdapter(new ArrayAdapter<String>(
|
||||||
|
this, R.layout.spinner_layout, mTestNames));
|
||||||
|
}
|
||||||
|
|
||||||
|
private AdapterView.OnItemSelectedListener mTestSpinnerListener =
|
||||||
|
new AdapterView.OnItemSelectedListener() {
|
||||||
|
public void onItemSelected(AdapterView<?> parent, View view, int pos, long id) {
|
||||||
|
changeTest(pos);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void onNothingSelected(AdapterView parent) {
|
||||||
|
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected void onCreate(Bundle savedInstanceState) {
|
||||||
|
super.onCreate(savedInstanceState);
|
||||||
|
setContentView(R.layout.main);
|
||||||
|
|
||||||
|
mBitmapIn = loadBitmap(R.drawable.city);
|
||||||
|
mBitmapOut = loadBitmap(R.drawable.city);
|
||||||
|
|
||||||
|
mSurfaceView = (SurfaceView) findViewById(R.id.surface);
|
||||||
|
|
||||||
|
mDisplayView = (ImageView) findViewById(R.id.display);
|
||||||
|
mDisplayView.setImageBitmap(mBitmapOut);
|
||||||
|
|
||||||
|
mBar1 = (SeekBar) findViewById(R.id.slider1);
|
||||||
|
mBar2 = (SeekBar) findViewById(R.id.slider2);
|
||||||
|
mBar3 = (SeekBar) findViewById(R.id.slider3);
|
||||||
|
mBar4 = (SeekBar) findViewById(R.id.slider4);
|
||||||
|
mBar5 = (SeekBar) findViewById(R.id.slider5);
|
||||||
|
|
||||||
|
mBar1.setOnSeekBarChangeListener(this);
|
||||||
|
mBar2.setOnSeekBarChangeListener(this);
|
||||||
|
mBar3.setOnSeekBarChangeListener(this);
|
||||||
|
mBar4.setOnSeekBarChangeListener(this);
|
||||||
|
mBar5.setOnSeekBarChangeListener(this);
|
||||||
|
|
||||||
|
mText1 = (TextView) findViewById(R.id.slider1Text);
|
||||||
|
mText2 = (TextView) findViewById(R.id.slider2Text);
|
||||||
|
mText3 = (TextView) findViewById(R.id.slider3Text);
|
||||||
|
mText4 = (TextView) findViewById(R.id.slider4Text);
|
||||||
|
mText5 = (TextView) findViewById(R.id.slider5Text);
|
||||||
|
|
||||||
|
mTestSpinner = (Spinner) findViewById(R.id.filterselection);
|
||||||
|
mTestSpinner.setOnItemSelectedListener(mTestSpinnerListener);
|
||||||
|
|
||||||
|
mBenchmarkResult = (TextView) findViewById(R.id.benchmarkText);
|
||||||
|
mBenchmarkResult.setText("Result: not run");
|
||||||
|
|
||||||
|
setupTests();
|
||||||
|
changeTest(0);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
private Bitmap loadBitmap(int resource) {
|
||||||
|
final BitmapFactory.Options options = new BitmapFactory.Options();
|
||||||
|
options.inPreferredConfig = Bitmap.Config.ARGB_8888;
|
||||||
|
return copyBitmap(BitmapFactory.decodeResource(getResources(), resource, options));
|
||||||
|
}
|
||||||
|
|
||||||
|
private static Bitmap copyBitmap(Bitmap source) {
|
||||||
|
Bitmap b = Bitmap.createBitmap(source.getWidth(), source.getHeight(), source.getConfig());
|
||||||
|
Canvas c = new Canvas(b);
|
||||||
|
c.drawBitmap(source, 0, 0, null);
|
||||||
|
source.recycle();
|
||||||
|
return b;
|
||||||
|
}
|
||||||
|
|
||||||
|
// button hook
|
||||||
|
public void benchmark(View v) {
|
||||||
|
long t = getBenchmark();
|
||||||
|
//long javaTime = javaFilter();
|
||||||
|
//mBenchmarkResult.setText("RS: " + t + " ms Java: " + javaTime + " ms");
|
||||||
|
mBenchmarkResult.setText("Result: " + t + " ms");
|
||||||
|
}
|
||||||
|
|
||||||
|
// For benchmark test
|
||||||
|
public long getBenchmark() {
|
||||||
|
mDoingBenchmark = true;
|
||||||
|
|
||||||
|
mTest.setupBenchmark();
|
||||||
|
long result = 0;
|
||||||
|
|
||||||
|
Log.v(TAG, "Warming");
|
||||||
|
long t = java.lang.System.currentTimeMillis() + 2000;
|
||||||
|
do {
|
||||||
|
mTest.runTest();
|
||||||
|
mTest.finish();
|
||||||
|
} while (t > java.lang.System.currentTimeMillis());
|
||||||
|
|
||||||
|
|
||||||
|
Log.v(TAG, "Benchmarking");
|
||||||
|
t = java.lang.System.currentTimeMillis();
|
||||||
|
mTest.runTest();
|
||||||
|
mTest.finish();
|
||||||
|
t = java.lang.System.currentTimeMillis() - t;
|
||||||
|
|
||||||
|
Log.v(TAG, "getBenchmark: Renderscript frame time core ms " + t);
|
||||||
|
mTest.exitBenchmark();
|
||||||
|
mDoingBenchmark = false;
|
||||||
|
|
||||||
|
return t;
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,161 @@
|
|||||||
|
/*
|
||||||
|
* 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.image2;
|
||||||
|
|
||||||
|
import java.lang.Math;
|
||||||
|
|
||||||
|
import android.support.v8.renderscript.*;
|
||||||
|
import android.util.Log;
|
||||||
|
import android.widget.SeekBar;
|
||||||
|
import android.widget.TextView;
|
||||||
|
|
||||||
|
|
||||||
|
public class LevelsV4 extends TestBase {
|
||||||
|
private ScriptC_levels_relaxed mScriptR;
|
||||||
|
private ScriptC_levels_full mScriptF;
|
||||||
|
private float mInBlack = 0.0f;
|
||||||
|
private float mOutBlack = 0.0f;
|
||||||
|
private float mInWhite = 255.0f;
|
||||||
|
private float mOutWhite = 255.0f;
|
||||||
|
private float mSaturation = 1.0f;
|
||||||
|
|
||||||
|
Matrix3f satMatrix = new Matrix3f();
|
||||||
|
float mInWMinInB;
|
||||||
|
float mOutWMinOutB;
|
||||||
|
float mOverInWMinInB;
|
||||||
|
|
||||||
|
boolean mUseFull;
|
||||||
|
boolean mUseV4;
|
||||||
|
|
||||||
|
LevelsV4(boolean useFull, boolean useV4) {
|
||||||
|
mUseFull = useFull;
|
||||||
|
mUseV4 = useV4;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
private void setLevels() {
|
||||||
|
mInWMinInB = mInWhite - mInBlack;
|
||||||
|
mOutWMinOutB = mOutWhite - mOutBlack;
|
||||||
|
mOverInWMinInB = 1.f / mInWMinInB;
|
||||||
|
|
||||||
|
mScriptR.set_inBlack(mInBlack);
|
||||||
|
mScriptR.set_outBlack(mOutBlack);
|
||||||
|
mScriptR.set_inWMinInB(mInWMinInB);
|
||||||
|
mScriptR.set_outWMinOutB(mOutWMinOutB);
|
||||||
|
mScriptR.set_overInWMinInB(mOverInWMinInB);
|
||||||
|
mScriptF.set_inBlack(mInBlack);
|
||||||
|
mScriptF.set_outBlack(mOutBlack);
|
||||||
|
mScriptF.set_inWMinInB(mInWMinInB);
|
||||||
|
mScriptF.set_outWMinOutB(mOutWMinOutB);
|
||||||
|
mScriptF.set_overInWMinInB(mOverInWMinInB);
|
||||||
|
}
|
||||||
|
|
||||||
|
private void setSaturation() {
|
||||||
|
float rWeight = 0.299f;
|
||||||
|
float gWeight = 0.587f;
|
||||||
|
float bWeight = 0.114f;
|
||||||
|
float oneMinusS = 1.0f - mSaturation;
|
||||||
|
|
||||||
|
satMatrix.set(0, 0, oneMinusS * rWeight + mSaturation);
|
||||||
|
satMatrix.set(0, 1, oneMinusS * rWeight);
|
||||||
|
satMatrix.set(0, 2, oneMinusS * rWeight);
|
||||||
|
satMatrix.set(1, 0, oneMinusS * gWeight);
|
||||||
|
satMatrix.set(1, 1, oneMinusS * gWeight + mSaturation);
|
||||||
|
satMatrix.set(1, 2, oneMinusS * gWeight);
|
||||||
|
satMatrix.set(2, 0, oneMinusS * bWeight);
|
||||||
|
satMatrix.set(2, 1, oneMinusS * bWeight);
|
||||||
|
satMatrix.set(2, 2, oneMinusS * bWeight + mSaturation);
|
||||||
|
mScriptR.set_colorMat(satMatrix);
|
||||||
|
mScriptF.set_colorMat(satMatrix);
|
||||||
|
}
|
||||||
|
|
||||||
|
public boolean onBar1Setup(SeekBar b, TextView t) {
|
||||||
|
b.setProgress(50);
|
||||||
|
t.setText("Saturation");
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
public boolean onBar2Setup(SeekBar b, TextView t) {
|
||||||
|
b.setMax(128);
|
||||||
|
b.setProgress(0);
|
||||||
|
t.setText("In Black");
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
public boolean onBar3Setup(SeekBar b, TextView t) {
|
||||||
|
b.setMax(128);
|
||||||
|
b.setProgress(0);
|
||||||
|
t.setText("Out Black");
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
public boolean onBar4Setup(SeekBar b, TextView t) {
|
||||||
|
b.setMax(128);
|
||||||
|
b.setProgress(128);
|
||||||
|
t.setText("Out White");
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
public boolean onBar5Setup(SeekBar b, TextView t) {
|
||||||
|
b.setMax(128);
|
||||||
|
b.setProgress(128);
|
||||||
|
t.setText("Out White");
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void onBar1Changed(int progress) {
|
||||||
|
mSaturation = (float)progress / 50.0f;
|
||||||
|
setSaturation();
|
||||||
|
}
|
||||||
|
public void onBar2Changed(int progress) {
|
||||||
|
mInBlack = (float)progress;
|
||||||
|
setLevels();
|
||||||
|
}
|
||||||
|
public void onBar3Changed(int progress) {
|
||||||
|
mOutBlack = (float)progress;
|
||||||
|
setLevels();
|
||||||
|
}
|
||||||
|
public void onBar4Changed(int progress) {
|
||||||
|
mInWhite = (float)progress + 127.0f;
|
||||||
|
setLevels();
|
||||||
|
}
|
||||||
|
public void onBar5Changed(int progress) {
|
||||||
|
mOutWhite = (float)progress + 127.0f;
|
||||||
|
setLevels();
|
||||||
|
}
|
||||||
|
|
||||||
|
public void createTest(android.content.res.Resources res) {
|
||||||
|
mScriptR = new ScriptC_levels_relaxed(mRS, res, R.raw.levels_relaxed);
|
||||||
|
mScriptF = new ScriptC_levels_full(mRS, res, R.raw.levels_full);
|
||||||
|
setSaturation();
|
||||||
|
setLevels();
|
||||||
|
}
|
||||||
|
|
||||||
|
public void runTest() {
|
||||||
|
if (mUseFull) {
|
||||||
|
if (mUseV4) {
|
||||||
|
mScriptF.forEach_root4(mInPixelsAllocation, mOutPixelsAllocation);
|
||||||
|
} else {
|
||||||
|
mScriptF.forEach_root(mInPixelsAllocation, mOutPixelsAllocation);
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
if (mUseV4) {
|
||||||
|
mScriptR.forEach_root4(mInPixelsAllocation, mOutPixelsAllocation);
|
||||||
|
} else {
|
||||||
|
mScriptR.forEach_root(mInPixelsAllocation, mOutPixelsAllocation);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
@@ -0,0 +1,117 @@
|
|||||||
|
/*
|
||||||
|
* 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.image2;
|
||||||
|
|
||||||
|
import android.app.Activity;
|
||||||
|
import android.content.Context;
|
||||||
|
import android.os.Bundle;
|
||||||
|
import android.graphics.BitmapFactory;
|
||||||
|
import android.graphics.Bitmap;
|
||||||
|
import android.graphics.Canvas;
|
||||||
|
import android.support.v8.renderscript.*;
|
||||||
|
import android.view.SurfaceView;
|
||||||
|
import android.view.SurfaceHolder;
|
||||||
|
import android.widget.ImageView;
|
||||||
|
import android.widget.SeekBar;
|
||||||
|
import android.widget.TextView;
|
||||||
|
import android.view.View;
|
||||||
|
import android.util.Log;
|
||||||
|
import java.lang.Math;
|
||||||
|
|
||||||
|
public class TestBase {
|
||||||
|
protected final String TAG = "Img";
|
||||||
|
|
||||||
|
protected RenderScript mRS;
|
||||||
|
protected Allocation mInPixelsAllocation;
|
||||||
|
protected Allocation mOutPixelsAllocation;
|
||||||
|
|
||||||
|
// Override to use UI elements
|
||||||
|
public void onBar1Changed(int progress) {
|
||||||
|
}
|
||||||
|
public void onBar2Changed(int progress) {
|
||||||
|
}
|
||||||
|
public void onBar3Changed(int progress) {
|
||||||
|
}
|
||||||
|
public void onBar4Changed(int progress) {
|
||||||
|
}
|
||||||
|
public void onBar5Changed(int progress) {
|
||||||
|
}
|
||||||
|
|
||||||
|
// Override to use UI elements
|
||||||
|
// Unused bars will be hidden.
|
||||||
|
public boolean onBar1Setup(SeekBar b, TextView t) {
|
||||||
|
b.setVisibility(View.INVISIBLE);
|
||||||
|
t.setVisibility(View.INVISIBLE);
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
public boolean onBar2Setup(SeekBar b, TextView t) {
|
||||||
|
b.setVisibility(View.INVISIBLE);
|
||||||
|
t.setVisibility(View.INVISIBLE);
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
public boolean onBar3Setup(SeekBar b, TextView t) {
|
||||||
|
b.setVisibility(View.INVISIBLE);
|
||||||
|
t.setVisibility(View.INVISIBLE);
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
public boolean onBar4Setup(SeekBar b, TextView t) {
|
||||||
|
b.setVisibility(View.INVISIBLE);
|
||||||
|
t.setVisibility(View.INVISIBLE);
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
public boolean onBar5Setup(SeekBar b, TextView t) {
|
||||||
|
b.setVisibility(View.INVISIBLE);
|
||||||
|
t.setVisibility(View.INVISIBLE);
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
public final void createBaseTest(ImageProcessingActivity2 act, Bitmap b) {
|
||||||
|
mRS = RenderScript.create(act);
|
||||||
|
mInPixelsAllocation = Allocation.createFromBitmap(mRS, b,
|
||||||
|
Allocation.MipmapControl.MIPMAP_NONE,
|
||||||
|
Allocation.USAGE_SCRIPT);
|
||||||
|
mOutPixelsAllocation = Allocation.createFromBitmap(mRS, b,
|
||||||
|
Allocation.MipmapControl.MIPMAP_NONE,
|
||||||
|
Allocation.USAGE_SCRIPT);
|
||||||
|
createTest(act.getResources());
|
||||||
|
}
|
||||||
|
|
||||||
|
// Must override
|
||||||
|
public void createTest(android.content.res.Resources res) {
|
||||||
|
android.util.Log.e("img", "implement createTest");
|
||||||
|
}
|
||||||
|
|
||||||
|
// Must override
|
||||||
|
public void runTest() {
|
||||||
|
}
|
||||||
|
|
||||||
|
public void finish() {
|
||||||
|
mRS.finish();
|
||||||
|
}
|
||||||
|
|
||||||
|
public void updateBitmap(Bitmap b) {
|
||||||
|
mOutPixelsAllocation.copyTo(b);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Override to configure specific benchmark config.
|
||||||
|
public void setupBenchmark() {
|
||||||
|
}
|
||||||
|
|
||||||
|
// Override to reset after benchmark.
|
||||||
|
public void exitBenchmark() {
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,121 @@
|
|||||||
|
/*
|
||||||
|
* 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.image2;
|
||||||
|
|
||||||
|
import android.support.v8.renderscript.*;
|
||||||
|
import android.widget.SeekBar;
|
||||||
|
import android.widget.TextView;
|
||||||
|
|
||||||
|
public class Vignette extends TestBase {
|
||||||
|
private ScriptC_vignette_full mScript_full = null;
|
||||||
|
private ScriptC_vignette_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;
|
||||||
|
private float shade = 0.5f;
|
||||||
|
private float slope = 20.0f;
|
||||||
|
|
||||||
|
public Vignette(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("Shade");
|
||||||
|
b.setMax(100);
|
||||||
|
b.setProgress(50);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
public boolean onBar3Setup(SeekBar b, TextView t) {
|
||||||
|
t.setText("Slope");
|
||||||
|
b.setMax(100);
|
||||||
|
b.setProgress(20);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
public boolean onBar4Setup(SeekBar b, TextView t) {
|
||||||
|
t.setText("Shift center X");
|
||||||
|
b.setMax(100);
|
||||||
|
b.setProgress(50);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
public boolean onBar5Setup(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) {
|
||||||
|
shade = progress / 100.0f;
|
||||||
|
do_init();
|
||||||
|
}
|
||||||
|
public void onBar3Changed(int progress) {
|
||||||
|
slope = (float)progress;
|
||||||
|
do_init();
|
||||||
|
}
|
||||||
|
public void onBar4Changed(int progress) {
|
||||||
|
center_x = progress / 100.0f;
|
||||||
|
do_init();
|
||||||
|
}
|
||||||
|
public void onBar5Changed(int progress) {
|
||||||
|
center_y = progress / 100.0f;
|
||||||
|
do_init();
|
||||||
|
}
|
||||||
|
|
||||||
|
private void do_init() {
|
||||||
|
if (relaxed)
|
||||||
|
mScript_relaxed.invoke_init_vignette(
|
||||||
|
mInPixelsAllocation.getType().getX(),
|
||||||
|
mInPixelsAllocation.getType().getY(), center_x, center_y,
|
||||||
|
scale, shade, slope);
|
||||||
|
else
|
||||||
|
mScript_full.invoke_init_vignette(
|
||||||
|
mInPixelsAllocation.getType().getX(),
|
||||||
|
mInPixelsAllocation.getType().getY(), center_x, center_y,
|
||||||
|
scale, shade, slope);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void createTest(android.content.res.Resources res) {
|
||||||
|
if (relaxed) {
|
||||||
|
mScript_relaxed = new ScriptC_vignette_relaxed(mRS, res,
|
||||||
|
R.raw.vignette_relaxed);
|
||||||
|
} else {
|
||||||
|
mScript_full = new ScriptC_vignette_full(mRS, res,
|
||||||
|
R.raw.vignette_full);
|
||||||
|
}
|
||||||
|
do_init();
|
||||||
|
}
|
||||||
|
|
||||||
|
public void runTest() {
|
||||||
|
if (relaxed)
|
||||||
|
mScript_relaxed.forEach_root(mInPixelsAllocation, mOutPixelsAllocation);
|
||||||
|
else
|
||||||
|
mScript_full.forEach_root(mInPixelsAllocation, mOutPixelsAllocation);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
@@ -0,0 +1,38 @@
|
|||||||
|
/*
|
||||||
|
* 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.image2)
|
||||||
|
#pragma rs_fp_relaxed
|
||||||
|
|
||||||
|
|
||||||
|
static rs_matrix4x4 Mat;
|
||||||
|
|
||||||
|
void init() {
|
||||||
|
rsMatrixLoadIdentity(&Mat);
|
||||||
|
}
|
||||||
|
|
||||||
|
void setMatrix(rs_matrix4x4 m) {
|
||||||
|
Mat = m;
|
||||||
|
}
|
||||||
|
|
||||||
|
void root(const uchar4 *in, uchar4 *out) {
|
||||||
|
float4 f = convert_float4(*in);
|
||||||
|
f = rsMatrixMultiply(&Mat, f);
|
||||||
|
f = clamp(f, 0.f, 255.f);
|
||||||
|
*out = convert_uchar4(f);
|
||||||
|
}
|
||||||
|
|
||||||
@@ -0,0 +1,67 @@
|
|||||||
|
/*
|
||||||
|
* 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.image2)
|
||||||
|
#pragma rs_fp_relaxed
|
||||||
|
|
||||||
|
int32_t gWidth;
|
||||||
|
int32_t gHeight;
|
||||||
|
rs_allocation gIn;
|
||||||
|
|
||||||
|
float gCoeffs[9];
|
||||||
|
|
||||||
|
void root(uchar4 *out, uint32_t x, uint32_t y) {
|
||||||
|
uint32_t x1 = min((int32_t)x+1, gWidth);
|
||||||
|
uint32_t x2 = max((int32_t)x-1, 0);
|
||||||
|
uint32_t y1 = min((int32_t)y+1, gHeight);
|
||||||
|
uint32_t y2 = max((int32_t)y-1, 0);
|
||||||
|
|
||||||
|
float4 p00 = convert_float4(((uchar4 *)rsGetElementAt(gIn, x1, y1))[0]);
|
||||||
|
float4 p01 = convert_float4(((uchar4 *)rsGetElementAt(gIn, x, y1))[0]);
|
||||||
|
float4 p02 = convert_float4(((uchar4 *)rsGetElementAt(gIn, x2, y1))[0]);
|
||||||
|
float4 p10 = convert_float4(((uchar4 *)rsGetElementAt(gIn, x1, y))[0]);
|
||||||
|
float4 p11 = convert_float4(((uchar4 *)rsGetElementAt(gIn, x, y))[0]);
|
||||||
|
float4 p12 = convert_float4(((uchar4 *)rsGetElementAt(gIn, x2, y))[0]);
|
||||||
|
float4 p20 = convert_float4(((uchar4 *)rsGetElementAt(gIn, x1, y2))[0]);
|
||||||
|
float4 p21 = convert_float4(((uchar4 *)rsGetElementAt(gIn, x, y2))[0]);
|
||||||
|
float4 p22 = convert_float4(((uchar4 *)rsGetElementAt(gIn, x2, y2))[0]);
|
||||||
|
p00 *= gCoeffs[0];
|
||||||
|
p01 *= gCoeffs[1];
|
||||||
|
p02 *= gCoeffs[2];
|
||||||
|
p10 *= gCoeffs[3];
|
||||||
|
p11 *= gCoeffs[4];
|
||||||
|
p12 *= gCoeffs[5];
|
||||||
|
p20 *= gCoeffs[6];
|
||||||
|
p21 *= gCoeffs[7];
|
||||||
|
p22 *= gCoeffs[8];
|
||||||
|
|
||||||
|
p00 += p01;
|
||||||
|
p02 += p10;
|
||||||
|
p11 += p12;
|
||||||
|
p20 += p21;
|
||||||
|
|
||||||
|
p22 += p00;
|
||||||
|
p02 += p11;
|
||||||
|
|
||||||
|
p20 += p22;
|
||||||
|
p20 += p02;
|
||||||
|
|
||||||
|
p20 = clamp(p20, 0.f, 255.f);
|
||||||
|
*out = convert_uchar4(p20);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
@@ -0,0 +1,63 @@
|
|||||||
|
/*
|
||||||
|
* 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);
|
||||||
|
}
|
||||||
|
|
||||||
@@ -0,0 +1,21 @@
|
|||||||
|
/*
|
||||||
|
* 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.image2)
|
||||||
|
|
||||||
|
#include "fisheye.rsh"
|
||||||
|
|
||||||
@@ -0,0 +1,22 @@
|
|||||||
|
/*
|
||||||
|
* 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.image2)
|
||||||
|
#pragma rs_fp_relaxed
|
||||||
|
|
||||||
|
#include "fisheye.rsh"
|
||||||
|
|
||||||
@@ -0,0 +1,92 @@
|
|||||||
|
/*
|
||||||
|
* 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.image2)
|
||||||
|
#pragma rs_fp_relaxed
|
||||||
|
|
||||||
|
void genRand(uchar *out) {
|
||||||
|
*out = (uchar)rsRand(0xff);
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Convolution matrix of distance 2 with fixed point of 'kShiftBits' bits
|
||||||
|
* shifted. Thus the sum of this matrix should be 'kShiftValue'. Entries of
|
||||||
|
* small values are not calculated to gain efficiency.
|
||||||
|
* The order ot pixels represented in this matrix is:
|
||||||
|
* 1 2 3
|
||||||
|
* 4 0 5
|
||||||
|
* 6 7 8
|
||||||
|
* and the matrix should be: {230, 56, 114, 56, 114, 114, 56, 114, 56}.
|
||||||
|
* However, since most of the valus are identical, we only use the first three
|
||||||
|
* entries and the entries corresponding to the pixels is:
|
||||||
|
* 1 2 1
|
||||||
|
* 2 0 2
|
||||||
|
* 1 2 1
|
||||||
|
*/
|
||||||
|
|
||||||
|
int32_t gWidth;
|
||||||
|
int32_t gHeight;
|
||||||
|
|
||||||
|
rs_allocation gBlendSource;
|
||||||
|
void blend9(uchar *out, uint32_t x, uint32_t y) {
|
||||||
|
uint32_t x1 = min(x+1, (uint32_t)gWidth);
|
||||||
|
uint32_t x2 = max(x-1, (uint32_t)0);
|
||||||
|
uint32_t y1 = min(y+1, (uint32_t)gHeight);
|
||||||
|
uint32_t y2 = max(y-1, (uint32_t)0);
|
||||||
|
|
||||||
|
uint p00 = 56 * ((uchar *)rsGetElementAt(gBlendSource, x1, y1))[0];
|
||||||
|
uint p01 = 114 * ((uchar *)rsGetElementAt(gBlendSource, x, y1))[0];
|
||||||
|
uint p02 = 56 * ((uchar *)rsGetElementAt(gBlendSource, x2, y1))[0];
|
||||||
|
uint p10 = 114 * ((uchar *)rsGetElementAt(gBlendSource, x1, y))[0];
|
||||||
|
uint p11 = 230 * ((uchar *)rsGetElementAt(gBlendSource, x, y))[0];
|
||||||
|
uint p12 = 114 * ((uchar *)rsGetElementAt(gBlendSource, x2, y))[0];
|
||||||
|
uint p20 = 56 * ((uchar *)rsGetElementAt(gBlendSource, x1, y2))[0];
|
||||||
|
uint p21 = 114 * ((uchar *)rsGetElementAt(gBlendSource, x, y2))[0];
|
||||||
|
uint p22 = 56 * ((uchar *)rsGetElementAt(gBlendSource, x2, y2))[0];
|
||||||
|
|
||||||
|
p00 += p01;
|
||||||
|
p02 += p10;
|
||||||
|
p11 += p12;
|
||||||
|
p20 += p21;
|
||||||
|
|
||||||
|
p22 += p00;
|
||||||
|
p02 += p11;
|
||||||
|
|
||||||
|
p20 += p22;
|
||||||
|
p20 += p02;
|
||||||
|
|
||||||
|
*out = (uchar)(p20 >> 10);
|
||||||
|
}
|
||||||
|
|
||||||
|
float gNoiseStrength;
|
||||||
|
|
||||||
|
rs_allocation gNoise;
|
||||||
|
void root(const uchar4 *in, uchar4 *out, uint32_t x, uint32_t y) {
|
||||||
|
float4 ip = convert_float4(*in);
|
||||||
|
float pnoise = (float) ((uchar *)rsGetElementAt(gNoise, x, y))[0];
|
||||||
|
|
||||||
|
float energy_level = ip.r + ip.g + ip.b;
|
||||||
|
float energy_mask = (28.f - sqrt(energy_level)) * 0.03571f;
|
||||||
|
pnoise = (pnoise - 128.f) * energy_mask;
|
||||||
|
|
||||||
|
ip += pnoise * gNoiseStrength;
|
||||||
|
ip = clamp(ip, 0.f, 255.f);
|
||||||
|
|
||||||
|
uchar4 p = convert_uchar4(ip);
|
||||||
|
p.a = 0xff;
|
||||||
|
*out = p;
|
||||||
|
}
|
||||||
@@ -0,0 +1,30 @@
|
|||||||
|
/*
|
||||||
|
* 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.image2)
|
||||||
|
#pragma rs_fp_relaxed
|
||||||
|
|
||||||
|
const static float3 gMonoMult = {0.299f, 0.587f, 0.114f};
|
||||||
|
|
||||||
|
void root(const uchar4 *v_in, uchar4 *v_out) {
|
||||||
|
float4 f4 = rsUnpackColor8888(*v_in);
|
||||||
|
|
||||||
|
float3 mono = dot(f4.rgb, gMonoMult);
|
||||||
|
*v_out = rsPackColorTo8888(mono);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
@@ -0,0 +1,28 @@
|
|||||||
|
#pragma version(1)
|
||||||
|
#pragma rs_fp_relaxed
|
||||||
|
|
||||||
|
#include "ip.rsh"
|
||||||
|
|
||||||
|
void root(float4 *out, const void *usrData, uint32_t x, uint32_t y) {
|
||||||
|
const FilterStruct *fs = (const FilterStruct *)usrData;
|
||||||
|
float3 blurredPixel = 0;
|
||||||
|
const float *gPtr = fs->gaussian;
|
||||||
|
if ((x > fs->radius) && (x < (fs->width - fs->radius))) {
|
||||||
|
for (int r = -fs->radius; r <= fs->radius; r ++) {
|
||||||
|
const float4 *i = (const float4 *)rsGetElementAt(fs->ain, x + r, y);
|
||||||
|
blurredPixel += i->xyz * gPtr[0];
|
||||||
|
gPtr++;
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
for (int r = -fs->radius; r <= fs->radius; r ++) {
|
||||||
|
// Stepping left and right away from the pixel
|
||||||
|
int validX = rsClamp((int)x + r, (int)0, (int)(fs->width - 1));
|
||||||
|
const float4 *i = (const float4 *)rsGetElementAt(fs->ain, validX, y);
|
||||||
|
blurredPixel += i->xyz * gPtr[0];
|
||||||
|
gPtr++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
out->xyz = blurredPixel;
|
||||||
|
}
|
||||||
|
|
||||||
@@ -0,0 +1,15 @@
|
|||||||
|
#pragma rs java_package_name(com.android.rs.image2)
|
||||||
|
|
||||||
|
#define MAX_RADIUS 25
|
||||||
|
|
||||||
|
typedef struct FilterStruct_s {
|
||||||
|
rs_allocation ain;
|
||||||
|
|
||||||
|
float *gaussian; //[MAX_RADIUS * 2 + 1];
|
||||||
|
int height;
|
||||||
|
int width;
|
||||||
|
int radius;
|
||||||
|
|
||||||
|
} FilterStruct;
|
||||||
|
|
||||||
|
|
||||||
@@ -0,0 +1,44 @@
|
|||||||
|
/*
|
||||||
|
* 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.
|
||||||
|
*/
|
||||||
|
|
||||||
|
float inBlack;
|
||||||
|
float outBlack;
|
||||||
|
float inWMinInB;
|
||||||
|
float outWMinOutB;
|
||||||
|
float overInWMinInB;
|
||||||
|
rs_matrix3x3 colorMat;
|
||||||
|
|
||||||
|
void root(const uchar4 *in, uchar4 *out, uint32_t x, uint32_t y) {
|
||||||
|
float3 pixel = convert_float4(in[0]).rgb;
|
||||||
|
pixel = rsMatrixMultiply(&colorMat, pixel);
|
||||||
|
pixel = clamp(pixel, 0.f, 255.f);
|
||||||
|
pixel = (pixel - inBlack) * overInWMinInB;
|
||||||
|
pixel = pixel * outWMinOutB + outBlack;
|
||||||
|
pixel = clamp(pixel, 0.f, 255.f);
|
||||||
|
out->xyz = convert_uchar3(pixel);
|
||||||
|
out->w = 0xff;
|
||||||
|
}
|
||||||
|
|
||||||
|
void root4(const uchar4 *in, uchar4 *out, uint32_t x, uint32_t y) {
|
||||||
|
float4 pixel = convert_float4(in[0]);
|
||||||
|
pixel.rgb = rsMatrixMultiply(&colorMat, pixel.rgb);
|
||||||
|
pixel = clamp(pixel, 0.f, 255.f);
|
||||||
|
pixel = (pixel - inBlack) * overInWMinInB;
|
||||||
|
pixel = pixel * outWMinOutB + outBlack;
|
||||||
|
pixel = clamp(pixel, 0.f, 255.f);
|
||||||
|
out->xyzw = convert_uchar4(pixel);
|
||||||
|
}
|
||||||
|
|
||||||
@@ -0,0 +1,21 @@
|
|||||||
|
/*
|
||||||
|
* 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.image2)
|
||||||
|
|
||||||
|
#include "levels.rsh"
|
||||||
|
|
||||||
@@ -0,0 +1,22 @@
|
|||||||
|
/*
|
||||||
|
* 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.image2)
|
||||||
|
#pragma rs_fp_relaxed
|
||||||
|
|
||||||
|
#include "levels.rsh"
|
||||||
|
|
||||||
@@ -0,0 +1,93 @@
|
|||||||
|
#pragma version(1)
|
||||||
|
|
||||||
|
#include "ip.rsh"
|
||||||
|
|
||||||
|
int height;
|
||||||
|
int width;
|
||||||
|
int radius;
|
||||||
|
|
||||||
|
uchar4 * InPixel;
|
||||||
|
uchar4 * OutPixel;
|
||||||
|
float4 * ScratchPixel1;
|
||||||
|
float4 * ScratchPixel2;
|
||||||
|
|
||||||
|
rs_script vBlurScript;
|
||||||
|
rs_script hBlurScript;
|
||||||
|
|
||||||
|
const int CMD_FINISHED = 1;
|
||||||
|
|
||||||
|
// Store our coefficients here
|
||||||
|
static float gaussian[MAX_RADIUS * 2 + 1];
|
||||||
|
|
||||||
|
|
||||||
|
static void computeGaussianWeights() {
|
||||||
|
// Compute gaussian weights for the blur
|
||||||
|
// e is the euler's number
|
||||||
|
float e = 2.718281828459045f;
|
||||||
|
float pi = 3.1415926535897932f;
|
||||||
|
// g(x) = ( 1 / sqrt( 2 * pi ) * sigma) * e ^ ( -x^2 / 2 * sigma^2 )
|
||||||
|
// x is of the form [-radius .. 0 .. radius]
|
||||||
|
// and sigma varies with radius.
|
||||||
|
// Based on some experimental radius values and sigma's
|
||||||
|
// we approximately fit sigma = f(radius) as
|
||||||
|
// sigma = radius * 0.4 + 0.6
|
||||||
|
// The larger the radius gets, the more our gaussian blur
|
||||||
|
// will resemble a box blur since with large sigma
|
||||||
|
// the gaussian curve begins to lose its shape
|
||||||
|
float sigma = 0.4f * (float)radius + 0.6f;
|
||||||
|
|
||||||
|
// Now compute the coefficints
|
||||||
|
// We will store some redundant values to save some math during
|
||||||
|
// the blur calculations
|
||||||
|
// precompute some values
|
||||||
|
float coeff1 = 1.0f / (sqrt( 2.0f * pi ) * sigma);
|
||||||
|
float coeff2 = - 1.0f / (2.0f * sigma * sigma);
|
||||||
|
|
||||||
|
float normalizeFactor = 0.0f;
|
||||||
|
float floatR = 0.0f;
|
||||||
|
int r;
|
||||||
|
for (r = -radius; r <= radius; r ++) {
|
||||||
|
floatR = (float)r;
|
||||||
|
gaussian[r + radius] = coeff1 * pow(e, floatR * floatR * coeff2);
|
||||||
|
normalizeFactor += gaussian[r + radius];
|
||||||
|
}
|
||||||
|
|
||||||
|
//Now we need to normalize the weights because all our coefficients need to add up to one
|
||||||
|
normalizeFactor = 1.0f / normalizeFactor;
|
||||||
|
for (r = -radius; r <= radius; r ++) {
|
||||||
|
floatR = (float)r;
|
||||||
|
gaussian[r + radius] *= normalizeFactor;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
static void copyInput() {
|
||||||
|
rs_allocation ain;
|
||||||
|
ain = rsGetAllocation(InPixel);
|
||||||
|
uint32_t dimx = rsAllocationGetDimX(ain);
|
||||||
|
uint32_t dimy = rsAllocationGetDimY(ain);
|
||||||
|
for (uint32_t y = 0; y < dimy; y++) {
|
||||||
|
for (uint32_t x = 0; x < dimx; x++) {
|
||||||
|
ScratchPixel1[x + y * dimx] = convert_float4(InPixel[x + y * dimx]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void filter() {
|
||||||
|
copyInput();
|
||||||
|
computeGaussianWeights();
|
||||||
|
|
||||||
|
FilterStruct fs;
|
||||||
|
fs.gaussian = gaussian;
|
||||||
|
fs.width = width;
|
||||||
|
fs.height = height;
|
||||||
|
fs.radius = radius;
|
||||||
|
|
||||||
|
fs.ain = rsGetAllocation(ScratchPixel1);
|
||||||
|
rsForEach(hBlurScript, fs.ain, rsGetAllocation(ScratchPixel2), &fs, sizeof(fs));
|
||||||
|
|
||||||
|
fs.ain = rsGetAllocation(ScratchPixel2);
|
||||||
|
rsForEach(vBlurScript, fs.ain, rsGetAllocation(OutPixel), &fs, sizeof(fs));
|
||||||
|
//rsSendToClientBlocking(CMD_FINISHED);
|
||||||
|
}
|
||||||
|
|
||||||
@@ -0,0 +1,59 @@
|
|||||||
|
#pragma version(1)
|
||||||
|
#pragma rs_fp_relaxed
|
||||||
|
|
||||||
|
#include "ip.rsh"
|
||||||
|
|
||||||
|
static float saturation;
|
||||||
|
static rs_matrix3x3 colorMat;
|
||||||
|
|
||||||
|
void setSaturation(float sat) {
|
||||||
|
saturation = sat;
|
||||||
|
|
||||||
|
// Saturation
|
||||||
|
// Linear weights
|
||||||
|
//float rWeight = 0.3086f;
|
||||||
|
//float gWeight = 0.6094f;
|
||||||
|
//float bWeight = 0.0820f;
|
||||||
|
|
||||||
|
// Gamma 2.2 weights (we haven't converted our image to linear space yet for perf reasons)
|
||||||
|
float rWeight = 0.299f;
|
||||||
|
float gWeight = 0.587f;
|
||||||
|
float bWeight = 0.114f;
|
||||||
|
|
||||||
|
float oneMinusS = 1.0f - saturation;
|
||||||
|
rsMatrixSet(&colorMat, 0, 0, oneMinusS * rWeight + saturation);
|
||||||
|
rsMatrixSet(&colorMat, 0, 1, oneMinusS * rWeight);
|
||||||
|
rsMatrixSet(&colorMat, 0, 2, oneMinusS * rWeight);
|
||||||
|
rsMatrixSet(&colorMat, 1, 0, oneMinusS * gWeight);
|
||||||
|
rsMatrixSet(&colorMat, 1, 1, oneMinusS * gWeight + saturation);
|
||||||
|
rsMatrixSet(&colorMat, 1, 2, oneMinusS * gWeight);
|
||||||
|
rsMatrixSet(&colorMat, 2, 0, oneMinusS * bWeight);
|
||||||
|
rsMatrixSet(&colorMat, 2, 1, oneMinusS * bWeight);
|
||||||
|
rsMatrixSet(&colorMat, 2, 2, oneMinusS * bWeight + saturation);
|
||||||
|
}
|
||||||
|
|
||||||
|
void root(uchar4 *out, const void *usrData, uint32_t x, uint32_t y) {
|
||||||
|
const FilterStruct *fs = (const FilterStruct *)usrData;
|
||||||
|
float3 blurredPixel = 0;
|
||||||
|
const float *gPtr = fs->gaussian;
|
||||||
|
if ((y > fs->radius) && (y < (fs->height - fs->radius))) {
|
||||||
|
for (int r = -fs->radius; r <= fs->radius; r ++) {
|
||||||
|
const float4 *i = (const float4 *)rsGetElementAt(fs->ain, x, y + r);
|
||||||
|
blurredPixel += i->xyz * gPtr[0];
|
||||||
|
gPtr++;
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
for (int r = -fs->radius; r <= fs->radius; r ++) {
|
||||||
|
int validH = rsClamp((int)y + r, (int)0, (int)(fs->height - 1));
|
||||||
|
const float4 *i = (const float4 *)rsGetElementAt(fs->ain, x, validH);
|
||||||
|
blurredPixel += i->xyz * gPtr[0];
|
||||||
|
gPtr++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
float3 temp = rsMatrixMultiply(&colorMat, blurredPixel);
|
||||||
|
temp = clamp(temp, 0.f, 255.f);
|
||||||
|
out->xyz = convert_uchar3(temp);
|
||||||
|
out->w = 0xff;
|
||||||
|
}
|
||||||
|
|
||||||
@@ -0,0 +1,59 @@
|
|||||||
|
/*
|
||||||
|
* 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.
|
||||||
|
*/
|
||||||
|
|
||||||
|
static float2 neg_center, axis_scale, inv_dimensions;
|
||||||
|
static float sloped_neg_range, sloped_inv_max_dist, shade, opp_shade;
|
||||||
|
|
||||||
|
void init_vignette(uint32_t dim_x, uint32_t dim_y, float center_x, float center_y,
|
||||||
|
float desired_scale, float desired_shade, float desired_slope) {
|
||||||
|
|
||||||
|
neg_center.x = -center_x;
|
||||||
|
neg_center.y = -center_y;
|
||||||
|
inv_dimensions.x = 1.f / (float)dim_x;
|
||||||
|
inv_dimensions.y = 1.f / (float)dim_y;
|
||||||
|
|
||||||
|
axis_scale = (float2)1.f;
|
||||||
|
if (dim_x > dim_y)
|
||||||
|
axis_scale.y = (float)dim_y / (float)dim_x;
|
||||||
|
else
|
||||||
|
axis_scale.x = (float)dim_x / (float)dim_y;
|
||||||
|
|
||||||
|
const float max_dist = 0.5 * length(axis_scale);
|
||||||
|
sloped_inv_max_dist = desired_slope * 1.f/max_dist;
|
||||||
|
|
||||||
|
// Range needs to be between 1.3 to 0.6. When scale is zero then range is
|
||||||
|
// 1.3 which means no vignette at all because the luminousity difference is
|
||||||
|
// less than 1/256. Expect input scale to be between 0.0 and 1.0.
|
||||||
|
const float neg_range = 0.7*sqrt(desired_scale) - 1.3;
|
||||||
|
sloped_neg_range = exp(neg_range * desired_slope);
|
||||||
|
|
||||||
|
shade = desired_shade;
|
||||||
|
opp_shade = 1.f - desired_shade;
|
||||||
|
}
|
||||||
|
|
||||||
|
void root(const uchar4 *in, uchar4 *out, uint32_t x, uint32_t y) {
|
||||||
|
// Convert x and y to floating point coordinates with center as origin
|
||||||
|
const float4 fin = convert_float4(*in);
|
||||||
|
const float2 inCoord = {(float)x, (float)y};
|
||||||
|
const float2 coord = mad(inCoord, inv_dimensions, neg_center);
|
||||||
|
const float sloped_dist_ratio = length(axis_scale * coord) * sloped_inv_max_dist;
|
||||||
|
const float lumen = opp_shade + shade / ( 1.0 + sloped_neg_range * exp(sloped_dist_ratio) );
|
||||||
|
float4 fout;
|
||||||
|
fout.rgb = fin.rgb * lumen;
|
||||||
|
fout.w = fin.w;
|
||||||
|
*out = convert_uchar4(fout);
|
||||||
|
}
|
||||||
|
|
||||||
@@ -0,0 +1,21 @@
|
|||||||
|
/*
|
||||||
|
* 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.image2)
|
||||||
|
|
||||||
|
#include "vignette.rsh"
|
||||||
|
|
||||||
@@ -0,0 +1,22 @@
|
|||||||
|
/*
|
||||||
|
* 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.image2)
|
||||||
|
#pragma rs_fp_relaxed
|
||||||
|
|
||||||
|
#include "vignette.rsh"
|
||||||
|
|
||||||
Reference in New Issue
Block a user