Remove path data usage in clipPath

Remove path data usage in clipPath.
Use clipPath in SVG way
This commit is contained in:
Horcrux
2017-01-07 23:17:10 +08:00
parent 609226d732
commit 152e839126
9 changed files with 67 additions and 84 deletions
@@ -45,12 +45,11 @@ public class SvgViewShadowNode extends LayoutShadowNode implements TextureView.S
return mTagToShadowNode.get(tag);
}
private boolean mHasPendingUpdates;
private boolean mResponsible = false;
private static final Map<String, VirtualNode> mDefinedClipPaths = new HashMap<>();
private static final Map<String, VirtualNode> mDefinedTemplates = new HashMap<>();
private static final Map<String, PropHelper.RNSVGBrush> mDefinedBrushes = new HashMap<>();
private final Map<String, VirtualNode> mDefinedClipPaths = new HashMap<>();
private final Map<String, VirtualNode> mDefinedTemplates = new HashMap<>();
private final Map<String, PropHelper.RNSVGBrush> mDefinedBrushes = new HashMap<>();
@Override
public boolean isVirtual() {
@@ -17,8 +17,10 @@ import android.graphics.Point;
import android.graphics.Rect;
import android.graphics.Region;
import com.facebook.common.logging.FLog;
import com.facebook.react.bridge.JSApplicationIllegalArgumentException;
import com.facebook.react.bridge.ReadableArray;
import com.facebook.react.common.ReactConstants;
import com.facebook.react.uimanager.DisplayMetricsHolder;
import com.facebook.react.uimanager.LayoutShadowNode;
import com.facebook.react.uimanager.ReactShadowNode;
@@ -35,8 +37,7 @@ public abstract class VirtualNode extends LayoutShadowNode {
protected float mOpacity = 1f;
protected Matrix mMatrix = new Matrix();
protected @Nullable Path mClipPath;
protected @Nullable String mClipPathRef;
protected @Nullable String mClipPath;
private static final int PATH_TYPE_CLOSE = 1;
private static final int PATH_TYPE_CURVETO = 3;
@@ -47,10 +48,7 @@ public abstract class VirtualNode extends LayoutShadowNode {
private static final int CLIP_RULE_NONZERO = 1;
protected final float mScale;
private float[] mClipData;
private int mClipRule;
private boolean mClipRuleSet;
private boolean mClipDataSet;
protected boolean mResponsible;
protected int mCanvasX;
protected int mCanvasY;
@@ -96,14 +94,6 @@ public abstract class VirtualNode extends LayoutShadowNode {
canvas.restoreToCount(count);
}
@ReactProp(name = "clipPath")
public void setClipPath(@Nullable ReadableArray clipPath) {
mClipData = PropHelper.toFloatArray(clipPath);
mClipDataSet = true;
setupClip();
markUpdated();
}
@ReactProp(name = "name")
public void setName(String name) {
mName = name;
@@ -111,17 +101,15 @@ public abstract class VirtualNode extends LayoutShadowNode {
}
@ReactProp(name = "clipPathRef")
public void setClipPathRef(String clipPathRef) {
mClipPathRef = clipPathRef;
@ReactProp(name = "clipPath")
public void setClipPath(String clipPath) {
mClipPath = clipPath;
markUpdated();
}
@ReactProp(name = "clipRule", defaultInt = CLIP_RULE_NONZERO)
public void setClipRule(int clipRule) {
public void clipRule(int clipRule) {
mClipRule = clipRule;
mClipRuleSet = true;
setupClip();
markUpdated();
}
@@ -138,7 +126,7 @@ public abstract class VirtualNode extends LayoutShadowNode {
if (matrixSize == 6) {
setupMatrix();
} else if (matrixSize != -1) {
throw new JSApplicationIllegalArgumentException("Transform matrices must be of size 6");
FLog.w(ReactConstants.TAG, "RNSVG: Transform matrices must be of size 6");
}
} else {
mMatrix = null;
@@ -153,24 +141,6 @@ public abstract class VirtualNode extends LayoutShadowNode {
markUpdated();
}
private void setupClip() {
if (mClipDataSet && mClipRuleSet) {
mClipPath = new Path();
switch (mClipRule) {
case CLIP_RULE_EVENODD:
mClipPath.setFillType(Path.FillType.EVEN_ODD);
break;
case CLIP_RULE_NONZERO:
break;
default:
throw new JSApplicationIllegalArgumentException(
"clipRule " + mClipRule + " unrecognized");
}
createPath(mClipData, mClipPath);
}
}
protected void setupMatrix() {
sRawMatrix[0] = sMatrixData[0];
sRawMatrix[1] = sMatrixData[2];
@@ -226,13 +196,28 @@ public abstract class VirtualNode extends LayoutShadowNode {
}
protected @Nullable Path getClipPath(Canvas canvas, Paint paint) {
Path clip = mClipPath;
if (clip == null && mClipPathRef != null) {
VirtualNode node = getSvgShadowNode().getDefinedClipPath(mClipPathRef);
clip = node.getPath(canvas, paint);
if (mClipPath != null) {
VirtualNode node = getSvgShadowNode().getDefinedClipPath(mClipPath);
if (node != null) {
Path clipPath = node.getPath(canvas, paint);
switch (mClipRule) {
case CLIP_RULE_EVENODD:
clipPath.setFillType(Path.FillType.EVEN_ODD);
break;
case CLIP_RULE_NONZERO:
break;
default:
FLog.w(ReactConstants.TAG, "RNSVG: clipRule: " + mClipRule + " unrecognized");
}
return clipPath;
} else {
FLog.w(ReactConstants.TAG, "RNSVG: Undefined clipPath: " + mClipPath);
}
}
return clip;
return null;
}
protected void clip(Canvas canvas, Paint paint) {