Merge "Scale up in ImageDecoder based on API level" into pi-dev

This commit is contained in:
Leon Scroggins
2018-03-20 16:44:44 +00:00
committed by Android (Google) Code Review
2 changed files with 22 additions and 8 deletions

View File

@@ -64,6 +64,7 @@ import android.database.sqlite.SQLiteDebug;
import android.database.sqlite.SQLiteDebug.DbStats; import android.database.sqlite.SQLiteDebug.DbStats;
import android.graphics.Bitmap; import android.graphics.Bitmap;
import android.graphics.Canvas; import android.graphics.Canvas;
import android.graphics.ImageDecoder;
import android.hardware.display.DisplayManagerGlobal; import android.hardware.display.DisplayManagerGlobal;
import android.net.ConnectivityManager; import android.net.ConnectivityManager;
import android.net.IConnectivityManager; import android.net.IConnectivityManager;
@@ -5551,6 +5552,13 @@ public final class ActivityThread extends ClientTransactionHandler {
Message.updateCheckRecycle(data.appInfo.targetSdkVersion); Message.updateCheckRecycle(data.appInfo.targetSdkVersion);
// Prior to P, internal calls to decode Bitmaps used BitmapFactory,
// which may scale up to account for density. In P, we switched to
// ImageDecoder, which skips the upscale to save memory. ImageDecoder
// needs to still scale up in older apps, in case they rely on the
// size of the Bitmap without considering its density.
ImageDecoder.sApiLevel = data.appInfo.targetSdkVersion;
/* /*
* Before spawning a new process, reset the time zone to be the system time zone. * Before spawning a new process, reset the time zone to be the system time zone.
* This needs to be done because the system time zone could have changed after the * This needs to be done because the system time zone could have changed after the

View File

@@ -34,6 +34,7 @@ import android.graphics.drawable.BitmapDrawable;
import android.graphics.drawable.Drawable; import android.graphics.drawable.Drawable;
import android.graphics.drawable.NinePatchDrawable; import android.graphics.drawable.NinePatchDrawable;
import android.net.Uri; import android.net.Uri;
import android.os.Build;
import android.system.ErrnoException; import android.system.ErrnoException;
import android.system.Os; import android.system.Os;
import android.util.DisplayMetrics; import android.util.DisplayMetrics;
@@ -58,6 +59,9 @@ import java.util.concurrent.atomic.AtomicBoolean;
* Class for decoding images as {@link Bitmap}s or {@link Drawable}s. * Class for decoding images as {@link Bitmap}s or {@link Drawable}s.
*/ */
public final class ImageDecoder implements AutoCloseable { public final class ImageDecoder implements AutoCloseable {
/** @hide **/
public static int sApiLevel;
/** /**
* Source of the encoded image data. * Source of the encoded image data.
*/ */
@@ -1262,17 +1266,19 @@ public final class ImageDecoder implements AutoCloseable {
return srcDensity; return srcDensity;
} }
// downscale the bitmap if the asset has a higher density than the default // For P and above, only resize if it would be a downscale. Scale up prior
// to P in case the app relies on the Bitmap's size without considering density.
final int dstDensity = src.computeDstDensity(); final int dstDensity = src.computeDstDensity();
if (srcDensity != Bitmap.DENSITY_NONE && srcDensity > dstDensity) { if (srcDensity == Bitmap.DENSITY_NONE || srcDensity == dstDensity
float scale = (float) dstDensity / srcDensity; || (srcDensity < dstDensity && sApiLevel >= Build.VERSION_CODES.P)) {
int scaledWidth = (int) (decoder.mWidth * scale + 0.5f); return srcDensity;
int scaledHeight = (int) (decoder.mHeight * scale + 0.5f);
decoder.setResize(scaledWidth, scaledHeight);
return dstDensity;
} }
return srcDensity; float scale = (float) dstDensity / srcDensity;
int scaledWidth = (int) (decoder.mWidth * scale + 0.5f);
int scaledHeight = (int) (decoder.mHeight * scale + 0.5f);
decoder.setResize(scaledWidth, scaledHeight);
return dstDensity;
} }
@NonNull @NonNull