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));
             }
         }