1d7fa122dfed376cd9c60eac516e2730acf23f3ddRomain Guy/*
252541816fb308fcac31e86eb3293c2b28b0999deJason Sams * Copyright (C) 2012 The Android Open Source Project
3d7fa122dfed376cd9c60eac516e2730acf23f3ddRomain Guy *
4d7fa122dfed376cd9c60eac516e2730acf23f3ddRomain Guy * Licensed under the Apache License, Version 2.0 (the "License");
5d7fa122dfed376cd9c60eac516e2730acf23f3ddRomain Guy * you may not use this file except in compliance with the License.
6d7fa122dfed376cd9c60eac516e2730acf23f3ddRomain Guy * You may obtain a copy of the License at
7d7fa122dfed376cd9c60eac516e2730acf23f3ddRomain Guy *
8d7fa122dfed376cd9c60eac516e2730acf23f3ddRomain Guy *      http://www.apache.org/licenses/LICENSE-2.0
9d7fa122dfed376cd9c60eac516e2730acf23f3ddRomain Guy *
10d7fa122dfed376cd9c60eac516e2730acf23f3ddRomain Guy * Unless required by applicable law or agreed to in writing, software
11d7fa122dfed376cd9c60eac516e2730acf23f3ddRomain Guy * distributed under the License is distributed on an "AS IS" BASIS,
12d7fa122dfed376cd9c60eac516e2730acf23f3ddRomain Guy * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13d7fa122dfed376cd9c60eac516e2730acf23f3ddRomain Guy * See the License for the specific language governing permissions and
14d7fa122dfed376cd9c60eac516e2730acf23f3ddRomain Guy * limitations under the License.
15d7fa122dfed376cd9c60eac516e2730acf23f3ddRomain Guy */
16d7fa122dfed376cd9c60eac516e2730acf23f3ddRomain Guy
17d7fa122dfed376cd9c60eac516e2730acf23f3ddRomain Guypackage com.android.rs.image;
18d7fa122dfed376cd9c60eac516e2730acf23f3ddRomain Guy
19d7fa122dfed376cd9c60eac516e2730acf23f3ddRomain Guyimport android.app.Activity;
20d7fa122dfed376cd9c60eac516e2730acf23f3ddRomain Guyimport android.os.Bundle;
21d7fa122dfed376cd9c60eac516e2730acf23f3ddRomain Guyimport android.graphics.BitmapFactory;
22d7fa122dfed376cd9c60eac516e2730acf23f3ddRomain Guyimport android.graphics.Bitmap;
23d7fa122dfed376cd9c60eac516e2730acf23f3ddRomain Guyimport android.graphics.Canvas;
24d7fa122dfed376cd9c60eac516e2730acf23f3ddRomain Guyimport android.renderscript.ScriptC;
25d7fa122dfed376cd9c60eac516e2730acf23f3ddRomain Guyimport android.renderscript.RenderScript;
26d7fa122dfed376cd9c60eac516e2730acf23f3ddRomain Guyimport android.renderscript.Type;
27d7fa122dfed376cd9c60eac516e2730acf23f3ddRomain Guyimport android.renderscript.Allocation;
28d7fa122dfed376cd9c60eac516e2730acf23f3ddRomain Guyimport android.renderscript.Element;
29d7fa122dfed376cd9c60eac516e2730acf23f3ddRomain Guyimport android.renderscript.Script;
30d7fa122dfed376cd9c60eac516e2730acf23f3ddRomain Guyimport android.view.SurfaceView;
31d7fa122dfed376cd9c60eac516e2730acf23f3ddRomain Guyimport android.view.SurfaceHolder;
3252541816fb308fcac31e86eb3293c2b28b0999deJason Samsimport android.widget.AdapterView;
3352541816fb308fcac31e86eb3293c2b28b0999deJason Samsimport android.widget.ArrayAdapter;
34d7fa122dfed376cd9c60eac516e2730acf23f3ddRomain Guyimport android.widget.ImageView;
35d7fa122dfed376cd9c60eac516e2730acf23f3ddRomain Guyimport android.widget.SeekBar;
3652541816fb308fcac31e86eb3293c2b28b0999deJason Samsimport android.widget.Spinner;
37814326b3b945d61ea48d05e32899fb5a036cc2d3Alex Sakhartchoukimport android.widget.TextView;
38814326b3b945d61ea48d05e32899fb5a036cc2d3Alex Sakhartchoukimport android.view.View;
39f6244d1c0c91cd0fcb49abc8c0526eab7fcc1c3bXia Wangimport android.util.Log;
40586f3b5d32c0464a4e69c92f89865eea672ab665Jason Samsimport java.lang.Math;
41d7fa122dfed376cd9c60eac516e2730acf23f3ddRomain Guy
42b94d69a2267d2660ade79ff5e56ecb00f307c553Jason Samsimport android.os.Environment;
43b94d69a2267d2660ade79ff5e56ecb00f307c553Jason Samsimport android.app.Instrumentation;
44b94d69a2267d2660ade79ff5e56ecb00f307c553Jason Samsimport android.content.Context;
45b94d69a2267d2660ade79ff5e56ecb00f307c553Jason Samsimport android.content.Intent;
46b94d69a2267d2660ade79ff5e56ecb00f307c553Jason Samsimport android.net.Uri;
47b94d69a2267d2660ade79ff5e56ecb00f307c553Jason Samsimport java.io.BufferedWriter;
48b94d69a2267d2660ade79ff5e56ecb00f307c553Jason Samsimport java.io.File;
49b94d69a2267d2660ade79ff5e56ecb00f307c553Jason Samsimport java.io.FileWriter;
50b94d69a2267d2660ade79ff5e56ecb00f307c553Jason Samsimport java.io.IOException;
51b94d69a2267d2660ade79ff5e56ecb00f307c553Jason Sams
52814326b3b945d61ea48d05e32899fb5a036cc2d3Alex Sakhartchoukpublic class ImageProcessingActivity extends Activity
5352541816fb308fcac31e86eb3293c2b28b0999deJason Sams                                       implements SeekBar.OnSeekBarChangeListener {
54f6244d1c0c91cd0fcb49abc8c0526eab7fcc1c3bXia Wang    private final String TAG = "Img";
55b94d69a2267d2660ade79ff5e56ecb00f307c553Jason Sams    private final String RESULT_FILE = "image_processing_result.csv";
56b94d69a2267d2660ade79ff5e56ecb00f307c553Jason Sams
5752541816fb308fcac31e86eb3293c2b28b0999deJason Sams    Bitmap mBitmapIn;
5874478f73b7ecf5c6bceb214b2704184ad9e2e0ecTim Murray    Bitmap mBitmapIn2;
5952541816fb308fcac31e86eb3293c2b28b0999deJason Sams    Bitmap mBitmapOut;
6052541816fb308fcac31e86eb3293c2b28b0999deJason Sams    String mTestNames[];
6152541816fb308fcac31e86eb3293c2b28b0999deJason Sams
6274478f73b7ecf5c6bceb214b2704184ad9e2e0ecTim Murray    private Spinner mSpinner;
6352541816fb308fcac31e86eb3293c2b28b0999deJason Sams    private SeekBar mBar1;
6452541816fb308fcac31e86eb3293c2b28b0999deJason Sams    private SeekBar mBar2;
6552541816fb308fcac31e86eb3293c2b28b0999deJason Sams    private SeekBar mBar3;
6652541816fb308fcac31e86eb3293c2b28b0999deJason Sams    private SeekBar mBar4;
6752541816fb308fcac31e86eb3293c2b28b0999deJason Sams    private SeekBar mBar5;
6852541816fb308fcac31e86eb3293c2b28b0999deJason Sams    private TextView mText1;
6952541816fb308fcac31e86eb3293c2b28b0999deJason Sams    private TextView mText2;
7052541816fb308fcac31e86eb3293c2b28b0999deJason Sams    private TextView mText3;
7152541816fb308fcac31e86eb3293c2b28b0999deJason Sams    private TextView mText4;
7252541816fb308fcac31e86eb3293c2b28b0999deJason Sams    private TextView mText5;
73814326b3b945d61ea48d05e32899fb5a036cc2d3Alex Sakhartchouk
74814326b3b945d61ea48d05e32899fb5a036cc2d3Alex Sakhartchouk    private float mSaturation = 1.0f;
75814326b3b945d61ea48d05e32899fb5a036cc2d3Alex Sakhartchouk
76814326b3b945d61ea48d05e32899fb5a036cc2d3Alex Sakhartchouk    private TextView mBenchmarkResult;
7752541816fb308fcac31e86eb3293c2b28b0999deJason Sams    private Spinner mTestSpinner;
78d7fa122dfed376cd9c60eac516e2730acf23f3ddRomain Guy
79d7fa122dfed376cd9c60eac516e2730acf23f3ddRomain Guy    private SurfaceView mSurfaceView;
80d7fa122dfed376cd9c60eac516e2730acf23f3ddRomain Guy    private ImageView mDisplayView;
81d7fa122dfed376cd9c60eac516e2730acf23f3ddRomain Guy
8252541816fb308fcac31e86eb3293c2b28b0999deJason Sams    private boolean mDoingBenchmark;
83abf2b931ff173a04cc171592e25a6fa6a81a606dAlex Sakhartchouk
8452541816fb308fcac31e86eb3293c2b28b0999deJason Sams    private TestBase mTest;
85abf2b931ff173a04cc171592e25a6fa6a81a606dAlex Sakhartchouk
8674478f73b7ecf5c6bceb214b2704184ad9e2e0ecTim Murray    public void updateDisplay() {
8774478f73b7ecf5c6bceb214b2704184ad9e2e0ecTim Murray            mTest.updateBitmap(mBitmapOut);
8874478f73b7ecf5c6bceb214b2704184ad9e2e0ecTim Murray            mDisplayView.invalidate();
8974478f73b7ecf5c6bceb214b2704184ad9e2e0ecTim Murray    }
90abf2b931ff173a04cc171592e25a6fa6a81a606dAlex Sakhartchouk
9152541816fb308fcac31e86eb3293c2b28b0999deJason Sams    public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) {
9252541816fb308fcac31e86eb3293c2b28b0999deJason Sams        if (fromUser) {
9352541816fb308fcac31e86eb3293c2b28b0999deJason Sams
9452541816fb308fcac31e86eb3293c2b28b0999deJason Sams            if (seekBar == mBar1) {
9552541816fb308fcac31e86eb3293c2b28b0999deJason Sams                mTest.onBar1Changed(progress);
9652541816fb308fcac31e86eb3293c2b28b0999deJason Sams            } else if (seekBar == mBar2) {
9752541816fb308fcac31e86eb3293c2b28b0999deJason Sams                mTest.onBar2Changed(progress);
9852541816fb308fcac31e86eb3293c2b28b0999deJason Sams            } else if (seekBar == mBar3) {
9952541816fb308fcac31e86eb3293c2b28b0999deJason Sams                mTest.onBar3Changed(progress);
10052541816fb308fcac31e86eb3293c2b28b0999deJason Sams            } else if (seekBar == mBar4) {
10152541816fb308fcac31e86eb3293c2b28b0999deJason Sams                mTest.onBar4Changed(progress);
10252541816fb308fcac31e86eb3293c2b28b0999deJason Sams            } else if (seekBar == mBar5) {
10352541816fb308fcac31e86eb3293c2b28b0999deJason Sams                mTest.onBar5Changed(progress);
104d7fa122dfed376cd9c60eac516e2730acf23f3ddRomain Guy            }
105d7fa122dfed376cd9c60eac516e2730acf23f3ddRomain Guy
10652541816fb308fcac31e86eb3293c2b28b0999deJason Sams            mTest.runTest();
10774478f73b7ecf5c6bceb214b2704184ad9e2e0ecTim Murray            updateDisplay();
108d7fa122dfed376cd9c60eac516e2730acf23f3ddRomain Guy        }
109d7fa122dfed376cd9c60eac516e2730acf23f3ddRomain Guy    }
110d7fa122dfed376cd9c60eac516e2730acf23f3ddRomain Guy
11152541816fb308fcac31e86eb3293c2b28b0999deJason Sams    public void onStartTrackingTouch(SeekBar seekBar) {
11252541816fb308fcac31e86eb3293c2b28b0999deJason Sams    }
113814326b3b945d61ea48d05e32899fb5a036cc2d3Alex Sakhartchouk
11452541816fb308fcac31e86eb3293c2b28b0999deJason Sams    public void onStopTrackingTouch(SeekBar seekBar) {
11552541816fb308fcac31e86eb3293c2b28b0999deJason Sams    }
116814326b3b945d61ea48d05e32899fb5a036cc2d3Alex Sakhartchouk
11752541816fb308fcac31e86eb3293c2b28b0999deJason Sams    void setupBars() {
11874478f73b7ecf5c6bceb214b2704184ad9e2e0ecTim Murray        mSpinner.setVisibility(View.VISIBLE);
11974478f73b7ecf5c6bceb214b2704184ad9e2e0ecTim Murray        mTest.onSpinner1Setup(mSpinner);
12074478f73b7ecf5c6bceb214b2704184ad9e2e0ecTim Murray
12152541816fb308fcac31e86eb3293c2b28b0999deJason Sams        mBar1.setVisibility(View.VISIBLE);
12252541816fb308fcac31e86eb3293c2b28b0999deJason Sams        mText1.setVisibility(View.VISIBLE);
12352541816fb308fcac31e86eb3293c2b28b0999deJason Sams        mTest.onBar1Setup(mBar1, mText1);
124814326b3b945d61ea48d05e32899fb5a036cc2d3Alex Sakhartchouk
12552541816fb308fcac31e86eb3293c2b28b0999deJason Sams        mBar2.setVisibility(View.VISIBLE);
12652541816fb308fcac31e86eb3293c2b28b0999deJason Sams        mText2.setVisibility(View.VISIBLE);
12752541816fb308fcac31e86eb3293c2b28b0999deJason Sams        mTest.onBar2Setup(mBar2, mText2);
128814326b3b945d61ea48d05e32899fb5a036cc2d3Alex Sakhartchouk
12952541816fb308fcac31e86eb3293c2b28b0999deJason Sams        mBar3.setVisibility(View.VISIBLE);
13052541816fb308fcac31e86eb3293c2b28b0999deJason Sams        mText3.setVisibility(View.VISIBLE);
13152541816fb308fcac31e86eb3293c2b28b0999deJason Sams        mTest.onBar3Setup(mBar3, mText3);
13252541816fb308fcac31e86eb3293c2b28b0999deJason Sams
13352541816fb308fcac31e86eb3293c2b28b0999deJason Sams        mBar4.setVisibility(View.VISIBLE);
13452541816fb308fcac31e86eb3293c2b28b0999deJason Sams        mText4.setVisibility(View.VISIBLE);
13552541816fb308fcac31e86eb3293c2b28b0999deJason Sams        mTest.onBar4Setup(mBar4, mText4);
13652541816fb308fcac31e86eb3293c2b28b0999deJason Sams
13752541816fb308fcac31e86eb3293c2b28b0999deJason Sams        mBar5.setVisibility(View.VISIBLE);
13852541816fb308fcac31e86eb3293c2b28b0999deJason Sams        mText5.setVisibility(View.VISIBLE);
13952541816fb308fcac31e86eb3293c2b28b0999deJason Sams        mTest.onBar5Setup(mBar5, mText5);
140814326b3b945d61ea48d05e32899fb5a036cc2d3Alex Sakhartchouk    }
141814326b3b945d61ea48d05e32899fb5a036cc2d3Alex Sakhartchouk
14252541816fb308fcac31e86eb3293c2b28b0999deJason Sams
14352541816fb308fcac31e86eb3293c2b28b0999deJason Sams    void changeTest(int testID) {
144ed0b4f961f04ebf12cf900f4ce2d94e4473bf40bJason Sams        if (mTest != null) {
145ed0b4f961f04ebf12cf900f4ce2d94e4473bf40bJason Sams            mTest.destroy();
146ed0b4f961f04ebf12cf900f4ce2d94e4473bf40bJason Sams        }
14752541816fb308fcac31e86eb3293c2b28b0999deJason Sams        switch(testID) {
14852541816fb308fcac31e86eb3293c2b28b0999deJason Sams        case 0:
14952541816fb308fcac31e86eb3293c2b28b0999deJason Sams            mTest = new LevelsV4(false, false);
15052541816fb308fcac31e86eb3293c2b28b0999deJason Sams            break;
15152541816fb308fcac31e86eb3293c2b28b0999deJason Sams        case 1:
15252541816fb308fcac31e86eb3293c2b28b0999deJason Sams            mTest = new LevelsV4(false, true);
15352541816fb308fcac31e86eb3293c2b28b0999deJason Sams            break;
15452541816fb308fcac31e86eb3293c2b28b0999deJason Sams        case 2:
15552541816fb308fcac31e86eb3293c2b28b0999deJason Sams            mTest = new LevelsV4(true, false);
15652541816fb308fcac31e86eb3293c2b28b0999deJason Sams            break;
15752541816fb308fcac31e86eb3293c2b28b0999deJason Sams        case 3:
15852541816fb308fcac31e86eb3293c2b28b0999deJason Sams            mTest = new LevelsV4(true, true);
15952541816fb308fcac31e86eb3293c2b28b0999deJason Sams            break;
16052541816fb308fcac31e86eb3293c2b28b0999deJason Sams        case 4:
1613a5b8011765906c15b5474b2bc43d80f6746cb45Jason Sams            mTest = new Blur25(false);
16252541816fb308fcac31e86eb3293c2b28b0999deJason Sams            break;
16352541816fb308fcac31e86eb3293c2b28b0999deJason Sams        case 5:
1643a5b8011765906c15b5474b2bc43d80f6746cb45Jason Sams            mTest = new Blur25(true);
16552541816fb308fcac31e86eb3293c2b28b0999deJason Sams            break;
1664a45de8c5fccbbe550c87571551093ddf8a1d976Jason Sams        case 6:
1673a5b8011765906c15b5474b2bc43d80f6746cb45Jason Sams            mTest = new Greyscale();
1684a45de8c5fccbbe550c87571551093ddf8a1d976Jason Sams            break;
169bb2c9476363d53f8a2888e263c171b588e21eeabRajeev Sharma        case 7:
1703a5b8011765906c15b5474b2bc43d80f6746cb45Jason Sams            mTest = new Grain();
171bb2c9476363d53f8a2888e263c171b588e21eeabRajeev Sharma            break;
172bb2c9476363d53f8a2888e263c171b588e21eeabRajeev Sharma        case 8:
1733a5b8011765906c15b5474b2bc43d80f6746cb45Jason Sams            mTest = new Fisheye(false, false);
174bb2c9476363d53f8a2888e263c171b588e21eeabRajeev Sharma            break;
175bb0dbf73739c36ac97453f9510cf3d84acfd57ccRajeev Sharma        case 9:
1763a5b8011765906c15b5474b2bc43d80f6746cb45Jason Sams            mTest = new Fisheye(false, true);
177bb0dbf73739c36ac97453f9510cf3d84acfd57ccRajeev Sharma            break;
178bb0dbf73739c36ac97453f9510cf3d84acfd57ccRajeev Sharma        case 10:
1793a5b8011765906c15b5474b2bc43d80f6746cb45Jason Sams            mTest = new Fisheye(true, false);
1808fa57118ad687f50b26cf2037717ecc3a22fdfe1Rajeev Sharma            break;
1818fa57118ad687f50b26cf2037717ecc3a22fdfe1Rajeev Sharma        case 11:
1823a5b8011765906c15b5474b2bc43d80f6746cb45Jason Sams            mTest = new Fisheye(true, true);
1838fa57118ad687f50b26cf2037717ecc3a22fdfe1Rajeev Sharma            break;
1848fa57118ad687f50b26cf2037717ecc3a22fdfe1Rajeev Sharma        case 12:
1853a5b8011765906c15b5474b2bc43d80f6746cb45Jason Sams            mTest = new Vignette(false, false);
186bb0dbf73739c36ac97453f9510cf3d84acfd57ccRajeev Sharma            break;
187423ebcb4dc4881c3a83e8121d5212466287d0d0cJason Sams        case 13:
1883a5b8011765906c15b5474b2bc43d80f6746cb45Jason Sams            mTest = new Vignette(false, true);
189423ebcb4dc4881c3a83e8121d5212466287d0d0cJason Sams            break;
190423ebcb4dc4881c3a83e8121d5212466287d0d0cJason Sams        case 14:
1913a5b8011765906c15b5474b2bc43d80f6746cb45Jason Sams            mTest = new Vignette(true, false);
192423ebcb4dc4881c3a83e8121d5212466287d0d0cJason Sams            break;
1936ab97682fd444586ee135912a4210417a1c8781bJason Sams        case 15:
1943a5b8011765906c15b5474b2bc43d80f6746cb45Jason Sams            mTest = new Vignette(true, true);
19550b1ba0083115c4fb578f13e0b94c6d80b5b1841Rajeev Sharma            break;
19650b1ba0083115c4fb578f13e0b94c6d80b5b1841Rajeev Sharma        case 16:
1973a5b8011765906c15b5474b2bc43d80f6746cb45Jason Sams            mTest = new GroupTest(false);
19850b1ba0083115c4fb578f13e0b94c6d80b5b1841Rajeev Sharma            break;
19950b1ba0083115c4fb578f13e0b94c6d80b5b1841Rajeev Sharma        case 17:
2003a5b8011765906c15b5474b2bc43d80f6746cb45Jason Sams            mTest = new GroupTest(true);
2015729fcdf950eb909b0ab90a49af58731ed8f92cdJason Sams            break;
2025729fcdf950eb909b0ab90a49af58731ed8f92cdJason Sams        case 18:
2033a5b8011765906c15b5474b2bc43d80f6746cb45Jason Sams            mTest = new Convolve3x3(false);
2045729fcdf950eb909b0ab90a49af58731ed8f92cdJason Sams            break;
2055729fcdf950eb909b0ab90a49af58731ed8f92cdJason Sams        case 19:
2063a5b8011765906c15b5474b2bc43d80f6746cb45Jason Sams            mTest = new Convolve3x3(true);
2075729fcdf950eb909b0ab90a49af58731ed8f92cdJason Sams            break;
2085729fcdf950eb909b0ab90a49af58731ed8f92cdJason Sams        case 20:
2093a5b8011765906c15b5474b2bc43d80f6746cb45Jason Sams            mTest = new ColorMatrix(false, false);
2105729fcdf950eb909b0ab90a49af58731ed8f92cdJason Sams            break;
2115729fcdf950eb909b0ab90a49af58731ed8f92cdJason Sams        case 21:
2123a5b8011765906c15b5474b2bc43d80f6746cb45Jason Sams            mTest = new ColorMatrix(true, false);
213c1ccbf52319993634e3bcc2433c66aff6dd87707Jason Sams            break;
214c1ccbf52319993634e3bcc2433c66aff6dd87707Jason Sams        case 22:
2153a5b8011765906c15b5474b2bc43d80f6746cb45Jason Sams            mTest = new ColorMatrix(true, true);
2163a5b8011765906c15b5474b2bc43d80f6746cb45Jason Sams            break;
2173a5b8011765906c15b5474b2bc43d80f6746cb45Jason Sams        case 23:
2185729fcdf950eb909b0ab90a49af58731ed8f92cdJason Sams            mTest = new Copy();
2196ab97682fd444586ee135912a4210417a1c8781bJason Sams            break;
2203a5b8011765906c15b5474b2bc43d80f6746cb45Jason Sams        case 24:
2213a5b8011765906c15b5474b2bc43d80f6746cb45Jason Sams            mTest = new CrossProcess();
2223a5b8011765906c15b5474b2bc43d80f6746cb45Jason Sams            break;
2233a5b8011765906c15b5474b2bc43d80f6746cb45Jason Sams        case 25:
2243a5b8011765906c15b5474b2bc43d80f6746cb45Jason Sams            mTest = new Convolve5x5(false);
2253a5b8011765906c15b5474b2bc43d80f6746cb45Jason Sams            break;
2263a5b8011765906c15b5474b2bc43d80f6746cb45Jason Sams        case 26:
2273a5b8011765906c15b5474b2bc43d80f6746cb45Jason Sams            mTest = new Convolve5x5(true);
2283a5b8011765906c15b5474b2bc43d80f6746cb45Jason Sams            break;
2290e64d892d69d729a3afb95353b27d4f072ba6437Tim Murray        case 27:
2300e64d892d69d729a3afb95353b27d4f072ba6437Tim Murray            mTest = new Mandelbrot();
2310e64d892d69d729a3afb95353b27d4f072ba6437Tim Murray            break;
23274478f73b7ecf5c6bceb214b2704184ad9e2e0ecTim Murray        case 28:
23374478f73b7ecf5c6bceb214b2704184ad9e2e0ecTim Murray            mTest = new Blend();
23474478f73b7ecf5c6bceb214b2704184ad9e2e0ecTim Murray            break;
23552541816fb308fcac31e86eb3293c2b28b0999deJason Sams        }
23652541816fb308fcac31e86eb3293c2b28b0999deJason Sams
23774478f73b7ecf5c6bceb214b2704184ad9e2e0ecTim Murray        mTest.createBaseTest(this, mBitmapIn, mBitmapIn2);
23852541816fb308fcac31e86eb3293c2b28b0999deJason Sams        setupBars();
23952541816fb308fcac31e86eb3293c2b28b0999deJason Sams
24052541816fb308fcac31e86eb3293c2b28b0999deJason Sams        mTest.runTest();
24174478f73b7ecf5c6bceb214b2704184ad9e2e0ecTim Murray        updateDisplay();
24252541816fb308fcac31e86eb3293c2b28b0999deJason Sams        mBenchmarkResult.setText("Result: not run");
243814326b3b945d61ea48d05e32899fb5a036cc2d3Alex Sakhartchouk    }
244814326b3b945d61ea48d05e32899fb5a036cc2d3Alex Sakhartchouk
24552541816fb308fcac31e86eb3293c2b28b0999deJason Sams    void setupTests() {
24674478f73b7ecf5c6bceb214b2704184ad9e2e0ecTim Murray        mTestNames = new String[29];
24752541816fb308fcac31e86eb3293c2b28b0999deJason Sams        mTestNames[0] = "Levels Vec3 Relaxed";
24852541816fb308fcac31e86eb3293c2b28b0999deJason Sams        mTestNames[1] = "Levels Vec4 Relaxed";
24952541816fb308fcac31e86eb3293c2b28b0999deJason Sams        mTestNames[2] = "Levels Vec3 Full";
25052541816fb308fcac31e86eb3293c2b28b0999deJason Sams        mTestNames[3] = "Levels Vec4 Full";
25152541816fb308fcac31e86eb3293c2b28b0999deJason Sams        mTestNames[4] = "Blur radius 25";
2523a5b8011765906c15b5474b2bc43d80f6746cb45Jason Sams        mTestNames[5] = "Intrinsic Blur radius 25";
2533a5b8011765906c15b5474b2bc43d80f6746cb45Jason Sams        mTestNames[6] = "Greyscale";
2543a5b8011765906c15b5474b2bc43d80f6746cb45Jason Sams        mTestNames[7] = "Grain";
2553a5b8011765906c15b5474b2bc43d80f6746cb45Jason Sams        mTestNames[8] = "Fisheye Full";
2563a5b8011765906c15b5474b2bc43d80f6746cb45Jason Sams        mTestNames[9] = "Fisheye Relaxed";
2573a5b8011765906c15b5474b2bc43d80f6746cb45Jason Sams        mTestNames[10] = "Fisheye Approximate Full";
2583a5b8011765906c15b5474b2bc43d80f6746cb45Jason Sams        mTestNames[11] = "Fisheye Approximate Relaxed";
2593a5b8011765906c15b5474b2bc43d80f6746cb45Jason Sams        mTestNames[12] = "Vignette Full";
2603a5b8011765906c15b5474b2bc43d80f6746cb45Jason Sams        mTestNames[13] = "Vignette Relaxed";
2613a5b8011765906c15b5474b2bc43d80f6746cb45Jason Sams        mTestNames[14] = "Vignette Approximate Full";
2623a5b8011765906c15b5474b2bc43d80f6746cb45Jason Sams        mTestNames[15] = "Vignette Approximate Relaxed";
2633a5b8011765906c15b5474b2bc43d80f6746cb45Jason Sams        mTestNames[16] = "Group Test (emulated)";
2643a5b8011765906c15b5474b2bc43d80f6746cb45Jason Sams        mTestNames[17] = "Group Test (native)";
2653a5b8011765906c15b5474b2bc43d80f6746cb45Jason Sams        mTestNames[18] = "Convolve 3x3";
2663a5b8011765906c15b5474b2bc43d80f6746cb45Jason Sams        mTestNames[19] = "Intrinsics Convolve 3x3";
2673a5b8011765906c15b5474b2bc43d80f6746cb45Jason Sams        mTestNames[20] = "ColorMatrix";
2683a5b8011765906c15b5474b2bc43d80f6746cb45Jason Sams        mTestNames[21] = "Intrinsics ColorMatrix";
2693a5b8011765906c15b5474b2bc43d80f6746cb45Jason Sams        mTestNames[22] = "Intrinsics ColorMatrix Grey";
2703a5b8011765906c15b5474b2bc43d80f6746cb45Jason Sams        mTestNames[23] = "Copy";
2713a5b8011765906c15b5474b2bc43d80f6746cb45Jason Sams        mTestNames[24] = "CrossProcess (using LUT)";
2723a5b8011765906c15b5474b2bc43d80f6746cb45Jason Sams        mTestNames[25] = "Convolve 5x5";
2733a5b8011765906c15b5474b2bc43d80f6746cb45Jason Sams        mTestNames[26] = "Intrinsics Convolve 5x5";
2740e64d892d69d729a3afb95353b27d4f072ba6437Tim Murray        mTestNames[27] = "Mandelbrot";
27574478f73b7ecf5c6bceb214b2704184ad9e2e0ecTim Murray        mTestNames[28] = "Intrinsics Blend";
2760e64d892d69d729a3afb95353b27d4f072ba6437Tim Murray
27752541816fb308fcac31e86eb3293c2b28b0999deJason Sams        mTestSpinner.setAdapter(new ArrayAdapter<String>(
27852541816fb308fcac31e86eb3293c2b28b0999deJason Sams            this, R.layout.spinner_layout, mTestNames));
279586f3b5d32c0464a4e69c92f89865eea672ab665Jason Sams    }
280586f3b5d32c0464a4e69c92f89865eea672ab665Jason Sams
28152541816fb308fcac31e86eb3293c2b28b0999deJason Sams    private AdapterView.OnItemSelectedListener mTestSpinnerListener =
28252541816fb308fcac31e86eb3293c2b28b0999deJason Sams            new AdapterView.OnItemSelectedListener() {
28352541816fb308fcac31e86eb3293c2b28b0999deJason Sams                public void onItemSelected(AdapterView<?> parent, View view, int pos, long id) {
28452541816fb308fcac31e86eb3293c2b28b0999deJason Sams                    changeTest(pos);
28552541816fb308fcac31e86eb3293c2b28b0999deJason Sams                }
28652541816fb308fcac31e86eb3293c2b28b0999deJason Sams
28752541816fb308fcac31e86eb3293c2b28b0999deJason Sams                public void onNothingSelected(AdapterView parent) {
28852541816fb308fcac31e86eb3293c2b28b0999deJason Sams
28952541816fb308fcac31e86eb3293c2b28b0999deJason Sams                }
29052541816fb308fcac31e86eb3293c2b28b0999deJason Sams            };
29152541816fb308fcac31e86eb3293c2b28b0999deJason Sams
292d7fa122dfed376cd9c60eac516e2730acf23f3ddRomain Guy    @Override
293d7fa122dfed376cd9c60eac516e2730acf23f3ddRomain Guy    protected void onCreate(Bundle savedInstanceState) {
294d7fa122dfed376cd9c60eac516e2730acf23f3ddRomain Guy        super.onCreate(savedInstanceState);
295d7fa122dfed376cd9c60eac516e2730acf23f3ddRomain Guy        setContentView(R.layout.main);
296d7fa122dfed376cd9c60eac516e2730acf23f3ddRomain Guy
2978fd5853c1c07c2fd3954b3c5e64702d70af31144Jason Sams        mBitmapIn = loadBitmap(R.drawable.img1600x1067);
29874478f73b7ecf5c6bceb214b2704184ad9e2e0ecTim Murray        mBitmapIn2 = loadBitmap(R.drawable.img1600x1067b);
2998fd5853c1c07c2fd3954b3c5e64702d70af31144Jason Sams        mBitmapOut = loadBitmap(R.drawable.img1600x1067);
300d7fa122dfed376cd9c60eac516e2730acf23f3ddRomain Guy
301d7fa122dfed376cd9c60eac516e2730acf23f3ddRomain Guy        mSurfaceView = (SurfaceView) findViewById(R.id.surface);
302d7fa122dfed376cd9c60eac516e2730acf23f3ddRomain Guy
303d7fa122dfed376cd9c60eac516e2730acf23f3ddRomain Guy        mDisplayView = (ImageView) findViewById(R.id.display);
3044d3399337d18ef04116bc8a2e5799274655d0c30Jason Sams        mDisplayView.setImageBitmap(mBitmapOut);
305d7fa122dfed376cd9c60eac516e2730acf23f3ddRomain Guy
30674478f73b7ecf5c6bceb214b2704184ad9e2e0ecTim Murray        mSpinner = (Spinner) findViewById(R.id.spinner1);
30774478f73b7ecf5c6bceb214b2704184ad9e2e0ecTim Murray
30852541816fb308fcac31e86eb3293c2b28b0999deJason Sams        mBar1 = (SeekBar) findViewById(R.id.slider1);
30952541816fb308fcac31e86eb3293c2b28b0999deJason Sams        mBar2 = (SeekBar) findViewById(R.id.slider2);
31052541816fb308fcac31e86eb3293c2b28b0999deJason Sams        mBar3 = (SeekBar) findViewById(R.id.slider3);
31152541816fb308fcac31e86eb3293c2b28b0999deJason Sams        mBar4 = (SeekBar) findViewById(R.id.slider4);
31252541816fb308fcac31e86eb3293c2b28b0999deJason Sams        mBar5 = (SeekBar) findViewById(R.id.slider5);
313814326b3b945d61ea48d05e32899fb5a036cc2d3Alex Sakhartchouk
31452541816fb308fcac31e86eb3293c2b28b0999deJason Sams        mBar1.setOnSeekBarChangeListener(this);
31552541816fb308fcac31e86eb3293c2b28b0999deJason Sams        mBar2.setOnSeekBarChangeListener(this);
31652541816fb308fcac31e86eb3293c2b28b0999deJason Sams        mBar3.setOnSeekBarChangeListener(this);
31752541816fb308fcac31e86eb3293c2b28b0999deJason Sams        mBar4.setOnSeekBarChangeListener(this);
31852541816fb308fcac31e86eb3293c2b28b0999deJason Sams        mBar5.setOnSeekBarChangeListener(this);
319d7fa122dfed376cd9c60eac516e2730acf23f3ddRomain Guy
32052541816fb308fcac31e86eb3293c2b28b0999deJason Sams        mText1 = (TextView) findViewById(R.id.slider1Text);
32152541816fb308fcac31e86eb3293c2b28b0999deJason Sams        mText2 = (TextView) findViewById(R.id.slider2Text);
32252541816fb308fcac31e86eb3293c2b28b0999deJason Sams        mText3 = (TextView) findViewById(R.id.slider3Text);
32352541816fb308fcac31e86eb3293c2b28b0999deJason Sams        mText4 = (TextView) findViewById(R.id.slider4Text);
32452541816fb308fcac31e86eb3293c2b28b0999deJason Sams        mText5 = (TextView) findViewById(R.id.slider5Text);
325d7fa122dfed376cd9c60eac516e2730acf23f3ddRomain Guy
32652541816fb308fcac31e86eb3293c2b28b0999deJason Sams        mTestSpinner = (Spinner) findViewById(R.id.filterselection);
32752541816fb308fcac31e86eb3293c2b28b0999deJason Sams        mTestSpinner.setOnItemSelectedListener(mTestSpinnerListener);
328d7fa122dfed376cd9c60eac516e2730acf23f3ddRomain Guy
32952541816fb308fcac31e86eb3293c2b28b0999deJason Sams        mBenchmarkResult = (TextView) findViewById(R.id.benchmarkText);
33052541816fb308fcac31e86eb3293c2b28b0999deJason Sams        mBenchmarkResult.setText("Result: not run");
331718cd1f322ee5b62b6a49cb36195bcb18a5ab711Jason Sams
33252541816fb308fcac31e86eb3293c2b28b0999deJason Sams        setupTests();
33352541816fb308fcac31e86eb3293c2b28b0999deJason Sams        changeTest(0);
334d7fa122dfed376cd9c60eac516e2730acf23f3ddRomain Guy    }
335d7fa122dfed376cd9c60eac516e2730acf23f3ddRomain Guy
33652541816fb308fcac31e86eb3293c2b28b0999deJason Sams
337d7fa122dfed376cd9c60eac516e2730acf23f3ddRomain Guy    private Bitmap loadBitmap(int resource) {
338d7fa122dfed376cd9c60eac516e2730acf23f3ddRomain Guy        final BitmapFactory.Options options = new BitmapFactory.Options();
339d7fa122dfed376cd9c60eac516e2730acf23f3ddRomain Guy        options.inPreferredConfig = Bitmap.Config.ARGB_8888;
340d7fa122dfed376cd9c60eac516e2730acf23f3ddRomain Guy        return copyBitmap(BitmapFactory.decodeResource(getResources(), resource, options));
341d7fa122dfed376cd9c60eac516e2730acf23f3ddRomain Guy    }
342d7fa122dfed376cd9c60eac516e2730acf23f3ddRomain Guy
343d7fa122dfed376cd9c60eac516e2730acf23f3ddRomain Guy    private static Bitmap copyBitmap(Bitmap source) {
344d7fa122dfed376cd9c60eac516e2730acf23f3ddRomain Guy        Bitmap b = Bitmap.createBitmap(source.getWidth(), source.getHeight(), source.getConfig());
345d7fa122dfed376cd9c60eac516e2730acf23f3ddRomain Guy        Canvas c = new Canvas(b);
346d7fa122dfed376cd9c60eac516e2730acf23f3ddRomain Guy        c.drawBitmap(source, 0, 0, null);
347d7fa122dfed376cd9c60eac516e2730acf23f3ddRomain Guy        source.recycle();
348d7fa122dfed376cd9c60eac516e2730acf23f3ddRomain Guy        return b;
349d7fa122dfed376cd9c60eac516e2730acf23f3ddRomain Guy    }
350814326b3b945d61ea48d05e32899fb5a036cc2d3Alex Sakhartchouk
351814326b3b945d61ea48d05e32899fb5a036cc2d3Alex Sakhartchouk    // button hook
352814326b3b945d61ea48d05e32899fb5a036cc2d3Alex Sakhartchouk    public void benchmark(View v) {
35376fb2973b988b150ed4b62611dc41c2658eeb892Jason Sams        float t = getBenchmark();
354f6244d1c0c91cd0fcb49abc8c0526eab7fcc1c3bXia Wang        //long javaTime = javaFilter();
355f6244d1c0c91cd0fcb49abc8c0526eab7fcc1c3bXia Wang        //mBenchmarkResult.setText("RS: " + t + " ms  Java: " + javaTime + " ms");
356f6244d1c0c91cd0fcb49abc8c0526eab7fcc1c3bXia Wang        mBenchmarkResult.setText("Result: " + t + " ms");
357b94d69a2267d2660ade79ff5e56ecb00f307c553Jason Sams        Log.v(TAG, "getBenchmark: Renderscript frame time core ms " + t);
358b94d69a2267d2660ade79ff5e56ecb00f307c553Jason Sams    }
359b94d69a2267d2660ade79ff5e56ecb00f307c553Jason Sams
360b94d69a2267d2660ade79ff5e56ecb00f307c553Jason Sams    public void benchmark_all(View v) {
361b94d69a2267d2660ade79ff5e56ecb00f307c553Jason Sams        // write result into a file
362b94d69a2267d2660ade79ff5e56ecb00f307c553Jason Sams        File externalStorage = Environment.getExternalStorageDirectory();
363b94d69a2267d2660ade79ff5e56ecb00f307c553Jason Sams        if (!externalStorage.canWrite()) {
364b94d69a2267d2660ade79ff5e56ecb00f307c553Jason Sams            Log.v(TAG, "sdcard is not writable");
365b94d69a2267d2660ade79ff5e56ecb00f307c553Jason Sams            return;
366b94d69a2267d2660ade79ff5e56ecb00f307c553Jason Sams        }
367b94d69a2267d2660ade79ff5e56ecb00f307c553Jason Sams        File resultFile = new File(externalStorage, RESULT_FILE);
368b94d69a2267d2660ade79ff5e56ecb00f307c553Jason Sams        resultFile.setWritable(true, false);
369b94d69a2267d2660ade79ff5e56ecb00f307c553Jason Sams        try {
370b94d69a2267d2660ade79ff5e56ecb00f307c553Jason Sams            BufferedWriter rsWriter = new BufferedWriter(new FileWriter(resultFile));
371b94d69a2267d2660ade79ff5e56ecb00f307c553Jason Sams            Log.v(TAG, "Saved results in: " + resultFile.getAbsolutePath());
372b94d69a2267d2660ade79ff5e56ecb00f307c553Jason Sams            for (int i = 0; i < mTestNames.length; i++ ) {
373b94d69a2267d2660ade79ff5e56ecb00f307c553Jason Sams                changeTest(i);
374b94d69a2267d2660ade79ff5e56ecb00f307c553Jason Sams                float t = getBenchmark();
375b94d69a2267d2660ade79ff5e56ecb00f307c553Jason Sams                String s = new String("" + mTestNames[i] + ", " + t);
376b94d69a2267d2660ade79ff5e56ecb00f307c553Jason Sams                rsWriter.write(s + "\n");
377b94d69a2267d2660ade79ff5e56ecb00f307c553Jason Sams                Log.v(TAG, "Test " + s + "ms\n");
378b94d69a2267d2660ade79ff5e56ecb00f307c553Jason Sams            }
379b94d69a2267d2660ade79ff5e56ecb00f307c553Jason Sams            rsWriter.close();
380b94d69a2267d2660ade79ff5e56ecb00f307c553Jason Sams        } catch (IOException e) {
381b94d69a2267d2660ade79ff5e56ecb00f307c553Jason Sams            Log.v(TAG, "Unable to write result file " + e.getMessage());
382b94d69a2267d2660ade79ff5e56ecb00f307c553Jason Sams        }
383b94d69a2267d2660ade79ff5e56ecb00f307c553Jason Sams        changeTest(0);
384f6244d1c0c91cd0fcb49abc8c0526eab7fcc1c3bXia Wang    }
385f6244d1c0c91cd0fcb49abc8c0526eab7fcc1c3bXia Wang
386f6244d1c0c91cd0fcb49abc8c0526eab7fcc1c3bXia Wang    // For benchmark test
38776fb2973b988b150ed4b62611dc41c2658eeb892Jason Sams    public float getBenchmark() {
38852541816fb308fcac31e86eb3293c2b28b0999deJason Sams        mDoingBenchmark = true;
389814326b3b945d61ea48d05e32899fb5a036cc2d3Alex Sakhartchouk
39052541816fb308fcac31e86eb3293c2b28b0999deJason Sams        mTest.setupBenchmark();
39152541816fb308fcac31e86eb3293c2b28b0999deJason Sams        long result = 0;
39291e0dc7eb549462f9648856b5750dc82f967be7eJason Sams
393b94d69a2267d2660ade79ff5e56ecb00f307c553Jason Sams        //Log.v(TAG, "Warming");
394761d3d0df785761bb442c64793cc15eafa9171fdJason Sams        long t = java.lang.System.currentTimeMillis() + 250;
39552541816fb308fcac31e86eb3293c2b28b0999deJason Sams        do {
39652541816fb308fcac31e86eb3293c2b28b0999deJason Sams            mTest.runTest();
39752541816fb308fcac31e86eb3293c2b28b0999deJason Sams            mTest.finish();
39852541816fb308fcac31e86eb3293c2b28b0999deJason Sams        } while (t > java.lang.System.currentTimeMillis());
399814326b3b945d61ea48d05e32899fb5a036cc2d3Alex Sakhartchouk
400814326b3b945d61ea48d05e32899fb5a036cc2d3Alex Sakhartchouk
401b94d69a2267d2660ade79ff5e56ecb00f307c553Jason Sams        //Log.v(TAG, "Benchmarking");
402b94d69a2267d2660ade79ff5e56ecb00f307c553Jason Sams        int ct = 0;
40352541816fb308fcac31e86eb3293c2b28b0999deJason Sams        t = java.lang.System.currentTimeMillis();
404b94d69a2267d2660ade79ff5e56ecb00f307c553Jason Sams        do {
40576fb2973b988b150ed4b62611dc41c2658eeb892Jason Sams            mTest.runTest();
406b94d69a2267d2660ade79ff5e56ecb00f307c553Jason Sams            mTest.finish();
407b94d69a2267d2660ade79ff5e56ecb00f307c553Jason Sams            ct++;
408761d3d0df785761bb442c64793cc15eafa9171fdJason Sams        } while ((t+1000) > java.lang.System.currentTimeMillis());
409814326b3b945d61ea48d05e32899fb5a036cc2d3Alex Sakhartchouk        t = java.lang.System.currentTimeMillis() - t;
41076fb2973b988b150ed4b62611dc41c2658eeb892Jason Sams        float ft = (float)t;
411b94d69a2267d2660ade79ff5e56ecb00f307c553Jason Sams        ft /= ct;
41252541816fb308fcac31e86eb3293c2b28b0999deJason Sams
41352541816fb308fcac31e86eb3293c2b28b0999deJason Sams        mTest.exitBenchmark();
41452541816fb308fcac31e86eb3293c2b28b0999deJason Sams        mDoingBenchmark = false;
415814326b3b945d61ea48d05e32899fb5a036cc2d3Alex Sakhartchouk
41676fb2973b988b150ed4b62611dc41c2658eeb892Jason Sams        return ft;
417814326b3b945d61ea48d05e32899fb5a036cc2d3Alex Sakhartchouk    }
418d7fa122dfed376cd9c60eac516e2730acf23f3ddRomain Guy}
419