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