diff options
Diffstat (limited to 'tools/layoutlib/bridge/src/android/graphics/RadialGradient.java')
-rw-r--r-- | tools/layoutlib/bridge/src/android/graphics/RadialGradient.java | 158 |
1 files changed, 110 insertions, 48 deletions
diff --git a/tools/layoutlib/bridge/src/android/graphics/RadialGradient.java b/tools/layoutlib/bridge/src/android/graphics/RadialGradient.java index 13848c5..db8dff2 100644 --- a/tools/layoutlib/bridge/src/android/graphics/RadialGradient.java +++ b/tools/layoutlib/bridge/src/android/graphics/RadialGradient.java @@ -16,55 +16,117 @@ package android.graphics; -import java.awt.Paint; - -public class RadialGradient extends Shader { - - /** Create a shader that draws a radial gradient given the center and radius. - @param x The x-coordinate of the center of the radius - @param y The y-coordinate of the center of the radius - @param radius Must be positive. The radius of the circle for this gradient - @param colors The colors to be distributed between the center and edge of the circle - @param positions May be NULL. The relative position of - each corresponding color in the colors array. If this is NULL, - the the colors are distributed evenly between the center and edge of the circle. - @param tile The Shader tiling mode - */ - public RadialGradient(float x, float y, float radius, - int colors[], float positions[], TileMode tile) { - if (radius <= 0) { - throw new IllegalArgumentException("radius must be > 0"); - } - if (colors.length < 2) { - throw new IllegalArgumentException("needs >= 2 number of colors"); - } - if (positions != null && colors.length != positions.length) { - throw new IllegalArgumentException("color and position arrays must be of equal length"); - } - - // FIXME Implement shader - } - - /** Create a shader that draws a radial gradient given the center and radius. - @param x The x-coordinate of the center of the radius - @param y The y-coordinate of the center of the radius - @param radius Must be positive. The radius of the circle for this gradient - @param color0 The color at the center of the circle. - @param color1 The color at the edge of the circle. - @param tile The Shader tiling mode - */ - public RadialGradient(float x, float y, float radius, - int color0, int color1, TileMode tile) { - if (radius <= 0) { - throw new IllegalArgumentException("radius must be > 0"); - } - // FIXME Implement shader - } +public class RadialGradient extends GradientShader { + + private RadialGradientPaint mPaint; + + /** + * Create a shader that draws a radial gradient given the center and radius. + * + * @param x The x-coordinate of the center of the radius + * @param y The y-coordinate of the center of the radius + * @param radius Must be positive. The radius of the circle for this + * gradient + * @param colors The colors to be distributed between the center and edge of + * the circle + * @param positions May be NULL. The relative position of each corresponding + * color in the colors array. If this is NULL, the the colors are + * distributed evenly between the center and edge of the circle. + * @param tile The Shader tiling mode + */ + public RadialGradient(float x, float y, float radius, int colors[], float positions[], + TileMode tile) { + super(colors, positions); + if (radius <= 0) { + throw new IllegalArgumentException("radius must be > 0"); + } + + mPaint = new RadialGradientPaint(x, y, radius, mColors, mPositions, tile); + } + + /** + * Create a shader that draws a radial gradient given the center and radius. + * + * @param x The x-coordinate of the center of the radius + * @param y The y-coordinate of the center of the radius + * @param radius Must be positive. The radius of the circle for this + * gradient + * @param color0 The color at the center of the circle. + * @param color1 The color at the edge of the circle. + * @param tile The Shader tiling mode + */ + public RadialGradient(float x, float y, float radius, int color0, int color1, TileMode tile) { + this(x, y, radius, new int[] { color0, color1 }, null /* positions */, tile); + } @Override - Paint getJavaPaint() { - // TODO Auto-generated method stub - return null; + java.awt.Paint getJavaPaint() { + return mPaint; } -} + private static 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) { + super(colors, positions, mode); + mX = x; + mY = y; + mRadius = radius; + } + + public java.awt.PaintContext createContext( + java.awt.image.ColorModel colorModel, + java.awt.Rectangle deviceBounds, + java.awt.geom.Rectangle2D userBounds, + java.awt.geom.AffineTransform xform, + java.awt.RenderingHints hints) { + precomputeGradientColors(); + return new RadialGradientPaintContext(colorModel); + } + + private class RadialGradientPaintContext implements java.awt.PaintContext { + + private final java.awt.image.ColorModel mColorModel; + + public RadialGradientPaintContext(java.awt.image.ColorModel colorModel) { + mColorModel = colorModel; + } + + public void dispose() { + } + + public java.awt.image.ColorModel getColorModel() { + return mColorModel; + } + + 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); + + int[] data = new int[w*h]; + + // compute distance from each point to the center, and figure out the distance from + // it. + int index = 0; + for (int iy = 0 ; iy < h ; iy++) { + for (int ix = 0 ; ix < w ; ix++) { + float _x = x + ix - mX; + float _y = y + iy - mY; + float distance = (float) Math.sqrt(_x * _x + _y * _y); + + data[index++] = getGradientColor(distance / mRadius); + } + } + + image.setRGB(0 /*startX*/, 0 /*startY*/, w, h, data, 0 /*offset*/, w /*scansize*/); + + return image.getRaster(); + } + + } + } + +} |