mirror of
https://github.com/zoriya/react-native-svg.git
synced 2026-06-09 17:30:58 +00:00
fix stroke and fill order
This commit is contained in:
@@ -11,7 +11,6 @@ package com.horcrux.svg;
|
|||||||
|
|
||||||
import javax.annotation.Nullable;
|
import javax.annotation.Nullable;
|
||||||
|
|
||||||
import android.content.Context;
|
|
||||||
import android.graphics.Canvas;
|
import android.graphics.Canvas;
|
||||||
import android.graphics.Paint;
|
import android.graphics.Paint;
|
||||||
import android.graphics.Path;
|
import android.graphics.Path;
|
||||||
@@ -31,8 +30,6 @@ import com.facebook.react.bridge.ReadableArray;
|
|||||||
import com.facebook.react.common.ReactConstants;
|
import com.facebook.react.common.ReactConstants;
|
||||||
import com.facebook.react.uimanager.annotations.ReactProp;
|
import com.facebook.react.uimanager.annotations.ReactProp;
|
||||||
|
|
||||||
import java.util.Arrays;
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Shadow node for virtual RNSVGPath view
|
* Shadow node for virtual RNSVGPath view
|
||||||
*/
|
*/
|
||||||
@@ -46,6 +43,9 @@ public class RNSVGPathShadowNode extends RNSVGVirtualNode {
|
|||||||
private static final int JOIN_MITER = 0;
|
private static final int JOIN_MITER = 0;
|
||||||
private static final int JOIN_ROUND = 1;
|
private static final int JOIN_ROUND = 1;
|
||||||
|
|
||||||
|
private static final int RULE_EVENODD = 0;
|
||||||
|
private static final int RULE_NONZERO = 1;
|
||||||
|
|
||||||
private static final int PATH_TYPE_ARC = 4;
|
private static final int PATH_TYPE_ARC = 4;
|
||||||
private static final int PATH_TYPE_CLOSE = 1;
|
private static final int PATH_TYPE_CLOSE = 1;
|
||||||
private static final int PATH_TYPE_CURVETO = 3;
|
private static final int PATH_TYPE_CURVETO = 3;
|
||||||
@@ -59,6 +59,7 @@ public class RNSVGPathShadowNode extends RNSVGVirtualNode {
|
|||||||
private float mStrokeWidth = 1;
|
private float mStrokeWidth = 1;
|
||||||
private int mStrokeLinecap = CAP_ROUND;
|
private int mStrokeLinecap = CAP_ROUND;
|
||||||
private int mStrokeLinejoin = JOIN_ROUND;
|
private int mStrokeLinejoin = JOIN_ROUND;
|
||||||
|
private int mFillRule = RULE_NONZERO;
|
||||||
|
|
||||||
private Point mPaint;
|
private Point mPaint;
|
||||||
|
|
||||||
@@ -87,6 +88,13 @@ public class RNSVGPathShadowNode extends RNSVGVirtualNode {
|
|||||||
markUpdated();
|
markUpdated();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ReactProp(name = "fillRule", defaultInt = RULE_NONZERO)
|
||||||
|
public void setFillRule(int fillRule) {
|
||||||
|
mFillRule = fillRule;
|
||||||
|
markUpdated();
|
||||||
|
}
|
||||||
|
|
||||||
@ReactProp(name = "strokeWidth", defaultFloat = 1f)
|
@ReactProp(name = "strokeWidth", defaultFloat = 1f)
|
||||||
public void setStrokeWidth(float strokeWidth) {
|
public void setStrokeWidth(float strokeWidth) {
|
||||||
mStrokeWidth = strokeWidth;
|
mStrokeWidth = strokeWidth;
|
||||||
@@ -114,10 +122,10 @@ public class RNSVGPathShadowNode extends RNSVGVirtualNode {
|
|||||||
throw new JSApplicationIllegalArgumentException(
|
throw new JSApplicationIllegalArgumentException(
|
||||||
"Paths should have a valid path (d) prop");
|
"Paths should have a valid path (d) prop");
|
||||||
}
|
}
|
||||||
if (setupStrokePaint(paint, opacity)) {
|
if (setupFillPaint(paint, opacity)) {
|
||||||
canvas.drawPath(mPath, paint);
|
canvas.drawPath(mPath, paint);
|
||||||
}
|
}
|
||||||
if (setupFillPaint(paint, opacity)) {
|
if (setupStrokePaint(paint, opacity)) {
|
||||||
canvas.drawPath(mPath, paint);
|
canvas.drawPath(mPath, paint);
|
||||||
}
|
}
|
||||||
restoreCanvas(canvas);
|
restoreCanvas(canvas);
|
||||||
@@ -164,6 +172,7 @@ public class RNSVGPathShadowNode extends RNSVGVirtualNode {
|
|||||||
throw new JSApplicationIllegalArgumentException(
|
throw new JSApplicationIllegalArgumentException(
|
||||||
"strokeLinejoin " + mStrokeLinejoin + " unrecognized");
|
"strokeLinejoin " + mStrokeLinejoin + " unrecognized");
|
||||||
}
|
}
|
||||||
|
|
||||||
paint.setStrokeWidth(mStrokeWidth * mScale);
|
paint.setStrokeWidth(mStrokeWidth * mScale);
|
||||||
paint.setARGB(
|
paint.setARGB(
|
||||||
(int) (mStrokeColor.length > 3 ? mStrokeColor[3] * opacity * 255 : opacity * 255),
|
(int) (mStrokeColor.length > 3 ? mStrokeColor[3] * opacity * 255 : opacity * 255),
|
||||||
@@ -174,6 +183,7 @@ public class RNSVGPathShadowNode extends RNSVGVirtualNode {
|
|||||||
// TODO(6352067): Support dashes
|
// TODO(6352067): Support dashes
|
||||||
FLog.w(ReactConstants.TAG, "RNSVG: Dashes are not supported yet!");
|
FLog.w(ReactConstants.TAG, "RNSVG: Dashes are not supported yet!");
|
||||||
}
|
}
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -185,7 +195,11 @@ public class RNSVGPathShadowNode extends RNSVGVirtualNode {
|
|||||||
for (int i = 0; i < stopsCount; i++) {
|
for (int i = 0; i < stopsCount; i++) {
|
||||||
int half = stopsCount / 2;
|
int half = stopsCount / 2;
|
||||||
|
|
||||||
|
// stops keep in a order like this
|
||||||
|
// 0 1 2 3 4 9 8 7 6 5
|
||||||
|
|
||||||
stops[i] = value[startStops + (i < half ? i : (half + (stopsCount - i) - 1))];
|
stops[i] = value[startStops + (i < half ? i : (half + (stopsCount - i) - 1))];
|
||||||
|
|
||||||
stopsColors[i] = Color.argb(
|
stopsColors[i] = Color.argb(
|
||||||
(int) (value[startColorsPosition + i * 4 + 3] * 255),
|
(int) (value[startColorsPosition + i * 4 + 3] * 255),
|
||||||
(int) (value[startColorsPosition + i * 4] * 255),
|
(int) (value[startColorsPosition + i * 4] * 255),
|
||||||
@@ -239,6 +253,9 @@ public class RNSVGPathShadowNode extends RNSVGVirtualNode {
|
|||||||
stops = new float[stopsCount];
|
stops = new float[stopsCount];
|
||||||
parseGradientStops(mFillColor, stopsCount, stops, stopsColors, 7);
|
parseGradientStops(mFillColor, stopsCount, stops, stopsColors, 7);
|
||||||
|
|
||||||
|
float focusX = mFillColor[1];
|
||||||
|
float focusY = mFillColor[2];
|
||||||
|
|
||||||
float radius = mFillColor[3];
|
float radius = mFillColor[3];
|
||||||
float radiusRatio = mFillColor[4] / radius;
|
float radiusRatio = mFillColor[4] / radius;
|
||||||
Shader radialGradient = new RadialGradient(
|
Shader radialGradient = new RadialGradient(
|
||||||
@@ -286,6 +303,18 @@ public class RNSVGPathShadowNode extends RNSVGVirtualNode {
|
|||||||
*/
|
*/
|
||||||
private Path createPath(float[] data) {
|
private Path createPath(float[] data) {
|
||||||
Path path = new Path();
|
Path path = new Path();
|
||||||
|
switch (mFillRule) {
|
||||||
|
case RULE_EVENODD:
|
||||||
|
path.setFillType(Path.FillType.EVEN_ODD);
|
||||||
|
break;
|
||||||
|
case RULE_NONZERO:
|
||||||
|
//path.setFillType(Path.FillType.INVERSE_WINDING);
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
throw new JSApplicationIllegalArgumentException(
|
||||||
|
"fillRule " + mFillRule + " unrecognized");
|
||||||
|
}
|
||||||
|
|
||||||
path.moveTo(0, 0);
|
path.moveTo(0, 0);
|
||||||
int i = 0;
|
int i = 0;
|
||||||
while (i < data.length) {
|
while (i < data.length) {
|
||||||
|
|||||||
Reference in New Issue
Block a user