Skip to content

Commit 4c9dfc4

Browse files
Romain GuyAndroid (Google) Code Review
authored andcommitted
Merge "Update layers' opaque property when needed"
2 parents f163367 + 846a533 commit 4c9dfc4

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
@@ -11932,9 +11932,24 @@ HardwareLayer getHardwareLayer() {
1193211932
mHardwareLayer = mAttachInfo.mHardwareRenderer.createHardwareLayer(
1193311933
width, height, isOpaque());
1193411934
mLocalDirtyRect.set(0, 0, width, height);
11935-
} else if (mHardwareLayer.getWidth() != width || mHardwareLayer.getHeight() != height) {
11936-
mHardwareLayer.resize(width, height);
11937-
mLocalDirtyRect.set(0, 0, width, height);
11935+
} else {
11936+
if (mHardwareLayer.getWidth() != width || mHardwareLayer.getHeight() != height) {
11937+
mHardwareLayer.resize(width, height);
11938+
mLocalDirtyRect.set(0, 0, width, height);
11939+
}
11940+
11941+
// This should not be necessary but applications that change
11942+
// the parameters of their background drawable without calling
11943+
// this.setBackground(Drawable) can leave the view in a bad state
11944+
// (for instance isOpaque() returns true, but the background is
11945+
// not opaque.)
11946+
computeOpaqueFlags();
11947+
11948+
final boolean opaque = isOpaque();
11949+
if (mHardwareLayer.isOpaque() != opaque) {
11950+
mHardwareLayer.setOpaque(opaque);
11951+
mLocalDirtyRect.set(0, 0, width, height);
11952+
}
1193811953
}
1193911954

1194011955
// The layer is not valid if the underlying GPU resources cannot be allocated
@@ -13993,6 +14008,8 @@ public void setBackground(Drawable background) {
1399314008
*/
1399414009
@Deprecated
1399514010
public void setBackgroundDrawable(Drawable background) {
14011+
computeOpaqueFlags();
14012+
1399614013
if (background == mBackground) {
1399714014
return;
1399814015
}

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)