LinearGradient_Delegate.java revision 918aaa5717fce6081557c82ce1c439b6922737d5
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; 229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 23251d2e99245095369b52d891a660b2ed270f02e0Xavier Ducrohetimport android.graphics.Shader.TileMode; 24251d2e99245095369b52d891a660b2ed270f02e0Xavier Ducrohet 25251d2e99245095369b52d891a660b2ed270f02e0Xavier Ducrohet/** 26251d2e99245095369b52d891a660b2ed270f02e0Xavier Ducrohet * Delegate implementing the native methods of android.graphics.LinearGradient 27251d2e99245095369b52d891a660b2ed270f02e0Xavier Ducrohet * 28251d2e99245095369b52d891a660b2ed270f02e0Xavier Ducrohet * Through the layoutlib_create tool, the original native methods of LinearGradient have been 29251d2e99245095369b52d891a660b2ed270f02e0Xavier Ducrohet * replaced by calls to methods of the same name in this delegate class. 30251d2e99245095369b52d891a660b2ed270f02e0Xavier Ducrohet * 31251d2e99245095369b52d891a660b2ed270f02e0Xavier Ducrohet * This class behaves like the original native implementation, but in Java, keeping previously 32251d2e99245095369b52d891a660b2ed270f02e0Xavier Ducrohet * native data into its own objects and mapping them to int that are sent back and forth between 33251d2e99245095369b52d891a660b2ed270f02e0Xavier Ducrohet * it and the original LinearGradient class. 34251d2e99245095369b52d891a660b2ed270f02e0Xavier Ducrohet * 35251d2e99245095369b52d891a660b2ed270f02e0Xavier Ducrohet * Because this extends {@link Shader_Delegate}, there's no need to use a {@link DelegateManager}, 36251d2e99245095369b52d891a660b2ed270f02e0Xavier Ducrohet * as all the Shader classes will be added to the manager owned by {@link Shader_Delegate}. 37251d2e99245095369b52d891a660b2ed270f02e0Xavier Ducrohet * 38251d2e99245095369b52d891a660b2ed270f02e0Xavier Ducrohet * @see Shader_Delegate 39251d2e99245095369b52d891a660b2ed270f02e0Xavier Ducrohet * 40251d2e99245095369b52d891a660b2ed270f02e0Xavier Ducrohet */ 41d348b6eaa98e23cb38d90906df109aaa2d20ea7fXavier Ducrohetpublic final class LinearGradient_Delegate extends Gradient_Delegate { 42251d2e99245095369b52d891a660b2ed270f02e0Xavier Ducrohet 43251d2e99245095369b52d891a660b2ed270f02e0Xavier Ducrohet // ---- delegate data ---- 4445a7c285985976c23d818665694addbb25e02565Xavier Ducrohet private java.awt.Paint mJavaPaint; 459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 46251d2e99245095369b52d891a660b2ed270f02e0Xavier Ducrohet // ---- Public Helper methods ---- 47251d2e99245095369b52d891a660b2ed270f02e0Xavier Ducrohet 48251d2e99245095369b52d891a660b2ed270f02e0Xavier Ducrohet @Override 49d348b6eaa98e23cb38d90906df109aaa2d20ea7fXavier Ducrohet public java.awt.Paint getJavaPaint() { 50251d2e99245095369b52d891a660b2ed270f02e0Xavier Ducrohet return mJavaPaint; 51251d2e99245095369b52d891a660b2ed270f02e0Xavier Ducrohet } 52251d2e99245095369b52d891a660b2ed270f02e0Xavier Ducrohet 53251d2e99245095369b52d891a660b2ed270f02e0Xavier Ducrohet // ---- native methods ---- 54251d2e99245095369b52d891a660b2ed270f02e0Xavier Ducrohet 55251d2e99245095369b52d891a660b2ed270f02e0Xavier Ducrohet /*package*/ static int nativeCreate1(LinearGradient thisGradient, 56251d2e99245095369b52d891a660b2ed270f02e0Xavier Ducrohet float x0, float y0, float x1, float y1, 57251d2e99245095369b52d891a660b2ed270f02e0Xavier Ducrohet int colors[], float positions[], int tileMode) { 58251d2e99245095369b52d891a660b2ed270f02e0Xavier Ducrohet LinearGradient_Delegate newDelegate = new LinearGradient_Delegate(x0, y0, x1, y1, 59d348b6eaa98e23cb38d90906df109aaa2d20ea7fXavier Ducrohet colors, positions, Shader_Delegate.getTileMode(tileMode)); 60251d2e99245095369b52d891a660b2ed270f02e0Xavier Ducrohet return sManager.addDelegate(newDelegate); 61251d2e99245095369b52d891a660b2ed270f02e0Xavier Ducrohet } 62251d2e99245095369b52d891a660b2ed270f02e0Xavier Ducrohet /*package*/ static int nativeCreate2(LinearGradient thisGradient, 63251d2e99245095369b52d891a660b2ed270f02e0Xavier Ducrohet float x0, float y0, float x1, float y1, 64251d2e99245095369b52d891a660b2ed270f02e0Xavier Ducrohet int color0, int color1, int tileMode) { 65251d2e99245095369b52d891a660b2ed270f02e0Xavier Ducrohet return nativeCreate1(thisGradient, 66251d2e99245095369b52d891a660b2ed270f02e0Xavier Ducrohet x0, y0, x1, y1, new int[] { color0, color1}, null /*positions*/, 67251d2e99245095369b52d891a660b2ed270f02e0Xavier Ducrohet tileMode); 68251d2e99245095369b52d891a660b2ed270f02e0Xavier Ducrohet } 69251d2e99245095369b52d891a660b2ed270f02e0Xavier Ducrohet /*package*/ static int nativePostCreate1(LinearGradient thisGradient, 70251d2e99245095369b52d891a660b2ed270f02e0Xavier Ducrohet int native_shader, float x0, float y0, float x1, float y1, 71251d2e99245095369b52d891a660b2ed270f02e0Xavier Ducrohet int colors[], float positions[], int tileMode) { 72251d2e99245095369b52d891a660b2ed270f02e0Xavier Ducrohet // nothing to be done here. 73251d2e99245095369b52d891a660b2ed270f02e0Xavier Ducrohet return 0; 74251d2e99245095369b52d891a660b2ed270f02e0Xavier Ducrohet } 75251d2e99245095369b52d891a660b2ed270f02e0Xavier Ducrohet /*package*/ static int nativePostCreate2(LinearGradient thisGradient, 76251d2e99245095369b52d891a660b2ed270f02e0Xavier Ducrohet int native_shader, float x0, float y0, float x1, float y1, 77251d2e99245095369b52d891a660b2ed270f02e0Xavier Ducrohet int color0, int color1, int tileMode) { 78251d2e99245095369b52d891a660b2ed270f02e0Xavier Ducrohet // nothing to be done here. 79251d2e99245095369b52d891a660b2ed270f02e0Xavier Ducrohet return 0; 80251d2e99245095369b52d891a660b2ed270f02e0Xavier Ducrohet } 81251d2e99245095369b52d891a660b2ed270f02e0Xavier Ducrohet 82251d2e99245095369b52d891a660b2ed270f02e0Xavier Ducrohet // ---- Private delegate/helper methods ---- 83251d2e99245095369b52d891a660b2ed270f02e0Xavier Ducrohet 8463b2e616278c1b4284e1adbcc3936d0516083dcbXavier Ducrohet /** 8563b2e616278c1b4284e1adbcc3936d0516083dcbXavier Ducrohet * Create a shader that draws a linear gradient along a line. 8663b2e616278c1b4284e1adbcc3936d0516083dcbXavier Ducrohet * 8763b2e616278c1b4284e1adbcc3936d0516083dcbXavier Ducrohet * @param x0 The x-coordinate for the start of the gradient line 8863b2e616278c1b4284e1adbcc3936d0516083dcbXavier Ducrohet * @param y0 The y-coordinate for the start of the gradient line 8963b2e616278c1b4284e1adbcc3936d0516083dcbXavier Ducrohet * @param x1 The x-coordinate for the end of the gradient line 9063b2e616278c1b4284e1adbcc3936d0516083dcbXavier Ducrohet * @param y1 The y-coordinate for the end of the gradient line 9163b2e616278c1b4284e1adbcc3936d0516083dcbXavier Ducrohet * @param colors The colors to be distributed along the gradient line 9263b2e616278c1b4284e1adbcc3936d0516083dcbXavier Ducrohet * @param positions May be null. The relative positions [0..1] of each 9363b2e616278c1b4284e1adbcc3936d0516083dcbXavier Ducrohet * corresponding color in the colors array. If this is null, the 9463b2e616278c1b4284e1adbcc3936d0516083dcbXavier Ducrohet * the colors are distributed evenly along the gradient line. 9563b2e616278c1b4284e1adbcc3936d0516083dcbXavier Ducrohet * @param tile The Shader tiling mode 9663b2e616278c1b4284e1adbcc3936d0516083dcbXavier Ducrohet */ 97251d2e99245095369b52d891a660b2ed270f02e0Xavier Ducrohet private LinearGradient_Delegate(float x0, float y0, float x1, float y1, 98251d2e99245095369b52d891a660b2ed270f02e0Xavier Ducrohet int colors[], float positions[], TileMode tile) { 9945a7c285985976c23d818665694addbb25e02565Xavier Ducrohet super(colors, positions); 10045a7c285985976c23d818665694addbb25e02565Xavier Ducrohet mJavaPaint = new LinearGradientPaint(x0, y0, x1, y1, mColors, mPositions, tile); 1019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 103251d2e99245095369b52d891a660b2ed270f02e0Xavier Ducrohet // ---- Custom Java Paint ---- 10445a7c285985976c23d818665694addbb25e02565Xavier Ducrohet /** 10545a7c285985976c23d818665694addbb25e02565Xavier Ducrohet * Linear Gradient (Java) Paint able to handle more than 2 points, as 10645a7c285985976c23d818665694addbb25e02565Xavier Ducrohet * {@link java.awt.GradientPaint} only supports 2 points and does not support Android's tile 10745a7c285985976c23d818665694addbb25e02565Xavier Ducrohet * modes. 10845a7c285985976c23d818665694addbb25e02565Xavier Ducrohet */ 109d9c64369cf9be6568af2d79c35fb470cc261730dXavier Ducrohet private class LinearGradientPaint extends GradientPaint { 110374abf0b95ca94d34f94edd385fb37a8d5cb123bXavier Ducrohet 111374abf0b95ca94d34f94edd385fb37a8d5cb123bXavier Ducrohet private final float mX0; 112374abf0b95ca94d34f94edd385fb37a8d5cb123bXavier Ducrohet private final float mY0; 113374abf0b95ca94d34f94edd385fb37a8d5cb123bXavier Ducrohet private final float mDx; 114374abf0b95ca94d34f94edd385fb37a8d5cb123bXavier Ducrohet private final float mDy; 115374abf0b95ca94d34f94edd385fb37a8d5cb123bXavier Ducrohet private final float mDSize2; 116374abf0b95ca94d34f94edd385fb37a8d5cb123bXavier Ducrohet 11745a7c285985976c23d818665694addbb25e02565Xavier Ducrohet public LinearGradientPaint(float x0, float y0, float x1, float y1, int colors[], 118374abf0b95ca94d34f94edd385fb37a8d5cb123bXavier Ducrohet float positions[], TileMode tile) { 11945a7c285985976c23d818665694addbb25e02565Xavier Ducrohet super(colors, positions, tile); 120d9c64369cf9be6568af2d79c35fb470cc261730dXavier Ducrohet mX0 = x0; 121d9c64369cf9be6568af2d79c35fb470cc261730dXavier Ducrohet mY0 = y0; 122d9c64369cf9be6568af2d79c35fb470cc261730dXavier Ducrohet mDx = x1 - x0; 123d9c64369cf9be6568af2d79c35fb470cc261730dXavier Ducrohet mDy = y1 - y0; 124d9c64369cf9be6568af2d79c35fb470cc261730dXavier Ducrohet mDSize2 = mDx * mDx + mDy * mDy; 125374abf0b95ca94d34f94edd385fb37a8d5cb123bXavier Ducrohet } 126374abf0b95ca94d34f94edd385fb37a8d5cb123bXavier Ducrohet 12745a7c285985976c23d818665694addbb25e02565Xavier Ducrohet public java.awt.PaintContext createContext( 12845a7c285985976c23d818665694addbb25e02565Xavier Ducrohet java.awt.image.ColorModel colorModel, 12945a7c285985976c23d818665694addbb25e02565Xavier Ducrohet java.awt.Rectangle deviceBounds, 13045a7c285985976c23d818665694addbb25e02565Xavier Ducrohet java.awt.geom.Rectangle2D userBounds, 13145a7c285985976c23d818665694addbb25e02565Xavier Ducrohet java.awt.geom.AffineTransform xform, 13245a7c285985976c23d818665694addbb25e02565Xavier Ducrohet java.awt.RenderingHints hints) { 13345a7c285985976c23d818665694addbb25e02565Xavier Ducrohet precomputeGradientColors(); 134d9c64369cf9be6568af2d79c35fb470cc261730dXavier Ducrohet 135d348b6eaa98e23cb38d90906df109aaa2d20ea7fXavier Ducrohet java.awt.geom.AffineTransform canvasMatrix; 136d9c64369cf9be6568af2d79c35fb470cc261730dXavier Ducrohet try { 137d9c64369cf9be6568af2d79c35fb470cc261730dXavier Ducrohet canvasMatrix = xform.createInverse(); 138d348b6eaa98e23cb38d90906df109aaa2d20ea7fXavier Ducrohet } catch (java.awt.geom.NoninvertibleTransformException e) { 139918aaa5717fce6081557c82ce1c439b6922737d5Xavier Ducrohet Bridge.getLog().fidelityWarning(LayoutLog.TAG_MATRIX_INVERSE, 14056222cfbe9973c518f7e8c9113c614de80b5a4b2Xavier Ducrohet "Unable to inverse matrix in LinearGradient", e); 141d348b6eaa98e23cb38d90906df109aaa2d20ea7fXavier Ducrohet canvasMatrix = new java.awt.geom.AffineTransform(); 142d9c64369cf9be6568af2d79c35fb470cc261730dXavier Ducrohet } 143d9c64369cf9be6568af2d79c35fb470cc261730dXavier Ducrohet 144d348b6eaa98e23cb38d90906df109aaa2d20ea7fXavier Ducrohet java.awt.geom.AffineTransform localMatrix = getLocalMatrix(); 145d9c64369cf9be6568af2d79c35fb470cc261730dXavier Ducrohet try { 146d9c64369cf9be6568af2d79c35fb470cc261730dXavier Ducrohet localMatrix = localMatrix.createInverse(); 147d348b6eaa98e23cb38d90906df109aaa2d20ea7fXavier Ducrohet } catch (java.awt.geom.NoninvertibleTransformException e) { 148918aaa5717fce6081557c82ce1c439b6922737d5Xavier Ducrohet Bridge.getLog().fidelityWarning(LayoutLog.TAG_MATRIX_INVERSE, 14956222cfbe9973c518f7e8c9113c614de80b5a4b2Xavier Ducrohet "Unable to inverse matrix in LinearGradient", e); 150d348b6eaa98e23cb38d90906df109aaa2d20ea7fXavier Ducrohet localMatrix = new java.awt.geom.AffineTransform(); 151d9c64369cf9be6568af2d79c35fb470cc261730dXavier Ducrohet } 152d9c64369cf9be6568af2d79c35fb470cc261730dXavier Ducrohet 153d9c64369cf9be6568af2d79c35fb470cc261730dXavier Ducrohet return new LinearGradientPaintContext(canvasMatrix, localMatrix, colorModel); 154374abf0b95ca94d34f94edd385fb37a8d5cb123bXavier Ducrohet } 155374abf0b95ca94d34f94edd385fb37a8d5cb123bXavier Ducrohet 15645a7c285985976c23d818665694addbb25e02565Xavier Ducrohet private class LinearGradientPaintContext implements java.awt.PaintContext { 157374abf0b95ca94d34f94edd385fb37a8d5cb123bXavier Ducrohet 158d348b6eaa98e23cb38d90906df109aaa2d20ea7fXavier Ducrohet private final java.awt.geom.AffineTransform mCanvasMatrix; 159d348b6eaa98e23cb38d90906df109aaa2d20ea7fXavier Ducrohet private final java.awt.geom.AffineTransform mLocalMatrix; 16045a7c285985976c23d818665694addbb25e02565Xavier Ducrohet private final java.awt.image.ColorModel mColorModel; 161374abf0b95ca94d34f94edd385fb37a8d5cb123bXavier Ducrohet 162d348b6eaa98e23cb38d90906df109aaa2d20ea7fXavier Ducrohet private LinearGradientPaintContext( 163d348b6eaa98e23cb38d90906df109aaa2d20ea7fXavier Ducrohet java.awt.geom.AffineTransform canvasMatrix, 164d348b6eaa98e23cb38d90906df109aaa2d20ea7fXavier Ducrohet java.awt.geom.AffineTransform localMatrix, 165d348b6eaa98e23cb38d90906df109aaa2d20ea7fXavier Ducrohet java.awt.image.ColorModel colorModel) { 166d9c64369cf9be6568af2d79c35fb470cc261730dXavier Ducrohet mCanvasMatrix = canvasMatrix; 167d9c64369cf9be6568af2d79c35fb470cc261730dXavier Ducrohet mLocalMatrix = localMatrix; 16845a7c285985976c23d818665694addbb25e02565Xavier Ducrohet mColorModel = colorModel; 169374abf0b95ca94d34f94edd385fb37a8d5cb123bXavier Ducrohet } 170374abf0b95ca94d34f94edd385fb37a8d5cb123bXavier Ducrohet 171374abf0b95ca94d34f94edd385fb37a8d5cb123bXavier Ducrohet public void dispose() { 172374abf0b95ca94d34f94edd385fb37a8d5cb123bXavier Ducrohet } 173374abf0b95ca94d34f94edd385fb37a8d5cb123bXavier Ducrohet 17445a7c285985976c23d818665694addbb25e02565Xavier Ducrohet public java.awt.image.ColorModel getColorModel() { 175374abf0b95ca94d34f94edd385fb37a8d5cb123bXavier Ducrohet return mColorModel; 176374abf0b95ca94d34f94edd385fb37a8d5cb123bXavier Ducrohet } 177374abf0b95ca94d34f94edd385fb37a8d5cb123bXavier Ducrohet 17845a7c285985976c23d818665694addbb25e02565Xavier Ducrohet public java.awt.image.Raster getRaster(int x, int y, int w, int h) { 17945a7c285985976c23d818665694addbb25e02565Xavier Ducrohet java.awt.image.BufferedImage image = new java.awt.image.BufferedImage(w, h, 18045a7c285985976c23d818665694addbb25e02565Xavier Ducrohet java.awt.image.BufferedImage.TYPE_INT_ARGB); 181374abf0b95ca94d34f94edd385fb37a8d5cb123bXavier Ducrohet 182e8f4d7deab2c183604ea5a2344a1e2d7ff4f823aXavier Ducrohet int[] data = new int[w*h]; 183e8f4d7deab2c183604ea5a2344a1e2d7ff4f823aXavier Ducrohet 184d9c64369cf9be6568af2d79c35fb470cc261730dXavier Ducrohet int index = 0; 185d9c64369cf9be6568af2d79c35fb470cc261730dXavier Ducrohet float[] pt1 = new float[2]; 186d9c64369cf9be6568af2d79c35fb470cc261730dXavier Ducrohet float[] pt2 = new float[2]; 187d9c64369cf9be6568af2d79c35fb470cc261730dXavier Ducrohet for (int iy = 0 ; iy < h ; iy++) { 188374abf0b95ca94d34f94edd385fb37a8d5cb123bXavier Ducrohet for (int ix = 0 ; ix < w ; ix++) { 189d9c64369cf9be6568af2d79c35fb470cc261730dXavier Ducrohet // handle the canvas transform 190d9c64369cf9be6568af2d79c35fb470cc261730dXavier Ducrohet pt1[0] = x + ix; 191d9c64369cf9be6568af2d79c35fb470cc261730dXavier Ducrohet pt1[1] = y + iy; 192d9c64369cf9be6568af2d79c35fb470cc261730dXavier Ducrohet mCanvasMatrix.transform(pt1, 0, pt2, 0, 1); 193374abf0b95ca94d34f94edd385fb37a8d5cb123bXavier Ducrohet 194d9c64369cf9be6568af2d79c35fb470cc261730dXavier Ducrohet // handle the local matrix. 195d9c64369cf9be6568af2d79c35fb470cc261730dXavier Ducrohet pt1[0] = pt2[0]; 196d9c64369cf9be6568af2d79c35fb470cc261730dXavier Ducrohet pt1[1] = pt2[1]; 197d9c64369cf9be6568af2d79c35fb470cc261730dXavier Ducrohet mLocalMatrix.transform(pt1, 0, pt2, 0, 1); 198d9c64369cf9be6568af2d79c35fb470cc261730dXavier Ducrohet 199d9c64369cf9be6568af2d79c35fb470cc261730dXavier Ducrohet data[index++] = getColor(pt2[0], pt2[1]); 200374abf0b95ca94d34f94edd385fb37a8d5cb123bXavier Ducrohet } 201374abf0b95ca94d34f94edd385fb37a8d5cb123bXavier Ducrohet } 202374abf0b95ca94d34f94edd385fb37a8d5cb123bXavier Ducrohet 203e8f4d7deab2c183604ea5a2344a1e2d7ff4f823aXavier Ducrohet image.setRGB(0 /*startX*/, 0 /*startY*/, w, h, data, 0 /*offset*/, w /*scansize*/); 204e8f4d7deab2c183604ea5a2344a1e2d7ff4f823aXavier Ducrohet 2052dbb923aa02e09a64fc111596a9ac9117488aa24Xavier Ducrohet return image.getRaster(); 206374abf0b95ca94d34f94edd385fb37a8d5cb123bXavier Ducrohet } 207374abf0b95ca94d34f94edd385fb37a8d5cb123bXavier Ducrohet } 208374abf0b95ca94d34f94edd385fb37a8d5cb123bXavier Ducrohet 209374abf0b95ca94d34f94edd385fb37a8d5cb123bXavier Ducrohet /** 210374abf0b95ca94d34f94edd385fb37a8d5cb123bXavier Ducrohet * Returns a color for an arbitrary point. 211374abf0b95ca94d34f94edd385fb37a8d5cb123bXavier Ducrohet */ 212374abf0b95ca94d34f94edd385fb37a8d5cb123bXavier Ducrohet private int getColor(float x, float y) { 21363fd87113cea6abec97a6cd966e090e9b590fc3bXavier Ducrohet float pos; 21463fd87113cea6abec97a6cd966e090e9b590fc3bXavier Ducrohet if (mDx == 0) { 21563fd87113cea6abec97a6cd966e090e9b590fc3bXavier Ducrohet pos = (y - mY0) / mDy; 21663fd87113cea6abec97a6cd966e090e9b590fc3bXavier Ducrohet } else if (mDy == 0) { 21763fd87113cea6abec97a6cd966e090e9b590fc3bXavier Ducrohet pos = (x - mX0) / mDx; 21863fd87113cea6abec97a6cd966e090e9b590fc3bXavier Ducrohet } else { 21963fd87113cea6abec97a6cd966e090e9b590fc3bXavier Ducrohet // find the x position on the gradient vector. 22063fd87113cea6abec97a6cd966e090e9b590fc3bXavier Ducrohet float _x = (mDx*mDy*(y-mY0) + mDy*mDy*mX0 + mDx*mDx*x) / mDSize2; 22163fd87113cea6abec97a6cd966e090e9b590fc3bXavier Ducrohet // from it get the position relative to the vector 22263fd87113cea6abec97a6cd966e090e9b590fc3bXavier Ducrohet pos = (_x - mX0) / mDx; 22363fd87113cea6abec97a6cd966e090e9b590fc3bXavier Ducrohet } 224374abf0b95ca94d34f94edd385fb37a8d5cb123bXavier Ducrohet 22545a7c285985976c23d818665694addbb25e02565Xavier Ducrohet return getGradientColor(pos); 226374abf0b95ca94d34f94edd385fb37a8d5cb123bXavier Ducrohet } 2279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 229