Skip to content

Commit c993413

Browse files
authored
Merge pull request #51 from typemytype/self_intersecting_zero_area_paths
ignore zero area contours only when pyclipper cannot add them
2 parents f5fb0d4 + 7241d8e commit c993413

20 files changed

Lines changed: 409 additions & 274 deletions

Lib/booleanOperations/booleanOperationManager.py

Lines changed: 27 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -30,20 +30,39 @@
3030
}
3131

3232

33+
def _addContour(clipperPath, contour, fillType, contourCount):
34+
if pyclipper.Area(contour) == 0:
35+
# skip paths with no area,
36+
# BUT self intersecting paths could have no area...
37+
dummy = pyclipper.Pyclipper()
38+
try:
39+
dummy.AddPath(contour, fillType)
40+
shouldBeAValidPath = True
41+
except pyclipper.ClipperException:
42+
shouldBeAValidPath = False
43+
if not shouldBeAValidPath:
44+
return
45+
46+
try:
47+
clipperPath.AddPath(contour, fillType)
48+
except pyclipper.ClipperException:
49+
raise InvalidSubjectContourError("contour %d is invalid for clipping" % contourCount)
50+
51+
3352
def clipExecute(subjectContours, clipContours, operation, subjectFillType="nonZero",
3453
clipFillType="nonZero"):
3554
pc = pyclipper.Pyclipper()
3655

3756
for i, subjectContour in enumerate(subjectContours):
38-
try:
39-
pc.AddPath(subjectContour, pyclipper.PT_SUBJECT)
40-
except pyclipper.ClipperException:
41-
raise InvalidSubjectContourError("contour %d is invalid for clipping" % i)
57+
_addContour(clipperPath=pc, contour=subjectContour, fillType=pyclipper.PT_SUBJECT, contourCount=i)
58+
4259
for j, clipContour in enumerate(clipContours):
43-
try:
44-
pc.AddPath(clipContour, pyclipper.PT_CLIP)
45-
except pyclipper.ClipperException:
46-
raise InvalidClippingContourError("contour %d is invalid for clipping" % j)
60+
_addContour(clipperPath=pc, contour=clipContour, fillType=pyclipper.PT_CLIP, contourCount=i)
61+
62+
bounds = pc.GetBounds()
63+
if (bounds.bottom, bounds.left, bounds.top, bounds.right) == (0, 0, 0, 0):
64+
# do nothing if there are no paths
65+
return []
4766

4867
try:
4968
solution = pc.Execute(_operationMap[operation],

tests/testData/generateGlyphDataRoboFont.py

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -24,20 +24,20 @@ def save(self, path=None):
2424
for g in f:
2525
g.leftMargin = 0
2626
g.rightMargin = 0
27-
n = g.naked()
27+
n = g.naked()
2828
d = g.getLayer("union")
2929
d.clear()
3030
d.appendGlyph(g)
3131
d.removeOverlap(round=0)
3232

3333
if len(g) > 1:
34-
for method in "xor", "difference", "intersection":
35-
d = g.getLayer(method)
34+
for method in "xor", "difference", "intersection":
35+
d = g.getLayer(method)
3636
d.clear()
3737
func = getattr(booleanOperations, method)
3838
func([n[0]], n[1:], d.getPointPen())
3939

40-
f.save()
40+
f.save()
4141

4242
if hasMojo:
4343
setDefault("glyphViewRoundValues", glyphViewRoundValues)
Lines changed: 27 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -1,30 +1,30 @@
1-
<?xml version="1.0" encoding="UTF-8"?>
1+
<?xml version='1.0' encoding='UTF-8'?>
22
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
33
<plist version="1.0">
4-
<dict>
5-
<key>ascender</key>
6-
<integer>750</integer>
7-
<key>capHeight</key>
8-
<integer>750</integer>
9-
<key>descender</key>
10-
<integer>-250</integer>
11-
<key>guidelines</key>
12-
<array/>
13-
<key>postscriptBlueValues</key>
14-
<array/>
15-
<key>postscriptFamilyBlues</key>
16-
<array/>
17-
<key>postscriptFamilyOtherBlues</key>
18-
<array/>
19-
<key>postscriptOtherBlues</key>
20-
<array/>
21-
<key>postscriptStemSnapH</key>
22-
<array/>
23-
<key>postscriptStemSnapV</key>
24-
<array/>
25-
<key>unitsPerEm</key>
26-
<integer>1000</integer>
27-
<key>xHeight</key>
28-
<integer>500</integer>
29-
</dict>
4+
<dict>
5+
<key>ascender</key>
6+
<integer>750</integer>
7+
<key>capHeight</key>
8+
<integer>750</integer>
9+
<key>descender</key>
10+
<integer>-250</integer>
11+
<key>guidelines</key>
12+
<array/>
13+
<key>postscriptBlueValues</key>
14+
<array/>
15+
<key>postscriptFamilyBlues</key>
16+
<array/>
17+
<key>postscriptFamilyOtherBlues</key>
18+
<array/>
19+
<key>postscriptOtherBlues</key>
20+
<array/>
21+
<key>postscriptStemSnapH</key>
22+
<array/>
23+
<key>postscriptStemSnapV</key>
24+
<array/>
25+
<key>unitsPerEm</key>
26+
<integer>1000</integer>
27+
<key>xHeight</key>
28+
<integer>500</integer>
29+
</dict>
3030
</plist>
Lines changed: 23 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -1,26 +1,26 @@
1-
<?xml version="1.0" encoding="UTF-8"?>
1+
<?xml version='1.0' encoding='UTF-8'?>
22
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
33
<plist version="1.0">
4-
<dict>
5-
<key>Q</key>
6-
<string>Q_.glif</string>
7-
<key>QTail_reversed</key>
8-
<string>Q_T_ail_reversed.glif</string>
9-
<key>ovalOval</key>
10-
<string>ovalO_val.glif</string>
11-
<key>ovalOval_reversed</key>
12-
<string>ovalO_val_reversed.glif</string>
13-
<key>ovalRect</key>
14-
<string>ovalR_ect.glif</string>
15-
<key>ovalRect_reversed</key>
16-
<string>ovalR_ect_reversed.glif</string>
17-
<key>rectOval</key>
18-
<string>rectO_val.glif</string>
19-
<key>rectOval_reversed</key>
20-
<string>rectO_val_reversed.glif</string>
21-
<key>rectRect</key>
22-
<string>rectR_ect.glif</string>
23-
<key>rectRect_reversed</key>
24-
<string>rectR_ect_reversed.glif</string>
25-
</dict>
4+
<dict>
5+
<key>Q</key>
6+
<string>Q_.glif</string>
7+
<key>QTail_reversed</key>
8+
<string>Q_T_ail_reversed.glif</string>
9+
<key>ovalOval</key>
10+
<string>ovalO_val.glif</string>
11+
<key>ovalOval_reversed</key>
12+
<string>ovalO_val_reversed.glif</string>
13+
<key>ovalRect</key>
14+
<string>ovalR_ect.glif</string>
15+
<key>ovalRect_reversed</key>
16+
<string>ovalR_ect_reversed.glif</string>
17+
<key>rectOval</key>
18+
<string>rectO_val.glif</string>
19+
<key>rectOval_reversed</key>
20+
<string>rectO_val_reversed.glif</string>
21+
<key>rectRect</key>
22+
<string>rectR_ect.glif</string>
23+
<key>rectRect_reversed</key>
24+
<string>rectR_ect_reversed.glif</string>
25+
</dict>
2626
</plist>
Lines changed: 10 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,13 @@
1-
<?xml version="1.0" encoding="UTF-8"?>
1+
<?xml version='1.0' encoding='UTF-8'?>
22
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
33
<plist version="1.0">
4-
<dict>
5-
<key>color</key>
6-
<string>0,1,1,0.7</string>
7-
<key>lib</key>
8-
<dict>
9-
<key>com.typemytype.robofont.segmentType</key>
10-
<string>curve</string>
11-
</dict>
12-
</dict>
4+
<dict>
5+
<key>color</key>
6+
<string>0,1,1,0.7</string>
7+
<key>lib</key>
8+
<dict>
9+
<key>com.typemytype.robofont.segmentType</key>
10+
<string>curve</string>
11+
</dict>
12+
</dict>
1313
</plist>
Lines changed: 23 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -1,26 +1,26 @@
1-
<?xml version="1.0" encoding="UTF-8"?>
1+
<?xml version='1.0' encoding='UTF-8'?>
22
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
33
<plist version="1.0">
4-
<dict>
5-
<key>Q</key>
6-
<string>Q_.glif</string>
7-
<key>QTail_reversed</key>
8-
<string>Q_T_ail_reversed.glif</string>
9-
<key>ovalOval</key>
10-
<string>ovalO_val.glif</string>
11-
<key>ovalOval_reversed</key>
12-
<string>ovalO_val_reversed.glif</string>
13-
<key>ovalRect</key>
14-
<string>ovalR_ect.glif</string>
15-
<key>ovalRect_reversed</key>
16-
<string>ovalR_ect_reversed.glif</string>
17-
<key>rectOval</key>
18-
<string>rectO_val.glif</string>
19-
<key>rectOval_reversed</key>
20-
<string>rectO_val_reversed.glif</string>
21-
<key>rectRect</key>
22-
<string>rectR_ect.glif</string>
23-
<key>rectRect_reversed</key>
24-
<string>rectR_ect_reversed.glif</string>
25-
</dict>
4+
<dict>
5+
<key>Q</key>
6+
<string>Q_.glif</string>
7+
<key>QTail_reversed</key>
8+
<string>Q_T_ail_reversed.glif</string>
9+
<key>ovalOval</key>
10+
<string>ovalO_val.glif</string>
11+
<key>ovalOval_reversed</key>
12+
<string>ovalO_val_reversed.glif</string>
13+
<key>ovalRect</key>
14+
<string>ovalR_ect.glif</string>
15+
<key>ovalRect_reversed</key>
16+
<string>ovalR_ect_reversed.glif</string>
17+
<key>rectOval</key>
18+
<string>rectO_val.glif</string>
19+
<key>rectOval_reversed</key>
20+
<string>rectO_val_reversed.glif</string>
21+
<key>rectRect</key>
22+
<string>rectR_ect.glif</string>
23+
<key>rectRect_reversed</key>
24+
<string>rectR_ect_reversed.glif</string>
25+
</dict>
2626
</plist>
Lines changed: 10 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,13 @@
1-
<?xml version="1.0" encoding="UTF-8"?>
1+
<?xml version='1.0' encoding='UTF-8'?>
22
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
33
<plist version="1.0">
4-
<dict>
5-
<key>color</key>
6-
<string>0,0.25,1,0.7</string>
7-
<key>lib</key>
8-
<dict>
9-
<key>com.typemytype.robofont.segmentType</key>
10-
<string>curve</string>
11-
</dict>
12-
</dict>
4+
<dict>
5+
<key>color</key>
6+
<string>0,0.25,1,0.7</string>
7+
<key>lib</key>
8+
<dict>
9+
<key>com.typemytype.robofont.segmentType</key>
10+
<string>curve</string>
11+
</dict>
12+
</dict>
1313
</plist>
Lines changed: 33 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -1,34 +1,36 @@
1-
<?xml version="1.0" encoding="UTF-8"?>
1+
<?xml version='1.0' encoding='UTF-8'?>
22
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
33
<plist version="1.0">
4-
<dict>
5-
<key>Q</key>
6-
<string>Q_.glif</string>
7-
<key>QTail_reversed</key>
8-
<string>Q_T_ail_reversed.glif</string>
9-
<key>oval</key>
10-
<string>oval.glif</string>
11-
<key>ovalOval</key>
12-
<string>ovalO_val.glif</string>
13-
<key>ovalOval_reversed</key>
14-
<string>ovalO_val_reversed.glif</string>
15-
<key>ovalRect</key>
16-
<string>ovalR_ect.glif</string>
17-
<key>ovalRect_reversed</key>
18-
<string>ovalR_ect_reversed.glif</string>
19-
<key>oval_differentStartPoint</key>
20-
<string>oval_differentS_tartP_oint.glif</string>
21-
<key>rect</key>
22-
<string>rect.glif</string>
23-
<key>rectOval</key>
24-
<string>rectO_val.glif</string>
25-
<key>rectOval_reversed</key>
26-
<string>rectO_val_reversed.glif</string>
27-
<key>rectRect</key>
28-
<string>rectR_ect.glif</string>
29-
<key>rectRect_reversed</key>
30-
<string>rectR_ect_reversed.glif</string>
31-
<key>rect_differentStartPoint</key>
32-
<string>rect_differentS_tartP_oint.glif</string>
33-
</dict>
4+
<dict>
5+
<key>Q</key>
6+
<string>Q_.glif</string>
7+
<key>QTail_reversed</key>
8+
<string>Q_T_ail_reversed.glif</string>
9+
<key>oval</key>
10+
<string>oval.glif</string>
11+
<key>ovalOval</key>
12+
<string>ovalO_val.glif</string>
13+
<key>ovalOval_reversed</key>
14+
<string>ovalO_val_reversed.glif</string>
15+
<key>ovalRect</key>
16+
<string>ovalR_ect.glif</string>
17+
<key>ovalRect_reversed</key>
18+
<string>ovalR_ect_reversed.glif</string>
19+
<key>oval_differentStartPoint</key>
20+
<string>oval_differentS_tartP_oint.glif</string>
21+
<key>rect</key>
22+
<string>rect.glif</string>
23+
<key>rectOval</key>
24+
<string>rectO_val.glif</string>
25+
<key>rectOval_reversed</key>
26+
<string>rectO_val_reversed.glif</string>
27+
<key>rectRect</key>
28+
<string>rectR_ect.glif</string>
29+
<key>rectRect_reversed</key>
30+
<string>rectR_ect_reversed.glif</string>
31+
<key>rect_differentStartPoint</key>
32+
<string>rect_differentS_tartP_oint.glif</string>
33+
<key>zeroAreaSelfIntersecting</key>
34+
<string>zeroA_reaS_elfI_ntersecting.glif</string>
35+
</dict>
3436
</plist>
Lines changed: 10 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,13 @@
1-
<?xml version="1.0" encoding="UTF-8"?>
1+
<?xml version='1.0' encoding='UTF-8'?>
22
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
33
<plist version="1.0">
4-
<dict>
5-
<key>color</key>
6-
<string>0.5,1,0,0.7</string>
7-
<key>lib</key>
8-
<dict>
9-
<key>com.typemytype.robofont.segmentType</key>
10-
<string>curve</string>
11-
</dict>
12-
</dict>
4+
<dict>
5+
<key>color</key>
6+
<string>0.5,1,0,0.7</string>
7+
<key>lib</key>
8+
<dict>
9+
<key>com.typemytype.robofont.segmentType</key>
10+
<string>curve</string>
11+
</dict>
12+
</dict>
1313
</plist>
Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
<?xml version='1.0' encoding='UTF-8'?>
2+
<glyph name="zeroAreaSelfIntersecting" format="2">
3+
<advance width="500"/>
4+
<outline>
5+
<contour>
6+
<point x="0" y="200" type="line"/>
7+
<point x="400" y="0" type="line"/>
8+
<point x="200" y="200" type="line"/>
9+
<point x="400" y="200" type="line"/>
10+
<point x="0" y="400" type="line"/>
11+
<point x="200" y="200" type="line"/>
12+
</contour>
13+
</outline>
14+
</glyph>

0 commit comments

Comments
 (0)