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