diff options
author | Dianne Hackborn <hackbod@google.com> | 2011-12-05 10:40:59 -0800 |
---|---|---|
committer | Android (Google) Code Review <android-gerrit@google.com> | 2011-12-05 10:40:59 -0800 |
commit | 003c15d72ccd3856d5abfe6d66a2a40d0eca85bc (patch) | |
tree | 800e658e5651ccc99737eae53389af04ba6f3e34 | |
parent | 277cbe5a951840558166020568fb1510285e2594 (diff) | |
parent | 61566cc1932468720a831ad5cbc68ee080d613c9 (diff) | |
download | frameworks_base-003c15d72ccd3856d5abfe6d66a2a40d0eca85bc.zip frameworks_base-003c15d72ccd3856d5abfe6d66a2a40d0eca85bc.tar.gz frameworks_base-003c15d72ccd3856d5abfe6d66a2a40d0eca85bc.tar.bz2 |
Merge "Fix issue #5614559: Registering surface error in..." into ics-mr1
-rw-r--r-- | core/java/android/view/Surface.java | 16 | ||||
-rw-r--r-- | core/java/android/view/SurfaceView.java | 9 | ||||
-rw-r--r-- | core/jni/android_view_Surface.cpp | 20 |
3 files changed, 38 insertions, 7 deletions
diff --git a/core/java/android/view/Surface.java b/core/java/android/view/Surface.java index 2b254af..edaa262 100644 --- a/core/java/android/view/Surface.java +++ b/core/java/android/view/Surface.java @@ -282,10 +282,24 @@ public class Surface implements Parcelable { /** * Copy another surface to this one. This surface now holds a reference * to the same data as the original surface, and is -not- the owner. + * This is for use by the window manager when returning a window surface + * back from a client, converting it from the representation being managed + * by the window manager to the representation the client uses to draw + * in to it. * @hide */ public native void copyFrom(Surface o); - + + /** + * Transfer the native state from 'o' to this surface, releasing it + * from 'o'. This is for use in the client side for drawing into a + * surface; not guaranteed to work on the window manager side. + * This is for use by the client to move the underlying surface from + * one Surface object to another, in particular in SurfaceFlinger. + * @hide. + */ + public native void transferFrom(Surface o); + /** @hide */ public int getGenerationId() { return mSurfaceGenerationId; diff --git a/core/java/android/view/SurfaceView.java b/core/java/android/view/SurfaceView.java index 0e68490..6726c56e 100644 --- a/core/java/android/view/SurfaceView.java +++ b/core/java/android/view/SurfaceView.java @@ -88,8 +88,8 @@ public class SurfaceView extends View { final int[] mLocation = new int[2]; final ReentrantLock mSurfaceLock = new ReentrantLock(); - Surface mSurface = new Surface(); // Current surface in use - Surface mNewSurface = new Surface(); // New surface we are switching to + final Surface mSurface = new Surface(); // Current surface in use + final Surface mNewSurface = new Surface(); // New surface we are switching to boolean mDrawingStopped = true; final WindowManager.LayoutParams mLayout @@ -519,10 +519,7 @@ public class SurfaceView extends View { } } - Surface tmpSurface = mSurface; - mSurface = mNewSurface; - mNewSurface = tmpSurface; - mNewSurface.release(); + mSurface.transferFrom(mNewSurface); if (visible) { if (!mSurfaceCreated && (surfaceChanged || visibleChanged)) { diff --git a/core/jni/android_view_Surface.cpp b/core/jni/android_view_Surface.cpp index 49441eb..bba4b47 100644 --- a/core/jni/android_view_Surface.cpp +++ b/core/jni/android_view_Surface.cpp @@ -752,6 +752,25 @@ static void Surface_copyFrom( } } +static void Surface_transferFrom( + JNIEnv* env, jobject clazz, jobject other) +{ + if (clazz == other) + return; + + if (other == NULL) { + doThrowNPE(env); + return; + } + + sp<SurfaceControl> control(getSurfaceControl(env, other)); + sp<Surface> surface(Surface_getSurface(env, other)); + setSurfaceControl(env, clazz, control); + setSurface(env, clazz, surface); + setSurfaceControl(env, other, 0); + setSurface(env, other, 0); +} + static void Surface_readFromParcel( JNIEnv* env, jobject clazz, jobject argParcel) { @@ -820,6 +839,7 @@ static JNINativeMethod gSurfaceMethods[] = { {"destroy", "()V", (void*)Surface_destroy }, {"release", "()V", (void*)Surface_release }, {"copyFrom", "(Landroid/view/Surface;)V", (void*)Surface_copyFrom }, + {"transferFrom", "(Landroid/view/Surface;)V", (void*)Surface_transferFrom }, {"isValid", "()Z", (void*)Surface_isValid }, {"lockCanvasNative", "(Landroid/graphics/Rect;)Landroid/graphics/Canvas;", (void*)Surface_lockCanvas }, {"unlockCanvasAndPost", "(Landroid/graphics/Canvas;)V", (void*)Surface_unlockCanvasAndPost }, |