diff options
author | Jason Sams <jsams@google.com> | 2013-03-19 12:41:48 -0700 |
---|---|---|
committer | Jason Sams <jsams@google.com> | 2013-03-19 12:41:48 -0700 |
commit | 572a5031a5d8602db0bec0b253428a034bd4dd59 (patch) | |
tree | 44db981d697afe061f45a575a06c0384993e6b13 /java/tests/ImageProcessing_jb/src/com/android/rs | |
parent | 110f181b7966212a36ef18016f9b81c7322d0a2f (diff) | |
download | rs-572a5031a5d8602db0bec0b253428a034bd4dd59.tar.gz |
Move compute tests from frameworks/base to frameworks/rs
Change-Id: I844c9f5e58f500164fec419569c68c7f854c5571
Diffstat (limited to 'java/tests/ImageProcessing_jb/src/com/android/rs')
54 files changed, 3836 insertions, 0 deletions
diff --git a/java/tests/ImageProcessing_jb/src/com/android/rs/image/BWFilter.java b/java/tests/ImageProcessing_jb/src/com/android/rs/image/BWFilter.java new file mode 100644 index 00000000..4870ac40 --- /dev/null +++ b/java/tests/ImageProcessing_jb/src/com/android/rs/image/BWFilter.java @@ -0,0 +1,34 @@ +/* + * 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.imagejb; + +import java.lang.Math; + + +public class BWFilter extends TestBase { + private ScriptC_bwfilter mScript; + + public void createTest(android.content.res.Resources res) { + mScript = new ScriptC_bwfilter(mRS); + } + + public void runTest() { + mScript.invoke_prepareBwFilter(50, 50, 50); + mScript.forEach_bwFilterKernel(mInPixelsAllocation, mOutPixelsAllocation); + } + +} diff --git a/java/tests/ImageProcessing_jb/src/com/android/rs/image/Blend.java b/java/tests/ImageProcessing_jb/src/com/android/rs/image/Blend.java new file mode 100644 index 00000000..302dc315 --- /dev/null +++ b/java/tests/ImageProcessing_jb/src/com/android/rs/image/Blend.java @@ -0,0 +1,178 @@ +/* + * 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.imagejb; + +import java.lang.Math; +import java.lang.Short; + +import android.renderscript.Allocation; +import android.renderscript.Element; +import android.renderscript.Matrix4f; +import android.renderscript.RenderScript; +import android.renderscript.Script; +import android.renderscript.ScriptC; +import android.renderscript.ScriptGroup; +import android.renderscript.ScriptIntrinsicBlend; +import android.renderscript.Type; +import android.util.Log; +import android.widget.SeekBar; +import android.widget.TextView; +import android.widget.AdapterView; +import android.widget.ArrayAdapter; +import android.view.View; +import android.widget.Spinner; + +public class Blend extends TestBase { + private ScriptIntrinsicBlend mBlend; + private ScriptC_blend mBlendHelper; + private short image1Alpha = 128; + private short image2Alpha = 128; + + String mIntrinsicNames[]; + + private Allocation image1; + private Allocation image2; + private int currentIntrinsic = 0; + + private AdapterView.OnItemSelectedListener mIntrinsicSpinnerListener = + new AdapterView.OnItemSelectedListener() { + public void onItemSelected(AdapterView<?> parent, View view, int pos, long id) { + currentIntrinsic = pos; + if (mRS != null) { + runTest(); + act.updateDisplay(); + } + } + + public void onNothingSelected(AdapterView parent) { + + } + }; + + public void createTest(android.content.res.Resources res) { + mBlend = ScriptIntrinsicBlend.create(mRS, Element.U8_4(mRS)); + mBlendHelper = new ScriptC_blend(mRS); + mBlendHelper.set_alpha((short)128); + + image1 = Allocation.createTyped(mRS, mInPixelsAllocation.getType()); + image2 = Allocation.createTyped(mRS, mInPixelsAllocation2.getType()); + + mIntrinsicNames = new String[14]; + mIntrinsicNames[0] = "Source"; + mIntrinsicNames[1] = "Destination"; + mIntrinsicNames[2] = "Source Over"; + mIntrinsicNames[3] = "Destination Over"; + mIntrinsicNames[4] = "Source In"; + mIntrinsicNames[5] = "Destination In"; + mIntrinsicNames[6] = "Source Out"; + mIntrinsicNames[7] = "Destination Out"; + mIntrinsicNames[8] = "Source Atop"; + mIntrinsicNames[9] = "Destination Atop"; + mIntrinsicNames[10] = "XOR"; + mIntrinsicNames[11] = "Add"; + mIntrinsicNames[12] = "Subtract"; + mIntrinsicNames[13] = "Multiply"; + } + + public boolean onSpinner1Setup(Spinner s) { + s.setAdapter(new ArrayAdapter<String>( + act, R.layout.spinner_layout, mIntrinsicNames)); + s.setOnItemSelectedListener(mIntrinsicSpinnerListener); + return true; + } + + public boolean onBar1Setup(SeekBar b, TextView t) { + t.setText("Image 1 Alpha"); + b.setMax(255); + b.setProgress(image1Alpha); + return true; + } + + public void onBar1Changed(int progress) { + image1Alpha = (short)progress; + } + + public boolean onBar2Setup(SeekBar b, TextView t) { + t.setText("Image 2 Alpha"); + b.setMax(255); + b.setProgress(image2Alpha); + return true; + } + + public void onBar2Changed(int progress) { + image2Alpha = (short)progress; + } + + public void runTest() { + image1.copy2DRangeFrom(0, 0, mInPixelsAllocation.getType().getX(), mInPixelsAllocation.getType().getY(), mInPixelsAllocation, 0, 0); + image2.copy2DRangeFrom(0, 0, mInPixelsAllocation2.getType().getX(), mInPixelsAllocation2.getType().getY(), mInPixelsAllocation2, 0, 0); + + mBlendHelper.set_alpha(image1Alpha); + mBlendHelper.forEach_setImageAlpha(image1); + + mBlendHelper.set_alpha(image2Alpha); + mBlendHelper.forEach_setImageAlpha(image2); + + switch (currentIntrinsic) { + case 0: + mBlend.forEachSrc(image1, image2); + break; + case 1: + mBlend.forEachDst(image1, image2); + break; + case 2: + mBlend.forEachSrcOver(image1, image2); + break; + case 3: + mBlend.forEachDstOver(image1, image2); + break; + case 4: + mBlend.forEachSrcIn(image1, image2); + break; + case 5: + mBlend.forEachDstIn(image1, image2); + break; + case 6: + mBlend.forEachSrcOut(image1, image2); + break; + case 7: + mBlend.forEachDstOut(image1, image2); + break; + case 8: + mBlend.forEachSrcAtop(image1, image2); + break; + case 9: + mBlend.forEachDstAtop(image1, image2); + break; + case 10: + mBlend.forEachXor(image1, image2); + break; + case 11: + mBlend.forEachAdd(image1, image2); + break; + case 12: + mBlend.forEachSubtract(image1, image2); + break; + case 13: + mBlend.forEachMultiply(image1, image2); + break; + } + + mOutPixelsAllocation.copy2DRangeFrom(0, 0, image2.getType().getX(), image2.getType().getY(), image2, 0, 0); + } + +} diff --git a/java/tests/ImageProcessing_jb/src/com/android/rs/image/Blur25.java b/java/tests/ImageProcessing_jb/src/com/android/rs/image/Blur25.java new file mode 100644 index 00000000..90acd003 --- /dev/null +++ b/java/tests/ImageProcessing_jb/src/com/android/rs/image/Blur25.java @@ -0,0 +1,118 @@ +/* + * 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.imagejb; + +import java.lang.Math; + +import android.renderscript.Allocation; +import android.renderscript.Element; +import android.renderscript.RenderScript; +import android.renderscript.ScriptIntrinsicBlur; +import android.renderscript.Type; +import android.util.Log; +import android.widget.SeekBar; +import android.widget.TextView; + +public class Blur25 extends TestBase { + private boolean mUseIntrinsic = false; + private ScriptIntrinsicBlur mIntrinsic; + + private int MAX_RADIUS = 25; + private ScriptC_threshold mScript; + private float mRadius = MAX_RADIUS; + private float mSaturation = 1.0f; + private Allocation mScratchPixelsAllocation1; + private Allocation mScratchPixelsAllocation2; + + + public Blur25(boolean useIntrinsic) { + mUseIntrinsic = useIntrinsic; + } + + public boolean onBar1Setup(SeekBar b, TextView t) { + t.setText("Radius"); + b.setProgress(100); + return true; + } + + + public void onBar1Changed(int progress) { + mRadius = ((float)progress) / 100.0f * MAX_RADIUS; + if (mRadius <= 0.10f) { + mRadius = 0.10f; + } + if (mUseIntrinsic) { + mIntrinsic.setRadius(mRadius); + } else { + mScript.invoke_setRadius((int)mRadius); + } + } + + + public void createTest(android.content.res.Resources res) { + int width = mInPixelsAllocation.getType().getX(); + int height = mInPixelsAllocation.getType().getY(); + + if (mUseIntrinsic) { + mIntrinsic = ScriptIntrinsicBlur.create(mRS, Element.U8_4(mRS)); + mIntrinsic.setRadius(MAX_RADIUS); + mIntrinsic.setInput(mInPixelsAllocation); + } else { + + 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()); + + mScript = new ScriptC_threshold(mRS, res, R.raw.threshold); + mScript.set_width(width); + mScript.set_height(height); + mScript.invoke_setRadius(MAX_RADIUS); + + mScript.set_InPixel(mInPixelsAllocation); + mScript.set_ScratchPixel1(mScratchPixelsAllocation1); + mScript.set_ScratchPixel2(mScratchPixelsAllocation2); + } + } + + public void runTest() { + if (mUseIntrinsic) { + mIntrinsic.forEach(mOutPixelsAllocation); + } else { + mScript.forEach_copyIn(mInPixelsAllocation, mScratchPixelsAllocation1); + mScript.forEach_horz(mScratchPixelsAllocation2); + mScript.forEach_vert(mOutPixelsAllocation); + } + } + + public void setupBenchmark() { + if (mUseIntrinsic) { + mIntrinsic.setRadius(MAX_RADIUS); + } else { + mScript.invoke_setRadius(MAX_RADIUS); + } + } + + public void exitBenchmark() { + if (mUseIntrinsic) { + mIntrinsic.setRadius(mRadius); + } else { + mScript.invoke_setRadius((int)mRadius); + } + } +} diff --git a/java/tests/ImageProcessing_jb/src/com/android/rs/image/ColorMatrix.java b/java/tests/ImageProcessing_jb/src/com/android/rs/image/ColorMatrix.java new file mode 100644 index 00000000..5053d4d2 --- /dev/null +++ b/java/tests/ImageProcessing_jb/src/com/android/rs/image/ColorMatrix.java @@ -0,0 +1,70 @@ +/* + * 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.imagejb; + +import java.lang.Math; + +import android.renderscript.Allocation; +import android.renderscript.Element; +import android.renderscript.Matrix4f; +import android.renderscript.RenderScript; +import android.renderscript.Script; +import android.renderscript.ScriptC; +import android.renderscript.ScriptGroup; +import android.renderscript.ScriptIntrinsicColorMatrix; +import android.renderscript.Type; +import android.util.Log; + +public class ColorMatrix extends TestBase { + private ScriptC_colormatrix mScript; + private ScriptIntrinsicColorMatrix mIntrinsic; + private boolean mUseIntrinsic; + private boolean mUseGrey; + + public ColorMatrix(boolean useIntrinsic, boolean useGrey) { + mUseIntrinsic = useIntrinsic; + mUseGrey = useGrey; + } + + public void createTest(android.content.res.Resources res) { + Matrix4f m = new Matrix4f(); + m.set(1, 0, 0.2f); + m.set(1, 1, 0.9f); + m.set(1, 2, 0.2f); + + if (mUseIntrinsic) { + mIntrinsic = ScriptIntrinsicColorMatrix.create(mRS, Element.U8_4(mRS)); + if (mUseGrey) { + mIntrinsic.setGreyscale(); + } else { + mIntrinsic.setColorMatrix(m); + } + } else { + mScript = new ScriptC_colormatrix(mRS, res, R.raw.colormatrix); + mScript.invoke_setMatrix(m); + } + } + + public void runTest() { + if (mUseIntrinsic) { + mIntrinsic.forEach(mInPixelsAllocation, mOutPixelsAllocation); + } else { + mScript.forEach_root(mInPixelsAllocation, mOutPixelsAllocation); + } + } + +} diff --git a/java/tests/ImageProcessing_jb/src/com/android/rs/image/Contrast.java b/java/tests/ImageProcessing_jb/src/com/android/rs/image/Contrast.java new file mode 100644 index 00000000..20b28fff --- /dev/null +++ b/java/tests/ImageProcessing_jb/src/com/android/rs/image/Contrast.java @@ -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.imagejb; + +import java.lang.Math; + +import android.renderscript.Allocation; + +public class Contrast extends TestBase { + private ScriptC_contrast mScript; + + public void createTest(android.content.res.Resources res) { + mScript = new ScriptC_contrast(mRS); + } + + public void runTest() { + mScript.invoke_setBright(50.f); + mScript.forEach_contrast(mInPixelsAllocation, mOutPixelsAllocation); + } + +} diff --git a/java/tests/ImageProcessing_jb/src/com/android/rs/image/Convolve3x3.java b/java/tests/ImageProcessing_jb/src/com/android/rs/image/Convolve3x3.java new file mode 100644 index 00000000..d7acf4a2 --- /dev/null +++ b/java/tests/ImageProcessing_jb/src/com/android/rs/image/Convolve3x3.java @@ -0,0 +1,70 @@ +/* + * 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.imagejb; + +import java.lang.Math; + +import android.renderscript.Allocation; +import android.renderscript.Element; +import android.renderscript.Matrix4f; +import android.renderscript.RenderScript; +import android.renderscript.Script; +import android.renderscript.ScriptC; +import android.renderscript.ScriptGroup; +import android.renderscript.ScriptIntrinsicConvolve3x3; +import android.renderscript.Type; +import android.util.Log; + +public class Convolve3x3 extends TestBase { + private ScriptC_convolve3x3 mScript; + private ScriptIntrinsicConvolve3x3 mIntrinsic; + + private int mWidth; + private int mHeight; + private boolean mUseIntrinsic; + + public Convolve3x3(boolean useIntrinsic) { + mUseIntrinsic = useIntrinsic; + } + + public void createTest(android.content.res.Resources res) { + mWidth = mInPixelsAllocation.getType().getX(); + mHeight = mInPixelsAllocation.getType().getY(); + + 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; + + if (mUseIntrinsic) { + mIntrinsic = ScriptIntrinsicConvolve3x3.create(mRS, Element.U8_4(mRS)); + mIntrinsic.setCoefficients(f); + mIntrinsic.setInput(mInPixelsAllocation); + } else { + mScript = new ScriptC_convolve3x3(mRS, res, R.raw.convolve3x3); + mScript.set_gCoeffs(f); + mScript.set_gIn(mInPixelsAllocation); + mScript.set_gWidth(mWidth); + mScript.set_gHeight(mHeight); + } + } + + public void runTest() { + mScript.forEach_root(mOutPixelsAllocation); + } + +} diff --git a/java/tests/ImageProcessing_jb/src/com/android/rs/image/Convolve5x5.java b/java/tests/ImageProcessing_jb/src/com/android/rs/image/Convolve5x5.java new file mode 100644 index 00000000..d1dbb1f7 --- /dev/null +++ b/java/tests/ImageProcessing_jb/src/com/android/rs/image/Convolve5x5.java @@ -0,0 +1,88 @@ +/* + * 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.imagejb; + +import java.lang.Math; + +import android.renderscript.Allocation; +import android.renderscript.Element; +import android.renderscript.Matrix4f; +import android.renderscript.RenderScript; +import android.renderscript.Script; +import android.renderscript.ScriptC; +import android.renderscript.ScriptGroup; +import android.renderscript.ScriptIntrinsicConvolve5x5; +import android.renderscript.Type; +import android.util.Log; + +public class Convolve5x5 extends TestBase { + private ScriptC_convolve5x5 mScript; + private ScriptIntrinsicConvolve5x5 mIntrinsic; + + private int mWidth; + private int mHeight; + private boolean mUseIntrinsic; + + public Convolve5x5(boolean useIntrinsic) { + mUseIntrinsic = useIntrinsic; + } + + public void createTest(android.content.res.Resources res) { + mWidth = mInPixelsAllocation.getType().getX(); + mHeight = mInPixelsAllocation.getType().getY(); + + float f[] = new float[25]; + //f[0] = 0.012f; f[1] = 0.025f; f[2] = 0.031f; f[3] = 0.025f; f[4] = 0.012f; + //f[5] = 0.025f; f[6] = 0.057f; f[7] = 0.075f; f[8] = 0.057f; f[9] = 0.025f; + //f[10]= 0.031f; f[11]= 0.075f; f[12]= 0.095f; f[13]= 0.075f; f[14]= 0.031f; + //f[15]= 0.025f; f[16]= 0.057f; f[17]= 0.075f; f[18]= 0.057f; f[19]= 0.025f; + //f[20]= 0.012f; f[21]= 0.025f; f[22]= 0.031f; f[23]= 0.025f; f[24]= 0.012f; + + //f[0] = 1.f; f[1] = 2.f; f[2] = 0.f; f[3] = -2.f; f[4] = -1.f; + //f[5] = 4.f; f[6] = 8.f; f[7] = 0.f; f[8] = -8.f; f[9] = -4.f; + //f[10]= 6.f; f[11]=12.f; f[12]= 0.f; f[13]=-12.f; f[14]= -6.f; + //f[15]= 4.f; f[16]= 8.f; f[17]= 0.f; f[18]= -8.f; f[19]= -4.f; + //f[20]= 1.f; f[21]= 2.f; f[22]= 0.f; f[23]= -2.f; f[24]= -1.f; + + f[0] = -1.f; f[1] = -3.f; f[2] = -4.f; f[3] = -3.f; f[4] = -1.f; + f[5] = -3.f; f[6] = 0.f; f[7] = 6.f; f[8] = 0.f; f[9] = -3.f; + f[10]= -4.f; f[11]= 6.f; f[12]= 20.f; f[13]= 6.f; f[14]= -4.f; + f[15]= -3.f; f[16]= 0.f; f[17]= 6.f; f[18]= 0.f; f[19]= -3.f; + f[20]= -1.f; f[21]= -3.f; f[22]= -4.f; f[23]= -3.f; f[24]= -1.f; + + if (mUseIntrinsic) { + mIntrinsic = ScriptIntrinsicConvolve5x5.create(mRS, Element.U8_4(mRS)); + mIntrinsic.setCoefficients(f); + mIntrinsic.setInput(mInPixelsAllocation); + } else { + mScript = new ScriptC_convolve5x5(mRS, res, R.raw.convolve5x5); + mScript.set_gCoeffs(f); + mScript.set_gIn(mInPixelsAllocation); + mScript.set_gWidth(mWidth); + mScript.set_gHeight(mHeight); + } + } + + public void runTest() { + if (mUseIntrinsic) { + mIntrinsic.forEach(mOutPixelsAllocation); + } else { + mScript.forEach_root(mOutPixelsAllocation); + } + } + +} diff --git a/java/tests/ImageProcessing_jb/src/com/android/rs/image/Copy.java b/java/tests/ImageProcessing_jb/src/com/android/rs/image/Copy.java new file mode 100644 index 00000000..1bdee4b3 --- /dev/null +++ b/java/tests/ImageProcessing_jb/src/com/android/rs/image/Copy.java @@ -0,0 +1,40 @@ +/* + * 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.imagejb; + +import java.lang.Math; + +import android.renderscript.Allocation; +import android.renderscript.Element; +import android.renderscript.RenderScript; +import android.renderscript.Script; +import android.renderscript.ScriptC; +import android.renderscript.Type; +import android.util.Log; + +public class Copy extends TestBase { + private ScriptC_copy mScript; + + public void createTest(android.content.res.Resources res) { + mScript = new ScriptC_copy(mRS, res, R.raw.copy); + } + + public void runTest() { + mScript.forEach_root(mInPixelsAllocation, mOutPixelsAllocation); + } + +} diff --git a/java/tests/ImageProcessing_jb/src/com/android/rs/image/CrossProcess.java b/java/tests/ImageProcessing_jb/src/com/android/rs/image/CrossProcess.java new file mode 100644 index 00000000..75ee39ba --- /dev/null +++ b/java/tests/ImageProcessing_jb/src/com/android/rs/image/CrossProcess.java @@ -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. + */ + +package com.android.rs.imagejb; + +import java.lang.Math; + +import android.renderscript.Allocation; +import android.renderscript.Element; +import android.renderscript.RenderScript; +import android.renderscript.ScriptIntrinsicLUT; +import android.util.Log; + +public class CrossProcess extends TestBase { + private ScriptIntrinsicLUT mIntrinsic; + + public void createTest(android.content.res.Resources res) { + mIntrinsic = ScriptIntrinsicLUT.create(mRS, Element.U8_4(mRS)); + for (int ct=0; ct < 256; ct++) { + float f = ((float)ct) / 255.f; + + float r = f; + if (r < 0.5f) { + r = 4.0f * r * r * r; + } else { + r = 1.0f - r; + r = 1.0f - (4.0f * r * r * r); + } + mIntrinsic.setRed(ct, (int)(r * 255.f + 0.5f)); + + float g = f; + if (g < 0.5f) { + g = 2.0f * g * g; + } else { + g = 1.0f - g; + g = 1.0f - (2.0f * g * g); + } + mIntrinsic.setGreen(ct, (int)(g * 255.f + 0.5f)); + + float b = f * 0.5f + 0.25f; + mIntrinsic.setBlue(ct, (int)(b * 255.f + 0.5f)); + } + + } + + public void runTest() { + mIntrinsic.forEach(mInPixelsAllocation, mOutPixelsAllocation); + } + +} diff --git a/java/tests/ImageProcessing_jb/src/com/android/rs/image/Exposure.java b/java/tests/ImageProcessing_jb/src/com/android/rs/image/Exposure.java new file mode 100644 index 00000000..ddde96f0 --- /dev/null +++ b/java/tests/ImageProcessing_jb/src/com/android/rs/image/Exposure.java @@ -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.imagejb; + +import java.lang.Math; + +import android.renderscript.Allocation; + +public class Exposure extends TestBase { + private ScriptC_exposure mScript; + + public void createTest(android.content.res.Resources res) { + mScript = new ScriptC_exposure(mRS); + } + + public void runTest() { + mScript.invoke_setBright(50.f); + mScript.forEach_exposure(mInPixelsAllocation, mOutPixelsAllocation); + } + +} diff --git a/java/tests/ImageProcessing_jb/src/com/android/rs/image/Fisheye.java b/java/tests/ImageProcessing_jb/src/com/android/rs/image/Fisheye.java new file mode 100644 index 00000000..114839c9 --- /dev/null +++ b/java/tests/ImageProcessing_jb/src/com/android/rs/image/Fisheye.java @@ -0,0 +1,138 @@ +/* + * 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.imagejb; + +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 ScriptC_fisheye_approx_full mScript_approx_full = null; + private ScriptC_fisheye_approx_relaxed mScript_approx_relaxed = null; + private final boolean approx; + private final boolean relaxed; + private float center_x = 0.5f; + private float center_y = 0.5f; + private float scale = 0.5f; + + public Fisheye(boolean approx, boolean relaxed) { + this.approx = approx; + 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 (approx) { + if (relaxed) + mScript_approx_relaxed.invoke_init_filter( + mInPixelsAllocation.getType().getX(), + mInPixelsAllocation.getType().getY(), center_x, + center_y, scale); + else + mScript_approx_full.invoke_init_filter( + mInPixelsAllocation.getType().getX(), + mInPixelsAllocation.getType().getY(), center_x, + center_y, scale); + } else 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 (approx) { + if (relaxed) { + mScript_approx_relaxed = new ScriptC_fisheye_approx_relaxed(mRS, + res, R.raw.fisheye_approx_relaxed); + mScript_approx_relaxed.set_in_alloc(mInPixelsAllocation); + mScript_approx_relaxed.set_sampler(Sampler.CLAMP_LINEAR(mRS)); + } else { + mScript_approx_full = new ScriptC_fisheye_approx_full(mRS, res, + R.raw.fisheye_approx_full); + mScript_approx_full.set_in_alloc(mInPixelsAllocation); + mScript_approx_full.set_sampler(Sampler.CLAMP_LINEAR(mRS)); + } + } else 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 (approx) { + if (relaxed) + mScript_approx_relaxed.forEach_root(mOutPixelsAllocation); + else + mScript_approx_full.forEach_root(mOutPixelsAllocation); + } else if (relaxed) + mScript_relaxed.forEach_root(mOutPixelsAllocation); + else + mScript_full.forEach_root(mOutPixelsAllocation); + } + +} + diff --git a/java/tests/ImageProcessing_jb/src/com/android/rs/image/Grain.java b/java/tests/ImageProcessing_jb/src/com/android/rs/image/Grain.java new file mode 100644 index 00000000..5cd19a29 --- /dev/null +++ b/java/tests/ImageProcessing_jb/src/com/android/rs/image/Grain.java @@ -0,0 +1,94 @@ +/* + * 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.imagejb; + +import java.lang.Math; + +import android.renderscript.Allocation; +import android.renderscript.Element; +import android.renderscript.RenderScript; +import android.renderscript.Script; +import android.renderscript.ScriptC; +import android.renderscript.Type; +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); + } + + private int findHighBit(int v) { + int bit = 0; + while (v > 1) { + bit++; + v >>= 1; + } + return bit; + } + + + public void createTest(android.content.res.Resources res) { + int width = mInPixelsAllocation.getType().getX(); + int height = mInPixelsAllocation.getType().getY(); + + int noiseW = findHighBit(width); + int noiseH = findHighBit(height); + if (noiseW > 9) { + noiseW = 9; + } + if (noiseH > 9) { + noiseH = 9; + } + noiseW = 1 << noiseW; + noiseH = 1 << noiseH; + + Type.Builder tb = new Type.Builder(mRS, Element.U8(mRS)); + tb.setX(noiseW); + tb.setY(noiseH); + mNoise = Allocation.createTyped(mRS, tb.create()); + mNoise2 = Allocation.createTyped(mRS, tb.create()); + + mScript = new ScriptC_grain(mRS, res, R.raw.grain); + mScript.set_gWMask(noiseW - 1); + mScript.set_gHMask(noiseH - 1); + 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); + } + +} + diff --git a/java/tests/ImageProcessing_jb/src/com/android/rs/image/Greyscale.java b/java/tests/ImageProcessing_jb/src/com/android/rs/image/Greyscale.java new file mode 100644 index 00000000..f1952e70 --- /dev/null +++ b/java/tests/ImageProcessing_jb/src/com/android/rs/image/Greyscale.java @@ -0,0 +1,40 @@ +/* + * 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.imagejb; + +import java.lang.Math; + +import android.renderscript.Allocation; +import android.renderscript.Element; +import android.renderscript.RenderScript; +import android.renderscript.Script; +import android.renderscript.ScriptC; +import android.renderscript.Type; +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); + } + +} diff --git a/java/tests/ImageProcessing_jb/src/com/android/rs/image/GroupTest.java b/java/tests/ImageProcessing_jb/src/com/android/rs/image/GroupTest.java new file mode 100644 index 00000000..3e5175ab --- /dev/null +++ b/java/tests/ImageProcessing_jb/src/com/android/rs/image/GroupTest.java @@ -0,0 +1,93 @@ +/* + * 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.imagejb; + +import java.lang.Math; + +import android.renderscript.Allocation; +import android.renderscript.Element; +import android.renderscript.RenderScript; +import android.renderscript.ScriptIntrinsicConvolve3x3; +import android.renderscript.ScriptIntrinsicColorMatrix; +import android.renderscript.Type; +import android.renderscript.Matrix4f; +import android.renderscript.ScriptGroup; +import android.util.Log; + +public class GroupTest extends TestBase { + private ScriptIntrinsicConvolve3x3 mConvolve; + private ScriptIntrinsicColorMatrix 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 = ScriptIntrinsicConvolve3x3.create(mRS, Element.U8_4(mRS)); + mMatrix = ScriptIntrinsicColorMatrix.create(mRS, Element.U8_4(mRS)); + + 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.setCoefficients(f); + + Matrix4f m = new Matrix4f(); + m.set(1, 0, 0.2f); + m.set(1, 1, 0.9f); + m.set(1, 2, 0.2f); + mMatrix.setColorMatrix(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.addKernel(mConvolve.getKernelID()); + b.addKernel(mMatrix.getKernelID()); + b.addConnection(connect, mConvolve.getKernelID(), mMatrix.getKernelID()); + mGroup = b.create(); + } else { + mScratchPixelsAllocation1 = Allocation.createTyped(mRS, connect); + } + } + + public void runTest() { + mConvolve.setInput(mInPixelsAllocation); + if (mUseNative) { + mGroup.setOutput(mMatrix.getKernelID(), mOutPixelsAllocation); + mGroup.execute(); + } else { + mConvolve.forEach(mScratchPixelsAllocation1); + mMatrix.forEach(mScratchPixelsAllocation1, mOutPixelsAllocation); + } + } + +} diff --git a/java/tests/ImageProcessing_jb/src/com/android/rs/image/ImageProcessingActivityJB.java b/java/tests/ImageProcessing_jb/src/com/android/rs/image/ImageProcessingActivityJB.java new file mode 100644 index 00000000..93937ef6 --- /dev/null +++ b/java/tests/ImageProcessing_jb/src/com/android/rs/image/ImageProcessingActivityJB.java @@ -0,0 +1,494 @@ +/* + * 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.imagejb; + +import android.app.Activity; +import android.os.Bundle; +import android.os.Handler; +import android.os.Message; +import android.graphics.BitmapFactory; +import android.graphics.Bitmap; +import android.graphics.Canvas; +import android.view.SurfaceView; +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 android.renderscript.ScriptC; +import android.renderscript.RenderScript; +import android.renderscript.Type; +import android.renderscript.Allocation; +import android.renderscript.Element; +import android.renderscript.Script; + +import android.os.Environment; +import java.io.BufferedWriter; +import java.io.File; +import java.io.FileWriter; +import java.io.IOException; + +public class ImageProcessingActivityJB extends Activity + implements SeekBar.OnSeekBarChangeListener { + private final String TAG = "Img"; + public final String RESULT_FILE = "image_processing_result.csv"; + + RenderScript mRS; + Allocation mInPixelsAllocation; + Allocation mInPixelsAllocation2; + Allocation mOutPixelsAllocation; + + /** + * Define enum type for test names + */ + public enum TestName { + // totally there are 38 test cases + LEVELS_VEC3_RELAXED ("Levels Vec3 Relaxed"), + LEVELS_VEC4_RELAXED ("Levels Vec4 Relaxed"), + LEVELS_VEC3_FULL ("Levels Vec3 Full"), + LEVELS_VEC4_FULL ("Levels Vec4 Full"), + BLUR_RADIUS_25 ("Blur radius 25"), + INTRINSIC_BLUE_RADIUS_25 ("Intrinsic Blur radius 25"), + GREYSCALE ("Greyscale"), + GRAIN ("Grain"), + FISHEYE_FULL ("Fisheye Full"), + FISHEYE_RELAXED ("Fisheye Relaxed"), + FISHEYE_APPROXIMATE_FULL ("Fisheye Approximate Full"), + FISHEYE_APPROXIMATE_RELAXED ("Fisheye Approximate Relaxed"), + VIGNETTE_FULL ("Vignette Full"), + VIGNETTE_RELAXED ("Vignette Relaxed"), + VIGNETTE_APPROXIMATE_FULL ("Vignette Approximate Full"), + VIGNETTE_APPROXIMATE_RELAXED ("Vignette Approximate Relaxed"), + GROUP_TEST_EMULATED ("Group Test (emulated)"), + GROUP_TEST_NATIVE ("Group Test (native)"), + CONVOLVE_3X3 ("Convolve 3x3"), + INTRINSICS_CONVOLVE_3X3 ("Intrinsics Convolve 3x3"), + COLOR_MATRIX ("ColorMatrix"), + INTRINSICS_COLOR_MATRIX ("Intrinsics ColorMatrix"), + INTRINSICS_COLOR_MATRIX_GREY ("Intrinsics ColorMatrix Grey"), + COPY ("Copy"), + CROSS_PROCESS_USING_LUT ("CrossProcess (using LUT)"), + CONVOLVE_5X5 ("Convolve 5x5"), + INTRINSICS_CONVOLVE_5X5 ("Intrinsics Convolve 5x5"), + MANDELBROT ("Mandelbrot"), + INTRINSICS_BLEND ("Intrinsics Blend"), + VIBRANCE ("Vibrance"), + BW_FILTER ("BW Filter"), + SHADOWS ("Shadows"), + CONTRAST ("Contrast"), + EXPOSURE ("Exposure"), + WHITE_BALANCE ("White Balance"); + + + private final String name; + + private TestName(String s) { + name = s; + } + + // return quoted string as displayed test name + public String toString() { + return name; + } + } + + Bitmap mBitmapIn; + Bitmap mBitmapIn2; + Bitmap mBitmapOut; + + private Spinner mSpinner; + 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; + private int mRunCount; + + public void updateDisplay() { + mHandler.sendMessage(Message.obtain()); + } + + private Handler mHandler = new Handler() { + // Allow the filter to complete without blocking the UI + // thread. When the message arrives that the op is complete + // we will either mark completion or start a new filter if + // more work is ready. Either way, display the result. + @Override + public void handleMessage(Message msg) { + mTest.updateBitmap(mBitmapOut); + mDisplayView.invalidate(); + + boolean doTest = false; + synchronized(this) { + if (mRunCount > 0) { + mRunCount--; + if (mRunCount > 0) { + doTest = true; + } + } + } + if (doTest) { + mTest.runTestSendMessage(); + } + } + + }; + + 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); + } + + boolean doTest = false; + synchronized(this) { + if (mRunCount == 0) { + doTest = true; + mRunCount = 1; + } else { + mRunCount = 2; + } + } + if (doTest) { + mTest.runTestSendMessage(); + } + } + } + + public void onStartTrackingTouch(SeekBar seekBar) { + } + + public void onStopTrackingTouch(SeekBar seekBar) { + } + + void setupBars() { + mSpinner.setVisibility(View.VISIBLE); + mTest.onSpinner1Setup(mSpinner); + + 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(TestName testName) { + if (mTest != null) { + mTest.destroy(); + } + switch(testName) { + case LEVELS_VEC3_RELAXED: + mTest = new LevelsV4(false, false); + break; + case LEVELS_VEC4_RELAXED: + mTest = new LevelsV4(false, true); + break; + case LEVELS_VEC3_FULL: + mTest = new LevelsV4(true, false); + break; + case LEVELS_VEC4_FULL: + mTest = new LevelsV4(true, true); + break; + case BLUR_RADIUS_25: + mTest = new Blur25(false); + break; + case INTRINSIC_BLUE_RADIUS_25: + mTest = new Blur25(true); + break; + case GREYSCALE: + mTest = new Greyscale(); + break; + case GRAIN: + mTest = new Grain(); + break; + case FISHEYE_FULL: + mTest = new Fisheye(false, false); + break; + case FISHEYE_RELAXED: + mTest = new Fisheye(false, true); + break; + case FISHEYE_APPROXIMATE_FULL: + mTest = new Fisheye(true, false); + break; + case FISHEYE_APPROXIMATE_RELAXED: + mTest = new Fisheye(true, true); + break; + case VIGNETTE_FULL: + mTest = new Vignette(false, false); + break; + case VIGNETTE_RELAXED: + mTest = new Vignette(false, true); + break; + case VIGNETTE_APPROXIMATE_FULL: + mTest = new Vignette(true, false); + break; + case VIGNETTE_APPROXIMATE_RELAXED: + mTest = new Vignette(true, true); + break; + case GROUP_TEST_EMULATED: + mTest = new GroupTest(false); + break; + case GROUP_TEST_NATIVE: + mTest = new GroupTest(true); + break; + case CONVOLVE_3X3: + mTest = new Convolve3x3(false); + break; + case INTRINSICS_CONVOLVE_3X3: + mTest = new Convolve3x3(true); + break; + case COLOR_MATRIX: + mTest = new ColorMatrix(false, false); + break; + case INTRINSICS_COLOR_MATRIX: + mTest = new ColorMatrix(true, false); + break; + case INTRINSICS_COLOR_MATRIX_GREY: + mTest = new ColorMatrix(true, true); + break; + case COPY: + mTest = new Copy(); + break; + case CROSS_PROCESS_USING_LUT: + mTest = new CrossProcess(); + break; + case CONVOLVE_5X5: + mTest = new Convolve5x5(false); + break; + case INTRINSICS_CONVOLVE_5X5: + mTest = new Convolve5x5(true); + break; + case MANDELBROT: + mTest = new Mandelbrot(); + break; + case INTRINSICS_BLEND: + mTest = new Blend(); + break; + case VIBRANCE: + mTest = new Vibrance(); + break; + case BW_FILTER: + mTest = new BWFilter(); + break; + case SHADOWS: + mTest = new Shadows(); + break; + case CONTRAST: + mTest = new Contrast(); + break; + case EXPOSURE: + mTest = new Exposure(); + break; + case WHITE_BALANCE: + mTest = new WhiteBalance(); + break; + } + + mTest.createBaseTest(this, mBitmapIn, mBitmapIn2, mBitmapOut); + setupBars(); + + mTest.runTest(); + updateDisplay(); + mBenchmarkResult.setText("Result: not run"); + } + + void setupTests() { + mTestSpinner.setAdapter(new ArrayAdapter<TestName>( + this, R.layout.spinner_layout, TestName.values())); + } + + private AdapterView.OnItemSelectedListener mTestSpinnerListener = + new AdapterView.OnItemSelectedListener() { + public void onItemSelected(AdapterView<?> parent, View view, int pos, long id) { + changeTest(TestName.values()[pos]); + } + + public void onNothingSelected(AdapterView parent) { + + } + }; + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + setContentView(R.layout.main); + + mBitmapIn = loadBitmap(R.drawable.img1600x1067); + mBitmapIn2 = loadBitmap(R.drawable.img1600x1067b); + mBitmapOut = Bitmap.createBitmap(mBitmapIn.getWidth(), mBitmapIn.getHeight(), + mBitmapIn.getConfig()); + + mSurfaceView = (SurfaceView) findViewById(R.id.surface); + + mDisplayView = (ImageView) findViewById(R.id.display); + mDisplayView.setImageBitmap(mBitmapOut); + + mSpinner = (Spinner) findViewById(R.id.spinner1); + + 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"); + + + mRS = RenderScript.create(this); + mInPixelsAllocation = Allocation.createFromBitmap(mRS, mBitmapIn); + mInPixelsAllocation2 = Allocation.createFromBitmap(mRS, mBitmapIn2); + mOutPixelsAllocation = Allocation.createFromBitmap(mRS, mBitmapOut); + + + setupTests(); + changeTest(TestName.LEVELS_VEC3_RELAXED); + } + + + private Bitmap loadBitmap(int resource) { + final BitmapFactory.Options options = new BitmapFactory.Options(); + options.inPreferredConfig = Bitmap.Config.ARGB_8888; + return BitmapFactory.decodeResource(getResources(), resource, options); + } + + // button hook + public void benchmark(View v) { + float t = getBenchmark(); + //long javaTime = javaFilter(); + //mBenchmarkResult.setText("RS: " + t + " ms Java: " + javaTime + " ms"); + mBenchmarkResult.setText("Result: " + t + " ms"); + Log.v(TAG, "getBenchmark: Renderscript frame time core ms " + t); + } + + public void benchmark_all(View v) { + // write result into a file + File externalStorage = Environment.getExternalStorageDirectory(); + if (!externalStorage.canWrite()) { + Log.v(TAG, "sdcard is not writable"); + return; + } + File resultFile = new File(externalStorage, RESULT_FILE); + resultFile.setWritable(true, false); + try { + BufferedWriter rsWriter = new BufferedWriter(new FileWriter(resultFile)); + Log.v(TAG, "Saved results in: " + resultFile.getAbsolutePath()); + for (TestName tn: TestName.values()) { + changeTest(tn); + float t = getBenchmark(); + String s = new String("" + tn.toString() + ", " + t); + rsWriter.write(s + "\n"); + Log.v(TAG, "Test " + s + "ms\n"); + } + rsWriter.close(); + } catch (IOException e) { + Log.v(TAG, "Unable to write result file " + e.getMessage()); + } + changeTest(TestName.LEVELS_VEC3_RELAXED); + } + + // For benchmark test + public float getBenchmark() { + mDoingBenchmark = true; + + mTest.setupBenchmark(); + long result = 0; + + //Log.v(TAG, "Warming"); + long t = java.lang.System.currentTimeMillis() + 250; + do { + mTest.runTest(); + mTest.finish(); + } while (t > java.lang.System.currentTimeMillis()); + + //Log.v(TAG, "Benchmarking"); + int ct = 0; + t = java.lang.System.currentTimeMillis(); + do { + mTest.runTest(); + mTest.finish(); + ct++; + } while ((t+1000) > java.lang.System.currentTimeMillis()); + t = java.lang.System.currentTimeMillis() - t; + float ft = (float)t; + ft /= ct; + + mTest.exitBenchmark(); + mDoingBenchmark = false; + + return ft; + } +} diff --git a/java/tests/ImageProcessing_jb/src/com/android/rs/image/LevelsV4.java b/java/tests/ImageProcessing_jb/src/com/android/rs/image/LevelsV4.java new file mode 100644 index 00000000..741e480e --- /dev/null +++ b/java/tests/ImageProcessing_jb/src/com/android/rs/image/LevelsV4.java @@ -0,0 +1,167 @@ +/* + * 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.imagejb; + +import java.lang.Math; + +import android.renderscript.Allocation; +import android.renderscript.Element; +import android.renderscript.RenderScript; +import android.renderscript.Matrix3f; +import android.renderscript.Script; +import android.renderscript.ScriptC; +import android.renderscript.Type; +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); + } + } + } + +} + diff --git a/java/tests/ImageProcessing_jb/src/com/android/rs/image/Mandelbrot.java b/java/tests/ImageProcessing_jb/src/com/android/rs/image/Mandelbrot.java new file mode 100644 index 00000000..ca348486 --- /dev/null +++ b/java/tests/ImageProcessing_jb/src/com/android/rs/image/Mandelbrot.java @@ -0,0 +1,98 @@ +/* + * 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.imagejb; + +import java.lang.Math; + +import android.renderscript.Allocation; +import android.renderscript.Element; +import android.renderscript.RenderScript; +import android.renderscript.Script; +import android.renderscript.ScriptC; +import android.renderscript.Type; +import android.util.Log; +import android.widget.SeekBar; +import android.widget.TextView; + +public class Mandelbrot extends TestBase { + private ScriptC_mandelbrot mScript; + + public boolean onBar1Setup(SeekBar b, TextView t) { + t.setText("Iterations"); + b.setProgress(0); + return true; + } + + public void onBar1Changed(int progress) { + int iters = progress * 3 + 50; + mScript.set_gMaxIteration(iters); + } + + public boolean onBar2Setup(SeekBar b, TextView t) { + t.setText("Lower Bound: X"); + b.setProgress(0); + return true; + } + + public void onBar2Changed(int progress) { + float scaleFactor = mScript.get_scaleFactor(); + // allow viewport to be moved by 2x scale factor + float lowerBoundX = -2.f + ((progress / scaleFactor) / 50.f); + mScript.set_lowerBoundX(lowerBoundX); + } + + public boolean onBar3Setup(SeekBar b, TextView t) { + t.setText("Lower Bound: Y"); + b.setProgress(0); + return true; + } + + public void onBar3Changed(int progress) { + float scaleFactor = mScript.get_scaleFactor(); + // allow viewport to be moved by 2x scale factor + float lowerBoundY = -2.f + ((progress / scaleFactor) / 50.f); + mScript.set_lowerBoundY(lowerBoundY); + } + + public boolean onBar4Setup(SeekBar b, TextView t) { + t.setText("Scale Factor"); + b.setProgress(0); + return true; + } + + public void onBar4Changed(int progress) { + float scaleFactor = 4.f - (3.96f * (progress / 100.f)); + mScript.set_scaleFactor(scaleFactor); + } + + public void createTest(android.content.res.Resources res) { + int width = mOutPixelsAllocation.getType().getX(); + int height = mOutPixelsAllocation.getType().getY(); + + mScript = new ScriptC_mandelbrot(mRS, res, R.raw.mandelbrot); + mScript.set_gDimX(width); + mScript.set_gDimY(height); + mScript.set_gMaxIteration(50); + } + + public void runTest() { + mScript.forEach_root(mOutPixelsAllocation); + mRS.finish(); + } + +} + diff --git a/java/tests/ImageProcessing_jb/src/com/android/rs/image/Shadows.java b/java/tests/ImageProcessing_jb/src/com/android/rs/image/Shadows.java new file mode 100644 index 00000000..d246d596 --- /dev/null +++ b/java/tests/ImageProcessing_jb/src/com/android/rs/image/Shadows.java @@ -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.imagejb; + +import java.lang.Math; + +import android.renderscript.Allocation; + +public class Shadows extends TestBase { + private ScriptC_shadows mScript; + + public void createTest(android.content.res.Resources res) { + mScript = new ScriptC_shadows(mRS); + } + + public void runTest() { + mScript.invoke_prepareShadows(50.f); + mScript.forEach_shadowsKernel(mInPixelsAllocation, mOutPixelsAllocation); + } + +} diff --git a/java/tests/ImageProcessing_jb/src/com/android/rs/image/TestBase.java b/java/tests/ImageProcessing_jb/src/com/android/rs/image/TestBase.java new file mode 100644 index 00000000..9ae366a9 --- /dev/null +++ b/java/tests/ImageProcessing_jb/src/com/android/rs/image/TestBase.java @@ -0,0 +1,153 @@ +/* + * 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.imagejb; + +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.renderscript.ScriptC; +import android.renderscript.RenderScript; +import android.renderscript.Type; +import android.renderscript.Allocation; +import android.renderscript.Element; +import android.renderscript.Script; +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; +import android.widget.Spinner; + +public class TestBase { + protected final String TAG = "Img"; + + protected RenderScript mRS; + protected Allocation mInPixelsAllocation; + protected Allocation mInPixelsAllocation2; + protected Allocation mOutPixelsAllocation; + protected ScriptC_msg mMessageScript; + + protected ImageProcessingActivityJB act; + + private class MessageProcessor extends RenderScript.RSMessageHandler { + ImageProcessingActivityJB mAct; + + MessageProcessor(ImageProcessingActivityJB act) { + mAct = act; + } + + public void run() { + mAct.updateDisplay(); + } + } + + // 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 boolean onSpinner1Setup(Spinner s) { + s.setVisibility(View.INVISIBLE); + return false; + } + + public final void createBaseTest(ImageProcessingActivityJB ipact, Bitmap b, Bitmap b2, Bitmap outb) { + act = ipact; + mRS = ipact.mRS; + mRS.setMessageHandler(new MessageProcessor(act)); + + mInPixelsAllocation = ipact.mInPixelsAllocation; + mInPixelsAllocation2 = ipact.mInPixelsAllocation2; + mOutPixelsAllocation = ipact.mOutPixelsAllocation; + + createTest(act.getResources()); + } + + // Must override + public void createTest(android.content.res.Resources res) { + } + + // Must override + public void runTest() { + } + + final public void runTestSendMessage() { + runTest(); + mMessageScript.invoke_sendMsg(); + } + + public void finish() { + mRS.finish(); + } + + public void destroy() { + mRS.setMessageHandler(null); + } + + 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() { + } +} diff --git a/java/tests/ImageProcessing_jb/src/com/android/rs/image/Vibrance.java b/java/tests/ImageProcessing_jb/src/com/android/rs/image/Vibrance.java new file mode 100644 index 00000000..09822a91 --- /dev/null +++ b/java/tests/ImageProcessing_jb/src/com/android/rs/image/Vibrance.java @@ -0,0 +1,36 @@ +/* + * 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.imagejb; + +import java.lang.Math; + +import android.renderscript.Allocation; + +public class Vibrance extends TestBase { + private ScriptC_vibrance mScript; + + public void createTest(android.content.res.Resources res) { + mScript = new ScriptC_vibrance(mRS); + } + + public void runTest() { + mScript.set_vibrance(50.f); + mScript.invoke_prepareVibrance(); + mScript.forEach_vibranceKernel(mInPixelsAllocation, mOutPixelsAllocation); + } + +} diff --git a/java/tests/ImageProcessing_jb/src/com/android/rs/image/Vignette.java b/java/tests/ImageProcessing_jb/src/com/android/rs/image/Vignette.java new file mode 100644 index 00000000..94517575 --- /dev/null +++ b/java/tests/ImageProcessing_jb/src/com/android/rs/image/Vignette.java @@ -0,0 +1,154 @@ +/* + * 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.imagejb; + +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 Vignette extends TestBase { + private ScriptC_vignette_full mScript_full = null; + private ScriptC_vignette_relaxed mScript_relaxed = null; + private ScriptC_vignette_approx_full mScript_approx_full = null; + private ScriptC_vignette_approx_relaxed mScript_approx_relaxed = null; + private final boolean approx; + 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 approx, boolean relaxed) { + this.approx = approx; + 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 (approx) { + if (relaxed) + mScript_approx_relaxed.invoke_init_vignette( + mInPixelsAllocation.getType().getX(), + mInPixelsAllocation.getType().getY(), center_x, + center_y, scale, shade, slope); + else + mScript_approx_full.invoke_init_vignette( + mInPixelsAllocation.getType().getX(), + mInPixelsAllocation.getType().getY(), center_x, + center_y, scale, shade, slope); + } else 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 (approx) { + if (relaxed) + mScript_approx_relaxed = new ScriptC_vignette_approx_relaxed( + mRS, res, R.raw.vignette_approx_relaxed); + else + mScript_approx_full = new ScriptC_vignette_approx_full( + mRS, res, R.raw.vignette_approx_full); + } else 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 (approx) { + if (relaxed) + mScript_approx_relaxed.forEach_root(mInPixelsAllocation, + mOutPixelsAllocation); + else + mScript_approx_full.forEach_root(mInPixelsAllocation, + mOutPixelsAllocation); + } else if (relaxed) + mScript_relaxed.forEach_root(mInPixelsAllocation, + mOutPixelsAllocation); + else + mScript_full.forEach_root(mInPixelsAllocation, + mOutPixelsAllocation); + } + +} + diff --git a/java/tests/ImageProcessing_jb/src/com/android/rs/image/WhiteBalance.java b/java/tests/ImageProcessing_jb/src/com/android/rs/image/WhiteBalance.java new file mode 100644 index 00000000..f15aaf5b --- /dev/null +++ b/java/tests/ImageProcessing_jb/src/com/android/rs/image/WhiteBalance.java @@ -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. + */ + +package com.android.rs.imagejb; + +import java.lang.Math; + +import android.renderscript.Allocation; + +public class WhiteBalance extends TestBase { + private ScriptC_wbalance mScript; + + public void createTest(android.content.res.Resources res) { + mScript = new ScriptC_wbalance(mRS); + } + + public void runTest() { + mScript.set_histogramSource(mInPixelsAllocation); + mScript.set_histogramWidth(mInPixelsAllocation.getType().getX()); + mScript.set_histogramHeight(mInPixelsAllocation.getType().getY()); + mScript.invoke_prepareWhiteBalance(); + mScript.forEach_whiteBalanceKernel(mInPixelsAllocation, mOutPixelsAllocation); + } + +} diff --git a/java/tests/ImageProcessing_jb/src/com/android/rs/image/blend.rs b/java/tests/ImageProcessing_jb/src/com/android/rs/image/blend.rs new file mode 100644 index 00000000..9ec1246b --- /dev/null +++ b/java/tests/ImageProcessing_jb/src/com/android/rs/image/blend.rs @@ -0,0 +1,23 @@ +// Copyright (C) 2011 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. + +#include "ip.rsh" + +uchar alpha = 0x0; + +void setImageAlpha(uchar4 *v_out, uint32_t x, uint32_t y) { + v_out->rgba = convert_uchar4((convert_uint4(v_out->rgba) * alpha) >> (uint4)8); + v_out->a = alpha; +} + diff --git a/java/tests/ImageProcessing_jb/src/com/android/rs/image/bwfilter.rs b/java/tests/ImageProcessing_jb/src/com/android/rs/image/bwfilter.rs new file mode 100644 index 00000000..e706d440 --- /dev/null +++ b/java/tests/ImageProcessing_jb/src/com/android/rs/image/bwfilter.rs @@ -0,0 +1,52 @@ +/* + * 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. + */ + +#include "ip.rsh" +//#pragma rs_fp_relaxed + +static float sr = 0.f; +static float sg = 0.f; +static float sb = 0.f; + +void prepareBwFilter(uint32_t rw, uint32_t gw, uint32_t bw) { + + sr = rw; + sg = gw; + sb = bw; + + float imageMin = min(sg,sb); + imageMin = fmin(sr,imageMin); + float imageMax = max(sg,sb); + imageMax = fmax(sr,imageMax); + float avg = (imageMin + imageMax)/2; + sb /= avg; + sg /= avg; + sr /= avg; + +} + +void bwFilterKernel(const uchar4 *in, uchar4 *out) { + float r = in->r * sr; + float g = in->g * sg; + float b = in->b * sb; + float localMin, localMax, avg; + localMin = fmin(g,b); + localMin = fmin(r,localMin); + localMax = fmax(g,b); + localMax = fmax(r,localMax); + avg = (localMin+localMax) * 0.5f; + out->r = out->g = out->b = rsClamp(avg, 0, 255); +} diff --git a/java/tests/ImageProcessing_jb/src/com/android/rs/image/colormatrix.fs b/java/tests/ImageProcessing_jb/src/com/android/rs/image/colormatrix.fs new file mode 100644 index 00000000..86fb2482 --- /dev/null +++ b/java/tests/ImageProcessing_jb/src/com/android/rs/image/colormatrix.fs @@ -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. + */ + +#include "ip.rsh" + +static rs_matrix4x4 Mat; + +void init() { + rsMatrixLoadIdentity(&Mat); +} + +void setMatrix(rs_matrix4x4 m) { + Mat = m; +} + +uchar4 __attribute__((kernel)) root(uchar4 in) { + float4 f = convert_float4(in); + f = rsMatrixMultiply(&Mat, f); + f = clamp(f, 0.f, 255.f); + return convert_uchar4(f); +} + diff --git a/java/tests/ImageProcessing_jb/src/com/android/rs/image/contrast.rs b/java/tests/ImageProcessing_jb/src/com/android/rs/image/contrast.rs new file mode 100644 index 00000000..d3743d3b --- /dev/null +++ b/java/tests/ImageProcessing_jb/src/com/android/rs/image/contrast.rs @@ -0,0 +1,37 @@ +/* + * 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. + */ + +#include "ip.rsh" + +static float brightM = 0.f; +static float brightC = 0.f; + +void setBright(float v) { + brightM = pow(2.f, v / 100.f); + brightC = 127.f - brightM * 127.f; +} + +void contrast(const uchar4 *in, uchar4 *out) +{ +#if 0 + out->r = rsClamp((int)(brightM * in->r + brightC), 0, 255); + out->g = rsClamp((int)(brightM * in->g + brightC), 0, 255); + out->b = rsClamp((int)(brightM * in->b + brightC), 0, 255); +#else + float3 v = convert_float3(in->rgb) * brightM + brightC; + out->rgb = convert_uchar3(clamp(v, 0.f, 255.f)); +#endif +} diff --git a/java/tests/ImageProcessing_jb/src/com/android/rs/image/convolve3x3.fs b/java/tests/ImageProcessing_jb/src/com/android/rs/image/convolve3x3.fs new file mode 100644 index 00000000..177e86e2 --- /dev/null +++ b/java/tests/ImageProcessing_jb/src/com/android/rs/image/convolve3x3.fs @@ -0,0 +1,65 @@ +/* + * 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. + */ + +#include "ip.rsh" + +int32_t gWidth; +int32_t gHeight; +rs_allocation gIn; + +float gCoeffs[9]; + +uchar4 __attribute__((kernel)) root(uint32_t x, uint32_t y) { + uint32_t x1 = min((int32_t)x+1, gWidth-1); + uint32_t x2 = max((int32_t)x-1, 0); + uint32_t y1 = min((int32_t)y+1, gHeight-1); + uint32_t y2 = max((int32_t)y-1, 0); + + float4 p00 = convert_float4(rsGetElementAt_uchar4(gIn, x1, y1)); + float4 p01 = convert_float4(rsGetElementAt_uchar4(gIn, x, y1)); + float4 p02 = convert_float4(rsGetElementAt_uchar4(gIn, x2, y1)); + float4 p10 = convert_float4(rsGetElementAt_uchar4(gIn, x1, y)); + float4 p11 = convert_float4(rsGetElementAt_uchar4(gIn, x, y)); + float4 p12 = convert_float4(rsGetElementAt_uchar4(gIn, x2, y)); + float4 p20 = convert_float4(rsGetElementAt_uchar4(gIn, x1, y2)); + float4 p21 = convert_float4(rsGetElementAt_uchar4(gIn, x, y2)); + float4 p22 = convert_float4(rsGetElementAt_uchar4(gIn, x2, y2)); + 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); + return convert_uchar4(p20); +} + + diff --git a/java/tests/ImageProcessing_jb/src/com/android/rs/image/convolve5x5.fs b/java/tests/ImageProcessing_jb/src/com/android/rs/image/convolve5x5.fs new file mode 100644 index 00000000..922a5930 --- /dev/null +++ b/java/tests/ImageProcessing_jb/src/com/android/rs/image/convolve5x5.fs @@ -0,0 +1,72 @@ +/* + * 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. + */ + +#include "ip.rsh" + +int32_t gWidth; +int32_t gHeight; +rs_allocation gIn; + +float gCoeffs[25]; + +uchar4 __attribute__((kernel)) root(uint32_t x, uint32_t y) { + uint32_t x0 = max((int32_t)x-2, 0); + uint32_t x1 = max((int32_t)x-1, 0); + uint32_t x2 = x; + uint32_t x3 = min((int32_t)x+1, gWidth-1); + uint32_t x4 = min((int32_t)x+2, gWidth-1); + + uint32_t y0 = max((int32_t)y-2, 0); + uint32_t y1 = max((int32_t)y-1, 0); + uint32_t y2 = y; + uint32_t y3 = min((int32_t)y+1, gHeight-1); + uint32_t y4 = min((int32_t)y+2, gHeight-1); + + float4 p0 = convert_float4(rsGetElementAt_uchar4(gIn, x0, y0)) * gCoeffs[0] + + convert_float4(rsGetElementAt_uchar4(gIn, x1, y0)) * gCoeffs[1] + + convert_float4(rsGetElementAt_uchar4(gIn, x2, y0)) * gCoeffs[2] + + convert_float4(rsGetElementAt_uchar4(gIn, x3, y0)) * gCoeffs[3] + + convert_float4(rsGetElementAt_uchar4(gIn, x4, y0)) * gCoeffs[4]; + + float4 p1 = convert_float4(rsGetElementAt_uchar4(gIn, x0, y1)) * gCoeffs[5] + + convert_float4(rsGetElementAt_uchar4(gIn, x1, y1)) * gCoeffs[6] + + convert_float4(rsGetElementAt_uchar4(gIn, x2, y1)) * gCoeffs[7] + + convert_float4(rsGetElementAt_uchar4(gIn, x3, y1)) * gCoeffs[8] + + convert_float4(rsGetElementAt_uchar4(gIn, x4, y1)) * gCoeffs[9]; + + float4 p2 = convert_float4(rsGetElementAt_uchar4(gIn, x0, y2)) * gCoeffs[10] + + convert_float4(rsGetElementAt_uchar4(gIn, x1, y2)) * gCoeffs[11] + + convert_float4(rsGetElementAt_uchar4(gIn, x2, y2)) * gCoeffs[12] + + convert_float4(rsGetElementAt_uchar4(gIn, x3, y2)) * gCoeffs[13] + + convert_float4(rsGetElementAt_uchar4(gIn, x4, y2)) * gCoeffs[14]; + + float4 p3 = convert_float4(rsGetElementAt_uchar4(gIn, x0, y3)) * gCoeffs[15] + + convert_float4(rsGetElementAt_uchar4(gIn, x1, y3)) * gCoeffs[16] + + convert_float4(rsGetElementAt_uchar4(gIn, x2, y3)) * gCoeffs[17] + + convert_float4(rsGetElementAt_uchar4(gIn, x3, y3)) * gCoeffs[18] + + convert_float4(rsGetElementAt_uchar4(gIn, x4, y3)) * gCoeffs[19]; + + float4 p4 = convert_float4(rsGetElementAt_uchar4(gIn, x0, y4)) * gCoeffs[20] + + convert_float4(rsGetElementAt_uchar4(gIn, x1, y4)) * gCoeffs[21] + + convert_float4(rsGetElementAt_uchar4(gIn, x2, y4)) * gCoeffs[22] + + convert_float4(rsGetElementAt_uchar4(gIn, x3, y4)) * gCoeffs[23] + + convert_float4(rsGetElementAt_uchar4(gIn, x4, y4)) * gCoeffs[24]; + + p0 = clamp(p0 + p1 + p2 + p3 + p4, 0.f, 255.f); + return convert_uchar4(p0); +} + + diff --git a/java/tests/ImageProcessing_jb/src/com/android/rs/image/copy.fs b/java/tests/ImageProcessing_jb/src/com/android/rs/image/copy.fs new file mode 100644 index 00000000..65958748 --- /dev/null +++ b/java/tests/ImageProcessing_jb/src/com/android/rs/image/copy.fs @@ -0,0 +1,23 @@ +/* + * 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. + */ + +#include "ip.rsh" + +uchar4 __attribute__((kernel)) root(uchar4 v_in) { + return v_in; +} + + diff --git a/java/tests/ImageProcessing_jb/src/com/android/rs/image/exposure.rs b/java/tests/ImageProcessing_jb/src/com/android/rs/image/exposure.rs new file mode 100644 index 00000000..0f05cb9a --- /dev/null +++ b/java/tests/ImageProcessing_jb/src/com/android/rs/image/exposure.rs @@ -0,0 +1,31 @@ +/* + * 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. + */ + +#include "ip.rsh" + +static float bright = 0.f; + +void setBright(float v) { + bright = 255.f / (255.f - v); +} + +void exposure(const uchar4 *in, uchar4 *out) +{ + out->r = rsClamp((int)(bright * in->r), 0, 255); + out->g = rsClamp((int)(bright * in->g), 0, 255); + out->b = rsClamp((int)(bright * in->b), 0, 255); +} + diff --git a/java/tests/ImageProcessing_jb/src/com/android/rs/image/fisheye.rsh b/java/tests/ImageProcessing_jb/src/com/android/rs/image/fisheye.rsh new file mode 100644 index 00000000..2eacb7d4 --- /dev/null +++ b/java/tests/ImageProcessing_jb/src/com/android/rs/image/fisheye.rsh @@ -0,0 +1,58 @@ +/* + * 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, neg_center, inv_dimensions, axis_scale; +static float alpha, radius2, factor; + +void init_filter(uint32_t dim_x, uint32_t dim_y, float center_x, float center_y, float k) { + center.x = center_x; + center.y = center_y; + neg_center = -center; + inv_dimensions.x = 1.f / (float)dim_x; + inv_dimensions.y = 1.f / (float)dim_y; + alpha = k * 2.0f + 0.75f; + + 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 bound2 = 0.25f * (axis_scale.x*axis_scale.x + axis_scale.y*axis_scale.y); + const float bound = sqrt(bound2); + const float radius = 1.15f * bound; + radius2 = radius*radius; + const float max_radian = M_PI_2 - atan(alpha / bound * sqrt(radius2 - bound2)); + factor = bound / max_radian; +} + +uchar4 __attribute__((kernel)) root(uint32_t x, uint32_t y) { + // Convert x and y to floating point coordinates with center as origin + const float2 inCoord = {(float)x, (float)y}; + const float2 coord = mad(inCoord, inv_dimensions, neg_center); + const float2 scaledCoord = axis_scale * coord; + const float dist2 = scaledCoord.x*scaledCoord.x + scaledCoord.y*scaledCoord.y; + const float inv_dist = rsqrt(dist2); + const float radian = M_PI_2 - atan((alpha * sqrt(radius2 - dist2)) * inv_dist); + const float scalar = radian * factor * inv_dist; + const float2 new_coord = mad(coord, scalar, center); + const float4 fout = rsSample(in_alloc, sampler, new_coord); + return rsPackColorTo8888(fout); +} + diff --git a/java/tests/ImageProcessing_jb/src/com/android/rs/image/fisheye_approx.rsh b/java/tests/ImageProcessing_jb/src/com/android/rs/image/fisheye_approx.rsh new file mode 100644 index 00000000..fcf0a3dc --- /dev/null +++ b/java/tests/ImageProcessing_jb/src/com/android/rs/image/fisheye_approx.rsh @@ -0,0 +1,58 @@ +/* + * 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, neg_center, inv_dimensions, axis_scale; +static float alpha, radius2, factor; + +void init_filter(uint32_t dim_x, uint32_t dim_y, float center_x, float center_y, float k) { + center.x = center_x; + center.y = center_y; + neg_center = -center; + inv_dimensions.x = 1.f / (float)dim_x; + inv_dimensions.y = 1.f / (float)dim_y; + alpha = k * 2.0f + 0.75f; + + 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 bound2 = 0.25f * (axis_scale.x*axis_scale.x + axis_scale.y*axis_scale.y); + const float bound = sqrt(bound2); + const float radius = 1.15f * bound; + radius2 = radius*radius; + const float max_radian = M_PI_2 - atan(alpha / bound * sqrt(radius2 - bound2)); + factor = bound / max_radian; +} + +uchar4 __attribute__((kernel)) root(uint32_t x, uint32_t y) { + // Convert x and y to floating point coordinates with center as origin + const float2 inCoord = {(float)x, (float)y}; + const float2 coord = mad(inCoord, inv_dimensions, neg_center); + const float2 scaledCoord = axis_scale * coord; + const float dist2 = scaledCoord.x*scaledCoord.x + scaledCoord.y*scaledCoord.y; + const float inv_dist = half_rsqrt(dist2); + const float radian = M_PI_2 - atan((alpha * half_sqrt(radius2 - dist2)) * inv_dist); + const float scalar = radian * factor * inv_dist; + const float2 new_coord = mad(coord, scalar, center); + const float4 fout = rsSample(in_alloc, sampler, new_coord); + return rsPackColorTo8888(fout); +} + diff --git a/java/tests/ImageProcessing_jb/src/com/android/rs/image/fisheye_approx_full.rs b/java/tests/ImageProcessing_jb/src/com/android/rs/image/fisheye_approx_full.rs new file mode 100644 index 00000000..ed69ff46 --- /dev/null +++ b/java/tests/ImageProcessing_jb/src/com/android/rs/image/fisheye_approx_full.rs @@ -0,0 +1,20 @@ +/* + * 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. + */ + +#include "ip.rsh" + +#include "fisheye_approx.rsh" + diff --git a/java/tests/ImageProcessing_jb/src/com/android/rs/image/fisheye_approx_relaxed.fs b/java/tests/ImageProcessing_jb/src/com/android/rs/image/fisheye_approx_relaxed.fs new file mode 100644 index 00000000..ed69ff46 --- /dev/null +++ b/java/tests/ImageProcessing_jb/src/com/android/rs/image/fisheye_approx_relaxed.fs @@ -0,0 +1,20 @@ +/* + * 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. + */ + +#include "ip.rsh" + +#include "fisheye_approx.rsh" + diff --git a/java/tests/ImageProcessing_jb/src/com/android/rs/image/fisheye_full.rs b/java/tests/ImageProcessing_jb/src/com/android/rs/image/fisheye_full.rs new file mode 100644 index 00000000..f986b5df --- /dev/null +++ b/java/tests/ImageProcessing_jb/src/com/android/rs/image/fisheye_full.rs @@ -0,0 +1,20 @@ +/* + * 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. + */ + +#include "ip.rsh" + +#include "fisheye.rsh" + diff --git a/java/tests/ImageProcessing_jb/src/com/android/rs/image/fisheye_relaxed.fs b/java/tests/ImageProcessing_jb/src/com/android/rs/image/fisheye_relaxed.fs new file mode 100644 index 00000000..f986b5df --- /dev/null +++ b/java/tests/ImageProcessing_jb/src/com/android/rs/image/fisheye_relaxed.fs @@ -0,0 +1,20 @@ +/* + * 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. + */ + +#include "ip.rsh" + +#include "fisheye.rsh" + diff --git a/java/tests/ImageProcessing_jb/src/com/android/rs/image/grain.fs b/java/tests/ImageProcessing_jb/src/com/android/rs/image/grain.fs new file mode 100644 index 00000000..2e62cd7f --- /dev/null +++ b/java/tests/ImageProcessing_jb/src/com/android/rs/image/grain.fs @@ -0,0 +1,91 @@ +/* + * 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. + */ + +#include "ip.rsh" + +uchar __attribute__((kernel)) genRand() { + return (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 gWMask; +int32_t gHMask; + +rs_allocation gBlendSource; +uchar __attribute__((kernel)) blend9(uint32_t x, uint32_t y) { + uint32_t x1 = (x-1) & gWMask; + uint32_t x2 = (x+1) & gWMask; + uint32_t y1 = (y-1) & gHMask; + uint32_t y2 = (y+1) & gHMask; + + uint p00 = 56 * rsGetElementAt_uchar(gBlendSource, x1, y1); + uint p01 = 114 * rsGetElementAt_uchar(gBlendSource, x, y1); + uint p02 = 56 * rsGetElementAt_uchar(gBlendSource, x2, y1); + uint p10 = 114 * rsGetElementAt_uchar(gBlendSource, x1, y); + uint p11 = 230 * rsGetElementAt_uchar(gBlendSource, x, y); + uint p12 = 114 * rsGetElementAt_uchar(gBlendSource, x2, y); + uint p20 = 56 * rsGetElementAt_uchar(gBlendSource, x1, y2); + uint p21 = 114 * rsGetElementAt_uchar(gBlendSource, x, y2); + uint p22 = 56 * rsGetElementAt_uchar(gBlendSource, x2, y2); + + p00 += p01; + p02 += p10; + p11 += p12; + p20 += p21; + + p22 += p00; + p02 += p11; + + p20 += p22; + p20 += p02; + + p20 = min(p20 >> 10, (uint)255); + return (uchar)p20; +} + +float gNoiseStrength; + +rs_allocation gNoise; +uchar4 __attribute__((kernel)) root(uchar4 in, uint32_t x, uint32_t y) { + float4 ip = convert_float4(in); + float pnoise = (float) rsGetElementAt_uchar(gNoise, x & gWMask, y & gHMask); + + 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; + return p; +} diff --git a/java/tests/ImageProcessing_jb/src/com/android/rs/image/greyscale.fs b/java/tests/ImageProcessing_jb/src/com/android/rs/image/greyscale.fs new file mode 100644 index 00000000..4e13072c --- /dev/null +++ b/java/tests/ImageProcessing_jb/src/com/android/rs/image/greyscale.fs @@ -0,0 +1,36 @@ +/* + * 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. + */ + +#include "ip.rsh" + +const static float3 gMonoMult = {0.299f, 0.587f, 0.114f}; + +uchar4 __attribute__((kernel)) root(uchar4 v_in) { + float4 f4 = rsUnpackColor8888(v_in); + + float3 mono = dot(f4.rgb, gMonoMult); + return rsPackColorTo8888(mono); +} + +uchar __attribute__((kernel)) toU8(uchar4 v_in) { + float4 f4 = convert_float4(v_in); + return (uchar)dot(f4.rgb, gMonoMult); +} + +uchar4 __attribute__((kernel)) toU8_4(uchar v_in) { + return (uchar4)v_in; +} + diff --git a/java/tests/ImageProcessing_jb/src/com/android/rs/image/ip.rsh b/java/tests/ImageProcessing_jb/src/com/android/rs/image/ip.rsh new file mode 100644 index 00000000..81242119 --- /dev/null +++ b/java/tests/ImageProcessing_jb/src/com/android/rs/image/ip.rsh @@ -0,0 +1,20 @@ +/* + * Copyright (C) 2013 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.imagejb) + + diff --git a/java/tests/ImageProcessing_jb/src/com/android/rs/image/levels.rsh b/java/tests/ImageProcessing_jb/src/com/android/rs/image/levels.rsh new file mode 100644 index 00000000..e289906b --- /dev/null +++ b/java/tests/ImageProcessing_jb/src/com/android/rs/image/levels.rsh @@ -0,0 +1,46 @@ +/* + * 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; + +uchar4 __attribute__((kernel)) root(uchar4 in, uint32_t x, uint32_t y) { + uchar4 out; + float3 pixel = convert_float4(in).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; + return out; +} + +uchar4 __attribute__((kernel)) root4(uchar4 in, uint32_t x, uint32_t y) { + float4 pixel = convert_float4(in); + 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); + return convert_uchar4(pixel); +} + diff --git a/java/tests/ImageProcessing_jb/src/com/android/rs/image/levels_full.rs b/java/tests/ImageProcessing_jb/src/com/android/rs/image/levels_full.rs new file mode 100644 index 00000000..28596ba4 --- /dev/null +++ b/java/tests/ImageProcessing_jb/src/com/android/rs/image/levels_full.rs @@ -0,0 +1,20 @@ +/* + * 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. + */ + +#include "ip.rsh" + +#include "levels.rsh" + diff --git a/java/tests/ImageProcessing_jb/src/com/android/rs/image/levels_relaxed.fs b/java/tests/ImageProcessing_jb/src/com/android/rs/image/levels_relaxed.fs new file mode 100644 index 00000000..28596ba4 --- /dev/null +++ b/java/tests/ImageProcessing_jb/src/com/android/rs/image/levels_relaxed.fs @@ -0,0 +1,20 @@ +/* + * 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. + */ + +#include "ip.rsh" + +#include "levels.rsh" + diff --git a/java/tests/ImageProcessing_jb/src/com/android/rs/image/mandelbrot.rs b/java/tests/ImageProcessing_jb/src/com/android/rs/image/mandelbrot.rs new file mode 100644 index 00000000..de0bd002 --- /dev/null +++ b/java/tests/ImageProcessing_jb/src/com/android/rs/image/mandelbrot.rs @@ -0,0 +1,55 @@ +// Copyright (C) 2011 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. + +#include "ip.rsh" + +uint32_t gMaxIteration = 500; +uint32_t gDimX = 1024; +uint32_t gDimY = 1024; + +float lowerBoundX = -2.f; +float lowerBoundY = -2.f; +float scaleFactor = 4.f; + +uchar4 __attribute__((kernel)) root(uint32_t x, uint32_t y) { + float2 p; + p.x = lowerBoundX + ((float)x / gDimX) * scaleFactor; + p.y = lowerBoundY + ((float)y / gDimY) * scaleFactor; + + float2 t = 0; + float2 t2 = t * t; + int iter = 0; + while((t2.x + t2.y < 4.f) && (iter < gMaxIteration)) { + float xtemp = t2.x - t2.y + p.x; + t.y = 2 * t.x * t.y + p.y; + t.x = xtemp; + iter++; + t2 = t * t; + } + + if(iter >= gMaxIteration) { + // write a non-transparent black pixel + return (uchar4){0, 0, 0, 0xff}; + } else { + float mi3 = gMaxIteration / 3.f; + if (iter <= (gMaxIteration / 3)) + return (uchar4){0xff * (iter / mi3), 0, 0, 0xff}; + else if (iter <= (((gMaxIteration / 3) * 2))) + return (uchar4){0xff - (0xff * ((iter - mi3) / mi3)), + (0xff * ((iter - mi3) / mi3)), 0, 0xff}; + else + return (uchar4){0, 0xff - (0xff * ((iter - (mi3 * 2)) / mi3)), + (0xff * ((iter - (mi3 * 2)) / mi3)), 0xff}; + } +} diff --git a/java/tests/ImageProcessing_jb/src/com/android/rs/image/msg.rs b/java/tests/ImageProcessing_jb/src/com/android/rs/image/msg.rs new file mode 100644 index 00000000..645eb984 --- /dev/null +++ b/java/tests/ImageProcessing_jb/src/com/android/rs/image/msg.rs @@ -0,0 +1,23 @@ +/* + * 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.imagejb) + +void sendMsg() { + rsSendToClientBlocking(0); +} + diff --git a/java/tests/ImageProcessing_jb/src/com/android/rs/image/shadows.rs b/java/tests/ImageProcessing_jb/src/com/android/rs/image/shadows.rs new file mode 100644 index 00000000..f6c149d8 --- /dev/null +++ b/java/tests/ImageProcessing_jb/src/com/android/rs/image/shadows.rs @@ -0,0 +1,192 @@ +/* + * 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. + */ + +#include "ip.rsh" +//#pragma rs_fp_relaxed + +static double shadowFilterMap[] = { + -0.00591, 0.0001, + 1.16488, 0.01668, + -0.18027, -0.06791, + -0.12625, 0.09001, + 0.15065, -0.03897 +}; + +static double poly[] = { + 0., 0., + 0., 0., + 0. +}; + +static const int ABITS = 4; +static const int HSCALE = 256; +static const int k1=255 << ABITS; +static const int k2=HSCALE << ABITS; + +static double fastevalPoly(double *poly,int n, double x){ + + double f =x; + double sum = poly[0]+poly[1]*f; + int i; + for (i = 2; i < n; i++) { + f*=x; + sum += poly[i]*f; + } + return sum; +} + +static ushort3 rgb2hsv( uchar4 rgb) +{ + int iMin,iMax,chroma; + + int ri = rgb.r; + int gi = rgb.g; + int bi = rgb.b; + short rv,rs,rh; + + if (ri > gi) { + iMax = max (ri, bi); + iMin = min (gi, bi); + } else { + iMax = max (gi, bi); + iMin = min (ri, bi); + } + + chroma = iMax - iMin; + // set value + rv = (short)( iMax << ABITS); + + // set saturation + if (rv == 0) + rs = 0; + else + rs = (short)((k1*chroma)/iMax); + + // set hue + if (rs == 0) + rh = 0; + else { + if ( ri == iMax ) { + rh = (short)( (k2*(6*chroma+gi - bi))/(6*chroma)); + if (rh >= k2) rh -= k2; + } else if (gi == iMax) + rh = (short)( (k2*(2*chroma+bi - ri ))/(6*chroma)); + else // (bi == iMax ) + rh = (short)( (k2*(4*chroma+ri - gi ))/(6*chroma)); + } + + ushort3 out; + out.x = rv; + out.y = rs; + out.z = rh; + return out; +} + +static uchar4 hsv2rgb(ushort3 hsv) +{ + int ABITS = 4; + int HSCALE = 256; + int m; + int H,X,ih,is,iv; + int k1=255<<ABITS; + int k2=HSCALE<<ABITS; + int k3=1<<(ABITS-1); + int rr=0; + int rg=0; + int rb=0; + short cv = hsv.x; + short cs = hsv.y; + short ch = hsv.z; + + // set chroma and min component value m + //chroma = ( cv * cs )/k1; + //m = cv - chroma; + m = ((int)cv*(k1 - (int)cs ))/k1; + + // chroma == 0 <-> cs == 0 --> m=cv + if (cs == 0) { + rb = ( rg = ( rr =( cv >> ABITS) )); + } else { + ih=(int)ch; + is=(int)cs; + iv=(int)cv; + + H = (6*ih)/k2; + X = ((iv*is)/k2)*(k2- abs(6*ih- 2*(H>>1)*k2 - k2)) ; + + // removing additional bits --> unit8 + X=( (X+iv*(k1 - is ))/k1 + k3 ) >> ABITS; + m=m >> ABITS; + + // ( chroma + m ) --> cv ; + cv=(short) (cv >> ABITS); + switch (H) { + case 0: + rr = cv; + rg = X; + rb = m; + break; + case 1: + rr = X; + rg = cv; + rb = m; + break; + case 2: + rr = m; + rg = cv; + rb = X; + break; + case 3: + rr = m; + rg = X; + rb = cv; + break; + case 4: + rr = X; + rg = m; + rb = cv; + break; + case 5: + rr = cv; + rg = m ; + rb = X; + break; + } + } + + uchar4 rgb; + + rgb.r = rr; + rgb.g = rg; + rgb.b = rb; + + return rgb; +} + +void prepareShadows(float scale) { + double s = (scale>=0)?scale:scale/5; + for (int i = 0; i < 5; i++) { + poly[i] = fastevalPoly(shadowFilterMap+i*2,2 , s); + } +} + +void shadowsKernel(const uchar4 *in, uchar4 *out) { + ushort3 hsv = rgb2hsv(*in); + double v = (fastevalPoly(poly,5,hsv.x/4080.)*4080); + if (v>4080) v = 4080; + hsv.x = (unsigned short) ((v>0)?v:0); + *out = hsv2rgb(hsv); +} diff --git a/java/tests/ImageProcessing_jb/src/com/android/rs/image/threshold.fs b/java/tests/ImageProcessing_jb/src/com/android/rs/image/threshold.fs new file mode 100644 index 00000000..0b2c2e86 --- /dev/null +++ b/java/tests/ImageProcessing_jb/src/com/android/rs/image/threshold.fs @@ -0,0 +1,118 @@ +/* + * Copyright (C) 2013 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. + */ + +#include "ip.rsh" + + +int height; +int width; +static int radius; + +rs_allocation InPixel; +rs_allocation ScratchPixel1; +rs_allocation ScratchPixel2; + +const int MAX_RADIUS = 25; + +// Store our coefficients here +static float gaussian[MAX_RADIUS * 2 + 1]; + +void setRadius(int rad) { + radius = rad; + // 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; + for (int 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 (int r = -radius; r <= radius; r ++) { + floatR = (float)r; + gaussian[r + radius] *= normalizeFactor; + } +} + +float4 __attribute__((kernel)) copyIn(uchar4 in) { + return convert_float4(in); +} + +uchar4 __attribute__((kernel)) vert(uint32_t x, uint32_t y) { + float3 blurredPixel = 0; + int gi = 0; + uchar4 out; + if ((y > radius) && (y < (height - radius))) { + for (int r = -radius; r <= radius; r ++) { + float4 i = rsGetElementAt_float4(ScratchPixel2, x, y + r); + blurredPixel += i.xyz * gaussian[gi++]; + } + } else { + for (int r = -radius; r <= radius; r ++) { + int validH = rsClamp((int)y + r, (int)0, (int)(height - 1)); + float4 i = rsGetElementAt_float4(ScratchPixel2, x, validH); + blurredPixel += i.xyz * gaussian[gi++]; + } + } + + out.xyz = convert_uchar3(clamp(blurredPixel, 0.f, 255.f)); + out.w = 0xff; + return out; +} + +float4 __attribute__((kernel)) horz(uint32_t x, uint32_t y) { + float4 blurredPixel = 0; + int gi = 0; + if ((x > radius) && (x < (width - radius))) { + for (int r = -radius; r <= radius; r ++) { + float4 i = rsGetElementAt_float4(ScratchPixel1, x + r, y); + blurredPixel += i * gaussian[gi++]; + } + } else { + for (int r = -radius; r <= radius; r ++) { + // Stepping left and right away from the pixel + int validX = rsClamp((int)x + r, (int)0, (int)(width - 1)); + float4 i = rsGetElementAt_float4(ScratchPixel1, validX, y); + blurredPixel += i * gaussian[gi++]; + } + } + + return blurredPixel; +} + diff --git a/java/tests/ImageProcessing_jb/src/com/android/rs/image/vibrance.rs b/java/tests/ImageProcessing_jb/src/com/android/rs/image/vibrance.rs new file mode 100644 index 00000000..8db113c8 --- /dev/null +++ b/java/tests/ImageProcessing_jb/src/com/android/rs/image/vibrance.rs @@ -0,0 +1,70 @@ +/* + * 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. + */ + +#include "ip.rsh" + +float vibrance = 0.f; + +static const float Rf = 0.2999f; +static const float Gf = 0.587f; +static const float Bf = 0.114f; + +static float S = 0.f; +static float MS = 0.f; +static float Rt = 0.f; +static float Gt = 0.f; +static float Bt = 0.f; +static float Vib = 0.f; + +void vibranceKernel(const uchar4 *in, uchar4 *out) { + + float R, G, B; + + int r = in->r; + int g = in->g; + int b = in->b; + float red = (r-max(g, b))/256.f; + float sx = (float)(Vib/(1+exp(-red*3))); + S = sx+1; + MS = 1.0f - S; + Rt = Rf * MS; + Gt = Gf * MS; + Bt = Bf * MS; + int t = (r + g) / 2; + R = r; + G = g; + B = b; + + float Rc = R * (Rt + S) + G * Gt + B * Bt; + float Gc = R * Rt + G * (Gt + S) + B * Bt; + float Bc = R * Rt + G * Gt + B * (Bt + S); + + out->r = rsClamp(Rc, 0, 255); + out->g = rsClamp(Gc, 0, 255); + out->b = rsClamp(Bc, 0, 255); + +} + +void prepareVibrance() { + + Vib = vibrance/100.f; + S = Vib + 1; + MS = 1.0f - S; + Rt = Rf * MS; + Gt = Gf * MS; + Bt = Bf * MS; + +} diff --git a/java/tests/ImageProcessing_jb/src/com/android/rs/image/vignette.rsh b/java/tests/ImageProcessing_jb/src/com/android/rs/image/vignette.rsh new file mode 100644 index 00000000..04ca1f19 --- /dev/null +++ b/java/tests/ImageProcessing_jb/src/com/android/rs/image/vignette.rsh @@ -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.5f * 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.7f*sqrt(desired_scale) - 1.3f; + sloped_neg_range = exp(neg_range * desired_slope); + + shade = desired_shade; + opp_shade = 1.f - desired_shade; +} + +uchar4 __attribute__((kernel)) root(uchar4 in, 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.0f + sloped_neg_range * exp(sloped_dist_ratio) ); + float4 fout; + fout.rgb = fin.rgb * lumen; + fout.w = fin.w; + return convert_uchar4(fout); +} + diff --git a/java/tests/ImageProcessing_jb/src/com/android/rs/image/vignette_approx.rsh b/java/tests/ImageProcessing_jb/src/com/android/rs/image/vignette_approx.rsh new file mode 100644 index 00000000..0eacdc82 --- /dev/null +++ b/java/tests/ImageProcessing_jb/src/com/android/rs/image/vignette_approx.rsh @@ -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.5f * 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.7f*sqrt(desired_scale) - 1.3f; + sloped_neg_range = exp(neg_range * desired_slope); + + shade = desired_shade; + opp_shade = 1.f - desired_shade; +} + +uchar4 __attribute__((kernel)) root(uchar4 in, 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 = fast_length(axis_scale * coord) * sloped_inv_max_dist; + const float lumen = opp_shade + shade * half_recip(1.f + sloped_neg_range * exp(sloped_dist_ratio)); + float4 fout; + fout.rgb = fin.rgb * lumen; + fout.w = fin.w; + return convert_uchar4(fout); +} + diff --git a/java/tests/ImageProcessing_jb/src/com/android/rs/image/vignette_approx_full.rs b/java/tests/ImageProcessing_jb/src/com/android/rs/image/vignette_approx_full.rs new file mode 100644 index 00000000..00cbbc4d --- /dev/null +++ b/java/tests/ImageProcessing_jb/src/com/android/rs/image/vignette_approx_full.rs @@ -0,0 +1,20 @@ +/* + * 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. + */ + +#include "ip.rsh" + +#include "vignette_approx.rsh" + diff --git a/java/tests/ImageProcessing_jb/src/com/android/rs/image/vignette_approx_relaxed.fs b/java/tests/ImageProcessing_jb/src/com/android/rs/image/vignette_approx_relaxed.fs new file mode 100644 index 00000000..00cbbc4d --- /dev/null +++ b/java/tests/ImageProcessing_jb/src/com/android/rs/image/vignette_approx_relaxed.fs @@ -0,0 +1,20 @@ +/* + * 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. + */ + +#include "ip.rsh" + +#include "vignette_approx.rsh" + diff --git a/java/tests/ImageProcessing_jb/src/com/android/rs/image/vignette_full.rs b/java/tests/ImageProcessing_jb/src/com/android/rs/image/vignette_full.rs new file mode 100644 index 00000000..8202c5c1 --- /dev/null +++ b/java/tests/ImageProcessing_jb/src/com/android/rs/image/vignette_full.rs @@ -0,0 +1,20 @@ +/* + * 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. + */ + +#include "ip.rsh" + +#include "vignette.rsh" + diff --git a/java/tests/ImageProcessing_jb/src/com/android/rs/image/vignette_relaxed.fs b/java/tests/ImageProcessing_jb/src/com/android/rs/image/vignette_relaxed.fs new file mode 100644 index 00000000..8202c5c1 --- /dev/null +++ b/java/tests/ImageProcessing_jb/src/com/android/rs/image/vignette_relaxed.fs @@ -0,0 +1,20 @@ +/* + * 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. + */ + +#include "ip.rsh" + +#include "vignette.rsh" + diff --git a/java/tests/ImageProcessing_jb/src/com/android/rs/image/wbalance.rs b/java/tests/ImageProcessing_jb/src/com/android/rs/image/wbalance.rs new file mode 100644 index 00000000..6650671e --- /dev/null +++ b/java/tests/ImageProcessing_jb/src/com/android/rs/image/wbalance.rs @@ -0,0 +1,142 @@ +/* + * 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. + */ + +#include "ip.rsh" +//#pragma rs_fp_relaxed + +static int histR[256] = {0}, histG[256] = {0}, histB[256] = {0}; + +rs_allocation histogramSource; +uint32_t histogramHeight; +uint32_t histogramWidth; + +static float scaleR; +static float scaleG; +static float scaleB; + +static uchar4 estimateWhite() { + + for (int i = 0; i < 256; i++) { + histR[i] = 0; histG[i] = 0; histB[i] = 0; + } + + for (uint32_t i = 0; i < histogramHeight; i++) { + for (uint32_t j = 0; j < histogramWidth; j++) { + uchar4 in = rsGetElementAt_uchar4(histogramSource, j, i); + histR[in.r]++; + histG[in.g]++; + histB[in.b]++; + } + } + + int min_r = -1, min_g = -1, min_b = -1; + int max_r = 0, max_g = 0, max_b = 0; + int sum_r = 0, sum_g = 0, sum_b = 0; + + for (int i = 1; i < 255; i++) { + int r = histR[i]; + int g = histG[i]; + int b = histB[i]; + sum_r += r; + sum_g += g; + sum_b += b; + + if (r>0){ + if (min_r < 0) min_r = i; + max_r = i; + } + if (g>0){ + if (min_g < 0) min_g = i; + max_g = i; + } + if (b>0){ + if (min_b < 0) min_b = i; + max_b = i; + } + } + + int sum15r = 0, sum15g = 0, sum15b = 0; + int count15r = 0, count15g = 0, count15b = 0; + int tmp_r = 0, tmp_g = 0, tmp_b = 0; + + for (int i = 254; i >0; i--) { + int r = histR[i]; + int g = histG[i]; + int b = histB[i]; + tmp_r += r; + tmp_g += g; + tmp_b += b; + + if ((tmp_r > sum_r/20) && (tmp_r < sum_r/5)) { + sum15r += r*i; + count15r += r; + } + if ((tmp_g > sum_g/20) && (tmp_g < sum_g/5)) { + sum15g += g*i; + count15g += g; + } + if ((tmp_b > sum_b/20) && (tmp_b < sum_b/5)) { + sum15b += b*i; + count15b += b; + } + + } + + uchar4 out; + + if ((count15r>0) && (count15g>0) && (count15b>0) ){ + out.r = sum15r/count15r; + out.g = sum15g/count15g; + out.b = sum15b/count15b; + }else { + out.r = out.g = out.b = 255; + } + + return out; + +} + +void prepareWhiteBalance() { + uchar4 estimation = estimateWhite(); + int minimum = min(estimation.r, min(estimation.g, estimation.b)); + int maximum = max(estimation.r, max(estimation.g, estimation.b)); + float avg = (minimum + maximum) / 2.f; + + scaleR = avg/estimation.r; + scaleG = avg/estimation.g; + scaleB = avg/estimation.b; + +} + +static unsigned char contrastClamp(int c) +{ + int N = 255; + c &= ~(c >> 31); + c -= N; + c &= (c >> 31); + c += N; + return (unsigned char) c; +} + +void whiteBalanceKernel(const uchar4 *in, uchar4 *out) { + float Rc = in->r*scaleR; + float Gc = in->g*scaleG; + float Bc = in->b*scaleB; + + out->r = contrastClamp(Rc); + out->g = contrastClamp(Gc); + out->b = contrastClamp(Bc); +} |