From 73b21d156057f79a29f4bfb2c21a47e803c3cb1c Mon Sep 17 00:00:00 2001 From: Mikael Sand Date: Sat, 19 Oct 2019 21:59:09 +0300 Subject: [PATCH] fix: handle setting transform attribute on clipPath, fixes #1152 --- android/src/main/java/com/horcrux/svg/VirtualView.java | 1 + ios/RNSVGNode.m | 4 +++- src/elements/ClipPath.tsx | 2 ++ src/lib/extract/extractClipPath.ts | 8 +++++++- src/lib/extract/types.ts | 1 + 5 files changed, 14 insertions(+), 2 deletions(-) diff --git a/android/src/main/java/com/horcrux/svg/VirtualView.java b/android/src/main/java/com/horcrux/svg/VirtualView.java index b1cf6a9b2..421296d63 100644 --- a/android/src/main/java/com/horcrux/svg/VirtualView.java +++ b/android/src/main/java/com/horcrux/svg/VirtualView.java @@ -333,6 +333,7 @@ public void setResponsible(boolean responsible) { if (mClipNode != null) { Path clipPath = mClipNode.mClipRule == CLIP_RULE_EVENODD ? mClipNode.getPath(canvas, paint) : mClipNode.getPath(canvas, paint, Region.Op.UNION); + clipPath.transform(mClipNode.mMatrix); switch (mClipNode.mClipRule) { case CLIP_RULE_EVENODD: clipPath.setFillType(Path.FillType.EVEN_ODD); diff --git a/ios/RNSVGNode.m b/ios/RNSVGNode.m index c46d1e665..c028651ee 100644 --- a/ios/RNSVGNode.m +++ b/ios/RNSVGNode.m @@ -314,7 +314,9 @@ - (CGPathRef)getClipPath:(CGContextRef)context if (_cachedClipPath) { CGPathRelease(_cachedClipPath); } - _cachedClipPath = CGPathRetain([_clipNode getPath:context]); + CGAffineTransform transform = _clipNode.matrix; + _cachedClipPath = CGPathCreateCopyByTransformingPath([_clipNode getPath:context], &transform); + CGPathRetain(_cachedClipPath); if (_clipMask) { CGImageRelease(_clipMask); } diff --git a/src/elements/ClipPath.tsx b/src/elements/ClipPath.tsx index 1868ddd46..533afa6d3 100644 --- a/src/elements/ClipPath.tsx +++ b/src/elements/ClipPath.tsx @@ -1,12 +1,14 @@ import React from 'react'; import { requireNativeComponent } from 'react-native'; import extractClipPath from '../lib/extract/extractClipPath'; +import { TransformProps } from '../lib/extract/types'; import Shape from './Shape'; export default class ClipPath extends Shape<{ id?: string; clipPath?: string; clipRule?: 'evenodd' | 'nonzero'; + transform?: number[] | string | TransformProps; }> { static displayName = 'ClipPath'; diff --git a/src/lib/extract/extractClipPath.ts b/src/lib/extract/extractClipPath.ts index a7f4d698f..da2b140fb 100644 --- a/src/lib/extract/extractClipPath.ts +++ b/src/lib/extract/extractClipPath.ts @@ -1,5 +1,6 @@ import { idPattern } from '../util'; import { ClipProps } from './types'; +import extractTransform from './extractTransform'; const clipRules: { evenodd: number; nonzero: number } = { evenodd: 0, @@ -7,10 +8,11 @@ const clipRules: { evenodd: number; nonzero: number } = { }; export default function extractClipPath(props: ClipProps) { - const { clipPath, clipRule } = props; + const { clipPath, clipRule, transform } = props; const extracted: { clipPath?: string; clipRule?: number; + matrix?: number[]; } = {}; if (clipRule) { @@ -31,5 +33,9 @@ export default function extractClipPath(props: ClipProps) { } } + if (transform) { + extracted.matrix = extractTransform(transform); + } + return extracted; } diff --git a/src/lib/extract/types.ts b/src/lib/extract/types.ts index 97e699920..4090ac77e 100644 --- a/src/lib/extract/types.ts +++ b/src/lib/extract/types.ts @@ -92,4 +92,5 @@ export type StrokeProps = { export type ClipProps = { clipPath?: string; clipRule?: 'evenodd' | 'nonzero'; + transform?: number[] | string | TransformProps; };