Skip to content

Commit 846a533

Browse files
author
Romain Guy
committed
Update layers' opaque property when needed
Before this change, changing a View's opacity would not be reflected by hardware layers. This could cause layers to retain their previous opacity. Change-Id: Iba2c8b4242deca021651df9324cc7c585a64653d
1 parent 053a82c commit 846a533

File tree

7 files changed

+47
-14
lines changed

7 files changed

+47
-14
lines changed

core/java/android/view/GLES20Canvas.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -151,6 +151,7 @@ protected void finalize() throws Throwable {
151151
static native int nCreateTextureLayer(boolean opaque, int[] layerInfo);
152152
static native int nCreateLayer(int width, int height, boolean isOpaque, int[] layerInfo);
153153
static native void nResizeLayer(int layerId, int width, int height, int[] layerInfo);
154+
static native void nSetOpaqueLayer(int layerId, boolean isOpaque);
154155
static native void nUpdateTextureLayer(int layerId, int width, int height, boolean opaque,
155156
SurfaceTexture surface);
156157
static native void nSetTextureLayerTransform(int layerId, int matrix);

core/java/android/view/GLES20Layer.java

Lines changed: 0 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -46,11 +46,6 @@ public int getLayer() {
4646
boolean copyInto(Bitmap bitmap) {
4747
return GLES20Canvas.nCopyLayer(mLayer, bitmap.mNativeBitmap);
4848
}
49-
50-
@Override
51-
void update(int width, int height, boolean isOpaque) {
52-
super.update(width, height, isOpaque);
53-
}
5449

5550
@Override
5651
void destroy() {

core/java/android/view/GLES20RenderLayer.java

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -70,6 +70,12 @@ void resize(int width, int height) {
7070
}
7171
}
7272

73+
@Override
74+
void setOpaque(boolean isOpaque) {
75+
mOpaque = isOpaque;
76+
GLES20Canvas.nSetOpaqueLayer(mLayer, isOpaque);
77+
}
78+
7379
@Override
7480
HardwareCanvas getCanvas() {
7581
return mCanvas;

core/java/android/view/GLES20TextureLayer.java

Lines changed: 5 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -42,12 +42,6 @@ class GLES20TextureLayer extends GLES20Layer {
4242
}
4343
}
4444

45-
GLES20TextureLayer(SurfaceTexture surface, boolean isOpaque) {
46-
this(isOpaque);
47-
mSurface = surface;
48-
mSurface.attachToGLContext(mTexture);
49-
}
50-
5145
@Override
5246
boolean isValid() {
5347
return mLayer != 0 && mTexture != 0;
@@ -92,6 +86,11 @@ void update(int width, int height, boolean isOpaque) {
9286
GLES20Canvas.nUpdateTextureLayer(mLayer, width, height, isOpaque, mSurface);
9387
}
9488

89+
@Override
90+
void setOpaque(boolean isOpaque) {
91+
throw new UnsupportedOperationException("Use update(int, int, boolean) instead");
92+
}
93+
9594
@Override
9695
void setTransform(Matrix matrix) {
9796
GLES20Canvas.nSetTextureLayerTransform(mLayer, matrix.native_instance);

core/java/android/view/HardwareLayer.java

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -106,6 +106,13 @@ boolean isOpaque() {
106106
return mOpaque;
107107
}
108108

109+
/**
110+
* Sets whether or not this layer should be considered opaque.
111+
*
112+
* @param isOpaque True if the layer is opaque, false otherwise
113+
*/
114+
abstract void setOpaque(boolean isOpaque);
115+
109116
/**
110117
* Indicates whether this layer can be rendered.
111118
*

core/java/android/view/View.java

Lines changed: 20 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -11928,9 +11928,24 @@ HardwareLayer getHardwareLayer() {
1192811928
mHardwareLayer = mAttachInfo.mHardwareRenderer.createHardwareLayer(
1192911929
width, height, isOpaque());
1193011930
mLocalDirtyRect.set(0, 0, width, height);
11931-
} else if (mHardwareLayer.getWidth() != width || mHardwareLayer.getHeight() != height) {
11932-
mHardwareLayer.resize(width, height);
11933-
mLocalDirtyRect.set(0, 0, width, height);
11931+
} else {
11932+
if (mHardwareLayer.getWidth() != width || mHardwareLayer.getHeight() != height) {
11933+
mHardwareLayer.resize(width, height);
11934+
mLocalDirtyRect.set(0, 0, width, height);
11935+
}
11936+
11937+
// This should not be necessary but applications that change
11938+
// the parameters of their background drawable without calling
11939+
// this.setBackground(Drawable) can leave the view in a bad state
11940+
// (for instance isOpaque() returns true, but the background is
11941+
// not opaque.)
11942+
computeOpaqueFlags();
11943+
11944+
final boolean opaque = isOpaque();
11945+
if (mHardwareLayer.isOpaque() != opaque) {
11946+
mHardwareLayer.setOpaque(opaque);
11947+
mLocalDirtyRect.set(0, 0, width, height);
11948+
}
1193411949
}
1193511950

1193611951
// The layer is not valid if the underlying GPU resources cannot be allocated
@@ -13989,6 +14004,8 @@ public void setBackground(Drawable background) {
1398914004
*/
1399014005
@Deprecated
1399114006
public void setBackgroundDrawable(Drawable background) {
14007+
computeOpaqueFlags();
14008+
1399214009
if (background == mBackground) {
1399314010
return;
1399414011
}

core/jni/android_view_GLES20Canvas.cpp

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -769,6 +769,13 @@ static void android_view_GLES20Canvas_resizeLayer(JNIEnv* env, jobject clazz,
769769
env->ReleaseIntArrayElements(layerInfo, storage, 0);
770770
}
771771

772+
static void android_view_GLES20Canvas_setOpaqueLayer(JNIEnv* env, jobject clazz,
773+
Layer* layer, jboolean isOpaque) {
774+
if (layer) {
775+
layer->setBlend(!isOpaque);
776+
}
777+
}
778+
772779
static void android_view_GLES20Canvas_updateTextureLayer(JNIEnv* env, jobject clazz,
773780
Layer* layer, jint width, jint height, jboolean isOpaque, jobject surface) {
774781
float transform[16];
@@ -969,6 +976,7 @@ static JNINativeMethod gMethods[] = {
969976
{ "nCreateLayerRenderer", "(I)I", (void*) android_view_GLES20Canvas_createLayerRenderer },
970977
{ "nCreateLayer", "(IIZ[I)I", (void*) android_view_GLES20Canvas_createLayer },
971978
{ "nResizeLayer", "(III[I)V" , (void*) android_view_GLES20Canvas_resizeLayer },
979+
{ "nSetOpaqueLayer", "(IZ)V", (void*) android_view_GLES20Canvas_setOpaqueLayer },
972980
{ "nCreateTextureLayer", "(Z[I)I", (void*) android_view_GLES20Canvas_createTextureLayer },
973981
{ "nUpdateTextureLayer", "(IIIZLandroid/graphics/SurfaceTexture;)V",
974982
(void*) android_view_GLES20Canvas_updateTextureLayer },

0 commit comments

Comments
 (0)