Shader.java revision e3c526f4f603e83c5fa8b9e399506b085f5648b7
19066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/* 29066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Copyright (C) 2006 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 199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/** 209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Shader is the based class for objects that return horizontal spans of colors 219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * during drawing. A subclass of Shader is installed in a Paint calling 229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * paint.setShader(shader). After that any object (other than a bitmap) that is 239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * drawn with that paint will get its color(s) from the shader. 249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectpublic class Shader { 26d27977d1a91d5a6b3cc9fa7664ac7e835e7bd895Romain Guy /** 27d27977d1a91d5a6b3cc9fa7664ac7e835e7bd895Romain Guy * This is set by subclasses, but don't make it public. 28d27977d1a91d5a6b3cc9fa7664ac7e835e7bd895Romain Guy * 29d27977d1a91d5a6b3cc9fa7664ac7e835e7bd895Romain Guy * @hide 30d27977d1a91d5a6b3cc9fa7664ac7e835e7bd895Romain Guy */ 31d27977d1a91d5a6b3cc9fa7664ac7e835e7bd895Romain Guy public int native_instance; 3206f96e2652e4855b6520ad9dd70583677605b79aRomain Guy /** 3306f96e2652e4855b6520ad9dd70583677605b79aRomain Guy * @hide 3406f96e2652e4855b6520ad9dd70583677605b79aRomain Guy */ 3506f96e2652e4855b6520ad9dd70583677605b79aRomain Guy public int native_shader; 369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 37a9ebfa6bcce62d7fee69693fe3dee6027afd3f0eRomain Guy private Matrix mLocalMatrix; 38a9ebfa6bcce62d7fee69693fe3dee6027afd3f0eRomain Guy 399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public enum TileMode { 409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * replicate the edge color if the shader draws outside of its 429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * original bounds 439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project CLAMP (0), 459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * repeat the shader's image horizontally and vertically 479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project REPEAT (1), 499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * repeat the shader's image horizontally and vertically, alternating 519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * mirror images so that adjacent images always seam 529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project MIRROR (2); 549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project TileMode(int nativeInt) { 569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project this.nativeInt = nativeInt; 579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final int nativeInt; 599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Return true if the shader has a non-identity local matrix. 639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param localM If not null, it is set to the shader's local matrix. 649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return true if the shader has a non-identity local matrix 659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public boolean getLocalMatrix(Matrix localM) { 67a9ebfa6bcce62d7fee69693fe3dee6027afd3f0eRomain Guy if (mLocalMatrix != null) { 68a9ebfa6bcce62d7fee69693fe3dee6027afd3f0eRomain Guy localM.set(mLocalMatrix); 699454fe1080458812db76599dd02a8b91a2e1e8f4Romain Guy return !mLocalMatrix.isIdentity(); 70a9ebfa6bcce62d7fee69693fe3dee6027afd3f0eRomain Guy } 71a9ebfa6bcce62d7fee69693fe3dee6027afd3f0eRomain Guy return false; 729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Set the shader's local matrix. Passing null will reset the shader's 769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * matrix to identity 779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param localM The shader's new local matrix, or null to specify identity 789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void setLocalMatrix(Matrix localM) { 80a9ebfa6bcce62d7fee69693fe3dee6027afd3f0eRomain Guy mLocalMatrix = localM; 81ee916f14cbd1fe1422c063ce2ef7b185e2bc5c6fRomain Guy nativeSetLocalMatrix(native_instance, native_shader, 82ee916f14cbd1fe1422c063ce2ef7b185e2bc5c6fRomain Guy localM == null ? 0 : localM.native_instance); 839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project protected void finalize() throws Throwable { 86f9764a4f532561f6e2e985ff3b25112f1132ce44Romain Guy try { 87f9764a4f532561f6e2e985ff3b25112f1132ce44Romain Guy super.finalize(); 88f9764a4f532561f6e2e985ff3b25112f1132ce44Romain Guy } finally { 8906f96e2652e4855b6520ad9dd70583677605b79aRomain Guy nativeDestructor(native_instance, native_shader); 90f9764a4f532561f6e2e985ff3b25112f1132ce44Romain Guy } 919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 93e3c526f4f603e83c5fa8b9e399506b085f5648b7Fabrice Di Meglio /** 94e3c526f4f603e83c5fa8b9e399506b085f5648b7Fabrice Di Meglio * @hide 95e3c526f4f603e83c5fa8b9e399506b085f5648b7Fabrice Di Meglio */ 96e3c526f4f603e83c5fa8b9e399506b085f5648b7Fabrice Di Meglio protected Shader copy() { 97e3c526f4f603e83c5fa8b9e399506b085f5648b7Fabrice Di Meglio final Shader copy = new Shader(); 98e3c526f4f603e83c5fa8b9e399506b085f5648b7Fabrice Di Meglio copyLocalMatrix(copy); 99e3c526f4f603e83c5fa8b9e399506b085f5648b7Fabrice Di Meglio return copy; 100e3c526f4f603e83c5fa8b9e399506b085f5648b7Fabrice Di Meglio } 101e3c526f4f603e83c5fa8b9e399506b085f5648b7Fabrice Di Meglio 102e3c526f4f603e83c5fa8b9e399506b085f5648b7Fabrice Di Meglio /** 103e3c526f4f603e83c5fa8b9e399506b085f5648b7Fabrice Di Meglio * @hide 104e3c526f4f603e83c5fa8b9e399506b085f5648b7Fabrice Di Meglio */ 105e3c526f4f603e83c5fa8b9e399506b085f5648b7Fabrice Di Meglio protected void copyLocalMatrix(Shader dest) { 106e3c526f4f603e83c5fa8b9e399506b085f5648b7Fabrice Di Meglio if (mLocalMatrix != null) { 107e3c526f4f603e83c5fa8b9e399506b085f5648b7Fabrice Di Meglio final Matrix lm = new Matrix(); 108e3c526f4f603e83c5fa8b9e399506b085f5648b7Fabrice Di Meglio getLocalMatrix(lm); 109e3c526f4f603e83c5fa8b9e399506b085f5648b7Fabrice Di Meglio dest.setLocalMatrix(lm); 110e3c526f4f603e83c5fa8b9e399506b085f5648b7Fabrice Di Meglio } else { 111e3c526f4f603e83c5fa8b9e399506b085f5648b7Fabrice Di Meglio dest.setLocalMatrix(null); 112e3c526f4f603e83c5fa8b9e399506b085f5648b7Fabrice Di Meglio } 113e3c526f4f603e83c5fa8b9e399506b085f5648b7Fabrice Di Meglio } 114e3c526f4f603e83c5fa8b9e399506b085f5648b7Fabrice Di Meglio 11506f96e2652e4855b6520ad9dd70583677605b79aRomain Guy private static native void nativeDestructor(int native_shader, int native_skiaShader); 1169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private static native void nativeSetLocalMatrix(int native_shader, 11706f96e2652e4855b6520ad9dd70583677605b79aRomain Guy int native_skiaShader, int matrix_instance); 1189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 119