1d7fa122dfed376cd9c60eac516e2730acf23f3ddRomain Guy/* 2d7fa122dfed376cd9c60eac516e2730acf23f3ddRomain Guy * Copyright (C) 2009 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; 32d7fa122dfed376cd9c60eac516e2730acf23f3ddRomain Guyimport android.widget.ImageView; 33d7fa122dfed376cd9c60eac516e2730acf23f3ddRomain Guyimport android.widget.SeekBar; 34814326b3b945d61ea48d05e32899fb5a036cc2d3Alex Sakhartchoukimport android.widget.TextView; 35814326b3b945d61ea48d05e32899fb5a036cc2d3Alex Sakhartchoukimport android.view.View; 36f6244d1c0c91cd0fcb49abc8c0526eab7fcc1c3bXia Wangimport android.util.Log; 37586f3b5d32c0464a4e69c92f89865eea672ab665Jason Samsimport java.lang.Math; 38d7fa122dfed376cd9c60eac516e2730acf23f3ddRomain Guy 39814326b3b945d61ea48d05e32899fb5a036cc2d3Alex Sakhartchoukpublic class ImageProcessingActivity extends Activity 40814326b3b945d61ea48d05e32899fb5a036cc2d3Alex Sakhartchouk implements SurfaceHolder.Callback, 41814326b3b945d61ea48d05e32899fb5a036cc2d3Alex Sakhartchouk SeekBar.OnSeekBarChangeListener { 42f6244d1c0c91cd0fcb49abc8c0526eab7fcc1c3bXia Wang private final String TAG = "Img"; 434d3399337d18ef04116bc8a2e5799274655d0c30Jason Sams private Bitmap mBitmapIn; 444d3399337d18ef04116bc8a2e5799274655d0c30Jason Sams private Bitmap mBitmapOut; 4593a958f0958b852c0a2c7b940c74eeae283ba02bStephen Hines private ScriptC_threshold mScript; 4693a958f0958b852c0a2c7b940c74eeae283ba02bStephen Hines private ScriptC_vertical_blur mScriptVBlur; 4793a958f0958b852c0a2c7b940c74eeae283ba02bStephen Hines private ScriptC_horizontal_blur mScriptHBlur; 48814326b3b945d61ea48d05e32899fb5a036cc2d3Alex Sakhartchouk private int mRadius = 0; 49814326b3b945d61ea48d05e32899fb5a036cc2d3Alex Sakhartchouk private SeekBar mRadiusSeekBar; 50814326b3b945d61ea48d05e32899fb5a036cc2d3Alex Sakhartchouk 51814326b3b945d61ea48d05e32899fb5a036cc2d3Alex Sakhartchouk private float mInBlack = 0.0f; 52814326b3b945d61ea48d05e32899fb5a036cc2d3Alex Sakhartchouk private SeekBar mInBlackSeekBar; 53814326b3b945d61ea48d05e32899fb5a036cc2d3Alex Sakhartchouk private float mOutBlack = 0.0f; 54814326b3b945d61ea48d05e32899fb5a036cc2d3Alex Sakhartchouk private SeekBar mOutBlackSeekBar; 55814326b3b945d61ea48d05e32899fb5a036cc2d3Alex Sakhartchouk private float mInWhite = 255.0f; 56814326b3b945d61ea48d05e32899fb5a036cc2d3Alex Sakhartchouk private SeekBar mInWhiteSeekBar; 57814326b3b945d61ea48d05e32899fb5a036cc2d3Alex Sakhartchouk private float mOutWhite = 255.0f; 58814326b3b945d61ea48d05e32899fb5a036cc2d3Alex Sakhartchouk private SeekBar mOutWhiteSeekBar; 59814326b3b945d61ea48d05e32899fb5a036cc2d3Alex Sakhartchouk private float mGamma = 1.0f; 60814326b3b945d61ea48d05e32899fb5a036cc2d3Alex Sakhartchouk private SeekBar mGammaSeekBar; 61814326b3b945d61ea48d05e32899fb5a036cc2d3Alex Sakhartchouk 62814326b3b945d61ea48d05e32899fb5a036cc2d3Alex Sakhartchouk private float mSaturation = 1.0f; 63814326b3b945d61ea48d05e32899fb5a036cc2d3Alex Sakhartchouk private SeekBar mSaturationSeekBar; 64814326b3b945d61ea48d05e32899fb5a036cc2d3Alex Sakhartchouk 65814326b3b945d61ea48d05e32899fb5a036cc2d3Alex Sakhartchouk private TextView mBenchmarkResult; 66d7fa122dfed376cd9c60eac516e2730acf23f3ddRomain Guy 67d7fa122dfed376cd9c60eac516e2730acf23f3ddRomain Guy @SuppressWarnings({"FieldCanBeLocal"}) 68d7fa122dfed376cd9c60eac516e2730acf23f3ddRomain Guy private RenderScript mRS; 69d7fa122dfed376cd9c60eac516e2730acf23f3ddRomain Guy @SuppressWarnings({"FieldCanBeLocal"}) 70d7fa122dfed376cd9c60eac516e2730acf23f3ddRomain Guy private Type mPixelType; 71d7fa122dfed376cd9c60eac516e2730acf23f3ddRomain Guy @SuppressWarnings({"FieldCanBeLocal"}) 72d7fa122dfed376cd9c60eac516e2730acf23f3ddRomain Guy private Allocation mInPixelsAllocation; 73d7fa122dfed376cd9c60eac516e2730acf23f3ddRomain Guy @SuppressWarnings({"FieldCanBeLocal"}) 74d7fa122dfed376cd9c60eac516e2730acf23f3ddRomain Guy private Allocation mOutPixelsAllocation; 75814326b3b945d61ea48d05e32899fb5a036cc2d3Alex Sakhartchouk @SuppressWarnings({"FieldCanBeLocal"}) 7643c31421b4ce1cdff7c26c988bfe5e1bff64ce23Jason Sams private Allocation mScratchPixelsAllocation1; 7743c31421b4ce1cdff7c26c988bfe5e1bff64ce23Jason Sams private Allocation mScratchPixelsAllocation2; 78d7fa122dfed376cd9c60eac516e2730acf23f3ddRomain Guy 79d7fa122dfed376cd9c60eac516e2730acf23f3ddRomain Guy private SurfaceView mSurfaceView; 80d7fa122dfed376cd9c60eac516e2730acf23f3ddRomain Guy private ImageView mDisplayView; 81d7fa122dfed376cd9c60eac516e2730acf23f3ddRomain Guy 82abf2b931ff173a04cc171592e25a6fa6a81a606dAlex Sakhartchouk private boolean mIsProcessing; 83abf2b931ff173a04cc171592e25a6fa6a81a606dAlex Sakhartchouk 84bf6ef8d78fffbce6c1849a4a28fb3f4401ad039eJason Sams class FilterCallback extends RenderScript.RSMessageHandler { 85d7fa122dfed376cd9c60eac516e2730acf23f3ddRomain Guy private Runnable mAction = new Runnable() { 86d7fa122dfed376cd9c60eac516e2730acf23f3ddRomain Guy public void run() { 87abf2b931ff173a04cc171592e25a6fa6a81a606dAlex Sakhartchouk 88abf2b931ff173a04cc171592e25a6fa6a81a606dAlex Sakhartchouk synchronized (mDisplayView) { 89abf2b931ff173a04cc171592e25a6fa6a81a606dAlex Sakhartchouk mIsProcessing = false; 90abf2b931ff173a04cc171592e25a6fa6a81a606dAlex Sakhartchouk } 91abf2b931ff173a04cc171592e25a6fa6a81a606dAlex Sakhartchouk 92abf2b931ff173a04cc171592e25a6fa6a81a606dAlex Sakhartchouk mOutPixelsAllocation.copyTo(mBitmapOut); 93d7fa122dfed376cd9c60eac516e2730acf23f3ddRomain Guy mDisplayView.invalidate(); 94d7fa122dfed376cd9c60eac516e2730acf23f3ddRomain Guy } 95718cd1f322ee5b62b6a49cb36195bcb18a5ab711Jason Sams }; 96d7fa122dfed376cd9c60eac516e2730acf23f3ddRomain Guy 97d7fa122dfed376cd9c60eac516e2730acf23f3ddRomain Guy @Override 98d7fa122dfed376cd9c60eac516e2730acf23f3ddRomain Guy public void run() { 99d7fa122dfed376cd9c60eac516e2730acf23f3ddRomain Guy mSurfaceView.removeCallbacks(mAction); 100d7fa122dfed376cd9c60eac516e2730acf23f3ddRomain Guy mSurfaceView.post(mAction); 101d7fa122dfed376cd9c60eac516e2730acf23f3ddRomain Guy } 102d7fa122dfed376cd9c60eac516e2730acf23f3ddRomain Guy } 103d7fa122dfed376cd9c60eac516e2730acf23f3ddRomain Guy 1044d3399337d18ef04116bc8a2e5799274655d0c30Jason Sams int in[]; 105814326b3b945d61ea48d05e32899fb5a036cc2d3Alex Sakhartchouk int interm[]; 1064d3399337d18ef04116bc8a2e5799274655d0c30Jason Sams int out[]; 107814326b3b945d61ea48d05e32899fb5a036cc2d3Alex Sakhartchouk int MAX_RADIUS = 25; 108814326b3b945d61ea48d05e32899fb5a036cc2d3Alex Sakhartchouk // Store our coefficients here 109814326b3b945d61ea48d05e32899fb5a036cc2d3Alex Sakhartchouk float gaussian[]; 110814326b3b945d61ea48d05e32899fb5a036cc2d3Alex Sakhartchouk 111814326b3b945d61ea48d05e32899fb5a036cc2d3Alex Sakhartchouk public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) { 112814326b3b945d61ea48d05e32899fb5a036cc2d3Alex Sakhartchouk if (fromUser) { 113814326b3b945d61ea48d05e32899fb5a036cc2d3Alex Sakhartchouk 114ed9f210568082dd6d1d8a0c92c693d574d87d545Alex Sakhartchouk if (seekBar == mRadiusSeekBar) { 115814326b3b945d61ea48d05e32899fb5a036cc2d3Alex Sakhartchouk float fRadius = progress / 100.0f; 116814326b3b945d61ea48d05e32899fb5a036cc2d3Alex Sakhartchouk fRadius *= (float)(MAX_RADIUS); 117814326b3b945d61ea48d05e32899fb5a036cc2d3Alex Sakhartchouk mRadius = (int)fRadius; 118814326b3b945d61ea48d05e32899fb5a036cc2d3Alex Sakhartchouk 119814326b3b945d61ea48d05e32899fb5a036cc2d3Alex Sakhartchouk mScript.set_radius(mRadius); 120ed9f210568082dd6d1d8a0c92c693d574d87d545Alex Sakhartchouk } else if (seekBar == mInBlackSeekBar) { 121814326b3b945d61ea48d05e32899fb5a036cc2d3Alex Sakhartchouk mInBlack = (float)progress; 12243c31421b4ce1cdff7c26c988bfe5e1bff64ce23Jason Sams mScriptVBlur.invoke_setLevels(mInBlack, mOutBlack, mInWhite, mOutWhite); 123ed9f210568082dd6d1d8a0c92c693d574d87d545Alex Sakhartchouk } else if (seekBar == mOutBlackSeekBar) { 124814326b3b945d61ea48d05e32899fb5a036cc2d3Alex Sakhartchouk mOutBlack = (float)progress; 12543c31421b4ce1cdff7c26c988bfe5e1bff64ce23Jason Sams mScriptVBlur.invoke_setLevels(mInBlack, mOutBlack, mInWhite, mOutWhite); 126ed9f210568082dd6d1d8a0c92c693d574d87d545Alex Sakhartchouk } else if (seekBar == mInWhiteSeekBar) { 127814326b3b945d61ea48d05e32899fb5a036cc2d3Alex Sakhartchouk mInWhite = (float)progress + 127.0f; 12843c31421b4ce1cdff7c26c988bfe5e1bff64ce23Jason Sams mScriptVBlur.invoke_setLevels(mInBlack, mOutBlack, mInWhite, mOutWhite); 129ed9f210568082dd6d1d8a0c92c693d574d87d545Alex Sakhartchouk } else if (seekBar == mOutWhiteSeekBar) { 130814326b3b945d61ea48d05e32899fb5a036cc2d3Alex Sakhartchouk mOutWhite = (float)progress + 127.0f; 13143c31421b4ce1cdff7c26c988bfe5e1bff64ce23Jason Sams mScriptVBlur.invoke_setLevels(mInBlack, mOutBlack, mInWhite, mOutWhite); 132ed9f210568082dd6d1d8a0c92c693d574d87d545Alex Sakhartchouk } else if (seekBar == mGammaSeekBar) { 133814326b3b945d61ea48d05e32899fb5a036cc2d3Alex Sakhartchouk mGamma = (float)progress/100.0f; 134814326b3b945d61ea48d05e32899fb5a036cc2d3Alex Sakhartchouk mGamma = Math.max(mGamma, 0.1f); 135814326b3b945d61ea48d05e32899fb5a036cc2d3Alex Sakhartchouk mGamma = 1.0f / mGamma; 13643c31421b4ce1cdff7c26c988bfe5e1bff64ce23Jason Sams mScriptVBlur.invoke_setGamma(mGamma); 137ed9f210568082dd6d1d8a0c92c693d574d87d545Alex Sakhartchouk } else if (seekBar == mSaturationSeekBar) { 138814326b3b945d61ea48d05e32899fb5a036cc2d3Alex Sakhartchouk mSaturation = (float)progress / 50.0f; 13943c31421b4ce1cdff7c26c988bfe5e1bff64ce23Jason Sams mScriptVBlur.invoke_setSaturation(mSaturation); 140814326b3b945d61ea48d05e32899fb5a036cc2d3Alex Sakhartchouk } 141814326b3b945d61ea48d05e32899fb5a036cc2d3Alex Sakhartchouk 142abf2b931ff173a04cc171592e25a6fa6a81a606dAlex Sakhartchouk synchronized (mDisplayView) { 143abf2b931ff173a04cc171592e25a6fa6a81a606dAlex Sakhartchouk if (mIsProcessing) { 144abf2b931ff173a04cc171592e25a6fa6a81a606dAlex Sakhartchouk return; 145abf2b931ff173a04cc171592e25a6fa6a81a606dAlex Sakhartchouk } 146abf2b931ff173a04cc171592e25a6fa6a81a606dAlex Sakhartchouk mIsProcessing = true; 147586f3b5d32c0464a4e69c92f89865eea672ab665Jason Sams } 148814326b3b945d61ea48d05e32899fb5a036cc2d3Alex Sakhartchouk 149abf2b931ff173a04cc171592e25a6fa6a81a606dAlex Sakhartchouk mScript.invoke_filter(); 150586f3b5d32c0464a4e69c92f89865eea672ab665Jason Sams } 151814326b3b945d61ea48d05e32899fb5a036cc2d3Alex Sakhartchouk } 152814326b3b945d61ea48d05e32899fb5a036cc2d3Alex Sakhartchouk 153814326b3b945d61ea48d05e32899fb5a036cc2d3Alex Sakhartchouk public void onStartTrackingTouch(SeekBar seekBar) { 154814326b3b945d61ea48d05e32899fb5a036cc2d3Alex Sakhartchouk } 155814326b3b945d61ea48d05e32899fb5a036cc2d3Alex Sakhartchouk 156814326b3b945d61ea48d05e32899fb5a036cc2d3Alex Sakhartchouk public void onStopTrackingTouch(SeekBar seekBar) { 157586f3b5d32c0464a4e69c92f89865eea672ab665Jason Sams } 158586f3b5d32c0464a4e69c92f89865eea672ab665Jason Sams 159d7fa122dfed376cd9c60eac516e2730acf23f3ddRomain Guy @Override 160d7fa122dfed376cd9c60eac516e2730acf23f3ddRomain Guy protected void onCreate(Bundle savedInstanceState) { 161d7fa122dfed376cd9c60eac516e2730acf23f3ddRomain Guy super.onCreate(savedInstanceState); 162d7fa122dfed376cd9c60eac516e2730acf23f3ddRomain Guy setContentView(R.layout.main); 163d7fa122dfed376cd9c60eac516e2730acf23f3ddRomain Guy 164abf2b931ff173a04cc171592e25a6fa6a81a606dAlex Sakhartchouk mBitmapIn = loadBitmap(R.drawable.city); 165abf2b931ff173a04cc171592e25a6fa6a81a606dAlex Sakhartchouk mBitmapOut = loadBitmap(R.drawable.city); 166d7fa122dfed376cd9c60eac516e2730acf23f3ddRomain Guy 167d7fa122dfed376cd9c60eac516e2730acf23f3ddRomain Guy mSurfaceView = (SurfaceView) findViewById(R.id.surface); 168d7fa122dfed376cd9c60eac516e2730acf23f3ddRomain Guy mSurfaceView.getHolder().addCallback(this); 169d7fa122dfed376cd9c60eac516e2730acf23f3ddRomain Guy 170d7fa122dfed376cd9c60eac516e2730acf23f3ddRomain Guy mDisplayView = (ImageView) findViewById(R.id.display); 1714d3399337d18ef04116bc8a2e5799274655d0c30Jason Sams mDisplayView.setImageBitmap(mBitmapOut); 172d7fa122dfed376cd9c60eac516e2730acf23f3ddRomain Guy 173814326b3b945d61ea48d05e32899fb5a036cc2d3Alex Sakhartchouk mRadiusSeekBar = (SeekBar) findViewById(R.id.radius); 174814326b3b945d61ea48d05e32899fb5a036cc2d3Alex Sakhartchouk mRadiusSeekBar.setOnSeekBarChangeListener(this); 175d7fa122dfed376cd9c60eac516e2730acf23f3ddRomain Guy 176814326b3b945d61ea48d05e32899fb5a036cc2d3Alex Sakhartchouk mInBlackSeekBar = (SeekBar)findViewById(R.id.inBlack); 177814326b3b945d61ea48d05e32899fb5a036cc2d3Alex Sakhartchouk mInBlackSeekBar.setOnSeekBarChangeListener(this); 178814326b3b945d61ea48d05e32899fb5a036cc2d3Alex Sakhartchouk mInBlackSeekBar.setMax(128); 179814326b3b945d61ea48d05e32899fb5a036cc2d3Alex Sakhartchouk mInBlackSeekBar.setProgress(0); 180814326b3b945d61ea48d05e32899fb5a036cc2d3Alex Sakhartchouk mOutBlackSeekBar = (SeekBar)findViewById(R.id.outBlack); 181814326b3b945d61ea48d05e32899fb5a036cc2d3Alex Sakhartchouk mOutBlackSeekBar.setOnSeekBarChangeListener(this); 182814326b3b945d61ea48d05e32899fb5a036cc2d3Alex Sakhartchouk mOutBlackSeekBar.setMax(128); 183814326b3b945d61ea48d05e32899fb5a036cc2d3Alex Sakhartchouk mOutBlackSeekBar.setProgress(0); 184d7fa122dfed376cd9c60eac516e2730acf23f3ddRomain Guy 185814326b3b945d61ea48d05e32899fb5a036cc2d3Alex Sakhartchouk mInWhiteSeekBar = (SeekBar)findViewById(R.id.inWhite); 186814326b3b945d61ea48d05e32899fb5a036cc2d3Alex Sakhartchouk mInWhiteSeekBar.setOnSeekBarChangeListener(this); 187814326b3b945d61ea48d05e32899fb5a036cc2d3Alex Sakhartchouk mInWhiteSeekBar.setMax(128); 188814326b3b945d61ea48d05e32899fb5a036cc2d3Alex Sakhartchouk mInWhiteSeekBar.setProgress(128); 189814326b3b945d61ea48d05e32899fb5a036cc2d3Alex Sakhartchouk mOutWhiteSeekBar = (SeekBar)findViewById(R.id.outWhite); 190814326b3b945d61ea48d05e32899fb5a036cc2d3Alex Sakhartchouk mOutWhiteSeekBar.setOnSeekBarChangeListener(this); 191814326b3b945d61ea48d05e32899fb5a036cc2d3Alex Sakhartchouk mOutWhiteSeekBar.setMax(128); 192814326b3b945d61ea48d05e32899fb5a036cc2d3Alex Sakhartchouk mOutWhiteSeekBar.setProgress(128); 193814326b3b945d61ea48d05e32899fb5a036cc2d3Alex Sakhartchouk 194814326b3b945d61ea48d05e32899fb5a036cc2d3Alex Sakhartchouk mGammaSeekBar = (SeekBar)findViewById(R.id.inGamma); 195814326b3b945d61ea48d05e32899fb5a036cc2d3Alex Sakhartchouk mGammaSeekBar.setOnSeekBarChangeListener(this); 196814326b3b945d61ea48d05e32899fb5a036cc2d3Alex Sakhartchouk mGammaSeekBar.setMax(150); 197814326b3b945d61ea48d05e32899fb5a036cc2d3Alex Sakhartchouk mGammaSeekBar.setProgress(100); 198814326b3b945d61ea48d05e32899fb5a036cc2d3Alex Sakhartchouk 199814326b3b945d61ea48d05e32899fb5a036cc2d3Alex Sakhartchouk mSaturationSeekBar = (SeekBar)findViewById(R.id.inSaturation); 200814326b3b945d61ea48d05e32899fb5a036cc2d3Alex Sakhartchouk mSaturationSeekBar.setOnSeekBarChangeListener(this); 201814326b3b945d61ea48d05e32899fb5a036cc2d3Alex Sakhartchouk mSaturationSeekBar.setProgress(50); 202814326b3b945d61ea48d05e32899fb5a036cc2d3Alex Sakhartchouk 203814326b3b945d61ea48d05e32899fb5a036cc2d3Alex Sakhartchouk mBenchmarkResult = (TextView) findViewById(R.id.benchmarkText); 204db217e0f02d6e719838576a54de9b7c59fa153feAlex Sakhartchouk mBenchmarkResult.setText("Result: not run"); 205d7fa122dfed376cd9c60eac516e2730acf23f3ddRomain Guy } 206d7fa122dfed376cd9c60eac516e2730acf23f3ddRomain Guy 207d7fa122dfed376cd9c60eac516e2730acf23f3ddRomain Guy public void surfaceCreated(SurfaceHolder holder) { 2084d3399337d18ef04116bc8a2e5799274655d0c30Jason Sams createScript(); 209f110d4b787b91dabe968a812e76e5c1f8d953487Jason Sams mScript.invoke_filter(); 2104ef6650bd05a39a09958ea1db92f120ea4949cb1Jason Sams mOutPixelsAllocation.copyTo(mBitmapOut); 211d7fa122dfed376cd9c60eac516e2730acf23f3ddRomain Guy } 212d7fa122dfed376cd9c60eac516e2730acf23f3ddRomain Guy 213d7fa122dfed376cd9c60eac516e2730acf23f3ddRomain Guy public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) { 214d7fa122dfed376cd9c60eac516e2730acf23f3ddRomain Guy } 215d7fa122dfed376cd9c60eac516e2730acf23f3ddRomain Guy 216d7fa122dfed376cd9c60eac516e2730acf23f3ddRomain Guy public void surfaceDestroyed(SurfaceHolder holder) { 217d7fa122dfed376cd9c60eac516e2730acf23f3ddRomain Guy } 218718cd1f322ee5b62b6a49cb36195bcb18a5ab711Jason Sams 2194d3399337d18ef04116bc8a2e5799274655d0c30Jason Sams private void createScript() { 2206b32fab1dbfd8bc1cc176557fe0a7b2ebd4966bdShih-wei Liao mRS = RenderScript.create(this); 221bf6ef8d78fffbce6c1849a4a28fb3f4401ad039eJason Sams mRS.setMessageHandler(new FilterCallback()); 222d7fa122dfed376cd9c60eac516e2730acf23f3ddRomain Guy 2234ef6650bd05a39a09958ea1db92f120ea4949cb1Jason Sams mInPixelsAllocation = Allocation.createFromBitmap(mRS, mBitmapIn, 2244ef6650bd05a39a09958ea1db92f120ea4949cb1Jason Sams Allocation.MipmapControl.MIPMAP_NONE, 2254ef6650bd05a39a09958ea1db92f120ea4949cb1Jason Sams Allocation.USAGE_SCRIPT); 2264ef6650bd05a39a09958ea1db92f120ea4949cb1Jason Sams mOutPixelsAllocation = Allocation.createFromBitmap(mRS, mBitmapOut, 2274ef6650bd05a39a09958ea1db92f120ea4949cb1Jason Sams Allocation.MipmapControl.MIPMAP_NONE, 2284ef6650bd05a39a09958ea1db92f120ea4949cb1Jason Sams Allocation.USAGE_SCRIPT); 22943c31421b4ce1cdff7c26c988bfe5e1bff64ce23Jason Sams 23043c31421b4ce1cdff7c26c988bfe5e1bff64ce23Jason Sams Type.Builder tb = new Type.Builder(mRS, Element.F32_4(mRS)); 231bf6ef8d78fffbce6c1849a4a28fb3f4401ad039eJason Sams tb.setX(mBitmapIn.getWidth()); 232bf6ef8d78fffbce6c1849a4a28fb3f4401ad039eJason Sams tb.setY(mBitmapIn.getHeight()); 23343c31421b4ce1cdff7c26c988bfe5e1bff64ce23Jason Sams mScratchPixelsAllocation1 = Allocation.createTyped(mRS, tb.create()); 23443c31421b4ce1cdff7c26c988bfe5e1bff64ce23Jason Sams mScratchPixelsAllocation2 = Allocation.createTyped(mRS, tb.create()); 235d7fa122dfed376cd9c60eac516e2730acf23f3ddRomain Guy 2363ba02b3d2f6fb49677466a2e93c96f307d2a7a41Jason Sams mScriptVBlur = new ScriptC_vertical_blur(mRS, getResources(), R.raw.vertical_blur); 2373ba02b3d2f6fb49677466a2e93c96f307d2a7a41Jason Sams mScriptHBlur = new ScriptC_horizontal_blur(mRS, getResources(), R.raw.horizontal_blur); 2388f8a5724bee0f958ef81a7154e4fd40fb6f07a49Jason Sams 2393ba02b3d2f6fb49677466a2e93c96f307d2a7a41Jason Sams mScript = new ScriptC_threshold(mRS, getResources(), R.raw.threshold); 2404d3399337d18ef04116bc8a2e5799274655d0c30Jason Sams mScript.set_width(mBitmapIn.getWidth()); 2414d3399337d18ef04116bc8a2e5799274655d0c30Jason Sams mScript.set_height(mBitmapIn.getHeight()); 242814326b3b945d61ea48d05e32899fb5a036cc2d3Alex Sakhartchouk mScript.set_radius(mRadius); 243814326b3b945d61ea48d05e32899fb5a036cc2d3Alex Sakhartchouk 24443c31421b4ce1cdff7c26c988bfe5e1bff64ce23Jason Sams mScriptVBlur.invoke_setLevels(mInBlack, mOutBlack, mInWhite, mOutWhite); 24543c31421b4ce1cdff7c26c988bfe5e1bff64ce23Jason Sams mScriptVBlur.invoke_setGamma(mGamma); 24643c31421b4ce1cdff7c26c988bfe5e1bff64ce23Jason Sams mScriptVBlur.invoke_setSaturation(mSaturation); 247814326b3b945d61ea48d05e32899fb5a036cc2d3Alex Sakhartchouk 2484d3399337d18ef04116bc8a2e5799274655d0c30Jason Sams mScript.bind_InPixel(mInPixelsAllocation); 2494d3399337d18ef04116bc8a2e5799274655d0c30Jason Sams mScript.bind_OutPixel(mOutPixelsAllocation); 25043c31421b4ce1cdff7c26c988bfe5e1bff64ce23Jason Sams mScript.bind_ScratchPixel1(mScratchPixelsAllocation1); 25143c31421b4ce1cdff7c26c988bfe5e1bff64ce23Jason Sams mScript.bind_ScratchPixel2(mScratchPixelsAllocation2); 2528f8a5724bee0f958ef81a7154e4fd40fb6f07a49Jason Sams 2538f8a5724bee0f958ef81a7154e4fd40fb6f07a49Jason Sams mScript.set_vBlurScript(mScriptVBlur); 2548f8a5724bee0f958ef81a7154e4fd40fb6f07a49Jason Sams mScript.set_hBlurScript(mScriptHBlur); 255d7fa122dfed376cd9c60eac516e2730acf23f3ddRomain Guy } 256d7fa122dfed376cd9c60eac516e2730acf23f3ddRomain Guy 257d7fa122dfed376cd9c60eac516e2730acf23f3ddRomain Guy private Bitmap loadBitmap(int resource) { 258d7fa122dfed376cd9c60eac516e2730acf23f3ddRomain Guy final BitmapFactory.Options options = new BitmapFactory.Options(); 259d7fa122dfed376cd9c60eac516e2730acf23f3ddRomain Guy options.inPreferredConfig = Bitmap.Config.ARGB_8888; 260d7fa122dfed376cd9c60eac516e2730acf23f3ddRomain Guy return copyBitmap(BitmapFactory.decodeResource(getResources(), resource, options)); 261d7fa122dfed376cd9c60eac516e2730acf23f3ddRomain Guy } 262d7fa122dfed376cd9c60eac516e2730acf23f3ddRomain Guy 263d7fa122dfed376cd9c60eac516e2730acf23f3ddRomain Guy private static Bitmap copyBitmap(Bitmap source) { 264d7fa122dfed376cd9c60eac516e2730acf23f3ddRomain Guy Bitmap b = Bitmap.createBitmap(source.getWidth(), source.getHeight(), source.getConfig()); 265d7fa122dfed376cd9c60eac516e2730acf23f3ddRomain Guy Canvas c = new Canvas(b); 266d7fa122dfed376cd9c60eac516e2730acf23f3ddRomain Guy c.drawBitmap(source, 0, 0, null); 267d7fa122dfed376cd9c60eac516e2730acf23f3ddRomain Guy source.recycle(); 268d7fa122dfed376cd9c60eac516e2730acf23f3ddRomain Guy return b; 269d7fa122dfed376cd9c60eac516e2730acf23f3ddRomain Guy } 270814326b3b945d61ea48d05e32899fb5a036cc2d3Alex Sakhartchouk 271814326b3b945d61ea48d05e32899fb5a036cc2d3Alex Sakhartchouk // button hook 272814326b3b945d61ea48d05e32899fb5a036cc2d3Alex Sakhartchouk public void benchmark(View v) { 273f6244d1c0c91cd0fcb49abc8c0526eab7fcc1c3bXia Wang long t = getBenchmark(); 274f6244d1c0c91cd0fcb49abc8c0526eab7fcc1c3bXia Wang //long javaTime = javaFilter(); 275f6244d1c0c91cd0fcb49abc8c0526eab7fcc1c3bXia Wang //mBenchmarkResult.setText("RS: " + t + " ms Java: " + javaTime + " ms"); 276f6244d1c0c91cd0fcb49abc8c0526eab7fcc1c3bXia Wang mBenchmarkResult.setText("Result: " + t + " ms"); 277f6244d1c0c91cd0fcb49abc8c0526eab7fcc1c3bXia Wang } 278f6244d1c0c91cd0fcb49abc8c0526eab7fcc1c3bXia Wang 279f6244d1c0c91cd0fcb49abc8c0526eab7fcc1c3bXia Wang // For benchmark test 280f6244d1c0c91cd0fcb49abc8c0526eab7fcc1c3bXia Wang public long getBenchmark() { 281f6244d1c0c91cd0fcb49abc8c0526eab7fcc1c3bXia Wang Log.v(TAG, "Benchmarking"); 282814326b3b945d61ea48d05e32899fb5a036cc2d3Alex Sakhartchouk int oldRadius = mRadius; 283814326b3b945d61ea48d05e32899fb5a036cc2d3Alex Sakhartchouk mRadius = MAX_RADIUS; 284814326b3b945d61ea48d05e32899fb5a036cc2d3Alex Sakhartchouk mScript.set_radius(mRadius); 285814326b3b945d61ea48d05e32899fb5a036cc2d3Alex Sakhartchouk 286814326b3b945d61ea48d05e32899fb5a036cc2d3Alex Sakhartchouk long t = java.lang.System.currentTimeMillis(); 287814326b3b945d61ea48d05e32899fb5a036cc2d3Alex Sakhartchouk 28843c31421b4ce1cdff7c26c988bfe5e1bff64ce23Jason Sams mScript.invoke_filter(); 2894ef6650bd05a39a09958ea1db92f120ea4949cb1Jason Sams mOutPixelsAllocation.copyTo(mBitmapOut); 290814326b3b945d61ea48d05e32899fb5a036cc2d3Alex Sakhartchouk 291814326b3b945d61ea48d05e32899fb5a036cc2d3Alex Sakhartchouk t = java.lang.System.currentTimeMillis() - t; 292f6244d1c0c91cd0fcb49abc8c0526eab7fcc1c3bXia Wang Log.v(TAG, "getBenchmark: Renderscript frame time core ms " + t); 293814326b3b945d61ea48d05e32899fb5a036cc2d3Alex Sakhartchouk mRadius = oldRadius; 294814326b3b945d61ea48d05e32899fb5a036cc2d3Alex Sakhartchouk mScript.set_radius(mRadius); 295814326b3b945d61ea48d05e32899fb5a036cc2d3Alex Sakhartchouk 296f110d4b787b91dabe968a812e76e5c1f8d953487Jason Sams mScript.invoke_filter(); 2974ef6650bd05a39a09958ea1db92f120ea4949cb1Jason Sams mOutPixelsAllocation.copyTo(mBitmapOut); 298f6244d1c0c91cd0fcb49abc8c0526eab7fcc1c3bXia Wang return t; 299814326b3b945d61ea48d05e32899fb5a036cc2d3Alex Sakhartchouk } 300d7fa122dfed376cd9c60eac516e2730acf23f3ddRomain Guy} 301