Home | History | Annotate | Download | only in renderscript
      1 /*
      2  * Copyright (C) 2008 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 
     17 package android.renderscript;
     18 
     19 import java.io.Writer;
     20 import java.util.ArrayList;
     21 import java.util.concurrent.Semaphore;
     22 
     23 import android.content.Context;
     24 import android.os.Handler;
     25 import android.os.Message;
     26 import android.util.AttributeSet;
     27 import android.util.Log;
     28 import android.util.Log;
     29 import android.view.Surface;
     30 import android.view.SurfaceHolder;
     31 import android.view.SurfaceView;
     32 
     33 /**
     34  * @hide
     35  *
     36  **/
     37 public class RSSurfaceView extends SurfaceView implements SurfaceHolder.Callback {
     38     private SurfaceHolder mSurfaceHolder;
     39     private RenderScriptGL mRS;
     40 
     41     /**
     42      * Standard View constructor. In order to render something, you
     43      * must call {@link #setRenderer} to register a renderer.
     44      */
     45     public RSSurfaceView(Context context) {
     46         super(context);
     47         init();
     48         //Log.v(RenderScript.LOG_TAG, "RSSurfaceView");
     49     }
     50 
     51     /**
     52      * Standard View constructor. In order to render something, you
     53      * must call {@link #setRenderer} to register a renderer.
     54      */
     55     public RSSurfaceView(Context context, AttributeSet attrs) {
     56         super(context, attrs);
     57         init();
     58         //Log.v(RenderScript.LOG_TAG, "RSSurfaceView");
     59     }
     60 
     61     private void init() {
     62         // Install a SurfaceHolder.Callback so we get notified when the
     63         // underlying surface is created and destroyed
     64         SurfaceHolder holder = getHolder();
     65         holder.addCallback(this);
     66     }
     67 
     68     /**
     69      * This method is part of the SurfaceHolder.Callback interface, and is
     70      * not normally called or subclassed by clients of RSSurfaceView.
     71      */
     72     public void surfaceCreated(SurfaceHolder holder) {
     73         Log.v(RenderScript.LOG_TAG, "surfaceCreated");
     74         mSurfaceHolder = holder;
     75     }
     76 
     77     /**
     78      * This method is part of the SurfaceHolder.Callback interface, and is
     79      * not normally called or subclassed by clients of RSSurfaceView.
     80      */
     81     public void surfaceDestroyed(SurfaceHolder holder) {
     82         // Surface will be destroyed when we return
     83         Log.v(RenderScript.LOG_TAG, "surfaceDestroyed");
     84         if (mRS != null) {
     85             mRS.contextSetSurface(0, 0, null);
     86         }
     87     }
     88 
     89     /**
     90      * This method is part of the SurfaceHolder.Callback interface, and is
     91      * not normally called or subclassed by clients of RSSurfaceView.
     92      */
     93     public void surfaceChanged(SurfaceHolder holder, int format, int w, int h) {
     94         Log.v(RenderScript.LOG_TAG, "surfaceChanged");
     95         if (mRS != null) {
     96             mRS.contextSetSurface(w, h, holder.getSurface());
     97         }
     98     }
     99 
    100     /**
    101      * Inform the view that the activity is paused. The owner of this view must
    102      * call this method when the activity is paused. Calling this method will
    103      * pause the rendering thread.
    104      * Must not be called before a renderer has been set.
    105      */
    106     public void onPause() {
    107         if(mRS != null) {
    108             mRS.pause();
    109         }
    110         //Log.v(RenderScript.LOG_TAG, "onPause");
    111     }
    112 
    113     /**
    114      * Inform the view that the activity is resumed. The owner of this view must
    115      * call this method when the activity is resumed. Calling this method will
    116      * recreate the OpenGL display and resume the rendering
    117      * thread.
    118      * Must not be called before a renderer has been set.
    119      */
    120     public void onResume() {
    121         if(mRS != null) {
    122             mRS.resume();
    123         }
    124         //Log.v(RenderScript.LOG_TAG, "onResume");
    125     }
    126 
    127     /**
    128      * Queue a runnable to be run on the GL rendering thread. This can be used
    129      * to communicate with the Renderer on the rendering thread.
    130      * Must not be called before a renderer has been set.
    131      * @param r the runnable to be run on the GL rendering thread.
    132      */
    133     public void queueEvent(Runnable r) {
    134         //Log.v(RenderScript.LOG_TAG, "queueEvent");
    135     }
    136 
    137     /**
    138      * This method is used as part of the View class and is not normally
    139      * called or subclassed by clients of RSSurfaceView.
    140      * Must not be called before a renderer has been set.
    141      */
    142     @Override
    143     protected void onDetachedFromWindow() {
    144         super.onDetachedFromWindow();
    145     }
    146 
    147     // ----------------------------------------------------------------------
    148 
    149     public RenderScriptGL createRenderScript(boolean useDepth, boolean forceSW) {
    150         Log.v(RenderScript.LOG_TAG, "createRenderScript");
    151         mRS = new RenderScriptGL(useDepth, forceSW);
    152         return mRS;
    153     }
    154 
    155     public RenderScriptGL createRenderScript(boolean useDepth) {
    156         return createRenderScript(useDepth, false);
    157     }
    158 
    159     public void destroyRenderScript() {
    160         Log.v(RenderScript.LOG_TAG, "destroyRenderScript");
    161         mRS.destroy();
    162         mRS = null;
    163     }
    164 
    165     public void createRenderScript(RenderScriptGL rs) {
    166         mRS = rs;
    167     }
    168 }
    169 
    170