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.image;
18572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams
19572a5031a5d8602db0bec0b253428a034bd4dd59Jason Samsimport java.lang.Math;
20572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams
21572a5031a5d8602db0bec0b253428a034bd4dd59Jason Samsimport android.renderscript.Allocation;
22572a5031a5d8602db0bec0b253428a034bd4dd59Jason Samsimport android.renderscript.Element;
23572a5031a5d8602db0bec0b253428a034bd4dd59Jason Samsimport android.renderscript.RenderScript;
24572a5031a5d8602db0bec0b253428a034bd4dd59Jason Samsimport android.renderscript.Matrix3f;
25572a5031a5d8602db0bec0b253428a034bd4dd59Jason Samsimport android.renderscript.Script;
26572a5031a5d8602db0bec0b253428a034bd4dd59Jason Samsimport android.renderscript.ScriptC;
27572a5031a5d8602db0bec0b253428a034bd4dd59Jason Samsimport android.renderscript.Type;
28572a5031a5d8602db0bec0b253428a034bd4dd59Jason Samsimport android.util.Log;
29572a5031a5d8602db0bec0b253428a034bd4dd59Jason Samsimport android.widget.SeekBar;
30572a5031a5d8602db0bec0b253428a034bd4dd59Jason Samsimport android.widget.TextView;
31572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams
32572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams
33572a5031a5d8602db0bec0b253428a034bd4dd59Jason Samspublic class LevelsV4 extends TestBase {
34572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams    private ScriptC_levels_relaxed mScriptR;
35572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams    private ScriptC_levels_full mScriptF;
36572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams    private float mInBlack = 0.0f;
37572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams    private float mOutBlack = 0.0f;
38572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams    private float mInWhite = 255.0f;
39572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams    private float mOutWhite = 255.0f;
40572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams    private float mSaturation = 1.0f;
41572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams
42572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams    Matrix3f satMatrix = new Matrix3f();
43572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams    float mInWMinInB;
44572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams    float mOutWMinOutB;
45572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams    float mOverInWMinInB;
46572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams
47572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams    boolean mUseFull;
48572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams    boolean mUseV4;
49572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams
50572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams    LevelsV4(boolean useFull, boolean useV4) {
51572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams        mUseFull = useFull;
52572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams        mUseV4 = useV4;
53572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams    }
54572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams
55572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams
56572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams    private void setLevels() {
57572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams        mInWMinInB = mInWhite - mInBlack;
58572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams        mOutWMinOutB = mOutWhite - mOutBlack;
59572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams        mOverInWMinInB = 1.f / mInWMinInB;
60572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams
61572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams        mScriptR.set_inBlack(mInBlack);
62572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams        mScriptR.set_outBlack(mOutBlack);
63572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams        mScriptR.set_inWMinInB(mInWMinInB);
64572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams        mScriptR.set_outWMinOutB(mOutWMinOutB);
65572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams        mScriptR.set_overInWMinInB(mOverInWMinInB);
66572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams        mScriptF.set_inBlack(mInBlack);
67572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams        mScriptF.set_outBlack(mOutBlack);
68572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams        mScriptF.set_inWMinInB(mInWMinInB);
69572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams        mScriptF.set_outWMinOutB(mOutWMinOutB);
70572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams        mScriptF.set_overInWMinInB(mOverInWMinInB);
71572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams    }
72572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams
73572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams    private void setSaturation() {
74572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams        float rWeight = 0.299f;
75572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams        float gWeight = 0.587f;
76572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams        float bWeight = 0.114f;
77572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams        float oneMinusS = 1.0f - mSaturation;
78572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams
79572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams        satMatrix.set(0, 0, oneMinusS * rWeight + mSaturation);
80572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams        satMatrix.set(0, 1, oneMinusS * rWeight);
81572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams        satMatrix.set(0, 2, oneMinusS * rWeight);
82572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams        satMatrix.set(1, 0, oneMinusS * gWeight);
83572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams        satMatrix.set(1, 1, oneMinusS * gWeight + mSaturation);
84572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams        satMatrix.set(1, 2, oneMinusS * gWeight);
85572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams        satMatrix.set(2, 0, oneMinusS * bWeight);
86572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams        satMatrix.set(2, 1, oneMinusS * bWeight);
87572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams        satMatrix.set(2, 2, oneMinusS * bWeight + mSaturation);
88572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams        mScriptR.set_colorMat(satMatrix);
89572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams        mScriptF.set_colorMat(satMatrix);
90572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams    }
91572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams
92572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams    public boolean onBar1Setup(SeekBar b, TextView t) {
93572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams        b.setProgress(50);
94572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams        t.setText("Saturation");
95572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams        return true;
96572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams    }
97572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams    public boolean onBar2Setup(SeekBar b, TextView t) {
98572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams        b.setMax(128);
99572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams        b.setProgress(0);
100572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams        t.setText("In Black");
101572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams        return true;
102572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams    }
103572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams    public boolean onBar3Setup(SeekBar b, TextView t) {
104572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams        b.setMax(128);
105572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams        b.setProgress(0);
106572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams        t.setText("Out Black");
107572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams        return true;
108572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams    }
109572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams    public boolean onBar4Setup(SeekBar b, TextView t) {
110572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams        b.setMax(128);
111572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams        b.setProgress(128);
112502a38c353090a15217e3854a20dec54a30e5d8eTobias Grosser        t.setText("In White");
113572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams        return true;
114572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams    }
115572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams    public boolean onBar5Setup(SeekBar b, TextView t) {
116572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams        b.setMax(128);
117572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams        b.setProgress(128);
118572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams        t.setText("Out White");
119572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams        return true;
120572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams    }
121572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams
122572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams    public void onBar1Changed(int progress) {
123572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams        mSaturation = (float)progress / 50.0f;
124572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams        setSaturation();
125572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams    }
126572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams    public void onBar2Changed(int progress) {
127572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams        mInBlack = (float)progress;
128572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams        setLevels();
129572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams    }
130572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams    public void onBar3Changed(int progress) {
131572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams        mOutBlack = (float)progress;
132572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams        setLevels();
133572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams    }
134572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams    public void onBar4Changed(int progress) {
135572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams        mInWhite = (float)progress + 127.0f;
136572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams        setLevels();
137572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams    }
138572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams    public void onBar5Changed(int progress) {
139572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams        mOutWhite = (float)progress + 127.0f;
140572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams        setLevels();
141572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams    }
142572a5031a5d8602db0bec0b253428a034bd4dd59Jason 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