1251d2e99245095369b52d891a660b2ed270f02e0Xavier Ducrohet/* 2251d2e99245095369b52d891a660b2ed270f02e0Xavier Ducrohet * Copyright (C) 2010 The Android Open Source Project 3251d2e99245095369b52d891a660b2ed270f02e0Xavier Ducrohet * 4251d2e99245095369b52d891a660b2ed270f02e0Xavier Ducrohet * Licensed under the Apache License, Version 2.0 (the "License"); 5251d2e99245095369b52d891a660b2ed270f02e0Xavier Ducrohet * you may not use this file except in compliance with the License. 6251d2e99245095369b52d891a660b2ed270f02e0Xavier Ducrohet * You may obtain a copy of the License at 7251d2e99245095369b52d891a660b2ed270f02e0Xavier Ducrohet * 8251d2e99245095369b52d891a660b2ed270f02e0Xavier Ducrohet * http://www.apache.org/licenses/LICENSE-2.0 9251d2e99245095369b52d891a660b2ed270f02e0Xavier Ducrohet * 10251d2e99245095369b52d891a660b2ed270f02e0Xavier Ducrohet * Unless required by applicable law or agreed to in writing, software 11251d2e99245095369b52d891a660b2ed270f02e0Xavier Ducrohet * distributed under the License is distributed on an "AS IS" BASIS, 12251d2e99245095369b52d891a660b2ed270f02e0Xavier Ducrohet * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13251d2e99245095369b52d891a660b2ed270f02e0Xavier Ducrohet * See the License for the specific language governing permissions and 14251d2e99245095369b52d891a660b2ed270f02e0Xavier Ducrohet * limitations under the License. 15251d2e99245095369b52d891a660b2ed270f02e0Xavier Ducrohet */ 16251d2e99245095369b52d891a660b2ed270f02e0Xavier Ducrohet 17251d2e99245095369b52d891a660b2ed270f02e0Xavier Ducrohetpackage android.graphics; 18251d2e99245095369b52d891a660b2ed270f02e0Xavier Ducrohet 19c2e9651bf386a1f7bf7fc706cf5424950570470cXavier Ducrohetimport com.android.layoutlib.bridge.impl.DelegateManager; 209a4fe29c8d92014d2d9a848e9116b8cc9d0842f9Xavier Ducrohetimport com.android.tools.layoutlib.annotations.LayoutlibDelegate; 21251d2e99245095369b52d891a660b2ed270f02e0Xavier Ducrohet 22d348b6eaa98e23cb38d90906df109aaa2d20ea7fXavier Ducrohetimport android.graphics.Shader.TileMode; 23d9c64369cf9be6568af2d79c35fb470cc261730dXavier Ducrohet 24251d2e99245095369b52d891a660b2ed270f02e0Xavier Ducrohet/** 25251d2e99245095369b52d891a660b2ed270f02e0Xavier Ducrohet * Delegate implementing the native methods of android.graphics.Shader 26251d2e99245095369b52d891a660b2ed270f02e0Xavier Ducrohet * 27251d2e99245095369b52d891a660b2ed270f02e0Xavier Ducrohet * Through the layoutlib_create tool, the original native methods of Shader have been replaced 28251d2e99245095369b52d891a660b2ed270f02e0Xavier Ducrohet * 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 Shader class. 33251d2e99245095369b52d891a660b2ed270f02e0Xavier Ducrohet * 34251d2e99245095369b52d891a660b2ed270f02e0Xavier Ducrohet * This also serve as a base class for all Shader delegate classes. 35251d2e99245095369b52d891a660b2ed270f02e0Xavier Ducrohet * 36251d2e99245095369b52d891a660b2ed270f02e0Xavier Ducrohet * @see DelegateManager 37251d2e99245095369b52d891a660b2ed270f02e0Xavier Ducrohet * 38251d2e99245095369b52d891a660b2ed270f02e0Xavier Ducrohet */ 39251d2e99245095369b52d891a660b2ed270f02e0Xavier Ducrohetpublic abstract class Shader_Delegate { 40251d2e99245095369b52d891a660b2ed270f02e0Xavier Ducrohet 41251d2e99245095369b52d891a660b2ed270f02e0Xavier Ducrohet // ---- delegate manager ---- 42251d2e99245095369b52d891a660b2ed270f02e0Xavier Ducrohet protected static final DelegateManager<Shader_Delegate> sManager = 43f0a53435f14d23d9555fc46014352ee6a7baa647Xavier Ducrohet new DelegateManager<Shader_Delegate>(Shader_Delegate.class); 44251d2e99245095369b52d891a660b2ed270f02e0Xavier Ducrohet 45251d2e99245095369b52d891a660b2ed270f02e0Xavier Ducrohet // ---- delegate helper data ---- 46251d2e99245095369b52d891a660b2ed270f02e0Xavier Ducrohet 47251d2e99245095369b52d891a660b2ed270f02e0Xavier Ducrohet // ---- delegate data ---- 48cc4977d0fdaf657907912fd6cc2f9426dc8d2e36Xavier Ducrohet private Matrix_Delegate mLocalMatrix = null; 49251d2e99245095369b52d891a660b2ed270f02e0Xavier Ducrohet 50251d2e99245095369b52d891a660b2ed270f02e0Xavier Ducrohet // ---- Public Helper methods ---- 51251d2e99245095369b52d891a660b2ed270f02e0Xavier Ducrohet 52251d2e99245095369b52d891a660b2ed270f02e0Xavier Ducrohet public static Shader_Delegate getDelegate(int nativeShader) { 53251d2e99245095369b52d891a660b2ed270f02e0Xavier Ducrohet return sManager.getDelegate(nativeShader); 54251d2e99245095369b52d891a660b2ed270f02e0Xavier Ducrohet } 55251d2e99245095369b52d891a660b2ed270f02e0Xavier Ducrohet 56d348b6eaa98e23cb38d90906df109aaa2d20ea7fXavier Ducrohet /** 57d348b6eaa98e23cb38d90906df109aaa2d20ea7fXavier Ducrohet * Returns the {@link TileMode} matching the given int. 58d348b6eaa98e23cb38d90906df109aaa2d20ea7fXavier Ducrohet * @param tileMode the tile mode int value 59d348b6eaa98e23cb38d90906df109aaa2d20ea7fXavier Ducrohet * @return the TileMode enum. 60d348b6eaa98e23cb38d90906df109aaa2d20ea7fXavier Ducrohet */ 61d348b6eaa98e23cb38d90906df109aaa2d20ea7fXavier Ducrohet public static TileMode getTileMode(int tileMode) { 62d348b6eaa98e23cb38d90906df109aaa2d20ea7fXavier Ducrohet for (TileMode tm : TileMode.values()) { 63d348b6eaa98e23cb38d90906df109aaa2d20ea7fXavier Ducrohet if (tm.nativeInt == tileMode) { 64d348b6eaa98e23cb38d90906df109aaa2d20ea7fXavier Ducrohet return tm; 65d348b6eaa98e23cb38d90906df109aaa2d20ea7fXavier Ducrohet } 66d348b6eaa98e23cb38d90906df109aaa2d20ea7fXavier Ducrohet } 67d348b6eaa98e23cb38d90906df109aaa2d20ea7fXavier Ducrohet 68d348b6eaa98e23cb38d90906df109aaa2d20ea7fXavier Ducrohet assert false; 69d348b6eaa98e23cb38d90906df109aaa2d20ea7fXavier Ducrohet return TileMode.CLAMP; 70d348b6eaa98e23cb38d90906df109aaa2d20ea7fXavier Ducrohet } 71d348b6eaa98e23cb38d90906df109aaa2d20ea7fXavier Ducrohet 72251d2e99245095369b52d891a660b2ed270f02e0Xavier Ducrohet public abstract java.awt.Paint getJavaPaint(); 73d348b6eaa98e23cb38d90906df109aaa2d20ea7fXavier Ducrohet public abstract boolean isSupported(); 74d348b6eaa98e23cb38d90906df109aaa2d20ea7fXavier Ducrohet public abstract String getSupportMessage(); 75251d2e99245095369b52d891a660b2ed270f02e0Xavier Ducrohet 76251d2e99245095369b52d891a660b2ed270f02e0Xavier Ducrohet // ---- native methods ---- 77251d2e99245095369b52d891a660b2ed270f02e0Xavier Ducrohet 789a4fe29c8d92014d2d9a848e9116b8cc9d0842f9Xavier Ducrohet @LayoutlibDelegate 79251d2e99245095369b52d891a660b2ed270f02e0Xavier Ducrohet /*package*/ static void nativeDestructor(int native_shader, int native_skiaShader) { 80cc4977d0fdaf657907912fd6cc2f9426dc8d2e36Xavier Ducrohet sManager.removeJavaReferenceFor(native_shader); 81251d2e99245095369b52d891a660b2ed270f02e0Xavier Ducrohet } 82251d2e99245095369b52d891a660b2ed270f02e0Xavier Ducrohet 839a4fe29c8d92014d2d9a848e9116b8cc9d0842f9Xavier Ducrohet @LayoutlibDelegate 84251d2e99245095369b52d891a660b2ed270f02e0Xavier Ducrohet /*package*/ static void nativeSetLocalMatrix(int native_shader, int native_skiaShader, 85251d2e99245095369b52d891a660b2ed270f02e0Xavier Ducrohet int matrix_instance) { 86251d2e99245095369b52d891a660b2ed270f02e0Xavier Ducrohet // get the delegate from the native int. 87251d2e99245095369b52d891a660b2ed270f02e0Xavier Ducrohet Shader_Delegate shaderDelegate = sManager.getDelegate(native_shader); 88251d2e99245095369b52d891a660b2ed270f02e0Xavier Ducrohet if (shaderDelegate == null) { 89251d2e99245095369b52d891a660b2ed270f02e0Xavier Ducrohet return; 90251d2e99245095369b52d891a660b2ed270f02e0Xavier Ducrohet } 91251d2e99245095369b52d891a660b2ed270f02e0Xavier Ducrohet 92cc4977d0fdaf657907912fd6cc2f9426dc8d2e36Xavier Ducrohet shaderDelegate.mLocalMatrix = Matrix_Delegate.getDelegate(matrix_instance); 93251d2e99245095369b52d891a660b2ed270f02e0Xavier Ducrohet } 94251d2e99245095369b52d891a660b2ed270f02e0Xavier Ducrohet 95251d2e99245095369b52d891a660b2ed270f02e0Xavier Ducrohet // ---- Private delegate/helper methods ---- 96251d2e99245095369b52d891a660b2ed270f02e0Xavier Ducrohet 97d348b6eaa98e23cb38d90906df109aaa2d20ea7fXavier Ducrohet protected java.awt.geom.AffineTransform getLocalMatrix() { 98cc4977d0fdaf657907912fd6cc2f9426dc8d2e36Xavier Ducrohet if (mLocalMatrix != null) { 99cc4977d0fdaf657907912fd6cc2f9426dc8d2e36Xavier Ducrohet return mLocalMatrix.getAffineTransform(); 100d9c64369cf9be6568af2d79c35fb470cc261730dXavier Ducrohet } 101d9c64369cf9be6568af2d79c35fb470cc261730dXavier Ducrohet 102d348b6eaa98e23cb38d90906df109aaa2d20ea7fXavier Ducrohet return new java.awt.geom.AffineTransform(); 103d9c64369cf9be6568af2d79c35fb470cc261730dXavier Ducrohet } 104d9c64369cf9be6568af2d79c35fb470cc261730dXavier Ducrohet 105251d2e99245095369b52d891a660b2ed270f02e0Xavier Ducrohet} 106