From 2d3449f982f9f4b9f4370142bb846d2dbab5a38e Mon Sep 17 00:00:00 2001 From: Diego Perez Date: Thu, 12 Mar 2015 13:11:07 +0000 Subject: [PATCH] Make sure shaders use a color model compatible with the destination. Change-Id: Iaf6e14bb86835c36a5b0c37519ac2ee794d10081 (cherry picked from commit 158ac454073a460375123d7d05152a7c6490efb6) --- .../bridge/src/android/graphics/BitmapShader_Delegate.java | 12 ++++++++++-- .../bridge/src/android/graphics/LinearGradient_Delegate.java | 5 +++-- .../bridge/src/android/graphics/RadialGradient_Delegate.java | 5 +++-- .../bridge/src/android/graphics/SweepGradient_Delegate.java | 5 +++-- 4 files changed, 19 insertions(+), 8 deletions(-) diff --git a/tools/layoutlib/bridge/src/android/graphics/BitmapShader_Delegate.java b/tools/layoutlib/bridge/src/android/graphics/BitmapShader_Delegate.java index 610c867dd09d..e9b5d6efcef0 100644 --- a/tools/layoutlib/bridge/src/android/graphics/BitmapShader_Delegate.java +++ b/tools/layoutlib/bridge/src/android/graphics/BitmapShader_Delegate.java @@ -23,6 +23,8 @@ import com.android.tools.layoutlib.annotations.LayoutlibDelegate; import android.graphics.Shader.TileMode; +import java.awt.image.ColorModel; + /** * Delegate implementing the native methods of android.graphics.BitmapShader * @@ -124,6 +126,11 @@ public class BitmapShader_Delegate extends Shader_Delegate { localMatrix = new java.awt.geom.AffineTransform(); } + if (!colorModel.isCompatibleRaster(mImage.getRaster())) { + // Fallback to the default ARGB color model + colorModel = ColorModel.getRGBdefault(); + } + return new BitmapShaderContext(canvasMatrix, localMatrix, colorModel); } @@ -153,8 +160,9 @@ public class BitmapShader_Delegate extends Shader_Delegate { @Override public java.awt.image.Raster getRaster(int x, int y, int w, int h) { - java.awt.image.BufferedImage image = new java.awt.image.BufferedImage(w, h, - java.awt.image.BufferedImage.TYPE_INT_ARGB); + java.awt.image.BufferedImage image = new java.awt.image.BufferedImage( + mColorModel, mColorModel.createCompatibleWritableRaster(w, h), + mColorModel.isAlphaPremultiplied(), null); int[] data = new int[w*h]; diff --git a/tools/layoutlib/bridge/src/android/graphics/LinearGradient_Delegate.java b/tools/layoutlib/bridge/src/android/graphics/LinearGradient_Delegate.java index 55c4b98306b3..703719c93f4f 100644 --- a/tools/layoutlib/bridge/src/android/graphics/LinearGradient_Delegate.java +++ b/tools/layoutlib/bridge/src/android/graphics/LinearGradient_Delegate.java @@ -172,8 +172,9 @@ public final class LinearGradient_Delegate extends Gradient_Delegate { @Override public java.awt.image.Raster getRaster(int x, int y, int w, int h) { - java.awt.image.BufferedImage image = new java.awt.image.BufferedImage(w, h, - java.awt.image.BufferedImage.TYPE_INT_ARGB); + java.awt.image.BufferedImage image = new java.awt.image.BufferedImage( + mColorModel, mColorModel.createCompatibleWritableRaster(w, h), + mColorModel.isAlphaPremultiplied(), null); int[] data = new int[w*h]; diff --git a/tools/layoutlib/bridge/src/android/graphics/RadialGradient_Delegate.java b/tools/layoutlib/bridge/src/android/graphics/RadialGradient_Delegate.java index 80179ee5703d..6edb14082f08 100644 --- a/tools/layoutlib/bridge/src/android/graphics/RadialGradient_Delegate.java +++ b/tools/layoutlib/bridge/src/android/graphics/RadialGradient_Delegate.java @@ -160,8 +160,9 @@ public class RadialGradient_Delegate extends Gradient_Delegate { @Override public java.awt.image.Raster getRaster(int x, int y, int w, int h) { - java.awt.image.BufferedImage image = new java.awt.image.BufferedImage(w, h, - java.awt.image.BufferedImage.TYPE_INT_ARGB); + java.awt.image.BufferedImage image = new java.awt.image.BufferedImage( + mColorModel, mColorModel.createCompatibleWritableRaster(w, h), + mColorModel.isAlphaPremultiplied(), null); int[] data = new int[w*h]; diff --git a/tools/layoutlib/bridge/src/android/graphics/SweepGradient_Delegate.java b/tools/layoutlib/bridge/src/android/graphics/SweepGradient_Delegate.java index 95a57a99c5be..544ba9865aab 100644 --- a/tools/layoutlib/bridge/src/android/graphics/SweepGradient_Delegate.java +++ b/tools/layoutlib/bridge/src/android/graphics/SweepGradient_Delegate.java @@ -152,8 +152,9 @@ public class SweepGradient_Delegate extends Gradient_Delegate { @Override public java.awt.image.Raster getRaster(int x, int y, int w, int h) { - java.awt.image.BufferedImage image = new java.awt.image.BufferedImage(w, h, - java.awt.image.BufferedImage.TYPE_INT_ARGB); + java.awt.image.BufferedImage image = new java.awt.image.BufferedImage( + mColorModel, mColorModel.createCompatibleWritableRaster(w, h), + mColorModel.isAlphaPremultiplied(), null); int[] data = new int[w*h]; -- 2.11.0