LayoutLib: don't render when shader's local matrix is set to 0 scale.
Change-Id: I7726d87f3dd0475ac662f535a08c6435b8b9ed1f
diff --git a/tools/layoutlib/bridge/src/android/graphics/Shader_Delegate.java b/tools/layoutlib/bridge/src/android/graphics/Shader_Delegate.java
index c6dd54b..472fc80 100644
--- a/tools/layoutlib/bridge/src/android/graphics/Shader_Delegate.java
+++ b/tools/layoutlib/bridge/src/android/graphics/Shader_Delegate.java
@@ -73,6 +73,14 @@
public abstract boolean isSupported();
public abstract String getSupportMessage();
+ public boolean isValid() {
+ if (mLocalMatrix != null && mLocalMatrix.getAffineTransform().getDeterminant() == 0) {
+ return false;
+ }
+
+ return true;
+ }
+
// ---- native methods ----
@LayoutlibDelegate
@@ -126,5 +134,4 @@
return new java.awt.geom.AffineTransform();
}
-
}
diff --git a/tools/layoutlib/bridge/src/com/android/layoutlib/bridge/impl/GcSnapshot.java b/tools/layoutlib/bridge/src/com/android/layoutlib/bridge/impl/GcSnapshot.java
index 1cf64a8..2abe56c 100644
--- a/tools/layoutlib/bridge/src/com/android/layoutlib/bridge/impl/GcSnapshot.java
+++ b/tools/layoutlib/bridge/src/com/android/layoutlib/bridge/impl/GcSnapshot.java
@@ -603,11 +603,13 @@
createCustomGraphics(originalGraphics, paint, compositeOnly, forceSrcMode) :
(Graphics2D) originalGraphics.create();
- try {
- drawable.draw(configuredGraphics2D, paint);
- } finally {
- // dispose Graphics2D object
- configuredGraphics2D.dispose();
+ if (configuredGraphics2D != null) {
+ try {
+ drawable.draw(configuredGraphics2D, paint);
+ } finally {
+ // dispose Graphics2D object
+ configuredGraphics2D.dispose();
+ }
}
}
@@ -680,11 +682,13 @@
Graphics2D g = createCustomGraphics(baseGfx, mLocalLayerPaint,
true /*alphaOnly*/, false /*forceSrcMode*/);
- g.drawImage(mLocalLayer.getImage(),
- mLayerBounds.left, mLayerBounds.top, mLayerBounds.right, mLayerBounds.bottom,
- mLayerBounds.left, mLayerBounds.top, mLayerBounds.right, mLayerBounds.bottom,
- null);
- g.dispose();
+ if (g != null) {
+ g.drawImage(mLocalLayer.getImage(),
+ mLayerBounds.left, mLayerBounds.top, mLayerBounds.right, mLayerBounds.bottom,
+ mLayerBounds.left, mLayerBounds.top, mLayerBounds.right, mLayerBounds.bottom,
+ null);
+ g.dispose();
+ }
baseGfx.dispose();
}
@@ -714,11 +718,17 @@
Shader_Delegate shaderDelegate = paint.getShader();
if (shaderDelegate != null) {
if (shaderDelegate.isSupported()) {
- java.awt.Paint shaderPaint = shaderDelegate.getJavaPaint();
- assert shaderPaint != null;
- if (shaderPaint != null) {
- g.setPaint(shaderPaint);
- customShader = true;
+ // shader could have a local matrix that's not valid (for instance 0 scaling).
+ if (shaderDelegate.isValid()) {
+ java.awt.Paint shaderPaint = shaderDelegate.getJavaPaint();
+ assert shaderPaint != null;
+ if (shaderPaint != null) {
+ g.setPaint(shaderPaint);
+ customShader = true;
+ }
+ } else {
+ g.dispose();
+ return null;
}
} else {
Bridge.getLog().fidelityWarning(LayoutLog.TAG_SHADER,
@@ -742,7 +752,7 @@
if (forceSrcMode) {
g.setComposite(AlphaComposite.getInstance(
- AlphaComposite.SRC, (float) alpha / 255.f));
+ AlphaComposite.SRC, alpha / 255.f));
} else {
boolean customXfermode = false;
Xfermode_Delegate xfermodeDelegate = paint.getXfermode();
@@ -766,7 +776,7 @@
// that will handle the alpha.
if (customXfermode == false && alpha != 0xFF) {
g.setComposite(AlphaComposite.getInstance(
- AlphaComposite.SRC_OVER, (float) alpha / 255.f));
+ AlphaComposite.SRC_OVER, alpha / 255.f));
}
}