Cleanup Xfermode
We only support PorterDuff Xfermodes Removes some unneeded JNI and finalizers() Change-Id: I4988d6b05c6fd113a8ed8f7dcbf95abe0de95060
This commit is contained in:
@ -21,23 +21,8 @@ package android.graphics;
|
||||
*/
|
||||
public class ComposeShader extends Shader {
|
||||
|
||||
private static final int TYPE_XFERMODE = 1;
|
||||
private static final int TYPE_PORTERDUFFMODE = 2;
|
||||
|
||||
/**
|
||||
* Type of the ComposeShader: can be either TYPE_XFERMODE or TYPE_PORTERDUFFMODE
|
||||
*/
|
||||
private int mType;
|
||||
|
||||
private Xfermode mXferMode;
|
||||
private PorterDuff.Mode mPorterDuffMode;
|
||||
|
||||
/**
|
||||
* Hold onto the shaders to avoid GC.
|
||||
*/
|
||||
@SuppressWarnings({"UnusedDeclaration"})
|
||||
private int mPorterDuffMode;
|
||||
private final Shader mShaderA;
|
||||
@SuppressWarnings({"UnusedDeclaration"})
|
||||
private final Shader mShaderB;
|
||||
|
||||
/** Create a new compose shader, given shaders A, B, and a combining mode.
|
||||
@ -49,12 +34,7 @@ public class ComposeShader extends Shader {
|
||||
is null, then SRC_OVER is assumed.
|
||||
*/
|
||||
public ComposeShader(Shader shaderA, Shader shaderB, Xfermode mode) {
|
||||
mType = TYPE_XFERMODE;
|
||||
mShaderA = shaderA;
|
||||
mShaderB = shaderB;
|
||||
mXferMode = mode;
|
||||
init(nativeCreate1(shaderA.getNativeInstance(), shaderB.getNativeInstance(),
|
||||
(mode != null) ? mode.native_instance : 0));
|
||||
this(shaderA, shaderB, mode.porterDuffMode);
|
||||
}
|
||||
|
||||
/** Create a new compose shader, given shaders A, B, and a combining PorterDuff mode.
|
||||
@ -65,12 +45,15 @@ public class ComposeShader extends Shader {
|
||||
@param mode The PorterDuff mode that combines the colors from the two shaders.
|
||||
*/
|
||||
public ComposeShader(Shader shaderA, Shader shaderB, PorterDuff.Mode mode) {
|
||||
mType = TYPE_PORTERDUFFMODE;
|
||||
this(shaderA, shaderB, mode.nativeInt);
|
||||
}
|
||||
|
||||
private ComposeShader(Shader shaderA, Shader shaderB, int nativeMode) {
|
||||
mShaderA = shaderA;
|
||||
mShaderB = shaderB;
|
||||
mPorterDuffMode = mode;
|
||||
init(nativeCreate2(shaderA.getNativeInstance(), shaderB.getNativeInstance(),
|
||||
mode.nativeInt));
|
||||
mPorterDuffMode = nativeMode;
|
||||
init(nativeCreate(shaderA.getNativeInstance(), shaderB.getNativeInstance(),
|
||||
nativeMode));
|
||||
}
|
||||
|
||||
/**
|
||||
@ -78,24 +61,12 @@ public class ComposeShader extends Shader {
|
||||
*/
|
||||
@Override
|
||||
protected Shader copy() {
|
||||
final ComposeShader copy;
|
||||
switch (mType) {
|
||||
case TYPE_XFERMODE:
|
||||
copy = new ComposeShader(mShaderA.copy(), mShaderB.copy(), mXferMode);
|
||||
break;
|
||||
case TYPE_PORTERDUFFMODE:
|
||||
copy = new ComposeShader(mShaderA.copy(), mShaderB.copy(), mPorterDuffMode);
|
||||
break;
|
||||
default:
|
||||
throw new IllegalArgumentException(
|
||||
"ComposeShader should be created with either Xfermode or PorterDuffMode");
|
||||
}
|
||||
final ComposeShader copy = new ComposeShader(
|
||||
mShaderA.copy(), mShaderB.copy(), mPorterDuffMode);
|
||||
copyLocalMatrix(copy);
|
||||
return copy;
|
||||
}
|
||||
|
||||
private static native long nativeCreate1(long native_shaderA, long native_shaderB,
|
||||
long native_mode);
|
||||
private static native long nativeCreate2(long native_shaderA, long native_shaderB,
|
||||
private static native long nativeCreate(long native_shaderA, long native_shaderB,
|
||||
int porterDuffMode);
|
||||
}
|
||||
|
@ -1096,10 +1096,11 @@ public class Paint {
|
||||
* @return xfermode
|
||||
*/
|
||||
public Xfermode setXfermode(Xfermode xfermode) {
|
||||
long xfermodeNative = 0;
|
||||
if (xfermode != null)
|
||||
xfermodeNative = xfermode.native_instance;
|
||||
nSetXfermode(mNativePaint, xfermodeNative);
|
||||
int newMode = xfermode != null ? xfermode.porterDuffMode : Xfermode.DEFAULT;
|
||||
int curMode = mXfermode != null ? mXfermode.porterDuffMode : Xfermode.DEFAULT;
|
||||
if (newMode != curMode) {
|
||||
nSetXfermode(mNativePaint, newMode);
|
||||
}
|
||||
mXfermode = xfermode;
|
||||
return xfermode;
|
||||
}
|
||||
@ -2694,8 +2695,7 @@ public class Paint {
|
||||
private static native long nSetShader(long paintPtr, long shader);
|
||||
private static native long nSetColorFilter(long paintPtr,
|
||||
long filter);
|
||||
private static native long nSetXfermode(long paintPtr,
|
||||
long xfermode);
|
||||
private static native void nSetXfermode(long paintPtr, int xfermode);
|
||||
private static native long nSetPathEffect(long paintPtr,
|
||||
long effect);
|
||||
private static native long nSetMaskFilter(long paintPtr,
|
||||
|
@ -17,20 +17,12 @@
|
||||
package android.graphics;
|
||||
|
||||
public class PorterDuffXfermode extends Xfermode {
|
||||
/**
|
||||
* @hide
|
||||
*/
|
||||
public final PorterDuff.Mode mode;
|
||||
|
||||
/**
|
||||
* Create an xfermode that uses the specified porter-duff mode.
|
||||
*
|
||||
* @param mode The porter-duff mode that is applied
|
||||
*/
|
||||
public PorterDuffXfermode(PorterDuff.Mode mode) {
|
||||
this.mode = mode;
|
||||
native_instance = nativeCreateXfermode(mode.nativeInt);
|
||||
porterDuffMode = mode.nativeInt;
|
||||
}
|
||||
|
||||
private static native long nativeCreateXfermode(int mode);
|
||||
}
|
||||
|
@ -29,17 +29,6 @@ package android.graphics;
|
||||
* objects drawn with that paint have the xfermode applied.
|
||||
*/
|
||||
public class Xfermode {
|
||||
|
||||
protected void finalize() throws Throwable {
|
||||
try {
|
||||
finalizer(native_instance);
|
||||
native_instance = 0;
|
||||
} finally {
|
||||
super.finalize();
|
||||
}
|
||||
}
|
||||
|
||||
private static native void finalizer(long native_instance);
|
||||
|
||||
long native_instance;
|
||||
static final int DEFAULT = PorterDuff.Mode.SRC_OVER.nativeInt;
|
||||
int porterDuffMode = DEFAULT;
|
||||
}
|
||||
|
Reference in New Issue
Block a user