Shader_Delegate.java revision 145bc2d067faa3fb49b71e9e8c8c70b40564061a
1282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski/* 2282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski * Copyright (C) 2010 The Android Open Source Project 3282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski * 4282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski * Licensed under the Apache License, Version 2.0 (the "License"); 5282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski * you may not use this file except in compliance with the License. 6282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski * You may obtain a copy of the License at 7282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski * 8282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski * http://www.apache.org/licenses/LICENSE-2.0 9282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski * 10282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski * Unless required by applicable law or agreed to in writing, software 11282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski * distributed under the License is distributed on an "AS IS" BASIS, 12282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski * See the License for the specific language governing permissions and 14282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski * limitations under the License. 15282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski */ 16282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski 17282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinskipackage android.graphics; 18282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski 19282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinskiimport com.android.layoutlib.bridge.impl.DelegateManager; 20282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinskiimport com.android.tools.layoutlib.annotations.LayoutlibDelegate; 21282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski 22282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinskiimport android.graphics.Shader.TileMode; 23282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski 24282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski/** 25282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski * Delegate implementing the native methods of android.graphics.Shader 26282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski * 27282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski * Through the layoutlib_create tool, the original native methods of Shader have been replaced 28282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski * by calls to methods of the same name in this delegate class. 29282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski * 30282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski * This class behaves like the original native implementation, but in Java, keeping previously 31282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski * native data into its own objects and mapping them to int that are sent back and forth between 32282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski * it and the original Shader class. 33282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski * 34282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski * This also serve as a base class for all Shader delegate classes. 35282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski * 36282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski * @see DelegateManager 37282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski * 38282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski */ 39282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinskipublic abstract class Shader_Delegate { 40282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski 41282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski // ---- delegate manager ---- 42282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski protected static final DelegateManager<Shader_Delegate> sManager = 43282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski new DelegateManager<Shader_Delegate>(Shader_Delegate.class); 44282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski 45282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski // ---- delegate helper data ---- 46282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski 47282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski // ---- delegate data ---- 48282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski private Matrix_Delegate mLocalMatrix = null; 49282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski 50282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski // ---- Public Helper methods ---- 51282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski 5288a8364c386c694f7ad56662ef89713dbf7c9d63Narayan Kamath public static Shader_Delegate getDelegate(long nativeShader) { 53282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski return sManager.getDelegate(nativeShader); 54282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski } 55282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski 56282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski /** 57282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski * Returns the {@link TileMode} matching the given int. 58282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski * @param tileMode the tile mode int value 59282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski * @return the TileMode enum. 60282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski */ 61282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski public static TileMode getTileMode(int tileMode) { 62282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski for (TileMode tm : TileMode.values()) { 63282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski if (tm.nativeInt == tileMode) { 64282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski return tm; 65282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski } 66282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski } 67282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski 68282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski assert false; 69282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski return TileMode.CLAMP; 70282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski } 71282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski 72282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski public abstract java.awt.Paint getJavaPaint(); 73282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski public abstract boolean isSupported(); 74282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski public abstract String getSupportMessage(); 75282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski 76282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski // ---- native methods ---- 77282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski 78282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski @LayoutlibDelegate 79145bc2d067faa3fb49b71e9e8c8c70b40564061aDeepanshu Gupta /*package*/ static void nativeDestructor(long native_shader) { 80282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski sManager.removeJavaReferenceFor(native_shader); 81282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski } 82282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski 83282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski @LayoutlibDelegate 84145bc2d067faa3fb49b71e9e8c8c70b40564061aDeepanshu Gupta /*package*/ static void nativeSetLocalMatrix(long native_shader, long matrix_instance) { 85282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski // get the delegate from the native int. 86282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski Shader_Delegate shaderDelegate = sManager.getDelegate(native_shader); 87282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski if (shaderDelegate == null) { 88145bc2d067faa3fb49b71e9e8c8c70b40564061aDeepanshu Gupta return; 89282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski } 90282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski 91282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski shaderDelegate.mLocalMatrix = Matrix_Delegate.getDelegate(matrix_instance); 92282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski } 93282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski 94282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski // ---- Private delegate/helper methods ---- 95282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski 96282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski protected java.awt.geom.AffineTransform getLocalMatrix() { 97282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski if (mLocalMatrix != null) { 98282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski return mLocalMatrix.getAffineTransform(); 99282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski } 100282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski 101282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski return new java.awt.geom.AffineTransform(); 102282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski } 103282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski 104282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski} 105