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