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