mirror of
https://github.com/zoriya/react-native-svg.git
synced 2026-06-03 07:06:04 +00:00
add clipping js code
This commit is contained in:
@@ -0,0 +1,22 @@
|
|||||||
|
import React, {
|
||||||
|
Component,
|
||||||
|
PropTypes,
|
||||||
|
Children
|
||||||
|
} from 'react-native';
|
||||||
|
import {NativeGroup} from './G';
|
||||||
|
|
||||||
|
class ClipPath extends Component{
|
||||||
|
static displayName = 'ClipPath';
|
||||||
|
static propTypes = {
|
||||||
|
id: PropTypes.string.isRequired
|
||||||
|
};
|
||||||
|
|
||||||
|
render() {
|
||||||
|
// TODO: 合并children路径
|
||||||
|
// TODO: clip-rule
|
||||||
|
return <NativeGroup />;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
export default ClipPath;
|
||||||
|
|
||||||
+9
-1
@@ -19,7 +19,13 @@ const transformProps = {
|
|||||||
originX: null,
|
originX: null,
|
||||||
originY: null
|
originY: null
|
||||||
};
|
};
|
||||||
import extractProps from '../lib/extractProps';
|
|
||||||
|
const clipProps = {
|
||||||
|
clipPath: null,
|
||||||
|
clipRule: null
|
||||||
|
};
|
||||||
|
|
||||||
|
import extractProps from '../lib/extract/extractProps';
|
||||||
|
|
||||||
class G extends Component{
|
class G extends Component{
|
||||||
static displayName = 'G';
|
static displayName = 'G';
|
||||||
@@ -28,6 +34,7 @@ class G extends Component{
|
|||||||
return Children.map(this.props.children, child => cloneElement(child, {
|
return Children.map(this.props.children, child => cloneElement(child, {
|
||||||
...this.props,
|
...this.props,
|
||||||
...transformProps,
|
...transformProps,
|
||||||
|
...clipProps,
|
||||||
...child.props,
|
...child.props,
|
||||||
id: null
|
id: null
|
||||||
}));
|
}));
|
||||||
@@ -54,6 +61,7 @@ class G extends Component{
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
var NativeGroup = createReactNativeComponentClass({
|
var NativeGroup = createReactNativeComponentClass({
|
||||||
validAttributes: GroupAttributes,
|
validAttributes: GroupAttributes,
|
||||||
uiViewClassName: 'RNSVGGroup'
|
uiViewClassName: 'RNSVGGroup'
|
||||||
|
|||||||
@@ -4,7 +4,7 @@ import React, {
|
|||||||
Children
|
Children
|
||||||
} from 'react-native';
|
} from 'react-native';
|
||||||
import {NativeGroup} from './G';
|
import {NativeGroup} from './G';
|
||||||
import {set, remove} from '../lib/extractFill';
|
import {set, remove} from '../lib/extract/extractFill';
|
||||||
import percentFactory from '../lib/percentFactory';
|
import percentFactory from '../lib/percentFactory';
|
||||||
import percentToFloat from '../lib/percentToFloat';
|
import percentToFloat from '../lib/percentToFloat';
|
||||||
import Stop from './Stop';
|
import Stop from './Stop';
|
||||||
|
|||||||
@@ -7,7 +7,7 @@ import React, {
|
|||||||
import stopsOpacity from '../lib/stopsOpacity';
|
import stopsOpacity from '../lib/stopsOpacity';
|
||||||
import numberProp from '../lib/numberProp';
|
import numberProp from '../lib/numberProp';
|
||||||
import Gradient from './Gradient';
|
import Gradient from './Gradient';
|
||||||
import {LINEAR_GRADIENT} from '../lib/extractBrush';
|
import {LINEAR_GRADIENT} from '../lib/extract/extractBrush';
|
||||||
import {insertColorStopsIntoArray} from '../lib/insertProcessor';
|
import {insertColorStopsIntoArray} from '../lib/insertProcessor';
|
||||||
|
|
||||||
function LinearGradientGenerator(stops, x1, y1, x2, y2) {
|
function LinearGradientGenerator(stops, x1, y1, x2, y2) {
|
||||||
@@ -73,4 +73,4 @@ class LinearGradient extends Gradient{
|
|||||||
}
|
}
|
||||||
|
|
||||||
export default LinearGradient;
|
export default LinearGradient;
|
||||||
|
export {LinearGradientGenerator};
|
||||||
|
|||||||
+1
-1
@@ -8,7 +8,7 @@ import React, {
|
|||||||
import Defs from './Defs';
|
import Defs from './Defs';
|
||||||
import createReactNativeComponentClass from 'react-native/Libraries/ReactNative/createReactNativeComponentClass';
|
import createReactNativeComponentClass from 'react-native/Libraries/ReactNative/createReactNativeComponentClass';
|
||||||
import calculateBoundingBox from '../lib/calculateBoundingBox';
|
import calculateBoundingBox from '../lib/calculateBoundingBox';
|
||||||
import extractProps from '../lib/extractProps';
|
import extractProps from '../lib/extract/extractProps';
|
||||||
import SerializablePath from 'react-native/Libraries/ART/ARTSerializablePath';
|
import SerializablePath from 'react-native/Libraries/ART/ARTSerializablePath';
|
||||||
import {PathAttributes} from '../lib/attributes';
|
import {PathAttributes} from '../lib/attributes';
|
||||||
|
|
||||||
|
|||||||
@@ -6,7 +6,7 @@ import React, {
|
|||||||
import stopsOpacity from '../lib/stopsOpacity';
|
import stopsOpacity from '../lib/stopsOpacity';
|
||||||
import numberProp from '../lib/numberProp';
|
import numberProp from '../lib/numberProp';
|
||||||
import Gradient from './Gradient';
|
import Gradient from './Gradient';
|
||||||
import {RADIAL_GRADIENT} from '../lib/extractBrush';
|
import {RADIAL_GRADIENT} from '../lib/extract/extractBrush';
|
||||||
import {insertDoubleColorStopsIntoArray} from '../lib/insertProcessor';
|
import {insertDoubleColorStopsIntoArray} from '../lib/insertProcessor';
|
||||||
|
|
||||||
|
|
||||||
@@ -84,4 +84,4 @@ class RadialGradient extends Gradient{
|
|||||||
}
|
}
|
||||||
|
|
||||||
export default RadialGradient;
|
export default RadialGradient;
|
||||||
|
export {RadialGradientGenerator};
|
||||||
|
|||||||
+1
-1
@@ -6,7 +6,7 @@ import React, {
|
|||||||
View,
|
View,
|
||||||
requireNativeComponent
|
requireNativeComponent
|
||||||
} from 'react-native';
|
} from 'react-native';
|
||||||
import extractViewbox from '../lib/extractViewbox';
|
import extractViewbox from '../lib/extract/extractViewbox';
|
||||||
import ViewBox from './ViewBox';
|
import ViewBox from './ViewBox';
|
||||||
import _ from 'lodash';
|
import _ from 'lodash';
|
||||||
|
|
||||||
|
|||||||
+1
-1
@@ -5,7 +5,7 @@ import React, {
|
|||||||
|
|
||||||
import ViewBox from './ViewBox';
|
import ViewBox from './ViewBox';
|
||||||
import Defs from './Defs';
|
import Defs from './Defs';
|
||||||
import extractViewbox from '../lib/extractViewbox';
|
import extractViewbox from '../lib/extract/extractViewbox';
|
||||||
class SymbolElement extends Component{
|
class SymbolElement extends Component{
|
||||||
static displayName = 'Symbol';
|
static displayName = 'Symbol';
|
||||||
static propType = {
|
static propType = {
|
||||||
|
|||||||
+2
-2
@@ -3,8 +3,8 @@ import React, {
|
|||||||
} from 'react-native';
|
} from 'react-native';
|
||||||
import Defs from './Defs';
|
import Defs from './Defs';
|
||||||
import createReactNativeComponentClass from 'react-native/Libraries/ReactNative/createReactNativeComponentClass';
|
import createReactNativeComponentClass from 'react-native/Libraries/ReactNative/createReactNativeComponentClass';
|
||||||
import extractProps from '../lib/extractProps';
|
import extractProps from '../lib/extract/extractProps';
|
||||||
import extractText from '../lib/extractText';
|
import extractText from '../lib/extract/extractText';
|
||||||
import {TextAttributes} from '../lib/attributes';
|
import {TextAttributes} from '../lib/attributes';
|
||||||
import numberProp from '../lib/numberProp';
|
import numberProp from '../lib/numberProp';
|
||||||
|
|
||||||
|
|||||||
+1
-1
@@ -4,7 +4,7 @@ import React, {
|
|||||||
} from 'react-native';
|
} from 'react-native';
|
||||||
|
|
||||||
import G from './G';
|
import G from './G';
|
||||||
import extractViewbox from '../lib/extractViewbox';
|
import extractViewbox from '../lib/extract/extractViewbox';
|
||||||
class ViewBox extends Component{
|
class ViewBox extends Component{
|
||||||
static displayName = 'ViewBox';
|
static displayName = 'ViewBox';
|
||||||
static propType = {
|
static propType = {
|
||||||
|
|||||||
+5
-4
@@ -42,13 +42,14 @@ var NodeAttributes = {
|
|||||||
transform: {
|
transform: {
|
||||||
diff: arrayDiffer
|
diff: arrayDiffer
|
||||||
},
|
},
|
||||||
opacity: true
|
opacity: true,
|
||||||
|
clipPath: {
|
||||||
|
diff: arrayDiffer
|
||||||
|
},
|
||||||
|
clipRule: true
|
||||||
};
|
};
|
||||||
|
|
||||||
var GroupAttributes = Object.assign({
|
var GroupAttributes = Object.assign({
|
||||||
clipping: {
|
|
||||||
diff: arrayDiffer
|
|
||||||
}
|
|
||||||
}, NodeAttributes);
|
}, NodeAttributes);
|
||||||
|
|
||||||
var RenderableAttributes = Object.assign({
|
var RenderableAttributes = Object.assign({
|
||||||
|
|||||||
@@ -0,0 +1,18 @@
|
|||||||
|
import SerializablePath from 'react-native/Libraries/ART/ARTSerializablePath';
|
||||||
|
|
||||||
|
const clipRules = {
|
||||||
|
evenodd: 0,
|
||||||
|
nonzero: 1
|
||||||
|
};
|
||||||
|
|
||||||
|
export default function (props) {
|
||||||
|
let {clipPath, clipRule} = props;
|
||||||
|
let clippingProps = {};
|
||||||
|
|
||||||
|
if (clipPath) {
|
||||||
|
clippingProps.clipPath = new SerializablePath(clipPath).toJSON();
|
||||||
|
clippingProps.clipRule = clipRules[clipRule] === 0 ? 0 : 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
return clippingProps;
|
||||||
|
}
|
||||||
@@ -1,19 +1,13 @@
|
|||||||
import rgba from './rgba';
|
import rgba from '../rgba';
|
||||||
|
import {LinearGradientGenerator} from '../../elements/LinearGradient';
|
||||||
|
import {RadialGradientGenerator} from '../../elements/RadialGradient';
|
||||||
import extractBrush from './extractBrush';
|
import extractBrush from './extractBrush';
|
||||||
import {
|
|
||||||
ART
|
|
||||||
} from 'react-native';
|
|
||||||
|
|
||||||
let {
|
|
||||||
LinearGradient,
|
|
||||||
RadialGradient
|
|
||||||
} = ART;
|
|
||||||
|
|
||||||
let fillPatterns = {};
|
let fillPatterns = {};
|
||||||
let fillReg = /^url\(#(\w+?)\)$/;
|
let fillReg = /^url\(#(\w+?)\)$/;
|
||||||
|
|
||||||
function isGradient(obj) {
|
function isGradient(obj) {
|
||||||
return obj instanceof LinearGradient || obj instanceof RadialGradient;
|
return obj instanceof LinearGradientGenerator || obj instanceof RadialGradientGenerator;
|
||||||
}
|
}
|
||||||
|
|
||||||
function set(id, pattern) {
|
function set(id, pattern) {
|
||||||
@@ -1,6 +1,8 @@
|
|||||||
import extractFill from './extractFill';
|
import extractFill from './extractFill';
|
||||||
import extractStroke from './extractStroke';
|
import extractStroke from './extractStroke';
|
||||||
import extractTransform from './extractTransform';
|
import extractTransform from './extractTransform';
|
||||||
|
import extractClipping from './extractClipping';
|
||||||
|
import _ from 'lodash';
|
||||||
|
|
||||||
export default function(props, options = {stroke: true, join: true, transform: true, fill: true}) {
|
export default function(props, options = {stroke: true, join: true, transform: true, fill: true}) {
|
||||||
if (props.visible === false) {
|
if (props.visible === false) {
|
||||||
@@ -12,12 +14,16 @@ export default function(props, options = {stroke: true, join: true, transform: t
|
|||||||
opacity: +props.opacity || 1
|
opacity: +props.opacity || 1
|
||||||
};
|
};
|
||||||
|
|
||||||
|
if (props.clipPath) {
|
||||||
|
_.assign(extractedProps, extractClipping(props));
|
||||||
|
}
|
||||||
|
|
||||||
if (options.stroke) {
|
if (options.stroke) {
|
||||||
Object.assign(extractedProps, extractStroke(props));
|
_.assign(extractedProps, extractStroke(props));
|
||||||
}
|
}
|
||||||
|
|
||||||
if (options.fill) {
|
if (options.fill) {
|
||||||
Object.assign(extractedProps, extractFill.call(this, props));
|
_.assign(extractedProps, extractFill.call(this, props));
|
||||||
}
|
}
|
||||||
|
|
||||||
if (options.transform) {
|
if (options.transform) {
|
||||||
@@ -1,4 +1,4 @@
|
|||||||
import rgba from './rgba';
|
import rgba from '../rgba';
|
||||||
import extractBrush from './extractBrush';
|
import extractBrush from './extractBrush';
|
||||||
let separator = /\s*,\s*/;
|
let separator = /\s*,\s*/;
|
||||||
|
|
||||||
Reference in New Issue
Block a user