19066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/*
29066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Copyright (C) 2012 The Android Open Source Project
39066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
49066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Licensed under the Apache License, Version 2.0 (the "License");
59066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * you may not use this file except in compliance with the License.
69066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * You may obtain a copy of the License at
79066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
89066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *      http://www.apache.org/licenses/LICENSE-2.0
99066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Unless required by applicable law or agreed to in writing, software
119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * distributed under the License is distributed on an "AS IS" BASIS,
129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * See the License for the specific language governing permissions and
149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * limitations under the License.
159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */
169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectpackage com.android.rs.image2;
189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.lang.Math;
209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.support.v8.renderscript.*;
229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.util.Log;
239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.widget.SeekBar;
249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.widget.TextView;
259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectpublic class LevelsV4 extends TestBase {
289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private ScriptC_levels_relaxed mScriptR;
299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private ScriptC_levels_full mScriptF;
309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private float mInBlack = 0.0f;
31bc101806249eb883f89c4a770a8c27f9ac315837Raphael    private float mOutBlack = 0.0f;
329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private float mInWhite = 255.0f;
339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private float mOutWhite = 255.0f;
349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private float mSaturation = 1.0f;
359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    Matrix3f satMatrix = new Matrix3f();
379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    float mInWMinInB;
389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    float mOutWMinOutB;
399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    float mOverInWMinInB;
409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    boolean mUseFull;
429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    boolean mUseV4;
439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    LevelsV4(boolean useFull, boolean useV4) {
459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mUseFull = useFull;
469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mUseV4 = useV4;
479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private void setLevels() {
519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mInWMinInB = mInWhite - mInBlack;
529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mOutWMinOutB = mOutWhite - mOutBlack;
539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mOverInWMinInB = 1.f / mInWMinInB;
549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mScriptR.set_inBlack(mInBlack);
569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mScriptR.set_outBlack(mOutBlack);
579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mScriptR.set_inWMinInB(mInWMinInB);
589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mScriptR.set_outWMinOutB(mOutWMinOutB);
599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mScriptR.set_overInWMinInB(mOverInWMinInB);
609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mScriptF.set_inBlack(mInBlack);
619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mScriptF.set_outBlack(mOutBlack);
629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mScriptF.set_inWMinInB(mInWMinInB);
63bc101806249eb883f89c4a770a8c27f9ac315837Raphael        mScriptF.set_outWMinOutB(mOutWMinOutB);
649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mScriptF.set_overInWMinInB(mOverInWMinInB);
65bc101806249eb883f89c4a770a8c27f9ac315837Raphael    }
66bc101806249eb883f89c4a770a8c27f9ac315837Raphael
67bc101806249eb883f89c4a770a8c27f9ac315837Raphael    private void setSaturation() {
689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        float rWeight = 0.299f;
699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        float gWeight = 0.587f;
709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        float bWeight = 0.114f;
71bc101806249eb883f89c4a770a8c27f9ac315837Raphael        float oneMinusS = 1.0f - mSaturation;
729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        satMatrix.set(0, 0, oneMinusS * rWeight + mSaturation);
74bc101806249eb883f89c4a770a8c27f9ac315837Raphael        satMatrix.set(0, 1, oneMinusS * rWeight);
759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        satMatrix.set(0, 2, oneMinusS * rWeight);
76bc101806249eb883f89c4a770a8c27f9ac315837Raphael        satMatrix.set(1, 0, oneMinusS * gWeight);
779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        satMatrix.set(1, 1, oneMinusS * gWeight + mSaturation);
789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        satMatrix.set(1, 2, oneMinusS * gWeight);
79bc101806249eb883f89c4a770a8c27f9ac315837Raphael        satMatrix.set(2, 0, oneMinusS * bWeight);
80bc101806249eb883f89c4a770a8c27f9ac315837Raphael        satMatrix.set(2, 1, oneMinusS * bWeight);
81bc101806249eb883f89c4a770a8c27f9ac315837Raphael        satMatrix.set(2, 2, oneMinusS * bWeight + mSaturation);
82bc101806249eb883f89c4a770a8c27f9ac315837Raphael        mScriptR.set_colorMat(satMatrix);
83bc101806249eb883f89c4a770a8c27f9ac315837Raphael        mScriptF.set_colorMat(satMatrix);
84bc101806249eb883f89c4a770a8c27f9ac315837Raphael    }
85bc101806249eb883f89c4a770a8c27f9ac315837Raphael
86bc101806249eb883f89c4a770a8c27f9ac315837Raphael    public boolean onBar1Setup(SeekBar b, TextView t) {
87bc101806249eb883f89c4a770a8c27f9ac315837Raphael        b.setProgress(50);
88bc101806249eb883f89c4a770a8c27f9ac315837Raphael        t.setText("Saturation");
89bc101806249eb883f89c4a770a8c27f9ac315837Raphael        return true;
90bc101806249eb883f89c4a770a8c27f9ac315837Raphael    }
91bc101806249eb883f89c4a770a8c27f9ac315837Raphael    public boolean onBar2Setup(SeekBar b, TextView t) {
92bc101806249eb883f89c4a770a8c27f9ac315837Raphael        b.setMax(128);
93bc101806249eb883f89c4a770a8c27f9ac315837Raphael        b.setProgress(0);
94bc101806249eb883f89c4a770a8c27f9ac315837Raphael        t.setText("In Black");
95bc101806249eb883f89c4a770a8c27f9ac315837Raphael        return true;
96bc101806249eb883f89c4a770a8c27f9ac315837Raphael    }
97bc101806249eb883f89c4a770a8c27f9ac315837Raphael    public boolean onBar3Setup(SeekBar b, TextView t) {
98bc101806249eb883f89c4a770a8c27f9ac315837Raphael        b.setMax(128);
99280372e2c7db128254b5f65395ea843ef285729eRaphael        b.setProgress(0);
100bc101806249eb883f89c4a770a8c27f9ac315837Raphael        t.setText("Out Black");
101bc101806249eb883f89c4a770a8c27f9ac315837Raphael        return true;
102bc101806249eb883f89c4a770a8c27f9ac315837Raphael    }
103bc101806249eb883f89c4a770a8c27f9ac315837Raphael    public boolean onBar4Setup(SeekBar b, TextView t) {
104bc101806249eb883f89c4a770a8c27f9ac315837Raphael        b.setMax(128);
105bc101806249eb883f89c4a770a8c27f9ac315837Raphael        b.setProgress(128);
106bc101806249eb883f89c4a770a8c27f9ac315837Raphael        t.setText("Out White");
1079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return true;
1089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
1099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public boolean onBar5Setup(SeekBar b, TextView t) {
1109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        b.setMax(128);
111bc101806249eb883f89c4a770a8c27f9ac315837Raphael        b.setProgress(128);
112bc101806249eb883f89c4a770a8c27f9ac315837Raphael        t.setText("Out White");
1139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return true;
1149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
1159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void onBar1Changed(int progress) {
1179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mSaturation = (float)progress / 50.0f;
1189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        setSaturation();
1199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
1209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void onBar2Changed(int progress) {
121bc101806249eb883f89c4a770a8c27f9ac315837Raphael        mInBlack = (float)progress;
1229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        setLevels();
1239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
124bc101806249eb883f89c4a770a8c27f9ac315837Raphael    public void onBar3Changed(int progress) {
125bc101806249eb883f89c4a770a8c27f9ac315837Raphael        mOutBlack = (float)progress;
126bc101806249eb883f89c4a770a8c27f9ac315837Raphael        setLevels();
127bc101806249eb883f89c4a770a8c27f9ac315837Raphael    }
128bc101806249eb883f89c4a770a8c27f9ac315837Raphael    public void onBar4Changed(int progress) {
129bc101806249eb883f89c4a770a8c27f9ac315837Raphael        mInWhite = (float)progress + 127.0f;
130bc101806249eb883f89c4a770a8c27f9ac315837Raphael        setLevels();
131bc101806249eb883f89c4a770a8c27f9ac315837Raphael    }
1329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void onBar5Changed(int progress) {
133bc101806249eb883f89c4a770a8c27f9ac315837Raphael        mOutWhite = (float)progress + 127.0f;
134bc101806249eb883f89c4a770a8c27f9ac315837Raphael        setLevels();
135bc101806249eb883f89c4a770a8c27f9ac315837Raphael    }
1369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
137bc101806249eb883f89c4a770a8c27f9ac315837Raphael    public void createTest(android.content.res.Resources res) {
138bc101806249eb883f89c4a770a8c27f9ac315837Raphael        mScriptR = new ScriptC_levels_relaxed(mRS, res, R.raw.levels_relaxed);
139bc101806249eb883f89c4a770a8c27f9ac315837Raphael        mScriptF = new ScriptC_levels_full(mRS, res, R.raw.levels_full);
140bc101806249eb883f89c4a770a8c27f9ac315837Raphael        setSaturation();
141bc101806249eb883f89c4a770a8c27f9ac315837Raphael        setLevels();
142bc101806249eb883f89c4a770a8c27f9ac315837Raphael    }
143bc101806249eb883f89c4a770a8c27f9ac315837Raphael
144bc101806249eb883f89c4a770a8c27f9ac315837Raphael    public void runTest() {
145bc101806249eb883f89c4a770a8c27f9ac315837Raphael        if (mUseFull) {
146bc101806249eb883f89c4a770a8c27f9ac315837Raphael            if (mUseV4) {
147bc101806249eb883f89c4a770a8c27f9ac315837Raphael                mScriptF.forEach_root4(mInPixelsAllocation, mOutPixelsAllocation);
148bc101806249eb883f89c4a770a8c27f9ac315837Raphael            } else {
1499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mScriptF.forEach_root(mInPixelsAllocation, mOutPixelsAllocation);
1509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
151bc101806249eb883f89c4a770a8c27f9ac315837Raphael        } else {
1529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (mUseV4) {
1539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mScriptR.forEach_root4(mInPixelsAllocation, mOutPixelsAllocation);
1549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            } else {
1559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mScriptR.forEach_root(mInPixelsAllocation, mOutPixelsAllocation);
1569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
1579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
1589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
1599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
1619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project