Loading core/java/android/view/Surface.java +15 −1 Original line number Diff line number Diff line Loading @@ -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; Loading core/java/android/view/SurfaceView.java +3 −6 Original line number Diff line number Diff line Loading @@ -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 Loading Loading @@ -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)) { Loading core/jni/android_view_Surface.cpp +20 −0 Original line number Diff line number Diff line Loading @@ -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) { Loading Loading @@ -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 }, Loading Loading
core/java/android/view/Surface.java +15 −1 Original line number Diff line number Diff line Loading @@ -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; Loading
core/java/android/view/SurfaceView.java +3 −6 Original line number Diff line number Diff line Loading @@ -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 Loading Loading @@ -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)) { Loading
core/jni/android_view_Surface.cpp +20 −0 Original line number Diff line number Diff line Loading @@ -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) { Loading Loading @@ -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 }, Loading