ImageProcessingActivity.java revision 6ab97682fd444586ee135912a4210417a1c8781b
1/*
2 * Copyright (C) 2012 The Android Open Source Project
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 *      http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16
17package com.android.rs.image;
18
19import android.app.Activity;
20import android.os.Bundle;
21import android.graphics.BitmapFactory;
22import android.graphics.Bitmap;
23import android.graphics.Canvas;
24import android.renderscript.ScriptC;
25import android.renderscript.RenderScript;
26import android.renderscript.Type;
27import android.renderscript.Allocation;
28import android.renderscript.Element;
29import android.renderscript.Script;
30import android.view.SurfaceView;
31import android.view.SurfaceHolder;
32import android.widget.AdapterView;
33import android.widget.ArrayAdapter;
34import android.widget.ImageView;
35import android.widget.SeekBar;
36import android.widget.Spinner;
37import android.widget.TextView;
38import android.view.View;
39import android.util.Log;
40import java.lang.Math;
41
42public class ImageProcessingActivity extends Activity
43                                       implements SeekBar.OnSeekBarChangeListener {
44    private final String TAG = "Img";
45    Bitmap mBitmapIn;
46    Bitmap mBitmapOut;
47    String mTestNames[];
48
49    private SeekBar mBar1;
50    private SeekBar mBar2;
51    private SeekBar mBar3;
52    private SeekBar mBar4;
53    private SeekBar mBar5;
54    private TextView mText1;
55    private TextView mText2;
56    private TextView mText3;
57    private TextView mText4;
58    private TextView mText5;
59
60    private float mSaturation = 1.0f;
61
62    private TextView mBenchmarkResult;
63    private Spinner mTestSpinner;
64
65    private SurfaceView mSurfaceView;
66    private ImageView mDisplayView;
67
68    private boolean mDoingBenchmark;
69
70    private TestBase mTest;
71
72
73    public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) {
74        if (fromUser) {
75
76            if (seekBar == mBar1) {
77                mTest.onBar1Changed(progress);
78            } else if (seekBar == mBar2) {
79                mTest.onBar2Changed(progress);
80            } else if (seekBar == mBar3) {
81                mTest.onBar3Changed(progress);
82            } else if (seekBar == mBar4) {
83                mTest.onBar4Changed(progress);
84            } else if (seekBar == mBar5) {
85                mTest.onBar5Changed(progress);
86            }
87
88            mTest.runTest();
89            mTest.updateBitmap(mBitmapOut);
90            mDisplayView.invalidate();
91        }
92    }
93
94    public void onStartTrackingTouch(SeekBar seekBar) {
95    }
96
97    public void onStopTrackingTouch(SeekBar seekBar) {
98    }
99
100    void setupBars() {
101        mBar1.setVisibility(View.VISIBLE);
102        mText1.setVisibility(View.VISIBLE);
103        mTest.onBar1Setup(mBar1, mText1);
104
105        mBar2.setVisibility(View.VISIBLE);
106        mText2.setVisibility(View.VISIBLE);
107        mTest.onBar2Setup(mBar2, mText2);
108
109        mBar3.setVisibility(View.VISIBLE);
110        mText3.setVisibility(View.VISIBLE);
111        mTest.onBar3Setup(mBar3, mText3);
112
113        mBar4.setVisibility(View.VISIBLE);
114        mText4.setVisibility(View.VISIBLE);
115        mTest.onBar4Setup(mBar4, mText4);
116
117        mBar5.setVisibility(View.VISIBLE);
118        mText5.setVisibility(View.VISIBLE);
119        mTest.onBar5Setup(mBar5, mText5);
120    }
121
122
123    void changeTest(int testID) {
124        switch(testID) {
125        case 0:
126            mTest = new LevelsV4(false, false);
127            break;
128        case 1:
129            mTest = new LevelsV4(false, true);
130            break;
131        case 2:
132            mTest = new LevelsV4(true, false);
133            break;
134        case 3:
135            mTest = new LevelsV4(true, true);
136            break;
137        case 4:
138            mTest = new Blur25();
139            break;
140        case 5:
141            mTest = new Greyscale();
142            break;
143        case 6:
144            mTest = new Grain();
145            break;
146        case 7:
147            mTest = new Fisheye(false);
148            break;
149        case 8:
150            mTest = new Fisheye(true);
151            break;
152        case 9:
153            mTest = new Vignette(false, false);
154            break;
155        case 10:
156            mTest = new Vignette(false, true);
157            break;
158        case 11:
159            mTest = new Vignette(true, false);
160            break;
161        case 12:
162            mTest = new Vignette(true, true);
163            break;
164        case 13:
165            mTest = new GroupTest(true);
166            break;
167        case 14:
168            mTest = new GroupTest(false);
169            break;
170        case 15:
171            mTest = new Intrinsics(0);
172            break;
173        }
174
175        mTest.createBaseTest(this, mBitmapIn);
176        setupBars();
177
178        mTest.runTest();
179        mTest.updateBitmap(mBitmapOut);
180        mDisplayView.invalidate();
181        mBenchmarkResult.setText("Result: not run");
182    }
183
184    void setupTests() {
185        mTestNames = new String[16];
186        mTestNames[0] = "Levels Vec3 Relaxed";
187        mTestNames[1] = "Levels Vec4 Relaxed";
188        mTestNames[2] = "Levels Vec3 Full";
189        mTestNames[3] = "Levels Vec4 Full";
190        mTestNames[4] = "Blur radius 25";
191        mTestNames[5] = "Greyscale";
192        mTestNames[6] = "Grain";
193        mTestNames[7] = "Fisheye Full";
194        mTestNames[8] = "Fisheye Relaxed";
195        mTestNames[9] = "Vignette Full";
196        mTestNames[10] = "Vignette Relaxed";
197        mTestNames[11] = "Vignette Approximate Full";
198        mTestNames[12] = "Vignette Approximate Relaxed";
199        mTestNames[13] = "Group Test (emulated)";
200        mTestNames[14] = "Group Test (native)";
201        mTestNames[15] = "Intrinsics Convolve 3x3";
202        mTestSpinner.setAdapter(new ArrayAdapter<String>(
203            this, R.layout.spinner_layout, mTestNames));
204    }
205
206    private AdapterView.OnItemSelectedListener mTestSpinnerListener =
207            new AdapterView.OnItemSelectedListener() {
208                public void onItemSelected(AdapterView<?> parent, View view, int pos, long id) {
209                    changeTest(pos);
210                }
211
212                public void onNothingSelected(AdapterView parent) {
213
214                }
215            };
216
217    @Override
218    protected void onCreate(Bundle savedInstanceState) {
219        super.onCreate(savedInstanceState);
220        setContentView(R.layout.main);
221
222        mBitmapIn = loadBitmap(R.drawable.city);
223        mBitmapOut = loadBitmap(R.drawable.city);
224
225        mSurfaceView = (SurfaceView) findViewById(R.id.surface);
226
227        mDisplayView = (ImageView) findViewById(R.id.display);
228        mDisplayView.setImageBitmap(mBitmapOut);
229
230        mBar1 = (SeekBar) findViewById(R.id.slider1);
231        mBar2 = (SeekBar) findViewById(R.id.slider2);
232        mBar3 = (SeekBar) findViewById(R.id.slider3);
233        mBar4 = (SeekBar) findViewById(R.id.slider4);
234        mBar5 = (SeekBar) findViewById(R.id.slider5);
235
236        mBar1.setOnSeekBarChangeListener(this);
237        mBar2.setOnSeekBarChangeListener(this);
238        mBar3.setOnSeekBarChangeListener(this);
239        mBar4.setOnSeekBarChangeListener(this);
240        mBar5.setOnSeekBarChangeListener(this);
241
242        mText1 = (TextView) findViewById(R.id.slider1Text);
243        mText2 = (TextView) findViewById(R.id.slider2Text);
244        mText3 = (TextView) findViewById(R.id.slider3Text);
245        mText4 = (TextView) findViewById(R.id.slider4Text);
246        mText5 = (TextView) findViewById(R.id.slider5Text);
247
248        mTestSpinner = (Spinner) findViewById(R.id.filterselection);
249        mTestSpinner.setOnItemSelectedListener(mTestSpinnerListener);
250
251        mBenchmarkResult = (TextView) findViewById(R.id.benchmarkText);
252        mBenchmarkResult.setText("Result: not run");
253
254        setupTests();
255        changeTest(0);
256    }
257
258
259    private Bitmap loadBitmap(int resource) {
260        final BitmapFactory.Options options = new BitmapFactory.Options();
261        options.inPreferredConfig = Bitmap.Config.ARGB_8888;
262        return copyBitmap(BitmapFactory.decodeResource(getResources(), resource, options));
263    }
264
265    private static Bitmap copyBitmap(Bitmap source) {
266        Bitmap b = Bitmap.createBitmap(source.getWidth(), source.getHeight(), source.getConfig());
267        Canvas c = new Canvas(b);
268        c.drawBitmap(source, 0, 0, null);
269        source.recycle();
270        return b;
271    }
272
273    // button hook
274    public void benchmark(View v) {
275        long t = getBenchmark();
276        //long javaTime = javaFilter();
277        //mBenchmarkResult.setText("RS: " + t + " ms  Java: " + javaTime + " ms");
278        mBenchmarkResult.setText("Result: " + t + " ms");
279    }
280
281    // For benchmark test
282    public long getBenchmark() {
283        mDoingBenchmark = true;
284
285        mTest.setupBenchmark();
286        long result = 0;
287
288        Log.v(TAG, "Warming");
289        long t = java.lang.System.currentTimeMillis() + 2000;
290        do {
291            mTest.runTest();
292            mTest.finish();
293        } while (t > java.lang.System.currentTimeMillis());
294
295
296        Log.v(TAG, "Benchmarking");
297        t = java.lang.System.currentTimeMillis();
298        mTest.runTest();
299        mTest.finish();
300        t = java.lang.System.currentTimeMillis() - t;
301
302        Log.v(TAG, "getBenchmark: Renderscript frame time core ms " + t);
303        mTest.exitBenchmark();
304        mDoingBenchmark = false;
305
306        return t;
307    }
308}
309