That's a good question, afaict we want to preserve the outermost contour direction and apply winding direction for the rest. Is that technically sound?
[Essentially we want to preserve as much as possible of: contour direction, start point and the order of contours.]
Below example paths & see attached pictures (union operation is performed).
Sample source path:
path.setFillType(SkPath::kWinding_FillType);
path.moveTo(375, 24);
path.cubicTo(567, 24, 723, 180, 723, 372);
path.cubicTo(723, 563, 567, 719, 375, 719);
path.cubicTo(184, 719, 28, 563, 28, 372);
path.cubicTo(28, 180, 184, 24, 375, 24);
path.close();
path.moveTo(375, 147);
path.cubicTo(252, 147, 151, 248, 151, 372);
path.cubicTo(151, 495, 252, 595, 375, 595);
path.cubicTo(499, 595, 599, 495, 599, 372);
path.cubicTo(599, 248, 499, 147, 375, 147);
path.close();
path.moveTo(175, 180);
path.lineTo(232, 120);
path.lineTo(386, 226);
path.lineTo(805, -96);
path.lineTo(918, -22);
path.lineTo(379, 332);
path.lineTo(175, 180);
path.close();
SkPathOps-Union:
path.setFillType(SkPath::kWinding_FillType);
path.moveTo(217.908f, 211.971f);
path.cubicTo(176.678f, 252.8f, 151, 309.476f, 151, 372);
path.cubicTo(151, 495, 252, 595, 375, 595);
path.cubicTo(499, 595, 599, 495, 599, 372);
path.cubicTo(599, 315.346f, 578.125f, 263.492f, 543.624f, 223.88f);
path.lineTo(379, 332);
path.lineTo(217.908f, 211.971f);
path.close();
path.moveTo(570.527f, 84.1918f);
path.cubicTo(514.776f, 46.2132f, 447.451f, 24, 375, 24);
path.cubicTo(184, 24, 28, 180, 28, 372);
path.cubicTo(28, 563, 184, 719, 375, 719);
path.cubicTo(567, 719, 723, 563, 723, 372);
path.cubicTo(723, 290.285f, 694.743f, 215.092f, 647.481f, 155.669f);
path.lineTo(918, -22);
path.lineTo(805, -96);
path.lineTo(570.527f, 84.1918f);
path.close();
path.moveTo(464.508f, 165.667f);
path.lineTo(386, 226);
path.lineTo(293.66f, 162.441f);
path.cubicTo(318.916f, 152.475f, 346.362f, 147, 375, 147);
path.cubicTo(406.849f, 147, 437.114f, 153.663f, 464.508f, 165.667f);
path.close();
What we want:
path.setFillType(SkPath::kWinding_FillType);
path.moveTo(375, 24);
path.cubicTo(447.449f, 24, 514.773f, 46.2123f, 570.523f, 84.1944f);
path.lineTo(805, -96);
path.lineTo(918, -22);
path.lineTo(647.476f, 155.673f);
path.cubicTo(694.741f, 215.087f, 723, 290.283f, 723, 372);
path.cubicTo(723, 563, 567, 719, 375, 719);
path.cubicTo(184, 719, 28, 563, 28, 372);
path.cubicTo(28, 180, 184, 24, 375, 24);
path.close();
path.moveTo(151, 372);
path.cubicTo(151, 495, 252, 595, 375, 595);
path.cubicTo(499, 595, 599, 495, 599, 372);
path.cubicTo(599, 315.339f, 578.12f, 263.481f, 543.612f, 223.887f);
path.lineTo(379, 332);
path.lineTo(217.911f, 211.973f);
path.cubicTo(176.68f, 252.798f, 151, 309.475f, 151, 372);
path.close();
path.moveTo(375, 147);
path.cubicTo(346.367f, 147, 318.927f, 152.473f, 293.675f, 162.452f);
path.lineTo(386, 226);
path.lineTo(464.495f, 165.677f);
path.cubicTo(437.104f, 153.661f, 406.843f, 147, 375, 147);
path.close();
Thanks,