| Index: ui/android/java/src/org/chromium/ui/display/DisplayAndroid.java
|
| diff --git a/ui/android/java/src/org/chromium/ui/display/DisplayAndroid.java b/ui/android/java/src/org/chromium/ui/display/DisplayAndroid.java
|
| index 383762052237046274f70350b97706de7f08fdfa..fc17ef77548ab1e562913d10993dd28720278112 100644
|
| --- a/ui/android/java/src/org/chromium/ui/display/DisplayAndroid.java
|
| +++ b/ui/android/java/src/org/chromium/ui/display/DisplayAndroid.java
|
| @@ -6,10 +6,12 @@ package org.chromium.ui.display;
|
|
|
| import android.annotation.TargetApi;
|
| import android.content.Context;
|
| +import android.graphics.PixelFormat;
|
| import android.graphics.Point;
|
| import android.os.Build;
|
| import android.util.DisplayMetrics;
|
| import android.view.Display;
|
| +import android.view.Surface;
|
|
|
| import org.chromium.base.CommandLine;
|
| import org.chromium.base.Log;
|
| @@ -56,6 +58,8 @@ public class DisplayAndroid {
|
| private final Point mSize;
|
| private final Point mPhysicalSize;
|
| private final DisplayMetrics mDisplayMetrics;
|
| + private final PixelFormat mPixelFormatInfo;
|
| + private int mPixelFormatId;
|
| private int mRotation;
|
|
|
| // When this object exists, a positive value means that the forced DIP scale is set and
|
| @@ -114,6 +118,13 @@ public class DisplayAndroid {
|
| }
|
|
|
| /**
|
| + * @return Display id as defined in Android's Display.
|
| + */
|
| + public int getSdkDisplayId() {
|
| + return mSdkDisplayId;
|
| + }
|
| +
|
| + /**
|
| * @return Display height in physical pixels.
|
| */
|
| public int getDisplayHeight() {
|
| @@ -149,6 +160,26 @@ public class DisplayAndroid {
|
| }
|
|
|
| /**
|
| + * @return current orientation in degrees. One of the values 0, 90, 180, 270.
|
| + */
|
| + /* package */ int getRotationDegrees() {
|
| + switch (mRotation) {
|
| + case Surface.ROTATION_0:
|
| + return 0;
|
| + case Surface.ROTATION_90:
|
| + return 90;
|
| + case Surface.ROTATION_180:
|
| + return 180;
|
| + case Surface.ROTATION_270:
|
| + return 270;
|
| + }
|
| +
|
| + // This should not happen.
|
| + assert false;
|
| + return 0;
|
| + }
|
| +
|
| + /**
|
| * @return A scaling factor for the Density Independent Pixel unit.
|
| */
|
| public float getDipScale() {
|
| @@ -156,6 +187,48 @@ public class DisplayAndroid {
|
| }
|
|
|
| /**
|
| + * @return Number of bits per pixel.
|
| + */
|
| + /* package */ int getBitsPerPixel() {
|
| + return mPixelFormatInfo.bitsPerPixel;
|
| + }
|
| +
|
| + /**
|
| + * @return Number of bits per each color component.
|
| + */
|
| + @SuppressWarnings("deprecation")
|
| + /* package */ int getBitsPerComponent() {
|
| + switch (mPixelFormatId) {
|
| + case PixelFormat.RGBA_4444:
|
| + return 4;
|
| +
|
| + case PixelFormat.RGBA_5551:
|
| + return 5;
|
| +
|
| + case PixelFormat.RGBA_8888:
|
| + case PixelFormat.RGBX_8888:
|
| + case PixelFormat.RGB_888:
|
| + return 8;
|
| +
|
| + case PixelFormat.RGB_332:
|
| + return 2;
|
| +
|
| + case PixelFormat.RGB_565:
|
| + return 5;
|
| +
|
| + // Non-RGB formats.
|
| + case PixelFormat.A_8:
|
| + case PixelFormat.LA_88:
|
| + case PixelFormat.L_8:
|
| + return 0;
|
| +
|
| + // Unknown format. Use 8 as a sensible default.
|
| + default:
|
| + return 8;
|
| + }
|
| + }
|
| +
|
| + /**
|
| * Add observer. Note repeat observers will be called only one.
|
| * Observers are held only weakly by Display.
|
| */
|
| @@ -192,12 +265,17 @@ public class DisplayAndroid {
|
| mSize = new Point();
|
| mPhysicalSize = new Point();
|
| mDisplayMetrics = new DisplayMetrics();
|
| - updateFromDisplay(display);
|
| + mPixelFormatInfo = new PixelFormat();
|
| }
|
|
|
| + @SuppressWarnings("deprecation")
|
| @TargetApi(Build.VERSION_CODES.JELLY_BEAN_MR1)
|
| /* package */ void updateFromDisplay(Display display) {
|
| - float oldDensity = mDisplayMetrics.density;
|
| + final Point oldSize = new Point(mSize);
|
| + final Point oldPhysicalSize = new Point(mPhysicalSize);
|
| + final float oldDensity = mDisplayMetrics.density;
|
| + final int oldPixelFormatId = mPixelFormatId;
|
| + final int oldRotation = mRotation;
|
|
|
| display.getSize(mSize);
|
| display.getMetrics(mDisplayMetrics);
|
| @@ -208,11 +286,24 @@ public class DisplayAndroid {
|
| display.getRealSize(mPhysicalSize);
|
| }
|
|
|
| - int newRotation = display.getRotation();
|
| - boolean rotationChanged = newRotation != mRotation;
|
| - mRotation = newRotation;
|
| + // JellyBean MR1 and later always uses RGBA_8888.
|
| + mPixelFormatId = (Build.VERSION.SDK_INT < Build.VERSION_CODES.JELLY_BEAN_MR1)
|
| + ? display.getPixelFormat()
|
| + : PixelFormat.RGBA_8888;
|
| + if (oldPixelFormatId != mPixelFormatId) {
|
| + PixelFormat.getPixelFormatInfo(mPixelFormatId, mPixelFormatInfo);
|
| + }
|
| +
|
| + mRotation = display.getRotation();
|
| +
|
| + final boolean noChanges = oldSize.equals(mSize) && oldPhysicalSize.equals(mPhysicalSize)
|
| + && oldDensity == mDisplayMetrics.density && oldPixelFormatId == mPixelFormatId
|
| + && oldRotation == mRotation;
|
| + if (noChanges) return;
|
| +
|
| + getManager().updateDisplayOnNativeSide(this);
|
|
|
| - if (rotationChanged) {
|
| + if (oldRotation != mRotation) {
|
| DisplayAndroidObserver[] observers = getObservers();
|
| for (DisplayAndroidObserver o : observers) {
|
| o.onRotationChanged(mRotation);
|
|
|