1572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams/*
2572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams * Copyright (C) 2012 The Android Open Source Project
3572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams *
4572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams * Licensed under the Apache License, Version 2.0 (the "License");
5572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams * you may not use this file except in compliance with the License.
6572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams * You may obtain a copy of the License at
7572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams *
8572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams *      http://www.apache.org/licenses/LICENSE-2.0
9572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams *
10572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams * Unless required by applicable law or agreed to in writing, software
11572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams * distributed under the License is distributed on an "AS IS" BASIS,
12572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams * See the License for the specific language governing permissions and
14572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams * limitations under the License.
15572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams */
16572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams
17572a5031a5d8602db0bec0b253428a034bd4dd59Jason Samspackage com.android.rs.imagejb;
18572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams
19572a5031a5d8602db0bec0b253428a034bd4dd59Jason Samsimport java.lang.Math;
20572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams
21572a5031a5d8602db0bec0b253428a034bd4dd59Jason Samsimport android.renderscript.Matrix3f;
22572a5031a5d8602db0bec0b253428a034bd4dd59Jason Samsimport android.util.Log;
23572a5031a5d8602db0bec0b253428a034bd4dd59Jason Samsimport android.widget.SeekBar;
24572a5031a5d8602db0bec0b253428a034bd4dd59Jason Samsimport android.widget.TextView;
25572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams
26572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams
27572a5031a5d8602db0bec0b253428a034bd4dd59Jason Samspublic class LevelsV4 extends TestBase {
28572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams    private ScriptC_levels_relaxed mScriptR;
29572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams    private ScriptC_levels_full mScriptF;
30572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams    private float mInBlack = 0.0f;
31572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams    private float mOutBlack = 0.0f;
32572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams    private float mInWhite = 255.0f;
33572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams    private float mOutWhite = 255.0f;
34572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams    private float mSaturation = 1.0f;
35572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams
36572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams    Matrix3f satMatrix = new Matrix3f();
37572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams    float mInWMinInB;
38572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams    float mOutWMinOutB;
39572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams    float mOverInWMinInB;
40572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams
41572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams    boolean mUseFull;
42572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams    boolean mUseV4;
43572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams
44572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams    LevelsV4(boolean useFull, boolean useV4) {
45572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams        mUseFull = useFull;
46572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams        mUseV4 = useV4;
47572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams    }
48572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams
49572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams
50572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams    private void setLevels() {
51572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams        mInWMinInB = mInWhite - mInBlack;
52572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams        mOutWMinOutB = mOutWhite - mOutBlack;
53572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams        mOverInWMinInB = 1.f / mInWMinInB;
54572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams
55572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams        mScriptR.set_inBlack(mInBlack);
56572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams        mScriptR.set_outBlack(mOutBlack);
57572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams        mScriptR.set_inWMinInB(mInWMinInB);
58572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams        mScriptR.set_outWMinOutB(mOutWMinOutB);
59572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams        mScriptR.set_overInWMinInB(mOverInWMinInB);
60572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams        mScriptF.set_inBlack(mInBlack);
61572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams        mScriptF.set_outBlack(mOutBlack);
62572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams        mScriptF.set_inWMinInB(mInWMinInB);
63572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams        mScriptF.set_outWMinOutB(mOutWMinOutB);
64572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams        mScriptF.set_overInWMinInB(mOverInWMinInB);
65572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams    }
66572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams
67572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams    private void setSaturation() {
68572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams        float rWeight = 0.299f;
69572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams        float gWeight = 0.587f;
70572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams        float bWeight = 0.114f;
71572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams        float oneMinusS = 1.0f - mSaturation;
72572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams
73572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams        satMatrix.set(0, 0, oneMinusS * rWeight + mSaturation);
74572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams        satMatrix.set(0, 1, oneMinusS * rWeight);
75572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams        satMatrix.set(0, 2, oneMinusS * rWeight);
76572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams        satMatrix.set(1, 0, oneMinusS * gWeight);
77572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams        satMatrix.set(1, 1, oneMinusS * gWeight + mSaturation);
78572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams        satMatrix.set(1, 2, oneMinusS * gWeight);
79572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams        satMatrix.set(2, 0, oneMinusS * bWeight);
80572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams        satMatrix.set(2, 1, oneMinusS * bWeight);
81572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams        satMatrix.set(2, 2, oneMinusS * bWeight + mSaturation);
82572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams        mScriptR.set_colorMat(satMatrix);
83572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams        mScriptF.set_colorMat(satMatrix);
84572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams    }
85572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams
86572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams    public boolean onBar1Setup(SeekBar b, TextView t) {
87572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams        b.setProgress(50);
88572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams        t.setText("Saturation");
89572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams        return true;
90572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams    }
91572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams    public boolean onBar2Setup(SeekBar b, TextView t) {
92572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams        b.setMax(128);
93572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams        b.setProgress(0);
94572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams        t.setText("In Black");
95572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams        return true;
96572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams    }
97572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams    public boolean onBar3Setup(SeekBar b, TextView t) {
98572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams        b.setMax(128);
99572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams        b.setProgress(0);
100572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams        t.setText("Out Black");
101572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams        return true;
102572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams    }
103572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams    public boolean onBar4Setup(SeekBar b, TextView t) {
104572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams        b.setMax(128);
105572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams        b.setProgress(128);
106dc08c6d13a68aa8fd35ce5922c1c98b915f35f08Jason Sams        t.setText("In White");
107572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams        return true;
108572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams    }
109572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams    public boolean onBar5Setup(SeekBar b, TextView t) {
110572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams        b.setMax(128);
111572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams        b.setProgress(128);
112572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams        t.setText("Out White");
113572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams        return true;
114572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams    }
115572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams
116572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams    public void onBar1Changed(int progress) {
117572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams        mSaturation = (float)progress / 50.0f;
118572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams        setSaturation();
119572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams    }
120572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams    public void onBar2Changed(int progress) {
121572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams        mInBlack = (float)progress;
122572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams        setLevels();
123572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams    }
124572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams    public void onBar3Changed(int progress) {
125572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams        mOutBlack = (float)progress;
126572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams        setLevels();
127572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams    }
128572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams    public void onBar4Changed(int progress) {
129572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams        mInWhite = (float)progress + 127.0f;
130572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams        setLevels();
131572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams    }
132572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams    public void onBar5Changed(int progress) {
133572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams        mOutWhite = (float)progress + 127.0f;
134572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams        setLevels();
135572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams    }
136572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams
137721a5a24e2278f4012109865d62b98190b3185afJason Sams    public void animateBars(float time) {
138721a5a24e2278f4012109865d62b98190b3185afJason Sams        mSaturation = time % 2.f;
139721a5a24e2278f4012109865d62b98190b3185afJason Sams        setSaturation();
140721a5a24e2278f4012109865d62b98190b3185afJason Sams    }
141721a5a24e2278f4012109865d62b98190b3185afJason Sams
142721a5a24e2278f4012109865d62b98190b3185afJason Sams
143572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams    public void createTest(android.content.res.Resources res) {
144f1d97e536561b4731997c85873dde3b3fb721cb2Stephen Hines        mScriptR = new ScriptC_levels_relaxed(mRS);
145f1d97e536561b4731997c85873dde3b3fb721cb2Stephen Hines        mScriptF = new ScriptC_levels_full(mRS);
146572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams        setSaturation();
147572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams        setLevels();
148572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams    }
149572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams
150572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams    public void runTest() {
151572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams        if (mUseFull) {
152572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams            if (mUseV4) {
153572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams                mScriptF.forEach_root4(mInPixelsAllocation, mOutPixelsAllocation);
154572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams            } else {
155572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams                mScriptF.forEach_root(mInPixelsAllocation, mOutPixelsAllocation);
156572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams            }
157572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams        } else {
158572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams            if (mUseV4) {
159572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams                mScriptR.forEach_root4(mInPixelsAllocation, mOutPixelsAllocation);
160572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams            } else {
161572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams                mScriptR.forEach_root(mInPixelsAllocation, mOutPixelsAllocation);
162572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams            }
163572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams        }
164572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams    }
165572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams
166572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams}
167572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams
168