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