1ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski/* 2ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski * Copyright (C) 2010 The Android Open Source Project 3ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski * 4ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski * Licensed under the Apache License, Version 2.0 (the "License"); 5ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski * you may not use this file except in compliance with the License. 6ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski * You may obtain a copy of the License at 7ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski * 8ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski * http://www.apache.org/licenses/LICENSE-2.0 9ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski * 10ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski * Unless required by applicable law or agreed to in writing, software 11ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski * distributed under the License is distributed on an "AS IS" BASIS, 12ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski * See the License for the specific language governing permissions and 14ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski * limitations under the License. 15ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski */ 16ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski 17ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinskipackage android.graphics; 18ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski 19ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinskiimport com.android.ide.common.rendering.api.LayoutLog; 20ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinskiimport com.android.layoutlib.bridge.Bridge; 21ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinskiimport com.android.layoutlib.bridge.impl.DelegateManager; 22ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinskiimport com.android.tools.layoutlib.annotations.LayoutlibDelegate; 23ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski 24ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski/** 25ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski * Delegate implementing the native methods of android.graphics.SweepGradient 26ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski * 27ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski * Through the layoutlib_create tool, the original native methods of SweepGradient have been 28ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski * replaced by calls to methods of the same name in this delegate class. 29ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski * 30ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski * This class behaves like the original native implementation, but in Java, keeping previously 31ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski * native data into its own objects and mapping them to int that are sent back and forth between 32ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski * it and the original SweepGradient class. 33ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski * 34ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski * Because this extends {@link Shader_Delegate}, there's no need to use a {@link DelegateManager}, 35ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski * as all the Shader classes will be added to the manager owned by {@link Shader_Delegate}. 36ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski * 37ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski * @see Shader_Delegate 38ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski * 39ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski */ 40ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinskipublic class SweepGradient_Delegate extends Gradient_Delegate { 41ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski 42ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski // ---- delegate data ---- 43ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski private java.awt.Paint mJavaPaint; 44ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski 45ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski // ---- Public Helper methods ---- 46ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski 47ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski @Override 48ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski public java.awt.Paint getJavaPaint() { 49ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski return mJavaPaint; 50ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski } 51ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski 52ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski // ---- native methods ---- 53ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski 54ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski @LayoutlibDelegate 5531cf782fd23fc17bab3d312c6eb8ae734c1f16c1Jerome Gaillard /*package*/ static long nativeCreate1(long matrix, float x, float y, int colors[], float 5631cf782fd23fc17bab3d312c6eb8ae734c1f16c1Jerome Gaillard positions[]) { 5731cf782fd23fc17bab3d312c6eb8ae734c1f16c1Jerome Gaillard SweepGradient_Delegate newDelegate = new SweepGradient_Delegate(matrix, x, y, colors, 5831cf782fd23fc17bab3d312c6eb8ae734c1f16c1Jerome Gaillard positions); 59ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski return sManager.addNewDelegate(newDelegate); 60ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski } 61ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski 62ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski @LayoutlibDelegate 6331cf782fd23fc17bab3d312c6eb8ae734c1f16c1Jerome Gaillard /*package*/ static long nativeCreate2(long matrix, float x, float y, int color0, int color1) { 6431cf782fd23fc17bab3d312c6eb8ae734c1f16c1Jerome Gaillard return nativeCreate1(matrix, x, y, new int[] { color0, color1 }, 6531cf782fd23fc17bab3d312c6eb8ae734c1f16c1Jerome Gaillard null /*positions*/); 66ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski } 67ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski 68ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski // ---- Private delegate/helper methods ---- 69ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski 70ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski /** 71ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski * A subclass of Shader that draws a sweep gradient around a center point. 72ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski * 7331cf782fd23fc17bab3d312c6eb8ae734c1f16c1Jerome Gaillard * @param nativeMatrix reference to the shader's native transformation matrix 74ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski * @param cx The x-coordinate of the center 75ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski * @param cy The y-coordinate of the center 76ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski * @param colors The colors to be distributed between around the center. 77ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski * There must be at least 2 colors in the array. 78ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski * @param positions May be NULL. The relative position of 79ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski * each corresponding color in the colors array, beginning 80ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski * with 0 and ending with 1.0. If the values are not 81ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski * monotonic, the drawing may produce unexpected results. 82ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski * If positions is NULL, then the colors are automatically 83ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski * spaced evenly. 84ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski */ 8531cf782fd23fc17bab3d312c6eb8ae734c1f16c1Jerome Gaillard private SweepGradient_Delegate(long nativeMatrix, float cx, float cy, 8631cf782fd23fc17bab3d312c6eb8ae734c1f16c1Jerome Gaillard int colors[], float positions[]) { 8731cf782fd23fc17bab3d312c6eb8ae734c1f16c1Jerome Gaillard super(nativeMatrix, colors, positions); 88ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski mJavaPaint = new SweepGradientPaint(cx, cy, mColors, mPositions); 89ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski } 90ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski 91ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski private class SweepGradientPaint extends GradientPaint { 92ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski 93ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski private final float mCx; 94ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski private final float mCy; 95ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski 96ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski public SweepGradientPaint(float cx, float cy, int[] colors, 97ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski float[] positions) { 98ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski super(colors, positions, null /*tileMode*/); 99ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski mCx = cx; 100ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski mCy = cy; 101ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski } 102ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski 103ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski @Override 104ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski public java.awt.PaintContext createContext( 105ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski java.awt.image.ColorModel colorModel, 106ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski java.awt.Rectangle deviceBounds, 107ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski java.awt.geom.Rectangle2D userBounds, 108ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski java.awt.geom.AffineTransform xform, 109ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski java.awt.RenderingHints hints) { 110ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski precomputeGradientColors(); 111ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski 112ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski java.awt.geom.AffineTransform canvasMatrix; 113ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski try { 114ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski canvasMatrix = xform.createInverse(); 115ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski } catch (java.awt.geom.NoninvertibleTransformException e) { 116ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski Bridge.getLog().fidelityWarning(LayoutLog.TAG_MATRIX_INVERSE, 117ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski "Unable to inverse matrix in SweepGradient", e, null /*data*/); 118ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski canvasMatrix = new java.awt.geom.AffineTransform(); 119ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski } 120ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski 121ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski java.awt.geom.AffineTransform localMatrix = getLocalMatrix(); 122ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski try { 123ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski localMatrix = localMatrix.createInverse(); 124ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski } catch (java.awt.geom.NoninvertibleTransformException e) { 125ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski Bridge.getLog().fidelityWarning(LayoutLog.TAG_MATRIX_INVERSE, 126ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski "Unable to inverse matrix in SweepGradient", e, null /*data*/); 127ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski localMatrix = new java.awt.geom.AffineTransform(); 128ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski } 129ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski 130ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski return new SweepGradientPaintContext(canvasMatrix, localMatrix, colorModel); 131ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski } 132ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski 133ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski private class SweepGradientPaintContext implements java.awt.PaintContext { 134ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski 135ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski private final java.awt.geom.AffineTransform mCanvasMatrix; 136ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski private final java.awt.geom.AffineTransform mLocalMatrix; 137ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski private final java.awt.image.ColorModel mColorModel; 138ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski 139ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski public SweepGradientPaintContext( 140ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski java.awt.geom.AffineTransform canvasMatrix, 141ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski java.awt.geom.AffineTransform localMatrix, 142ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski java.awt.image.ColorModel colorModel) { 143ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski mCanvasMatrix = canvasMatrix; 144ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski mLocalMatrix = localMatrix; 145ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski mColorModel = colorModel; 146ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski } 147ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski 148ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski @Override 149ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski public void dispose() { 150ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski } 151ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski 152ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski @Override 153ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski public java.awt.image.ColorModel getColorModel() { 154ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski return mColorModel; 155ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski } 156ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski 157ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski @Override 158ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski public java.awt.image.Raster getRaster(int x, int y, int w, int h) { 159b5e9f570a5ad8b5a290d827069d8824eb6914324Diego Perez java.awt.image.BufferedImage image = new java.awt.image.BufferedImage( 160b5e9f570a5ad8b5a290d827069d8824eb6914324Diego Perez mColorModel, mColorModel.createCompatibleWritableRaster(w, h), 161b5e9f570a5ad8b5a290d827069d8824eb6914324Diego Perez mColorModel.isAlphaPremultiplied(), null); 162ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski 163ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski int[] data = new int[w*h]; 164ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski 165ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski // compute angle from each point to the center, and figure out the distance from 166ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski // it. 167ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski int index = 0; 168ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski float[] pt1 = new float[2]; 169ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski float[] pt2 = new float[2]; 170ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski for (int iy = 0 ; iy < h ; iy++) { 171ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski for (int ix = 0 ; ix < w ; ix++) { 172ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski // handle the canvas transform 173ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski pt1[0] = x + ix; 174ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski pt1[1] = y + iy; 175ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski mCanvasMatrix.transform(pt1, 0, pt2, 0, 1); 176ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski 177ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski // handle the local matrix 178ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski pt1[0] = pt2[0] - mCx; 179ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski pt1[1] = pt2[1] - mCy; 180ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski mLocalMatrix.transform(pt1, 0, pt2, 0, 1); 181ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski 182ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski float dx = pt2[0]; 183ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski float dy = pt2[1]; 184ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski 185ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski float angle; 186ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski if (dx == 0) { 187ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski angle = (float) (dy < 0 ? 3 * Math.PI / 2 : Math.PI / 2); 188ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski } else if (dy == 0) { 189ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski angle = (float) (dx < 0 ? Math.PI : 0); 190ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski } else { 191ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski angle = (float) Math.atan(dy / dx); 192ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski if (dx > 0) { 193ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski if (dy < 0) { 194ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski angle += Math.PI * 2; 195ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski } 196ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski } else { 197ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski angle += Math.PI; 198ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski } 199ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski } 200ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski 201ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski // convert to 0-1. value and get color 202ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski data[index++] = getGradientColor((float) (angle / (2 * Math.PI))); 203ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski } 204ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski } 205ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski 206ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski image.setRGB(0 /*startX*/, 0 /*startY*/, w, h, data, 0 /*offset*/, w /*scansize*/); 207ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski 208ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski return image.getRaster(); 209ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski } 210ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski 211ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski } 212ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski } 213ab775ecdd189b32e35b0d3f4a821502f88b03a4bAdam Lesinski} 214