141f1e5edee2d2663ae46b64528894896ff96fa3dStephen Hines/* 241f1e5edee2d2663ae46b64528894896ff96fa3dStephen Hines * Copyright (C) 2008 The Android Open Source Project 341f1e5edee2d2663ae46b64528894896ff96fa3dStephen Hines * 441f1e5edee2d2663ae46b64528894896ff96fa3dStephen Hines * Licensed under the Apache License, Version 2.0 (the "License"); 541f1e5edee2d2663ae46b64528894896ff96fa3dStephen Hines * you may not use this file except in compliance with the License. 641f1e5edee2d2663ae46b64528894896ff96fa3dStephen Hines * You may obtain a copy of the License at 741f1e5edee2d2663ae46b64528894896ff96fa3dStephen Hines * 841f1e5edee2d2663ae46b64528894896ff96fa3dStephen Hines * http://www.apache.org/licenses/LICENSE-2.0 941f1e5edee2d2663ae46b64528894896ff96fa3dStephen Hines * 1041f1e5edee2d2663ae46b64528894896ff96fa3dStephen Hines * Unless required by applicable law or agreed to in writing, software 1141f1e5edee2d2663ae46b64528894896ff96fa3dStephen Hines * distributed under the License is distributed on an "AS IS" BASIS, 1241f1e5edee2d2663ae46b64528894896ff96fa3dStephen Hines * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 1341f1e5edee2d2663ae46b64528894896ff96fa3dStephen Hines * See the License for the specific language governing permissions and 1441f1e5edee2d2663ae46b64528894896ff96fa3dStephen Hines * limitations under the License. 1541f1e5edee2d2663ae46b64528894896ff96fa3dStephen Hines */ 1641f1e5edee2d2663ae46b64528894896ff96fa3dStephen Hines 1741f1e5edee2d2663ae46b64528894896ff96fa3dStephen Hinespackage com.android.fountain_v11; 1841f1e5edee2d2663ae46b64528894896ff96fa3dStephen Hines 1941f1e5edee2d2663ae46b64528894896ff96fa3dStephen Hinesimport java.io.Writer; 2041f1e5edee2d2663ae46b64528894896ff96fa3dStephen Hinesimport java.util.ArrayList; 2141f1e5edee2d2663ae46b64528894896ff96fa3dStephen Hinesimport java.util.concurrent.Semaphore; 2241f1e5edee2d2663ae46b64528894896ff96fa3dStephen Hines 2341f1e5edee2d2663ae46b64528894896ff96fa3dStephen Hinesimport android.renderscript.RSSurfaceView; 2441f1e5edee2d2663ae46b64528894896ff96fa3dStephen Hinesimport android.renderscript.RenderScript; 2541f1e5edee2d2663ae46b64528894896ff96fa3dStephen Hinesimport android.renderscript.RenderScriptGL; 2641f1e5edee2d2663ae46b64528894896ff96fa3dStephen Hines 2741f1e5edee2d2663ae46b64528894896ff96fa3dStephen Hinesimport android.content.Context; 2841f1e5edee2d2663ae46b64528894896ff96fa3dStephen Hinesimport android.content.res.Resources; 2941f1e5edee2d2663ae46b64528894896ff96fa3dStephen Hinesimport android.graphics.Bitmap; 3041f1e5edee2d2663ae46b64528894896ff96fa3dStephen Hinesimport android.graphics.drawable.BitmapDrawable; 3141f1e5edee2d2663ae46b64528894896ff96fa3dStephen Hinesimport android.graphics.drawable.Drawable; 3241f1e5edee2d2663ae46b64528894896ff96fa3dStephen Hinesimport android.os.Handler; 3341f1e5edee2d2663ae46b64528894896ff96fa3dStephen Hinesimport android.os.Message; 3441f1e5edee2d2663ae46b64528894896ff96fa3dStephen Hinesimport android.util.AttributeSet; 3541f1e5edee2d2663ae46b64528894896ff96fa3dStephen Hinesimport android.util.Log; 3641f1e5edee2d2663ae46b64528894896ff96fa3dStephen Hinesimport android.view.Surface; 3741f1e5edee2d2663ae46b64528894896ff96fa3dStephen Hinesimport android.view.SurfaceHolder; 3841f1e5edee2d2663ae46b64528894896ff96fa3dStephen Hinesimport android.view.SurfaceView; 3941f1e5edee2d2663ae46b64528894896ff96fa3dStephen Hinesimport android.view.KeyEvent; 4041f1e5edee2d2663ae46b64528894896ff96fa3dStephen Hinesimport android.view.MotionEvent; 4141f1e5edee2d2663ae46b64528894896ff96fa3dStephen Hines 4241f1e5edee2d2663ae46b64528894896ff96fa3dStephen Hinespublic class FountainView extends RSSurfaceView { 4341f1e5edee2d2663ae46b64528894896ff96fa3dStephen Hines 4441f1e5edee2d2663ae46b64528894896ff96fa3dStephen Hines public FountainView(Context context) { 4541f1e5edee2d2663ae46b64528894896ff96fa3dStephen Hines super(context); 4641f1e5edee2d2663ae46b64528894896ff96fa3dStephen Hines //setFocusable(true); 4741f1e5edee2d2663ae46b64528894896ff96fa3dStephen Hines } 4841f1e5edee2d2663ae46b64528894896ff96fa3dStephen Hines 4941f1e5edee2d2663ae46b64528894896ff96fa3dStephen Hines private RenderScriptGL mRS; 5041f1e5edee2d2663ae46b64528894896ff96fa3dStephen Hines private FountainRS mRender; 5141f1e5edee2d2663ae46b64528894896ff96fa3dStephen Hines 5241f1e5edee2d2663ae46b64528894896ff96fa3dStephen Hines public void surfaceChanged(SurfaceHolder holder, int format, int w, int h) { 5341f1e5edee2d2663ae46b64528894896ff96fa3dStephen Hines super.surfaceChanged(holder, format, w, h); 5441f1e5edee2d2663ae46b64528894896ff96fa3dStephen Hines if (mRS == null) { 5541f1e5edee2d2663ae46b64528894896ff96fa3dStephen Hines RenderScriptGL.SurfaceConfig sc = new RenderScriptGL.SurfaceConfig(); 5641f1e5edee2d2663ae46b64528894896ff96fa3dStephen Hines mRS = createRenderScriptGL(sc); 5741f1e5edee2d2663ae46b64528894896ff96fa3dStephen Hines mRS.setSurface(holder, w, h); 5841f1e5edee2d2663ae46b64528894896ff96fa3dStephen Hines mRender = new FountainRS(); 5941f1e5edee2d2663ae46b64528894896ff96fa3dStephen Hines mRender.init(mRS, getResources(), w, h); 6041f1e5edee2d2663ae46b64528894896ff96fa3dStephen Hines } 6141f1e5edee2d2663ae46b64528894896ff96fa3dStephen Hines } 6241f1e5edee2d2663ae46b64528894896ff96fa3dStephen Hines 6341f1e5edee2d2663ae46b64528894896ff96fa3dStephen Hines @Override 6441f1e5edee2d2663ae46b64528894896ff96fa3dStephen Hines protected void onDetachedFromWindow() { 6541f1e5edee2d2663ae46b64528894896ff96fa3dStephen Hines if (mRS != null) { 6641f1e5edee2d2663ae46b64528894896ff96fa3dStephen Hines mRS = null; 6741f1e5edee2d2663ae46b64528894896ff96fa3dStephen Hines destroyRenderScriptGL(); 6841f1e5edee2d2663ae46b64528894896ff96fa3dStephen Hines } 6941f1e5edee2d2663ae46b64528894896ff96fa3dStephen Hines } 7041f1e5edee2d2663ae46b64528894896ff96fa3dStephen Hines 7141f1e5edee2d2663ae46b64528894896ff96fa3dStephen Hines 7241f1e5edee2d2663ae46b64528894896ff96fa3dStephen Hines @Override 7341f1e5edee2d2663ae46b64528894896ff96fa3dStephen Hines public boolean onTouchEvent(MotionEvent ev) 7441f1e5edee2d2663ae46b64528894896ff96fa3dStephen Hines { 7541f1e5edee2d2663ae46b64528894896ff96fa3dStephen Hines int act = ev.getActionMasked(); 7641f1e5edee2d2663ae46b64528894896ff96fa3dStephen Hines if (act == ev.ACTION_UP) { 7741f1e5edee2d2663ae46b64528894896ff96fa3dStephen Hines mRender.newTouchPosition(0, 0, 0, ev.getPointerId(0)); 7841f1e5edee2d2663ae46b64528894896ff96fa3dStephen Hines return false; 7941f1e5edee2d2663ae46b64528894896ff96fa3dStephen Hines } else if (act == MotionEvent.ACTION_POINTER_UP) { 8041f1e5edee2d2663ae46b64528894896ff96fa3dStephen Hines // only one pointer going up, we can get the index like this 8141f1e5edee2d2663ae46b64528894896ff96fa3dStephen Hines int pointerIndex = ev.getActionIndex(); 8241f1e5edee2d2663ae46b64528894896ff96fa3dStephen Hines int pointerId = ev.getPointerId(pointerIndex); 8341f1e5edee2d2663ae46b64528894896ff96fa3dStephen Hines mRender.newTouchPosition(0, 0, 0, pointerId); 8441f1e5edee2d2663ae46b64528894896ff96fa3dStephen Hines } 8541f1e5edee2d2663ae46b64528894896ff96fa3dStephen Hines int count = ev.getHistorySize(); 8641f1e5edee2d2663ae46b64528894896ff96fa3dStephen Hines int pcount = ev.getPointerCount(); 8741f1e5edee2d2663ae46b64528894896ff96fa3dStephen Hines 8841f1e5edee2d2663ae46b64528894896ff96fa3dStephen Hines for (int p=0; p < pcount; p++) { 8941f1e5edee2d2663ae46b64528894896ff96fa3dStephen Hines int id = ev.getPointerId(p); 9041f1e5edee2d2663ae46b64528894896ff96fa3dStephen Hines mRender.newTouchPosition(ev.getX(p), 9141f1e5edee2d2663ae46b64528894896ff96fa3dStephen Hines ev.getY(p), 9241f1e5edee2d2663ae46b64528894896ff96fa3dStephen Hines ev.getPressure(p), 9341f1e5edee2d2663ae46b64528894896ff96fa3dStephen Hines id); 9441f1e5edee2d2663ae46b64528894896ff96fa3dStephen Hines 9541f1e5edee2d2663ae46b64528894896ff96fa3dStephen Hines for (int i=0; i < count; i++) { 9641f1e5edee2d2663ae46b64528894896ff96fa3dStephen Hines mRender.newTouchPosition(ev.getHistoricalX(p, i), 9741f1e5edee2d2663ae46b64528894896ff96fa3dStephen Hines ev.getHistoricalY(p, i), 9841f1e5edee2d2663ae46b64528894896ff96fa3dStephen Hines ev.getHistoricalPressure(p, i), 9941f1e5edee2d2663ae46b64528894896ff96fa3dStephen Hines id); 10041f1e5edee2d2663ae46b64528894896ff96fa3dStephen Hines } 10141f1e5edee2d2663ae46b64528894896ff96fa3dStephen Hines } 10241f1e5edee2d2663ae46b64528894896ff96fa3dStephen Hines return true; 10341f1e5edee2d2663ae46b64528894896ff96fa3dStephen Hines } 10441f1e5edee2d2663ae46b64528894896ff96fa3dStephen Hines} 10541f1e5edee2d2663ae46b64528894896ff96fa3dStephen Hines 10641f1e5edee2d2663ae46b64528894896ff96fa3dStephen Hines 107