Skip to content

Commit 30b39d9

Browse files
authored
fix(🌎): fix rounding issue with path trimming on RN Web (#3289)
1 parent 639066a commit 30b39d9

File tree

3 files changed

+112
-63
lines changed

3 files changed

+112
-63
lines changed

‎apps/example/ios/Podfile.lock‎

Lines changed: 60 additions & 60 deletions
Original file line numberDiff line numberDiff line change
@@ -1327,7 +1327,7 @@ PODS:
13271327
- ReactCommon/turbomodule/bridging
13281328
- ReactCommon/turbomodule/core
13291329
- Yoga
1330-
- react-native-slider (4.5.6):
1330+
- react-native-slider (4.5.7):
13311331
- DoubleConversion
13321332
- glog
13331333
- hermes-engine
@@ -1340,7 +1340,7 @@ PODS:
13401340
- React-featureflags
13411341
- React-graphics
13421342
- React-ImageManager
1343-
- react-native-slider/common (= 4.5.6)
1343+
- react-native-slider/common (= 4.5.7)
13441344
- React-NativeModulesApple
13451345
- React-RCTFabric
13461346
- React-rendererdebug
@@ -1349,7 +1349,7 @@ PODS:
13491349
- ReactCommon/turbomodule/bridging
13501350
- ReactCommon/turbomodule/core
13511351
- Yoga
1352-
- react-native-slider/common (4.5.6):
1352+
- react-native-slider/common (4.5.7):
13531353
- DoubleConversion
13541354
- glog
13551355
- hermes-engine
@@ -2162,77 +2162,77 @@ SPEC CHECKSUMS:
21622162
fmt: a40bb5bd0294ea969aaaba240a927bd33d878cdd
21632163
glog: eb93e2f488219332457c3c4eafd2738ddc7e80b8
21642164
hermes-engine: b417d2b2aee3b89b58e63e23a51e02be91dc876d
2165-
RCT-Folly: e78785aa9ba2ed998ea4151e314036f6c49e6d82
2165+
RCT-Folly: 36fe2295e44b10d831836cc0d1daec5f8abcf809
21662166
RCTDeprecation: b2eecf2d60216df56bc5e6be5f063826d3c1ee35
21672167
RCTRequired: 78522de7dc73b81f3ed7890d145fa341f5bb32ea
21682168
RCTTypeSafety: c135dd2bf50402d87fd12884cbad5d5e64850edd
21692169
React: b229c49ed5898dab46d60f61ed5a0bfa2ee2fadb
21702170
React-callinvoker: 2ac508e92c8bd9cf834cc7d7787d94352e4af58f
2171-
React-Core: 325b4f6d9162ae8b9a6ff42fe78e260eb124180d
2172-
React-CoreModules: 558041e5258f70cd1092f82778d07b8b2ff01897
2173-
React-cxxreact: 8fff17cbe76e6a8f9991b59552e1235429f9c74b
2171+
React-Core: 13cdd1558d0b3f6d9d5a22e14d89150280e79f02
2172+
React-CoreModules: b07a6744f48305405e67c845ebf481b6551b712a
2173+
React-cxxreact: 1055a86c66ac35b4e80bd5fb766aed5f494dfff4
21742174
React-debug: 0a5fcdbacc6becba0521e910c1bcfdb20f32a3f6
2175-
React-defaultsnativemodule: 618dc50a0fad41b489997c3eb7aba3a74479fd14
2176-
React-domnativemodule: 7ba599afb6c2a7ec3eb6450153e2efe0b8747e9a
2177-
React-Fabric: 252112089d2c63308f4cbfade4010b6606db67d1
2178-
React-FabricComponents: 3c0f75321680d14d124438ab279c64ec2a3d13c4
2179-
React-FabricImage: 728b8061cdec2857ca885fd605ee03ad43ffca98
2175+
React-defaultsnativemodule: 4bb28fc97fee5be63a9ebf8f7a435cfe8ba69459
2176+
React-domnativemodule: b36a11c2597243d7563985028c51ece988d8ae33
2177+
React-Fabric: afc561718f25b2cd800b709d934101afe376a12c
2178+
React-FabricComponents: f4e0a4e18a27bf6d39cbf2a0b42f37a92fa4e37f
2179+
React-FabricImage: 37d8e8b672eda68a19d71143eb65148084efb325
21802180
React-featureflags: 19682e02ef5861d96b992af16a19109c3dfc1200
2181-
React-featureflagsnativemodule: 23528c7e7d50782b7ef0804168ba40bbaf1e86ab
2182-
React-graphics: fefe48f71bfe6f48fd037f59e8277b12e91b6be1
2183-
React-hermes: a9a0c8377627b5506ef9a7b6f60a805c306e3f51
2184-
React-idlecallbacksnativemodule: 7e2b6a3b70e042f89cd91dbd73c479bb39a72a7e
2185-
React-ImageManager: e3300996ac2e2914bf821f71e2f2c92ae6e62ae2
2186-
React-jserrorhandler: fa75876c662e5d7e79d6efc763fc9f4c88e26986
2187-
React-jsi: f3f51595cc4c089037b536368f016d4742bf9cf7
2188-
React-jsiexecutor: cca6c232db461e2fd213a11e9364cfa6fdaa20eb
2189-
React-jsinspector: 2bd4c9fddf189d6ec2abf4948461060502582bef
2190-
React-jsinspectortracing: a417d8a0ad481edaa415734b4dac81e3e5ee7dc6
2191-
React-jsitracing: 1ff7172c5b0522cbf6c98d82bdbb160e49b5804e
2192-
React-logger: 018826bfd51b9f18e87f67db1590bc510ad20664
2193-
React-Mapbuffer: 3c11cee7737609275c7b66bd0b1de475f094cedf
2194-
React-microtasksnativemodule: 843f352b32aacbe13a9c750190d34df44c3e6c2c
2195-
react-native-safe-area-context: 0f14bce545abcdfbff79ce2e3c78c109f0be283e
2196-
react-native-skia: d696b43cb1a6560ec3902856cdc8f0838cc25b64
2197-
react-native-slider: bb7eb4732940fab78217e1c096bb647d8b0d1cf3
2198-
React-NativeModulesApple: 88433b6946778bea9c153e27b671de15411bf225
2199-
React-perflogger: 9e8d3c0dc0194eb932162812a168aa5dc662f418
2200-
React-performancetimeline: 5a2d6efef52bdcefac079c7baa30934978acd023
2181+
React-featureflagsnativemodule: d7cddf6d907b4e5ab84f9e744b7e88461656e48c
2182+
React-graphics: b0f78580cdaf5800d25437e3d41cc6c3d83b7aea
2183+
React-hermes: 71186f872c932e4574d5feb3ed754dda63a0b3bd
2184+
React-idlecallbacksnativemodule: dd2af19cdd3bc55149d17a2409ed72b694dfbe9c
2185+
React-ImageManager: a77dde8d5aa6a2b6962c702bf3a47695ef0aa32b
2186+
React-jserrorhandler: 9c14e89f12d5904257a79aaf84a70cd2e5ac07ba
2187+
React-jsi: 0775a66820496769ad83e629f0f5cce621a57fc7
2188+
React-jsiexecutor: 2cf5ba481386803f3c88b85c63fa102cba5d769e
2189+
React-jsinspector: 8052d532bb7a98b6e021755674659802fb140cc5
2190+
React-jsinspectortracing: bdd8fd0adcb4813663562e7874c5842449df6d8a
2191+
React-jsitracing: 2bab3bf55de3d04baf205def375fa6643c47c794
2192+
React-logger: 795cd5055782db394f187f9db0477d4b25b44291
2193+
React-Mapbuffer: 0502faf46cab8fb89cfc7bf3e6c6109b6ef9b5de
2194+
React-microtasksnativemodule: 663bc64e3a96c5fc91081923ae7481adc1359a78
2195+
react-native-safe-area-context: 286b3e7b5589795bb85ffc38faf4c0706c48a092
2196+
react-native-skia: 9c69b3dd2c957ddc31d9f5efcf3a6320e0b55461
2197+
react-native-slider: 27263d134d55db948a4706f1e47d0ec88fb354dd
2198+
React-NativeModulesApple: 16fbd5b040ff6c492dacc361d49e63cba7a6a7a1
2199+
React-perflogger: ab51b7592532a0ea45bf6eed7e6cae14a368b678
2200+
React-performancetimeline: bc2e48198ec814d578ac8401f65d78a574358203
22012201
React-RCTActionSheet: 592674cf61142497e0e820688f5a696e41bf16dd
2202-
React-RCTAnimation: e6d669872f9b3b4ab9527aab283b7c49283236b7
2203-
React-RCTAppDelegate: de2343fe08be4c945d57e0ecce44afcc7dd8fc03
2204-
React-RCTBlob: 3e2dce94c56218becc4b32b627fc2293149f798d
2205-
React-RCTFabric: cac2c033381d79a5956e08550b0220cb2d78ea93
2206-
React-RCTFBReactNativeSpec: d10ca5e0ccbfeac8c047361fedf8e4ac653887b6
2207-
React-RCTImage: dc04b176c022d12a8f55ae7a7279b1e091066ae0
2208-
React-RCTLinking: 88f5e37fe4f26fbc80791aa2a5f01baf9b9a3fd5
2209-
React-RCTNetwork: f213693565efbd698b8e9c18d700a514b49c0c8e
2210-
React-RCTSettings: a2d32a90c45a3575568cad850abc45924999b8a5
2211-
React-RCTText: 54cdcd1cbf6f6a91dc6317f5d2c2b7fc3f6bf7a0
2212-
React-RCTVibration: 11dae0e7f577b5807bb7d31e2e881eb46f854fd4
2202+
React-RCTAnimation: 8fbb8dba757b49c78f4db403133ab6399a4ce952
2203+
React-RCTAppDelegate: 7f88baa8cb4e5d6c38bb4d84339925c70c9ac864
2204+
React-RCTBlob: f89b162d0fe6b570a18e755eb16cbe356d3c6d17
2205+
React-RCTFabric: 8ad6d875abe6e87312cef90e4b15ef7f6bed72e6
2206+
React-RCTFBReactNativeSpec: 8c29630c2f379c729300e4c1e540f3d1b78d1936
2207+
React-RCTImage: ccac9969940f170503857733f9a5f63578e106e1
2208+
React-RCTLinking: d82427bbf18415a3732105383dff119131cadd90
2209+
React-RCTNetwork: 12ad4d0fbde939e00251ca5ca890da2e6825cc3c
2210+
React-RCTSettings: e7865bf9f455abf427da349c855f8644b5c39afa
2211+
React-RCTText: 2cdfd88745059ec3202a0842ea75a956c7d6f27d
2212+
React-RCTVibration: a3a1458e6230dfd64b3768ebc0a4aac430d9d508
22132213
React-rendererconsistency: 64e897e00d2568fd8dfe31e2496f80e85c0aaad1
2214-
React-rendererdebug: 41ce452460c44bba715d9e41d5493a96de277764
2214+
React-rendererdebug: a3f6d3ae7d2fa0035885026756281c07ee32479e
22152215
React-rncore: 58748c2aa445f56b99e5118dad0aedb51c40ce9f
2216-
React-RuntimeApple: 7785ed0d8ae54da65a88736bb63ca97608a6d933
2217-
React-RuntimeCore: 6029ea70bc77f98cfd43ebe69217f14e93ba1f12
2216+
React-RuntimeApple: f0fda7bacabd32daa099cfda8f07466c30acd149
2217+
React-RuntimeCore: 683ee0b6a76d4b4bf6fbf83a541895b4887cc636
22182218
React-runtimeexecutor: a188df372373baf5066e6e229177836488799f80
2219-
React-RuntimeHermes: a264609c28b796edfffc8ae4cb8fad1773ab948b
2220-
React-runtimescheduler: 23ec3a1e0fb1ec752d1a9c1fb15258c30bfc7222
2219+
React-RuntimeHermes: 907c8e9bec13ea6466b94828c088c24590d4d0b6
2220+
React-runtimescheduler: a2e2a39125dd6426b5d8b773f689d660cd7c5f60
22212221
React-timing: bb220a53a795ed57976a4855c521f3de2f298fe5
2222-
React-utils: 3b054aaebe658fc710a8d239d0e4b9fd3e0b78f9
2223-
ReactAppDependencyProvider: a1fb08dfdc7ebc387b2e54cfc9decd283ed821d8
2224-
ReactCodegen: e232f8db3a40721044ec81b9388f95a7afaad36a
2225-
ReactCommon: 0c097b53f03d6bf166edbcd0915da32f3015dd90
2226-
ReactNativeHost: f9584a700dc379cfa223203d0d51e492df84a7a8
2227-
ReactTestApp-DevSupport: 16672810b0675a3bab6be3b3e85f1ce4b93144da
2222+
React-utils: 300d8bbb6555dcffaca71e7a0663201b5c7edbbc
2223+
ReactAppDependencyProvider: f2e81d80afd71a8058589e19d8a134243fa53f17
2224+
ReactCodegen: 50b6e45bbbef9b39d9798820cdbe87bfc7922e22
2225+
ReactCommon: 3d39389f8e2a2157d5c999f8fba57bd1c8f226f0
2226+
ReactNativeHost: f2ecc49200441384efb6c6e8bffe62ba29ee16ae
2227+
ReactTestApp-DevSupport: 15d2ef4884e8f5fd30ded3dec59b010f76384f37
22282228
ReactTestApp-Resources: 1bd9ff10e4c24f2ad87101a32023721ae923bccf
2229-
RNGestureHandler: dcb1b1db024f3744b03af56d132f4f72c4c27195
2230-
RNReanimated: 3b2312c84f8c747ab1e9d9c3ce879e93a5ba96f3
2231-
RNScreens: 790123c4a28783d80a342ce42e8c7381bed62db1
2232-
RNSVG: 8126581b369adf6a0004b6a6cab1a55e3002d5b0
2229+
RNGestureHandler: 66e593addd8952725107cfaa4f5e3378e946b541
2230+
RNReanimated: b292a2aee945230a9c5e01889043ba088b5fb9b8
2231+
RNScreens: 0f01bbed9bd8045a8d58e4b46993c28c7f498f3c
2232+
RNSVG: 8588ee1ca9b2e6fd2c99466e35b3db0e9f81bb40
22332233
SocketRocket: d4aabe649be1e368d1318fdf28a022d714d65748
2234-
Yoga: afd04ff05ebe0121a00c468a8a3c8080221cb14c
2234+
Yoga: 9b7fb56e7b08cde60e2153344fa6afbd88e5d99f
22352235

22362236
PODFILE CHECKSUM: 87506345285a0371afb28b9c3e6daaa999c214f3
22372237

2238-
COCOAPODS: 1.16.2
2238+
COCOAPODS: 1.15.2

‎packages/skia/src/renderer/__tests__/e2e/Drawings.spec.tsx‎

Lines changed: 50 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -142,7 +142,7 @@ describe("Drawings", () => {
142142
checkImage(image, "snapshots/paths/skia-trimmed.png");
143143
});
144144

145-
it("Should clamp the trim values automatically", async () => {
145+
it("Should clamp the trim values automatically (1)", async () => {
146146
const { Skia } = importSkia();
147147
const { width, height } = surface;
148148
const path = Skia.Path.MakeFromSVGString(
@@ -186,6 +186,55 @@ describe("Drawings", () => {
186186
checkImage(image, "snapshots/paths/skia.png");
187187
});
188188

189+
it("Should clamp the trim values automatically (2)", async () => {
190+
const { Skia } = importSkia();
191+
const { width, height } = surface;
192+
const path = Skia.Path.MakeFromSVGString(
193+
// eslint-disable-next-line max-len
194+
"M512.213 204.005C500.312 185.697 406.758 105.581 332.94 105.581C259.122 105.581 219.088 132 204.638 149.85C157.952 207.52 141.933 264.275 156.579 320.115C175.803 387.854 228.896 449.644 315.859 505.483C415.638 562.238 479.716 626.774 508.093 699.091C518.163 731.13 519.536 762.711 512.213 793.835C504.889 824.959 490.243 853.336 468.273 878.967C449.965 903.683 425.707 921.534 395.499 932.518C365.291 942.588 328.675 950.369 285.651 955.861C182.21 964.1 97.9935 948.538 33 909.176M595.972 733.419C710.397 564.985 795.529 424.47 851.369 311.876C865.1 279.837 875.169 255.579 881.577 239.102C887.985 221.709 894.393 198.824 900.801 170.447C907.208 142.069 909.497 115.98 907.666 92.1797C904.92 68.3793 893.02 51.9021 871.965 40.0019C850.911 28.1016 835.5 31.3101 811.549 44.1212C772.187 65.1754 745.64 101.334 731.909 152.596C723.67 174.566 715.432 200.197 707.193 229.49C699.87 258.783 694.378 281.21 690.716 296.772C687.97 312.334 682.935 340.711 675.612 381.904C668.289 422.182 663.712 445.982 661.881 453.306C643.573 567.731 621.603 733.876 595.972 951.742C624.349 852.878 656.846 774.154 693.462 715.568C706.278 689.937 717.263 669.798 726.417 655.152C735.571 640.505 748.844 624.486 766.237 607.093C784.545 589.701 803.768 576.885 823.907 568.646C892.562 543.015 941.994 545.304 972.202 575.512C990.51 594.735 999.664 618.078 999.664 645.54C1000.58 673.002 990.052 694.514 968.083 710.076C925.059 733.876 859.608 741.657 771.729 733.419C786.375 737.996 797.36 742.115 804.683 745.776C812.922 748.523 822.992 753.1 834.892 759.508C847.707 765.915 857.319 773.696 863.727 782.85C871.05 792.004 875.627 802.531 877.458 814.432C878.373 819.009 879.746 827.705 881.577 840.521C884.323 853.336 886.612 862.948 888.443 869.356C890.273 875.763 892.562 884.002 895.308 894.072C898.97 904.141 903.089 912.837 907.666 920.16C913.159 926.568 919.566 932.976 926.89 939.384C949.775 961.354 987.764 958.607 1040.86 931.145C1056.42 923.822 1070.61 914.668 1083.42 903.683C1097.15 892.698 1109.97 879.425 1121.87 863.863C1134.69 847.386 1144.76 834.113 1152.08 824.043C1159.4 813.058 1169.47 797.039 1182.29 775.985C1195.1 754.931 1204.26 740.742 1209.75 733.419C1239.04 674.833 1268.33 616.247 1297.63 557.661C1252.77 670.256 1223.94 756.304 1211.12 815.805C1205.63 833.197 1203.34 853.336 1204.26 876.221C1205.17 899.106 1212.04 917.414 1224.85 931.145C1234.01 942.13 1245.45 949.453 1259.18 953.115C1273.83 956.777 1287.56 956.319 1300.37 951.742C1356.21 935.265 1401.53 903.226 1436.31 855.625C1456.45 828.163 1483.45 787.427 1517.32 733.419M1360.79 390.143C1347.97 390.143 1340.19 384.193 1337.45 372.293C1335.62 359.477 1336.99 348.492 1341.57 339.338C1345.24 332 1357.13 333.846 1369.03 333.846C1380.93 333.846 1390.5 340.5 1391 348.95M1925.13 697.718C1902.25 633.64 1874.33 593.82 1841.38 578.258C1810.25 559.95 1775.47 551.254 1737.02 552.169C1698.57 552.169 1664.25 562.238 1634.04 582.377C1605.66 598.855 1581.4 620.824 1561.26 648.286C1541.12 674.833 1527.39 704.126 1520.07 736.165C1513.66 767.288 1514.58 798.87 1522.82 830.909C1531.97 862.032 1547.53 888.579 1569.5 910.549C1604.29 939.842 1646.4 954.488 1695.83 954.488C1745.26 954.488 1787.82 939.842 1823.53 910.549C1838.17 895.902 1848.7 885.375 1855.11 878.967C1861.51 872.56 1868.84 863.406 1877.08 851.505C1886.23 839.605 1893.55 827.247 1899.05 814.432M1958.09 556.288C1933.37 657.898 1916.9 746.234 1908.66 821.297C1900.42 878.967 1911.4 918.787 1941.61 940.757C1964.5 959.065 2000.2 956.319 2048.71 932.518C2090.82 912.38 2131.1 873.017 2169.55 814.432"
195+
)!;
196+
const PADDING = width / 16;
197+
const image = await surface.draw(
198+
<FitBox
199+
src={Skia.XYWHRect(0, 0, 2139, 928)}
200+
dst={Skia.XYWHRect(
201+
PADDING,
202+
PADDING,
203+
width - PADDING * 2,
204+
height - PADDING * 2
205+
)}
206+
>
207+
<Group strokeJoin="round" strokeCap="round" color="black">
208+
<Path
209+
path={path}
210+
style="stroke"
211+
strokeWidth={116}
212+
end={0.9999999999999998}
213+
>
214+
<LinearGradient
215+
start={path.getPoint(0)}
216+
end={path.getLastPt()}
217+
colors={[
218+
"#3FCEBC",
219+
"#3CBCEB",
220+
"#5F96E7",
221+
"#816FE3",
222+
"#9F5EE2",
223+
"#DE589F",
224+
"#FF645E",
225+
"#FDA859",
226+
"#FAEC54",
227+
"#9EE671",
228+
"#41E08D",
229+
]}
230+
/>
231+
</Path>
232+
</Group>
233+
</FitBox>
234+
);
235+
checkImage(image, "snapshots/paths/skia.png");
236+
});
237+
189238
it("should use default props (1)", async () => {
190239
const image = await surface.draw(
191240
<Group strokeJoin="round" strokeCap="round" color="black">

‎packages/skia/src/sksg/Recorder/commands/Drawing.ts‎

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -208,8 +208,8 @@ export const drawPath = (ctx: DrawingContext, props: PathProps) => {
208208
stroke,
209209
...pathProps
210210
} = props;
211-
const start = saturate(trimStart);
212-
const end = saturate(trimEnd);
211+
const start = Math.fround(saturate(trimStart));
212+
const end = Math.fround(saturate(trimEnd));
213213
const hasStartOffset = start !== 0;
214214
const hasEndOffset = end !== 1;
215215
const hasStrokeOptions = stroke !== undefined;

0 commit comments

Comments
 (0)