diff options
author | Donald Munn <donald.munn@gmail.com> | 2012-07-06 06:44:14 +0100 |
---|---|---|
committer | Bumble-Bee <bigbeeshane@gmail.com> | 2012-07-06 13:10:20 +0100 |
commit | fdb427ef62a366809e41054868ce27f2dfca322e (patch) | |
tree | 5f9bbc8b7549e985ba3e16a1616d265677fba577 | |
parent | e0a8c35c1572f0f0dbbda4d871d0a919a79cbe3f (diff) | |
download | frameworks_base-fdb427ef62a366809e41054868ce27f2dfca322e.zip frameworks_base-fdb427ef62a366809e41054868ce27f2dfca322e.tar.gz frameworks_base-fdb427ef62a366809e41054868ce27f2dfca322e.tar.bz2 |
Fix first frame on rotation animation for Tegra
Modify rotation animation to use a screenshot instead of a black screen.
Change-Id: I71563680f5d7cb355dd50b8873fa1b420a131512
-rw-r--r-- | services/java/com/android/server/wm/ScreenRotationAnimation.java | 32 |
1 files changed, 31 insertions, 1 deletions
diff --git a/services/java/com/android/server/wm/ScreenRotationAnimation.java b/services/java/com/android/server/wm/ScreenRotationAnimation.java index 35503d3..4e4f851 100644 --- a/services/java/com/android/server/wm/ScreenRotationAnimation.java +++ b/services/java/com/android/server/wm/ScreenRotationAnimation.java @@ -62,6 +62,7 @@ class ScreenRotationAnimation { public ScreenRotationAnimation(Context context, SurfaceSession session, boolean inTransaction, int originalWidth, int originalHeight, int originalRotation) { + boolean isTegra = android.os.SystemProperties.get("ro.board.platform","").equals("tegra"); mContext = context; // Screenshot does NOT include rotation! @@ -99,7 +100,7 @@ class ScreenRotationAnimation { try { try { mSurface = new Surface(session, 0, "FreezeSurface", - -1, mWidth, mHeight, PixelFormat.OPAQUE, Surface.FX_SURFACE_SCREENSHOT | Surface.HIDDEN); + -1, mWidth, mHeight, PixelFormat.OPAQUE, isTegra ? 0 : (Surface.FX_SURFACE_SCREENSHOT | Surface.HIDDEN)); if (mSurface == null || !mSurface.isValid()) { // Screenshot failed, punt. mSurface = null; @@ -116,6 +117,35 @@ class ScreenRotationAnimation { " FREEZE " + mSurface + ": CREATE"); setRotation(originalRotation); + + if (isTegra) { + Rect rect = new Rect(0, 0, mWidth, mHeight); + Canvas canvas = null; + + try { + canvas = mSurface.lockCanvas(rect); + } catch (IllegalArgumentException e) { + Slog.w(TAG, "Unable to lock surface", e); + } catch (Surface.OutOfResourcesException e) { + Slog.w(TAG, "Unable to lock surface", e); + } + + Bitmap screenshot = Surface.screenshot(0, 0); + if (canvas == null || screenshot == null) { + Slog.w(TAG, "Null surface canvas"); + mSurface.destroy(); + mSurface = null; + return; + } + + Paint paint = new Paint(0); + paint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.SRC)); + + canvas.drawBitmap(screenshot, 0, 0, paint); + mSurface.unlockCanvasAndPost(canvas); + + } + } finally { if (!inTransaction) { Surface.closeTransaction(); |