variants Updated various framework Views to have equivalent BlendMode APIs to replace the deprecated PorterDuff equivalents. Updated InspectableProperty annotations to refer to the same xml attributes as the original tintmode APIs Bug: 126726419 Test: Added CTS tests to verify new BlendMode APIs Change-Id: Id9ab36d3d4d29f351250723e9d13d49bc6062c83 Merged-In: Id9ab36d3d4d29f351250723e9d13d49bc6062c83
109 lines
4.3 KiB
Java
109 lines
4.3 KiB
Java
/*
|
|
* Copyright (C) 2007 The Android Open Source Project
|
|
*
|
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
* you may not use this file except in compliance with the License.
|
|
* You may obtain a copy of the License at
|
|
*
|
|
* http://www.apache.org/licenses/LICENSE-2.0
|
|
*
|
|
* Unless required by applicable law or agreed to in writing, software
|
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
* See the License for the specific language governing permissions and
|
|
* limitations under the License.
|
|
*/
|
|
|
|
package android.graphics;
|
|
|
|
|
|
import android.annotation.NonNull;
|
|
|
|
/** A subclass of shader that returns the composition of two other shaders, combined by
|
|
an {@link android.graphics.Xfermode} subclass.
|
|
*/
|
|
public class ComposeShader extends Shader {
|
|
|
|
Shader mShaderA;
|
|
private long mNativeInstanceShaderA;
|
|
Shader mShaderB;
|
|
private long mNativeInstanceShaderB;
|
|
private int mPorterDuffMode;
|
|
|
|
/**
|
|
* Create a new compose shader, given shaders A, B, and a combining mode.
|
|
* When the mode is applied, it will be given the result from shader A as its
|
|
* "dst", and the result from shader B as its "src".
|
|
*
|
|
* @param shaderA The colors from this shader are seen as the "dst" by the mode
|
|
* @param shaderB The colors from this shader are seen as the "src" by the mode
|
|
* @param mode The mode that combines the colors from the two shaders. If mode
|
|
* is null, then SRC_OVER is assumed.
|
|
*/
|
|
@Deprecated
|
|
public ComposeShader(@NonNull Shader shaderA, @NonNull Shader shaderB, @NonNull Xfermode mode) {
|
|
this(shaderA, shaderB, mode.porterDuffMode);
|
|
}
|
|
|
|
/**
|
|
* Create a new compose shader, given shaders A, B, and a combining PorterDuff mode.
|
|
* When the mode is applied, it will be given the result from shader A as its
|
|
* "dst", and the result from shader B as its "src".
|
|
*
|
|
* @param shaderA The colors from this shader are seen as the "dst" by the mode
|
|
* @param shaderB The colors from this shader are seen as the "src" by the mode
|
|
* @param mode The PorterDuff mode that combines the colors from the two shaders.
|
|
*
|
|
*/
|
|
public ComposeShader(@NonNull Shader shaderA, @NonNull Shader shaderB,
|
|
@NonNull PorterDuff.Mode mode) {
|
|
this(shaderA, shaderB, mode.nativeInt);
|
|
}
|
|
|
|
/**
|
|
* Create a new compose shader, given shaders A, B, and a combining PorterDuff mode.
|
|
* When the mode is applied, it will be given the result from shader A as its
|
|
* "dst", and the result from shader B as its "src".
|
|
*
|
|
* @param shaderA The colors from this shader are seen as the "dst" by the mode
|
|
* @param shaderB The colors from this shader are seen as the "src" by the mode
|
|
* @param blendMode The blend mode that combines the colors from the two shaders.
|
|
*/
|
|
public ComposeShader(@NonNull Shader shaderA, @NonNull Shader shaderB,
|
|
@NonNull BlendMode blendMode) {
|
|
this(shaderA, shaderB, blendMode.getXfermode().porterDuffMode);
|
|
}
|
|
|
|
private ComposeShader(Shader shaderA, Shader shaderB, int nativeMode) {
|
|
if (shaderA == null || shaderB == null) {
|
|
throw new IllegalArgumentException("Shader parameters must not be null");
|
|
}
|
|
|
|
mShaderA = shaderA;
|
|
mShaderB = shaderB;
|
|
mPorterDuffMode = nativeMode;
|
|
}
|
|
|
|
@Override
|
|
long createNativeInstance(long nativeMatrix) {
|
|
mNativeInstanceShaderA = mShaderA.getNativeInstance();
|
|
mNativeInstanceShaderB = mShaderB.getNativeInstance();
|
|
return nativeCreate(nativeMatrix,
|
|
mShaderA.getNativeInstance(), mShaderB.getNativeInstance(), mPorterDuffMode);
|
|
}
|
|
|
|
/** @hide */
|
|
@Override
|
|
protected void verifyNativeInstance() {
|
|
if (mShaderA.getNativeInstance() != mNativeInstanceShaderA
|
|
|| mShaderB.getNativeInstance() != mNativeInstanceShaderB) {
|
|
// Child shader native instance has been updated,
|
|
// so our cached native instance is no longer valid - discard it
|
|
discardNativeInstance();
|
|
}
|
|
}
|
|
|
|
private static native long nativeCreate(long nativeMatrix,
|
|
long nativeShaderA, long nativeShaderB, int porterDuffMode);
|
|
}
|