19066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/* 2251d2e99245095369b52d891a660b2ed270f02e0Xavier Ducrohet * Copyright (C) 2010 The Android Open Source Project 39066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 49066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Licensed under the Apache License, Version 2.0 (the "License"); 59066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * you may not use this file except in compliance with the License. 69066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * You may obtain a copy of the License at 79066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 89066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * http://www.apache.org/licenses/LICENSE-2.0 99066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Unless required by applicable law or agreed to in writing, software 119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * distributed under the License is distributed on an "AS IS" BASIS, 129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * See the License for the specific language governing permissions and 149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * limitations under the License. 159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectpackage android.graphics; 189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 19918aaa5717fce6081557c82ce1c439b6922737d5Xavier Ducrohetimport com.android.ide.common.rendering.api.LayoutLog; 20d9c64369cf9be6568af2d79c35fb470cc261730dXavier Ducrohetimport com.android.layoutlib.bridge.Bridge; 21c2e9651bf386a1f7bf7fc706cf5424950570470cXavier Ducrohetimport com.android.layoutlib.bridge.impl.DelegateManager; 229a4fe29c8d92014d2d9a848e9116b8cc9d0842f9Xavier Ducrohetimport com.android.tools.layoutlib.annotations.LayoutlibDelegate; 2363b2e616278c1b4284e1adbcc3936d0516083dcbXavier Ducrohet 24251d2e99245095369b52d891a660b2ed270f02e0Xavier Ducrohet/** 25251d2e99245095369b52d891a660b2ed270f02e0Xavier Ducrohet * Delegate implementing the native methods of android.graphics.SweepGradient 26251d2e99245095369b52d891a660b2ed270f02e0Xavier Ducrohet * 27251d2e99245095369b52d891a660b2ed270f02e0Xavier Ducrohet * Through the layoutlib_create tool, the original native methods of SweepGradient have been 28251d2e99245095369b52d891a660b2ed270f02e0Xavier Ducrohet * replaced by calls to methods of the same name in this delegate class. 29251d2e99245095369b52d891a660b2ed270f02e0Xavier Ducrohet * 30251d2e99245095369b52d891a660b2ed270f02e0Xavier Ducrohet * This class behaves like the original native implementation, but in Java, keeping previously 31251d2e99245095369b52d891a660b2ed270f02e0Xavier Ducrohet * native data into its own objects and mapping them to int that are sent back and forth between 32251d2e99245095369b52d891a660b2ed270f02e0Xavier Ducrohet * it and the original SweepGradient class. 33251d2e99245095369b52d891a660b2ed270f02e0Xavier Ducrohet * 34251d2e99245095369b52d891a660b2ed270f02e0Xavier Ducrohet * Because this extends {@link Shader_Delegate}, there's no need to use a {@link DelegateManager}, 35251d2e99245095369b52d891a660b2ed270f02e0Xavier Ducrohet * as all the Shader classes will be added to the manager owned by {@link Shader_Delegate}. 36251d2e99245095369b52d891a660b2ed270f02e0Xavier Ducrohet * 37251d2e99245095369b52d891a660b2ed270f02e0Xavier Ducrohet * @see Shader_Delegate 38251d2e99245095369b52d891a660b2ed270f02e0Xavier Ducrohet * 39251d2e99245095369b52d891a660b2ed270f02e0Xavier Ducrohet */ 40251d2e99245095369b52d891a660b2ed270f02e0Xavier Ducrohetpublic class SweepGradient_Delegate extends Gradient_Delegate { 41251d2e99245095369b52d891a660b2ed270f02e0Xavier Ducrohet 42251d2e99245095369b52d891a660b2ed270f02e0Xavier Ducrohet // ---- delegate data ---- 43251d2e99245095369b52d891a660b2ed270f02e0Xavier Ducrohet private java.awt.Paint mJavaPaint; 44251d2e99245095369b52d891a660b2ed270f02e0Xavier Ducrohet 45251d2e99245095369b52d891a660b2ed270f02e0Xavier Ducrohet // ---- Public Helper methods ---- 46251d2e99245095369b52d891a660b2ed270f02e0Xavier Ducrohet 47251d2e99245095369b52d891a660b2ed270f02e0Xavier Ducrohet @Override 48d348b6eaa98e23cb38d90906df109aaa2d20ea7fXavier Ducrohet public java.awt.Paint getJavaPaint() { 49251d2e99245095369b52d891a660b2ed270f02e0Xavier Ducrohet return mJavaPaint; 50251d2e99245095369b52d891a660b2ed270f02e0Xavier Ducrohet } 51251d2e99245095369b52d891a660b2ed270f02e0Xavier Ducrohet 52251d2e99245095369b52d891a660b2ed270f02e0Xavier Ducrohet // ---- native methods ---- 53251d2e99245095369b52d891a660b2ed270f02e0Xavier Ducrohet 549a4fe29c8d92014d2d9a848e9116b8cc9d0842f9Xavier Ducrohet @LayoutlibDelegate 55251d2e99245095369b52d891a660b2ed270f02e0Xavier Ducrohet /*package*/ static int nativeCreate1(float x, float y, int colors[], float positions[]) { 56251d2e99245095369b52d891a660b2ed270f02e0Xavier Ducrohet SweepGradient_Delegate newDelegate = new SweepGradient_Delegate(x, y, colors, positions); 57cc4977d0fdaf657907912fd6cc2f9426dc8d2e36Xavier Ducrohet return sManager.addNewDelegate(newDelegate); 58251d2e99245095369b52d891a660b2ed270f02e0Xavier Ducrohet } 59251d2e99245095369b52d891a660b2ed270f02e0Xavier Ducrohet 609a4fe29c8d92014d2d9a848e9116b8cc9d0842f9Xavier Ducrohet @LayoutlibDelegate 61251d2e99245095369b52d891a660b2ed270f02e0Xavier Ducrohet /*package*/ static int nativeCreate2(float x, float y, int color0, int color1) { 62251d2e99245095369b52d891a660b2ed270f02e0Xavier Ducrohet return nativeCreate1(x, y, new int[] { color0, color1 }, null /*positions*/); 63251d2e99245095369b52d891a660b2ed270f02e0Xavier Ducrohet } 64251d2e99245095369b52d891a660b2ed270f02e0Xavier Ducrohet 659a4fe29c8d92014d2d9a848e9116b8cc9d0842f9Xavier Ducrohet @LayoutlibDelegate 66251d2e99245095369b52d891a660b2ed270f02e0Xavier Ducrohet /*package*/ static int nativePostCreate1(int native_shader, float cx, float cy, 67251d2e99245095369b52d891a660b2ed270f02e0Xavier Ducrohet int[] colors, float[] positions) { 68251d2e99245095369b52d891a660b2ed270f02e0Xavier Ducrohet // nothing to be done here. 69251d2e99245095369b52d891a660b2ed270f02e0Xavier Ducrohet return 0; 70251d2e99245095369b52d891a660b2ed270f02e0Xavier Ducrohet } 71251d2e99245095369b52d891a660b2ed270f02e0Xavier Ducrohet 729a4fe29c8d92014d2d9a848e9116b8cc9d0842f9Xavier Ducrohet @LayoutlibDelegate 73251d2e99245095369b52d891a660b2ed270f02e0Xavier Ducrohet /*package*/ static int nativePostCreate2(int native_shader, float cx, float cy, 74251d2e99245095369b52d891a660b2ed270f02e0Xavier Ducrohet int color0, int color1) { 75251d2e99245095369b52d891a660b2ed270f02e0Xavier Ducrohet // nothing to be done here. 76251d2e99245095369b52d891a660b2ed270f02e0Xavier Ducrohet return 0; 77251d2e99245095369b52d891a660b2ed270f02e0Xavier Ducrohet } 78251d2e99245095369b52d891a660b2ed270f02e0Xavier Ducrohet 79251d2e99245095369b52d891a660b2ed270f02e0Xavier Ducrohet // ---- Private delegate/helper methods ---- 809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * A subclass of Shader that draws a sweep gradient around a center point. 839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param cx The x-coordinate of the center 859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param cy The y-coordinate of the center 869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param colors The colors to be distributed between around the center. 879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * There must be at least 2 colors in the array. 889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param positions May be NULL. The relative position of 899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * each corresponding color in the colors array, beginning 909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * with 0 and ending with 1.0. If the values are not 919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * monotonic, the drawing may produce unexpected results. 929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * If positions is NULL, then the colors are automatically 939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * spaced evenly. 949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 95251d2e99245095369b52d891a660b2ed270f02e0Xavier Ducrohet private SweepGradient_Delegate(float cx, float cy, 969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int colors[], float positions[]) { 973330927bdd2fedcbc8745f99d3f40929f47fdd31Xavier Ducrohet super(colors, positions); 98251d2e99245095369b52d891a660b2ed270f02e0Xavier Ducrohet mJavaPaint = new SweepGradientPaint(cx, cy, mColors, mPositions); 9963b2e616278c1b4284e1adbcc3936d0516083dcbXavier Ducrohet } 1003330927bdd2fedcbc8745f99d3f40929f47fdd31Xavier Ducrohet 101d9c64369cf9be6568af2d79c35fb470cc261730dXavier Ducrohet private class SweepGradientPaint extends GradientPaint { 1023330927bdd2fedcbc8745f99d3f40929f47fdd31Xavier Ducrohet 1033330927bdd2fedcbc8745f99d3f40929f47fdd31Xavier Ducrohet private final float mCx; 1043330927bdd2fedcbc8745f99d3f40929f47fdd31Xavier Ducrohet private final float mCy; 1053330927bdd2fedcbc8745f99d3f40929f47fdd31Xavier Ducrohet 106d9c64369cf9be6568af2d79c35fb470cc261730dXavier Ducrohet public SweepGradientPaint(float cx, float cy, int[] colors, 107d9c64369cf9be6568af2d79c35fb470cc261730dXavier Ducrohet float[] positions) { 1083330927bdd2fedcbc8745f99d3f40929f47fdd31Xavier Ducrohet super(colors, positions, null /*tileMode*/); 1093330927bdd2fedcbc8745f99d3f40929f47fdd31Xavier Ducrohet mCx = cx; 1103330927bdd2fedcbc8745f99d3f40929f47fdd31Xavier Ducrohet mCy = cy; 1113330927bdd2fedcbc8745f99d3f40929f47fdd31Xavier Ducrohet } 1123330927bdd2fedcbc8745f99d3f40929f47fdd31Xavier Ducrohet 11346d43ccfd8cef75b4315828073c094cf1efb05ffXavier Ducrohet @Override 1143330927bdd2fedcbc8745f99d3f40929f47fdd31Xavier Ducrohet public java.awt.PaintContext createContext( 1153330927bdd2fedcbc8745f99d3f40929f47fdd31Xavier Ducrohet java.awt.image.ColorModel colorModel, 1163330927bdd2fedcbc8745f99d3f40929f47fdd31Xavier Ducrohet java.awt.Rectangle deviceBounds, 1173330927bdd2fedcbc8745f99d3f40929f47fdd31Xavier Ducrohet java.awt.geom.Rectangle2D userBounds, 1183330927bdd2fedcbc8745f99d3f40929f47fdd31Xavier Ducrohet java.awt.geom.AffineTransform xform, 1193330927bdd2fedcbc8745f99d3f40929f47fdd31Xavier Ducrohet java.awt.RenderingHints hints) { 1203330927bdd2fedcbc8745f99d3f40929f47fdd31Xavier Ducrohet precomputeGradientColors(); 121d9c64369cf9be6568af2d79c35fb470cc261730dXavier Ducrohet 122d348b6eaa98e23cb38d90906df109aaa2d20ea7fXavier Ducrohet java.awt.geom.AffineTransform canvasMatrix; 123d9c64369cf9be6568af2d79c35fb470cc261730dXavier Ducrohet try { 124d9c64369cf9be6568af2d79c35fb470cc261730dXavier Ducrohet canvasMatrix = xform.createInverse(); 125d348b6eaa98e23cb38d90906df109aaa2d20ea7fXavier Ducrohet } catch (java.awt.geom.NoninvertibleTransformException e) { 126918aaa5717fce6081557c82ce1c439b6922737d5Xavier Ducrohet Bridge.getLog().fidelityWarning(LayoutLog.TAG_MATRIX_INVERSE, 12751a7e5447de94791c464cda5cc6ebbf616d73c80Xavier Ducrohet "Unable to inverse matrix in SweepGradient", e, null /*data*/); 128d348b6eaa98e23cb38d90906df109aaa2d20ea7fXavier Ducrohet canvasMatrix = new java.awt.geom.AffineTransform(); 129d9c64369cf9be6568af2d79c35fb470cc261730dXavier Ducrohet } 130d9c64369cf9be6568af2d79c35fb470cc261730dXavier Ducrohet 131d348b6eaa98e23cb38d90906df109aaa2d20ea7fXavier Ducrohet java.awt.geom.AffineTransform localMatrix = getLocalMatrix(); 132d9c64369cf9be6568af2d79c35fb470cc261730dXavier Ducrohet try { 133d9c64369cf9be6568af2d79c35fb470cc261730dXavier Ducrohet localMatrix = localMatrix.createInverse(); 134d348b6eaa98e23cb38d90906df109aaa2d20ea7fXavier Ducrohet } catch (java.awt.geom.NoninvertibleTransformException e) { 135918aaa5717fce6081557c82ce1c439b6922737d5Xavier Ducrohet Bridge.getLog().fidelityWarning(LayoutLog.TAG_MATRIX_INVERSE, 13651a7e5447de94791c464cda5cc6ebbf616d73c80Xavier Ducrohet "Unable to inverse matrix in SweepGradient", e, null /*data*/); 137d348b6eaa98e23cb38d90906df109aaa2d20ea7fXavier Ducrohet localMatrix = new java.awt.geom.AffineTransform(); 138d9c64369cf9be6568af2d79c35fb470cc261730dXavier Ducrohet } 139d9c64369cf9be6568af2d79c35fb470cc261730dXavier Ducrohet 140d9c64369cf9be6568af2d79c35fb470cc261730dXavier Ducrohet return new SweepGradientPaintContext(canvasMatrix, localMatrix, colorModel); 1413330927bdd2fedcbc8745f99d3f40929f47fdd31Xavier Ducrohet } 1423330927bdd2fedcbc8745f99d3f40929f47fdd31Xavier Ducrohet 1433330927bdd2fedcbc8745f99d3f40929f47fdd31Xavier Ducrohet private class SweepGradientPaintContext implements java.awt.PaintContext { 1443330927bdd2fedcbc8745f99d3f40929f47fdd31Xavier Ducrohet 145d348b6eaa98e23cb38d90906df109aaa2d20ea7fXavier Ducrohet private final java.awt.geom.AffineTransform mCanvasMatrix; 146d348b6eaa98e23cb38d90906df109aaa2d20ea7fXavier Ducrohet private final java.awt.geom.AffineTransform mLocalMatrix; 1473330927bdd2fedcbc8745f99d3f40929f47fdd31Xavier Ducrohet private final java.awt.image.ColorModel mColorModel; 1483330927bdd2fedcbc8745f99d3f40929f47fdd31Xavier Ducrohet 149d348b6eaa98e23cb38d90906df109aaa2d20ea7fXavier Ducrohet public SweepGradientPaintContext( 150d348b6eaa98e23cb38d90906df109aaa2d20ea7fXavier Ducrohet java.awt.geom.AffineTransform canvasMatrix, 151d348b6eaa98e23cb38d90906df109aaa2d20ea7fXavier Ducrohet java.awt.geom.AffineTransform localMatrix, 152d348b6eaa98e23cb38d90906df109aaa2d20ea7fXavier Ducrohet java.awt.image.ColorModel colorModel) { 153d9c64369cf9be6568af2d79c35fb470cc261730dXavier Ducrohet mCanvasMatrix = canvasMatrix; 154d9c64369cf9be6568af2d79c35fb470cc261730dXavier Ducrohet mLocalMatrix = localMatrix; 1553330927bdd2fedcbc8745f99d3f40929f47fdd31Xavier Ducrohet mColorModel = colorModel; 1563330927bdd2fedcbc8745f99d3f40929f47fdd31Xavier Ducrohet } 1573330927bdd2fedcbc8745f99d3f40929f47fdd31Xavier Ducrohet 15846d43ccfd8cef75b4315828073c094cf1efb05ffXavier Ducrohet @Override 1593330927bdd2fedcbc8745f99d3f40929f47fdd31Xavier Ducrohet public void dispose() { 1603330927bdd2fedcbc8745f99d3f40929f47fdd31Xavier Ducrohet } 1613330927bdd2fedcbc8745f99d3f40929f47fdd31Xavier Ducrohet 16246d43ccfd8cef75b4315828073c094cf1efb05ffXavier Ducrohet @Override 1633330927bdd2fedcbc8745f99d3f40929f47fdd31Xavier Ducrohet public java.awt.image.ColorModel getColorModel() { 1643330927bdd2fedcbc8745f99d3f40929f47fdd31Xavier Ducrohet return mColorModel; 1653330927bdd2fedcbc8745f99d3f40929f47fdd31Xavier Ducrohet } 1663330927bdd2fedcbc8745f99d3f40929f47fdd31Xavier Ducrohet 16746d43ccfd8cef75b4315828073c094cf1efb05ffXavier Ducrohet @Override 1683330927bdd2fedcbc8745f99d3f40929f47fdd31Xavier Ducrohet public java.awt.image.Raster getRaster(int x, int y, int w, int h) { 1693330927bdd2fedcbc8745f99d3f40929f47fdd31Xavier Ducrohet java.awt.image.BufferedImage image = new java.awt.image.BufferedImage(w, h, 1703330927bdd2fedcbc8745f99d3f40929f47fdd31Xavier Ducrohet java.awt.image.BufferedImage.TYPE_INT_ARGB); 1713330927bdd2fedcbc8745f99d3f40929f47fdd31Xavier Ducrohet 1723330927bdd2fedcbc8745f99d3f40929f47fdd31Xavier Ducrohet int[] data = new int[w*h]; 1733330927bdd2fedcbc8745f99d3f40929f47fdd31Xavier Ducrohet 1743330927bdd2fedcbc8745f99d3f40929f47fdd31Xavier Ducrohet // compute angle from each point to the center, and figure out the distance from 1753330927bdd2fedcbc8745f99d3f40929f47fdd31Xavier Ducrohet // it. 1763330927bdd2fedcbc8745f99d3f40929f47fdd31Xavier Ducrohet int index = 0; 177d9c64369cf9be6568af2d79c35fb470cc261730dXavier Ducrohet float[] pt1 = new float[2]; 178d9c64369cf9be6568af2d79c35fb470cc261730dXavier Ducrohet float[] pt2 = new float[2]; 1793330927bdd2fedcbc8745f99d3f40929f47fdd31Xavier Ducrohet for (int iy = 0 ; iy < h ; iy++) { 1803330927bdd2fedcbc8745f99d3f40929f47fdd31Xavier Ducrohet for (int ix = 0 ; ix < w ; ix++) { 181d9c64369cf9be6568af2d79c35fb470cc261730dXavier Ducrohet // handle the canvas transform 182d9c64369cf9be6568af2d79c35fb470cc261730dXavier Ducrohet pt1[0] = x + ix; 183d9c64369cf9be6568af2d79c35fb470cc261730dXavier Ducrohet pt1[1] = y + iy; 184d9c64369cf9be6568af2d79c35fb470cc261730dXavier Ducrohet mCanvasMatrix.transform(pt1, 0, pt2, 0, 1); 185d9c64369cf9be6568af2d79c35fb470cc261730dXavier Ducrohet 186d9c64369cf9be6568af2d79c35fb470cc261730dXavier Ducrohet // handle the local matrix 187d9c64369cf9be6568af2d79c35fb470cc261730dXavier Ducrohet pt1[0] = pt2[0] - mCx; 188d9c64369cf9be6568af2d79c35fb470cc261730dXavier Ducrohet pt1[1] = pt2[1] - mCy; 189d9c64369cf9be6568af2d79c35fb470cc261730dXavier Ducrohet mLocalMatrix.transform(pt1, 0, pt2, 0, 1); 190d9c64369cf9be6568af2d79c35fb470cc261730dXavier Ducrohet 191d9c64369cf9be6568af2d79c35fb470cc261730dXavier Ducrohet float dx = pt2[0]; 192d9c64369cf9be6568af2d79c35fb470cc261730dXavier Ducrohet float dy = pt2[1]; 193d9c64369cf9be6568af2d79c35fb470cc261730dXavier Ducrohet 1943330927bdd2fedcbc8745f99d3f40929f47fdd31Xavier Ducrohet float angle; 1953330927bdd2fedcbc8745f99d3f40929f47fdd31Xavier Ducrohet if (dx == 0) { 1963330927bdd2fedcbc8745f99d3f40929f47fdd31Xavier Ducrohet angle = (float) (dy < 0 ? 3 * Math.PI / 2 : Math.PI / 2); 1973330927bdd2fedcbc8745f99d3f40929f47fdd31Xavier Ducrohet } else if (dy == 0) { 1983330927bdd2fedcbc8745f99d3f40929f47fdd31Xavier Ducrohet angle = (float) (dx < 0 ? Math.PI : 0); 1993330927bdd2fedcbc8745f99d3f40929f47fdd31Xavier Ducrohet } else { 2003330927bdd2fedcbc8745f99d3f40929f47fdd31Xavier Ducrohet angle = (float) Math.atan(dy / dx); 2013330927bdd2fedcbc8745f99d3f40929f47fdd31Xavier Ducrohet if (dx > 0) { 2023330927bdd2fedcbc8745f99d3f40929f47fdd31Xavier Ducrohet if (dy < 0) { 2033330927bdd2fedcbc8745f99d3f40929f47fdd31Xavier Ducrohet angle += Math.PI * 2; 2043330927bdd2fedcbc8745f99d3f40929f47fdd31Xavier Ducrohet } 2053330927bdd2fedcbc8745f99d3f40929f47fdd31Xavier Ducrohet } else { 2063330927bdd2fedcbc8745f99d3f40929f47fdd31Xavier Ducrohet angle += Math.PI; 2073330927bdd2fedcbc8745f99d3f40929f47fdd31Xavier Ducrohet } 2083330927bdd2fedcbc8745f99d3f40929f47fdd31Xavier Ducrohet } 2093330927bdd2fedcbc8745f99d3f40929f47fdd31Xavier Ducrohet 2103330927bdd2fedcbc8745f99d3f40929f47fdd31Xavier Ducrohet // convert to 0-1. value and get color 2113330927bdd2fedcbc8745f99d3f40929f47fdd31Xavier Ducrohet data[index++] = getGradientColor((float) (angle / (2 * Math.PI))); 2123330927bdd2fedcbc8745f99d3f40929f47fdd31Xavier Ducrohet } 2133330927bdd2fedcbc8745f99d3f40929f47fdd31Xavier Ducrohet } 2143330927bdd2fedcbc8745f99d3f40929f47fdd31Xavier Ducrohet 2153330927bdd2fedcbc8745f99d3f40929f47fdd31Xavier Ducrohet image.setRGB(0 /*startX*/, 0 /*startY*/, w, h, data, 0 /*offset*/, w /*scansize*/); 2163330927bdd2fedcbc8745f99d3f40929f47fdd31Xavier Ducrohet 2173330927bdd2fedcbc8745f99d3f40929f47fdd31Xavier Ducrohet return image.getRaster(); 2183330927bdd2fedcbc8745f99d3f40929f47fdd31Xavier Ducrohet } 2193330927bdd2fedcbc8745f99d3f40929f47fdd31Xavier Ducrohet 2203330927bdd2fedcbc8745f99d3f40929f47fdd31Xavier Ducrohet } 2213330927bdd2fedcbc8745f99d3f40929f47fdd31Xavier Ducrohet } 2229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 223