diff options
author | Xavier Ducrohet <xav@android.com> | 2010-12-14 15:03:26 -0800 |
---|---|---|
committer | Android (Google) Code Review <android-gerrit@google.com> | 2010-12-14 15:03:26 -0800 |
commit | 21534cfc78bacc2e76a84fa198605ee2a831de84 (patch) | |
tree | d56c698d7dabf3b1683bb61081d88878145808c9 /tools/layoutlib/bridge/src/android/graphics/RadialGradient_Delegate.java | |
parent | 644b75edb3a336dbae2e363d609ff4228ce05210 (diff) | |
parent | d9c64369cf9be6568af2d79c35fb470cc261730d (diff) | |
download | frameworks_base-21534cfc78bacc2e76a84fa198605ee2a831de84.zip frameworks_base-21534cfc78bacc2e76a84fa198605ee2a831de84.tar.gz frameworks_base-21534cfc78bacc2e76a84fa198605ee2a831de84.tar.bz2 |
Merge "LayoutLib: Fix gradient rendering."
Diffstat (limited to 'tools/layoutlib/bridge/src/android/graphics/RadialGradient_Delegate.java')
-rw-r--r-- | tools/layoutlib/bridge/src/android/graphics/RadialGradient_Delegate.java | 52 |
1 files changed, 44 insertions, 8 deletions
diff --git a/tools/layoutlib/bridge/src/android/graphics/RadialGradient_Delegate.java b/tools/layoutlib/bridge/src/android/graphics/RadialGradient_Delegate.java index c36ce53..eebf378 100644 --- a/tools/layoutlib/bridge/src/android/graphics/RadialGradient_Delegate.java +++ b/tools/layoutlib/bridge/src/android/graphics/RadialGradient_Delegate.java @@ -16,11 +16,14 @@ package android.graphics; +import com.android.layoutlib.bridge.Bridge; import com.android.layoutlib.bridge.impl.DelegateManager; import android.graphics.Shader.TileMode; import java.awt.Paint; +import java.awt.geom.AffineTransform; +import java.awt.geom.NoninvertibleTransformException; /** * Delegate implementing the native methods of android.graphics.RadialGradient @@ -105,18 +108,17 @@ public class RadialGradient_Delegate extends Gradient_Delegate { private RadialGradient_Delegate(float x, float y, float radius, int colors[], float positions[], TileMode tile) { super(colors, positions); - mJavaPaint = new RadialGradientPaint(x, y, radius, mColors, mPositions, tile); } - private static class RadialGradientPaint extends GradientPaint { + private class RadialGradientPaint extends GradientPaint { private final float mX; private final float mY; private final float mRadius; - public RadialGradientPaint(float x, float y, float radius, int[] colors, float[] positions, - TileMode mode) { + public RadialGradientPaint(float x, float y, float radius, + int[] colors, float[] positions, TileMode mode) { super(colors, positions, mode); mX = x; mY = y; @@ -130,14 +132,36 @@ public class RadialGradient_Delegate extends Gradient_Delegate { java.awt.geom.AffineTransform xform, java.awt.RenderingHints hints) { precomputeGradientColors(); - return new RadialGradientPaintContext(colorModel); + + AffineTransform canvasMatrix; + try { + canvasMatrix = xform.createInverse(); + } catch (NoninvertibleTransformException e) { + Bridge.getLog().error(null, "Unable to inverse matrix in RadialGradient", e); + canvasMatrix = new AffineTransform(); + } + + AffineTransform localMatrix = getLocalMatrix(); + try { + localMatrix = localMatrix.createInverse(); + } catch (NoninvertibleTransformException e) { + Bridge.getLog().error(null, "Unable to inverse matrix in RadialGradient", e); + localMatrix = new AffineTransform(); + } + + return new RadialGradientPaintContext(canvasMatrix, localMatrix, colorModel); } private class RadialGradientPaintContext implements java.awt.PaintContext { + private final AffineTransform mCanvasMatrix; + private final AffineTransform mLocalMatrix; private final java.awt.image.ColorModel mColorModel; - public RadialGradientPaintContext(java.awt.image.ColorModel colorModel) { + public RadialGradientPaintContext(AffineTransform canvasMatrix, + AffineTransform localMatrix, java.awt.image.ColorModel colorModel) { + mCanvasMatrix = canvasMatrix; + mLocalMatrix = localMatrix; mColorModel = colorModel; } @@ -157,10 +181,22 @@ public class RadialGradient_Delegate extends Gradient_Delegate { // compute distance from each point to the center, and figure out the distance from // it. int index = 0; + float[] pt1 = new float[2]; + float[] pt2 = new float[2]; for (int iy = 0 ; iy < h ; iy++) { for (int ix = 0 ; ix < w ; ix++) { - float _x = x + ix - mX; - float _y = y + iy - mY; + // handle the canvas transform + pt1[0] = x + ix; + pt1[1] = y + iy; + mCanvasMatrix.transform(pt1, 0, pt2, 0, 1); + + // handle the local matrix + pt1[0] = pt2[0] - mX; + pt1[1] = pt2[1] - mY; + mLocalMatrix.transform(pt1, 0, pt2, 0, 1); + + float _x = pt2[0]; + float _y = pt2[1]; float distance = (float) Math.sqrt(_x * _x + _y * _y); data[index++] = getGradientColor(distance / mRadius); |