14b52ec49fee79b0488d6a9eaaa4ea5d74ce90905Xavier Ducrohet/* 24b52ec49fee79b0488d6a9eaaa4ea5d74ce90905Xavier Ducrohet * Copyright (C) 2010 The Android Open Source Project 34b52ec49fee79b0488d6a9eaaa4ea5d74ce90905Xavier Ducrohet * 44b52ec49fee79b0488d6a9eaaa4ea5d74ce90905Xavier Ducrohet * Licensed under the Apache License, Version 2.0 (the "License"); 54b52ec49fee79b0488d6a9eaaa4ea5d74ce90905Xavier Ducrohet * you may not use this file except in compliance with the License. 64b52ec49fee79b0488d6a9eaaa4ea5d74ce90905Xavier Ducrohet * You may obtain a copy of the License at 74b52ec49fee79b0488d6a9eaaa4ea5d74ce90905Xavier Ducrohet * 84b52ec49fee79b0488d6a9eaaa4ea5d74ce90905Xavier Ducrohet * http://www.apache.org/licenses/LICENSE-2.0 94b52ec49fee79b0488d6a9eaaa4ea5d74ce90905Xavier Ducrohet * 104b52ec49fee79b0488d6a9eaaa4ea5d74ce90905Xavier Ducrohet * Unless required by applicable law or agreed to in writing, software 114b52ec49fee79b0488d6a9eaaa4ea5d74ce90905Xavier Ducrohet * distributed under the License is distributed on an "AS IS" BASIS, 124b52ec49fee79b0488d6a9eaaa4ea5d74ce90905Xavier Ducrohet * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 134b52ec49fee79b0488d6a9eaaa4ea5d74ce90905Xavier Ducrohet * See the License for the specific language governing permissions and 144b52ec49fee79b0488d6a9eaaa4ea5d74ce90905Xavier Ducrohet * limitations under the License. 154b52ec49fee79b0488d6a9eaaa4ea5d74ce90905Xavier Ducrohet */ 164b52ec49fee79b0488d6a9eaaa4ea5d74ce90905Xavier Ducrohet 174b52ec49fee79b0488d6a9eaaa4ea5d74ce90905Xavier Ducrohetpackage android.graphics; 184b52ec49fee79b0488d6a9eaaa4ea5d74ce90905Xavier Ducrohet 194b52ec49fee79b0488d6a9eaaa4ea5d74ce90905Xavier Ducrohetimport com.android.layoutlib.bridge.impl.DelegateManager; 204b52ec49fee79b0488d6a9eaaa4ea5d74ce90905Xavier Ducrohetimport com.android.tools.layoutlib.annotations.LayoutlibDelegate; 214b52ec49fee79b0488d6a9eaaa4ea5d74ce90905Xavier Ducrohet 224b52ec49fee79b0488d6a9eaaa4ea5d74ce90905Xavier Ducrohetimport android.graphics.Shader.TileMode; 234b52ec49fee79b0488d6a9eaaa4ea5d74ce90905Xavier Ducrohet 244b52ec49fee79b0488d6a9eaaa4ea5d74ce90905Xavier Ducrohet/** 254b52ec49fee79b0488d6a9eaaa4ea5d74ce90905Xavier Ducrohet * Delegate implementing the native methods of android.graphics.Shader 264b52ec49fee79b0488d6a9eaaa4ea5d74ce90905Xavier Ducrohet * 274b52ec49fee79b0488d6a9eaaa4ea5d74ce90905Xavier Ducrohet * Through the layoutlib_create tool, the original native methods of Shader have been replaced 284b52ec49fee79b0488d6a9eaaa4ea5d74ce90905Xavier Ducrohet * by calls to methods of the same name in this delegate class. 294b52ec49fee79b0488d6a9eaaa4ea5d74ce90905Xavier Ducrohet * 304b52ec49fee79b0488d6a9eaaa4ea5d74ce90905Xavier Ducrohet * This class behaves like the original native implementation, but in Java, keeping previously 314b52ec49fee79b0488d6a9eaaa4ea5d74ce90905Xavier Ducrohet * native data into its own objects and mapping them to int that are sent back and forth between 324b52ec49fee79b0488d6a9eaaa4ea5d74ce90905Xavier Ducrohet * it and the original Shader class. 334b52ec49fee79b0488d6a9eaaa4ea5d74ce90905Xavier Ducrohet * 344b52ec49fee79b0488d6a9eaaa4ea5d74ce90905Xavier Ducrohet * This also serve as a base class for all Shader delegate classes. 354b52ec49fee79b0488d6a9eaaa4ea5d74ce90905Xavier Ducrohet * 364b52ec49fee79b0488d6a9eaaa4ea5d74ce90905Xavier Ducrohet * @see DelegateManager 374b52ec49fee79b0488d6a9eaaa4ea5d74ce90905Xavier Ducrohet * 384b52ec49fee79b0488d6a9eaaa4ea5d74ce90905Xavier Ducrohet */ 394b52ec49fee79b0488d6a9eaaa4ea5d74ce90905Xavier Ducrohetpublic abstract class Shader_Delegate { 404b52ec49fee79b0488d6a9eaaa4ea5d74ce90905Xavier Ducrohet 414b52ec49fee79b0488d6a9eaaa4ea5d74ce90905Xavier Ducrohet // ---- delegate manager ---- 424b52ec49fee79b0488d6a9eaaa4ea5d74ce90905Xavier Ducrohet protected static final DelegateManager<Shader_Delegate> sManager = 434b52ec49fee79b0488d6a9eaaa4ea5d74ce90905Xavier Ducrohet new DelegateManager<Shader_Delegate>(Shader_Delegate.class); 444b52ec49fee79b0488d6a9eaaa4ea5d74ce90905Xavier Ducrohet 454b52ec49fee79b0488d6a9eaaa4ea5d74ce90905Xavier Ducrohet // ---- delegate helper data ---- 464b52ec49fee79b0488d6a9eaaa4ea5d74ce90905Xavier Ducrohet 474b52ec49fee79b0488d6a9eaaa4ea5d74ce90905Xavier Ducrohet // ---- delegate data ---- 484b52ec49fee79b0488d6a9eaaa4ea5d74ce90905Xavier Ducrohet private Matrix_Delegate mLocalMatrix = null; 494b52ec49fee79b0488d6a9eaaa4ea5d74ce90905Xavier Ducrohet 504b52ec49fee79b0488d6a9eaaa4ea5d74ce90905Xavier Ducrohet // ---- Public Helper methods ---- 514b52ec49fee79b0488d6a9eaaa4ea5d74ce90905Xavier Ducrohet 524b52ec49fee79b0488d6a9eaaa4ea5d74ce90905Xavier Ducrohet public static Shader_Delegate getDelegate(int nativeShader) { 534b52ec49fee79b0488d6a9eaaa4ea5d74ce90905Xavier Ducrohet return sManager.getDelegate(nativeShader); 544b52ec49fee79b0488d6a9eaaa4ea5d74ce90905Xavier Ducrohet } 554b52ec49fee79b0488d6a9eaaa4ea5d74ce90905Xavier Ducrohet 564b52ec49fee79b0488d6a9eaaa4ea5d74ce90905Xavier Ducrohet /** 574b52ec49fee79b0488d6a9eaaa4ea5d74ce90905Xavier Ducrohet * Returns the {@link TileMode} matching the given int. 584b52ec49fee79b0488d6a9eaaa4ea5d74ce90905Xavier Ducrohet * @param tileMode the tile mode int value 594b52ec49fee79b0488d6a9eaaa4ea5d74ce90905Xavier Ducrohet * @return the TileMode enum. 604b52ec49fee79b0488d6a9eaaa4ea5d74ce90905Xavier Ducrohet */ 614b52ec49fee79b0488d6a9eaaa4ea5d74ce90905Xavier Ducrohet public static TileMode getTileMode(int tileMode) { 624b52ec49fee79b0488d6a9eaaa4ea5d74ce90905Xavier Ducrohet for (TileMode tm : TileMode.values()) { 634b52ec49fee79b0488d6a9eaaa4ea5d74ce90905Xavier Ducrohet if (tm.nativeInt == tileMode) { 644b52ec49fee79b0488d6a9eaaa4ea5d74ce90905Xavier Ducrohet return tm; 654b52ec49fee79b0488d6a9eaaa4ea5d74ce90905Xavier Ducrohet } 664b52ec49fee79b0488d6a9eaaa4ea5d74ce90905Xavier Ducrohet } 674b52ec49fee79b0488d6a9eaaa4ea5d74ce90905Xavier Ducrohet 684b52ec49fee79b0488d6a9eaaa4ea5d74ce90905Xavier Ducrohet assert false; 694b52ec49fee79b0488d6a9eaaa4ea5d74ce90905Xavier Ducrohet return TileMode.CLAMP; 704b52ec49fee79b0488d6a9eaaa4ea5d74ce90905Xavier Ducrohet } 714b52ec49fee79b0488d6a9eaaa4ea5d74ce90905Xavier Ducrohet 724b52ec49fee79b0488d6a9eaaa4ea5d74ce90905Xavier Ducrohet public abstract java.awt.Paint getJavaPaint(); 734b52ec49fee79b0488d6a9eaaa4ea5d74ce90905Xavier Ducrohet public abstract boolean isSupported(); 744b52ec49fee79b0488d6a9eaaa4ea5d74ce90905Xavier Ducrohet public abstract String getSupportMessage(); 754b52ec49fee79b0488d6a9eaaa4ea5d74ce90905Xavier Ducrohet 7659aad78eae14939c169876b2f632d005f382cf7dXavier Ducrohet public boolean isValid() { 7759aad78eae14939c169876b2f632d005f382cf7dXavier Ducrohet if (mLocalMatrix != null && mLocalMatrix.getAffineTransform().getDeterminant() == 0) { 7859aad78eae14939c169876b2f632d005f382cf7dXavier Ducrohet return false; 7959aad78eae14939c169876b2f632d005f382cf7dXavier Ducrohet } 8059aad78eae14939c169876b2f632d005f382cf7dXavier Ducrohet 8159aad78eae14939c169876b2f632d005f382cf7dXavier Ducrohet return true; 8259aad78eae14939c169876b2f632d005f382cf7dXavier Ducrohet } 8359aad78eae14939c169876b2f632d005f382cf7dXavier Ducrohet 844b52ec49fee79b0488d6a9eaaa4ea5d74ce90905Xavier Ducrohet // ---- native methods ---- 854b52ec49fee79b0488d6a9eaaa4ea5d74ce90905Xavier Ducrohet 864b52ec49fee79b0488d6a9eaaa4ea5d74ce90905Xavier Ducrohet @LayoutlibDelegate 87031d2f8b6db5bf7b249ae1c9a72915bf2d3a8d7bXavier Ducrohet /*package*/ static void nativeDestructor(int native_shader) { 884b52ec49fee79b0488d6a9eaaa4ea5d74ce90905Xavier Ducrohet sManager.removeJavaReferenceFor(native_shader); 894b52ec49fee79b0488d6a9eaaa4ea5d74ce90905Xavier Ducrohet } 904b52ec49fee79b0488d6a9eaaa4ea5d74ce90905Xavier Ducrohet 914b52ec49fee79b0488d6a9eaaa4ea5d74ce90905Xavier Ducrohet @LayoutlibDelegate 92031d2f8b6db5bf7b249ae1c9a72915bf2d3a8d7bXavier Ducrohet /*package*/ static boolean nativeGetLocalMatrix(int native_shader, int matrix_instance) { 93031d2f8b6db5bf7b249ae1c9a72915bf2d3a8d7bXavier Ducrohet // get the delegate from the native int. 94031d2f8b6db5bf7b249ae1c9a72915bf2d3a8d7bXavier Ducrohet Shader_Delegate shaderDelegate = sManager.getDelegate(native_shader); 95031d2f8b6db5bf7b249ae1c9a72915bf2d3a8d7bXavier Ducrohet if (shaderDelegate == null) { 96031d2f8b6db5bf7b249ae1c9a72915bf2d3a8d7bXavier Ducrohet return false; 97031d2f8b6db5bf7b249ae1c9a72915bf2d3a8d7bXavier Ducrohet } 98031d2f8b6db5bf7b249ae1c9a72915bf2d3a8d7bXavier Ducrohet 99031d2f8b6db5bf7b249ae1c9a72915bf2d3a8d7bXavier Ducrohet // get the (optional) out matrix. 100031d2f8b6db5bf7b249ae1c9a72915bf2d3a8d7bXavier Ducrohet Matrix_Delegate outMatrixDelegate = Matrix_Delegate.getDelegate(matrix_instance); 101031d2f8b6db5bf7b249ae1c9a72915bf2d3a8d7bXavier Ducrohet 102031d2f8b6db5bf7b249ae1c9a72915bf2d3a8d7bXavier Ducrohet if (shaderDelegate.mLocalMatrix == null || shaderDelegate.mLocalMatrix.isIdentity()) { 103031d2f8b6db5bf7b249ae1c9a72915bf2d3a8d7bXavier Ducrohet if (outMatrixDelegate != null) { 104031d2f8b6db5bf7b249ae1c9a72915bf2d3a8d7bXavier Ducrohet outMatrixDelegate.reset(); 105031d2f8b6db5bf7b249ae1c9a72915bf2d3a8d7bXavier Ducrohet } 106031d2f8b6db5bf7b249ae1c9a72915bf2d3a8d7bXavier Ducrohet return false; 107031d2f8b6db5bf7b249ae1c9a72915bf2d3a8d7bXavier Ducrohet } 108031d2f8b6db5bf7b249ae1c9a72915bf2d3a8d7bXavier Ducrohet 109031d2f8b6db5bf7b249ae1c9a72915bf2d3a8d7bXavier Ducrohet if (outMatrixDelegate != null) { 110031d2f8b6db5bf7b249ae1c9a72915bf2d3a8d7bXavier Ducrohet outMatrixDelegate.set(shaderDelegate.mLocalMatrix); 111031d2f8b6db5bf7b249ae1c9a72915bf2d3a8d7bXavier Ducrohet } 112031d2f8b6db5bf7b249ae1c9a72915bf2d3a8d7bXavier Ducrohet 113031d2f8b6db5bf7b249ae1c9a72915bf2d3a8d7bXavier Ducrohet return true; 114031d2f8b6db5bf7b249ae1c9a72915bf2d3a8d7bXavier Ducrohet } 115031d2f8b6db5bf7b249ae1c9a72915bf2d3a8d7bXavier Ducrohet 116031d2f8b6db5bf7b249ae1c9a72915bf2d3a8d7bXavier Ducrohet 117031d2f8b6db5bf7b249ae1c9a72915bf2d3a8d7bXavier Ducrohet @LayoutlibDelegate 118031d2f8b6db5bf7b249ae1c9a72915bf2d3a8d7bXavier Ducrohet /*package*/ static void nativeSetLocalMatrix(int native_shader, int matrix_instance) { 1194b52ec49fee79b0488d6a9eaaa4ea5d74ce90905Xavier Ducrohet // get the delegate from the native int. 1204b52ec49fee79b0488d6a9eaaa4ea5d74ce90905Xavier Ducrohet Shader_Delegate shaderDelegate = sManager.getDelegate(native_shader); 1214b52ec49fee79b0488d6a9eaaa4ea5d74ce90905Xavier Ducrohet if (shaderDelegate == null) { 1224b52ec49fee79b0488d6a9eaaa4ea5d74ce90905Xavier Ducrohet return; 1234b52ec49fee79b0488d6a9eaaa4ea5d74ce90905Xavier Ducrohet } 1244b52ec49fee79b0488d6a9eaaa4ea5d74ce90905Xavier Ducrohet 1254b52ec49fee79b0488d6a9eaaa4ea5d74ce90905Xavier Ducrohet shaderDelegate.mLocalMatrix = Matrix_Delegate.getDelegate(matrix_instance); 1264b52ec49fee79b0488d6a9eaaa4ea5d74ce90905Xavier Ducrohet } 1274b52ec49fee79b0488d6a9eaaa4ea5d74ce90905Xavier Ducrohet 1284b52ec49fee79b0488d6a9eaaa4ea5d74ce90905Xavier Ducrohet // ---- Private delegate/helper methods ---- 1294b52ec49fee79b0488d6a9eaaa4ea5d74ce90905Xavier Ducrohet 1304b52ec49fee79b0488d6a9eaaa4ea5d74ce90905Xavier Ducrohet protected java.awt.geom.AffineTransform getLocalMatrix() { 1314b52ec49fee79b0488d6a9eaaa4ea5d74ce90905Xavier Ducrohet if (mLocalMatrix != null) { 1324b52ec49fee79b0488d6a9eaaa4ea5d74ce90905Xavier Ducrohet return mLocalMatrix.getAffineTransform(); 1334b52ec49fee79b0488d6a9eaaa4ea5d74ce90905Xavier Ducrohet } 1344b52ec49fee79b0488d6a9eaaa4ea5d74ce90905Xavier Ducrohet 1354b52ec49fee79b0488d6a9eaaa4ea5d74ce90905Xavier Ducrohet return new java.awt.geom.AffineTransform(); 1364b52ec49fee79b0488d6a9eaaa4ea5d74ce90905Xavier Ducrohet } 1374b52ec49fee79b0488d6a9eaaa4ea5d74ce90905Xavier Ducrohet} 138