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; 239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 24251d2e99245095369b52d891a660b2ed270f02e0Xavier Ducrohetimport android.graphics.Shader.TileMode; 25251d2e99245095369b52d891a660b2ed270f02e0Xavier Ducrohet 26251d2e99245095369b52d891a660b2ed270f02e0Xavier Ducrohet/** 27251d2e99245095369b52d891a660b2ed270f02e0Xavier Ducrohet * Delegate implementing the native methods of android.graphics.LinearGradient 28251d2e99245095369b52d891a660b2ed270f02e0Xavier Ducrohet * 29251d2e99245095369b52d891a660b2ed270f02e0Xavier Ducrohet * Through the layoutlib_create tool, the original native methods of LinearGradient have been 30251d2e99245095369b52d891a660b2ed270f02e0Xavier Ducrohet * replaced by calls to methods of the same name in this delegate class. 31251d2e99245095369b52d891a660b2ed270f02e0Xavier Ducrohet * 32251d2e99245095369b52d891a660b2ed270f02e0Xavier Ducrohet * This class behaves like the original native implementation, but in Java, keeping previously 33251d2e99245095369b52d891a660b2ed270f02e0Xavier Ducrohet * native data into its own objects and mapping them to int that are sent back and forth between 34251d2e99245095369b52d891a660b2ed270f02e0Xavier Ducrohet * it and the original LinearGradient class. 35251d2e99245095369b52d891a660b2ed270f02e0Xavier Ducrohet * 36251d2e99245095369b52d891a660b2ed270f02e0Xavier Ducrohet * Because this extends {@link Shader_Delegate}, there's no need to use a {@link DelegateManager}, 37251d2e99245095369b52d891a660b2ed270f02e0Xavier Ducrohet * as all the Shader classes will be added to the manager owned by {@link Shader_Delegate}. 38251d2e99245095369b52d891a660b2ed270f02e0Xavier Ducrohet * 39251d2e99245095369b52d891a660b2ed270f02e0Xavier Ducrohet * @see Shader_Delegate 40251d2e99245095369b52d891a660b2ed270f02e0Xavier Ducrohet * 41251d2e99245095369b52d891a660b2ed270f02e0Xavier Ducrohet */ 42d348b6eaa98e23cb38d90906df109aaa2d20ea7fXavier Ducrohetpublic final class LinearGradient_Delegate extends Gradient_Delegate { 43251d2e99245095369b52d891a660b2ed270f02e0Xavier Ducrohet 44251d2e99245095369b52d891a660b2ed270f02e0Xavier Ducrohet // ---- delegate data ---- 4545a7c285985976c23d818665694addbb25e02565Xavier Ducrohet private java.awt.Paint mJavaPaint; 469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 47251d2e99245095369b52d891a660b2ed270f02e0Xavier Ducrohet // ---- Public Helper methods ---- 48251d2e99245095369b52d891a660b2ed270f02e0Xavier Ducrohet 49251d2e99245095369b52d891a660b2ed270f02e0Xavier Ducrohet @Override 50d348b6eaa98e23cb38d90906df109aaa2d20ea7fXavier Ducrohet public java.awt.Paint getJavaPaint() { 51251d2e99245095369b52d891a660b2ed270f02e0Xavier Ducrohet return mJavaPaint; 52251d2e99245095369b52d891a660b2ed270f02e0Xavier Ducrohet } 53251d2e99245095369b52d891a660b2ed270f02e0Xavier Ducrohet 54251d2e99245095369b52d891a660b2ed270f02e0Xavier Ducrohet // ---- native methods ---- 55251d2e99245095369b52d891a660b2ed270f02e0Xavier Ducrohet 569a4fe29c8d92014d2d9a848e9116b8cc9d0842f9Xavier Ducrohet @LayoutlibDelegate 57251d2e99245095369b52d891a660b2ed270f02e0Xavier Ducrohet /*package*/ static int nativeCreate1(LinearGradient thisGradient, 58251d2e99245095369b52d891a660b2ed270f02e0Xavier Ducrohet float x0, float y0, float x1, float y1, 59251d2e99245095369b52d891a660b2ed270f02e0Xavier Ducrohet int colors[], float positions[], int tileMode) { 60251d2e99245095369b52d891a660b2ed270f02e0Xavier Ducrohet LinearGradient_Delegate newDelegate = new LinearGradient_Delegate(x0, y0, x1, y1, 61d348b6eaa98e23cb38d90906df109aaa2d20ea7fXavier Ducrohet colors, positions, Shader_Delegate.getTileMode(tileMode)); 62cc4977d0fdaf657907912fd6cc2f9426dc8d2e36Xavier Ducrohet return sManager.addNewDelegate(newDelegate); 63251d2e99245095369b52d891a660b2ed270f02e0Xavier Ducrohet } 649a4fe29c8d92014d2d9a848e9116b8cc9d0842f9Xavier Ducrohet 659a4fe29c8d92014d2d9a848e9116b8cc9d0842f9Xavier Ducrohet @LayoutlibDelegate 66251d2e99245095369b52d891a660b2ed270f02e0Xavier Ducrohet /*package*/ static int nativeCreate2(LinearGradient thisGradient, 67251d2e99245095369b52d891a660b2ed270f02e0Xavier Ducrohet float x0, float y0, float x1, float y1, 68251d2e99245095369b52d891a660b2ed270f02e0Xavier Ducrohet int color0, int color1, int tileMode) { 69251d2e99245095369b52d891a660b2ed270f02e0Xavier Ducrohet return nativeCreate1(thisGradient, 70251d2e99245095369b52d891a660b2ed270f02e0Xavier Ducrohet x0, y0, x1, y1, new int[] { color0, color1}, null /*positions*/, 71251d2e99245095369b52d891a660b2ed270f02e0Xavier Ducrohet tileMode); 72251d2e99245095369b52d891a660b2ed270f02e0Xavier Ducrohet } 739a4fe29c8d92014d2d9a848e9116b8cc9d0842f9Xavier Ducrohet 749a4fe29c8d92014d2d9a848e9116b8cc9d0842f9Xavier Ducrohet @LayoutlibDelegate 75251d2e99245095369b52d891a660b2ed270f02e0Xavier Ducrohet /*package*/ static int nativePostCreate1(LinearGradient thisGradient, 76251d2e99245095369b52d891a660b2ed270f02e0Xavier Ducrohet int native_shader, float x0, float y0, float x1, float y1, 77251d2e99245095369b52d891a660b2ed270f02e0Xavier Ducrohet int colors[], float positions[], int tileMode) { 78251d2e99245095369b52d891a660b2ed270f02e0Xavier Ducrohet // nothing to be done here. 79251d2e99245095369b52d891a660b2ed270f02e0Xavier Ducrohet return 0; 80251d2e99245095369b52d891a660b2ed270f02e0Xavier Ducrohet } 819a4fe29c8d92014d2d9a848e9116b8cc9d0842f9Xavier Ducrohet 829a4fe29c8d92014d2d9a848e9116b8cc9d0842f9Xavier Ducrohet @LayoutlibDelegate 83251d2e99245095369b52d891a660b2ed270f02e0Xavier Ducrohet /*package*/ static int nativePostCreate2(LinearGradient thisGradient, 84251d2e99245095369b52d891a660b2ed270f02e0Xavier Ducrohet int native_shader, float x0, float y0, float x1, float y1, 85251d2e99245095369b52d891a660b2ed270f02e0Xavier Ducrohet int color0, int color1, int tileMode) { 86251d2e99245095369b52d891a660b2ed270f02e0Xavier Ducrohet // nothing to be done here. 87251d2e99245095369b52d891a660b2ed270f02e0Xavier Ducrohet return 0; 88251d2e99245095369b52d891a660b2ed270f02e0Xavier Ducrohet } 89251d2e99245095369b52d891a660b2ed270f02e0Xavier Ducrohet 90251d2e99245095369b52d891a660b2ed270f02e0Xavier Ducrohet // ---- Private delegate/helper methods ---- 91251d2e99245095369b52d891a660b2ed270f02e0Xavier Ducrohet 9263b2e616278c1b4284e1adbcc3936d0516083dcbXavier Ducrohet /** 9363b2e616278c1b4284e1adbcc3936d0516083dcbXavier Ducrohet * Create a shader that draws a linear gradient along a line. 9463b2e616278c1b4284e1adbcc3936d0516083dcbXavier Ducrohet * 9563b2e616278c1b4284e1adbcc3936d0516083dcbXavier Ducrohet * @param x0 The x-coordinate for the start of the gradient line 9663b2e616278c1b4284e1adbcc3936d0516083dcbXavier Ducrohet * @param y0 The y-coordinate for the start of the gradient line 9763b2e616278c1b4284e1adbcc3936d0516083dcbXavier Ducrohet * @param x1 The x-coordinate for the end of the gradient line 9863b2e616278c1b4284e1adbcc3936d0516083dcbXavier Ducrohet * @param y1 The y-coordinate for the end of the gradient line 9963b2e616278c1b4284e1adbcc3936d0516083dcbXavier Ducrohet * @param colors The colors to be distributed along the gradient line 10063b2e616278c1b4284e1adbcc3936d0516083dcbXavier Ducrohet * @param positions May be null. The relative positions [0..1] of each 10163b2e616278c1b4284e1adbcc3936d0516083dcbXavier Ducrohet * corresponding color in the colors array. If this is null, the 10263b2e616278c1b4284e1adbcc3936d0516083dcbXavier Ducrohet * the colors are distributed evenly along the gradient line. 10363b2e616278c1b4284e1adbcc3936d0516083dcbXavier Ducrohet * @param tile The Shader tiling mode 10463b2e616278c1b4284e1adbcc3936d0516083dcbXavier Ducrohet */ 105251d2e99245095369b52d891a660b2ed270f02e0Xavier Ducrohet private LinearGradient_Delegate(float x0, float y0, float x1, float y1, 106251d2e99245095369b52d891a660b2ed270f02e0Xavier Ducrohet int colors[], float positions[], TileMode tile) { 10745a7c285985976c23d818665694addbb25e02565Xavier Ducrohet super(colors, positions); 10845a7c285985976c23d818665694addbb25e02565Xavier Ducrohet mJavaPaint = new LinearGradientPaint(x0, y0, x1, y1, mColors, mPositions, tile); 1099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 111251d2e99245095369b52d891a660b2ed270f02e0Xavier Ducrohet // ---- Custom Java Paint ---- 11245a7c285985976c23d818665694addbb25e02565Xavier Ducrohet /** 11345a7c285985976c23d818665694addbb25e02565Xavier Ducrohet * Linear Gradient (Java) Paint able to handle more than 2 points, as 11445a7c285985976c23d818665694addbb25e02565Xavier Ducrohet * {@link java.awt.GradientPaint} only supports 2 points and does not support Android's tile 11545a7c285985976c23d818665694addbb25e02565Xavier Ducrohet * modes. 11645a7c285985976c23d818665694addbb25e02565Xavier Ducrohet */ 117d9c64369cf9be6568af2d79c35fb470cc261730dXavier Ducrohet private class LinearGradientPaint extends GradientPaint { 118374abf0b95ca94d34f94edd385fb37a8d5cb123bXavier Ducrohet 119374abf0b95ca94d34f94edd385fb37a8d5cb123bXavier Ducrohet private final float mX0; 120374abf0b95ca94d34f94edd385fb37a8d5cb123bXavier Ducrohet private final float mY0; 121374abf0b95ca94d34f94edd385fb37a8d5cb123bXavier Ducrohet private final float mDx; 122374abf0b95ca94d34f94edd385fb37a8d5cb123bXavier Ducrohet private final float mDy; 123374abf0b95ca94d34f94edd385fb37a8d5cb123bXavier Ducrohet private final float mDSize2; 124374abf0b95ca94d34f94edd385fb37a8d5cb123bXavier Ducrohet 12545a7c285985976c23d818665694addbb25e02565Xavier Ducrohet public LinearGradientPaint(float x0, float y0, float x1, float y1, int colors[], 126374abf0b95ca94d34f94edd385fb37a8d5cb123bXavier Ducrohet float positions[], TileMode tile) { 12745a7c285985976c23d818665694addbb25e02565Xavier Ducrohet super(colors, positions, tile); 128d9c64369cf9be6568af2d79c35fb470cc261730dXavier Ducrohet mX0 = x0; 129d9c64369cf9be6568af2d79c35fb470cc261730dXavier Ducrohet mY0 = y0; 130d9c64369cf9be6568af2d79c35fb470cc261730dXavier Ducrohet mDx = x1 - x0; 131d9c64369cf9be6568af2d79c35fb470cc261730dXavier Ducrohet mDy = y1 - y0; 132d9c64369cf9be6568af2d79c35fb470cc261730dXavier Ducrohet mDSize2 = mDx * mDx + mDy * mDy; 133374abf0b95ca94d34f94edd385fb37a8d5cb123bXavier Ducrohet } 134374abf0b95ca94d34f94edd385fb37a8d5cb123bXavier Ducrohet 13546d43ccfd8cef75b4315828073c094cf1efb05ffXavier Ducrohet @Override 13645a7c285985976c23d818665694addbb25e02565Xavier Ducrohet public java.awt.PaintContext createContext( 13745a7c285985976c23d818665694addbb25e02565Xavier Ducrohet java.awt.image.ColorModel colorModel, 13845a7c285985976c23d818665694addbb25e02565Xavier Ducrohet java.awt.Rectangle deviceBounds, 13945a7c285985976c23d818665694addbb25e02565Xavier Ducrohet java.awt.geom.Rectangle2D userBounds, 14045a7c285985976c23d818665694addbb25e02565Xavier Ducrohet java.awt.geom.AffineTransform xform, 14145a7c285985976c23d818665694addbb25e02565Xavier Ducrohet java.awt.RenderingHints hints) { 14245a7c285985976c23d818665694addbb25e02565Xavier Ducrohet precomputeGradientColors(); 143d9c64369cf9be6568af2d79c35fb470cc261730dXavier Ducrohet 144d348b6eaa98e23cb38d90906df109aaa2d20ea7fXavier Ducrohet java.awt.geom.AffineTransform canvasMatrix; 145d9c64369cf9be6568af2d79c35fb470cc261730dXavier Ducrohet try { 146d9c64369cf9be6568af2d79c35fb470cc261730dXavier Ducrohet canvasMatrix = xform.createInverse(); 147d348b6eaa98e23cb38d90906df109aaa2d20ea7fXavier Ducrohet } catch (java.awt.geom.NoninvertibleTransformException e) { 148918aaa5717fce6081557c82ce1c439b6922737d5Xavier Ducrohet Bridge.getLog().fidelityWarning(LayoutLog.TAG_MATRIX_INVERSE, 14951a7e5447de94791c464cda5cc6ebbf616d73c80Xavier Ducrohet "Unable to inverse matrix in LinearGradient", e, null /*data*/); 150d348b6eaa98e23cb38d90906df109aaa2d20ea7fXavier Ducrohet canvasMatrix = new java.awt.geom.AffineTransform(); 151d9c64369cf9be6568af2d79c35fb470cc261730dXavier Ducrohet } 152d9c64369cf9be6568af2d79c35fb470cc261730dXavier Ducrohet 153d348b6eaa98e23cb38d90906df109aaa2d20ea7fXavier Ducrohet java.awt.geom.AffineTransform localMatrix = getLocalMatrix(); 154d9c64369cf9be6568af2d79c35fb470cc261730dXavier Ducrohet try { 155d9c64369cf9be6568af2d79c35fb470cc261730dXavier Ducrohet localMatrix = localMatrix.createInverse(); 156d348b6eaa98e23cb38d90906df109aaa2d20ea7fXavier Ducrohet } catch (java.awt.geom.NoninvertibleTransformException e) { 157918aaa5717fce6081557c82ce1c439b6922737d5Xavier Ducrohet Bridge.getLog().fidelityWarning(LayoutLog.TAG_MATRIX_INVERSE, 15851a7e5447de94791c464cda5cc6ebbf616d73c80Xavier Ducrohet "Unable to inverse matrix in LinearGradient", e, null /*data*/); 159d348b6eaa98e23cb38d90906df109aaa2d20ea7fXavier Ducrohet localMatrix = new java.awt.geom.AffineTransform(); 160d9c64369cf9be6568af2d79c35fb470cc261730dXavier Ducrohet } 161d9c64369cf9be6568af2d79c35fb470cc261730dXavier Ducrohet 162d9c64369cf9be6568af2d79c35fb470cc261730dXavier Ducrohet return new LinearGradientPaintContext(canvasMatrix, localMatrix, colorModel); 163374abf0b95ca94d34f94edd385fb37a8d5cb123bXavier Ducrohet } 164374abf0b95ca94d34f94edd385fb37a8d5cb123bXavier Ducrohet 16545a7c285985976c23d818665694addbb25e02565Xavier Ducrohet private class LinearGradientPaintContext implements java.awt.PaintContext { 166374abf0b95ca94d34f94edd385fb37a8d5cb123bXavier Ducrohet 167d348b6eaa98e23cb38d90906df109aaa2d20ea7fXavier Ducrohet private final java.awt.geom.AffineTransform mCanvasMatrix; 168d348b6eaa98e23cb38d90906df109aaa2d20ea7fXavier Ducrohet private final java.awt.geom.AffineTransform mLocalMatrix; 16945a7c285985976c23d818665694addbb25e02565Xavier Ducrohet private final java.awt.image.ColorModel mColorModel; 170374abf0b95ca94d34f94edd385fb37a8d5cb123bXavier Ducrohet 171d348b6eaa98e23cb38d90906df109aaa2d20ea7fXavier Ducrohet private LinearGradientPaintContext( 172d348b6eaa98e23cb38d90906df109aaa2d20ea7fXavier Ducrohet java.awt.geom.AffineTransform canvasMatrix, 173d348b6eaa98e23cb38d90906df109aaa2d20ea7fXavier Ducrohet java.awt.geom.AffineTransform localMatrix, 174d348b6eaa98e23cb38d90906df109aaa2d20ea7fXavier Ducrohet java.awt.image.ColorModel colorModel) { 175d9c64369cf9be6568af2d79c35fb470cc261730dXavier Ducrohet mCanvasMatrix = canvasMatrix; 176d9c64369cf9be6568af2d79c35fb470cc261730dXavier Ducrohet mLocalMatrix = localMatrix; 17745a7c285985976c23d818665694addbb25e02565Xavier Ducrohet mColorModel = colorModel; 178374abf0b95ca94d34f94edd385fb37a8d5cb123bXavier Ducrohet } 179374abf0b95ca94d34f94edd385fb37a8d5cb123bXavier Ducrohet 18046d43ccfd8cef75b4315828073c094cf1efb05ffXavier Ducrohet @Override 181374abf0b95ca94d34f94edd385fb37a8d5cb123bXavier Ducrohet public void dispose() { 182374abf0b95ca94d34f94edd385fb37a8d5cb123bXavier Ducrohet } 183374abf0b95ca94d34f94edd385fb37a8d5cb123bXavier Ducrohet 18446d43ccfd8cef75b4315828073c094cf1efb05ffXavier Ducrohet @Override 18545a7c285985976c23d818665694addbb25e02565Xavier Ducrohet public java.awt.image.ColorModel getColorModel() { 186374abf0b95ca94d34f94edd385fb37a8d5cb123bXavier Ducrohet return mColorModel; 187374abf0b95ca94d34f94edd385fb37a8d5cb123bXavier Ducrohet } 188374abf0b95ca94d34f94edd385fb37a8d5cb123bXavier Ducrohet 18946d43ccfd8cef75b4315828073c094cf1efb05ffXavier Ducrohet @Override 19045a7c285985976c23d818665694addbb25e02565Xavier Ducrohet public java.awt.image.Raster getRaster(int x, int y, int w, int h) { 19145a7c285985976c23d818665694addbb25e02565Xavier Ducrohet java.awt.image.BufferedImage image = new java.awt.image.BufferedImage(w, h, 19245a7c285985976c23d818665694addbb25e02565Xavier Ducrohet java.awt.image.BufferedImage.TYPE_INT_ARGB); 193374abf0b95ca94d34f94edd385fb37a8d5cb123bXavier Ducrohet 194e8f4d7deab2c183604ea5a2344a1e2d7ff4f823aXavier Ducrohet int[] data = new int[w*h]; 195e8f4d7deab2c183604ea5a2344a1e2d7ff4f823aXavier Ducrohet 196d9c64369cf9be6568af2d79c35fb470cc261730dXavier Ducrohet int index = 0; 197d9c64369cf9be6568af2d79c35fb470cc261730dXavier Ducrohet float[] pt1 = new float[2]; 198d9c64369cf9be6568af2d79c35fb470cc261730dXavier Ducrohet float[] pt2 = new float[2]; 199d9c64369cf9be6568af2d79c35fb470cc261730dXavier Ducrohet for (int iy = 0 ; iy < h ; iy++) { 200374abf0b95ca94d34f94edd385fb37a8d5cb123bXavier Ducrohet for (int ix = 0 ; ix < w ; ix++) { 201d9c64369cf9be6568af2d79c35fb470cc261730dXavier Ducrohet // handle the canvas transform 202d9c64369cf9be6568af2d79c35fb470cc261730dXavier Ducrohet pt1[0] = x + ix; 203d9c64369cf9be6568af2d79c35fb470cc261730dXavier Ducrohet pt1[1] = y + iy; 204d9c64369cf9be6568af2d79c35fb470cc261730dXavier Ducrohet mCanvasMatrix.transform(pt1, 0, pt2, 0, 1); 205374abf0b95ca94d34f94edd385fb37a8d5cb123bXavier Ducrohet 206d9c64369cf9be6568af2d79c35fb470cc261730dXavier Ducrohet // handle the local matrix. 207d9c64369cf9be6568af2d79c35fb470cc261730dXavier Ducrohet pt1[0] = pt2[0]; 208d9c64369cf9be6568af2d79c35fb470cc261730dXavier Ducrohet pt1[1] = pt2[1]; 209d9c64369cf9be6568af2d79c35fb470cc261730dXavier Ducrohet mLocalMatrix.transform(pt1, 0, pt2, 0, 1); 210d9c64369cf9be6568af2d79c35fb470cc261730dXavier Ducrohet 211d9c64369cf9be6568af2d79c35fb470cc261730dXavier Ducrohet data[index++] = getColor(pt2[0], pt2[1]); 212374abf0b95ca94d34f94edd385fb37a8d5cb123bXavier Ducrohet } 213374abf0b95ca94d34f94edd385fb37a8d5cb123bXavier Ducrohet } 214374abf0b95ca94d34f94edd385fb37a8d5cb123bXavier Ducrohet 215e8f4d7deab2c183604ea5a2344a1e2d7ff4f823aXavier Ducrohet image.setRGB(0 /*startX*/, 0 /*startY*/, w, h, data, 0 /*offset*/, w /*scansize*/); 216e8f4d7deab2c183604ea5a2344a1e2d7ff4f823aXavier Ducrohet 2172dbb923aa02e09a64fc111596a9ac9117488aa24Xavier Ducrohet return image.getRaster(); 218374abf0b95ca94d34f94edd385fb37a8d5cb123bXavier Ducrohet } 219374abf0b95ca94d34f94edd385fb37a8d5cb123bXavier Ducrohet } 220374abf0b95ca94d34f94edd385fb37a8d5cb123bXavier Ducrohet 221374abf0b95ca94d34f94edd385fb37a8d5cb123bXavier Ducrohet /** 222374abf0b95ca94d34f94edd385fb37a8d5cb123bXavier Ducrohet * Returns a color for an arbitrary point. 223374abf0b95ca94d34f94edd385fb37a8d5cb123bXavier Ducrohet */ 224374abf0b95ca94d34f94edd385fb37a8d5cb123bXavier Ducrohet private int getColor(float x, float y) { 22563fd87113cea6abec97a6cd966e090e9b590fc3bXavier Ducrohet float pos; 22663fd87113cea6abec97a6cd966e090e9b590fc3bXavier Ducrohet if (mDx == 0) { 22763fd87113cea6abec97a6cd966e090e9b590fc3bXavier Ducrohet pos = (y - mY0) / mDy; 22863fd87113cea6abec97a6cd966e090e9b590fc3bXavier Ducrohet } else if (mDy == 0) { 22963fd87113cea6abec97a6cd966e090e9b590fc3bXavier Ducrohet pos = (x - mX0) / mDx; 23063fd87113cea6abec97a6cd966e090e9b590fc3bXavier Ducrohet } else { 23163fd87113cea6abec97a6cd966e090e9b590fc3bXavier Ducrohet // find the x position on the gradient vector. 23263fd87113cea6abec97a6cd966e090e9b590fc3bXavier Ducrohet float _x = (mDx*mDy*(y-mY0) + mDy*mDy*mX0 + mDx*mDx*x) / mDSize2; 23363fd87113cea6abec97a6cd966e090e9b590fc3bXavier Ducrohet // from it get the position relative to the vector 23463fd87113cea6abec97a6cd966e090e9b590fc3bXavier Ducrohet pos = (_x - mX0) / mDx; 23563fd87113cea6abec97a6cd966e090e9b590fc3bXavier Ducrohet } 236374abf0b95ca94d34f94edd385fb37a8d5cb123bXavier Ducrohet 23745a7c285985976c23d818665694addbb25e02565Xavier Ducrohet return getGradientColor(pos); 238374abf0b95ca94d34f94edd385fb37a8d5cb123bXavier Ducrohet } 2399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 241