Cleanup Xfermode

We only support PorterDuff Xfermodes

Removes some unneeded JNI and finalizers()

Change-Id: I4988d6b05c6fd113a8ed8f7dcbf95abe0de95060
This commit is contained in:
John Reck
2016-09-15 10:13:10 -07:00
parent e94cc880c8
commit 5d31a293ad
11 changed files with 59 additions and 210 deletions

View File

@ -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);
}

View File

@ -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,

View File

@ -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);
}

View File

@ -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;
}