Shader.java revision 06f96e2652e4855b6520ad9dd70583677605b79a
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 379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public enum TileMode { 389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * replicate the edge color if the shader draws outside of its 409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * original bounds 419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project CLAMP (0), 439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * repeat the shader's image horizontally and vertically 459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project REPEAT (1), 479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * repeat the shader's image horizontally and vertically, alternating 499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * mirror images so that adjacent images always seam 509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project MIRROR (2); 529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project TileMode(int nativeInt) { 549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project this.nativeInt = nativeInt; 559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final int nativeInt; 579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Return true if the shader has a non-identity local matrix. 619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param localM If not null, it is set to the shader's local matrix. 629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return true if the shader has a non-identity local matrix 639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public boolean getLocalMatrix(Matrix localM) { 659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return nativeGetLocalMatrix(native_instance, localM.native_instance); 669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Set the shader's local matrix. Passing null will reset the shader's 709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * matrix to identity 719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param localM The shader's new local matrix, or null to specify identity 729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void setLocalMatrix(Matrix localM) { 7406f96e2652e4855b6520ad9dd70583677605b79aRomain Guy nativeSetLocalMatrix(native_instance, native_shader, localM.native_instance); 759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project protected void finalize() throws Throwable { 78f9764a4f532561f6e2e985ff3b25112f1132ce44Romain Guy try { 79f9764a4f532561f6e2e985ff3b25112f1132ce44Romain Guy super.finalize(); 80f9764a4f532561f6e2e985ff3b25112f1132ce44Romain Guy } finally { 8106f96e2652e4855b6520ad9dd70583677605b79aRomain Guy nativeDestructor(native_instance, native_shader); 82f9764a4f532561f6e2e985ff3b25112f1132ce44Romain Guy } 839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 8506f96e2652e4855b6520ad9dd70583677605b79aRomain Guy private static native void nativeDestructor(int native_shader, int native_skiaShader); 869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private static native boolean nativeGetLocalMatrix(int native_shader, 8706f96e2652e4855b6520ad9dd70583677605b79aRomain Guy int matrix_instance); 889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private static native void nativeSetLocalMatrix(int native_shader, 8906f96e2652e4855b6520ad9dd70583677605b79aRomain Guy int native_skiaShader, int matrix_instance); 909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 91