Merge "Scale up in ImageDecoder based on API level" into pi-dev
This commit is contained in:
committed by
Android (Google) Code Review
commit
83ad4e53b6
@@ -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
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
Reference in New Issue
Block a user