OSDN Git Service

Avoid reading HW bitmap pixels twice
authorJorim Jaggi <jjaggi@google.com>
Tue, 2 May 2017 12:10:58 +0000 (14:10 +0200)
committerJorim Jaggi <jjaggi@google.com>
Wed, 3 May 2017 12:27:30 +0000 (14:27 +0200)
Both createScaledBitmap and compress read it back to regular
memory. Avoid that by creating an intermediate software bitmap.

Test: TaskSnapshotPersisterLoaderTest
Bug: 37631016
Change-Id: Id03fa3f6a827d3bd39f8fe4fddfc2d32139dac9b

services/core/java/com/android/server/wm/TaskSnapshotPersister.java

index f2a92df..e5c7a72 100644 (file)
@@ -24,6 +24,7 @@ import android.annotation.TestApi;
 import android.app.ActivityManager.TaskSnapshot;
 import android.graphics.Bitmap;
 import android.graphics.Bitmap.CompressFormat;
+import android.graphics.Bitmap.Config;
 import android.os.Process;
 import android.os.SystemClock;
 import android.util.ArraySet;
@@ -266,12 +267,13 @@ class TaskSnapshotPersister {
             final File file = getBitmapFile(mTaskId, mUserId);
             final File reducedFile = getReducedResolutionBitmapFile(mTaskId, mUserId);
             final Bitmap bitmap = Bitmap.createHardwareBitmap(mSnapshot.getSnapshot());
-            final Bitmap reduced = Bitmap.createScaledBitmap(bitmap,
+            final Bitmap swBitmap = bitmap.copy(Config.ARGB_8888, false /* isMutable */);
+            final Bitmap reduced = Bitmap.createScaledBitmap(swBitmap,
                     (int) (bitmap.getWidth() * REDUCED_SCALE),
                     (int) (bitmap.getHeight() * REDUCED_SCALE), true /* filter */);
             try {
                 FileOutputStream fos = new FileOutputStream(file);
-                bitmap.compress(JPEG, QUALITY, fos);
+                swBitmap.compress(JPEG, QUALITY, fos);
                 fos.close();
                 FileOutputStream reducedFos = new FileOutputStream(reducedFile);
                 reduced.compress(JPEG, QUALITY, reducedFos);