mirror of
https://github.com/zoriya/react-native-svg.git
synced 2026-06-08 17:15:04 +00:00
Remove path data usage in clipPath
Remove path data usage in clipPath. Use clipPath in SVG way
This commit is contained in:
@@ -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) {
|
||||
|
||||
Reference in New Issue
Block a user