fix stroke and fill order

This commit is contained in:
Horcrux
2016-04-20 23:54:54 +08:00
parent a136063f90
commit cea32755f5
@@ -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) {