LevelsV4.java revision f1d97e536561b4731997c85873dde3b3fb721cb2
1e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson/* 2e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson * Copyright (C) 2012 The Android Open Source Project 3e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson * 4e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson * Licensed under the Apache License, Version 2.0 (the "License"); 5e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson * you may not use this file except in compliance with the License. 6e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson * You may obtain a copy of the License at 7e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson * 8e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson * http://www.apache.org/licenses/LICENSE-2.0 9e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson * 10e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson * Unless required by applicable law or agreed to in writing, software 11e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson * distributed under the License is distributed on an "AS IS" BASIS, 12e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson * See the License for the specific language governing permissions and 14e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson * limitations under the License. 15e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson */ 16e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson 17e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinsonpackage com.android.rs.imagejb; 18e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson 19e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinsonimport java.lang.Math; 20e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson 21e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinsonimport android.renderscript.Allocation; 22e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinsonimport android.renderscript.Element; 23e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinsonimport android.renderscript.RenderScript; 24e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinsonimport android.renderscript.Matrix3f; 25e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinsonimport android.renderscript.Script; 26e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinsonimport android.renderscript.ScriptC; 27e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinsonimport android.renderscript.Type; 28e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinsonimport android.util.Log; 29e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinsonimport android.widget.SeekBar; 30e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinsonimport android.widget.TextView; 31e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson 32e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson 33e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinsonpublic class LevelsV4 extends TestBase { 34e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson private ScriptC_levels_relaxed mScriptR; 35e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson private ScriptC_levels_full mScriptF; 36e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson private float mInBlack = 0.0f; 37e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson private float mOutBlack = 0.0f; 38e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson private float mInWhite = 255.0f; 39e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson private float mOutWhite = 255.0f; 40e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson private float mSaturation = 1.0f; 41e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson 42e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson Matrix3f satMatrix = new Matrix3f(); 43e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson float mInWMinInB; 44e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson float mOutWMinOutB; 45e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson float mOverInWMinInB; 46e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson 47e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson boolean mUseFull; 48e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson boolean mUseV4; 49e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson 50e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson LevelsV4(boolean useFull, boolean useV4) { 51e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson mUseFull = useFull; 52e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson mUseV4 = useV4; 53e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson } 54e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson 55e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson 56e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson private void setLevels() { 57e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson mInWMinInB = mInWhite - mInBlack; 58e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson mOutWMinOutB = mOutWhite - mOutBlack; 59e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson mOverInWMinInB = 1.f / mInWMinInB; 60e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson 61 mScriptR.set_inBlack(mInBlack); 62 mScriptR.set_outBlack(mOutBlack); 63 mScriptR.set_inWMinInB(mInWMinInB); 64 mScriptR.set_outWMinOutB(mOutWMinOutB); 65 mScriptR.set_overInWMinInB(mOverInWMinInB); 66 mScriptF.set_inBlack(mInBlack); 67 mScriptF.set_outBlack(mOutBlack); 68 mScriptF.set_inWMinInB(mInWMinInB); 69 mScriptF.set_outWMinOutB(mOutWMinOutB); 70 mScriptF.set_overInWMinInB(mOverInWMinInB); 71 } 72 73 private void setSaturation() { 74 float rWeight = 0.299f; 75 float gWeight = 0.587f; 76 float bWeight = 0.114f; 77 float oneMinusS = 1.0f - mSaturation; 78 79 satMatrix.set(0, 0, oneMinusS * rWeight + mSaturation); 80 satMatrix.set(0, 1, oneMinusS * rWeight); 81 satMatrix.set(0, 2, oneMinusS * rWeight); 82 satMatrix.set(1, 0, oneMinusS * gWeight); 83 satMatrix.set(1, 1, oneMinusS * gWeight + mSaturation); 84 satMatrix.set(1, 2, oneMinusS * gWeight); 85 satMatrix.set(2, 0, oneMinusS * bWeight); 86 satMatrix.set(2, 1, oneMinusS * bWeight); 87 satMatrix.set(2, 2, oneMinusS * bWeight + mSaturation); 88 mScriptR.set_colorMat(satMatrix); 89 mScriptF.set_colorMat(satMatrix); 90 } 91 92 public boolean onBar1Setup(SeekBar b, TextView t) { 93 b.setProgress(50); 94 t.setText("Saturation"); 95 return true; 96 } 97 public boolean onBar2Setup(SeekBar b, TextView t) { 98 b.setMax(128); 99 b.setProgress(0); 100 t.setText("In Black"); 101 return true; 102 } 103 public boolean onBar3Setup(SeekBar b, TextView t) { 104 b.setMax(128); 105 b.setProgress(0); 106 t.setText("Out Black"); 107 return true; 108 } 109 public boolean onBar4Setup(SeekBar b, TextView t) { 110 b.setMax(128); 111 b.setProgress(128); 112 t.setText("In White"); 113 return true; 114 } 115 public boolean onBar5Setup(SeekBar b, TextView t) { 116 b.setMax(128); 117 b.setProgress(128); 118 t.setText("Out White"); 119 return true; 120 } 121 122 public void onBar1Changed(int progress) { 123 mSaturation = (float)progress / 50.0f; 124 setSaturation(); 125 } 126 public void onBar2Changed(int progress) { 127 mInBlack = (float)progress; 128 setLevels(); 129 } 130 public void onBar3Changed(int progress) { 131 mOutBlack = (float)progress; 132 setLevels(); 133 } 134 public void onBar4Changed(int progress) { 135 mInWhite = (float)progress + 127.0f; 136 setLevels(); 137 } 138 public void onBar5Changed(int progress) { 139 mOutWhite = (float)progress + 127.0f; 140 setLevels(); 141 } 142 143 public void createTest(android.content.res.Resources res) { 144 mScriptR = new ScriptC_levels_relaxed(mRS); 145 mScriptF = new ScriptC_levels_full(mRS); 146 setSaturation(); 147 setLevels(); 148 } 149 150 public void runTest() { 151 if (mUseFull) { 152 if (mUseV4) { 153 mScriptF.forEach_root4(mInPixelsAllocation, mOutPixelsAllocation); 154 } else { 155 mScriptF.forEach_root(mInPixelsAllocation, mOutPixelsAllocation); 156 } 157 } else { 158 if (mUseV4) { 159 mScriptR.forEach_root4(mInPixelsAllocation, mOutPixelsAllocation); 160 } else { 161 mScriptR.forEach_root(mInPixelsAllocation, mOutPixelsAllocation); 162 } 163 } 164 } 165 166} 167 168