aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorjaseg <git@jaseg.de>2021-01-24 18:44:56 +0100
committerjaseg <git@jaseg.de>2021-01-24 18:44:56 +0100
commitf7b4cc602b9a646fbc66f3f17d6bb9c20efc3ead (patch)
treed7b110b65e93b87fc65472559ac74e7eb961bc7c
downloadgerbolyze-f7b4cc602b9a646fbc66f3f17d6bb9c20efc3ead.tar.gz
gerbolyze-f7b4cc602b9a646fbc66f3f17d6bb9c20efc3ead.tar.bz2
gerbolyze-f7b4cc602b9a646fbc66f3f17d6bb9c20efc3ead.zip
Initial commit
-rw-r--r--.gitignore1
-rw-r--r--.gitmodules9
-rw-r--r--Makefile45
-rw-r--r--src/svg_color.cpp125
-rw-r--r--src/svg_color.h59
-rw-r--r--src/svg_doc.cpp462
-rw-r--r--src/svg_doc.h97
-rw-r--r--src/svg_geom.cpp181
-rw-r--r--src/svg_geom.h44
-rw-r--r--src/svg_import_defs.h49
-rw-r--r--src/svg_import_util.cpp129
-rw-r--r--src/svg_import_util.h69
-rw-r--r--src/svg_path.cpp219
-rw-r--r--src/svg_path.h38
-rw-r--r--src/svg_pattern.cpp119
-rw-r--r--src/svg_pattern.h60
-rw-r--r--src/vec_core.cpp339
-rw-r--r--src/vec_core.h37
-rw-r--r--src/vec_grid.cpp105
-rw-r--r--src/vec_grid.h52
-rw-r--r--upstream/clipper-6.4.2/Documentation/Docs/Overview/Changes.htm1269
-rw-r--r--upstream/clipper-6.4.2/Documentation/Docs/Overview/Deprecated.htm69
-rw-r--r--upstream/clipper-6.4.2/Documentation/Docs/Overview/Example.htm234
-rw-r--r--upstream/clipper-6.4.2/Documentation/Docs/Overview/FAQ.htm104
-rw-r--r--upstream/clipper-6.4.2/Documentation/Docs/Overview/License.htm75
-rw-r--r--upstream/clipper-6.4.2/Documentation/Docs/Overview/Rounding.htm71
-rw-r--r--upstream/clipper-6.4.2/Documentation/Docs/Overview/_Body.htm106
-rw-r--r--upstream/clipper-6.4.2/Documentation/Docs/Units/ClipperLib/Classes/Clipper/Methods/Constructor.htm95
-rw-r--r--upstream/clipper-6.4.2/Documentation/Docs/Units/ClipperLib/Classes/Clipper/Methods/Execute.htm91
-rw-r--r--upstream/clipper-6.4.2/Documentation/Docs/Units/ClipperLib/Classes/Clipper/Properties/PreserveCollinear.htm74
-rw-r--r--upstream/clipper-6.4.2/Documentation/Docs/Units/ClipperLib/Classes/Clipper/Properties/ReverseSolution.htm76
-rw-r--r--upstream/clipper-6.4.2/Documentation/Docs/Units/ClipperLib/Classes/Clipper/Properties/StrictlySimple.htm88
-rw-r--r--upstream/clipper-6.4.2/Documentation/Docs/Units/ClipperLib/Classes/Clipper/Properties/ZFillFunction.htm75
-rw-r--r--upstream/clipper-6.4.2/Documentation/Docs/Units/ClipperLib/Classes/Clipper/_Body.htm149
-rw-r--r--upstream/clipper-6.4.2/Documentation/Docs/Units/ClipperLib/Classes/ClipperBase/Methods/AddPath.htm95
-rw-r--r--upstream/clipper-6.4.2/Documentation/Docs/Units/ClipperLib/Classes/ClipperBase/Methods/AddPaths.htm93
-rw-r--r--upstream/clipper-6.4.2/Documentation/Docs/Units/ClipperLib/Classes/ClipperBase/Methods/Clear.htm71
-rw-r--r--upstream/clipper-6.4.2/Documentation/Docs/Units/ClipperLib/Classes/ClipperBase/Methods/GetBounds.htm76
-rw-r--r--upstream/clipper-6.4.2/Documentation/Docs/Units/ClipperLib/Classes/ClipperBase/_Body.htm91
-rw-r--r--upstream/clipper-6.4.2/Documentation/Docs/Units/ClipperLib/Classes/ClipperOffset/Methods/AddPath.htm73
-rw-r--r--upstream/clipper-6.4.2/Documentation/Docs/Units/ClipperLib/Classes/ClipperOffset/Methods/AddPaths.htm74
-rw-r--r--upstream/clipper-6.4.2/Documentation/Docs/Units/ClipperLib/Classes/ClipperOffset/Methods/Clear.htm72
-rw-r--r--upstream/clipper-6.4.2/Documentation/Docs/Units/ClipperLib/Classes/ClipperOffset/Methods/Constructor.htm74
-rw-r--r--upstream/clipper-6.4.2/Documentation/Docs/Units/ClipperLib/Classes/ClipperOffset/Methods/Execute.htm111
-rw-r--r--upstream/clipper-6.4.2/Documentation/Docs/Units/ClipperLib/Classes/ClipperOffset/Properties/ArcTolerance.htm74
-rw-r--r--upstream/clipper-6.4.2/Documentation/Docs/Units/ClipperLib/Classes/ClipperOffset/Properties/MiterLimit.htm75
-rw-r--r--upstream/clipper-6.4.2/Documentation/Docs/Units/ClipperLib/Classes/ClipperOffset/_Body.htm136
-rw-r--r--upstream/clipper-6.4.2/Documentation/Docs/Units/ClipperLib/Classes/PolyNode/Methods/GetNext.htm97
-rw-r--r--upstream/clipper-6.4.2/Documentation/Docs/Units/ClipperLib/Classes/PolyNode/Properties/ChildCount.htm74
-rw-r--r--upstream/clipper-6.4.2/Documentation/Docs/Units/ClipperLib/Classes/PolyNode/Properties/Childs.htm75
-rw-r--r--upstream/clipper-6.4.2/Documentation/Docs/Units/ClipperLib/Classes/PolyNode/Properties/Contour.htm69
-rw-r--r--upstream/clipper-6.4.2/Documentation/Docs/Units/ClipperLib/Classes/PolyNode/Properties/IsHole.htm72
-rw-r--r--upstream/clipper-6.4.2/Documentation/Docs/Units/ClipperLib/Classes/PolyNode/Properties/IsOpen.htm72
-rw-r--r--upstream/clipper-6.4.2/Documentation/Docs/Units/ClipperLib/Classes/PolyNode/Properties/Parent.htm69
-rw-r--r--upstream/clipper-6.4.2/Documentation/Docs/Units/ClipperLib/Classes/PolyNode/_Body.htm125
-rw-r--r--upstream/clipper-6.4.2/Documentation/Docs/Units/ClipperLib/Classes/PolyTree/Methods/Clear.htm73
-rw-r--r--upstream/clipper-6.4.2/Documentation/Docs/Units/ClipperLib/Classes/PolyTree/Methods/GetFirst.htm77
-rw-r--r--upstream/clipper-6.4.2/Documentation/Docs/Units/ClipperLib/Classes/PolyTree/Properties/Total.htm74
-rw-r--r--upstream/clipper-6.4.2/Documentation/Docs/Units/ClipperLib/Classes/PolyTree/_Body.htm189
-rw-r--r--upstream/clipper-6.4.2/Documentation/Docs/Units/ClipperLib/Functions/Area.htm72
-rw-r--r--upstream/clipper-6.4.2/Documentation/Docs/Units/ClipperLib/Functions/CleanPolygon.htm88
-rw-r--r--upstream/clipper-6.4.2/Documentation/Docs/Units/ClipperLib/Functions/CleanPolygons.htm87
-rw-r--r--upstream/clipper-6.4.2/Documentation/Docs/Units/ClipperLib/Functions/ClosedPathsFromPolyTree.htm71
-rw-r--r--upstream/clipper-6.4.2/Documentation/Docs/Units/ClipperLib/Functions/MinkowskiDiff.htm74
-rw-r--r--upstream/clipper-6.4.2/Documentation/Docs/Units/ClipperLib/Functions/MinkowskiSum.htm101
-rw-r--r--upstream/clipper-6.4.2/Documentation/Docs/Units/ClipperLib/Functions/OffsetPaths.htm70
-rw-r--r--upstream/clipper-6.4.2/Documentation/Docs/Units/ClipperLib/Functions/OpenPathsFromPolyTree.htm71
-rw-r--r--upstream/clipper-6.4.2/Documentation/Docs/Units/ClipperLib/Functions/Orientation.htm92
-rw-r--r--upstream/clipper-6.4.2/Documentation/Docs/Units/ClipperLib/Functions/PointInPolygon.htm72
-rw-r--r--upstream/clipper-6.4.2/Documentation/Docs/Units/ClipperLib/Functions/PolyTreeToPaths.htm71
-rw-r--r--upstream/clipper-6.4.2/Documentation/Docs/Units/ClipperLib/Functions/ReversePath.htm71
-rw-r--r--upstream/clipper-6.4.2/Documentation/Docs/Units/ClipperLib/Functions/ReversePaths.htm70
-rw-r--r--upstream/clipper-6.4.2/Documentation/Docs/Units/ClipperLib/Functions/SimplifyPolygon.htm75
-rw-r--r--upstream/clipper-6.4.2/Documentation/Docs/Units/ClipperLib/Functions/SimplifyPolygons.htm76
-rw-r--r--upstream/clipper-6.4.2/Documentation/Docs/Units/ClipperLib/Types/CInt.htm70
-rw-r--r--upstream/clipper-6.4.2/Documentation/Docs/Units/ClipperLib/Types/ClipType.htm100
-rw-r--r--upstream/clipper-6.4.2/Documentation/Docs/Units/ClipperLib/Types/EndType.htm88
-rw-r--r--upstream/clipper-6.4.2/Documentation/Docs/Units/ClipperLib/Types/InitOptions.htm75
-rw-r--r--upstream/clipper-6.4.2/Documentation/Docs/Units/ClipperLib/Types/IntPoint.htm73
-rw-r--r--upstream/clipper-6.4.2/Documentation/Docs/Units/ClipperLib/Types/IntRect.htm69
-rw-r--r--upstream/clipper-6.4.2/Documentation/Docs/Units/ClipperLib/Types/JoinType.htm78
-rw-r--r--upstream/clipper-6.4.2/Documentation/Docs/Units/ClipperLib/Types/Path.htm69
-rw-r--r--upstream/clipper-6.4.2/Documentation/Docs/Units/ClipperLib/Types/Paths.htm76
-rw-r--r--upstream/clipper-6.4.2/Documentation/Docs/Units/ClipperLib/Types/PolyFillType.htm83
-rw-r--r--upstream/clipper-6.4.2/Documentation/Docs/Units/ClipperLib/Types/PolyType.htm73
-rw-r--r--upstream/clipper-6.4.2/Documentation/Docs/Units/ClipperLib/Types/ZFillCallback.htm71
-rw-r--r--upstream/clipper-6.4.2/Documentation/Docs/Units/ClipperLib/_Body.htm188
-rw-r--r--upstream/clipper-6.4.2/Documentation/Docs/_Body.htm168
-rw-r--r--upstream/clipper-6.4.2/Documentation/Images/_BranchEmpty.gifbin0 -> 56 bytes
-rw-r--r--upstream/clipper-6.4.2/Documentation/Images/_BranchRight.gifbin0 -> 62 bytes
-rw-r--r--upstream/clipper-6.4.2/Documentation/Images/_BranchVert.gifbin0 -> 64 bytes
-rw-r--r--upstream/clipper-6.4.2/Documentation/Images/_BranchVertRight.gifbin0 -> 65 bytes
-rw-r--r--upstream/clipper-6.4.2/Documentation/Images/_Class.gifbin0 -> 118 bytes
-rw-r--r--upstream/clipper-6.4.2/Documentation/Images/_Home.gifbin0 -> 125 bytes
-rw-r--r--upstream/clipper-6.4.2/Documentation/Images/_Project_Logo.gifbin0 -> 1589 bytes
-rw-r--r--upstream/clipper-6.4.2/Documentation/Images/_Unit.gifbin0 -> 171 bytes
-rw-r--r--upstream/clipper-6.4.2/Documentation/Images/_buttons.gifbin0 -> 311 bytes
-rw-r--r--upstream/clipper-6.4.2/Documentation/Images/clean1.pngbin0 -> 1303 bytes
-rw-r--r--upstream/clipper-6.4.2/Documentation/Images/clean2.pngbin0 -> 2235 bytes
-rw-r--r--upstream/clipper-6.4.2/Documentation/Images/clipper_rounding.pngbin0 -> 10568 bytes
-rw-r--r--upstream/clipper-6.4.2/Documentation/Images/clipper_rounding2.pngbin0 -> 21776 bytes
-rw-r--r--upstream/clipper-6.4.2/Documentation/Images/clipper_rounding3.pngbin0 -> 8120 bytes
-rw-r--r--upstream/clipper-6.4.2/Documentation/Images/clipper_rounding4.pngbin0 -> 5043 bytes
-rw-r--r--upstream/clipper-6.4.2/Documentation/Images/cliptype.pngbin0 -> 4267 bytes
-rw-r--r--upstream/clipper-6.4.2/Documentation/Images/common_edges.pngbin0 -> 66132 bytes
-rw-r--r--upstream/clipper-6.4.2/Documentation/Images/difference.pngbin0 -> 3873 bytes
-rw-r--r--upstream/clipper-6.4.2/Documentation/Images/endtypes1.pngbin0 -> 3259 bytes
-rw-r--r--upstream/clipper-6.4.2/Documentation/Images/endtypes2.pngbin0 -> 2832 bytes
-rw-r--r--upstream/clipper-6.4.2/Documentation/Images/evenodd.pngbin0 -> 2985 bytes
-rw-r--r--upstream/clipper-6.4.2/Documentation/Images/int.pngbin0 -> 69459 bytes
-rw-r--r--upstream/clipper-6.4.2/Documentation/Images/intersection.pngbin0 -> 3814 bytes
-rw-r--r--upstream/clipper-6.4.2/Documentation/Images/jointypes.pngbin0 -> 5656 bytes
-rw-r--r--upstream/clipper-6.4.2/Documentation/Images/kangaroo_small.pngbin0 -> 44887 bytes
-rw-r--r--upstream/clipper-6.4.2/Documentation/Images/line_clipping.pngbin0 -> 40765 bytes
-rw-r--r--upstream/clipper-6.4.2/Documentation/Images/line_clipping2.pngbin0 -> 25061 bytes
-rw-r--r--upstream/clipper-6.4.2/Documentation/Images/linesdemo.pngbin0 -> 42798 bytes
-rw-r--r--upstream/clipper-6.4.2/Documentation/Images/minkowski.pngbin0 -> 2489 bytes
-rw-r--r--upstream/clipper-6.4.2/Documentation/Images/minkowski2.pngbin0 -> 2248 bytes
-rw-r--r--upstream/clipper-6.4.2/Documentation/Images/miterlimit.pngbin0 -> 2204 bytes
-rw-r--r--upstream/clipper-6.4.2/Documentation/Images/negative.pngbin0 -> 2738 bytes
-rw-r--r--upstream/clipper-6.4.2/Documentation/Images/nonzero.pngbin0 -> 2966 bytes
-rw-r--r--upstream/clipper-6.4.2/Documentation/Images/offset1.pngbin0 -> 16245 bytes
-rw-r--r--upstream/clipper-6.4.2/Documentation/Images/orientation.pngbin0 -> 3199 bytes
-rw-r--r--upstream/clipper-6.4.2/Documentation/Images/polytree.pngbin0 -> 5717 bytes
-rw-r--r--upstream/clipper-6.4.2/Documentation/Images/positive.pngbin0 -> 3000 bytes
-rw-r--r--upstream/clipper-6.4.2/Documentation/Images/sample1.pngbin0 -> 17499 bytes
-rw-r--r--upstream/clipper-6.4.2/Documentation/Images/simplify.pngbin0 -> 5336 bytes
-rw-r--r--upstream/clipper-6.4.2/Documentation/Images/simplify2.pngbin0 -> 12488 bytes
-rw-r--r--upstream/clipper-6.4.2/Documentation/Images/simplify3.pngbin0 -> 9373 bytes
-rw-r--r--upstream/clipper-6.4.2/Documentation/Images/union.pngbin0 -> 3874 bytes
-rw-r--r--upstream/clipper-6.4.2/Documentation/Images/winding_number.pngbin0 -> 7913 bytes
-rw-r--r--upstream/clipper-6.4.2/Documentation/Images/wn.pngbin0 -> 504 bytes
-rw-r--r--upstream/clipper-6.4.2/Documentation/Images/xor.pngbin0 -> 4151 bytes
-rw-r--r--upstream/clipper-6.4.2/Documentation/Images/zfill.pngbin0 -> 5762 bytes
-rw-r--r--upstream/clipper-6.4.2/Documentation/Scripts/SyntaxHighlighter/compass/_theme_template.scss120
-rw-r--r--upstream/clipper-6.4.2/Documentation/Scripts/SyntaxHighlighter/compass/config.rb14
-rw-r--r--upstream/clipper-6.4.2/Documentation/Scripts/SyntaxHighlighter/compass/shCore.scss216
-rw-r--r--upstream/clipper-6.4.2/Documentation/Scripts/SyntaxHighlighter/compass/shCoreDefault.scss2
-rw-r--r--upstream/clipper-6.4.2/Documentation/Scripts/SyntaxHighlighter/compass/shCoreDjango.scss2
-rw-r--r--upstream/clipper-6.4.2/Documentation/Scripts/SyntaxHighlighter/compass/shCoreEclipse.scss2
-rw-r--r--upstream/clipper-6.4.2/Documentation/Scripts/SyntaxHighlighter/compass/shCoreEmacs.scss2
-rw-r--r--upstream/clipper-6.4.2/Documentation/Scripts/SyntaxHighlighter/compass/shCoreFadeToGrey.scss2
-rw-r--r--upstream/clipper-6.4.2/Documentation/Scripts/SyntaxHighlighter/compass/shCoreMDUltra.scss2
-rw-r--r--upstream/clipper-6.4.2/Documentation/Scripts/SyntaxHighlighter/compass/shCoreMidnight.scss2
-rw-r--r--upstream/clipper-6.4.2/Documentation/Scripts/SyntaxHighlighter/compass/shCoreRDark.scss2
-rw-r--r--upstream/clipper-6.4.2/Documentation/Scripts/SyntaxHighlighter/compass/shThemeDefault.scss7
-rw-r--r--upstream/clipper-6.4.2/Documentation/Scripts/SyntaxHighlighter/compass/shThemeDjango.scss36
-rw-r--r--upstream/clipper-6.4.2/Documentation/Scripts/SyntaxHighlighter/compass/shThemeEclipse.scss48
-rw-r--r--upstream/clipper-6.4.2/Documentation/Scripts/SyntaxHighlighter/compass/shThemeEmacs.scss32
-rw-r--r--upstream/clipper-6.4.2/Documentation/Scripts/SyntaxHighlighter/compass/shThemeFadeToGrey.scss36
-rw-r--r--upstream/clipper-6.4.2/Documentation/Scripts/SyntaxHighlighter/compass/shThemeMDUltra.scss32
-rw-r--r--upstream/clipper-6.4.2/Documentation/Scripts/SyntaxHighlighter/compass/shThemeMidnight.scss32
-rw-r--r--upstream/clipper-6.4.2/Documentation/Scripts/SyntaxHighlighter/compass/shThemeRDark.scss32
-rw-r--r--upstream/clipper-6.4.2/Documentation/Scripts/SyntaxHighlighter/index.html22
-rw-r--r--upstream/clipper-6.4.2/Documentation/Scripts/SyntaxHighlighter/scripts/shAutoloader.js17
-rw-r--r--upstream/clipper-6.4.2/Documentation/Scripts/SyntaxHighlighter/scripts/shBrushAS3.js59
-rw-r--r--upstream/clipper-6.4.2/Documentation/Scripts/SyntaxHighlighter/scripts/shBrushAppleScript.js75
-rw-r--r--upstream/clipper-6.4.2/Documentation/Scripts/SyntaxHighlighter/scripts/shBrushBash.js59
-rw-r--r--upstream/clipper-6.4.2/Documentation/Scripts/SyntaxHighlighter/scripts/shBrushCSharp.js70
-rw-r--r--upstream/clipper-6.4.2/Documentation/Scripts/SyntaxHighlighter/scripts/shBrushColdFusion.js100
-rw-r--r--upstream/clipper-6.4.2/Documentation/Scripts/SyntaxHighlighter/scripts/shBrushCpp.js97
-rw-r--r--upstream/clipper-6.4.2/Documentation/Scripts/SyntaxHighlighter/scripts/shBrushCss.js91
-rw-r--r--upstream/clipper-6.4.2/Documentation/Scripts/SyntaxHighlighter/scripts/shBrushDelphi.js55
-rw-r--r--upstream/clipper-6.4.2/Documentation/Scripts/SyntaxHighlighter/scripts/shBrushDiff.js41
-rw-r--r--upstream/clipper-6.4.2/Documentation/Scripts/SyntaxHighlighter/scripts/shBrushErlang.js52
-rw-r--r--upstream/clipper-6.4.2/Documentation/Scripts/SyntaxHighlighter/scripts/shBrushGroovy.js67
-rw-r--r--upstream/clipper-6.4.2/Documentation/Scripts/SyntaxHighlighter/scripts/shBrushJScript.js52
-rw-r--r--upstream/clipper-6.4.2/Documentation/Scripts/SyntaxHighlighter/scripts/shBrushJava.js57
-rw-r--r--upstream/clipper-6.4.2/Documentation/Scripts/SyntaxHighlighter/scripts/shBrushJavaFX.js58
-rw-r--r--upstream/clipper-6.4.2/Documentation/Scripts/SyntaxHighlighter/scripts/shBrushPerl.js72
-rw-r--r--upstream/clipper-6.4.2/Documentation/Scripts/SyntaxHighlighter/scripts/shBrushPhp.js88
-rw-r--r--upstream/clipper-6.4.2/Documentation/Scripts/SyntaxHighlighter/scripts/shBrushPlain.js33
-rw-r--r--upstream/clipper-6.4.2/Documentation/Scripts/SyntaxHighlighter/scripts/shBrushPowerShell.js74
-rw-r--r--upstream/clipper-6.4.2/Documentation/Scripts/SyntaxHighlighter/scripts/shBrushPython.js64
-rw-r--r--upstream/clipper-6.4.2/Documentation/Scripts/SyntaxHighlighter/scripts/shBrushRuby.js55
-rw-r--r--upstream/clipper-6.4.2/Documentation/Scripts/SyntaxHighlighter/scripts/shBrushSass.js94
-rw-r--r--upstream/clipper-6.4.2/Documentation/Scripts/SyntaxHighlighter/scripts/shBrushScala.js51
-rw-r--r--upstream/clipper-6.4.2/Documentation/Scripts/SyntaxHighlighter/scripts/shBrushSql.js66
-rw-r--r--upstream/clipper-6.4.2/Documentation/Scripts/SyntaxHighlighter/scripts/shBrushVb.js56
-rw-r--r--upstream/clipper-6.4.2/Documentation/Scripts/SyntaxHighlighter/scripts/shBrushXml.js69
-rw-r--r--upstream/clipper-6.4.2/Documentation/Scripts/SyntaxHighlighter/scripts/shCore.js17
-rw-r--r--upstream/clipper-6.4.2/Documentation/Scripts/SyntaxHighlighter/scripts/shLegacy.js17
-rw-r--r--upstream/clipper-6.4.2/Documentation/Scripts/SyntaxHighlighter/src/shAutoloader.js130
-rw-r--r--upstream/clipper-6.4.2/Documentation/Scripts/SyntaxHighlighter/src/shCore.js1721
-rw-r--r--upstream/clipper-6.4.2/Documentation/Scripts/SyntaxHighlighter/src/shLegacy.js157
-rw-r--r--upstream/clipper-6.4.2/Documentation/Scripts/SyntaxHighlighter/styles/shCore.css226
-rw-r--r--upstream/clipper-6.4.2/Documentation/Scripts/SyntaxHighlighter/styles/shCoreDefault.css328
-rw-r--r--upstream/clipper-6.4.2/Documentation/Scripts/SyntaxHighlighter/styles/shCoreDjango.css331
-rw-r--r--upstream/clipper-6.4.2/Documentation/Scripts/SyntaxHighlighter/styles/shCoreEclipse.css339
-rw-r--r--upstream/clipper-6.4.2/Documentation/Scripts/SyntaxHighlighter/styles/shCoreEmacs.css324
-rw-r--r--upstream/clipper-6.4.2/Documentation/Scripts/SyntaxHighlighter/styles/shCoreFadeToGrey.css328
-rw-r--r--upstream/clipper-6.4.2/Documentation/Scripts/SyntaxHighlighter/styles/shCoreMDUltra.css324
-rw-r--r--upstream/clipper-6.4.2/Documentation/Scripts/SyntaxHighlighter/styles/shCoreMidnight.css324
-rw-r--r--upstream/clipper-6.4.2/Documentation/Scripts/SyntaxHighlighter/styles/shCoreRDark.css324
-rw-r--r--upstream/clipper-6.4.2/Documentation/Scripts/SyntaxHighlighter/styles/shThemeDefault.css119
-rw-r--r--upstream/clipper-6.4.2/Documentation/Scripts/SyntaxHighlighter/styles/shThemeDjango.css120
-rw-r--r--upstream/clipper-6.4.2/Documentation/Scripts/SyntaxHighlighter/styles/shThemeEclipse.css128
-rw-r--r--upstream/clipper-6.4.2/Documentation/Scripts/SyntaxHighlighter/styles/shThemeEmacs.css113
-rw-r--r--upstream/clipper-6.4.2/Documentation/Scripts/SyntaxHighlighter/styles/shThemeFadeToGrey.css117
-rw-r--r--upstream/clipper-6.4.2/Documentation/Scripts/SyntaxHighlighter/styles/shThemeMDUltra.css113
-rw-r--r--upstream/clipper-6.4.2/Documentation/Scripts/SyntaxHighlighter/styles/shThemeMidnight.css113
-rw-r--r--upstream/clipper-6.4.2/Documentation/Scripts/SyntaxHighlighter/styles/shThemeRDark.css113
-rw-r--r--upstream/clipper-6.4.2/Documentation/Scripts/bootstrap.js2
-rw-r--r--upstream/clipper-6.4.2/Documentation/Scripts/expandable.js190
-rw-r--r--upstream/clipper-6.4.2/Documentation/Scripts/menu_data.js21
-rw-r--r--upstream/clipper-6.4.2/Documentation/Scripts/menu_script.js130
-rw-r--r--upstream/clipper-6.4.2/Documentation/Styles/default.css304
-rw-r--r--upstream/clipper-6.4.2/Documentation/clipper.chmbin0 -> 528964 bytes
-rw-r--r--upstream/clipper-6.4.2/Documentation/default.css304
-rw-r--r--upstream/clipper-6.4.2/Documentation/index.htm12
-rw-r--r--upstream/clipper-6.4.2/Documentation/offset_triginometry.svg42
-rw-r--r--upstream/clipper-6.4.2/Documentation/offset_triginometry2.svg28
-rw-r--r--upstream/clipper-6.4.2/Documentation/offset_triginometry3.svg391
-rw-r--r--upstream/clipper-6.4.2/License.txt24
-rw-r--r--upstream/clipper-6.4.2/README413
-rw-r--r--upstream/clipper-6.4.2/cpp/CMakeLists.txt21
-rw-r--r--upstream/clipper-6.4.2/cpp/clipper.cpp4629
-rw-r--r--upstream/clipper-6.4.2/cpp/clipper.hpp406
-rw-r--r--upstream/clipper-6.4.2/cpp/cpp_cairo/Cairo Resources.txt6
-rw-r--r--upstream/clipper-6.4.2/cpp/cpp_cairo/cairo.sln20
-rw-r--r--upstream/clipper-6.4.2/cpp/cpp_cairo/cairo.vcxproj93
-rw-r--r--upstream/clipper-6.4.2/cpp/cpp_cairo/cairo_clipper.cpp133
-rw-r--r--upstream/clipper-6.4.2/cpp/cpp_cairo/cairo_clipper.hpp59
-rw-r--r--upstream/clipper-6.4.2/cpp/cpp_cairo/cairo_clipper.obin0 -> 226800 bytes
-rw-r--r--upstream/clipper-6.4.2/cpp/cpp_cairo/libcairo-2.libbin0 -> 83700 bytes
-rw-r--r--upstream/clipper-6.4.2/cpp/cpp_cairo/main.cpp182
-rw-r--r--upstream/clipper-6.4.2/cpp/polyclipping.pc.cmakein13
m---------upstream/cpp-base640
m---------upstream/poisson-disk-sampling0
m---------upstream/voronoi0
230 files changed, 25002 insertions, 0 deletions
diff --git a/.gitignore b/.gitignore
new file mode 100644
index 0000000..378eac2
--- /dev/null
+++ b/.gitignore
@@ -0,0 +1 @@
+build
diff --git a/.gitmodules b/.gitmodules
new file mode 100644
index 0000000..01440f9
--- /dev/null
+++ b/.gitmodules
@@ -0,0 +1,9 @@
+[submodule "upstream/cpp-base64"]
+ path = upstream/cpp-base64
+ url = https://github.com/ReneNyffenegger/cpp-base64
+[submodule "upstream/voronoi"]
+ path = upstream/voronoi
+ url = https://github.com/JCash/voronoi
+[submodule "upstream/poisson-disk-sampling"]
+ path = upstream/poisson-disk-sampling
+ url = https://github.com/thinks/poisson-disk-sampling
diff --git a/Makefile b/Makefile
new file mode 100644
index 0000000..062c50e
--- /dev/null
+++ b/Makefile
@@ -0,0 +1,45 @@
+
+CXX := clang
+LD := ld
+PKG_CONFIG ?= pkg-config
+
+BUILDDIR ?= build
+
+SOURCES := src/svg_color.cpp \
+ src/svg_doc.cpp \
+ src/svg_geom.cpp \
+ src/svg_import_util.cpp \
+ src/svg_path.cpp \
+ src/svg_pattern.cpp \
+ src/vec_core.cpp \
+ src/vec_grid.cpp
+
+CLIPPER_SOURCES := upstream/clipper-6.4.2/cpp/clipper.cpp upstream/clipper-6.4.2/cpp/cpp_cairo/cairo_clipper.cpp
+CLIPPER_INCLUDES := -Iupstream/clipper-6.4.2/cpp -Iupstream/clipper-6.4.2/cpp/cpp_cairo/
+VORONOI_INCLUDES := -Iupstream/voronoi/src
+POISSON_INCLUDES := -Iupstream/poisson-disk-sampling/thinks/poisson_disk_sampling/
+BASE64_INCLUDES := -Iupstream/cpp-base64
+INCLUDES := $(CLIPPER_INCLUDES) $(VORONOI_INCLUDES) $(POISSON_INCLUDES) $(BASE64_INCLUDES)
+
+CXXFLAGS := -std=c++2a -g -Wall -Wextra
+CXXFLAGS += $(shell $(PKG_CONFIG) --cflags pangocairo pugixml opencv4)
+
+LDFLAGS := -lm -lc -lstdc++
+LDFLAGS += $(shell $(PKG_CONFIG) --libs pangocairo pugixml opencv4)
+
+all: $(BUILDDIR)/svg-render
+
+test.gbr test.svg &: render
+ ./render test.svg > test.gbr
+
+$(BUILDDIR)/%.o: %.cpp
+ @mkdir -p $(dir $@)
+ $(CXX) -c $(CXXFLAGS) $(CXXFLAGS) $(INCLUDES) -o $@ $^
+
+$(BUILDDIR)/svg-render: $(SOURCES:%.cpp=$(BUILDDIR)/%.o) $(BUILDDIR)/upstream/cpp-base64/base64.o $(CLIPPER_SOURCES:.cpp=.o)
+ @mkdir -p $(dir $@)
+ $(CXX) $(CXXFLAGS) $(LDFLAGS) -o $@ $^
+
+.PHONY: clean
+clean:
+ rm -rf $(BUILDDIR)
diff --git a/src/svg_color.cpp b/src/svg_color.cpp
new file mode 100644
index 0000000..acd793d
--- /dev/null
+++ b/src/svg_color.cpp
@@ -0,0 +1,125 @@
+/*
+ * This program source code file is part of KICAD, a free EDA CAD application.
+ *
+ * Copyright (C) 2021 Jan Sebastian Götte <kicad@jaseg.de>
+ * Copyright (C) 2021 KiCad Developers, see AUTHORS.txt for contributors.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, you may find one here:
+ * http://www.gnu.org/licenses/old-licenses/gpl-2.0.html
+ * or you may search the http://www.gnu.org website for the version 2 license,
+ * or you may write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
+ */
+
+#include "svg_color.h"
+
+#include <assert.h>
+#include <string>
+#include <cmath>
+
+using namespace svg_plugin;
+using namespace std;
+
+/* Map an SVG fill or stroke definition (color, but may also be a pattern) to a gerber color.
+ *
+ * This function handles transparency: Transparent SVG colors are mapped such that no gerber output is generated for
+ * them.
+ */
+enum gerber_color svg_plugin::svg_color_to_gerber(string color, string opacity, enum gerber_color default_val) {
+ float alpha = 1.0;
+ if (!opacity.empty() && opacity[0] != '\0') {
+ char *endptr = nullptr;
+ alpha = strtof(opacity.data(), &endptr);
+ assert(endptr);
+ assert(*endptr == '\0');
+ }
+
+ if (alpha < 0.5f) {
+ return GRB_NONE;
+ }
+
+ if (color.empty()) {
+ return default_val;
+ }
+
+ if (color == "none") {
+ return GRB_NONE;
+ }
+
+ if (color.rfind("url(#", 0) != string::npos) {
+ return GRB_PATTERN_FILL;
+ }
+
+ if (color.length() == 7 && color[0] == '#') {
+ HSVColor hsv(color);
+ if (hsv.v >= 0.5) {
+ return GRB_CLEAR;
+ }
+ }
+
+ return GRB_DARK;
+}
+
+svg_plugin::RGBColor::RGBColor(string hex) {
+ assert(hex[0] == '#');
+ char *endptr = nullptr;
+ const char *c = hex.data();
+ int rgb = strtol(c + 1, &endptr, 16);
+ assert(endptr);
+ assert(endptr == c + 7);
+ assert(*endptr == '\0');
+ r = ((rgb >> 16) & 0xff) / 255.0f;
+ g = ((rgb >> 8) & 0xff) / 255.0f;
+ b = ((rgb >> 0) & 0xff) / 255.0f;
+};
+
+svg_plugin::HSVColor::HSVColor(const RGBColor &color) {
+ float xmax = fmax(color.r, fmax(color.g, color.b));
+ float xmin = fmin(color.r, fmin(color.g, color.b));
+ float c = xmax - xmin;
+
+ v = xmax;
+
+ if (c == 0)
+ h = 0;
+ else if (v == color.r)
+ h = 1/3 * (0 + (color.g - color.b) / c);
+ else if (v == color.g)
+ h = 1/3 * (2 + (color.b - color.r) / c);
+ else // v == color.b
+ h = 1/3 * (4 + (color.r - color.g) / c);
+
+ s = (v == 0) ? 0 : (c/v);
+}
+
+/* Invert gerber color */
+enum gerber_color svg_plugin::gerber_color_invert(enum gerber_color color) {
+ switch (color) {
+ case GRB_CLEAR: return GRB_DARK;
+ case GRB_DARK: return GRB_CLEAR;
+ default: return color; /* none, pattern */
+ }
+}
+
+/* Read node's fill attribute and convert it to a gerber color */
+enum gerber_color svg_plugin::gerber_fill_color(const pugi::xml_node &node) {
+ return svg_color_to_gerber(node.attribute("fill").value(), node.attribute("fill-opacity").value(), GRB_DARK);
+}
+
+/* Read node's stroke attribute and convert it to a gerber color */
+enum gerber_color svg_plugin::gerber_stroke_color(const pugi::xml_node &node) {
+ return svg_color_to_gerber(node.attribute("stroke").value(), node.attribute("stroke-opacity").value(), GRB_NONE);
+}
+
+
diff --git a/src/svg_color.h b/src/svg_color.h
new file mode 100644
index 0000000..5183dab
--- /dev/null
+++ b/src/svg_color.h
@@ -0,0 +1,59 @@
+/*
+ * This program source code file is part of KICAD, a free EDA CAD application.
+ *
+ * Copyright (C) 2021 Jan Sebastian Götte <kicad@jaseg.de>
+ * Copyright (C) 2021 KiCad Developers, see AUTHORS.txt for contributors.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, you may find one here:
+ * http://www.gnu.org/licenses/old-licenses/gpl-2.0.html
+ * or you may search the http://www.gnu.org website for the version 2 license,
+ * or you may write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
+ */
+
+#ifndef SVG_COLOR_H
+#define SVG_COLOR_H
+
+#include <pugixml.hpp>
+
+namespace svg_plugin {
+
+/* Enum that describes the color with which an SVG primite should be exported */
+enum gerber_color {
+ GRB_NONE = 0,
+ GRB_CLEAR,
+ GRB_DARK,
+ GRB_PATTERN_FILL,
+};
+
+class RGBColor {
+public:
+ float r, g, b;
+ RGBColor(std::string hex);
+};
+
+class HSVColor {
+public:
+ float h, s, v;
+ HSVColor(const RGBColor &color);
+};
+
+enum gerber_color svg_color_to_gerber(std::string color, std::string opacity, enum gerber_color default_val);
+enum gerber_color gerber_color_invert(enum gerber_color color);
+enum gerber_color gerber_fill_color(const pugi::xml_node &node);
+enum gerber_color gerber_stroke_color(const pugi::xml_node &node);
+
+} /* namespace svg_plugin */
+
+#endif /* SVG_COLOR_H */
diff --git a/src/svg_doc.cpp b/src/svg_doc.cpp
new file mode 100644
index 0000000..2543146
--- /dev/null
+++ b/src/svg_doc.cpp
@@ -0,0 +1,462 @@
+/*
+ * This program source code file is part of KICAD, a free EDA CAD application.
+ *
+ * Copyright (C) 2021 Jan Sebastian Götte <kicad@jaseg.de>
+ * Copyright (C) 2021 KiCad Developers, see AUTHORS.txt for contributors.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, you may find one here:
+ * http://www.gnu.org/licenses/old-licenses/gpl-2.0.html
+ * or you may search the http://www.gnu.org website for the version 2 license,
+ * or you may write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
+ */
+
+#include "svg_import_defs.h"
+#include "svg_doc.h"
+#include "svg_color.h"
+#include "svg_geom.h"
+#include "svg_path.h"
+#include "vec_core.h"
+
+using namespace svg_plugin;
+using namespace std;
+using namespace ClipperLib;
+using namespace vectorizer;
+
+svg_plugin::SVGDocument::~SVGDocument() {
+ if (cr)
+ cairo_destroy (cr);
+ if (surface)
+ cairo_surface_destroy (surface);
+}
+
+bool svg_plugin::SVGDocument::load(string filename, string debug_out_filename) {
+ /* Load XML document */
+ auto res = svg_doc.load_file(filename.c_str());
+ if (!res) {
+ cerr << "Cannot open input file \"" << filename << "\": " << res << endl;
+ return false;
+ }
+
+ root_elem = svg_doc.child("svg");
+ if (!root_elem) {
+ cerr << "Cannot load input file \"" << filename << endl;
+ return false;
+ }
+
+ /* Set up the document's viewport transform */
+ istringstream vb_stream(root_elem.attribute("viewBox").value());
+ vb_stream >> vb_x >> vb_y >> vb_w >> vb_h;
+ cerr << "loaded viewbox: " << vb_x << ", " << vb_y << ", " << vb_w << ", " << vb_h << endl;
+
+ page_w = usvg_double_attr(root_elem, "width");
+ page_h = usvg_double_attr(root_elem, "height");
+ /* usvg resolves all units, but instead of outputting some reasonable absolute length like mm, it converts
+ * everything to px, which depends on usvg's DPI setting (--dpi).
+ */
+ page_w_mm = page_w / assumed_usvg_dpi * 25.4;
+ page_h_mm = page_h / assumed_usvg_dpi * 25.4;
+ if (!(page_w_mm > 0.0 && page_h_mm > 0.0 && page_w_mm < 10e3 && page_h_mm < 10e3)) {
+ cerr << "Warning: Page has zero or negative size, or is larger than 10 x 10 meters! Parsed size: " << page_w << " x " << page_h << " millimeter" << endl;
+ }
+
+ if (fabs((vb_w / page_w) / (vb_h / page_h) - 1.0) > 0.001) {
+ cerr << "Warning: Document has different document unit scale in x and y direction! Output will likely be garbage!" << endl;
+ }
+
+ /* Get the one document defs element */
+ defs_node = root_elem.child("defs");
+ if (!defs_node) {
+ cerr << "Warning: Input file is missing <defs> node" << endl;
+ }
+
+ setup_debug_output(debug_out_filename);
+ setup_viewport_clip();
+ load_clips();
+ load_patterns();
+
+ _valid = true;
+ return true;
+}
+
+const Paths *svg_plugin::SVGDocument::lookup_clip_path(const pugi::xml_node &node) {
+ string id(usvg_id_url(node.attribute("clip-path").value()));
+ if (id.empty() || !clip_path_map.contains(id)) {
+ return nullptr;
+ }
+ return &clip_path_map[id];
+}
+
+Pattern *svg_plugin::SVGDocument::lookup_pattern(const string id) {
+ if (id.empty() || !pattern_map.contains(id)) {
+ return nullptr;
+ }
+ return &pattern_map[id];
+};
+
+/* Used to convert mm values from configuration such as the minimum feature size into document units. */
+double svg_plugin::SVGDocument::mm_to_doc_units(double mm) const {
+ return mm * (vb_w / page_w_mm);
+}
+
+double svg_plugin::SVGDocument::doc_units_to_mm(double px) const {
+ return px / (vb_w / page_w_mm);
+}
+
+/* Recursively export all SVG elements in the given group. */
+void svg_plugin::SVGDocument::export_svg_group(const pugi::xml_node &group, Paths &parent_clip_path) {
+ /* Enter the group's coordinate system */
+ cairo_save(cr);
+ apply_cairo_transform_from_svg(cr, group.attribute("transform").value());
+
+ /* Fetch clip path from global registry and transform it into document coordinates. */
+ Paths clip_path;
+ auto *lookup = lookup_clip_path(group);
+ if (!lookup) {
+ string id(usvg_id_url(group.attribute("clip-path").value()));
+ if (!id.empty()) {
+ cerr << "Warning: Cannot find clip path with ID \"" << group.attribute("clip-path").value() << "\" for group \"" << group.attribute("id").value() << "\"." << endl;
+ }
+
+ } else {
+ clip_path = *lookup;
+ }
+ transform_paths(cr, clip_path);
+
+ /* Clip against parent's clip path (both are now in document coordinates) */
+ if (!parent_clip_path.empty()) {
+ if (!clip_path.empty()) {
+ cerr << "Combining clip paths" << endl;
+ combine_clip_paths(parent_clip_path, clip_path, clip_path);
+ } else {
+ cerr << "using parent clip path" << endl;
+ clip_path = parent_clip_path;
+ }
+ }
+
+ ClipperLib::Clipper c2;
+ c2.AddPaths(clip_path, ptSubject, /* closed */ true);
+ ClipperLib::IntRect bbox = c2.GetBounds();
+ cerr << "clip path is now: bbox={" << bbox.left << ", " << bbox.top << "} - {" << bbox.right << ", " << bbox.bottom << "}" << endl;
+
+ /* Iterate over the group's children, exporting them one by one. */
+ for (const auto &node : group.children()) {
+ string name(node.name());
+ if (name == "g") {
+ export_svg_group(node, clip_path);
+
+ } else if (name == "path") {
+ export_svg_path(node, clip_path);
+
+ } else if (name == "image") {
+ double min_feature_size_mm = 0.1; /* TODO make configurable */
+ double min_feature_size_px = mm_to_doc_units(min_feature_size_mm);
+ vectorize_image(cr, node, min_feature_size_px, clip_path, viewport_matrix);
+ } else if (name == "defs") {
+ /* ignore */
+ } else {
+ cerr << " Unexpected child: <" << node.name() << ">" << endl;
+ }
+ }
+
+ cairo_restore(cr);
+}
+
+/* Export an SVG path element to gerber. Apply patterns and clip on the fly. */
+void svg_plugin::SVGDocument::export_svg_path(const pugi::xml_node &node, Paths &clip_path) {
+ enum gerber_color fill_color = gerber_fill_color(node);
+ enum gerber_color stroke_color = gerber_stroke_color(node);
+
+ double stroke_width = usvg_double_attr(node, "stroke-width", /* default */ 1.0);
+ assert(stroke_width > 0.0);
+ enum ClipperLib::EndType end_type = clipper_end_type(node);
+ enum ClipperLib::JoinType join_type = clipper_join_type(node);
+ vector<double> dasharray;
+ parse_dasharray(node, dasharray);
+ /* TODO add stroke-miterlimit */
+
+ if (!fill_color && !stroke_color) { /* Ignore "transparent" paths */
+ return;
+ }
+
+ /* Load path from SVG path data and transform into document units. */
+ PolyTree ptree;
+ cairo_save(cr);
+ apply_cairo_transform_from_svg(cr, node.attribute("transform").value());
+ load_svg_path(cr, node, ptree);
+ cairo_restore (cr);
+
+ Paths open_paths, closed_paths;
+ OpenPathsFromPolyTree(ptree, open_paths);
+ ClosedPathsFromPolyTree(ptree, closed_paths);
+
+ /* Skip filling for transparent fills */
+ if (fill_color) {
+ /* Clip paths. Consider all paths closed for filling. */
+ if (!clip_path.empty()) {
+ Clipper c;
+ c.AddPaths(open_paths, ptSubject, /* closed */ false);
+ c.AddPaths(closed_paths, ptSubject, /* closed */ true);
+ c.AddPaths(clip_path, ptClip, /* closed */ true);
+ c.StrictlySimple(true);
+ /* fill rules are nonzero since both subject and clip have already been normalized by clipper. */
+ c.Execute(ctIntersection, ptree, pftNonZero, pftNonZero);
+ }
+
+ /* Call out to pattern tiler for pattern fills. The path becomes the clip here. */
+ if (fill_color == GRB_PATTERN_FILL) {
+ string fill_pattern_id = usvg_id_url(node.attribute("fill").value());
+ Pattern *pattern = lookup_pattern(fill_pattern_id);
+ if (!pattern) {
+ cerr << "Warning: Fill pattern with id \"" << fill_pattern_id << "\" not found." << endl;
+
+ } else {
+ Paths clip;
+ PolyTreeToPaths(ptree, clip);
+ pattern->tile(clip);
+ }
+
+ } else { /* solid fill */
+ Paths f_polys;
+ /* Important for gerber spec compliance and also for reliable rendering results irrespective of board house
+ * and gerber viewer. */
+ dehole_polytree(ptree, f_polys);
+
+ /* Export SVG */
+ cairo_save(cr);
+ cairo_set_matrix(cr, &viewport_matrix);
+ cairo_new_path(cr);
+ ClipperLib::cairo::clipper_to_cairo(f_polys, cr, CAIRO_PRECISION, ClipperLib::cairo::tNone);
+ if (fill_color == GRB_DARK) {
+ cairo_set_source_rgba(cr, 0.0, 0.0, 1.0, dbg_fill_alpha);
+ } else { /* GRB_CLEAR */
+ cairo_set_source_rgba(cr, 1.0, 0.0, 0.0, dbg_fill_alpha);
+ }
+ cairo_fill (cr);
+
+ /* export gerber */
+ cairo_identity_matrix(cr);
+ for (const auto &poly : f_polys) {
+ vector<array<double, 2>> out;
+ for (const auto &p : poly)
+ out.push_back(std::array<double, 2>{
+ ((double)p.X) / clipper_scale, ((double)p.Y) / clipper_scale
+ });
+ std::cerr << "calling sink" << std::endl;
+ polygon_sink(out, fill_color == GRB_DARK);
+ }
+ cairo_restore(cr);
+ }
+ }
+
+ if (stroke_color && stroke_width > 0.0) {
+ ClipperOffset offx;
+
+ /* For stroking we have to separately handle open and closed paths */
+ for (const auto &poly : closed_paths) {
+ if (poly.empty()) /* do we need this? */
+ continue;
+
+ /* Special case: A closed path becomes a number of open paths when it is dashed. */
+ if (dasharray.empty()) {
+ offx.AddPath(poly, join_type, etClosedLine);
+
+ } else {
+ Path poly_copy(poly);
+ poly_copy.push_back(poly[0]);
+ Paths out;
+ dash_path(poly_copy, out, dasharray);
+ offx.AddPaths(out, join_type, end_type);
+ }
+ }
+
+ for (const auto &poly : open_paths) {
+ Paths out;
+ dash_path(poly, out, dasharray);
+ offx.AddPaths(out, join_type, end_type);
+ }
+
+ /* Execute clipper offset operation to generate stroke outlines */
+ offx.Execute(ptree, 0.5 * stroke_width * clipper_scale);
+
+ /* Clip. Note that after the outline, all we have is closed paths as any open path's stroke outline is itself
+ * a closed path. */
+ if (!clip_path.empty()) {
+ Clipper c;
+
+ Paths outline_paths;
+ PolyTreeToPaths(ptree, outline_paths);
+ c.AddPaths(outline_paths, ptSubject, /* closed */ true);
+ c.AddPaths(clip_path, ptClip, /* closed */ true);
+ c.StrictlySimple(true);
+ /* fill rules are nonzero since both subject and clip have already been normalized by clipper. */
+ c.Execute(ctIntersection, ptree, pftNonZero, pftNonZero);
+ }
+
+ /* Call out to pattern tiler for pattern strokes. The stroke's outline becomes the clip here. */
+ if (stroke_color == GRB_PATTERN_FILL) {
+ string stroke_pattern_id = usvg_id_url(node.attribute("stroke").value());
+ Pattern *pattern = lookup_pattern(stroke_pattern_id);
+ if (!pattern) {
+ cerr << "Warning: Fill pattern with id \"" << stroke_pattern_id << "\" not found." << endl;
+
+ } else {
+ Paths clip;
+ PolyTreeToPaths(ptree, clip);
+ pattern->tile(clip);
+ }
+
+ } else {
+ Paths s_polys;
+ dehole_polytree(ptree, s_polys);
+
+ /* Export debug svg */
+ cairo_save(cr);
+ cairo_set_matrix(cr, &viewport_matrix);
+ cairo_new_path(cr);
+ ClipperLib::cairo::clipper_to_cairo(s_polys, cr, CAIRO_PRECISION, ClipperLib::cairo::tNone);
+ if (stroke_color == GRB_DARK) {
+ cairo_set_source_rgba(cr, 0.0, 0.0, 1.0, dbg_stroke_alpha);
+ } else { /* GRB_CLEAR */
+ cairo_set_source_rgba(cr, 1.0, 0.0, 0.0, dbg_stroke_alpha);
+ }
+ cairo_fill (cr);
+
+ /* export gerber */
+ cairo_identity_matrix(cr);
+ for (const auto &poly : s_polys) {
+ vector<array<double, 2>> out;
+ for (const auto &p : poly)
+ out.push_back(std::array<double, 2>{
+ ((double)p.X) / clipper_scale, ((double)p.Y) / clipper_scale
+ });
+ std::cerr << "calling sink" << std::endl;
+ polygon_sink(out, stroke_color == GRB_DARK);
+ }
+ cairo_restore(cr);
+ }
+ }
+}
+
+void svg_plugin::SVGDocument::do_export(string debug_out_filename) {
+ assert(_valid);
+ /* Export the actual SVG document to both SVG for debuggin and to gerber. We do this as we go, i.e. we immediately
+ * process each element to gerber as we encounter it instead of first rendering everything to a giant list of gerber
+ * primitives and then serializing those later. Exporting them on the fly saves a ton of memory and is much faster.
+ */
+ ClipperLib::Clipper c;
+ c.AddPaths(vb_paths, ptSubject, /* closed */ true);
+ ClipperLib::IntRect bbox = c.GetBounds();
+ cerr << "document viewbox clip: bbox={" << bbox.left << ", " << bbox.top << "} - {" << bbox.right << ", " << bbox.bottom << "}" << endl;
+ export_svg_group(root_elem, vb_paths);
+}
+
+void svg_plugin::SVGDocument::setup_debug_output(string filename) {
+ /* Setup cairo to draw into a SVG surface (for debugging). For actual rendering, something like a recording surface
+ * would work fine, too. */
+ /* Cairo expects the SVG surface size to be given in pt (72.0 pt = 1.0 in = 25.4 mm) */
+ const char *fn = filename.empty() ? nullptr : filename.c_str();
+ assert (!cr);
+ assert (!surface);
+ surface = cairo_svg_surface_create(fn, page_w_mm / 25.4 * 72.0, page_h_mm / 25.4 * 72.0);
+ cr = cairo_create (surface);
+ /* usvg returns "pixels", cairo thinks we draw "points" at 72.0 pt per inch. */
+ cairo_scale(cr, page_w / vb_w * 72.0 / assumed_usvg_dpi, page_h / vb_h * 72.0 / assumed_usvg_dpi);
+
+ cairo_translate(cr, -vb_x, -vb_y);
+
+ /* Store viewport transform and reset cairo's active transform. We have to do this since we have to render out all
+ * gerber primitives in mm, not px and most gerber primitives we export pass through Cairo at some point.
+ *
+ * We manually apply this viewport transform every time for debugging we actually use Cairo to export SVG. */
+ cairo_get_matrix(cr, &viewport_matrix);
+ cairo_identity_matrix(cr);
+
+ cairo_set_line_width (cr, 0.1);
+ cairo_set_source_rgba (cr, 1.0, 0.0, 0.0, 1.0);
+}
+
+void svg_plugin::SVGDocument::setup_viewport_clip() {
+ /* Set up view port clip path */
+ Path vb_path;
+ for (auto &elem : vector<pair<double, double>> {{vb_x, vb_y}, {vb_x+vb_w, vb_y}, {vb_x+vb_w, vb_y+vb_h}, {vb_x, vb_y+vb_h}}) {
+ double x = elem.first, y = elem.second;
+ vb_path.push_back({ (cInt)round(x * clipper_scale), (cInt)round(y * clipper_scale) });
+ cerr << "adding to path: " << (cInt)round(x * clipper_scale) << ", " << (cInt)round(y * clipper_scale) << endl;
+ }
+ vb_paths.push_back(vb_path);
+
+ ClipperLib::Clipper c;
+ c.AddPaths(vb_paths, ptSubject, /* closed */ true);
+ ClipperLib::IntRect bbox = c.GetBounds();
+ cerr << "did set up viewbox clip: bbox={" << bbox.left << ", " << bbox.top << "} - {" << bbox.right << ", " << bbox.bottom << "}" << endl;
+ export_svg_group(root_elem, vb_paths);
+}
+
+void svg_plugin::SVGDocument::load_patterns() {
+ /* Set up document-wide pattern registry. Load patterns from <defs> node. */
+ for (const auto &node : defs_node.children("pattern")) {
+ pattern_map.emplace(std::piecewise_construct, std::forward_as_tuple(node.attribute("id").value()), std::forward_as_tuple(node, *this));
+ }
+}
+
+void svg_plugin::SVGDocument::load_clips() {
+ /* Set up document-wide clip path registry: Extract clip path definitions from <defs> element */
+ for (const auto &node : defs_node.children("clipPath")) {
+ cairo_save(cr);
+ apply_cairo_transform_from_svg(cr, node.attribute("transform").value());
+
+ string meta_clip_path_id(usvg_id_url(node.attribute("clip-path").value()));
+ Clipper c;
+
+ /* The clipPath node can only contain <path> children. usvg converts all geometric objects (rect etc.) to
+ * <path>s. Raster images are invalid inside a clip path. usvg removes all groups that are not relevant to
+ * rendering, and the only way a group might stay is if it affects rasterization (e.g. through mask, clipPath).
+ */
+ for (const auto &child : node.children("path")) {
+ PolyTree ptree;
+ cairo_save(cr);
+ /* TODO: we currently only support clipPathUnits="userSpaceOnUse", not "objectBoundingBox". */
+ apply_cairo_transform_from_svg(cr, child.attribute("transform").value());
+ load_svg_path(cr, child, ptree);
+ cairo_restore (cr);
+
+ Paths paths;
+ PolyTreeToPaths(ptree, paths);
+ c.AddPaths(paths, ptSubject, /* closed */ false);
+ }
+
+ /* Support clip paths that themselves have clip paths */
+ if (!meta_clip_path_id.empty()) {
+ if (clip_path_map.contains(meta_clip_path_id)) {
+ /* all clip paths must be closed */
+ c.AddPaths(clip_path_map[meta_clip_path_id], ptClip, /* closed */ true);
+
+ } else {
+ cerr << "Warning: Cannot find clip path with ID \"" << meta_clip_path_id << "\", ignoring." << endl;
+ }
+ }
+
+ PolyTree ptree;
+ c.StrictlySimple(true);
+ /* This unions all child <path>s together and at the same time applies any meta clip path. */
+ /* The fill rules are both nonzero since both subject and clip have already been normalized by clipper. */
+ c.Execute(ctUnion, ptree, pftNonZero, pftNonZero);
+ /* Insert into document clip path map */
+ PolyTreeToPaths(ptree, clip_path_map[node.attribute("id").value()]);
+
+ cairo_restore(cr);
+ }
+}
+
diff --git a/src/svg_doc.h b/src/svg_doc.h
new file mode 100644
index 0000000..01a4e7a
--- /dev/null
+++ b/src/svg_doc.h
@@ -0,0 +1,97 @@
+/*
+ * This program source code file is part of KICAD, a free EDA CAD application.
+ *
+ * Copyright (C) 2021 Jan Sebastian Götte <kicad@jaseg.de>
+ * Copyright (C) 2021 KiCad Developers, see AUTHORS.txt for contributors.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, you may find one here:
+ * http://www.gnu.org/licenses/old-licenses/gpl-2.0.html
+ * or you may search the http://www.gnu.org website for the version 2 license,
+ * or you may write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
+ */
+
+#ifndef SVG_DOC_H
+#define SVG_DOC_H
+
+#include <map>
+
+#include <pugixml.hpp>
+
+#include "svg_pattern.h"
+
+namespace svg_plugin {
+
+ typedef std::function<void (std::vector<std::array<double, 2>>, bool)> polygon_sink_fun;
+
+ class SVGDocument {
+ public:
+ SVGDocument() : _valid(false) {}
+ SVGDocument(polygon_sink_fun sink_fun) : _valid(false), polygon_sink(sink_fun) {}
+ ~SVGDocument();
+
+ /* true -> load successful */
+ bool load(std::string filename, std::string debug_out_filename="/tmp/kicad_svg_debug.svg");
+ /* true -> load successful */
+ bool valid() const { return _valid; }
+ operator bool() const { return valid(); }
+
+ double mm_to_doc_units(double) const;
+ double doc_units_to_mm(double) const;
+
+ double width() const { return page_w_mm; }
+ double height() const { return page_h_mm; }
+
+ void do_export(std::string debug_out_filename="");
+
+ private:
+ friend class Pattern;
+
+ cairo_t *cairo() { return cr; }
+ const ClipperLib::Paths *lookup_clip_path(const pugi::xml_node &node);
+ Pattern *lookup_pattern(const std::string id);
+
+ void export_svg_group(const pugi::xml_node &group, ClipperLib::Paths &parent_clip_path);
+ void export_svg_path(const pugi::xml_node &node, ClipperLib::Paths &clip_path);
+ void setup_debug_output(std::string filename="");
+ void setup_viewport_clip();
+ void load_clips();
+ void load_patterns();
+
+ bool _valid;
+ pugi::xml_document svg_doc;
+ pugi::xml_node root_elem;
+ pugi::xml_node defs_node;
+ double vb_x, vb_y, vb_w, vb_h;
+ double page_w, page_h;
+ double page_w_mm, page_h_mm;
+ std::map<std::string, Pattern> pattern_map;
+ std::map<std::string, ClipperLib::Paths> clip_path_map;
+ cairo_matrix_t viewport_matrix;
+ ClipperLib::Paths vb_paths; /* viewport clip rect */
+
+ cairo_t *cr = nullptr;
+ cairo_surface_t *surface = nullptr;
+
+ polygon_sink_fun polygon_sink;
+
+ static constexpr double dbg_fill_alpha = 0.8;
+ static constexpr double dbg_stroke_alpha = 1.0;
+ static constexpr double assumed_usvg_dpi = 96.0;
+ };
+
+} /* namespace svg_plugin */
+
+#endif /* SVG_DOC_H */
+
diff --git a/src/svg_geom.cpp b/src/svg_geom.cpp
new file mode 100644
index 0000000..0e40e7b
--- /dev/null
+++ b/src/svg_geom.cpp
@@ -0,0 +1,181 @@
+/*
+ * This program source code file is part of KICAD, a free EDA CAD application.
+ *
+ * Copyright (C) 2021 Jan Sebastian Götte <kicad@jaseg.de>
+ * Copyright (C) 2021 KiCad Developers, see AUTHORS.txt for contributors.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, you may find one here:
+ * http://www.gnu.org/licenses/old-licenses/gpl-2.0.html
+ * or you may search the http://www.gnu.org website for the version 2 license,
+ * or you may write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
+ */
+
+#include "svg_geom.h"
+
+#include <cmath>
+#include <string>
+#include <sstream>
+#include <assert.h>
+#include <cairo.h>
+#include "svg_import_defs.h"
+
+using namespace ClipperLib;
+using namespace std;
+
+/* Get bounding box of a Clipper Paths */
+IntRect svg_plugin::get_paths_bounds(const Paths &paths) {
+ if (paths.empty()) {
+ return {0, 0, 0, 0};
+ }
+
+ if (paths[0].empty()) {
+ return {0, 0, 0, 0};
+ }
+
+ IntPoint p0 = paths[0][0];
+ cInt x0=p0.X, y0=p0.Y, x1=p0.X, y1=p0.Y;
+
+ for (const Path &p : paths) {
+ for (const IntPoint ip : p) {
+ if (ip.X < x0)
+ x0 = ip.X;
+
+ if (ip.Y < y0)
+ y0 = ip.Y;
+
+ if (ip.X > x1)
+ x1 = ip.X;
+
+ if (ip.Y > y1)
+ y1 = ip.Y;
+ }
+ }
+
+ return {x0, y0, x1, y1};
+}
+
+enum ClipperLib::PolyFillType svg_plugin::clipper_fill_rule(const pugi::xml_node &node) {
+ string val(node.attribute("fill-rule").value());
+ if (val == "evenodd")
+ return ClipperLib::pftEvenOdd;
+ else
+ return ClipperLib::pftNonZero; /* default */
+}
+
+enum ClipperLib::EndType svg_plugin::clipper_end_type(const pugi::xml_node &node) {
+ string val(node.attribute("stroke-linecap").value());
+ if (val == "round")
+ return ClipperLib::etOpenRound;
+
+ if (val == "square")
+ return ClipperLib::etOpenSquare;
+
+ return ClipperLib::etOpenButt;
+}
+
+enum ClipperLib::JoinType svg_plugin::clipper_join_type(const pugi::xml_node &node) {
+ string val(node.attribute("stroke-linejoin").value());
+ if (val == "round")
+ return ClipperLib::jtRound;
+
+ if (val == "bevel")
+ return ClipperLib::jtSquare;
+
+ return ClipperLib::jtMiter;
+}
+
+/* Take a Clipper polytree, i.e. a description of a set of polygons, their holes and their inner polygons, and remove
+ * all holes from it. We remove holes by splitting each polygon that has a hole into two or more pieces so that the hole
+ * is no more. These pieces perfectly fit each other so there is no visual or functional difference.
+ */
+void svg_plugin::dehole_polytree(PolyNode &ptree, Paths &out) {
+ for (int i=0; i<ptree.ChildCount(); i++) {
+ PolyNode *nod = ptree.Childs[i];
+ assert(nod);
+ assert(!nod->IsHole());
+
+ /* First, recursively process inner polygons. */
+ for (int j=0; j<nod->ChildCount(); j++) {
+ PolyNode *child = nod->Childs[j];
+ assert(child);
+ assert(child->IsHole());
+
+ if (child->ChildCount() > 0) {
+ dehole_polytree(*child, out);
+ }
+ }
+
+ if (nod->ChildCount() == 0) {
+ out.push_back(nod->Contour);
+
+ } else {
+
+ /* Do not add children's children, those were handled in the recursive call above */
+ Clipper c;
+ c.AddPath(nod->Contour, ptSubject, /* closed= */ true);
+ for (int k=0; k<nod->ChildCount(); k++) {
+ c.AddPath(nod->Childs[k]->Contour, ptSubject, /* closed= */ true);
+ }
+
+ /* Find a viable cut: Cut from top-left bounding box corner, through two subsequent points on the hole
+ * outline and to top-right bbox corner. */
+ IntRect bbox = c.GetBounds();
+ Path tri = { { bbox.left, bbox.top }, nod->Childs[0]->Contour[0], nod->Childs[0]->Contour[1], { bbox.right, bbox.top } };
+ c.AddPath(tri, ptClip, true);
+
+ PolyTree solution;
+ c.StrictlySimple(true);
+ /* Execute twice, once for intersection fragment and once for difference fragment. Note that this will yield
+ * at least two, but possibly more polygons. */
+ c.Execute(ctDifference, solution, pftNonZero);
+ dehole_polytree(solution, out);
+
+ c.Execute(ctIntersection, solution, pftNonZero);
+ dehole_polytree(solution, out);
+ }
+ }
+}
+
+/* Intersect two clip paths. Both must share a coordinate system. */
+void svg_plugin::combine_clip_paths(Paths &in_a, Paths &in_b, Paths &out) {
+ Clipper c;
+ c.StrictlySimple(true);
+ c.AddPaths(in_a, ptClip, /* closed */ true);
+ c.AddPaths(in_b, ptSubject, /* closed */ true);
+ /* Nonzero fill since both input clip paths must already have been preprocessed by clipper. */
+ c.Execute(ctIntersection, out, pftNonZero);
+}
+
+/* Transform given clipper paths under the given cairo transform. If no transform is given, use cairo's current
+ * user-to-device transform. */
+void svg_plugin::transform_paths(cairo_t *cr, Paths &paths, cairo_matrix_t *mat) {
+ cairo_save(cr);
+ if (mat != nullptr) {
+ cairo_set_matrix(cr, mat);
+ }
+
+ for (Path &p : paths) {
+ transform(p.begin(), p.end(), p.begin(),
+ [cr](IntPoint p) -> IntPoint {
+ double x = p.X / clipper_scale, y = p.Y / clipper_scale;
+ cairo_user_to_device(cr, &x, &y);
+ return { (cInt)round(x * clipper_scale), (cInt)round(y * clipper_scale) };
+ });
+ }
+
+ cairo_restore(cr);
+}
+
+
diff --git a/src/svg_geom.h b/src/svg_geom.h
new file mode 100644
index 0000000..dfd1c80
--- /dev/null
+++ b/src/svg_geom.h
@@ -0,0 +1,44 @@
+/*
+ * This program source code file is part of KICAD, a free EDA CAD application.
+ *
+ * Copyright (C) 2021 Jan Sebastian Götte <kicad@jaseg.de>
+ * Copyright (C) 2021 KiCad Developers, see AUTHORS.txt for contributors.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, you may find one here:
+ * http://www.gnu.org/licenses/old-licenses/gpl-2.0.html
+ * or you may search the http://www.gnu.org website for the version 2 license,
+ * or you may write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
+ */
+
+#ifndef SVG_GEOM_H
+#define SVG_GEOM_H
+
+#include <cairo.h>
+#include <clipper.hpp>
+#include <pugixml.hpp>
+
+namespace svg_plugin {
+
+ClipperLib::IntRect get_paths_bounds(const ClipperLib::Paths &paths);
+enum ClipperLib::PolyFillType clipper_fill_rule(const pugi::xml_node &node);
+enum ClipperLib::EndType clipper_end_type(const pugi::xml_node &node);
+enum ClipperLib::JoinType clipper_join_type(const pugi::xml_node &node);
+void dehole_polytree(ClipperLib::PolyNode &ptree, ClipperLib::Paths &out);
+void combine_clip_paths(ClipperLib::Paths &in_a, ClipperLib::Paths &in_b, ClipperLib::Paths &out);
+void transform_paths(cairo_t *cr, ClipperLib::Paths &paths, cairo_matrix_t *mat=nullptr);
+
+} /* namespace svg_plugin */
+
+#endif /* SVG_GEOM_H */
diff --git a/src/svg_import_defs.h b/src/svg_import_defs.h
new file mode 100644
index 0000000..e25c52c
--- /dev/null
+++ b/src/svg_import_defs.h
@@ -0,0 +1,49 @@
+/*
+ * This program source code file is part of KICAD, a free EDA CAD application.
+ *
+ * Copyright (C) 2016 CERN
+ * @author Janito V. Ferreira Filho <janito.vff@gmail.com>
+ * Copyright (C) 2018-2019 KiCad Developers, see AUTHORS.txt for contributors.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, you may find one here:
+ * http://www.gnu.org/licenses/old-licenses/gpl-2.0.html
+ * or you may search the http://www.gnu.org website for the version 2 license,
+ * or you may write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
+ */
+
+#ifndef SVG_IMPORT_DEFS_H
+#define SVG_IMPORT_DEFS_H
+
+#include <cfloat>
+
+template <typename T>
+constexpr T ipow(T num, unsigned int pow)
+{
+ return (pow >= sizeof(unsigned int)*8) ? 0 :
+ pow == 0 ? 1 : num * ipow(num, pow-1);
+}
+
+constexpr int CAIRO_PRECISION = 7;
+constexpr double clipper_scale = ipow(10.0, CAIRO_PRECISION);
+
+#define JC_VORONOI_IMPLEMENTATION
+#define JCV_REAL_TYPE double
+#define JCV_ATAN2 atan2
+#define JCV_SQRT sqrt
+#define JCV_FLT_MAX DBL_MAX
+#define JCV_PI 3.141592653589793115997963468544185161590576171875
+//define JCV_EDGE_INTERSECT_THRESHOLD 1.0e-10F
+
+#endif /* SVG_IMPORT_DEFS_H */
diff --git a/src/svg_import_util.cpp b/src/svg_import_util.cpp
new file mode 100644
index 0000000..5624bd9
--- /dev/null
+++ b/src/svg_import_util.cpp
@@ -0,0 +1,129 @@
+/*
+ * This program source code file is part of KICAD, a free EDA CAD application.
+ *
+ * Copyright (C) 2021 Jan Sebastian Götte <kicad@jaseg.de>
+ * Copyright (C) 2021 KiCad Developers, see AUTHORS.txt for contributors.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, you may find one here:
+ * http://www.gnu.org/licenses/old-licenses/gpl-2.0.html
+ * or you may search the http://www.gnu.org website for the version 2 license,
+ * or you may write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
+ */
+
+#include <cmath>
+#include "base64.h"
+#include "svg_import_util.h"
+
+using namespace std;
+
+void svg_plugin::print_matrix(cairo_t *cr, bool print_examples) {
+ cairo_matrix_t mat;
+ cairo_get_matrix(cr, &mat);
+ cerr << " xform matrix = { xx=" << mat.xx << ", yx=" << mat.yx << ", xy=" << mat.xy << ", yy=" << mat.yy << ", x0=" << mat.x0 << ", y0=" << mat.y0 << " }" << endl;
+ if (print_examples) {
+ double x=0, y=0;
+ cairo_user_to_device(cr, &x, &y);
+ cerr << " (0, 0) -> (" << x << ", " << y << ")" << endl;
+ x = 1, y = 0;
+ cairo_user_to_device(cr, &x, &y);
+ cerr << " (1, 0) -> (" << x << ", " << y << ")" << endl;
+ x = 0, y = 1;
+ cairo_user_to_device(cr, &x, &y);
+ cerr << " (0, 1) -> (" << x << ", " << y << ")" << endl;
+ x = 1, y = 1;
+ cairo_user_to_device(cr, &x, &y);
+ cerr << " (1, 1) -> (" << x << ", " << y << ")" << endl;
+ }
+}
+
+/* Read a double value formatted like usvg formats doubles from an SVG attribute */
+double svg_plugin::usvg_double_attr(const pugi::xml_node &node, const char *attr, double default_value) {
+ const auto *val = node.attribute(attr).value();
+ if (*val == '\0')
+ return default_value;
+
+ return atof(val);
+}
+
+/* Read an url from an usvg attribute */
+string svg_plugin::usvg_id_url(string attr) {
+ if (attr.rfind("url(#", 0) == string::npos)
+ return string();
+
+ attr = attr.substr(strlen("url(#"));
+ attr = attr.substr(0, attr.size()-1);
+ return attr;
+}
+
+svg_plugin::RelativeUnits svg_plugin::map_str_to_units(string str, svg_plugin::RelativeUnits default_val) {
+ if (str == "objectBoundingBox")
+ return SVG_ObjectBoundingBox;
+ else if (str == "userSpaceOnUse")
+ return SVG_UserSpaceOnUse;
+ return default_val;
+}
+
+void svg_plugin::load_cairo_matrix_from_svg(const string &transform, cairo_matrix_t &mat) {
+ if (transform.empty()) {
+ cairo_matrix_init_identity(&mat);
+ return;
+ }
+
+ string start("matrix(");
+ assert(transform.substr(0, start.length()) == start);
+ assert(transform.back() == ')');
+ const string &foo = transform.substr(start.length(), transform.length());
+ const string &bar = foo.substr(0, foo.length() - 1);
+
+ istringstream xform(bar);
+
+ double a, c, e,
+ b, d, f;
+ xform >> a >> b >> c >> d >> e >> f;
+ assert(!xform.fail());
+
+ cairo_matrix_init(&mat, a, b, c, d, e, f);
+}
+
+void svg_plugin::apply_cairo_transform_from_svg(cairo_t *cr, const string &transform) {
+ cairo_matrix_t mat;
+ load_cairo_matrix_from_svg(transform, mat);
+ cairo_transform(cr, &mat); /* or cairo_transform? */
+}
+
+/* Cf. https://tools.ietf.org/html/rfc2397 */
+string svg_plugin::parse_data_iri(const string &data_url) {
+ if (data_url.rfind("data:", 0) == string::npos) /* check if url starts with "data:" */
+ return string();
+
+ size_t foo = data_url.find("base64,");
+ if (foo == string::npos) /* check if this is actually a data URL */
+ return string();
+
+ size_t b64_begin = data_url.find_first_not_of(" ", foo + strlen("base64,"));
+ assert(b64_begin != string::npos);
+
+ return base64_decode(data_url.substr(b64_begin));
+}
+
+/* for debug svg output */
+void svg_plugin::apply_viewport_matrix(cairo_t *cr, cairo_matrix_t &viewport_matrix) {
+ /* Multiply viewport matrix *from the left*, i.e. as if it had been applied *before* the currently set matrix. */
+ cairo_matrix_t old_matrix;
+ cairo_get_matrix(cr, &old_matrix);
+ cairo_set_matrix(cr, &viewport_matrix);
+ cairo_transform(cr, &old_matrix);
+}
+
diff --git a/src/svg_import_util.h b/src/svg_import_util.h
new file mode 100644
index 0000000..8485957
--- /dev/null
+++ b/src/svg_import_util.h
@@ -0,0 +1,69 @@
+/*
+ * This program source code file is part of KICAD, a free EDA CAD application.
+ *
+ * Copyright (C) 2021 Jan Sebastian Götte <kicad@jaseg.de>
+ * Copyright (C) 2021 KiCad Developers, see AUTHORS.txt for contributors.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, you may find one here:
+ * http://www.gnu.org/licenses/old-licenses/gpl-2.0.html
+ * or you may search the http://www.gnu.org website for the version 2 license,
+ * or you may write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
+ */
+
+#ifndef SVG_IMPORT_UTIL_H
+#define SVG_IMPORT_UTIL_H
+
+#include <math.h>
+#include <cmath>
+#include <stdlib.h>
+#include <assert.h>
+#include <limits>
+#include <vector>
+#include <string>
+#include <iostream>
+#include <sstream>
+#include <regex>
+
+#include <pango/pangocairo.h>
+#include <cairo-svg.h>
+
+#include <clipper.hpp>
+#include "cairo_clipper.hpp"
+
+#include <pugixml.hpp>
+
+#include "svg_import_defs.h"
+
+namespace svg_plugin {
+
+/* Coordinate system selection for things like "patternContentUnits" */
+enum RelativeUnits {
+ SVG_UnknownUnits = 0,
+ SVG_UserSpaceOnUse,
+ SVG_ObjectBoundingBox,
+};
+
+void print_matrix(cairo_t *cr, bool print_examples=false);
+double usvg_double_attr(const pugi::xml_node &node, const char *attr, double default_value=0.0);
+std::string usvg_id_url(std::string attr);
+RelativeUnits map_str_to_units(std::string str, RelativeUnits default_val=SVG_UnknownUnits);
+void load_cairo_matrix_from_svg(const std::string &transform, cairo_matrix_t &mat);
+void apply_cairo_transform_from_svg(cairo_t *cr, const std::string &transform);
+std::string parse_data_iri(const std::string &data_url);
+void apply_viewport_matrix(cairo_t *cr, cairo_matrix_t &viewport_matrix);
+
+} /* namespace svg_plugin */
+
+#endif /* SVG_IMPORT_UTIL_H */
diff --git a/src/svg_path.cpp b/src/svg_path.cpp
new file mode 100644
index 0000000..9137e1a
--- /dev/null
+++ b/src/svg_path.cpp
@@ -0,0 +1,219 @@
+/*
+ * This program source code file is part of KICAD, a free EDA CAD application.
+ *
+ * Copyright (C) 2021 Jan Sebastian Götte <kicad@jaseg.de>
+ * Copyright (C) 2021 KiCad Developers, see AUTHORS.txt for contributors.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, you may find one here:
+ * http://www.gnu.org/licenses/old-licenses/gpl-2.0.html
+ * or you may search the http://www.gnu.org website for the version 2 license,
+ * or you may write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
+ */
+
+#include <cmath>
+#include <assert.h>
+#include <iostream>
+#include <sstream>
+#include "cairo_clipper.hpp"
+#include "svg_import_defs.h"
+#include "svg_path.h"
+
+using namespace std;
+
+static void clipper_add_cairo_path(cairo_t *cr, ClipperLib::Clipper &c, bool closed) {
+ ClipperLib::Paths in_poly;
+ ClipperLib::cairo::cairo_to_clipper(cr, in_poly, CAIRO_PRECISION, ClipperLib::cairo::tNone);
+ c.AddPaths(in_poly, ClipperLib::ptSubject, closed);
+}
+
+static void path_to_clipper_via_cairo(cairo_t *cr, ClipperLib::Clipper &c, const pugi::char_t *path_data) {
+ istringstream d(path_data);
+
+ string cmd;
+ double x, y, c1x, c1y, c2x, c2y;
+
+ bool first = true;
+ bool path_is_empty = true;
+ while (!d.eof()) {
+ d >> cmd;
+ assert (!d.fail());
+ assert(!first || cmd == "M");
+
+ if (cmd == "Z") { /* Close path */
+ cairo_close_path(cr);
+ clipper_add_cairo_path(cr, c, /* closed= */ true);
+ cairo_new_path(cr);
+ path_is_empty = true;
+
+ } else if (cmd == "M") { /* Move to */
+ d >> x >> y;
+ /* We need to transform all points ourselves here, and cannot use the transform feature of cairo_to_clipper:
+ * Our transform may contain offsets, and clipper only passes its data into cairo's transform functions
+ * after scaling up to its internal fixed-point ints, but it does not scale the transform accordingly. This
+ * means a scale/rotation we set before calling clipper works out fine, but translations get lost as they
+ * get scaled by something like 1e-6.
+ */
+ cairo_user_to_device(cr, &x, &y);
+ assert (!d.fail());
+ if (!first)
+ clipper_add_cairo_path(cr, c, /* closed= */ false);
+ cairo_new_path (cr);
+ path_is_empty = true;
+ cairo_move_to(cr, x, y);
+
+ } else if (cmd == "L") { /* Line to */
+ d >> x >> y;
+ cairo_user_to_device(cr, &x, &y);
+ assert (!d.fail());
+ cairo_line_to(cr, x, y);
+ path_is_empty = false;
+
+ } else { /* Curve to */
+ assert(cmd == "C");
+ d >> c1x >> c1y; /* first control point */
+ cairo_user_to_device(cr, &c1x, &c1y);
+ d >> c2x >> c2y; /* second control point */
+ cairo_user_to_device(cr, &c2x, &c2y);
+ d >> x >> y; /* end point */
+ cairo_user_to_device(cr, &x, &y);
+ assert (!d.fail());
+ cairo_curve_to(cr, c1x, c1y, c2x, c2y, x, y);
+ path_is_empty = false;
+ }
+
+ first = false;
+ }
+ if (!path_is_empty) {
+ cairo_close_path(cr);
+ clipper_add_cairo_path(cr, c, /* closed= */ false);
+ }
+}
+
+void svg_plugin::load_svg_path(cairo_t *cr, const pugi::xml_node &node, ClipperLib::PolyTree &ptree) {
+ auto *path_data = node.attribute("d").value();
+ auto fill_rule = clipper_fill_rule(node);
+
+ /* For open paths, clipper does not correctly remove self-intersections. Thus, we pass everything into
+ * clipper twice: Once with all paths set to "closed" to compute fill areas, and once with correct
+ * open/closed properties for stroke offsetting. */
+ cairo_set_tolerance (cr, 0.1); /* FIXME make configurable, scale properly for units */
+ cairo_set_fill_rule(cr, CAIRO_FILL_RULE_WINDING);
+
+ ClipperLib::Clipper c;
+ c.StrictlySimple(true);
+ path_to_clipper_via_cairo(cr, c, path_data);
+ /* We canont clip the polygon here since that would produce incorrect results for our stroke. */
+ c.Execute(ClipperLib::ctUnion, ptree, fill_rule, ClipperLib::pftNonZero);
+}
+
+void svg_plugin::parse_dasharray(const pugi::xml_node &node, vector<double> &out) {
+ out.clear();
+
+ string val(node.attribute("stroke-dasharray").value());
+ if (val.empty() || val == "none")
+ return;
+
+ istringstream desc_stream(val);
+ while (!desc_stream.eof()) {
+ /* usvg says the array only contains unitless (px) values. I don't know what resvg does with percentages inside
+ * dash arrays. We just assume everything is a unitless number here. In case usvg passes through percentages,
+ * well, bad luck. They are a kind of weird thing inside a dash array in the first place. */
+ double d;
+ desc_stream >> d;
+ out.push_back(d);
+ }
+
+ assert(out.size() % 2 == 0); /* according to resvg spec */
+}
+
+/* Take a Clipper path in clipper-scaled document units, and apply the given SVG dash array to it. Do this by walking
+ * the path from start to end while emitting dashes. */
+void svg_plugin::dash_path(const ClipperLib::Path &in, ClipperLib::Paths &out, const vector<double> dasharray, double dash_offset) {
+ out.clear();
+ if (dasharray.empty() || in.size() < 2) {
+ out.push_back(in);
+ return;
+ }
+
+ size_t dash_idx = 0;
+ size_t num_dashes = dasharray.size();
+ while (dash_offset > dasharray[dash_idx]) {
+ dash_offset -= dasharray[dash_idx];
+ dash_idx = (dash_idx + 1) % num_dashes;
+ }
+
+ double dash_remaining = dasharray[dash_idx] - dash_offset;
+
+ ClipperLib::Path current_dash;
+ current_dash.push_back(in[0]);
+ double dbg_total_len = 0.0;
+ for (size_t i=1; i<in.size(); i++) {
+ ClipperLib::IntPoint p1(in[i-1]), p2(in[i]);
+
+ double x1 = p1.X / clipper_scale, y1 = p1.Y / clipper_scale, x2 = p2.X / clipper_scale, y2 = p2.Y / clipper_scale;
+ double dist = sqrt(pow(x2-x1, 2) + pow(y2-y1, 2));
+ dbg_total_len += dist;
+
+ if (dist < dash_remaining) {
+ /* dash extends beyond this segment, append this segment and continue. */
+ dash_remaining -= dist;
+ current_dash.push_back(p2);
+
+ } else {
+ /* dash started in some previous segment ends in this segment */
+ double dash_frac = dash_remaining/dist;
+ double x = x1 + (x2 - x1) * dash_frac,
+ y = y1 + (y2 - y1) * dash_frac;
+ ClipperLib::IntPoint intermediate {(ClipperLib::cInt)round(x * clipper_scale), (ClipperLib::cInt)round(y * clipper_scale)};
+
+ /* end this dash */
+ current_dash.push_back(intermediate);
+ if (dash_idx%2 == 0) { /* dash */
+ out.push_back(current_dash);
+ } /* else space */
+ dash_idx = (dash_idx + 1) % num_dashes;
+ double offset = dash_remaining;
+
+ /* start next dash */
+ current_dash.clear();
+ current_dash.push_back(intermediate);
+
+ /* handle case where multiple dashes fit into this segment */
+ while ((dist - offset) > dasharray[dash_idx]) {
+ offset += dasharray[dash_idx];
+
+ double dash_frac = offset/dist;
+ double x = x1 + (x2 - x1) * dash_frac,
+ y = y1 + (y2 - y1) * dash_frac;
+ ClipperLib::IntPoint intermediate {(ClipperLib::cInt)round(x * clipper_scale), (ClipperLib::cInt)round(y * clipper_scale)};
+
+ /* end this dash */
+ current_dash.push_back(intermediate);
+ if (dash_idx%2 == 0) { /* dash */
+ out.push_back(current_dash);
+ } /* else space */
+ dash_idx = (dash_idx + 1) % num_dashes;
+
+ /* start next dash */
+ current_dash.clear();
+ current_dash.push_back(intermediate);
+ }
+
+ dash_remaining = dasharray[dash_idx] - (dist - offset);
+ current_dash.push_back(p2);
+ }
+ }
+}
+
diff --git a/src/svg_path.h b/src/svg_path.h
new file mode 100644
index 0000000..0a527f6
--- /dev/null
+++ b/src/svg_path.h
@@ -0,0 +1,38 @@
+/*
+ * This program source code file is part of KICAD, a free EDA CAD application.
+ *
+ * Copyright (C) 2021 Jan Sebastian Götte <kicad@jaseg.de>
+ * Copyright (C) 2021 KiCad Developers, see AUTHORS.txt for contributors.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, you may find one here:
+ * http://www.gnu.org/licenses/old-licenses/gpl-2.0.html
+ * or you may search the http://www.gnu.org website for the version 2 license,
+ * or you may write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
+ */
+
+#ifndef SVG_PATH_H
+#define SVG_PATH_H
+
+#include <vector>
+#include <cairo.h>
+#include "svg_geom.h"
+
+namespace svg_plugin {
+void load_svg_path(cairo_t *cr, const pugi::xml_node &node, ClipperLib::PolyTree &ptree);
+void parse_dasharray(const pugi::xml_node &node, std::vector<double> &out);
+void dash_path(const ClipperLib::Path &in, ClipperLib::Paths &out, const std::vector<double> dasharray, double dash_offset=0.0);
+}
+
+#endif /* SVG_PATH_H */
diff --git a/src/svg_pattern.cpp b/src/svg_pattern.cpp
new file mode 100644
index 0000000..8ca6572
--- /dev/null
+++ b/src/svg_pattern.cpp
@@ -0,0 +1,119 @@
+/*
+ * This program source code file is part of KICAD, a free EDA CAD application.
+ *
+ * Copyright (C) 2021 Jan Sebastian Götte <kicad@jaseg.de>
+ * Copyright (C) 2021 KiCad Developers, see AUTHORS.txt for contributors.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, you may find one here:
+ * http://www.gnu.org/licenses/old-licenses/gpl-2.0.html
+ * or you may search the http://www.gnu.org website for the version 2 license,
+ * or you may write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
+ */
+
+#include <assert.h>
+#include "svg_import_util.h"
+#include "svg_pattern.h"
+#include "svg_import_defs.h"
+#include "svg_geom.h"
+#include "svg_doc.h"
+
+using namespace std;
+
+svg_plugin::Pattern::Pattern(const pugi::xml_node &node, SVGDocument &doc) : _node(node), doc(&doc) {
+ /* Read pattern attributes from SVG node */
+ cerr << "creating pattern for node with id \"" << node.attribute("id").value() << "\"" << endl;
+ x = usvg_double_attr(node, "x");
+ y = usvg_double_attr(node, "y");
+ w = usvg_double_attr(node, "width");
+ h = usvg_double_attr(node, "height");
+ patternTransform = node.attribute("patternTransform").value();
+
+ string vb_s(node.attribute("viewBox").value());
+ has_vb = !vb_s.empty();
+ if (has_vb) {
+ istringstream vb_stream(vb_s);
+ vb_stream >> vb_x >> vb_y >> vb_w >> vb_h;
+ }
+
+ patternUnits = map_str_to_units(node.attribute("patternUnits").value(), SVG_ObjectBoundingBox);
+ patternContentUnits = map_str_to_units(node.attribute("patternContentUnits").value(), SVG_UserSpaceOnUse);
+}
+
+/* Tile pattern into gerber. Note that this function may be called several times in case the pattern is
+ * referenced from multiple places, so we must not clobber any of the object's state. */
+void svg_plugin::Pattern::tile (ClipperLib::Paths &clip) {
+ assert(doc);
+ cairo_t *cr = doc->cairo();
+ assert(cr);
+
+ cairo_save(cr);
+ /* Transform x, y, w, h from pattern coordinate space into parent coordinates by applying the inverse
+ * patternTransform. This is necessary so we iterate over the correct bounds when tiling below */
+ cairo_matrix_t mat;
+ load_cairo_matrix_from_svg(patternTransform, mat);
+ if (cairo_matrix_invert(&mat) != CAIRO_STATUS_SUCCESS) {
+ cerr << "Cannot invert patternTransform matrix on pattern \"" << _node.attribute("id").value() << "\"." << endl;
+ cairo_restore(cr);
+ }
+ double inst_x = x, inst_y = y, inst_w = w, inst_h = h;
+ cairo_user_to_device(cr, &inst_x, &inst_y);
+ cairo_user_to_device_distance(cr, &inst_w, &inst_h);
+ cairo_restore(cr);
+
+ ClipperLib::IntRect clip_bounds = get_paths_bounds(clip);
+ double bx = clip_bounds.left / clipper_scale;
+ double by = clip_bounds.top / clipper_scale;
+ double bw = (clip_bounds.right - clip_bounds.left) / clipper_scale;
+ double bh = (clip_bounds.bottom - clip_bounds.top) / clipper_scale;
+
+ if (patternUnits == SVG_ObjectBoundingBox) {
+ inst_x *= bw;
+ inst_y *= bh;
+ inst_w *= bw;
+ inst_h *= bh;
+ }
+
+ /* Switch to pattern coordinates */
+ cairo_save(cr);
+ cairo_translate(cr, bx, by);
+ apply_cairo_transform_from_svg(cr, patternTransform);
+
+ /* Iterate over all pattern tiles in pattern coordinates */
+ for (double inst_off_x = fmod(inst_x, inst_w) - inst_w;
+ inst_off_x < bw + inst_w;
+ inst_off_x += inst_w) {
+
+ for (double inst_off_y = fmod(inst_y, inst_h) - inst_h;
+ inst_off_y < bh + inst_h;
+ inst_off_y += inst_h) {
+
+ cairo_save(cr);
+ /* Change into this individual tile's coordinate system */
+ cairo_translate(cr, inst_off_x, inst_off_y);
+ if (has_vb) {
+ cairo_translate(cr, vb_x, vb_y);
+ cairo_scale(cr, inst_w / vb_w, inst_h / vb_h);
+ } else if (patternContentUnits == SVG_ObjectBoundingBox) {
+ cairo_scale(cr, bw, bh);
+ }
+
+ /* Export the pattern tile's content like a group */
+ doc->export_svg_group(_node, clip);
+ cairo_restore(cr);
+ }
+ }
+ cairo_restore(cr);
+}
+
diff --git a/src/svg_pattern.h b/src/svg_pattern.h
new file mode 100644
index 0000000..e11fde5
--- /dev/null
+++ b/src/svg_pattern.h
@@ -0,0 +1,60 @@
+/*
+ * This program source code file is part of KICAD, a free EDA CAD application.
+ *
+ * Copyright (C) 2021 Jan Sebastian Götte <kicad@jaseg.de>
+ * Copyright (C) 2021 KiCad Developers, see AUTHORS.txt for contributors.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, you may find one here:
+ * http://www.gnu.org/licenses/old-licenses/gpl-2.0.html
+ * or you may search the http://www.gnu.org website for the version 2 license,
+ * or you may write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
+ */
+
+#ifndef SVG_PATTERN_H
+#define SVG_PATTERN_H
+
+#include <string>
+#include <cairo.h>
+
+#include <pugixml.hpp>
+#include <clipper.hpp>
+
+#include "svg_import_util.h"
+
+namespace svg_plugin {
+
+class SVGDocument;
+
+class Pattern {
+public:
+ Pattern() {}
+ Pattern(const pugi::xml_node &node, SVGDocument &doc);
+
+ void tile (ClipperLib::Paths &clip);
+
+private:
+ double x, y, w, h;
+ double vb_x, vb_y, vb_w, vb_h;
+ bool has_vb;
+ std::string patternTransform;
+ enum RelativeUnits patternUnits;
+ enum RelativeUnits patternContentUnits;
+ const pugi::xml_node _node;
+ SVGDocument *doc = nullptr;
+};
+
+} /* namespace svg_plugin */
+
+#endif /* SVG_PATTERN_H */
diff --git a/src/vec_core.cpp b/src/vec_core.cpp
new file mode 100644
index 0000000..0c60c7d
--- /dev/null
+++ b/src/vec_core.cpp
@@ -0,0 +1,339 @@
+/*
+ * This program source code file is part of KICAD, a free EDA CAD application.
+ *
+ * Copyright (C) 2021 Jan Sebastian Götte <kicad@jaseg.de>
+ * Copyright (C) 2021 KiCad Developers, see AUTHORS.txt for contributors.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, you may find one here:
+ * http://www.gnu.org/licenses/old-licenses/gpl-2.0.html
+ * or you may search the http://www.gnu.org website for the version 2 license,
+ * or you may write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
+ */
+
+#include <cmath>
+#include <string>
+#include <iostream>
+#include <vector>
+#include <opencv2/opencv.hpp>
+#include "svg_import_util.h"
+#include "vec_core.h"
+#include "svg_import_defs.h"
+#include "jc_voronoi.h"
+
+using namespace svg_plugin;
+using namespace std;
+
+/* debug function */
+static void dbg_show_cv_image(cv::Mat &img) {
+ string windowName = "Debug image";
+ cv::namedWindow(windowName);
+ cv::imshow(windowName, img);
+ cv::waitKey(0);
+ cv::destroyWindow(windowName);
+}
+
+/* From jcv voronoi README */
+static void voronoi_relax_points(const jcv_diagram* diagram, jcv_point* points) {
+ const jcv_site* sites = jcv_diagram_get_sites(diagram);
+ for (int i=0; i<diagram->numsites; i++) {
+ const jcv_site* site = &sites[i];
+ jcv_point sum = site->p;
+ int count = 1;
+
+ const jcv_graphedge* edge = site->edges;
+
+ while (edge) {
+ sum.x += edge->pos[0].x;
+ sum.y += edge->pos[0].y;
+ count++;
+ edge = edge->next;
+ }
+
+ points[site->index].x = sum.x / count;
+ points[site->index].y = sum.y / count;
+ }
+}
+
+/* Render image into gerber file.
+ *
+ * This function renders an image into a number of vector primitives emulating the images grayscale brightness by
+ * differently sized vector shaped giving an effect similar to halftone printing used in newspapers.
+ *
+ * On a high level, this function does this in four steps:
+ * 1. It preprocesses the source image at the pixel level. This involves several tasks:
+ * 1.1. It converts the image to grayscale.
+ * 1.2. It scales the image up or down to match the given minimum feature size.
+ * 1.3. It applies a blur depending on the given minimum feature size to prevent aliasing artifacts.
+ * 2. It randomly spread points across the image using poisson disc sampling. This yields points that have a fairly even
+ * average distance to each other across the image, and that have a guaranteed minimum distance that depends on
+ * minimum feature size.
+ * 3. It calculates a voronoi map based on this set of points and it calculats the polygon shape of each cell of the
+ * voronoi map.
+ * 4. It scales each of these voronoi cell polygons to match the input images brightness at the spot covered by this
+ * cell.
+ */
+void vectorizer::vectorize_image(cairo_t *cr, const pugi::xml_node &node, double min_feature_size_px, ClipperLib::Paths &clip_path, cairo_matrix_t &viewport_matrix) {
+ /* Read XML node attributes */
+ auto x = usvg_double_attr(node, "x", 0.0);
+ auto y = usvg_double_attr(node, "y", 0.0);
+ auto width = usvg_double_attr(node, "width", 0.0);
+ auto height = usvg_double_attr(node, "height", 0.0);
+ assert (width > 0 && height > 0);
+ cerr << "image elem: w="<<width<<", h="<<height<<endl;
+
+ /* Read image from data:base64... URL */
+ string img_data = parse_data_iri(node.attribute("xlink:href").value());
+ if (img_data.empty()) {
+ cerr << "Warning: Empty or invalid image element with id \"" << node.attribute("id").value() << "\"" << endl;
+ return;
+ }
+
+ /* slightly annoying round-trip through the std:: and cv:: APIs */
+ vector<unsigned char> img_vec(img_data.begin(), img_data.end());
+ cv::Mat data_mat(img_vec, true);
+ cv::Mat img = cv::imdecode(data_mat, cv::ImreadModes::IMREAD_GRAYSCALE | cv::ImreadModes::IMREAD_ANYDEPTH);
+ data_mat.release();
+
+ if (img.empty()) {
+ cerr << "Warning: Could not decode content of image element with id \"" << node.attribute("id").value() << "\"" << endl;
+ return;
+ }
+
+ /* Set up target transform using SVG transform and x/y attributes */
+ cairo_save(cr);
+ apply_cairo_transform_from_svg(cr, node.attribute("transform").value());
+ cairo_translate(cr, x, y);
+
+ /* Adjust minimum feature size given in mm and translate into px document units in our local coordinate system. */
+ double f_x = min_feature_size_px, f_y = 0;
+ cairo_device_to_user_distance(cr, &f_x, &f_y);
+ min_feature_size_px = sqrt(f_x*f_x + f_y*f_y);
+
+ /* For both our debug SVG output and for the gerber output, we have to paint the image's bounding box in black as
+ * background for our halftone blobs. We cannot simply draw a rect here, though. Instead we have to first intersect
+ * the bounding box with the clip path we get from the caller, then we have to translate it into Cairo-SVG's
+ * document units. */
+ /* First, setup the bounding box rectangle in our local px coordinate space. */
+ ClipperLib::Path rect_path;
+ for (auto &elem : vector<pair<double, double>> {{0, 0}, {width, 0}, {width, height}, {0, height}}) {
+ double x = elem.first, y = elem.second;
+ cairo_user_to_device(cr, &x, &y);
+ rect_path.push_back({ (ClipperLib::cInt)round(x * clipper_scale), (ClipperLib::cInt)round(y * clipper_scale) });
+ }
+
+ /* Intersect the bounding box with the caller's clip path */
+ ClipperLib::Clipper c;
+ c.AddPath(rect_path, ClipperLib::ptSubject, /* closed */ true);
+ if (!clip_path.empty()) {
+ c.AddPaths(clip_path, ClipperLib::ptClip, /* closed */ true);
+ }
+
+ ClipperLib::Paths rect_out;
+ c.StrictlySimple(true);
+ c.Execute(ClipperLib::ctIntersection, rect_out, ClipperLib::pftNonZero, ClipperLib::pftNonZero);
+
+ /* Finally, translate into Cairo-SVG's document units and draw. */
+ cairo_save(cr);
+ cairo_set_matrix(cr, &viewport_matrix);
+ cairo_new_path(cr);
+ ClipperLib::cairo::clipper_to_cairo(rect_out, cr, CAIRO_PRECISION, ClipperLib::cairo::tNone);
+ cairo_set_source_rgba (cr, 0.0, 0.0, 0.0, 1.0);
+ /* First, draw into SVG */
+ cairo_fill(cr);
+ cairo_restore(cr);
+
+ /* Second, draw into gerber. */
+ cairo_save(cr);
+ cairo_identity_matrix(cr);
+ for (const auto &poly : rect_out) {
+ /* FIXME */
+ //export_as_gerber(cr, poly, /* dark */ false);
+ }
+ cairo_restore(cr);
+
+ /* Set up a poisson-disc sampled point "grid" covering the image. Calculate poisson disc parameters from given
+ * minimum feature size. */
+ double grayscale_overhead = 0.8; /* fraction of distance between two adjacent cell centers that is reserved for
+ grayscale interpolation. Larger values -> better grayscale resolution,
+ larger cells. */
+ double center_distance = min_feature_size_px * 2.0 * (1.0 / (1.0-grayscale_overhead));
+ vector<d2p> *grid_centers = sample_poisson_disc(width, height, min_feature_size_px * 2.0 * 2.0);
+ /* TODO make these alternative grids available to callers */
+ //vector<d2p> *grid_centers = sample_hexgrid(width, height, center_distance);
+ //vector<d2p> *grid_centers = sample_squaregrid(width, height, center_distance);
+
+ /* Target factor between given min_feature_size and intermediate image pixels,
+ * i.e. <scale_featuresize_factor> px ^= min_feature_size */
+ double scale_featuresize_factor = 3.0;
+ /* TODO: support for preserveAspectRatio attribute */
+ double px_w = width / min_feature_size_px * scale_featuresize_factor;
+ double px_h = height / min_feature_size_px * scale_featuresize_factor;
+
+ /* Scale intermediate image (step 1.2) to have <scale_featuresize_factor> pixels per min_feature_size. */
+ cv::Mat scaled(cv::Size{(int)round(px_w), (int)round(px_h)}, img.type());
+ cv::resize(img, scaled, scaled.size(), 0, 0);
+ img.release();
+
+ /* Blur image with a kernel larger than our minimum feature size to avoid aliasing. */
+ cv::Mat blurred(scaled.size(), scaled.type());
+ int blur_size = (int)ceil(fmax(scaled.cols / width, scaled.rows / height) * center_distance);
+ cv::GaussianBlur(scaled, blurred, {blur_size, blur_size}, 0, 0);
+ scaled.release();
+
+ /* Calculate voronoi diagram for the grid generated above. */
+ jcv_diagram diagram;
+ memset(&diagram, 0, sizeof(jcv_diagram));
+ jcv_rect rect {{0.0, 0.0}, {width, height}};
+ jcv_point *pts = reinterpret_cast<jcv_point *>(grid_centers->data()); /* hackety hack */
+ jcv_diagram_generate(grid_centers->size(), pts, &rect, 0, &diagram);
+ /* Relax points, i.e. wiggle them around a little bit to equalize differences between cell sizes a little bit. */
+ voronoi_relax_points(&diagram, pts);
+ memset(&diagram, 0, sizeof(jcv_diagram));
+ jcv_diagram_generate(grid_centers->size(), pts, &rect, 0, &diagram);
+
+ /* For each voronoi cell calculated above, find the brightness of the blurred image pixel below its center. We do
+ * not have to average over the entire cell's area here: The blur is doing a good approximation of that while being
+ * simpler and faster.
+ *
+ * We do this step before generating the cell poygons below because we have to look up a cell's neighbor's fill
+ * factor during gap filling for minimum feature size preservation. */
+ vector<double> fill_factors(diagram.numsites); /* Factor to be multiplied with site polygon radius to yield target
+ fill level */
+ const jcv_site* sites = jcv_diagram_get_sites(&diagram);
+ int j = 0;
+ for (int i=0; i<diagram.numsites; i++) {
+ const jcv_point center = sites[i].p;
+
+ double pxd = (double)blurred.at<unsigned char>(
+ (int)round(center.y / height * blurred.rows),
+ (int)round(center.x / width * blurred.cols)) / 255.0;
+ fill_factors[sites[i].index] = sqrt(pxd);
+ }
+
+ /* Minimum gap between adjacent scaled site polygons. */
+ double min_gap_px = min_feature_size_px;
+ vector<double> adjusted_fill_factors;
+ adjusted_fill_factors.reserve(32); /* Vector to hold adjusted fill factors for each edge for gap filling */
+ /* now iterate over all voronoi cells again to generate each cell's scaled polygon halftone blob. */
+ for (int i=0; i<diagram.numsites; i++) {
+ const jcv_point center = sites[i].p;
+ double fill_factor_ours = fill_factors[sites[i].index];
+
+ /* Do not render halftone blobs that are too small */
+ if (fill_factor_ours * 0.5 * center_distance < min_gap_px)
+ continue;
+
+ /* Iterate over this cell's edges. For each edge, check the gap that would result between this cell's halftone
+ * blob and the neighboring cell's halftone blob based on their fill factors. If the gap is too small, either
+ * widen it by adjusting both fill factors down a bit (for this edge only!), or eliminate it by setting both
+ * fill factors to 1.0 (again, for this edge only!). */
+ adjusted_fill_factors.clear();
+ const jcv_graphedge* e = sites[i].edges;
+ while (e) {
+ /* half distance between both neighbors of this edge, i.e. sites[i] and its neighbor. */
+ /* Note that in a voronoi tesselation, this edge is always halfway between. */
+ double adjusted_fill_factor = fill_factor_ours;
+
+ if (e->neighbor != nullptr) { /* nullptr -> edge is on the voronoi map's border */
+ double rad = sqrt(pow(center.x - e->neighbor->p.x, 2) + pow(center.y - e->neighbor->p.y, 2)) / 2.0;
+ double fill_factor_theirs = fill_factors[e->neighbor->index];
+ double gap_px = (1.0 - fill_factor_ours) * rad + (1.0 - fill_factor_theirs) * rad;
+
+ if (gap_px > min_gap_px) {
+ /* all good. gap is wider than minimum. */
+ } else if (gap_px > 0.5 * min_gap_px) {
+ /* gap is narrower than minimum, but more than half of minimum width. */
+ /* force gap open, distribute adjustment evenly on left/right */
+ double fill_factor_adjustment = (min_gap_px - gap_px) / 2.0 / rad;
+ adjusted_fill_factor -= fill_factor_adjustment;
+ } else {
+ /* gap is less than half of minimum width. Force gap closed. */
+ adjusted_fill_factor = 1.0;
+ }
+ }
+ adjusted_fill_factors.push_back(adjusted_fill_factor);
+ e = e->next;
+ }
+
+ /* Now, generate the actual halftone blob polygon */
+ ClipperLib::Path cell_path;
+ double last_fill_factor = adjusted_fill_factors.back();
+ e = sites[i].edges;
+ j = 0;
+ while (e) {
+ double fill_factor = adjusted_fill_factors[j];
+ if (last_fill_factor != fill_factor) {
+ /* Fill factor was adjusted since last edge, so generate one extra point so we have a nice radial
+ * "step". */
+ double x = e->pos[0].x;
+ double y = e->pos[0].y;
+ x = center.x + (x - center.x) * fill_factor;
+ y = center.y + (y - center.y) * fill_factor;
+
+ cairo_user_to_device(cr, &x, &y);
+ cell_path.push_back({ (ClipperLib::cInt)round(x * clipper_scale), (ClipperLib::cInt)round(y * clipper_scale) });
+ }
+
+ /* Emit endpoint of current edge */
+ double x = e->pos[1].x;
+ double y = e->pos[1].y;
+ x = center.x + (x - center.x) * fill_factor;
+ y = center.y + (y - center.y) * fill_factor;
+
+ cairo_user_to_device(cr, &x, &y);
+ cell_path.push_back({ (ClipperLib::cInt)round(x * clipper_scale), (ClipperLib::cInt)round(y * clipper_scale) });
+
+ j += 1;
+ last_fill_factor = fill_factor;
+ e = e->next;
+ }
+
+ /* Now, clip the halftone blob generated above against the given clip path. We do this individually for each
+ * blob since this way is *much* faster than throwing a million blobs at once at poor clipper. */
+ ClipperLib::Paths polys;
+ ClipperLib::Clipper c;
+ c.AddPath(cell_path, ClipperLib::ptSubject, /* closed */ true);
+ if (!clip_path.empty()) {
+ c.AddPaths(clip_path, ClipperLib::ptClip, /* closed */ true);
+ }
+ c.StrictlySimple(true);
+ c.Execute(ClipperLib::ctIntersection, polys, ClipperLib::pftNonZero, ClipperLib::pftNonZero);
+
+ /* Export halftone blob to debug svg */
+ cairo_save(cr);
+ cairo_set_matrix(cr, &viewport_matrix);
+ cairo_new_path(cr);
+ ClipperLib::cairo::clipper_to_cairo(polys, cr, CAIRO_PRECISION, ClipperLib::cairo::tNone);
+ cairo_set_source_rgba(cr, 1, 1, 1, 1);
+ cairo_fill(cr);
+ cairo_restore(cr);
+
+ /* And finally, export halftone blob to gerber. */
+ cairo_save(cr);
+ cairo_identity_matrix(cr);
+ for (const auto &poly : polys) {
+ /* FIXME */
+ //export_as_gerber(cr, poly, /* dark */ true);
+ }
+ cairo_restore(cr);
+ }
+
+ blurred.release();
+ jcv_diagram_free( &diagram );
+ delete grid_centers;
+ cairo_restore(cr);
+}
+
+
diff --git a/src/vec_core.h b/src/vec_core.h
new file mode 100644
index 0000000..20ffd24
--- /dev/null
+++ b/src/vec_core.h
@@ -0,0 +1,37 @@
+/*
+ * This program source code file is part of KICAD, a free EDA CAD application.
+ *
+ * Copyright (C) 2021 Jan Sebastian Götte <kicad@jaseg.de>
+ * Copyright (C) 2021 KiCad Developers, see AUTHORS.txt for contributors.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, you may find one here:
+ * http://www.gnu.org/licenses/old-licenses/gpl-2.0.html
+ * or you may search the http://www.gnu.org website for the version 2 license,
+ * or you may write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
+ */
+
+#ifndef VEC_CORE_H
+#define VEC_CORE_H
+
+#include <cairo.h>
+#include <pugixml.hpp>
+#include <clipper.hpp>
+#include "vec_grid.h"
+
+namespace vectorizer {
+ void vectorize_image(cairo_t *cr, const pugi::xml_node &node, double min_feature_size_px, ClipperLib::Paths &clip_path, cairo_matrix_t &viewport_matrix);
+}
+
+#endif /* VEC_CORE_H */
diff --git a/src/vec_grid.cpp b/src/vec_grid.cpp
new file mode 100644
index 0000000..0a3eaa2
--- /dev/null
+++ b/src/vec_grid.cpp
@@ -0,0 +1,105 @@
+/*
+ * This program source code file is part of KICAD, a free EDA CAD application.
+ *
+ * Copyright (C) 2021 Jan Sebastian Götte <kicad@jaseg.de>
+ * Copyright (C) 2021 KiCad Developers, see AUTHORS.txt for contributors.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, you may find one here:
+ * http://www.gnu.org/licenses/old-licenses/gpl-2.0.html
+ * or you may search the http://www.gnu.org website for the version 2 license,
+ * or you may write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
+ */
+
+#include "poisson_disk_sampling.h"
+
+#include "vec_grid.h"
+
+using namespace std;
+using namespace vectorizer;
+
+sampling_fun vectorizer::get_sampler(enum grid_type type) {
+ switch(type) {
+ case POISSON_DISC:
+ return sample_poisson_disc;
+ case HEXGRID:
+ return sample_hexgrid;
+ case SQUAREGRID:
+ return sample_squaregrid;
+ default:
+ return sample_poisson_disc;
+ }
+}
+
+vector<d2p> *vectorizer::sample_poisson_disc(double w, double h, double center_distance) {
+ d2p top_left {0, 0};
+ d2p bottom_right {w, h};
+ return new auto(thinks::PoissonDiskSampling(center_distance, top_left, bottom_right));
+}
+
+vector<d2p> *vectorizer::sample_hexgrid(double w, double h, double center_distance) {
+ double radius = center_distance / 2.0 / (sqrt(3) / 2.0); /* radius of hexagon */
+ double pitch_v = 1.5 * radius;
+ double pitch_h = center_distance;
+
+ /* offset of first hexagon to make sure the entire area is covered. We use slightly larger values here to avoid
+ * corner cases during clipping in the voronoi map generator. The inaccuracies this causes at the edges are
+ * negligible. */
+ double off_x = 0.5001 * center_distance;
+ double off_y = 0.5001 * radius;
+
+ /* NOTE: The voronoi generator is not quite stable when points lie outside the bounds. Thus, floor(). */
+ long long int points_x = floor(w / pitch_h);
+ long long int points_y = floor(h / pitch_v);
+
+ vector<d2p> *out = new vector<d2p>();
+ out->reserve((points_x+1) * points_y);
+
+ /* This may generate up to one extra row of points. We don't care since these points will simply be clipped during
+ * voronoi map generation. */
+ for (long long int y_i=0; y_i<points_y; y_i+=2) {
+ for (long long int x_i=0; x_i<points_x; x_i++) { /* allow one extra point to compensate for row shift */
+ out->push_back(d2p{off_x + x_i * pitch_h, off_y + y_i * pitch_v});
+ }
+
+ for (long long int x_i=0; x_i<points_x+1; x_i++) { /* allow one extra point to compensate for row shift */
+ out->push_back(d2p{off_x + (x_i - 0.5) * pitch_h, off_y + (y_i + 1) * pitch_v});
+ }
+ }
+
+ return out;
+}
+
+vector<d2p> *vectorizer::sample_squaregrid(double w, double h, double center_distance) {
+ /* offset of first square to make sure the entire area is covered. We use slightly larger values here to avoid
+ * corner cases during clipping in the voronoi map generator. The inaccuracies this causes at the edges are
+ * negligible. */
+ double off_x = 0.5 * center_distance;
+ double off_y = 0.5 * center_distance;
+
+ long long int points_x = ceil(w / center_distance);
+ long long int points_y = ceil(h / center_distance);
+
+ vector<d2p> *out = new vector<d2p>();
+ out->reserve(points_x * points_y);
+
+ for (long long int y_i=0; y_i<points_y; y_i++) {
+ for (long long int x_i=0; x_i<points_x; x_i++) {
+ out->push_back({off_x + x_i*center_distance, off_y + y_i*center_distance});
+ }
+ }
+
+ return out;
+}
+
diff --git a/src/vec_grid.h b/src/vec_grid.h
new file mode 100644
index 0000000..cdd61df
--- /dev/null
+++ b/src/vec_grid.h
@@ -0,0 +1,52 @@
+/*
+ * This program source code file is part of KICAD, a free EDA CAD application.
+ *
+ * Copyright (C) 2021 Jan Sebastian Götte <kicad@jaseg.de>
+ * Copyright (C) 2021 KiCad Developers, see AUTHORS.txt for contributors.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, you may find one here:
+ * http://www.gnu.org/licenses/old-licenses/gpl-2.0.html
+ * or you may search the http://www.gnu.org website for the version 2 license,
+ * or you may write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
+ */
+
+#ifndef VEC_GRID_H
+#define VEC_GRID_H
+
+#include <array>
+#include <vector>
+#include <functional>
+
+namespace vectorizer {
+
+typedef std::array<double, 2> d2p;
+
+enum grid_type {
+ POISSON_DISC,
+ HEXGRID,
+ SQUAREGRID
+};
+
+typedef std::function<std::vector<d2p> *(double, double, double)> sampling_fun;
+
+sampling_fun get_sampler(enum grid_type type);
+
+std::vector<d2p> *sample_poisson_disc(double w, double h, double center_distance);
+std::vector<d2p> *sample_hexgrid(double w, double h, double center_distance);
+std::vector<d2p> *sample_squaregrid(double w, double h, double center_distance);
+
+} /* namespace vectorizer */
+
+#endif /* VEC_GRID_H */
diff --git a/upstream/clipper-6.4.2/Documentation/Docs/Overview/Changes.htm b/upstream/clipper-6.4.2/Documentation/Docs/Overview/Changes.htm
new file mode 100644
index 0000000..c05e9b3
--- /dev/null
+++ b/upstream/clipper-6.4.2/Documentation/Docs/Overview/Changes.htm
@@ -0,0 +1,1269 @@
+<html>
+
+<head>
+
+ <script type="text/javascript" src="../../Scripts/jquery.js">
+ </script>
+
+ <script type="text/javascript" src="../../Scripts/SyntaxHighlighter/scripts/shCore.js">
+ </script>
+
+ <script type="text/javascript" src="../../Scripts/SyntaxHighlighter/scripts/shBrushDelphi.js">
+ </script>
+
+ <script type="text/javascript" src="../../Scripts/SyntaxHighlighter/scripts/shBrushCpp.js">
+ </script>
+
+ <script type="text/javascript" src="../../Scripts/SyntaxHighlighter/scripts/shBrushCSharp.js">
+ </script>
+
+ <link type="text/css" rel="stylesheet" href="../../Scripts/SyntaxHighlighter/styles/shCoreDefault.css">
+
+ <link type="text/css" rel="stylesheet" href="../../Scripts/SyntaxHighlighter/styles/shThemeDefault.css">
+
+
+ <title>Changes</title>
+
+
+ <link rel="stylesheet" href="../../Styles/default.css" type="text/css">
+
+
+ <script src="../../Scripts/expandable.js" type="text/javascript">
+ </script>
+
+
+ <style>
+ /* barebones expandable list */
+
+ ul.barebones {
+ margin-left: 30px;
+ padding: 0;
+ }
+
+ ul.barebones ul {
+ margin: 0;
+ padding-left: 1.5em;
+ }
+
+ ul.barebones li {
+ list-style-type: none;
+ position: relative;
+ }
+
+ ul.barebones a.switch {
+ font-size: 2px;
+ text-indent: -500px;
+ background: transparent url(../../Images/_buttons.gif) no-repeat top left;
+ height: 9px;
+ width: 9px;
+ left: -13px;
+ top: 2px;
+ position: absolute;
+ }
+
+ ul.barebones a { text-decoration: none; }
+ ul.barebones a:hover { text-decoration: underline; }
+ ul.barebones a.switch:hover { text-decoration: none; }
+
+ ul.barebones a.on { background-position: top left; }
+ ul.barebones a.off { background-position: bottom left; }
+
+ ul.barebones h2 {
+ margin: 0px;
+ padding: 0px;
+ display: inline;
+ }
+
+ ul.dots li {
+ list-style-type: square;
+ }
+
+ blockquote {
+ margin: 0px 0px 0px 20px;
+ }
+
+
+ </style>
+
+
+ <script type="text/javascript" src="../../Scripts/bootstrap.js">
+ </script>
+
+
+ <script type="text/javascript" src="../../Scripts/bootstrap.js">
+ </script>
+
+</head>
+
+<body style="background-color: rgb(255, 255, 255);">
+
+ <!-- THIS FILE HAS BEEN AUTOMATICALLY PROCESSED FROM A SOURCE COPY -->
+
+ <!-- DO NOT EDIT MANUALLY !!! -->
+
+ <table class="Banner" cellspacing="0" cellpadding="0" border="1" bordercolorlight="#303080" bordercolordark="#7070B0">
+ <tr>
+ <td class="Banner" nowrap=""><a href="../_Body.htm" class="Banner"><img src="../../Images/_Home.gif" align="absmiddle">Home</a>
+ </td>
+ <td class="Banner" nowrap=""><a href="_Body.htm" class="Banner">Overview</a>
+ </td>
+ <td class="Banner" width="100%" align="right"><img src="../../Images/_Project_Logo.gif" align="absmiddle">
+ </td>
+ </tr>
+ </table>
+ <h1>Changes</h1>
+
+ <ul class="barebones expandable">
+
+
+ <!--
+<li>
+ <h2>v6.2.X (XX December 2015)</h2><br>
+ <ul>
+ <li>
+ <h2>Bugfix:</h2>
+ <ul class="dots">
+ xxxxxxxxxxxxxxxxxxxxxxxxxxx
+ </ul>
+ </li>
+ </ul>
+</li>
+<li>
+ -->
+
+
+ <li>
+ <h2>v6.2.1 (31 October 2014)</h2><br>
+ <ul>
+
+ <li>
+ <h2>Bugfix:</h2>
+ <ul class="dots">
+ Bugfix in <strong><a href="../Units/ClipperLib/Classes/ClipperOffset/Methods/Execute.htm">ClipperOffset.Execute</a></strong> where the Polytree.IsHole property was returning incorrect values with negative offsets
+
+ </ul> </li>
+
+ </ul>
+ <ul>
+
+ <li>
+ <h2>Modified:</h2>
+ <ul class="dots">
+ Very minor improvement to join rounding in ClipperOffset
+
+ </ul> </li>
+
+ </ul>
+ <ul>
+
+ <li>
+ <h2>Bugfix:</h2>
+ <ul class="dots">
+ Fixed CPP OpenGL demo
+
+ </ul> </li>
+
+ </ul> </li>
+
+
+ <li>
+ <h2>v6.2.0 (26 September 2014)</h2><br>
+ <ul>
+
+ <li>
+ <h2>Bugfix:</h2>
+ <ul class="dots">
+ Numerous minor bugfixes - too many to list. (See revisions 454-475 in Sourceforge Repository.)
+
+ </ul> </li>
+
+ <li>
+ <h2>Modified:</h2>
+ <ul class="dots">
+ Parameters have changed in the <a href="../Units/ClipperLib/Types/ZFillCallback.htm"><b>custom callback function</b></a> that can be assigned to <a href="../Units/ClipperLib/Classes/Clipper/Properties/ZFillFunction.htm"><strong>ZFillFunction</strong></a>.
+
+ </ul> </li>
+
+ <li>
+ <h2>Modified:</h2>
+ <ul class="dots">
+ Deprecated functions have been removed.
+
+ </ul> </li>
+
+ <li>
+ <h2>Modified:</h2>
+ <ul class="dots">
+ The Curves demo has been temporarily removed. (It needs to be updated but that was holding up this latest release of the Clipper library.)
+
+ </ul> </li>
+
+ </ul> </li>
+
+
+ <li>
+ <h2>v6.1.3 (18 January 2014)</h2><br>
+ <ul>
+
+ <li>
+ <h2>Bugfix:</h2>
+ <ul class="dots">
+ Fixed potential endless loop condition when adding open paths to Clipper.
+
+ </ul> </li>
+
+ <li>
+ <h2>Bugfix:</h2>
+ <ul class="dots">
+ Fixed missing implementation of <a href="../Units/ClipperLib/Functions/SimplifyPolygon.htm"><b>SimplifyPolygon</b></a> function in C++ code.
+
+ </ul> </li>
+
+ <li>
+ <h2>Bugfix:</h2>
+ <ul class="dots">
+ Fixed incorrect upper range constant for polygon coordinates in Delphi code.
+
+ </ul> </li>
+
+ <li>
+ <h2>Added:</h2>
+ <ul class="dots">
+ Added <a href="../Units/ClipperLib/Functions/PointInPolygon.htm"><b>PointInPolygon</b></a> function.
+
+ </ul> </li>
+
+ <li>
+ <h2>Added:</h2>
+ <ul class="dots">
+ Overloaded <a href="../Units/ClipperLib/Functions/MinkowskiSum.htm"><b>MinkowskiSum</b></a> function to accommodate multi-contour paths.
+
+ </ul> </li>
+
+ <li>
+ <h2>Modified:</h2>
+ <ul class="dots">
+ Documentation updated.
+
+ </ul> </li>
+
+ </ul> </li>
+
+
+ <li>
+ <h2>v6.1.2 (15 December 2013)</h2><br>
+ <ul>
+
+ <li>
+ <h2>Bugfix:</h2>
+ <ul class="dots">
+Fixed broken C++ header file.
+
+ </ul> </li>
+
+ <li>
+ <h2>Modified:</h2>
+ <ul class="dots">
+Minor improvement to joining polygons.
+
+ </ul> </li>
+
+ </ul> </li>
+
+
+ <li>
+ <h2>v6.1.1 (13 December 2013)</h2><br>
+ <ul>
+
+ <li>
+ <h2>Bugfix:</h2>
+ <ul class="dots">
+Fixed a couple of bugs affecting open paths that could raise unhandled exceptions.
+
+ </ul> </li>
+
+ </ul> </li>
+
+
+ <li>
+ <h2>v6.1.0 (2 December 2013)</h2><br>
+ <ul>
+
+ <li>
+ <h2>Deleted:</h2>
+ <ul class="dots">Previously deprecated code has been removed.
+ </ul> </li>
+
+ <li>
+ <h2>Modified:</h2>
+ <ul class="dots">
+The <a href="../Units/ClipperLib/Functions/OffsetPaths.htm">OffsetPaths</a> function is now deprecated as it has been replaced by the <a href="../Units/ClipperLib/Classes/ClipperOffset/_Body.htm"><b>ClipperOffset</b></a> class which is much more flexible.
+
+ </ul> </li>
+
+ <li>
+ <h2>Bugfix:</h2>
+ <ul class="dots">
+Several minor bugs have been fixed including occasionally an incorrect nesting within the PolyTree structure.
+
+ </ul> </li>
+
+ </ul> </li>
+
+
+ <li>
+ <h2>v6.0.0 (30 October 2013)</h2><br>
+ <ul>
+
+ <li><span class="maroon"><b>Ver 6 is a MAJOR update that adds support for open path clipping.</b></span></li>
+
+ </ul>
+ <ul>
+
+ <li>
+ <h2>Added:</h2>
+ <ul class="dots">
+Open path (polyline) clipping. A new 'Curves' demo application showcases this (see the 'Curves' directory).
+
+ </ul> </li>
+
+ </ul>
+ <ul>
+
+ <li>
+ <h2>Update:</h2>
+ <ul class="dots">
+Major improvement in the merging of shared/collinear edges in clip solutions (see <a href="../Units/ClipperLib/Classes/Clipper/Methods/Execute.htm">Execute</a>).
+
+ </ul> </li>
+
+ </ul>
+ <ul>
+
+ <li>
+ <h2>Added:</h2>
+ <ul class="dots">
+The <a href="../Units/ClipperLib/Types/IntPoint.htm"><b>IntPoint</b></a>
+structure now has an optional 'Z' member. (See the precompiler directive
+ <a href="../Units/ClipperLib/PreProcessor/Defines.htm"><b><b>use_xyz</b></b></a>.)
+
+ </ul> </li>
+
+ </ul>
+ <ul>
+
+ <li>
+ <h2>Added:</h2>
+ <ul class="dots">
+Users can now force Clipper to use 32bit integers (via the precompiler
+directive <a href="../Units/ClipperLib/PreProcessor/Defines.htm"><b>use_int32</b></a>)
+instead of using 64bit integers. Using 32bit integers improves clipping
+performance by about 20-30%. (This has required the introduction of a
+new <a href="../Units/ClipperLib/Types/CInt.htm"><b>cInt</b></a>
+integer type.) The trade-off to this speed up in performance is a very
+restricted vertex coordinate range of ± 46340.
+
+ </ul> </li>
+
+ </ul>
+ <ul>
+
+ <li>
+ <h2>Modified:</h2>
+ <ul class="dots">
+To accommodate open paths, the <b>Polygon</b> and <b>Polygons</b> structures have been renamed <a href="../Units/ClipperLib/Types/Path.htm"><b>Path</b></a> and <a href="../Units/ClipperLib/Types/Paths.htm"><b>Paths</b></a>
+respectively. The <b>AddPolygon</b> and <b>AddPolygons</b> methods of the ClipperBase class have been renamed <a href="../Units/ClipperLib/Classes/ClipperBase/Methods/AddPath.htm"><b>AddPath</b></a> and <a href="../Units/ClipperLib/Classes/ClipperBase/Methods/AddPaths.htm"><b>AddPaths</b></a> respectively. Several other functions have been similarly renamed.
+
+ </ul> </li>
+
+ </ul>
+ <ul>
+
+ <li>
+ <h2>Modified:</h2>
+ <ul class="dots">
+The PolyNode Class has a new IsOpen property (to support open paths).
+
+ </ul> </li>
+
+ </ul>
+ <ul>
+
+ <li>
+ <h2>Modified:</h2>
+ <ul class="dots">
+The Clipper class has a new <a href="../Units/ClipperLib/Classes/Clipper/Properties/ZFillFunction.htm"><b>ZFillFunction</b></a>
+property.
+
+ </ul> </li>
+
+ </ul>
+ <ul>
+
+ <li>
+ <h2>Added:</h2>
+ <ul class="dots">
+ <a href="../Units/ClipperLib/Functions/MinkowskiSum.htm"><b>MinkowskiSum</b></a> and
+ <a href="../Units/ClipperLib/Functions/MinkowskiDiff.htm"><b>MinkowskiDiff</b></a> functions added.
+
+ </ul> </li>
+
+ </ul>
+ <ul>
+
+ <li>
+ <h2>Added:</h2>
+ <ul class="dots">
+Several other new functions have been added including <a href="../Units/ClipperLib/Functions/PolyTreeToPaths.htm"><b>PolyTreeToPaths</b></a>,
+ <a href="../Units/ClipperLib/Functions/OpenPathsFromPolyTree.htm"><b>OpenPathsFromPolyTree</b></a>
+and <a href="../Units/ClipperLib/Functions/ClosedPathsFromPolyTree.htm"><b>ClosedPathsFromPolyTree</b></a>.
+
+ </ul> </li>
+
+ </ul>
+ <ul>
+
+ <li>
+ <h2>Added:</h2>
+ <ul class="dots">
+The <a href="../Units/ClipperLib/Classes/Clipper/Methods/Constructor.htm">Clipper constructor</a> now accepts an optional <a href="../Units/ClipperLib/Types/InitOptions.htm">InitOptions</a> parameter to simplify setting properties.
+
+ </ul> </li>
+
+ </ul>
+ <ul>
+
+ <li>
+ <h2>Bugfix:</h2>
+ <ul class="dots">
+Numerous minor bugs have been fixed.
+
+ </ul> </li>
+
+ </ul>
+ <ul>
+
+ <li>
+ <h2>Deprecated:</h2>
+ <ul class="dots">
+Version 6 is a major upgrade from previous versions and <span class="maroon"><b>quite a number of changes have been made to exposed structures and functions</b></span>. To minimize inconvenience to existing library users, some code has been retained and some added
+to maintain backward compatibility. However, because this code will be
+removed in a future update, it has been marked as deprecated and a
+precompiler directive <a href="./Deprecated.htm"><b>use_deprecated</b></a>
+has been defined.
+
+ </ul> </li>
+
+ </ul> </li>
+
+
+ <li>
+ <h2>v5.1.6 (23 May 2013)</h2>
+ <ul>
+
+ <li>
+ <h2>BugFix:</h2>
+ <ul class="dots">
+The <a href="../Units/ClipperLib/Functions/CleanPolygon.htm">CleanPolygon</a>
+function was buggy.
+
+ </ul> </li>
+
+ <li>
+ <h2>Added:</h2>
+ <ul class="dots">
+New OffsetPolyLines function. (Replaced with OffsetPaths function in
+ver 6.)
+
+ </ul> </li>
+
+ <li>
+ <h2>Changed:</h2>
+ <ul class="dots">
+The behaviour of the 'miter' JoinType has
+been changed so that when squaring occurs, it's no longer extended up
+to the miter limit but is squared off at exactly 'delta' units. (This
+improves the look of mitering with larger limits at acute angles.)
+
+ </ul> </li>
+
+ <li>
+ <h2>Update:</h2>
+ <ul class="dots">
+Minor code refactoring and optimisations.
+
+ </ul> </li>
+
+ </ul> </li>
+
+ <li>
+ <h2>v5.1.5 (5 May 2013)</h2>
+ <ul>
+
+ <li>
+ <h2>Update:</h2>
+ <ul class="dots">
+ForceSimple property added to the Clipper Class. (Renamed
+StrictlySimple in ver 6.)
+
+ </ul> </li>
+
+ <li>
+ <h2>Update:</h2>
+ <ul class="dots">
+Further improvements to this documentation.
+
+ </ul> </li>
+
+ <li>
+ <h2>Update:</h2>
+ <ul class="dots">
+Minor code optimisations and trivial bug fixes.
+
+ </ul> </li>
+
+ </ul> </li>
+
+ <li>
+ <h2>v5.1.4 (24 March 2013)</h2>
+ <ul>
+
+ <li>
+ <h2>Update:</h2>
+ <ul class="dots">
+ <a href="../Units/ClipperLib/Functions/CleanPolygon.htm">CleanPolygon</a>
+function enhanced.
+
+ </ul> </li>
+
+ <li>
+ <h2>Update:</h2>
+ <ul class="dots">
+Documentation improved.
+
+ </ul> </li>
+
+ </ul> </li>
+
+ <li>
+ <h2>v5.1.3 (12 March 2013)</h2>
+ <ul>
+
+ <li>
+ <h2>Bugfix:</h2>
+ <ul class="dots">
+Minor bug fixes.
+
+ </ul> </li>
+
+ <li>
+ <h2>Update:</h2>
+ <ul class="dots">
+Documentation significantly improved.
+
+ </ul> </li>
+
+ </ul> </li>
+
+ <li>
+ <h2>v5.1.2 (26 February 2013)</h2>
+ <ul>
+
+ <li>
+ <h2>Bugfix:</h2>
+ <ul class="dots">
+PolyNode class was missing a constructor.
+
+ </ul> </li>
+
+ <li>
+ <h2>Update:</h2>
+ <ul class="dots">
+The <i>MiterLimit</i> parameter in the <a href="../Units/ClipperLib/Functions/OffsetPaths.htm">OffsetPolygons</a>
+function has been renamed <i>Limit</i> and can now also be used to
+limit the number of vertices used to construct arcs when JoinType is
+set to jtRound.
+
+ </ul> </li>
+
+ </ul> </li>
+
+ <li>
+ <h2>v5.1.0 (17 February 2013)</h2>
+ <ul>
+
+ <li>
+ <h2>Update:</h2>
+ <ul class="dots">
+ExPolygons has been replaced with the <a href="../Units/ClipperLib/Classes/PolyTree/_Body.htm">PolyTree</a> / <a href="../Units/ClipperLib/Classes/PolyNode/_Body.htm">PolyNode</a>
+classes to more fully represent the parent-child relationships of the
+polygons returned by Clipper's <a href="../Units/ClipperLib/Classes/Clipper/Methods/Execute.htm">Execute</a>
+method.
+
+ </ul> </li>
+
+ <li>
+ <h2>Added:</h2>
+ <ul class="dots">
+New <a href="../Units/ClipperLib/Functions/CleanPolygon.htm">CleanPolygon</a>
+and <a href="../Units/ClipperLib/Functions/CleanPolygons.htm">CleanPolygons</a>
+functions.
+
+ </ul> </li>
+
+ <li>
+ <h2>Bugfix:</h2>
+ <ul class="dots">
+Another orientation bug fixed.
+
+ </ul> </li>
+
+ </ul> </li>
+
+ <li>
+ <h2>v5.0.2 (30 December 2012)</h2>
+ <ul>
+
+ <li>
+ <h2>Bugfix:</h2>
+ <ul class="dots">
+Significant fixes in and tidy of the internal Int128 class (which is
+used only when polygon coordinate values are greater than ±0x3FFFFFFF
+(~1.07e9)).
+
+ </ul> </li>
+
+ <li>
+ <h2>Update:</h2>
+ <ul class="dots">
+The <a href="../Units/ClipperLib/Functions/Area.htm">Area</a> function
+has been updated with a faster algorithm.
+
+ </ul> </li>
+
+ <li>
+ <h2>Update:</h2>
+ <ul class="dots">
+Documentation updates. The newish but undocumented 'CheckInputs'
+parameter of the <a href="../Units/ClipperLib/Functions/OffsetPaths.htm">OffsetPolygons</a>
+function has been renamed 'AutoFix' and documented too. The comments on
+ <a href="./Rounding.htm">rounding</a> have also been improved
+(ie clearer and expanded).
+
+ </ul> </li>
+
+ </ul> </li>
+
+ <li>
+ <h2>v4.10.0 (25 December 2012)</h2>
+ <ul>
+
+ <li>
+ <h2>Bugfix:</h2>
+ <ul class="dots">
+Orientation bugs should now be resolved (finally!).
+
+ </ul> </li>
+
+ <li>
+ <h2>Bugfix:</h2>
+ <ul class="dots">
+Bug in Int128 class.
+
+ </ul> </li>
+
+ </ul> </li>
+
+ <li>
+ <h2>v4.9.8 (2 December 2012)</h2>
+ <ul>
+
+ <li>
+ <h2>Bugfix:</h2>
+ <ul class="dots">
+Further fixes to rare Orientation bug.
+
+ </ul> </li>
+
+ </ul> </li>
+
+ <li>
+ <h2>v4.9.7 (29 November 2012)</h2>
+ <ul>
+
+ <li>
+ <h2>Bugfix:</h2>
+ <ul class="dots">
+Bug that very rarely returned a wrong polygon orientation.
+
+ </ul> </li>
+
+ <li>
+ <h2>Bugfix:</h2>
+ <ul class="dots">
+Obscure bug affecting OffsetPolygons when using jtRound for the
+JoinType parameter and when polygons also contain very large coordinate
+values.
+
+ </ul> </li>
+
+ </ul> </li>
+
+ <li>
+ <h2>v4.9.6 (9 November 2012)</h2>
+ <ul>
+
+ <li>
+ <h2>Bugfix:</h2>
+ <ul class="dots">
+Another obscure bug related to joining intersections.
+
+ </ul> </li>
+
+ </ul> </li>
+
+ <li>
+ <h2>v4.9.4 (2 November 2012)</h2>
+ <ul>
+
+ <li>
+ <h2>Bugfix:</h2>
+ <ul class="dots">
+Bugs in Int128 class occasionally causing wrong orientations.
+
+ </ul> </li>
+
+ <li>
+ <h2>Bugfix:</h2>
+ <ul class="dots">
+Further fixes related to joining intersections.
+
+ </ul> </li>
+
+ </ul> </li>
+
+ <li>
+ <h2>v4.9.0 (9 October 2012)</h2>
+ <ul>
+
+ <li>
+ <h2>Bugfix:</h2>
+ <ul class="dots">
+Obscure bug related to joining intersections.
+
+ </ul> </li>
+
+ </ul> </li>
+
+ <li>
+ <h2>v4.8.9 (25 September 2012)</h2>
+ <ul>
+
+ <li>
+ <h2>Bugfix:</h2>
+ <ul class="dots">
+Obscure bug related to precision of intersections.
+
+ </ul> </li>
+
+ </ul> </li>
+
+ <li>
+ <h2>v4.8.8 (30 August 2012)</h2>
+ <ul>
+
+ <li>
+ <h2>Bugfix:</h2>
+ <ul class="dots">
+Fixed bug in OffsetPolygons function introduced in version 4.8.5.
+
+ </ul> </li>
+
+ </ul> </li>
+
+ <li>
+ <h2>v4.8.7 (24 August 2012)</h2>
+ <ul>
+
+ <li>
+ <h2>Bugfix:</h2>
+ <ul class="dots">
+ReversePolygon function in C++ translation was broken.
+
+ </ul> </li>
+
+ <li>
+ <h2>Bugfix:</h2>
+ <ul class="dots">
+Two obscure bugs affecting orientation fixed too.
+
+ </ul> </li>
+
+ </ul> </li>
+
+ <li>
+ <h2>v4.8.6 (11 August 2012)</h2>
+ <ul>
+
+ <li>
+ <h2>Bugfix:</h2>
+ <ul class="dots">
+Potential for memory overflow errors when using ExPolygons structure.
+
+ </ul> </li>
+
+ </ul>
+ <ul>
+
+ <li>
+ <h2>Bugfix:</h2>
+ <ul class="dots">
+The polygon coordinate range has been reduced to ± 0x3FFFFFFFFFFFFFFF
+(4.6e18).
+
+ </ul> </li>
+
+ </ul>
+ <ul>
+
+ <li>
+ <h2>Update:</h2>
+ <ul class="dots">
+ReversePolygons function was misnamed ReversePoints in C++.
+
+ </ul> </li>
+
+ </ul>
+ <ul>
+
+ <li>
+ <h2>Update:</h2>
+ <ul class="dots">
+SimplifyPolygon function now takes a PolyFillType parameter.
+
+ </ul> </li>
+
+ </ul> </li>
+
+ <li>
+ <h2>v4.8.5 (15 July 2012)</h2>
+ <ul>
+
+ <li>
+ <h2>Bugfix:</h2>
+ <ul class="dots">
+Potential for memory overflow errors in <a href="../Units/ClipperLib/Functions/OffsetPaths.htm">OffsetPolygons</a>().
+
+ </ul> </li>
+
+ </ul> </li>
+
+ <li>
+ <h2>v4.8.4 (1 June 2012)</h2>
+ <ul>
+
+ <li>
+ <h2>Bugfix:</h2>
+ <ul class="dots">
+Another obscure bug affecting ExPolygons structure.
+
+ </ul> </li>
+
+ </ul> </li>
+
+ <li>
+ <h2>v4.8.3 (27 May 2012)</h2>
+ <ul>
+
+ <li>
+ <h2>Bugfix:</h2>
+ <ul class="dots">
+Obscure bug causing incorrect removal of a vertex.
+
+ </ul> </li>
+
+ </ul> </li>
+
+ <li>
+ <h2>v4.8.2 (21 May 2012)</h2>
+ <ul>
+
+ <li>
+ <h2>Bugfix:</h2>
+ <ul class="dots">
+Obscure bug could cause an exception when using ExPolygon structure.
+
+ </ul> </li>
+
+ </ul> </li>
+
+ <li>
+ <h2>v4.8.1 (12 May 2012)</h2>
+ <ul>
+
+ <li>
+ <h2>Update:</h2>
+ <ul class="dots">
+Code tidy and minor bug fixes.
+
+ </ul> </li>
+
+ </ul> </li>
+
+ <li>
+ <h2>v4.8.0 (30 April 2012)</h2>
+ <ul>
+
+ <li>
+ <h2>Bugfix:</h2>
+ <ul class="dots">
+Occasional errors in orientation fixed.
+
+ </ul> </li>
+
+ <li>
+ <h2>Update:</h2>
+ <ul class="dots">
+Added notes on <a href="Rounding.htm">rounding</a> to the
+documentation.
+
+ </ul> </li>
+
+ </ul> </li>
+
+ <li>
+ <h2>v4.7.6 (11 April 2012)</h2>
+ <ul>
+
+ <li>
+ <h2>Bugfix:</h2>
+ <ul class="dots">
+Fixed a bug in the <a href="../Units/ClipperLib/Functions/Orientation.htm">Orientation</a>
+function (affecting C# translations only).
+
+ </ul> </li>
+
+ <li>
+ <h2>Update:</h2>
+ <ul class="dots">
+Minor documentation update.
+
+ </ul> </li>
+
+ </ul> </li>
+
+ <li>
+ <h2>v4.7.5 (28 March 2012)</h2>
+ <ul>
+
+ <li>
+ <h2>Bugfix:</h2>
+ <ul class="dots">
+Fixed a recently introduced bug that occasionally caused an unhandled
+exception in C++ and C# translations.
+
+ </ul> </li>
+
+ </ul> </li>
+
+ <li>
+ <h2>v4.7.1 (3 March 2012)</h2>
+ <ul>
+
+ <li>
+ <h2>Bugfix:</h2>
+ <ul class="dots">
+Rare crash when JoinCommonEdges joined polygons that 'cancelled' each
+other.
+
+ </ul> </li>
+
+ <li>
+ <h2>Bugfix:</h2>
+ <ul class="dots">
+Clipper's internal Orientation method occasionally returned wrong
+result.
+
+ </ul> </li>
+
+ <li>
+ <h2>Update:</h2>
+ <ul class="dots">
+Improved C# code (thanks to numerous suggestions from David Piepgrass)
+
+ </ul> </li>
+
+ </ul> </li>
+
+ <li>
+ <h2>v4.7 (10 February 2012)</h2>
+ <ul>
+
+ <li>
+ <h2>Update:</h2>
+ <ul class="dots">
+Improved the joining of output polygons sharing a common edge.
+
+ </ul> </li>
+
+ </ul> </li>
+
+ <li>
+ <h2>v4.6.4 (8 December 2011)</h2>
+ <ul>
+
+ <li>
+ <h2>Added:</h2>
+ <ul class="dots">
+Added <a href="../Units/ClipperLib/Functions/SimplifyPolygon.htm">SimplifyPolygon</a>
+and <a href="../Units/ClipperLib/Functions/SimplifyPolygons.htm">SimplifyPolygons</a>
+functions.
+
+ </ul> </li>
+
+ </ul> </li>
+
+ <li>
+ <h2>v4.6 (29 October 2011)</h2>
+ <ul>
+
+ <li>
+ <h2>Added:</h2>
+ <ul class="dots">
+Support for <b>Positive</b> and <b>Negative</b> <a href="../Units/ClipperLib/Types/PolyFillType.htm">polygon fill types </a>(in addition to the EvenOdd and NonZero fill types).
+
+ </ul> </li>
+
+ <li>
+ <h2>Bugfix:</h2>
+ <ul class="dots">
+The <a href="../Units/ClipperLib/Functions/OffsetPaths.htm">OffsetPolygons</a>
+function was generating the occasional artefact when 'shrinking'
+polygons.
+
+ </ul> </li>
+
+ </ul> </li>
+
+ <li>
+ <h2>v4.5.5 (6 October 2011)</h2>
+ <ul>
+
+ <li>
+ <h2>Bugfix:</h2>
+ <ul class="dots">
+Fixed an obscure bug in Clipper's JoinCommonEdges method.
+
+ </ul> </li>
+
+ <li>
+ <h2>Update:</h2>
+ <ul class="dots">
+Replaced IsClockwise function with <a href="../Units/ClipperLib/Functions/Orientation.htm">Orientation</a>
+function. The orientation issues affecting OffsetPolygons should
+finally be resolved.
+
+ </ul> </li>
+
+ <li>
+ <h2>Change:</h2>
+ <ul class="dots">
+The <a href="../Units/ClipperLib/Functions/Area.htm">Area</a> function
+once again returns the <em>signed</em> area.
+
+ </ul> </li>
+
+ </ul> </li>
+
+ <li>
+ <h2>v4.4.0 (6 August 2011)</h2>
+ <ul>
+
+ <li>
+ <h2>BugFix:</h2>
+ <ul class="dots">
+A number of minor bugfixes that mostly affected the new ExPolygons
+structure.
+
+ </ul> </li>
+
+ </ul> </li>
+
+ <li>
+ <h2>v4.3.0 (17 June 2011)</h2>
+ <ul>
+
+ <li>
+ <h2>Added:</h2>
+ <ul class="dots">
+ExPolygons structure that explicitly associates 'hole' polygons with
+their 'outer' container polygons.
+
+ </ul> </li>
+
+ <li>
+ <h2>Added:</h2>
+ <ul class="dots">
+ <a href="../Units/ClipperLib/Classes/Clipper/Methods/Execute.htm">Execute</a>
+method now overloaded so the solution parameter can be either <a href="../Units/ClipperLib/Types/Paths.htm">Polygons</a> or
+ExPolygons.
+
+ </ul> </li>
+
+ <li>
+ <h2>Bug fix:</h2>
+ <ul class="dots">
+Fixed a rare bug in the orientation of solution polygons.
+
+ </ul> </li>
+
+ </ul> </li>
+
+ <li>
+ <h2>v4.2.4 (26 April 2011)</h2>
+ <ul>
+
+ <li>
+ <h2>Update:</h2>
+ <ul class="dots">
+Input polygon coordinates can now contain the full range of signed
+64bit integers (ie +/-9,223,372,036,854,775,807). This means that
+floating point values can be converted to and from Clipper's 64bit
+vertex structure (<a href="../Units/ClipperLib/Types/IntPoint.htm">IntPoint</a>)
+and still retain a precision of up to 18 decimal places. However, since
+the large-integer math that supports this expanded range imposes a
+small cost on performance (~15%), a new property UseFullCoordinateRange
+has been added to the Clipper class to allow users the choice of
+whether or not to use this expanded coordinate range. If this property
+is disabled, coordinate values are restricted to +/-1,500,000,000. (By
+default, this property is enabled.)
+
+ </ul> </li>
+
+ </ul> </li>
+
+ <li>
+ <h2>v4.0 (4 April 2011)</h2>
+ <ul>
+
+ <li>
+ <h2>Major update:</h2>
+ <ul class="dots">
+Clipper is a major rewrite of earlier versions. The biggest change is
+that floating point values are no longer used, except for the storing
+of edge slope values. The main benefit of this is the issue of
+numerical robustness has been addressed. Due to other major code
+improvements Clipper v4 is approximately 40% faster than Clipper v3.
+
+ </ul> </li>
+
+ <li>
+ <h2>Changes:</h2>
+ <ul class="dots">
+The AddPolyPolygon method has been renamed to AddPolygons, and the
+IgnoreOrientation property has been removed. The clipper_misc library
+has been merged back into the clipper library.
+
+ </ul> </li>
+
+ </ul> </li>
+
+ <li>
+ <h2>v2.8 (20 November 2010)</h2>
+ <ul>
+
+ <li>
+ <h2>Updated:</h2>
+ <ul class="dots">
+Output polygons which previously shared a common edge are now merged.
+
+ </ul> </li>
+
+ <li>
+ <h2>Added:</h2>
+ <ul class="dots">
+Added support module for Cairo Graphics Library (with accompanying
+demo).
+
+ </ul> </li>
+
+ <li>
+ <h2>Added:</h2>
+ <ul class="dots">
+Added C# and C++ demos.
+
+ </ul> </li>
+
+ </ul> </li>
+
+ <li>
+ <h2>v2.522 (15 October 2010)</h2>
+ <ul>
+
+ <li>
+ <h2>Added:</h2>
+ <ul class="dots">
+Added C# translation (thanks to Olivier Lejeune) and a link to Ruby
+bindings (thanks to Mike Owens).
+
+ </ul> </li>
+
+ </ul> </li>
+
+ <li>
+ <h2>v2.0 (31 July 2010)</h2>
+ <ul>
+
+ <li>
+ <h2>Major update:</h2>
+ <ul class="dots">
+Clipper now processes polygons using both the Even-Odd (alternate) and
+Non-Zero (winding) filling rules.
+
+ </ul> </li>
+
+ </ul> </li>
+
+ <li>
+ <h2>v1.4c (16 June 2010)</h2>
+ <ul>
+
+ <li>
+ <h2>Additions:</h2>
+ <ul class="dots">
+Added Delphi and C++ units to support the AGG graphics library
+
+ </ul> </li>
+
+ </ul> </li>
+
+ <li>
+ <h2>v1.2s (2 June 2010)</h2>
+ <ul>
+
+ <li>
+ <h2>Additions:</h2>
+ <ul class="dots">
+C++ translation of Delphi code
+
+ </ul> </li>
+
+ </ul> </li>
+
+ <li>
+ <h2>v1.0 (9 May 2010) - Initial public release</h2> </li>
+
+
+ </ul>
+
+<img src="../../Images/_buttons.gif" height="1" width="1">
+
+
+ <h2 id="Auto-SeeAlso">See Also</h2>
+ <p class="Body"><a href="Deprecated.htm">Deprecated</a>, <a href="Rounding.htm">Rounding</a>, <a href="../Units/ClipperLib/Classes/Clipper/Methods/Constructor.htm">Clipper.Constructor</a>, <a href="../Units/ClipperLib/Classes/Clipper/Methods/Execute.htm">Clipper.Execute</a>, <a href="../Units/ClipperLib/Classes/Clipper/Properties/ZFillFunction.htm">Clipper.ZFillFunction</a>, <a href="../Units/ClipperLib/Classes/ClipperBase/Methods/AddPath.htm">ClipperBase.AddPath</a>, <a href="../Units/ClipperLib/Classes/ClipperBase/Methods/AddPaths.htm">ClipperBase.AddPaths</a>, <a href="../Units/ClipperLib/Classes/ClipperOffset/_Body.htm">ClipperOffset</a>, <a href="../Units/ClipperLib/Classes/ClipperOffset/Methods/Execute.htm">ClipperOffset.Execute</a>, <a href="../Units/ClipperLib/Classes/PolyNode/_Body.htm">PolyNode</a>, <a href="../Units/ClipperLib/Classes/PolyTree/_Body.htm">PolyTree</a>, <a href="../Units/ClipperLib/Functions/Area.htm">Area</a>, <a href="../Units/ClipperLib/Functions/CleanPolygon.htm">CleanPolygon</a>, <a href="../Units/ClipperLib/Functions/CleanPolygons.htm">CleanPolygons</a>, <a href="../Units/ClipperLib/Functions/ClosedPathsFromPolyTree.htm">ClosedPathsFromPolyTree</a>, <a href="../Units/ClipperLib/Functions/MinkowskiDiff.htm">MinkowskiDiff</a>, <a href="../Units/ClipperLib/Functions/MinkowskiSum.htm">MinkowskiSum</a>, <a href="../Units/ClipperLib/Functions/OffsetPaths.htm">OffsetPaths</a>, <a href="../Units/ClipperLib/Functions/OpenPathsFromPolyTree.htm">OpenPathsFromPolyTree</a>, <a href="../Units/ClipperLib/Functions/Orientation.htm">Orientation</a>, <a href="../Units/ClipperLib/Functions/PointInPolygon.htm">PointInPolygon</a>, <a href="../Units/ClipperLib/Functions/PolyTreeToPaths.htm">PolyTreeToPaths</a>, <a href="../Units/ClipperLib/Functions/SimplifyPolygon.htm">SimplifyPolygon</a>, <a href="../Units/ClipperLib/Functions/SimplifyPolygons.htm">SimplifyPolygons</a>, <a href="../Units/ClipperLib/PreProcessor/Defines.htm">Defines</a>, <a href="../Units/ClipperLib/Types/CInt.htm">CInt</a>, <a href="../Units/ClipperLib/Types/InitOptions.htm">InitOptions</a>, <a href="../Units/ClipperLib/Types/IntPoint.htm">IntPoint</a>, <a href="../Units/ClipperLib/Types/Path.htm">Path</a>, <a href="../Units/ClipperLib/Types/Paths.htm">Paths</a>, <a href="../Units/ClipperLib/Types/PolyFillType.htm">PolyFillType</a>, <a href="../Units/ClipperLib/Types/ZFillCallback.htm">ZFillCallback</a></p>
+
+ <p class="Copyright" id="auto"> <br><br> Copyright &copy;2010-2014 Angus Johnson&nbsp; - &nbsp; Clipper 6.2.1 &nbsp; - &nbsp; Help file built on 1-November-2014 <br><br> </p>
+
+</body>
+
+</html> \ No newline at end of file
diff --git a/upstream/clipper-6.4.2/Documentation/Docs/Overview/Deprecated.htm b/upstream/clipper-6.4.2/Documentation/Docs/Overview/Deprecated.htm
new file mode 100644
index 0000000..7a8f254
--- /dev/null
+++ b/upstream/clipper-6.4.2/Documentation/Docs/Overview/Deprecated.htm
@@ -0,0 +1,69 @@
+<html>
+
+<head>
+
+ <script type="text/javascript" src="../../Scripts/jquery.js">
+ </script>
+
+ <script type="text/javascript" src="../../Scripts/SyntaxHighlighter/scripts/shCore.js">
+ </script>
+
+ <script type="text/javascript" src="../../Scripts/SyntaxHighlighter/scripts/shBrushDelphi.js">
+ </script>
+
+ <script type="text/javascript" src="../../Scripts/SyntaxHighlighter/scripts/shBrushCpp.js">
+ </script>
+
+ <script type="text/javascript" src="../../Scripts/SyntaxHighlighter/scripts/shBrushCSharp.js">
+ </script>
+
+ <link type="text/css" rel="stylesheet" href="../../Scripts/SyntaxHighlighter/styles/shCoreDefault.css">
+
+ <link type="text/css" rel="stylesheet" href="../../Scripts/SyntaxHighlighter/styles/shThemeDefault.css">
+
+
+ <title>Deprecated</title>
+
+ <link rel="stylesheet" href="../../Styles/default.css" type="text/css">
+
+
+ <script type="text/javascript" src="../../Scripts/bootstrap.js">
+ </script>
+
+</head>
+
+<body bgcolor="#FFFFFF">
+
+ <!-- THIS FILE HAS BEEN AUTOMATICALLY PROCESSED FROM A SOURCE COPY -->
+
+ <!-- DO NOT EDIT MANUALLY !!! -->
+
+ <table class="Banner" cellspacing="0" cellpadding="0" border="1" bordercolorlight="#303080" bordercolordark="#7070B0">
+ <tr>
+ <td class="Banner" nowrap=""><a href="../_Body.htm" class="Banner"><img src="../../Images/_Home.gif" align="absmiddle">Home</a>
+ </td>
+ <td class="Banner" nowrap=""><a href="_Body.htm" class="Banner">Overview</a>
+ </td>
+ <td class="Banner" width="100%" align="right"><img src="../../Images/_Project_Logo.gif" align="absmiddle">
+ </td>
+ </tr>
+ </table>
+ <h1>Deprecated</h1>
+
+
+ <p class="Body"> The precompiler directive <b>'use_deprecated'</b> allows users to update the Clipper library without being forced to make immediate changes to code that accesses the library. Depricated code will be removed in a future update. (Enabled by default.)<br><br> <b>Deprecated types and functions:</b><br><br> All deprecated code has been removed from version 6.2.0.
+ <!-- <table cellspacing="2" cellpadding="2" border="0">
+<tr>
+ <td width="140px">&nbsp;</td>
+ <td>Replaced by &nbsp;</td>
+</tr>
+</table>
+ --> </p>
+
+
+
+ <p class="Copyright" id="auto"> <br><br> Copyright &copy;2010-2014 Angus Johnson&nbsp; - &nbsp; Clipper 6.2.1 &nbsp; - &nbsp; Help file built on 1-November-2014 <br><br> </p>
+
+</body>
+
+</html> \ No newline at end of file
diff --git a/upstream/clipper-6.4.2/Documentation/Docs/Overview/Example.htm b/upstream/clipper-6.4.2/Documentation/Docs/Overview/Example.htm
new file mode 100644
index 0000000..ded5dd5
--- /dev/null
+++ b/upstream/clipper-6.4.2/Documentation/Docs/Overview/Example.htm
@@ -0,0 +1,234 @@
+<html>
+
+<head>
+
+ <script type="text/javascript" src="../../Scripts/jquery.js">
+ </script>
+
+ <script type="text/javascript" src="../../Scripts/SyntaxHighlighter/scripts/shCore.js">
+ </script>
+
+ <script type="text/javascript" src="../../Scripts/SyntaxHighlighter/scripts/shBrushDelphi.js">
+ </script>
+
+ <script type="text/javascript" src="../../Scripts/SyntaxHighlighter/scripts/shBrushCpp.js">
+ </script>
+
+ <script type="text/javascript" src="../../Scripts/SyntaxHighlighter/scripts/shBrushCSharp.js">
+ </script>
+
+ <link type="text/css" rel="stylesheet" href="../../Scripts/SyntaxHighlighter/styles/shCoreDefault.css">
+
+ <link type="text/css" rel="stylesheet" href="../../Scripts/SyntaxHighlighter/styles/shThemeDefault.css">
+
+
+ <title>Example</title>
+
+ <link rel="stylesheet" href="../../Styles/default.css" type="text/css">
+
+
+ <script type="text/javascript" src="../../Scripts/bootstrap.js">
+ </script>
+
+</head>
+
+<body bgcolor="#FFFFFF">
+
+ <!-- THIS FILE HAS BEEN AUTOMATICALLY PROCESSED FROM A SOURCE COPY -->
+
+ <!-- DO NOT EDIT MANUALLY !!! -->
+
+ <table class="Banner" cellspacing="0" cellpadding="0" border="1" bordercolorlight="#303080" bordercolordark="#7070B0">
+ <tr>
+ <td class="Banner" nowrap=""><a href="../_Body.htm" class="Banner"><img src="../../Images/_Home.gif" align="absmiddle">Home</a>
+ </td>
+ <td class="Banner" nowrap=""><a href="_Body.htm" class="Banner">Overview</a>
+ </td>
+ <td class="Banner" width="100%" align="right"><img src="../../Images/_Project_Logo.gif" align="absmiddle">
+ </td>
+ </tr>
+ </table>
+ <h1>Example</h1>
+
+
+ <table cellspacing="0" cellpadding="0" border="0" align="left" style="margin: 0;" width="600px">
+ <th align="left">Delphi Code Sample:
+ </th>
+
+ <tr>
+ <td class="White">
+
+ <pre class="brush: delphi;">
+ uses
+ graphics32, clipper;
+
+ function GetEllipsePoints(bounds: TIntRect): TPath;
+ begin
+ //code to create an elliptical polygon here
+ end;
+
+ procedure DrawPolygons(polys: TPaths; color: TColor32);
+ begin
+ //code to display the polygons here
+ end;
+
+ var
+ sub, clp, sol: TPaths;
+ begin
+
+ //set up the subject and clip polygons ...
+ setlength(sub, 3);
+ sub[0] := GetEllipsePoints(IntRect(100,100,300,300));
+ sub[1] := GetEllipsePoints(IntRect(125,130,275,180));
+ sub[2] := GetEllipsePoints(IntRect(125,220,275,270));
+
+ setlength(clp, 1);
+ clp[0] := GetEllipsePoints(IntRect(140,70,220,320));
+
+ //display the subject and clip polygons ...
+ DrawPolygons(sub, 0x8033FFFF);
+ DrawPolygons(clp, 0x80FFFF33);
+
+ //get the intersection of the subject and clip polygons ...
+ with TClipper.Create do
+ try
+ AddPaths(sub, ptSubject, true);
+ AddPaths(clp, ptClip, true);
+ Execute(ctIntersection, sol, pftEvenOdd, pftEvenOdd);
+ finally
+ free;
+ end;
+
+ //finally draw the intersection polygons ...
+ DrawPolygons(sol, 0x40808080);
+ </pre>
+
+ </td>
+ </tr>
+
+ </table>
+ <div style="clear:both">&nbsp;</div>
+
+
+
+ <table cellspacing="0" cellpadding="0" border="0" align="left" style="margin: 0;" width="600px">
+ <th align="left">C++ Code Sample:
+ </th>
+
+ <tr>
+ <td class="White">
+
+ <pre class="brush: cpp;">
+ #include "clipper.hpp"
+
+ ...
+
+ //from clipper.hpp ...
+ //typedef long long cInt;
+ //struct IntPoint {cInt X; cInt Y;};
+ //typedef std::vector&lt;IntPoint&gt; Path;
+ //typedef std::vector&lt;Polygon&gt; Paths;
+
+ using namespace ClipperLib;
+
+ void GetEllipsePoints(IntRect& bounds, Path& p)
+ {/* ... */}
+
+ void DrawPolygons(Paths& p, unsigned color)
+ {/* ... */}
+
+ int main()
+ {
+ //set up the subject and clip polygons ...
+ Paths sub(3);
+ GetEllipsePoints(IntRect(100,100,300,300), sub[0]);
+ GetEllipsePoints(IntRect(125,130,275,180), sub[1]);
+ GetEllipsePoints(IntRect(125,220,275,270), sub[2]);
+
+ Paths clp(1);
+ GetEllipsePoints(IntRect(140,70,220,320), clp[0]);
+
+ //display the subject and clip polygons ...
+ DrawPolygons(sub, 0x8033FFFF);
+ DrawPolygons(clp, 0x80FFFF33);
+
+ //get the intersection of the subject and clip polygons ...
+ Clipper clpr;
+ clpr.AddPaths(sub, ptSubject, true);
+ clpr.AddPaths(clp, ptClip, true);
+ Paths solution;
+ clpr.Execute(ctIntersection, solution, pftEvenOdd, pftEvenOdd);
+
+ //finally draw the intersection polygons ...
+ DrawPolygons(solution, 0x40808080);
+ }
+ </pre>
+
+
+ </td>
+ </tr>
+
+ </table>
+ <div style="clear:both">&nbsp;</div>
+
+
+ <table cellspacing="0" cellpadding="0" border="0" align="left" style="margin: 0;" width="600px">
+ <th align="left">C# Code Sample:
+ </th>
+
+ <tr>
+ <td class="White">
+
+ <pre class="brush: csharp;">
+ ...
+ using ClipperLib;
+
+ ...
+ using Path = List&lt;IntPoint&gt;;
+ using Paths = List&lt;List&lt;IntPoint&gt;&gt;;
+
+ static Path GetEllipsePoints(IntRect bounds)
+ {/* ... */}
+
+ static void DrawPolygons(Path p, uint color)
+ {/* ... */}
+
+ static void Main(string[] args)
+ {
+ Paths subjs = new Paths(3);
+ subjs.Add(GetEllipsePoints(new IntRect(100,100,300,300)));
+ subjs.Add(GetEllipsePoints(new IntRect(125,130,275,180)));
+ subjs.Add(GetEllipsePoints(new IntRect(125,220,275,270)));
+
+ Paths clips = new Paths(1);
+ clips.Add(GetEllipsePoints(new IntRect(140,70,220,320)));
+
+ DrawPolygons(subjs, 0x8033FFFF);
+ DrawPolygons(clips, 0x80FFFF33);
+
+ Paths solution = new Paths();
+ Clipper c = new Clipper();
+ c.AddPaths(subjs, PolyType.ptSubject, true);
+ c.AddPaths(clips, PolyType.ptClip, true);
+ c.Execute(ClipType.ctIntersection, solution);
+
+ DrawPolygons(solution, 0x40808080);
+ }
+ </pre>
+
+ </td>
+ </tr>
+
+ </table>
+
+ <div style="clear:both">&nbsp;</div>
+ <img src="../../Images/sample1.png" alt="" border="0">
+
+
+
+ <p class="Copyright" id="auto"> <br><br> Copyright &copy;2010-2014 Angus Johnson&nbsp; - &nbsp; Clipper 6.2.1 &nbsp; - &nbsp; Help file built on 1-November-2014 <br><br> </p>
+
+</body>
+
+
+</html> \ No newline at end of file
diff --git a/upstream/clipper-6.4.2/Documentation/Docs/Overview/FAQ.htm b/upstream/clipper-6.4.2/Documentation/Docs/Overview/FAQ.htm
new file mode 100644
index 0000000..91459b9
--- /dev/null
+++ b/upstream/clipper-6.4.2/Documentation/Docs/Overview/FAQ.htm
@@ -0,0 +1,104 @@
+<html>
+
+<head>
+
+ <script type="text/javascript" src="../../Scripts/jquery.js">
+ </script>
+
+ <script type="text/javascript" src="../../Scripts/SyntaxHighlighter/scripts/shCore.js">
+ </script>
+
+ <script type="text/javascript" src="../../Scripts/SyntaxHighlighter/scripts/shBrushDelphi.js">
+ </script>
+
+ <script type="text/javascript" src="../../Scripts/SyntaxHighlighter/scripts/shBrushCpp.js">
+ </script>
+
+ <script type="text/javascript" src="../../Scripts/SyntaxHighlighter/scripts/shBrushCSharp.js">
+ </script>
+
+ <link type="text/css" rel="stylesheet" href="../../Scripts/SyntaxHighlighter/styles/shCoreDefault.css">
+
+ <link type="text/css" rel="stylesheet" href="../../Scripts/SyntaxHighlighter/styles/shThemeDefault.css">
+
+
+ <title>FAQ</title>
+
+ <link rel="stylesheet" href="../../Styles/default.css" type="text/css">
+
+
+ <script type="text/javascript" src="../../Scripts/bootstrap.js">
+ </script>
+
+</head>
+
+<body bgcolor="#FFFFFF">
+
+ <!-- THIS FILE HAS BEEN AUTOMATICALLY PROCESSED FROM A SOURCE COPY -->
+
+ <!-- DO NOT EDIT MANUALLY !!! -->
+
+ <table class="Banner" cellspacing="0" cellpadding="0" border="1" bordercolorlight="#303080" bordercolordark="#7070B0">
+ <tr>
+ <td class="Banner" nowrap=""><a href="../_Body.htm" class="Banner"><img src="../../Images/_Home.gif" align="absmiddle">Home</a>
+ </td>
+ <td class="Banner" nowrap=""><a href="_Body.htm" class="Banner">Overview</a>
+ </td>
+ <td class="Banner" width="100%" align="right"><img src="../../Images/_Project_Logo.gif" align="absmiddle">
+ </td>
+ </tr>
+ </table>
+ <h1>FAQ</h1>
+
+
+ <p class="Decl5">Why does Clipper use integer coordinates, not floats?</p>
+
+ <p class="Decl4">This has been done to preserve <a href="http://www.mpi-inf.mpg.de/~kettner/pub/nonrobust_cgta_06.pdf" target="_blank">numerical robustness</a>. Early versions of the library did use floating point coordinates, but it became apparent that floating point imprecision was always going to cause occasional errors.<br><br> </p>
+
+
+ <p class="Decl5">How do I use floating point coordinates with Clipper?</p>
+
+ <p class="Decl4">It's a simple task to multiply your floating point coordinates by a scaling factor (that's typically a power of 10 depending on the desired precision). Then with the solution paths, divide the returned coordinates by this same scaling factor. Clipper accepts integer coordinates as large as &plusmn;4.6e18, so it can accommodate very large scaling.<br><br> </p>
+
+
+ <p class="Decl5">Does Clipper handle polygons with holes?</p>
+
+ <p class="Decl4">'Holes' are defined by the specified <a href="../Units/ClipperLib/Types/PolyFillType.htm">polygon filling rule</a>. (See also <a href="../Units/ClipperLib/Classes/Clipper/Methods/Execute.htm">Clipper.Execute</a>)<br><br> </p>
+
+
+ <p class="Decl5">Some polygons in the solution share a common edge. Is this a bug?</p>
+
+ <p class="Decl4"> No, though this should happen rarely as of version 6. (See <a href="../Units/ClipperLib/Classes/Clipper/Methods/Execute.htm">Clipper.Execute</a> for more about this.)<br><br> </p>
+
+
+ <p class="Decl5">I have lots of polygons that I want to 'union'. Can I do this in one operation?</p>
+
+ <p class="Decl4"> Yes. Just add all the polygons as subject polygons to the Clipper object. (You don't have to assign both subject and clip polygons.)<br><br> </p>
+
+
+ <p class="Decl5"> <img src="../../Images/kangaroo_small.png" width="292" height="292" alt="" align="right"> The polygons produced by <a href="../Units/ClipperLib/Classes/ClipperOffset/_Body.htm">ClipperOffset</a> have tiny artefacts? Could this be a bug?</p>
+
+ <p class="Decl4"> Make sure the input polygons don't self-intersect. Tiny self-intersections can sometimes be produced by previous clipping operations. These can be cleaned up using the <a href="../Units/ClipperLib/Functions/CleanPolygon.htm">CleanPolygon</a> and <a href="../Units/ClipperLib/Functions/CleanPolygons.htm">CleanPolygons</a> functions. Also, make sure the supplied polygons don't overlap. If they do, offset these separately. Finally, the precision of the input coordinates may be a problem. Because the Clipper Library only operates on integer coordinates, you may need to scale your coordinates (eg by a factor of 10) to improve precision. <br><br> </p>
+
+
+ <p class="Decl5">Is there an easy way to reverse polygon orientations?</p>
+
+ <p class="Decl4"> Yes, see <a href="../Units/ClipperLib/Functions/ReversePaths.htm">ReversePaths</a>. <br><br> </p>
+
+<div style="clear:both">&nbsp;</div>
+
+
+ <p class="Decl5">My drawings contain lots of beziers, ellipses and arcs. How can I perform clipping operations on these?</p>
+
+ <p class="Decl4"> You'll have to convert them to 'flattened' paths. For an example of how this can be done (and even reconstructed back into beziers, arcs etc), see the CurvesDemo application included in this library. <br><br> </p>
+
+
+ <h2 id="Auto-SeeAlso">See Also</h2>
+ <p class="Body"><a href="../Units/ClipperLib/Classes/Clipper/Methods/Execute.htm">Clipper.Execute</a>, <a href="../Units/ClipperLib/Classes/ClipperOffset/_Body.htm">ClipperOffset</a>, <a href="../Units/ClipperLib/Functions/CleanPolygon.htm">CleanPolygon</a>, <a href="../Units/ClipperLib/Functions/CleanPolygons.htm">CleanPolygons</a>, <a href="../Units/ClipperLib/Functions/ReversePaths.htm">ReversePaths</a>, <a href="../Units/ClipperLib/Types/PolyFillType.htm">PolyFillType</a></p>
+
+ <p class="Copyright" id="auto"> <br><br> Copyright &copy;2010-2014 Angus Johnson&nbsp; - &nbsp; Clipper 6.2.1 &nbsp; - &nbsp; Help file built on 1-November-2014 <br><br> </p>
+
+</body>
+
+
+</html> \ No newline at end of file
diff --git a/upstream/clipper-6.4.2/Documentation/Docs/Overview/License.htm b/upstream/clipper-6.4.2/Documentation/Docs/Overview/License.htm
new file mode 100644
index 0000000..928dda8
--- /dev/null
+++ b/upstream/clipper-6.4.2/Documentation/Docs/Overview/License.htm
@@ -0,0 +1,75 @@
+<html>
+
+<head>
+
+ <script type="text/javascript" src="../../Scripts/jquery.js">
+ </script>
+
+ <script type="text/javascript" src="../../Scripts/SyntaxHighlighter/scripts/shCore.js">
+ </script>
+
+ <script type="text/javascript" src="../../Scripts/SyntaxHighlighter/scripts/shBrushDelphi.js">
+ </script>
+
+ <script type="text/javascript" src="../../Scripts/SyntaxHighlighter/scripts/shBrushCpp.js">
+ </script>
+
+ <script type="text/javascript" src="../../Scripts/SyntaxHighlighter/scripts/shBrushCSharp.js">
+ </script>
+
+ <link type="text/css" rel="stylesheet" href="../../Scripts/SyntaxHighlighter/styles/shCoreDefault.css">
+
+ <link type="text/css" rel="stylesheet" href="../../Scripts/SyntaxHighlighter/styles/shThemeDefault.css">
+
+
+ <title>License</title>
+
+ <link rel="stylesheet" href="../../Styles/default.css" type="text/css">
+
+
+ <script type="text/javascript" src="../../Scripts/bootstrap.js">
+ </script>
+
+</head>
+
+<body bgcolor="#FFFFFF">
+
+ <!-- THIS FILE HAS BEEN AUTOMATICALLY PROCESSED FROM A SOURCE COPY -->
+
+ <!-- DO NOT EDIT MANUALLY !!! -->
+
+ <table class="Banner" cellspacing="0" cellpadding="0" border="1" bordercolorlight="#303080" bordercolordark="#7070B0">
+ <tr>
+ <td class="Banner" nowrap=""><a href="../_Body.htm" class="Banner"><img src="../../Images/_Home.gif" align="absmiddle">Home</a>
+ </td>
+ <td class="Banner" nowrap=""><a href="_Body.htm" class="Banner">Overview</a>
+ </td>
+ <td class="Banner" width="100%" align="right"><img src="../../Images/_Project_Logo.gif" align="absmiddle">
+ </td>
+ </tr>
+ </table>
+ <h1>License</h1>
+
+
+ <p class="Body"> The Clipper Library (including Delphi, C++ &amp; C# source code, other accompanying code, examples and documentation), hereafter called "the Software", has been released under the following license, terms and conditions:</p>
+
+
+ <p class="Body">Boost Software License - Version 1.0 - August 17th, 2003<br> <a href="http://www.boost.org/LICENSE_1_0.txt" target="_blank">http://www.boost.org/LICENSE_1_0.txt</a></p>
+
+
+ <p class="Body">Permission is hereby granted, free of charge, to any person or organization obtaining a copy of the Software covered by this license to use, reproduce, display, distribute, execute, and transmit the Software, and to prepare derivative works of the Software, and to permit third-parties to whom the Software is furnished to do so, all subject to the following:</p>
+
+
+ <p class="Body">The copyright notices in the Software and this entire statement, including the above license grant, this restriction and the following disclaimer, must be included in all copies of the Software, in whole or in part, and all derivative works of the Software, unless such copies or derivative works are solely in the form of machine-executable object code generated by a source language processor.</p>
+
+
+ <p class="Body">THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, TITLE AND NON-INFRINGEMENT. IN NO EVENT SHALL THE COPYRIGHT HOLDERS OR ANYONE DISTRIBUTING THE SOFTWARE BE LIABLE FOR ANY DAMAGES OR OTHER LIABILITY, WHETHER IN CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.</p>
+
+
+
+ <p class="Copyright" id="auto"> <br><br> Copyright &copy;2010-2014 Angus Johnson&nbsp; - &nbsp; Clipper 6.2.1 &nbsp; - &nbsp; Help file built on 1-November-2014 <br><br> </p>
+
+</body>
+
+
+</html> \ No newline at end of file
diff --git a/upstream/clipper-6.4.2/Documentation/Docs/Overview/Rounding.htm b/upstream/clipper-6.4.2/Documentation/Docs/Overview/Rounding.htm
new file mode 100644
index 0000000..cb4d62b
--- /dev/null
+++ b/upstream/clipper-6.4.2/Documentation/Docs/Overview/Rounding.htm
@@ -0,0 +1,71 @@
+<html>
+
+<head>
+
+ <script type="text/javascript" src="../../Scripts/jquery.js">
+ </script>
+
+ <script type="text/javascript" src="../../Scripts/SyntaxHighlighter/scripts/shCore.js">
+ </script>
+
+ <script type="text/javascript" src="../../Scripts/SyntaxHighlighter/scripts/shBrushDelphi.js">
+ </script>
+
+ <script type="text/javascript" src="../../Scripts/SyntaxHighlighter/scripts/shBrushCpp.js">
+ </script>
+
+ <script type="text/javascript" src="../../Scripts/SyntaxHighlighter/scripts/shBrushCSharp.js">
+ </script>
+
+ <link type="text/css" rel="stylesheet" href="../../Scripts/SyntaxHighlighter/styles/shCoreDefault.css">
+
+ <link type="text/css" rel="stylesheet" href="../../Scripts/SyntaxHighlighter/styles/shThemeDefault.css">
+
+
+ <title>Rounding</title>
+
+ <link rel="stylesheet" href="../../Styles/default.css" type="text/css">
+
+
+ <script type="text/javascript" src="../../Scripts/bootstrap.js">
+ </script>
+
+</head>
+
+<body bgcolor="#FFFFFF">
+
+ <!-- THIS FILE HAS BEEN AUTOMATICALLY PROCESSED FROM A SOURCE COPY -->
+
+ <!-- DO NOT EDIT MANUALLY !!! -->
+
+ <table class="Banner" cellspacing="0" cellpadding="0" border="1" bordercolorlight="#303080" bordercolordark="#7070B0">
+ <tr>
+ <td class="Banner" nowrap=""><a href="../_Body.htm" class="Banner"><img src="../../Images/_Home.gif" align="absmiddle">Home</a>
+ </td>
+ <td class="Banner" nowrap=""><a href="_Body.htm" class="Banner">Overview</a>
+ </td>
+ <td class="Banner" width="100%" align="right"><img src="../../Images/_Project_Logo.gif" align="absmiddle">
+ </td>
+ </tr>
+ </table>
+ <h1>Rounding</h1>
+
+
+ <p class="Body"> By using an integer type for polygon coordinates, the Clipper Library has been able to avoid problems of <a href="http://www.mpi-inf.mpg.de/~kettner/pub/nonrobust_cgta_06.pdf"><b>numerical robustness</b></a> that can cause havoc with geometric computations. Problems associated with integer <b>rounding</b> and their possible solutions are discussed below.<br><br> <img src="../../Images/clipper_rounding.png" width="488" height="365" alt="" align="left"> <span class="maroon">It's important to stress at the outset that rounding causes vertices to move fractions of a unit away from their 'true' positions. Nevertheless, the resulting imprecision can be very effectively managed by appropriate scaling.</span><br><br> The Clipper Library supports scaling to <span class="maroon">very high degrees of precision</span> by accepting integer coordinate values in the range &plusmn;0x3FFFFFFFFFFFFFFF (± 4.6e+18).<br><br> Another complication of using a discrete numbers (as opposed to <a href="http://en.wikipedia.org/wiki/Real_number" target="_blank">real numbers</a>) is that very occasionally tiny <b>self-intersection</b> artefacts arise. In the unscaled image on the left (where one unit equals one pixel), the area of intersection of two polygons has been highlighted in bright green.<br><br> </p>
+
+
+ <p class="Body" style="clear='both'"> <img src="../../Images/clipper_rounding2.png" width="440" height="316" alt="" align="right"><br><br> A 30X 'close up' of the lower points of intersection of these same two polygons shows the presence of a tiny self-intersecting artefact. The three 'black dots' highlight the actual points of intersection (with their fractional coordinates displayed). The 'red dots' show where these points of intersection are located once rounding is applied. With a little care you can see that rounding reverses the orientation of these vertices and causes a tiny self-intersecting artefact.<br><br> Although these tiny self-intersections are uncommon, if it's deemed necessary, they are best removed with <a href="../Units/ClipperLib/Functions/CleanPolygons.htm">CleanPolygons</a>. (Setting Clipper's <a href="../Units/ClipperLib/Classes/Clipper/Properties/StrictlySimple.htm">StrictlySimple</a> property to true would also address this self-intersection but the tiny (sub-unit) polygon 'artefact' with incorrect orientation would still appear in the solution.) <br><br> </p>
+
+
+ <p class="Body" style="clear='both'"> <img src="../../Images/clipper_rounding4.png" width="292" height="224" alt="" align="left"><br><br> In this final example, the single polygon on the left also has a tiny self-intersection. However, the clipping algorithm sees this vertex (88,50) as simply 'touching' rather than intersecting the right edge of the polygon (though only by a fraction of a unit). Since this intersection won't normally be detected, the clipping solution (eg following a union operation) will still contain this tiny self-intersection. Setting Clipper's <a href="../Units/ClipperLib/Classes/Clipper/Properties/StrictlySimple.htm">StrictlySimple</a> property to true avoids this uncommon problem.<br><br> </p>
+<div style="clear='both'"></div>
+
+
+ <h2 id="Auto-SeeAlso">See Also</h2>
+ <p class="Body"><a href="../Units/ClipperLib/Classes/Clipper/Properties/StrictlySimple.htm">Clipper.StrictlySimple</a>, <a href="../Units/ClipperLib/Functions/CleanPolygons.htm">CleanPolygons</a></p>
+
+ <p class="Copyright" id="auto"> <br><br> Copyright &copy;2010-2014 Angus Johnson&nbsp; - &nbsp; Clipper 6.2.1 &nbsp; - &nbsp; Help file built on 1-November-2014 <br><br> </p>
+
+</body>
+
+</html> \ No newline at end of file
diff --git a/upstream/clipper-6.4.2/Documentation/Docs/Overview/_Body.htm b/upstream/clipper-6.4.2/Documentation/Docs/Overview/_Body.htm
new file mode 100644
index 0000000..5135549
--- /dev/null
+++ b/upstream/clipper-6.4.2/Documentation/Docs/Overview/_Body.htm
@@ -0,0 +1,106 @@
+<html>
+
+<head>
+
+ <script type="text/javascript" src="../../Scripts/jquery.js">
+ </script>
+
+ <script type="text/javascript" src="../../Scripts/SyntaxHighlighter/scripts/shCore.js">
+ </script>
+
+ <script type="text/javascript" src="../../Scripts/SyntaxHighlighter/scripts/shBrushDelphi.js">
+ </script>
+
+ <script type="text/javascript" src="../../Scripts/SyntaxHighlighter/scripts/shBrushCpp.js">
+ </script>
+
+ <script type="text/javascript" src="../../Scripts/SyntaxHighlighter/scripts/shBrushCSharp.js">
+ </script>
+
+ <link type="text/css" rel="stylesheet" href="../../Scripts/SyntaxHighlighter/styles/shCoreDefault.css">
+
+ <link type="text/css" rel="stylesheet" href="../../Scripts/SyntaxHighlighter/styles/shThemeDefault.css">
+
+
+ <title>Overview</title>
+
+ <link rel="stylesheet" href="../../Styles/default.css" type="text/css">
+
+ <meta name="keywords" content="clipper,clipping,clip,intersection,union,polygon,offset,library,algorithm,line">
+
+
+ <script type="text/javascript" src="../../Scripts/bootstrap.js">
+ </script>
+
+</head>
+
+<body bgcolor="#FFFFFF">
+
+ <!-- THIS FILE HAS BEEN AUTOMATICALLY PROCESSED FROM A SOURCE COPY -->
+
+ <!-- DO NOT EDIT MANUALLY !!! -->
+
+ <table class="Banner" cellspacing="0" cellpadding="0" border="1" bordercolorlight="#303080" bordercolordark="#7070B0">
+ <tr>
+ <td class="Banner" nowrap=""><a href="../_Body.htm" class="Banner"><img src="../../Images/_Home.gif" align="absmiddle">Home</a>
+ </td>
+ <td class="Banner" width="100%" align="right"><img src="../../Images/_Project_Logo.gif" align="absmiddle">
+ </td>
+ </tr>
+ </table>
+ <h1>Overview</h1>
+
+
+ <p class="Body"> The <a href="../_Body.htm"><b>Clipper Library</b></a> performs <b><a href="../Units/ClipperLib/Types/ClipType.htm">clipping</a></b>, and <a href="../Units/ClipperLib/Classes/ClipperOffset/_Body.htm"><b>offsetting</b></a> of both lines and polygons.<br><br> A number of features set Clipper apart from other clipping libraries:
+ <ul>
+
+ <li>it accepts all types of polygons including self-intersecting ones</li>
+
+ <li>it supports multiple polygon filling rules (EvenOdd, NonZero, Positive, Negative)</li>
+
+ <li>it's very fast relative to <a href="http://www.angusj.com/delphi/clipper.php#features" target="_blank">other libraries</a></li>
+
+ <li>it's <a href="http://www.mpi-inf.mpg.de/~kettner/pub/nonrobust_cgta_06.pdf" target="_blank">numerically robust</a></li>
+
+ <li>it also performs line and polygon offsetting</li>
+
+ <li>it's free to use in both freeware and commercial applications</li>
+
+ </ul> <br> </p>
+
+
+ <p class="Body"> <b>Current Version:</b> 6.2.1<br><br> <b>Author &amp; copyright:</b><br> Angus Johnson. Copyright &copy; 2010-2014<br> License, terms and conditions: <a href="./License.htm">Boost Software License</a><br><br> </p>
+
+
+ <p class="Body" id="terminology"> <img src="../../Images/int.png" alt="" border="0" align="right"> <b>Terminology:</b><br>
+ <ul>
+
+ <li><b>Clipping:</b> commonly refers to the process of cutting away from a set of 2-dimensional geometric shapes those parts that are outside a rectangular '<em>clipping</em>' window. This can be achieved by <em>intersecting</em> subject paths (lines and polygons) with a clipping rectangle. In a more general sense, the clipping window need not be rectangular but can be any type of polygon, even multiple polygons. Also, while clipping typically refers to an <em>intersection</em> operation, in this documentation it will refer to any one of the <a href="../Units/ClipperLib/Types/ClipType.htm">four boolean operations</a> (intersection, union, difference and exclusive-or).</li>
+
+ <li><b>Path:</b> is an ordered sequence of vertices defining a single geometric contour that's either a line (an open path) or a polygon (a closed path).</li>
+
+ <li><b>Line:</b> or polyline is an <em>open</em> path containing 2 or more vertices.</li>
+
+ <li><b>Polygon:</b> commonly refers to a two-dimensional region bounded by an outer non-intersecting closed contour. That region may also contain a number of 'holes'. In this documentation however, polygon will simply refer to a <em>closed</em> path.</li>
+
+ <li><b>Contour:</b> synonymous with path.</li>
+
+ <li><b>Hole:</b> is a closed region within a polygon that's not part of the polygon. A 'hole polygon' is a closed path that forms the outer boundaries of a hole.</li>
+
+ <li><b>Polygon Filling Rule:</b> the <a href="../Units/ClipperLib/Types/PolyFillType.htm"><b>filling rule</b></a>, together with a list of closed paths, defines those regions (bounded by paths) that are <em>inside</em> (ie regions 'brush filled' in a graphical display) and those which are <em>outside</em> (ie 'holes').</li>
+
+ </ul><br> </p>
+
+
+ <p class="Body"> <b>Distribution package contents:</b><br><br> The ZIP package contains the Clipper library's source code, a Windows CHM help file, HTML help, and a number of compiled demo applications (with full source code). The library was initially written in <strong>Delphi Pascal</strong> (and compiles with Delphi version 7 or above) but now contains <strong>C++</strong>, <strong>C#</strong> and <strong>Python</strong> translations too. The library's source code in each language is about 5000 lines. The Delphi code contains reasonably extensive comments, but comments are fewer in the C++ and C# code. The included sample applications show how Clipper can be used with the different languages using a number of graphics display libraries including - <b>AGG, Cairo, OpenGL, Graphics32, GDI+</b> and <b>SVG</b>.<br><br> <b>Download Link:</b><br><br> <a href="http://sourceforge.net/projects/polyclipping">SourceForge</a><br><br> <b>References:</b><br><br> The Library is based on but significantly extends Bala Vatti's polygon clipping algorithm as described in <a href="http://portal.acm.org/citation.cfm?id=129906" target="_blank">"A generic solution to polygon clipping"</a>, Communications of the ACM, Vol 35, Issue 7 (July 1992) pp 56-63.<br><br> A section in <a href="http://books.google.com/books?q=vatti+clipping+agoston" target="_blank">"Computer graphics and geometric modeling: implementation and algorithms"</a> by By Max K. Agoston (Springer, 2005) discussing <em>Vatti Polygon Clipping</em> was also helpful in creating the initial Clipper implementation.<br><br> The paper titled <a href="http://www.me.berkeley.edu/~mcmains/pubs/DAC05OffsetPolygon.pdf">"Polygon Offsetting by Computing Winding Numbers"</a> by Chen & McMains (Paper no. DETC2005-85513, ASME 2005. Pages 565-575) contains helpful discussion on the complexities of polygon offsetting together with some solutions.<br><br> </p>
+
+
+ <h2 id="Auto-SeeAlso">See Also</h2>
+ <p class="Body"><a href="../_Body.htm">Source</a>, <a href="License.htm">License</a>, <a href="../Units/ClipperLib/Classes/Clipper/_Body.htm">Clipper</a>, <a href="../Units/ClipperLib/Classes/ClipperOffset/_Body.htm">ClipperOffset</a>, <a href="../Units/ClipperLib/Types/ClipType.htm">ClipType</a>, <a href="../Units/ClipperLib/Types/PolyFillType.htm">PolyFillType</a></p>
+
+ <p class="Copyright" id="auto"> <br><br> Copyright &copy;2010-2014 Angus Johnson&nbsp; - &nbsp; Clipper 6.2.1 &nbsp; - &nbsp; Help file built on 1-November-2014 <br><br> </p>
+
+</body>
+
+
+</html> \ No newline at end of file
diff --git a/upstream/clipper-6.4.2/Documentation/Docs/Units/ClipperLib/Classes/Clipper/Methods/Constructor.htm b/upstream/clipper-6.4.2/Documentation/Docs/Units/ClipperLib/Classes/Clipper/Methods/Constructor.htm
new file mode 100644
index 0000000..f51279f
--- /dev/null
+++ b/upstream/clipper-6.4.2/Documentation/Docs/Units/ClipperLib/Classes/Clipper/Methods/Constructor.htm
@@ -0,0 +1,95 @@
+<html>
+
+<head>
+
+ <script type="text/javascript" src="../../../../../../Scripts/jquery.js">
+ </script>
+
+ <script type="text/javascript" src="../../../../../../Scripts/SyntaxHighlighter/scripts/shCore.js">
+ </script>
+
+ <script type="text/javascript" src="../../../../../../Scripts/SyntaxHighlighter/scripts/shBrushDelphi.js">
+ </script>
+
+ <script type="text/javascript" src="../../../../../../Scripts/SyntaxHighlighter/scripts/shBrushCpp.js">
+ </script>
+
+ <script type="text/javascript" src="../../../../../../Scripts/SyntaxHighlighter/scripts/shBrushCSharp.js">
+ </script>
+
+ <link type="text/css" rel="stylesheet" href="../../../../../../Scripts/SyntaxHighlighter/styles/shCoreDefault.css">
+
+ <link type="text/css" rel="stylesheet" href="../../../../../../Scripts/SyntaxHighlighter/styles/shThemeDefault.css">
+
+
+ <title>Constructor</title>
+
+ <link rel="stylesheet" href="../../../../../../Styles/default.css" type="text/css">
+
+
+ <script type="text/javascript" src="../../../../../../Scripts/bootstrap.js">
+ </script>
+
+</head>
+
+<body bgcolor="#FFFFFF">
+
+ <!-- THIS FILE HAS BEEN AUTOMATICALLY PROCESSED FROM A SOURCE COPY -->
+
+ <!-- DO NOT EDIT MANUALLY !!! -->
+
+ <table class="Banner" cellspacing="0" cellpadding="0" border="1" bordercolorlight="#303080" bordercolordark="#7070B0">
+ <tr>
+ <td class="Banner" nowrap=""><a href="../../../../../_Body.htm" class="Banner"><img src="../../../../../../Images/_Home.gif" align="absmiddle">Home</a>
+ </td>
+ <td class="Banner" nowrap=""><a href="../../../_Body.htm" class="Banner"><img src="../../../../../../Images/_Unit.gif" align="absmiddle">ClipperLib</a>
+ </td>
+ <td class="Banner" nowrap=""><a href="../_Body.htm" class="Banner"><img src="../../../../../../Images/_Class.gif" align="absmiddle">Clipper</a>
+ </td>
+ <td class="Banner" width="100%" align="right"><img src="../../../../../../Images/_Project_Logo.gif" align="absmiddle">
+ </td>
+ </tr>
+ </table>
+ <h1>Clipper.Constructor</h1>
+
+
+ <p class="Decl"><span class="Comment">Del.&raquo;</span> <b>constructor</b> TClipper.Create(InitOptions: <a href="../../../Types/InitOptions.htm">TInitOptions</a> = []);</p>
+
+ <p class="Decl2"><span class="Comment">C++&nbsp;&raquo;</span> Clipper::Clipper(<b>int</b> initOptions = 0) : ClipperBase();</p>
+
+ <p class="Decl3"><span class="Comment">C#&nbsp;&nbsp;&raquo;</span> <b>public</b> Clipper(initOptions = 0): base() {};</p>
+
+ <p class="Body"> The Clipper constructor creates an instance of the Clipper class. One or more <a href="../../../Types/InitOptions.htm">InitOptions</a> may be passed as a parameter to set the corresponding properties. (These properties can still be set or reset after construction.)<br><br> Examples:<br><br>
+ <table cellspacing="0" cellpadding="0" border="0" align="left" style="margin: 0;" width="600px">
+
+ <tr>
+ <td class="White">
+
+ <pre class="brush: delphi;">
+ //C++ constructor setting StrictlySimple and PreserveCollinear properties ...
+ Clipper clipper(ioStrictlySimple | ioPreserveCollinear);
+
+ //C# constructor setting StrictlySimple and PreserveCollinear properties ...
+ Clipper clipper = new Clipper(Clipper.ioStrictlySimple | Clipper.ioPreserveCollinear);
+
+ //Delphi constructor setting StrictlySimple and PreserveCollinear properties ...
+ clipper := TClipper.Create([ioStrictlySimple, ioPreserveCollinear]);
+ </pre>
+
+ </td>
+ </tr>
+
+ </table> <div style="clear:both">&nbsp;</div> </p>
+
+
+
+
+
+ <h2 id="Auto-SeeAlso">See Also</h2>
+ <p class="Body"><a href="../Properties/PreserveCollinear.htm">PreserveCollinear</a>, <a href="../Properties/ReverseSolution.htm">ReverseSolution</a>, <a href="../Properties/StrictlySimple.htm">StrictlySimple</a>, <a href="../../../Types/InitOptions.htm">InitOptions</a></p>
+
+ <p class="Copyright" id="auto"> <br><br> Copyright &copy;2010-2014 Angus Johnson&nbsp; - &nbsp; Clipper 6.2.1 &nbsp; - &nbsp; Help file built on 1-November-2014 <br><br> </p>
+
+</body>
+
+</html> \ No newline at end of file
diff --git a/upstream/clipper-6.4.2/Documentation/Docs/Units/ClipperLib/Classes/Clipper/Methods/Execute.htm b/upstream/clipper-6.4.2/Documentation/Docs/Units/ClipperLib/Classes/Clipper/Methods/Execute.htm
new file mode 100644
index 0000000..b551a19
--- /dev/null
+++ b/upstream/clipper-6.4.2/Documentation/Docs/Units/ClipperLib/Classes/Clipper/Methods/Execute.htm
@@ -0,0 +1,91 @@
+<html>
+
+<head>
+
+ <script type="text/javascript" src="../../../../../../Scripts/jquery.js">
+ </script>
+
+ <script type="text/javascript" src="../../../../../../Scripts/SyntaxHighlighter/scripts/shCore.js">
+ </script>
+
+ <script type="text/javascript" src="../../../../../../Scripts/SyntaxHighlighter/scripts/shBrushDelphi.js">
+ </script>
+
+ <script type="text/javascript" src="../../../../../../Scripts/SyntaxHighlighter/scripts/shBrushCpp.js">
+ </script>
+
+ <script type="text/javascript" src="../../../../../../Scripts/SyntaxHighlighter/scripts/shBrushCSharp.js">
+ </script>
+
+ <link type="text/css" rel="stylesheet" href="../../../../../../Scripts/SyntaxHighlighter/styles/shCoreDefault.css">
+
+ <link type="text/css" rel="stylesheet" href="../../../../../../Scripts/SyntaxHighlighter/styles/shThemeDefault.css">
+
+
+ <title>Execute</title>
+
+ <link rel="stylesheet" href="../../../../../../Styles/default.css" type="text/css">
+
+
+ <script type="text/javascript" src="../../../../../../Scripts/bootstrap.js">
+ </script>
+
+</head>
+
+<body bgcolor="#FFFFFF">
+
+ <!-- THIS FILE HAS BEEN AUTOMATICALLY PROCESSED FROM A SOURCE COPY -->
+
+ <!-- DO NOT EDIT MANUALLY !!! -->
+
+ <table class="Banner" cellspacing="0" cellpadding="0" border="1" bordercolorlight="#303080" bordercolordark="#7070B0">
+ <tr>
+ <td class="Banner" nowrap=""><a href="../../../../../_Body.htm" class="Banner"><img src="../../../../../../Images/_Home.gif" align="absmiddle">Home</a>
+ </td>
+ <td class="Banner" nowrap=""><a href="../../../_Body.htm" class="Banner"><img src="../../../../../../Images/_Unit.gif" align="absmiddle">ClipperLib</a>
+ </td>
+ <td class="Banner" nowrap=""><a href="../_Body.htm" class="Banner"><img src="../../../../../../Images/_Class.gif" align="absmiddle">Clipper</a>
+ </td>
+ <td class="Banner" width="100%" align="right"><img src="../../../../../../Images/_Project_Logo.gif" align="absmiddle">
+ </td>
+ </tr>
+ </table>
+ <h1>Clipper.Execute</h1>
+
+
+ <p class="Decl"><span class="Comment">Del.&raquo;</span><br> <b>function</b> Execute(clipType: <a href="../../../Types/ClipType.htm">TClipType</a>;<br> &nbsp;&nbsp;<b>out</b> solution: <a href="../../../Types/Paths.htm">TPaths</a>;<br> &nbsp;&nbsp;subjFillType: <a href="../../../Types/PolyFillType.htm">TPolyFillType</a> = pftEvenOdd;<br> &nbsp;&nbsp;clipFillType: <a href="../../../Types/PolyFillType.htm">TPolyFillType</a> = pftEvenOdd): boolean; <b>overload</b>;<br><br> <b>function</b> Execute(clipType: <a href="../../../Types/ClipType.htm">TClipType</a>;<br> &nbsp;&nbsp;<b>out</b> solution: <a href="../../PolyTree/_Body.htm">TPolyTree</a>;<br> &nbsp;&nbsp;subjFillType: <a href="../../../Types/PolyFillType.htm">TPolyFillType</a> = pftEvenOdd;<br> &nbsp;&nbsp;clipFillType: <a href="../../../Types/PolyFillType.htm">TPolyFillType</a> = pftEvenOdd): boolean; <b>overload</b>; </p>
+
+
+ <p class="Decl2"><span class="Comment">C++&nbsp;&raquo;</span><br> <b>bool</b> Execute(<a href="../../../Types/ClipType.htm">ClipType</a> clipType,<br> &nbsp;&nbsp;<a href="../../../Types/Paths.htm">Paths</a> &amp;solution,<br> &nbsp;&nbsp;<a href="../../../Types/PolyFillType.htm">PolyFillType</a> subjFillType = pftEvenOdd,<br> &nbsp;&nbsp;<a href="../../../Types/PolyFillType.htm">PolyFillType</a> clipFillType = pftEvenOdd);<br><br> <b>bool</b> Execute(<a href="../../../Types/ClipType.htm">ClipType</a> clipType,<br> &nbsp;&nbsp;<a href="../../PolyTree/_Body.htm">PolyTree</a> &amp;solution,<br> &nbsp;&nbsp;<a href="../../../Types/PolyFillType.htm">PolyFillType</a> subjFillType = pftEvenOdd,<br> &nbsp;&nbsp;<a href="../../../Types/PolyFillType.htm">PolyFillType</a> clipFillType = pftEvenOdd); </p>
+
+ <p class="Decl3"><span class="Comment">C#&nbsp;&nbsp;&raquo;</span><br> <b>public bool</b> Execute(<a href="../../../Types/ClipType.htm">ClipType</a> clipType,<br> &nbsp;&nbsp;<a href="../../../Types/Paths.htm">Paths</a> solution,<br> &nbsp;&nbsp;<a href="../../../Types/PolyFillType.htm">PolyFillType</a> subjFillType,<br> &nbsp;&nbsp;<a href="../../../Types/PolyFillType.htm">PolyFillType</a> clipFillType);<br><br> <b>public bool</b> Execute(<a href="../../../Types/ClipType.htm">ClipType</a> clipType,<br> &nbsp;&nbsp;<a href="../../PolyTree/_Body.htm">PolyTree</a> solution,<br> &nbsp;&nbsp;<a href="../../../Types/PolyFillType.htm">PolyFillType</a> subjFillType,<br> &nbsp;&nbsp;<a href="../../../Types/PolyFillType.htm">PolyFillType</a> clipFillType); </p>
+
+<br>
+
+ <p class="Body"> Once <em>subject</em> and <em>clip</em> paths have been assigned (via <a href="../../ClipperBase/Methods/AddPath.htm">AddPath</a> and/or <a href="../../ClipperBase/Methods/AddPaths.htm">AddPaths</a>), <b>Execute</b> can then perform the clipping operation (intersection, union, difference or XOR) specified by the <a href="../../../Types/ClipType.htm">clipType</a> parameter.<br><br> The <b>solution</b> parameter can be either a <a href="../../../Types/Paths.htm">Paths</a> or <a href="../../PolyTree/_Body.htm">PolyTree</a> structure. <span class="maroon">The Paths structure is simpler than the PolyTree stucture.</span> Because of this it is quicker to populate and hence clipping performance is a little better (it's roughly 10% faster). However, the PolyTree data structure provides more information about the returned paths which may be important to users. Firstly, <span class="maroon">the PolyTree structure preserves nested parent-child polygon relationships</span> (ie outer polygons owning/containing <em>holes</em> and holes owning/containing other outer polygons etc). Also, <span class="maroon"><b>only the PolyTree structure can differentiate between open and closed paths</b></span> since each PolyNode has an <a href="../../PolyNode/Properties/IsOpen.htm"><b>IsOpen</b></a> property. (The <a href="../../../Types/Path.htm"><b>Path</b></a> structure has no member indicating whether it's open or closed.) For this reason, <span class="maroon"><b>when <em>open</em> paths are passed to a Clipper object, the user must use a PolyTree object as the solution parameter</b></span>, otherwise an exception will be raised.<br><br> When a PolyTree object is used in a clipping operation on <b>open</b> paths, two ancilliary functions have been provided to quickly separate out <em>open</em> and <em>closed</em> paths from the solution - <a href="../../../Functions/OpenPathsFromPolyTree.htm"><b>OpenPathsFromPolyTree</b></a> and <a href="../../../Functions/ClosedPathsFromPolyTree.htm"><b>ClosedPathsFromPolyTree</b></a>. <a href="../../../Functions/PolyTreeToPaths.htm"><b>PolyTreeToPaths</b></a> is also available to convert path data to a Paths structure (irrespective of whether they're <em>open</em> or <em>closed</em>).<br><br> <img src="../../../../../../Images/common_edges.png" alt="" border="0" align="right"> There are several things to note about the solution paths returned:
+ <ul>
+
+ <li>they aren't in any specific order</li>
+
+ <li>they should never overlap or be self-intersecting (but see notes on <a href="../../../../../Overview/Rounding.htm"><b>rounding</b></a>)</li>
+
+ <li>holes will be oriented opposite outer polygons</li>
+
+ <li>the <strong>solution fill type</strong> can be considered either <em>EvenOdd</em> or <em>NonZero</em> since it will comply with either filling rule</li>
+
+ <li>polygons may rarely share a common edge (though this is now <em>very rare</em> as of version 6)</li>
+
+ </ul> </p><br>
+
+
+ <p class="Body"> The <b>subjFillType</b> and <b>clipFillType</b> parameters define the polygon <a href="../../../Types/PolyFillType.htm"><b>fill rule</b></a> to be applied to the polygons (ie closed paths) in the subject and clip paths respectively. (It's usual though obviously not essential that both sets of polygons use the same fill rule.)<br><br> <b>Execute</b> can be called multiple times without reassigning subject and clip polygons (ie when different clipping operations are required on the same polygon sets).<br><br> </p>
+
+
+ <h2 id="Auto-SeeAlso">See Also</h2>
+ <p class="Body"><a href="../../../../../Overview/Example.htm">Example</a>, <a href="../../../../../Overview/Rounding.htm">Rounding</a>, <a href="../../ClipperBase/Methods/AddPath.htm">ClipperBase.AddPath</a>, <a href="../../ClipperBase/Methods/AddPaths.htm">ClipperBase.AddPaths</a>, <a href="../../PolyNode/Properties/IsOpen.htm">PolyNode.IsOpen</a>, <a href="../../PolyTree/_Body.htm">PolyTree</a>, <a href="../../../Functions/ClosedPathsFromPolyTree.htm">ClosedPathsFromPolyTree</a>, <a href="../../../Functions/OpenPathsFromPolyTree.htm">OpenPathsFromPolyTree</a>, <a href="../../../Functions/PolyTreeToPaths.htm">PolyTreeToPaths</a>, <a href="../../../Types/ClipType.htm">ClipType</a>, <a href="../../../Types/Path.htm">Path</a>, <a href="../../../Types/Paths.htm">Paths</a>, <a href="../../../Types/PolyFillType.htm">PolyFillType</a></p>
+
+ <p class="Copyright" id="auto"> <br><br> Copyright &copy;2010-2014 Angus Johnson&nbsp; - &nbsp; Clipper 6.2.1 &nbsp; - &nbsp; Help file built on 1-November-2014 <br><br> </p>
+
+</body>
+
+</html> \ No newline at end of file
diff --git a/upstream/clipper-6.4.2/Documentation/Docs/Units/ClipperLib/Classes/Clipper/Properties/PreserveCollinear.htm b/upstream/clipper-6.4.2/Documentation/Docs/Units/ClipperLib/Classes/Clipper/Properties/PreserveCollinear.htm
new file mode 100644
index 0000000..c198c67
--- /dev/null
+++ b/upstream/clipper-6.4.2/Documentation/Docs/Units/ClipperLib/Classes/Clipper/Properties/PreserveCollinear.htm
@@ -0,0 +1,74 @@
+<html>
+
+<head>
+
+ <script type="text/javascript" src="../../../../../../Scripts/jquery.js">
+ </script>
+
+ <script type="text/javascript" src="../../../../../../Scripts/SyntaxHighlighter/scripts/shCore.js">
+ </script>
+
+ <script type="text/javascript" src="../../../../../../Scripts/SyntaxHighlighter/scripts/shBrushDelphi.js">
+ </script>
+
+ <script type="text/javascript" src="../../../../../../Scripts/SyntaxHighlighter/scripts/shBrushCpp.js">
+ </script>
+
+ <script type="text/javascript" src="../../../../../../Scripts/SyntaxHighlighter/scripts/shBrushCSharp.js">
+ </script>
+
+ <link type="text/css" rel="stylesheet" href="../../../../../../Scripts/SyntaxHighlighter/styles/shCoreDefault.css">
+
+ <link type="text/css" rel="stylesheet" href="../../../../../../Scripts/SyntaxHighlighter/styles/shThemeDefault.css">
+
+
+ <title>PreserveCollinear</title>
+
+ <link rel="stylesheet" href="../../../../../../Styles/default.css" type="text/css">
+
+
+ <script type="text/javascript" src="../../../../../../Scripts/bootstrap.js">
+ </script>
+
+</head>
+
+<body bgcolor="#FFFFFF">
+
+ <!-- THIS FILE HAS BEEN AUTOMATICALLY PROCESSED FROM A SOURCE COPY -->
+
+ <!-- DO NOT EDIT MANUALLY !!! -->
+
+ <table class="Banner" cellspacing="0" cellpadding="0" border="1" bordercolorlight="#303080" bordercolordark="#7070B0">
+ <tr>
+ <td class="Banner" nowrap=""><a href="../../../../../_Body.htm" class="Banner"><img src="../../../../../../Images/_Home.gif" align="absmiddle">Home</a>
+ </td>
+ <td class="Banner" nowrap=""><a href="../../../_Body.htm" class="Banner"><img src="../../../../../../Images/_Unit.gif" align="absmiddle">ClipperLib</a>
+ </td>
+ <td class="Banner" nowrap=""><a href="../_Body.htm" class="Banner"><img src="../../../../../../Images/_Class.gif" align="absmiddle">Clipper</a>
+ </td>
+ <td class="Banner" width="100%" align="right"><img src="../../../../../../Images/_Project_Logo.gif" align="absmiddle">
+ </td>
+ </tr>
+ </table>
+ <h1>Clipper.PreserveCollinear</h1>
+
+
+ <p class="Decl"><span class="Comment">Del.&raquo;</span> <b>property</b> PreserveCollinear: boolean; <b>override</b>;</p>
+
+ <p class="Decl2"><span class="Comment"> C++&nbsp;&raquo;</span> void PreserveCollinear(bool value);</p>
+
+ <p class="Decl3"><span class="Comment"> C#&nbsp;&nbsp;&raquo;</span> <b>public</b> bool PreserveCollinear { get {} set {} };</p>
+
+
+ <p class="Body"> <br> By default, when three or more vertices are collinear in input polygons (subject or clip), the Clipper object removes the 'inner' vertices before clipping. When enabled the PreserveCollinear property prevents this default behavior to allow these inner vertices to appear in the solution. </p>
+
+
+
+ <h2 id="Auto-SeeAlso">See Also</h2>
+ <p class="Body"><a href="../Methods/Constructor.htm">Constructor</a></p>
+
+ <p class="Copyright" id="auto"> <br><br> Copyright &copy;2010-2014 Angus Johnson&nbsp; - &nbsp; Clipper 6.2.1 &nbsp; - &nbsp; Help file built on 1-November-2014 <br><br> </p>
+
+</body>
+
+</html> \ No newline at end of file
diff --git a/upstream/clipper-6.4.2/Documentation/Docs/Units/ClipperLib/Classes/Clipper/Properties/ReverseSolution.htm b/upstream/clipper-6.4.2/Documentation/Docs/Units/ClipperLib/Classes/Clipper/Properties/ReverseSolution.htm
new file mode 100644
index 0000000..4294395
--- /dev/null
+++ b/upstream/clipper-6.4.2/Documentation/Docs/Units/ClipperLib/Classes/Clipper/Properties/ReverseSolution.htm
@@ -0,0 +1,76 @@
+<html>
+
+<head>
+
+ <script type="text/javascript" src="../../../../../../Scripts/jquery.js">
+ </script>
+
+ <script type="text/javascript" src="../../../../../../Scripts/SyntaxHighlighter/scripts/shCore.js">
+ </script>
+
+ <script type="text/javascript" src="../../../../../../Scripts/SyntaxHighlighter/scripts/shBrushDelphi.js">
+ </script>
+
+ <script type="text/javascript" src="../../../../../../Scripts/SyntaxHighlighter/scripts/shBrushCpp.js">
+ </script>
+
+ <script type="text/javascript" src="../../../../../../Scripts/SyntaxHighlighter/scripts/shBrushCSharp.js">
+ </script>
+
+ <link type="text/css" rel="stylesheet" href="../../../../../../Scripts/SyntaxHighlighter/styles/shCoreDefault.css">
+
+ <link type="text/css" rel="stylesheet" href="../../../../../../Scripts/SyntaxHighlighter/styles/shThemeDefault.css">
+
+
+ <title>ReverseSolution</title>
+
+ <link rel="stylesheet" href="../../../../../../Styles/default.css" type="text/css">
+
+
+ <script type="text/javascript" src="../../../../../../Scripts/bootstrap.js">
+ </script>
+
+</head>
+
+<body bgcolor="#FFFFFF">
+
+ <!-- THIS FILE HAS BEEN AUTOMATICALLY PROCESSED FROM A SOURCE COPY -->
+
+ <!-- DO NOT EDIT MANUALLY !!! -->
+
+ <table class="Banner" cellspacing="0" cellpadding="0" border="1" bordercolorlight="#303080" bordercolordark="#7070B0">
+ <tr>
+ <td class="Banner" nowrap=""><a href="../../../../../_Body.htm" class="Banner"><img src="../../../../../../Images/_Home.gif" align="absmiddle">Home</a>
+ </td>
+ <td class="Banner" nowrap=""><a href="../../../_Body.htm" class="Banner"><img src="../../../../../../Images/_Unit.gif" align="absmiddle">ClipperLib</a>
+ </td>
+ <td class="Banner" nowrap=""><a href="../_Body.htm" class="Banner"><img src="../../../../../../Images/_Class.gif" align="absmiddle">Clipper</a>
+ </td>
+ <td class="Banner" width="100%" align="right"><img src="../../../../../../Images/_Project_Logo.gif" align="absmiddle">
+ </td>
+ </tr>
+ </table>
+ <h1>Clipper.ReverseSolution</h1>
+
+
+ <p class="Decl"><span class="Comment">Del.&raquo;</span> <b>property</b> ReverseSolution: boolean; <b>override</b>;</p>
+
+ <p class="Decl2"><span class="Comment"> C++&nbsp;&raquo;</span> void ReverseSolution(bool value);</p>
+
+ <p class="Decl3"><span class="Comment"> C#&nbsp;&nbsp;&raquo;</span> <b>public</b> bool ReverseSolution { get {} set {} };</p>
+
+
+ <p class="Body"> When this property is set to true, polygons returned in the <b>solution</b> parameter of the <a href="../Methods/Execute.htm">Execute()</a> method will have orientations opposite to their normal orientations. </p>
+
+
+
+
+
+ <h2 id="Auto-SeeAlso">See Also</h2>
+ <p class="Body"><a href="../Methods/Execute.htm">Execute</a>, <a href="../../../Functions/Orientation.htm">Orientation</a></p>
+
+ <p class="Copyright" id="auto"> <br><br> Copyright &copy;2010-2014 Angus Johnson&nbsp; - &nbsp; Clipper 6.2.1 &nbsp; - &nbsp; Help file built on 1-November-2014 <br><br> </p>
+
+</body>
+
+</html> \ No newline at end of file
diff --git a/upstream/clipper-6.4.2/Documentation/Docs/Units/ClipperLib/Classes/Clipper/Properties/StrictlySimple.htm b/upstream/clipper-6.4.2/Documentation/Docs/Units/ClipperLib/Classes/Clipper/Properties/StrictlySimple.htm
new file mode 100644
index 0000000..b6918cc
--- /dev/null
+++ b/upstream/clipper-6.4.2/Documentation/Docs/Units/ClipperLib/Classes/Clipper/Properties/StrictlySimple.htm
@@ -0,0 +1,88 @@
+<html>
+
+<head>
+
+ <script type="text/javascript" src="../../../../../../Scripts/jquery.js">
+ </script>
+
+ <script type="text/javascript" src="../../../../../../Scripts/SyntaxHighlighter/scripts/shCore.js">
+ </script>
+
+ <script type="text/javascript" src="../../../../../../Scripts/SyntaxHighlighter/scripts/shBrushDelphi.js">
+ </script>
+
+ <script type="text/javascript" src="../../../../../../Scripts/SyntaxHighlighter/scripts/shBrushCpp.js">
+ </script>
+
+ <script type="text/javascript" src="../../../../../../Scripts/SyntaxHighlighter/scripts/shBrushCSharp.js">
+ </script>
+
+ <link type="text/css" rel="stylesheet" href="../../../../../../Scripts/SyntaxHighlighter/styles/shCoreDefault.css">
+
+ <link type="text/css" rel="stylesheet" href="../../../../../../Scripts/SyntaxHighlighter/styles/shThemeDefault.css">
+
+
+ <title>StrictlySimple</title>
+
+ <link rel="stylesheet" href="../../../../../../Styles/default.css" type="text/css">
+
+
+ <script type="text/javascript" src="../../../../../../Scripts/bootstrap.js">
+ </script>
+
+</head>
+
+<body bgcolor="#FFFFFF">
+
+ <!-- THIS FILE HAS BEEN AUTOMATICALLY PROCESSED FROM A SOURCE COPY -->
+
+ <!-- DO NOT EDIT MANUALLY !!! -->
+
+ <table class="Banner" cellspacing="0" cellpadding="0" border="1" bordercolorlight="#303080" bordercolordark="#7070B0">
+ <tr>
+ <td class="Banner" nowrap=""><a href="../../../../../_Body.htm" class="Banner"><img src="../../../../../../Images/_Home.gif" align="absmiddle">Home</a>
+ </td>
+ <td class="Banner" nowrap=""><a href="../../../_Body.htm" class="Banner"><img src="../../../../../../Images/_Unit.gif" align="absmiddle">ClipperLib</a>
+ </td>
+ <td class="Banner" nowrap=""><a href="../_Body.htm" class="Banner"><img src="../../../../../../Images/_Class.gif" align="absmiddle">Clipper</a>
+ </td>
+ <td class="Banner" width="100%" align="right"><img src="../../../../../../Images/_Project_Logo.gif" align="absmiddle">
+ </td>
+ </tr>
+ </table>
+ <h1>Clipper.StrictlySimple</h1>
+
+
+ <p class="Decl"><span class="Comment">Del.&raquo;</span> <b>property</b> StrictlySimple: boolean; <b>override</b>;</p>
+
+ <p class="Decl2"><span class="Comment"> C++&nbsp;&raquo;</span> void StrictlySimple(bool value);</p>
+
+ <p class="Decl3"><span class="Comment"> C#&nbsp;&nbsp;&raquo;</span> <b>public</b> bool StrictlySimple { get {} set {} };</p>
+
+
+ <p class="Body"> <br> <b>Terminology:</b><br>
+ <ul>
+
+ <li>A <em>simple</em> polygon is one that does not self-intersect.</li>
+
+ <li>A <em>weakly simple</em> polygon is a simple polygon that contains 'touching' vertices, or 'touching' edges.</li>
+
+ <li>A <em>strictly simple</em> polygon is a simple polygon that does not contain 'touching' vertices, or 'touching' edges.</li>
+
+ </ul> </p>
+
+ <p class="Body"> Vertices 'touch' if they share the same coordinates (and are not adjacent). An edge touches another if one of its end vertices touches another edge excluding its adjacent edges, or if they are co-linear and overlapping (including adjacent edges).<br><br> Polygons returned by clipping operations (see <a href="../Methods/Execute.htm">Clipper.Execute()</a>) should always be simple polygons. When the <b>StrictlySimply</b> property is enabled, polygons returned will be <em>strictly simple</em>, otherwise they may be <em>weakly simple</em>. It's <b>computationally expensive</b> ensuring polygons are <em>strictly simple</em> and so this property is disabled by default.<br><br> <em>Note: There's currently no guarantee that polygons will be strictly simple since 'simplifying' is still a work in progress.</em><br><br> <img src="../../../../../../Images/simplify2.png" alt="" border="0"> <img src="../../../../../../Images/simplify3.png" alt="" border="0"><br> </p>
+
+
+ <p class="Body"> In the image above, the two examples show weakly simple polygons being broken into two strictly simple polygons. (The outlines with arrows are intended to aid visualizing vertex order.)<br><br> See also the article on <a href="http://en.wikipedia.org/wiki/Simple_polygon" target="_blank">Simple Polygons</a> on Wikipedia. </p>
+
+
+
+ <h2 id="Auto-SeeAlso">See Also</h2>
+ <p class="Body"><a href="../Methods/Execute.htm">Execute</a>, <a href="../../../Functions/SimplifyPolygons.htm">SimplifyPolygons</a></p>
+
+ <p class="Copyright" id="auto"> <br><br> Copyright &copy;2010-2014 Angus Johnson&nbsp; - &nbsp; Clipper 6.2.1 &nbsp; - &nbsp; Help file built on 1-November-2014 <br><br> </p>
+
+</body>
+
+</html> \ No newline at end of file
diff --git a/upstream/clipper-6.4.2/Documentation/Docs/Units/ClipperLib/Classes/Clipper/Properties/ZFillFunction.htm b/upstream/clipper-6.4.2/Documentation/Docs/Units/ClipperLib/Classes/Clipper/Properties/ZFillFunction.htm
new file mode 100644
index 0000000..290061e
--- /dev/null
+++ b/upstream/clipper-6.4.2/Documentation/Docs/Units/ClipperLib/Classes/Clipper/Properties/ZFillFunction.htm
@@ -0,0 +1,75 @@
+<html>
+
+<head>
+
+ <script type="text/javascript" src="../../../../../../Scripts/jquery.js">
+ </script>
+
+ <script type="text/javascript" src="../../../../../../Scripts/SyntaxHighlighter/scripts/shCore.js">
+ </script>
+
+ <script type="text/javascript" src="../../../../../../Scripts/SyntaxHighlighter/scripts/shBrushDelphi.js">
+ </script>
+
+ <script type="text/javascript" src="../../../../../../Scripts/SyntaxHighlighter/scripts/shBrushCpp.js">
+ </script>
+
+ <script type="text/javascript" src="../../../../../../Scripts/SyntaxHighlighter/scripts/shBrushCSharp.js">
+ </script>
+
+ <link type="text/css" rel="stylesheet" href="../../../../../../Scripts/SyntaxHighlighter/styles/shCoreDefault.css">
+
+ <link type="text/css" rel="stylesheet" href="../../../../../../Scripts/SyntaxHighlighter/styles/shThemeDefault.css">
+
+
+ <title>ZFillFunction</title>
+
+ <link rel="stylesheet" href="../../../../../../Styles/default.css" type="text/css">
+
+
+ <script type="text/javascript" src="../../../../../../Scripts/bootstrap.js">
+ </script>
+
+</head>
+
+<body bgcolor="#FFFFFF">
+
+ <!-- THIS FILE HAS BEEN AUTOMATICALLY PROCESSED FROM A SOURCE COPY -->
+
+ <!-- DO NOT EDIT MANUALLY !!! -->
+
+ <table class="Banner" cellspacing="0" cellpadding="0" border="1" bordercolorlight="#303080" bordercolordark="#7070B0">
+ <tr>
+ <td class="Banner" nowrap=""><a href="../../../../../_Body.htm" class="Banner"><img src="../../../../../../Images/_Home.gif" align="absmiddle">Home</a>
+ </td>
+ <td class="Banner" nowrap=""><a href="../../../_Body.htm" class="Banner"><img src="../../../../../../Images/_Unit.gif" align="absmiddle">ClipperLib</a>
+ </td>
+ <td class="Banner" nowrap=""><a href="../_Body.htm" class="Banner"><img src="../../../../../../Images/_Class.gif" align="absmiddle">Clipper</a>
+ </td>
+ <td class="Banner" width="100%" align="right"><img src="../../../../../../Images/_Project_Logo.gif" align="absmiddle">
+ </td>
+ </tr>
+ </table>
+ <h1>Clipper.ZFillFunction</h1>
+
+
+ <p class="Decl"><span class="Comment">Del.&raquo;</span> <b>property</b> ZFillFunction: <a href="../../../Types/ZFillCallback.htm">TZFillCallback</a> <b>read</b> FZFillCallback <b>write</b> FZFillCallback;</p>
+
+ <p class="Decl2"><span class="Comment">C++&nbsp;&raquo;</span> <b>void</b> ZFillFunction(<a href="../../../Types/ZFillCallback.htm">ZFillCallback</a> zFillFunc);</p>
+
+ <p class="Decl3"><span class="Comment">C#&nbsp;&nbsp;&raquo;</span> <b>public</b> <a href="../../../Types/ZFillCallback.htm">ZFillCallback</a> ZFillFunction { <b>get</b>; <b>set</b>; };</p>
+<br>
+
+ <p class="Body"> <span class="maroon">This property is only exposed when the pre-processor directive <a href="../../../PreProcessor/Defines.htm"><b>use_xyz</b></a> has been defined.</span> If this is the case, a 'Z' member will be included in the <a href="../../../Types/IntPoint.htm">IntPoint</a> structure where users can store custom data. While most vertices in a clipping solution will correspond to input (subject and clip) vertices, there will also be new vertices wherever edges intersect. This property assigns a custom callback function to the Clipper object so that custom 'Z' values can be assigned to these intersection vertices. (Note that 'Z' values in the solution at non-intersecting vertices will simply be copied from matching input vertices along with the X and Y values.) <br><br> It is up to the library user to assign 'Z' values for new intersection vertices (otherwise these values will remain 0). The four vertices that define the intersecting line segments will be passed to the callback function (together with the new intersection vertex) to aid the user in determining appropriate Z values.<br><br>
+ <!-- The <b>CurvesDemo</b> application in the Curves directory in the distribution zip package shows how the Z member together with the callback function can be used to flatten curved paths (defined by control points) and after clipping, to 'de-flatten' or reconstruct curved paths in the clipping solution.<br><br>
+ --> </p>
+
+
+ <h2 id="Auto-SeeAlso">See Also</h2>
+ <p class="Body"><a href="../../../PreProcessor/Defines.htm">Defines</a>, <a href="../../../Types/IntPoint.htm">IntPoint</a>, <a href="../../../Types/ZFillCallback.htm">ZFillCallback</a></p>
+
+ <p class="Copyright" id="auto"> <br><br> Copyright &copy;2010-2014 Angus Johnson&nbsp; - &nbsp; Clipper 6.2.1 &nbsp; - &nbsp; Help file built on 1-November-2014 <br><br> </p>
+
+</body>
+
+</html> \ No newline at end of file
diff --git a/upstream/clipper-6.4.2/Documentation/Docs/Units/ClipperLib/Classes/Clipper/_Body.htm b/upstream/clipper-6.4.2/Documentation/Docs/Units/ClipperLib/Classes/Clipper/_Body.htm
new file mode 100644
index 0000000..330ecf1
--- /dev/null
+++ b/upstream/clipper-6.4.2/Documentation/Docs/Units/ClipperLib/Classes/Clipper/_Body.htm
@@ -0,0 +1,149 @@
+<html>
+
+<head>
+
+ <script type="text/javascript" src="../../../../../Scripts/jquery.js">
+ </script>
+
+ <script type="text/javascript" src="../../../../../Scripts/SyntaxHighlighter/scripts/shCore.js">
+ </script>
+
+ <script type="text/javascript" src="../../../../../Scripts/SyntaxHighlighter/scripts/shBrushDelphi.js">
+ </script>
+
+ <script type="text/javascript" src="../../../../../Scripts/SyntaxHighlighter/scripts/shBrushCpp.js">
+ </script>
+
+ <script type="text/javascript" src="../../../../../Scripts/SyntaxHighlighter/scripts/shBrushCSharp.js">
+ </script>
+
+ <link type="text/css" rel="stylesheet" href="../../../../../Scripts/SyntaxHighlighter/styles/shCoreDefault.css">
+
+ <link type="text/css" rel="stylesheet" href="../../../../../Scripts/SyntaxHighlighter/styles/shThemeDefault.css">
+
+
+ <title>Clipper</title>
+
+ <link rel="stylesheet" href="../../../../../Styles/default.css" type="text/css">
+
+ <meta name="Ancestor" content="ClipperBase">
+
+
+ <script type="text/javascript" src="../../../../../Scripts/bootstrap.js">
+ </script>
+
+</head>
+
+<body bgcolor="#FFFFFF">
+
+ <!-- THIS FILE HAS BEEN AUTOMATICALLY PROCESSED FROM A SOURCE COPY -->
+
+ <!-- DO NOT EDIT MANUALLY !!! -->
+
+ <table class="Banner" cellspacing="0" cellpadding="0" border="1" bordercolorlight="#303080" bordercolordark="#7070B0">
+ <tr>
+ <td class="Banner" nowrap=""><a href="../../../../_Body.htm" class="Banner"><img src="../../../../../Images/_Home.gif" align="absmiddle">Home</a>
+ </td>
+ <td class="Banner" nowrap=""><a href="../../_Body.htm" class="Banner"><img src="../../../../../Images/_Unit.gif" align="absmiddle">ClipperLib</a>
+ </td>
+ <td class="Banner" width="100%" align="right"><img src="../../../../../Images/_Project_Logo.gif" align="absmiddle">
+ </td>
+ </tr>
+ </table>
+ <h1>Clipper</h1>
+ <h2>Hierarchy</h2>
+ <p class="Hierarchy"></p>
+ <p class="Hierarchy">&nbsp;&nbsp;&nbsp;|</p>
+ <p class="Hierarchy"><a href="../ClipperBase/_Body.htm">ClipperBase</a></p>
+<br>
+
+ <p class="Body"> The <b>Clipper</b> class encapsulates <a href="../../Types/ClipType.htm">boolean operations on polygons</a> (intersection, union, difference and XOR), which is also called <a href="../../../../Overview/_Body.htm#terminology">polygon clipping</a>.<br><br> Input polygons, both <em>subject</em> and <em>clip</em> sets, are passed to a Clipper object by its <a href="../ClipperBase/Methods/AddPath.htm">AddPath</a> and <a href="../ClipperBase/Methods/AddPaths.htm">AddPaths</a> methods, and the clipping operation is performed by calling its <a href="./Methods/Execute.htm">Execute</a> method. Multiple boolean operations can be performed on the same input polygon sets by repeat calls to Execute.<br><br> </p>
+
+ <h2 id="Auto-Reference">Reference</h2>
+ <table>
+ <tr><th>Fields
+ </th><th>Methods
+ </th><th>Properties
+ </th>
+ </tr>
+ <tr>
+ <td colspan="2" class="White">In Clipper:
+ </td>
+ </tr>
+ <tr>
+ <td>
+ </td>
+ <td><a href="Methods/Constructor.htm">Constructor</a>
+ </td>
+ <td><a href="Properties/PreserveCollinear.htm">PreserveCollinear</a>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ </td>
+ <td><a href="Methods/Execute.htm">Execute</a>
+ </td>
+ <td><a href="Properties/ReverseSolution.htm">ReverseSolution</a>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ </td>
+ <td>
+ </td>
+ <td><a href="Properties/StrictlySimple.htm">StrictlySimple</a>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ </td>
+ <td>
+ </td>
+ <td><a href="Properties/ZFillFunction.htm">ZFillFunction</a>
+ </td>
+ </tr>
+ <tr>
+ <td colspan="2" class="White">In ClipperBase:
+ </td>
+ </tr>
+ <tr>
+ <td>
+ </td>
+ <td><a href="../ClipperBase/Methods/AddPath.htm">AddPath</a>
+ </td>
+ <td>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ </td>
+ <td><a href="../ClipperBase/Methods/AddPaths.htm">AddPaths</a>
+ </td>
+ <td>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ </td>
+ <td><a href="../ClipperBase/Methods/Clear.htm">Clear</a>
+ </td>
+ <td>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ </td>
+ <td><a href="../ClipperBase/Methods/GetBounds.htm">GetBounds</a>
+ </td>
+ <td>
+ </td>
+ </tr>
+ </table>
+ <h2 id="Auto-SeeAlso">See Also</h2>
+ <p class="Body"><a href="../../../../Overview/_Body.htm">Overview</a>, <a href="../../Types/ClipType.htm">ClipType</a></p>
+
+ <p class="Copyright" id="auto"> <br><br> Copyright &copy;2010-2014 Angus Johnson&nbsp; - &nbsp; Clipper 6.2.1 &nbsp; - &nbsp; Help file built on 1-November-2014 <br><br> </p>
+
+</body>
+
+</html> \ No newline at end of file
diff --git a/upstream/clipper-6.4.2/Documentation/Docs/Units/ClipperLib/Classes/ClipperBase/Methods/AddPath.htm b/upstream/clipper-6.4.2/Documentation/Docs/Units/ClipperLib/Classes/ClipperBase/Methods/AddPath.htm
new file mode 100644
index 0000000..de8c944
--- /dev/null
+++ b/upstream/clipper-6.4.2/Documentation/Docs/Units/ClipperLib/Classes/ClipperBase/Methods/AddPath.htm
@@ -0,0 +1,95 @@
+<html>
+
+<head>
+
+ <script type="text/javascript" src="../../../../../../Scripts/jquery.js">
+ </script>
+
+ <script type="text/javascript" src="../../../../../../Scripts/SyntaxHighlighter/scripts/shCore.js">
+ </script>
+
+ <script type="text/javascript" src="../../../../../../Scripts/SyntaxHighlighter/scripts/shBrushDelphi.js">
+ </script>
+
+ <script type="text/javascript" src="../../../../../../Scripts/SyntaxHighlighter/scripts/shBrushCpp.js">
+ </script>
+
+ <script type="text/javascript" src="../../../../../../Scripts/SyntaxHighlighter/scripts/shBrushCSharp.js">
+ </script>
+
+ <link type="text/css" rel="stylesheet" href="../../../../../../Scripts/SyntaxHighlighter/styles/shCoreDefault.css">
+
+ <link type="text/css" rel="stylesheet" href="../../../../../../Scripts/SyntaxHighlighter/styles/shThemeDefault.css">
+
+
+ <title>AddPath</title>
+
+ <link rel="stylesheet" href="../../../../../../Styles/default.css" type="text/css">
+
+
+ <script type="text/javascript" src="../../../../../../Scripts/bootstrap.js">
+ </script>
+
+</head>
+
+<body bgcolor="#FFFFFF">
+
+ <!-- THIS FILE HAS BEEN AUTOMATICALLY PROCESSED FROM A SOURCE COPY -->
+
+ <!-- DO NOT EDIT MANUALLY !!! -->
+
+ <table class="Banner" cellspacing="0" cellpadding="0" border="1" bordercolorlight="#303080" bordercolordark="#7070B0">
+ <tr>
+ <td class="Banner" nowrap=""><a href="../../../../../_Body.htm" class="Banner"><img src="../../../../../../Images/_Home.gif" align="absmiddle">Home</a>
+ </td>
+ <td class="Banner" nowrap=""><a href="../../../_Body.htm" class="Banner"><img src="../../../../../../Images/_Unit.gif" align="absmiddle">ClipperLib</a>
+ </td>
+ <td class="Banner" nowrap=""><a href="../_Body.htm" class="Banner"><img src="../../../../../../Images/_Class.gif" align="absmiddle">ClipperBase</a>
+ </td>
+ <td class="Banner" width="100%" align="right"><img src="../../../../../../Images/_Project_Logo.gif" align="absmiddle">
+ </td>
+ </tr>
+ </table>
+ <h1>ClipperBase.AddPath</h1>
+
+
+ <p class="Decl"><span class="Comment">Del.&raquo;</span> <b>function</b> AddPath(<b>const</b> path: <a href="../../../Types/Path.htm">TPath</a>; polyType: <a href="../../../Types/PolyType.htm">TPolyType</a>; Closed: Boolean): Boolean;</p>
+
+ <p class="Decl2"><span class="Comment">C++&nbsp;&raquo;</span> <b>bool</b> AddPath(<b>const</b> <a href="../../../Types/Path.htm">Path</a> &amp;pg, <a href="../../../Types/PolyType.htm">PolyType</a> polyType, <b>bool</b> closed);</p>
+
+ <p class="Decl3"><span class="Comment">C#&nbsp;&nbsp;&raquo;</span> <b>public virtual bool</b> AddPath(<a href="../../../Types/Path.htm">Path</a> pg, <a href="../../../Types/PolyType.htm">PolyType</a> polyType, <b>bool</b> closed);</p>
+<br>
+
+
+ <p class="Body"> <img src="../../../../../../Images/line_clipping.png" alt="" border="0" align="right"> Any number of subject and clip paths can be added to a clipping task, either individually via the AddPath() method, or as groups via the AddPaths() method, or even using both methods.<br><br> 'Subject' paths may be either <em>open</em> (lines) or <em>closed</em> (polygons) or even a mixture of both, but <span class="maroon"><b>'clipping' paths must always be <em>closed</em></b></span>. Clipper allows polygons to clip both lines and other polygons, but doesn't allow lines to clip either lines or polygons.<br><br> With closed paths, <a href="../../../Functions/Orientation.htm">orientation</a> should conform with the <a href="../../../Types/PolyFillType.htm">filling rule</a> that will be passed via Clippper's <a href="../../Clipper/Methods/Execute.htm">Execute</a> method.<br><br> </p>
+
+
+
+ <p class="Body"><b>Path Coordinate range</b>:<br> Path coordinates must be between &plusmn; 0x3FFFFFFFFFFFFFFF (&plusmn; <b>4.6e+18</b>), otherwise a range error will be thrown when attempting to add the path to the Clipper object. If coordinates can be kept between &plusmn; 0x3FFFFFFF (&plusmn; <b>1.0e+9</b>), a modest increase in performance (approx. 15-20%) over the larger range can be achieved by avoiding large integer math. If the preprocessor directive <a href="../../../PreProcessor/Defines.htm"><b>use_int32</b></a> is defined (allowing a further increase in performance of 20-30%), then the maximum range is restricted to &plusmn; 32,767. <br><br></p>
+
+
+ <p class="Body"> <b>Return Value:</b><br> The function will return false if the path is invalid for clipping. A path is invalid for clipping when:
+ <ul>
+
+ <li>it has less than 2 vertices</li>
+
+ <li>it has 2 vertices but is not an open path</li>
+
+ <li>the vertices are all co-linear and it is not an open path</li>
+
+ </ul> </p>
+
+<br>
+
+
+
+
+ <h2 id="Auto-SeeAlso">See Also</h2>
+ <p class="Body"><a href="../../../../../Overview/Example.htm">Example</a>, <a href="../../Clipper/Methods/Execute.htm">Clipper.Execute</a>, <a href="AddPaths.htm">AddPaths</a>, <a href="../../../Functions/Orientation.htm">Orientation</a>, <a href="../../../PreProcessor/Defines.htm">Defines</a>, <a href="../../../Types/Path.htm">Path</a>, <a href="../../../Types/PolyFillType.htm">PolyFillType</a>, <a href="../../../Types/PolyType.htm">PolyType</a></p>
+
+ <p class="Copyright" id="auto"> <br><br> Copyright &copy;2010-2014 Angus Johnson&nbsp; - &nbsp; Clipper 6.2.1 &nbsp; - &nbsp; Help file built on 1-November-2014 <br><br> </p>
+
+</body>
+
+
+</html> \ No newline at end of file
diff --git a/upstream/clipper-6.4.2/Documentation/Docs/Units/ClipperLib/Classes/ClipperBase/Methods/AddPaths.htm b/upstream/clipper-6.4.2/Documentation/Docs/Units/ClipperLib/Classes/ClipperBase/Methods/AddPaths.htm
new file mode 100644
index 0000000..73e1186
--- /dev/null
+++ b/upstream/clipper-6.4.2/Documentation/Docs/Units/ClipperLib/Classes/ClipperBase/Methods/AddPaths.htm
@@ -0,0 +1,93 @@
+<html>
+
+<head>
+
+ <script type="text/javascript" src="../../../../../../Scripts/jquery.js">
+ </script>
+
+ <script type="text/javascript" src="../../../../../../Scripts/SyntaxHighlighter/scripts/shCore.js">
+ </script>
+
+ <script type="text/javascript" src="../../../../../../Scripts/SyntaxHighlighter/scripts/shBrushDelphi.js">
+ </script>
+
+ <script type="text/javascript" src="../../../../../../Scripts/SyntaxHighlighter/scripts/shBrushCpp.js">
+ </script>
+
+ <script type="text/javascript" src="../../../../../../Scripts/SyntaxHighlighter/scripts/shBrushCSharp.js">
+ </script>
+
+ <link type="text/css" rel="stylesheet" href="../../../../../../Scripts/SyntaxHighlighter/styles/shCoreDefault.css">
+
+ <link type="text/css" rel="stylesheet" href="../../../../../../Scripts/SyntaxHighlighter/styles/shThemeDefault.css">
+
+
+ <title>AddPaths</title>
+
+ <link rel="stylesheet" href="../../../../../../Styles/default.css" type="text/css">
+
+
+ <script type="text/javascript" src="../../../../../../Scripts/bootstrap.js">
+ </script>
+
+</head>
+
+<body bgcolor="#FFFFFF">
+
+ <!-- THIS FILE HAS BEEN AUTOMATICALLY PROCESSED FROM A SOURCE COPY -->
+
+ <!-- DO NOT EDIT MANUALLY !!! -->
+
+ <table class="Banner" cellspacing="0" cellpadding="0" border="1" bordercolorlight="#303080" bordercolordark="#7070B0">
+ <tr>
+ <td class="Banner" nowrap=""><a href="../../../../../_Body.htm" class="Banner"><img src="../../../../../../Images/_Home.gif" align="absmiddle">Home</a>
+ </td>
+ <td class="Banner" nowrap=""><a href="../../../_Body.htm" class="Banner"><img src="../../../../../../Images/_Unit.gif" align="absmiddle">ClipperLib</a>
+ </td>
+ <td class="Banner" nowrap=""><a href="../_Body.htm" class="Banner"><img src="../../../../../../Images/_Class.gif" align="absmiddle">ClipperBase</a>
+ </td>
+ <td class="Banner" width="100%" align="right"><img src="../../../../../../Images/_Project_Logo.gif" align="absmiddle">
+ </td>
+ </tr>
+ </table>
+ <h1>ClipperBase.AddPaths</h1>
+
+
+ <p class="Decl"><span class="Comment">Del.&raquo;</span> <b>function</b> AddPaths(<b>const</b> paths: <a href="../../../Types/Paths.htm">TPaths</a>; polyType: <a href="../../../Types/PolyType.htm">TPolyType</a>; Closed: Boolean): boolean;</p>
+
+ <p class="Decl2"><span class="Comment">C++&nbsp;&raquo;</span> <b>bool</b> AddPaths(<b>const</b> <a href="../../../Types/Paths.htm">Paths</a> &amp;ppg, <a href="../../../Types/PolyType.htm">PolyType</a> polyType, <b>bool</b> closed);</p>
+
+ <p class="Decl3"><span class="Comment">C#&nbsp;&nbsp;&raquo;</span> <b>public virtual bool</b> AddPaths(<a href="../../../Types/Paths.htm">Paths</a> ppg, <a href="../../../Types/PolyType.htm">PolyType</a> polyType, <b>bool</b> closed);</p>
+<br>
+
+ <p class="Body"> <img src="../../../../../../Images/line_clipping.png" alt="" border="0" align="right"> Any number of subject and clip paths can be added to a clipping task, either individually via the AddPath() method, or as groups via the AddPaths() method, or even using both methods.<br><br> 'Subject' paths may be either <em>open</em> (lines) or <em>closed</em> (polygons) or even a mixture of both, but <span class="maroon"><b>'clipping' paths must always be <em>closed</em></b></span>. Clipper allows polygons to clip both lines and other polygons, but doesn't allow lines to clip either lines or polygons.<br><br> With closed paths, <a href="../../../Functions/Orientation.htm">orientation</a> should conform with the <a href="../../../Types/PolyFillType.htm">filling rule</a> that will be passed via Clippper's <a href="../../Clipper/Methods/Execute.htm">Execute</a> method.<br><br> </p>
+
+
+
+ <p class="Body"><b>Path Coordinate range</b>:<br> Path coordinates must be between &plusmn; 0x3FFFFFFFFFFFFFFF (&plusmn; <b>4.6e+18</b>), otherwise a range error will be thrown when attempting to add the path to the Clipper object. If coordinates can be kept between &plusmn; 0x3FFFFFFF (&plusmn; <b>1.0e+9</b>), a modest increase in performance (approx. 15-20%) over the larger range can be achieved by avoiding large integer math. If the preprocessor directive <a href="../../../PreProcessor/Defines.htm"><b>use_int32</b></a> is defined (allowing a further increase in performance of 20-30%), then the maximum range is restricted to &plusmn; 32,767. <br><br></p>
+
+
+ <p class="Body"> <b>Return Value:</b><br> The function will return false if the path is invalid for clipping. A path is invalid for clipping when:
+ <ul>
+
+ <li>it has less than 2 vertices</li>
+
+ <li>it has 2 vertices but is not an open path</li>
+
+ <li>the vertices are all co-linear and it is not an open path</li>
+
+ </ul> </p>
+
+<br>
+
+
+
+
+ <h2 id="Auto-SeeAlso">See Also</h2>
+ <p class="Body"><a href="../../../../../Overview/Example.htm">Example</a>, <a href="../../Clipper/Methods/Execute.htm">Clipper.Execute</a>, <a href="AddPaths.htm">AddPaths</a>, <a href="../../../Functions/Orientation.htm">Orientation</a>, <a href="../../../PreProcessor/Defines.htm">Defines</a>, <a href="../../../Types/Paths.htm">Paths</a>, <a href="../../../Types/PolyFillType.htm">PolyFillType</a>, <a href="../../../Types/PolyType.htm">PolyType</a></p>
+
+ <p class="Copyright" id="auto"> <br><br> Copyright &copy;2010-2014 Angus Johnson&nbsp; - &nbsp; Clipper 6.2.1 &nbsp; - &nbsp; Help file built on 1-November-2014 <br><br> </p>
+
+</body>
+
+</html> \ No newline at end of file
diff --git a/upstream/clipper-6.4.2/Documentation/Docs/Units/ClipperLib/Classes/ClipperBase/Methods/Clear.htm b/upstream/clipper-6.4.2/Documentation/Docs/Units/ClipperLib/Classes/ClipperBase/Methods/Clear.htm
new file mode 100644
index 0000000..e23900b
--- /dev/null
+++ b/upstream/clipper-6.4.2/Documentation/Docs/Units/ClipperLib/Classes/ClipperBase/Methods/Clear.htm
@@ -0,0 +1,71 @@
+<html>
+
+<head>
+
+ <script type="text/javascript" src="../../../../../../Scripts/jquery.js">
+ </script>
+
+ <script type="text/javascript" src="../../../../../../Scripts/SyntaxHighlighter/scripts/shCore.js">
+ </script>
+
+ <script type="text/javascript" src="../../../../../../Scripts/SyntaxHighlighter/scripts/shBrushDelphi.js">
+ </script>
+
+ <script type="text/javascript" src="../../../../../../Scripts/SyntaxHighlighter/scripts/shBrushCpp.js">
+ </script>
+
+ <script type="text/javascript" src="../../../../../../Scripts/SyntaxHighlighter/scripts/shBrushCSharp.js">
+ </script>
+
+ <link type="text/css" rel="stylesheet" href="../../../../../../Scripts/SyntaxHighlighter/styles/shCoreDefault.css">
+
+ <link type="text/css" rel="stylesheet" href="../../../../../../Scripts/SyntaxHighlighter/styles/shThemeDefault.css">
+
+
+ <title>Clear</title>
+
+ <link rel="stylesheet" href="../../../../../../Styles/default.css" type="text/css">
+
+
+ <script type="text/javascript" src="../../../../../../Scripts/bootstrap.js">
+ </script>
+
+</head>
+
+<body bgcolor="#FFFFFF">
+
+ <!-- THIS FILE HAS BEEN AUTOMATICALLY PROCESSED FROM A SOURCE COPY -->
+
+ <!-- DO NOT EDIT MANUALLY !!! -->
+
+ <table class="Banner" cellspacing="0" cellpadding="0" border="1" bordercolorlight="#303080" bordercolordark="#7070B0">
+ <tr>
+ <td class="Banner" nowrap=""><a href="../../../../../_Body.htm" class="Banner"><img src="../../../../../../Images/_Home.gif" align="absmiddle">Home</a>
+ </td>
+ <td class="Banner" nowrap=""><a href="../../../_Body.htm" class="Banner"><img src="../../../../../../Images/_Unit.gif" align="absmiddle">ClipperLib</a>
+ </td>
+ <td class="Banner" nowrap=""><a href="../_Body.htm" class="Banner"><img src="../../../../../../Images/_Class.gif" align="absmiddle">ClipperBase</a>
+ </td>
+ <td class="Banner" width="100%" align="right"><img src="../../../../../../Images/_Project_Logo.gif" align="absmiddle">
+ </td>
+ </tr>
+ </table>
+ <h1>ClipperBase.Clear</h1>
+
+
+ <p class="Decl"><span class="Comment">Del.&raquo;</span> <b>procedure</b> Clear;</p>
+
+ <p class="Decl2"><span class="Comment">C++&nbsp;&raquo;</span> <b>virtual void</b> Clear();</p>
+
+ <p class="Decl3"><span class="Comment">C#&nbsp;&nbsp;&raquo;</span> public void Clear() {};</p>
+
+ <p class="Body"> The <b>Clear</b> method removes any existing subject and clip polygons allowing the Clipper object to be reused for clipping operations on <em>different</em> polygon sets.</p>
+
+
+
+
+ <p class="Copyright" id="auto"> <br><br> Copyright &copy;2010-2014 Angus Johnson&nbsp; - &nbsp; Clipper 6.2.1 &nbsp; - &nbsp; Help file built on 1-November-2014 <br><br> </p>
+
+</body>
+
+</html> \ No newline at end of file
diff --git a/upstream/clipper-6.4.2/Documentation/Docs/Units/ClipperLib/Classes/ClipperBase/Methods/GetBounds.htm b/upstream/clipper-6.4.2/Documentation/Docs/Units/ClipperLib/Classes/ClipperBase/Methods/GetBounds.htm
new file mode 100644
index 0000000..efb949a
--- /dev/null
+++ b/upstream/clipper-6.4.2/Documentation/Docs/Units/ClipperLib/Classes/ClipperBase/Methods/GetBounds.htm
@@ -0,0 +1,76 @@
+<html>
+
+<head>
+
+ <script type="text/javascript" src="../../../../../../Scripts/jquery.js">
+ </script>
+
+ <script type="text/javascript" src="../../../../../../Scripts/SyntaxHighlighter/scripts/shCore.js">
+ </script>
+
+ <script type="text/javascript" src="../../../../../../Scripts/SyntaxHighlighter/scripts/shBrushDelphi.js">
+ </script>
+
+ <script type="text/javascript" src="../../../../../../Scripts/SyntaxHighlighter/scripts/shBrushCpp.js">
+ </script>
+
+ <script type="text/javascript" src="../../../../../../Scripts/SyntaxHighlighter/scripts/shBrushCSharp.js">
+ </script>
+
+ <link type="text/css" rel="stylesheet" href="../../../../../../Scripts/SyntaxHighlighter/styles/shCoreDefault.css">
+
+ <link type="text/css" rel="stylesheet" href="../../../../../../Scripts/SyntaxHighlighter/styles/shThemeDefault.css">
+
+
+ <title>GetBounds</title>
+
+ <link rel="stylesheet" href="../../../../../../Styles/default.css" type="text/css">
+
+
+ <script type="text/javascript" src="../../../../../../Scripts/bootstrap.js">
+ </script>
+
+</head>
+
+<body bgcolor="#FFFFFF">
+
+ <!-- THIS FILE HAS BEEN AUTOMATICALLY PROCESSED FROM A SOURCE COPY -->
+
+ <!-- DO NOT EDIT MANUALLY !!! -->
+
+ <table class="Banner" cellspacing="0" cellpadding="0" border="1" bordercolorlight="#303080" bordercolordark="#7070B0">
+ <tr>
+ <td class="Banner" nowrap=""><a href="../../../../../_Body.htm" class="Banner"><img src="../../../../../../Images/_Home.gif" align="absmiddle">Home</a>
+ </td>
+ <td class="Banner" nowrap=""><a href="../../../_Body.htm" class="Banner"><img src="../../../../../../Images/_Unit.gif" align="absmiddle">ClipperLib</a>
+ </td>
+ <td class="Banner" nowrap=""><a href="../_Body.htm" class="Banner"><img src="../../../../../../Images/_Class.gif" align="absmiddle">ClipperBase</a>
+ </td>
+ <td class="Banner" width="100%" align="right"><img src="../../../../../../Images/_Project_Logo.gif" align="absmiddle">
+ </td>
+ </tr>
+ </table>
+ <h1>ClipperBase.GetBounds</h1>
+
+
+ <p class="Decl"><span class="Comment">Del.&raquo;</span> <b>function</b> GetBounds: <a href="../../../Types/IntRect.htm">TIntRect</a>;</p>
+
+ <p class="Decl2"><span class="Comment">C++&nbsp;&raquo;</span> <a href="../../../Types/IntRect.htm">IntRect</a> GetBounds();</p>
+
+ <p class="Decl3"><span class="Comment">C#&nbsp;&nbsp;&raquo;</span> <b>public</b> <a href="../../../Types/IntRect.htm">IntRect</a> GetBounds() {...};</p>
+<br>
+
+ <p class="Body"> This method returns the axis-aligned bounding rectangle of all polygons that have been added to the Clipper object. </p>
+
+<br>
+
+
+
+ <h2 id="Auto-SeeAlso">See Also</h2>
+ <p class="Body"><a href="../../../../../Overview/Example.htm">Example</a>, <a href="../../../Types/IntRect.htm">IntRect</a></p>
+
+ <p class="Copyright" id="auto"> <br><br> Copyright &copy;2010-2014 Angus Johnson&nbsp; - &nbsp; Clipper 6.2.1 &nbsp; - &nbsp; Help file built on 1-November-2014 <br><br> </p>
+
+</body>
+
+</html> \ No newline at end of file
diff --git a/upstream/clipper-6.4.2/Documentation/Docs/Units/ClipperLib/Classes/ClipperBase/_Body.htm b/upstream/clipper-6.4.2/Documentation/Docs/Units/ClipperLib/Classes/ClipperBase/_Body.htm
new file mode 100644
index 0000000..64a6058
--- /dev/null
+++ b/upstream/clipper-6.4.2/Documentation/Docs/Units/ClipperLib/Classes/ClipperBase/_Body.htm
@@ -0,0 +1,91 @@
+<html>
+
+<head>
+
+ <script type="text/javascript" src="../../../../../Scripts/jquery.js">
+ </script>
+
+ <script type="text/javascript" src="../../../../../Scripts/SyntaxHighlighter/scripts/shCore.js">
+ </script>
+
+ <script type="text/javascript" src="../../../../../Scripts/SyntaxHighlighter/scripts/shBrushDelphi.js">
+ </script>
+
+ <script type="text/javascript" src="../../../../../Scripts/SyntaxHighlighter/scripts/shBrushCpp.js">
+ </script>
+
+ <script type="text/javascript" src="../../../../../Scripts/SyntaxHighlighter/scripts/shBrushCSharp.js">
+ </script>
+
+ <link type="text/css" rel="stylesheet" href="../../../../../Scripts/SyntaxHighlighter/styles/shCoreDefault.css">
+
+ <link type="text/css" rel="stylesheet" href="../../../../../Scripts/SyntaxHighlighter/styles/shThemeDefault.css">
+
+
+ <title>ClipperBase</title>
+
+ <link rel="stylesheet" href="../../../../../Styles/default.css" type="text/css">
+
+ <meta name="Ancestor" content="">
+
+
+ <script type="text/javascript" src="../../../../../Scripts/bootstrap.js">
+ </script>
+
+</head>
+
+<body bgcolor="#FFFFFF">
+
+ <!-- THIS FILE HAS BEEN AUTOMATICALLY PROCESSED FROM A SOURCE COPY -->
+
+ <!-- DO NOT EDIT MANUALLY !!! -->
+
+ <table class="Banner" cellspacing="0" cellpadding="0" border="1" bordercolorlight="#303080" bordercolordark="#7070B0">
+ <tr>
+ <td class="Banner" nowrap=""><a href="../../../../_Body.htm" class="Banner"><img src="../../../../../Images/_Home.gif" align="absmiddle">Home</a>
+ </td>
+ <td class="Banner" nowrap=""><a href="../../_Body.htm" class="Banner"><img src="../../../../../Images/_Unit.gif" align="absmiddle">ClipperLib</a>
+ </td>
+ <td class="Banner" width="100%" align="right"><img src="../../../../../Images/_Project_Logo.gif" align="absmiddle">
+ </td>
+ </tr>
+ </table>
+ <h1>ClipperBase</h1>
+
+ <p class="Body"> <b>ClipperBase</b> is an abstract base class for <a href="../Clipper/_Body.htm"><b>Clipper</b></a>. A ClipperBase object should not be instantiated directly.</p>
+
+
+ <h2 id="Auto-Reference">Reference</h2>
+ <table>
+ <tr><th>Methods
+ </th>
+ </tr>
+ <tr>
+ <td colspan="1" class="White">In ClipperBase:
+ </td>
+ </tr>
+ <tr>
+ <td><a href="Methods/AddPath.htm">AddPath</a>
+ </td>
+ </tr>
+ <tr>
+ <td><a href="Methods/AddPaths.htm">AddPaths</a>
+ </td>
+ </tr>
+ <tr>
+ <td><a href="Methods/Clear.htm">Clear</a>
+ </td>
+ </tr>
+ <tr>
+ <td><a href="Methods/GetBounds.htm">GetBounds</a>
+ </td>
+ </tr>
+ </table>
+ <h2 id="Auto-SeeAlso">See Also</h2>
+ <p class="Body"><a href="../Clipper/_Body.htm">Clipper</a></p>
+
+ <p class="Copyright" id="auto"> <br><br> Copyright &copy;2010-2014 Angus Johnson&nbsp; - &nbsp; Clipper 6.2.1 &nbsp; - &nbsp; Help file built on 1-November-2014 <br><br> </p>
+
+</body>
+
+</html> \ No newline at end of file
diff --git a/upstream/clipper-6.4.2/Documentation/Docs/Units/ClipperLib/Classes/ClipperOffset/Methods/AddPath.htm b/upstream/clipper-6.4.2/Documentation/Docs/Units/ClipperLib/Classes/ClipperOffset/Methods/AddPath.htm
new file mode 100644
index 0000000..6aa26b8
--- /dev/null
+++ b/upstream/clipper-6.4.2/Documentation/Docs/Units/ClipperLib/Classes/ClipperOffset/Methods/AddPath.htm
@@ -0,0 +1,73 @@
+<html>
+
+<head>
+
+ <script type="text/javascript" src="../../../../../../Scripts/jquery.js">
+ </script>
+
+ <script type="text/javascript" src="../../../../../../Scripts/SyntaxHighlighter/scripts/shCore.js">
+ </script>
+
+ <script type="text/javascript" src="../../../../../../Scripts/SyntaxHighlighter/scripts/shBrushDelphi.js">
+ </script>
+
+ <script type="text/javascript" src="../../../../../../Scripts/SyntaxHighlighter/scripts/shBrushCpp.js">
+ </script>
+
+ <script type="text/javascript" src="../../../../../../Scripts/SyntaxHighlighter/scripts/shBrushCSharp.js">
+ </script>
+
+ <link type="text/css" rel="stylesheet" href="../../../../../../Scripts/SyntaxHighlighter/styles/shCoreDefault.css">
+
+ <link type="text/css" rel="stylesheet" href="../../../../../../Scripts/SyntaxHighlighter/styles/shThemeDefault.css">
+
+
+ <title>AddPath</title>
+
+ <link rel="stylesheet" href="../../../../../../Styles/default.css" type="text/css">
+
+
+ <script type="text/javascript" src="../../../../../../Scripts/bootstrap.js">
+ </script>
+
+</head>
+
+<body bgcolor="#FFFFFF">
+
+ <!-- THIS FILE HAS BEEN AUTOMATICALLY PROCESSED FROM A SOURCE COPY -->
+
+ <!-- DO NOT EDIT MANUALLY !!! -->
+
+ <table class="Banner" cellspacing="0" cellpadding="0" border="1" bordercolorlight="#303080" bordercolordark="#7070B0">
+ <tr>
+ <td class="Banner" nowrap=""><a href="../../../../../_Body.htm" class="Banner"><img src="../../../../../../Images/_Home.gif" align="absmiddle">Home</a>
+ </td>
+ <td class="Banner" nowrap=""><a href="../../../_Body.htm" class="Banner"><img src="../../../../../../Images/_Unit.gif" align="absmiddle">ClipperLib</a>
+ </td>
+ <td class="Banner" nowrap=""><a href="../_Body.htm" class="Banner"><img src="../../../../../../Images/_Class.gif" align="absmiddle">ClipperOffset</a>
+ </td>
+ <td class="Banner" width="100%" align="right"><img src="../../../../../../Images/_Project_Logo.gif" align="absmiddle">
+ </td>
+ </tr>
+ </table>
+ <h1>ClipperOffset.AddPath</h1>
+
+
+ <p class="Decl"><span class="Comment">Del.&raquo;</span> <b>procedure</b> AddPath(<b>const</b> Path: TPath; JoinType: TJoinType; EndType: TEndType);</p>
+
+ <p class="Decl2"><span class="Comment"> C++&nbsp;&raquo;</span> <b>void</b> AddPath(<b>const</b> Path&amp; path, JoinType jointype, EndType endtype);</p>
+
+ <p class="Decl3"><span class="Comment">C#&nbsp;&nbsp;&raquo;</span> <b>public void</b> AddPath(Path path, JoinType jointype, EndType endtype);</p>
+<br>
+
+
+ <p class="Body"> Adds a <a href="../../../Types/Path.htm"><b>Path</b></a> to a ClipperOffset object in preparation for offsetting.<br><br> Any number of paths can be added, and each has its own <a href="../../../Types/JoinType.htm">JoinType</a> and <a href="../../../Types/EndType.htm">EndType</a>. All 'outer' Paths must have the same orientation, and any 'hole' paths must have reverse orientation. <em>Closed</em> paths must have at least 3 vertices. <em>Open</em> paths may have as few as one vertex. Open paths can only be offset with positive deltas.<br><br> </p>
+
+ <h2 id="Auto-SeeAlso">See Also</h2>
+ <p class="Body"><a href="../../../Types/EndType.htm">EndType</a>, <a href="../../../Types/JoinType.htm">JoinType</a>, <a href="../../../Types/Path.htm">Path</a></p>
+
+ <p class="Copyright" id="auto"> <br><br> Copyright &copy;2010-2014 Angus Johnson&nbsp; - &nbsp; Clipper 6.2.1 &nbsp; - &nbsp; Help file built on 1-November-2014 <br><br> </p>
+
+</body>
+
+</html> \ No newline at end of file
diff --git a/upstream/clipper-6.4.2/Documentation/Docs/Units/ClipperLib/Classes/ClipperOffset/Methods/AddPaths.htm b/upstream/clipper-6.4.2/Documentation/Docs/Units/ClipperLib/Classes/ClipperOffset/Methods/AddPaths.htm
new file mode 100644
index 0000000..b0fe3bc
--- /dev/null
+++ b/upstream/clipper-6.4.2/Documentation/Docs/Units/ClipperLib/Classes/ClipperOffset/Methods/AddPaths.htm
@@ -0,0 +1,74 @@
+<html>
+
+<head>
+
+ <script type="text/javascript" src="../../../../../../Scripts/jquery.js">
+ </script>
+
+ <script type="text/javascript" src="../../../../../../Scripts/SyntaxHighlighter/scripts/shCore.js">
+ </script>
+
+ <script type="text/javascript" src="../../../../../../Scripts/SyntaxHighlighter/scripts/shBrushDelphi.js">
+ </script>
+
+ <script type="text/javascript" src="../../../../../../Scripts/SyntaxHighlighter/scripts/shBrushCpp.js">
+ </script>
+
+ <script type="text/javascript" src="../../../../../../Scripts/SyntaxHighlighter/scripts/shBrushCSharp.js">
+ </script>
+
+ <link type="text/css" rel="stylesheet" href="../../../../../../Scripts/SyntaxHighlighter/styles/shCoreDefault.css">
+
+ <link type="text/css" rel="stylesheet" href="../../../../../../Scripts/SyntaxHighlighter/styles/shThemeDefault.css">
+
+
+ <title>AddPaths</title>
+
+ <link rel="stylesheet" href="../../../../../../Styles/default.css" type="text/css">
+
+
+ <script type="text/javascript" src="../../../../../../Scripts/bootstrap.js">
+ </script>
+
+</head>
+
+<body bgcolor="#FFFFFF">
+
+ <!-- THIS FILE HAS BEEN AUTOMATICALLY PROCESSED FROM A SOURCE COPY -->
+
+ <!-- DO NOT EDIT MANUALLY !!! -->
+
+ <table class="Banner" cellspacing="0" cellpadding="0" border="1" bordercolorlight="#303080" bordercolordark="#7070B0">
+ <tr>
+ <td class="Banner" nowrap=""><a href="../../../../../_Body.htm" class="Banner"><img src="../../../../../../Images/_Home.gif" align="absmiddle">Home</a>
+ </td>
+ <td class="Banner" nowrap=""><a href="../../../_Body.htm" class="Banner"><img src="../../../../../../Images/_Unit.gif" align="absmiddle">ClipperLib</a>
+ </td>
+ <td class="Banner" nowrap=""><a href="../_Body.htm" class="Banner"><img src="../../../../../../Images/_Class.gif" align="absmiddle">ClipperOffset</a>
+ </td>
+ <td class="Banner" width="100%" align="right"><img src="../../../../../../Images/_Project_Logo.gif" align="absmiddle">
+ </td>
+ </tr>
+ </table>
+ <h1>ClipperOffset.AddPaths</h1>
+
+
+ <p class="Decl"><span class="Comment">Del.&raquo;</span> <b>procedure</b> AddPaths(<b>const</b> Paths: TPaths; JoinType: TJoinType; EndType: TEndType);</p>
+
+ <p class="Decl2"><span class="Comment"> C++&nbsp;&raquo;</span> <b>void</b> AddPaths(<b>const</b> Paths&amp; paths, JoinType jointype, EndType endtype);</p>
+
+ <p class="Decl3"><span class="Comment">C#&nbsp;&nbsp;&raquo;</span> <b>public void</b> AddPaths(Paths paths, JoinType jointype, EndType endtype);</p>
+<br>
+
+
+ <p class="Body"> Adds <a href="../../../Types/Paths.htm"><b>Paths</b></a> to a ClipperOffset object in preparation for offsetting.<br><br> Any number of paths can be added, and each path has its own <a href="../../../Types/JoinType.htm">JoinType</a> and <a href="../../../Types/EndType.htm">EndType</a>. All 'outer' Paths must have the same orientation, and any 'hole' paths must have reverse orientation. <em>Closed</em> paths must have at least 3 vertices. <em>Open</em> paths may have as few as one vertex. Open paths can only be offset with positive deltas.<br><br> </p>
+
+
+ <h2 id="Auto-SeeAlso">See Also</h2>
+ <p class="Body"><a href="../../../Types/EndType.htm">EndType</a>, <a href="../../../Types/JoinType.htm">JoinType</a>, <a href="../../../Types/Paths.htm">Paths</a></p>
+
+ <p class="Copyright" id="auto"> <br><br> Copyright &copy;2010-2014 Angus Johnson&nbsp; - &nbsp; Clipper 6.2.1 &nbsp; - &nbsp; Help file built on 1-November-2014 <br><br> </p>
+
+</body>
+
+</html> \ No newline at end of file
diff --git a/upstream/clipper-6.4.2/Documentation/Docs/Units/ClipperLib/Classes/ClipperOffset/Methods/Clear.htm b/upstream/clipper-6.4.2/Documentation/Docs/Units/ClipperLib/Classes/ClipperOffset/Methods/Clear.htm
new file mode 100644
index 0000000..7df15a6
--- /dev/null
+++ b/upstream/clipper-6.4.2/Documentation/Docs/Units/ClipperLib/Classes/ClipperOffset/Methods/Clear.htm
@@ -0,0 +1,72 @@
+<html>
+
+<head>
+
+ <script type="text/javascript" src="../../../../../../Scripts/jquery.js">
+ </script>
+
+ <script type="text/javascript" src="../../../../../../Scripts/SyntaxHighlighter/scripts/shCore.js">
+ </script>
+
+ <script type="text/javascript" src="../../../../../../Scripts/SyntaxHighlighter/scripts/shBrushDelphi.js">
+ </script>
+
+ <script type="text/javascript" src="../../../../../../Scripts/SyntaxHighlighter/scripts/shBrushCpp.js">
+ </script>
+
+ <script type="text/javascript" src="../../../../../../Scripts/SyntaxHighlighter/scripts/shBrushCSharp.js">
+ </script>
+
+ <link type="text/css" rel="stylesheet" href="../../../../../../Scripts/SyntaxHighlighter/styles/shCoreDefault.css">
+
+ <link type="text/css" rel="stylesheet" href="../../../../../../Scripts/SyntaxHighlighter/styles/shThemeDefault.css">
+
+
+ <title>Clear</title>
+
+ <link rel="stylesheet" href="../../../../../../Styles/default.css" type="text/css">
+
+
+ <script type="text/javascript" src="../../../../../../Scripts/bootstrap.js">
+ </script>
+
+</head>
+
+<body bgcolor="#FFFFFF">
+
+ <!-- THIS FILE HAS BEEN AUTOMATICALLY PROCESSED FROM A SOURCE COPY -->
+
+ <!-- DO NOT EDIT MANUALLY !!! -->
+
+ <table class="Banner" cellspacing="0" cellpadding="0" border="1" bordercolorlight="#303080" bordercolordark="#7070B0">
+ <tr>
+ <td class="Banner" nowrap=""><a href="../../../../../_Body.htm" class="Banner"><img src="../../../../../../Images/_Home.gif" align="absmiddle">Home</a>
+ </td>
+ <td class="Banner" nowrap=""><a href="../../../_Body.htm" class="Banner"><img src="../../../../../../Images/_Unit.gif" align="absmiddle">ClipperLib</a>
+ </td>
+ <td class="Banner" nowrap=""><a href="../_Body.htm" class="Banner"><img src="../../../../../../Images/_Class.gif" align="absmiddle">ClipperOffset</a>
+ </td>
+ <td class="Banner" width="100%" align="right"><img src="../../../../../../Images/_Project_Logo.gif" align="absmiddle">
+ </td>
+ </tr>
+ </table>
+ <h1>ClipperOffset.Clear</h1>
+
+
+ <p class="Decl"><span class="Comment">Del.&raquo;</span> <b>procedure</b> Clear;</p>
+
+ <p class="Decl2"><span class="Comment"> C++&nbsp;&raquo;</span> <b>void</b> Clear();</p>
+
+ <p class="Decl3"><span class="Comment">C#&nbsp;&nbsp;&raquo;</span> <b>public void</b> Clear();</p>
+<br>
+
+
+ <p class="Body"> This method clears all paths from the ClipperOffset object, allowing new paths to be assigned.<br><br> </p>
+
+
+
+ <p class="Copyright" id="auto"> <br><br> Copyright &copy;2010-2014 Angus Johnson&nbsp; - &nbsp; Clipper 6.2.1 &nbsp; - &nbsp; Help file built on 1-November-2014 <br><br> </p>
+
+</body>
+
+</html> \ No newline at end of file
diff --git a/upstream/clipper-6.4.2/Documentation/Docs/Units/ClipperLib/Classes/ClipperOffset/Methods/Constructor.htm b/upstream/clipper-6.4.2/Documentation/Docs/Units/ClipperLib/Classes/ClipperOffset/Methods/Constructor.htm
new file mode 100644
index 0000000..59eed6e
--- /dev/null
+++ b/upstream/clipper-6.4.2/Documentation/Docs/Units/ClipperLib/Classes/ClipperOffset/Methods/Constructor.htm
@@ -0,0 +1,74 @@
+<html>
+
+<head>
+
+ <script type="text/javascript" src="../../../../../../Scripts/jquery.js">
+ </script>
+
+ <script type="text/javascript" src="../../../../../../Scripts/SyntaxHighlighter/scripts/shCore.js">
+ </script>
+
+ <script type="text/javascript" src="../../../../../../Scripts/SyntaxHighlighter/scripts/shBrushDelphi.js">
+ </script>
+
+ <script type="text/javascript" src="../../../../../../Scripts/SyntaxHighlighter/scripts/shBrushCpp.js">
+ </script>
+
+ <script type="text/javascript" src="../../../../../../Scripts/SyntaxHighlighter/scripts/shBrushCSharp.js">
+ </script>
+
+ <link type="text/css" rel="stylesheet" href="../../../../../../Scripts/SyntaxHighlighter/styles/shCoreDefault.css">
+
+ <link type="text/css" rel="stylesheet" href="../../../../../../Scripts/SyntaxHighlighter/styles/shThemeDefault.css">
+
+
+ <title>Constructor</title>
+
+ <link rel="stylesheet" href="../../../../../../Styles/default.css" type="text/css">
+
+
+ <script type="text/javascript" src="../../../../../../Scripts/bootstrap.js">
+ </script>
+
+</head>
+
+<body bgcolor="#FFFFFF">
+
+ <!-- THIS FILE HAS BEEN AUTOMATICALLY PROCESSED FROM A SOURCE COPY -->
+
+ <!-- DO NOT EDIT MANUALLY !!! -->
+
+ <table class="Banner" cellspacing="0" cellpadding="0" border="1" bordercolorlight="#303080" bordercolordark="#7070B0">
+ <tr>
+ <td class="Banner" nowrap=""><a href="../../../../../_Body.htm" class="Banner"><img src="../../../../../../Images/_Home.gif" align="absmiddle">Home</a>
+ </td>
+ <td class="Banner" nowrap=""><a href="../../../_Body.htm" class="Banner"><img src="../../../../../../Images/_Unit.gif" align="absmiddle">ClipperLib</a>
+ </td>
+ <td class="Banner" nowrap=""><a href="../_Body.htm" class="Banner"><img src="../../../../../../Images/_Class.gif" align="absmiddle">ClipperOffset</a>
+ </td>
+ <td class="Banner" width="100%" align="right"><img src="../../../../../../Images/_Project_Logo.gif" align="absmiddle">
+ </td>
+ </tr>
+ </table>
+ <h1>ClipperOffset.Constructor</h1>
+
+
+ <p class="Decl"><span class="Comment">Del.&raquo;</span> <b>constructor</b> Create(MiterLimit: Double = 2; RoundPrecision: Double = 0.25);</p>
+
+ <p class="Decl2"><span class="Comment"> C++&nbsp;&raquo;</span> ClipperOffset( double miterLimit = 2.0, double roundPrecision = 0.25);</p>
+
+ <p class="Decl3"><span class="Comment">C#&nbsp;&nbsp;&raquo;</span> <b>public</b> ClipperOffset( double miterLimit = 2.0, double roundPrecision = 0.25);</p>
+<br>
+
+
+ <p class="Body"> The ClipperOffset constructor takes 2 optional parameters: <a href="../Properties/MiterLimit.htm">MiterLimit</a> and <a href="../Properties/ArcTolerance.htm">ArcTolerance</a>. Thes two parameters corresponds to properties of the same name. MiterLimit is only relevant when JoinType is jtMiter, and ArcTolerance is only relevant when JoinType is jtRound or when EndType is etOpenRound.<br><br> </p>
+
+
+ <h2 id="Auto-SeeAlso">See Also</h2>
+ <p class="Body"><a href="../Properties/ArcTolerance.htm">ArcTolerance</a>, <a href="../Properties/MiterLimit.htm">MiterLimit</a></p>
+
+ <p class="Copyright" id="auto"> <br><br> Copyright &copy;2010-2014 Angus Johnson&nbsp; - &nbsp; Clipper 6.2.1 &nbsp; - &nbsp; Help file built on 1-November-2014 <br><br> </p>
+
+</body>
+
+</html> \ No newline at end of file
diff --git a/upstream/clipper-6.4.2/Documentation/Docs/Units/ClipperLib/Classes/ClipperOffset/Methods/Execute.htm b/upstream/clipper-6.4.2/Documentation/Docs/Units/ClipperLib/Classes/ClipperOffset/Methods/Execute.htm
new file mode 100644
index 0000000..5ac748d
--- /dev/null
+++ b/upstream/clipper-6.4.2/Documentation/Docs/Units/ClipperLib/Classes/ClipperOffset/Methods/Execute.htm
@@ -0,0 +1,111 @@
+<html>
+
+<head>
+
+ <script type="text/javascript" src="../../../../../../Scripts/jquery.js">
+ </script>
+
+ <script type="text/javascript" src="../../../../../../Scripts/SyntaxHighlighter/scripts/shCore.js">
+ </script>
+
+ <script type="text/javascript" src="../../../../../../Scripts/SyntaxHighlighter/scripts/shBrushDelphi.js">
+ </script>
+
+ <script type="text/javascript" src="../../../../../../Scripts/SyntaxHighlighter/scripts/shBrushCpp.js">
+ </script>
+
+ <script type="text/javascript" src="../../../../../../Scripts/SyntaxHighlighter/scripts/shBrushCSharp.js">
+ </script>
+
+ <link type="text/css" rel="stylesheet" href="../../../../../../Scripts/SyntaxHighlighter/styles/shCoreDefault.css">
+
+ <link type="text/css" rel="stylesheet" href="../../../../../../Scripts/SyntaxHighlighter/styles/shThemeDefault.css">
+
+
+ <title>Execute</title>
+
+ <link rel="stylesheet" href="../../../../../../Styles/default.css" type="text/css">
+
+
+ <script type="text/javascript" src="../../../../../../Scripts/bootstrap.js">
+ </script>
+
+</head>
+
+<body bgcolor="#FFFFFF">
+
+ <!-- THIS FILE HAS BEEN AUTOMATICALLY PROCESSED FROM A SOURCE COPY -->
+
+ <!-- DO NOT EDIT MANUALLY !!! -->
+
+ <table class="Banner" cellspacing="0" cellpadding="0" border="1" bordercolorlight="#303080" bordercolordark="#7070B0">
+ <tr>
+ <td class="Banner" nowrap=""><a href="../../../../../_Body.htm" class="Banner"><img src="../../../../../../Images/_Home.gif" align="absmiddle">Home</a>
+ </td>
+ <td class="Banner" nowrap=""><a href="../../../_Body.htm" class="Banner"><img src="../../../../../../Images/_Unit.gif" align="absmiddle">ClipperLib</a>
+ </td>
+ <td class="Banner" nowrap=""><a href="../_Body.htm" class="Banner"><img src="../../../../../../Images/_Class.gif" align="absmiddle">ClipperOffset</a>
+ </td>
+ <td class="Banner" width="100%" align="right"><img src="../../../../../../Images/_Project_Logo.gif" align="absmiddle">
+ </td>
+ </tr>
+ </table>
+ <h1>ClipperOffset.Execute</h1>
+
+
+ <p class="Decl"><span class="Comment">Del.&raquo;</span> <b>procedure</b> Execute(<b>out</b> solution: TPaths; Delta: Double); <b>overload</b>;</p>
+
+ <p class="Decl2"><span class="Comment"> C++&nbsp;&raquo;</span> <b>void</b> Execute(Paths& solution, double delta);</p>
+
+ <p class="Decl3"><span class="Comment">C#&nbsp;&nbsp;&raquo;</span> <b>public void</b> Execute(ref Paths solution, double delta);</p>
+<br>
+
+ <p class="Decl"><span class="Comment">Del.&raquo;</span> <b>procedure</b> Execute(<b>out</b> PolyTree: TPolyTree; Delta: Double); <b>overload</b>;</p>
+
+ <p class="Decl2"><span class="Comment"> C++&nbsp;&raquo;</span> <b>void</b> Execute(PolyTree& polytree, double delta);</p>
+
+ <p class="Decl3"><span class="Comment">C#&nbsp;&nbsp;&raquo;</span> <b>public void</b> Execute(ref PolyTree polytree, double delta);</p>
+<br>
+
+
+ <p class="Body"> This method takes two parameters. The first is the structure that receives the result of the offset operation (either a PolyTree or a Paths structure). The second parameter is the amount to which the supplied paths will be offset. Negative delta values shrink polygons and positive delta expand them.<br><br> This method can be called multiple times, offsetting the same paths by different amounts (ie using different deltas).<br><br> <img src="../../../../../../Images/offset1.png" alt="" width="310" height="314" border="0" align="right">
+ <table cellspacing="0" cellpadding="0" border="0" align="left" style="margin: 0;" width="560px">
+
+ <tr>
+ <td class="White">
+
+ <pre class="brush: cpp;">
+#include "clipper.hpp"
+...
+using namespace ClipperLib;
+
+int main()
+{
+ Path subj;
+ Paths solution;
+ subj &lt;&lt;
+ IntPoint(348,257) &lt;&lt; IntPoint(364,148) &lt;&lt; IntPoint(362,148) &lt;&lt;
+ IntPoint(326,241) &lt;&lt; IntPoint(295,219) &lt;&lt; IntPoint(258,88) &lt;&lt;
+ IntPoint(440,129) &lt;&lt; IntPoint(370,196) &lt;&lt; IntPoint(372,275);
+ ClipperOffset co;
+ co.AddPath(subj, jtRound, etClosedPolygon);
+ co.Execute(solution, -7.0);
+
+ //draw solution ...
+ DrawPolygons(solution, 0x4000FF00, 0xFF009900);
+}
+ </pre>
+
+
+ </td>
+ </tr>
+
+ </table> <div style="clear:both">&nbsp;</div> </p>
+
+
+
+ <p class="Copyright" id="auto"> <br><br> Copyright &copy;2010-2014 Angus Johnson&nbsp; - &nbsp; Clipper 6.2.1 &nbsp; - &nbsp; Help file built on 1-November-2014 <br><br> </p>
+
+</body>
+
+</html> \ No newline at end of file
diff --git a/upstream/clipper-6.4.2/Documentation/Docs/Units/ClipperLib/Classes/ClipperOffset/Properties/ArcTolerance.htm b/upstream/clipper-6.4.2/Documentation/Docs/Units/ClipperLib/Classes/ClipperOffset/Properties/ArcTolerance.htm
new file mode 100644
index 0000000..9cfc79c
--- /dev/null
+++ b/upstream/clipper-6.4.2/Documentation/Docs/Units/ClipperLib/Classes/ClipperOffset/Properties/ArcTolerance.htm
@@ -0,0 +1,74 @@
+<html>
+
+<head>
+
+ <script type="text/javascript" src="../../../../../../Scripts/jquery.js">
+ </script>
+
+ <script type="text/javascript" src="../../../../../../Scripts/SyntaxHighlighter/scripts/shCore.js">
+ </script>
+
+ <script type="text/javascript" src="../../../../../../Scripts/SyntaxHighlighter/scripts/shBrushDelphi.js">
+ </script>
+
+ <script type="text/javascript" src="../../../../../../Scripts/SyntaxHighlighter/scripts/shBrushCpp.js">
+ </script>
+
+ <script type="text/javascript" src="../../../../../../Scripts/SyntaxHighlighter/scripts/shBrushCSharp.js">
+ </script>
+
+ <link type="text/css" rel="stylesheet" href="../../../../../../Scripts/SyntaxHighlighter/styles/shCoreDefault.css">
+
+ <link type="text/css" rel="stylesheet" href="../../../../../../Scripts/SyntaxHighlighter/styles/shThemeDefault.css">
+
+
+ <title>ArcTolerance</title>
+
+ <link rel="stylesheet" href="../../../../../../Styles/default.css" type="text/css">
+
+
+ <script type="text/javascript" src="../../../../../../Scripts/bootstrap.js">
+ </script>
+
+</head>
+
+<body bgcolor="#FFFFFF">
+
+ <!-- THIS FILE HAS BEEN AUTOMATICALLY PROCESSED FROM A SOURCE COPY -->
+
+ <!-- DO NOT EDIT MANUALLY !!! -->
+
+ <table class="Banner" cellspacing="0" cellpadding="0" border="1" bordercolorlight="#303080" bordercolordark="#7070B0">
+ <tr>
+ <td class="Banner" nowrap=""><a href="../../../../../_Body.htm" class="Banner"><img src="../../../../../../Images/_Home.gif" align="absmiddle">Home</a>
+ </td>
+ <td class="Banner" nowrap=""><a href="../../../_Body.htm" class="Banner"><img src="../../../../../../Images/_Unit.gif" align="absmiddle">ClipperLib</a>
+ </td>
+ <td class="Banner" nowrap=""><a href="../_Body.htm" class="Banner"><img src="../../../../../../Images/_Class.gif" align="absmiddle">ClipperOffset</a>
+ </td>
+ <td class="Banner" width="100%" align="right"><img src="../../../../../../Images/_Project_Logo.gif" align="absmiddle">
+ </td>
+ </tr>
+ </table>
+ <h1>ClipperOffset.ArcTolerance</h1>
+
+ <p class="Decl"><span class="Comment">Del.&raquo;</span> <b>property</b> ArcTolerance: double; <span class="Comment">//read and write</span></p>
+
+ <p class="Decl2"><span class="Comment"> C++&nbsp;&raquo;</span> <b>double</b> ArcTolerance;</p>
+
+ <p class="Decl3"><span class="Comment">C#&nbsp;&nbsp;&raquo;</span> <b>public double</b> ArcTolerance {get; set;}</p>
+<br>
+
+ <p class="Body"> Firstly, this field/property is only relevant when JoinType = jtRound and/or EndType = etRound.<br><br> Since flattened paths can never perfectly represent arcs, this field/property specifies a maximum acceptable imprecision ('tolerance') when arcs are approximated in an offsetting operation. Smaller values will increase 'smoothness' up to a point though at a cost of performance and in creating more vertices to construct the arc.<br><br> The default ArcTolerance is 0.25 units. This means that the maximum distance the flattened path will deviate from the 'true' arc will be no more than 0.25 units (before rounding).<br><br> <span class="maroon">Reducing tolerances below 0.25 will <b>not</b> improve smoothness since vertex coordinates will still be rounded to integer values.</span> The only way to achieve sub-integer precision is through coordinate scaling before and after offsetting (see example below).<br><br> <span class="maroon">It's important to make ArcTolerance a sensible fraction of the offset delta (arc radius)</span>. Large tolerances relative to the offset delta will produce poor arc approximations but, just as importantly, very small tolerances will substantially slow offsetting performance while providing unnecessary degrees of precision. This is most likely to be an issue when offsetting polygons whose coordinates have been scaled to preserve floating point precision.<br><br> <b>Example:</b> Imagine a set of polygons (defined in floating point coordinates) that is to be offset by 10 units using <em>round</em> joins, and the solution is to retain floating point precision up to at least 6 decimal places.<br> To preserve this degree of floating point precision, and given that Clipper and ClipperOffset both operate on integer coordinates, the polygon coordinates will be scaled up by 10<sup>8
+ </sup> (and rounded to integers) prior to offsetting. Both offset delta and ArcTolerance will also need to be scaled by this same factor. <em>If ArcTolerance was left unscaled at the default 0.25 units, every arc in the solution would contain a fraction of 44 THOUSAND vertices</em> while the final arc imprecision would be 0.25 &times; 10<sup>-8
+ </sup> units (ie once scaling was reversed). However, if 0.1 units was an acceptable imprecision in the final <em>unscaled</em> solution, then ArcTolerance should be set to 0.1 &times; scaling_factor (0.1 &times; 10<sup>8
+ </sup>). Now if scaling is applied equally to both ArcTolerance and to Delta Offset, then in this example the number of vertices (steps) defining each arc would be a fraction of 23.<br><br> The <a href="../../../../../../offset_triginometry2.svg">formula</a> for the number of steps in a full circular arc is ... Pi / acos(1 - arc_tolerance / abs(delta)) </p>
+
+ <h2 id="Auto-SeeAlso">See Also</h2>
+ <p class="Body"><a href="../../../../../../offset_triginometry2.svg">offset_triginometry2</a></p>
+
+ <p class="Copyright" id="auto"> <br><br> Copyright &copy;2010-2014 Angus Johnson&nbsp; - &nbsp; Clipper 6.2.1 &nbsp; - &nbsp; Help file built on 1-November-2014 <br><br> </p>
+
+</body>
+
+</html> \ No newline at end of file
diff --git a/upstream/clipper-6.4.2/Documentation/Docs/Units/ClipperLib/Classes/ClipperOffset/Properties/MiterLimit.htm b/upstream/clipper-6.4.2/Documentation/Docs/Units/ClipperLib/Classes/ClipperOffset/Properties/MiterLimit.htm
new file mode 100644
index 0000000..3bdf826
--- /dev/null
+++ b/upstream/clipper-6.4.2/Documentation/Docs/Units/ClipperLib/Classes/ClipperOffset/Properties/MiterLimit.htm
@@ -0,0 +1,75 @@
+<html>
+
+<head>
+
+ <script type="text/javascript" src="../../../../../../Scripts/jquery.js">
+ </script>
+
+ <script type="text/javascript" src="../../../../../../Scripts/SyntaxHighlighter/scripts/shCore.js">
+ </script>
+
+ <script type="text/javascript" src="../../../../../../Scripts/SyntaxHighlighter/scripts/shBrushDelphi.js">
+ </script>
+
+ <script type="text/javascript" src="../../../../../../Scripts/SyntaxHighlighter/scripts/shBrushCpp.js">
+ </script>
+
+ <script type="text/javascript" src="../../../../../../Scripts/SyntaxHighlighter/scripts/shBrushCSharp.js">
+ </script>
+
+ <link type="text/css" rel="stylesheet" href="../../../../../../Scripts/SyntaxHighlighter/styles/shCoreDefault.css">
+
+ <link type="text/css" rel="stylesheet" href="../../../../../../Scripts/SyntaxHighlighter/styles/shThemeDefault.css">
+
+
+ <title>MiterLimit</title>
+
+ <link rel="stylesheet" href="../../../../../../Styles/default.css" type="text/css">
+
+
+ <script type="text/javascript" src="../../../../../../Scripts/bootstrap.js">
+ </script>
+
+</head>
+
+<body bgcolor="#FFFFFF">
+
+ <!-- THIS FILE HAS BEEN AUTOMATICALLY PROCESSED FROM A SOURCE COPY -->
+
+ <!-- DO NOT EDIT MANUALLY !!! -->
+
+ <table class="Banner" cellspacing="0" cellpadding="0" border="1" bordercolorlight="#303080" bordercolordark="#7070B0">
+ <tr>
+ <td class="Banner" nowrap=""><a href="../../../../../_Body.htm" class="Banner"><img src="../../../../../../Images/_Home.gif" align="absmiddle">Home</a>
+ </td>
+ <td class="Banner" nowrap=""><a href="../../../_Body.htm" class="Banner"><img src="../../../../../../Images/_Unit.gif" align="absmiddle">ClipperLib</a>
+ </td>
+ <td class="Banner" nowrap=""><a href="../_Body.htm" class="Banner"><img src="../../../../../../Images/_Class.gif" align="absmiddle">ClipperOffset</a>
+ </td>
+ <td class="Banner" width="100%" align="right"><img src="../../../../../../Images/_Project_Logo.gif" align="absmiddle">
+ </td>
+ </tr>
+ </table>
+ <h1>ClipperOffset.MiterLimit</h1>
+
+
+ <p class="Decl"><span class="Comment">Del.&raquo;</span> <b>property</b> MiterLimit: double; <span class="Comment">//read and write</span></p>
+
+ <p class="Decl2"><span class="Comment"> C++&nbsp;&raquo;</span> <b>double</b> MiterLimit;</p>
+
+ <p class="Decl3"><span class="Comment">C#&nbsp;&nbsp;&raquo;</span> <b>public double</b> MiterLimit {get; set;}</p>
+<br>
+
+
+ <p class="Body"> This property sets the maximum distance <em>in multiples of delta</em> that vertices can be offset from their original positions before squaring is applied. (Squaring truncates a miter by 'cutting it off' at 1 &times; delta distance from the original vertex.)<br><br> <b>The default value for MiterLimit is 2</b> (ie twice delta). This is also the smallest MiterLimit that's allowed. If mitering was unrestricted (ie without any squaring), then offsets at very acute angles would generate unacceptably long 'spikes'.<br><br> An example of an offsetting 'spike' at a narrow angle that's a consequence of using a large MiterLimit (25) ...<br> <img src="../../../../../../Images/miterlimit.png" alt="" border="0"> </p>
+
+
+
+ <h2 id="Auto-SeeAlso">See Also</h2>
+ <p class="Body"><a href="../../../Types/JoinType.htm">JoinType</a></p>
+
+ <p class="Copyright" id="auto"> <br><br> Copyright &copy;2010-2014 Angus Johnson&nbsp; - &nbsp; Clipper 6.2.1 &nbsp; - &nbsp; Help file built on 1-November-2014 <br><br> </p>
+
+</body>
+
+</html> \ No newline at end of file
diff --git a/upstream/clipper-6.4.2/Documentation/Docs/Units/ClipperLib/Classes/ClipperOffset/_Body.htm b/upstream/clipper-6.4.2/Documentation/Docs/Units/ClipperLib/Classes/ClipperOffset/_Body.htm
new file mode 100644
index 0000000..337ed71
--- /dev/null
+++ b/upstream/clipper-6.4.2/Documentation/Docs/Units/ClipperLib/Classes/ClipperOffset/_Body.htm
@@ -0,0 +1,136 @@
+<html>
+
+<head>
+
+ <script type="text/javascript" src="../../../../../Scripts/jquery.js">
+ </script>
+
+ <script type="text/javascript" src="../../../../../Scripts/SyntaxHighlighter/scripts/shCore.js">
+ </script>
+
+ <script type="text/javascript" src="../../../../../Scripts/SyntaxHighlighter/scripts/shBrushDelphi.js">
+ </script>
+
+ <script type="text/javascript" src="../../../../../Scripts/SyntaxHighlighter/scripts/shBrushCpp.js">
+ </script>
+
+ <script type="text/javascript" src="../../../../../Scripts/SyntaxHighlighter/scripts/shBrushCSharp.js">
+ </script>
+
+ <link type="text/css" rel="stylesheet" href="../../../../../Scripts/SyntaxHighlighter/styles/shCoreDefault.css">
+
+ <link type="text/css" rel="stylesheet" href="../../../../../Scripts/SyntaxHighlighter/styles/shThemeDefault.css">
+
+
+ <title>ClipperOffset</title>
+
+ <link rel="stylesheet" href="../../../../../Styles/default.css" type="text/css">
+
+ <meta name="Ancestor" content="">
+
+
+ <script type="text/javascript" src="../../../../../Scripts/bootstrap.js">
+ </script>
+
+</head>
+
+<body bgcolor="#FFFFFF">
+
+ <!-- THIS FILE HAS BEEN AUTOMATICALLY PROCESSED FROM A SOURCE COPY -->
+
+ <!-- DO NOT EDIT MANUALLY !!! -->
+
+ <table class="Banner" cellspacing="0" cellpadding="0" border="1" bordercolorlight="#303080" bordercolordark="#7070B0">
+ <tr>
+ <td class="Banner" nowrap=""><a href="../../../../_Body.htm" class="Banner"><img src="../../../../../Images/_Home.gif" align="absmiddle">Home</a>
+ </td>
+ <td class="Banner" nowrap=""><a href="../../_Body.htm" class="Banner"><img src="../../../../../Images/_Unit.gif" align="absmiddle">ClipperLib</a>
+ </td>
+ <td class="Banner" width="100%" align="right"><img src="../../../../../Images/_Project_Logo.gif" align="absmiddle">
+ </td>
+ </tr>
+ </table>
+ <h1>ClipperOffset</h1>
+<br>
+
+ <p class="Body">The ClipperOffset class encapsulates the process of offsetting (inflating/deflating) both open and closed paths using a number of different join types and end types.<br><br> <em>(This class replaces the now deprecated OffsetPaths function which was less flexible.)</em><br><br> <b>Preconditions for offsetting:</b><br> 1. The orientations of closed paths must be consistent such that outer polygons share the same orientation, and any holes have the opposite orientation (ie non-zero filling). Open paths must be oriented with closed outer polygons.<br> 2. Polygons must not self-intersect. <br><br> <b>Limitations:</b><br> When offsetting, small artefacts may appear where polygons overlap. To avoid these artefacts, offset overlapping polygons separately.<br><br><br> <img src="../../../../../Images/offset1.png" alt="" width="310" height="314" border="0" align="right">
+ <table cellspacing="0" cellpadding="0" border="0" align="left" style="margin: 0;" width="560px">
+
+ <tr>
+ <td class="White">
+
+ <pre class="brush: cpp;">
+#include "clipper.hpp"
+...
+using namespace ClipperLib;
+
+int main()
+{
+ Path subj;
+ Paths solution;
+ subj &lt;&lt;
+ IntPoint(348,257) &lt;&lt; IntPoint(364,148) &lt;&lt; IntPoint(362,148) &lt;&lt;
+ IntPoint(326,241) &lt;&lt; IntPoint(295,219) &lt;&lt; IntPoint(258,88) &lt;&lt;
+ IntPoint(440,129) &lt;&lt; IntPoint(370,196) &lt;&lt; IntPoint(372,275);
+ ClipperOffset co;
+ co.AddPath(subj, jtRound, etClosedPolygon);
+ co.Execute(solution, -7.0);
+
+ //draw solution ...
+ DrawPolygons(solution, 0x4000FF00, 0xFF009900);
+}
+ </pre>
+
+
+ </td>
+ </tr>
+
+ </table> <div style="clear:both">&nbsp;</div> </p>
+
+ <h2 id="Auto-Reference">Reference</h2>
+ <table>
+ <tr><th>Methods
+ </th><th>Properties
+ </th>
+ </tr>
+ <tr>
+ <td colspan="2" class="White">In ClipperOffset:
+ </td>
+ </tr>
+ <tr>
+ <td><a href="Methods/AddPath.htm">AddPath</a>
+ </td>
+ <td><a href="Properties/ArcTolerance.htm">ArcTolerance</a>
+ </td>
+ </tr>
+ <tr>
+ <td><a href="Methods/AddPaths.htm">AddPaths</a>
+ </td>
+ <td><a href="Properties/MiterLimit.htm">MiterLimit</a>
+ </td>
+ </tr>
+ <tr>
+ <td><a href="Methods/Clear.htm">Clear</a>
+ </td>
+ <td>
+ </td>
+ </tr>
+ <tr>
+ <td><a href="Methods/Constructor.htm">Constructor</a>
+ </td>
+ <td>
+ </td>
+ </tr>
+ <tr>
+ <td><a href="Methods/Execute.htm">Execute</a>
+ </td>
+ <td>
+ </td>
+ </tr>
+ </table>
+
+ <p class="Copyright" id="auto"> <br><br> Copyright &copy;2010-2014 Angus Johnson&nbsp; - &nbsp; Clipper 6.2.1 &nbsp; - &nbsp; Help file built on 1-November-2014 <br><br> </p>
+
+</body>
+
+</html> \ No newline at end of file
diff --git a/upstream/clipper-6.4.2/Documentation/Docs/Units/ClipperLib/Classes/PolyNode/Methods/GetNext.htm b/upstream/clipper-6.4.2/Documentation/Docs/Units/ClipperLib/Classes/PolyNode/Methods/GetNext.htm
new file mode 100644
index 0000000..973c8bc
--- /dev/null
+++ b/upstream/clipper-6.4.2/Documentation/Docs/Units/ClipperLib/Classes/PolyNode/Methods/GetNext.htm
@@ -0,0 +1,97 @@
+<html>
+
+<head>
+
+ <script type="text/javascript" src="../../../../../../Scripts/jquery.js">
+ </script>
+
+ <script type="text/javascript" src="../../../../../../Scripts/SyntaxHighlighter/scripts/shCore.js">
+ </script>
+
+ <script type="text/javascript" src="../../../../../../Scripts/SyntaxHighlighter/scripts/shBrushDelphi.js">
+ </script>
+
+ <script type="text/javascript" src="../../../../../../Scripts/SyntaxHighlighter/scripts/shBrushCpp.js">
+ </script>
+
+ <script type="text/javascript" src="../../../../../../Scripts/SyntaxHighlighter/scripts/shBrushCSharp.js">
+ </script>
+
+ <link type="text/css" rel="stylesheet" href="../../../../../../Scripts/SyntaxHighlighter/styles/shCoreDefault.css">
+
+ <link type="text/css" rel="stylesheet" href="../../../../../../Scripts/SyntaxHighlighter/styles/shThemeDefault.css">
+
+
+ <title>GetNext</title>
+
+ <link rel="stylesheet" href="../../../../../../Styles/default.css" type="text/css">
+
+
+ <script type="text/javascript" src="../../../../../../Scripts/bootstrap.js">
+ </script>
+
+</head>
+
+<body bgcolor="#FFFFFF">
+
+ <!-- THIS FILE HAS BEEN AUTOMATICALLY PROCESSED FROM A SOURCE COPY -->
+
+ <!-- DO NOT EDIT MANUALLY !!! -->
+
+ <table class="Banner" cellspacing="0" cellpadding="0" border="1" bordercolorlight="#303080" bordercolordark="#7070B0">
+ <tr>
+ <td class="Banner" nowrap=""><a href="../../../../../_Body.htm" class="Banner"><img src="../../../../../../Images/_Home.gif" align="absmiddle">Home</a>
+ </td>
+ <td class="Banner" nowrap=""><a href="../../../_Body.htm" class="Banner"><img src="../../../../../../Images/_Unit.gif" align="absmiddle">ClipperLib</a>
+ </td>
+ <td class="Banner" nowrap=""><a href="../_Body.htm" class="Banner"><img src="../../../../../../Images/_Class.gif" align="absmiddle">PolyNode</a>
+ </td>
+ <td class="Banner" width="100%" align="right"><img src="../../../../../../Images/_Project_Logo.gif" align="absmiddle">
+ </td>
+ </tr>
+ </table>
+ <h1>PolyNode.GetNext</h1>
+
+
+ <p class="Decl"><span class="Comment"> Del.&raquo; </span><b>function</b> GetNext: TPolyNode;</p>
+
+ <p class="Decl2"><span class="Comment"> C++&nbsp;&raquo;</span> PolyNode* GetNext();</p>
+
+ <p class="Decl3"><span class="Comment"> C#&nbsp;&nbsp;&raquo;</span> <b>public <span class="CSharp">PolyNode</span></b> GetNext();</p>
+
+
+ <p class="Body"> The returned Polynode will be the first child if any, otherwise the next sibling, otherwise the next sibling of the Parent etc.<br><br> A PolyTree can be traversed very easily by calling GetFirst() followed by GetNext() in a loop until the returned object is a null pointer ...<br><br>
+ <table cellspacing="0" cellpadding="0" border="0" align="left" style="margin: 0;" width="600px">
+
+ <tr>
+ <td class="White">
+
+ <pre class="brush: cpp;">
+ PolyTree polytree;
+ //call to Clipper.Execute method here which fills 'polytree'
+
+ PolyNode* polynode = polytree.GetFirst();
+ while (polynode)
+ {
+ //do stuff with polynode here
+
+ polynode = polynode-&gt;GetNext();
+ }
+
+ </pre>
+
+ </td>
+ </tr>
+
+ </table> <div style="clear:both;"></div> </p>
+
+
+
+ <h2 id="Auto-SeeAlso">See Also</h2>
+ <p class="Body"><a href="../../PolyTree/Methods/GetFirst.htm">PolyTree.GetFirst</a></p>
+
+ <p class="Copyright" id="auto"> <br><br> Copyright &copy;2010-2014 Angus Johnson&nbsp; - &nbsp; Clipper 6.2.1 &nbsp; - &nbsp; Help file built on 1-November-2014 <br><br> </p>
+
+</body>
+
+</html> \ No newline at end of file
diff --git a/upstream/clipper-6.4.2/Documentation/Docs/Units/ClipperLib/Classes/PolyNode/Properties/ChildCount.htm b/upstream/clipper-6.4.2/Documentation/Docs/Units/ClipperLib/Classes/PolyNode/Properties/ChildCount.htm
new file mode 100644
index 0000000..4cff1f3
--- /dev/null
+++ b/upstream/clipper-6.4.2/Documentation/Docs/Units/ClipperLib/Classes/PolyNode/Properties/ChildCount.htm
@@ -0,0 +1,74 @@
+<html>
+
+<head>
+
+ <script type="text/javascript" src="../../../../../../Scripts/jquery.js">
+ </script>
+
+ <script type="text/javascript" src="../../../../../../Scripts/SyntaxHighlighter/scripts/shCore.js">
+ </script>
+
+ <script type="text/javascript" src="../../../../../../Scripts/SyntaxHighlighter/scripts/shBrushDelphi.js">
+ </script>
+
+ <script type="text/javascript" src="../../../../../../Scripts/SyntaxHighlighter/scripts/shBrushCpp.js">
+ </script>
+
+ <script type="text/javascript" src="../../../../../../Scripts/SyntaxHighlighter/scripts/shBrushCSharp.js">
+ </script>
+
+ <link type="text/css" rel="stylesheet" href="../../../../../../Scripts/SyntaxHighlighter/styles/shCoreDefault.css">
+
+ <link type="text/css" rel="stylesheet" href="../../../../../../Scripts/SyntaxHighlighter/styles/shThemeDefault.css">
+
+
+ <title>ChildCount</title>
+
+ <link rel="stylesheet" href="../../../../../../Styles/default.css" type="text/css">
+
+
+ <script type="text/javascript" src="../../../../../../Scripts/bootstrap.js">
+ </script>
+
+</head>
+
+<body bgcolor="#FFFFFF">
+
+ <!-- THIS FILE HAS BEEN AUTOMATICALLY PROCESSED FROM A SOURCE COPY -->
+
+ <!-- DO NOT EDIT MANUALLY !!! -->
+
+ <table class="Banner" cellspacing="0" cellpadding="0" border="1" bordercolorlight="#303080" bordercolordark="#7070B0">
+ <tr>
+ <td class="Banner" nowrap=""><a href="../../../../../_Body.htm" class="Banner"><img src="../../../../../../Images/_Home.gif" align="absmiddle">Home</a>
+ </td>
+ <td class="Banner" nowrap=""><a href="../../../_Body.htm" class="Banner"><img src="../../../../../../Images/_Unit.gif" align="absmiddle">ClipperLib</a>
+ </td>
+ <td class="Banner" nowrap=""><a href="../_Body.htm" class="Banner"><img src="../../../../../../Images/_Class.gif" align="absmiddle">PolyNode</a>
+ </td>
+ <td class="Banner" width="100%" align="right"><img src="../../../../../../Images/_Project_Logo.gif" align="absmiddle">
+ </td>
+ </tr>
+ </table>
+ <h1>PolyNode.ChildCount</h1>
+
+
+ <p class="Decl"><span class="Comment">Del.&raquo;</span> <b>property</b> ChildCount: Integer; <span class="Comment">//read only</span></p>
+
+ <p class="Decl2"><span class="Comment"> C++&nbsp;&raquo;</span> ChildCount(); <span class="Comment">//read only</span></p>
+
+ <p class="Decl3"><span class="Comment"> C#&nbsp;&nbsp;&raquo;</span> <span class="CSharp"><b>public int</b></span> ChildCount; <span class="Comment">//read only</span></p>
+
+<br>
+
+ <p class="Body"> Returns the number of PolyNode <a href="./Childs.htm">Childs</a> directly owned by the PolyNode object. </p>
+
+
+ <h2 id="Auto-SeeAlso">See Also</h2>
+ <p class="Body"><a href="Childs.htm">Childs</a></p>
+
+ <p class="Copyright" id="auto"> <br><br> Copyright &copy;2010-2014 Angus Johnson&nbsp; - &nbsp; Clipper 6.2.1 &nbsp; - &nbsp; Help file built on 1-November-2014 <br><br> </p>
+
+</body>
+
+</html> \ No newline at end of file
diff --git a/upstream/clipper-6.4.2/Documentation/Docs/Units/ClipperLib/Classes/PolyNode/Properties/Childs.htm b/upstream/clipper-6.4.2/Documentation/Docs/Units/ClipperLib/Classes/PolyNode/Properties/Childs.htm
new file mode 100644
index 0000000..92e68c4
--- /dev/null
+++ b/upstream/clipper-6.4.2/Documentation/Docs/Units/ClipperLib/Classes/PolyNode/Properties/Childs.htm
@@ -0,0 +1,75 @@
+<html>
+
+<head>
+
+ <script type="text/javascript" src="../../../../../../Scripts/jquery.js">
+ </script>
+
+ <script type="text/javascript" src="../../../../../../Scripts/SyntaxHighlighter/scripts/shCore.js">
+ </script>
+
+ <script type="text/javascript" src="../../../../../../Scripts/SyntaxHighlighter/scripts/shBrushDelphi.js">
+ </script>
+
+ <script type="text/javascript" src="../../../../../../Scripts/SyntaxHighlighter/scripts/shBrushCpp.js">
+ </script>
+
+ <script type="text/javascript" src="../../../../../../Scripts/SyntaxHighlighter/scripts/shBrushCSharp.js">
+ </script>
+
+ <link type="text/css" rel="stylesheet" href="../../../../../../Scripts/SyntaxHighlighter/styles/shCoreDefault.css">
+
+ <link type="text/css" rel="stylesheet" href="../../../../../../Scripts/SyntaxHighlighter/styles/shThemeDefault.css">
+
+
+ <title>Childs</title>
+
+ <link rel="stylesheet" href="../../../../../../Styles/default.css" type="text/css">
+
+
+ <script type="text/javascript" src="../../../../../../Scripts/bootstrap.js">
+ </script>
+
+</head>
+
+<body bgcolor="#FFFFFF">
+
+ <!-- THIS FILE HAS BEEN AUTOMATICALLY PROCESSED FROM A SOURCE COPY -->
+
+ <!-- DO NOT EDIT MANUALLY !!! -->
+
+ <table class="Banner" cellspacing="0" cellpadding="0" border="1" bordercolorlight="#303080" bordercolordark="#7070B0">
+ <tr>
+ <td class="Banner" nowrap=""><a href="../../../../../_Body.htm" class="Banner"><img src="../../../../../../Images/_Home.gif" align="absmiddle">Home</a>
+ </td>
+ <td class="Banner" nowrap=""><a href="../../../_Body.htm" class="Banner"><img src="../../../../../../Images/_Unit.gif" align="absmiddle">ClipperLib</a>
+ </td>
+ <td class="Banner" nowrap=""><a href="../_Body.htm" class="Banner"><img src="../../../../../../Images/_Class.gif" align="absmiddle">PolyNode</a>
+ </td>
+ <td class="Banner" width="100%" align="right"><img src="../../../../../../Images/_Project_Logo.gif" align="absmiddle">
+ </td>
+ </tr>
+ </table>
+ <h1>PolyNode.Childs</h1>
+
+
+ <p class="Decl"><span class="Comment"> Del.&raquo; </span><b>property</b> Childs[index: Integer]: TPolyNode; <span class="Comment">//read only</span></p>
+
+ <p class="Decl2"><span class="Comment"> C++&nbsp;&raquo;</span> std<b>::</b>vector &lt; PolyNode* &gt; Childs;<span class="Comment">//public field</span></p>
+
+ <p class="Decl3"><span class="Comment"> C#&nbsp;&nbsp;&raquo;</span> <b>public <span class="CSharp"> List </span>&lt; <span class="CSharp">PolyNode</span> &gt;</b> Childs; <span class="Comment">//read only property</span></p>
+
+
+ <p class="Body"> A read-only list of PolyNode.<br> Outer PolyNode childs contain hole PolyNodes, and hole PolyNode childs contain nested outer PolyNodes. </p>
+
+
+
+
+ <h2 id="Auto-SeeAlso">See Also</h2>
+ <p class="Body"><a href="ChildCount.htm">ChildCount</a></p>
+
+ <p class="Copyright" id="auto"> <br><br> Copyright &copy;2010-2014 Angus Johnson&nbsp; - &nbsp; Clipper 6.2.1 &nbsp; - &nbsp; Help file built on 1-November-2014 <br><br> </p>
+
+</body>
+
+</html> \ No newline at end of file
diff --git a/upstream/clipper-6.4.2/Documentation/Docs/Units/ClipperLib/Classes/PolyNode/Properties/Contour.htm b/upstream/clipper-6.4.2/Documentation/Docs/Units/ClipperLib/Classes/PolyNode/Properties/Contour.htm
new file mode 100644
index 0000000..cd4c161
--- /dev/null
+++ b/upstream/clipper-6.4.2/Documentation/Docs/Units/ClipperLib/Classes/PolyNode/Properties/Contour.htm
@@ -0,0 +1,69 @@
+<html>
+
+<head>
+
+ <script type="text/javascript" src="../../../../../../Scripts/jquery.js">
+ </script>
+
+ <script type="text/javascript" src="../../../../../../Scripts/SyntaxHighlighter/scripts/shCore.js">
+ </script>
+
+ <script type="text/javascript" src="../../../../../../Scripts/SyntaxHighlighter/scripts/shBrushDelphi.js">
+ </script>
+
+ <script type="text/javascript" src="../../../../../../Scripts/SyntaxHighlighter/scripts/shBrushCpp.js">
+ </script>
+
+ <script type="text/javascript" src="../../../../../../Scripts/SyntaxHighlighter/scripts/shBrushCSharp.js">
+ </script>
+
+ <link type="text/css" rel="stylesheet" href="../../../../../../Scripts/SyntaxHighlighter/styles/shCoreDefault.css">
+
+ <link type="text/css" rel="stylesheet" href="../../../../../../Scripts/SyntaxHighlighter/styles/shThemeDefault.css">
+
+
+ <title>Contour</title>
+
+ <link rel="stylesheet" href="../../../../../../Styles/default.css" type="text/css">
+
+
+ <script type="text/javascript" src="../../../../../../Scripts/bootstrap.js">
+ </script>
+
+</head>
+
+<body bgcolor="#FFFFFF">
+
+ <!-- THIS FILE HAS BEEN AUTOMATICALLY PROCESSED FROM A SOURCE COPY -->
+
+ <!-- DO NOT EDIT MANUALLY !!! -->
+
+ <table class="Banner" cellspacing="0" cellpadding="0" border="1" bordercolorlight="#303080" bordercolordark="#7070B0">
+ <tr>
+ <td class="Banner" nowrap=""><a href="../../../../../_Body.htm" class="Banner"><img src="../../../../../../Images/_Home.gif" align="absmiddle">Home</a>
+ </td>
+ <td class="Banner" nowrap=""><a href="../../../_Body.htm" class="Banner"><img src="../../../../../../Images/_Unit.gif" align="absmiddle">ClipperLib</a>
+ </td>
+ <td class="Banner" nowrap=""><a href="../_Body.htm" class="Banner"><img src="../../../../../../Images/_Class.gif" align="absmiddle">PolyNode</a>
+ </td>
+ <td class="Banner" width="100%" align="right"><img src="../../../../../../Images/_Project_Logo.gif" align="absmiddle">
+ </td>
+ </tr>
+ </table>
+ <h1>PolyNode.Contour</h1>
+
+ <p class="Decl"><span class="Comment">Del.&raquo;</span> <b>property</b> Contour: TPath; <span class="Comment">//read only</span></p>
+
+ <p class="Decl2"><span class="Comment"> C++&nbsp;&raquo;</span> Path Contour; <span class="Comment">//public field</span></p>
+
+ <p class="Decl3"><span class="Comment"> C#&nbsp;&nbsp;&raquo;</span> <b>public <span class="CSharp">Path</span></b> Contour; <span class="Comment">//read only property</span></p>
+
+
+ <p class="Body"> Returns a path list which contains any number of vertices.<br><br> </p>
+
+
+ <p class="Copyright" id="auto"> <br><br> Copyright &copy;2010-2014 Angus Johnson&nbsp; - &nbsp; Clipper 6.2.1 &nbsp; - &nbsp; Help file built on 1-November-2014 <br><br> </p>
+
+</body>
+
+</html> \ No newline at end of file
diff --git a/upstream/clipper-6.4.2/Documentation/Docs/Units/ClipperLib/Classes/PolyNode/Properties/IsHole.htm b/upstream/clipper-6.4.2/Documentation/Docs/Units/ClipperLib/Classes/PolyNode/Properties/IsHole.htm
new file mode 100644
index 0000000..fb1375d
--- /dev/null
+++ b/upstream/clipper-6.4.2/Documentation/Docs/Units/ClipperLib/Classes/PolyNode/Properties/IsHole.htm
@@ -0,0 +1,72 @@
+<html>
+
+<head>
+
+ <script type="text/javascript" src="../../../../../../Scripts/jquery.js">
+ </script>
+
+ <script type="text/javascript" src="../../../../../../Scripts/SyntaxHighlighter/scripts/shCore.js">
+ </script>
+
+ <script type="text/javascript" src="../../../../../../Scripts/SyntaxHighlighter/scripts/shBrushDelphi.js">
+ </script>
+
+ <script type="text/javascript" src="../../../../../../Scripts/SyntaxHighlighter/scripts/shBrushCpp.js">
+ </script>
+
+ <script type="text/javascript" src="../../../../../../Scripts/SyntaxHighlighter/scripts/shBrushCSharp.js">
+ </script>
+
+ <link type="text/css" rel="stylesheet" href="../../../../../../Scripts/SyntaxHighlighter/styles/shCoreDefault.css">
+
+ <link type="text/css" rel="stylesheet" href="../../../../../../Scripts/SyntaxHighlighter/styles/shThemeDefault.css">
+
+
+ <title>IsHole</title>
+
+ <link rel="stylesheet" href="../../../../../../Styles/default.css" type="text/css">
+
+
+ <script type="text/javascript" src="../../../../../../Scripts/bootstrap.js">
+ </script>
+
+</head>
+
+<body bgcolor="#FFFFFF">
+
+ <!-- THIS FILE HAS BEEN AUTOMATICALLY PROCESSED FROM A SOURCE COPY -->
+
+ <!-- DO NOT EDIT MANUALLY !!! -->
+
+ <table class="Banner" cellspacing="0" cellpadding="0" border="1" bordercolorlight="#303080" bordercolordark="#7070B0">
+ <tr>
+ <td class="Banner" nowrap=""><a href="../../../../../_Body.htm" class="Banner"><img src="../../../../../../Images/_Home.gif" align="absmiddle">Home</a>
+ </td>
+ <td class="Banner" nowrap=""><a href="../../../_Body.htm" class="Banner"><img src="../../../../../../Images/_Unit.gif" align="absmiddle">ClipperLib</a>
+ </td>
+ <td class="Banner" nowrap=""><a href="../_Body.htm" class="Banner"><img src="../../../../../../Images/_Class.gif" align="absmiddle">PolyNode</a>
+ </td>
+ <td class="Banner" width="100%" align="right"><img src="../../../../../../Images/_Project_Logo.gif" align="absmiddle">
+ </td>
+ </tr>
+ </table>
+ <h1>PolyNode.IsHole</h1>
+
+
+ <p class="Decl"><span class="Comment">Del.&raquo;</span> IsHole: Boolean; <span class="Comment">//read only</span></p>
+
+ <p class="Decl2"><span class="Comment"> C++&nbsp;&raquo;</span> bool IsHole; <span class="Comment">//field</span></p>
+
+ <p class="Decl3"><span class="Comment"> C#&nbsp;&nbsp;&raquo;</span> <b>public <span class="CSharp">bool</span></b> IsHole; <span class="Comment">//read only property</span></p>
+
+
+ <p class="Body"> Returns true when the PolyNode's polygon (<a href="./Contour.htm">Contour</a>) is a <a href="../../../../../Overview/_Body.htm#terminology">hole</a>.<br><br> Children of <em>outer</em> polygons are always <em>holes</em>, and children of <em>holes</em> are always (nested) <em>outer</em> polygons.<br> The IsHole property of a <a href="../../PolyTree/_Body.htm">PolyTree</a> object is undefined but its children are always top-level <em>outer</em> polygons. </p>
+
+ <h2 id="Auto-SeeAlso">See Also</h2>
+ <p class="Body"><a href="../../../../../Overview/_Body.htm">Overview</a>, <a href="Contour.htm">Contour</a>, <a href="../../PolyTree/_Body.htm">PolyTree</a></p>
+
+ <p class="Copyright" id="auto"> <br><br> Copyright &copy;2010-2014 Angus Johnson&nbsp; - &nbsp; Clipper 6.2.1 &nbsp; - &nbsp; Help file built on 1-November-2014 <br><br> </p>
+
+</body>
+
+</html> \ No newline at end of file
diff --git a/upstream/clipper-6.4.2/Documentation/Docs/Units/ClipperLib/Classes/PolyNode/Properties/IsOpen.htm b/upstream/clipper-6.4.2/Documentation/Docs/Units/ClipperLib/Classes/PolyNode/Properties/IsOpen.htm
new file mode 100644
index 0000000..be9886d
--- /dev/null
+++ b/upstream/clipper-6.4.2/Documentation/Docs/Units/ClipperLib/Classes/PolyNode/Properties/IsOpen.htm
@@ -0,0 +1,72 @@
+<html>
+
+<head>
+
+ <script type="text/javascript" src="../../../../../../Scripts/jquery.js">
+ </script>
+
+ <script type="text/javascript" src="../../../../../../Scripts/SyntaxHighlighter/scripts/shCore.js">
+ </script>
+
+ <script type="text/javascript" src="../../../../../../Scripts/SyntaxHighlighter/scripts/shBrushDelphi.js">
+ </script>
+
+ <script type="text/javascript" src="../../../../../../Scripts/SyntaxHighlighter/scripts/shBrushCpp.js">
+ </script>
+
+ <script type="text/javascript" src="../../../../../../Scripts/SyntaxHighlighter/scripts/shBrushCSharp.js">
+ </script>
+
+ <link type="text/css" rel="stylesheet" href="../../../../../../Scripts/SyntaxHighlighter/styles/shCoreDefault.css">
+
+ <link type="text/css" rel="stylesheet" href="../../../../../../Scripts/SyntaxHighlighter/styles/shThemeDefault.css">
+
+
+ <title>IsOpen</title>
+
+ <link rel="stylesheet" href="../../../../../../Styles/default.css" type="text/css">
+
+
+ <script type="text/javascript" src="../../../../../../Scripts/bootstrap.js">
+ </script>
+
+</head>
+
+<body bgcolor="#FFFFFF">
+
+ <!-- THIS FILE HAS BEEN AUTOMATICALLY PROCESSED FROM A SOURCE COPY -->
+
+ <!-- DO NOT EDIT MANUALLY !!! -->
+
+ <table class="Banner" cellspacing="0" cellpadding="0" border="1" bordercolorlight="#303080" bordercolordark="#7070B0">
+ <tr>
+ <td class="Banner" nowrap=""><a href="../../../../../_Body.htm" class="Banner"><img src="../../../../../../Images/_Home.gif" align="absmiddle">Home</a>
+ </td>
+ <td class="Banner" nowrap=""><a href="../../../_Body.htm" class="Banner"><img src="../../../../../../Images/_Unit.gif" align="absmiddle">ClipperLib</a>
+ </td>
+ <td class="Banner" nowrap=""><a href="../_Body.htm" class="Banner"><img src="../../../../../../Images/_Class.gif" align="absmiddle">PolyNode</a>
+ </td>
+ <td class="Banner" width="100%" align="right"><img src="../../../../../../Images/_Project_Logo.gif" align="absmiddle">
+ </td>
+ </tr>
+ </table>
+ <h1>PolyNode.IsOpen</h1>
+
+
+ <p class="Decl"><span class="Comment">Del.&raquo;</span> IsOpen: Boolean; <span class="Comment">//read only</span></p>
+
+ <p class="Decl2"><span class="Comment"> C++&nbsp;&raquo;</span> bool IsOpen; <span class="Comment">//field</span></p>
+
+ <p class="Decl3"><span class="Comment"> C#&nbsp;&nbsp;&raquo;</span> <b>public <span class="CSharp">bool</span></b> IsOpen; <span class="Comment">//read only property</span></p>
+
+
+ <p class="Body"> Returns true when the PolyNode's <a href="./Contour.htm">Contour</a> results from a clipping operation on an open contour (path). Only top-level PolyNodes can contain open contours.<br><br> </p>
+
+ <h2 id="Auto-SeeAlso">See Also</h2>
+ <p class="Body"><a href="Contour.htm">Contour</a></p>
+
+ <p class="Copyright" id="auto"> <br><br> Copyright &copy;2010-2014 Angus Johnson&nbsp; - &nbsp; Clipper 6.2.1 &nbsp; - &nbsp; Help file built on 1-November-2014 <br><br> </p>
+
+</body>
+
+</html> \ No newline at end of file
diff --git a/upstream/clipper-6.4.2/Documentation/Docs/Units/ClipperLib/Classes/PolyNode/Properties/Parent.htm b/upstream/clipper-6.4.2/Documentation/Docs/Units/ClipperLib/Classes/PolyNode/Properties/Parent.htm
new file mode 100644
index 0000000..ae17bf5
--- /dev/null
+++ b/upstream/clipper-6.4.2/Documentation/Docs/Units/ClipperLib/Classes/PolyNode/Properties/Parent.htm
@@ -0,0 +1,69 @@
+<html>
+
+<head>
+
+ <script type="text/javascript" src="../../../../../../Scripts/jquery.js">
+ </script>
+
+ <script type="text/javascript" src="../../../../../../Scripts/SyntaxHighlighter/scripts/shCore.js">
+ </script>
+
+ <script type="text/javascript" src="../../../../../../Scripts/SyntaxHighlighter/scripts/shBrushDelphi.js">
+ </script>
+
+ <script type="text/javascript" src="../../../../../../Scripts/SyntaxHighlighter/scripts/shBrushCpp.js">
+ </script>
+
+ <script type="text/javascript" src="../../../../../../Scripts/SyntaxHighlighter/scripts/shBrushCSharp.js">
+ </script>
+
+ <link type="text/css" rel="stylesheet" href="../../../../../../Scripts/SyntaxHighlighter/styles/shCoreDefault.css">
+
+ <link type="text/css" rel="stylesheet" href="../../../../../../Scripts/SyntaxHighlighter/styles/shThemeDefault.css">
+
+
+ <title>Parent</title>
+
+ <link rel="stylesheet" href="../../../../../../Styles/default.css" type="text/css">
+
+
+ <script type="text/javascript" src="../../../../../../Scripts/bootstrap.js">
+ </script>
+
+</head>
+
+<body bgcolor="#FFFFFF">
+
+ <!-- THIS FILE HAS BEEN AUTOMATICALLY PROCESSED FROM A SOURCE COPY -->
+
+ <!-- DO NOT EDIT MANUALLY !!! -->
+
+ <table class="Banner" cellspacing="0" cellpadding="0" border="1" bordercolorlight="#303080" bordercolordark="#7070B0">
+ <tr>
+ <td class="Banner" nowrap=""><a href="../../../../../_Body.htm" class="Banner"><img src="../../../../../../Images/_Home.gif" align="absmiddle">Home</a>
+ </td>
+ <td class="Banner" nowrap=""><a href="../../../_Body.htm" class="Banner"><img src="../../../../../../Images/_Unit.gif" align="absmiddle">ClipperLib</a>
+ </td>
+ <td class="Banner" nowrap=""><a href="../_Body.htm" class="Banner"><img src="../../../../../../Images/_Class.gif" align="absmiddle">PolyNode</a>
+ </td>
+ <td class="Banner" width="100%" align="right"><img src="../../../../../../Images/_Project_Logo.gif" align="absmiddle">
+ </td>
+ </tr>
+ </table>
+ <h1>PolyNode.Parent</h1>
+
+ <p class="Decl"><span class="Comment">Del.&raquo;</span> Parent: TPolyNode; <span class="Comment">//read only</span></p>
+
+ <p class="Decl2"><span class="Comment"> C++&nbsp;&raquo;</span> PolyNode* Parent; <span class="Comment">//field</span></p>
+
+ <p class="Decl3"><span class="Comment"> C#&nbsp;&nbsp;&raquo;</span> <b>public <span class="CSharp">PolyNode</span></b> Parent; <span class="Comment">//read only property</span></p>
+
+
+ <p class="Body"> Returns the parent PolyNode.<br><br> The PolyTree object (which is also a PolyNode) does not have a parent and will return a null pointer. </p>
+
+
+ <p class="Copyright" id="auto"> <br><br> Copyright &copy;2010-2014 Angus Johnson&nbsp; - &nbsp; Clipper 6.2.1 &nbsp; - &nbsp; Help file built on 1-November-2014 <br><br> </p>
+
+</body>
+
+</html> \ No newline at end of file
diff --git a/upstream/clipper-6.4.2/Documentation/Docs/Units/ClipperLib/Classes/PolyNode/_Body.htm b/upstream/clipper-6.4.2/Documentation/Docs/Units/ClipperLib/Classes/PolyNode/_Body.htm
new file mode 100644
index 0000000..9f6eb0f
--- /dev/null
+++ b/upstream/clipper-6.4.2/Documentation/Docs/Units/ClipperLib/Classes/PolyNode/_Body.htm
@@ -0,0 +1,125 @@
+<html>
+
+<head>
+
+ <script type="text/javascript" src="../../../../../Scripts/jquery.js">
+ </script>
+
+ <script type="text/javascript" src="../../../../../Scripts/SyntaxHighlighter/scripts/shCore.js">
+ </script>
+
+ <script type="text/javascript" src="../../../../../Scripts/SyntaxHighlighter/scripts/shBrushDelphi.js">
+ </script>
+
+ <script type="text/javascript" src="../../../../../Scripts/SyntaxHighlighter/scripts/shBrushCpp.js">
+ </script>
+
+ <script type="text/javascript" src="../../../../../Scripts/SyntaxHighlighter/scripts/shBrushCSharp.js">
+ </script>
+
+ <link type="text/css" rel="stylesheet" href="../../../../../Scripts/SyntaxHighlighter/styles/shCoreDefault.css">
+
+ <link type="text/css" rel="stylesheet" href="../../../../../Scripts/SyntaxHighlighter/styles/shThemeDefault.css">
+
+
+ <title>PolyNode</title>
+
+ <link rel="stylesheet" href="../../../../../Styles/default.css" type="text/css">
+
+ <meta name="Ancestor" content="">
+
+
+ <script type="text/javascript" src="../../../../../Scripts/bootstrap.js">
+ </script>
+
+</head>
+
+<body bgcolor="#FFFFFF">
+
+ <!-- THIS FILE HAS BEEN AUTOMATICALLY PROCESSED FROM A SOURCE COPY -->
+
+ <!-- DO NOT EDIT MANUALLY !!! -->
+
+ <table class="Banner" cellspacing="0" cellpadding="0" border="1" bordercolorlight="#303080" bordercolordark="#7070B0">
+ <tr>
+ <td class="Banner" nowrap=""><a href="../../../../_Body.htm" class="Banner"><img src="../../../../../Images/_Home.gif" align="absmiddle">Home</a>
+ </td>
+ <td class="Banner" nowrap=""><a href="../../_Body.htm" class="Banner"><img src="../../../../../Images/_Unit.gif" align="absmiddle">ClipperLib</a>
+ </td>
+ <td class="Banner" width="100%" align="right"><img src="../../../../../Images/_Project_Logo.gif" align="absmiddle">
+ </td>
+ </tr>
+ </table>
+ <h1>PolyNode</h1>
+<br>
+
+ <p class="Body"> <b>PolyNodes</b> are encapsulated within a <a href="../PolyTree/_Body.htm"><b>PolyTree</b></a> container, and together provide a data structure representing the parent-child relationships of polygon contours returned by Clipper's <a href="../Clipper/Methods/Execute.htm"><b>Execute</b></a> method.<br><br> A <b>PolyNode</b> object represents a single polygon. Its <a href="./Properties/IsHole.htm">IsHole</a> property indicates whether it's an <a href="../../../../Overview/_Body.htm#terminology">outer</a> or a <a href="../../../../Overview/_Body.htm#terminology">hole</a>. PolyNodes may own any number of PolyNode children (<a href="./Properties/Childs.htm"><b>Childs</b></a>), where children of outer polygons are holes, and children of holes are (nested) outer polygons.<br><br> </p>
+
+ <h2 id="Auto-Reference">Reference</h2>
+ <table>
+ <tr><th>Fields
+ </th><th>Methods
+ </th><th>Properties
+ </th>
+ </tr>
+ <tr>
+ <td colspan="2" class="White">In PolyNode:
+ </td>
+ </tr>
+ <tr>
+ <td>
+ </td>
+ <td><a href="Methods/GetNext.htm">GetNext</a>
+ </td>
+ <td><a href="Properties/ChildCount.htm">ChildCount</a>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ </td>
+ <td>
+ </td>
+ <td><a href="Properties/Childs.htm">Childs</a>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ </td>
+ <td>
+ </td>
+ <td><a href="Properties/Contour.htm">Contour</a>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ </td>
+ <td>
+ </td>
+ <td><a href="Properties/IsHole.htm">IsHole</a>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ </td>
+ <td>
+ </td>
+ <td><a href="Properties/IsOpen.htm">IsOpen</a>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ </td>
+ <td>
+ </td>
+ <td><a href="Properties/Parent.htm">Parent</a>
+ </td>
+ </tr>
+ </table>
+ <h2 id="Auto-SeeAlso">See Also</h2>
+ <p class="Body"><a href="../../../../Overview/_Body.htm">Overview</a>, <a href="../Clipper/Methods/Execute.htm">Clipper.Execute</a>, <a href="../PolyTree/_Body.htm">PolyTree</a></p>
+
+ <p class="Copyright" id="auto"> <br><br> Copyright &copy;2010-2014 Angus Johnson&nbsp; - &nbsp; Clipper 6.2.1 &nbsp; - &nbsp; Help file built on 1-November-2014 <br><br> </p>
+
+</body>
+
+</html> \ No newline at end of file
diff --git a/upstream/clipper-6.4.2/Documentation/Docs/Units/ClipperLib/Classes/PolyTree/Methods/Clear.htm b/upstream/clipper-6.4.2/Documentation/Docs/Units/ClipperLib/Classes/PolyTree/Methods/Clear.htm
new file mode 100644
index 0000000..d30fb15
--- /dev/null
+++ b/upstream/clipper-6.4.2/Documentation/Docs/Units/ClipperLib/Classes/PolyTree/Methods/Clear.htm
@@ -0,0 +1,73 @@
+<html>
+
+<head>
+
+ <script type="text/javascript" src="../../../../../../Scripts/jquery.js">
+ </script>
+
+ <script type="text/javascript" src="../../../../../../Scripts/SyntaxHighlighter/scripts/shCore.js">
+ </script>
+
+ <script type="text/javascript" src="../../../../../../Scripts/SyntaxHighlighter/scripts/shBrushDelphi.js">
+ </script>
+
+ <script type="text/javascript" src="../../../../../../Scripts/SyntaxHighlighter/scripts/shBrushCpp.js">
+ </script>
+
+ <script type="text/javascript" src="../../../../../../Scripts/SyntaxHighlighter/scripts/shBrushCSharp.js">
+ </script>
+
+ <link type="text/css" rel="stylesheet" href="../../../../../../Scripts/SyntaxHighlighter/styles/shCoreDefault.css">
+
+ <link type="text/css" rel="stylesheet" href="../../../../../../Scripts/SyntaxHighlighter/styles/shThemeDefault.css">
+
+
+ <title>Clear</title>
+
+ <link rel="stylesheet" href="../../../../../../Styles/default.css" type="text/css">
+
+
+ <script type="text/javascript" src="../../../../../../Scripts/bootstrap.js">
+ </script>
+
+</head>
+
+<body bgcolor="#FFFFFF">
+
+ <!-- THIS FILE HAS BEEN AUTOMATICALLY PROCESSED FROM A SOURCE COPY -->
+
+ <!-- DO NOT EDIT MANUALLY !!! -->
+
+ <table class="Banner" cellspacing="0" cellpadding="0" border="1" bordercolorlight="#303080" bordercolordark="#7070B0">
+ <tr>
+ <td class="Banner" nowrap=""><a href="../../../../../_Body.htm" class="Banner"><img src="../../../../../../Images/_Home.gif" align="absmiddle">Home</a>
+ </td>
+ <td class="Banner" nowrap=""><a href="../../../_Body.htm" class="Banner"><img src="../../../../../../Images/_Unit.gif" align="absmiddle">ClipperLib</a>
+ </td>
+ <td class="Banner" nowrap=""><a href="../_Body.htm" class="Banner"><img src="../../../../../../Images/_Class.gif" align="absmiddle">PolyTree</a>
+ </td>
+ <td class="Banner" width="100%" align="right"><img src="../../../../../../Images/_Project_Logo.gif" align="absmiddle">
+ </td>
+ </tr>
+ </table>
+ <h1>PolyTree.Clear</h1>
+
+
+ <p class="Decl"><span class="Comment"> Del.&raquo; </span><b>procedure</b> Clear;</p>
+
+ <p class="Decl2"><span class="Comment"> C++&nbsp;&raquo;</span> <b>void</b> Clear();</p>
+
+ <p class="Decl3"><span class="Comment"> C#&nbsp;&nbsp;&raquo;</span> <b>public void</b> Clear();</p>
+<br>
+
+
+ <p class="Body"> This method clears any PolyNode children contained by PolyTree the object.<br><br> <b>Clear</b> does <em>not</em> need to be called explicitly. The <a href="../../Clipper/Methods/Execute.htm">Clipper.Execute</a> method that accepts a PolyTree parameter will <em>automatically</em> clear the PolyTree object before propagating it with new PolyNodes. Likewise, PolyTree's destructor will also automatically clear any contained PolyNodes. </p>
+
+ <h2 id="Auto-SeeAlso">See Also</h2>
+ <p class="Body"><a href="../../Clipper/Methods/Execute.htm">Clipper.Execute</a></p>
+
+ <p class="Copyright" id="auto"> <br><br> Copyright &copy;2010-2014 Angus Johnson&nbsp; - &nbsp; Clipper 6.2.1 &nbsp; - &nbsp; Help file built on 1-November-2014 <br><br> </p>
+
+</body>
+
+</html> \ No newline at end of file
diff --git a/upstream/clipper-6.4.2/Documentation/Docs/Units/ClipperLib/Classes/PolyTree/Methods/GetFirst.htm b/upstream/clipper-6.4.2/Documentation/Docs/Units/ClipperLib/Classes/PolyTree/Methods/GetFirst.htm
new file mode 100644
index 0000000..27011d4
--- /dev/null
+++ b/upstream/clipper-6.4.2/Documentation/Docs/Units/ClipperLib/Classes/PolyTree/Methods/GetFirst.htm
@@ -0,0 +1,77 @@
+<html>
+
+<head>
+
+ <script type="text/javascript" src="../../../../../../Scripts/jquery.js">
+ </script>
+
+ <script type="text/javascript" src="../../../../../../Scripts/SyntaxHighlighter/scripts/shCore.js">
+ </script>
+
+ <script type="text/javascript" src="../../../../../../Scripts/SyntaxHighlighter/scripts/shBrushDelphi.js">
+ </script>
+
+ <script type="text/javascript" src="../../../../../../Scripts/SyntaxHighlighter/scripts/shBrushCpp.js">
+ </script>
+
+ <script type="text/javascript" src="../../../../../../Scripts/SyntaxHighlighter/scripts/shBrushCSharp.js">
+ </script>
+
+ <link type="text/css" rel="stylesheet" href="../../../../../../Scripts/SyntaxHighlighter/styles/shCoreDefault.css">
+
+ <link type="text/css" rel="stylesheet" href="../../../../../../Scripts/SyntaxHighlighter/styles/shThemeDefault.css">
+
+
+ <title>GetFirst</title>
+
+ <link rel="stylesheet" href="../../../../../../Styles/default.css" type="text/css">
+
+
+ <script type="text/javascript" src="../../../../../../Scripts/bootstrap.js">
+ </script>
+
+</head>
+
+<body bgcolor="#FFFFFF">
+
+ <!-- THIS FILE HAS BEEN AUTOMATICALLY PROCESSED FROM A SOURCE COPY -->
+
+ <!-- DO NOT EDIT MANUALLY !!! -->
+
+ <table class="Banner" cellspacing="0" cellpadding="0" border="1" bordercolorlight="#303080" bordercolordark="#7070B0">
+ <tr>
+ <td class="Banner" nowrap=""><a href="../../../../../_Body.htm" class="Banner"><img src="../../../../../../Images/_Home.gif" align="absmiddle">Home</a>
+ </td>
+ <td class="Banner" nowrap=""><a href="../../../_Body.htm" class="Banner"><img src="../../../../../../Images/_Unit.gif" align="absmiddle">ClipperLib</a>
+ </td>
+ <td class="Banner" nowrap=""><a href="../_Body.htm" class="Banner"><img src="../../../../../../Images/_Class.gif" align="absmiddle">PolyTree</a>
+ </td>
+ <td class="Banner" width="100%" align="right"><img src="../../../../../../Images/_Project_Logo.gif" align="absmiddle">
+ </td>
+ </tr>
+ </table>
+ <h1>PolyTree.GetFirst</h1>
+
+
+ <p class="Decl"><span class="Comment"> Del.&raquo; </span><b>function</b> GetFirst: TPolyNode;</p>
+
+ <p class="Decl2"><span class="Comment"> C++&nbsp;&raquo;</span> PolyNode* GetFirst();</p>
+
+ <p class="Decl3"><span class="Comment"> C#&nbsp;&nbsp;&raquo;</span> <b>public <span class="CSharp">PolyNode</span></b> GetFirst();</p>
+
+
+ <p class="Body"> This method returns the first outer polygon contour if any, otherwise a null pointer.<br><br> This function is almost equivalent to calling Childs[0] except that when a PolyTree object is empty (has no children), calling Childs[0] would raise an out of range exception. </p>
+
+
+
+
+
+
+ <h2 id="Auto-SeeAlso">See Also</h2>
+ <p class="Body"><a href="../../PolyNode/Methods/GetNext.htm">PolyNode.GetNext</a>, <a href="../../PolyNode/Properties/ChildCount.htm">PolyNode.ChildCount</a>, <a href="../../PolyNode/Properties/Childs.htm">PolyNode.Childs</a></p>
+
+ <p class="Copyright" id="auto"> <br><br> Copyright &copy;2010-2014 Angus Johnson&nbsp; - &nbsp; Clipper 6.2.1 &nbsp; - &nbsp; Help file built on 1-November-2014 <br><br> </p>
+
+</body>
+
+</html> \ No newline at end of file
diff --git a/upstream/clipper-6.4.2/Documentation/Docs/Units/ClipperLib/Classes/PolyTree/Properties/Total.htm b/upstream/clipper-6.4.2/Documentation/Docs/Units/ClipperLib/Classes/PolyTree/Properties/Total.htm
new file mode 100644
index 0000000..7a6efe2
--- /dev/null
+++ b/upstream/clipper-6.4.2/Documentation/Docs/Units/ClipperLib/Classes/PolyTree/Properties/Total.htm
@@ -0,0 +1,74 @@
+<html>
+
+<head>
+
+ <script type="text/javascript" src="../../../../../../Scripts/jquery.js">
+ </script>
+
+ <script type="text/javascript" src="../../../../../../Scripts/SyntaxHighlighter/scripts/shCore.js">
+ </script>
+
+ <script type="text/javascript" src="../../../../../../Scripts/SyntaxHighlighter/scripts/shBrushDelphi.js">
+ </script>
+
+ <script type="text/javascript" src="../../../../../../Scripts/SyntaxHighlighter/scripts/shBrushCpp.js">
+ </script>
+
+ <script type="text/javascript" src="../../../../../../Scripts/SyntaxHighlighter/scripts/shBrushCSharp.js">
+ </script>
+
+ <link type="text/css" rel="stylesheet" href="../../../../../../Scripts/SyntaxHighlighter/styles/shCoreDefault.css">
+
+ <link type="text/css" rel="stylesheet" href="../../../../../../Scripts/SyntaxHighlighter/styles/shThemeDefault.css">
+
+
+ <title>Total</title>
+
+ <link rel="stylesheet" href="../../../../../../Styles/default.css" type="text/css">
+
+
+ <script type="text/javascript" src="../../../../../../Scripts/bootstrap.js">
+ </script>
+
+</head>
+
+<body bgcolor="#FFFFFF">
+
+ <!-- THIS FILE HAS BEEN AUTOMATICALLY PROCESSED FROM A SOURCE COPY -->
+
+ <!-- DO NOT EDIT MANUALLY !!! -->
+
+ <table class="Banner" cellspacing="0" cellpadding="0" border="1" bordercolorlight="#303080" bordercolordark="#7070B0">
+ <tr>
+ <td class="Banner" nowrap=""><a href="../../../../../_Body.htm" class="Banner"><img src="../../../../../../Images/_Home.gif" align="absmiddle">Home</a>
+ </td>
+ <td class="Banner" nowrap=""><a href="../../../_Body.htm" class="Banner"><img src="../../../../../../Images/_Unit.gif" align="absmiddle">ClipperLib</a>
+ </td>
+ <td class="Banner" nowrap=""><a href="../_Body.htm" class="Banner"><img src="../../../../../../Images/_Class.gif" align="absmiddle">PolyTree</a>
+ </td>
+ <td class="Banner" width="100%" align="right"><img src="../../../../../../Images/_Project_Logo.gif" align="absmiddle">
+ </td>
+ </tr>
+ </table>
+ <h1>PolyTree.Total</h1>
+
+
+ <p class="Decl"><span class="Comment">Del.&raquo;</span> <b>property</b> Total: Integer; <span class="Comment">//read only</span></p>
+
+ <p class="Decl2"><span class="Comment"> C++&nbsp;&raquo;</span> Total(); <span class="Comment">//read only</span></p>
+
+ <p class="Decl3"><span class="Comment"> C#&nbsp;&nbsp;&raquo;</span> <span class="CSharp"><b>public int</b></span> Total; <span class="Comment">//read only</span></p>
+
+<br>
+
+ <p class="Body"> Returns the total number of PolyNodes (polygons) contained within the PolyTree. This value is not to be confused with <a href="../../PolyNode/Properties/ChildCount.htm">ChildCount</a> which returns the number of immediate children only (<a href="../../PolyNode/Properties/Childs.htm">Childs</a>) contained by PolyTree. </p>
+
+
+ <h2 id="Auto-SeeAlso">See Also</h2>
+ <p class="Body"><a href="../../PolyNode/Properties/ChildCount.htm">PolyNode.ChildCount</a>, <a href="../../PolyNode/Properties/Childs.htm">PolyNode.Childs</a></p>
+
+ <p class="Copyright" id="auto"> <br><br> Copyright &copy;2010-2014 Angus Johnson&nbsp; - &nbsp; Clipper 6.2.1 &nbsp; - &nbsp; Help file built on 1-November-2014 <br><br> </p>
+
+</body>
+
+</html> \ No newline at end of file
diff --git a/upstream/clipper-6.4.2/Documentation/Docs/Units/ClipperLib/Classes/PolyTree/_Body.htm b/upstream/clipper-6.4.2/Documentation/Docs/Units/ClipperLib/Classes/PolyTree/_Body.htm
new file mode 100644
index 0000000..175df23
--- /dev/null
+++ b/upstream/clipper-6.4.2/Documentation/Docs/Units/ClipperLib/Classes/PolyTree/_Body.htm
@@ -0,0 +1,189 @@
+<html>
+
+<head>
+
+ <script type="text/javascript" src="../../../../../Scripts/jquery.js">
+ </script>
+
+ <script type="text/javascript" src="../../../../../Scripts/SyntaxHighlighter/scripts/shCore.js">
+ </script>
+
+ <script type="text/javascript" src="../../../../../Scripts/SyntaxHighlighter/scripts/shBrushDelphi.js">
+ </script>
+
+ <script type="text/javascript" src="../../../../../Scripts/SyntaxHighlighter/scripts/shBrushCpp.js">
+ </script>
+
+ <script type="text/javascript" src="../../../../../Scripts/SyntaxHighlighter/scripts/shBrushCSharp.js">
+ </script>
+
+ <link type="text/css" rel="stylesheet" href="../../../../../Scripts/SyntaxHighlighter/styles/shCoreDefault.css">
+
+ <link type="text/css" rel="stylesheet" href="../../../../../Scripts/SyntaxHighlighter/styles/shThemeDefault.css">
+
+
+ <title>PolyTree</title>
+
+ <link rel="stylesheet" href="../../../../../Styles/default.css" type="text/css">
+
+ <meta name="Ancestor" content="PolyNode">
+
+
+ <script type="text/javascript" src="../../../../../Scripts/bootstrap.js">
+ </script>
+
+</head>
+
+<body bgcolor="#FFFFFF">
+
+ <!-- THIS FILE HAS BEEN AUTOMATICALLY PROCESSED FROM A SOURCE COPY -->
+
+ <!-- DO NOT EDIT MANUALLY !!! -->
+
+ <table class="Banner" cellspacing="0" cellpadding="0" border="1" bordercolorlight="#303080" bordercolordark="#7070B0">
+ <tr>
+ <td class="Banner" nowrap=""><a href="../../../../_Body.htm" class="Banner"><img src="../../../../../Images/_Home.gif" align="absmiddle">Home</a>
+ </td>
+ <td class="Banner" nowrap=""><a href="../../_Body.htm" class="Banner"><img src="../../../../../Images/_Unit.gif" align="absmiddle">ClipperLib</a>
+ </td>
+ <td class="Banner" width="100%" align="right"><img src="../../../../../Images/_Project_Logo.gif" align="absmiddle">
+ </td>
+ </tr>
+ </table>
+ <h1>PolyTree</h1>
+ <h2>Hierarchy</h2>
+ <p class="Hierarchy"></p>
+ <p class="Hierarchy">&nbsp;&nbsp;&nbsp;|</p>
+ <p class="Hierarchy"><a href="../PolyNode/_Body.htm">PolyNode</a></p>
+<br>
+
+ <p class="Body"> <b>PolyTree</b> is intended as a <b>read-only</b> data structure that should only be used to receive <em>solutions</em> from clipping and offsetting operations. It's an alternative to the <a href="../../Types/Paths.htm">Paths</a> data structure which also receives these solutions. PolyTree's two major advantages over the <em>Paths</em> structure are: it properly represents the <b>parent-child relationships</b> of the returned polygons; it differentiates between <b>open</b> and <b>closed</b> paths. However, since PolyTree is a more complex structure than the <em>Paths</em> structure, and since it's more computationally expensive to process (the Execute method being roughly 5-10% slower), <span class="maroon">it should used only be when parent-child polygon relationships are needed, or when open paths are being 'clipped'.</span><br><br> An empty PolyTree object can be passed as the <em>solution</em> parameter in <a href="../Clipper/Methods/Execute.htm"><b>Clipper.Execute</b></a> and in <a href="../ClipperOffset/Methods/Execute.htm"><b>ClipperOffset.Execute</b></a>. Once the clipping or offseting operation is completed, the method returns with the PolyTree structure filled with data representing the solution.<br><br> A <b>PolyTree</b> object is a container for any number of <a href="../PolyNode/_Body.htm"><b>PolyNode</b></a> children, with each contained PolyNode representing a single polygon contour (either an <a href="../../../../Overview/_Body.htm#terminology">outer</a> or <a href="../../../../Overview/_Body.htm#terminology">hole</a> polygon). <span class="maroon">PolyTree itself is a specialized PolyNode whose immediate children represent the top-level <em>outer</em> polygons of the solution. (Its own <a href="../PolyNode/Properties/Contour.htm">Contour</a> property is always empty.)</span> The contained top-level PolyNodes may contain their own PolyNode children representing hole polygons that may also contain children representing nested outer polygons etc. Children of <em>outers</em> will always be <em>holes</em>, and children of <em>holes</em> will always be <em>outers</em>.<br><br> <b>PolyTrees</b> can also contain <b>open</b> paths. Open paths will always be represented by <em>top level</em> PolyNodes. Two functions are provided to quickly separate out <em>open</em> and <em>closed</em> paths from a polytree - <a href="../../Functions/OpenPathsFromPolyTree.htm"><b>OpenPathsFromPolyTree</b></a> and <a href="../../Functions/ClosedPathsFromPolyTree.htm"><b>ClosedPathsFromPolyTree</b></a>. <br><br> <div align="left">
+ <table cellspacing="2" cellpadding="0" border="0">
+
+ <tr>
+
+ <td style="background-color: #FFFFFF;">
+<img src="../../../../../Images/polytree.png" alt="" border="0">
+
+ </td>
+
+ <td style="background-color: #FFFFFF;">
+
+ <pre style="font-family: Verdana, Arial, Helvetica, sans-serif;">
+
+ <b>polytree:</b>
+ Contour = <b>()</b>
+ ChildCount = <b>1</b>
+ Childs[0]:
+ Contour = ((10,10),(100,10),(100,100),(10,100))
+ IsHole = <b>False</b>
+ ChildCount = <b>1</b>
+ Childs[0]:
+ Contour = ((20,20),(20,90),(90,90),(90,20))
+ IsHole = <b>True</b>
+ ChildCount = <b>2</b>
+ Childs[0]:
+ Contour = ((30,30),(50,30),(50,50),(30,50))
+ IsHole = <b>False</b>
+ ChildCount = <b>0</b>
+ Childs[1]:
+ Contour = ((60,60),(80,60),(80,80),(60,80))
+ IsHole = <b>False</b>
+ ChildCount = <b>0</b>
+
+ </pre>
+
+ </td>
+
+ </tr>
+
+ </table> </div> </p>
+
+ <h2 id="Auto-Reference">Reference</h2>
+ <table>
+ <tr><th>Fields
+ </th><th>Methods
+ </th><th>Properties
+ </th>
+ </tr>
+ <tr>
+ <td colspan="2" class="White">In PolyTree:
+ </td>
+ </tr>
+ <tr>
+ <td>
+ </td>
+ <td><a href="Methods/Clear.htm">Clear</a>
+ </td>
+ <td><a href="Properties/Total.htm">Total</a>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ </td>
+ <td><a href="Methods/GetFirst.htm">GetFirst</a>
+ </td>
+ <td>
+ </td>
+ </tr>
+ <tr>
+ <td colspan="2" class="White">In PolyNode:
+ </td>
+ </tr>
+ <tr>
+ <td>
+ </td>
+ <td><a href="../PolyNode/Methods/GetNext.htm">GetNext</a>
+ </td>
+ <td><a href="../PolyNode/Properties/ChildCount.htm">ChildCount</a>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ </td>
+ <td>
+ </td>
+ <td><a href="../PolyNode/Properties/Childs.htm">Childs</a>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ </td>
+ <td>
+ </td>
+ <td><a href="../PolyNode/Properties/Contour.htm">Contour</a>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ </td>
+ <td>
+ </td>
+ <td><a href="../PolyNode/Properties/IsHole.htm">IsHole</a>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ </td>
+ <td>
+ </td>
+ <td><a href="../PolyNode/Properties/IsOpen.htm">IsOpen</a>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ </td>
+ <td>
+ </td>
+ <td><a href="../PolyNode/Properties/Parent.htm">Parent</a>
+ </td>
+ </tr>
+ </table>
+ <h2 id="Auto-SeeAlso">See Also</h2>
+ <p class="Body"><a href="../../../../Overview/_Body.htm">Overview</a>, <a href="../Clipper/Methods/Execute.htm">Clipper.Execute</a>, <a href="../ClipperOffset/Methods/Execute.htm">ClipperOffset.Execute</a>, <a href="../PolyNode/_Body.htm">PolyNode</a>, <a href="../../Functions/ClosedPathsFromPolyTree.htm">ClosedPathsFromPolyTree</a>, <a href="../../Functions/OpenPathsFromPolyTree.htm">OpenPathsFromPolyTree</a>, <a href="../../Types/Paths.htm">Paths</a></p>
+
+ <p class="Copyright" id="auto"> <br><br> Copyright &copy;2010-2014 Angus Johnson&nbsp; - &nbsp; Clipper 6.2.1 &nbsp; - &nbsp; Help file built on 1-November-2014 <br><br> </p>
+
+</body>
+
+</html> \ No newline at end of file
diff --git a/upstream/clipper-6.4.2/Documentation/Docs/Units/ClipperLib/Functions/Area.htm b/upstream/clipper-6.4.2/Documentation/Docs/Units/ClipperLib/Functions/Area.htm
new file mode 100644
index 0000000..be30baf
--- /dev/null
+++ b/upstream/clipper-6.4.2/Documentation/Docs/Units/ClipperLib/Functions/Area.htm
@@ -0,0 +1,72 @@
+<html>
+
+<head>
+
+ <script type="text/javascript" src="../../../../Scripts/jquery.js">
+ </script>
+
+ <script type="text/javascript" src="../../../../Scripts/SyntaxHighlighter/scripts/shCore.js">
+ </script>
+
+ <script type="text/javascript" src="../../../../Scripts/SyntaxHighlighter/scripts/shBrushDelphi.js">
+ </script>
+
+ <script type="text/javascript" src="../../../../Scripts/SyntaxHighlighter/scripts/shBrushCpp.js">
+ </script>
+
+ <script type="text/javascript" src="../../../../Scripts/SyntaxHighlighter/scripts/shBrushCSharp.js">
+ </script>
+
+ <link type="text/css" rel="stylesheet" href="../../../../Scripts/SyntaxHighlighter/styles/shCoreDefault.css">
+
+ <link type="text/css" rel="stylesheet" href="../../../../Scripts/SyntaxHighlighter/styles/shThemeDefault.css">
+
+
+ <title>Area</title>
+
+ <link rel="stylesheet" href="../../../../Styles/default.css" type="text/css">
+
+
+ <script type="text/javascript" src="../../../../Scripts/bootstrap.js">
+ </script>
+
+</head>
+
+<body bgcolor="#FFFFFF">
+
+ <!-- THIS FILE HAS BEEN AUTOMATICALLY PROCESSED FROM A SOURCE COPY -->
+
+ <!-- DO NOT EDIT MANUALLY !!! -->
+
+ <table class="Banner" cellspacing="0" cellpadding="0" border="1" bordercolorlight="#303080" bordercolordark="#7070B0">
+ <tr>
+ <td class="Banner" nowrap=""><a href="../../../_Body.htm" class="Banner"><img src="../../../../Images/_Home.gif" align="absmiddle">Home</a>
+ </td>
+ <td class="Banner" nowrap=""><a href="../_Body.htm" class="Banner"><img src="../../../../Images/_Unit.gif" align="absmiddle">ClipperLib</a>
+ </td>
+ <td class="Banner" width="100%" align="right"><img src="../../../../Images/_Project_Logo.gif" align="absmiddle">
+ </td>
+ </tr>
+ </table>
+ <h1>Area</h1>
+
+
+ <p class="Decl"><span class="Comment">Del.&raquo;</span> <b>function</b> Area(<b>const</b> pts: <a href="../Types/Path.htm">TPath</a>): double;</p>
+
+ <p class="Decl2"><span class="Comment"> C++&nbsp;&raquo;</span> <b>double</b> Area(<b>const</b> <a href="../Types/Path.htm">Path</a> &amp;poly);</p>
+
+ <p class="Decl3"><span class="Comment">C#&nbsp;&nbsp;&raquo;</span> <b>public static double</b> Area(<a href="../Types/Path.htm">Path</a> poly);</p>
+
+
+ <p class="Body">This function returns the area of the supplied polygon. It's assumed that the path is closed and does not self-intersect. Depending on <a href="./Orientation.htm">orientation</a>, this value may be positive or negative. If Orientation is true, then the area will be positive and conversely, if Orientation is false, then the area will be negative.</p>
+<br>
+
+
+ <h2 id="Auto-SeeAlso">See Also</h2>
+ <p class="Body"><a href="Orientation.htm">Orientation</a>, <a href="../Types/Path.htm">Path</a></p>
+
+ <p class="Copyright" id="auto"> <br><br> Copyright &copy;2010-2014 Angus Johnson&nbsp; - &nbsp; Clipper 6.2.1 &nbsp; - &nbsp; Help file built on 1-November-2014 <br><br> </p>
+
+</body>
+
+</html> \ No newline at end of file
diff --git a/upstream/clipper-6.4.2/Documentation/Docs/Units/ClipperLib/Functions/CleanPolygon.htm b/upstream/clipper-6.4.2/Documentation/Docs/Units/ClipperLib/Functions/CleanPolygon.htm
new file mode 100644
index 0000000..5a857fe
--- /dev/null
+++ b/upstream/clipper-6.4.2/Documentation/Docs/Units/ClipperLib/Functions/CleanPolygon.htm
@@ -0,0 +1,88 @@
+<html>
+
+<head>
+
+ <script type="text/javascript" src="../../../../Scripts/jquery.js">
+ </script>
+
+ <script type="text/javascript" src="../../../../Scripts/SyntaxHighlighter/scripts/shCore.js">
+ </script>
+
+ <script type="text/javascript" src="../../../../Scripts/SyntaxHighlighter/scripts/shBrushDelphi.js">
+ </script>
+
+ <script type="text/javascript" src="../../../../Scripts/SyntaxHighlighter/scripts/shBrushCpp.js">
+ </script>
+
+ <script type="text/javascript" src="../../../../Scripts/SyntaxHighlighter/scripts/shBrushCSharp.js">
+ </script>
+
+ <link type="text/css" rel="stylesheet" href="../../../../Scripts/SyntaxHighlighter/styles/shCoreDefault.css">
+
+ <link type="text/css" rel="stylesheet" href="../../../../Scripts/SyntaxHighlighter/styles/shThemeDefault.css">
+
+
+ <title>CleanPolygon</title>
+
+ <link rel="stylesheet" href="../../../../Styles/default.css" type="text/css">
+
+
+ <script type="text/javascript" src="../../../../Scripts/bootstrap.js">
+ </script>
+
+</head>
+
+<body bgcolor="#FFFFFF">
+
+ <!-- THIS FILE HAS BEEN AUTOMATICALLY PROCESSED FROM A SOURCE COPY -->
+
+ <!-- DO NOT EDIT MANUALLY !!! -->
+
+ <table class="Banner" cellspacing="0" cellpadding="0" border="1" bordercolorlight="#303080" bordercolordark="#7070B0">
+ <tr>
+ <td class="Banner" nowrap=""><a href="../../../_Body.htm" class="Banner"><img src="../../../../Images/_Home.gif" align="absmiddle">Home</a>
+ </td>
+ <td class="Banner" nowrap=""><a href="../_Body.htm" class="Banner"><img src="../../../../Images/_Unit.gif" align="absmiddle">ClipperLib</a>
+ </td>
+ <td class="Banner" width="100%" align="right"><img src="../../../../Images/_Project_Logo.gif" align="absmiddle">
+ </td>
+ </tr>
+ </table>
+ <h1>CleanPolygon</h1>
+
+
+ <p class="Decl"><span class="Comment">Del.&raquo;</span> <b>function</b> CleanPolygon(<b>const</b> Poly: TPath; Distance: double = 1.415): TPath;</p>
+
+ <p class="Decl2"><span class="Comment"> C++&nbsp;&raquo;</span> <b>void</b> CleanPolygon(<b>const</b> Path &amp;in_poly, Path &amp;out_poly, double distance = 1.415);</p>
+
+ <p class="Decl2"><span class="Comment"> C++&nbsp;&raquo;</span> <b>void</b> CleanPolygon(Path &amp;poly, double distance = 1.415);</p>
+
+ <p class="Decl3"><span class="Comment">C#&nbsp;&nbsp;&raquo;</span> <b>public static</b> Path CleanPolygon(Path poly, double distance = 1.415);</p>
+<br>
+
+
+ <p class="Body"> Removes vertices:
+ <ul>
+
+ <li>that join co-linear edges, or join edges that are almost co-linear (such that if the vertex was moved no more than the specified distance the edges would be co-linear)</li>
+
+ <li>that are within the specified distance of an adjacent vertex</li>
+
+ <li>that are within the specified distance of a semi-adjacent vertex together with their out-lying vertices</li>
+
+ </ul> </p>
+
+ <p class="Body"> Vertices are <em>semi-adjacent</em> when they are separated by a single (out-lying) vertex.<br><br> The <em>distance</em> parameter's default value is approximately &radic;2 so that a vertex will be removed when adjacent or semi-adjacent vertices having their corresponding X and Y coordinates differing by no more than 1 unit. (If the egdes are semi-adjacent the out-lying vertex will be removed too.)<br><br> C++ only: This function is overloaded. In the first definition, the <em>in_poly</em> and <em>out_poly</em> parameters can reference the same <em>Path</em> object though in that case the calling code might be clearer if the second definition (accepting a single <em>Paths</em> parameter) is used.<br><br> <img src="../../../../Images/clean1.png" alt="" border="0">&nbsp;&nbsp;&nbsp; <img src="../../../../Images/clean2.png" alt="" border="0"> </p>
+
+
+
+
+
+ <h2 id="Auto-SeeAlso">See Also</h2>
+ <p class="Body"><a href="CleanPolygons.htm">CleanPolygons</a>, <a href="SimplifyPolygon.htm">SimplifyPolygon</a>, <a href="../Types/Path.htm">Path</a></p>
+
+ <p class="Copyright" id="auto"> <br><br> Copyright &copy;2010-2014 Angus Johnson&nbsp; - &nbsp; Clipper 6.2.1 &nbsp; - &nbsp; Help file built on 1-November-2014 <br><br> </p>
+
+</body>
+
+</html> \ No newline at end of file
diff --git a/upstream/clipper-6.4.2/Documentation/Docs/Units/ClipperLib/Functions/CleanPolygons.htm b/upstream/clipper-6.4.2/Documentation/Docs/Units/ClipperLib/Functions/CleanPolygons.htm
new file mode 100644
index 0000000..7ec56ed
--- /dev/null
+++ b/upstream/clipper-6.4.2/Documentation/Docs/Units/ClipperLib/Functions/CleanPolygons.htm
@@ -0,0 +1,87 @@
+<html>
+
+<head>
+
+ <script type="text/javascript" src="../../../../Scripts/jquery.js">
+ </script>
+
+ <script type="text/javascript" src="../../../../Scripts/SyntaxHighlighter/scripts/shCore.js">
+ </script>
+
+ <script type="text/javascript" src="../../../../Scripts/SyntaxHighlighter/scripts/shBrushDelphi.js">
+ </script>
+
+ <script type="text/javascript" src="../../../../Scripts/SyntaxHighlighter/scripts/shBrushCpp.js">
+ </script>
+
+ <script type="text/javascript" src="../../../../Scripts/SyntaxHighlighter/scripts/shBrushCSharp.js">
+ </script>
+
+ <link type="text/css" rel="stylesheet" href="../../../../Scripts/SyntaxHighlighter/styles/shCoreDefault.css">
+
+ <link type="text/css" rel="stylesheet" href="../../../../Scripts/SyntaxHighlighter/styles/shThemeDefault.css">
+
+
+ <title>CleanPolygons</title>
+
+ <link rel="stylesheet" href="../../../../Styles/default.css" type="text/css">
+
+
+ <script type="text/javascript" src="../../../../Scripts/bootstrap.js">
+ </script>
+
+</head>
+
+<body bgcolor="#FFFFFF">
+
+ <!-- THIS FILE HAS BEEN AUTOMATICALLY PROCESSED FROM A SOURCE COPY -->
+
+ <!-- DO NOT EDIT MANUALLY !!! -->
+
+ <table class="Banner" cellspacing="0" cellpadding="0" border="1" bordercolorlight="#303080" bordercolordark="#7070B0">
+ <tr>
+ <td class="Banner" nowrap=""><a href="../../../_Body.htm" class="Banner"><img src="../../../../Images/_Home.gif" align="absmiddle">Home</a>
+ </td>
+ <td class="Banner" nowrap=""><a href="../_Body.htm" class="Banner"><img src="../../../../Images/_Unit.gif" align="absmiddle">ClipperLib</a>
+ </td>
+ <td class="Banner" width="100%" align="right"><img src="../../../../Images/_Project_Logo.gif" align="absmiddle">
+ </td>
+ </tr>
+ </table>
+ <h1>CleanPolygons</h1>
+
+
+ <p class="Decl"><span class="Comment">Del.&raquo;</span> <b>function</b> CleanPolygons(<b>const</b> Polys: TPaths; Distance: double = 1.415): TPaths;</p>
+
+ <p class="Decl2"><span class="Comment"> C++&nbsp;&raquo;</span> <b>void</b> CleanPolygons(<b>const</b> Paths &amp;in_polys, Paths &amp;out_polys, double distance = 1.415);</p>
+
+ <p class="Decl2"><span class="Comment"> C++&nbsp;&raquo;</span> <b>void</b> CleanPolygons(Paths &amp;polys, double distance = 1.415);</p>
+
+ <p class="Decl3"><span class="Comment">C#&nbsp;&nbsp;&raquo;</span> <b>public static</b> Paths CleanPolygons(Paths polys, double distance = 1.415);</p>
+<br>
+
+
+ <p class="Body"> Removes vertices:
+ <ul>
+
+ <li>that join co-linear edges, or join edges that are almost co-linear (such that if the vertex was moved no more than the specified distance the edges would be co-linear)</li>
+
+ <li>that are within the specified distance of an adjacent vertex</li>
+
+ <li>that are within the specified distance of a semi-adjacent vertex together with their out-lying vertices</li>
+
+ </ul> </p>
+
+ <p class="Body"> Vertices are <em>semi-adjacent</em> when they are separated by a single (out-lying) vertex.<br><br> The <em>distance</em> parameter's default value is approximately &radic;2 so that a vertex will be removed when adjacent or semi-adjacent vertices having their corresponding X and Y coordinates differing by no more than 1 unit. (If the egdes are semi-adjacent the out-lying vertex will be removed too.)<br><br> C++ only: This function is overloaded. In the first definition, the <em>in_polys</em> and <em>out_polys</em> parameters can reference the same <em>Paths</em> object though in that case the calling code might be clearer if the second definition (accepting a single <em>Paths</em> parameter) is used.<br><br> <img src="../../../../Images/clean1.png" alt="" border="0">&nbsp;&nbsp;&nbsp; <img src="../../../../Images/clean2.png" alt="" border="0"> </p>
+
+
+
+
+ <h2 id="Auto-SeeAlso">See Also</h2>
+ <p class="Body"><a href="CleanPolygon.htm">CleanPolygon</a>, <a href="SimplifyPolygons.htm">SimplifyPolygons</a></p>
+
+ <p class="Copyright" id="auto"> <br><br> Copyright &copy;2010-2014 Angus Johnson&nbsp; - &nbsp; Clipper 6.2.1 &nbsp; - &nbsp; Help file built on 1-November-2014 <br><br> </p>
+
+</body>
+
+</html> \ No newline at end of file
diff --git a/upstream/clipper-6.4.2/Documentation/Docs/Units/ClipperLib/Functions/ClosedPathsFromPolyTree.htm b/upstream/clipper-6.4.2/Documentation/Docs/Units/ClipperLib/Functions/ClosedPathsFromPolyTree.htm
new file mode 100644
index 0000000..e050135
--- /dev/null
+++ b/upstream/clipper-6.4.2/Documentation/Docs/Units/ClipperLib/Functions/ClosedPathsFromPolyTree.htm
@@ -0,0 +1,71 @@
+<html>
+
+<head>
+
+ <script type="text/javascript" src="../../../../Scripts/jquery.js">
+ </script>
+
+ <script type="text/javascript" src="../../../../Scripts/SyntaxHighlighter/scripts/shCore.js">
+ </script>
+
+ <script type="text/javascript" src="../../../../Scripts/SyntaxHighlighter/scripts/shBrushDelphi.js">
+ </script>
+
+ <script type="text/javascript" src="../../../../Scripts/SyntaxHighlighter/scripts/shBrushCpp.js">
+ </script>
+
+ <script type="text/javascript" src="../../../../Scripts/SyntaxHighlighter/scripts/shBrushCSharp.js">
+ </script>
+
+ <link type="text/css" rel="stylesheet" href="../../../../Scripts/SyntaxHighlighter/styles/shCoreDefault.css">
+
+ <link type="text/css" rel="stylesheet" href="../../../../Scripts/SyntaxHighlighter/styles/shThemeDefault.css">
+
+
+ <title>ClosedPathsFromPolyTree</title>
+
+ <link rel="stylesheet" href="../../../../Styles/default.css" type="text/css">
+
+
+ <script type="text/javascript" src="../../../../Scripts/bootstrap.js">
+ </script>
+
+</head>
+
+<body bgcolor="#FFFFFF">
+
+ <!-- THIS FILE HAS BEEN AUTOMATICALLY PROCESSED FROM A SOURCE COPY -->
+
+ <!-- DO NOT EDIT MANUALLY !!! -->
+
+ <table class="Banner" cellspacing="0" cellpadding="0" border="1" bordercolorlight="#303080" bordercolordark="#7070B0">
+ <tr>
+ <td class="Banner" nowrap=""><a href="../../../_Body.htm" class="Banner"><img src="../../../../Images/_Home.gif" align="absmiddle">Home</a>
+ </td>
+ <td class="Banner" nowrap=""><a href="../_Body.htm" class="Banner"><img src="../../../../Images/_Unit.gif" align="absmiddle">ClipperLib</a>
+ </td>
+ <td class="Banner" width="100%" align="right"><img src="../../../../Images/_Project_Logo.gif" align="absmiddle">
+ </td>
+ </tr>
+ </table>
+ <h1>ClosedPathsFromPolyTree</h1>
+
+
+ <p class="Decl"><span class="Comment">Del.&raquo;</span> <b>function</b> ClosedPathsFromPolyTree(PolyTree: TPolyTree): TPaths;</p>
+
+ <p class="Decl2"><span class="Comment"> C++&nbsp;&raquo;</span> <b>void</b> ClosedPathsFromPolyTree(PolyTree& polytree, Paths& paths);</p>
+
+ <p class="Decl3"><span class="Comment">C#&nbsp;&nbsp;&raquo;</span> <b>public static void</b> ClosedPathsFromPolyTree(PolyTree polytree, Paths paths);</p>
+<br>
+
+
+ <p class="Body"> This function filters out <em>open</em> paths from the <a href="../Classes/PolyTree/_Body.htm"><b>PolyTree</b></a> structure and returns only <em>closed</em> paths in a <a href="../Types/Paths.htm"><b>Paths</b></a> structure. </p>
+
+ <h2 id="Auto-SeeAlso">See Also</h2>
+ <p class="Body"><a href="../Classes/PolyTree/_Body.htm">PolyTree</a>, <a href="../Types/Paths.htm">Paths</a></p>
+
+ <p class="Copyright" id="auto"> <br><br> Copyright &copy;2010-2014 Angus Johnson&nbsp; - &nbsp; Clipper 6.2.1 &nbsp; - &nbsp; Help file built on 1-November-2014 <br><br> </p>
+
+</body>
+
+</html> \ No newline at end of file
diff --git a/upstream/clipper-6.4.2/Documentation/Docs/Units/ClipperLib/Functions/MinkowskiDiff.htm b/upstream/clipper-6.4.2/Documentation/Docs/Units/ClipperLib/Functions/MinkowskiDiff.htm
new file mode 100644
index 0000000..0a3ee4b
--- /dev/null
+++ b/upstream/clipper-6.4.2/Documentation/Docs/Units/ClipperLib/Functions/MinkowskiDiff.htm
@@ -0,0 +1,74 @@
+<html>
+
+<head>
+
+ <script type="text/javascript" src="../../../../Scripts/jquery.js">
+ </script>
+
+ <script type="text/javascript" src="../../../../Scripts/SyntaxHighlighter/scripts/shCore.js">
+ </script>
+
+ <script type="text/javascript" src="../../../../Scripts/SyntaxHighlighter/scripts/shBrushDelphi.js">
+ </script>
+
+ <script type="text/javascript" src="../../../../Scripts/SyntaxHighlighter/scripts/shBrushCpp.js">
+ </script>
+
+ <script type="text/javascript" src="../../../../Scripts/SyntaxHighlighter/scripts/shBrushCSharp.js">
+ </script>
+
+ <link type="text/css" rel="stylesheet" href="../../../../Scripts/SyntaxHighlighter/styles/shCoreDefault.css">
+
+ <link type="text/css" rel="stylesheet" href="../../../../Scripts/SyntaxHighlighter/styles/shThemeDefault.css">
+
+
+ <title>MinkowskiDiff</title>
+
+ <link rel="stylesheet" href="../../../../Styles/default.css" type="text/css">
+
+
+ <script type="text/javascript" src="../../../../Scripts/bootstrap.js">
+ </script>
+
+</head>
+
+<body bgcolor="#FFFFFF">
+
+ <!-- THIS FILE HAS BEEN AUTOMATICALLY PROCESSED FROM A SOURCE COPY -->
+
+ <!-- DO NOT EDIT MANUALLY !!! -->
+
+ <table class="Banner" cellspacing="0" cellpadding="0" border="1" bordercolorlight="#303080" bordercolordark="#7070B0">
+ <tr>
+ <td class="Banner" nowrap=""><a href="../../../_Body.htm" class="Banner"><img src="../../../../Images/_Home.gif" align="absmiddle">Home</a>
+ </td>
+ <td class="Banner" nowrap=""><a href="../_Body.htm" class="Banner"><img src="../../../../Images/_Unit.gif" align="absmiddle">ClipperLib</a>
+ </td>
+ <td class="Banner" width="100%" align="right"><img src="../../../../Images/_Project_Logo.gif" align="absmiddle">
+ </td>
+ </tr>
+ </table>
+ <h1>MinkowskiDiff</h1>
+
+
+ <p class="Decl"><span class="Comment">Del.&raquo;</span> <b>function</b> MinkowskiDiff(<b>const</b> Poly1: TPath; <b>const</b> Poly2: TPath): TPaths;</p>
+
+ <p class="Decl2"><span class="Comment"> C++&nbsp;&raquo;</span> <b>void</b> MinkowskiDiff(<b>const</b> Path& poly1, <b>const</b> Path& poly2, Paths& solution);</p>
+
+ <p class="Decl3"><span class="Comment">C#&nbsp;&nbsp;&raquo;</span> <b>public static</b> Paths MinkowskiDiff(Path poly1, Path poly2);</p>
+<br>
+
+
+ <p class="Body"> <img src="../../../../Images/minkowski2.png" alt="" border="0" align="right"> <b>Minkowski Difference</b> is performed by <em>subtracting</em> each point in a polygon from the set of points in an open or closed path. A key feature of Minkowski Difference is that when it's applied to two polygons, the resulting polygon will contain the coordinate space origin whenever the two polygons touch or overlap. (This function is often used to determine when polygons collide.)<br><br> <em>In the image on the left the blue polygon is the 'minkowski difference' of the two red boxes. The black dot represents the coordinate space origin.</em> </p>
+
+
+
+
+ <h2 id="Auto-SeeAlso">See Also</h2>
+ <p class="Body"><a href="MinkowskiSum.htm">MinkowskiSum</a>, <a href="../Types/Path.htm">Path</a></p>
+
+ <p class="Copyright" id="auto"> <br><br> Copyright &copy;2010-2014 Angus Johnson&nbsp; - &nbsp; Clipper 6.2.1 &nbsp; - &nbsp; Help file built on 1-November-2014 <br><br> </p>
+
+</body>
+
+</html> \ No newline at end of file
diff --git a/upstream/clipper-6.4.2/Documentation/Docs/Units/ClipperLib/Functions/MinkowskiSum.htm b/upstream/clipper-6.4.2/Documentation/Docs/Units/ClipperLib/Functions/MinkowskiSum.htm
new file mode 100644
index 0000000..0d4429d
--- /dev/null
+++ b/upstream/clipper-6.4.2/Documentation/Docs/Units/ClipperLib/Functions/MinkowskiSum.htm
@@ -0,0 +1,101 @@
+<html>
+
+<head>
+
+ <script type="text/javascript" src="../../../../Scripts/jquery.js">
+ </script>
+
+ <script type="text/javascript" src="../../../../Scripts/SyntaxHighlighter/scripts/shCore.js">
+ </script>
+
+ <script type="text/javascript" src="../../../../Scripts/SyntaxHighlighter/scripts/shBrushDelphi.js">
+ </script>
+
+ <script type="text/javascript" src="../../../../Scripts/SyntaxHighlighter/scripts/shBrushCpp.js">
+ </script>
+
+ <script type="text/javascript" src="../../../../Scripts/SyntaxHighlighter/scripts/shBrushCSharp.js">
+ </script>
+
+ <link type="text/css" rel="stylesheet" href="../../../../Scripts/SyntaxHighlighter/styles/shCoreDefault.css">
+
+ <link type="text/css" rel="stylesheet" href="../../../../Scripts/SyntaxHighlighter/styles/shThemeDefault.css">
+
+
+ <title>MinkowskiSum</title>
+
+ <link rel="stylesheet" href="../../../../Styles/default.css" type="text/css">
+
+
+ <script type="text/javascript" src="../../../../Scripts/bootstrap.js">
+ </script>
+
+</head>
+
+<body bgcolor="#FFFFFF">
+
+ <!-- THIS FILE HAS BEEN AUTOMATICALLY PROCESSED FROM A SOURCE COPY -->
+
+ <!-- DO NOT EDIT MANUALLY !!! -->
+
+ <table class="Banner" cellspacing="0" cellpadding="0" border="1" bordercolorlight="#303080" bordercolordark="#7070B0">
+ <tr>
+ <td class="Banner" nowrap=""><a href="../../../_Body.htm" class="Banner"><img src="../../../../Images/_Home.gif" align="absmiddle">Home</a>
+ </td>
+ <td class="Banner" nowrap=""><a href="../_Body.htm" class="Banner"><img src="../../../../Images/_Unit.gif" align="absmiddle">ClipperLib</a>
+ </td>
+ <td class="Banner" width="100%" align="right"><img src="../../../../Images/_Project_Logo.gif" align="absmiddle">
+ </td>
+ </tr>
+ </table>
+ <h1>MinkowskiSum</h1>
+
+
+ <p class="Decl"><span class="Comment">Del.&raquo;</span> <b>function</b> MinkowskiSum(<b>const</b> Pattern: TPath; <b>const</b> Path: TPath; PathIsClosed: Boolean): TPaths; <b>overload;</b></p>
+
+ <p class="Decl"><span class="Comment">Del.&raquo;</span> <b>function</b> MinkowskiSum(<b>const</b> Pattern: TPath; <b>const</b> Paths: TPaths; PathFillType: TPolyFillType; PathIsClosed: Boolean): TPaths; <b>overload;</b></p>
+
+ <p class="Decl2"><span class="Comment"> C++&nbsp;&raquo;</span> <b>void</b> MinkowskiSum(<b>const</b> Path& pattern, <b>const</b> Path& path, Paths& solution, <b>bool</b> pathIsClosed);</p>
+
+ <p class="Decl2"><span class="Comment"> C++&nbsp;&raquo;</span> <b>void</b> MinkowskiSum(<b>const</b> Path& pattern, <b>const</b> Paths& paths, Paths& solution, PolyFillType pathFillType, <b>bool</b> pathIsClosed);</p>
+
+ <p class="Decl3"><span class="Comment">C#&nbsp;&nbsp;&raquo;</span> <b>public static</b> Paths MinkowskiSum(Path pattern, Path path, <b>bool</b> pathIsClosed);</p>
+
+ <p class="Decl3"><span class="Comment">C#&nbsp;&nbsp;&raquo;</span> <b>public static</b> Paths MinkowskiSum(Path pattern, Paths paths, PolyFillType pathFillType, <b>bool</b> pathIsClosed);</p>
+<br>
+
+
+ <p class="Body"> <b>Minkowski Addition</b> is performed by <em>adding</em> each point in a polygon 'pattern' to the set of points in an open or closed path. The resulting polygon (or polygons) defines the region that the 'pattern' would pass over in moving from the beginning to the end of the 'path'. </p>
+
+
+ <p class="Body"> <img src="../../../../Images/minkowski.png" alt="" border="0" align="right">
+ <pre class="brush: csharp;">
+ Path path = new Path();
+ Path pattern = new Path();
+ Paths solution = new Paths();
+
+ //Greek capital sigma (sum sign) ...
+ Int64[] ints1 = new Int64[] { 300, 400, 100, 400, 200, 300, 100, 200, 300, 200 };
+ path = IntsToPolygon(ints1);
+
+ //diagonal brush pattern ...
+ Int64[] ints2 = new Int64[] { 4, -6, 6, -6, -4, 6, -6, 6 };
+ pattern = IntsToPolygon(ints2);
+
+ solution = Clipper.MinkowskiSum(pattern, path, false);
+ //move 'pattern' to the end of 'path' ...
+ pattern = TranslatePath(pattern, 300, 200);
+
+ //Display solution &plusmn; pattern ...
+ </pre> </p>
+
+
+
+ <h2 id="Auto-SeeAlso">See Also</h2>
+ <p class="Body"><a href="MinkowskiDiff.htm">MinkowskiDiff</a></p>
+
+ <p class="Copyright" id="auto"> <br><br> Copyright &copy;2010-2014 Angus Johnson&nbsp; - &nbsp; Clipper 6.2.1 &nbsp; - &nbsp; Help file built on 1-November-2014 <br><br> </p>
+
+</body>
+
+</html> \ No newline at end of file
diff --git a/upstream/clipper-6.4.2/Documentation/Docs/Units/ClipperLib/Functions/OffsetPaths.htm b/upstream/clipper-6.4.2/Documentation/Docs/Units/ClipperLib/Functions/OffsetPaths.htm
new file mode 100644
index 0000000..a0787b7
--- /dev/null
+++ b/upstream/clipper-6.4.2/Documentation/Docs/Units/ClipperLib/Functions/OffsetPaths.htm
@@ -0,0 +1,70 @@
+<html>
+
+<head>
+
+ <script type="text/javascript" src="../../../../Scripts/jquery.js">
+ </script>
+
+ <script type="text/javascript" src="../../../../Scripts/SyntaxHighlighter/scripts/shCore.js">
+ </script>
+
+ <script type="text/javascript" src="../../../../Scripts/SyntaxHighlighter/scripts/shBrushDelphi.js">
+ </script>
+
+ <script type="text/javascript" src="../../../../Scripts/SyntaxHighlighter/scripts/shBrushCpp.js">
+ </script>
+
+ <script type="text/javascript" src="../../../../Scripts/SyntaxHighlighter/scripts/shBrushCSharp.js">
+ </script>
+
+ <link type="text/css" rel="stylesheet" href="../../../../Scripts/SyntaxHighlighter/styles/shCoreDefault.css">
+
+ <link type="text/css" rel="stylesheet" href="../../../../Scripts/SyntaxHighlighter/styles/shThemeDefault.css">
+
+
+ <title>OffsetPaths</title>
+
+ <link rel="stylesheet" href="../../../../Styles/default.css" type="text/css">
+
+
+ <script type="text/javascript" src="../../../../Scripts/bootstrap.js">
+ </script>
+
+</head>
+
+<body bgcolor="#FFFFFF">
+
+ <!-- THIS FILE HAS BEEN AUTOMATICALLY PROCESSED FROM A SOURCE COPY -->
+
+ <!-- DO NOT EDIT MANUALLY !!! -->
+
+ <table class="Banner" cellspacing="0" cellpadding="0" border="1" bordercolorlight="#303080" bordercolordark="#7070B0">
+ <tr>
+ <td class="Banner" nowrap=""><a href="../../../_Body.htm" class="Banner"><img src="../../../../Images/_Home.gif" align="absmiddle">Home</a>
+ </td>
+ <td class="Banner" nowrap=""><a href="../_Body.htm" class="Banner"><img src="../../../../Images/_Unit.gif" align="absmiddle">ClipperLib</a>
+ </td>
+ <td class="Banner" width="100%" align="right"><img src="../../../../Images/_Project_Logo.gif" align="absmiddle">
+ </td>
+ </tr>
+ </table>
+ <h1>OffsetPaths</h1>
+
+
+ <p class="Decl"><span class="Comment">Del.&raquo;</span> <b>function</b> OffsetPaths(<b>const</b> polys: Paths; <b>const</b> delta: double; JoinType: TJoinType = jtSquare; EndType: TEndType = etClosed; Limit: double = 0.0): TPaths;</p>
+
+ <p class="Decl2"><span class="Comment"> C++&nbsp;&raquo;</span> <b>void</b> OffsetPaths(<b>const</b> Paths &amp;in_polys, Paths &amp;out_polys, <b>double</b> delta, JoinType jointype = jtSquare, EndType endtype = etClosed, <b>double</b> limit = 0.0);</p>
+
+ <p class="Decl3"><span class="Comment">C#&nbsp;&nbsp;&raquo;</span> <b>public static</b> Paths OffsetPaths(Paths polys, <b>double</b> delta, JoinType jointype = JoinType.jtSquare, EndType endtype = EndType.etClosed, <b>double</b> limit = 0.0);</p>
+<br>
+
+ <p class="Body"> <b>Deprecated.</b> (See <a href="../Classes/ClipperOffset/_Body.htm">ClipperOffset</a>.)<br><br> </p>
+
+ <h2 id="Auto-SeeAlso">See Also</h2>
+ <p class="Body"><a href="../Classes/ClipperOffset/_Body.htm">ClipperOffset</a></p>
+
+ <p class="Copyright" id="auto"> <br><br> Copyright &copy;2010-2014 Angus Johnson&nbsp; - &nbsp; Clipper 6.2.1 &nbsp; - &nbsp; Help file built on 1-November-2014 <br><br> </p>
+
+</body>
+
+</html> \ No newline at end of file
diff --git a/upstream/clipper-6.4.2/Documentation/Docs/Units/ClipperLib/Functions/OpenPathsFromPolyTree.htm b/upstream/clipper-6.4.2/Documentation/Docs/Units/ClipperLib/Functions/OpenPathsFromPolyTree.htm
new file mode 100644
index 0000000..3ce9fa9
--- /dev/null
+++ b/upstream/clipper-6.4.2/Documentation/Docs/Units/ClipperLib/Functions/OpenPathsFromPolyTree.htm
@@ -0,0 +1,71 @@
+<html>
+
+<head>
+
+ <script type="text/javascript" src="../../../../Scripts/jquery.js">
+ </script>
+
+ <script type="text/javascript" src="../../../../Scripts/SyntaxHighlighter/scripts/shCore.js">
+ </script>
+
+ <script type="text/javascript" src="../../../../Scripts/SyntaxHighlighter/scripts/shBrushDelphi.js">
+ </script>
+
+ <script type="text/javascript" src="../../../../Scripts/SyntaxHighlighter/scripts/shBrushCpp.js">
+ </script>
+
+ <script type="text/javascript" src="../../../../Scripts/SyntaxHighlighter/scripts/shBrushCSharp.js">
+ </script>
+
+ <link type="text/css" rel="stylesheet" href="../../../../Scripts/SyntaxHighlighter/styles/shCoreDefault.css">
+
+ <link type="text/css" rel="stylesheet" href="../../../../Scripts/SyntaxHighlighter/styles/shThemeDefault.css">
+
+
+ <title>OpenPathsFromPolyTree</title>
+
+ <link rel="stylesheet" href="../../../../Styles/default.css" type="text/css">
+
+
+ <script type="text/javascript" src="../../../../Scripts/bootstrap.js">
+ </script>
+
+</head>
+
+<body bgcolor="#FFFFFF">
+
+ <!-- THIS FILE HAS BEEN AUTOMATICALLY PROCESSED FROM A SOURCE COPY -->
+
+ <!-- DO NOT EDIT MANUALLY !!! -->
+
+ <table class="Banner" cellspacing="0" cellpadding="0" border="1" bordercolorlight="#303080" bordercolordark="#7070B0">
+ <tr>
+ <td class="Banner" nowrap=""><a href="../../../_Body.htm" class="Banner"><img src="../../../../Images/_Home.gif" align="absmiddle">Home</a>
+ </td>
+ <td class="Banner" nowrap=""><a href="../_Body.htm" class="Banner"><img src="../../../../Images/_Unit.gif" align="absmiddle">ClipperLib</a>
+ </td>
+ <td class="Banner" width="100%" align="right"><img src="../../../../Images/_Project_Logo.gif" align="absmiddle">
+ </td>
+ </tr>
+ </table>
+ <h1>OpenPathsFromPolyTree</h1>
+
+
+ <p class="Decl"><span class="Comment">Del.&raquo;</span> <b>function</b> OpenPathsFromPolyTree(PolyTree: TPolyTree): TPaths;</p>
+
+ <p class="Decl2"><span class="Comment"> C++&nbsp;&raquo;</span> <b>void</b> OpenPathsFromPolyTree(PolyTree& polytree, Paths& paths);</p>
+
+ <p class="Decl3"><span class="Comment">C#&nbsp;&nbsp;&raquo;</span> <b>public static void</b> OpenPathsFromPolyTree(PolyTree polytree, Paths paths);</p>
+<br>
+
+
+ <p class="Body"> This function filters out <em>closed</em> paths from the <a href="../Classes/PolyTree/_Body.htm"><b>PolyTree</b></a> structure and returns only <em>open</em> paths in a <a href="../Types/Paths.htm"><b>Paths</b></a> structure. </p>
+
+ <h2 id="Auto-SeeAlso">See Also</h2>
+ <p class="Body"><a href="../Classes/PolyTree/_Body.htm">PolyTree</a>, <a href="../Types/Paths.htm">Paths</a></p>
+
+ <p class="Copyright" id="auto"> <br><br> Copyright &copy;2010-2014 Angus Johnson&nbsp; - &nbsp; Clipper 6.2.1 &nbsp; - &nbsp; Help file built on 1-November-2014 <br><br> </p>
+
+</body>
+
+</html> \ No newline at end of file
diff --git a/upstream/clipper-6.4.2/Documentation/Docs/Units/ClipperLib/Functions/Orientation.htm b/upstream/clipper-6.4.2/Documentation/Docs/Units/ClipperLib/Functions/Orientation.htm
new file mode 100644
index 0000000..6dc02c9
--- /dev/null
+++ b/upstream/clipper-6.4.2/Documentation/Docs/Units/ClipperLib/Functions/Orientation.htm
@@ -0,0 +1,92 @@
+<html>
+
+<head>
+
+ <script type="text/javascript" src="../../../../Scripts/jquery.js">
+ </script>
+
+ <script type="text/javascript" src="../../../../Scripts/SyntaxHighlighter/scripts/shCore.js">
+ </script>
+
+ <script type="text/javascript" src="../../../../Scripts/SyntaxHighlighter/scripts/shBrushDelphi.js">
+ </script>
+
+ <script type="text/javascript" src="../../../../Scripts/SyntaxHighlighter/scripts/shBrushCpp.js">
+ </script>
+
+ <script type="text/javascript" src="../../../../Scripts/SyntaxHighlighter/scripts/shBrushCSharp.js">
+ </script>
+
+ <link type="text/css" rel="stylesheet" href="../../../../Scripts/SyntaxHighlighter/styles/shCoreDefault.css">
+
+ <link type="text/css" rel="stylesheet" href="../../../../Scripts/SyntaxHighlighter/styles/shThemeDefault.css">
+
+
+ <title>Orientation</title>
+
+ <link rel="stylesheet" href="../../../../Styles/default.css" type="text/css">
+
+
+ <script type="text/javascript" src="../../../../Scripts/bootstrap.js">
+ </script>
+
+</head>
+
+<body bgcolor="#FFFFFF">
+
+ <!-- THIS FILE HAS BEEN AUTOMATICALLY PROCESSED FROM A SOURCE COPY -->
+
+ <!-- DO NOT EDIT MANUALLY !!! -->
+
+ <table class="Banner" cellspacing="0" cellpadding="0" border="1" bordercolorlight="#303080" bordercolordark="#7070B0">
+ <tr>
+ <td class="Banner" nowrap=""><a href="../../../_Body.htm" class="Banner"><img src="../../../../Images/_Home.gif" align="absmiddle">Home</a>
+ </td>
+ <td class="Banner" nowrap=""><a href="../_Body.htm" class="Banner"><img src="../../../../Images/_Unit.gif" align="absmiddle">ClipperLib</a>
+ </td>
+ <td class="Banner" width="100%" align="right"><img src="../../../../Images/_Project_Logo.gif" align="absmiddle">
+ </td>
+ </tr>
+ </table>
+ <h1>Orientation</h1>
+
+
+ <p class="Decl"><span class="Comment">Del.&raquo;</span> <b>function</b> Orientation(<b>const</b> poly: <a href="../Types/Path.htm">TPath</a>): boolean;</p>
+
+ <p class="Decl2"><span class="Comment">C++&nbsp;&raquo;</span> <b>bool</b> Orientation(<b>const</b> <a href="../Types/Path.htm">Path</a> &amp;poly); <span class="Comment">// Function in the ClipperLib namespace.</span></p>
+
+ <p class="Decl3"><span class="Comment">C#&nbsp;&nbsp;&raquo;</span> <b>public static bool</b> Orientation(<a href="../Types/Path.htm">Path</a> poly); <span class="Comment">// Static method of the Clipper class in the ClipperLib namespace.</span></p>
+
+
+ <p class="Body">Orientation is only important to <em>closed</em> paths. Given that vertices are declared in a specific order, orientation refers to the direction (clockwise or counter-clockwise) that these vertices progress around a closed path.<br><br> Orientation is also dependent on axis direction:<br>
+ <ul>
+
+ <li>On <b>Y-axis positive <em>upward</em> displays</b>, Orientation will return true if the polygon's orientation is counter-clockwise.</li>
+
+ <li>On <b>Y-axis positive <em>downward</em> displays</b>, Orientation will return true if the polygon's orientation is clockwise.</li>
+
+ </ul> </p>
+
+
+ <p class="Body"> <img src="../../../../Images/orientation.png" alt="" border="0" align="left"><br style="clear:both"><br> <b>Notes:</b><br>
+ <ul>
+
+ <li>Self-intersecting polygons have indeterminate orientations in which case this function won't return a meaningful value.</li>
+
+ <li>The majority of 2D graphic display libraries (eg GDI, GDI+, XLib, Cairo, AGG, Graphics32) and even the SVG file format have their coordinate origins at the top-left corner of their respective viewports <em>with their Y axes increasing downward</em>. However, some display libraries (eg Quartz, OpenGL) have their coordinate origins undefined or in the classic bottom-left position with their Y axes increasing upward.</li>
+
+ <li>For Non-Zero filled polygons, the orientation of <a href="../../../Overview/_Body.htm#terminology">holes</a> <em>must be opposite</em> that of <a href="../../../Overview/_Body.htm#terminology">outer</a> polygons.</li>
+
+ <li>For closed paths (polygons) in the <em>solution</em> returned by Clipper's Execute method, their orientations will always be <em>true</em> for outer polygons and <em>false</em> for hole polygons (unless the <a href="../Classes/Clipper/Properties/ReverseSolution.htm"><b>ReverseSolution</b></a> property has been enabled).</li>
+
+ </ul> </p>
+<br>
+
+ <h2 id="Auto-SeeAlso">See Also</h2>
+ <p class="Body"><a href="../../../Overview/_Body.htm">Overview</a>, <a href="../Classes/Clipper/Properties/ReverseSolution.htm">Clipper.ReverseSolution</a>, <a href="../Types/Path.htm">Path</a></p>
+
+ <p class="Copyright" id="auto"> <br><br> Copyright &copy;2010-2014 Angus Johnson&nbsp; - &nbsp; Clipper 6.2.1 &nbsp; - &nbsp; Help file built on 1-November-2014 <br><br> </p>
+
+</body>
+
+</html> \ No newline at end of file
diff --git a/upstream/clipper-6.4.2/Documentation/Docs/Units/ClipperLib/Functions/PointInPolygon.htm b/upstream/clipper-6.4.2/Documentation/Docs/Units/ClipperLib/Functions/PointInPolygon.htm
new file mode 100644
index 0000000..6ae3214
--- /dev/null
+++ b/upstream/clipper-6.4.2/Documentation/Docs/Units/ClipperLib/Functions/PointInPolygon.htm
@@ -0,0 +1,72 @@
+<html>
+
+<head>
+
+ <script type="text/javascript" src="../../../../Scripts/jquery.js">
+ </script>
+
+ <script type="text/javascript" src="../../../../Scripts/SyntaxHighlighter/scripts/shCore.js">
+ </script>
+
+ <script type="text/javascript" src="../../../../Scripts/SyntaxHighlighter/scripts/shBrushDelphi.js">
+ </script>
+
+ <script type="text/javascript" src="../../../../Scripts/SyntaxHighlighter/scripts/shBrushCpp.js">
+ </script>
+
+ <script type="text/javascript" src="../../../../Scripts/SyntaxHighlighter/scripts/shBrushCSharp.js">
+ </script>
+
+ <link type="text/css" rel="stylesheet" href="../../../../Scripts/SyntaxHighlighter/styles/shCoreDefault.css">
+
+ <link type="text/css" rel="stylesheet" href="../../../../Scripts/SyntaxHighlighter/styles/shThemeDefault.css">
+
+
+ <title>PointInPolygon</title>
+
+ <link rel="stylesheet" href="../../../../Styles/default.css" type="text/css">
+
+
+ <script type="text/javascript" src="../../../../Scripts/bootstrap.js">
+ </script>
+
+</head>
+
+<body bgcolor="#FFFFFF">
+
+ <!-- THIS FILE HAS BEEN AUTOMATICALLY PROCESSED FROM A SOURCE COPY -->
+
+ <!-- DO NOT EDIT MANUALLY !!! -->
+
+ <table class="Banner" cellspacing="0" cellpadding="0" border="1" bordercolorlight="#303080" bordercolordark="#7070B0">
+ <tr>
+ <td class="Banner" nowrap=""><a href="../../../_Body.htm" class="Banner"><img src="../../../../Images/_Home.gif" align="absmiddle">Home</a>
+ </td>
+ <td class="Banner" nowrap=""><a href="../_Body.htm" class="Banner"><img src="../../../../Images/_Unit.gif" align="absmiddle">ClipperLib</a>
+ </td>
+ <td class="Banner" width="100%" align="right"><img src="../../../../Images/_Project_Logo.gif" align="absmiddle">
+ </td>
+ </tr>
+ </table>
+ <h1>PointInPolygon</h1>
+
+
+ <p class="Decl"><span class="Comment">Del.&raquo;</span> <b>function</b> PointInPolygon(<b>const</b> Pt: <a href="../Types/IntPoint.htm">TIntPoint</a>; <b>const</b> poly: <a href="../Types/Path.htm">TPath</a>): Integer;</p>
+
+ <p class="Decl2"><span class="Comment">C++&nbsp;&raquo;</span> <b>int</b> PointInPolygon(<b>const</b> <a href="../Types/IntPoint.htm">IntPoint</a> pt, <b>const</b> <a href="../Types/Path.htm">Path</a> &amp;poly); <span class="Comment">// Function in the ClipperLib namespace.</span></p>
+
+ <p class="Decl3"><span class="Comment">C#&nbsp;&nbsp;&raquo;</span> <b>public static int</b> PointInPolygon(<a href="../Types/IntPoint.htm">IntPoint</a> pt, <a href="../Types/Path.htm">Path</a> poly); <span class="Comment">// Static method of the Clipper class.</span></p>
+
+
+ <p class="Body">Returns 0 when false, -1 when pt is <b>on</b> poly and +1 when pt is <b>in</b> poly.<br><br> It's assumed that 'poly' is closed and does not self-intersect. </p>
+
+<br>
+
+ <h2 id="Auto-SeeAlso">See Also</h2>
+ <p class="Body"><a href="../Types/IntPoint.htm">IntPoint</a>, <a href="../Types/Path.htm">Path</a></p>
+
+ <p class="Copyright" id="auto"> <br><br> Copyright &copy;2010-2014 Angus Johnson&nbsp; - &nbsp; Clipper 6.2.1 &nbsp; - &nbsp; Help file built on 1-November-2014 <br><br> </p>
+
+</body>
+
+</html> \ No newline at end of file
diff --git a/upstream/clipper-6.4.2/Documentation/Docs/Units/ClipperLib/Functions/PolyTreeToPaths.htm b/upstream/clipper-6.4.2/Documentation/Docs/Units/ClipperLib/Functions/PolyTreeToPaths.htm
new file mode 100644
index 0000000..a4762d2
--- /dev/null
+++ b/upstream/clipper-6.4.2/Documentation/Docs/Units/ClipperLib/Functions/PolyTreeToPaths.htm
@@ -0,0 +1,71 @@
+<html>
+
+<head>
+
+ <script type="text/javascript" src="../../../../Scripts/jquery.js">
+ </script>
+
+ <script type="text/javascript" src="../../../../Scripts/SyntaxHighlighter/scripts/shCore.js">
+ </script>
+
+ <script type="text/javascript" src="../../../../Scripts/SyntaxHighlighter/scripts/shBrushDelphi.js">
+ </script>
+
+ <script type="text/javascript" src="../../../../Scripts/SyntaxHighlighter/scripts/shBrushCpp.js">
+ </script>
+
+ <script type="text/javascript" src="../../../../Scripts/SyntaxHighlighter/scripts/shBrushCSharp.js">
+ </script>
+
+ <link type="text/css" rel="stylesheet" href="../../../../Scripts/SyntaxHighlighter/styles/shCoreDefault.css">
+
+ <link type="text/css" rel="stylesheet" href="../../../../Scripts/SyntaxHighlighter/styles/shThemeDefault.css">
+
+
+ <title>PolyTreeToPaths</title>
+
+ <link rel="stylesheet" href="../../../../Styles/default.css" type="text/css">
+
+
+ <script type="text/javascript" src="../../../../Scripts/bootstrap.js">
+ </script>
+
+</head>
+
+<body bgcolor="#FFFFFF">
+
+ <!-- THIS FILE HAS BEEN AUTOMATICALLY PROCESSED FROM A SOURCE COPY -->
+
+ <!-- DO NOT EDIT MANUALLY !!! -->
+
+ <table class="Banner" cellspacing="0" cellpadding="0" border="1" bordercolorlight="#303080" bordercolordark="#7070B0">
+ <tr>
+ <td class="Banner" nowrap=""><a href="../../../_Body.htm" class="Banner"><img src="../../../../Images/_Home.gif" align="absmiddle">Home</a>
+ </td>
+ <td class="Banner" nowrap=""><a href="../_Body.htm" class="Banner"><img src="../../../../Images/_Unit.gif" align="absmiddle">ClipperLib</a>
+ </td>
+ <td class="Banner" width="100%" align="right"><img src="../../../../Images/_Project_Logo.gif" align="absmiddle">
+ </td>
+ </tr>
+ </table>
+ <h1>PolyTreeToPaths</h1>
+
+
+ <p class="Decl"><span class="Comment">Del.&raquo;</span> <b>function</b> PolyTreeToPaths(PolyTree: TPolyTree): TPaths;</p>
+
+ <p class="Decl2"><span class="Comment"> C++&nbsp;&raquo;</span> <b>void</b> PolyTreeToPaths(PolyTree& polytree, Paths& paths);</p>
+
+ <p class="Decl3"><span class="Comment">C#&nbsp;&nbsp;&raquo;</span> <b>public static</b> Paths PolyTreeToPaths(PolyTree polytree);</p>
+<br>
+
+
+ <p class="Body"> This function converts a <a href="../Classes/PolyTree/_Body.htm"><b>PolyTree</b></a> structure into a <a href="../Types/Paths.htm"><b>Paths</b></a> structure. </p>
+
+ <h2 id="Auto-SeeAlso">See Also</h2>
+ <p class="Body"><a href="../Classes/PolyTree/_Body.htm">PolyTree</a>, <a href="../Types/Paths.htm">Paths</a></p>
+
+ <p class="Copyright" id="auto"> <br><br> Copyright &copy;2010-2014 Angus Johnson&nbsp; - &nbsp; Clipper 6.2.1 &nbsp; - &nbsp; Help file built on 1-November-2014 <br><br> </p>
+
+</body>
+
+</html> \ No newline at end of file
diff --git a/upstream/clipper-6.4.2/Documentation/Docs/Units/ClipperLib/Functions/ReversePath.htm b/upstream/clipper-6.4.2/Documentation/Docs/Units/ClipperLib/Functions/ReversePath.htm
new file mode 100644
index 0000000..d0fe8ec
--- /dev/null
+++ b/upstream/clipper-6.4.2/Documentation/Docs/Units/ClipperLib/Functions/ReversePath.htm
@@ -0,0 +1,71 @@
+<html>
+
+<head>
+
+ <script type="text/javascript" src="../../../../Scripts/jquery.js">
+ </script>
+
+ <script type="text/javascript" src="../../../../Scripts/SyntaxHighlighter/scripts/shCore.js">
+ </script>
+
+ <script type="text/javascript" src="../../../../Scripts/SyntaxHighlighter/scripts/shBrushDelphi.js">
+ </script>
+
+ <script type="text/javascript" src="../../../../Scripts/SyntaxHighlighter/scripts/shBrushCpp.js">
+ </script>
+
+ <script type="text/javascript" src="../../../../Scripts/SyntaxHighlighter/scripts/shBrushCSharp.js">
+ </script>
+
+ <link type="text/css" rel="stylesheet" href="../../../../Scripts/SyntaxHighlighter/styles/shCoreDefault.css">
+
+ <link type="text/css" rel="stylesheet" href="../../../../Scripts/SyntaxHighlighter/styles/shThemeDefault.css">
+
+
+ <title>ReversePath</title>
+
+ <link rel="stylesheet" href="../../../../Styles/default.css" type="text/css">
+
+
+ <script type="text/javascript" src="../../../../Scripts/bootstrap.js">
+ </script>
+
+</head>
+
+<body bgcolor="#FFFFFF">
+
+ <!-- THIS FILE HAS BEEN AUTOMATICALLY PROCESSED FROM A SOURCE COPY -->
+
+ <!-- DO NOT EDIT MANUALLY !!! -->
+
+ <table class="Banner" cellspacing="0" cellpadding="0" border="1" bordercolorlight="#303080" bordercolordark="#7070B0">
+ <tr>
+ <td class="Banner" nowrap=""><a href="../../../_Body.htm" class="Banner"><img src="../../../../Images/_Home.gif" align="absmiddle">Home</a>
+ </td>
+ <td class="Banner" nowrap=""><a href="../_Body.htm" class="Banner"><img src="../../../../Images/_Unit.gif" align="absmiddle">ClipperLib</a>
+ </td>
+ <td class="Banner" width="100%" align="right"><img src="../../../../Images/_Project_Logo.gif" align="absmiddle">
+ </td>
+ </tr>
+ </table>
+ <h1>ReversePath</h1>
+
+
+ <p class="Decl"><span class="Comment">Del.&raquo;</span> <b>function</b> ReversePath(<b>const</b> polys: TPath): TPath;</p>
+
+ <p class="Decl2"><span class="Comment"> C++&nbsp;&raquo;</span> <b>void</b> ReversePath(<b>const</b> Path &amp;p);</p>
+
+ <p class="Decl3"><span class="Comment">C#&nbsp;&nbsp;&raquo; //Call Path.Reverse().</span></p>
+<br>
+
+ <p class="Body"> Reverses the vertex order (and hence orientation) in the specified path. </p>
+
+
+ <h2 id="Auto-SeeAlso">See Also</h2>
+ <p class="Body"><a href="../Types/Path.htm">Path</a></p>
+
+ <p class="Copyright" id="auto"> <br><br> Copyright &copy;2010-2014 Angus Johnson&nbsp; - &nbsp; Clipper 6.2.1 &nbsp; - &nbsp; Help file built on 1-November-2014 <br><br> </p>
+
+</body>
+
+</html> \ No newline at end of file
diff --git a/upstream/clipper-6.4.2/Documentation/Docs/Units/ClipperLib/Functions/ReversePaths.htm b/upstream/clipper-6.4.2/Documentation/Docs/Units/ClipperLib/Functions/ReversePaths.htm
new file mode 100644
index 0000000..19ebbad
--- /dev/null
+++ b/upstream/clipper-6.4.2/Documentation/Docs/Units/ClipperLib/Functions/ReversePaths.htm
@@ -0,0 +1,70 @@
+<html>
+
+<head>
+
+ <script type="text/javascript" src="../../../../Scripts/jquery.js">
+ </script>
+
+ <script type="text/javascript" src="../../../../Scripts/SyntaxHighlighter/scripts/shCore.js">
+ </script>
+
+ <script type="text/javascript" src="../../../../Scripts/SyntaxHighlighter/scripts/shBrushDelphi.js">
+ </script>
+
+ <script type="text/javascript" src="../../../../Scripts/SyntaxHighlighter/scripts/shBrushCpp.js">
+ </script>
+
+ <script type="text/javascript" src="../../../../Scripts/SyntaxHighlighter/scripts/shBrushCSharp.js">
+ </script>
+
+ <link type="text/css" rel="stylesheet" href="../../../../Scripts/SyntaxHighlighter/styles/shCoreDefault.css">
+
+ <link type="text/css" rel="stylesheet" href="../../../../Scripts/SyntaxHighlighter/styles/shThemeDefault.css">
+
+
+ <title>ReversePaths</title>
+
+ <link rel="stylesheet" href="../../../../Styles/default.css" type="text/css">
+
+
+ <script type="text/javascript" src="../../../../Scripts/bootstrap.js">
+ </script>
+
+</head>
+
+<body bgcolor="#FFFFFF">
+
+ <!-- THIS FILE HAS BEEN AUTOMATICALLY PROCESSED FROM A SOURCE COPY -->
+
+ <!-- DO NOT EDIT MANUALLY !!! -->
+
+ <table class="Banner" cellspacing="0" cellpadding="0" border="1" bordercolorlight="#303080" bordercolordark="#7070B0">
+ <tr>
+ <td class="Banner" nowrap=""><a href="../../../_Body.htm" class="Banner"><img src="../../../../Images/_Home.gif" align="absmiddle">Home</a>
+ </td>
+ <td class="Banner" nowrap=""><a href="../_Body.htm" class="Banner"><img src="../../../../Images/_Unit.gif" align="absmiddle">ClipperLib</a>
+ </td>
+ <td class="Banner" width="100%" align="right"><img src="../../../../Images/_Project_Logo.gif" align="absmiddle">
+ </td>
+ </tr>
+ </table>
+ <h1>ReversePaths</h1>
+
+
+ <p class="Decl"><span class="Comment">Del.&raquo;</span> <b>function</b> ReversePaths(<b>const</b> p: TPaths): TPaths;</p>
+
+ <p class="Decl2"><span class="Comment"> C++&nbsp;&raquo;</span> <b>void</b> ReversePaths(<b>const</b> Paths &amp;p);</p>
+
+ <p class="Decl3"><span class="Comment">C#&nbsp;&nbsp;&raquo;</span> <b>void</b> ReversePaths( Paths p );</p>
+<br>
+
+
+ <p class="Body"> Reverses the vertex order (and hence orientation) in each contained path. </p>
+
+
+
+ <p class="Copyright" id="auto"> <br><br> Copyright &copy;2010-2014 Angus Johnson&nbsp; - &nbsp; Clipper 6.2.1 &nbsp; - &nbsp; Help file built on 1-November-2014 <br><br> </p>
+
+</body>
+
+</html> \ No newline at end of file
diff --git a/upstream/clipper-6.4.2/Documentation/Docs/Units/ClipperLib/Functions/SimplifyPolygon.htm b/upstream/clipper-6.4.2/Documentation/Docs/Units/ClipperLib/Functions/SimplifyPolygon.htm
new file mode 100644
index 0000000..3462f82
--- /dev/null
+++ b/upstream/clipper-6.4.2/Documentation/Docs/Units/ClipperLib/Functions/SimplifyPolygon.htm
@@ -0,0 +1,75 @@
+<html>
+
+<head>
+
+ <script type="text/javascript" src="../../../../Scripts/jquery.js">
+ </script>
+
+ <script type="text/javascript" src="../../../../Scripts/SyntaxHighlighter/scripts/shCore.js">
+ </script>
+
+ <script type="text/javascript" src="../../../../Scripts/SyntaxHighlighter/scripts/shBrushDelphi.js">
+ </script>
+
+ <script type="text/javascript" src="../../../../Scripts/SyntaxHighlighter/scripts/shBrushCpp.js">
+ </script>
+
+ <script type="text/javascript" src="../../../../Scripts/SyntaxHighlighter/scripts/shBrushCSharp.js">
+ </script>
+
+ <link type="text/css" rel="stylesheet" href="../../../../Scripts/SyntaxHighlighter/styles/shCoreDefault.css">
+
+ <link type="text/css" rel="stylesheet" href="../../../../Scripts/SyntaxHighlighter/styles/shThemeDefault.css">
+
+
+ <title>SimplifyPolygon</title>
+
+ <link rel="stylesheet" href="../../../../Styles/default.css" type="text/css">
+
+
+ <script type="text/javascript" src="../../../../Scripts/bootstrap.js">
+ </script>
+
+</head>
+
+<body bgcolor="#FFFFFF">
+
+ <!-- THIS FILE HAS BEEN AUTOMATICALLY PROCESSED FROM A SOURCE COPY -->
+
+ <!-- DO NOT EDIT MANUALLY !!! -->
+
+ <table class="Banner" cellspacing="0" cellpadding="0" border="1" bordercolorlight="#303080" bordercolordark="#7070B0">
+ <tr>
+ <td class="Banner" nowrap=""><a href="../../../_Body.htm" class="Banner"><img src="../../../../Images/_Home.gif" align="absmiddle">Home</a>
+ </td>
+ <td class="Banner" nowrap=""><a href="../_Body.htm" class="Banner"><img src="../../../../Images/_Unit.gif" align="absmiddle">ClipperLib</a>
+ </td>
+ <td class="Banner" width="100%" align="right"><img src="../../../../Images/_Project_Logo.gif" align="absmiddle">
+ </td>
+ </tr>
+ </table>
+ <h1>SimplifyPolygon</h1>
+
+
+ <p class="Decl"><span class="Comment">Del.&raquo;</span> <b>function</b> SimplifyPolygon(<b>const</b> Poly: TPath; FillType: TPolyFillType = pftEvenOdd): TPaths;</p>
+
+ <p class="Decl2"><span class="Comment"> C++&nbsp;&raquo;</span> <b>void</b> SimplifyPolygon(<b>const</b> Path &amp;in_poly, Paths &amp;out_polys, <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;PolyFillType fillType = pftEvenOdd);</p>
+
+ <p class="Decl3"><span class="Comment">C#&nbsp;&nbsp;&raquo;</span> <b>public static</b> Paths SimplifyPolygon(Path poly, <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;PolyFillType fillType = PolyFillType.pftEvenOdd);</p>
+<br>
+
+
+ <p class="Body"> Removes self-intersections from the supplied polygon (by performing a boolean <em>union</em> operation using the nominated <a href="../Types/PolyFillType.htm">PolyFillType</a>).<br> Polygons with non-contiguous duplicate vertices (ie 'touching') will be split into two polygons.<br><br> <em>Note: There's currently no guarantee that polygons will be strictly simple since 'simplifying' is still a work in progress.</em><br><br> <img src="../../../../Images/simplify.png" alt="" border="0"><br> <img src="../../../../Images/simplify2.png" alt="" border="0"> <img src="../../../../Images/simplify3.png" alt="" border="0"> </p>
+
+
+
+
+
+ <h2 id="Auto-SeeAlso">See Also</h2>
+ <p class="Body"><a href="../Classes/Clipper/Properties/StrictlySimple.htm">Clipper.StrictlySimple</a>, <a href="CleanPolygon.htm">CleanPolygon</a>, <a href="../Types/Path.htm">Path</a>, <a href="../Types/PolyFillType.htm">PolyFillType</a></p>
+
+ <p class="Copyright" id="auto"> <br><br> Copyright &copy;2010-2014 Angus Johnson&nbsp; - &nbsp; Clipper 6.2.1 &nbsp; - &nbsp; Help file built on 1-November-2014 <br><br> </p>
+
+</body>
+
+</html> \ No newline at end of file
diff --git a/upstream/clipper-6.4.2/Documentation/Docs/Units/ClipperLib/Functions/SimplifyPolygons.htm b/upstream/clipper-6.4.2/Documentation/Docs/Units/ClipperLib/Functions/SimplifyPolygons.htm
new file mode 100644
index 0000000..69c791b
--- /dev/null
+++ b/upstream/clipper-6.4.2/Documentation/Docs/Units/ClipperLib/Functions/SimplifyPolygons.htm
@@ -0,0 +1,76 @@
+<html>
+
+<head>
+
+ <script type="text/javascript" src="../../../../Scripts/jquery.js">
+ </script>
+
+ <script type="text/javascript" src="../../../../Scripts/SyntaxHighlighter/scripts/shCore.js">
+ </script>
+
+ <script type="text/javascript" src="../../../../Scripts/SyntaxHighlighter/scripts/shBrushDelphi.js">
+ </script>
+
+ <script type="text/javascript" src="../../../../Scripts/SyntaxHighlighter/scripts/shBrushCpp.js">
+ </script>
+
+ <script type="text/javascript" src="../../../../Scripts/SyntaxHighlighter/scripts/shBrushCSharp.js">
+ </script>
+
+ <link type="text/css" rel="stylesheet" href="../../../../Scripts/SyntaxHighlighter/styles/shCoreDefault.css">
+
+ <link type="text/css" rel="stylesheet" href="../../../../Scripts/SyntaxHighlighter/styles/shThemeDefault.css">
+
+
+ <title>SimplifyPolygons</title>
+
+ <link rel="stylesheet" href="../../../../Styles/default.css" type="text/css">
+
+
+ <script type="text/javascript" src="../../../../Scripts/bootstrap.js">
+ </script>
+
+</head>
+
+<body bgcolor="#FFFFFF">
+
+ <!-- THIS FILE HAS BEEN AUTOMATICALLY PROCESSED FROM A SOURCE COPY -->
+
+ <!-- DO NOT EDIT MANUALLY !!! -->
+
+ <table class="Banner" cellspacing="0" cellpadding="0" border="1" bordercolorlight="#303080" bordercolordark="#7070B0">
+ <tr>
+ <td class="Banner" nowrap=""><a href="../../../_Body.htm" class="Banner"><img src="../../../../Images/_Home.gif" align="absmiddle">Home</a>
+ </td>
+ <td class="Banner" nowrap=""><a href="../_Body.htm" class="Banner"><img src="../../../../Images/_Unit.gif" align="absmiddle">ClipperLib</a>
+ </td>
+ <td class="Banner" width="100%" align="right"><img src="../../../../Images/_Project_Logo.gif" align="absmiddle">
+ </td>
+ </tr>
+ </table>
+ <h1>SimplifyPolygons</h1>
+
+
+ <p class="Decl"><span class="Comment">Del.&raquo;</span> <b>function</b> SimplifyPolygons(<b>const</b> polys: TPaths; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;FillType: TPolyFillType = pftEvenOdd): TPaths;</p>
+
+ <p class="Decl2"><span class="Comment"> C++&nbsp;&raquo;</span> <b>void</b> SimplifyPolygons(<b>const</b> Paths &amp;in_polys, Paths &amp;out_polys, <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;PolyFillType fillType = pftEvenOdd);</p>
+
+ <p class="Decl2"><span class="Comment"> C++&nbsp;&raquo;</span> <b>void</b> SimplifyPolygons(Paths &amp;polys, PolyFillType fillType = pftEvenOdd);</p>
+
+ <p class="Decl3"><span class="Comment">C#&nbsp;&nbsp;&raquo;</span> <b>public static</b> Polygons SimplifyPolygons(Paths polys, <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;PolyFillType fillType = PolyFillType.pftEvenOdd);</p>
+<br>
+
+
+ <p class="Body"> Removes self-intersections from the supplied polygons (by performing a boolean <em>union</em> operation using the nominated <a href="../Types/PolyFillType.htm">PolyFillType</a>).<br> Polygons with non-contiguous duplicate vertices (ie 'vertices are touching') will be split into two polygons.<br><br> C++ only: This function is overloaded. In the first definition, the <em>in_polys</em> and <em>out_polys</em> parameters can reference the same <em>Paths</em> object though in that case the calling code might be clearer if the second definition (accepting a single <em>Paths</em> parameter) is used.<br><br> <em>Note: There's currently no guarantee that polygons will be strictly simple since 'simplifying' is still a work in progress.</em><br><br> <img src="../../../../Images/simplify.png" alt="" border="0"><br> <img src="../../../../Images/simplify2.png" alt="" border="0"> <img src="../../../../Images/simplify3.png" alt="" border="0"> </p>
+
+
+
+
+ <h2 id="Auto-SeeAlso">See Also</h2>
+ <p class="Body"><a href="../Classes/Clipper/Properties/StrictlySimple.htm">Clipper.StrictlySimple</a>, <a href="CleanPolygons.htm">CleanPolygons</a>, <a href="../Types/PolyFillType.htm">PolyFillType</a></p>
+
+ <p class="Copyright" id="auto"> <br><br> Copyright &copy;2010-2014 Angus Johnson&nbsp; - &nbsp; Clipper 6.2.1 &nbsp; - &nbsp; Help file built on 1-November-2014 <br><br> </p>
+
+</body>
+
+</html> \ No newline at end of file
diff --git a/upstream/clipper-6.4.2/Documentation/Docs/Units/ClipperLib/Types/CInt.htm b/upstream/clipper-6.4.2/Documentation/Docs/Units/ClipperLib/Types/CInt.htm
new file mode 100644
index 0000000..1af7f15
--- /dev/null
+++ b/upstream/clipper-6.4.2/Documentation/Docs/Units/ClipperLib/Types/CInt.htm
@@ -0,0 +1,70 @@
+<html>
+
+<head>
+
+ <script type="text/javascript" src="../../../../Scripts/jquery.js">
+ </script>
+
+ <script type="text/javascript" src="../../../../Scripts/SyntaxHighlighter/scripts/shCore.js">
+ </script>
+
+ <script type="text/javascript" src="../../../../Scripts/SyntaxHighlighter/scripts/shBrushDelphi.js">
+ </script>
+
+ <script type="text/javascript" src="../../../../Scripts/SyntaxHighlighter/scripts/shBrushCpp.js">
+ </script>
+
+ <script type="text/javascript" src="../../../../Scripts/SyntaxHighlighter/scripts/shBrushCSharp.js">
+ </script>
+
+ <link type="text/css" rel="stylesheet" href="../../../../Scripts/SyntaxHighlighter/styles/shCoreDefault.css">
+
+ <link type="text/css" rel="stylesheet" href="../../../../Scripts/SyntaxHighlighter/styles/shThemeDefault.css">
+
+
+ <title>CInt</title>
+
+ <link rel="stylesheet" href="../../../../Styles/default.css" type="text/css">
+
+
+ <script type="text/javascript" src="../../../../Scripts/bootstrap.js">
+ </script>
+
+</head>
+
+<body bgcolor="#FFFFFF">
+
+ <!-- THIS FILE HAS BEEN AUTOMATICALLY PROCESSED FROM A SOURCE COPY -->
+
+ <!-- DO NOT EDIT MANUALLY !!! -->
+
+ <table class="Banner" cellspacing="0" cellpadding="0" border="1" bordercolorlight="#303080" bordercolordark="#7070B0">
+ <tr>
+ <td class="Banner" nowrap=""><a href="../../../_Body.htm" class="Banner"><img src="../../../../Images/_Home.gif" align="absmiddle">Home</a>
+ </td>
+ <td class="Banner" nowrap=""><a href="../_Body.htm" class="Banner"><img src="../../../../Images/_Unit.gif" align="absmiddle">ClipperLib</a>
+ </td>
+ <td class="Banner" width="100%" align="right"><img src="../../../../Images/_Project_Logo.gif" align="absmiddle">
+ </td>
+ </tr>
+ </table>
+ <h1>CInt</h1>
+
+
+ <p class="Decl">Del.&raquo;<br> {$IFDEF use_int32}<br> &nbsp;cInt = Int32;<br> {$ELSE}<br> &nbsp;&nbsp;cInt = Int64;<br> {$ENDIF}<br> </p>
+
+ <p class="Decl2">C++&nbsp;&raquo;<br> #ifdef use_int32<br> &nbsp;&nbsp;typedef int cInt;<br> #else<br> &nbsp;&nbsp;typedef signed long long cInt;<br> #endif </p>
+
+ <p class="Decl3">C#&nbsp;&nbsp;&raquo;<br> #if use_int32<br> &nbsp;&nbsp;using cInt = Int32;<br> #else<br> &nbsp;&nbsp;using cInt = Int64;<br> #endif </p>
+
+
+ <p class="Body"> <b>cInt</b> is the integer type used by the Clipper Library to represent vertex coordinate values. (See also <a href="./IntPoint.htm">IntPoint</a>.)<br><br> The library uses integers instead of floating point values to preserve <a href="http://www.mpi-inf.mpg.de/~kettner/pub/nonrobust_cgta_06.pdf" target="_blank">numerical robustness</a>. (Very early versions of the library used floating point coordinates, but it became apparent that floating point imprecision was always going to cause occasional errors.)<br><br> By default <b>cInt</b> represents a signed 64bit integer and polygon coordinates can have any value in the range &plusmn; 9.2e+18. This accommodates the scaling of floating point coordinate values to very large integers so that very high degrees of precision can be retained during clipping. However, if coordinate values can be kept within the range &plusmn; 3.0e+9, then by avoiding large integer math, a modest ~10% improvement in clipping performance is achieved.<br><br> If the preprocessor directive <a href="../PreProcessor/Defines.htm"><b>use_int32</b></a> is defined, cInt will represent a signed 32bit integer. This improves clipping performance by 20-30% but the trade-off is that coordinate values are restricted to the much narrower range of &plusmn; 46340. </p>
+
+ <h2 id="Auto-SeeAlso">See Also</h2>
+ <p class="Body"><a href="../PreProcessor/Defines.htm">Defines</a>, <a href="IntPoint.htm">IntPoint</a></p>
+
+ <p class="Copyright" id="auto"> <br><br> Copyright &copy;2010-2014 Angus Johnson&nbsp; - &nbsp; Clipper 6.2.1 &nbsp; - &nbsp; Help file built on 1-November-2014 <br><br> </p>
+
+</body>
+
+</html> \ No newline at end of file
diff --git a/upstream/clipper-6.4.2/Documentation/Docs/Units/ClipperLib/Types/ClipType.htm b/upstream/clipper-6.4.2/Documentation/Docs/Units/ClipperLib/Types/ClipType.htm
new file mode 100644
index 0000000..aabc455
--- /dev/null
+++ b/upstream/clipper-6.4.2/Documentation/Docs/Units/ClipperLib/Types/ClipType.htm
@@ -0,0 +1,100 @@
+<html>
+
+<head>
+
+ <script type="text/javascript" src="../../../../Scripts/jquery.js">
+ </script>
+
+ <script type="text/javascript" src="../../../../Scripts/SyntaxHighlighter/scripts/shCore.js">
+ </script>
+
+ <script type="text/javascript" src="../../../../Scripts/SyntaxHighlighter/scripts/shBrushDelphi.js">
+ </script>
+
+ <script type="text/javascript" src="../../../../Scripts/SyntaxHighlighter/scripts/shBrushCpp.js">
+ </script>
+
+ <script type="text/javascript" src="../../../../Scripts/SyntaxHighlighter/scripts/shBrushCSharp.js">
+ </script>
+
+ <link type="text/css" rel="stylesheet" href="../../../../Scripts/SyntaxHighlighter/styles/shCoreDefault.css">
+
+ <link type="text/css" rel="stylesheet" href="../../../../Scripts/SyntaxHighlighter/styles/shThemeDefault.css">
+
+
+ <title>ClipType</title>
+
+ <link rel="stylesheet" href="../../../../Styles/default.css" type="text/css">
+
+
+ <script type="text/javascript" src="../../../../Scripts/bootstrap.js">
+ </script>
+
+</head>
+
+<body bgcolor="#FFFFFF">
+
+ <!-- THIS FILE HAS BEEN AUTOMATICALLY PROCESSED FROM A SOURCE COPY -->
+
+ <!-- DO NOT EDIT MANUALLY !!! -->
+
+ <table class="Banner" cellspacing="0" cellpadding="0" border="1" bordercolorlight="#303080" bordercolordark="#7070B0">
+ <tr>
+ <td class="Banner" nowrap=""><a href="../../../_Body.htm" class="Banner"><img src="../../../../Images/_Home.gif" align="absmiddle">Home</a>
+ </td>
+ <td class="Banner" nowrap=""><a href="../_Body.htm" class="Banner"><img src="../../../../Images/_Unit.gif" align="absmiddle">ClipperLib</a>
+ </td>
+ <td class="Banner" width="100%" align="right"><img src="../../../../Images/_Project_Logo.gif" align="absmiddle">
+ </td>
+ </tr>
+ </table>
+ <h1>ClipType</h1>
+
+
+ <p class="Decl"><span class="Comment">Del.&raquo;</span> <b>type</b> TClipType = (ctIntersection, ctUnion, ctDifference, ctXor);</p>
+
+ <p class="Decl2"><span class="Comment">C++&nbsp;&raquo;</span> <b>enum </b>ClipType { ctIntersection, ctUnion, ctDifference, ctXor };</p>
+
+ <p class="Decl3"><span class="Comment">C#&nbsp;&nbsp;&raquo;</span> <b>public enum</b> ClipType { ctIntersection, ctUnion, ctDifference, ctXor };</p>
+<br>
+
+
+ <p class="Body"> There are four boolean operations - AND, OR, NOT &amp; XOR.<br><br> Given that subject and clip polygon brush 'filling' is defined both by their vertices and their respective <a href="./PolyFillType.htm">filling rules</a>, the four boolean operations can be applied to polygons to define new filling regions:
+ <ul>
+
+ <li>AND (intersection) - create regions where both subject <b>and</b> clip polygons are filled</li>
+
+ <li>OR (union) - create regions where <b>either</b> subject <b>or</b> clip polygons (or both) are filled</li>
+
+ <li>NOT (difference) - create regions where subject polygons are filled <b>except</b> where clip polygons are filled</li>
+
+ <li>XOR (exclusive or) - create regions where <b>either</b> subject <b>or</b> clip polygons are filled <b>but not</b> where <b>both</b> are filled</li>
+
+ </ul> <br> </p>
+
+
+ <p class="Body"> <img src="../../../../Images/cliptype.png" width="175" height="200" alt=""><br> <img src="../../../../Images/intersection.png" width="175" height="200" alt="">&nbsp; <img src="../../../../Images/union.png" width="175" height="200" alt="">&nbsp; <img src="../../../../Images/difference.png" width="175" height="200" alt="">&nbsp; <img src="../../../../Images/xor.png" width="175" height="200" alt=""><br><br> All polygon clipping is performed with a <a href="../Classes/Clipper/_Body.htm">Clipper</a> object with the specific boolean operation indicated by the <em>ClipType</em> parameter passed in its <a href="../Classes/Clipper/Methods/Execute.htm">Execute</a> method. </p><br>
+
+
+ <p class="Body"> With regard to <b>open</b> paths (polylines), clipping rules generally match those of closed paths (polygons).<br> However, when there are both polyline and polygon subjects, the following clipping rules apply:
+ <ul>
+
+ <li>union operations - polylines will be clipped by any overlapping polygons so that non-overlapped portions will be returned in the solution together with the union-ed polygons</li>
+
+ <li>intersection, difference and xor operations - polylines will be clipped only by 'clip' polygons and there will be not interaction between polylines and subject polygons.</li>
+
+ </ul> </p><br>
+
+
+ <p class="Body"> Example of clipping behaviour when mixing polyline and polygon subjects:<br> <img src="../../../../Images/line_clipping2.png"> </p>
+
+
+
+ <h2 id="Auto-SeeAlso">See Also</h2>
+ <p class="Body"><a href="../../../Overview/_Body.htm">Overview</a>, <a href="../Classes/Clipper/_Body.htm">Clipper</a>, <a href="../Classes/Clipper/Methods/Execute.htm">Clipper.Execute</a>, <a href="PolyFillType.htm">PolyFillType</a></p>
+
+ <p class="Copyright" id="auto"> <br><br> Copyright &copy;2010-2014 Angus Johnson&nbsp; - &nbsp; Clipper 6.2.1 &nbsp; - &nbsp; Help file built on 1-November-2014 <br><br> </p>
+
+</body>
+
+</html> \ No newline at end of file
diff --git a/upstream/clipper-6.4.2/Documentation/Docs/Units/ClipperLib/Types/EndType.htm b/upstream/clipper-6.4.2/Documentation/Docs/Units/ClipperLib/Types/EndType.htm
new file mode 100644
index 0000000..3c1f21d
--- /dev/null
+++ b/upstream/clipper-6.4.2/Documentation/Docs/Units/ClipperLib/Types/EndType.htm
@@ -0,0 +1,88 @@
+<html>
+
+<head>
+
+ <script type="text/javascript" src="../../../../Scripts/jquery.js">
+ </script>
+
+ <script type="text/javascript" src="../../../../Scripts/SyntaxHighlighter/scripts/shCore.js">
+ </script>
+
+ <script type="text/javascript" src="../../../../Scripts/SyntaxHighlighter/scripts/shBrushDelphi.js">
+ </script>
+
+ <script type="text/javascript" src="../../../../Scripts/SyntaxHighlighter/scripts/shBrushCpp.js">
+ </script>
+
+ <script type="text/javascript" src="../../../../Scripts/SyntaxHighlighter/scripts/shBrushCSharp.js">
+ </script>
+
+ <link type="text/css" rel="stylesheet" href="../../../../Scripts/SyntaxHighlighter/styles/shCoreDefault.css">
+
+ <link type="text/css" rel="stylesheet" href="../../../../Scripts/SyntaxHighlighter/styles/shThemeDefault.css">
+
+
+ <title>EndType</title>
+
+ <link rel="stylesheet" href="../../../../Styles/default.css" type="text/css">
+
+
+ <script type="text/javascript" src="../../../../Scripts/bootstrap.js">
+ </script>
+
+</head>
+
+<body bgcolor="#FFFFFF">
+
+ <!-- THIS FILE HAS BEEN AUTOMATICALLY PROCESSED FROM A SOURCE COPY -->
+
+ <!-- DO NOT EDIT MANUALLY !!! -->
+
+ <table class="Banner" cellspacing="0" cellpadding="0" border="1" bordercolorlight="#303080" bordercolordark="#7070B0">
+ <tr>
+ <td class="Banner" nowrap=""><a href="../../../_Body.htm" class="Banner"><img src="../../../../Images/_Home.gif" align="absmiddle">Home</a>
+ </td>
+ <td class="Banner" nowrap=""><a href="../_Body.htm" class="Banner"><img src="../../../../Images/_Unit.gif" align="absmiddle">ClipperLib</a>
+ </td>
+ <td class="Banner" width="100%" align="right"><img src="../../../../Images/_Project_Logo.gif" align="absmiddle">
+ </td>
+ </tr>
+ </table>
+ <h1>EndType</h1>
+
+ <p class="Decl"><span class="Comment">Del.&raquo;</span> <b>type</b> TEndType = (etClosedPolygon, etClosedLine, etOpenSquare, etOpenRound, etOpenButt);</p>
+
+ <p class="Decl2"><span class="Comment"> C++&nbsp;&raquo;</span> <b>enum</b> EndType {etClosedPolygon, etClosedLine, etOpenSquare, etOpenRound, etOpenButt};</p>
+
+ <p class="Decl3"><span class="Comment">C#&nbsp;&nbsp;&raquo;</span> <b>public enum</b> EndType {etClosedPolygon, etClosedLine, etOpenSquare, etOpenRound, etOpenButt};</p>
+<br>
+
+ <p class="Body"> The EndType enumerator has 5 values:
+ <ul>
+
+ <li><b>etClosedPolygon:</b> Ends are joined using the JoinType value and the path filled as a polygon</li>
+
+ <li><b>etClosedLine:</b> Ends are joined using the JoinType value and the path filled as a polyline</li>
+
+ <li><b>etOpenSquare:</b> Ends are <em>squared</em> off and extended <b>delta</b> units</li>
+
+ <li><b>etOpenRound:</b> Ends are <em>rounded</em> off and extended <b>delta</b> units</li>
+
+ <li><b>etOpenButt:</b> Ends are squared off with no extension.</li>
+
+ <li class="gray"><b>etOpenSingle:</b> Offsets an open path in a single direction. Planned for a future update.</li>
+
+ </ul> </p>
+
+
+ <p class="Body"> Note: With <em>etClosedPolygon</em> and <em>etClosedLine</em> types, the path closure will be the same regardless of whether or not the first and last vertices in the path match.<br><br> <img src="../../../../Images/endtypes1.png" alt="" border="0"><br> <img src="../../../../Images/endtypes2.png" alt="" border="0"><br> <br> </p>
+
+
+ <h2 id="Auto-SeeAlso">See Also</h2>
+ <p class="Body"><a href="../Classes/ClipperOffset/Methods/AddPath.htm">ClipperOffset.AddPath</a>, <a href="../Classes/ClipperOffset/Methods/AddPaths.htm">ClipperOffset.AddPaths</a></p>
+
+ <p class="Copyright" id="auto"> <br><br> Copyright &copy;2010-2014 Angus Johnson&nbsp; - &nbsp; Clipper 6.2.1 &nbsp; - &nbsp; Help file built on 1-November-2014 <br><br> </p>
+
+</body>
+
+</html> \ No newline at end of file
diff --git a/upstream/clipper-6.4.2/Documentation/Docs/Units/ClipperLib/Types/InitOptions.htm b/upstream/clipper-6.4.2/Documentation/Docs/Units/ClipperLib/Types/InitOptions.htm
new file mode 100644
index 0000000..0c41d2a
--- /dev/null
+++ b/upstream/clipper-6.4.2/Documentation/Docs/Units/ClipperLib/Types/InitOptions.htm
@@ -0,0 +1,75 @@
+<html>
+
+<head>
+
+ <script type="text/javascript" src="../../../../Scripts/jquery.js">
+ </script>
+
+ <script type="text/javascript" src="../../../../Scripts/SyntaxHighlighter/scripts/shCore.js">
+ </script>
+
+ <script type="text/javascript" src="../../../../Scripts/SyntaxHighlighter/scripts/shBrushDelphi.js">
+ </script>
+
+ <script type="text/javascript" src="../../../../Scripts/SyntaxHighlighter/scripts/shBrushCpp.js">
+ </script>
+
+ <script type="text/javascript" src="../../../../Scripts/SyntaxHighlighter/scripts/shBrushCSharp.js">
+ </script>
+
+ <link type="text/css" rel="stylesheet" href="../../../../Scripts/SyntaxHighlighter/styles/shCoreDefault.css">
+
+ <link type="text/css" rel="stylesheet" href="../../../../Scripts/SyntaxHighlighter/styles/shThemeDefault.css">
+
+
+ <title>InitOptions</title>
+
+ <link rel="stylesheet" href="../../../../Styles/default.css" type="text/css">
+
+
+ <script type="text/javascript" src="../../../../Scripts/bootstrap.js">
+ </script>
+
+</head>
+
+<body bgcolor="#FFFFFF">
+
+ <!-- THIS FILE HAS BEEN AUTOMATICALLY PROCESSED FROM A SOURCE COPY -->
+
+ <!-- DO NOT EDIT MANUALLY !!! -->
+
+ <table class="Banner" cellspacing="0" cellpadding="0" border="1" bordercolorlight="#303080" bordercolordark="#7070B0">
+ <tr>
+ <td class="Banner" nowrap=""><a href="../../../_Body.htm" class="Banner"><img src="../../../../Images/_Home.gif" align="absmiddle">Home</a>
+ </td>
+ <td class="Banner" nowrap=""><a href="../_Body.htm" class="Banner"><img src="../../../../Images/_Unit.gif" align="absmiddle">ClipperLib</a>
+ </td>
+ <td class="Banner" width="100%" align="right"><img src="../../../../Images/_Project_Logo.gif" align="absmiddle">
+ </td>
+ </tr>
+ </table>
+ <h1>InitOptions</h1>
+
+
+ <p class="Decl"><span class="Comment">Del.&raquo;</span> <b>type</b> TInitOption = (ioReverseSolution, ioStrictlySimple, ioPreserveCollinear);</p>
+
+ <p class="Decl2"><span class="Comment">C++&nbsp;&raquo;</span> <b>enum </b> InitOptions {<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ioReverseSolution &nbsp;= 1,<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ioStrictlySimple &nbsp;&nbsp;= 2,<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ioPreserveCollinear = 4};</p>
+
+ <p class="Decl3"><span class="Comment">C#&nbsp;&nbsp;&raquo;</span> public const int ioReverseSolution &nbsp;= 1;<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public const int ioStrictlySimple &nbsp;&nbsp;= 2;<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public const int ioPreserveCollinear = 4;</p>
+<br>
+
+
+ <p class="Body"> </p>
+
+
+
+
+
+ <h2 id="Auto-SeeAlso">See Also</h2>
+ <p class="Body"><a href="../Classes/Clipper/Methods/Constructor.htm">Clipper.Constructor</a>, <a href="../Classes/Clipper/Properties/PreserveCollinear.htm">Clipper.PreserveCollinear</a>, <a href="../Classes/Clipper/Properties/ReverseSolution.htm">Clipper.ReverseSolution</a>, <a href="../Classes/Clipper/Properties/StrictlySimple.htm">Clipper.StrictlySimple</a></p>
+
+ <p class="Copyright" id="auto"> <br><br> Copyright &copy;2010-2014 Angus Johnson&nbsp; - &nbsp; Clipper 6.2.1 &nbsp; - &nbsp; Help file built on 1-November-2014 <br><br> </p>
+
+</body>
+
+</html> \ No newline at end of file
diff --git a/upstream/clipper-6.4.2/Documentation/Docs/Units/ClipperLib/Types/IntPoint.htm b/upstream/clipper-6.4.2/Documentation/Docs/Units/ClipperLib/Types/IntPoint.htm
new file mode 100644
index 0000000..7fbb7ff
--- /dev/null
+++ b/upstream/clipper-6.4.2/Documentation/Docs/Units/ClipperLib/Types/IntPoint.htm
@@ -0,0 +1,73 @@
+<html>
+
+<head>
+
+ <script type="text/javascript" src="../../../../Scripts/jquery.js">
+ </script>
+
+ <script type="text/javascript" src="../../../../Scripts/SyntaxHighlighter/scripts/shCore.js">
+ </script>
+
+ <script type="text/javascript" src="../../../../Scripts/SyntaxHighlighter/scripts/shBrushDelphi.js">
+ </script>
+
+ <script type="text/javascript" src="../../../../Scripts/SyntaxHighlighter/scripts/shBrushCpp.js">
+ </script>
+
+ <script type="text/javascript" src="../../../../Scripts/SyntaxHighlighter/scripts/shBrushCSharp.js">
+ </script>
+
+ <link type="text/css" rel="stylesheet" href="../../../../Scripts/SyntaxHighlighter/styles/shCoreDefault.css">
+
+ <link type="text/css" rel="stylesheet" href="../../../../Scripts/SyntaxHighlighter/styles/shThemeDefault.css">
+
+
+ <title>IntPoint</title>
+
+ <link rel="stylesheet" href="../../../../Styles/default.css" type="text/css">
+
+
+ <script type="text/javascript" src="../../../../Scripts/bootstrap.js">
+ </script>
+
+</head>
+
+<body bgcolor="#FFFFFF">
+
+ <!-- THIS FILE HAS BEEN AUTOMATICALLY PROCESSED FROM A SOURCE COPY -->
+
+ <!-- DO NOT EDIT MANUALLY !!! -->
+
+ <table class="Banner" cellspacing="0" cellpadding="0" border="1" bordercolorlight="#303080" bordercolordark="#7070B0">
+ <tr>
+ <td class="Banner" nowrap=""><a href="../../../_Body.htm" class="Banner"><img src="../../../../Images/_Home.gif" align="absmiddle">Home</a>
+ </td>
+ <td class="Banner" nowrap=""><a href="../_Body.htm" class="Banner"><img src="../../../../Images/_Unit.gif" align="absmiddle">ClipperLib</a>
+ </td>
+ <td class="Banner" width="100%" align="right"><img src="../../../../Images/_Project_Logo.gif" align="absmiddle">
+ </td>
+ </tr>
+ </table>
+ <h1>IntPoint</h1>
+
+ <p class="Decl"><span class="Comment">Del.&raquo;</span> TIntPoint = <b>record</b> X, Y: <a href="./CInt.htm">cInt</a>; <b>end;</b></p>
+
+ <p class="Decl2"><span class="Comment">C++&nbsp;&raquo;</span> <b>struct</b> IntPoint { <a href="./CInt.htm">cInt</a> X; <a href="./CInt.htm">cInt</a> Y; <b>...</b> };</p>
+
+ <p class="Decl3"><span class="Comment">C#&nbsp;&nbsp;&raquo;</span> <b>public class</b> IntPoint { <b>public</b> <a href="./CInt.htm">cInt</a> X; { get; set; } <b>public</b> <a href="./CInt.htm">cInt</a> Y; { get; set; } <b>...</b> };</p>
+<br>
+
+
+ <p class="Body"> The <b>IntPoint</b> structure is used to represent all vertices in the Clipper Library. An <em>integer</em> storage type has been deliberately chosen to preserve <a href="http://www.mpi-inf.mpg.de/~kettner/pub/nonrobust_cgta_06.pdf" target="_blank"><b>numerical robustness</b></a>. (Early versions of the library used floating point coordinates, but it became apparent that floating point imprecision would always cause occasional errors.)<br><br> A sequence of IntPoints are contained within a <a href="./Path.htm">Path</a> structure to represent a single contour.<br><br> As of version 6, IntPoint now has <span class="maroon">an optional third member 'Z'</span>. This can be enabled by exposing (ie uncommenting) the PreProcessor define '<a href="../PreProcessor/Defines.htm"><b>use_xyz</b></a>'. When the Z member is used, its values will be copied to corresponding verticies in solutions to clipping operations. However, at points of intersection where there's no corresponding Z value, the value will be assigned zero unless a new value is provided by a user supplied <a href="../Classes/Clipper/Properties/ZFillFunction.htm"><b>callback function</b></a>.<br><br> Users wishing to clip or offset polygons containing <em>floating point</em> coordinates need to use appropriate scaling when converting these values to and from <em>IntPoints</em>.<br><br> See also the notes on <a href="../../../Overview/Rounding.htm">rounding</a>. </p>
+
+
+
+
+ <h2 id="Auto-SeeAlso">See Also</h2>
+ <p class="Body"><a href="../../../Overview/Rounding.htm">Rounding</a>, <a href="../Classes/Clipper/Properties/ZFillFunction.htm">Clipper.ZFillFunction</a>, <a href="../PreProcessor/Defines.htm">Defines</a>, <a href="CInt.htm">CInt</a>, <a href="Path.htm">Path</a>, <a href="Paths.htm">Paths</a></p>
+
+ <p class="Copyright" id="auto"> <br><br> Copyright &copy;2010-2014 Angus Johnson&nbsp; - &nbsp; Clipper 6.2.1 &nbsp; - &nbsp; Help file built on 1-November-2014 <br><br> </p>
+
+</body>
+
+</html> \ No newline at end of file
diff --git a/upstream/clipper-6.4.2/Documentation/Docs/Units/ClipperLib/Types/IntRect.htm b/upstream/clipper-6.4.2/Documentation/Docs/Units/ClipperLib/Types/IntRect.htm
new file mode 100644
index 0000000..baaa12b
--- /dev/null
+++ b/upstream/clipper-6.4.2/Documentation/Docs/Units/ClipperLib/Types/IntRect.htm
@@ -0,0 +1,69 @@
+<html>
+
+<head>
+
+ <script type="text/javascript" src="../../../../Scripts/jquery.js">
+ </script>
+
+ <script type="text/javascript" src="../../../../Scripts/SyntaxHighlighter/scripts/shCore.js">
+ </script>
+
+ <script type="text/javascript" src="../../../../Scripts/SyntaxHighlighter/scripts/shBrushDelphi.js">
+ </script>
+
+ <script type="text/javascript" src="../../../../Scripts/SyntaxHighlighter/scripts/shBrushCpp.js">
+ </script>
+
+ <script type="text/javascript" src="../../../../Scripts/SyntaxHighlighter/scripts/shBrushCSharp.js">
+ </script>
+
+ <link type="text/css" rel="stylesheet" href="../../../../Scripts/SyntaxHighlighter/styles/shCoreDefault.css">
+
+ <link type="text/css" rel="stylesheet" href="../../../../Scripts/SyntaxHighlighter/styles/shThemeDefault.css">
+
+
+ <title>IntRect</title>
+
+ <link rel="stylesheet" href="../../../../Styles/default.css" type="text/css">
+
+
+ <script type="text/javascript" src="../../../../Scripts/bootstrap.js">
+ </script>
+
+</head>
+
+<body bgcolor="#FFFFFF">
+
+ <!-- THIS FILE HAS BEEN AUTOMATICALLY PROCESSED FROM A SOURCE COPY -->
+
+ <!-- DO NOT EDIT MANUALLY !!! -->
+
+ <table class="Banner" cellspacing="0" cellpadding="0" border="1" bordercolorlight="#303080" bordercolordark="#7070B0">
+ <tr>
+ <td class="Banner" nowrap=""><a href="../../../_Body.htm" class="Banner"><img src="../../../../Images/_Home.gif" align="absmiddle">Home</a>
+ </td>
+ <td class="Banner" nowrap=""><a href="../_Body.htm" class="Banner"><img src="../../../../Images/_Unit.gif" align="absmiddle">ClipperLib</a>
+ </td>
+ <td class="Banner" width="100%" align="right"><img src="../../../../Images/_Project_Logo.gif" align="absmiddle">
+ </td>
+ </tr>
+ </table>
+ <h1>IntRect</h1>
+
+ <p class="Decl"><span class="Comment">Del.&raquo;</span><br> TIntRect = <b>record</b> left, top, right, bottom: <a href="./CInt.htm">cInt</a>; <b>end;</b></p>
+
+ <p class="Decl2"><span class="Comment">C++&nbsp;&raquo;</span><br> <b>struct</b> IntRect { <a href="./CInt.htm">cInt</a> left; <a href="./CInt.htm">cInt</a> top; <a href="./CInt.htm">cInt</a> right; <a href="./CInt.htm">cInt</a> bottom; <b>...</b> };</p>
+
+ <p class="Decl3"><span class="Comment">C#&nbsp;&nbsp;&raquo;</span><br> <b>public class</b> IntRect {<br> &nbsp;&nbsp;<b>public</b> <a href="./CInt.htm">cInt</a> left; { get; set; }<br> &nbsp;&nbsp;<b>public</b> <a href="./CInt.htm">cInt</a> top; { get; set; }<br> &nbsp;&nbsp;<b>public</b> <a href="./CInt.htm">cInt</a> right; { get; set; }<br> &nbsp;&nbsp;<b>public</b> <a href="./CInt.htm">cInt</a> bottom; { get; set; } <b>...</b> };</p>
+
+ <p class="Body">Structure returned by Clipper's <a href="../Classes\ClipperBase\Methods\GetBounds.htm">GetBounds</a> method.</p><br>
+
+
+ <h2 id="Auto-SeeAlso">See Also</h2>
+ <p class="Body"><a href="../Classes/ClipperBase/Methods/GetBounds.htm">ClipperBase.GetBounds</a>, <a href="CInt.htm">CInt</a></p>
+
+ <p class="Copyright" id="auto"> <br><br> Copyright &copy;2010-2014 Angus Johnson&nbsp; - &nbsp; Clipper 6.2.1 &nbsp; - &nbsp; Help file built on 1-November-2014 <br><br> </p>
+
+</body>
+
+</html> \ No newline at end of file
diff --git a/upstream/clipper-6.4.2/Documentation/Docs/Units/ClipperLib/Types/JoinType.htm b/upstream/clipper-6.4.2/Documentation/Docs/Units/ClipperLib/Types/JoinType.htm
new file mode 100644
index 0000000..1820138
--- /dev/null
+++ b/upstream/clipper-6.4.2/Documentation/Docs/Units/ClipperLib/Types/JoinType.htm
@@ -0,0 +1,78 @@
+<html>
+
+<head>
+
+ <script type="text/javascript" src="../../../../Scripts/jquery.js">
+ </script>
+
+ <script type="text/javascript" src="../../../../Scripts/SyntaxHighlighter/scripts/shCore.js">
+ </script>
+
+ <script type="text/javascript" src="../../../../Scripts/SyntaxHighlighter/scripts/shBrushDelphi.js">
+ </script>
+
+ <script type="text/javascript" src="../../../../Scripts/SyntaxHighlighter/scripts/shBrushCpp.js">
+ </script>
+
+ <script type="text/javascript" src="../../../../Scripts/SyntaxHighlighter/scripts/shBrushCSharp.js">
+ </script>
+
+ <link type="text/css" rel="stylesheet" href="../../../../Scripts/SyntaxHighlighter/styles/shCoreDefault.css">
+
+ <link type="text/css" rel="stylesheet" href="../../../../Scripts/SyntaxHighlighter/styles/shThemeDefault.css">
+
+
+ <title>JoinType</title>
+
+ <link rel="stylesheet" href="../../../../Styles/default.css" type="text/css">
+
+
+ <script type="text/javascript" src="../../../../Scripts/bootstrap.js">
+ </script>
+
+</head>
+
+<body bgcolor="#FFFFFF">
+
+ <!-- THIS FILE HAS BEEN AUTOMATICALLY PROCESSED FROM A SOURCE COPY -->
+
+ <!-- DO NOT EDIT MANUALLY !!! -->
+
+ <table class="Banner" cellspacing="0" cellpadding="0" border="1" bordercolorlight="#303080" bordercolordark="#7070B0">
+ <tr>
+ <td class="Banner" nowrap=""><a href="../../../_Body.htm" class="Banner"><img src="../../../../Images/_Home.gif" align="absmiddle">Home</a>
+ </td>
+ <td class="Banner" nowrap=""><a href="../_Body.htm" class="Banner"><img src="../../../../Images/_Unit.gif" align="absmiddle">ClipperLib</a>
+ </td>
+ <td class="Banner" width="100%" align="right"><img src="../../../../Images/_Project_Logo.gif" align="absmiddle">
+ </td>
+ </tr>
+ </table>
+ <h1>JoinType</h1>
+
+ <p class="Decl"><span class="Comment">Del.&raquo;</span> <b>type</b> TJoinType = (jtSquare, jtRound, jtMiter);</p>
+
+ <p class="Decl2"><span class="Comment"> C++&nbsp;&raquo;</span> <b>enum</b> JoinType {jtSquare, jtRound, jtMiter};</p>
+
+ <p class="Decl3"><span class="Comment">C#&nbsp;&nbsp;&raquo;</span> <b>public enum</b> JoinType {jtSquare, jtRound, jtMiter};</p>
+<br>
+
+ <p class="Body"> When adding paths to a <a href="../Classes/ClipperOffset/_Body.htm">ClipperOffset</a> object via the <a href="../Classes/ClipperOffset/Methods/AddPaths.htm">AddPaths</a> method, the joinType parameter may be one of three types - jtMiter, jtSquare or jtRound.<br><br> <img src="../../../../Images/jointypes.png" alt="" border="0"><br><br>
+ <ul>
+
+ <li>jtMiter: There's a necessary limit to mitered joins since offsetting edges that join at very acute angles will produce excessively long and narrow 'spikes'. To contain these potential spikes, the ClippOffset object's <a href="../Classes/ClipperOffset/Properties/MiterLimit.htm"><b>MiterLimit</b></a> property specifies a maximum distance that vertices will be offset <em>(in multiples of delta)</em>. For any given edge join, when miter offsetting would exceed that maximum distance, 'square' joining is applied.<br></li>
+
+ <li>jtRound: While flattened paths can never perfectly trace an arc, they are approximated by a series of arc chords (see ClipperObject's <a href="../Classes/ClipperOffset/Properties/ArcTolerance.htm"><b>ArcTolerance</b></a> property).<br></li>
+
+ <li>jtSquare: Squaring is applied uniformally at all convex edge joins at 1 &times; delta.</li>
+
+ </ul> </p>
+
+ <h2 id="Auto-SeeAlso">See Also</h2>
+ <p class="Body"><a href="../Classes/ClipperOffset/_Body.htm">ClipperOffset</a>, <a href="../Classes/ClipperOffset/Methods/AddPaths.htm">ClipperOffset.AddPaths</a>, <a href="../Classes/ClipperOffset/Properties/ArcTolerance.htm">ClipperOffset.ArcTolerance</a>, <a href="../Classes/ClipperOffset/Properties/MiterLimit.htm">ClipperOffset.MiterLimit</a></p>
+
+ <p class="Copyright" id="auto"> <br><br> Copyright &copy;2010-2014 Angus Johnson&nbsp; - &nbsp; Clipper 6.2.1 &nbsp; - &nbsp; Help file built on 1-November-2014 <br><br> </p>
+
+</body>
+
+</html> \ No newline at end of file
diff --git a/upstream/clipper-6.4.2/Documentation/Docs/Units/ClipperLib/Types/Path.htm b/upstream/clipper-6.4.2/Documentation/Docs/Units/ClipperLib/Types/Path.htm
new file mode 100644
index 0000000..f4d8748
--- /dev/null
+++ b/upstream/clipper-6.4.2/Documentation/Docs/Units/ClipperLib/Types/Path.htm
@@ -0,0 +1,69 @@
+<html>
+
+<head>
+
+ <script type="text/javascript" src="../../../../Scripts/jquery.js">
+ </script>
+
+ <script type="text/javascript" src="../../../../Scripts/SyntaxHighlighter/scripts/shCore.js">
+ </script>
+
+ <script type="text/javascript" src="../../../../Scripts/SyntaxHighlighter/scripts/shBrushDelphi.js">
+ </script>
+
+ <script type="text/javascript" src="../../../../Scripts/SyntaxHighlighter/scripts/shBrushCpp.js">
+ </script>
+
+ <script type="text/javascript" src="../../../../Scripts/SyntaxHighlighter/scripts/shBrushCSharp.js">
+ </script>
+
+ <link type="text/css" rel="stylesheet" href="../../../../Scripts/SyntaxHighlighter/styles/shCoreDefault.css">
+
+ <link type="text/css" rel="stylesheet" href="../../../../Scripts/SyntaxHighlighter/styles/shThemeDefault.css">
+
+
+ <title>Path</title>
+
+ <link rel="stylesheet" href="../../../../Styles/default.css" type="text/css">
+
+
+ <script type="text/javascript" src="../../../../Scripts/bootstrap.js">
+ </script>
+
+</head>
+
+<body bgcolor="#FFFFFF">
+
+ <!-- THIS FILE HAS BEEN AUTOMATICALLY PROCESSED FROM A SOURCE COPY -->
+
+ <!-- DO NOT EDIT MANUALLY !!! -->
+
+ <table class="Banner" cellspacing="0" cellpadding="0" border="1" bordercolorlight="#303080" bordercolordark="#7070B0">
+ <tr>
+ <td class="Banner" nowrap=""><a href="../../../_Body.htm" class="Banner"><img src="../../../../Images/_Home.gif" align="absmiddle">Home</a>
+ </td>
+ <td class="Banner" nowrap=""><a href="../_Body.htm" class="Banner"><img src="../../../../Images/_Unit.gif" align="absmiddle">ClipperLib</a>
+ </td>
+ <td class="Banner" width="100%" align="right"><img src="../../../../Images/_Project_Logo.gif" align="absmiddle">
+ </td>
+ </tr>
+ </table>
+ <h1>Path</h1>
+
+ <p class="Decl"><span class="Comment">Del.&raquo;</span> TPath = <b>array of</b> TIntPoint;</p>
+
+ <p class="Decl2"><span class="Comment">C++&nbsp;&raquo;</span> <b>typedef</b> std::vector&lt;IntPoint&gt; Path;</p>
+
+ <p class="Decl3"><span class="Comment">C#&nbsp;&nbsp;&raquo;</span> <b>using</b> Path = List&lt;IntPoint&gt;;</p>
+<br>
+
+ <p class="Body"> This structure contains a sequence of <a href="./IntPoint.htm">IntPoint</a> vertices defining <span class="maroon">a single contour</span> (see also <a href="../../../Overview/_Body.htm#terminology">terminology</a>). Paths may be <em>open</em> and represent a series of line segments bounded by 2 or more vertices, or they may be <em>closed</em> and represent polygons. Whether or not a path is open depends on context. <em>Closed</em> paths may be '<em>outer</em>' contours or '<em>hole</em>' contours. Which they are depends on orientation.<br><br> Multiple paths can be grouped into a <a href="./Paths.htm">Paths</a> structure.<br><br> </p>
+
+ <h2 id="Auto-SeeAlso">See Also</h2>
+ <p class="Body"><a href="../../../Overview/_Body.htm">Overview</a>, <a href="../../../Overview/Example.htm">Example</a>, <a href="../Classes/ClipperBase/Methods/AddPath.htm">ClipperBase.AddPath</a>, <a href="../Classes/PolyTree/_Body.htm">PolyTree</a>, <a href="../Functions/Orientation.htm">Orientation</a>, <a href="IntPoint.htm">IntPoint</a>, <a href="Paths.htm">Paths</a></p>
+
+ <p class="Copyright" id="auto"> <br><br> Copyright &copy;2010-2014 Angus Johnson&nbsp; - &nbsp; Clipper 6.2.1 &nbsp; - &nbsp; Help file built on 1-November-2014 <br><br> </p>
+
+</body>
+
+</html> \ No newline at end of file
diff --git a/upstream/clipper-6.4.2/Documentation/Docs/Units/ClipperLib/Types/Paths.htm b/upstream/clipper-6.4.2/Documentation/Docs/Units/ClipperLib/Types/Paths.htm
new file mode 100644
index 0000000..417b069
--- /dev/null
+++ b/upstream/clipper-6.4.2/Documentation/Docs/Units/ClipperLib/Types/Paths.htm
@@ -0,0 +1,76 @@
+<html>
+
+<head>
+
+ <script type="text/javascript" src="../../../../Scripts/jquery.js">
+ </script>
+
+ <script type="text/javascript" src="../../../../Scripts/SyntaxHighlighter/scripts/shCore.js">
+ </script>
+
+ <script type="text/javascript" src="../../../../Scripts/SyntaxHighlighter/scripts/shBrushDelphi.js">
+ </script>
+
+ <script type="text/javascript" src="../../../../Scripts/SyntaxHighlighter/scripts/shBrushCpp.js">
+ </script>
+
+ <script type="text/javascript" src="../../../../Scripts/SyntaxHighlighter/scripts/shBrushCSharp.js">
+ </script>
+
+ <link type="text/css" rel="stylesheet" href="../../../../Scripts/SyntaxHighlighter/styles/shCoreDefault.css">
+
+ <link type="text/css" rel="stylesheet" href="../../../../Scripts/SyntaxHighlighter/styles/shThemeDefault.css">
+
+
+ <title>Paths</title>
+
+ <link rel="stylesheet" href="../../../../Styles/default.css" type="text/css">
+
+
+ <script type="text/javascript" src="../../../../Scripts/bootstrap.js">
+ </script>
+
+</head>
+
+<body bgcolor="#FFFFFF">
+
+ <!-- THIS FILE HAS BEEN AUTOMATICALLY PROCESSED FROM A SOURCE COPY -->
+
+ <!-- DO NOT EDIT MANUALLY !!! -->
+
+ <table class="Banner" cellspacing="0" cellpadding="0" border="1" bordercolorlight="#303080" bordercolordark="#7070B0">
+ <tr>
+ <td class="Banner" nowrap=""><a href="../../../_Body.htm" class="Banner"><img src="../../../../Images/_Home.gif" align="absmiddle">Home</a>
+ </td>
+ <td class="Banner" nowrap=""><a href="../_Body.htm" class="Banner"><img src="../../../../Images/_Unit.gif" align="absmiddle">ClipperLib</a>
+ </td>
+ <td class="Banner" width="100%" align="right"><img src="../../../../Images/_Project_Logo.gif" align="absmiddle">
+ </td>
+ </tr>
+ </table>
+ <h1>Paths</h1>
+
+
+ <p class="Decl"><span class="Comment">Del.&raquo;</span> TPaths = <b>array of </b><a href="./Path.htm">TPath</a>;</p>
+
+ <p class="Decl2"><span class="Comment">C++&nbsp;&raquo;</span> <b>typedef</b> std::vector&lt; <a href="./Path.htm">Path</a> &gt; Paths;</p>
+
+ <p class="Decl3"><span class="Comment">C#&nbsp;&nbsp;&raquo;</span> <b>using</b> Paths = List&lt;List&lt; <a href="./IntPoint.htm">IntPoint</a> &gt;&gt;;</p>
+<br>
+
+ <p class="Body"> This structure is fundamental to the Clipper Library. It's a list or array of one or more <a href="./Path.htm">Path</a> structures. (The <em>Path</em> structure contains an ordered list of vertices that make a single contour.)<br><br> Paths may <em>open</em> (a series of line segments), or they may <em>closed</em> (polygons). Whether or not a path is <em>open</em> depends on context. <em>Closed</em> paths may be '<em>outer</em>' contours or '<em>hole</em>' contours. Which they are depends on orientation.<br><br> </p>
+<br>
+
+
+
+
+
+
+ <h2 id="Auto-SeeAlso">See Also</h2>
+ <p class="Body"><a href="../Classes/Clipper/Methods/Execute.htm">Clipper.Execute</a>, <a href="../Classes/ClipperBase/Methods/AddPath.htm">ClipperBase.AddPath</a>, <a href="../Classes/ClipperBase/Methods/AddPaths.htm">ClipperBase.AddPaths</a>, <a href="../Functions/OffsetPaths.htm">OffsetPaths</a>, <a href="IntPoint.htm">IntPoint</a>, <a href="Path.htm">Path</a></p>
+
+ <p class="Copyright" id="auto"> <br><br> Copyright &copy;2010-2014 Angus Johnson&nbsp; - &nbsp; Clipper 6.2.1 &nbsp; - &nbsp; Help file built on 1-November-2014 <br><br> </p>
+
+</body>
+
+</html> \ No newline at end of file
diff --git a/upstream/clipper-6.4.2/Documentation/Docs/Units/ClipperLib/Types/PolyFillType.htm b/upstream/clipper-6.4.2/Documentation/Docs/Units/ClipperLib/Types/PolyFillType.htm
new file mode 100644
index 0000000..7a2f93d
--- /dev/null
+++ b/upstream/clipper-6.4.2/Documentation/Docs/Units/ClipperLib/Types/PolyFillType.htm
@@ -0,0 +1,83 @@
+<html>
+
+<head>
+
+ <script type="text/javascript" src="../../../../Scripts/jquery.js">
+ </script>
+
+ <script type="text/javascript" src="../../../../Scripts/SyntaxHighlighter/scripts/shCore.js">
+ </script>
+
+ <script type="text/javascript" src="../../../../Scripts/SyntaxHighlighter/scripts/shBrushDelphi.js">
+ </script>
+
+ <script type="text/javascript" src="../../../../Scripts/SyntaxHighlighter/scripts/shBrushCpp.js">
+ </script>
+
+ <script type="text/javascript" src="../../../../Scripts/SyntaxHighlighter/scripts/shBrushCSharp.js">
+ </script>
+
+ <link type="text/css" rel="stylesheet" href="../../../../Scripts/SyntaxHighlighter/styles/shCoreDefault.css">
+
+ <link type="text/css" rel="stylesheet" href="../../../../Scripts/SyntaxHighlighter/styles/shThemeDefault.css">
+
+
+ <title>PolyFillType</title>
+
+ <link rel="stylesheet" href="../../../../Styles/default.css" type="text/css">
+
+
+ <script type="text/javascript" src="../../../../Scripts/bootstrap.js">
+ </script>
+
+</head>
+
+<body bgcolor="#FFFFFF">
+
+ <!-- THIS FILE HAS BEEN AUTOMATICALLY PROCESSED FROM A SOURCE COPY -->
+
+ <!-- DO NOT EDIT MANUALLY !!! -->
+
+ <table class="Banner" cellspacing="0" cellpadding="0" border="1" bordercolorlight="#303080" bordercolordark="#7070B0">
+ <tr>
+ <td class="Banner" nowrap=""><a href="../../../_Body.htm" class="Banner"><img src="../../../../Images/_Home.gif" align="absmiddle">Home</a>
+ </td>
+ <td class="Banner" nowrap=""><a href="../_Body.htm" class="Banner"><img src="../../../../Images/_Unit.gif" align="absmiddle">ClipperLib</a>
+ </td>
+ <td class="Banner" width="100%" align="right"><img src="../../../../Images/_Project_Logo.gif" align="absmiddle">
+ </td>
+ </tr>
+ </table>
+ <h1>PolyFillType</h1>
+
+
+ <p class="Decl"><span class="Comment">Del.&raquo;</span> <b>type</b> TPolyFillType = (pftEvenOdd, pftNonZero, pftPositive, pftNegative);</p>
+
+ <p class="Decl2"><span class="Comment">C++&nbsp;&raquo;</span> <b>enum</b> PolyFillType {pftEvenOdd, pftNonZero, pftPositive, pftNegative};</p>
+
+ <p class="Decl3"><span class="Comment">C#&nbsp;&nbsp;&raquo;</span> <b>public enum</b> PolyFillType {pftEvenOdd, pftNonZero, pftPositive, pftNegative};</p>
+<br>
+
+
+ <p class="Body"> <em>Filling</em> indicates those regions that are <em>inside</em> a closed path (ie 'filled' with a brush color or pattern in a graphical display) and those regions that are <em>outside</em>. The Clipper Library supports 4 filling rules: Even-Odd, Non-Zero, Positive and Negative.<br><br> The simplest filling rule is <em>Even-Odd</em> filling (sometimes called <em>alternate</em> filling). Given a group of closed paths start from a point outside the paths and progress along an imaginary line through the paths. When the first path is crossed the encountered region is filled. When the next path is crossed the encountered region is <em>not</em> filled. Likewise, each time a path is crossed, filling starts if it had stopped and stops if it had started.<br><br> With the exception of <em>Even-Odd</em> filling, all other filling rules rely on <b>edge direction</b> and <b>winding numbers</b> to determine filling. Edge direction is determined by the order in which vertices are declared when constructing a path. Edge direction is used to determine the <b>winding number</b> of each polygon subregion.<br><br> <img src="../../../../Images/wn.png" alt="" width="16" height="16" border="0" align="absmiddle"> The winding number for each polygon sub-region can be derived by: <ol>
+
+ <li>starting with a winding number of zero and</li>
+
+ <li>from a point (P1) that's outside all polygons, draw an imaginary line to a point that's inside a given sub-region (P2)</li>
+
+ <li>while traversing the line from P1 to P2, for each path that crosses the imaginary line from right to left increment the winding number, and for each path that crosses the line from left to right decrement the winding number.</li>
+
+ <li>Once you arrive at the given sub-region you have its winding number.</li>
+
+ </ol> </p>
+
+ <p class="Body"> <img src="../../../../Images/winding_number.png" alt="" width="720" height="250" border="0"><br> <b>Even-Odd (Alternate)</b>: Odd numbered sub-regions are filled, while even numbered sub-regions are not.<br> <b>Non-Zero (Winding)</b>: All non-zero sub-regions are filled.<br> <b>Positive</b>: All sub-regions with winding counts &gt; 0 are filled.<br> <b>Negative</b>: All sub-regions with winding counts &lt; 0 are filled.<br><br> Paths are added to a Clipper object using the <a href="../Classes/ClipperBase/Methods/AddPath.htm">AddPath</a> or <a href="../Classes/ClipperBase/Methods/AddPaths.htm">AddPaths</a> methods and the filling rules (for subject and clip polygons separately) are specified in the <a href="../Classes/Clipper/Methods/Execute.htm">Execute</a> method.<br><br> Polygon regions are defined by one or more closed paths which may or may not intersect. A single polygon region can be defined by a single non-intersecting path or by multiple non-intersecting paths where there's typically an 'outer' path and one or more inner 'hole' paths. Looking at the three shapes in the image above, the middle shape consists of two concentric rectangles sharing the same clockwise orientation. With even-odd filling, where orientation can be disregarded, the inner rectangle would create a hole in the outer rectangular polygon. There would be no hole with non-zero filling. In the concentric rectangles on the right, where the inner rectangle is orientated opposite to the outer, a hole will be rendered with either even-odd or non-zero filling. A single path can also define multiple subregions if it self-intersects as in the example of the 5 pointed star shape below.<br><br> <img src="../../../../Images/evenodd.png" alt="" width="175" height="200" border="0">&nbsp;&nbsp; <img src="../../../../Images/nonzero.png" alt="" width="175" height="200" border="0">&nbsp;&nbsp; <img src="../../../../Images/positive.png" alt="" width="175" height="200" border="0">&nbsp;&nbsp; <img src="../../../../Images/negative.png" alt="" width="175" height="200" border="0"><br><br> By far the most widely used fill rules are Even-Odd (aka Alternate) and Non-Zero (aka Winding). Most graphics rendering libraries (<a href="http://www.antigrain.com/__code/include/agg_basics.h.html#filling_rule_e">AGG</a>, <a href="http://developer.android.com/reference/android/graphics/Path.FillType.html">Android Graphics</a>, <a href="http://cairographics.org/manual/cairo-cairo-t.html#cairo-fill-rule-t">Cairo</a>, <a href="http://msdn.microsoft.com/en-us/library/windows/desktop/ms534120(v=vs.85).aspx">GDI+</a>, <a href="http://www.glprogramming.com/red/chapter11.html">OpenGL</a>, <a href="http://developer.apple.com/library/ios/#documentation/GraphicsImaging/Conceptual/drawingwithquartz2d/dq_paths/dq_paths.html#//apple_ref/doc/uid/TP30001066-CH211-TPXREF101">Quartz 2D</a> etc) and vector graphics storage formats (<a href="http://www.w3.org/TR/SVG/painting.html#FillRuleProperty">SVG</a>, Postscript, <a href="http://www.adobe.com/devnet-apps/photoshop/fileformatashtml/PhotoshopFileFormats.htm#50577409_17587">Photoshop</a> etc) support both these rules. However some libraries (eg Java's <a href="http://docs.oracle.com/javase/6/docs/api/java/awt/Graphics.html#fillPolygon(int[], int[], int)">Graphics2D</a>) only support one fill rule. <em>Android Graphics</em> and <em>OpenGL</em> are the only libraries (that I'm aware of) that support multiple filling rules.<br><br> It's useful to note that <em>edge direction</em> has no affect on a winding number's odd-ness or even-ness. (This is why <span class="maroon"><a href="../Functions/Orientation.htm">orientation</a> is ignored when the <em>Even-Odd</em> rule is employed.)</span><br><br> The direction of the Y-axis does affect polygon orientation and <em>edge direction</em>. However, changing Y-axis orientation will only change the <em>sign</em> of winding numbers, not their magnitudes, and has no effect on either <em>Even-Odd</em> or <em>Non-Zero</em> filling.<br><br> </p>
+
+ <h2 id="Auto-SeeAlso">See Also</h2>
+ <p class="Body"><a href="../Classes/Clipper/Methods/Execute.htm">Clipper.Execute</a>, <a href="../Classes/ClipperBase/Methods/AddPath.htm">ClipperBase.AddPath</a>, <a href="../Classes/ClipperBase/Methods/AddPaths.htm">ClipperBase.AddPaths</a>, <a href="../Functions/Orientation.htm">Orientation</a></p>
+
+ <p class="Copyright" id="auto"> <br><br> Copyright &copy;2010-2014 Angus Johnson&nbsp; - &nbsp; Clipper 6.2.1 &nbsp; - &nbsp; Help file built on 1-November-2014 <br><br> </p>
+
+</body>
+
+</html> \ No newline at end of file
diff --git a/upstream/clipper-6.4.2/Documentation/Docs/Units/ClipperLib/Types/PolyType.htm b/upstream/clipper-6.4.2/Documentation/Docs/Units/ClipperLib/Types/PolyType.htm
new file mode 100644
index 0000000..48fc46c
--- /dev/null
+++ b/upstream/clipper-6.4.2/Documentation/Docs/Units/ClipperLib/Types/PolyType.htm
@@ -0,0 +1,73 @@
+<html>
+
+<head>
+
+ <script type="text/javascript" src="../../../../Scripts/jquery.js">
+ </script>
+
+ <script type="text/javascript" src="../../../../Scripts/SyntaxHighlighter/scripts/shCore.js">
+ </script>
+
+ <script type="text/javascript" src="../../../../Scripts/SyntaxHighlighter/scripts/shBrushDelphi.js">
+ </script>
+
+ <script type="text/javascript" src="../../../../Scripts/SyntaxHighlighter/scripts/shBrushCpp.js">
+ </script>
+
+ <script type="text/javascript" src="../../../../Scripts/SyntaxHighlighter/scripts/shBrushCSharp.js">
+ </script>
+
+ <link type="text/css" rel="stylesheet" href="../../../../Scripts/SyntaxHighlighter/styles/shCoreDefault.css">
+
+ <link type="text/css" rel="stylesheet" href="../../../../Scripts/SyntaxHighlighter/styles/shThemeDefault.css">
+
+
+ <title>PolyType</title>
+
+ <link rel="stylesheet" href="../../../../Styles/default.css" type="text/css">
+
+
+ <script type="text/javascript" src="../../../../Scripts/bootstrap.js">
+ </script>
+
+</head>
+
+<body bgcolor="#FFFFFF">
+
+ <!-- THIS FILE HAS BEEN AUTOMATICALLY PROCESSED FROM A SOURCE COPY -->
+
+ <!-- DO NOT EDIT MANUALLY !!! -->
+
+ <table class="Banner" cellspacing="0" cellpadding="0" border="1" bordercolorlight="#303080" bordercolordark="#7070B0">
+ <tr>
+ <td class="Banner" nowrap=""><a href="../../../_Body.htm" class="Banner"><img src="../../../../Images/_Home.gif" align="absmiddle">Home</a>
+ </td>
+ <td class="Banner" nowrap=""><a href="../_Body.htm" class="Banner"><img src="../../../../Images/_Unit.gif" align="absmiddle">ClipperLib</a>
+ </td>
+ <td class="Banner" width="100%" align="right"><img src="../../../../Images/_Project_Logo.gif" align="absmiddle">
+ </td>
+ </tr>
+ </table>
+ <h1>PolyType</h1>
+
+
+ <p class="Decl"><span class="Comment">Del.&raquo;</span> <b>type</b> TPolyType = (ptSubject, ptClip);</p>
+
+ <p class="Decl2"><span class="Comment">C++&nbsp;&raquo;</span> <b>enum</b> PolyType { ptSubject, ptClip };</p>
+
+ <p class="Decl3"><span class="Comment">C#&nbsp;&nbsp;&raquo;</span> <b>public enum</b> PolyType { ptSubject, ptClip };</p>
+<br>
+
+ <p class="Body"> Boolean (clipping) operations are mostly applied to two sets of Polygons, represented in this library as <em>subject</em> and <em>clip</em> polygons. Whenever Polygons are added to the Clipper object, they must be assigned to either subject or clip polygons.<br><br> UNION operations can be performed on one set or both sets of polygons, but all other boolean operations require both sets of polygons to derive meaningful solutions.<br><br> </p>
+
+
+
+
+ <h2 id="Auto-SeeAlso">See Also</h2>
+ <p class="Body"><a href="../Classes/ClipperBase/Methods/AddPath.htm">ClipperBase.AddPath</a>, <a href="../Classes/ClipperBase/Methods/AddPaths.htm">ClipperBase.AddPaths</a>, <a href="ClipType.htm">ClipType</a></p>
+
+ <p class="Copyright" id="auto"> <br><br> Copyright &copy;2010-2014 Angus Johnson&nbsp; - &nbsp; Clipper 6.2.1 &nbsp; - &nbsp; Help file built on 1-November-2014 <br><br> </p>
+
+</body>
+
+</html> \ No newline at end of file
diff --git a/upstream/clipper-6.4.2/Documentation/Docs/Units/ClipperLib/Types/ZFillCallback.htm b/upstream/clipper-6.4.2/Documentation/Docs/Units/ClipperLib/Types/ZFillCallback.htm
new file mode 100644
index 0000000..95862c2
--- /dev/null
+++ b/upstream/clipper-6.4.2/Documentation/Docs/Units/ClipperLib/Types/ZFillCallback.htm
@@ -0,0 +1,71 @@
+<html>
+
+<head>
+
+ <script type="text/javascript" src="../../../../Scripts/jquery.js">
+ </script>
+
+ <script type="text/javascript" src="../../../../Scripts/SyntaxHighlighter/scripts/shCore.js">
+ </script>
+
+ <script type="text/javascript" src="../../../../Scripts/SyntaxHighlighter/scripts/shBrushDelphi.js">
+ </script>
+
+ <script type="text/javascript" src="../../../../Scripts/SyntaxHighlighter/scripts/shBrushCpp.js">
+ </script>
+
+ <script type="text/javascript" src="../../../../Scripts/SyntaxHighlighter/scripts/shBrushCSharp.js">
+ </script>
+
+ <link type="text/css" rel="stylesheet" href="../../../../Scripts/SyntaxHighlighter/styles/shCoreDefault.css">
+
+ <link type="text/css" rel="stylesheet" href="../../../../Scripts/SyntaxHighlighter/styles/shThemeDefault.css">
+
+
+ <title>ZFillCallback</title>
+
+ <link rel="stylesheet" href="../../../../Styles/default.css" type="text/css">
+
+
+ <script type="text/javascript" src="../../../../Scripts/bootstrap.js">
+ </script>
+
+</head>
+
+<body bgcolor="#FFFFFF">
+
+ <!-- THIS FILE HAS BEEN AUTOMATICALLY PROCESSED FROM A SOURCE COPY -->
+
+ <!-- DO NOT EDIT MANUALLY !!! -->
+
+ <table class="Banner" cellspacing="0" cellpadding="0" border="1" bordercolorlight="#303080" bordercolordark="#7070B0">
+ <tr>
+ <td class="Banner" nowrap=""><a href="../../../_Body.htm" class="Banner"><img src="../../../../Images/_Home.gif" align="absmiddle">Home</a>
+ </td>
+ <td class="Banner" nowrap=""><a href="../_Body.htm" class="Banner"><img src="../../../../Images/_Unit.gif" align="absmiddle">ClipperLib</a>
+ </td>
+ <td class="Banner" width="100%" align="right"><img src="../../../../Images/_Project_Logo.gif" align="absmiddle">
+ </td>
+ </tr>
+ </table>
+ <h1>ZFillCallback</h1>
+
+
+ <p class="Decl"><span class="Comment">Del.&raquo;</span> <b>type</b> TZFillCallback = <b>procedure</b> (<b>const</b> E1Bot, E1Top, E2Bot, E2Top: TIntPoint; <b>var</b> Pt: TIntPoint);</p>
+
+ <p class="Decl2"><span class="Comment">C++&nbsp;&raquo;</span> <b>typedef void</b> (*ZFillCallback)(const IntPoint&amp; e1bot, IntPoint&amp; e1top, IntPoint&amp; e2bot, IntPoint&amp; e2top, IntPoint&amp; pt);</p>
+
+ <p class="Decl3"><span class="Comment">C#&nbsp;&nbsp;&raquo;</span> <b>public delegate void</b> ZFillCallback(IntPoint bot1, IntPoint top1, IntPoint bot2, IntPoint top2, ref IntPoint pt);</p>
+<br>
+
+ <p class="Body"> If the <a href="../PreProcessor/Defines.htm"><b>use_xyz</b></a> pre-processor directive is enabled, then the IntPoint class will have an extra 'Z' member and the Clipper class's <a href="../Classes/Clipper/Properties/ZFillFunction.htm">ZFillFunction</a> property will be exposed so it can be assigned a custom callback function.<br><br> This custom callback procedure requires five IntPoint parameters: the first 2 parameters are the vertices that define one line segment involved in the intersection and the next two parameters the other line segment. <em>(Since the Clipper library has been developed in an environment that uses an inverted Y axis display, e1bot and e2bot will always have Y values greater than or equal to their corresponding e1top and e2top Y values.)</em> The last IntPoint parameter contain the actual coordinates at the intersection. This last parameter is passed by reference so that its Z member can be assigned with a custom value.<br><br> </p>
+
+
+ <h2 id="Auto-SeeAlso">See Also</h2>
+ <p class="Body"><a href="../Classes/Clipper/Properties/ZFillFunction.htm">Clipper.ZFillFunction</a>, <a href="../PreProcessor/Defines.htm">Defines</a></p>
+
+ <p class="Copyright" id="auto"> <br><br> Copyright &copy;2010-2014 Angus Johnson&nbsp; - &nbsp; Clipper 6.2.1 &nbsp; - &nbsp; Help file built on 1-November-2014 <br><br> </p>
+
+</body>
+
+</html> \ No newline at end of file
diff --git a/upstream/clipper-6.4.2/Documentation/Docs/Units/ClipperLib/_Body.htm b/upstream/clipper-6.4.2/Documentation/Docs/Units/ClipperLib/_Body.htm
new file mode 100644
index 0000000..8fd8877
--- /dev/null
+++ b/upstream/clipper-6.4.2/Documentation/Docs/Units/ClipperLib/_Body.htm
@@ -0,0 +1,188 @@
+<html>
+
+<head>
+
+ <script type="text/javascript" src="../../../Scripts/jquery.js">
+ </script>
+
+ <script type="text/javascript" src="../../../Scripts/SyntaxHighlighter/scripts/shCore.js">
+ </script>
+
+ <script type="text/javascript" src="../../../Scripts/SyntaxHighlighter/scripts/shBrushDelphi.js">
+ </script>
+
+ <script type="text/javascript" src="../../../Scripts/SyntaxHighlighter/scripts/shBrushCpp.js">
+ </script>
+
+ <script type="text/javascript" src="../../../Scripts/SyntaxHighlighter/scripts/shBrushCSharp.js">
+ </script>
+
+ <link type="text/css" rel="stylesheet" href="../../../Scripts/SyntaxHighlighter/styles/shCoreDefault.css">
+
+ <link type="text/css" rel="stylesheet" href="../../../Scripts/SyntaxHighlighter/styles/shThemeDefault.css">
+
+
+ <title>ClipperLib</title>
+
+ <link rel="stylesheet" href="../../../Styles/default.css" type="text/css">
+
+
+ <script type="text/javascript" src="../../../Scripts/bootstrap.js">
+ </script>
+
+</head>
+
+<body bgcolor="#FFFFFF">
+
+ <!-- THIS FILE HAS BEEN AUTOMATICALLY PROCESSED FROM A SOURCE COPY -->
+
+ <!-- DO NOT EDIT MANUALLY !!! -->
+
+ <table class="Banner" cellspacing="0" cellpadding="0" border="1" bordercolorlight="#303080" bordercolordark="#7070B0">
+ <tr>
+ <td class="Banner" nowrap=""><a href="../../_Body.htm" class="Banner"><img src="../../../Images/_Home.gif" align="absmiddle">Home</a>
+ </td>
+ <td class="Banner" width="100%" align="right"><img src="../../../Images/_Project_Logo.gif" align="absmiddle">
+ </td>
+ </tr>
+ </table>
+ <h1>ClipperLib</h1>
+
+
+ <p class="Body"> Filenames: clipper.pas; clipper.hpp and clipper.cpp; clipper.cs<br><br> Namespace: <b>ClipperLib</b> </p>
+
+
+ <h2 id="Auto-Contents">Contents</h2>
+ <table>
+ <tr><th>Types
+ </th><th>Classes
+ </th><th>Functions
+ </th>
+ </tr>
+ <tr>
+ <td><a href="Types/CInt.htm">CInt</a>
+ </td>
+ <td><a href="Classes/Clipper/_Body.htm">Clipper</a>
+ </td>
+ <td><a href="Functions/Area.htm">Area</a>
+ </td>
+ </tr>
+ <tr>
+ <td><a href="Types/ClipType.htm">ClipType</a>
+ </td>
+ <td><a href="Classes/ClipperBase/_Body.htm">ClipperBase</a>
+ </td>
+ <td><a href="Functions/CleanPolygon.htm">CleanPolygon</a>
+ </td>
+ </tr>
+ <tr>
+ <td><a href="Types/EndType.htm">EndType</a>
+ </td>
+ <td><a href="Classes/ClipperOffset/_Body.htm">ClipperOffset</a>
+ </td>
+ <td><a href="Functions/CleanPolygons.htm">CleanPolygons</a>
+ </td>
+ </tr>
+ <tr>
+ <td><a href="Types/InitOptions.htm">InitOptions</a>
+ </td>
+ <td><a href="Classes/PolyNode/_Body.htm">PolyNode</a>
+ </td>
+ <td><a href="Functions/ClosedPathsFromPolyTree.htm">ClosedPathsFromPolyTree</a>
+ </td>
+ </tr>
+ <tr>
+ <td><a href="Types/IntPoint.htm">IntPoint</a>
+ </td>
+ <td><a href="Classes/PolyTree/_Body.htm">PolyTree</a>
+ </td>
+ <td><a href="Functions/MinkowskiDiff.htm">MinkowskiDiff</a>
+ </td>
+ </tr>
+ <tr>
+ <td><a href="Types/IntRect.htm">IntRect</a>
+ </td>
+ <td>
+ </td>
+ <td><a href="Functions/MinkowskiSum.htm">MinkowskiSum</a>
+ </td>
+ </tr>
+ <tr>
+ <td><a href="Types/JoinType.htm">JoinType</a>
+ </td>
+ <td>
+ </td>
+ <td><a href="Functions/OffsetPaths.htm">OffsetPaths</a>
+ </td>
+ </tr>
+ <tr>
+ <td><a href="Types/Path.htm">Path</a>
+ </td>
+ <td>
+ </td>
+ <td><a href="Functions/OpenPathsFromPolyTree.htm">OpenPathsFromPolyTree</a>
+ </td>
+ </tr>
+ <tr>
+ <td><a href="Types/Paths.htm">Paths</a>
+ </td>
+ <td>
+ </td>
+ <td><a href="Functions/Orientation.htm">Orientation</a>
+ </td>
+ </tr>
+ <tr>
+ <td><a href="Types/PolyFillType.htm">PolyFillType</a>
+ </td>
+ <td>
+ </td>
+ <td><a href="Functions/PointInPolygon.htm">PointInPolygon</a>
+ </td>
+ </tr>
+ <tr>
+ <td><a href="Types/PolyType.htm">PolyType</a>
+ </td>
+ <td>
+ </td>
+ <td><a href="Functions/PolyTreeToPaths.htm">PolyTreeToPaths</a>
+ </td>
+ </tr>
+ <tr>
+ <td><a href="Types/ZFillCallback.htm">ZFillCallback</a>
+ </td>
+ <td>
+ </td>
+ <td><a href="Functions/ReversePath.htm">ReversePath</a>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ </td>
+ <td>
+ </td>
+ <td><a href="Functions/ReversePaths.htm">ReversePaths</a>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ </td>
+ <td>
+ </td>
+ <td><a href="Functions/SimplifyPolygon.htm">SimplifyPolygon</a>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ </td>
+ <td>
+ </td>
+ <td><a href="Functions/SimplifyPolygons.htm">SimplifyPolygons</a>
+ </td>
+ </tr>
+ </table>
+
+ <p class="Copyright" id="auto"> <br><br> Copyright &copy;2010-2014 Angus Johnson&nbsp; - &nbsp; Clipper 6.2.1 &nbsp; - &nbsp; Help file built on 1-November-2014 <br><br> </p>
+
+</body>
+
+</html> \ No newline at end of file
diff --git a/upstream/clipper-6.4.2/Documentation/Docs/_Body.htm b/upstream/clipper-6.4.2/Documentation/Docs/_Body.htm
new file mode 100644
index 0000000..16c5668
--- /dev/null
+++ b/upstream/clipper-6.4.2/Documentation/Docs/_Body.htm
@@ -0,0 +1,168 @@
+<html>
+
+<head>
+
+ <script type="text/javascript" src="../Scripts/jquery.js">
+ </script>
+
+ <script type="text/javascript" src="../Scripts/SyntaxHighlighter/scripts/shCore.js">
+ </script>
+
+ <script type="text/javascript" src="../Scripts/SyntaxHighlighter/scripts/shBrushDelphi.js">
+ </script>
+
+ <script type="text/javascript" src="../Scripts/SyntaxHighlighter/scripts/shBrushCpp.js">
+ </script>
+
+ <script type="text/javascript" src="../Scripts/SyntaxHighlighter/scripts/shBrushCSharp.js">
+ </script>
+
+ <link type="text/css" rel="stylesheet" href="../Scripts/SyntaxHighlighter/styles/shCoreDefault.css">
+
+ <link type="text/css" rel="stylesheet" href="../Scripts/SyntaxHighlighter/styles/shThemeDefault.css">
+
+
+ <title>Graphics32 Help</title>
+
+ <link rel="stylesheet" href="../Styles/default.css" type="text/css">
+
+ <meta name="Order" content="Overview, Units">
+
+
+ <script type="text/javascript" src="../Scripts/bootstrap.js">
+ </script>
+
+</head>
+
+<body bgcolor="#FFFFFF">
+
+ <!-- THIS FILE HAS BEEN AUTOMATICALLY PROCESSED FROM A SOURCE COPY -->
+
+ <!-- DO NOT EDIT MANUALLY !!! -->
+
+
+ <script language="JavaScript1.2" src="../Scripts/menu_data.js">
+ </script>
+
+ <script language="JavaScript1.2" src="../Scripts/menu_script.js">
+ </script>
+
+ <h1>The Clipper Library - Version 6</h1>
+
+ <table>
+ <tr>
+ <td><a href="Overview/_Body.htm">Library Overview</a>
+ </td>
+ <td><a href="Overview/Changes.htm">Changes</a>
+ </td>
+ <td><a href="Overview/Example.htm">Example</a>
+ </td>
+ <td><a href="Overview/FAQ.htm">FAQ</a>
+ </td>
+ <td><a href="Overview/Rounding.htm">Rounding</a>
+ </td>
+ <td><a href="Overview/Deprecated.htm">Deprecated</a>
+ </td>
+ <td><a href="Overview/License.htm">License</a>
+ </td>
+ </tr>
+ </table>
+ <table class="Home" cellpadding="0" cellspacing="0" border="0">
+ <tr>
+ <td class="Home" valign="Top">
+ </td>
+ <td class="Home" valign="Top">
+ <h2>Classes (Hierarchy)</h2>
+ <p Class="Tree"><img src="../Images/_BranchEmpty.gif" align="absmiddle" width="1" height="18"><a href="Units/ClipperLib/Classes/ClipperBase/_Body.htm"><img src="../Images/_Class.gif" align="absmiddle">&nbsp;ClipperBase</a></p>
+ <p Class="Tree"><img src="../Images/_BranchEmpty.gif" align="absmiddle" width="1" height="18"><img src="../Images/_BranchRight.gif" align="absmiddle"><a href="Units/ClipperLib/Classes/Clipper/_Body.htm"><img src="../Images/_Class.gif" align="absmiddle">&nbsp;Clipper</a></p>
+ <p Class="Tree"><img src="../Images/_BranchEmpty.gif" align="absmiddle" width="1" height="18"><a href="Units/ClipperLib/Classes/ClipperOffset/_Body.htm"><img src="../Images/_Class.gif" align="absmiddle">&nbsp;ClipperOffset</a></p>
+ <p Class="Tree"><img src="../Images/_BranchEmpty.gif" align="absmiddle" width="1" height="18"><a href="Units/ClipperLib/Classes/PolyNode/_Body.htm"><img src="../Images/_Class.gif" align="absmiddle">&nbsp;PolyNode</a></p>
+ <p Class="Tree"><img src="../Images/_BranchEmpty.gif" align="absmiddle" width="1" height="18"><img src="../Images/_BranchRight.gif" align="absmiddle"><a href="Units/ClipperLib/Classes/PolyTree/_Body.htm"><img src="../Images/_Class.gif" align="absmiddle">&nbsp;PolyTree</a></p>
+ </td>
+ </tr>
+ </table>
+ <h2 id="Auto-Types">Types</h2>
+ <table>
+ <tr>
+ <td><a href="Units/ClipperLib/Types/CInt.htm">CInt</a>
+ </td>
+ <td><a href="Units/ClipperLib/Types/InitOptions.htm">InitOptions</a>
+ </td>
+ <td><a href="Units/ClipperLib/Types/JoinType.htm">JoinType</a>
+ </td>
+ <td><a href="Units/ClipperLib/Types/PolyFillType.htm">PolyFillType</a>
+ </td>
+ </tr>
+ <tr>
+ <td><a href="Units/ClipperLib/Types/ClipType.htm">ClipType</a>
+ </td>
+ <td><a href="Units/ClipperLib/Types/IntPoint.htm">IntPoint</a>
+ </td>
+ <td><a href="Units/ClipperLib/Types/Path.htm">Path</a>
+ </td>
+ <td><a href="Units/ClipperLib/Types/PolyType.htm">PolyType</a>
+ </td>
+ </tr>
+ <tr>
+ <td><a href="Units/ClipperLib/Types/EndType.htm">EndType</a>
+ </td>
+ <td><a href="Units/ClipperLib/Types/IntRect.htm">IntRect</a>
+ </td>
+ <td><a href="Units/ClipperLib/Types/Paths.htm">Paths</a>
+ </td>
+ <td><a href="Units/ClipperLib/Types/ZFillCallback.htm">ZFillCallback</a>
+ </td>
+ </tr>
+ </table>
+ <h2 id="Auto-Functions">Functions</h2>
+ <table>
+ <tr>
+ <td><a href="Units/ClipperLib/Functions/Area.htm">Area</a>
+ </td>
+ <td><a href="Units/ClipperLib/Functions/ClosedPathsFromPolyTree.htm">ClosedPathsFromPolyTree</a>
+ </td>
+ <td><a href="Units/ClipperLib/Functions/OffsetPaths.htm">OffsetPaths</a>
+ </td>
+ <td><a href="Units/ClipperLib/Functions/PointInPolygon.htm">PointInPolygon</a>
+ </td>
+ <td><a href="Units/ClipperLib/Functions/ReversePaths.htm">ReversePaths</a>
+ </td>
+ </tr>
+ <tr>
+ <td><a href="Units/ClipperLib/Functions/CleanPolygon.htm">CleanPolygon</a>
+ </td>
+ <td><a href="Units/ClipperLib/Functions/MinkowskiDiff.htm">MinkowskiDiff</a>
+ </td>
+ <td><a href="Units/ClipperLib/Functions/OpenPathsFromPolyTree.htm">OpenPathsFromPolyTree</a>
+ </td>
+ <td><a href="Units/ClipperLib/Functions/PolyTreeToPaths.htm">PolyTreeToPaths</a>
+ </td>
+ <td><a href="Units/ClipperLib/Functions/SimplifyPolygon.htm">SimplifyPolygon</a>
+ </td>
+ </tr>
+ <tr>
+ <td><a href="Units/ClipperLib/Functions/CleanPolygons.htm">CleanPolygons</a>
+ </td>
+ <td><a href="Units/ClipperLib/Functions/MinkowskiSum.htm">MinkowskiSum</a>
+ </td>
+ <td><a href="Units/ClipperLib/Functions/Orientation.htm">Orientation</a>
+ </td>
+ <td><a href="Units/ClipperLib/Functions/ReversePath.htm">ReversePath</a>
+ </td>
+ <td><a href="Units/ClipperLib/Functions/SimplifyPolygons.htm">SimplifyPolygons</a>
+ </td>
+ </tr>
+ </table>
+ <h2 id="Auto-Units">Units</h2>
+ <table>
+ <tr>
+ <td><a href="Units/ClipperLib/_Body.htm">ClipperLib</a>
+ </td>
+ </tr>
+ </table>
+
+ <p class="Copyright" id="auto"> <br><br> Copyright &copy;2010-2014 Angus Johnson&nbsp; - &nbsp; Clipper 6.2.1 &nbsp; - &nbsp; Help file built on 1-November-2014 <br><br> </p>
+
+</body>
+
+</html> \ No newline at end of file
diff --git a/upstream/clipper-6.4.2/Documentation/Images/_BranchEmpty.gif b/upstream/clipper-6.4.2/Documentation/Images/_BranchEmpty.gif
new file mode 100644
index 0000000..1069e82
--- /dev/null
+++ b/upstream/clipper-6.4.2/Documentation/Images/_BranchEmpty.gif
Binary files differ
diff --git a/upstream/clipper-6.4.2/Documentation/Images/_BranchRight.gif b/upstream/clipper-6.4.2/Documentation/Images/_BranchRight.gif
new file mode 100644
index 0000000..e5622df
--- /dev/null
+++ b/upstream/clipper-6.4.2/Documentation/Images/_BranchRight.gif
Binary files differ
diff --git a/upstream/clipper-6.4.2/Documentation/Images/_BranchVert.gif b/upstream/clipper-6.4.2/Documentation/Images/_BranchVert.gif
new file mode 100644
index 0000000..b922f33
--- /dev/null
+++ b/upstream/clipper-6.4.2/Documentation/Images/_BranchVert.gif
Binary files differ
diff --git a/upstream/clipper-6.4.2/Documentation/Images/_BranchVertRight.gif b/upstream/clipper-6.4.2/Documentation/Images/_BranchVertRight.gif
new file mode 100644
index 0000000..ae0f3d1
--- /dev/null
+++ b/upstream/clipper-6.4.2/Documentation/Images/_BranchVertRight.gif
Binary files differ
diff --git a/upstream/clipper-6.4.2/Documentation/Images/_Class.gif b/upstream/clipper-6.4.2/Documentation/Images/_Class.gif
new file mode 100644
index 0000000..5e90e34
--- /dev/null
+++ b/upstream/clipper-6.4.2/Documentation/Images/_Class.gif
Binary files differ
diff --git a/upstream/clipper-6.4.2/Documentation/Images/_Home.gif b/upstream/clipper-6.4.2/Documentation/Images/_Home.gif
new file mode 100644
index 0000000..7ca8ba2
--- /dev/null
+++ b/upstream/clipper-6.4.2/Documentation/Images/_Home.gif
Binary files differ
diff --git a/upstream/clipper-6.4.2/Documentation/Images/_Project_Logo.gif b/upstream/clipper-6.4.2/Documentation/Images/_Project_Logo.gif
new file mode 100644
index 0000000..7e3baac
--- /dev/null
+++ b/upstream/clipper-6.4.2/Documentation/Images/_Project_Logo.gif
Binary files differ
diff --git a/upstream/clipper-6.4.2/Documentation/Images/_Unit.gif b/upstream/clipper-6.4.2/Documentation/Images/_Unit.gif
new file mode 100644
index 0000000..ef56412
--- /dev/null
+++ b/upstream/clipper-6.4.2/Documentation/Images/_Unit.gif
Binary files differ
diff --git a/upstream/clipper-6.4.2/Documentation/Images/_buttons.gif b/upstream/clipper-6.4.2/Documentation/Images/_buttons.gif
new file mode 100644
index 0000000..7daf3cd
--- /dev/null
+++ b/upstream/clipper-6.4.2/Documentation/Images/_buttons.gif
Binary files differ
diff --git a/upstream/clipper-6.4.2/Documentation/Images/clean1.png b/upstream/clipper-6.4.2/Documentation/Images/clean1.png
new file mode 100644
index 0000000..8caa45b
--- /dev/null
+++ b/upstream/clipper-6.4.2/Documentation/Images/clean1.png
Binary files differ
diff --git a/upstream/clipper-6.4.2/Documentation/Images/clean2.png b/upstream/clipper-6.4.2/Documentation/Images/clean2.png
new file mode 100644
index 0000000..0a922fb
--- /dev/null
+++ b/upstream/clipper-6.4.2/Documentation/Images/clean2.png
Binary files differ
diff --git a/upstream/clipper-6.4.2/Documentation/Images/clipper_rounding.png b/upstream/clipper-6.4.2/Documentation/Images/clipper_rounding.png
new file mode 100644
index 0000000..3134f77
--- /dev/null
+++ b/upstream/clipper-6.4.2/Documentation/Images/clipper_rounding.png
Binary files differ
diff --git a/upstream/clipper-6.4.2/Documentation/Images/clipper_rounding2.png b/upstream/clipper-6.4.2/Documentation/Images/clipper_rounding2.png
new file mode 100644
index 0000000..624a6ce
--- /dev/null
+++ b/upstream/clipper-6.4.2/Documentation/Images/clipper_rounding2.png
Binary files differ
diff --git a/upstream/clipper-6.4.2/Documentation/Images/clipper_rounding3.png b/upstream/clipper-6.4.2/Documentation/Images/clipper_rounding3.png
new file mode 100644
index 0000000..4db46f2
--- /dev/null
+++ b/upstream/clipper-6.4.2/Documentation/Images/clipper_rounding3.png
Binary files differ
diff --git a/upstream/clipper-6.4.2/Documentation/Images/clipper_rounding4.png b/upstream/clipper-6.4.2/Documentation/Images/clipper_rounding4.png
new file mode 100644
index 0000000..6ae5ad5
--- /dev/null
+++ b/upstream/clipper-6.4.2/Documentation/Images/clipper_rounding4.png
Binary files differ
diff --git a/upstream/clipper-6.4.2/Documentation/Images/cliptype.png b/upstream/clipper-6.4.2/Documentation/Images/cliptype.png
new file mode 100644
index 0000000..ce9ec4d
--- /dev/null
+++ b/upstream/clipper-6.4.2/Documentation/Images/cliptype.png
Binary files differ
diff --git a/upstream/clipper-6.4.2/Documentation/Images/common_edges.png b/upstream/clipper-6.4.2/Documentation/Images/common_edges.png
new file mode 100644
index 0000000..e8dfb0e
--- /dev/null
+++ b/upstream/clipper-6.4.2/Documentation/Images/common_edges.png
Binary files differ
diff --git a/upstream/clipper-6.4.2/Documentation/Images/difference.png b/upstream/clipper-6.4.2/Documentation/Images/difference.png
new file mode 100644
index 0000000..c2bce6c
--- /dev/null
+++ b/upstream/clipper-6.4.2/Documentation/Images/difference.png
Binary files differ
diff --git a/upstream/clipper-6.4.2/Documentation/Images/endtypes1.png b/upstream/clipper-6.4.2/Documentation/Images/endtypes1.png
new file mode 100644
index 0000000..7c49a7b
--- /dev/null
+++ b/upstream/clipper-6.4.2/Documentation/Images/endtypes1.png
Binary files differ
diff --git a/upstream/clipper-6.4.2/Documentation/Images/endtypes2.png b/upstream/clipper-6.4.2/Documentation/Images/endtypes2.png
new file mode 100644
index 0000000..15bed36
--- /dev/null
+++ b/upstream/clipper-6.4.2/Documentation/Images/endtypes2.png
Binary files differ
diff --git a/upstream/clipper-6.4.2/Documentation/Images/evenodd.png b/upstream/clipper-6.4.2/Documentation/Images/evenodd.png
new file mode 100644
index 0000000..d2069ee
--- /dev/null
+++ b/upstream/clipper-6.4.2/Documentation/Images/evenodd.png
Binary files differ
diff --git a/upstream/clipper-6.4.2/Documentation/Images/int.png b/upstream/clipper-6.4.2/Documentation/Images/int.png
new file mode 100644
index 0000000..7df1cea
--- /dev/null
+++ b/upstream/clipper-6.4.2/Documentation/Images/int.png
Binary files differ
diff --git a/upstream/clipper-6.4.2/Documentation/Images/intersection.png b/upstream/clipper-6.4.2/Documentation/Images/intersection.png
new file mode 100644
index 0000000..fd08dd0
--- /dev/null
+++ b/upstream/clipper-6.4.2/Documentation/Images/intersection.png
Binary files differ
diff --git a/upstream/clipper-6.4.2/Documentation/Images/jointypes.png b/upstream/clipper-6.4.2/Documentation/Images/jointypes.png
new file mode 100644
index 0000000..c431517
--- /dev/null
+++ b/upstream/clipper-6.4.2/Documentation/Images/jointypes.png
Binary files differ
diff --git a/upstream/clipper-6.4.2/Documentation/Images/kangaroo_small.png b/upstream/clipper-6.4.2/Documentation/Images/kangaroo_small.png
new file mode 100644
index 0000000..25b2df8
--- /dev/null
+++ b/upstream/clipper-6.4.2/Documentation/Images/kangaroo_small.png
Binary files differ
diff --git a/upstream/clipper-6.4.2/Documentation/Images/line_clipping.png b/upstream/clipper-6.4.2/Documentation/Images/line_clipping.png
new file mode 100644
index 0000000..8e1ad25
--- /dev/null
+++ b/upstream/clipper-6.4.2/Documentation/Images/line_clipping.png
Binary files differ
diff --git a/upstream/clipper-6.4.2/Documentation/Images/line_clipping2.png b/upstream/clipper-6.4.2/Documentation/Images/line_clipping2.png
new file mode 100644
index 0000000..244ac93
--- /dev/null
+++ b/upstream/clipper-6.4.2/Documentation/Images/line_clipping2.png
Binary files differ
diff --git a/upstream/clipper-6.4.2/Documentation/Images/linesdemo.png b/upstream/clipper-6.4.2/Documentation/Images/linesdemo.png
new file mode 100644
index 0000000..a24b09c
--- /dev/null
+++ b/upstream/clipper-6.4.2/Documentation/Images/linesdemo.png
Binary files differ
diff --git a/upstream/clipper-6.4.2/Documentation/Images/minkowski.png b/upstream/clipper-6.4.2/Documentation/Images/minkowski.png
new file mode 100644
index 0000000..f725d5c
--- /dev/null
+++ b/upstream/clipper-6.4.2/Documentation/Images/minkowski.png
Binary files differ
diff --git a/upstream/clipper-6.4.2/Documentation/Images/minkowski2.png b/upstream/clipper-6.4.2/Documentation/Images/minkowski2.png
new file mode 100644
index 0000000..de894cb
--- /dev/null
+++ b/upstream/clipper-6.4.2/Documentation/Images/minkowski2.png
Binary files differ
diff --git a/upstream/clipper-6.4.2/Documentation/Images/miterlimit.png b/upstream/clipper-6.4.2/Documentation/Images/miterlimit.png
new file mode 100644
index 0000000..a2b7262
--- /dev/null
+++ b/upstream/clipper-6.4.2/Documentation/Images/miterlimit.png
Binary files differ
diff --git a/upstream/clipper-6.4.2/Documentation/Images/negative.png b/upstream/clipper-6.4.2/Documentation/Images/negative.png
new file mode 100644
index 0000000..0272c50
--- /dev/null
+++ b/upstream/clipper-6.4.2/Documentation/Images/negative.png
Binary files differ
diff --git a/upstream/clipper-6.4.2/Documentation/Images/nonzero.png b/upstream/clipper-6.4.2/Documentation/Images/nonzero.png
new file mode 100644
index 0000000..5892a7c
--- /dev/null
+++ b/upstream/clipper-6.4.2/Documentation/Images/nonzero.png
Binary files differ
diff --git a/upstream/clipper-6.4.2/Documentation/Images/offset1.png b/upstream/clipper-6.4.2/Documentation/Images/offset1.png
new file mode 100644
index 0000000..9034c67
--- /dev/null
+++ b/upstream/clipper-6.4.2/Documentation/Images/offset1.png
Binary files differ
diff --git a/upstream/clipper-6.4.2/Documentation/Images/orientation.png b/upstream/clipper-6.4.2/Documentation/Images/orientation.png
new file mode 100644
index 0000000..be91023
--- /dev/null
+++ b/upstream/clipper-6.4.2/Documentation/Images/orientation.png
Binary files differ
diff --git a/upstream/clipper-6.4.2/Documentation/Images/polytree.png b/upstream/clipper-6.4.2/Documentation/Images/polytree.png
new file mode 100644
index 0000000..6a2e9b1
--- /dev/null
+++ b/upstream/clipper-6.4.2/Documentation/Images/polytree.png
Binary files differ
diff --git a/upstream/clipper-6.4.2/Documentation/Images/positive.png b/upstream/clipper-6.4.2/Documentation/Images/positive.png
new file mode 100644
index 0000000..b3ec4df
--- /dev/null
+++ b/upstream/clipper-6.4.2/Documentation/Images/positive.png
Binary files differ
diff --git a/upstream/clipper-6.4.2/Documentation/Images/sample1.png b/upstream/clipper-6.4.2/Documentation/Images/sample1.png
new file mode 100644
index 0000000..7c77a04
--- /dev/null
+++ b/upstream/clipper-6.4.2/Documentation/Images/sample1.png
Binary files differ
diff --git a/upstream/clipper-6.4.2/Documentation/Images/simplify.png b/upstream/clipper-6.4.2/Documentation/Images/simplify.png
new file mode 100644
index 0000000..30b0e76
--- /dev/null
+++ b/upstream/clipper-6.4.2/Documentation/Images/simplify.png
Binary files differ
diff --git a/upstream/clipper-6.4.2/Documentation/Images/simplify2.png b/upstream/clipper-6.4.2/Documentation/Images/simplify2.png
new file mode 100644
index 0000000..aa9bd78
--- /dev/null
+++ b/upstream/clipper-6.4.2/Documentation/Images/simplify2.png
Binary files differ
diff --git a/upstream/clipper-6.4.2/Documentation/Images/simplify3.png b/upstream/clipper-6.4.2/Documentation/Images/simplify3.png
new file mode 100644
index 0000000..8919e2b
--- /dev/null
+++ b/upstream/clipper-6.4.2/Documentation/Images/simplify3.png
Binary files differ
diff --git a/upstream/clipper-6.4.2/Documentation/Images/union.png b/upstream/clipper-6.4.2/Documentation/Images/union.png
new file mode 100644
index 0000000..6f7a3a6
--- /dev/null
+++ b/upstream/clipper-6.4.2/Documentation/Images/union.png
Binary files differ
diff --git a/upstream/clipper-6.4.2/Documentation/Images/winding_number.png b/upstream/clipper-6.4.2/Documentation/Images/winding_number.png
new file mode 100644
index 0000000..ea22d56
--- /dev/null
+++ b/upstream/clipper-6.4.2/Documentation/Images/winding_number.png
Binary files differ
diff --git a/upstream/clipper-6.4.2/Documentation/Images/wn.png b/upstream/clipper-6.4.2/Documentation/Images/wn.png
new file mode 100644
index 0000000..0fb0984
--- /dev/null
+++ b/upstream/clipper-6.4.2/Documentation/Images/wn.png
Binary files differ
diff --git a/upstream/clipper-6.4.2/Documentation/Images/xor.png b/upstream/clipper-6.4.2/Documentation/Images/xor.png
new file mode 100644
index 0000000..9468349
--- /dev/null
+++ b/upstream/clipper-6.4.2/Documentation/Images/xor.png
Binary files differ
diff --git a/upstream/clipper-6.4.2/Documentation/Images/zfill.png b/upstream/clipper-6.4.2/Documentation/Images/zfill.png
new file mode 100644
index 0000000..99a2e49
--- /dev/null
+++ b/upstream/clipper-6.4.2/Documentation/Images/zfill.png
Binary files differ
diff --git a/upstream/clipper-6.4.2/Documentation/Scripts/SyntaxHighlighter/compass/_theme_template.scss b/upstream/clipper-6.4.2/Documentation/Scripts/SyntaxHighlighter/compass/_theme_template.scss
new file mode 100644
index 0000000..53f4df5
--- /dev/null
+++ b/upstream/clipper-6.4.2/Documentation/Scripts/SyntaxHighlighter/compass/_theme_template.scss
@@ -0,0 +1,120 @@
+$background: white !default;
+
+$line_alt1_background: $background !default;
+$line_alt2_background: $background !default;
+
+$line_highlighted_background: #e0e0e0 !default;
+$line_highlighted_number: black !default;
+
+$gutter_text: #afafaf !default;
+$gutter_border_color: #6ce26c !default;
+$gutter_border: 3px solid $gutter_border_color !default;
+
+$toolbar_collapsed_a: #00f !default;
+$toolbar_collapsed_a_hover: #f00 !default;
+$toolbar_collapsed_background: #fff !default;
+$toolbar_collapsed_border: 1px solid $gutter_border_color !default;
+
+$toolbar_a: #fff !default;
+$toolbar_a_hover: #000 !default;
+$toolbar_background: $gutter_border_color !default;
+$toolbar_border: none !default;
+
+$code_plain: black !default;
+$code_comments: #008200 !default;
+$code_string: blue !default;
+$code_keyword: #006699 !default;
+$code_preprocessor: gray !default;
+$code_variable: #aa7700 !default;
+$code_value: #009900 !default;
+$code_functions: #ff1493 !default;
+$code_constants: #0066cc !default;
+$code_script: $code_keyword !default;
+$code_script_background: none !default;
+$code_color1: gray !default;
+$code_color2: #ff1493 !default;
+$code_color3: red !default;
+
+$caption_color: $code_plain !default;
+
+// Interface elements.
+.syntaxhighlighter {
+ background-color: $background !important;
+
+ // Highlighed line number
+ .line {
+ &.alt1 { background-color: $line_alt1_background !important; }
+ &.alt2 { background-color: $line_alt2_background !important; }
+
+ // Highlighed line
+ &.highlighted {
+ &.alt1, &.alt2 { background-color: $line_highlighted_background !important; }
+ &.number { color: $line_highlighted_number !important; }
+ }
+ }
+
+ table {
+ caption {
+ color: $caption_color !important;
+ }
+ }
+
+ // Add border to the lines
+ .gutter {
+ color: $gutter_text !important;
+ .line {
+ border-right: $gutter_border !important;
+
+ &.highlighted {
+ background-color: $gutter_border_color !important;
+ color: $background !important;
+ }
+ }
+ }
+
+ &.printing .line .content { border: none !important; }
+
+ &.collapsed {
+ overflow: visible !important;
+
+ .toolbar {
+ color: $toolbar_collapsed_a !important;
+ background: $toolbar_collapsed_background !important;
+ border: $toolbar_collapsed_border !important;
+
+ a {
+ color: $toolbar_collapsed_a !important;
+ &:hover { color: $toolbar_collapsed_a_hover !important; }
+ }
+ }
+ }
+
+ .toolbar {
+ color: $toolbar_a !important;
+ background: $toolbar_background !important;
+ border: $toolbar_border !important;
+ a {
+ color: $toolbar_a !important;
+ &:hover { color: $toolbar_a_hover !important; }
+ }
+ }
+
+ // Actual syntax highlighter colors.
+ .plain, .plain a { color: $code_plain !important; }
+ .comments, .comments a { color: $code_comments !important; }
+ .string, .string a { color: $code_string !important; }
+ .keyword { color: $code_keyword !important; }
+ .preprocessor { color: $code_preprocessor !important; }
+ .variable { color: $code_variable !important; }
+ .value { color: $code_value !important; }
+ .functions { color: $code_functions !important; }
+ .constants { color: $code_constants !important; }
+ .script {
+ font-weight: bold !important;
+ color: $code_script !important;
+ background-color: $code_script_background !important;
+ }
+ .color1, .color1 a { color: $code_color1 !important; }
+ .color2, .color2 a { color: $code_color2 !important; }
+ .color3, .color3 a { color: $code_color3 !important; }
+}
diff --git a/upstream/clipper-6.4.2/Documentation/Scripts/SyntaxHighlighter/compass/config.rb b/upstream/clipper-6.4.2/Documentation/Scripts/SyntaxHighlighter/compass/config.rb
new file mode 100644
index 0000000..6f82de1
--- /dev/null
+++ b/upstream/clipper-6.4.2/Documentation/Scripts/SyntaxHighlighter/compass/config.rb
@@ -0,0 +1,14 @@
+environment = :production
+project_type = :stand_alone
+http_path = "/"
+css_dir = "../styles"
+sass_dir = "."
+images_dir = "images"
+sass_options = {
+ :line_numbers => false,
+ :debug_info => false
+}
+
+# output_style = :compressed
+# output_style = :compact
+output_style = :expanded
diff --git a/upstream/clipper-6.4.2/Documentation/Scripts/SyntaxHighlighter/compass/shCore.scss b/upstream/clipper-6.4.2/Documentation/Scripts/SyntaxHighlighter/compass/shCore.scss
new file mode 100644
index 0000000..a67e4f9
--- /dev/null
+++ b/upstream/clipper-6.4.2/Documentation/Scripts/SyntaxHighlighter/compass/shCore.scss
@@ -0,0 +1,216 @@
+@mixin round_corners_custom($top, $right, $bottom, $left) {
+ -moz-border-radius: $top $right $bottom $left !important;
+ -webkit-border-radius: $top $right $bottom $left !important;
+}
+
+@mixin round_corners($radius) {
+ @include round_corners_custom($radius, $radius, $radius, $radius);
+}
+
+.syntaxhighlighter {
+ a,
+ div,
+ code,
+ table,
+ table td,
+ table tr,
+ table tbody,
+ table thead,
+ table caption,
+ textarea {
+ @include round_corners(0);
+
+ background: none !important;
+ border: 0 !important;
+ bottom: auto !important;
+ float: none !important;
+ height: auto !important;
+ left: auto !important;
+ line-height: 1.1em !important;
+ margin: 0 !important;
+ outline: 0 !important;
+ overflow: visible !important;
+ padding: 0 !important;
+ position: static !important;
+ right: auto !important;
+ text-align: left !important;
+ top: auto !important;
+ vertical-align: baseline !important;
+ width: auto !important;
+ box-sizing: content-box !important;
+ font: {
+ family: "Consolas", "Bitstream Vera Sans Mono", "Courier New", Courier, monospace !important;
+ weight: normal !important;
+ style: normal !important;
+ size: 1em !important;
+ }
+ min: {
+ // For IE8, FF & WebKit
+ height: inherit !important;
+ // For IE7
+ height: auto !important;
+ }
+ }
+}
+
+.syntaxhighlighter {
+ width: 100% !important;
+ margin: 1em 0 1em 0 !important;
+
+ position: relative !important;
+ overflow: auto !important;
+ font-size: 1em !important;
+
+ &.source { overflow: hidden !important; }
+
+ // set up bold and italic
+ .bold { font-weight: bold !important; }
+ .italic { font-style: italic !important; }
+
+ .line { white-space: pre !important; }
+
+ // main table and columns
+ table {
+ width: 100% !important;
+ caption {
+ text-align: left !important;
+ padding: .5em 0 0.5em 1em !important;
+ }
+
+ td.code {
+ width: 100% !important;
+
+ .container {
+ position: relative !important;
+
+ textarea {
+ box-sizing: border-box !important;
+ position: absolute !important;
+ left: 0 !important;
+ top: 0 !important;
+ width: 100% !important;
+ height: 100% !important;
+ border: none !important;
+ background: white !important;
+ padding-left: 1em !important;
+ overflow: hidden !important;
+ white-space: pre !important;
+ }
+ }
+ }
+
+ // middle spacing between line numbers and lines
+ td.gutter .line {
+ text-align: right !important;
+ padding: 0 0.5em 0 1em !important;
+ }
+
+ td.code .line {
+ padding: 0 1em !important;
+ }
+ }
+
+ &.nogutter {
+ td.code {
+ .container textarea, .line { padding-left: 0em !important; }
+ }
+ }
+
+ &.show { display: block !important; }
+
+ // Adjust some properties when collapsed
+ &.collapsed {
+ table { display: none !important; }
+
+ .toolbar {
+ padding: 0.1em 0.8em 0em 0.8em !important;
+ font-size: 1em !important;
+ position: static !important;
+ width: auto !important;
+ height: auto !important;
+
+ span {
+ display: inline !important;
+ margin-right: 1em !important;
+
+ a {
+ padding: 0 !important;
+ display: none !important;
+ &.expandSource { display: inline !important; }
+ }
+ }
+ }
+ }
+
+ // Styles for the toolbar
+ .toolbar {
+ position: absolute !important;
+ right: 1px !important;
+ top: 1px !important;
+ width: 11px !important;
+ height: 11px !important;
+ font-size: 10px !important;
+ z-index: 10 !important;
+
+ span.title { display: inline !important; }
+
+ a {
+ display: block !important;
+ text-align: center !important;
+ text-decoration: none !important;
+ padding-top: 1px !important;
+
+ &.expandSource { display: none !important; }
+ }
+ }
+
+ &.ie {
+ font-size: .9em !important;
+ padding: 1px 0 1px 0 !important;
+
+ .toolbar {
+ line-height: 8px !important;
+ a {
+ padding-top: 0px !important;
+ }
+ }
+ }
+
+ // Print view.
+ // Colors are based on the default theme without background.
+ &.printing {
+ .line.alt1 .content,
+ .line.alt2 .content,
+ .line.highlighted .number,
+ .line.highlighted.alt1 .content,
+ .line.highlighted.alt2 .content { background: none !important; }
+
+ // Gutter line numbers
+ .line {
+ .number { color: #bbbbbb !important; }
+ // Add border to the lines
+ .content { color: black !important; }
+ }
+
+ // Toolbar when visible
+ .toolbar { display: none !important; }
+ a { text-decoration: none !important; }
+ .plain, .plain a { color: black !important; }
+ .comments, .comments a { color: #008200 !important; }
+ .string, .string a { color: blue !important; }
+ .keyword {
+ color: #006699 !important;
+ font-weight: bold !important;
+ }
+ .preprocessor { color: gray !important; }
+ .variable { color: #aa7700 !important; }
+ .value { color: #009900 !important; }
+ .functions { color: #ff1493 !important; }
+ .constants { color: #0066cc !important; }
+ .script { font-weight: bold !important; }
+ .color1, .color1 a { color: gray !important; }
+ .color2, .color2 a { color: #ff1493 !important; }
+ .color3, .color3 a { color: red !important; }
+ .break, .break a { color: black !important; }
+ }
+} \ No newline at end of file
diff --git a/upstream/clipper-6.4.2/Documentation/Scripts/SyntaxHighlighter/compass/shCoreDefault.scss b/upstream/clipper-6.4.2/Documentation/Scripts/SyntaxHighlighter/compass/shCoreDefault.scss
new file mode 100644
index 0000000..ff80c7f
--- /dev/null
+++ b/upstream/clipper-6.4.2/Documentation/Scripts/SyntaxHighlighter/compass/shCoreDefault.scss
@@ -0,0 +1,2 @@
+@import "shCore.scss";
+@import "shThemeDefault.scss";
diff --git a/upstream/clipper-6.4.2/Documentation/Scripts/SyntaxHighlighter/compass/shCoreDjango.scss b/upstream/clipper-6.4.2/Documentation/Scripts/SyntaxHighlighter/compass/shCoreDjango.scss
new file mode 100644
index 0000000..ef572e9
--- /dev/null
+++ b/upstream/clipper-6.4.2/Documentation/Scripts/SyntaxHighlighter/compass/shCoreDjango.scss
@@ -0,0 +1,2 @@
+@import "shCore.scss";
+@import "shThemeDjango.scss";
diff --git a/upstream/clipper-6.4.2/Documentation/Scripts/SyntaxHighlighter/compass/shCoreEclipse.scss b/upstream/clipper-6.4.2/Documentation/Scripts/SyntaxHighlighter/compass/shCoreEclipse.scss
new file mode 100644
index 0000000..9767f53
--- /dev/null
+++ b/upstream/clipper-6.4.2/Documentation/Scripts/SyntaxHighlighter/compass/shCoreEclipse.scss
@@ -0,0 +1,2 @@
+@import "shCore.scss";
+@import "shThemeEclipse.scss";
diff --git a/upstream/clipper-6.4.2/Documentation/Scripts/SyntaxHighlighter/compass/shCoreEmacs.scss b/upstream/clipper-6.4.2/Documentation/Scripts/SyntaxHighlighter/compass/shCoreEmacs.scss
new file mode 100644
index 0000000..5e466f3
--- /dev/null
+++ b/upstream/clipper-6.4.2/Documentation/Scripts/SyntaxHighlighter/compass/shCoreEmacs.scss
@@ -0,0 +1,2 @@
+@import "shCore.scss";
+@import "shThemeEmacs.scss";
diff --git a/upstream/clipper-6.4.2/Documentation/Scripts/SyntaxHighlighter/compass/shCoreFadeToGrey.scss b/upstream/clipper-6.4.2/Documentation/Scripts/SyntaxHighlighter/compass/shCoreFadeToGrey.scss
new file mode 100644
index 0000000..4628595
--- /dev/null
+++ b/upstream/clipper-6.4.2/Documentation/Scripts/SyntaxHighlighter/compass/shCoreFadeToGrey.scss
@@ -0,0 +1,2 @@
+@import "shCore.scss";
+@import "shThemeFadeToGrey.scss";
diff --git a/upstream/clipper-6.4.2/Documentation/Scripts/SyntaxHighlighter/compass/shCoreMDUltra.scss b/upstream/clipper-6.4.2/Documentation/Scripts/SyntaxHighlighter/compass/shCoreMDUltra.scss
new file mode 100644
index 0000000..10ad4c5
--- /dev/null
+++ b/upstream/clipper-6.4.2/Documentation/Scripts/SyntaxHighlighter/compass/shCoreMDUltra.scss
@@ -0,0 +1,2 @@
+@import "shCore.scss";
+@import "shThemeMDUltra.scss";
diff --git a/upstream/clipper-6.4.2/Documentation/Scripts/SyntaxHighlighter/compass/shCoreMidnight.scss b/upstream/clipper-6.4.2/Documentation/Scripts/SyntaxHighlighter/compass/shCoreMidnight.scss
new file mode 100644
index 0000000..e357eb2
--- /dev/null
+++ b/upstream/clipper-6.4.2/Documentation/Scripts/SyntaxHighlighter/compass/shCoreMidnight.scss
@@ -0,0 +1,2 @@
+@import "shCore.scss";
+@import "shThemeMidnight.scss";
diff --git a/upstream/clipper-6.4.2/Documentation/Scripts/SyntaxHighlighter/compass/shCoreRDark.scss b/upstream/clipper-6.4.2/Documentation/Scripts/SyntaxHighlighter/compass/shCoreRDark.scss
new file mode 100644
index 0000000..5c26da3
--- /dev/null
+++ b/upstream/clipper-6.4.2/Documentation/Scripts/SyntaxHighlighter/compass/shCoreRDark.scss
@@ -0,0 +1,2 @@
+@import "shCore.scss";
+@import "shThemeRDark.scss";
diff --git a/upstream/clipper-6.4.2/Documentation/Scripts/SyntaxHighlighter/compass/shThemeDefault.scss b/upstream/clipper-6.4.2/Documentation/Scripts/SyntaxHighlighter/compass/shThemeDefault.scss
new file mode 100644
index 0000000..1574dae
--- /dev/null
+++ b/upstream/clipper-6.4.2/Documentation/Scripts/SyntaxHighlighter/compass/shThemeDefault.scss
@@ -0,0 +1,7 @@
+// Default Syntax Highlighter theme.
+
+@import "_theme_template.scss";
+
+.syntaxhighlighter {
+ .keyword { font-weight: bold !important; }
+}
diff --git a/upstream/clipper-6.4.2/Documentation/Scripts/SyntaxHighlighter/compass/shThemeDjango.scss b/upstream/clipper-6.4.2/Documentation/Scripts/SyntaxHighlighter/compass/shThemeDjango.scss
new file mode 100644
index 0000000..8e95c56
--- /dev/null
+++ b/upstream/clipper-6.4.2/Documentation/Scripts/SyntaxHighlighter/compass/shThemeDjango.scss
@@ -0,0 +1,36 @@
+// Django SyntaxHighlighter theme
+
+$background: #0a2b1d !default;
+
+$line_highlighted_background: #233729 !default;
+$line_highlighted_number: white !default;
+
+$gutter_text: #497958 !default;
+$gutter_border_color: #41a83e !default;
+
+$toolbar_collapsed_a: #96dd3b !default;
+$toolbar_collapsed_a_hover: #fff !default;
+$toolbar_collapsed_background: #000 !default;
+
+$toolbar_a: #fff !default;
+$toolbar_a_hover: #ffe862 !default;
+
+$code_plain: #f8f8f8 !default;
+$code_comments: #336442 !default;
+$code_string: #9df39f !default;
+$code_keyword: #96dd3b !default;
+$code_preprocessor: #91bb9e !default;
+$code_variable: #ffaa3e !default;
+$code_value: #f7e741 !default;
+$code_functions: #ffaa3e !default;
+$code_constants: #e0e8ff !default;
+$code_color1: #eb939a !default;
+$code_color2: #91bb9e !default;
+$code_color3: #edef7d !default;
+
+@import "_theme_template.scss";
+
+.syntaxhighlighter {
+ .comments { font-style: italic !important; }
+ .keyword { font-weight: bold !important; }
+}
diff --git a/upstream/clipper-6.4.2/Documentation/Scripts/SyntaxHighlighter/compass/shThemeEclipse.scss b/upstream/clipper-6.4.2/Documentation/Scripts/SyntaxHighlighter/compass/shThemeEclipse.scss
new file mode 100644
index 0000000..193fb1d
--- /dev/null
+++ b/upstream/clipper-6.4.2/Documentation/Scripts/SyntaxHighlighter/compass/shThemeEclipse.scss
@@ -0,0 +1,48 @@
+// Eclipse IDE SyntaxHighlighter color theme
+// (C) Code-House
+// :http//blog.code-house.org/2009/10/xml-i-adnotacje-kod-ogolnego-przeznaczenia-i-jpa/
+
+$background: #fff !default;
+
+$line_highlighted_background: #c3defe !default;
+$line_highlighted_number: #fff !default;
+
+$gutter_text: #787878 !default;
+$gutter_border_color: #d4d0c8 !default;
+
+$toolbar_collapsed_a: #3f5fbf !default;
+$toolbar_collapsed_a_hover: #aa7700 !default;
+$toolbar_collapsed_background: #fff !default;
+
+$toolbar_a: #a0a0a0 !default;
+$toolbar_a_hover: red !default;
+
+$code_plain: black !default;
+$code_comments: #3f5fbf !default;
+$code_string: #2a00ff !default;
+$code_keyword: #7f0055 !default;
+$code_preprocessor: #646464 !default;
+$code_variable: #aa7700 !default;
+$code_value: #009900 !default;
+$code_functions: #ff1493 !default;
+$code_constants: #0066cc !default;
+$code_color1: gray !default;
+$code_color2: #ff1493 !default;
+$code_color3: red !default;
+
+@import "_theme_template.scss";
+
+.syntaxhighlighter {
+ .keyword { font-weight: bold !important; }
+
+ .xml {
+ .keyword {
+ color: #3f7f7f !important;
+ font-weight: normal !important; }
+ .color1, .color1 a { color: #7f007f !important; }
+ .string {
+ font-style: italic !important;
+ color: #2a00ff !important;
+ }
+ }
+}
diff --git a/upstream/clipper-6.4.2/Documentation/Scripts/SyntaxHighlighter/compass/shThemeEmacs.scss b/upstream/clipper-6.4.2/Documentation/Scripts/SyntaxHighlighter/compass/shThemeEmacs.scss
new file mode 100644
index 0000000..11c9deb
--- /dev/null
+++ b/upstream/clipper-6.4.2/Documentation/Scripts/SyntaxHighlighter/compass/shThemeEmacs.scss
@@ -0,0 +1,32 @@
+// Emacs SyntaxHighlighter theme based on theme by Joshua Emmons
+// http://www.skia.net/
+
+$background: black !default;
+
+$line_highlighted_background: #2A3133 !default;
+$line_highlighted_number: white !default;
+
+$gutter_text: #d3d3d3 !default;
+$gutter_border_color: #990000 !default;
+
+$toolbar_collapsed_a: #ebdb8d !default;
+$toolbar_collapsed_a_hover: #ff7d27 !default;
+$toolbar_collapsed_background: black !default;
+
+$toolbar_a: #fff !default;
+$toolbar_a_hover: #9ccff4 !default;
+
+$code_plain: #d3d3d3 !default;
+$code_comments: #ff7d27 !default;
+$code_string: #ff9e7b !default;
+$code_keyword: aqua !default;
+$code_preprocessor: #aec4de !default;
+$code_variable: #ffaa3e !default;
+$code_value: #009900 !default;
+$code_functions: #81cef9 !default;
+$code_constants: #ff9e7b !default;
+$code_color1: #ebdb8d !default;
+$code_color2: #ff7d27 !default;
+$code_color3: #aec4de !default;
+
+@import "_theme_template.scss";
diff --git a/upstream/clipper-6.4.2/Documentation/Scripts/SyntaxHighlighter/compass/shThemeFadeToGrey.scss b/upstream/clipper-6.4.2/Documentation/Scripts/SyntaxHighlighter/compass/shThemeFadeToGrey.scss
new file mode 100644
index 0000000..7963814
--- /dev/null
+++ b/upstream/clipper-6.4.2/Documentation/Scripts/SyntaxHighlighter/compass/shThemeFadeToGrey.scss
@@ -0,0 +1,36 @@
+// Fade to Grey SyntaxHighlighter theme based on theme by Brasten Sager
+// :http//www.ibrasten.com/
+
+$background: #121212 !default;
+
+$line_highlighted_background: #2C2C29 !default;
+$line_highlighted_number: white !default;
+
+$gutter_text: #afafaf !default;
+$gutter_border_color: #3185b9 !default;
+
+$toolbar_collapsed_a: #3185b9 !default;
+$toolbar_collapsed_a_hover: #d01d33 !default;
+$toolbar_collapsed_background: black !default;
+
+$toolbar_a: #fff !default;
+$toolbar_a_hover: #96daff !default;
+
+$code_plain: white !default;
+$code_comments: #696854 !default;
+$code_string: #e3e658 !default;
+$code_keyword: #d01d33 !default;
+$code_preprocessor: #435a5f !default;
+$code_variable: #898989 !default;
+$code_value: #009900 !default;
+$code_functions: #aaaaaa !default;
+$code_constants: #96daff !default;
+$code_color1: #ffc074 !default;
+$code_color2: #4a8cdb !default;
+$code_color3: #96daff !default;
+
+@import "_theme_template.scss";
+
+.syntaxhighlighter {
+ .functions { font-weight: bold !important; }
+}
diff --git a/upstream/clipper-6.4.2/Documentation/Scripts/SyntaxHighlighter/compass/shThemeMDUltra.scss b/upstream/clipper-6.4.2/Documentation/Scripts/SyntaxHighlighter/compass/shThemeMDUltra.scss
new file mode 100644
index 0000000..0356fa6
--- /dev/null
+++ b/upstream/clipper-6.4.2/Documentation/Scripts/SyntaxHighlighter/compass/shThemeMDUltra.scss
@@ -0,0 +1,32 @@
+// MDUltra SyntaxHighlighter theme based on Midnight Theme
+// http://www.mddev.co.uk/
+
+$background: #222222 !default;
+
+$line_highlighted_background: #253e5a !default;
+$line_highlighted_number: white !default;
+
+$gutter_text: #38566f !default;
+$gutter_border_color: #435a5f !default;
+
+$toolbar_collapsed_a: #428bdd !default;
+$toolbar_collapsed_a_hover: lime !default;
+$toolbar_collapsed_background: black !default;
+
+$toolbar_a: #aaaaff !default;
+$toolbar_a_hover: #9ccff4 !default;
+
+$code_plain: lime !default;
+$code_comments: #428bdd !default;
+$code_string: lime !default;
+$code_keyword: #aaaaff !default;
+$code_preprocessor: #8aa6c1 !default;
+$code_variable: aqua !default;
+$code_value: #f7e741 !default;
+$code_functions: #ff8000 !default;
+$code_constants: yellow !default;
+$code_color1: red !default;
+$code_color2: yellow !default;
+$code_color3: #ffaa3e !default;
+
+@import "_theme_template.scss";
diff --git a/upstream/clipper-6.4.2/Documentation/Scripts/SyntaxHighlighter/compass/shThemeMidnight.scss b/upstream/clipper-6.4.2/Documentation/Scripts/SyntaxHighlighter/compass/shThemeMidnight.scss
new file mode 100644
index 0000000..a4dae02
--- /dev/null
+++ b/upstream/clipper-6.4.2/Documentation/Scripts/SyntaxHighlighter/compass/shThemeMidnight.scss
@@ -0,0 +1,32 @@
+// Midnight SyntaxHighlighter theme based on theme by J.D. Myers
+// http://webdesign.lsnjd.com/
+
+$background: #0f192a !default;
+
+$line_highlighted_background: #253e5a !default;
+$line_highlighted_number: #38566f !default;
+
+$gutter_text: #afafaf !default;
+$gutter_border_color: #435a5f !default;
+
+$toolbar_collapsed_a: #428bdd !default;
+$toolbar_collapsed_a_hover: #1dc116 !default;
+$toolbar_collapsed_background: #000 !default;
+
+$toolbar_a: #D1EDFF !default;
+$toolbar_a_hover: #8aa6c1 !default;
+
+$code_plain: #d1edff !default;
+$code_comments: #428bdd !default;
+$code_string: #1dc116 !default;
+$code_keyword: #b43d3d !default;
+$code_preprocessor: #8aa6c1 !default;
+$code_variable: #ffaa3e !default;
+$code_value: #f7e741 !default;
+$code_functions: #ffaa3e !default;
+$code_constants: #e0e8ff !default;
+$code_color1: #f8bb00 !default;
+$code_color2: white !default;
+$code_color3: #ffaa3e !default;
+
+@import "_theme_template.scss";
diff --git a/upstream/clipper-6.4.2/Documentation/Scripts/SyntaxHighlighter/compass/shThemeRDark.scss b/upstream/clipper-6.4.2/Documentation/Scripts/SyntaxHighlighter/compass/shThemeRDark.scss
new file mode 100644
index 0000000..3b67b15
--- /dev/null
+++ b/upstream/clipper-6.4.2/Documentation/Scripts/SyntaxHighlighter/compass/shThemeRDark.scss
@@ -0,0 +1,32 @@
+// RDark SyntaxHighlighter theme based on theme by Radu Dineiu
+// http://www.vim.org/scripts/script.php?script_id=1732
+
+$background: #1b2426 !default;
+
+$line_highlighted_background: #323E41 !default;
+$line_highlighted_number: #b9bdb6 !default;
+
+$gutter_text: #afafaf !default;
+$gutter_border_color: #435a5f !default;
+
+$toolbar_collapsed_a: #5ba1cf !default;
+$toolbar_collapsed_a_hover: #5ce638 !default;
+$toolbar_collapsed_background: #000 !default;
+
+$toolbar_a: #fff !default;
+$toolbar_a_hover: #e0e8ff !default;
+
+$code_plain: #b9bdb6 !default;
+$code_comments: #878a85 !default;
+$code_string: #5ce638 !default;
+$code_keyword: #5ba1cf !default;
+$code_preprocessor: #435a5f !default;
+$code_variable: #ffaa3e !default;
+$code_value: #009900 !default;
+$code_functions: #ffaa3e !default;
+$code_constants: #e0e8ff !default;
+$code_color1: #e0e8ff !default;
+$code_color2: white !default;
+$code_color3: #ffaa3e !default;
+
+@import "_theme_template.scss";
diff --git a/upstream/clipper-6.4.2/Documentation/Scripts/SyntaxHighlighter/index.html b/upstream/clipper-6.4.2/Documentation/Scripts/SyntaxHighlighter/index.html
new file mode 100644
index 0000000..60908f4
--- /dev/null
+++ b/upstream/clipper-6.4.2/Documentation/Scripts/SyntaxHighlighter/index.html
@@ -0,0 +1,22 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
+ <title>Hello SyntaxHighlighter</title>
+ <script type="text/javascript" src="scripts/shCore.js"></script>
+ <script type="text/javascript" src="scripts/shBrushJScript.js"></script>
+ <link type="text/css" rel="stylesheet" href="styles/shCoreDefault.css"/>
+ <script type="text/javascript">SyntaxHighlighter.all();</script>
+</head>
+
+<body style="background: white; font-family: Helvetica">
+
+<h1>Hello SyntaxHighlighter</h1>
+<pre class="brush: js;">
+function helloSyntaxHighlighter()
+{
+ return "hi!";
+}
+</pre>
+
+</html>
diff --git a/upstream/clipper-6.4.2/Documentation/Scripts/SyntaxHighlighter/scripts/shAutoloader.js b/upstream/clipper-6.4.2/Documentation/Scripts/SyntaxHighlighter/scripts/shAutoloader.js
new file mode 100644
index 0000000..4e29bdd
--- /dev/null
+++ b/upstream/clipper-6.4.2/Documentation/Scripts/SyntaxHighlighter/scripts/shAutoloader.js
@@ -0,0 +1,17 @@
+/**
+ * SyntaxHighlighter
+ * http://alexgorbatchev.com/SyntaxHighlighter
+ *
+ * SyntaxHighlighter is donationware. If you are using it, please donate.
+ * http://alexgorbatchev.com/SyntaxHighlighter/donate.html
+ *
+ * @version
+ * 3.0.83 (July 02 2010)
+ *
+ * @copyright
+ * Copyright (C) 2004-2010 Alex Gorbatchev.
+ *
+ * @license
+ * Dual licensed under the MIT and GPL licenses.
+ */
+eval(function(p,a,c,k,e,d){e=function(c){return(c<a?'':e(parseInt(c/a)))+((c=c%a)>35?String.fromCharCode(c+29):c.toString(36))};if(!''.replace(/^/,String)){while(c--){d[e(c)]=k[c]||e(c)}k=[function(e){return d[e]}];e=function(){return'\\w+'};c=1};while(c--){if(k[c]){p=p.replace(new RegExp('\\b'+e(c)+'\\b','g'),k[c])}}return p}('(2(){1 h=5;h.I=2(){2 n(c,a){4(1 d=0;d<c.9;d++)i[c[d]]=a}2 o(c){1 a=r.H("J"),d=3;a.K=c;a.M="L/t";a.G="t";a.u=a.v=2(){6(!d&&(!8.7||8.7=="F"||8.7=="z")){d=q;e[c]=q;a:{4(1 p y e)6(e[p]==3)B a;j&&5.C(k)}a.u=a.v=x;a.D.O(a)}};r.N.R(a)}1 f=Q,l=h.P(),i={},e={},j=3,k=x,b;5.T=2(c){k=c;j=q};4(b=0;b<f.9;b++){1 m=f[b].w?f[b]:f[b].S(/\\s+/),g=m.w();n(m,g)}4(b=0;b<l.9;b++)6(g=i[l[b].E.A]){e[g]=3;o(g)}}})();',56,56,'|var|function|false|for|SyntaxHighlighter|if|readyState|this|length|||||||||||||||||true|document||javascript|onload|onreadystatechange|pop|null|in|complete|brush|break|highlight|parentNode|params|loaded|language|createElement|autoloader|script|src|text|type|body|removeChild|findElements|arguments|appendChild|split|all'.split('|'),0,{}))
diff --git a/upstream/clipper-6.4.2/Documentation/Scripts/SyntaxHighlighter/scripts/shBrushAS3.js b/upstream/clipper-6.4.2/Documentation/Scripts/SyntaxHighlighter/scripts/shBrushAS3.js
new file mode 100644
index 0000000..8aa3ed2
--- /dev/null
+++ b/upstream/clipper-6.4.2/Documentation/Scripts/SyntaxHighlighter/scripts/shBrushAS3.js
@@ -0,0 +1,59 @@
+/**
+ * SyntaxHighlighter
+ * http://alexgorbatchev.com/SyntaxHighlighter
+ *
+ * SyntaxHighlighter is donationware. If you are using it, please donate.
+ * http://alexgorbatchev.com/SyntaxHighlighter/donate.html
+ *
+ * @version
+ * 3.0.83 (July 02 2010)
+ *
+ * @copyright
+ * Copyright (C) 2004-2010 Alex Gorbatchev.
+ *
+ * @license
+ * Dual licensed under the MIT and GPL licenses.
+ */
+;(function()
+{
+ // CommonJS
+ typeof(require) != 'undefined' ? SyntaxHighlighter = require('shCore').SyntaxHighlighter : null;
+
+ function Brush()
+ {
+ // Created by Peter Atoria @ http://iAtoria.com
+
+ var inits = 'class interface function package';
+
+ var keywords = '-Infinity ...rest Array as AS3 Boolean break case catch const continue Date decodeURI ' +
+ 'decodeURIComponent default delete do dynamic each else encodeURI encodeURIComponent escape ' +
+ 'extends false final finally flash_proxy for get if implements import in include Infinity ' +
+ 'instanceof int internal is isFinite isNaN isXMLName label namespace NaN native new null ' +
+ 'Null Number Object object_proxy override parseFloat parseInt private protected public ' +
+ 'return set static String super switch this throw true try typeof uint undefined unescape ' +
+ 'use void while with'
+ ;
+
+ this.regexList = [
+ { regex: SyntaxHighlighter.regexLib.singleLineCComments, css: 'comments' }, // one line comments
+ { regex: SyntaxHighlighter.regexLib.multiLineCComments, css: 'comments' }, // multiline comments
+ { regex: SyntaxHighlighter.regexLib.doubleQuotedString, css: 'string' }, // double quoted strings
+ { regex: SyntaxHighlighter.regexLib.singleQuotedString, css: 'string' }, // single quoted strings
+ { regex: /\b([\d]+(\.[\d]+)?|0x[a-f0-9]+)\b/gi, css: 'value' }, // numbers
+ { regex: new RegExp(this.getKeywords(inits), 'gm'), css: 'color3' }, // initializations
+ { regex: new RegExp(this.getKeywords(keywords), 'gm'), css: 'keyword' }, // keywords
+ { regex: new RegExp('var', 'gm'), css: 'variable' }, // variable
+ { regex: new RegExp('trace', 'gm'), css: 'color1' } // trace
+ ];
+
+ this.forHtmlScript(SyntaxHighlighter.regexLib.scriptScriptTags);
+ };
+
+ Brush.prototype = new SyntaxHighlighter.Highlighter();
+ Brush.aliases = ['actionscript3', 'as3'];
+
+ SyntaxHighlighter.brushes.AS3 = Brush;
+
+ // CommonJS
+ typeof(exports) != 'undefined' ? exports.Brush = Brush : null;
+})();
diff --git a/upstream/clipper-6.4.2/Documentation/Scripts/SyntaxHighlighter/scripts/shBrushAppleScript.js b/upstream/clipper-6.4.2/Documentation/Scripts/SyntaxHighlighter/scripts/shBrushAppleScript.js
new file mode 100644
index 0000000..d40bbd7
--- /dev/null
+++ b/upstream/clipper-6.4.2/Documentation/Scripts/SyntaxHighlighter/scripts/shBrushAppleScript.js
@@ -0,0 +1,75 @@
+/**
+ * SyntaxHighlighter
+ * http://alexgorbatchev.com/SyntaxHighlighter
+ *
+ * SyntaxHighlighter is donationware. If you are using it, please donate.
+ * http://alexgorbatchev.com/SyntaxHighlighter/donate.html
+ *
+ * @version
+ * 3.0.83 (July 02 2010)
+ *
+ * @copyright
+ * Copyright (C) 2004-2010 Alex Gorbatchev.
+ *
+ * @license
+ * Dual licensed under the MIT and GPL licenses.
+ */
+;(function()
+{
+ // CommonJS
+ typeof(require) != 'undefined' ? SyntaxHighlighter = require('shCore').SyntaxHighlighter : null;
+
+ function Brush()
+ {
+ // AppleScript brush by David Chambers
+ // http://davidchambersdesign.com/
+ var keywords = 'after before beginning continue copy each end every from return get global in local named of set some that the then times to where whose with without';
+ var ordinals = 'first second third fourth fifth sixth seventh eighth ninth tenth last front back middle';
+ var specials = 'activate add alias AppleScript ask attachment boolean class constant delete duplicate empty exists false id integer list make message modal modified new no paragraph pi properties quit real record remove rest result reveal reverse run running save string true word yes';
+
+ this.regexList = [
+
+ { regex: /(--|#).*$/gm,
+ css: 'comments' },
+
+ { regex: /\(\*(?:[\s\S]*?\(\*[\s\S]*?\*\))*[\s\S]*?\*\)/gm, // support nested comments
+ css: 'comments' },
+
+ { regex: /"[\s\S]*?"/gm,
+ css: 'string' },
+
+ { regex: /(?:,|:|¬|'s\b|\(|\)|\{|\}|«|\b\w*»)/g,
+ css: 'color1' },
+
+ { regex: /(-)?(\d)+(\.(\d)?)?(E\+(\d)+)?/g, // numbers
+ css: 'color1' },
+
+ { regex: /(?:&(amp;|gt;|lt;)?|=|� |>|<|≥|>=|≤|<=|\*|\+|-|\/|÷|\^)/g,
+ css: 'color2' },
+
+ { regex: /\b(?:and|as|div|mod|not|or|return(?!\s&)(ing)?|equals|(is(n't| not)? )?equal( to)?|does(n't| not) equal|(is(n't| not)? )?(greater|less) than( or equal( to)?)?|(comes|does(n't| not) come) (after|before)|is(n't| not)?( in)? (back|front) of|is(n't| not)? behind|is(n't| not)?( (in|contained by))?|does(n't| not) contain|contain(s)?|(start|begin|end)(s)? with|((but|end) )?(consider|ignor)ing|prop(erty)?|(a )?ref(erence)?( to)?|repeat (until|while|with)|((end|exit) )?repeat|((else|end) )?if|else|(end )?(script|tell|try)|(on )?error|(put )?into|(of )?(it|me)|its|my|with (timeout( of)?|transaction)|end (timeout|transaction))\b/g,
+ css: 'keyword' },
+
+ { regex: /\b\d+(st|nd|rd|th)\b/g, // ordinals
+ css: 'keyword' },
+
+ { regex: /\b(?:about|above|against|around|at|below|beneath|beside|between|by|(apart|aside) from|(instead|out) of|into|on(to)?|over|since|thr(ough|u)|under)\b/g,
+ css: 'color3' },
+
+ { regex: /\b(?:adding folder items to|after receiving|choose( ((remote )?application|color|folder|from list|URL))?|clipboard info|set the clipboard to|(the )?clipboard|entire contents|display(ing| (alert|dialog|mode))?|document( (edited|file|nib name))?|file( (name|type))?|(info )?for|giving up after|(name )?extension|quoted form|return(ed)?|second(?! item)(s)?|list (disks|folder)|text item(s| delimiters)?|(Unicode )?text|(disk )?item(s)?|((current|list) )?view|((container|key) )?window|with (data|icon( (caution|note|stop))?|parameter(s)?|prompt|properties|seed|title)|case|diacriticals|hyphens|numeric strings|punctuation|white space|folder creation|application(s( folder)?| (processes|scripts position|support))?|((desktop )?(pictures )?|(documents|downloads|favorites|home|keychain|library|movies|music|public|scripts|sites|system|users|utilities|workflows) )folder|desktop|Folder Action scripts|font(s| panel)?|help|internet plugins|modem scripts|(system )?preferences|printer descriptions|scripting (additions|components)|shared (documents|libraries)|startup (disk|items)|temporary items|trash|on server|in AppleTalk zone|((as|long|short) )?user name|user (ID|locale)|(with )?password|in (bundle( with identifier)?|directory)|(close|open for) access|read|write( permission)?|(g|s)et eof|using( delimiters)?|starting at|default (answer|button|color|country code|entr(y|ies)|identifiers|items|name|location|script editor)|hidden( answer)?|open(ed| (location|untitled))?|error (handling|reporting)|(do( shell)?|load|run|store) script|administrator privileges|altering line endings|get volume settings|(alert|boot|input|mount|output|set) volume|output muted|(fax|random )?number|round(ing)?|up|down|toward zero|to nearest|as taught in school|system (attribute|info)|((AppleScript( Studio)?|system) )?version|(home )?directory|(IPv4|primary Ethernet) address|CPU (type|speed)|physical memory|time (stamp|to GMT)|replacing|ASCII (character|number)|localized string|from table|offset|summarize|beep|delay|say|(empty|multiple) selections allowed|(of|preferred) type|invisibles|showing( package contents)?|editable URL|(File|FTP|News|Media|Web) [Ss]ervers|Telnet hosts|Directory services|Remote applications|waiting until completion|saving( (in|to))?|path (for|to( (((current|frontmost) )?application|resource))?)|POSIX (file|path)|(background|RGB) color|(OK|cancel) button name|cancel button|button(s)?|cubic ((centi)?met(re|er)s|yards|feet|inches)|square ((kilo)?met(re|er)s|miles|yards|feet)|(centi|kilo)?met(re|er)s|miles|yards|feet|inches|lit(re|er)s|gallons|quarts|(kilo)?grams|ounces|pounds|degrees (Celsius|Fahrenheit|Kelvin)|print( (dialog|settings))?|clos(e(able)?|ing)|(de)?miniaturized|miniaturizable|zoom(ed|able)|attribute run|action (method|property|title)|phone|email|((start|end)ing|home) page|((birth|creation|current|custom|modification) )?date|((((phonetic )?(first|last|middle))|computer|host|maiden|related) |nick)?name|aim|icq|jabber|msn|yahoo|address(es)?|save addressbook|should enable action|city|country( code)?|formatte(r|d address)|(palette )?label|state|street|zip|AIM [Hh]andle(s)?|my card|select(ion| all)?|unsaved|(alpha )?value|entr(y|ies)|group|(ICQ|Jabber|MSN) handle|person|people|company|department|icon image|job title|note|organization|suffix|vcard|url|copies|collating|pages (across|down)|request print time|target( printer)?|((GUI Scripting|Script menu) )?enabled|show Computer scripts|(de)?activated|awake from nib|became (key|main)|call method|of (class|object)|center|clicked toolbar item|closed|for document|exposed|(can )?hide|idle|keyboard (down|up)|event( (number|type))?|launch(ed)?|load (image|movie|nib|sound)|owner|log|mouse (down|dragged|entered|exited|moved|up)|move|column|localization|resource|script|register|drag (info|types)|resigned (active|key|main)|resiz(e(d)?|able)|right mouse (down|dragged|up)|scroll wheel|(at )?index|should (close|open( untitled)?|quit( after last window closed)?|zoom)|((proposed|screen) )?bounds|show(n)?|behind|in front of|size (mode|to fit)|update(d| toolbar item)?|was (hidden|miniaturized)|will (become active|close|finish launching|hide|miniaturize|move|open|quit|(resign )?active|((maximum|minimum|proposed) )?size|show|zoom)|bundle|data source|movie|pasteboard|sound|tool(bar| tip)|(color|open|save) panel|coordinate system|frontmost|main( (bundle|menu|window))?|((services|(excluded from )?windows) )?menu|((executable|frameworks|resource|scripts|shared (frameworks|support)) )?path|(selected item )?identifier|data|content(s| view)?|character(s)?|click count|(command|control|option|shift) key down|context|delta (x|y|z)|key( code)?|location|pressure|unmodified characters|types|(first )?responder|playing|(allowed|selectable) identifiers|allows customization|(auto saves )?configuration|visible|image( name)?|menu form representation|tag|user(-| )defaults|associated file name|(auto|needs) display|current field editor|floating|has (resize indicator|shadow)|hides when deactivated|level|minimized (image|title)|opaque|position|release when closed|sheet|title(d)?)\b/g,
+ css: 'color3' },
+
+ { regex: new RegExp(this.getKeywords(specials), 'gm'), css: 'color3' },
+ { regex: new RegExp(this.getKeywords(keywords), 'gm'), css: 'keyword' },
+ { regex: new RegExp(this.getKeywords(ordinals), 'gm'), css: 'keyword' }
+ ];
+ };
+
+ Brush.prototype = new SyntaxHighlighter.Highlighter();
+ Brush.aliases = ['applescript'];
+
+ SyntaxHighlighter.brushes.AppleScript = Brush;
+
+ // CommonJS
+ typeof(exports) != 'undefined' ? exports.Brush = Brush : null;
+})();
diff --git a/upstream/clipper-6.4.2/Documentation/Scripts/SyntaxHighlighter/scripts/shBrushBash.js b/upstream/clipper-6.4.2/Documentation/Scripts/SyntaxHighlighter/scripts/shBrushBash.js
new file mode 100644
index 0000000..8c29696
--- /dev/null
+++ b/upstream/clipper-6.4.2/Documentation/Scripts/SyntaxHighlighter/scripts/shBrushBash.js
@@ -0,0 +1,59 @@
+/**
+ * SyntaxHighlighter
+ * http://alexgorbatchev.com/SyntaxHighlighter
+ *
+ * SyntaxHighlighter is donationware. If you are using it, please donate.
+ * http://alexgorbatchev.com/SyntaxHighlighter/donate.html
+ *
+ * @version
+ * 3.0.83 (July 02 2010)
+ *
+ * @copyright
+ * Copyright (C) 2004-2010 Alex Gorbatchev.
+ *
+ * @license
+ * Dual licensed under the MIT and GPL licenses.
+ */
+;(function()
+{
+ // CommonJS
+ typeof(require) != 'undefined' ? SyntaxHighlighter = require('shCore').SyntaxHighlighter : null;
+
+ function Brush()
+ {
+ var keywords = 'if fi then elif else for do done until while break continue case function return in eq ne ge le';
+ var commands = 'alias apropos awk basename bash bc bg builtin bzip2 cal cat cd cfdisk chgrp chmod chown chroot' +
+ 'cksum clear cmp comm command cp cron crontab csplit cut date dc dd ddrescue declare df ' +
+ 'diff diff3 dig dir dircolors dirname dirs du echo egrep eject enable env ethtool eval ' +
+ 'exec exit expand export expr false fdformat fdisk fg fgrep file find fmt fold format ' +
+ 'free fsck ftp gawk getopts grep groups gzip hash head history hostname id ifconfig ' +
+ 'import install join kill less let ln local locate logname logout look lpc lpr lprint ' +
+ 'lprintd lprintq lprm ls lsof make man mkdir mkfifo mkisofs mknod more mount mtools ' +
+ 'mv netstat nice nl nohup nslookup open op passwd paste pathchk ping popd pr printcap ' +
+ 'printenv printf ps pushd pwd quota quotacheck quotactl ram rcp read readonly renice ' +
+ 'remsync rm rmdir rsync screen scp sdiff sed select seq set sftp shift shopt shutdown ' +
+ 'sleep sort source split ssh strace su sudo sum symlink sync tail tar tee test time ' +
+ 'times touch top traceroute trap tr true tsort tty type ulimit umask umount unalias ' +
+ 'uname unexpand uniq units unset unshar useradd usermod users uuencode uudecode v vdir ' +
+ 'vi watch wc whereis which who whoami Wget xargs yes'
+ ;
+
+ this.regexList = [
+ { regex: /^#!.*$/gm, css: 'preprocessor bold' },
+ { regex: /\/[\w-\/]+/gm, css: 'plain' },
+ { regex: SyntaxHighlighter.regexLib.singleLinePerlComments, css: 'comments' }, // one line comments
+ { regex: SyntaxHighlighter.regexLib.doubleQuotedString, css: 'string' }, // double quoted strings
+ { regex: SyntaxHighlighter.regexLib.singleQuotedString, css: 'string' }, // single quoted strings
+ { regex: new RegExp(this.getKeywords(keywords), 'gm'), css: 'keyword' }, // keywords
+ { regex: new RegExp(this.getKeywords(commands), 'gm'), css: 'functions' } // commands
+ ];
+ }
+
+ Brush.prototype = new SyntaxHighlighter.Highlighter();
+ Brush.aliases = ['bash', 'shell'];
+
+ SyntaxHighlighter.brushes.Bash = Brush;
+
+ // CommonJS
+ typeof(exports) != 'undefined' ? exports.Brush = Brush : null;
+})();
diff --git a/upstream/clipper-6.4.2/Documentation/Scripts/SyntaxHighlighter/scripts/shBrushCSharp.js b/upstream/clipper-6.4.2/Documentation/Scripts/SyntaxHighlighter/scripts/shBrushCSharp.js
new file mode 100644
index 0000000..50a8ebe
--- /dev/null
+++ b/upstream/clipper-6.4.2/Documentation/Scripts/SyntaxHighlighter/scripts/shBrushCSharp.js
@@ -0,0 +1,70 @@
+/**
+ * SyntaxHighlighter
+ * http://alexgorbatchev.com/SyntaxHighlighter
+ *
+ * SyntaxHighlighter is donationware. If you are using it, please donate.
+ * http://alexgorbatchev.com/SyntaxHighlighter/donate.html
+ *
+ * @version
+ * 3.0.83 (July 02 2010)
+ *
+ * @copyright
+ * Copyright (C) 2004-2010 Alex Gorbatchev.
+ *
+ * @license
+ * Dual licensed under the MIT and GPL licenses.
+ */
+;(function()
+{
+ // CommonJS
+ typeof(require) != 'undefined' ? SyntaxHighlighter = require('shCore').SyntaxHighlighter : null;
+
+ function Brush()
+ {
+ var keywords = 'abstract as base bool break byte case catch char checked class const ' +
+ 'continue decimal default delegate do double else enum event explicit ' +
+ 'extern false finally fixed float for foreach get goto if implicit in int ' +
+ 'interface internal is lock long namespace new null object operator out ' +
+ 'override params private protected public readonly ref return sbyte sealed set ' +
+ 'short sizeof stackalloc static string struct switch this throw true try ' +
+ 'typeof uint ulong unchecked unsafe ushort using virtual void while';
+
+ var clipper = 'Clipper Path Paths IntPoint List PolyType PolyFillType ClipType IntRect';
+
+ function fixComments(match, regexInfo)
+ {
+ var css = (match[0].indexOf("///") == 0)
+ ? 'color1'
+ : 'comments'
+ ;
+
+ return [new SyntaxHighlighter.Match(match[0], match.index, css)];
+ }
+
+ this.regexList = [
+ { regex: SyntaxHighlighter.regexLib.singleLineCComments, func : fixComments }, // one line comments
+ { regex: SyntaxHighlighter.regexLib.multiLineCComments, css: 'comments' }, // multiline comments
+ { regex: /@"(?:[^"]|"")*"/g, css: 'string' }, // @-quoted strings
+ { regex: SyntaxHighlighter.regexLib.doubleQuotedString, css: 'string' }, // strings
+ { regex: SyntaxHighlighter.regexLib.singleQuotedString, css: 'string' }, // strings
+ { regex: /^\s*#.*/gm, css: 'preprocessor' }, // preprocessor tags like #region and #endregion
+ { regex: new RegExp(this.getKeywords(keywords), 'gm'), css: 'keyword' }, // c# keyword
+
+ { regex: new RegExp(this.getKeywords(clipper), 'gm'), css: 'color4'},
+
+ { regex: /\bpartial(?=\s+(?:class|interface|struct)\b)/g, css: 'keyword' }, // contextual keyword: 'partial'
+ { regex: /\byield(?=\s+(?:return|break)\b)/g, css: 'keyword' } // contextual keyword: 'yield'
+ ];
+
+ this.forHtmlScript(SyntaxHighlighter.regexLib.aspScriptTags);
+ };
+
+ Brush.prototype = new SyntaxHighlighter.Highlighter();
+ Brush.aliases = ['c#', 'c-sharp', 'csharp'];
+
+ SyntaxHighlighter.brushes.CSharp = Brush;
+
+ // CommonJS
+ typeof(exports) != 'undefined' ? exports.Brush = Brush : null;
+})();
+
diff --git a/upstream/clipper-6.4.2/Documentation/Scripts/SyntaxHighlighter/scripts/shBrushColdFusion.js b/upstream/clipper-6.4.2/Documentation/Scripts/SyntaxHighlighter/scripts/shBrushColdFusion.js
new file mode 100644
index 0000000..627dbb9
--- /dev/null
+++ b/upstream/clipper-6.4.2/Documentation/Scripts/SyntaxHighlighter/scripts/shBrushColdFusion.js
@@ -0,0 +1,100 @@
+/**
+ * SyntaxHighlighter
+ * http://alexgorbatchev.com/SyntaxHighlighter
+ *
+ * SyntaxHighlighter is donationware. If you are using it, please donate.
+ * http://alexgorbatchev.com/SyntaxHighlighter/donate.html
+ *
+ * @version
+ * 3.0.83 (July 02 2010)
+ *
+ * @copyright
+ * Copyright (C) 2004-2010 Alex Gorbatchev.
+ *
+ * @license
+ * Dual licensed under the MIT and GPL licenses.
+ */
+;(function()
+{
+ // CommonJS
+ typeof(require) != 'undefined' ? SyntaxHighlighter = require('shCore').SyntaxHighlighter : null;
+
+ function Brush()
+ {
+ // Contributed by Jen
+ // http://www.jensbits.com/2009/05/14/coldfusion-brush-for-syntaxhighlighter-plus
+
+ var funcs = 'Abs ACos AddSOAPRequestHeader AddSOAPResponseHeader AjaxLink AjaxOnLoad ArrayAppend ArrayAvg ArrayClear ArrayDeleteAt ' +
+ 'ArrayInsertAt ArrayIsDefined ArrayIsEmpty ArrayLen ArrayMax ArrayMin ArraySet ArraySort ArraySum ArraySwap ArrayToList ' +
+ 'Asc ASin Atn BinaryDecode BinaryEncode BitAnd BitMaskClear BitMaskRead BitMaskSet BitNot BitOr BitSHLN BitSHRN BitXor ' +
+ 'Ceiling CharsetDecode CharsetEncode Chr CJustify Compare CompareNoCase Cos CreateDate CreateDateTime CreateObject ' +
+ 'CreateODBCDate CreateODBCDateTime CreateODBCTime CreateTime CreateTimeSpan CreateUUID DateAdd DateCompare DateConvert ' +
+ 'DateDiff DateFormat DatePart Day DayOfWeek DayOfWeekAsString DayOfYear DaysInMonth DaysInYear DE DecimalFormat DecrementValue ' +
+ 'Decrypt DecryptBinary DeleteClientVariable DeserializeJSON DirectoryExists DollarFormat DotNetToCFType Duplicate Encrypt ' +
+ 'EncryptBinary Evaluate Exp ExpandPath FileClose FileCopy FileDelete FileExists FileIsEOF FileMove FileOpen FileRead ' +
+ 'FileReadBinary FileReadLine FileSetAccessMode FileSetAttribute FileSetLastModified FileWrite Find FindNoCase FindOneOf ' +
+ 'FirstDayOfMonth Fix FormatBaseN GenerateSecretKey GetAuthUser GetBaseTagData GetBaseTagList GetBaseTemplatePath ' +
+ 'GetClientVariablesList GetComponentMetaData GetContextRoot GetCurrentTemplatePath GetDirectoryFromPath GetEncoding ' +
+ 'GetException GetFileFromPath GetFileInfo GetFunctionList GetGatewayHelper GetHttpRequestData GetHttpTimeString ' +
+ 'GetK2ServerDocCount GetK2ServerDocCountLimit GetLocale GetLocaleDisplayName GetLocalHostIP GetMetaData GetMetricData ' +
+ 'GetPageContext GetPrinterInfo GetProfileSections GetProfileString GetReadableImageFormats GetSOAPRequest GetSOAPRequestHeader ' +
+ 'GetSOAPResponse GetSOAPResponseHeader GetTempDirectory GetTempFile GetTemplatePath GetTickCount GetTimeZoneInfo GetToken ' +
+ 'GetUserRoles GetWriteableImageFormats Hash Hour HTMLCodeFormat HTMLEditFormat IIf ImageAddBorder ImageBlur ImageClearRect ' +
+ 'ImageCopy ImageCrop ImageDrawArc ImageDrawBeveledRect ImageDrawCubicCurve ImageDrawLine ImageDrawLines ImageDrawOval ' +
+ 'ImageDrawPoint ImageDrawQuadraticCurve ImageDrawRect ImageDrawRoundRect ImageDrawText ImageFlip ImageGetBlob ImageGetBufferedImage ' +
+ 'ImageGetEXIFTag ImageGetHeight ImageGetIPTCTag ImageGetWidth ImageGrayscale ImageInfo ImageNegative ImageNew ImageOverlay ImagePaste ' +
+ 'ImageRead ImageReadBase64 ImageResize ImageRotate ImageRotateDrawingAxis ImageScaleToFit ImageSetAntialiasing ImageSetBackgroundColor ' +
+ 'ImageSetDrawingColor ImageSetDrawingStroke ImageSetDrawingTransparency ImageSharpen ImageShear ImageShearDrawingAxis ImageTranslate ' +
+ 'ImageTranslateDrawingAxis ImageWrite ImageWriteBase64 ImageXORDrawingMode IncrementValue InputBaseN Insert Int IsArray IsBinary ' +
+ 'IsBoolean IsCustomFunction IsDate IsDDX IsDebugMode IsDefined IsImage IsImageFile IsInstanceOf IsJSON IsLeapYear IsLocalHost ' +
+ 'IsNumeric IsNumericDate IsObject IsPDFFile IsPDFObject IsQuery IsSimpleValue IsSOAPRequest IsStruct IsUserInAnyRole IsUserInRole ' +
+ 'IsUserLoggedIn IsValid IsWDDX IsXML IsXmlAttribute IsXmlDoc IsXmlElem IsXmlNode IsXmlRoot JavaCast JSStringFormat LCase Left Len ' +
+ 'ListAppend ListChangeDelims ListContains ListContainsNoCase ListDeleteAt ListFind ListFindNoCase ListFirst ListGetAt ListInsertAt ' +
+ 'ListLast ListLen ListPrepend ListQualify ListRest ListSetAt ListSort ListToArray ListValueCount ListValueCountNoCase LJustify Log ' +
+ 'Log10 LSCurrencyFormat LSDateFormat LSEuroCurrencyFormat LSIsCurrency LSIsDate LSIsNumeric LSNumberFormat LSParseCurrency LSParseDateTime ' +
+ 'LSParseEuroCurrency LSParseNumber LSTimeFormat LTrim Max Mid Min Minute Month MonthAsString Now NumberFormat ParagraphFormat ParseDateTime ' +
+ 'Pi PrecisionEvaluate PreserveSingleQuotes Quarter QueryAddColumn QueryAddRow QueryConvertForGrid QueryNew QuerySetCell QuotedValueList Rand ' +
+ 'Randomize RandRange REFind REFindNoCase ReleaseComObject REMatch REMatchNoCase RemoveChars RepeatString Replace ReplaceList ReplaceNoCase ' +
+ 'REReplace REReplaceNoCase Reverse Right RJustify Round RTrim Second SendGatewayMessage SerializeJSON SetEncoding SetLocale SetProfileString ' +
+ 'SetVariable Sgn Sin Sleep SpanExcluding SpanIncluding Sqr StripCR StructAppend StructClear StructCopy StructCount StructDelete StructFind ' +
+ 'StructFindKey StructFindValue StructGet StructInsert StructIsEmpty StructKeyArray StructKeyExists StructKeyList StructKeyList StructNew ' +
+ 'StructSort StructUpdate Tan TimeFormat ToBase64 ToBinary ToScript ToString Trim UCase URLDecode URLEncodedFormat URLSessionFormat Val ' +
+ 'ValueList VerifyClient Week Wrap Wrap WriteOutput XmlChildPos XmlElemNew XmlFormat XmlGetNodeType XmlNew XmlParse XmlSearch XmlTransform ' +
+ 'XmlValidate Year YesNoFormat';
+
+ var keywords = 'cfabort cfajaximport cfajaxproxy cfapplet cfapplication cfargument cfassociate cfbreak cfcache cfcalendar ' +
+ 'cfcase cfcatch cfchart cfchartdata cfchartseries cfcol cfcollection cfcomponent cfcontent cfcookie cfdbinfo ' +
+ 'cfdefaultcase cfdirectory cfdiv cfdocument cfdocumentitem cfdocumentsection cfdump cfelse cfelseif cferror ' +
+ 'cfexchangecalendar cfexchangeconnection cfexchangecontact cfexchangefilter cfexchangemail cfexchangetask ' +
+ 'cfexecute cfexit cffeed cffile cfflush cfform cfformgroup cfformitem cfftp cffunction cfgrid cfgridcolumn ' +
+ 'cfgridrow cfgridupdate cfheader cfhtmlhead cfhttp cfhttpparam cfif cfimage cfimport cfinclude cfindex ' +
+ 'cfinput cfinsert cfinterface cfinvoke cfinvokeargument cflayout cflayoutarea cfldap cflocation cflock cflog ' +
+ 'cflogin cfloginuser cflogout cfloop cfmail cfmailparam cfmailpart cfmenu cfmenuitem cfmodule cfNTauthenticate ' +
+ 'cfobject cfobjectcache cfoutput cfparam cfpdf cfpdfform cfpdfformparam cfpdfparam cfpdfsubform cfpod cfpop ' +
+ 'cfpresentation cfpresentationslide cfpresenter cfprint cfprocessingdirective cfprocparam cfprocresult ' +
+ 'cfproperty cfquery cfqueryparam cfregistry cfreport cfreportparam cfrethrow cfreturn cfsavecontent cfschedule ' +
+ 'cfscript cfsearch cfselect cfset cfsetting cfsilent cfslider cfsprydataset cfstoredproc cfswitch cftable ' +
+ 'cftextarea cfthread cfthrow cftimer cftooltip cftrace cftransaction cftree cftreeitem cftry cfupdate cfwddx ' +
+ 'cfwindow cfxml cfzip cfzipparam';
+
+ var operators = 'all and any between cross in join like not null or outer some';
+
+ this.regexList = [
+ { regex: new RegExp('--(.*)$', 'gm'), css: 'comments' }, // one line and multiline comments
+ { regex: SyntaxHighlighter.regexLib.xmlComments, css: 'comments' }, // single quoted strings
+ { regex: SyntaxHighlighter.regexLib.doubleQuotedString, css: 'string' }, // double quoted strings
+ { regex: SyntaxHighlighter.regexLib.singleQuotedString, css: 'string' }, // single quoted strings
+ { regex: new RegExp(this.getKeywords(funcs), 'gmi'), css: 'functions' }, // functions
+ { regex: new RegExp(this.getKeywords(operators), 'gmi'), css: 'color1' }, // operators and such
+ { regex: new RegExp(this.getKeywords(keywords), 'gmi'), css: 'keyword' } // keyword
+ ];
+ }
+
+ Brush.prototype = new SyntaxHighlighter.Highlighter();
+ Brush.aliases = ['coldfusion','cf'];
+
+ SyntaxHighlighter.brushes.ColdFusion = Brush;
+
+ // CommonJS
+ typeof(exports) != 'undefined' ? exports.Brush = Brush : null;
+})();
diff --git a/upstream/clipper-6.4.2/Documentation/Scripts/SyntaxHighlighter/scripts/shBrushCpp.js b/upstream/clipper-6.4.2/Documentation/Scripts/SyntaxHighlighter/scripts/shBrushCpp.js
new file mode 100644
index 0000000..9f70d3a
--- /dev/null
+++ b/upstream/clipper-6.4.2/Documentation/Scripts/SyntaxHighlighter/scripts/shBrushCpp.js
@@ -0,0 +1,97 @@
+/**
+ * SyntaxHighlighter
+ * http://alexgorbatchev.com/SyntaxHighlighter
+ *
+ * SyntaxHighlighter is donationware. If you are using it, please donate.
+ * http://alexgorbatchev.com/SyntaxHighlighter/donate.html
+ *
+ * @version
+ * 3.0.83 (July 02 2010)
+ *
+ * @copyright
+ * Copyright (C) 2004-2010 Alex Gorbatchev.
+ *
+ * @license
+ * Dual licensed under the MIT and GPL licenses.
+ */
+;(function()
+{
+ // CommonJS
+ typeof(require) != 'undefined' ? SyntaxHighlighter = require('shCore').SyntaxHighlighter : null;
+
+ function Brush()
+ {
+ // Copyright 2006 Shin, YoungJin
+
+ var datatypes = 'ATOM BOOL BOOLEAN BYTE CHAR COLORREF DWORD DWORDLONG DWORD_PTR ' +
+ 'DWORD32 DWORD64 FLOAT HACCEL HALF_PTR HANDLE HBITMAP HBRUSH ' +
+ 'HCOLORSPACE HCONV HCONVLIST HCURSOR HDC HDDEDATA HDESK HDROP HDWP ' +
+ 'HENHMETAFILE HFILE HFONT HGDIOBJ HGLOBAL HHOOK HICON HINSTANCE HKEY ' +
+ 'HKL HLOCAL HMENU HMETAFILE HMODULE HMONITOR HPALETTE HPEN HRESULT ' +
+ 'HRGN HRSRC HSZ HWINSTA HWND INT INT_PTR INT32 INT64 LANGID LCID LCTYPE ' +
+ 'LGRPID LONG LONGLONG LONG_PTR LONG32 LONG64 LPARAM LPBOOL LPBYTE LPCOLORREF ' +
+ 'LPCSTR LPCTSTR LPCVOID LPCWSTR LPDWORD LPHANDLE LPINT LPLONG LPSTR LPTSTR ' +
+ 'LPVOID LPWORD LPWSTR LRESULT PBOOL PBOOLEAN PBYTE PCHAR PCSTR PCTSTR PCWSTR ' +
+ 'PDWORDLONG PDWORD_PTR PDWORD32 PDWORD64 PFLOAT PHALF_PTR PHANDLE PHKEY PINT ' +
+ 'PINT_PTR PINT32 PINT64 PLCID PLONG PLONGLONG PLONG_PTR PLONG32 PLONG64 POINTER_32 ' +
+ 'POINTER_64 PSHORT PSIZE_T PSSIZE_T PSTR PTBYTE PTCHAR PTSTR PUCHAR PUHALF_PTR ' +
+ 'PUINT PUINT_PTR PUINT32 PUINT64 PULONG PULONGLONG PULONG_PTR PULONG32 PULONG64 ' +
+ 'PUSHORT PVOID PWCHAR PWORD PWSTR SC_HANDLE SC_LOCK SERVICE_STATUS_HANDLE SHORT ' +
+ 'SIZE_T SSIZE_T TBYTE TCHAR UCHAR UHALF_PTR UINT UINT_PTR UINT32 UINT64 ULONG ' +
+ 'ULONGLONG ULONG_PTR ULONG32 ULONG64 USHORT USN VOID WCHAR WORD WPARAM WPARAM WPARAM ' +
+ 'char bool short int __int32 __int64 __int8 __int16 long float double __wchar_t ' +
+ 'clock_t _complex _dev_t _diskfree_t div_t ldiv_t _exception _EXCEPTION_POINTERS ' +
+ 'FILE _finddata_t _finddatai64_t _wfinddata_t _wfinddatai64_t __finddata64_t ' +
+ '__wfinddata64_t _FPIEEE_RECORD fpos_t _HEAPINFO _HFILE lconv intptr_t ' +
+ 'jmp_buf mbstate_t _off_t _onexit_t _PNH ptrdiff_t _purecall_handler ' +
+ 'sig_atomic_t size_t _stat __stat64 _stati64 terminate_function ' +
+ 'time_t __time64_t _timeb __timeb64 tm uintptr_t _utimbuf ' +
+ 'va_list wchar_t wctrans_t wctype_t wint_t signed';
+
+ var keywords = 'break case catch class const __finally __exception __try ' +
+ 'const_cast continue private public protected __declspec ' +
+ 'default delete deprecated dllexport dllimport do dynamic_cast ' +
+ 'else enum explicit extern if for friend goto inline ' +
+ 'mutable naked namespace new noinline noreturn nothrow ' +
+ 'register reinterpret_cast return selectany ' +
+ 'sizeof static static_cast struct switch template this ' +
+ 'thread throw true false try typedef typeid typename union ' +
+ 'using uuid virtual void volatile whcar_t while';
+
+ var functions = 'assert isalnum isalpha iscntrl isdigit isgraph islower isprint' +
+ 'ispunct isspace isupper isxdigit tolower toupper errno localeconv ' +
+ 'setlocale acos asin atan atan2 ceil cos cosh exp fabs floor fmod ' +
+ 'frexp ldexp log log10 modf pow sin sinh sqrt tan tanh jmp_buf ' +
+ 'longjmp setjmp raise signal sig_atomic_t va_arg va_end va_start ' +
+ 'clearerr fclose feof ferror fflush fgetc fgetpos fgets fopen ' +
+ 'fprintf fputc fputs fread freopen fscanf fseek fsetpos ftell ' +
+ 'fwrite getc getchar gets perror printf putc putchar puts remove ' +
+ 'rename rewind scanf setbuf setvbuf sprintf sscanf tmpfile tmpnam ' +
+ 'ungetc vfprintf vprintf vsprintf abort abs atexit atof atoi atol ' +
+ 'bsearch calloc div exit free getenv labs ldiv malloc mblen mbstowcs ' +
+ 'mbtowc qsort rand realloc srand strtod strtol strtoul system ' +
+ 'wcstombs wctomb memchr memcmp memcpy memmove memset strcat strchr ' +
+ 'strcmp strcoll strcpy strcspn strerror strlen strncat strncmp ' +
+ 'strncpy strpbrk strrchr strspn strstr strtok strxfrm asctime ' +
+ 'clock ctime difftime gmtime localtime mktime strftime time';
+
+ this.regexList = [
+ { regex: SyntaxHighlighter.regexLib.singleLineCComments, css: 'comments' }, // one line comments
+ { regex: SyntaxHighlighter.regexLib.multiLineCComments, css: 'comments' }, // multiline comments
+ { regex: SyntaxHighlighter.regexLib.doubleQuotedString, css: 'string' }, // strings
+ { regex: SyntaxHighlighter.regexLib.singleQuotedString, css: 'string' }, // strings
+ { regex: /^ *#.*/gm, css: 'preprocessor' },
+ { regex: new RegExp(this.getKeywords(datatypes), 'gm'), css: 'color1 bold' },
+ { regex: new RegExp(this.getKeywords(functions), 'gm'), css: 'functions bold' },
+ { regex: new RegExp(this.getKeywords(keywords), 'gm'), css: 'keyword bold' }
+ ];
+ };
+
+ Brush.prototype = new SyntaxHighlighter.Highlighter();
+ Brush.aliases = ['cpp', 'c'];
+
+ SyntaxHighlighter.brushes.Cpp = Brush;
+
+ // CommonJS
+ typeof(exports) != 'undefined' ? exports.Brush = Brush : null;
+})();
diff --git a/upstream/clipper-6.4.2/Documentation/Scripts/SyntaxHighlighter/scripts/shBrushCss.js b/upstream/clipper-6.4.2/Documentation/Scripts/SyntaxHighlighter/scripts/shBrushCss.js
new file mode 100644
index 0000000..4297a9a
--- /dev/null
+++ b/upstream/clipper-6.4.2/Documentation/Scripts/SyntaxHighlighter/scripts/shBrushCss.js
@@ -0,0 +1,91 @@
+/**
+ * SyntaxHighlighter
+ * http://alexgorbatchev.com/SyntaxHighlighter
+ *
+ * SyntaxHighlighter is donationware. If you are using it, please donate.
+ * http://alexgorbatchev.com/SyntaxHighlighter/donate.html
+ *
+ * @version
+ * 3.0.83 (July 02 2010)
+ *
+ * @copyright
+ * Copyright (C) 2004-2010 Alex Gorbatchev.
+ *
+ * @license
+ * Dual licensed under the MIT and GPL licenses.
+ */
+;(function()
+{
+ // CommonJS
+ typeof(require) != 'undefined' ? SyntaxHighlighter = require('shCore').SyntaxHighlighter : null;
+
+ function Brush()
+ {
+ function getKeywordsCSS(str)
+ {
+ return '\\b([a-z_]|)' + str.replace(/ /g, '(?=:)\\b|\\b([a-z_\\*]|\\*|)') + '(?=:)\\b';
+ };
+
+ function getValuesCSS(str)
+ {
+ return '\\b' + str.replace(/ /g, '(?!-)(?!:)\\b|\\b()') + '\:\\b';
+ };
+
+ var keywords = 'ascent azimuth background-attachment background-color background-image background-position ' +
+ 'background-repeat background baseline bbox border-collapse border-color border-spacing border-style border-top ' +
+ 'border-right border-bottom border-left border-top-color border-right-color border-bottom-color border-left-color ' +
+ 'border-top-style border-right-style border-bottom-style border-left-style border-top-width border-right-width ' +
+ 'border-bottom-width border-left-width border-width border bottom cap-height caption-side centerline clear clip color ' +
+ 'content counter-increment counter-reset cue-after cue-before cue cursor definition-src descent direction display ' +
+ 'elevation empty-cells float font-size-adjust font-family font-size font-stretch font-style font-variant font-weight font ' +
+ 'height left letter-spacing line-height list-style-image list-style-position list-style-type list-style margin-top ' +
+ 'margin-right margin-bottom margin-left margin marker-offset marks mathline max-height max-width min-height min-width orphans ' +
+ 'outline-color outline-style outline-width outline overflow padding-top padding-right padding-bottom padding-left padding page ' +
+ 'page-break-after page-break-before page-break-inside pause pause-after pause-before pitch pitch-range play-during position ' +
+ 'quotes right richness size slope src speak-header speak-numeral speak-punctuation speak speech-rate stemh stemv stress ' +
+ 'table-layout text-align top text-decoration text-indent text-shadow text-transform unicode-bidi unicode-range units-per-em ' +
+ 'vertical-align visibility voice-family volume white-space widows width widths word-spacing x-height z-index';
+
+ var values = 'above absolute all always aqua armenian attr aural auto avoid baseline behind below bidi-override black blink block blue bold bolder '+
+ 'both bottom braille capitalize caption center center-left center-right circle close-quote code collapse compact condensed '+
+ 'continuous counter counters crop cross crosshair cursive dashed decimal decimal-leading-zero default digits disc dotted double '+
+ 'embed embossed e-resize expanded extra-condensed extra-expanded fantasy far-left far-right fast faster fixed format fuchsia '+
+ 'gray green groove handheld hebrew help hidden hide high higher icon inline-table inline inset inside invert italic '+
+ 'justify landscape large larger left-side left leftwards level lighter lime line-through list-item local loud lower-alpha '+
+ 'lowercase lower-greek lower-latin lower-roman lower low ltr marker maroon medium message-box middle mix move narrower '+
+ 'navy ne-resize no-close-quote none no-open-quote no-repeat normal nowrap n-resize nw-resize oblique olive once open-quote outset '+
+ 'outside overline pointer portrait pre print projection purple red relative repeat repeat-x repeat-y rgb ridge right right-side '+
+ 'rightwards rtl run-in screen scroll semi-condensed semi-expanded separate se-resize show silent silver slower slow '+
+ 'small small-caps small-caption smaller soft solid speech spell-out square s-resize static status-bar sub super sw-resize '+
+ 'table-caption table-cell table-column table-column-group table-footer-group table-header-group table-row table-row-group teal '+
+ 'text-bottom text-top thick thin top transparent tty tv ultra-condensed ultra-expanded underline upper-alpha uppercase upper-latin '+
+ 'upper-roman url visible wait white wider w-resize x-fast x-high x-large x-loud x-low x-slow x-small x-soft xx-large xx-small yellow';
+
+ var fonts = '[mM]onospace [tT]ahoma [vV]erdana [aA]rial [hH]elvetica [sS]ans-serif [sS]erif [cC]ourier mono sans serif';
+
+ this.regexList = [
+ { regex: SyntaxHighlighter.regexLib.multiLineCComments, css: 'comments' }, // multiline comments
+ { regex: SyntaxHighlighter.regexLib.doubleQuotedString, css: 'string' }, // double quoted strings
+ { regex: SyntaxHighlighter.regexLib.singleQuotedString, css: 'string' }, // single quoted strings
+ { regex: /\#[a-fA-F0-9]{3,6}/g, css: 'value' }, // html colors
+ { regex: /(-?\d+)(\.\d+)?(px|em|pt|\:|\%|)/g, css: 'value' }, // sizes
+ { regex: /!important/g, css: 'color3' }, // !important
+ { regex: new RegExp(getKeywordsCSS(keywords), 'gm'), css: 'keyword' }, // keywords
+ { regex: new RegExp(getValuesCSS(values), 'g'), css: 'value' }, // values
+ { regex: new RegExp(this.getKeywords(fonts), 'g'), css: 'color1' } // fonts
+ ];
+
+ this.forHtmlScript({
+ left: /(&lt;|<)\s*style.*?(&gt;|>)/gi,
+ right: /(&lt;|<)\/\s*style\s*(&gt;|>)/gi
+ });
+ };
+
+ Brush.prototype = new SyntaxHighlighter.Highlighter();
+ Brush.aliases = ['css'];
+
+ SyntaxHighlighter.brushes.CSS = Brush;
+
+ // CommonJS
+ typeof(exports) != 'undefined' ? exports.Brush = Brush : null;
+})();
diff --git a/upstream/clipper-6.4.2/Documentation/Scripts/SyntaxHighlighter/scripts/shBrushDelphi.js b/upstream/clipper-6.4.2/Documentation/Scripts/SyntaxHighlighter/scripts/shBrushDelphi.js
new file mode 100644
index 0000000..e1060d4
--- /dev/null
+++ b/upstream/clipper-6.4.2/Documentation/Scripts/SyntaxHighlighter/scripts/shBrushDelphi.js
@@ -0,0 +1,55 @@
+/**
+ * SyntaxHighlighter
+ * http://alexgorbatchev.com/SyntaxHighlighter
+ *
+ * SyntaxHighlighter is donationware. If you are using it, please donate.
+ * http://alexgorbatchev.com/SyntaxHighlighter/donate.html
+ *
+ * @version
+ * 3.0.83 (July 02 2010)
+ *
+ * @copyright
+ * Copyright (C) 2004-2010 Alex Gorbatchev.
+ *
+ * @license
+ * Dual licensed under the MIT and GPL licenses.
+ */
+;(function()
+{
+ // CommonJS
+ typeof(require) != 'undefined' ? SyntaxHighlighter = require('shCore').SyntaxHighlighter : null;
+
+ function Brush()
+ {
+ var keywords = 'abs addr and ansichar ansistring array as asm begin boolean byte cardinal ' +
+ 'case char class comp const constructor currency destructor div do double ' +
+ 'downto else end except exports extended false file finalization finally ' +
+ 'for function goto if implementation in inherited int64 initialization ' +
+ 'integer interface is label library longint longword mod nil not object ' +
+ 'of on or packed pansichar pansistring pchar pcurrency pdatetime pextended ' +
+ 'pint64 pointer private procedure program property pshortstring pstring ' +
+ 'pvariant pwidechar pwidestring protected public published raise real real48 ' +
+ 'record repeat set shl shortint shortstring shr single smallint string then ' +
+ 'threadvar to true try type unit until uses val var varirnt while widechar ' +
+ 'widestring with word write writeln xor';
+
+ this.regexList = [
+ { regex: /\(\*[\s\S]*?\*\)/gm, css: 'comments' }, // multiline comments (* *)
+ { regex: /{(?!\$)[\s\S]*?}/gm, css: 'comments' }, // multiline comments { }
+ { regex: SyntaxHighlighter.regexLib.singleLineCComments, css: 'comments' }, // one line
+ { regex: SyntaxHighlighter.regexLib.singleQuotedString, css: 'string' }, // strings
+ { regex: /\{\$[a-zA-Z]+ .+\}/g, css: 'color1' }, // compiler Directives and Region tags
+ { regex: /\b[\d\.]+\b/g, css: 'value' }, // numbers 12345
+ { regex: /\$[a-zA-Z0-9]+\b/g, css: 'value' }, // numbers $F5D3
+ { regex: new RegExp(this.getKeywords(keywords), 'gmi'), css: 'keyword' } // keyword
+ ];
+ };
+
+ Brush.prototype = new SyntaxHighlighter.Highlighter();
+ Brush.aliases = ['delphi', 'pascal', 'pas'];
+
+ SyntaxHighlighter.brushes.Delphi = Brush;
+
+ // CommonJS
+ typeof(exports) != 'undefined' ? exports.Brush = Brush : null;
+})();
diff --git a/upstream/clipper-6.4.2/Documentation/Scripts/SyntaxHighlighter/scripts/shBrushDiff.js b/upstream/clipper-6.4.2/Documentation/Scripts/SyntaxHighlighter/scripts/shBrushDiff.js
new file mode 100644
index 0000000..e9b14fc
--- /dev/null
+++ b/upstream/clipper-6.4.2/Documentation/Scripts/SyntaxHighlighter/scripts/shBrushDiff.js
@@ -0,0 +1,41 @@
+/**
+ * SyntaxHighlighter
+ * http://alexgorbatchev.com/SyntaxHighlighter
+ *
+ * SyntaxHighlighter is donationware. If you are using it, please donate.
+ * http://alexgorbatchev.com/SyntaxHighlighter/donate.html
+ *
+ * @version
+ * 3.0.83 (July 02 2010)
+ *
+ * @copyright
+ * Copyright (C) 2004-2010 Alex Gorbatchev.
+ *
+ * @license
+ * Dual licensed under the MIT and GPL licenses.
+ */
+;(function()
+{
+ // CommonJS
+ typeof(require) != 'undefined' ? SyntaxHighlighter = require('shCore').SyntaxHighlighter : null;
+
+ function Brush()
+ {
+ this.regexList = [
+ { regex: /^\+\+\+.*$/gm, css: 'color2' },
+ { regex: /^\-\-\-.*$/gm, css: 'color2' },
+ { regex: /^\s.*$/gm, css: 'color1' },
+ { regex: /^@@.*@@$/gm, css: 'variable' },
+ { regex: /^\+[^\+]{1}.*$/gm, css: 'string' },
+ { regex: /^\-[^\-]{1}.*$/gm, css: 'comments' }
+ ];
+ };
+
+ Brush.prototype = new SyntaxHighlighter.Highlighter();
+ Brush.aliases = ['diff', 'patch'];
+
+ SyntaxHighlighter.brushes.Diff = Brush;
+
+ // CommonJS
+ typeof(exports) != 'undefined' ? exports.Brush = Brush : null;
+})();
diff --git a/upstream/clipper-6.4.2/Documentation/Scripts/SyntaxHighlighter/scripts/shBrushErlang.js b/upstream/clipper-6.4.2/Documentation/Scripts/SyntaxHighlighter/scripts/shBrushErlang.js
new file mode 100644
index 0000000..6ba7d9d
--- /dev/null
+++ b/upstream/clipper-6.4.2/Documentation/Scripts/SyntaxHighlighter/scripts/shBrushErlang.js
@@ -0,0 +1,52 @@
+/**
+ * SyntaxHighlighter
+ * http://alexgorbatchev.com/SyntaxHighlighter
+ *
+ * SyntaxHighlighter is donationware. If you are using it, please donate.
+ * http://alexgorbatchev.com/SyntaxHighlighter/donate.html
+ *
+ * @version
+ * 3.0.83 (July 02 2010)
+ *
+ * @copyright
+ * Copyright (C) 2004-2010 Alex Gorbatchev.
+ *
+ * @license
+ * Dual licensed under the MIT and GPL licenses.
+ */
+;(function()
+{
+ // CommonJS
+ typeof(require) != 'undefined' ? SyntaxHighlighter = require('shCore').SyntaxHighlighter : null;
+
+ function Brush()
+ {
+ // Contributed by Jean-Lou Dupont
+ // http://jldupont.blogspot.com/2009/06/erlang-syntax-highlighter.html
+
+ // According to: http://erlang.org/doc/reference_manual/introduction.html#1.5
+ var keywords = 'after and andalso band begin bnot bor bsl bsr bxor '+
+ 'case catch cond div end fun if let not of or orelse '+
+ 'query receive rem try when xor'+
+ // additional
+ ' module export import define';
+
+ this.regexList = [
+ { regex: new RegExp("[A-Z][A-Za-z0-9_]+", 'g'), css: 'constants' },
+ { regex: new RegExp("\\%.+", 'gm'), css: 'comments' },
+ { regex: new RegExp("\\?[A-Za-z0-9_]+", 'g'), css: 'preprocessor' },
+ { regex: new RegExp("[a-z0-9_]+:[a-z0-9_]+", 'g'), css: 'functions' },
+ { regex: SyntaxHighlighter.regexLib.doubleQuotedString, css: 'string' },
+ { regex: SyntaxHighlighter.regexLib.singleQuotedString, css: 'string' },
+ { regex: new RegExp(this.getKeywords(keywords), 'gm'), css: 'keyword' }
+ ];
+ };
+
+ Brush.prototype = new SyntaxHighlighter.Highlighter();
+ Brush.aliases = ['erl', 'erlang'];
+
+ SyntaxHighlighter.brushes.Erland = Brush;
+
+ // CommonJS
+ typeof(exports) != 'undefined' ? exports.Brush = Brush : null;
+})();
diff --git a/upstream/clipper-6.4.2/Documentation/Scripts/SyntaxHighlighter/scripts/shBrushGroovy.js b/upstream/clipper-6.4.2/Documentation/Scripts/SyntaxHighlighter/scripts/shBrushGroovy.js
new file mode 100644
index 0000000..6ec5c18
--- /dev/null
+++ b/upstream/clipper-6.4.2/Documentation/Scripts/SyntaxHighlighter/scripts/shBrushGroovy.js
@@ -0,0 +1,67 @@
+/**
+ * SyntaxHighlighter
+ * http://alexgorbatchev.com/SyntaxHighlighter
+ *
+ * SyntaxHighlighter is donationware. If you are using it, please donate.
+ * http://alexgorbatchev.com/SyntaxHighlighter/donate.html
+ *
+ * @version
+ * 3.0.83 (July 02 2010)
+ *
+ * @copyright
+ * Copyright (C) 2004-2010 Alex Gorbatchev.
+ *
+ * @license
+ * Dual licensed under the MIT and GPL licenses.
+ */
+;(function()
+{
+ // CommonJS
+ typeof(require) != 'undefined' ? SyntaxHighlighter = require('shCore').SyntaxHighlighter : null;
+
+ function Brush()
+ {
+ // Contributed by Andres Almiray
+ // http://jroller.com/aalmiray/entry/nice_source_code_syntax_highlighter
+
+ var keywords = 'as assert break case catch class continue def default do else extends finally ' +
+ 'if in implements import instanceof interface new package property return switch ' +
+ 'throw throws try while public protected private static';
+ var types = 'void boolean byte char short int long float double';
+ var constants = 'null';
+ var methods = 'allProperties count get size '+
+ 'collect each eachProperty eachPropertyName eachWithIndex find findAll ' +
+ 'findIndexOf grep inject max min reverseEach sort ' +
+ 'asImmutable asSynchronized flatten intersect join pop reverse subMap toList ' +
+ 'padRight padLeft contains eachMatch toCharacter toLong toUrl tokenize ' +
+ 'eachFile eachFileRecurse eachB yte eachLine readBytes readLine getText ' +
+ 'splitEachLine withReader append encodeBase64 decodeBase64 filterLine ' +
+ 'transformChar transformLine withOutputStream withPrintWriter withStream ' +
+ 'withStreams withWriter withWriterAppend write writeLine '+
+ 'dump inspect invokeMethod print println step times upto use waitForOrKill '+
+ 'getText';
+
+ this.regexList = [
+ { regex: SyntaxHighlighter.regexLib.singleLineCComments, css: 'comments' }, // one line comments
+ { regex: SyntaxHighlighter.regexLib.multiLineCComments, css: 'comments' }, // multiline comments
+ { regex: SyntaxHighlighter.regexLib.doubleQuotedString, css: 'string' }, // strings
+ { regex: SyntaxHighlighter.regexLib.singleQuotedString, css: 'string' }, // strings
+ { regex: /""".*"""/g, css: 'string' }, // GStrings
+ { regex: new RegExp('\\b([\\d]+(\\.[\\d]+)?|0x[a-f0-9]+)\\b', 'gi'), css: 'value' }, // numbers
+ { regex: new RegExp(this.getKeywords(keywords), 'gm'), css: 'keyword' }, // goovy keyword
+ { regex: new RegExp(this.getKeywords(types), 'gm'), css: 'color1' }, // goovy/java type
+ { regex: new RegExp(this.getKeywords(constants), 'gm'), css: 'constants' }, // constants
+ { regex: new RegExp(this.getKeywords(methods), 'gm'), css: 'functions' } // methods
+ ];
+
+ this.forHtmlScript(SyntaxHighlighter.regexLib.aspScriptTags);
+ }
+
+ Brush.prototype = new SyntaxHighlighter.Highlighter();
+ Brush.aliases = ['groovy'];
+
+ SyntaxHighlighter.brushes.Groovy = Brush;
+
+ // CommonJS
+ typeof(exports) != 'undefined' ? exports.Brush = Brush : null;
+})();
diff --git a/upstream/clipper-6.4.2/Documentation/Scripts/SyntaxHighlighter/scripts/shBrushJScript.js b/upstream/clipper-6.4.2/Documentation/Scripts/SyntaxHighlighter/scripts/shBrushJScript.js
new file mode 100644
index 0000000..ff98dab
--- /dev/null
+++ b/upstream/clipper-6.4.2/Documentation/Scripts/SyntaxHighlighter/scripts/shBrushJScript.js
@@ -0,0 +1,52 @@
+/**
+ * SyntaxHighlighter
+ * http://alexgorbatchev.com/SyntaxHighlighter
+ *
+ * SyntaxHighlighter is donationware. If you are using it, please donate.
+ * http://alexgorbatchev.com/SyntaxHighlighter/donate.html
+ *
+ * @version
+ * 3.0.83 (July 02 2010)
+ *
+ * @copyright
+ * Copyright (C) 2004-2010 Alex Gorbatchev.
+ *
+ * @license
+ * Dual licensed under the MIT and GPL licenses.
+ */
+;(function()
+{
+ // CommonJS
+ typeof(require) != 'undefined' ? SyntaxHighlighter = require('shCore').SyntaxHighlighter : null;
+
+ function Brush()
+ {
+ var keywords = 'break case catch continue ' +
+ 'default delete do else false ' +
+ 'for function if in instanceof ' +
+ 'new null return super switch ' +
+ 'this throw true try typeof var while with'
+ ;
+
+ var r = SyntaxHighlighter.regexLib;
+
+ this.regexList = [
+ { regex: r.multiLineDoubleQuotedString, css: 'string' }, // double quoted strings
+ { regex: r.multiLineSingleQuotedString, css: 'string' }, // single quoted strings
+ { regex: r.singleLineCComments, css: 'comments' }, // one line comments
+ { regex: r.multiLineCComments, css: 'comments' }, // multiline comments
+ { regex: /\s*#.*/gm, css: 'preprocessor' }, // preprocessor tags like #region and #endregion
+ { regex: new RegExp(this.getKeywords(keywords), 'gm'), css: 'keyword' } // keywords
+ ];
+
+ this.forHtmlScript(r.scriptScriptTags);
+ };
+
+ Brush.prototype = new SyntaxHighlighter.Highlighter();
+ Brush.aliases = ['js', 'jscript', 'javascript'];
+
+ SyntaxHighlighter.brushes.JScript = Brush;
+
+ // CommonJS
+ typeof(exports) != 'undefined' ? exports.Brush = Brush : null;
+})();
diff --git a/upstream/clipper-6.4.2/Documentation/Scripts/SyntaxHighlighter/scripts/shBrushJava.js b/upstream/clipper-6.4.2/Documentation/Scripts/SyntaxHighlighter/scripts/shBrushJava.js
new file mode 100644
index 0000000..d692fd6
--- /dev/null
+++ b/upstream/clipper-6.4.2/Documentation/Scripts/SyntaxHighlighter/scripts/shBrushJava.js
@@ -0,0 +1,57 @@
+/**
+ * SyntaxHighlighter
+ * http://alexgorbatchev.com/SyntaxHighlighter
+ *
+ * SyntaxHighlighter is donationware. If you are using it, please donate.
+ * http://alexgorbatchev.com/SyntaxHighlighter/donate.html
+ *
+ * @version
+ * 3.0.83 (July 02 2010)
+ *
+ * @copyright
+ * Copyright (C) 2004-2010 Alex Gorbatchev.
+ *
+ * @license
+ * Dual licensed under the MIT and GPL licenses.
+ */
+;(function()
+{
+ // CommonJS
+ typeof(require) != 'undefined' ? SyntaxHighlighter = require('shCore').SyntaxHighlighter : null;
+
+ function Brush()
+ {
+ var keywords = 'abstract assert boolean break byte case catch char class const ' +
+ 'continue default do double else enum extends ' +
+ 'false final finally float for goto if implements import ' +
+ 'instanceof int interface long native new null ' +
+ 'package private protected public return ' +
+ 'short static strictfp super switch synchronized this throw throws true ' +
+ 'transient try void volatile while';
+
+ this.regexList = [
+ { regex: SyntaxHighlighter.regexLib.singleLineCComments, css: 'comments' }, // one line comments
+ { regex: /\/\*([^\*][\s\S]*)?\*\//gm, css: 'comments' }, // multiline comments
+ { regex: /\/\*(?!\*\/)\*[\s\S]*?\*\//gm, css: 'preprocessor' }, // documentation comments
+ { regex: SyntaxHighlighter.regexLib.doubleQuotedString, css: 'string' }, // strings
+ { regex: SyntaxHighlighter.regexLib.singleQuotedString, css: 'string' }, // strings
+ { regex: /\b([\d]+(\.[\d]+)?|0x[a-f0-9]+)\b/gi, css: 'value' }, // numbers
+ { regex: /(?!\@interface\b)\@[\$\w]+\b/g, css: 'color1' }, // annotation @anno
+ { regex: /\@interface\b/g, css: 'color2' }, // @interface keyword
+ { regex: new RegExp(this.getKeywords(keywords), 'gm'), css: 'keyword' } // java keyword
+ ];
+
+ this.forHtmlScript({
+ left : /(&lt;|<)%[@!=]?/g,
+ right : /%(&gt;|>)/g
+ });
+ };
+
+ Brush.prototype = new SyntaxHighlighter.Highlighter();
+ Brush.aliases = ['java'];
+
+ SyntaxHighlighter.brushes.Java = Brush;
+
+ // CommonJS
+ typeof(exports) != 'undefined' ? exports.Brush = Brush : null;
+})();
diff --git a/upstream/clipper-6.4.2/Documentation/Scripts/SyntaxHighlighter/scripts/shBrushJavaFX.js b/upstream/clipper-6.4.2/Documentation/Scripts/SyntaxHighlighter/scripts/shBrushJavaFX.js
new file mode 100644
index 0000000..1a150a6
--- /dev/null
+++ b/upstream/clipper-6.4.2/Documentation/Scripts/SyntaxHighlighter/scripts/shBrushJavaFX.js
@@ -0,0 +1,58 @@
+/**
+ * SyntaxHighlighter
+ * http://alexgorbatchev.com/SyntaxHighlighter
+ *
+ * SyntaxHighlighter is donationware. If you are using it, please donate.
+ * http://alexgorbatchev.com/SyntaxHighlighter/donate.html
+ *
+ * @version
+ * 3.0.83 (July 02 2010)
+ *
+ * @copyright
+ * Copyright (C) 2004-2010 Alex Gorbatchev.
+ *
+ * @license
+ * Dual licensed under the MIT and GPL licenses.
+ */
+;(function()
+{
+ // CommonJS
+ typeof(require) != 'undefined' ? SyntaxHighlighter = require('shCore').SyntaxHighlighter : null;
+
+ function Brush()
+ {
+ // Contributed by Patrick Webster
+ // http://patrickwebster.blogspot.com/2009/04/javafx-brush-for-syntaxhighlighter.html
+ var datatypes = 'Boolean Byte Character Double Duration '
+ + 'Float Integer Long Number Short String Void'
+ ;
+
+ var keywords = 'abstract after and as assert at before bind bound break catch class '
+ + 'continue def delete else exclusive extends false finally first for from '
+ + 'function if import in indexof init insert instanceof into inverse last '
+ + 'lazy mixin mod nativearray new not null on or override package postinit '
+ + 'protected public public-init public-read replace return reverse sizeof '
+ + 'step super then this throw true try tween typeof var where while with '
+ + 'attribute let private readonly static trigger'
+ ;
+
+ this.regexList = [
+ { regex: SyntaxHighlighter.regexLib.singleLineCComments, css: 'comments' },
+ { regex: SyntaxHighlighter.regexLib.multiLineCComments, css: 'comments' },
+ { regex: SyntaxHighlighter.regexLib.singleQuotedString, css: 'string' },
+ { regex: SyntaxHighlighter.regexLib.doubleQuotedString, css: 'string' },
+ { regex: /(-?\.?)(\b(\d*\.?\d+|\d+\.?\d*)(e[+-]?\d+)?|0x[a-f\d]+)\b\.?/gi, css: 'color2' }, // numbers
+ { regex: new RegExp(this.getKeywords(datatypes), 'gm'), css: 'variable' }, // datatypes
+ { regex: new RegExp(this.getKeywords(keywords), 'gm'), css: 'keyword' }
+ ];
+ this.forHtmlScript(SyntaxHighlighter.regexLib.aspScriptTags);
+ };
+
+ Brush.prototype = new SyntaxHighlighter.Highlighter();
+ Brush.aliases = ['jfx', 'javafx'];
+
+ SyntaxHighlighter.brushes.JavaFX = Brush;
+
+ // CommonJS
+ typeof(exports) != 'undefined' ? exports.Brush = Brush : null;
+})();
diff --git a/upstream/clipper-6.4.2/Documentation/Scripts/SyntaxHighlighter/scripts/shBrushPerl.js b/upstream/clipper-6.4.2/Documentation/Scripts/SyntaxHighlighter/scripts/shBrushPerl.js
new file mode 100644
index 0000000..d94a2e0
--- /dev/null
+++ b/upstream/clipper-6.4.2/Documentation/Scripts/SyntaxHighlighter/scripts/shBrushPerl.js
@@ -0,0 +1,72 @@
+/**
+ * SyntaxHighlighter
+ * http://alexgorbatchev.com/SyntaxHighlighter
+ *
+ * SyntaxHighlighter is donationware. If you are using it, please donate.
+ * http://alexgorbatchev.com/SyntaxHighlighter/donate.html
+ *
+ * @version
+ * 3.0.83 (July 02 2010)
+ *
+ * @copyright
+ * Copyright (C) 2004-2010 Alex Gorbatchev.
+ *
+ * @license
+ * Dual licensed under the MIT and GPL licenses.
+ */
+;(function()
+{
+ // CommonJS
+ typeof(require) != 'undefined' ? SyntaxHighlighter = require('shCore').SyntaxHighlighter : null;
+
+ function Brush()
+ {
+ // Contributed by David Simmons-Duffin and Marty Kube
+
+ var funcs =
+ 'abs accept alarm atan2 bind binmode chdir chmod chomp chop chown chr ' +
+ 'chroot close closedir connect cos crypt defined delete each endgrent ' +
+ 'endhostent endnetent endprotoent endpwent endservent eof exec exists ' +
+ 'exp fcntl fileno flock fork format formline getc getgrent getgrgid ' +
+ 'getgrnam gethostbyaddr gethostbyname gethostent getlogin getnetbyaddr ' +
+ 'getnetbyname getnetent getpeername getpgrp getppid getpriority ' +
+ 'getprotobyname getprotobynumber getprotoent getpwent getpwnam getpwuid ' +
+ 'getservbyname getservbyport getservent getsockname getsockopt glob ' +
+ 'gmtime grep hex index int ioctl join keys kill lc lcfirst length link ' +
+ 'listen localtime lock log lstat map mkdir msgctl msgget msgrcv msgsnd ' +
+ 'oct open opendir ord pack pipe pop pos print printf prototype push ' +
+ 'quotemeta rand read readdir readline readlink readpipe recv rename ' +
+ 'reset reverse rewinddir rindex rmdir scalar seek seekdir select semctl ' +
+ 'semget semop send setgrent sethostent setnetent setpgrp setpriority ' +
+ 'setprotoent setpwent setservent setsockopt shift shmctl shmget shmread ' +
+ 'shmwrite shutdown sin sleep socket socketpair sort splice split sprintf ' +
+ 'sqrt srand stat study substr symlink syscall sysopen sysread sysseek ' +
+ 'system syswrite tell telldir time times tr truncate uc ucfirst umask ' +
+ 'undef unlink unpack unshift utime values vec wait waitpid warn write';
+
+ var keywords =
+ 'bless caller continue dbmclose dbmopen die do dump else elsif eval exit ' +
+ 'for foreach goto if import last local my next no our package redo ref ' +
+ 'require return sub tie tied unless untie until use wantarray while';
+
+ this.regexList = [
+ { regex: new RegExp('#[^!].*$', 'gm'), css: 'comments' },
+ { regex: new RegExp('^\\s*#!.*$', 'gm'), css: 'preprocessor' }, // shebang
+ { regex: SyntaxHighlighter.regexLib.doubleQuotedString, css: 'string' },
+ { regex: SyntaxHighlighter.regexLib.singleQuotedString, css: 'string' },
+ { regex: new RegExp('(\\$|@|%)\\w+', 'g'), css: 'variable' },
+ { regex: new RegExp(this.getKeywords(funcs), 'gmi'), css: 'functions' },
+ { regex: new RegExp(this.getKeywords(keywords), 'gm'), css: 'keyword' }
+ ];
+
+ this.forHtmlScript(SyntaxHighlighter.regexLib.phpScriptTags);
+ }
+
+ Brush.prototype = new SyntaxHighlighter.Highlighter();
+ Brush.aliases = ['perl', 'Perl', 'pl'];
+
+ SyntaxHighlighter.brushes.Perl = Brush;
+
+ // CommonJS
+ typeof(exports) != 'undefined' ? exports.Brush = Brush : null;
+})();
diff --git a/upstream/clipper-6.4.2/Documentation/Scripts/SyntaxHighlighter/scripts/shBrushPhp.js b/upstream/clipper-6.4.2/Documentation/Scripts/SyntaxHighlighter/scripts/shBrushPhp.js
new file mode 100644
index 0000000..95e6e43
--- /dev/null
+++ b/upstream/clipper-6.4.2/Documentation/Scripts/SyntaxHighlighter/scripts/shBrushPhp.js
@@ -0,0 +1,88 @@
+/**
+ * SyntaxHighlighter
+ * http://alexgorbatchev.com/SyntaxHighlighter
+ *
+ * SyntaxHighlighter is donationware. If you are using it, please donate.
+ * http://alexgorbatchev.com/SyntaxHighlighter/donate.html
+ *
+ * @version
+ * 3.0.83 (July 02 2010)
+ *
+ * @copyright
+ * Copyright (C) 2004-2010 Alex Gorbatchev.
+ *
+ * @license
+ * Dual licensed under the MIT and GPL licenses.
+ */
+;(function()
+{
+ // CommonJS
+ typeof(require) != 'undefined' ? SyntaxHighlighter = require('shCore').SyntaxHighlighter : null;
+
+ function Brush()
+ {
+ var funcs = 'abs acos acosh addcslashes addslashes ' +
+ 'array_change_key_case array_chunk array_combine array_count_values array_diff '+
+ 'array_diff_assoc array_diff_key array_diff_uassoc array_diff_ukey array_fill '+
+ 'array_filter array_flip array_intersect array_intersect_assoc array_intersect_key '+
+ 'array_intersect_uassoc array_intersect_ukey array_key_exists array_keys array_map '+
+ 'array_merge array_merge_recursive array_multisort array_pad array_pop array_product '+
+ 'array_push array_rand array_reduce array_reverse array_search array_shift '+
+ 'array_slice array_splice array_sum array_udiff array_udiff_assoc '+
+ 'array_udiff_uassoc array_uintersect array_uintersect_assoc '+
+ 'array_uintersect_uassoc array_unique array_unshift array_values array_walk '+
+ 'array_walk_recursive atan atan2 atanh base64_decode base64_encode base_convert '+
+ 'basename bcadd bccomp bcdiv bcmod bcmul bindec bindtextdomain bzclose bzcompress '+
+ 'bzdecompress bzerrno bzerror bzerrstr bzflush bzopen bzread bzwrite ceil chdir '+
+ 'checkdate checkdnsrr chgrp chmod chop chown chr chroot chunk_split class_exists '+
+ 'closedir closelog copy cos cosh count count_chars date decbin dechex decoct '+
+ 'deg2rad delete ebcdic2ascii echo empty end ereg ereg_replace eregi eregi_replace error_log '+
+ 'error_reporting escapeshellarg escapeshellcmd eval exec exit exp explode extension_loaded '+
+ 'feof fflush fgetc fgetcsv fgets fgetss file_exists file_get_contents file_put_contents '+
+ 'fileatime filectime filegroup fileinode filemtime fileowner fileperms filesize filetype '+
+ 'floatval flock floor flush fmod fnmatch fopen fpassthru fprintf fputcsv fputs fread fscanf '+
+ 'fseek fsockopen fstat ftell ftok getallheaders getcwd getdate getenv gethostbyaddr gethostbyname '+
+ 'gethostbynamel getimagesize getlastmod getmxrr getmygid getmyinode getmypid getmyuid getopt '+
+ 'getprotobyname getprotobynumber getrandmax getrusage getservbyname getservbyport gettext '+
+ 'gettimeofday gettype glob gmdate gmmktime ini_alter ini_get ini_get_all ini_restore ini_set '+
+ 'interface_exists intval ip2long is_a is_array is_bool is_callable is_dir is_double '+
+ 'is_executable is_file is_finite is_float is_infinite is_int is_integer is_link is_long '+
+ 'is_nan is_null is_numeric is_object is_readable is_real is_resource is_scalar is_soap_fault '+
+ 'is_string is_subclass_of is_uploaded_file is_writable is_writeable mkdir mktime nl2br '+
+ 'parse_ini_file parse_str parse_url passthru pathinfo print readlink realpath rewind rewinddir rmdir '+
+ 'round str_ireplace str_pad str_repeat str_replace str_rot13 str_shuffle str_split '+
+ 'str_word_count strcasecmp strchr strcmp strcoll strcspn strftime strip_tags stripcslashes '+
+ 'stripos stripslashes stristr strlen strnatcasecmp strnatcmp strncasecmp strncmp strpbrk '+
+ 'strpos strptime strrchr strrev strripos strrpos strspn strstr strtok strtolower strtotime '+
+ 'strtoupper strtr strval substr substr_compare';
+
+ var keywords = 'abstract and array as break case catch cfunction class clone const continue declare default die do ' +
+ 'else elseif enddeclare endfor endforeach endif endswitch endwhile extends final for foreach ' +
+ 'function include include_once global goto if implements interface instanceof namespace new ' +
+ 'old_function or private protected public return require require_once static switch ' +
+ 'throw try use var while xor ';
+
+ var constants = '__FILE__ __LINE__ __METHOD__ __FUNCTION__ __CLASS__';
+
+ this.regexList = [
+ { regex: SyntaxHighlighter.regexLib.singleLineCComments, css: 'comments' }, // one line comments
+ { regex: SyntaxHighlighter.regexLib.multiLineCComments, css: 'comments' }, // multiline comments
+ { regex: SyntaxHighlighter.regexLib.doubleQuotedString, css: 'string' }, // double quoted strings
+ { regex: SyntaxHighlighter.regexLib.singleQuotedString, css: 'string' }, // single quoted strings
+ { regex: /\$\w+/g, css: 'variable' }, // variables
+ { regex: new RegExp(this.getKeywords(funcs), 'gmi'), css: 'functions' }, // common functions
+ { regex: new RegExp(this.getKeywords(constants), 'gmi'), css: 'constants' }, // constants
+ { regex: new RegExp(this.getKeywords(keywords), 'gm'), css: 'keyword' } // keyword
+ ];
+
+ this.forHtmlScript(SyntaxHighlighter.regexLib.phpScriptTags);
+ };
+
+ Brush.prototype = new SyntaxHighlighter.Highlighter();
+ Brush.aliases = ['php'];
+
+ SyntaxHighlighter.brushes.Php = Brush;
+
+ // CommonJS
+ typeof(exports) != 'undefined' ? exports.Brush = Brush : null;
+})();
diff --git a/upstream/clipper-6.4.2/Documentation/Scripts/SyntaxHighlighter/scripts/shBrushPlain.js b/upstream/clipper-6.4.2/Documentation/Scripts/SyntaxHighlighter/scripts/shBrushPlain.js
new file mode 100644
index 0000000..9f7d9e9
--- /dev/null
+++ b/upstream/clipper-6.4.2/Documentation/Scripts/SyntaxHighlighter/scripts/shBrushPlain.js
@@ -0,0 +1,33 @@
+/**
+ * SyntaxHighlighter
+ * http://alexgorbatchev.com/SyntaxHighlighter
+ *
+ * SyntaxHighlighter is donationware. If you are using it, please donate.
+ * http://alexgorbatchev.com/SyntaxHighlighter/donate.html
+ *
+ * @version
+ * 3.0.83 (July 02 2010)
+ *
+ * @copyright
+ * Copyright (C) 2004-2010 Alex Gorbatchev.
+ *
+ * @license
+ * Dual licensed under the MIT and GPL licenses.
+ */
+;(function()
+{
+ // CommonJS
+ typeof(require) != 'undefined' ? SyntaxHighlighter = require('shCore').SyntaxHighlighter : null;
+
+ function Brush()
+ {
+ };
+
+ Brush.prototype = new SyntaxHighlighter.Highlighter();
+ Brush.aliases = ['text', 'plain'];
+
+ SyntaxHighlighter.brushes.Plain = Brush;
+
+ // CommonJS
+ typeof(exports) != 'undefined' ? exports.Brush = Brush : null;
+})();
diff --git a/upstream/clipper-6.4.2/Documentation/Scripts/SyntaxHighlighter/scripts/shBrushPowerShell.js b/upstream/clipper-6.4.2/Documentation/Scripts/SyntaxHighlighter/scripts/shBrushPowerShell.js
new file mode 100644
index 0000000..0be1752
--- /dev/null
+++ b/upstream/clipper-6.4.2/Documentation/Scripts/SyntaxHighlighter/scripts/shBrushPowerShell.js
@@ -0,0 +1,74 @@
+/**
+ * SyntaxHighlighter
+ * http://alexgorbatchev.com/SyntaxHighlighter
+ *
+ * SyntaxHighlighter is donationware. If you are using it, please donate.
+ * http://alexgorbatchev.com/SyntaxHighlighter/donate.html
+ *
+ * @version
+ * 3.0.83 (July 02 2010)
+ *
+ * @copyright
+ * Copyright (C) 2004-2010 Alex Gorbatchev.
+ *
+ * @license
+ * Dual licensed under the MIT and GPL licenses.
+ */
+;(function()
+{
+ // CommonJS
+ typeof(require) != 'undefined' ? SyntaxHighlighter = require('shCore').SyntaxHighlighter : null;
+
+ function Brush()
+ {
+ // Contributes by B.v.Zanten, Getronics
+ // http://confluence.atlassian.com/display/CONFEXT/New+Code+Macro
+
+ var keywords = 'Add-Content Add-History Add-Member Add-PSSnapin Clear(-Content)? Clear-Item ' +
+ 'Clear-ItemProperty Clear-Variable Compare-Object ConvertFrom-SecureString Convert-Path ' +
+ 'ConvertTo-Html ConvertTo-SecureString Copy(-Item)? Copy-ItemProperty Export-Alias ' +
+ 'Export-Clixml Export-Console Export-Csv ForEach(-Object)? Format-Custom Format-List ' +
+ 'Format-Table Format-Wide Get-Acl Get-Alias Get-AuthenticodeSignature Get-ChildItem Get-Command ' +
+ 'Get-Content Get-Credential Get-Culture Get-Date Get-EventLog Get-ExecutionPolicy ' +
+ 'Get-Help Get-History Get-Host Get-Item Get-ItemProperty Get-Location Get-Member ' +
+ 'Get-PfxCertificate Get-Process Get-PSDrive Get-PSProvider Get-PSSnapin Get-Service ' +
+ 'Get-TraceSource Get-UICulture Get-Unique Get-Variable Get-WmiObject Group-Object ' +
+ 'Import-Alias Import-Clixml Import-Csv Invoke-Expression Invoke-History Invoke-Item ' +
+ 'Join-Path Measure-Command Measure-Object Move(-Item)? Move-ItemProperty New-Alias ' +
+ 'New-Item New-ItemProperty New-Object New-PSDrive New-Service New-TimeSpan ' +
+ 'New-Variable Out-Default Out-File Out-Host Out-Null Out-Printer Out-String Pop-Location ' +
+ 'Push-Location Read-Host Remove-Item Remove-ItemProperty Remove-PSDrive Remove-PSSnapin ' +
+ 'Remove-Variable Rename-Item Rename-ItemProperty Resolve-Path Restart-Service Resume-Service ' +
+ 'Select-Object Select-String Set-Acl Set-Alias Set-AuthenticodeSignature Set-Content ' +
+ 'Set-Date Set-ExecutionPolicy Set-Item Set-ItemProperty Set-Location Set-PSDebug ' +
+ 'Set-Service Set-TraceSource Set(-Variable)? Sort-Object Split-Path Start-Service ' +
+ 'Start-Sleep Start-Transcript Stop-Process Stop-Service Stop-Transcript Suspend-Service ' +
+ 'Tee-Object Test-Path Trace-Command Update-FormatData Update-TypeData Where(-Object)? ' +
+ 'Write-Debug Write-Error Write(-Host)? Write-Output Write-Progress Write-Verbose Write-Warning';
+ var alias = 'ac asnp clc cli clp clv cpi cpp cvpa diff epal epcsv fc fl ' +
+ 'ft fw gal gc gci gcm gdr ghy gi gl gm gp gps group gsv ' +
+ 'gsnp gu gv gwmi iex ihy ii ipal ipcsv mi mp nal ndr ni nv oh rdr ' +
+ 'ri rni rnp rp rsnp rv rvpa sal sasv sc select si sl sleep sort sp ' +
+ 'spps spsv sv tee cat cd cp h history kill lp ls ' +
+ 'mount mv popd ps pushd pwd r rm rmdir echo cls chdir del dir ' +
+ 'erase rd ren type % \\?';
+
+ this.regexList = [
+ { regex: /#.*$/gm, css: 'comments' }, // one line comments
+ { regex: /\$[a-zA-Z0-9]+\b/g, css: 'value' }, // variables $Computer1
+ { regex: /\-[a-zA-Z]+\b/g, css: 'keyword' }, // Operators -not -and -eq
+ { regex: SyntaxHighlighter.regexLib.doubleQuotedString, css: 'string' }, // strings
+ { regex: SyntaxHighlighter.regexLib.singleQuotedString, css: 'string' }, // strings
+ { regex: new RegExp(this.getKeywords(keywords), 'gmi'), css: 'keyword' },
+ { regex: new RegExp(this.getKeywords(alias), 'gmi'), css: 'keyword' }
+ ];
+ };
+
+ Brush.prototype = new SyntaxHighlighter.Highlighter();
+ Brush.aliases = ['powershell', 'ps'];
+
+ SyntaxHighlighter.brushes.PowerShell = Brush;
+
+ // CommonJS
+ typeof(exports) != 'undefined' ? exports.Brush = Brush : null;
+})();
diff --git a/upstream/clipper-6.4.2/Documentation/Scripts/SyntaxHighlighter/scripts/shBrushPython.js b/upstream/clipper-6.4.2/Documentation/Scripts/SyntaxHighlighter/scripts/shBrushPython.js
new file mode 100644
index 0000000..ce77462
--- /dev/null
+++ b/upstream/clipper-6.4.2/Documentation/Scripts/SyntaxHighlighter/scripts/shBrushPython.js
@@ -0,0 +1,64 @@
+/**
+ * SyntaxHighlighter
+ * http://alexgorbatchev.com/SyntaxHighlighter
+ *
+ * SyntaxHighlighter is donationware. If you are using it, please donate.
+ * http://alexgorbatchev.com/SyntaxHighlighter/donate.html
+ *
+ * @version
+ * 3.0.83 (July 02 2010)
+ *
+ * @copyright
+ * Copyright (C) 2004-2010 Alex Gorbatchev.
+ *
+ * @license
+ * Dual licensed under the MIT and GPL licenses.
+ */
+;(function()
+{
+ // CommonJS
+ typeof(require) != 'undefined' ? SyntaxHighlighter = require('shCore').SyntaxHighlighter : null;
+
+ function Brush()
+ {
+ // Contributed by Gheorghe Milas and Ahmad Sherif
+
+ var keywords = 'and assert break class continue def del elif else ' +
+ 'except exec finally for from global if import in is ' +
+ 'lambda not or pass print raise return try yield while';
+
+ var funcs = '__import__ abs all any apply basestring bin bool buffer callable ' +
+ 'chr classmethod cmp coerce compile complex delattr dict dir ' +
+ 'divmod enumerate eval execfile file filter float format frozenset ' +
+ 'getattr globals hasattr hash help hex id input int intern ' +
+ 'isinstance issubclass iter len list locals long map max min next ' +
+ 'object oct open ord pow print property range raw_input reduce ' +
+ 'reload repr reversed round set setattr slice sorted staticmethod ' +
+ 'str sum super tuple type type unichr unicode vars xrange zip';
+
+ var special = 'None True False self cls class_';
+
+ this.regexList = [
+ { regex: SyntaxHighlighter.regexLib.singleLinePerlComments, css: 'comments' },
+ { regex: /^\s*@\w+/gm, css: 'decorator' },
+ { regex: /(['\"]{3})([^\1])*?\1/gm, css: 'comments' },
+ { regex: /"(?!")(?:\.|\\\"|[^\""\n])*"/gm, css: 'string' },
+ { regex: /'(?!')(?:\.|(\\\')|[^\''\n])*'/gm, css: 'string' },
+ { regex: /\+|\-|\*|\/|\%|=|==/gm, css: 'keyword' },
+ { regex: /\b\d+\.?\w*/g, css: 'value' },
+ { regex: new RegExp(this.getKeywords(funcs), 'gmi'), css: 'functions' },
+ { regex: new RegExp(this.getKeywords(keywords), 'gm'), css: 'keyword' },
+ { regex: new RegExp(this.getKeywords(special), 'gm'), css: 'color1' }
+ ];
+
+ this.forHtmlScript(SyntaxHighlighter.regexLib.aspScriptTags);
+ };
+
+ Brush.prototype = new SyntaxHighlighter.Highlighter();
+ Brush.aliases = ['py', 'python'];
+
+ SyntaxHighlighter.brushes.Python = Brush;
+
+ // CommonJS
+ typeof(exports) != 'undefined' ? exports.Brush = Brush : null;
+})();
diff --git a/upstream/clipper-6.4.2/Documentation/Scripts/SyntaxHighlighter/scripts/shBrushRuby.js b/upstream/clipper-6.4.2/Documentation/Scripts/SyntaxHighlighter/scripts/shBrushRuby.js
new file mode 100644
index 0000000..ff82130
--- /dev/null
+++ b/upstream/clipper-6.4.2/Documentation/Scripts/SyntaxHighlighter/scripts/shBrushRuby.js
@@ -0,0 +1,55 @@
+/**
+ * SyntaxHighlighter
+ * http://alexgorbatchev.com/SyntaxHighlighter
+ *
+ * SyntaxHighlighter is donationware. If you are using it, please donate.
+ * http://alexgorbatchev.com/SyntaxHighlighter/donate.html
+ *
+ * @version
+ * 3.0.83 (July 02 2010)
+ *
+ * @copyright
+ * Copyright (C) 2004-2010 Alex Gorbatchev.
+ *
+ * @license
+ * Dual licensed under the MIT and GPL licenses.
+ */
+;(function()
+{
+ // CommonJS
+ typeof(require) != 'undefined' ? SyntaxHighlighter = require('shCore').SyntaxHighlighter : null;
+
+ function Brush()
+ {
+ // Contributed by Erik Peterson.
+
+ var keywords = 'alias and BEGIN begin break case class def define_method defined do each else elsif ' +
+ 'END end ensure false for if in module new next nil not or raise redo rescue retry return ' +
+ 'self super then throw true undef unless until when while yield';
+
+ var builtins = 'Array Bignum Binding Class Continuation Dir Exception FalseClass File::Stat File Fixnum Fload ' +
+ 'Hash Integer IO MatchData Method Module NilClass Numeric Object Proc Range Regexp String Struct::TMS Symbol ' +
+ 'ThreadGroup Thread Time TrueClass';
+
+ this.regexList = [
+ { regex: SyntaxHighlighter.regexLib.singleLinePerlComments, css: 'comments' }, // one line comments
+ { regex: SyntaxHighlighter.regexLib.doubleQuotedString, css: 'string' }, // double quoted strings
+ { regex: SyntaxHighlighter.regexLib.singleQuotedString, css: 'string' }, // single quoted strings
+ { regex: /\b[A-Z0-9_]+\b/g, css: 'constants' }, // constants
+ { regex: /:[a-z][A-Za-z0-9_]*/g, css: 'color2' }, // symbols
+ { regex: /(\$|@@|@)\w+/g, css: 'variable bold' }, // $global, @instance, and @@class variables
+ { regex: new RegExp(this.getKeywords(keywords), 'gm'), css: 'keyword' }, // keywords
+ { regex: new RegExp(this.getKeywords(builtins), 'gm'), css: 'color1' } // builtins
+ ];
+
+ this.forHtmlScript(SyntaxHighlighter.regexLib.aspScriptTags);
+ };
+
+ Brush.prototype = new SyntaxHighlighter.Highlighter();
+ Brush.aliases = ['ruby', 'rails', 'ror', 'rb'];
+
+ SyntaxHighlighter.brushes.Ruby = Brush;
+
+ // CommonJS
+ typeof(exports) != 'undefined' ? exports.Brush = Brush : null;
+})();
diff --git a/upstream/clipper-6.4.2/Documentation/Scripts/SyntaxHighlighter/scripts/shBrushSass.js b/upstream/clipper-6.4.2/Documentation/Scripts/SyntaxHighlighter/scripts/shBrushSass.js
new file mode 100644
index 0000000..aa04da0
--- /dev/null
+++ b/upstream/clipper-6.4.2/Documentation/Scripts/SyntaxHighlighter/scripts/shBrushSass.js
@@ -0,0 +1,94 @@
+/**
+ * SyntaxHighlighter
+ * http://alexgorbatchev.com/SyntaxHighlighter
+ *
+ * SyntaxHighlighter is donationware. If you are using it, please donate.
+ * http://alexgorbatchev.com/SyntaxHighlighter/donate.html
+ *
+ * @version
+ * 3.0.83 (July 02 2010)
+ *
+ * @copyright
+ * Copyright (C) 2004-2010 Alex Gorbatchev.
+ *
+ * @license
+ * Dual licensed under the MIT and GPL licenses.
+ */
+;(function()
+{
+ // CommonJS
+ typeof(require) != 'undefined' ? SyntaxHighlighter = require('shCore').SyntaxHighlighter : null;
+
+ function Brush()
+ {
+ function getKeywordsCSS(str)
+ {
+ return '\\b([a-z_]|)' + str.replace(/ /g, '(?=:)\\b|\\b([a-z_\\*]|\\*|)') + '(?=:)\\b';
+ };
+
+ function getValuesCSS(str)
+ {
+ return '\\b' + str.replace(/ /g, '(?!-)(?!:)\\b|\\b()') + '\:\\b';
+ };
+
+ var keywords = 'ascent azimuth background-attachment background-color background-image background-position ' +
+ 'background-repeat background baseline bbox border-collapse border-color border-spacing border-style border-top ' +
+ 'border-right border-bottom border-left border-top-color border-right-color border-bottom-color border-left-color ' +
+ 'border-top-style border-right-style border-bottom-style border-left-style border-top-width border-right-width ' +
+ 'border-bottom-width border-left-width border-width border bottom cap-height caption-side centerline clear clip color ' +
+ 'content counter-increment counter-reset cue-after cue-before cue cursor definition-src descent direction display ' +
+ 'elevation empty-cells float font-size-adjust font-family font-size font-stretch font-style font-variant font-weight font ' +
+ 'height left letter-spacing line-height list-style-image list-style-position list-style-type list-style margin-top ' +
+ 'margin-right margin-bottom margin-left margin marker-offset marks mathline max-height max-width min-height min-width orphans ' +
+ 'outline-color outline-style outline-width outline overflow padding-top padding-right padding-bottom padding-left padding page ' +
+ 'page-break-after page-break-before page-break-inside pause pause-after pause-before pitch pitch-range play-during position ' +
+ 'quotes right richness size slope src speak-header speak-numeral speak-punctuation speak speech-rate stemh stemv stress ' +
+ 'table-layout text-align top text-decoration text-indent text-shadow text-transform unicode-bidi unicode-range units-per-em ' +
+ 'vertical-align visibility voice-family volume white-space widows width widths word-spacing x-height z-index';
+
+ var values = 'above absolute all always aqua armenian attr aural auto avoid baseline behind below bidi-override black blink block blue bold bolder '+
+ 'both bottom braille capitalize caption center center-left center-right circle close-quote code collapse compact condensed '+
+ 'continuous counter counters crop cross crosshair cursive dashed decimal decimal-leading-zero digits disc dotted double '+
+ 'embed embossed e-resize expanded extra-condensed extra-expanded fantasy far-left far-right fast faster fixed format fuchsia '+
+ 'gray green groove handheld hebrew help hidden hide high higher icon inline-table inline inset inside invert italic '+
+ 'justify landscape large larger left-side left leftwards level lighter lime line-through list-item local loud lower-alpha '+
+ 'lowercase lower-greek lower-latin lower-roman lower low ltr marker maroon medium message-box middle mix move narrower '+
+ 'navy ne-resize no-close-quote none no-open-quote no-repeat normal nowrap n-resize nw-resize oblique olive once open-quote outset '+
+ 'outside overline pointer portrait pre print projection purple red relative repeat repeat-x repeat-y rgb ridge right right-side '+
+ 'rightwards rtl run-in screen scroll semi-condensed semi-expanded separate se-resize show silent silver slower slow '+
+ 'small small-caps small-caption smaller soft solid speech spell-out square s-resize static status-bar sub super sw-resize '+
+ 'table-caption table-cell table-column table-column-group table-footer-group table-header-group table-row table-row-group teal '+
+ 'text-bottom text-top thick thin top transparent tty tv ultra-condensed ultra-expanded underline upper-alpha uppercase upper-latin '+
+ 'upper-roman url visible wait white wider w-resize x-fast x-high x-large x-loud x-low x-slow x-small x-soft xx-large xx-small yellow';
+
+ var fonts = '[mM]onospace [tT]ahoma [vV]erdana [aA]rial [hH]elvetica [sS]ans-serif [sS]erif [cC]ourier mono sans serif';
+
+ var statements = '!important !default';
+ var preprocessor = '@import @extend @debug @warn @if @for @while @mixin @include';
+
+ var r = SyntaxHighlighter.regexLib;
+
+ this.regexList = [
+ { regex: r.multiLineCComments, css: 'comments' }, // multiline comments
+ { regex: r.singleLineCComments, css: 'comments' }, // singleline comments
+ { regex: r.doubleQuotedString, css: 'string' }, // double quoted strings
+ { regex: r.singleQuotedString, css: 'string' }, // single quoted strings
+ { regex: /\#[a-fA-F0-9]{3,6}/g, css: 'value' }, // html colors
+ { regex: /\b(-?\d+)(\.\d+)?(px|em|pt|\:|\%|)\b/g, css: 'value' }, // sizes
+ { regex: /\$\w+/g, css: 'variable' }, // variables
+ { regex: new RegExp(this.getKeywords(statements), 'g'), css: 'color3' }, // statements
+ { regex: new RegExp(this.getKeywords(preprocessor), 'g'), css: 'preprocessor' }, // preprocessor
+ { regex: new RegExp(getKeywordsCSS(keywords), 'gm'), css: 'keyword' }, // keywords
+ { regex: new RegExp(getValuesCSS(values), 'g'), css: 'value' }, // values
+ { regex: new RegExp(this.getKeywords(fonts), 'g'), css: 'color1' } // fonts
+ ];
+ };
+
+ Brush.prototype = new SyntaxHighlighter.Highlighter();
+ Brush.aliases = ['sass', 'scss'];
+
+ SyntaxHighlighter.brushes.Sass = Brush;
+
+ // CommonJS
+ typeof(exports) != 'undefined' ? exports.Brush = Brush : null;
+})();
diff --git a/upstream/clipper-6.4.2/Documentation/Scripts/SyntaxHighlighter/scripts/shBrushScala.js b/upstream/clipper-6.4.2/Documentation/Scripts/SyntaxHighlighter/scripts/shBrushScala.js
new file mode 100644
index 0000000..4b0b6f0
--- /dev/null
+++ b/upstream/clipper-6.4.2/Documentation/Scripts/SyntaxHighlighter/scripts/shBrushScala.js
@@ -0,0 +1,51 @@
+/**
+ * SyntaxHighlighter
+ * http://alexgorbatchev.com/SyntaxHighlighter
+ *
+ * SyntaxHighlighter is donationware. If you are using it, please donate.
+ * http://alexgorbatchev.com/SyntaxHighlighter/donate.html
+ *
+ * @version
+ * 3.0.83 (July 02 2010)
+ *
+ * @copyright
+ * Copyright (C) 2004-2010 Alex Gorbatchev.
+ *
+ * @license
+ * Dual licensed under the MIT and GPL licenses.
+ */
+;(function()
+{
+ // CommonJS
+ typeof(require) != 'undefined' ? SyntaxHighlighter = require('shCore').SyntaxHighlighter : null;
+
+ function Brush()
+ {
+ // Contributed by Yegor Jbanov and David Bernard.
+
+ var keywords = 'val sealed case def true trait implicit forSome import match object null finally super ' +
+ 'override try lazy for var catch throw type extends class while with new final yield abstract ' +
+ 'else do if return protected private this package false';
+
+ var keyops = '[_:=><%#@]+';
+
+ this.regexList = [
+ { regex: SyntaxHighlighter.regexLib.singleLineCComments, css: 'comments' }, // one line comments
+ { regex: SyntaxHighlighter.regexLib.multiLineCComments, css: 'comments' }, // multiline comments
+ { regex: SyntaxHighlighter.regexLib.multiLineSingleQuotedString, css: 'string' }, // multi-line strings
+ { regex: SyntaxHighlighter.regexLib.multiLineDoubleQuotedString, css: 'string' }, // double-quoted string
+ { regex: SyntaxHighlighter.regexLib.singleQuotedString, css: 'string' }, // strings
+ { regex: /0x[a-f0-9]+|\d+(\.\d+)?/gi, css: 'value' }, // numbers
+ { regex: new RegExp(this.getKeywords(keywords), 'gm'), css: 'keyword' }, // keywords
+ { regex: new RegExp(keyops, 'gm'), css: 'keyword' } // scala keyword
+ ];
+ }
+
+ Brush.prototype = new SyntaxHighlighter.Highlighter();
+ Brush.aliases = ['scala'];
+
+ SyntaxHighlighter.brushes.Scala = Brush;
+
+ // CommonJS
+ typeof(exports) != 'undefined' ? exports.Brush = Brush : null;
+})();
diff --git a/upstream/clipper-6.4.2/Documentation/Scripts/SyntaxHighlighter/scripts/shBrushSql.js b/upstream/clipper-6.4.2/Documentation/Scripts/SyntaxHighlighter/scripts/shBrushSql.js
new file mode 100644
index 0000000..5c2cd88
--- /dev/null
+++ b/upstream/clipper-6.4.2/Documentation/Scripts/SyntaxHighlighter/scripts/shBrushSql.js
@@ -0,0 +1,66 @@
+/**
+ * SyntaxHighlighter
+ * http://alexgorbatchev.com/SyntaxHighlighter
+ *
+ * SyntaxHighlighter is donationware. If you are using it, please donate.
+ * http://alexgorbatchev.com/SyntaxHighlighter/donate.html
+ *
+ * @version
+ * 3.0.83 (July 02 2010)
+ *
+ * @copyright
+ * Copyright (C) 2004-2010 Alex Gorbatchev.
+ *
+ * @license
+ * Dual licensed under the MIT and GPL licenses.
+ */
+;(function()
+{
+ // CommonJS
+ typeof(require) != 'undefined' ? SyntaxHighlighter = require('shCore').SyntaxHighlighter : null;
+
+ function Brush()
+ {
+ var funcs = 'abs avg case cast coalesce convert count current_timestamp ' +
+ 'current_user day isnull left lower month nullif replace right ' +
+ 'session_user space substring sum system_user upper user year';
+
+ var keywords = 'absolute action add after alter as asc at authorization begin bigint ' +
+ 'binary bit by cascade char character check checkpoint close collate ' +
+ 'column commit committed connect connection constraint contains continue ' +
+ 'create cube current current_date current_time cursor database date ' +
+ 'deallocate dec decimal declare default delete desc distinct double drop ' +
+ 'dynamic else end end-exec escape except exec execute false fetch first ' +
+ 'float for force foreign forward free from full function global goto grant ' +
+ 'group grouping having hour ignore index inner insensitive insert instead ' +
+ 'int integer intersect into is isolation key last level load local max min ' +
+ 'minute modify move name national nchar next no numeric of off on only ' +
+ 'open option order out output partial password precision prepare primary ' +
+ 'prior privileges procedure public read real references relative repeatable ' +
+ 'restrict return returns revoke rollback rollup rows rule schema scroll ' +
+ 'second section select sequence serializable set size smallint static ' +
+ 'statistics table temp temporary then time timestamp to top transaction ' +
+ 'translation trigger true truncate uncommitted union unique update values ' +
+ 'varchar varying view when where with work';
+
+ var operators = 'all and any between cross in join like not null or outer some';
+
+ this.regexList = [
+ { regex: /--(.*)$/gm, css: 'comments' }, // one line and multiline comments
+ { regex: SyntaxHighlighter.regexLib.multiLineDoubleQuotedString, css: 'string' }, // double quoted strings
+ { regex: SyntaxHighlighter.regexLib.multiLineSingleQuotedString, css: 'string' }, // single quoted strings
+ { regex: new RegExp(this.getKeywords(funcs), 'gmi'), css: 'color2' }, // functions
+ { regex: new RegExp(this.getKeywords(operators), 'gmi'), css: 'color1' }, // operators and such
+ { regex: new RegExp(this.getKeywords(keywords), 'gmi'), css: 'keyword' } // keyword
+ ];
+ };
+
+ Brush.prototype = new SyntaxHighlighter.Highlighter();
+ Brush.aliases = ['sql'];
+
+ SyntaxHighlighter.brushes.Sql = Brush;
+
+ // CommonJS
+ typeof(exports) != 'undefined' ? exports.Brush = Brush : null;
+})();
+
diff --git a/upstream/clipper-6.4.2/Documentation/Scripts/SyntaxHighlighter/scripts/shBrushVb.js b/upstream/clipper-6.4.2/Documentation/Scripts/SyntaxHighlighter/scripts/shBrushVb.js
new file mode 100644
index 0000000..be845dc
--- /dev/null
+++ b/upstream/clipper-6.4.2/Documentation/Scripts/SyntaxHighlighter/scripts/shBrushVb.js
@@ -0,0 +1,56 @@
+/**
+ * SyntaxHighlighter
+ * http://alexgorbatchev.com/SyntaxHighlighter
+ *
+ * SyntaxHighlighter is donationware. If you are using it, please donate.
+ * http://alexgorbatchev.com/SyntaxHighlighter/donate.html
+ *
+ * @version
+ * 3.0.83 (July 02 2010)
+ *
+ * @copyright
+ * Copyright (C) 2004-2010 Alex Gorbatchev.
+ *
+ * @license
+ * Dual licensed under the MIT and GPL licenses.
+ */
+;(function()
+{
+ // CommonJS
+ typeof(require) != 'undefined' ? SyntaxHighlighter = require('shCore').SyntaxHighlighter : null;
+
+ function Brush()
+ {
+ var keywords = 'AddHandler AddressOf AndAlso Alias And Ansi As Assembly Auto ' +
+ 'Boolean ByRef Byte ByVal Call Case Catch CBool CByte CChar CDate ' +
+ 'CDec CDbl Char CInt Class CLng CObj Const CShort CSng CStr CType ' +
+ 'Date Decimal Declare Default Delegate Dim DirectCast Do Double Each ' +
+ 'Else ElseIf End Enum Erase Error Event Exit False Finally For Friend ' +
+ 'Function Get GetType GoSub GoTo Handles If Implements Imports In ' +
+ 'Inherits Integer Interface Is Let Lib Like Long Loop Me Mod Module ' +
+ 'MustInherit MustOverride MyBase MyClass Namespace New Next Not Nothing ' +
+ 'NotInheritable NotOverridable Object On Option Optional Or OrElse ' +
+ 'Overloads Overridable Overrides ParamArray Preserve Private Property ' +
+ 'Protected Public RaiseEvent ReadOnly ReDim REM RemoveHandler Resume ' +
+ 'Return Select Set Shadows Shared Short Single Static Step Stop String ' +
+ 'Structure Sub SyncLock Then Throw To True Try TypeOf Unicode Until ' +
+ 'Variant When While With WithEvents WriteOnly Xor';
+
+ this.regexList = [
+ { regex: /'.*$/gm, css: 'comments' }, // one line comments
+ { regex: SyntaxHighlighter.regexLib.doubleQuotedString, css: 'string' }, // strings
+ { regex: /^\s*#.*$/gm, css: 'preprocessor' }, // preprocessor tags like #region and #endregion
+ { regex: new RegExp(this.getKeywords(keywords), 'gm'), css: 'keyword' } // vb keyword
+ ];
+
+ this.forHtmlScript(SyntaxHighlighter.regexLib.aspScriptTags);
+ };
+
+ Brush.prototype = new SyntaxHighlighter.Highlighter();
+ Brush.aliases = ['vb', 'vbnet'];
+
+ SyntaxHighlighter.brushes.Vb = Brush;
+
+ // CommonJS
+ typeof(exports) != 'undefined' ? exports.Brush = Brush : null;
+})();
diff --git a/upstream/clipper-6.4.2/Documentation/Scripts/SyntaxHighlighter/scripts/shBrushXml.js b/upstream/clipper-6.4.2/Documentation/Scripts/SyntaxHighlighter/scripts/shBrushXml.js
new file mode 100644
index 0000000..69d9fd0
--- /dev/null
+++ b/upstream/clipper-6.4.2/Documentation/Scripts/SyntaxHighlighter/scripts/shBrushXml.js
@@ -0,0 +1,69 @@
+/**
+ * SyntaxHighlighter
+ * http://alexgorbatchev.com/SyntaxHighlighter
+ *
+ * SyntaxHighlighter is donationware. If you are using it, please donate.
+ * http://alexgorbatchev.com/SyntaxHighlighter/donate.html
+ *
+ * @version
+ * 3.0.83 (July 02 2010)
+ *
+ * @copyright
+ * Copyright (C) 2004-2010 Alex Gorbatchev.
+ *
+ * @license
+ * Dual licensed under the MIT and GPL licenses.
+ */
+;(function()
+{
+ // CommonJS
+ typeof(require) != 'undefined' ? SyntaxHighlighter = require('shCore').SyntaxHighlighter : null;
+
+ function Brush()
+ {
+ function process(match, regexInfo)
+ {
+ var constructor = SyntaxHighlighter.Match,
+ code = match[0],
+ tag = new XRegExp('(&lt;|<)[\\s\\/\\?]*(?<name>[:\\w-\\.]+)', 'xg').exec(code),
+ result = []
+ ;
+
+ if (match.attributes != null)
+ {
+ var attributes,
+ regex = new XRegExp('(?<name> [\\w:\\-\\.]+)' +
+ '\\s*=\\s*' +
+ '(?<value> ".*?"|\'.*?\'|\\w+)',
+ 'xg');
+
+ while ((attributes = regex.exec(code)) != null)
+ {
+ result.push(new constructor(attributes.name, match.index + attributes.index, 'color1'));
+ result.push(new constructor(attributes.value, match.index + attributes.index + attributes[0].indexOf(attributes.value), 'string'));
+ }
+ }
+
+ if (tag != null)
+ result.push(
+ new constructor(tag.name, match.index + tag[0].indexOf(tag.name), 'keyword')
+ );
+
+ return result;
+ }
+
+ this.regexList = [
+ { regex: new XRegExp('(\\&lt;|<)\\!\\[[\\w\\s]*?\\[(.|\\s)*?\\]\\](\\&gt;|>)', 'gm'), css: 'color2' }, // <![ ... [ ... ]]>
+ { regex: SyntaxHighlighter.regexLib.xmlComments, css: 'comments' }, // <!-- ... -->
+ { regex: new XRegExp('(&lt;|<)[\\s\\/\\?]*(\\w+)(?<attributes>.*?)[\\s\\/\\?]*(&gt;|>)', 'sg'), func: process }
+ ];
+ };
+
+ Brush.prototype = new SyntaxHighlighter.Highlighter();
+ Brush.aliases = ['xml', 'xhtml', 'xslt', 'html'];
+
+ SyntaxHighlighter.brushes.Xml = Brush;
+
+ // CommonJS
+ typeof(exports) != 'undefined' ? exports.Brush = Brush : null;
+})();
diff --git a/upstream/clipper-6.4.2/Documentation/Scripts/SyntaxHighlighter/scripts/shCore.js b/upstream/clipper-6.4.2/Documentation/Scripts/SyntaxHighlighter/scripts/shCore.js
new file mode 100644
index 0000000..b47b645
--- /dev/null
+++ b/upstream/clipper-6.4.2/Documentation/Scripts/SyntaxHighlighter/scripts/shCore.js
@@ -0,0 +1,17 @@
+/**
+ * SyntaxHighlighter
+ * http://alexgorbatchev.com/SyntaxHighlighter
+ *
+ * SyntaxHighlighter is donationware. If you are using it, please donate.
+ * http://alexgorbatchev.com/SyntaxHighlighter/donate.html
+ *
+ * @version
+ * 3.0.83 (July 02 2010)
+ *
+ * @copyright
+ * Copyright (C) 2004-2010 Alex Gorbatchev.
+ *
+ * @license
+ * Dual licensed under the MIT and GPL licenses.
+ */
+eval(function(p,a,c,k,e,d){e=function(c){return(c<a?'':e(parseInt(c/a)))+((c=c%a)>35?String.fromCharCode(c+29):c.toString(36))};if(!''.replace(/^/,String)){while(c--){d[e(c)]=k[c]||e(c)}k=[function(e){return d[e]}];e=function(){return'\\w+'};c=1};while(c--){if(k[c]){p=p.replace(new RegExp('\\b'+e(c)+'\\b','g'),k[c])}}return p}('K M;I(M)1S 2U("2a\'t 4k M 4K 2g 3l 4G 4H");(6(){6 r(f,e){I(!M.1R(f))1S 3m("3s 15 4R");K a=f.1w;f=M(f.1m,t(f)+(e||""));I(a)f.1w={1m:a.1m,19:a.19?a.19.1a(0):N};H f}6 t(f){H(f.1J?"g":"")+(f.4s?"i":"")+(f.4p?"m":"")+(f.4v?"x":"")+(f.3n?"y":"")}6 B(f,e,a,b){K c=u.L,d,h,g;v=R;5K{O(;c--;){g=u[c];I(a&g.3r&&(!g.2p||g.2p.W(b))){g.2q.12=e;I((h=g.2q.X(f))&&h.P===e){d={3k:g.2b.W(b,h,a),1C:h};1N}}}}5v(i){1S i}5q{v=11}H d}6 p(f,e,a){I(3b.Z.1i)H f.1i(e,a);O(a=a||0;a<f.L;a++)I(f[a]===e)H a;H-1}M=6(f,e){K a=[],b=M.1B,c=0,d,h;I(M.1R(f)){I(e!==1d)1S 3m("2a\'t 5r 5I 5F 5B 5C 15 5E 5p");H r(f)}I(v)1S 2U("2a\'t W 3l M 59 5m 5g 5x 5i");e=e||"";O(d={2N:11,19:[],2K:6(g){H e.1i(g)>-1},3d:6(g){e+=g}};c<f.L;)I(h=B(f,c,b,d)){a.U(h.3k);c+=h.1C[0].L||1}Y I(h=n.X.W(z[b],f.1a(c))){a.U(h[0]);c+=h[0].L}Y{h=f.3a(c);I(h==="[")b=M.2I;Y I(h==="]")b=M.1B;a.U(h);c++}a=15(a.1K(""),n.Q.W(e,w,""));a.1w={1m:f,19:d.2N?d.19:N};H a};M.3v="1.5.0";M.2I=1;M.1B=2;K C=/\\$(?:(\\d\\d?|[$&`\'])|{([$\\w]+)})/g,w=/[^5h]+|([\\s\\S])(?=[\\s\\S]*\\1)/g,A=/^(?:[?*+]|{\\d+(?:,\\d*)?})\\??/,v=11,u=[],n={X:15.Z.X,1A:15.Z.1A,1C:1r.Z.1C,Q:1r.Z.Q,1e:1r.Z.1e},x=n.X.W(/()??/,"")[1]===1d,D=6(){K f=/^/g;n.1A.W(f,"");H!f.12}(),y=6(){K f=/x/g;n.Q.W("x",f,"");H!f.12}(),E=15.Z.3n!==1d,z={};z[M.2I]=/^(?:\\\\(?:[0-3][0-7]{0,2}|[4-7][0-7]?|x[\\29-26-f]{2}|u[\\29-26-f]{4}|c[A-3o-z]|[\\s\\S]))/;z[M.1B]=/^(?:\\\\(?:0(?:[0-3][0-7]{0,2}|[4-7][0-7]?)?|[1-9]\\d*|x[\\29-26-f]{2}|u[\\29-26-f]{4}|c[A-3o-z]|[\\s\\S])|\\(\\?[:=!]|[?*+]\\?|{\\d+(?:,\\d*)?}\\??)/;M.1h=6(f,e,a,b){u.U({2q:r(f,"g"+(E?"y":"")),2b:e,3r:a||M.1B,2p:b||N})};M.2n=6(f,e){K a=f+"/"+(e||"");H M.2n[a]||(M.2n[a]=M(f,e))};M.3c=6(f){H r(f,"g")};M.5l=6(f){H f.Q(/[-[\\]{}()*+?.,\\\\^$|#\\s]/g,"\\\\$&")};M.5e=6(f,e,a,b){e=r(e,"g"+(b&&E?"y":""));e.12=a=a||0;f=e.X(f);H b?f&&f.P===a?f:N:f};M.3q=6(){M.1h=6(){1S 2U("2a\'t 55 1h 54 3q")}};M.1R=6(f){H 53.Z.1q.W(f)==="[2m 15]"};M.3p=6(f,e,a,b){O(K c=r(e,"g"),d=-1,h;h=c.X(f);){a.W(b,h,++d,f,c);c.12===h.P&&c.12++}I(e.1J)e.12=0};M.57=6(f,e){H 6 a(b,c){K d=e[c].1I?e[c]:{1I:e[c]},h=r(d.1I,"g"),g=[],i;O(i=0;i<b.L;i++)M.3p(b[i],h,6(k){g.U(d.3j?k[d.3j]||"":k[0])});H c===e.L-1||!g.L?g:a(g,c+1)}([f],0)};15.Z.1p=6(f,e){H J.X(e[0])};15.Z.W=6(f,e){H J.X(e)};15.Z.X=6(f){K e=n.X.1p(J,14),a;I(e){I(!x&&e.L>1&&p(e,"")>-1){a=15(J.1m,n.Q.W(t(J),"g",""));n.Q.W(f.1a(e.P),a,6(){O(K c=1;c<14.L-2;c++)I(14[c]===1d)e[c]=1d})}I(J.1w&&J.1w.19)O(K b=1;b<e.L;b++)I(a=J.1w.19[b-1])e[a]=e[b];!D&&J.1J&&!e[0].L&&J.12>e.P&&J.12--}H e};I(!D)15.Z.1A=6(f){(f=n.X.W(J,f))&&J.1J&&!f[0].L&&J.12>f.P&&J.12--;H!!f};1r.Z.1C=6(f){M.1R(f)||(f=15(f));I(f.1J){K e=n.1C.1p(J,14);f.12=0;H e}H f.X(J)};1r.Z.Q=6(f,e){K a=M.1R(f),b,c;I(a&&1j e.58()==="3f"&&e.1i("${")===-1&&y)H n.Q.1p(J,14);I(a){I(f.1w)b=f.1w.19}Y f+="";I(1j e==="6")c=n.Q.W(J,f,6(){I(b){14[0]=1f 1r(14[0]);O(K d=0;d<b.L;d++)I(b[d])14[0][b[d]]=14[d+1]}I(a&&f.1J)f.12=14[14.L-2]+14[0].L;H e.1p(N,14)});Y{c=J+"";c=n.Q.W(c,f,6(){K d=14;H n.Q.W(e,C,6(h,g,i){I(g)5b(g){24"$":H"$";24"&":H d[0];24"`":H d[d.L-1].1a(0,d[d.L-2]);24"\'":H d[d.L-1].1a(d[d.L-2]+d[0].L);5a:i="";g=+g;I(!g)H h;O(;g>d.L-3;){i=1r.Z.1a.W(g,-1)+i;g=1Q.3i(g/10)}H(g?d[g]||"":"$")+i}Y{g=+i;I(g<=d.L-3)H d[g];g=b?p(b,i):-1;H g>-1?d[g+1]:h}})})}I(a&&f.1J)f.12=0;H c};1r.Z.1e=6(f,e){I(!M.1R(f))H n.1e.1p(J,14);K a=J+"",b=[],c=0,d,h;I(e===1d||+e<0)e=5D;Y{e=1Q.3i(+e);I(!e)H[]}O(f=M.3c(f);d=f.X(a);){I(f.12>c){b.U(a.1a(c,d.P));d.L>1&&d.P<a.L&&3b.Z.U.1p(b,d.1a(1));h=d[0].L;c=f.12;I(b.L>=e)1N}f.12===d.P&&f.12++}I(c===a.L){I(!n.1A.W(f,"")||h)b.U("")}Y b.U(a.1a(c));H b.L>e?b.1a(0,e):b};M.1h(/\\(\\?#[^)]*\\)/,6(f){H n.1A.W(A,f.2S.1a(f.P+f[0].L))?"":"(?:)"});M.1h(/\\((?!\\?)/,6(){J.19.U(N);H"("});M.1h(/\\(\\?<([$\\w]+)>/,6(f){J.19.U(f[1]);J.2N=R;H"("});M.1h(/\\\\k<([\\w$]+)>/,6(f){K e=p(J.19,f[1]);H e>-1?"\\\\"+(e+1)+(3R(f.2S.3a(f.P+f[0].L))?"":"(?:)"):f[0]});M.1h(/\\[\\^?]/,6(f){H f[0]==="[]"?"\\\\b\\\\B":"[\\\\s\\\\S]"});M.1h(/^\\(\\?([5A]+)\\)/,6(f){J.3d(f[1]);H""});M.1h(/(?:\\s+|#.*)+/,6(f){H n.1A.W(A,f.2S.1a(f.P+f[0].L))?"":"(?:)"},M.1B,6(){H J.2K("x")});M.1h(/\\./,6(){H"[\\\\s\\\\S]"},M.1B,6(){H J.2K("s")})})();1j 2e!="1d"&&(2e.M=M);K 1v=6(){6 r(a,b){a.1l.1i(b)!=-1||(a.1l+=" "+b)}6 t(a){H a.1i("3e")==0?a:"3e"+a}6 B(a){H e.1Y.2A[t(a)]}6 p(a,b,c){I(a==N)H N;K d=c!=R?a.3G:[a.2G],h={"#":"1c",".":"1l"}[b.1o(0,1)]||"3h",g,i;g=h!="3h"?b.1o(1):b.5u();I((a[h]||"").1i(g)!=-1)H a;O(a=0;d&&a<d.L&&i==N;a++)i=p(d[a],b,c);H i}6 C(a,b){K c={},d;O(d 2g a)c[d]=a[d];O(d 2g b)c[d]=b[d];H c}6 w(a,b,c,d){6 h(g){g=g||1P.5y;I(!g.1F){g.1F=g.52;g.3N=6(){J.5w=11}}c.W(d||1P,g)}a.3g?a.3g("4U"+b,h):a.4y(b,h,11)}6 A(a,b){K c=e.1Y.2j,d=N;I(c==N){c={};O(K h 2g e.1U){K g=e.1U[h];d=g.4x;I(d!=N){g.1V=h.4w();O(g=0;g<d.L;g++)c[d[g]]=h}}e.1Y.2j=c}d=e.1U[c[a]];d==N&&b!=11&&1P.1X(e.13.1x.1X+(e.13.1x.3E+a));H d}6 v(a,b){O(K c=a.1e("\\n"),d=0;d<c.L;d++)c[d]=b(c[d],d);H c.1K("\\n")}6 u(a,b){I(a==N||a.L==0||a=="\\n")H a;a=a.Q(/</g,"&1y;");a=a.Q(/ {2,}/g,6(c){O(K d="",h=0;h<c.L-1;h++)d+=e.13.1W;H d+" "});I(b!=N)a=v(a,6(c){I(c.L==0)H"";K d="";c=c.Q(/^(&2s;| )+/,6(h){d=h;H""});I(c.L==0)H d;H d+\'<17 1g="\'+b+\'">\'+c+"</17>"});H a}6 n(a,b){a.1e("\\n");O(K c="",d=0;d<50;d++)c+=" ";H a=v(a,6(h){I(h.1i("\\t")==-1)H h;O(K g=0;(g=h.1i("\\t"))!=-1;)h=h.1o(0,g)+c.1o(0,b-g%b)+h.1o(g+1,h.L);H h})}6 x(a){H a.Q(/^\\s+|\\s+$/g,"")}6 D(a,b){I(a.P<b.P)H-1;Y I(a.P>b.P)H 1;Y I(a.L<b.L)H-1;Y I(a.L>b.L)H 1;H 0}6 y(a,b){6 c(k){H k[0]}O(K d=N,h=[],g=b.2D?b.2D:c;(d=b.1I.X(a))!=N;){K i=g(d,b);I(1j i=="3f")i=[1f e.2L(i,d.P,b.23)];h=h.1O(i)}H h}6 E(a){K b=/(.*)((&1G;|&1y;).*)/;H a.Q(e.3A.3M,6(c){K d="",h=N;I(h=b.X(c)){c=h[1];d=h[2]}H\'<a 2h="\'+c+\'">\'+c+"</a>"+d})}6 z(){O(K a=1E.36("1k"),b=[],c=0;c<a.L;c++)a[c].3s=="20"&&b.U(a[c]);H b}6 f(a){a=a.1F;K b=p(a,".20",R);a=p(a,".3O",R);K c=1E.4i("3t");I(!(!a||!b||p(a,"3t"))){B(b.1c);r(b,"1m");O(K d=a.3G,h=[],g=0;g<d.L;g++)h.U(d[g].4z||d[g].4A);h=h.1K("\\r");c.39(1E.4D(h));a.39(c);c.2C();c.4C();w(c,"4u",6(){c.2G.4E(c);b.1l=b.1l.Q("1m","")})}}I(1j 3F!="1d"&&1j M=="1d")M=3F("M").M;K e={2v:{"1g-27":"","2i-1s":1,"2z-1s-2t":11,1M:N,1t:N,"42-45":R,"43-22":4,1u:R,16:R,"3V-17":R,2l:11,"41-40":R,2k:11,"1z-1k":11},13:{1W:"&2s;",2M:R,46:11,44:11,34:"4n",1x:{21:"4o 1m",2P:"?",1X:"1v\\n\\n",3E:"4r\'t 4t 1D O: ",4g:"4m 4B\'t 51 O 1z-1k 4F: ",37:\'<!4T 1z 4S "-//4V//3H 4W 1.0 4Z//4Y" "1Z://2y.3L.3K/4X/3I/3H/3I-4P.4J"><1z 4I="1Z://2y.3L.3K/4L/5L"><3J><4N 1Z-4M="5G-5M" 6K="2O/1z; 6J=6I-8" /><1t>6L 1v</1t></3J><3B 1L="25-6M:6Q,6P,6O,6N-6F;6y-2f:#6x;2f:#6w;25-22:6v;2O-3D:3C;"><T 1L="2O-3D:3C;3w-32:1.6z;"><T 1L="25-22:6A-6E;">1v</T><T 1L="25-22:.6C;3w-6B:6R;"><T>3v 3.0.76 (72 73 3x)</T><T><a 2h="1Z://3u.2w/1v" 1F="38" 1L="2f:#3y">1Z://3u.2w/1v</a></T><T>70 17 6U 71.</T><T>6T 6X-3x 6Y 6D.</T></T><T>6t 61 60 J 1k, 5Z <a 2h="6u://2y.62.2w/63-66/65?64=5X-5W&5P=5O" 1L="2f:#3y">5R</a> 5V <2R/>5U 5T 5S!</T></T></3B></1z>\'}},1Y:{2j:N,2A:{}},1U:{},3A:{6n:/\\/\\*[\\s\\S]*?\\*\\//2c,6m:/\\/\\/.*$/2c,6l:/#.*$/2c,6k:/"([^\\\\"\\n]|\\\\.)*"/g,6o:/\'([^\\\\\'\\n]|\\\\.)*\'/g,6p:1f M(\'"([^\\\\\\\\"]|\\\\\\\\.)*"\',"3z"),6s:1f M("\'([^\\\\\\\\\']|\\\\\\\\.)*\'","3z"),6q:/(&1y;|<)!--[\\s\\S]*?--(&1G;|>)/2c,3M:/\\w+:\\/\\/[\\w-.\\/?%&=:@;]*/g,6a:{18:/(&1y;|<)\\?=?/g,1b:/\\?(&1G;|>)/g},69:{18:/(&1y;|<)%=?/g,1b:/%(&1G;|>)/g},6d:{18:/(&1y;|<)\\s*1k.*?(&1G;|>)/2T,1b:/(&1y;|<)\\/\\s*1k\\s*(&1G;|>)/2T}},16:{1H:6(a){6 b(i,k){H e.16.2o(i,k,e.13.1x[k])}O(K c=\'<T 1g="16">\',d=e.16.2x,h=d.2X,g=0;g<h.L;g++)c+=(d[h[g]].1H||b)(a,h[g]);c+="</T>";H c},2o:6(a,b,c){H\'<2W><a 2h="#" 1g="6e 6h\'+b+" "+b+\'">\'+c+"</a></2W>"},2b:6(a){K b=a.1F,c=b.1l||"";b=B(p(b,".20",R).1c);K d=6(h){H(h=15(h+"6f(\\\\w+)").X(c))?h[1]:N}("6g");b&&d&&e.16.2x[d].2B(b);a.3N()},2x:{2X:["21","2P"],21:{1H:6(a){I(a.V("2l")!=R)H"";K b=a.V("1t");H e.16.2o(a,"21",b?b:e.13.1x.21)},2B:6(a){a=1E.6j(t(a.1c));a.1l=a.1l.Q("47","")}},2P:{2B:6(){K a="68=0";a+=", 18="+(31.30-33)/2+", 32="+(31.2Z-2Y)/2+", 30=33, 2Z=2Y";a=a.Q(/^,/,"");a=1P.6Z("","38",a);a.2C();K b=a.1E;b.6W(e.13.1x.37);b.6V();a.2C()}}}},35:6(a,b){K c;I(b)c=[b];Y{c=1E.36(e.13.34);O(K d=[],h=0;h<c.L;h++)d.U(c[h]);c=d}c=c;d=[];I(e.13.2M)c=c.1O(z());I(c.L===0)H d;O(h=0;h<c.L;h++){O(K g=c[h],i=a,k=c[h].1l,j=3W 0,l={},m=1f M("^\\\\[(?<2V>(.*?))\\\\]$"),s=1f M("(?<27>[\\\\w-]+)\\\\s*:\\\\s*(?<1T>[\\\\w-%#]+|\\\\[.*?\\\\]|\\".*?\\"|\'.*?\')\\\\s*;?","g");(j=s.X(k))!=N;){K o=j.1T.Q(/^[\'"]|[\'"]$/g,"");I(o!=N&&m.1A(o)){o=m.X(o);o=o.2V.L>0?o.2V.1e(/\\s*,\\s*/):[]}l[j.27]=o}g={1F:g,1n:C(i,l)};g.1n.1D!=N&&d.U(g)}H d},1M:6(a,b){K c=J.35(a,b),d=N,h=e.13;I(c.L!==0)O(K g=0;g<c.L;g++){b=c[g];K i=b.1F,k=b.1n,j=k.1D,l;I(j!=N){I(k["1z-1k"]=="R"||e.2v["1z-1k"]==R){d=1f e.4l(j);j="4O"}Y I(d=A(j))d=1f d;Y 6H;l=i.3X;I(h.2M){l=l;K m=x(l),s=11;I(m.1i("<![6G[")==0){m=m.4h(9);s=R}K o=m.L;I(m.1i("]]\\>")==o-3){m=m.4h(0,o-3);s=R}l=s?m:l}I((i.1t||"")!="")k.1t=i.1t;k.1D=j;d.2Q(k);b=d.2F(l);I((i.1c||"")!="")b.1c=i.1c;i.2G.74(b,i)}}},2E:6(a){w(1P,"4k",6(){e.1M(a)})}};e.2E=e.2E;e.1M=e.1M;e.2L=6(a,b,c){J.1T=a;J.P=b;J.L=a.L;J.23=c;J.1V=N};e.2L.Z.1q=6(){H J.1T};e.4l=6(a){6 b(j,l){O(K m=0;m<j.L;m++)j[m].P+=l}K c=A(a),d,h=1f e.1U.5Y,g=J,i="2F 1H 2Q".1e(" ");I(c!=N){d=1f c;O(K k=0;k<i.L;k++)(6(){K j=i[k];g[j]=6(){H h[j].1p(h,14)}})();d.28==N?1P.1X(e.13.1x.1X+(e.13.1x.4g+a)):h.2J.U({1I:d.28.17,2D:6(j){O(K l=j.17,m=[],s=d.2J,o=j.P+j.18.L,F=d.28,q,G=0;G<s.L;G++){q=y(l,s[G]);b(q,o);m=m.1O(q)}I(F.18!=N&&j.18!=N){q=y(j.18,F.18);b(q,j.P);m=m.1O(q)}I(F.1b!=N&&j.1b!=N){q=y(j.1b,F.1b);b(q,j.P+j[0].5Q(j.1b));m=m.1O(q)}O(j=0;j<m.L;j++)m[j].1V=c.1V;H m}})}};e.4j=6(){};e.4j.Z={V:6(a,b){K c=J.1n[a];c=c==N?b:c;K d={"R":R,"11":11}[c];H d==N?c:d},3Y:6(a){H 1E.4i(a)},4c:6(a,b){K c=[];I(a!=N)O(K d=0;d<a.L;d++)I(1j a[d]=="2m")c=c.1O(y(b,a[d]));H J.4e(c.6b(D))},4e:6(a){O(K b=0;b<a.L;b++)I(a[b]!==N)O(K c=a[b],d=c.P+c.L,h=b+1;h<a.L&&a[b]!==N;h++){K g=a[h];I(g!==N)I(g.P>d)1N;Y I(g.P==c.P&&g.L>c.L)a[b]=N;Y I(g.P>=c.P&&g.P<d)a[h]=N}H a},4d:6(a){K b=[],c=2u(J.V("2i-1s"));v(a,6(d,h){b.U(h+c)});H b},3U:6(a){K b=J.V("1M",[]);I(1j b!="2m"&&b.U==N)b=[b];a:{a=a.1q();K c=3W 0;O(c=c=1Q.6c(c||0,0);c<b.L;c++)I(b[c]==a){b=c;1N a}b=-1}H b!=-1},2r:6(a,b,c){a=["1s","6i"+b,"P"+a,"6r"+(b%2==0?1:2).1q()];J.3U(b)&&a.U("67");b==0&&a.U("1N");H\'<T 1g="\'+a.1K(" ")+\'">\'+c+"</T>"},3Q:6(a,b){K c="",d=a.1e("\\n").L,h=2u(J.V("2i-1s")),g=J.V("2z-1s-2t");I(g==R)g=(h+d-1).1q().L;Y I(3R(g)==R)g=0;O(K i=0;i<d;i++){K k=b?b[i]:h+i,j;I(k==0)j=e.13.1W;Y{j=g;O(K l=k.1q();l.L<j;)l="0"+l;j=l}a=j;c+=J.2r(i,k,a)}H c},49:6(a,b){a=x(a);K c=a.1e("\\n");J.V("2z-1s-2t");K d=2u(J.V("2i-1s"));a="";O(K h=J.V("1D"),g=0;g<c.L;g++){K i=c[g],k=/^(&2s;|\\s)+/.X(i),j=N,l=b?b[g]:d+g;I(k!=N){j=k[0].1q();i=i.1o(j.L);j=j.Q(" ",e.13.1W)}i=x(i);I(i.L==0)i=e.13.1W;a+=J.2r(g,l,(j!=N?\'<17 1g="\'+h+\' 5N">\'+j+"</17>":"")+i)}H a},4f:6(a){H a?"<4a>"+a+"</4a>":""},4b:6(a,b){6 c(l){H(l=l?l.1V||g:g)?l+" ":""}O(K d=0,h="",g=J.V("1D",""),i=0;i<b.L;i++){K k=b[i],j;I(!(k===N||k.L===0)){j=c(k);h+=u(a.1o(d,k.P-d),j+"48")+u(k.1T,j+k.23);d=k.P+k.L+(k.75||0)}}h+=u(a.1o(d),c()+"48");H h},1H:6(a){K b="",c=["20"],d;I(J.V("2k")==R)J.1n.16=J.1n.1u=11;1l="20";J.V("2l")==R&&c.U("47");I((1u=J.V("1u"))==11)c.U("6S");c.U(J.V("1g-27"));c.U(J.V("1D"));a=a.Q(/^[ ]*[\\n]+|[\\n]*[ ]*$/g,"").Q(/\\r/g," ");b=J.V("43-22");I(J.V("42-45")==R)a=n(a,b);Y{O(K h="",g=0;g<b;g++)h+=" ";a=a.Q(/\\t/g,h)}a=a;a:{b=a=a;h=/<2R\\s*\\/?>|&1y;2R\\s*\\/?&1G;/2T;I(e.13.46==R)b=b.Q(h,"\\n");I(e.13.44==R)b=b.Q(h,"");b=b.1e("\\n");h=/^\\s*/;g=4Q;O(K i=0;i<b.L&&g>0;i++){K k=b[i];I(x(k).L!=0){k=h.X(k);I(k==N){a=a;1N a}g=1Q.4q(k[0].L,g)}}I(g>0)O(i=0;i<b.L;i++)b[i]=b[i].1o(g);a=b.1K("\\n")}I(1u)d=J.4d(a);b=J.4c(J.2J,a);b=J.4b(a,b);b=J.49(b,d);I(J.V("41-40"))b=E(b);1j 2H!="1d"&&2H.3S&&2H.3S.1C(/5s/)&&c.U("5t");H b=\'<T 1c="\'+t(J.1c)+\'" 1g="\'+c.1K(" ")+\'">\'+(J.V("16")?e.16.1H(J):"")+\'<3Z 5z="0" 5H="0" 5J="0">\'+J.4f(J.V("1t"))+"<3T><3P>"+(1u?\'<2d 1g="1u">\'+J.3Q(a)+"</2d>":"")+\'<2d 1g="17"><T 1g="3O">\'+b+"</T></2d></3P></3T></3Z></T>"},2F:6(a){I(a===N)a="";J.17=a;K b=J.3Y("T");b.3X=J.1H(a);J.V("16")&&w(p(b,".16"),"5c",e.16.2b);J.V("3V-17")&&w(p(b,".17"),"56",f);H b},2Q:6(a){J.1c=""+1Q.5d(1Q.5n()*5k).1q();e.1Y.2A[t(J.1c)]=J;J.1n=C(e.2v,a||{});I(J.V("2k")==R)J.1n.16=J.1n.1u=11},5j:6(a){a=a.Q(/^\\s+|\\s+$/g,"").Q(/\\s+/g,"|");H"\\\\b(?:"+a+")\\\\b"},5f:6(a){J.28={18:{1I:a.18,23:"1k"},1b:{1I:a.1b,23:"1k"},17:1f M("(?<18>"+a.18.1m+")(?<17>.*?)(?<1b>"+a.1b.1m+")","5o")}}};H e}();1j 2e!="1d"&&(2e.1v=1v);',62,441,'||||||function|||||||||||||||||||||||||||||||||||||return|if|this|var|length|XRegExp|null|for|index|replace|true||div|push|getParam|call|exec|else|prototype||false|lastIndex|config|arguments|RegExp|toolbar|code|left|captureNames|slice|right|id|undefined|split|new|class|addToken|indexOf|typeof|script|className|source|params|substr|apply|toString|String|line|title|gutter|SyntaxHighlighter|_xregexp|strings|lt|html|test|OUTSIDE_CLASS|match|brush|document|target|gt|getHtml|regex|global|join|style|highlight|break|concat|window|Math|isRegExp|throw|value|brushes|brushName|space|alert|vars|http|syntaxhighlighter|expandSource|size|css|case|font|Fa|name|htmlScript|dA|can|handler|gm|td|exports|color|in|href|first|discoveredBrushes|light|collapse|object|cache|getButtonHtml|trigger|pattern|getLineHtml|nbsp|numbers|parseInt|defaults|com|items|www|pad|highlighters|execute|focus|func|all|getDiv|parentNode|navigator|INSIDE_CLASS|regexList|hasFlag|Match|useScriptTags|hasNamedCapture|text|help|init|br|input|gi|Error|values|span|list|250|height|width|screen|top|500|tagName|findElements|getElementsByTagName|aboutDialog|_blank|appendChild|charAt|Array|copyAsGlobal|setFlag|highlighter_|string|attachEvent|nodeName|floor|backref|output|the|TypeError|sticky|Za|iterate|freezeTokens|scope|type|textarea|alexgorbatchev|version|margin|2010|005896|gs|regexLib|body|center|align|noBrush|require|childNodes|DTD|xhtml1|head|org|w3|url|preventDefault|container|tr|getLineNumbersHtml|isNaN|userAgent|tbody|isLineHighlighted|quick|void|innerHTML|create|table|links|auto|smart|tab|stripBrs|tabs|bloggerMode|collapsed|plain|getCodeLinesHtml|caption|getMatchesHtml|findMatches|figureOutLineNumbers|removeNestedMatches|getTitleHtml|brushNotHtmlScript|substring|createElement|Highlighter|load|HtmlScript|Brush|pre|expand|multiline|min|Can|ignoreCase|find|blur|extended|toLowerCase|aliases|addEventListener|innerText|textContent|wasn|select|createTextNode|removeChild|option|same|frame|xmlns|dtd|twice|1999|equiv|meta|htmlscript|transitional|1E3|expected|PUBLIC|DOCTYPE|on|W3C|XHTML|TR|EN|Transitional||configured|srcElement|Object|after|run|dblclick|matchChain|valueOf|constructor|default|switch|click|round|execAt|forHtmlScript|token|gimy|functions|getKeywords|1E6|escape|within|random|sgi|another|finally|supply|MSIE|ie|toUpperCase|catch|returnValue|definition|event|border|imsx|constructing|one|Infinity|from|when|Content|cellpadding|flags|cellspacing|try|xhtml|Type|spaces|2930402|hosted_button_id|lastIndexOf|donate|active|development|keep|to|xclick|_s|Xml|please|like|you|paypal|cgi|cmd|webscr|bin|highlighted|scrollbars|aspScriptTags|phpScriptTags|sort|max|scriptScriptTags|toolbar_item|_|command|command_|number|getElementById|doubleQuotedString|singleLinePerlComments|singleLineCComments|multiLineCComments|singleQuotedString|multiLineDoubleQuotedString|xmlComments|alt|multiLineSingleQuotedString|If|https|1em|000|fff|background|5em|xx|bottom|75em|Gorbatchev|large|serif|CDATA|continue|utf|charset|content|About|family|sans|Helvetica|Arial|Geneva|3em|nogutter|Copyright|syntax|close|write|2004|Alex|open|JavaScript|highlighter|July|02|replaceChild|offset|83'.split('|'),0,{}))
diff --git a/upstream/clipper-6.4.2/Documentation/Scripts/SyntaxHighlighter/scripts/shLegacy.js b/upstream/clipper-6.4.2/Documentation/Scripts/SyntaxHighlighter/scripts/shLegacy.js
new file mode 100644
index 0000000..6d9fd4d
--- /dev/null
+++ b/upstream/clipper-6.4.2/Documentation/Scripts/SyntaxHighlighter/scripts/shLegacy.js
@@ -0,0 +1,17 @@
+/**
+ * SyntaxHighlighter
+ * http://alexgorbatchev.com/SyntaxHighlighter
+ *
+ * SyntaxHighlighter is donationware. If you are using it, please donate.
+ * http://alexgorbatchev.com/SyntaxHighlighter/donate.html
+ *
+ * @version
+ * 3.0.83 (July 02 2010)
+ *
+ * @copyright
+ * Copyright (C) 2004-2010 Alex Gorbatchev.
+ *
+ * @license
+ * Dual licensed under the MIT and GPL licenses.
+ */
+eval(function(p,a,c,k,e,d){e=function(c){return(c<a?'':e(parseInt(c/a)))+((c=c%a)>35?String.fromCharCode(c+29):c.toString(36))};if(!''.replace(/^/,String)){while(c--){d[e(c)]=k[c]||e(c)}k=[function(e){return d[e]}];e=function(){return'\\w+'};c=1};while(c--){if(k[c]){p=p.replace(new RegExp('\\b'+e(c)+'\\b','g'),k[c])}}return p}('3 u={8:{}};u.8={A:4(c,k,l,m,n,o){4 d(a,b){2 a!=1?a:b}4 f(a){2 a!=1?a.E():1}c=c.I(":");3 g=c[0],e={};t={"r":K};M=1;5=8.5;9(3 j R c)e[c[j]]="r";k=f(d(k,5.C));l=f(d(l,5.D));m=f(d(m,5.s));o=f(d(o,5.Q));n=f(d(n,5["x-y"]));2{P:g,C:d(t[e.O],k),D:d(t[e.N],l),s:d({"r":r}[e.s],m),"x-y":d(4(a,b){9(3 h=T S("^"+b+"\\\\[(?<q>\\\\w+)\\\\]$","U"),i=1,p=0;p<a.7;p++)6((i=h.J(a[p]))!=1)2 i.q;2 1}(c,"G"),n)}},F:4(c,k,l,m,n,o){4 d(){9(3 a=H,b=0;b<a.7;b++)6(a[b]!==1){6(z a[b]=="L"&&a[b]!="")2 a[b]+"";6(z a[b]=="X"&&a[b].q!="")2 a[b].q+""}2 1}4 f(a,b,h){h=12.13(h);9(3 i=0;i<h.7;i++)h[i].V("15")==b&&a.Y(h[i])}3 g=[];f(g,c,"Z");f(g,c,"W");6(g.7!==0)9(c=0;c<g.7;c++){3 e=g[c],j=d(e.B["14"],e.10,e.B.v,e.v);6(j!==1){j=u.8.A(j,k,l,m,n,o);8.11(j,e)}}}};',62,68,'|null|return|var|function|defaults|if|length|SyntaxHighlighter|for|||||||||||||||||value|true|collapse|reverse|dp|language||first|line|typeof|parseParams|attributes|gutter|toolbar|toString|HighlightAll|firstline|arguments|split|exec|false|string|result|nocontrols|nogutter|brush|ruler|in|XRegExp|new|gi|getAttribute|textarea|object|push|pre|className|highlight|document|getElementsByTagName|class|name'.split('|'),0,{}))
diff --git a/upstream/clipper-6.4.2/Documentation/Scripts/SyntaxHighlighter/src/shAutoloader.js b/upstream/clipper-6.4.2/Documentation/Scripts/SyntaxHighlighter/src/shAutoloader.js
new file mode 100644
index 0000000..3a95449
--- /dev/null
+++ b/upstream/clipper-6.4.2/Documentation/Scripts/SyntaxHighlighter/src/shAutoloader.js
@@ -0,0 +1,130 @@
+/**
+ * SyntaxHighlighter
+ * http://alexgorbatchev.com/SyntaxHighlighter
+ *
+ * SyntaxHighlighter is donationware. If you are using it, please donate.
+ * http://alexgorbatchev.com/SyntaxHighlighter/donate.html
+ *
+ * @version
+ * 3.0.83 (July 02 2010)
+ *
+ * @copyright
+ * Copyright (C) 2004-2010 Alex Gorbatchev.
+ *
+ * @license
+ * Dual licensed under the MIT and GPL licenses.
+ */
+(function() {
+
+var sh = SyntaxHighlighter;
+
+/**
+ * Provides functionality to dynamically load only the brushes that a needed to render the current page.
+ *
+ * There are two syntaxes that autoload understands. For example:
+ *
+ * SyntaxHighlighter.autoloader(
+ * [ 'applescript', 'Scripts/shBrushAppleScript.js' ],
+ * [ 'actionscript3', 'as3', 'Scripts/shBrushAS3.js' ]
+ * );
+ *
+ * or a more easily comprehendable one:
+ *
+ * SyntaxHighlighter.autoloader(
+ * 'applescript Scripts/shBrushAppleScript.js',
+ * 'actionscript3 as3 Scripts/shBrushAS3.js'
+ * );
+ */
+sh.autoloader = function()
+{
+ var list = arguments,
+ elements = sh.findElements(),
+ brushes = {},
+ scripts = {},
+ all = SyntaxHighlighter.all,
+ allCalled = false,
+ allParams = null,
+ i
+ ;
+
+ SyntaxHighlighter.all = function(params)
+ {
+ allParams = params;
+ allCalled = true;
+ };
+
+ function addBrush(aliases, url)
+ {
+ for (var i = 0; i < aliases.length; i++)
+ brushes[aliases[i]] = url;
+ };
+
+ function getAliases(item)
+ {
+ return item.pop
+ ? item
+ : item.split(/\s+/)
+ ;
+ }
+
+ // create table of aliases and script urls
+ for (i = 0; i < list.length; i++)
+ {
+ var aliases = getAliases(list[i]),
+ url = aliases.pop()
+ ;
+
+ addBrush(aliases, url);
+ }
+
+ // dynamically add <script /> tags to the document body
+ for (i = 0; i < elements.length; i++)
+ {
+ var url = brushes[elements[i].params.brush];
+
+ if (!url)
+ continue;
+
+ scripts[url] = false;
+ loadScript(url);
+ }
+
+ function loadScript(url)
+ {
+ var script = document.createElement('script'),
+ done = false
+ ;
+
+ script.src = url;
+ script.type = 'text/javascript';
+ script.language = 'javascript';
+ script.onload = script.onreadystatechange = function()
+ {
+ if (!done && (!this.readyState || this.readyState == 'loaded' || this.readyState == 'complete'))
+ {
+ done = true;
+ scripts[url] = true;
+ checkAll();
+
+ // Handle memory leak in IE
+ script.onload = script.onreadystatechange = null;
+ script.parentNode.removeChild(script);
+ }
+ };
+
+ // sync way of adding script tags to the page
+ document.body.appendChild(script);
+ };
+
+ function checkAll()
+ {
+ for(var url in scripts)
+ if (scripts[url] == false)
+ return;
+
+ if (allCalled)
+ SyntaxHighlighter.highlight(allParams);
+ };
+};
+
+})();
diff --git a/upstream/clipper-6.4.2/Documentation/Scripts/SyntaxHighlighter/src/shCore.js b/upstream/clipper-6.4.2/Documentation/Scripts/SyntaxHighlighter/src/shCore.js
new file mode 100644
index 0000000..4214763
--- /dev/null
+++ b/upstream/clipper-6.4.2/Documentation/Scripts/SyntaxHighlighter/src/shCore.js
@@ -0,0 +1,1721 @@
+/**
+ * SyntaxHighlighter
+ * http://alexgorbatchev.com/SyntaxHighlighter
+ *
+ * SyntaxHighlighter is donationware. If you are using it, please donate.
+ * http://alexgorbatchev.com/SyntaxHighlighter/donate.html
+ *
+ * @version
+ * 3.0.83 (July 02 2010)
+ *
+ * @copyright
+ * Copyright (C) 2004-2010 Alex Gorbatchev.
+ *
+ * @license
+ * Dual licensed under the MIT and GPL licenses.
+ */
+//
+// Begin anonymous function. This is used to contain local scope variables without polutting global scope.
+//
+var SyntaxHighlighter = function() {
+
+// CommonJS
+if (typeof(require) != 'undefined' && typeof(XRegExp) == 'undefined')
+{
+ XRegExp = require('XRegExp').XRegExp;
+}
+
+// Shortcut object which will be assigned to the SyntaxHighlighter variable.
+// This is a shorthand for local reference in order to avoid long namespace
+// references to SyntaxHighlighter.whatever...
+var sh = {
+ defaults : {
+ /** Additional CSS class names to be added to highlighter elements. */
+ 'class-name' : '',
+
+ /** First line number. */
+ 'first-line' : 1,
+
+ /**
+ * Pads line numbers. Possible values are:
+ *
+ * false - don't pad line numbers.
+ * true - automaticaly pad numbers with minimum required number of leading zeroes.
+ * [int] - length up to which pad line numbers.
+ */
+ 'pad-line-numbers' : false,
+
+ /** Lines to highlight. */
+ 'highlight' : null,
+
+ /** Title to be displayed above the code block. */
+ 'title' : null,
+
+ /** Enables or disables smart tabs. */
+ 'smart-tabs' : true,
+
+ /** Gets or sets tab size. */
+ 'tab-size' : 4,
+
+ /** Enables or disables gutter. */
+ 'gutter' : true,
+
+ /** Enables or disables toolbar. */
+ 'toolbar' : true,
+
+ /** Enables quick code copy and paste from double click. */
+ 'quick-code' : true,
+
+ /** Forces code view to be collapsed. */
+ 'collapse' : false,
+
+ /** Enables or disables automatic links. */
+ 'auto-links' : true,
+
+ /** Gets or sets light mode. Equavalent to turning off gutter and toolbar. */
+ 'light' : false,
+
+ 'html-script' : false
+ },
+
+ config : {
+ space : '&nbsp;',
+
+ /** Enables use of <SCRIPT type="syntaxhighlighter" /> tags. */
+ useScriptTags : true,
+
+ /** Blogger mode flag. */
+ bloggerMode : false,
+
+ stripBrs : false,
+
+ /** Name of the tag that SyntaxHighlighter will automatically look for. */
+ tagName : 'pre',
+
+ strings : {
+ expandSource : 'expand source',
+ help : '?',
+ alert: 'SyntaxHighlighter\n\n',
+ noBrush : 'Can\'t find brush for: ',
+ brushNotHtmlScript : 'Brush wasn\'t configured for html-script option: ',
+
+ // this is populated by the build script
+ aboutDialog : '<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"><html xmlns="http://www.w3.org/1999/xhtml"><head><meta http-equiv="Content-Type" content="text/html; charset=utf-8" /><title>About SyntaxHighlighter</title></head><body style="font-family:Geneva,Arial,Helvetica,sans-serif;background-color:#fff;color:#000;font-size:1em;text-align:center;"><div style="text-align:center;margin-top:1.5em;"><div style="font-size:xx-large;">SyntaxHighlighter</div><div style="font-size:.75em;margin-bottom:3em;"><div>version 3.0.83 (July 02 2010)</div><div><a href="http://alexgorbatchev.com/SyntaxHighlighter" target="_blank" style="color:#005896">http://alexgorbatchev.com/SyntaxHighlighter</a></div><div>JavaScript code syntax highlighter.</div><div>Copyright 2004-2010 Alex Gorbatchev.</div></div><div>If you like this script, please <a href="https://www.paypal.com/cgi-bin/webscr?cmd=_s-xclick&hosted_button_id=2930402" style="color:#005896">donate</a> to <br/>keep development active!</div></div></body></html>'
+ }
+ },
+
+ /** Internal 'global' variables. */
+ vars : {
+ discoveredBrushes : null,
+ highlighters : {}
+ },
+
+ /** This object is populated by user included external brush files. */
+ brushes : {},
+
+ /** Common regular expressions. */
+ regexLib : {
+ multiLineCComments : /\/\*[\s\S]*?\*\//gm,
+ singleLineCComments : /\/\/.*$/gm,
+ singleLinePerlComments : /#.*$/gm,
+ doubleQuotedString : /"([^\\"\n]|\\.)*"/g,
+ singleQuotedString : /'([^\\'\n]|\\.)*'/g,
+ multiLineDoubleQuotedString : new XRegExp('"([^\\\\"]|\\\\.)*"', 'gs'),
+ multiLineSingleQuotedString : new XRegExp("'([^\\\\']|\\\\.)*'", 'gs'),
+ xmlComments : /(&lt;|<)!--[\s\S]*?--(&gt;|>)/gm,
+ url : /\w+:\/\/[\w-.\/?%&=:@;]*/g,
+
+ /** <?= ?> tags. */
+ phpScriptTags : { left: /(&lt;|<)\?=?/g, right: /\?(&gt;|>)/g },
+
+ /** <%= %> tags. */
+ aspScriptTags : { left: /(&lt;|<)%=?/g, right: /%(&gt;|>)/g },
+
+ /** <script></script> tags. */
+ scriptScriptTags : { left: /(&lt;|<)\s*script.*?(&gt;|>)/gi, right: /(&lt;|<)\/\s*script\s*(&gt;|>)/gi }
+ },
+
+ toolbar: {
+ /**
+ * Generates HTML markup for the toolbar.
+ * @param {Highlighter} highlighter Highlighter instance.
+ * @return {String} Returns HTML markup.
+ */
+ getHtml: function(highlighter)
+ {
+ var html = '<div class="toolbar">',
+ items = sh.toolbar.items,
+ list = items.list
+ ;
+
+ function defaultGetHtml(highlighter, name)
+ {
+ return sh.toolbar.getButtonHtml(highlighter, name, sh.config.strings[name]);
+ };
+
+ for (var i = 0; i < list.length; i++)
+ html += (items[list[i]].getHtml || defaultGetHtml)(highlighter, list[i]);
+
+ html += '</div>';
+
+ return html;
+ },
+
+ /**
+ * Generates HTML markup for a regular button in the toolbar.
+ * @param {Highlighter} highlighter Highlighter instance.
+ * @param {String} commandName Command name that would be executed.
+ * @param {String} label Label text to display.
+ * @return {String} Returns HTML markup.
+ */
+ getButtonHtml: function(highlighter, commandName, label)
+ {
+ return '<span><a href="#" class="toolbar_item'
+ + ' command_' + commandName
+ + ' ' + commandName
+ + '">' + label + '</a></span>'
+ ;
+ },
+
+ /**
+ * Event handler for a toolbar anchor.
+ */
+ handler: function(e)
+ {
+ var target = e.target,
+ className = target.className || ''
+ ;
+
+ function getValue(name)
+ {
+ var r = new RegExp(name + '_(\\w+)'),
+ match = r.exec(className)
+ ;
+
+ return match ? match[1] : null;
+ };
+
+ var highlighter = getHighlighterById(findParentElement(target, '.syntaxhighlighter').id),
+ commandName = getValue('command')
+ ;
+
+ // execute the toolbar command
+ if (highlighter && commandName)
+ sh.toolbar.items[commandName].execute(highlighter);
+
+ // disable default A click behaviour
+ e.preventDefault();
+ },
+
+ /** Collection of toolbar items. */
+ items : {
+ // Ordered lis of items in the toolbar. Can't expect `for (var n in items)` to be consistent.
+ list: ['expandSource', 'help'],
+
+ expandSource: {
+ getHtml: function(highlighter)
+ {
+ if (highlighter.getParam('collapse') != true)
+ return '';
+
+ var title = highlighter.getParam('title');
+ return sh.toolbar.getButtonHtml(highlighter, 'expandSource', title ? title : sh.config.strings.expandSource);
+ },
+
+ execute: function(highlighter)
+ {
+ var div = getHighlighterDivById(highlighter.id);
+ removeClass(div, 'collapsed');
+ }
+ },
+
+ /** Command to display the about dialog window. */
+ help: {
+ execute: function(highlighter)
+ {
+ var wnd = popup('', '_blank', 500, 250, 'scrollbars=0'),
+ doc = wnd.document
+ ;
+
+ doc.write(sh.config.strings.aboutDialog);
+ doc.close();
+ wnd.focus();
+ }
+ }
+ }
+ },
+
+ /**
+ * Finds all elements on the page which should be processes by SyntaxHighlighter.
+ *
+ * @param {Object} globalParams Optional parameters which override element's
+ * parameters. Only used if element is specified.
+ *
+ * @param {Object} element Optional element to highlight. If none is
+ * provided, all elements in the current document
+ * are returned which qualify.
+ *
+ * @return {Array} Returns list of <code>{ target: DOMElement, params: Object }</code> objects.
+ */
+ findElements: function(globalParams, element)
+ {
+ var elements = element ? [element] : toArray(document.getElementsByTagName(sh.config.tagName)),
+ conf = sh.config,
+ result = []
+ ;
+
+ // support for <SCRIPT TYPE="syntaxhighlighter" /> feature
+ if (conf.useScriptTags)
+ elements = elements.concat(getSyntaxHighlighterScriptTags());
+
+ if (elements.length === 0)
+ return result;
+
+ for (var i = 0; i < elements.length; i++)
+ {
+ var item = {
+ target: elements[i],
+ // local params take precedence over globals
+ params: merge(globalParams, parseParams(elements[i].className))
+ };
+
+ if (item.params['brush'] == null)
+ continue;
+
+ result.push(item);
+ }
+
+ return result;
+ },
+
+ /**
+ * Shorthand to highlight all elements on the page that are marked as
+ * SyntaxHighlighter source code.
+ *
+ * @param {Object} globalParams Optional parameters which override element's
+ * parameters. Only used if element is specified.
+ *
+ * @param {Object} element Optional element to highlight. If none is
+ * provided, all elements in the current document
+ * are highlighted.
+ */
+ highlight: function(globalParams, element)
+ {
+ var elements = this.findElements(globalParams, element),
+ propertyName = 'innerHTML',
+ highlighter = null,
+ conf = sh.config
+ ;
+
+ if (elements.length === 0)
+ return;
+
+ for (var i = 0; i < elements.length; i++)
+ {
+ var element = elements[i],
+ target = element.target,
+ params = element.params,
+ brushName = params.brush,
+ code
+ ;
+
+ if (brushName == null)
+ continue;
+
+ // Instantiate a brush
+ if (params['html-script'] == 'true' || sh.defaults['html-script'] == true)
+ {
+ highlighter = new sh.HtmlScript(brushName);
+ brushName = 'htmlscript';
+ }
+ else
+ {
+ var brush = findBrush(brushName);
+
+ if (brush)
+ highlighter = new brush();
+ else
+ continue;
+ }
+
+ code = target[propertyName];
+
+ // remove CDATA from <SCRIPT/> tags if it's present
+ if (conf.useScriptTags)
+ code = stripCData(code);
+
+ // Inject title if the attribute is present
+ if ((target.title || '') != '')
+ params.title = target.title;
+
+ params['brush'] = brushName;
+ highlighter.init(params);
+ element = highlighter.getDiv(code);
+
+ // carry over ID
+ if ((target.id || '') != '')
+ element.id = target.id;
+
+ target.parentNode.replaceChild(element, target);
+ }
+ },
+
+ /**
+ * Main entry point for the SyntaxHighlighter.
+ * @param {Object} params Optional params to apply to all highlighted elements.
+ */
+ all: function(params)
+ {
+ attachEvent(
+ window,
+ 'load',
+ function() { sh.highlight(params); }
+ );
+ }
+}; // end of sh
+
+sh['all'] = sh.all;
+sh['highlight'] = sh.highlight;
+
+/**
+ * Checks if target DOM elements has specified CSS class.
+ * @param {DOMElement} target Target DOM element to check.
+ * @param {String} className Name of the CSS class to check for.
+ * @return {Boolean} Returns true if class name is present, false otherwise.
+ */
+function hasClass(target, className)
+{
+ return target.className.indexOf(className) != -1;
+};
+
+/**
+ * Adds CSS class name to the target DOM element.
+ * @param {DOMElement} target Target DOM element.
+ * @param {String} className New CSS class to add.
+ */
+function addClass(target, className)
+{
+ if (!hasClass(target, className))
+ target.className += ' ' + className;
+};
+
+/**
+ * Removes CSS class name from the target DOM element.
+ * @param {DOMElement} target Target DOM element.
+ * @param {String} className CSS class to remove.
+ */
+function removeClass(target, className)
+{
+ target.className = target.className.replace(className, '');
+};
+
+/**
+ * Converts the source to array object. Mostly used for function arguments and
+ * lists returned by getElementsByTagName() which aren't Array objects.
+ * @param {List} source Source list.
+ * @return {Array} Returns array.
+ */
+function toArray(source)
+{
+ var result = [];
+
+ for (var i = 0; i < source.length; i++)
+ result.push(source[i]);
+
+ return result;
+};
+
+/**
+ * Splits block of text into lines.
+ * @param {String} block Block of text.
+ * @return {Array} Returns array of lines.
+ */
+function splitLines(block)
+{
+ return block.split('\n');
+}
+
+/**
+ * Generates HTML ID for the highlighter.
+ * @param {String} highlighterId Highlighter ID.
+ * @return {String} Returns HTML ID.
+ */
+function getHighlighterId(id)
+{
+ var prefix = 'highlighter_';
+ return id.indexOf(prefix) == 0 ? id : prefix + id;
+};
+
+/**
+ * Finds Highlighter instance by ID.
+ * @param {String} highlighterId Highlighter ID.
+ * @return {Highlighter} Returns instance of the highlighter.
+ */
+function getHighlighterById(id)
+{
+ return sh.vars.highlighters[getHighlighterId(id)];
+};
+
+/**
+ * Finds highlighter's DIV container.
+ * @param {String} highlighterId Highlighter ID.
+ * @return {Element} Returns highlighter's DIV element.
+ */
+function getHighlighterDivById(id)
+{
+ return document.getElementById(getHighlighterId(id));
+};
+
+/**
+ * Stores highlighter so that getHighlighterById() can do its thing. Each
+ * highlighter must call this method to preserve itself.
+ * @param {Highilghter} highlighter Highlighter instance.
+ */
+function storeHighlighter(highlighter)
+{
+ sh.vars.highlighters[getHighlighterId(highlighter.id)] = highlighter;
+};
+
+/**
+ * Looks for a child or parent node which has specified classname.
+ * Equivalent to jQuery's $(container).find(".className")
+ * @param {Element} target Target element.
+ * @param {String} search Class name or node name to look for.
+ * @param {Boolean} reverse If set to true, will go up the node tree instead of down.
+ * @return {Element} Returns found child or parent element on null.
+ */
+function findElement(target, search, reverse /* optional */)
+{
+ if (target == null)
+ return null;
+
+ var nodes = reverse != true ? target.childNodes : [ target.parentNode ],
+ propertyToFind = { '#' : 'id', '.' : 'className' }[search.substr(0, 1)] || 'nodeName',
+ expectedValue,
+ found
+ ;
+
+ expectedValue = propertyToFind != 'nodeName'
+ ? search.substr(1)
+ : search.toUpperCase()
+ ;
+
+ // main return of the found node
+ if ((target[propertyToFind] || '').indexOf(expectedValue) != -1)
+ return target;
+
+ for (var i = 0; nodes && i < nodes.length && found == null; i++)
+ found = findElement(nodes[i], search, reverse);
+
+ return found;
+};
+
+/**
+ * Looks for a parent node which has specified classname.
+ * This is an alias to <code>findElement(container, className, true)</code>.
+ * @param {Element} target Target element.
+ * @param {String} className Class name to look for.
+ * @return {Element} Returns found parent element on null.
+ */
+function findParentElement(target, className)
+{
+ return findElement(target, className, true);
+};
+
+/**
+ * Finds an index of element in the array.
+ * @ignore
+ * @param {Object} searchElement
+ * @param {Number} fromIndex
+ * @return {Number} Returns index of element if found; -1 otherwise.
+ */
+function indexOf(array, searchElement, fromIndex)
+{
+ fromIndex = Math.max(fromIndex || 0, 0);
+
+ for (var i = fromIndex; i < array.length; i++)
+ if(array[i] == searchElement)
+ return i;
+
+ return -1;
+};
+
+/**
+ * Generates a unique element ID.
+ */
+function guid(prefix)
+{
+ return (prefix || '') + Math.round(Math.random() * 1000000).toString();
+};
+
+/**
+ * Merges two objects. Values from obj2 override values in obj1.
+ * Function is NOT recursive and works only for one dimensional objects.
+ * @param {Object} obj1 First object.
+ * @param {Object} obj2 Second object.
+ * @return {Object} Returns combination of both objects.
+ */
+function merge(obj1, obj2)
+{
+ var result = {}, name;
+
+ for (name in obj1)
+ result[name] = obj1[name];
+
+ for (name in obj2)
+ result[name] = obj2[name];
+
+ return result;
+};
+
+/**
+ * Attempts to convert string to boolean.
+ * @param {String} value Input string.
+ * @return {Boolean} Returns true if input was "true", false if input was "false" and value otherwise.
+ */
+function toBoolean(value)
+{
+ var result = { "true" : true, "false" : false }[value];
+ return result == null ? value : result;
+};
+
+/**
+ * Opens up a centered popup window.
+ * @param {String} url URL to open in the window.
+ * @param {String} name Popup name.
+ * @param {int} width Popup width.
+ * @param {int} height Popup height.
+ * @param {String} options window.open() options.
+ * @return {Window} Returns window instance.
+ */
+function popup(url, name, width, height, options)
+{
+ var x = (screen.width - width) / 2,
+ y = (screen.height - height) / 2
+ ;
+
+ options += ', left=' + x +
+ ', top=' + y +
+ ', width=' + width +
+ ', height=' + height
+ ;
+ options = options.replace(/^,/, '');
+
+ var win = window.open(url, name, options);
+ win.focus();
+ return win;
+};
+
+/**
+ * Adds event handler to the target object.
+ * @param {Object} obj Target object.
+ * @param {String} type Name of the event.
+ * @param {Function} func Handling function.
+ */
+function attachEvent(obj, type, func, scope)
+{
+ function handler(e)
+ {
+ e = e || window.event;
+
+ if (!e.target)
+ {
+ e.target = e.srcElement;
+ e.preventDefault = function()
+ {
+ this.returnValue = false;
+ };
+ }
+
+ func.call(scope || window, e);
+ };
+
+ if (obj.attachEvent)
+ {
+ obj.attachEvent('on' + type, handler);
+ }
+ else
+ {
+ obj.addEventListener(type, handler, false);
+ }
+};
+
+/**
+ * Displays an alert.
+ * @param {String} str String to display.
+ */
+function alert(str)
+{
+ window.alert(sh.config.strings.alert + str);
+};
+
+/**
+ * Finds a brush by its alias.
+ *
+ * @param {String} alias Brush alias.
+ * @param {Boolean} showAlert Suppresses the alert if false.
+ * @return {Brush} Returns bursh constructor if found, null otherwise.
+ */
+function findBrush(alias, showAlert)
+{
+ var brushes = sh.vars.discoveredBrushes,
+ result = null
+ ;
+
+ if (brushes == null)
+ {
+ brushes = {};
+
+ // Find all brushes
+ for (var brush in sh.brushes)
+ {
+ var info = sh.brushes[brush],
+ aliases = info.aliases
+ ;
+
+ if (aliases == null)
+ continue;
+
+ // keep the brush name
+ info.brushName = brush.toLowerCase();
+
+ for (var i = 0; i < aliases.length; i++)
+ brushes[aliases[i]] = brush;
+ }
+
+ sh.vars.discoveredBrushes = brushes;
+ }
+
+ result = sh.brushes[brushes[alias]];
+
+ if (result == null && showAlert != false)
+ alert(sh.config.strings.noBrush + alias);
+
+ return result;
+};
+
+/**
+ * Executes a callback on each line and replaces each line with result from the callback.
+ * @param {Object} str Input string.
+ * @param {Object} callback Callback function taking one string argument and returning a string.
+ */
+function eachLine(str, callback)
+{
+ var lines = splitLines(str);
+
+ for (var i = 0; i < lines.length; i++)
+ lines[i] = callback(lines[i], i);
+
+ return lines.join('\n');
+};
+
+/**
+ * This is a special trim which only removes first and last empty lines
+ * and doesn't affect valid leading space on the first line.
+ *
+ * @param {String} str Input string
+ * @return {String} Returns string without empty first and last lines.
+ */
+function trimFirstAndLastLines(str)
+{
+ return str.replace(/^[ ]*[\n]+|[\n]*[ ]*$/g, '');
+};
+
+/**
+ * Parses key/value pairs into hash object.
+ *
+ * Understands the following formats:
+ * - name: word;
+ * - name: [word, word];
+ * - name: "string";
+ * - name: 'string';
+ *
+ * For example:
+ * name1: value; name2: [value, value]; name3: 'value'
+ *
+ * @param {String} str Input string.
+ * @return {Object} Returns deserialized object.
+ */
+function parseParams(str)
+{
+ var match,
+ result = {},
+ arrayRegex = new XRegExp("^\\[(?<values>(.*?))\\]$"),
+ regex = new XRegExp(
+ "(?<name>[\\w-]+)" +
+ "\\s*:\\s*" +
+ "(?<value>" +
+ "[\\w-%#]+|" + // word
+ "\\[.*?\\]|" + // [] array
+ '".*?"|' + // "" string
+ "'.*?'" + // '' string
+ ")\\s*;?",
+ "g"
+ )
+ ;
+
+ while ((match = regex.exec(str)) != null)
+ {
+ var value = match.value
+ .replace(/^['"]|['"]$/g, '') // strip quotes from end of strings
+ ;
+
+ // try to parse array value
+ if (value != null && arrayRegex.test(value))
+ {
+ var m = arrayRegex.exec(value);
+ value = m.values.length > 0 ? m.values.split(/\s*,\s*/) : [];
+ }
+
+ result[match.name] = value;
+ }
+
+ return result;
+};
+
+/**
+ * Wraps each line of the string into <code/> tag with given style applied to it.
+ *
+ * @param {String} str Input string.
+ * @param {String} css Style name to apply to the string.
+ * @return {String} Returns input string with each line surrounded by <span/> tag.
+ */
+function wrapLinesWithCode(str, css)
+{
+ if (str == null || str.length == 0 || str == '\n')
+ return str;
+
+ str = str.replace(/</g, '&lt;');
+
+ // Replace two or more sequential spaces with &nbsp; leaving last space untouched.
+ str = str.replace(/ {2,}/g, function(m)
+ {
+ var spaces = '';
+
+ for (var i = 0; i < m.length - 1; i++)
+ spaces += sh.config.space;
+
+ return spaces + ' ';
+ });
+
+ // Split each line and apply <span class="...">...</span> to them so that
+ // leading spaces aren't included.
+ if (css != null)
+ str = eachLine(str, function(line)
+ {
+ if (line.length == 0)
+ return '';
+
+ var spaces = '';
+
+ line = line.replace(/^(&nbsp;| )+/, function(s)
+ {
+ spaces = s;
+ return '';
+ });
+
+ if (line.length == 0)
+ return spaces;
+
+ return spaces + '<code class="' + css + '">' + line + '</code>';
+ });
+
+ return str;
+};
+
+/**
+ * Pads number with zeros until it's length is the same as given length.
+ *
+ * @param {Number} number Number to pad.
+ * @param {Number} length Max string length with.
+ * @return {String} Returns a string padded with proper amount of '0'.
+ */
+function padNumber(number, length)
+{
+ var result = number.toString();
+
+ while (result.length < length)
+ result = '0' + result;
+
+ return result;
+};
+
+/**
+ * Replaces tabs with spaces.
+ *
+ * @param {String} code Source code.
+ * @param {Number} tabSize Size of the tab.
+ * @return {String} Returns code with all tabs replaces by spaces.
+ */
+function processTabs(code, tabSize)
+{
+ var tab = '';
+
+ for (var i = 0; i < tabSize; i++)
+ tab += ' ';
+
+ return code.replace(/\t/g, tab);
+};
+
+/**
+ * Replaces tabs with smart spaces.
+ *
+ * @param {String} code Code to fix the tabs in.
+ * @param {Number} tabSize Number of spaces in a column.
+ * @return {String} Returns code with all tabs replaces with roper amount of spaces.
+ */
+function processSmartTabs(code, tabSize)
+{
+ var lines = splitLines(code),
+ tab = '\t',
+ spaces = ''
+ ;
+
+ // Create a string with 1000 spaces to copy spaces from...
+ // It's assumed that there would be no indentation longer than that.
+ for (var i = 0; i < 50; i++)
+ spaces += ' '; // 20 spaces * 50
+
+ // This function inserts specified amount of spaces in the string
+ // where a tab is while removing that given tab.
+ function insertSpaces(line, pos, count)
+ {
+ return line.substr(0, pos)
+ + spaces.substr(0, count)
+ + line.substr(pos + 1, line.length) // pos + 1 will get rid of the tab
+ ;
+ };
+
+ // Go through all the lines and do the 'smart tabs' magic.
+ code = eachLine(code, function(line)
+ {
+ if (line.indexOf(tab) == -1)
+ return line;
+
+ var pos = 0;
+
+ while ((pos = line.indexOf(tab)) != -1)
+ {
+ // This is pretty much all there is to the 'smart tabs' logic.
+ // Based on the position within the line and size of a tab,
+ // calculate the amount of spaces we need to insert.
+ var spaces = tabSize - pos % tabSize;
+ line = insertSpaces(line, pos, spaces);
+ }
+
+ return line;
+ });
+
+ return code;
+};
+
+/**
+ * Performs various string fixes based on configuration.
+ */
+function fixInputString(str)
+{
+ var br = /<br\s*\/?>|&lt;br\s*\/?&gt;/gi;
+
+ if (sh.config.bloggerMode == true)
+ str = str.replace(br, '\n');
+
+ if (sh.config.stripBrs == true)
+ str = str.replace(br, '');
+
+ return str;
+};
+
+/**
+ * Removes all white space at the begining and end of a string.
+ *
+ * @param {String} str String to trim.
+ * @return {String} Returns string without leading and following white space characters.
+ */
+function trim(str)
+{
+ return str.replace(/^\s+|\s+$/g, '');
+};
+
+/**
+ * Unindents a block of text by the lowest common indent amount.
+ * @param {String} str Text to unindent.
+ * @return {String} Returns unindented text block.
+ */
+function unindent(str)
+{
+ var lines = splitLines(fixInputString(str)),
+ indents = new Array(),
+ regex = /^\s*/,
+ min = 1000
+ ;
+
+ // go through every line and check for common number of indents
+ for (var i = 0; i < lines.length && min > 0; i++)
+ {
+ var line = lines[i];
+
+ if (trim(line).length == 0)
+ continue;
+
+ var matches = regex.exec(line);
+
+ // In the event that just one line doesn't have leading white space
+ // we can't unindent anything, so bail completely.
+ if (matches == null)
+ return str;
+
+ min = Math.min(matches[0].length, min);
+ }
+
+ // trim minimum common number of white space from the begining of every line
+ if (min > 0)
+ for (var i = 0; i < lines.length; i++)
+ lines[i] = lines[i].substr(min);
+
+ return lines.join('\n');
+};
+
+/**
+ * Callback method for Array.sort() which sorts matches by
+ * index position and then by length.
+ *
+ * @param {Match} m1 Left object.
+ * @param {Match} m2 Right object.
+ * @return {Number} Returns -1, 0 or -1 as a comparison result.
+ */
+function matchesSortCallback(m1, m2)
+{
+ // sort matches by index first
+ if(m1.index < m2.index)
+ return -1;
+ else if(m1.index > m2.index)
+ return 1;
+ else
+ {
+ // if index is the same, sort by length
+ if(m1.length < m2.length)
+ return -1;
+ else if(m1.length > m2.length)
+ return 1;
+ }
+
+ return 0;
+};
+
+/**
+ * Executes given regular expression on provided code and returns all
+ * matches that are found.
+ *
+ * @param {String} code Code to execute regular expression on.
+ * @param {Object} regex Regular expression item info from <code>regexList</code> collection.
+ * @return {Array} Returns a list of Match objects.
+ */
+function getMatches(code, regexInfo)
+{
+ function defaultAdd(match, regexInfo)
+ {
+ return match[0];
+ };
+
+ var index = 0,
+ match = null,
+ matches = [],
+ func = regexInfo.func ? regexInfo.func : defaultAdd
+ ;
+
+ while((match = regexInfo.regex.exec(code)) != null)
+ {
+ var resultMatch = func(match, regexInfo);
+
+ if (typeof(resultMatch) == 'string')
+ resultMatch = [new sh.Match(resultMatch, match.index, regexInfo.css)];
+
+ matches = matches.concat(resultMatch);
+ }
+
+ return matches;
+};
+
+/**
+ * Turns all URLs in the code into <a/> tags.
+ * @param {String} code Input code.
+ * @return {String} Returns code with </a> tags.
+ */
+function processUrls(code)
+{
+ var gt = /(.*)((&gt;|&lt;).*)/;
+
+ return code.replace(sh.regexLib.url, function(m)
+ {
+ var suffix = '',
+ match = null
+ ;
+
+ // We include &lt; and &gt; in the URL for the common cases like <http://google.com>
+ // The problem is that they get transformed into &lt;http://google.com&gt;
+ // Where as &gt; easily looks like part of the URL string.
+
+ if (match = gt.exec(m))
+ {
+ m = match[1];
+ suffix = match[2];
+ }
+
+ return '<a href="' + m + '">' + m + '</a>' + suffix;
+ });
+};
+
+/**
+ * Finds all <SCRIPT TYPE="syntaxhighlighter" /> elementss.
+ * @return {Array} Returns array of all found SyntaxHighlighter tags.
+ */
+function getSyntaxHighlighterScriptTags()
+{
+ var tags = document.getElementsByTagName('script'),
+ result = []
+ ;
+
+ for (var i = 0; i < tags.length; i++)
+ if (tags[i].type == 'syntaxhighlighter')
+ result.push(tags[i]);
+
+ return result;
+};
+
+/**
+ * Strips <![CDATA[]]> from <SCRIPT /> content because it should be used
+ * there in most cases for XHTML compliance.
+ * @param {String} original Input code.
+ * @return {String} Returns code without leading <![CDATA[]]> tags.
+ */
+function stripCData(original)
+{
+ var left = '<![CDATA[',
+ right = ']]>',
+ // for some reason IE inserts some leading blanks here
+ copy = trim(original),
+ changed = false,
+ leftLength = left.length,
+ rightLength = right.length
+ ;
+
+ if (copy.indexOf(left) == 0)
+ {
+ copy = copy.substring(leftLength);
+ changed = true;
+ }
+
+ var copyLength = copy.length;
+
+ if (copy.indexOf(right) == copyLength - rightLength)
+ {
+ copy = copy.substring(0, copyLength - rightLength);
+ changed = true;
+ }
+
+ return changed ? copy : original;
+};
+
+
+/**
+ * Quick code mouse double click handler.
+ */
+function quickCodeHandler(e)
+{
+ var target = e.target,
+ highlighterDiv = findParentElement(target, '.syntaxhighlighter'),
+ container = findParentElement(target, '.container'),
+ textarea = document.createElement('textarea'),
+ highlighter
+ ;
+
+ if (!container || !highlighterDiv || findElement(container, 'textarea'))
+ return;
+
+ highlighter = getHighlighterById(highlighterDiv.id);
+
+ // add source class name
+ addClass(highlighterDiv, 'source');
+
+ // Have to go over each line and grab it's text, can't just do it on the
+ // container because Firefox loses all \n where as Webkit doesn't.
+ var lines = container.childNodes,
+ code = []
+ ;
+
+ for (var i = 0; i < lines.length; i++)
+ code.push(lines[i].innerText || lines[i].textContent);
+
+ // using \r instead of \r or \r\n makes this work equally well on IE, FF and Webkit
+ code = code.join('\r');
+
+ // inject <textarea/> tag
+ textarea.appendChild(document.createTextNode(code));
+ container.appendChild(textarea);
+
+ // preselect all text
+ textarea.focus();
+ textarea.select();
+
+ // set up handler for lost focus
+ attachEvent(textarea, 'blur', function(e)
+ {
+ textarea.parentNode.removeChild(textarea);
+ removeClass(highlighterDiv, 'source');
+ });
+};
+
+/**
+ * Match object.
+ */
+sh.Match = function(value, index, css)
+{
+ this.value = value;
+ this.index = index;
+ this.length = value.length;
+ this.css = css;
+ this.brushName = null;
+};
+
+sh.Match.prototype.toString = function()
+{
+ return this.value;
+};
+
+/**
+ * Simulates HTML code with a scripting language embedded.
+ *
+ * @param {String} scriptBrushName Brush name of the scripting language.
+ */
+sh.HtmlScript = function(scriptBrushName)
+{
+ var brushClass = findBrush(scriptBrushName),
+ scriptBrush,
+ xmlBrush = new sh.brushes.Xml(),
+ bracketsRegex = null,
+ ref = this,
+ methodsToExpose = 'getDiv getHtml init'.split(' ')
+ ;
+
+ if (brushClass == null)
+ return;
+
+ scriptBrush = new brushClass();
+
+ for(var i = 0; i < methodsToExpose.length; i++)
+ // make a closure so we don't lose the name after i changes
+ (function() {
+ var name = methodsToExpose[i];
+
+ ref[name] = function()
+ {
+ return xmlBrush[name].apply(xmlBrush, arguments);
+ };
+ })();
+
+ if (scriptBrush.htmlScript == null)
+ {
+ alert(sh.config.strings.brushNotHtmlScript + scriptBrushName);
+ return;
+ }
+
+ xmlBrush.regexList.push(
+ { regex: scriptBrush.htmlScript.code, func: process }
+ );
+
+ function offsetMatches(matches, offset)
+ {
+ for (var j = 0; j < matches.length; j++)
+ matches[j].index += offset;
+ }
+
+ function process(match, info)
+ {
+ var code = match.code,
+ matches = [],
+ regexList = scriptBrush.regexList,
+ offset = match.index + match.left.length,
+ htmlScript = scriptBrush.htmlScript,
+ result
+ ;
+
+ // add all matches from the code
+ for (var i = 0; i < regexList.length; i++)
+ {
+ result = getMatches(code, regexList[i]);
+ offsetMatches(result, offset);
+ matches = matches.concat(result);
+ }
+
+ // add left script bracket
+ if (htmlScript.left != null && match.left != null)
+ {
+ result = getMatches(match.left, htmlScript.left);
+ offsetMatches(result, match.index);
+ matches = matches.concat(result);
+ }
+
+ // add right script bracket
+ if (htmlScript.right != null && match.right != null)
+ {
+ result = getMatches(match.right, htmlScript.right);
+ offsetMatches(result, match.index + match[0].lastIndexOf(match.right));
+ matches = matches.concat(result);
+ }
+
+ for (var j = 0; j < matches.length; j++)
+ matches[j].brushName = brushClass.brushName;
+
+ return matches;
+ }
+};
+
+/**
+ * Main Highlither class.
+ * @constructor
+ */
+sh.Highlighter = function()
+{
+ // not putting any code in here because of the prototype inheritance
+};
+
+sh.Highlighter.prototype = {
+ /**
+ * Returns value of the parameter passed to the highlighter.
+ * @param {String} name Name of the parameter.
+ * @param {Object} defaultValue Default value.
+ * @return {Object} Returns found value or default value otherwise.
+ */
+ getParam: function(name, defaultValue)
+ {
+ var result = this.params[name];
+ return toBoolean(result == null ? defaultValue : result);
+ },
+
+ /**
+ * Shortcut to document.createElement().
+ * @param {String} name Name of the element to create (DIV, A, etc).
+ * @return {HTMLElement} Returns new HTML element.
+ */
+ create: function(name)
+ {
+ return document.createElement(name);
+ },
+
+ /**
+ * Applies all regular expression to the code and stores all found
+ * matches in the `this.matches` array.
+ * @param {Array} regexList List of regular expressions.
+ * @param {String} code Source code.
+ * @return {Array} Returns list of matches.
+ */
+ findMatches: function(regexList, code)
+ {
+ var result = [];
+
+ if (regexList != null)
+ for (var i = 0; i < regexList.length; i++)
+ // BUG: length returns len+1 for array if methods added to prototype chain (oising@gmail.com)
+ if (typeof (regexList[i]) == "object")
+ result = result.concat(getMatches(code, regexList[i]));
+
+ // sort and remove nested the matches
+ return this.removeNestedMatches(result.sort(matchesSortCallback));
+ },
+
+ /**
+ * Checks to see if any of the matches are inside of other matches.
+ * This process would get rid of highligted strings inside comments,
+ * keywords inside strings and so on.
+ */
+ removeNestedMatches: function(matches)
+ {
+ // Optimized by Jose Prado (http://joseprado.com)
+ for (var i = 0; i < matches.length; i++)
+ {
+ if (matches[i] === null)
+ continue;
+
+ var itemI = matches[i],
+ itemIEndPos = itemI.index + itemI.length
+ ;
+
+ for (var j = i + 1; j < matches.length && matches[i] !== null; j++)
+ {
+ var itemJ = matches[j];
+
+ if (itemJ === null)
+ continue;
+ else if (itemJ.index > itemIEndPos)
+ break;
+ else if (itemJ.index == itemI.index && itemJ.length > itemI.length)
+ matches[i] = null;
+ else if (itemJ.index >= itemI.index && itemJ.index < itemIEndPos)
+ matches[j] = null;
+ }
+ }
+
+ return matches;
+ },
+
+ /**
+ * Creates an array containing integer line numbers starting from the 'first-line' param.
+ * @return {Array} Returns array of integers.
+ */
+ figureOutLineNumbers: function(code)
+ {
+ var lines = [],
+ firstLine = parseInt(this.getParam('first-line'))
+ ;
+
+ eachLine(code, function(line, index)
+ {
+ lines.push(index + firstLine);
+ });
+
+ return lines;
+ },
+
+ /**
+ * Determines if specified line number is in the highlighted list.
+ */
+ isLineHighlighted: function(lineNumber)
+ {
+ var list = this.getParam('highlight', []);
+
+ if (typeof(list) != 'object' && list.push == null)
+ list = [ list ];
+
+ return indexOf(list, lineNumber.toString()) != -1;
+ },
+
+ /**
+ * Generates HTML markup for a single line of code while determining alternating line style.
+ * @param {Integer} lineNumber Line number.
+ * @param {String} code Line HTML markup.
+ * @return {String} Returns HTML markup.
+ */
+ getLineHtml: function(lineIndex, lineNumber, code)
+ {
+ var classes = [
+ 'line',
+ 'number' + lineNumber,
+ 'index' + lineIndex,
+ 'alt' + (lineNumber % 2 == 0 ? 1 : 2).toString()
+ ];
+
+ if (this.isLineHighlighted(lineNumber))
+ classes.push('highlighted');
+
+ if (lineNumber == 0)
+ classes.push('break');
+
+ return '<div class="' + classes.join(' ') + '">' + code + '</div>';
+ },
+
+ /**
+ * Generates HTML markup for line number column.
+ * @param {String} code Complete code HTML markup.
+ * @param {Array} lineNumbers Calculated line numbers.
+ * @return {String} Returns HTML markup.
+ */
+ getLineNumbersHtml: function(code, lineNumbers)
+ {
+ var html = '',
+ count = splitLines(code).length,
+ firstLine = parseInt(this.getParam('first-line')),
+ pad = this.getParam('pad-line-numbers')
+ ;
+
+ if (pad == true)
+ pad = (firstLine + count - 1).toString().length;
+ else if (isNaN(pad) == true)
+ pad = 0;
+
+ for (var i = 0; i < count; i++)
+ {
+ var lineNumber = lineNumbers ? lineNumbers[i] : firstLine + i,
+ code = lineNumber == 0 ? sh.config.space : padNumber(lineNumber, pad)
+ ;
+
+ html += this.getLineHtml(i, lineNumber, code);
+ }
+
+ return html;
+ },
+
+ /**
+ * Splits block of text into individual DIV lines.
+ * @param {String} code Code to highlight.
+ * @param {Array} lineNumbers Calculated line numbers.
+ * @return {String} Returns highlighted code in HTML form.
+ */
+ getCodeLinesHtml: function(html, lineNumbers)
+ {
+ html = trim(html);
+
+ var lines = splitLines(html),
+ padLength = this.getParam('pad-line-numbers'),
+ firstLine = parseInt(this.getParam('first-line')),
+ html = '',
+ brushName = this.getParam('brush')
+ ;
+
+ for (var i = 0; i < lines.length; i++)
+ {
+ var line = lines[i],
+ indent = /^(&nbsp;|\s)+/.exec(line),
+ spaces = null,
+ lineNumber = lineNumbers ? lineNumbers[i] : firstLine + i;
+ ;
+
+ if (indent != null)
+ {
+ spaces = indent[0].toString();
+ line = line.substr(spaces.length);
+ spaces = spaces.replace(' ', sh.config.space);
+ }
+
+ line = trim(line);
+
+ if (line.length == 0)
+ line = sh.config.space;
+
+ html += this.getLineHtml(
+ i,
+ lineNumber,
+ (spaces != null ? '<code class="' + brushName + ' spaces">' + spaces + '</code>' : '') + line
+ );
+ }
+
+ return html;
+ },
+
+ /**
+ * Returns HTML for the table title or empty string if title is null.
+ */
+ getTitleHtml: function(title)
+ {
+ return title ? '<caption>' + title + '</caption>' : '';
+ },
+
+ /**
+ * Finds all matches in the source code.
+ * @param {String} code Source code to process matches in.
+ * @param {Array} matches Discovered regex matches.
+ * @return {String} Returns formatted HTML with processed mathes.
+ */
+ getMatchesHtml: function(code, matches)
+ {
+ var pos = 0,
+ result = '',
+ brushName = this.getParam('brush', '')
+ ;
+
+ function getBrushNameCss(match)
+ {
+ var result = match ? (match.brushName || brushName) : brushName;
+ return result ? result + ' ' : '';
+ };
+
+ // Finally, go through the final list of matches and pull the all
+ // together adding everything in between that isn't a match.
+ for (var i = 0; i < matches.length; i++)
+ {
+ var match = matches[i],
+ matchBrushName
+ ;
+
+ if (match === null || match.length === 0)
+ continue;
+
+ matchBrushName = getBrushNameCss(match);
+
+ result += wrapLinesWithCode(code.substr(pos, match.index - pos), matchBrushName + 'plain')
+ + wrapLinesWithCode(match.value, matchBrushName + match.css)
+ ;
+
+ pos = match.index + match.length + (match.offset || 0);
+ }
+
+ // don't forget to add whatever's remaining in the string
+ result += wrapLinesWithCode(code.substr(pos), getBrushNameCss() + 'plain');
+
+ return result;
+ },
+
+ /**
+ * Generates HTML markup for the whole syntax highlighter.
+ * @param {String} code Source code.
+ * @return {String} Returns HTML markup.
+ */
+ getHtml: function(code)
+ {
+ var html = '',
+ classes = [ 'syntaxhighlighter' ],
+ tabSize,
+ matches,
+ lineNumbers
+ ;
+
+ // process light mode
+ if (this.getParam('light') == true)
+ this.params.toolbar = this.params.gutter = false;
+
+ className = 'syntaxhighlighter';
+
+ if (this.getParam('collapse') == true)
+ classes.push('collapsed');
+
+ if ((gutter = this.getParam('gutter')) == false)
+ classes.push('nogutter');
+
+ // add custom user style name
+ classes.push(this.getParam('class-name'));
+
+ // add brush alias to the class name for custom CSS
+ classes.push(this.getParam('brush'));
+
+ code = trimFirstAndLastLines(code)
+ .replace(/\r/g, ' ') // IE lets these buggers through
+ ;
+
+ tabSize = this.getParam('tab-size');
+
+ // replace tabs with spaces
+ code = this.getParam('smart-tabs') == true
+ ? processSmartTabs(code, tabSize)
+ : processTabs(code, tabSize)
+ ;
+
+ // unindent code by the common indentation
+ code = unindent(code);
+
+ if (gutter)
+ lineNumbers = this.figureOutLineNumbers(code);
+
+ // find matches in the code using brushes regex list
+ matches = this.findMatches(this.regexList, code);
+ // processes found matches into the html
+ html = this.getMatchesHtml(code, matches);
+ // finally, split all lines so that they wrap well
+ html = this.getCodeLinesHtml(html, lineNumbers);
+
+ // finally, process the links
+ if (this.getParam('auto-links'))
+ html = processUrls(html);
+
+ if (typeof(navigator) != 'undefined' && navigator.userAgent && navigator.userAgent.match(/MSIE/))
+ classes.push('ie');
+
+ html =
+ '<div id="' + getHighlighterId(this.id) + '" class="' + classes.join(' ') + '">'
+ + (this.getParam('toolbar') ? sh.toolbar.getHtml(this) : '')
+ + '<table border="0" cellpadding="0" cellspacing="0">'
+ + this.getTitleHtml(this.getParam('title'))
+ + '<tbody>'
+ + '<tr>'
+ + (gutter ? '<td class="gutter">' + this.getLineNumbersHtml(code) + '</td>' : '')
+ + '<td class="code">'
+ + '<div class="container">'
+ + html
+ + '</div>'
+ + '</td>'
+ + '</tr>'
+ + '</tbody>'
+ + '</table>'
+ + '</div>'
+ ;
+
+ return html;
+ },
+
+ /**
+ * Highlights the code and returns complete HTML.
+ * @param {String} code Code to highlight.
+ * @return {Element} Returns container DIV element with all markup.
+ */
+ getDiv: function(code)
+ {
+ if (code === null)
+ code = '';
+
+ this.code = code;
+
+ var div = this.create('div');
+
+ // create main HTML
+ div.innerHTML = this.getHtml(code);
+
+ // set up click handlers
+ if (this.getParam('toolbar'))
+ attachEvent(findElement(div, '.toolbar'), 'click', sh.toolbar.handler);
+
+ if (this.getParam('quick-code'))
+ attachEvent(findElement(div, '.code'), 'dblclick', quickCodeHandler);
+
+ return div;
+ },
+
+ /**
+ * Initializes the highlighter/brush.
+ *
+ * Constructor isn't used for initialization so that nothing executes during necessary
+ * `new SyntaxHighlighter.Highlighter()` call when setting up brush inheritence.
+ *
+ * @param {Hash} params Highlighter parameters.
+ */
+ init: function(params)
+ {
+ this.id = guid();
+
+ // register this instance in the highlighters list
+ storeHighlighter(this);
+
+ // local params take precedence over defaults
+ this.params = merge(sh.defaults, params || {})
+
+ // process light mode
+ if (this.getParam('light') == true)
+ this.params.toolbar = this.params.gutter = false;
+ },
+
+ /**
+ * Converts space separated list of keywords into a regular expression string.
+ * @param {String} str Space separated keywords.
+ * @return {String} Returns regular expression string.
+ */
+ getKeywords: function(str)
+ {
+ str = str
+ .replace(/^\s+|\s+$/g, '')
+ .replace(/\s+/g, '|')
+ ;
+
+ return '\\b(?:' + str + ')\\b';
+ },
+
+ /**
+ * Makes a brush compatible with the `html-script` functionality.
+ * @param {Object} regexGroup Object containing `left` and `right` regular expressions.
+ */
+ forHtmlScript: function(regexGroup)
+ {
+ this.htmlScript = {
+ left : { regex: regexGroup.left, css: 'script' },
+ right : { regex: regexGroup.right, css: 'script' },
+ code : new XRegExp(
+ "(?<left>" + regexGroup.left.source + ")" +
+ "(?<code>.*?)" +
+ "(?<right>" + regexGroup.right.source + ")",
+ "sgi"
+ )
+ };
+ }
+}; // end of Highlighter
+
+return sh;
+}(); // end of anonymous function
+
+// CommonJS
+typeof(exports) != 'undefined' ? exports['SyntaxHighlighter'] = SyntaxHighlighter : null;
diff --git a/upstream/clipper-6.4.2/Documentation/Scripts/SyntaxHighlighter/src/shLegacy.js b/upstream/clipper-6.4.2/Documentation/Scripts/SyntaxHighlighter/src/shLegacy.js
new file mode 100644
index 0000000..36951c9
--- /dev/null
+++ b/upstream/clipper-6.4.2/Documentation/Scripts/SyntaxHighlighter/src/shLegacy.js
@@ -0,0 +1,157 @@
+/**
+ * SyntaxHighlighter
+ * http://alexgorbatchev.com/SyntaxHighlighter
+ *
+ * SyntaxHighlighter is donationware. If you are using it, please donate.
+ * http://alexgorbatchev.com/SyntaxHighlighter/donate.html
+ *
+ * @version
+ * 3.0.83 (July 02 2010)
+ *
+ * @copyright
+ * Copyright (C) 2004-2010 Alex Gorbatchev.
+ *
+ * @license
+ * Dual licensed under the MIT and GPL licenses.
+ */
+var dp = {
+ SyntaxHighlighter : {}
+};
+
+dp.SyntaxHighlighter = {
+ parseParams: function(
+ input,
+ showGutter,
+ showControls,
+ collapseAll,
+ firstLine,
+ showColumns
+ )
+ {
+ function getValue(list, name)
+ {
+ var regex = new XRegExp('^' + name + '\\[(?<value>\\w+)\\]$', 'gi'),
+ match = null
+ ;
+
+ for (var i = 0; i < list.length; i++)
+ if ((match = regex.exec(list[i])) != null)
+ return match.value;
+
+ return null;
+ };
+
+ function defaultValue(value, def)
+ {
+ return value != null ? value : def;
+ };
+
+ function asString(value)
+ {
+ return value != null ? value.toString() : null;
+ };
+
+ var parts = input.split(':'),
+ brushName = parts[0],
+ options = {},
+ straight = { 'true' : true }
+ reverse = { 'true' : false },
+ result = null,
+ defaults = SyntaxHighlighter.defaults
+ ;
+
+ for (var i in parts)
+ options[parts[i]] = 'true';
+
+ showGutter = asString(defaultValue(showGutter, defaults.gutter));
+ showControls = asString(defaultValue(showControls, defaults.toolbar));
+ collapseAll = asString(defaultValue(collapseAll, defaults.collapse));
+ showColumns = asString(defaultValue(showColumns, defaults.ruler));
+ firstLine = asString(defaultValue(firstLine, defaults['first-line']));
+
+ return {
+ brush : brushName,
+ gutter : defaultValue(reverse[options.nogutter], showGutter),
+ toolbar : defaultValue(reverse[options.nocontrols], showControls),
+ collapse : defaultValue(straight[options.collapse], collapseAll),
+ // ruler : defaultValue(straight[options.showcolumns], showColumns),
+ 'first-line' : defaultValue(getValue(parts, 'firstline'), firstLine)
+ };
+ },
+
+ HighlightAll: function(
+ name,
+ showGutter /* optional */,
+ showControls /* optional */,
+ collapseAll /* optional */,
+ firstLine /* optional */,
+ showColumns /* optional */
+ )
+ {
+ function findValue()
+ {
+ var a = arguments;
+
+ for (var i = 0; i < a.length; i++)
+ {
+ if (a[i] === null)
+ continue;
+
+ if (typeof(a[i]) == 'string' && a[i] != '')
+ return a[i] + '';
+
+ if (typeof(a[i]) == 'object' && a[i].value != '')
+ return a[i].value + '';
+ }
+
+ return null;
+ };
+
+ function findTagsByName(list, name, tagName)
+ {
+ var tags = document.getElementsByTagName(tagName);
+
+ for (var i = 0; i < tags.length; i++)
+ if (tags[i].getAttribute('name') == name)
+ list.push(tags[i]);
+ }
+
+ var elements = [],
+ highlighter = null,
+ registered = {},
+ propertyName = 'innerHTML'
+ ;
+
+ // for some reason IE doesn't find <pre/> by name, however it does see them just fine by tag name...
+ findTagsByName(elements, name, 'pre');
+ findTagsByName(elements, name, 'textarea');
+
+ if (elements.length === 0)
+ return;
+
+ for (var i = 0; i < elements.length; i++)
+ {
+ var element = elements[i],
+ params = findValue(
+ element.attributes['class'], element.className,
+ element.attributes['language'], element.language
+ ),
+ language = ''
+ ;
+
+ if (params === null)
+ continue;
+
+ params = dp.SyntaxHighlighter.parseParams(
+ params,
+ showGutter,
+ showControls,
+ collapseAll,
+ firstLine,
+ showColumns
+ );
+
+ SyntaxHighlighter.highlight(params, element);
+ }
+ }
+};
diff --git a/upstream/clipper-6.4.2/Documentation/Scripts/SyntaxHighlighter/styles/shCore.css b/upstream/clipper-6.4.2/Documentation/Scripts/SyntaxHighlighter/styles/shCore.css
new file mode 100644
index 0000000..34f6864
--- /dev/null
+++ b/upstream/clipper-6.4.2/Documentation/Scripts/SyntaxHighlighter/styles/shCore.css
@@ -0,0 +1,226 @@
+/**
+ * SyntaxHighlighter
+ * http://alexgorbatchev.com/SyntaxHighlighter
+ *
+ * SyntaxHighlighter is donationware. If you are using it, please donate.
+ * http://alexgorbatchev.com/SyntaxHighlighter/donate.html
+ *
+ * @version
+ * 3.0.83 (July 02 2010)
+ *
+ * @copyright
+ * Copyright (C) 2004-2010 Alex Gorbatchev.
+ *
+ * @license
+ * Dual licensed under the MIT and GPL licenses.
+ */
+.syntaxhighlighter a,
+.syntaxhighlighter div,
+.syntaxhighlighter code,
+.syntaxhighlighter table,
+.syntaxhighlighter table td,
+.syntaxhighlighter table tr,
+.syntaxhighlighter table tbody,
+.syntaxhighlighter table thead,
+.syntaxhighlighter table caption,
+.syntaxhighlighter textarea {
+ -moz-border-radius: 0 0 0 0 !important;
+ -webkit-border-radius: 0 0 0 0 !important;
+ background: none !important;
+ border: 0 !important;
+ bottom: auto !important;
+ float: none !important;
+ height: auto !important;
+ left: auto !important;
+ line-height: 1.1em !important;
+ margin: 0 !important;
+ outline: 0 !important;
+ overflow: visible !important;
+ padding: 0 !important;
+ position: static !important;
+ right: auto !important;
+ text-align: left !important;
+ top: auto !important;
+ vertical-align: baseline !important;
+ width: auto !important;
+ box-sizing: content-box !important;
+ font-family: "Consolas", "Bitstream Vera Sans Mono", "Courier New", Courier, monospace !important;
+ font-weight: normal !important;
+ font-style: normal !important;
+ font-size: 1em !important;
+ min-height: inherit !important;
+ min-height: auto !important;
+}
+
+.syntaxhighlighter {
+ width: 100% !important;
+ margin: 1em 0 1em 0 !important;
+ position: relative !important;
+ overflow: auto !important;
+ font-size: 1em !important;
+}
+.syntaxhighlighter.source {
+ overflow: hidden !important;
+}
+.syntaxhighlighter .bold {
+ font-weight: bold !important;
+}
+.syntaxhighlighter .italic {
+ font-style: italic !important;
+}
+.syntaxhighlighter .line {
+ white-space: pre !important;
+}
+.syntaxhighlighter table {
+ width: 100% !important;
+}
+.syntaxhighlighter table caption {
+ text-align: left !important;
+ padding: .5em 0 0.5em 1em !important;
+}
+.syntaxhighlighter table td.code {
+ width: 100% !important;
+}
+.syntaxhighlighter table td.code .container {
+ position: relative !important;
+}
+.syntaxhighlighter table td.code .container textarea {
+ box-sizing: border-box !important;
+ position: absolute !important;
+ left: 0 !important;
+ top: 0 !important;
+ width: 100% !important;
+ height: 100% !important;
+ border: none !important;
+ background: white !important;
+ padding-left: 1em !important;
+ overflow: hidden !important;
+ white-space: pre !important;
+}
+.syntaxhighlighter table td.gutter .line {
+ text-align: right !important;
+ padding: 0 0.5em 0 1em !important;
+}
+.syntaxhighlighter table td.code .line {
+ padding: 0 1em !important;
+}
+.syntaxhighlighter.nogutter td.code .container textarea, .syntaxhighlighter.nogutter td.code .line {
+ padding-left: 0em !important;
+}
+.syntaxhighlighter.show {
+ display: block !important;
+}
+.syntaxhighlighter.collapsed table {
+ display: none !important;
+}
+.syntaxhighlighter.collapsed .toolbar {
+ padding: 0.1em 0.8em 0em 0.8em !important;
+ font-size: 1em !important;
+ position: static !important;
+ width: auto !important;
+ height: auto !important;
+}
+.syntaxhighlighter.collapsed .toolbar span {
+ display: inline !important;
+ margin-right: 1em !important;
+}
+.syntaxhighlighter.collapsed .toolbar span a {
+ padding: 0 !important;
+ display: none !important;
+}
+.syntaxhighlighter.collapsed .toolbar span a.expandSource {
+ display: inline !important;
+}
+.syntaxhighlighter .toolbar {
+ position: absolute !important;
+ right: 1px !important;
+ top: 1px !important;
+ width: 11px !important;
+ height: 11px !important;
+ font-size: 10px !important;
+ z-index: 10 !important;
+}
+.syntaxhighlighter .toolbar span.title {
+ display: inline !important;
+}
+.syntaxhighlighter .toolbar a {
+ display: block !important;
+ text-align: center !important;
+ text-decoration: none !important;
+ padding-top: 1px !important;
+}
+.syntaxhighlighter .toolbar a.expandSource {
+ display: none !important;
+}
+.syntaxhighlighter.ie {
+ font-size: .9em !important;
+ padding: 1px 0 1px 0 !important;
+}
+.syntaxhighlighter.ie .toolbar {
+ line-height: 8px !important;
+}
+.syntaxhighlighter.ie .toolbar a {
+ padding-top: 0px !important;
+}
+.syntaxhighlighter.printing .line.alt1 .content,
+.syntaxhighlighter.printing .line.alt2 .content,
+.syntaxhighlighter.printing .line.highlighted .number,
+.syntaxhighlighter.printing .line.highlighted.alt1 .content,
+.syntaxhighlighter.printing .line.highlighted.alt2 .content {
+ background: none !important;
+}
+.syntaxhighlighter.printing .line .number {
+ color: #bbbbbb !important;
+}
+.syntaxhighlighter.printing .line .content {
+ color: black !important;
+}
+.syntaxhighlighter.printing .toolbar {
+ display: none !important;
+}
+.syntaxhighlighter.printing a {
+ text-decoration: none !important;
+}
+.syntaxhighlighter.printing .plain, .syntaxhighlighter.printing .plain a {
+ color: black !important;
+}
+.syntaxhighlighter.printing .comments, .syntaxhighlighter.printing .comments a {
+ color: #008200 !important;
+}
+.syntaxhighlighter.printing .string, .syntaxhighlighter.printing .string a {
+ color: blue !important;
+}
+.syntaxhighlighter.printing .keyword {
+ color: #006699 !important;
+ font-weight: bold !important;
+}
+.syntaxhighlighter.printing .preprocessor {
+ color: gray !important;
+}
+.syntaxhighlighter.printing .variable {
+ color: #aa7700 !important;
+}
+.syntaxhighlighter.printing .value {
+ color: #009900 !important;
+}
+.syntaxhighlighter.printing .functions {
+ color: #ff1493 !important;
+}
+.syntaxhighlighter.printing .constants {
+ color: #0066cc !important;
+}
+.syntaxhighlighter.printing .script {
+ font-weight: bold !important;
+}
+.syntaxhighlighter.printing .color1, .syntaxhighlighter.printing .color1 a {
+ color: gray !important;
+}
+.syntaxhighlighter.printing .color2, .syntaxhighlighter.printing .color2 a {
+ color: #ff1493 !important;
+}
+.syntaxhighlighter.printing .color3, .syntaxhighlighter.printing .color3 a {
+ color: red !important;
+}
+.syntaxhighlighter.printing .break, .syntaxhighlighter.printing .break a {
+ color: black !important;
+}
diff --git a/upstream/clipper-6.4.2/Documentation/Scripts/SyntaxHighlighter/styles/shCoreDefault.css b/upstream/clipper-6.4.2/Documentation/Scripts/SyntaxHighlighter/styles/shCoreDefault.css
new file mode 100644
index 0000000..08f9e10
--- /dev/null
+++ b/upstream/clipper-6.4.2/Documentation/Scripts/SyntaxHighlighter/styles/shCoreDefault.css
@@ -0,0 +1,328 @@
+/**
+ * SyntaxHighlighter
+ * http://alexgorbatchev.com/SyntaxHighlighter
+ *
+ * SyntaxHighlighter is donationware. If you are using it, please donate.
+ * http://alexgorbatchev.com/SyntaxHighlighter/donate.html
+ *
+ * @version
+ * 3.0.83 (July 02 2010)
+ *
+ * @copyright
+ * Copyright (C) 2004-2010 Alex Gorbatchev.
+ *
+ * @license
+ * Dual licensed under the MIT and GPL licenses.
+ */
+.syntaxhighlighter a,
+.syntaxhighlighter div,
+.syntaxhighlighter code,
+.syntaxhighlighter table,
+.syntaxhighlighter table td,
+.syntaxhighlighter table tr,
+.syntaxhighlighter table tbody,
+.syntaxhighlighter table thead,
+.syntaxhighlighter table caption,
+.syntaxhighlighter textarea {
+ -moz-border-radius: 0 0 0 0 !important;
+ -webkit-border-radius: 0 0 0 0 !important;
+ background: none !important;
+ border: 0 !important;
+ bottom: auto !important;
+ float: none !important;
+ height: auto !important;
+ left: auto !important;
+ line-height: 1.1em !important;
+ margin: 0 !important;
+ outline: 0 !important;
+ overflow: visible !important;
+ padding: 0 !important;
+ position: static !important;
+ right: auto !important;
+ text-align: left !important;
+ top: auto !important;
+ vertical-align: baseline !important;
+ width: auto !important;
+ box-sizing: content-box !important;
+ font-family: "Consolas", "Bitstream Vera Sans Mono", "Courier New", Courier, monospace !important;
+ font-weight: normal !important;
+ font-style: normal !important;
+ font-size: 1em !important;
+ min-height: inherit !important;
+ min-height: auto !important;
+}
+
+.syntaxhighlighter {
+ width: 100% !important;
+ margin: 1em 0 1em 0 !important;
+ position: relative !important;
+ overflow: auto !important;
+ font-size: 1em !important;
+}
+.syntaxhighlighter.source {
+ overflow: hidden !important;
+}
+.syntaxhighlighter .bold {
+ font-weight: bold !important;
+}
+.syntaxhighlighter .italic {
+ font-style: italic !important;
+}
+.syntaxhighlighter .line {
+ white-space: pre !important;
+}
+.syntaxhighlighter table {
+ width: 100% !important;
+}
+.syntaxhighlighter table caption {
+ text-align: left !important;
+ padding: .5em 0 0.5em 1em !important;
+}
+.syntaxhighlighter table td.code {
+ width: 100% !important;
+}
+.syntaxhighlighter table td.code .container {
+ position: relative !important;
+}
+.syntaxhighlighter table td.code .container textarea {
+ box-sizing: border-box !important;
+ position: absolute !important;
+ left: 0 !important;
+ top: 0 !important;
+ width: 100% !important;
+ height: 100% !important;
+ border: none !important;
+ background: white !important;
+ padding-left: 1em !important;
+ overflow: hidden !important;
+ white-space: pre !important;
+}
+.syntaxhighlighter table td.gutter .line {
+ text-align: right !important;
+ padding: 0 0.5em 0 1em !important;
+}
+.syntaxhighlighter table td.code .line {
+ padding: 0 1em !important;
+}
+.syntaxhighlighter.nogutter td.code .container textarea, .syntaxhighlighter.nogutter td.code .line {
+ padding-left: 0em !important;
+}
+.syntaxhighlighter.show {
+ display: block !important;
+}
+.syntaxhighlighter.collapsed table {
+ display: none !important;
+}
+.syntaxhighlighter.collapsed .toolbar {
+ padding: 0.1em 0.8em 0em 0.8em !important;
+ font-size: 1em !important;
+ position: static !important;
+ width: auto !important;
+ height: auto !important;
+}
+.syntaxhighlighter.collapsed .toolbar span {
+ display: inline !important;
+ margin-right: 1em !important;
+}
+.syntaxhighlighter.collapsed .toolbar span a {
+ padding: 0 !important;
+ display: none !important;
+}
+.syntaxhighlighter.collapsed .toolbar span a.expandSource {
+ display: inline !important;
+}
+.syntaxhighlighter .toolbar {
+ position: absolute !important;
+ right: 1px !important;
+ top: 1px !important;
+ width: 11px !important;
+ height: 11px !important;
+ font-size: 10px !important;
+ z-index: 10 !important;
+}
+.syntaxhighlighter .toolbar span.title {
+ display: inline !important;
+}
+.syntaxhighlighter .toolbar a {
+ display: block !important;
+ text-align: center !important;
+ text-decoration: none !important;
+ padding-top: 1px !important;
+}
+.syntaxhighlighter .toolbar a.expandSource {
+ display: none !important;
+}
+.syntaxhighlighter.ie {
+ font-size: .9em !important;
+ padding: 1px 0 1px 0 !important;
+}
+.syntaxhighlighter.ie .toolbar {
+ line-height: 8px !important;
+}
+.syntaxhighlighter.ie .toolbar a {
+ padding-top: 0px !important;
+}
+.syntaxhighlighter.printing .line.alt1 .content,
+.syntaxhighlighter.printing .line.alt2 .content,
+.syntaxhighlighter.printing .line.highlighted .number,
+.syntaxhighlighter.printing .line.highlighted.alt1 .content,
+.syntaxhighlighter.printing .line.highlighted.alt2 .content {
+ background: none !important;
+}
+.syntaxhighlighter.printing .line .number {
+ color: #bbbbbb !important;
+}
+.syntaxhighlighter.printing .line .content {
+ color: black !important;
+}
+.syntaxhighlighter.printing .toolbar {
+ display: none !important;
+}
+.syntaxhighlighter.printing a {
+ text-decoration: none !important;
+}
+.syntaxhighlighter.printing .plain, .syntaxhighlighter.printing .plain a {
+ color: black !important;
+}
+.syntaxhighlighter.printing .comments, .syntaxhighlighter.printing .comments a {
+ color: #008200 !important;
+}
+.syntaxhighlighter.printing .string, .syntaxhighlighter.printing .string a {
+ color: blue !important;
+}
+.syntaxhighlighter.printing .keyword {
+ color: #006699 !important;
+ font-weight: bold !important;
+}
+.syntaxhighlighter.printing .preprocessor {
+ color: gray !important;
+}
+.syntaxhighlighter.printing .variable {
+ color: #aa7700 !important;
+}
+.syntaxhighlighter.printing .value {
+ color: #009900 !important;
+}
+.syntaxhighlighter.printing .functions {
+ color: #ff1493 !important;
+}
+.syntaxhighlighter.printing .constants {
+ color: #0066cc !important;
+}
+.syntaxhighlighter.printing .script {
+ font-weight: bold !important;
+}
+.syntaxhighlighter.printing .color1, .syntaxhighlighter.printing .color1 a {
+ color: gray !important;
+}
+.syntaxhighlighter.printing .color2, .syntaxhighlighter.printing .color2 a {
+ color: #ff1493 !important;
+}
+.syntaxhighlighter.printing .color3, .syntaxhighlighter.printing .color3 a {
+ color: red !important;
+}
+.syntaxhighlighter.printing .break, .syntaxhighlighter.printing .break a {
+ color: black !important;
+}
+
+.syntaxhighlighter {
+ background-color: white !important;
+}
+.syntaxhighlighter .line.alt1 {
+ background-color: white !important;
+}
+.syntaxhighlighter .line.alt2 {
+ background-color: white !important;
+}
+.syntaxhighlighter .line.highlighted.alt1, .syntaxhighlighter .line.highlighted.alt2 {
+ background-color: #e0e0e0 !important;
+}
+.syntaxhighlighter .line.highlighted.number {
+ color: black !important;
+}
+.syntaxhighlighter table caption {
+ color: black !important;
+}
+.syntaxhighlighter .gutter {
+ color: #afafaf !important;
+}
+.syntaxhighlighter .gutter .line {
+ border-right: 3px solid #6ce26c !important;
+}
+.syntaxhighlighter .gutter .line.highlighted {
+ background-color: #6ce26c !important;
+ color: white !important;
+}
+.syntaxhighlighter.printing .line .content {
+ border: none !important;
+}
+.syntaxhighlighter.collapsed {
+ overflow: visible !important;
+}
+.syntaxhighlighter.collapsed .toolbar {
+ color: blue !important;
+ background: white !important;
+ border: 1px solid #6ce26c !important;
+}
+.syntaxhighlighter.collapsed .toolbar a {
+ color: blue !important;
+}
+.syntaxhighlighter.collapsed .toolbar a:hover {
+ color: red !important;
+}
+.syntaxhighlighter .toolbar {
+ color: white !important;
+ background: #6ce26c !important;
+ border: none !important;
+}
+.syntaxhighlighter .toolbar a {
+ color: white !important;
+}
+.syntaxhighlighter .toolbar a:hover {
+ color: black !important;
+}
+.syntaxhighlighter .plain, .syntaxhighlighter .plain a {
+ color: black !important;
+}
+.syntaxhighlighter .comments, .syntaxhighlighter .comments a {
+ color: #008200 !important;
+}
+.syntaxhighlighter .string, .syntaxhighlighter .string a {
+ color: blue !important;
+}
+.syntaxhighlighter .keyword {
+ color: #006699 !important;
+}
+.syntaxhighlighter .preprocessor {
+ color: gray !important;
+}
+.syntaxhighlighter .variable {
+ color: #aa7700 !important;
+}
+.syntaxhighlighter .value {
+ color: #009900 !important;
+}
+.syntaxhighlighter .functions {
+ color: #ff1493 !important;
+}
+.syntaxhighlighter .constants {
+ color: #0066cc !important;
+}
+.syntaxhighlighter .script {
+ font-weight: bold !important;
+ color: #006699 !important;
+ background-color: none !important;
+}
+.syntaxhighlighter .color1, .syntaxhighlighter .color1 a {
+ color: gray !important;
+}
+.syntaxhighlighter .color2, .syntaxhighlighter .color2 a {
+ color: #ff1493 !important;
+}
+.syntaxhighlighter .color3, .syntaxhighlighter .color3 a {
+ color: red !important;
+}
+
+.syntaxhighlighter .keyword {
+ font-weight: bold !important;
+}
diff --git a/upstream/clipper-6.4.2/Documentation/Scripts/SyntaxHighlighter/styles/shCoreDjango.css b/upstream/clipper-6.4.2/Documentation/Scripts/SyntaxHighlighter/styles/shCoreDjango.css
new file mode 100644
index 0000000..1db1f70
--- /dev/null
+++ b/upstream/clipper-6.4.2/Documentation/Scripts/SyntaxHighlighter/styles/shCoreDjango.css
@@ -0,0 +1,331 @@
+/**
+ * SyntaxHighlighter
+ * http://alexgorbatchev.com/SyntaxHighlighter
+ *
+ * SyntaxHighlighter is donationware. If you are using it, please donate.
+ * http://alexgorbatchev.com/SyntaxHighlighter/donate.html
+ *
+ * @version
+ * 3.0.83 (July 02 2010)
+ *
+ * @copyright
+ * Copyright (C) 2004-2010 Alex Gorbatchev.
+ *
+ * @license
+ * Dual licensed under the MIT and GPL licenses.
+ */
+.syntaxhighlighter a,
+.syntaxhighlighter div,
+.syntaxhighlighter code,
+.syntaxhighlighter table,
+.syntaxhighlighter table td,
+.syntaxhighlighter table tr,
+.syntaxhighlighter table tbody,
+.syntaxhighlighter table thead,
+.syntaxhighlighter table caption,
+.syntaxhighlighter textarea {
+ -moz-border-radius: 0 0 0 0 !important;
+ -webkit-border-radius: 0 0 0 0 !important;
+ background: none !important;
+ border: 0 !important;
+ bottom: auto !important;
+ float: none !important;
+ height: auto !important;
+ left: auto !important;
+ line-height: 1.1em !important;
+ margin: 0 !important;
+ outline: 0 !important;
+ overflow: visible !important;
+ padding: 0 !important;
+ position: static !important;
+ right: auto !important;
+ text-align: left !important;
+ top: auto !important;
+ vertical-align: baseline !important;
+ width: auto !important;
+ box-sizing: content-box !important;
+ font-family: "Consolas", "Bitstream Vera Sans Mono", "Courier New", Courier, monospace !important;
+ font-weight: normal !important;
+ font-style: normal !important;
+ font-size: 1em !important;
+ min-height: inherit !important;
+ min-height: auto !important;
+}
+
+.syntaxhighlighter {
+ width: 100% !important;
+ margin: 1em 0 1em 0 !important;
+ position: relative !important;
+ overflow: auto !important;
+ font-size: 1em !important;
+}
+.syntaxhighlighter.source {
+ overflow: hidden !important;
+}
+.syntaxhighlighter .bold {
+ font-weight: bold !important;
+}
+.syntaxhighlighter .italic {
+ font-style: italic !important;
+}
+.syntaxhighlighter .line {
+ white-space: pre !important;
+}
+.syntaxhighlighter table {
+ width: 100% !important;
+}
+.syntaxhighlighter table caption {
+ text-align: left !important;
+ padding: .5em 0 0.5em 1em !important;
+}
+.syntaxhighlighter table td.code {
+ width: 100% !important;
+}
+.syntaxhighlighter table td.code .container {
+ position: relative !important;
+}
+.syntaxhighlighter table td.code .container textarea {
+ box-sizing: border-box !important;
+ position: absolute !important;
+ left: 0 !important;
+ top: 0 !important;
+ width: 100% !important;
+ height: 100% !important;
+ border: none !important;
+ background: white !important;
+ padding-left: 1em !important;
+ overflow: hidden !important;
+ white-space: pre !important;
+}
+.syntaxhighlighter table td.gutter .line {
+ text-align: right !important;
+ padding: 0 0.5em 0 1em !important;
+}
+.syntaxhighlighter table td.code .line {
+ padding: 0 1em !important;
+}
+.syntaxhighlighter.nogutter td.code .container textarea, .syntaxhighlighter.nogutter td.code .line {
+ padding-left: 0em !important;
+}
+.syntaxhighlighter.show {
+ display: block !important;
+}
+.syntaxhighlighter.collapsed table {
+ display: none !important;
+}
+.syntaxhighlighter.collapsed .toolbar {
+ padding: 0.1em 0.8em 0em 0.8em !important;
+ font-size: 1em !important;
+ position: static !important;
+ width: auto !important;
+ height: auto !important;
+}
+.syntaxhighlighter.collapsed .toolbar span {
+ display: inline !important;
+ margin-right: 1em !important;
+}
+.syntaxhighlighter.collapsed .toolbar span a {
+ padding: 0 !important;
+ display: none !important;
+}
+.syntaxhighlighter.collapsed .toolbar span a.expandSource {
+ display: inline !important;
+}
+.syntaxhighlighter .toolbar {
+ position: absolute !important;
+ right: 1px !important;
+ top: 1px !important;
+ width: 11px !important;
+ height: 11px !important;
+ font-size: 10px !important;
+ z-index: 10 !important;
+}
+.syntaxhighlighter .toolbar span.title {
+ display: inline !important;
+}
+.syntaxhighlighter .toolbar a {
+ display: block !important;
+ text-align: center !important;
+ text-decoration: none !important;
+ padding-top: 1px !important;
+}
+.syntaxhighlighter .toolbar a.expandSource {
+ display: none !important;
+}
+.syntaxhighlighter.ie {
+ font-size: .9em !important;
+ padding: 1px 0 1px 0 !important;
+}
+.syntaxhighlighter.ie .toolbar {
+ line-height: 8px !important;
+}
+.syntaxhighlighter.ie .toolbar a {
+ padding-top: 0px !important;
+}
+.syntaxhighlighter.printing .line.alt1 .content,
+.syntaxhighlighter.printing .line.alt2 .content,
+.syntaxhighlighter.printing .line.highlighted .number,
+.syntaxhighlighter.printing .line.highlighted.alt1 .content,
+.syntaxhighlighter.printing .line.highlighted.alt2 .content {
+ background: none !important;
+}
+.syntaxhighlighter.printing .line .number {
+ color: #bbbbbb !important;
+}
+.syntaxhighlighter.printing .line .content {
+ color: black !important;
+}
+.syntaxhighlighter.printing .toolbar {
+ display: none !important;
+}
+.syntaxhighlighter.printing a {
+ text-decoration: none !important;
+}
+.syntaxhighlighter.printing .plain, .syntaxhighlighter.printing .plain a {
+ color: black !important;
+}
+.syntaxhighlighter.printing .comments, .syntaxhighlighter.printing .comments a {
+ color: #008200 !important;
+}
+.syntaxhighlighter.printing .string, .syntaxhighlighter.printing .string a {
+ color: blue !important;
+}
+.syntaxhighlighter.printing .keyword {
+ color: #006699 !important;
+ font-weight: bold !important;
+}
+.syntaxhighlighter.printing .preprocessor {
+ color: gray !important;
+}
+.syntaxhighlighter.printing .variable {
+ color: #aa7700 !important;
+}
+.syntaxhighlighter.printing .value {
+ color: #009900 !important;
+}
+.syntaxhighlighter.printing .functions {
+ color: #ff1493 !important;
+}
+.syntaxhighlighter.printing .constants {
+ color: #0066cc !important;
+}
+.syntaxhighlighter.printing .script {
+ font-weight: bold !important;
+}
+.syntaxhighlighter.printing .color1, .syntaxhighlighter.printing .color1 a {
+ color: gray !important;
+}
+.syntaxhighlighter.printing .color2, .syntaxhighlighter.printing .color2 a {
+ color: #ff1493 !important;
+}
+.syntaxhighlighter.printing .color3, .syntaxhighlighter.printing .color3 a {
+ color: red !important;
+}
+.syntaxhighlighter.printing .break, .syntaxhighlighter.printing .break a {
+ color: black !important;
+}
+
+.syntaxhighlighter {
+ background-color: #0a2b1d !important;
+}
+.syntaxhighlighter .line.alt1 {
+ background-color: #0a2b1d !important;
+}
+.syntaxhighlighter .line.alt2 {
+ background-color: #0a2b1d !important;
+}
+.syntaxhighlighter .line.highlighted.alt1, .syntaxhighlighter .line.highlighted.alt2 {
+ background-color: #233729 !important;
+}
+.syntaxhighlighter .line.highlighted.number {
+ color: white !important;
+}
+.syntaxhighlighter table caption {
+ color: #f8f8f8 !important;
+}
+.syntaxhighlighter .gutter {
+ color: #497958 !important;
+}
+.syntaxhighlighter .gutter .line {
+ border-right: 3px solid #41a83e !important;
+}
+.syntaxhighlighter .gutter .line.highlighted {
+ background-color: #41a83e !important;
+ color: #0a2b1d !important;
+}
+.syntaxhighlighter.printing .line .content {
+ border: none !important;
+}
+.syntaxhighlighter.collapsed {
+ overflow: visible !important;
+}
+.syntaxhighlighter.collapsed .toolbar {
+ color: #96dd3b !important;
+ background: black !important;
+ border: 1px solid #41a83e !important;
+}
+.syntaxhighlighter.collapsed .toolbar a {
+ color: #96dd3b !important;
+}
+.syntaxhighlighter.collapsed .toolbar a:hover {
+ color: white !important;
+}
+.syntaxhighlighter .toolbar {
+ color: white !important;
+ background: #41a83e !important;
+ border: none !important;
+}
+.syntaxhighlighter .toolbar a {
+ color: white !important;
+}
+.syntaxhighlighter .toolbar a:hover {
+ color: #ffe862 !important;
+}
+.syntaxhighlighter .plain, .syntaxhighlighter .plain a {
+ color: #f8f8f8 !important;
+}
+.syntaxhighlighter .comments, .syntaxhighlighter .comments a {
+ color: #336442 !important;
+}
+.syntaxhighlighter .string, .syntaxhighlighter .string a {
+ color: #9df39f !important;
+}
+.syntaxhighlighter .keyword {
+ color: #96dd3b !important;
+}
+.syntaxhighlighter .preprocessor {
+ color: #91bb9e !important;
+}
+.syntaxhighlighter .variable {
+ color: #ffaa3e !important;
+}
+.syntaxhighlighter .value {
+ color: #f7e741 !important;
+}
+.syntaxhighlighter .functions {
+ color: #ffaa3e !important;
+}
+.syntaxhighlighter .constants {
+ color: #e0e8ff !important;
+}
+.syntaxhighlighter .script {
+ font-weight: bold !important;
+ color: #96dd3b !important;
+ background-color: none !important;
+}
+.syntaxhighlighter .color1, .syntaxhighlighter .color1 a {
+ color: #eb939a !important;
+}
+.syntaxhighlighter .color2, .syntaxhighlighter .color2 a {
+ color: #91bb9e !important;
+}
+.syntaxhighlighter .color3, .syntaxhighlighter .color3 a {
+ color: #edef7d !important;
+}
+
+.syntaxhighlighter .comments {
+ font-style: italic !important;
+}
+.syntaxhighlighter .keyword {
+ font-weight: bold !important;
+}
diff --git a/upstream/clipper-6.4.2/Documentation/Scripts/SyntaxHighlighter/styles/shCoreEclipse.css b/upstream/clipper-6.4.2/Documentation/Scripts/SyntaxHighlighter/styles/shCoreEclipse.css
new file mode 100644
index 0000000..a45de9f
--- /dev/null
+++ b/upstream/clipper-6.4.2/Documentation/Scripts/SyntaxHighlighter/styles/shCoreEclipse.css
@@ -0,0 +1,339 @@
+/**
+ * SyntaxHighlighter
+ * http://alexgorbatchev.com/SyntaxHighlighter
+ *
+ * SyntaxHighlighter is donationware. If you are using it, please donate.
+ * http://alexgorbatchev.com/SyntaxHighlighter/donate.html
+ *
+ * @version
+ * 3.0.83 (July 02 2010)
+ *
+ * @copyright
+ * Copyright (C) 2004-2010 Alex Gorbatchev.
+ *
+ * @license
+ * Dual licensed under the MIT and GPL licenses.
+ */
+.syntaxhighlighter a,
+.syntaxhighlighter div,
+.syntaxhighlighter code,
+.syntaxhighlighter table,
+.syntaxhighlighter table td,
+.syntaxhighlighter table tr,
+.syntaxhighlighter table tbody,
+.syntaxhighlighter table thead,
+.syntaxhighlighter table caption,
+.syntaxhighlighter textarea {
+ -moz-border-radius: 0 0 0 0 !important;
+ -webkit-border-radius: 0 0 0 0 !important;
+ background: none !important;
+ border: 0 !important;
+ bottom: auto !important;
+ float: none !important;
+ height: auto !important;
+ left: auto !important;
+ line-height: 1.1em !important;
+ margin: 0 !important;
+ outline: 0 !important;
+ overflow: visible !important;
+ padding: 0 !important;
+ position: static !important;
+ right: auto !important;
+ text-align: left !important;
+ top: auto !important;
+ vertical-align: baseline !important;
+ width: auto !important;
+ box-sizing: content-box !important;
+ font-family: "Consolas", "Bitstream Vera Sans Mono", "Courier New", Courier, monospace !important;
+ font-weight: normal !important;
+ font-style: normal !important;
+ font-size: 1em !important;
+ min-height: inherit !important;
+ min-height: auto !important;
+}
+
+.syntaxhighlighter {
+ width: 100% !important;
+ margin: 1em 0 1em 0 !important;
+ position: relative !important;
+ overflow: auto !important;
+ font-size: 1em !important;
+}
+.syntaxhighlighter.source {
+ overflow: hidden !important;
+}
+.syntaxhighlighter .bold {
+ font-weight: bold !important;
+}
+.syntaxhighlighter .italic {
+ font-style: italic !important;
+}
+.syntaxhighlighter .line {
+ white-space: pre !important;
+}
+.syntaxhighlighter table {
+ width: 100% !important;
+}
+.syntaxhighlighter table caption {
+ text-align: left !important;
+ padding: .5em 0 0.5em 1em !important;
+}
+.syntaxhighlighter table td.code {
+ width: 100% !important;
+}
+.syntaxhighlighter table td.code .container {
+ position: relative !important;
+}
+.syntaxhighlighter table td.code .container textarea {
+ box-sizing: border-box !important;
+ position: absolute !important;
+ left: 0 !important;
+ top: 0 !important;
+ width: 100% !important;
+ height: 100% !important;
+ border: none !important;
+ background: white !important;
+ padding-left: 1em !important;
+ overflow: hidden !important;
+ white-space: pre !important;
+}
+.syntaxhighlighter table td.gutter .line {
+ text-align: right !important;
+ padding: 0 0.5em 0 1em !important;
+}
+.syntaxhighlighter table td.code .line {
+ padding: 0 1em !important;
+}
+.syntaxhighlighter.nogutter td.code .container textarea, .syntaxhighlighter.nogutter td.code .line {
+ padding-left: 0em !important;
+}
+.syntaxhighlighter.show {
+ display: block !important;
+}
+.syntaxhighlighter.collapsed table {
+ display: none !important;
+}
+.syntaxhighlighter.collapsed .toolbar {
+ padding: 0.1em 0.8em 0em 0.8em !important;
+ font-size: 1em !important;
+ position: static !important;
+ width: auto !important;
+ height: auto !important;
+}
+.syntaxhighlighter.collapsed .toolbar span {
+ display: inline !important;
+ margin-right: 1em !important;
+}
+.syntaxhighlighter.collapsed .toolbar span a {
+ padding: 0 !important;
+ display: none !important;
+}
+.syntaxhighlighter.collapsed .toolbar span a.expandSource {
+ display: inline !important;
+}
+.syntaxhighlighter .toolbar {
+ position: absolute !important;
+ right: 1px !important;
+ top: 1px !important;
+ width: 11px !important;
+ height: 11px !important;
+ font-size: 10px !important;
+ z-index: 10 !important;
+}
+.syntaxhighlighter .toolbar span.title {
+ display: inline !important;
+}
+.syntaxhighlighter .toolbar a {
+ display: block !important;
+ text-align: center !important;
+ text-decoration: none !important;
+ padding-top: 1px !important;
+}
+.syntaxhighlighter .toolbar a.expandSource {
+ display: none !important;
+}
+.syntaxhighlighter.ie {
+ font-size: .9em !important;
+ padding: 1px 0 1px 0 !important;
+}
+.syntaxhighlighter.ie .toolbar {
+ line-height: 8px !important;
+}
+.syntaxhighlighter.ie .toolbar a {
+ padding-top: 0px !important;
+}
+.syntaxhighlighter.printing .line.alt1 .content,
+.syntaxhighlighter.printing .line.alt2 .content,
+.syntaxhighlighter.printing .line.highlighted .number,
+.syntaxhighlighter.printing .line.highlighted.alt1 .content,
+.syntaxhighlighter.printing .line.highlighted.alt2 .content {
+ background: none !important;
+}
+.syntaxhighlighter.printing .line .number {
+ color: #bbbbbb !important;
+}
+.syntaxhighlighter.printing .line .content {
+ color: black !important;
+}
+.syntaxhighlighter.printing .toolbar {
+ display: none !important;
+}
+.syntaxhighlighter.printing a {
+ text-decoration: none !important;
+}
+.syntaxhighlighter.printing .plain, .syntaxhighlighter.printing .plain a {
+ color: black !important;
+}
+.syntaxhighlighter.printing .comments, .syntaxhighlighter.printing .comments a {
+ color: #008200 !important;
+}
+.syntaxhighlighter.printing .string, .syntaxhighlighter.printing .string a {
+ color: blue !important;
+}
+.syntaxhighlighter.printing .keyword {
+ color: #006699 !important;
+ font-weight: bold !important;
+}
+.syntaxhighlighter.printing .preprocessor {
+ color: gray !important;
+}
+.syntaxhighlighter.printing .variable {
+ color: #aa7700 !important;
+}
+.syntaxhighlighter.printing .value {
+ color: #009900 !important;
+}
+.syntaxhighlighter.printing .functions {
+ color: #ff1493 !important;
+}
+.syntaxhighlighter.printing .constants {
+ color: #0066cc !important;
+}
+.syntaxhighlighter.printing .script {
+ font-weight: bold !important;
+}
+.syntaxhighlighter.printing .color1, .syntaxhighlighter.printing .color1 a {
+ color: gray !important;
+}
+.syntaxhighlighter.printing .color2, .syntaxhighlighter.printing .color2 a {
+ color: #ff1493 !important;
+}
+.syntaxhighlighter.printing .color3, .syntaxhighlighter.printing .color3 a {
+ color: red !important;
+}
+.syntaxhighlighter.printing .break, .syntaxhighlighter.printing .break a {
+ color: black !important;
+}
+
+.syntaxhighlighter {
+ background-color: white !important;
+}
+.syntaxhighlighter .line.alt1 {
+ background-color: white !important;
+}
+.syntaxhighlighter .line.alt2 {
+ background-color: white !important;
+}
+.syntaxhighlighter .line.highlighted.alt1, .syntaxhighlighter .line.highlighted.alt2 {
+ background-color: #c3defe !important;
+}
+.syntaxhighlighter .line.highlighted.number {
+ color: white !important;
+}
+.syntaxhighlighter table caption {
+ color: black !important;
+}
+.syntaxhighlighter .gutter {
+ color: #787878 !important;
+}
+.syntaxhighlighter .gutter .line {
+ border-right: 3px solid #d4d0c8 !important;
+}
+.syntaxhighlighter .gutter .line.highlighted {
+ background-color: #d4d0c8 !important;
+ color: white !important;
+}
+.syntaxhighlighter.printing .line .content {
+ border: none !important;
+}
+.syntaxhighlighter.collapsed {
+ overflow: visible !important;
+}
+.syntaxhighlighter.collapsed .toolbar {
+ color: #3f5fbf !important;
+ background: white !important;
+ border: 1px solid #d4d0c8 !important;
+}
+.syntaxhighlighter.collapsed .toolbar a {
+ color: #3f5fbf !important;
+}
+.syntaxhighlighter.collapsed .toolbar a:hover {
+ color: #aa7700 !important;
+}
+.syntaxhighlighter .toolbar {
+ color: #a0a0a0 !important;
+ background: #d4d0c8 !important;
+ border: none !important;
+}
+.syntaxhighlighter .toolbar a {
+ color: #a0a0a0 !important;
+}
+.syntaxhighlighter .toolbar a:hover {
+ color: red !important;
+}
+.syntaxhighlighter .plain, .syntaxhighlighter .plain a {
+ color: black !important;
+}
+.syntaxhighlighter .comments, .syntaxhighlighter .comments a {
+ color: #3f5fbf !important;
+}
+.syntaxhighlighter .string, .syntaxhighlighter .string a {
+ color: #2a00ff !important;
+}
+.syntaxhighlighter .keyword {
+ color: #7f0055 !important;
+}
+.syntaxhighlighter .preprocessor {
+ color: #646464 !important;
+}
+.syntaxhighlighter .variable {
+ color: #aa7700 !important;
+}
+.syntaxhighlighter .value {
+ color: #009900 !important;
+}
+.syntaxhighlighter .functions {
+ color: #ff1493 !important;
+}
+.syntaxhighlighter .constants {
+ color: #0066cc !important;
+}
+.syntaxhighlighter .script {
+ font-weight: bold !important;
+ color: #7f0055 !important;
+ background-color: none !important;
+}
+.syntaxhighlighter .color1, .syntaxhighlighter .color1 a {
+ color: gray !important;
+}
+.syntaxhighlighter .color2, .syntaxhighlighter .color2 a {
+ color: #ff1493 !important;
+}
+.syntaxhighlighter .color3, .syntaxhighlighter .color3 a {
+ color: red !important;
+}
+
+.syntaxhighlighter .keyword {
+ font-weight: bold !important;
+}
+.syntaxhighlighter .xml .keyword {
+ color: #3f7f7f !important;
+ font-weight: normal !important;
+}
+.syntaxhighlighter .xml .color1, .syntaxhighlighter .xml .color1 a {
+ color: #7f007f !important;
+}
+.syntaxhighlighter .xml .string {
+ font-style: italic !important;
+ color: #2a00ff !important;
+}
diff --git a/upstream/clipper-6.4.2/Documentation/Scripts/SyntaxHighlighter/styles/shCoreEmacs.css b/upstream/clipper-6.4.2/Documentation/Scripts/SyntaxHighlighter/styles/shCoreEmacs.css
new file mode 100644
index 0000000..706c77a
--- /dev/null
+++ b/upstream/clipper-6.4.2/Documentation/Scripts/SyntaxHighlighter/styles/shCoreEmacs.css
@@ -0,0 +1,324 @@
+/**
+ * SyntaxHighlighter
+ * http://alexgorbatchev.com/SyntaxHighlighter
+ *
+ * SyntaxHighlighter is donationware. If you are using it, please donate.
+ * http://alexgorbatchev.com/SyntaxHighlighter/donate.html
+ *
+ * @version
+ * 3.0.83 (July 02 2010)
+ *
+ * @copyright
+ * Copyright (C) 2004-2010 Alex Gorbatchev.
+ *
+ * @license
+ * Dual licensed under the MIT and GPL licenses.
+ */
+.syntaxhighlighter a,
+.syntaxhighlighter div,
+.syntaxhighlighter code,
+.syntaxhighlighter table,
+.syntaxhighlighter table td,
+.syntaxhighlighter table tr,
+.syntaxhighlighter table tbody,
+.syntaxhighlighter table thead,
+.syntaxhighlighter table caption,
+.syntaxhighlighter textarea {
+ -moz-border-radius: 0 0 0 0 !important;
+ -webkit-border-radius: 0 0 0 0 !important;
+ background: none !important;
+ border: 0 !important;
+ bottom: auto !important;
+ float: none !important;
+ height: auto !important;
+ left: auto !important;
+ line-height: 1.1em !important;
+ margin: 0 !important;
+ outline: 0 !important;
+ overflow: visible !important;
+ padding: 0 !important;
+ position: static !important;
+ right: auto !important;
+ text-align: left !important;
+ top: auto !important;
+ vertical-align: baseline !important;
+ width: auto !important;
+ box-sizing: content-box !important;
+ font-family: "Consolas", "Bitstream Vera Sans Mono", "Courier New", Courier, monospace !important;
+ font-weight: normal !important;
+ font-style: normal !important;
+ font-size: 1em !important;
+ min-height: inherit !important;
+ min-height: auto !important;
+}
+
+.syntaxhighlighter {
+ width: 100% !important;
+ margin: 1em 0 1em 0 !important;
+ position: relative !important;
+ overflow: auto !important;
+ font-size: 1em !important;
+}
+.syntaxhighlighter.source {
+ overflow: hidden !important;
+}
+.syntaxhighlighter .bold {
+ font-weight: bold !important;
+}
+.syntaxhighlighter .italic {
+ font-style: italic !important;
+}
+.syntaxhighlighter .line {
+ white-space: pre !important;
+}
+.syntaxhighlighter table {
+ width: 100% !important;
+}
+.syntaxhighlighter table caption {
+ text-align: left !important;
+ padding: .5em 0 0.5em 1em !important;
+}
+.syntaxhighlighter table td.code {
+ width: 100% !important;
+}
+.syntaxhighlighter table td.code .container {
+ position: relative !important;
+}
+.syntaxhighlighter table td.code .container textarea {
+ box-sizing: border-box !important;
+ position: absolute !important;
+ left: 0 !important;
+ top: 0 !important;
+ width: 100% !important;
+ height: 100% !important;
+ border: none !important;
+ background: white !important;
+ padding-left: 1em !important;
+ overflow: hidden !important;
+ white-space: pre !important;
+}
+.syntaxhighlighter table td.gutter .line {
+ text-align: right !important;
+ padding: 0 0.5em 0 1em !important;
+}
+.syntaxhighlighter table td.code .line {
+ padding: 0 1em !important;
+}
+.syntaxhighlighter.nogutter td.code .container textarea, .syntaxhighlighter.nogutter td.code .line {
+ padding-left: 0em !important;
+}
+.syntaxhighlighter.show {
+ display: block !important;
+}
+.syntaxhighlighter.collapsed table {
+ display: none !important;
+}
+.syntaxhighlighter.collapsed .toolbar {
+ padding: 0.1em 0.8em 0em 0.8em !important;
+ font-size: 1em !important;
+ position: static !important;
+ width: auto !important;
+ height: auto !important;
+}
+.syntaxhighlighter.collapsed .toolbar span {
+ display: inline !important;
+ margin-right: 1em !important;
+}
+.syntaxhighlighter.collapsed .toolbar span a {
+ padding: 0 !important;
+ display: none !important;
+}
+.syntaxhighlighter.collapsed .toolbar span a.expandSource {
+ display: inline !important;
+}
+.syntaxhighlighter .toolbar {
+ position: absolute !important;
+ right: 1px !important;
+ top: 1px !important;
+ width: 11px !important;
+ height: 11px !important;
+ font-size: 10px !important;
+ z-index: 10 !important;
+}
+.syntaxhighlighter .toolbar span.title {
+ display: inline !important;
+}
+.syntaxhighlighter .toolbar a {
+ display: block !important;
+ text-align: center !important;
+ text-decoration: none !important;
+ padding-top: 1px !important;
+}
+.syntaxhighlighter .toolbar a.expandSource {
+ display: none !important;
+}
+.syntaxhighlighter.ie {
+ font-size: .9em !important;
+ padding: 1px 0 1px 0 !important;
+}
+.syntaxhighlighter.ie .toolbar {
+ line-height: 8px !important;
+}
+.syntaxhighlighter.ie .toolbar a {
+ padding-top: 0px !important;
+}
+.syntaxhighlighter.printing .line.alt1 .content,
+.syntaxhighlighter.printing .line.alt2 .content,
+.syntaxhighlighter.printing .line.highlighted .number,
+.syntaxhighlighter.printing .line.highlighted.alt1 .content,
+.syntaxhighlighter.printing .line.highlighted.alt2 .content {
+ background: none !important;
+}
+.syntaxhighlighter.printing .line .number {
+ color: #bbbbbb !important;
+}
+.syntaxhighlighter.printing .line .content {
+ color: black !important;
+}
+.syntaxhighlighter.printing .toolbar {
+ display: none !important;
+}
+.syntaxhighlighter.printing a {
+ text-decoration: none !important;
+}
+.syntaxhighlighter.printing .plain, .syntaxhighlighter.printing .plain a {
+ color: black !important;
+}
+.syntaxhighlighter.printing .comments, .syntaxhighlighter.printing .comments a {
+ color: #008200 !important;
+}
+.syntaxhighlighter.printing .string, .syntaxhighlighter.printing .string a {
+ color: blue !important;
+}
+.syntaxhighlighter.printing .keyword {
+ color: #006699 !important;
+ font-weight: bold !important;
+}
+.syntaxhighlighter.printing .preprocessor {
+ color: gray !important;
+}
+.syntaxhighlighter.printing .variable {
+ color: #aa7700 !important;
+}
+.syntaxhighlighter.printing .value {
+ color: #009900 !important;
+}
+.syntaxhighlighter.printing .functions {
+ color: #ff1493 !important;
+}
+.syntaxhighlighter.printing .constants {
+ color: #0066cc !important;
+}
+.syntaxhighlighter.printing .script {
+ font-weight: bold !important;
+}
+.syntaxhighlighter.printing .color1, .syntaxhighlighter.printing .color1 a {
+ color: gray !important;
+}
+.syntaxhighlighter.printing .color2, .syntaxhighlighter.printing .color2 a {
+ color: #ff1493 !important;
+}
+.syntaxhighlighter.printing .color3, .syntaxhighlighter.printing .color3 a {
+ color: red !important;
+}
+.syntaxhighlighter.printing .break, .syntaxhighlighter.printing .break a {
+ color: black !important;
+}
+
+.syntaxhighlighter {
+ background-color: black !important;
+}
+.syntaxhighlighter .line.alt1 {
+ background-color: black !important;
+}
+.syntaxhighlighter .line.alt2 {
+ background-color: black !important;
+}
+.syntaxhighlighter .line.highlighted.alt1, .syntaxhighlighter .line.highlighted.alt2 {
+ background-color: #2a3133 !important;
+}
+.syntaxhighlighter .line.highlighted.number {
+ color: white !important;
+}
+.syntaxhighlighter table caption {
+ color: #d3d3d3 !important;
+}
+.syntaxhighlighter .gutter {
+ color: #d3d3d3 !important;
+}
+.syntaxhighlighter .gutter .line {
+ border-right: 3px solid #990000 !important;
+}
+.syntaxhighlighter .gutter .line.highlighted {
+ background-color: #990000 !important;
+ color: black !important;
+}
+.syntaxhighlighter.printing .line .content {
+ border: none !important;
+}
+.syntaxhighlighter.collapsed {
+ overflow: visible !important;
+}
+.syntaxhighlighter.collapsed .toolbar {
+ color: #ebdb8d !important;
+ background: black !important;
+ border: 1px solid #990000 !important;
+}
+.syntaxhighlighter.collapsed .toolbar a {
+ color: #ebdb8d !important;
+}
+.syntaxhighlighter.collapsed .toolbar a:hover {
+ color: #ff7d27 !important;
+}
+.syntaxhighlighter .toolbar {
+ color: white !important;
+ background: #990000 !important;
+ border: none !important;
+}
+.syntaxhighlighter .toolbar a {
+ color: white !important;
+}
+.syntaxhighlighter .toolbar a:hover {
+ color: #9ccff4 !important;
+}
+.syntaxhighlighter .plain, .syntaxhighlighter .plain a {
+ color: #d3d3d3 !important;
+}
+.syntaxhighlighter .comments, .syntaxhighlighter .comments a {
+ color: #ff7d27 !important;
+}
+.syntaxhighlighter .string, .syntaxhighlighter .string a {
+ color: #ff9e7b !important;
+}
+.syntaxhighlighter .keyword {
+ color: aqua !important;
+}
+.syntaxhighlighter .preprocessor {
+ color: #aec4de !important;
+}
+.syntaxhighlighter .variable {
+ color: #ffaa3e !important;
+}
+.syntaxhighlighter .value {
+ color: #009900 !important;
+}
+.syntaxhighlighter .functions {
+ color: #81cef9 !important;
+}
+.syntaxhighlighter .constants {
+ color: #ff9e7b !important;
+}
+.syntaxhighlighter .script {
+ font-weight: bold !important;
+ color: aqua !important;
+ background-color: none !important;
+}
+.syntaxhighlighter .color1, .syntaxhighlighter .color1 a {
+ color: #ebdb8d !important;
+}
+.syntaxhighlighter .color2, .syntaxhighlighter .color2 a {
+ color: #ff7d27 !important;
+}
+.syntaxhighlighter .color3, .syntaxhighlighter .color3 a {
+ color: #aec4de !important;
+}
diff --git a/upstream/clipper-6.4.2/Documentation/Scripts/SyntaxHighlighter/styles/shCoreFadeToGrey.css b/upstream/clipper-6.4.2/Documentation/Scripts/SyntaxHighlighter/styles/shCoreFadeToGrey.css
new file mode 100644
index 0000000..6101eba
--- /dev/null
+++ b/upstream/clipper-6.4.2/Documentation/Scripts/SyntaxHighlighter/styles/shCoreFadeToGrey.css
@@ -0,0 +1,328 @@
+/**
+ * SyntaxHighlighter
+ * http://alexgorbatchev.com/SyntaxHighlighter
+ *
+ * SyntaxHighlighter is donationware. If you are using it, please donate.
+ * http://alexgorbatchev.com/SyntaxHighlighter/donate.html
+ *
+ * @version
+ * 3.0.83 (July 02 2010)
+ *
+ * @copyright
+ * Copyright (C) 2004-2010 Alex Gorbatchev.
+ *
+ * @license
+ * Dual licensed under the MIT and GPL licenses.
+ */
+.syntaxhighlighter a,
+.syntaxhighlighter div,
+.syntaxhighlighter code,
+.syntaxhighlighter table,
+.syntaxhighlighter table td,
+.syntaxhighlighter table tr,
+.syntaxhighlighter table tbody,
+.syntaxhighlighter table thead,
+.syntaxhighlighter table caption,
+.syntaxhighlighter textarea {
+ -moz-border-radius: 0 0 0 0 !important;
+ -webkit-border-radius: 0 0 0 0 !important;
+ background: none !important;
+ border: 0 !important;
+ bottom: auto !important;
+ float: none !important;
+ height: auto !important;
+ left: auto !important;
+ line-height: 1.1em !important;
+ margin: 0 !important;
+ outline: 0 !important;
+ overflow: visible !important;
+ padding: 0 !important;
+ position: static !important;
+ right: auto !important;
+ text-align: left !important;
+ top: auto !important;
+ vertical-align: baseline !important;
+ width: auto !important;
+ box-sizing: content-box !important;
+ font-family: "Consolas", "Bitstream Vera Sans Mono", "Courier New", Courier, monospace !important;
+ font-weight: normal !important;
+ font-style: normal !important;
+ font-size: 1em !important;
+ min-height: inherit !important;
+ min-height: auto !important;
+}
+
+.syntaxhighlighter {
+ width: 100% !important;
+ margin: 1em 0 1em 0 !important;
+ position: relative !important;
+ overflow: auto !important;
+ font-size: 1em !important;
+}
+.syntaxhighlighter.source {
+ overflow: hidden !important;
+}
+.syntaxhighlighter .bold {
+ font-weight: bold !important;
+}
+.syntaxhighlighter .italic {
+ font-style: italic !important;
+}
+.syntaxhighlighter .line {
+ white-space: pre !important;
+}
+.syntaxhighlighter table {
+ width: 100% !important;
+}
+.syntaxhighlighter table caption {
+ text-align: left !important;
+ padding: .5em 0 0.5em 1em !important;
+}
+.syntaxhighlighter table td.code {
+ width: 100% !important;
+}
+.syntaxhighlighter table td.code .container {
+ position: relative !important;
+}
+.syntaxhighlighter table td.code .container textarea {
+ box-sizing: border-box !important;
+ position: absolute !important;
+ left: 0 !important;
+ top: 0 !important;
+ width: 100% !important;
+ height: 100% !important;
+ border: none !important;
+ background: white !important;
+ padding-left: 1em !important;
+ overflow: hidden !important;
+ white-space: pre !important;
+}
+.syntaxhighlighter table td.gutter .line {
+ text-align: right !important;
+ padding: 0 0.5em 0 1em !important;
+}
+.syntaxhighlighter table td.code .line {
+ padding: 0 1em !important;
+}
+.syntaxhighlighter.nogutter td.code .container textarea, .syntaxhighlighter.nogutter td.code .line {
+ padding-left: 0em !important;
+}
+.syntaxhighlighter.show {
+ display: block !important;
+}
+.syntaxhighlighter.collapsed table {
+ display: none !important;
+}
+.syntaxhighlighter.collapsed .toolbar {
+ padding: 0.1em 0.8em 0em 0.8em !important;
+ font-size: 1em !important;
+ position: static !important;
+ width: auto !important;
+ height: auto !important;
+}
+.syntaxhighlighter.collapsed .toolbar span {
+ display: inline !important;
+ margin-right: 1em !important;
+}
+.syntaxhighlighter.collapsed .toolbar span a {
+ padding: 0 !important;
+ display: none !important;
+}
+.syntaxhighlighter.collapsed .toolbar span a.expandSource {
+ display: inline !important;
+}
+.syntaxhighlighter .toolbar {
+ position: absolute !important;
+ right: 1px !important;
+ top: 1px !important;
+ width: 11px !important;
+ height: 11px !important;
+ font-size: 10px !important;
+ z-index: 10 !important;
+}
+.syntaxhighlighter .toolbar span.title {
+ display: inline !important;
+}
+.syntaxhighlighter .toolbar a {
+ display: block !important;
+ text-align: center !important;
+ text-decoration: none !important;
+ padding-top: 1px !important;
+}
+.syntaxhighlighter .toolbar a.expandSource {
+ display: none !important;
+}
+.syntaxhighlighter.ie {
+ font-size: .9em !important;
+ padding: 1px 0 1px 0 !important;
+}
+.syntaxhighlighter.ie .toolbar {
+ line-height: 8px !important;
+}
+.syntaxhighlighter.ie .toolbar a {
+ padding-top: 0px !important;
+}
+.syntaxhighlighter.printing .line.alt1 .content,
+.syntaxhighlighter.printing .line.alt2 .content,
+.syntaxhighlighter.printing .line.highlighted .number,
+.syntaxhighlighter.printing .line.highlighted.alt1 .content,
+.syntaxhighlighter.printing .line.highlighted.alt2 .content {
+ background: none !important;
+}
+.syntaxhighlighter.printing .line .number {
+ color: #bbbbbb !important;
+}
+.syntaxhighlighter.printing .line .content {
+ color: black !important;
+}
+.syntaxhighlighter.printing .toolbar {
+ display: none !important;
+}
+.syntaxhighlighter.printing a {
+ text-decoration: none !important;
+}
+.syntaxhighlighter.printing .plain, .syntaxhighlighter.printing .plain a {
+ color: black !important;
+}
+.syntaxhighlighter.printing .comments, .syntaxhighlighter.printing .comments a {
+ color: #008200 !important;
+}
+.syntaxhighlighter.printing .string, .syntaxhighlighter.printing .string a {
+ color: blue !important;
+}
+.syntaxhighlighter.printing .keyword {
+ color: #006699 !important;
+ font-weight: bold !important;
+}
+.syntaxhighlighter.printing .preprocessor {
+ color: gray !important;
+}
+.syntaxhighlighter.printing .variable {
+ color: #aa7700 !important;
+}
+.syntaxhighlighter.printing .value {
+ color: #009900 !important;
+}
+.syntaxhighlighter.printing .functions {
+ color: #ff1493 !important;
+}
+.syntaxhighlighter.printing .constants {
+ color: #0066cc !important;
+}
+.syntaxhighlighter.printing .script {
+ font-weight: bold !important;
+}
+.syntaxhighlighter.printing .color1, .syntaxhighlighter.printing .color1 a {
+ color: gray !important;
+}
+.syntaxhighlighter.printing .color2, .syntaxhighlighter.printing .color2 a {
+ color: #ff1493 !important;
+}
+.syntaxhighlighter.printing .color3, .syntaxhighlighter.printing .color3 a {
+ color: red !important;
+}
+.syntaxhighlighter.printing .break, .syntaxhighlighter.printing .break a {
+ color: black !important;
+}
+
+.syntaxhighlighter {
+ background-color: #121212 !important;
+}
+.syntaxhighlighter .line.alt1 {
+ background-color: #121212 !important;
+}
+.syntaxhighlighter .line.alt2 {
+ background-color: #121212 !important;
+}
+.syntaxhighlighter .line.highlighted.alt1, .syntaxhighlighter .line.highlighted.alt2 {
+ background-color: #2c2c29 !important;
+}
+.syntaxhighlighter .line.highlighted.number {
+ color: white !important;
+}
+.syntaxhighlighter table caption {
+ color: white !important;
+}
+.syntaxhighlighter .gutter {
+ color: #afafaf !important;
+}
+.syntaxhighlighter .gutter .line {
+ border-right: 3px solid #3185b9 !important;
+}
+.syntaxhighlighter .gutter .line.highlighted {
+ background-color: #3185b9 !important;
+ color: #121212 !important;
+}
+.syntaxhighlighter.printing .line .content {
+ border: none !important;
+}
+.syntaxhighlighter.collapsed {
+ overflow: visible !important;
+}
+.syntaxhighlighter.collapsed .toolbar {
+ color: #3185b9 !important;
+ background: black !important;
+ border: 1px solid #3185b9 !important;
+}
+.syntaxhighlighter.collapsed .toolbar a {
+ color: #3185b9 !important;
+}
+.syntaxhighlighter.collapsed .toolbar a:hover {
+ color: #d01d33 !important;
+}
+.syntaxhighlighter .toolbar {
+ color: white !important;
+ background: #3185b9 !important;
+ border: none !important;
+}
+.syntaxhighlighter .toolbar a {
+ color: white !important;
+}
+.syntaxhighlighter .toolbar a:hover {
+ color: #96daff !important;
+}
+.syntaxhighlighter .plain, .syntaxhighlighter .plain a {
+ color: white !important;
+}
+.syntaxhighlighter .comments, .syntaxhighlighter .comments a {
+ color: #696854 !important;
+}
+.syntaxhighlighter .string, .syntaxhighlighter .string a {
+ color: #e3e658 !important;
+}
+.syntaxhighlighter .keyword {
+ color: #d01d33 !important;
+}
+.syntaxhighlighter .preprocessor {
+ color: #435a5f !important;
+}
+.syntaxhighlighter .variable {
+ color: #898989 !important;
+}
+.syntaxhighlighter .value {
+ color: #009900 !important;
+}
+.syntaxhighlighter .functions {
+ color: #aaaaaa !important;
+}
+.syntaxhighlighter .constants {
+ color: #96daff !important;
+}
+.syntaxhighlighter .script {
+ font-weight: bold !important;
+ color: #d01d33 !important;
+ background-color: none !important;
+}
+.syntaxhighlighter .color1, .syntaxhighlighter .color1 a {
+ color: #ffc074 !important;
+}
+.syntaxhighlighter .color2, .syntaxhighlighter .color2 a {
+ color: #4a8cdb !important;
+}
+.syntaxhighlighter .color3, .syntaxhighlighter .color3 a {
+ color: #96daff !important;
+}
+
+.syntaxhighlighter .functions {
+ font-weight: bold !important;
+}
diff --git a/upstream/clipper-6.4.2/Documentation/Scripts/SyntaxHighlighter/styles/shCoreMDUltra.css b/upstream/clipper-6.4.2/Documentation/Scripts/SyntaxHighlighter/styles/shCoreMDUltra.css
new file mode 100644
index 0000000..2923ce7
--- /dev/null
+++ b/upstream/clipper-6.4.2/Documentation/Scripts/SyntaxHighlighter/styles/shCoreMDUltra.css
@@ -0,0 +1,324 @@
+/**
+ * SyntaxHighlighter
+ * http://alexgorbatchev.com/SyntaxHighlighter
+ *
+ * SyntaxHighlighter is donationware. If you are using it, please donate.
+ * http://alexgorbatchev.com/SyntaxHighlighter/donate.html
+ *
+ * @version
+ * 3.0.83 (July 02 2010)
+ *
+ * @copyright
+ * Copyright (C) 2004-2010 Alex Gorbatchev.
+ *
+ * @license
+ * Dual licensed under the MIT and GPL licenses.
+ */
+.syntaxhighlighter a,
+.syntaxhighlighter div,
+.syntaxhighlighter code,
+.syntaxhighlighter table,
+.syntaxhighlighter table td,
+.syntaxhighlighter table tr,
+.syntaxhighlighter table tbody,
+.syntaxhighlighter table thead,
+.syntaxhighlighter table caption,
+.syntaxhighlighter textarea {
+ -moz-border-radius: 0 0 0 0 !important;
+ -webkit-border-radius: 0 0 0 0 !important;
+ background: none !important;
+ border: 0 !important;
+ bottom: auto !important;
+ float: none !important;
+ height: auto !important;
+ left: auto !important;
+ line-height: 1.1em !important;
+ margin: 0 !important;
+ outline: 0 !important;
+ overflow: visible !important;
+ padding: 0 !important;
+ position: static !important;
+ right: auto !important;
+ text-align: left !important;
+ top: auto !important;
+ vertical-align: baseline !important;
+ width: auto !important;
+ box-sizing: content-box !important;
+ font-family: "Consolas", "Bitstream Vera Sans Mono", "Courier New", Courier, monospace !important;
+ font-weight: normal !important;
+ font-style: normal !important;
+ font-size: 1em !important;
+ min-height: inherit !important;
+ min-height: auto !important;
+}
+
+.syntaxhighlighter {
+ width: 100% !important;
+ margin: 1em 0 1em 0 !important;
+ position: relative !important;
+ overflow: auto !important;
+ font-size: 1em !important;
+}
+.syntaxhighlighter.source {
+ overflow: hidden !important;
+}
+.syntaxhighlighter .bold {
+ font-weight: bold !important;
+}
+.syntaxhighlighter .italic {
+ font-style: italic !important;
+}
+.syntaxhighlighter .line {
+ white-space: pre !important;
+}
+.syntaxhighlighter table {
+ width: 100% !important;
+}
+.syntaxhighlighter table caption {
+ text-align: left !important;
+ padding: .5em 0 0.5em 1em !important;
+}
+.syntaxhighlighter table td.code {
+ width: 100% !important;
+}
+.syntaxhighlighter table td.code .container {
+ position: relative !important;
+}
+.syntaxhighlighter table td.code .container textarea {
+ box-sizing: border-box !important;
+ position: absolute !important;
+ left: 0 !important;
+ top: 0 !important;
+ width: 100% !important;
+ height: 100% !important;
+ border: none !important;
+ background: white !important;
+ padding-left: 1em !important;
+ overflow: hidden !important;
+ white-space: pre !important;
+}
+.syntaxhighlighter table td.gutter .line {
+ text-align: right !important;
+ padding: 0 0.5em 0 1em !important;
+}
+.syntaxhighlighter table td.code .line {
+ padding: 0 1em !important;
+}
+.syntaxhighlighter.nogutter td.code .container textarea, .syntaxhighlighter.nogutter td.code .line {
+ padding-left: 0em !important;
+}
+.syntaxhighlighter.show {
+ display: block !important;
+}
+.syntaxhighlighter.collapsed table {
+ display: none !important;
+}
+.syntaxhighlighter.collapsed .toolbar {
+ padding: 0.1em 0.8em 0em 0.8em !important;
+ font-size: 1em !important;
+ position: static !important;
+ width: auto !important;
+ height: auto !important;
+}
+.syntaxhighlighter.collapsed .toolbar span {
+ display: inline !important;
+ margin-right: 1em !important;
+}
+.syntaxhighlighter.collapsed .toolbar span a {
+ padding: 0 !important;
+ display: none !important;
+}
+.syntaxhighlighter.collapsed .toolbar span a.expandSource {
+ display: inline !important;
+}
+.syntaxhighlighter .toolbar {
+ position: absolute !important;
+ right: 1px !important;
+ top: 1px !important;
+ width: 11px !important;
+ height: 11px !important;
+ font-size: 10px !important;
+ z-index: 10 !important;
+}
+.syntaxhighlighter .toolbar span.title {
+ display: inline !important;
+}
+.syntaxhighlighter .toolbar a {
+ display: block !important;
+ text-align: center !important;
+ text-decoration: none !important;
+ padding-top: 1px !important;
+}
+.syntaxhighlighter .toolbar a.expandSource {
+ display: none !important;
+}
+.syntaxhighlighter.ie {
+ font-size: .9em !important;
+ padding: 1px 0 1px 0 !important;
+}
+.syntaxhighlighter.ie .toolbar {
+ line-height: 8px !important;
+}
+.syntaxhighlighter.ie .toolbar a {
+ padding-top: 0px !important;
+}
+.syntaxhighlighter.printing .line.alt1 .content,
+.syntaxhighlighter.printing .line.alt2 .content,
+.syntaxhighlighter.printing .line.highlighted .number,
+.syntaxhighlighter.printing .line.highlighted.alt1 .content,
+.syntaxhighlighter.printing .line.highlighted.alt2 .content {
+ background: none !important;
+}
+.syntaxhighlighter.printing .line .number {
+ color: #bbbbbb !important;
+}
+.syntaxhighlighter.printing .line .content {
+ color: black !important;
+}
+.syntaxhighlighter.printing .toolbar {
+ display: none !important;
+}
+.syntaxhighlighter.printing a {
+ text-decoration: none !important;
+}
+.syntaxhighlighter.printing .plain, .syntaxhighlighter.printing .plain a {
+ color: black !important;
+}
+.syntaxhighlighter.printing .comments, .syntaxhighlighter.printing .comments a {
+ color: #008200 !important;
+}
+.syntaxhighlighter.printing .string, .syntaxhighlighter.printing .string a {
+ color: blue !important;
+}
+.syntaxhighlighter.printing .keyword {
+ color: #006699 !important;
+ font-weight: bold !important;
+}
+.syntaxhighlighter.printing .preprocessor {
+ color: gray !important;
+}
+.syntaxhighlighter.printing .variable {
+ color: #aa7700 !important;
+}
+.syntaxhighlighter.printing .value {
+ color: #009900 !important;
+}
+.syntaxhighlighter.printing .functions {
+ color: #ff1493 !important;
+}
+.syntaxhighlighter.printing .constants {
+ color: #0066cc !important;
+}
+.syntaxhighlighter.printing .script {
+ font-weight: bold !important;
+}
+.syntaxhighlighter.printing .color1, .syntaxhighlighter.printing .color1 a {
+ color: gray !important;
+}
+.syntaxhighlighter.printing .color2, .syntaxhighlighter.printing .color2 a {
+ color: #ff1493 !important;
+}
+.syntaxhighlighter.printing .color3, .syntaxhighlighter.printing .color3 a {
+ color: red !important;
+}
+.syntaxhighlighter.printing .break, .syntaxhighlighter.printing .break a {
+ color: black !important;
+}
+
+.syntaxhighlighter {
+ background-color: #222222 !important;
+}
+.syntaxhighlighter .line.alt1 {
+ background-color: #222222 !important;
+}
+.syntaxhighlighter .line.alt2 {
+ background-color: #222222 !important;
+}
+.syntaxhighlighter .line.highlighted.alt1, .syntaxhighlighter .line.highlighted.alt2 {
+ background-color: #253e5a !important;
+}
+.syntaxhighlighter .line.highlighted.number {
+ color: white !important;
+}
+.syntaxhighlighter table caption {
+ color: lime !important;
+}
+.syntaxhighlighter .gutter {
+ color: #38566f !important;
+}
+.syntaxhighlighter .gutter .line {
+ border-right: 3px solid #435a5f !important;
+}
+.syntaxhighlighter .gutter .line.highlighted {
+ background-color: #435a5f !important;
+ color: #222222 !important;
+}
+.syntaxhighlighter.printing .line .content {
+ border: none !important;
+}
+.syntaxhighlighter.collapsed {
+ overflow: visible !important;
+}
+.syntaxhighlighter.collapsed .toolbar {
+ color: #428bdd !important;
+ background: black !important;
+ border: 1px solid #435a5f !important;
+}
+.syntaxhighlighter.collapsed .toolbar a {
+ color: #428bdd !important;
+}
+.syntaxhighlighter.collapsed .toolbar a:hover {
+ color: lime !important;
+}
+.syntaxhighlighter .toolbar {
+ color: #aaaaff !important;
+ background: #435a5f !important;
+ border: none !important;
+}
+.syntaxhighlighter .toolbar a {
+ color: #aaaaff !important;
+}
+.syntaxhighlighter .toolbar a:hover {
+ color: #9ccff4 !important;
+}
+.syntaxhighlighter .plain, .syntaxhighlighter .plain a {
+ color: lime !important;
+}
+.syntaxhighlighter .comments, .syntaxhighlighter .comments a {
+ color: #428bdd !important;
+}
+.syntaxhighlighter .string, .syntaxhighlighter .string a {
+ color: lime !important;
+}
+.syntaxhighlighter .keyword {
+ color: #aaaaff !important;
+}
+.syntaxhighlighter .preprocessor {
+ color: #8aa6c1 !important;
+}
+.syntaxhighlighter .variable {
+ color: aqua !important;
+}
+.syntaxhighlighter .value {
+ color: #f7e741 !important;
+}
+.syntaxhighlighter .functions {
+ color: #ff8000 !important;
+}
+.syntaxhighlighter .constants {
+ color: yellow !important;
+}
+.syntaxhighlighter .script {
+ font-weight: bold !important;
+ color: #aaaaff !important;
+ background-color: none !important;
+}
+.syntaxhighlighter .color1, .syntaxhighlighter .color1 a {
+ color: red !important;
+}
+.syntaxhighlighter .color2, .syntaxhighlighter .color2 a {
+ color: yellow !important;
+}
+.syntaxhighlighter .color3, .syntaxhighlighter .color3 a {
+ color: #ffaa3e !important;
+}
diff --git a/upstream/clipper-6.4.2/Documentation/Scripts/SyntaxHighlighter/styles/shCoreMidnight.css b/upstream/clipper-6.4.2/Documentation/Scripts/SyntaxHighlighter/styles/shCoreMidnight.css
new file mode 100644
index 0000000..e3733ee
--- /dev/null
+++ b/upstream/clipper-6.4.2/Documentation/Scripts/SyntaxHighlighter/styles/shCoreMidnight.css
@@ -0,0 +1,324 @@
+/**
+ * SyntaxHighlighter
+ * http://alexgorbatchev.com/SyntaxHighlighter
+ *
+ * SyntaxHighlighter is donationware. If you are using it, please donate.
+ * http://alexgorbatchev.com/SyntaxHighlighter/donate.html
+ *
+ * @version
+ * 3.0.83 (July 02 2010)
+ *
+ * @copyright
+ * Copyright (C) 2004-2010 Alex Gorbatchev.
+ *
+ * @license
+ * Dual licensed under the MIT and GPL licenses.
+ */
+.syntaxhighlighter a,
+.syntaxhighlighter div,
+.syntaxhighlighter code,
+.syntaxhighlighter table,
+.syntaxhighlighter table td,
+.syntaxhighlighter table tr,
+.syntaxhighlighter table tbody,
+.syntaxhighlighter table thead,
+.syntaxhighlighter table caption,
+.syntaxhighlighter textarea {
+ -moz-border-radius: 0 0 0 0 !important;
+ -webkit-border-radius: 0 0 0 0 !important;
+ background: none !important;
+ border: 0 !important;
+ bottom: auto !important;
+ float: none !important;
+ height: auto !important;
+ left: auto !important;
+ line-height: 1.1em !important;
+ margin: 0 !important;
+ outline: 0 !important;
+ overflow: visible !important;
+ padding: 0 !important;
+ position: static !important;
+ right: auto !important;
+ text-align: left !important;
+ top: auto !important;
+ vertical-align: baseline !important;
+ width: auto !important;
+ box-sizing: content-box !important;
+ font-family: "Consolas", "Bitstream Vera Sans Mono", "Courier New", Courier, monospace !important;
+ font-weight: normal !important;
+ font-style: normal !important;
+ font-size: 1em !important;
+ min-height: inherit !important;
+ min-height: auto !important;
+}
+
+.syntaxhighlighter {
+ width: 100% !important;
+ margin: 1em 0 1em 0 !important;
+ position: relative !important;
+ overflow: auto !important;
+ font-size: 1em !important;
+}
+.syntaxhighlighter.source {
+ overflow: hidden !important;
+}
+.syntaxhighlighter .bold {
+ font-weight: bold !important;
+}
+.syntaxhighlighter .italic {
+ font-style: italic !important;
+}
+.syntaxhighlighter .line {
+ white-space: pre !important;
+}
+.syntaxhighlighter table {
+ width: 100% !important;
+}
+.syntaxhighlighter table caption {
+ text-align: left !important;
+ padding: .5em 0 0.5em 1em !important;
+}
+.syntaxhighlighter table td.code {
+ width: 100% !important;
+}
+.syntaxhighlighter table td.code .container {
+ position: relative !important;
+}
+.syntaxhighlighter table td.code .container textarea {
+ box-sizing: border-box !important;
+ position: absolute !important;
+ left: 0 !important;
+ top: 0 !important;
+ width: 100% !important;
+ height: 100% !important;
+ border: none !important;
+ background: white !important;
+ padding-left: 1em !important;
+ overflow: hidden !important;
+ white-space: pre !important;
+}
+.syntaxhighlighter table td.gutter .line {
+ text-align: right !important;
+ padding: 0 0.5em 0 1em !important;
+}
+.syntaxhighlighter table td.code .line {
+ padding: 0 1em !important;
+}
+.syntaxhighlighter.nogutter td.code .container textarea, .syntaxhighlighter.nogutter td.code .line {
+ padding-left: 0em !important;
+}
+.syntaxhighlighter.show {
+ display: block !important;
+}
+.syntaxhighlighter.collapsed table {
+ display: none !important;
+}
+.syntaxhighlighter.collapsed .toolbar {
+ padding: 0.1em 0.8em 0em 0.8em !important;
+ font-size: 1em !important;
+ position: static !important;
+ width: auto !important;
+ height: auto !important;
+}
+.syntaxhighlighter.collapsed .toolbar span {
+ display: inline !important;
+ margin-right: 1em !important;
+}
+.syntaxhighlighter.collapsed .toolbar span a {
+ padding: 0 !important;
+ display: none !important;
+}
+.syntaxhighlighter.collapsed .toolbar span a.expandSource {
+ display: inline !important;
+}
+.syntaxhighlighter .toolbar {
+ position: absolute !important;
+ right: 1px !important;
+ top: 1px !important;
+ width: 11px !important;
+ height: 11px !important;
+ font-size: 10px !important;
+ z-index: 10 !important;
+}
+.syntaxhighlighter .toolbar span.title {
+ display: inline !important;
+}
+.syntaxhighlighter .toolbar a {
+ display: block !important;
+ text-align: center !important;
+ text-decoration: none !important;
+ padding-top: 1px !important;
+}
+.syntaxhighlighter .toolbar a.expandSource {
+ display: none !important;
+}
+.syntaxhighlighter.ie {
+ font-size: .9em !important;
+ padding: 1px 0 1px 0 !important;
+}
+.syntaxhighlighter.ie .toolbar {
+ line-height: 8px !important;
+}
+.syntaxhighlighter.ie .toolbar a {
+ padding-top: 0px !important;
+}
+.syntaxhighlighter.printing .line.alt1 .content,
+.syntaxhighlighter.printing .line.alt2 .content,
+.syntaxhighlighter.printing .line.highlighted .number,
+.syntaxhighlighter.printing .line.highlighted.alt1 .content,
+.syntaxhighlighter.printing .line.highlighted.alt2 .content {
+ background: none !important;
+}
+.syntaxhighlighter.printing .line .number {
+ color: #bbbbbb !important;
+}
+.syntaxhighlighter.printing .line .content {
+ color: black !important;
+}
+.syntaxhighlighter.printing .toolbar {
+ display: none !important;
+}
+.syntaxhighlighter.printing a {
+ text-decoration: none !important;
+}
+.syntaxhighlighter.printing .plain, .syntaxhighlighter.printing .plain a {
+ color: black !important;
+}
+.syntaxhighlighter.printing .comments, .syntaxhighlighter.printing .comments a {
+ color: #008200 !important;
+}
+.syntaxhighlighter.printing .string, .syntaxhighlighter.printing .string a {
+ color: blue !important;
+}
+.syntaxhighlighter.printing .keyword {
+ color: #006699 !important;
+ font-weight: bold !important;
+}
+.syntaxhighlighter.printing .preprocessor {
+ color: gray !important;
+}
+.syntaxhighlighter.printing .variable {
+ color: #aa7700 !important;
+}
+.syntaxhighlighter.printing .value {
+ color: #009900 !important;
+}
+.syntaxhighlighter.printing .functions {
+ color: #ff1493 !important;
+}
+.syntaxhighlighter.printing .constants {
+ color: #0066cc !important;
+}
+.syntaxhighlighter.printing .script {
+ font-weight: bold !important;
+}
+.syntaxhighlighter.printing .color1, .syntaxhighlighter.printing .color1 a {
+ color: gray !important;
+}
+.syntaxhighlighter.printing .color2, .syntaxhighlighter.printing .color2 a {
+ color: #ff1493 !important;
+}
+.syntaxhighlighter.printing .color3, .syntaxhighlighter.printing .color3 a {
+ color: red !important;
+}
+.syntaxhighlighter.printing .break, .syntaxhighlighter.printing .break a {
+ color: black !important;
+}
+
+.syntaxhighlighter {
+ background-color: #0f192a !important;
+}
+.syntaxhighlighter .line.alt1 {
+ background-color: #0f192a !important;
+}
+.syntaxhighlighter .line.alt2 {
+ background-color: #0f192a !important;
+}
+.syntaxhighlighter .line.highlighted.alt1, .syntaxhighlighter .line.highlighted.alt2 {
+ background-color: #253e5a !important;
+}
+.syntaxhighlighter .line.highlighted.number {
+ color: #38566f !important;
+}
+.syntaxhighlighter table caption {
+ color: #d1edff !important;
+}
+.syntaxhighlighter .gutter {
+ color: #afafaf !important;
+}
+.syntaxhighlighter .gutter .line {
+ border-right: 3px solid #435a5f !important;
+}
+.syntaxhighlighter .gutter .line.highlighted {
+ background-color: #435a5f !important;
+ color: #0f192a !important;
+}
+.syntaxhighlighter.printing .line .content {
+ border: none !important;
+}
+.syntaxhighlighter.collapsed {
+ overflow: visible !important;
+}
+.syntaxhighlighter.collapsed .toolbar {
+ color: #428bdd !important;
+ background: black !important;
+ border: 1px solid #435a5f !important;
+}
+.syntaxhighlighter.collapsed .toolbar a {
+ color: #428bdd !important;
+}
+.syntaxhighlighter.collapsed .toolbar a:hover {
+ color: #1dc116 !important;
+}
+.syntaxhighlighter .toolbar {
+ color: #d1edff !important;
+ background: #435a5f !important;
+ border: none !important;
+}
+.syntaxhighlighter .toolbar a {
+ color: #d1edff !important;
+}
+.syntaxhighlighter .toolbar a:hover {
+ color: #8aa6c1 !important;
+}
+.syntaxhighlighter .plain, .syntaxhighlighter .plain a {
+ color: #d1edff !important;
+}
+.syntaxhighlighter .comments, .syntaxhighlighter .comments a {
+ color: #428bdd !important;
+}
+.syntaxhighlighter .string, .syntaxhighlighter .string a {
+ color: #1dc116 !important;
+}
+.syntaxhighlighter .keyword {
+ color: #b43d3d !important;
+}
+.syntaxhighlighter .preprocessor {
+ color: #8aa6c1 !important;
+}
+.syntaxhighlighter .variable {
+ color: #ffaa3e !important;
+}
+.syntaxhighlighter .value {
+ color: #f7e741 !important;
+}
+.syntaxhighlighter .functions {
+ color: #ffaa3e !important;
+}
+.syntaxhighlighter .constants {
+ color: #e0e8ff !important;
+}
+.syntaxhighlighter .script {
+ font-weight: bold !important;
+ color: #b43d3d !important;
+ background-color: none !important;
+}
+.syntaxhighlighter .color1, .syntaxhighlighter .color1 a {
+ color: #f8bb00 !important;
+}
+.syntaxhighlighter .color2, .syntaxhighlighter .color2 a {
+ color: white !important;
+}
+.syntaxhighlighter .color3, .syntaxhighlighter .color3 a {
+ color: #ffaa3e !important;
+}
diff --git a/upstream/clipper-6.4.2/Documentation/Scripts/SyntaxHighlighter/styles/shCoreRDark.css b/upstream/clipper-6.4.2/Documentation/Scripts/SyntaxHighlighter/styles/shCoreRDark.css
new file mode 100644
index 0000000..d093683
--- /dev/null
+++ b/upstream/clipper-6.4.2/Documentation/Scripts/SyntaxHighlighter/styles/shCoreRDark.css
@@ -0,0 +1,324 @@
+/**
+ * SyntaxHighlighter
+ * http://alexgorbatchev.com/SyntaxHighlighter
+ *
+ * SyntaxHighlighter is donationware. If you are using it, please donate.
+ * http://alexgorbatchev.com/SyntaxHighlighter/donate.html
+ *
+ * @version
+ * 3.0.83 (July 02 2010)
+ *
+ * @copyright
+ * Copyright (C) 2004-2010 Alex Gorbatchev.
+ *
+ * @license
+ * Dual licensed under the MIT and GPL licenses.
+ */
+.syntaxhighlighter a,
+.syntaxhighlighter div,
+.syntaxhighlighter code,
+.syntaxhighlighter table,
+.syntaxhighlighter table td,
+.syntaxhighlighter table tr,
+.syntaxhighlighter table tbody,
+.syntaxhighlighter table thead,
+.syntaxhighlighter table caption,
+.syntaxhighlighter textarea {
+ -moz-border-radius: 0 0 0 0 !important;
+ -webkit-border-radius: 0 0 0 0 !important;
+ background: none !important;
+ border: 0 !important;
+ bottom: auto !important;
+ float: none !important;
+ height: auto !important;
+ left: auto !important;
+ line-height: 1.1em !important;
+ margin: 0 !important;
+ outline: 0 !important;
+ overflow: visible !important;
+ padding: 0 !important;
+ position: static !important;
+ right: auto !important;
+ text-align: left !important;
+ top: auto !important;
+ vertical-align: baseline !important;
+ width: auto !important;
+ box-sizing: content-box !important;
+ font-family: "Consolas", "Bitstream Vera Sans Mono", "Courier New", Courier, monospace !important;
+ font-weight: normal !important;
+ font-style: normal !important;
+ font-size: 1em !important;
+ min-height: inherit !important;
+ min-height: auto !important;
+}
+
+.syntaxhighlighter {
+ width: 100% !important;
+ margin: 1em 0 1em 0 !important;
+ position: relative !important;
+ overflow: auto !important;
+ font-size: 1em !important;
+}
+.syntaxhighlighter.source {
+ overflow: hidden !important;
+}
+.syntaxhighlighter .bold {
+ font-weight: bold !important;
+}
+.syntaxhighlighter .italic {
+ font-style: italic !important;
+}
+.syntaxhighlighter .line {
+ white-space: pre !important;
+}
+.syntaxhighlighter table {
+ width: 100% !important;
+}
+.syntaxhighlighter table caption {
+ text-align: left !important;
+ padding: .5em 0 0.5em 1em !important;
+}
+.syntaxhighlighter table td.code {
+ width: 100% !important;
+}
+.syntaxhighlighter table td.code .container {
+ position: relative !important;
+}
+.syntaxhighlighter table td.code .container textarea {
+ box-sizing: border-box !important;
+ position: absolute !important;
+ left: 0 !important;
+ top: 0 !important;
+ width: 100% !important;
+ height: 100% !important;
+ border: none !important;
+ background: white !important;
+ padding-left: 1em !important;
+ overflow: hidden !important;
+ white-space: pre !important;
+}
+.syntaxhighlighter table td.gutter .line {
+ text-align: right !important;
+ padding: 0 0.5em 0 1em !important;
+}
+.syntaxhighlighter table td.code .line {
+ padding: 0 1em !important;
+}
+.syntaxhighlighter.nogutter td.code .container textarea, .syntaxhighlighter.nogutter td.code .line {
+ padding-left: 0em !important;
+}
+.syntaxhighlighter.show {
+ display: block !important;
+}
+.syntaxhighlighter.collapsed table {
+ display: none !important;
+}
+.syntaxhighlighter.collapsed .toolbar {
+ padding: 0.1em 0.8em 0em 0.8em !important;
+ font-size: 1em !important;
+ position: static !important;
+ width: auto !important;
+ height: auto !important;
+}
+.syntaxhighlighter.collapsed .toolbar span {
+ display: inline !important;
+ margin-right: 1em !important;
+}
+.syntaxhighlighter.collapsed .toolbar span a {
+ padding: 0 !important;
+ display: none !important;
+}
+.syntaxhighlighter.collapsed .toolbar span a.expandSource {
+ display: inline !important;
+}
+.syntaxhighlighter .toolbar {
+ position: absolute !important;
+ right: 1px !important;
+ top: 1px !important;
+ width: 11px !important;
+ height: 11px !important;
+ font-size: 10px !important;
+ z-index: 10 !important;
+}
+.syntaxhighlighter .toolbar span.title {
+ display: inline !important;
+}
+.syntaxhighlighter .toolbar a {
+ display: block !important;
+ text-align: center !important;
+ text-decoration: none !important;
+ padding-top: 1px !important;
+}
+.syntaxhighlighter .toolbar a.expandSource {
+ display: none !important;
+}
+.syntaxhighlighter.ie {
+ font-size: .9em !important;
+ padding: 1px 0 1px 0 !important;
+}
+.syntaxhighlighter.ie .toolbar {
+ line-height: 8px !important;
+}
+.syntaxhighlighter.ie .toolbar a {
+ padding-top: 0px !important;
+}
+.syntaxhighlighter.printing .line.alt1 .content,
+.syntaxhighlighter.printing .line.alt2 .content,
+.syntaxhighlighter.printing .line.highlighted .number,
+.syntaxhighlighter.printing .line.highlighted.alt1 .content,
+.syntaxhighlighter.printing .line.highlighted.alt2 .content {
+ background: none !important;
+}
+.syntaxhighlighter.printing .line .number {
+ color: #bbbbbb !important;
+}
+.syntaxhighlighter.printing .line .content {
+ color: black !important;
+}
+.syntaxhighlighter.printing .toolbar {
+ display: none !important;
+}
+.syntaxhighlighter.printing a {
+ text-decoration: none !important;
+}
+.syntaxhighlighter.printing .plain, .syntaxhighlighter.printing .plain a {
+ color: black !important;
+}
+.syntaxhighlighter.printing .comments, .syntaxhighlighter.printing .comments a {
+ color: #008200 !important;
+}
+.syntaxhighlighter.printing .string, .syntaxhighlighter.printing .string a {
+ color: blue !important;
+}
+.syntaxhighlighter.printing .keyword {
+ color: #006699 !important;
+ font-weight: bold !important;
+}
+.syntaxhighlighter.printing .preprocessor {
+ color: gray !important;
+}
+.syntaxhighlighter.printing .variable {
+ color: #aa7700 !important;
+}
+.syntaxhighlighter.printing .value {
+ color: #009900 !important;
+}
+.syntaxhighlighter.printing .functions {
+ color: #ff1493 !important;
+}
+.syntaxhighlighter.printing .constants {
+ color: #0066cc !important;
+}
+.syntaxhighlighter.printing .script {
+ font-weight: bold !important;
+}
+.syntaxhighlighter.printing .color1, .syntaxhighlighter.printing .color1 a {
+ color: gray !important;
+}
+.syntaxhighlighter.printing .color2, .syntaxhighlighter.printing .color2 a {
+ color: #ff1493 !important;
+}
+.syntaxhighlighter.printing .color3, .syntaxhighlighter.printing .color3 a {
+ color: red !important;
+}
+.syntaxhighlighter.printing .break, .syntaxhighlighter.printing .break a {
+ color: black !important;
+}
+
+.syntaxhighlighter {
+ background-color: #1b2426 !important;
+}
+.syntaxhighlighter .line.alt1 {
+ background-color: #1b2426 !important;
+}
+.syntaxhighlighter .line.alt2 {
+ background-color: #1b2426 !important;
+}
+.syntaxhighlighter .line.highlighted.alt1, .syntaxhighlighter .line.highlighted.alt2 {
+ background-color: #323e41 !important;
+}
+.syntaxhighlighter .line.highlighted.number {
+ color: #b9bdb6 !important;
+}
+.syntaxhighlighter table caption {
+ color: #b9bdb6 !important;
+}
+.syntaxhighlighter .gutter {
+ color: #afafaf !important;
+}
+.syntaxhighlighter .gutter .line {
+ border-right: 3px solid #435a5f !important;
+}
+.syntaxhighlighter .gutter .line.highlighted {
+ background-color: #435a5f !important;
+ color: #1b2426 !important;
+}
+.syntaxhighlighter.printing .line .content {
+ border: none !important;
+}
+.syntaxhighlighter.collapsed {
+ overflow: visible !important;
+}
+.syntaxhighlighter.collapsed .toolbar {
+ color: #5ba1cf !important;
+ background: black !important;
+ border: 1px solid #435a5f !important;
+}
+.syntaxhighlighter.collapsed .toolbar a {
+ color: #5ba1cf !important;
+}
+.syntaxhighlighter.collapsed .toolbar a:hover {
+ color: #5ce638 !important;
+}
+.syntaxhighlighter .toolbar {
+ color: white !important;
+ background: #435a5f !important;
+ border: none !important;
+}
+.syntaxhighlighter .toolbar a {
+ color: white !important;
+}
+.syntaxhighlighter .toolbar a:hover {
+ color: #e0e8ff !important;
+}
+.syntaxhighlighter .plain, .syntaxhighlighter .plain a {
+ color: #b9bdb6 !important;
+}
+.syntaxhighlighter .comments, .syntaxhighlighter .comments a {
+ color: #878a85 !important;
+}
+.syntaxhighlighter .string, .syntaxhighlighter .string a {
+ color: #5ce638 !important;
+}
+.syntaxhighlighter .keyword {
+ color: #5ba1cf !important;
+}
+.syntaxhighlighter .preprocessor {
+ color: #435a5f !important;
+}
+.syntaxhighlighter .variable {
+ color: #ffaa3e !important;
+}
+.syntaxhighlighter .value {
+ color: #009900 !important;
+}
+.syntaxhighlighter .functions {
+ color: #ffaa3e !important;
+}
+.syntaxhighlighter .constants {
+ color: #e0e8ff !important;
+}
+.syntaxhighlighter .script {
+ font-weight: bold !important;
+ color: #5ba1cf !important;
+ background-color: none !important;
+}
+.syntaxhighlighter .color1, .syntaxhighlighter .color1 a {
+ color: #e0e8ff !important;
+}
+.syntaxhighlighter .color2, .syntaxhighlighter .color2 a {
+ color: white !important;
+}
+.syntaxhighlighter .color3, .syntaxhighlighter .color3 a {
+ color: #ffaa3e !important;
+}
diff --git a/upstream/clipper-6.4.2/Documentation/Scripts/SyntaxHighlighter/styles/shThemeDefault.css b/upstream/clipper-6.4.2/Documentation/Scripts/SyntaxHighlighter/styles/shThemeDefault.css
new file mode 100644
index 0000000..6a121ad
--- /dev/null
+++ b/upstream/clipper-6.4.2/Documentation/Scripts/SyntaxHighlighter/styles/shThemeDefault.css
@@ -0,0 +1,119 @@
+/**
+ * SyntaxHighlighter
+ * http://alexgorbatchev.com/SyntaxHighlighter
+ *
+ * SyntaxHighlighter is donationware. If you are using it, please donate.
+ * http://alexgorbatchev.com/SyntaxHighlighter/donate.html
+ *
+ * @version
+ * 3.0.83 (July 02 2010)
+ *
+ * @copyright
+ * Copyright (C) 2004-2010 Alex Gorbatchev.
+ *
+ * @license
+ * Dual licensed under the MIT and GPL licenses.
+ */
+.syntaxhighlighter {
+ background-color: white !important;
+}
+.syntaxhighlighter .line.alt1 {
+ background-color: white !important;
+}
+.syntaxhighlighter .line.alt2 {
+ background-color: white !important;
+}
+.syntaxhighlighter .line.highlighted.alt1, .syntaxhighlighter .line.highlighted.alt2 {
+ background-color: white !important;
+}
+.syntaxhighlighter .line.highlighted.number {
+ color: black !important;
+}
+.syntaxhighlighter table caption {
+ color: black !important;
+}
+.syntaxhighlighter .gutter {
+ color: #afafaf !important;
+}
+.syntaxhighlighter .gutter .line {
+ background-color: #E7E5DC !important;
+ border-right: 3px solid #6ce26c !important;
+}
+.syntaxhighlighter .gutter .line.highlighted {
+ background-color: #6ce26c !important;
+ color: white !important;
+}
+.syntaxhighlighter.printing .line .content {
+ border: none !important;
+}
+.syntaxhighlighter.collapsed {
+ overflow: visible !important;
+}
+.syntaxhighlighter.collapsed .toolbar {
+ color: blue !important;
+ background: white !important;
+ border: 1px solid #6ce26c !important;
+}
+.syntaxhighlighter.collapsed .toolbar a {
+ color: blue !important;
+}
+.syntaxhighlighter.collapsed .toolbar a:hover {
+ color: red !important;
+}
+.syntaxhighlighter .toolbar {
+ color: white !important;
+ display : none;
+ background: #6ce26c !important;
+ border: none !important;
+}
+.syntaxhighlighter .toolbar a {
+ color: white !important;
+}
+.syntaxhighlighter .toolbar a:hover {
+ color: black !important;
+}
+.syntaxhighlighter .plain, .syntaxhighlighter .plain a {
+ color: black !important;
+}
+.syntaxhighlighter .comments, .syntaxhighlighter .comments a {
+ color: #008200 !important;
+}
+.syntaxhighlighter .string, .syntaxhighlighter .string a {
+ color: blue !important;
+}
+.syntaxhighlighter .keyword {
+ color: #006699 !important;
+}
+.syntaxhighlighter .preprocessor {
+ color: gray !important;
+}
+.syntaxhighlighter .variable {
+ color: #aa7700 !important;
+}
+.syntaxhighlighter .value {
+ color: #009900 !important;
+}
+.syntaxhighlighter .functions {
+ color: #ff1493 !important;
+}
+.syntaxhighlighter .constants {
+ color: #0066cc !important;
+}
+.syntaxhighlighter .script {
+ font-weight: bold !important;
+ color: #006699 !important;
+ background-color: none !important;
+}
+.syntaxhighlighter .color1, .syntaxhighlighter .color1 a {
+ color: gray !important;
+}
+.syntaxhighlighter .color2, .syntaxhighlighter .color2 a {
+ color: #ff1493 !important;
+}
+.syntaxhighlighter .color3, .syntaxhighlighter .color3 a {
+ color: red !important;
+}
+
+.syntaxhighlighter .keyword {
+ font-weight: bold !important;
+}
diff --git a/upstream/clipper-6.4.2/Documentation/Scripts/SyntaxHighlighter/styles/shThemeDjango.css b/upstream/clipper-6.4.2/Documentation/Scripts/SyntaxHighlighter/styles/shThemeDjango.css
new file mode 100644
index 0000000..d8b4313
--- /dev/null
+++ b/upstream/clipper-6.4.2/Documentation/Scripts/SyntaxHighlighter/styles/shThemeDjango.css
@@ -0,0 +1,120 @@
+/**
+ * SyntaxHighlighter
+ * http://alexgorbatchev.com/SyntaxHighlighter
+ *
+ * SyntaxHighlighter is donationware. If you are using it, please donate.
+ * http://alexgorbatchev.com/SyntaxHighlighter/donate.html
+ *
+ * @version
+ * 3.0.83 (July 02 2010)
+ *
+ * @copyright
+ * Copyright (C) 2004-2010 Alex Gorbatchev.
+ *
+ * @license
+ * Dual licensed under the MIT and GPL licenses.
+ */
+.syntaxhighlighter {
+ background-color: #0a2b1d !important;
+}
+.syntaxhighlighter .line.alt1 {
+ background-color: #0a2b1d !important;
+}
+.syntaxhighlighter .line.alt2 {
+ background-color: #0a2b1d !important;
+}
+.syntaxhighlighter .line.highlighted.alt1, .syntaxhighlighter .line.highlighted.alt2 {
+ background-color: #233729 !important;
+}
+.syntaxhighlighter .line.highlighted.number {
+ color: white !important;
+}
+.syntaxhighlighter table caption {
+ color: #f8f8f8 !important;
+}
+.syntaxhighlighter .gutter {
+ color: #497958 !important;
+}
+.syntaxhighlighter .gutter .line {
+ border-right: 3px solid #41a83e !important;
+}
+.syntaxhighlighter .gutter .line.highlighted {
+ background-color: #41a83e !important;
+ color: #0a2b1d !important;
+}
+.syntaxhighlighter.printing .line .content {
+ border: none !important;
+}
+.syntaxhighlighter.collapsed {
+ overflow: visible !important;
+}
+.syntaxhighlighter.collapsed .toolbar {
+ color: #96dd3b !important;
+ background: black !important;
+ border: 1px solid #41a83e !important;
+}
+.syntaxhighlighter.collapsed .toolbar a {
+ color: #96dd3b !important;
+}
+.syntaxhighlighter.collapsed .toolbar a:hover {
+ color: white !important;
+}
+.syntaxhighlighter .toolbar {
+ color: white !important;
+ background: #41a83e !important;
+ border: none !important;
+}
+.syntaxhighlighter .toolbar a {
+ color: white !important;
+}
+.syntaxhighlighter .toolbar a:hover {
+ color: #ffe862 !important;
+}
+.syntaxhighlighter .plain, .syntaxhighlighter .plain a {
+ color: #f8f8f8 !important;
+}
+.syntaxhighlighter .comments, .syntaxhighlighter .comments a {
+ color: #336442 !important;
+}
+.syntaxhighlighter .string, .syntaxhighlighter .string a {
+ color: #9df39f !important;
+}
+.syntaxhighlighter .keyword {
+ color: #96dd3b !important;
+}
+.syntaxhighlighter .preprocessor {
+ color: #91bb9e !important;
+}
+.syntaxhighlighter .variable {
+ color: #ffaa3e !important;
+}
+.syntaxhighlighter .value {
+ color: #f7e741 !important;
+}
+.syntaxhighlighter .functions {
+ color: #ffaa3e !important;
+}
+.syntaxhighlighter .constants {
+ color: #e0e8ff !important;
+}
+.syntaxhighlighter .script {
+ font-weight: bold !important;
+ color: #96dd3b !important;
+ background-color: none !important;
+}
+.syntaxhighlighter .color1, .syntaxhighlighter .color1 a {
+ color: #eb939a !important;
+}
+.syntaxhighlighter .color2, .syntaxhighlighter .color2 a {
+ color: #91bb9e !important;
+}
+.syntaxhighlighter .color3, .syntaxhighlighter .color3 a {
+ color: #edef7d !important;
+}
+
+.syntaxhighlighter .comments {
+ font-style: italic !important;
+}
+.syntaxhighlighter .keyword {
+ font-weight: bold !important;
+}
diff --git a/upstream/clipper-6.4.2/Documentation/Scripts/SyntaxHighlighter/styles/shThemeEclipse.css b/upstream/clipper-6.4.2/Documentation/Scripts/SyntaxHighlighter/styles/shThemeEclipse.css
new file mode 100644
index 0000000..77377d9
--- /dev/null
+++ b/upstream/clipper-6.4.2/Documentation/Scripts/SyntaxHighlighter/styles/shThemeEclipse.css
@@ -0,0 +1,128 @@
+/**
+ * SyntaxHighlighter
+ * http://alexgorbatchev.com/SyntaxHighlighter
+ *
+ * SyntaxHighlighter is donationware. If you are using it, please donate.
+ * http://alexgorbatchev.com/SyntaxHighlighter/donate.html
+ *
+ * @version
+ * 3.0.83 (July 02 2010)
+ *
+ * @copyright
+ * Copyright (C) 2004-2010 Alex Gorbatchev.
+ *
+ * @license
+ * Dual licensed under the MIT and GPL licenses.
+ */
+.syntaxhighlighter {
+ background-color: white !important;
+}
+.syntaxhighlighter .line.alt1 {
+ background-color: white !important;
+}
+.syntaxhighlighter .line.alt2 {
+ background-color: white !important;
+}
+.syntaxhighlighter .line.highlighted.alt1, .syntaxhighlighter .line.highlighted.alt2 {
+ background-color: #c3defe !important;
+}
+.syntaxhighlighter .line.highlighted.number {
+ color: white !important;
+}
+.syntaxhighlighter table caption {
+ color: black !important;
+}
+.syntaxhighlighter .gutter {
+ color: #787878 !important;
+}
+.syntaxhighlighter .gutter .line {
+ border-right: 3px solid #d4d0c8 !important;
+}
+.syntaxhighlighter .gutter .line.highlighted {
+ background-color: #d4d0c8 !important;
+ color: white !important;
+}
+.syntaxhighlighter.printing .line .content {
+ border: none !important;
+}
+.syntaxhighlighter.collapsed {
+ overflow: visible !important;
+}
+.syntaxhighlighter.collapsed .toolbar {
+ color: #3f5fbf !important;
+ background: white !important;
+ border: 1px solid #d4d0c8 !important;
+}
+.syntaxhighlighter.collapsed .toolbar a {
+ color: #3f5fbf !important;
+}
+.syntaxhighlighter.collapsed .toolbar a:hover {
+ color: #aa7700 !important;
+}
+.syntaxhighlighter .toolbar {
+ color: #a0a0a0 !important;
+ background: #d4d0c8 !important;
+ border: none !important;
+}
+.syntaxhighlighter .toolbar a {
+ color: #a0a0a0 !important;
+}
+.syntaxhighlighter .toolbar a:hover {
+ color: red !important;
+}
+.syntaxhighlighter .plain, .syntaxhighlighter .plain a {
+ color: black !important;
+}
+.syntaxhighlighter .comments, .syntaxhighlighter .comments a {
+ color: #3f5fbf !important;
+}
+.syntaxhighlighter .string, .syntaxhighlighter .string a {
+ color: #2a00ff !important;
+}
+.syntaxhighlighter .keyword {
+ color: #7f0055 !important;
+}
+.syntaxhighlighter .preprocessor {
+ color: #646464 !important;
+}
+.syntaxhighlighter .variable {
+ color: #aa7700 !important;
+}
+.syntaxhighlighter .value {
+ color: #009900 !important;
+}
+.syntaxhighlighter .functions {
+ color: #ff1493 !important;
+}
+.syntaxhighlighter .constants {
+ color: #0066cc !important;
+}
+.syntaxhighlighter .script {
+ font-weight: bold !important;
+ color: #7f0055 !important;
+ background-color: none !important;
+}
+.syntaxhighlighter .color1, .syntaxhighlighter .color1 a {
+ color: gray !important;
+}
+.syntaxhighlighter .color2, .syntaxhighlighter .color2 a {
+ color: #ff1493 !important;
+}
+.syntaxhighlighter .color3, .syntaxhighlighter .color3 a {
+ color: red !important;
+}
+
+.syntaxhighlighter .keyword {
+ font-weight: bold !important;
+}
+.syntaxhighlighter .xml .keyword {
+ color: #3f7f7f !important;
+ font-weight: normal !important;
+}
+.syntaxhighlighter .xml .color1, .syntaxhighlighter .xml .color1 a {
+ color: #7f007f !important;
+}
+.syntaxhighlighter .xml .string {
+ font-style: italic !important;
+ color: #2a00ff !important;
+}
diff --git a/upstream/clipper-6.4.2/Documentation/Scripts/SyntaxHighlighter/styles/shThemeEmacs.css b/upstream/clipper-6.4.2/Documentation/Scripts/SyntaxHighlighter/styles/shThemeEmacs.css
new file mode 100644
index 0000000..dae5053
--- /dev/null
+++ b/upstream/clipper-6.4.2/Documentation/Scripts/SyntaxHighlighter/styles/shThemeEmacs.css
@@ -0,0 +1,113 @@
+/**
+ * SyntaxHighlighter
+ * http://alexgorbatchev.com/SyntaxHighlighter
+ *
+ * SyntaxHighlighter is donationware. If you are using it, please donate.
+ * http://alexgorbatchev.com/SyntaxHighlighter/donate.html
+ *
+ * @version
+ * 3.0.83 (July 02 2010)
+ *
+ * @copyright
+ * Copyright (C) 2004-2010 Alex Gorbatchev.
+ *
+ * @license
+ * Dual licensed under the MIT and GPL licenses.
+ */
+.syntaxhighlighter {
+ background-color: black !important;
+}
+.syntaxhighlighter .line.alt1 {
+ background-color: black !important;
+}
+.syntaxhighlighter .line.alt2 {
+ background-color: black !important;
+}
+.syntaxhighlighter .line.highlighted.alt1, .syntaxhighlighter .line.highlighted.alt2 {
+ background-color: #2a3133 !important;
+}
+.syntaxhighlighter .line.highlighted.number {
+ color: white !important;
+}
+.syntaxhighlighter table caption {
+ color: #d3d3d3 !important;
+}
+.syntaxhighlighter .gutter {
+ color: #d3d3d3 !important;
+}
+.syntaxhighlighter .gutter .line {
+ border-right: 3px solid #990000 !important;
+}
+.syntaxhighlighter .gutter .line.highlighted {
+ background-color: #990000 !important;
+ color: black !important;
+}
+.syntaxhighlighter.printing .line .content {
+ border: none !important;
+}
+.syntaxhighlighter.collapsed {
+ overflow: visible !important;
+}
+.syntaxhighlighter.collapsed .toolbar {
+ color: #ebdb8d !important;
+ background: black !important;
+ border: 1px solid #990000 !important;
+}
+.syntaxhighlighter.collapsed .toolbar a {
+ color: #ebdb8d !important;
+}
+.syntaxhighlighter.collapsed .toolbar a:hover {
+ color: #ff7d27 !important;
+}
+.syntaxhighlighter .toolbar {
+ color: white !important;
+ background: #990000 !important;
+ border: none !important;
+}
+.syntaxhighlighter .toolbar a {
+ color: white !important;
+}
+.syntaxhighlighter .toolbar a:hover {
+ color: #9ccff4 !important;
+}
+.syntaxhighlighter .plain, .syntaxhighlighter .plain a {
+ color: #d3d3d3 !important;
+}
+.syntaxhighlighter .comments, .syntaxhighlighter .comments a {
+ color: #ff7d27 !important;
+}
+.syntaxhighlighter .string, .syntaxhighlighter .string a {
+ color: #ff9e7b !important;
+}
+.syntaxhighlighter .keyword {
+ color: aqua !important;
+}
+.syntaxhighlighter .preprocessor {
+ color: #aec4de !important;
+}
+.syntaxhighlighter .variable {
+ color: #ffaa3e !important;
+}
+.syntaxhighlighter .value {
+ color: #009900 !important;
+}
+.syntaxhighlighter .functions {
+ color: #81cef9 !important;
+}
+.syntaxhighlighter .constants {
+ color: #ff9e7b !important;
+}
+.syntaxhighlighter .script {
+ font-weight: bold !important;
+ color: aqua !important;
+ background-color: none !important;
+}
+.syntaxhighlighter .color1, .syntaxhighlighter .color1 a {
+ color: #ebdb8d !important;
+}
+.syntaxhighlighter .color2, .syntaxhighlighter .color2 a {
+ color: #ff7d27 !important;
+}
+.syntaxhighlighter .color3, .syntaxhighlighter .color3 a {
+ color: #aec4de !important;
+}
diff --git a/upstream/clipper-6.4.2/Documentation/Scripts/SyntaxHighlighter/styles/shThemeFadeToGrey.css b/upstream/clipper-6.4.2/Documentation/Scripts/SyntaxHighlighter/styles/shThemeFadeToGrey.css
new file mode 100644
index 0000000..8fbd871
--- /dev/null
+++ b/upstream/clipper-6.4.2/Documentation/Scripts/SyntaxHighlighter/styles/shThemeFadeToGrey.css
@@ -0,0 +1,117 @@
+/**
+ * SyntaxHighlighter
+ * http://alexgorbatchev.com/SyntaxHighlighter
+ *
+ * SyntaxHighlighter is donationware. If you are using it, please donate.
+ * http://alexgorbatchev.com/SyntaxHighlighter/donate.html
+ *
+ * @version
+ * 3.0.83 (July 02 2010)
+ *
+ * @copyright
+ * Copyright (C) 2004-2010 Alex Gorbatchev.
+ *
+ * @license
+ * Dual licensed under the MIT and GPL licenses.
+ */
+.syntaxhighlighter {
+ background-color: #121212 !important;
+}
+.syntaxhighlighter .line.alt1 {
+ background-color: #121212 !important;
+}
+.syntaxhighlighter .line.alt2 {
+ background-color: #121212 !important;
+}
+.syntaxhighlighter .line.highlighted.alt1, .syntaxhighlighter .line.highlighted.alt2 {
+ background-color: #2c2c29 !important;
+}
+.syntaxhighlighter .line.highlighted.number {
+ color: white !important;
+}
+.syntaxhighlighter table caption {
+ color: white !important;
+}
+.syntaxhighlighter .gutter {
+ color: #afafaf !important;
+}
+.syntaxhighlighter .gutter .line {
+ border-right: 3px solid #3185b9 !important;
+}
+.syntaxhighlighter .gutter .line.highlighted {
+ background-color: #3185b9 !important;
+ color: #121212 !important;
+}
+.syntaxhighlighter.printing .line .content {
+ border: none !important;
+}
+.syntaxhighlighter.collapsed {
+ overflow: visible !important;
+}
+.syntaxhighlighter.collapsed .toolbar {
+ color: #3185b9 !important;
+ background: black !important;
+ border: 1px solid #3185b9 !important;
+}
+.syntaxhighlighter.collapsed .toolbar a {
+ color: #3185b9 !important;
+}
+.syntaxhighlighter.collapsed .toolbar a:hover {
+ color: #d01d33 !important;
+}
+.syntaxhighlighter .toolbar {
+ color: white !important;
+ background: #3185b9 !important;
+ border: none !important;
+}
+.syntaxhighlighter .toolbar a {
+ color: white !important;
+}
+.syntaxhighlighter .toolbar a:hover {
+ color: #96daff !important;
+}
+.syntaxhighlighter .plain, .syntaxhighlighter .plain a {
+ color: white !important;
+}
+.syntaxhighlighter .comments, .syntaxhighlighter .comments a {
+ color: #696854 !important;
+}
+.syntaxhighlighter .string, .syntaxhighlighter .string a {
+ color: #e3e658 !important;
+}
+.syntaxhighlighter .keyword {
+ color: #d01d33 !important;
+}
+.syntaxhighlighter .preprocessor {
+ color: #435a5f !important;
+}
+.syntaxhighlighter .variable {
+ color: #898989 !important;
+}
+.syntaxhighlighter .value {
+ color: #009900 !important;
+}
+.syntaxhighlighter .functions {
+ color: #aaaaaa !important;
+}
+.syntaxhighlighter .constants {
+ color: #96daff !important;
+}
+.syntaxhighlighter .script {
+ font-weight: bold !important;
+ color: #d01d33 !important;
+ background-color: none !important;
+}
+.syntaxhighlighter .color1, .syntaxhighlighter .color1 a {
+ color: #ffc074 !important;
+}
+.syntaxhighlighter .color2, .syntaxhighlighter .color2 a {
+ color: #4a8cdb !important;
+}
+.syntaxhighlighter .color3, .syntaxhighlighter .color3 a {
+ color: #96daff !important;
+}
+
+.syntaxhighlighter .functions {
+ font-weight: bold !important;
+}
diff --git a/upstream/clipper-6.4.2/Documentation/Scripts/SyntaxHighlighter/styles/shThemeMDUltra.css b/upstream/clipper-6.4.2/Documentation/Scripts/SyntaxHighlighter/styles/shThemeMDUltra.css
new file mode 100644
index 0000000..f4db39c
--- /dev/null
+++ b/upstream/clipper-6.4.2/Documentation/Scripts/SyntaxHighlighter/styles/shThemeMDUltra.css
@@ -0,0 +1,113 @@
+/**
+ * SyntaxHighlighter
+ * http://alexgorbatchev.com/SyntaxHighlighter
+ *
+ * SyntaxHighlighter is donationware. If you are using it, please donate.
+ * http://alexgorbatchev.com/SyntaxHighlighter/donate.html
+ *
+ * @version
+ * 3.0.83 (July 02 2010)
+ *
+ * @copyright
+ * Copyright (C) 2004-2010 Alex Gorbatchev.
+ *
+ * @license
+ * Dual licensed under the MIT and GPL licenses.
+ */
+.syntaxhighlighter {
+ background-color: #222222 !important;
+}
+.syntaxhighlighter .line.alt1 {
+ background-color: #222222 !important;
+}
+.syntaxhighlighter .line.alt2 {
+ background-color: #222222 !important;
+}
+.syntaxhighlighter .line.highlighted.alt1, .syntaxhighlighter .line.highlighted.alt2 {
+ background-color: #253e5a !important;
+}
+.syntaxhighlighter .line.highlighted.number {
+ color: white !important;
+}
+.syntaxhighlighter table caption {
+ color: lime !important;
+}
+.syntaxhighlighter .gutter {
+ color: #38566f !important;
+}
+.syntaxhighlighter .gutter .line {
+ border-right: 3px solid #435a5f !important;
+}
+.syntaxhighlighter .gutter .line.highlighted {
+ background-color: #435a5f !important;
+ color: #222222 !important;
+}
+.syntaxhighlighter.printing .line .content {
+ border: none !important;
+}
+.syntaxhighlighter.collapsed {
+ overflow: visible !important;
+}
+.syntaxhighlighter.collapsed .toolbar {
+ color: #428bdd !important;
+ background: black !important;
+ border: 1px solid #435a5f !important;
+}
+.syntaxhighlighter.collapsed .toolbar a {
+ color: #428bdd !important;
+}
+.syntaxhighlighter.collapsed .toolbar a:hover {
+ color: lime !important;
+}
+.syntaxhighlighter .toolbar {
+ color: #aaaaff !important;
+ background: #435a5f !important;
+ border: none !important;
+}
+.syntaxhighlighter .toolbar a {
+ color: #aaaaff !important;
+}
+.syntaxhighlighter .toolbar a:hover {
+ color: #9ccff4 !important;
+}
+.syntaxhighlighter .plain, .syntaxhighlighter .plain a {
+ color: lime !important;
+}
+.syntaxhighlighter .comments, .syntaxhighlighter .comments a {
+ color: #428bdd !important;
+}
+.syntaxhighlighter .string, .syntaxhighlighter .string a {
+ color: lime !important;
+}
+.syntaxhighlighter .keyword {
+ color: #aaaaff !important;
+}
+.syntaxhighlighter .preprocessor {
+ color: #8aa6c1 !important;
+}
+.syntaxhighlighter .variable {
+ color: aqua !important;
+}
+.syntaxhighlighter .value {
+ color: #f7e741 !important;
+}
+.syntaxhighlighter .functions {
+ color: #ff8000 !important;
+}
+.syntaxhighlighter .constants {
+ color: yellow !important;
+}
+.syntaxhighlighter .script {
+ font-weight: bold !important;
+ color: #aaaaff !important;
+ background-color: none !important;
+}
+.syntaxhighlighter .color1, .syntaxhighlighter .color1 a {
+ color: red !important;
+}
+.syntaxhighlighter .color2, .syntaxhighlighter .color2 a {
+ color: yellow !important;
+}
+.syntaxhighlighter .color3, .syntaxhighlighter .color3 a {
+ color: #ffaa3e !important;
+}
diff --git a/upstream/clipper-6.4.2/Documentation/Scripts/SyntaxHighlighter/styles/shThemeMidnight.css b/upstream/clipper-6.4.2/Documentation/Scripts/SyntaxHighlighter/styles/shThemeMidnight.css
new file mode 100644
index 0000000..c49563c
--- /dev/null
+++ b/upstream/clipper-6.4.2/Documentation/Scripts/SyntaxHighlighter/styles/shThemeMidnight.css
@@ -0,0 +1,113 @@
+/**
+ * SyntaxHighlighter
+ * http://alexgorbatchev.com/SyntaxHighlighter
+ *
+ * SyntaxHighlighter is donationware. If you are using it, please donate.
+ * http://alexgorbatchev.com/SyntaxHighlighter/donate.html
+ *
+ * @version
+ * 3.0.83 (July 02 2010)
+ *
+ * @copyright
+ * Copyright (C) 2004-2010 Alex Gorbatchev.
+ *
+ * @license
+ * Dual licensed under the MIT and GPL licenses.
+ */
+.syntaxhighlighter {
+ background-color: #0f192a !important;
+}
+.syntaxhighlighter .line.alt1 {
+ background-color: #0f192a !important;
+}
+.syntaxhighlighter .line.alt2 {
+ background-color: #0f192a !important;
+}
+.syntaxhighlighter .line.highlighted.alt1, .syntaxhighlighter .line.highlighted.alt2 {
+ background-color: #253e5a !important;
+}
+.syntaxhighlighter .line.highlighted.number {
+ color: #38566f !important;
+}
+.syntaxhighlighter table caption {
+ color: #d1edff !important;
+}
+.syntaxhighlighter .gutter {
+ color: #afafaf !important;
+}
+.syntaxhighlighter .gutter .line {
+ border-right: 3px solid #435a5f !important;
+}
+.syntaxhighlighter .gutter .line.highlighted {
+ background-color: #435a5f !important;
+ color: #0f192a !important;
+}
+.syntaxhighlighter.printing .line .content {
+ border: none !important;
+}
+.syntaxhighlighter.collapsed {
+ overflow: visible !important;
+}
+.syntaxhighlighter.collapsed .toolbar {
+ color: #428bdd !important;
+ background: black !important;
+ border: 1px solid #435a5f !important;
+}
+.syntaxhighlighter.collapsed .toolbar a {
+ color: #428bdd !important;
+}
+.syntaxhighlighter.collapsed .toolbar a:hover {
+ color: #1dc116 !important;
+}
+.syntaxhighlighter .toolbar {
+ color: #d1edff !important;
+ background: #435a5f !important;
+ border: none !important;
+}
+.syntaxhighlighter .toolbar a {
+ color: #d1edff !important;
+}
+.syntaxhighlighter .toolbar a:hover {
+ color: #8aa6c1 !important;
+}
+.syntaxhighlighter .plain, .syntaxhighlighter .plain a {
+ color: #d1edff !important;
+}
+.syntaxhighlighter .comments, .syntaxhighlighter .comments a {
+ color: #428bdd !important;
+}
+.syntaxhighlighter .string, .syntaxhighlighter .string a {
+ color: #1dc116 !important;
+}
+.syntaxhighlighter .keyword {
+ color: #b43d3d !important;
+}
+.syntaxhighlighter .preprocessor {
+ color: #8aa6c1 !important;
+}
+.syntaxhighlighter .variable {
+ color: #ffaa3e !important;
+}
+.syntaxhighlighter .value {
+ color: #f7e741 !important;
+}
+.syntaxhighlighter .functions {
+ color: #ffaa3e !important;
+}
+.syntaxhighlighter .constants {
+ color: #e0e8ff !important;
+}
+.syntaxhighlighter .script {
+ font-weight: bold !important;
+ color: #b43d3d !important;
+ background-color: none !important;
+}
+.syntaxhighlighter .color1, .syntaxhighlighter .color1 a {
+ color: #f8bb00 !important;
+}
+.syntaxhighlighter .color2, .syntaxhighlighter .color2 a {
+ color: white !important;
+}
+.syntaxhighlighter .color3, .syntaxhighlighter .color3 a {
+ color: #ffaa3e !important;
+}
diff --git a/upstream/clipper-6.4.2/Documentation/Scripts/SyntaxHighlighter/styles/shThemeRDark.css b/upstream/clipper-6.4.2/Documentation/Scripts/SyntaxHighlighter/styles/shThemeRDark.css
new file mode 100644
index 0000000..6305a10
--- /dev/null
+++ b/upstream/clipper-6.4.2/Documentation/Scripts/SyntaxHighlighter/styles/shThemeRDark.css
@@ -0,0 +1,113 @@
+/**
+ * SyntaxHighlighter
+ * http://alexgorbatchev.com/SyntaxHighlighter
+ *
+ * SyntaxHighlighter is donationware. If you are using it, please donate.
+ * http://alexgorbatchev.com/SyntaxHighlighter/donate.html
+ *
+ * @version
+ * 3.0.83 (July 02 2010)
+ *
+ * @copyright
+ * Copyright (C) 2004-2010 Alex Gorbatchev.
+ *
+ * @license
+ * Dual licensed under the MIT and GPL licenses.
+ */
+.syntaxhighlighter {
+ background-color: #1b2426 !important;
+}
+.syntaxhighlighter .line.alt1 {
+ background-color: #1b2426 !important;
+}
+.syntaxhighlighter .line.alt2 {
+ background-color: #1b2426 !important;
+}
+.syntaxhighlighter .line.highlighted.alt1, .syntaxhighlighter .line.highlighted.alt2 {
+ background-color: #323e41 !important;
+}
+.syntaxhighlighter .line.highlighted.number {
+ color: #b9bdb6 !important;
+}
+.syntaxhighlighter table caption {
+ color: #b9bdb6 !important;
+}
+.syntaxhighlighter .gutter {
+ color: #afafaf !important;
+}
+.syntaxhighlighter .gutter .line {
+ border-right: 3px solid #435a5f !important;
+}
+.syntaxhighlighter .gutter .line.highlighted {
+ background-color: #435a5f !important;
+ color: #1b2426 !important;
+}
+.syntaxhighlighter.printing .line .content {
+ border: none !important;
+}
+.syntaxhighlighter.collapsed {
+ overflow: visible !important;
+}
+.syntaxhighlighter.collapsed .toolbar {
+ color: #5ba1cf !important;
+ background: black !important;
+ border: 1px solid #435a5f !important;
+}
+.syntaxhighlighter.collapsed .toolbar a {
+ color: #5ba1cf !important;
+}
+.syntaxhighlighter.collapsed .toolbar a:hover {
+ color: #5ce638 !important;
+}
+.syntaxhighlighter .toolbar {
+ color: white !important;
+ background: #435a5f !important;
+ border: none !important;
+}
+.syntaxhighlighter .toolbar a {
+ color: white !important;
+}
+.syntaxhighlighter .toolbar a:hover {
+ color: #e0e8ff !important;
+}
+.syntaxhighlighter .plain, .syntaxhighlighter .plain a {
+ color: #b9bdb6 !important;
+}
+.syntaxhighlighter .comments, .syntaxhighlighter .comments a {
+ color: #878a85 !important;
+}
+.syntaxhighlighter .string, .syntaxhighlighter .string a {
+ color: #5ce638 !important;
+}
+.syntaxhighlighter .keyword {
+ color: #5ba1cf !important;
+}
+.syntaxhighlighter .preprocessor {
+ color: #435a5f !important;
+}
+.syntaxhighlighter .variable {
+ color: #ffaa3e !important;
+}
+.syntaxhighlighter .value {
+ color: #009900 !important;
+}
+.syntaxhighlighter .functions {
+ color: #ffaa3e !important;
+}
+.syntaxhighlighter .constants {
+ color: #e0e8ff !important;
+}
+.syntaxhighlighter .script {
+ font-weight: bold !important;
+ color: #5ba1cf !important;
+ background-color: none !important;
+}
+.syntaxhighlighter .color1, .syntaxhighlighter .color1 a {
+ color: #e0e8ff !important;
+}
+.syntaxhighlighter .color2, .syntaxhighlighter .color2 a {
+ color: white !important;
+}
+.syntaxhighlighter .color3, .syntaxhighlighter .color3 a {
+ color: #ffaa3e !important;
+}
diff --git a/upstream/clipper-6.4.2/Documentation/Scripts/bootstrap.js b/upstream/clipper-6.4.2/Documentation/Scripts/bootstrap.js
new file mode 100644
index 0000000..de87089
--- /dev/null
+++ b/upstream/clipper-6.4.2/Documentation/Scripts/bootstrap.js
@@ -0,0 +1,2 @@
+// This file may be used to bootstrap the DOM via JavaScript...
+SyntaxHighlighter.all();
diff --git a/upstream/clipper-6.4.2/Documentation/Scripts/expandable.js b/upstream/clipper-6.4.2/Documentation/Scripts/expandable.js
new file mode 100644
index 0000000..548fb57
--- /dev/null
+++ b/upstream/clipper-6.4.2/Documentation/Scripts/expandable.js
@@ -0,0 +1,190 @@
+/*
+ * Expandable list implementation.
+ * by David Lindquist <first name><at><last name><dot><net>
+ * See:
+ * http://www.gazingus.org/html/DOM-Scripted_Lists_Revisited.html
+ * Modifies lists so that sublists can be hidden and shown by means of
+ * a switch. The switch is a node inserted into the DOM tree as the
+ * first child of the list item containing the sublist.
+ */
+
+// The script will only be applied to lists containing this class name,
+// e.g.: <ul class="foo expandable">...</ul>.
+var CLASS_NAME = "expandable";
+
+// This value is the assumed initial display style for a sublist when it cannot
+// be determined by other means. See below.
+var DEFAULT_DISPLAY = "none";
+
+// The namespace to use when using this script in an XML context.
+var XMLNS = "http://www.w3.org/1999/xhtml";
+
+// The beginning of the title text for the switch when the sublist is collapsed.
+var CLOSED_PREFIX = "Expand list: ";
+
+// The beginning of the title text for the switch when the sublist is expanded.
+var OPENED_PREFIX = "Collapse list: ";
+
+/******************************************************************************/
+
+// Returns a copy of a string with leading and trailing whitespace removed.
+String.prototype.trim = function() {
+ return this.replace(/^\s+/, "").replace(/\s+$/, "");
+}
+
+// Walks the DOM tree starting at a given root element. Returns an
+// array of nodes of the specified type and conforming to the criteria
+// of the given filter function. The filter should return a boolean.
+function getNodesByType(root, type, filter) {
+ var node = root;
+ var nodes = [];
+ var next;
+
+ while (node != null) {
+ if (node.hasChildNodes())
+ node = node.firstChild;
+ else if (node != root && null != (next = node.nextSibling))
+ node = next;
+ else {
+ next = null;
+ for ( ; node != root; node = node.parentNode) {
+ next = node.nextSibling;
+ if (next != null) break;
+ }
+ node = next;
+ }
+ if (node != null && node.nodeType == type && filter(node))
+ nodes.push(node);
+ }
+ return nodes;
+}
+
+// Simulates the innerText property of IE and other browsers.
+// Mozilla/Firefox need this.
+function getInnerText(node) {
+ if (node == null || node.nodeType != 1)
+ return;
+ var text = "";
+ var textnodes = getNodesByType(node, 3, function() { return true; });
+ for (var i = 0; i < textnodes.length; i++)
+ text += textnodes[i].data;
+ return text;
+}
+
+function initExpandableLists() {
+ if (!document.getElementsByTagName) return;
+
+ // Top-level function to accommodate browsers that do not register
+ // a click event when a link is activated by the keyboard.
+ switchNode = function(id) {
+ var node = document.getElementById(id);
+ if (node && /^switch /.test(node.className)) node.onclick();
+ }
+
+ // Top-level function to be assigned as the event handler for the
+ // switch. This could have been bound to the handler as a closure,
+ // but closures are associated with memory leak problems in IE.
+ actuate = function() {
+ var sublist = this.parentNode.getElementsByTagName("ul")[0] ||
+ this.parentNode.getElementsByTagName("ol")[0];
+ if (sublist.style.display == "block") {
+ sublist.style.display = "none";
+ this.firstChild.data = "+";
+ this.className = "switch off";
+ this.title = this.title.replace(OPENED_PREFIX, CLOSED_PREFIX);
+ } else {
+ sublist.style.display = "block";
+ this.firstChild.data = "-";
+ this.className = "switch on";
+ this.title = this.title.replace(CLOSED_PREFIX, OPENED_PREFIX);
+ }
+ return false;
+ }
+
+ // Create switch node from which the others will be cloned.
+ if (typeof document.createElementNS == "function")
+ var template = document.createElementNS(XMLNS, "a");
+ else
+ var template = document.createElement("a");
+ template.appendChild(document.createTextNode(" "));
+
+ var list, i = 0, j = 0;
+ var pattern = new RegExp("(^| )" + CLASS_NAME + "( |$)");
+
+ while ((list = document.getElementsByTagName("ul")[i++]) ||
+ (list = document.getElementsByTagName("ol")[j++]))
+ {
+ // Only lists with the given class name are processed.
+ if (pattern.test(list.className) == false) continue;
+
+ var item, k = 0;
+ while ((item = list.getElementsByTagName("li")[k++])) {
+ var sublist = item.getElementsByTagName("ul")[0] ||
+ item.getElementsByTagName("ol")[0];
+ // No sublist under this list item. Skip it.
+ if (sublist == null) continue;
+
+ // Attempt to determine initial display style of the
+ // sublist so the proper symbol is used.
+ var symbol;
+ switch (sublist.style.display) {
+ case "none" : symbol = "+"; break;
+ case "block": symbol = "-"; break;
+ default:
+ var display = DEFAULT_DISPLAY;
+ if (sublist.currentStyle) {
+ display = sublist.currentStyle.display;
+ } else if (document.defaultView &&
+ document.defaultView.getComputedStyle &&
+ document.defaultView.getComputedStyle(sublist, ""))
+ {
+ var view = document.defaultView;
+ var computed = view.getComputedStyle(sublist, "");
+ display = computed.getPropertyValue("display");
+ }
+ symbol = (display == "none") ? "+" : "-";
+ // Explicitly set the display style to make sure it is
+ // set for the next read. If it is somehow the empty
+ // string, use the default value from the (X)HTML DTD.
+ sublist.style.display = display || "block";
+ break;
+ }
+
+ // This bit attempts to extract some text from the first
+ // child node of the list item to append to the title
+ // attribute of the switch.
+ var child = item.firstChild;
+ var text = "";
+ while (child) {
+ if (child.nodeType == 3 && "" != child.data.trim()) {
+ text = child.data;
+ break;
+ } else if (child.nodeType == 1 &&
+ !/^[ou]l$/i.test(child.tagName))
+ {
+ text = child.innerText || getInnerText(child);
+ break;
+ }
+ child = child.nextSibling;
+ }
+
+ var actuator = template.cloneNode(true);
+ // a reasonably unique ID
+ var uid = "switch" + i + "-" + j + "-" + k;
+ actuator.id = uid;
+ actuator.href = "javascript:switchNode('" + uid + "')";
+ actuator.className = "switch " + ((symbol == "+") ? "off" : "on");
+ actuator.title = ((symbol == "+")
+ ? CLOSED_PREFIX : OPENED_PREFIX) + text.trim();
+ actuator.firstChild.data = symbol;
+ actuator.onclick = actuate;
+ item.insertBefore(actuator, item.firstChild);
+ }
+ }
+}
+
+// Props to Simon Willison:
+// http://simon.incutio.com/archive/2004/05/26/addLoadEvent
+var oldhandler = window.onload;
+window.onload = (typeof oldhandler == "function")
+ ? function() { oldhandler(); initExpandableLists(); } : initExpandableLists;
diff --git a/upstream/clipper-6.4.2/Documentation/Scripts/menu_data.js b/upstream/clipper-6.4.2/Documentation/Scripts/menu_data.js
new file mode 100644
index 0000000..7d8f52f
--- /dev/null
+++ b/upstream/clipper-6.4.2/Documentation/Scripts/menu_data.js
@@ -0,0 +1,21 @@
+td_1 = "Overview"
+td_1_1 = "Library Overview"
+url_1_1 = "Overview/_Body.htm"
+td_1_2 = "Changes"
+url_1_2 = "Overview/Changes.htm"
+td_1_3 = "Example"
+url_1_3 = "Overview/Example.htm"
+td_1_4 = "FAQ"
+url_1_4 = "Overview/FAQ.htm"
+td_1_5 = "Rounding"
+url_1_5 = "Overview/Rounding.htm"
+td_1_6 = "Deprecated"
+url_1_6 = "Overview/Deprecated.htm"
+td_1_7 = "License"
+url_1_7 = "Overview/License.htm"
+
+td_2 = "Internet"
+td_2_1 = "Clipper at SourceForge"
+url_2_1 = "%http://sourceforge.net/projects/polyclipping/"
+td_2_2 = "Clipper at angusj.com"
+url_2_2 = "%http://www.angusj.com/delphi/clipper.php"
diff --git a/upstream/clipper-6.4.2/Documentation/Scripts/menu_script.js b/upstream/clipper-6.4.2/Documentation/Scripts/menu_script.js
new file mode 100644
index 0000000..3185ebe
--- /dev/null
+++ b/upstream/clipper-6.4.2/Documentation/Scripts/menu_script.js
@@ -0,0 +1,130 @@
+
+////////////////////Please leave this notice////////////////////
+//
+// DropDown Menu 1.0
+// By Evgeny Novikov (java@aladin.ru)
+// http://java.skyteam.ru
+// It works only with IE5.0(++) and Netscape6.0(++)
+// Free to use!
+//
+////////////////////Last modified 2002-03-05////////////////////
+
+// Modify following four lines to customize your menu
+var tdColor = "#FFFFFF"; // menu item text color
+var tdBgColor = "#6060A0"; // menu item background color
+var hlColor = "#000000"; // highlight text color
+var hlBgColor = "#9595BD"; // highlight background color
+// After change, modify same values in your *.css file
+
+var md = 250;
+var ti = -1;
+var oTd = new Object;
+oTd = null;
+
+function doMenu(td) {
+ clearTimeout(ti);
+ td.style.backgroundColor = hlBgColor;
+ td.style.color = hlColor;
+ var i;
+ var sT = "";
+ var tda = new Array();
+ tda = td.id.split("_");
+ if (oTd != null) {
+ var tdo = new Array();
+ tdo = oTd.id.split("_");
+ for (i = 1; i < tdo.length; i++) {
+ sT += "_" + tdo[i];
+ if (tdo[i] != tda[i]) {
+ document.getElementById("td" + sT).style.backgroundColor = tdBgColor;
+ document.getElementById("td" + sT).style.color = tdColor;
+ if (document.getElementById("tbl" + sT) != null)
+ document.getElementById("tbl" + sT).style.visibility = "hidden";
+ }
+ }
+ }
+ oTd = td;
+ sT = "tbl";
+ for (i = 1; i < tda.length; i++)
+ sT += "_" + tda[i];
+ if (document.getElementById(sT) != null)
+ document.getElementById(sT).style.visibility = "visible";
+
+}
+
+function clearMenu() {
+ if (oTd != null) {
+ var tdo = new Array();
+ tdo = oTd.id.split("_");
+ var sT = "";
+ for (var i = 1; i < tdo.length; i++) {
+ sT += "_" + tdo[i];
+ document.getElementById("td" + sT).style.backgroundColor = tdBgColor;
+ document.getElementById("td" + sT).style.color = tdColor;
+ if (document.getElementById("tbl" + sT) != null)
+ document.getElementById("tbl" + sT).style.visibility = "hidden";
+ }
+ oTd = null;
+ }
+}
+
+function runMenu(strURL) {
+ if (strURL.charAt(0) == '%')
+ window.open(strURL.substr(1));
+ else
+ location.href = strURL;
+}
+
+var tt = "";
+var sT = "";
+var pT = new Array();
+var tA = new Array();
+
+function getCoord(st) {
+ tA = st.split("_");
+ if (tA.length > 2) {
+ tA = tA.slice(0,-1);
+ tt = tA.join("_");
+ return (document.getElementById("tbl" + tt).offsetTop + document.getElementById("td" + st).offsetTop - 1) + "px;left:" +
+ (document.getElementById("tbl" + tt).offsetLeft + document.getElementById("td" + st).offsetWidth - 2) + "px\">";
+ }
+ return (document.getElementById("mainmenu").offsetTop + document.getElementById("td" + st).offsetHeight - 10) + "px;left:" +
+ (document.getElementById("mainmenu").offsetLeft + document.getElementById("td" + st).offsetLeft + 5) + "px\">";
+}
+
+function isDefined(varname) {
+ return eval("typeof(" + varname + ") != \"undefined\"");
+}
+
+var sH = "<table class=\"menu\" id=\"mainmenu\" cellspacing=\"0\" width=\"100%\"><tr>";
+var p = 0;
+var j = 0;
+
+while (isDefined("td_" + ++j)) {
+ sH += "<td id=\"td_" + j + "\" onmouseover=\"doMenu(this)\" onmouseout=\"ti=setTimeout('clearMenu()',md)\"";
+ sH += (isDefined("url_" + j)) ? " onclick=\"runMenu('" + eval("url_" + j) + "')\">" : ">";
+ sH += eval("td_" + j) + "</td>";
+ if (isDefined("td_" + j + "_1"))
+ pT[p++] = "_" + j;
+}
+
+sH += "<td class=\"Banner\" align=\"right\" width=\"100%\"><img src=\"../Images/_Project_Logo.gif\" align=\"absmiddle\"></td>";
+sH += "</tr></table>";
+document.write(sH);
+
+for (var q = 0; typeof(pT[q]) != "undefined"; q++) {
+ sT = pT[q];
+ sH = "";
+ j = 0;
+ sH += "<table class=\"menudrop\" id=\"tbl" + sT + "\" cellspacing=\"0\" style=\"top:" + getCoord(sT);
+ while (isDefined("td" + sT + "_" + ++j)) {
+ sH += "<tr><td id=\"td" + sT + "_" + j + "\" onmouseover=\"doMenu(this)\" onmouseout=\"ti=setTimeout('clearMenu()',md)\"";
+ sH += (isDefined("url" + sT + "_" + j)) ? " onclick=\"runMenu('" + eval("url" + sT + "_" + j) + "')\">" : ">";
+ sH += eval("td" + sT + "_" + j) + "</td></tr>";
+ if (isDefined("td" + sT + "_" + j + "_1"))
+ pT[p++] = sT + "_" + j;
+ }
+ sH += "</table>";
+ document.write(sH);
+}
+document.getElementById("mainmenu").style.visibility = "visible";
+
diff --git a/upstream/clipper-6.4.2/Documentation/Styles/default.css b/upstream/clipper-6.4.2/Documentation/Styles/default.css
new file mode 100644
index 0000000..12dbde6
--- /dev/null
+++ b/upstream/clipper-6.4.2/Documentation/Styles/default.css
@@ -0,0 +1,304 @@
+p.Body {
+ margin-left: 1cm;
+ margin-right: 0.5cm;
+}
+
+p.Hierarchy {
+ margin-top: 0;
+ margin-left : 1cm;
+ margin-bottom : 0;
+ font-size : 90%;
+}
+
+.EmptyRef {
+ font-weight: bold;
+}
+
+.API {
+ color: #700070;
+ font-style: italic;
+}
+
+.Code {
+ margin-left: 1cm;
+ margin-right: 1cm;
+ margin-top: 0px;
+ margin-bottom: 0px;
+}
+
+p.Decl {
+ font-family: "Courier New", Courier, monospace;
+ background-color: #E0E0E0;
+ padding-top: 3pt;
+ padding-right: 4pt;
+ padding-left: 6pt;
+ padding-bottom: 3pt;
+ margin-left: 1cm;
+ margin-top: 0px;
+ margin-right: 0.5cm;
+ margin-bottom: 0px;
+}
+
+p.Decl2 {
+ font-family: "Courier New", Courier, monospace;
+ background-color: #99FF99;
+ padding-top: 3pt;
+ padding-right: 4pt;
+ padding-left: 6pt;
+ padding-bottom: 3pt;
+ margin-left: 1cm;
+ margin-top: 0px;
+ margin-right: 0.5cm;
+ margin-bottom: 0px;
+ font-size : 100%;
+}
+
+p.Decl3 {
+ font-family: "Courier New", Courier, monospace;
+ background-color: #FFBBCC;
+ padding-top: 3pt;
+ padding-right: 4pt;
+ padding-left: 6pt;
+ padding-bottom: 3pt;
+ margin-left: 1cm;
+ margin-top: 0px;
+ margin-right: 0.5cm;
+ margin-bottom: 0px;
+ font-size : 100%;
+}
+
+p.Decl4 {
+ font-family: Verdana, Tahoma, serif;
+ padding-top: 3pt;
+ padding-right: 4pt;
+ padding-left: 6pt;
+ padding-bottom: 3pt;
+ margin-left: 1cm;
+ margin-top: 0px;
+ margin-right: 0.5cm;
+ margin-bottom: 0px;
+}
+
+p.Decl5 {
+ font-family: Verdana, Tahoma, serif;
+ background-color: #99FF99;
+ padding-top: 3pt;
+ padding-right: 4pt;
+ padding-left: 6pt;
+ padding-bottom: 3pt;
+ margin-left: 1cm;
+ margin-top: 0px;
+ margin-right: 0.5cm;
+ margin-bottom: 0px;
+ font-size : 100%;
+}
+
+body {
+ font-family: Verdana, Tahoma, serif;
+ font-size: 80%;
+ margin-left : 2px;
+ margin-top: 2px;
+ margin-right : 2px;
+ margin-top : 2px;
+}
+
+p {
+ margin-top: 5pt;
+ margin-bottom: 5pt;
+}
+
+h1 {
+ font-size: 150%;
+ margin-top: 5pt;
+ margin-bottom: 16pt;
+ margin-left : 0.25cm;
+}
+
+h2 {
+ font-size: 100%;
+ margin-bottom: 4pt;
+ margin-top: 16px;
+ margin-left: 0.25cm;
+ padding-left: 0px;
+}
+
+table {
+ border: none;
+ margin-left: 1cm;
+ border-color: #FFFFFF;
+ margin-right: 0.5cm;
+}
+
+th {
+ font-family: Verdana, Arial, Helvetica, sans-serif;
+ font-size: 80%;
+ background-color: #99FF99;
+ padding-right: 6pt;
+ padding-left: 6pt;
+}
+
+td {
+ font-family: Verdana, Arial, Helvetica, sans-serif;
+ font-size: 80%;
+ background-color: #F0F0F0;
+ padding-left: 5px;
+ padding-right: 5px;
+}
+
+td.White {
+ font-family: Verdana, Arial, Helvetica, sans-serif;
+ font-size: 80%;
+ background-color: #FFFFFF;
+ padding-right: 4pt;
+ padding-left: 4pt;
+}
+
+table.Banner {
+ color: white;
+ font-size: 9pt;
+ background-color: #9595bd;
+ margin: 1px;
+ padding: 1px, 10px;
+ width: 100%;
+ cellpadding: 0;
+ cellspacing: 0;
+}
+
+td.Banner {
+ background-color: #6060A0;
+ font-size: 9pt;
+ margin: 1px;
+ padding: 1px 10px;
+}
+a:link { color: blue; text-decoration: none }
+a:visited { color: blue; text-decoration: none }
+a:hover { color: black; text-decoration: none; background-color: #d0d0ff }
+table.Home {
+ background-color: #FFFFFF;
+ border: #FFFFFF none;
+ margin: 1px;
+ padding: 0px;
+ border-color: #FFFFFF;
+ /*width: 100%;*/
+}
+table.menu { color: white; background-color: #6060a0; visibility: hidden; cursor: pointer; margin: 1px; padding: 1px 10px; position: static; border: 1px solid; border-color: #272758 #656596 #272758 #272758 }
+table.menudrop { color: white; background-color: #6060a0; visibility: hidden; cursor: pointer; margin: 10px; padding: 5px 10px; position: absolute; border-left: 1px solid #444475 }
+table.menu td { font-size: 8pt; background-color: #6060a0; white-space: nowrap; margin: 1px; padding: 1px 10px; border: #FFFFFF none; }
+table.menudrop td { font-size: 8pt; background-color: #6060a0; white-space: nowrap; margin: 1px; padding: 5px 10px; border: #FFFFFF none; }
+td.Home {
+ background-color: #FFFFFF;
+ padding: 1px 0px;
+ margin: 1px;
+}
+a:link.Banner {
+ text-decoration: none;
+ color: white;
+}
+
+a:visited.Banner {
+ text-decoration: none;
+ color : white;
+}
+
+a:hover.Banner {
+ background-color: #6060A0;
+ text-decoration: none;
+ color: white;
+}
+
+a.Bold {
+ font-weight: bold;
+}
+
+ul li {
+ list-style-position: inside;
+ list-style-type: square;
+ margin-top: 3pt;
+ margin-bottom: 3pt;
+}
+
+ol li {
+ list-style-position: outside;
+ list-style-type: decimal;
+ margin-top: 3pt;
+ margin-bottom: 3pt;
+ margin-left: 0.7cm;
+ padding-left: 2pt;
+}
+
+ul {
+ margin-left: 1cm;
+ margin-top: 8pt;
+ margin-bottom: 8pt;
+}
+
+ol {
+ margin-left: 1cm;
+ margin-top: 8pt;
+ margin-bottom: 8pt;
+}
+
+.Comment {
+ font-style: italic;
+ color: #206020;
+}
+
+.CPPNumeric {
+ color: blue;
+}
+
+.CSharp {
+ color: #2B91AF;
+}
+
+img {
+ margin-top: 0px;
+ margin-right: 0px;
+ margin-bottom: 0px;
+ margin-left: 0px;
+ border-top-width: 0px;
+ border-right-width: 0px;
+ border-bottom-width: 0px;
+ border-left-width: 0px;
+ padding-top: 0px;
+ padding-right: 0px;
+ padding-bottom: 0px;
+ padding-left: 0px;
+}
+
+span.sub {
+ font-size: 80%;
+ vertical-align: sub;
+}
+
+.Tree {
+ margin-top: 0px;
+ margin-bottom: 0px;
+ margin-left: 1cm;
+ padding-left: 5px;
+ padding-right: 5px;
+ padding-top: 0px;
+ padding-bottom: 0px;
+ background-color: #F0F0F0;
+}
+
+span.Menu {
+ font-weight: bold;
+ color: #402000
+}
+
+p.Copyright {font-size: 7pt; color: #808090; text-align: center; font-family: Tahoma, Arial, sans-serif}
+
+.pascalcode {
+ margin-left: 1cm;
+ font-family: "Courier New", Courier, mono;
+}
+#mainmenu { position: static }
+
+.maroon {color: #990000;}
+
+.gray { color: #C0C0C0;}
+
+sup {
+ vertical-align: top; font-size: 0.75em;
+} \ No newline at end of file
diff --git a/upstream/clipper-6.4.2/Documentation/clipper.chm b/upstream/clipper-6.4.2/Documentation/clipper.chm
new file mode 100644
index 0000000..512fae6
--- /dev/null
+++ b/upstream/clipper-6.4.2/Documentation/clipper.chm
Binary files differ
diff --git a/upstream/clipper-6.4.2/Documentation/default.css b/upstream/clipper-6.4.2/Documentation/default.css
new file mode 100644
index 0000000..12dbde6
--- /dev/null
+++ b/upstream/clipper-6.4.2/Documentation/default.css
@@ -0,0 +1,304 @@
+p.Body {
+ margin-left: 1cm;
+ margin-right: 0.5cm;
+}
+
+p.Hierarchy {
+ margin-top: 0;
+ margin-left : 1cm;
+ margin-bottom : 0;
+ font-size : 90%;
+}
+
+.EmptyRef {
+ font-weight: bold;
+}
+
+.API {
+ color: #700070;
+ font-style: italic;
+}
+
+.Code {
+ margin-left: 1cm;
+ margin-right: 1cm;
+ margin-top: 0px;
+ margin-bottom: 0px;
+}
+
+p.Decl {
+ font-family: "Courier New", Courier, monospace;
+ background-color: #E0E0E0;
+ padding-top: 3pt;
+ padding-right: 4pt;
+ padding-left: 6pt;
+ padding-bottom: 3pt;
+ margin-left: 1cm;
+ margin-top: 0px;
+ margin-right: 0.5cm;
+ margin-bottom: 0px;
+}
+
+p.Decl2 {
+ font-family: "Courier New", Courier, monospace;
+ background-color: #99FF99;
+ padding-top: 3pt;
+ padding-right: 4pt;
+ padding-left: 6pt;
+ padding-bottom: 3pt;
+ margin-left: 1cm;
+ margin-top: 0px;
+ margin-right: 0.5cm;
+ margin-bottom: 0px;
+ font-size : 100%;
+}
+
+p.Decl3 {
+ font-family: "Courier New", Courier, monospace;
+ background-color: #FFBBCC;
+ padding-top: 3pt;
+ padding-right: 4pt;
+ padding-left: 6pt;
+ padding-bottom: 3pt;
+ margin-left: 1cm;
+ margin-top: 0px;
+ margin-right: 0.5cm;
+ margin-bottom: 0px;
+ font-size : 100%;
+}
+
+p.Decl4 {
+ font-family: Verdana, Tahoma, serif;
+ padding-top: 3pt;
+ padding-right: 4pt;
+ padding-left: 6pt;
+ padding-bottom: 3pt;
+ margin-left: 1cm;
+ margin-top: 0px;
+ margin-right: 0.5cm;
+ margin-bottom: 0px;
+}
+
+p.Decl5 {
+ font-family: Verdana, Tahoma, serif;
+ background-color: #99FF99;
+ padding-top: 3pt;
+ padding-right: 4pt;
+ padding-left: 6pt;
+ padding-bottom: 3pt;
+ margin-left: 1cm;
+ margin-top: 0px;
+ margin-right: 0.5cm;
+ margin-bottom: 0px;
+ font-size : 100%;
+}
+
+body {
+ font-family: Verdana, Tahoma, serif;
+ font-size: 80%;
+ margin-left : 2px;
+ margin-top: 2px;
+ margin-right : 2px;
+ margin-top : 2px;
+}
+
+p {
+ margin-top: 5pt;
+ margin-bottom: 5pt;
+}
+
+h1 {
+ font-size: 150%;
+ margin-top: 5pt;
+ margin-bottom: 16pt;
+ margin-left : 0.25cm;
+}
+
+h2 {
+ font-size: 100%;
+ margin-bottom: 4pt;
+ margin-top: 16px;
+ margin-left: 0.25cm;
+ padding-left: 0px;
+}
+
+table {
+ border: none;
+ margin-left: 1cm;
+ border-color: #FFFFFF;
+ margin-right: 0.5cm;
+}
+
+th {
+ font-family: Verdana, Arial, Helvetica, sans-serif;
+ font-size: 80%;
+ background-color: #99FF99;
+ padding-right: 6pt;
+ padding-left: 6pt;
+}
+
+td {
+ font-family: Verdana, Arial, Helvetica, sans-serif;
+ font-size: 80%;
+ background-color: #F0F0F0;
+ padding-left: 5px;
+ padding-right: 5px;
+}
+
+td.White {
+ font-family: Verdana, Arial, Helvetica, sans-serif;
+ font-size: 80%;
+ background-color: #FFFFFF;
+ padding-right: 4pt;
+ padding-left: 4pt;
+}
+
+table.Banner {
+ color: white;
+ font-size: 9pt;
+ background-color: #9595bd;
+ margin: 1px;
+ padding: 1px, 10px;
+ width: 100%;
+ cellpadding: 0;
+ cellspacing: 0;
+}
+
+td.Banner {
+ background-color: #6060A0;
+ font-size: 9pt;
+ margin: 1px;
+ padding: 1px 10px;
+}
+a:link { color: blue; text-decoration: none }
+a:visited { color: blue; text-decoration: none }
+a:hover { color: black; text-decoration: none; background-color: #d0d0ff }
+table.Home {
+ background-color: #FFFFFF;
+ border: #FFFFFF none;
+ margin: 1px;
+ padding: 0px;
+ border-color: #FFFFFF;
+ /*width: 100%;*/
+}
+table.menu { color: white; background-color: #6060a0; visibility: hidden; cursor: pointer; margin: 1px; padding: 1px 10px; position: static; border: 1px solid; border-color: #272758 #656596 #272758 #272758 }
+table.menudrop { color: white; background-color: #6060a0; visibility: hidden; cursor: pointer; margin: 10px; padding: 5px 10px; position: absolute; border-left: 1px solid #444475 }
+table.menu td { font-size: 8pt; background-color: #6060a0; white-space: nowrap; margin: 1px; padding: 1px 10px; border: #FFFFFF none; }
+table.menudrop td { font-size: 8pt; background-color: #6060a0; white-space: nowrap; margin: 1px; padding: 5px 10px; border: #FFFFFF none; }
+td.Home {
+ background-color: #FFFFFF;
+ padding: 1px 0px;
+ margin: 1px;
+}
+a:link.Banner {
+ text-decoration: none;
+ color: white;
+}
+
+a:visited.Banner {
+ text-decoration: none;
+ color : white;
+}
+
+a:hover.Banner {
+ background-color: #6060A0;
+ text-decoration: none;
+ color: white;
+}
+
+a.Bold {
+ font-weight: bold;
+}
+
+ul li {
+ list-style-position: inside;
+ list-style-type: square;
+ margin-top: 3pt;
+ margin-bottom: 3pt;
+}
+
+ol li {
+ list-style-position: outside;
+ list-style-type: decimal;
+ margin-top: 3pt;
+ margin-bottom: 3pt;
+ margin-left: 0.7cm;
+ padding-left: 2pt;
+}
+
+ul {
+ margin-left: 1cm;
+ margin-top: 8pt;
+ margin-bottom: 8pt;
+}
+
+ol {
+ margin-left: 1cm;
+ margin-top: 8pt;
+ margin-bottom: 8pt;
+}
+
+.Comment {
+ font-style: italic;
+ color: #206020;
+}
+
+.CPPNumeric {
+ color: blue;
+}
+
+.CSharp {
+ color: #2B91AF;
+}
+
+img {
+ margin-top: 0px;
+ margin-right: 0px;
+ margin-bottom: 0px;
+ margin-left: 0px;
+ border-top-width: 0px;
+ border-right-width: 0px;
+ border-bottom-width: 0px;
+ border-left-width: 0px;
+ padding-top: 0px;
+ padding-right: 0px;
+ padding-bottom: 0px;
+ padding-left: 0px;
+}
+
+span.sub {
+ font-size: 80%;
+ vertical-align: sub;
+}
+
+.Tree {
+ margin-top: 0px;
+ margin-bottom: 0px;
+ margin-left: 1cm;
+ padding-left: 5px;
+ padding-right: 5px;
+ padding-top: 0px;
+ padding-bottom: 0px;
+ background-color: #F0F0F0;
+}
+
+span.Menu {
+ font-weight: bold;
+ color: #402000
+}
+
+p.Copyright {font-size: 7pt; color: #808090; text-align: center; font-family: Tahoma, Arial, sans-serif}
+
+.pascalcode {
+ margin-left: 1cm;
+ font-family: "Courier New", Courier, mono;
+}
+#mainmenu { position: static }
+
+.maroon {color: #990000;}
+
+.gray { color: #C0C0C0;}
+
+sup {
+ vertical-align: top; font-size: 0.75em;
+} \ No newline at end of file
diff --git a/upstream/clipper-6.4.2/Documentation/index.htm b/upstream/clipper-6.4.2/Documentation/index.htm
new file mode 100644
index 0000000..06e4946
--- /dev/null
+++ b/upstream/clipper-6.4.2/Documentation/index.htm
@@ -0,0 +1,12 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
+"http://www.w3.org/TR/html4/loose.dtd">
+<html>
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
+<meta http-equiv="refresh" content="0;URL=Docs/Overview/_Body.htm">
+<title>Redirect</title>
+</head>
+<body>
+If the documentation doesn't open automatically, click <a href="Docs/Overview/_Body.htm">here</a>.
+</body>
+</html>
diff --git a/upstream/clipper-6.4.2/Documentation/offset_triginometry.svg b/upstream/clipper-6.4.2/Documentation/offset_triginometry.svg
new file mode 100644
index 0000000..67e8bd3
--- /dev/null
+++ b/upstream/clipper-6.4.2/Documentation/offset_triginometry.svg
@@ -0,0 +1,42 @@
+<svg xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns="http://www.w3.org/2000/svg" height="600" width="800" version="1.1" xmlns:cc="http://creativecommons.org/ns#" xmlns:dc="http://purl.org/dc/elements/1.1/">
+ <g transform="translate(0,-452.4)">
+ <g stroke="#000" fill="none">
+ <path style="color:#000000" stroke-width="1.961" stroke-dasharray="3.9224, 3.9224" d="m193.9 735.7-26.4 46.4c7.4 4.6 16.2 7.3 25.6 7.3 10.4 0 20.2-3.3 28.1-8.9l-27.3-44.8z"/>
+ <path style="color:#000000" stroke-width="1.8" stroke-dasharray="3.6, 3.6" d="m194.5 733.4 57.2-98.9"/>
+ <path style="color:#000000" stroke-width="1.8" d="m10.81 854.2 183.3-314.5 190.3 308.5"/>
+ </g>
+ <g stroke="#000" fill="#0f0">
+ <g stroke-width="2.138">
+ <path style="color:#000000" d="m194.2 635.6 15 21.2h-10v56.4h10l-15 21.2-15-21.2h10v-56.4h-10z"/>
+ <path style="color:#000000" d="m77.71 740.9 25.79 2.7-6.59 7.5 42.49 37.2 6.6-7.5 6 25.3-25.8-2.7 6.6-7.5-42.49-37.3-6.6 7.5z"/>
+ <path style="color:#000000" d="m194.2 635.6 15 21.2h-10v56.4h10l-15 21.2-15-21.2h10v-56.4h-10z"/>
+ <path style="color:#000000" d="m194.2 635.6 15 21.2h-10v56.4h10l-15 21.2-15-21.2h10v-56.4h-10z"/>
+ <path style="color:#000000" d="m194.2 635.6 15 21.2h-10v56.4h10l-15 21.2-15-21.2h10v-56.4h-10z"/>
+ </g>
+ <path style="color:#000000" d="m138.4 633.3h110" fill-rule="evenodd" stroke-dasharray="7.2, 7.2" stroke-width="1.8"/>
+ </g>
+ <text style="letter-spacing:0px;block-progression:tb;text-indent:0;word-spacing:0px;color:#000000;text-transform:none" xml:space="preserve" font-size="20px" line-height="125%" y="543.2041" x="216.81096" font-family="Tahoma" fill="#000000"><tspan y="543.2041" x="216.81096" font-weight="bold">ß</tspan></text>
+ <path style="color:#000000" d="m195.2 737.7 88-52.5" stroke="#000" stroke-dasharray="7.2, 7.2" stroke-width="1.8" fill="none"/>
+ <path style="color:#000000" d="m272.9 633.2 20.5 2.7-8.1 5.9 22.2 30.7-8.2 5.8-22.2-30.7-8.1 5.9z" stroke="#000" stroke-width="1.752" fill="#ff0"/>
+ <g font-family="Tahoma">
+ <g font-size="10px">
+ <text style="letter-spacing:0px;block-progression:tb;text-indent:0;word-spacing:0px;color:#000000;text-transform:none" xml:space="preserve" line-height="125%" y="756.90411" x="110.61097"><tspan y="756.90411" x="110.61097" font-size="14px">delta</tspan></text>
+ <text style="letter-spacing:0px;block-progression:tb;text-indent:0;word-spacing:0px;color:#000000;text-transform:none" xml:space="preserve" line-height="125%" y="687.75928" x="153.25862"><tspan y="687.75928" x="153.25862" font-size="14px">delta</tspan></text>
+ <text style="letter-spacing:0px;block-progression:tb;text-indent:0;word-spacing:0px;color:#000000;text-transform:none" xml:space="preserve" line-height="125%" y="687.40411" x="288.61096"><tspan y="687.40411" x="288.61096" font-size="14px">c</tspan></text>
+ <text style="letter-spacing:0px;block-progression:tb;text-indent:0;word-spacing:0px;color:#000000;text-transform:none" xml:space="preserve" line-height="125%" y="633.0722" x="255.56584"><tspan y="633.0722" x="255.56584" font-size="14px">d</tspan></text>
+ <text style="letter-spacing:0px;block-progression:tb;text-indent:0;word-spacing:0px;color:#000000;text-transform:none" xml:space="preserve" line-height="125%" y="738.10455" x="180.68153"><tspan y="738.10455" x="180.68153" font-size="14px">a</tspan></text>
+ <text style="letter-spacing:0px;block-progression:tb;text-indent:0;word-spacing:0px;color:#000000;text-transform:none" xml:space="preserve" line-height="125%" y="628.76648" x="190.6815"><tspan y="628.76648" x="190.6815" font-size="14px">b</tspan></text>
+ <text style="letter-spacing:0px;block-progression:tb;text-indent:0;word-spacing:0px;color:#000000;text-transform:none" xml:space="preserve" line-height="125%" y="534.92474" x="186.17192"><tspan y="534.92474" x="186.17192" font-size="14px">e</tspan></text>
+ </g>
+ <text style="letter-spacing:0px;block-progression:tb;text-indent:0;word-spacing:0px;color:#000000;text-transform:none" xml:space="preserve" font-size="14px" line-height="125%" y="491.55411" x="434.41095"><tspan y="491.55411" x="434.41095">To square a join at exactly delta offset, such</tspan><tspan y="509.05411" x="434.41095">that (b) is delta distance from (a), and given</tspan><tspan y="526.55414" x="434.41095">that (c) is a perpendicular offset of (a) which</tspan><tspan y="544.05414" x="434.41095">is easily derived ... we need to calculate the</tspan><tspan y="561.55414" x="434.41095">distance (d) is from (c).</tspan><tspan y="579.05414" x="434.41095">Ø = pi - ß</tspan><tspan y="596.55408" x="434.41095">angle(bed) = Ø/2</tspan><tspan y="614.05408" x="434.41095">angle(bde) = pi/2 - Ø/2</tspan><tspan y="631.55408" x="434.41095">since trig. function ... cos = adjacent / hypot. </tspan><tspan y="649.05408" x="434.41095">cos(dac) = delta/length(ad), and ...</tspan><tspan y="666.55408" x="434.41095">cos(bad) = delta/length(ad)</tspan><tspan y="684.05408" x="434.41095">then angle(bda) = angle(cda)</tspan><tspan y="701.55408" x="434.41095">angle(bdc) = pi - (pi/2 - Ø/2) = pi/2 + Ø/2</tspan><tspan y="719.05408" x="434.41095">angle(adc) = pi/4 + Ø/4</tspan><tspan y="736.55408" x="434.41095">angle(dac) = pi/2 - (pi/4 + Ø/4) = pi/4 - Ø/4</tspan><tspan y="754.05408" x="434.41095">tan(dac) = tan(pi/4 - Ø/4) = length(cd)/delta</tspan><tspan y="771.55408" x="434.41095">length(cd) = delta * tan((pi - Ø)/4)</tspan><tspan y="789.05408" x="434.41095">since ... pi - Ø = ß ...</tspan><tspan y="797.00244" x="434.41095" font-size="4px" font-weight="bold"> </tspan><tspan y="811.55408" x="434.41095" font-weight="bold">length(cd) = delta * tan(ß/4)</tspan></text>
+ </g>
+ <path style="color:#000000" d="m272.4 667.3-17.1 10.3 10.3 17.1" stroke="#000" stroke-dasharray="3.6, 3.6" stroke-width="1.8" fill="none"/>
+ <g transform="translate(-9.589,458.9)" stroke="#000" stroke-dasharray="3.6, 3.6" stroke-width="1.8" fill="none">
+ <path style="color:#000000" d="m206 78.44 35.1-60.24"/>
+ <path style="color:#000000" d="m230.1 122.7c14.4-8.7 24.1-24.46 24.1-42.51 0-18.38-10.1-34.42-24.9-42.97"/>
+ </g>
+ <text style="letter-spacing:0px;block-progression:tb;text-indent:0;word-spacing:0px;color:#000000;text-transform:none" xml:space="preserve" font-size="14px" line-height="125%" y="577.60413" x="187.21097" font-family="Tahoma" fill="#000000"><tspan y="577.60413" x="187.21097" font-size="20px" font-weight="bold">Ø</tspan></text>
+ <text style="letter-spacing:0px;block-progression:tb;text-indent:0;word-spacing:0px;color:#000000;text-transform:none" xml:space="preserve" font-size="14px" line-height="125%" y="773.54077" x="186.64101" font-family="Tahoma" fill="#000000"><tspan y="773.54077" x="186.64101" font-size="20px" font-weight="bold">Ø</tspan></text>
+ <path style="color:#000000" d="m109 884.2 85.9-147.8 73.6 119.9" stroke="#000" stroke-width="3.6" fill="none"/>
+ </g>
+</svg>
diff --git a/upstream/clipper-6.4.2/Documentation/offset_triginometry2.svg b/upstream/clipper-6.4.2/Documentation/offset_triginometry2.svg
new file mode 100644
index 0000000..9a03cba
--- /dev/null
+++ b/upstream/clipper-6.4.2/Documentation/offset_triginometry2.svg
@@ -0,0 +1,28 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<svg xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns="http://www.w3.org/2000/svg" version="1.1" xmlns:cc="http://creativecommons.org/ns#" xmlns:dc="http://purl.org/dc/elements/1.1/" viewBox="0 0 400 600">
+ <g stroke="#000" fill="none">
+ <path style="color:#000000" d="m513.5 810.4a185.3 203.1 0 1 1 -370.6 0 185.3 203.1 0 1 1 370.6 0z" transform="matrix(1.074 0 0 .98 -426.9 -543.2)" stroke-width="3.509"/>
+ <g>
+ <path transform="translate(-295.0,-530.9)" d="m280 972.4-222.13-74.3 1.96-234.1 223.27-70.5 136.1 190.6z"/>
+ <path style="color:#000000" d="m-30 230 120-90" stroke-dasharray="4, 4"/>
+ <path style="color:#000000" d="m-10 62.08-55.1 189.92l190.8 1" stroke-dasharray="4, 4"/>
+ </g>
+ </g>
+ <g font-size="14px" font-family="Tahoma" fill="#000000">
+ <text style="letter-spacing:0px;block-progression:tb;text-indent:0;word-spacing:0px;color:#000000;text-transform:none" xml:space="preserve" line-height="125%" y="264.27399" x="-75.70369"><tspan x="-75.70369" y="264.27399">c</tspan></text>
+ <text style="letter-spacing:0px;block-progression:tb;text-indent:0;word-spacing:0px;color:#000000;text-transform:none" xml:space="preserve" line-height="125%" y="54.873951" x="-9.90369"><tspan x="-9.90369" y="54.873951">a</tspan></text>
+ <text style="letter-spacing:0px;block-progression:tb;text-indent:0;word-spacing:0px;color:#000000;text-transform:none" xml:space="preserve" line-height="125%" y="254.97398" x="133.90369"><tspan x="133.90369" y="254.97398">b</tspan></text>
+ <text style="letter-spacing:0px;block-progression:tb;text-indent:0;word-spacing:0px;color:#000000;text-transform:none" xml:space="preserve" line-height="125%" y="131.47398" x="93.00369"><tspan x="93.00369" y="131.47398">d</tspan></text>
+ <text style="letter-spacing:0px;block-progression:tb;text-indent:0;word-spacing:0px;color:#000000;text-transform:none" xml:space="preserve" line-height="125%" y="173.41545" x="52.1037"><tspan x="52.1037" y="173.41545">q</tspan></text>
+ </g>
+ <g>
+ <path style="color:#000000" d="m-20 251.2v-0.7c0-20.4-14.3-37.6-33.6-42.5" stroke="#000" fill="none"/>
+ <text style="letter-spacing:0px;block-progression:tb;text-indent:0;word-spacing:0px;color:#000000;text-transform:none" font-family="Tahoma" xml:space="preserve" font-size="20px" line-height="125%" y="245.65685" x="-54.47578" fill="#000000"><tspan y="245.65685" x="-54.47578" font-weight="bold">ß</tspan></text>
+ <path style="color:#000000" d="m44.1 142.9-16.2 11.7 11.7 16.2" stroke="#000" stroke-dasharray="3.6, 3.6" stroke-width="1.8" fill="none"/>
+ </g>
+ <g font-size="14px" font-family="Tahoma" fill="#000000">
+ <text style="letter-spacing:0px;block-progression:tb;text-indent:0;word-spacing:0px;color:#000000;text-transform:none" xml:space="preserve" line-height="125%" y="91.773972" x="154.80371"><tspan x="154.80371" y="91.773972">Calculate the number of steps (S) needed to </tspan><tspan x="154.80371" y="109.27397">construct a flattened path approximating a</tspan><tspan x="154.80371" y="126.77397">circle with radius (R) where the maximum </tspan><tspan x="154.80371" y="144.27397">imprecision of the path is a predefined </tspan><tspan x="154.80371" y="161.77397">constant L.</tspan><tspan x="154.80371" y="179.27397"/><tspan x="154.80371" y="196.77397">ß = 2*pi / S</tspan><tspan x="154.80371" y="214.27397">q = midpoint(ab)</tspan><tspan x="154.80371" y="231.77397">length(cd) = R </tspan><tspan x="154.80371" y="249.27397">length(qd) = L and length(cq) = R-L</tspan><tspan x="154.80371" y="266.77399">cos(ß/2) = length(cq)/R = (R-L)/R</tspan><tspan x="154.80371" y="284.27396">ß = 2 * arccos(1 - L/R) = 2*pi / S</tspan><tspan y="301.77396" x="154.80371" font-weight="bold">S = pi / arccos(1 - L/R)</tspan><tspan x="154.80371" y="319.27396"/><tspan x="154.80371" y="336.77396">eg: Given a circle with radius = 100px </tspan><tspan x="154.80371" y="354.27396">and allowing a max. imprecision of 1/4px</tspan><tspan x="154.80371" y="371.77396">the number of steps (vertices) required to </tspan><tspan x="154.80371" y="389.27396">draw a path approximating the circle is ...</tspan><tspan x="154.80371" y="406.77396">Steps = pi / arccos(1 - 0.25/100) = 44</tspan></text>
+ <text style="letter-spacing:0px;block-progression:tb;text-indent:0;word-spacing:0px;color:#000000;text-transform:none" xml:space="preserve" line-height="125%" y="159.97398" x="73.6037"><tspan y="159.97398" x="73.6037" font-weight="bold">L</tspan></text>
+ <text style="letter-spacing:0px;block-progression:tb;text-indent:0;word-spacing:0px;color:#000000;text-transform:none" xml:space="preserve" line-height="125%" y="265.32526" x="28.05185"><tspan y="265.32526" x="28.05185" font-weight="bold">R</tspan></text>
+ </g>
+</svg>
diff --git a/upstream/clipper-6.4.2/Documentation/offset_triginometry3.svg b/upstream/clipper-6.4.2/Documentation/offset_triginometry3.svg
new file mode 100644
index 0000000..52eff70
--- /dev/null
+++ b/upstream/clipper-6.4.2/Documentation/offset_triginometry3.svg
@@ -0,0 +1,391 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="800"
+ height="600"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.48.2 r9819"
+ sodipodi:docname="offset_triginometry3.svg">
+ <defs
+ id="defs4" />
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="0.64"
+ inkscape:cx="-24.27"
+ inkscape:cy="218.1"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer1"
+ showgrid="false"
+ inkscape:window-width="1280"
+ inkscape:window-height="753"
+ inkscape:window-x="-4"
+ inkscape:window-y="-4"
+ inkscape:window-maximized="1"
+ showborder="true"
+ inkscape:showpageshadow="true"
+ fit-margin-top="0"
+ fit-margin-left="0"
+ fit-margin-right="0"
+ fit-margin-bottom="0">
+ <inkscape:grid
+ type="xygrid"
+ id="grid3779"
+ empspacing="5"
+ visible="true"
+ enabled="true"
+ snapvisiblegridlinesonly="true" />
+ </sodipodi:namedview>
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:label="Layer 1"
+ inkscape:groupmode="layer"
+ id="layer1"
+ transform="translate(-407.6,90.95)">
+ <path
+ style="color:#000000;fill:none;stroke:#000000;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:4, 4;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
+ d="m 604.8,209.6 85.8,-55.7"
+ id="path3907"
+ inkscape:connector-curvature="0"
+ sodipodi:nodetypes="cc" />
+ <path
+ style="color:#000000;fill:none;stroke:#000000;stroke-width:1.8;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
+ d="M 420.4,326.1 603.7,10.08 757.6,263.6"
+ id="path2985"
+ inkscape:connector-curvature="0"
+ sodipodi:nodetypes="ccc" />
+ <text
+ xml:space="preserve"
+ style="font-size:20px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-indent:0;text-align:start;text-decoration:none;line-height:125%;letter-spacing:0px;word-spacing:0px;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;text-anchor:start;baseline-shift:baseline;color:#000000;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1px;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate;font-family:Tahoma;-inkscape-font-specification:Tahoma"
+ x="624.09735"
+ y="215.06464"
+ id="text3861"
+ sodipodi:linespacing="125%"><tspan
+ sodipodi:role="line"
+ id="tspan3863"
+ x="624.09735"
+ y="215.06464"
+ style="font-weight:bold;-inkscape-font-specification:Tahoma Bold">ß</tspan></text>
+ <path
+ sodipodi:nodetypes="cccccccc"
+ inkscape:connector-curvature="0"
+ id="path3857-2"
+ d="m 603,29.9 15,15.8 -10,0 0,155.1 -10,0 0,-155.1 -10,0 z"
+ style="color:#000000;fill:#ffff00;fill-opacity:1;stroke:#000000;stroke-width:1.776;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
+ inkscape:transform-center-x="-20.96"
+ inkscape:transform-center-y="-1.652" />
+ <text
+ xml:space="preserve"
+ style="font-size:10px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-indent:0;text-align:start;text-decoration:none;line-height:125%;letter-spacing:0px;word-spacing:0px;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;text-anchor:start;baseline-shift:baseline;color:#000000;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1px;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate;font-family:Tahoma;-inkscape-font-specification:Tahoma"
+ x="682.20001"
+ y="261.375"
+ id="text3952"
+ sodipodi:linespacing="125%"><tspan
+ sodipodi:role="line"
+ id="tspan3954"
+ x="682.20001"
+ y="261.375"
+ style="font-size:14px">delta</tspan></text>
+ <text
+ xml:space="preserve"
+ style="font-size:10px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-indent:0;text-align:start;text-decoration:none;line-height:125%;letter-spacing:0px;word-spacing:0px;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;text-anchor:start;baseline-shift:baseline;color:#000000;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1px;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate;font-family:Tahoma;-inkscape-font-specification:Tahoma"
+ x="698.20001"
+ y="151.875"
+ id="text3977"
+ sodipodi:linespacing="125%"><tspan
+ sodipodi:role="line"
+ id="tspan3979"
+ x="698.20001"
+ y="151.875"
+ style="font-size:14px">c</tspan></text>
+ <text
+ xml:space="preserve"
+ style="font-size:10px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-indent:0;text-align:start;text-decoration:none;line-height:125%;letter-spacing:0px;word-spacing:0px;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;text-anchor:start;baseline-shift:baseline;color:#000000;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1px;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate;font-family:Tahoma;-inkscape-font-specification:Tahoma"
+ x="599.76099"
+ y="3.3956299"
+ id="text3977-5-1-2"
+ sodipodi:linespacing="125%"
+ inkscape:transform-center-x="-52.52"
+ inkscape:transform-center-y="54.68"><tspan
+ sodipodi:role="line"
+ id="tspan3979-1-5-7"
+ x="599.76099"
+ y="3.3956299"
+ style="font-size:14px">b</tspan></text>
+ <text
+ xml:space="preserve"
+ style="font-size:14px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-indent:0;text-align:start;text-decoration:none;line-height:125%;letter-spacing:0px;word-spacing:0px;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;text-anchor:start;baseline-shift:baseline;color:#000000;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1px;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate;font-family:Tahoma;-inkscape-font-specification:Tahoma"
+ x="766"
+ y="-49.349998"
+ id="text4077"
+ sodipodi:linespacing="125%"><tspan
+ sodipodi:role="line"
+ x="766"
+ y="-49.349998"
+ id="tspan4087">When 'mitering' offset polygons, the maximum distance </tspan><tspan
+ sodipodi:role="line"
+ x="766"
+ y="-31.849998"
+ id="tspan3063">point 'b' can be from point 'a' is set by 'limit' where limit </tspan><tspan
+ sodipodi:role="line"
+ x="766"
+ y="-14.349998"
+ id="tspan3065">is a multiple of delta. Therefore, for any given angle</tspan><tspan
+ sodipodi:role="line"
+ x="766"
+ y="3.1500015"
+ id="tspan3067">we need to know if length(ab) &gt; limit * delta.</tspan><tspan
+ sodipodi:role="line"
+ x="766"
+ y="20.650002"
+ id="tspan4083" /><tspan
+ sodipodi:role="line"
+ x="766"
+ y="38.150002"
+ id="tspan3890">Find the largest angle ß (or smallest Ø since Ø = pi - ß) </tspan><tspan
+ sodipodi:role="line"
+ x="766"
+ y="55.650002"
+ id="tspan3904">for a given limit, expressing ß as sin(ß) or cos(ß) since</tspan><tspan
+ sodipodi:role="line"
+ x="766"
+ y="73.150002"
+ id="tspan3908">these can easily be derived from cross or dot products </tspan><tspan
+ sodipodi:role="line"
+ x="766"
+ y="90.650002"
+ id="tspan3916">respectively.</tspan><tspan
+ sodipodi:role="line"
+ x="766"
+ y="98.598343"
+ id="tspan3884"
+ style="font-size:4px"> </tspan><tspan
+ sodipodi:role="line"
+ x="766"
+ y="113.15"
+ id="tspan3888">angle(abc) = Ø/2 </tspan><tspan
+ sodipodi:role="line"
+ x="766"
+ y="130.64999"
+ id="tspan3083">length(ab) = limit * delta</tspan><tspan
+ sodipodi:role="line"
+ x="766"
+ y="148.14999"
+ id="tspan3087">length(ac) = delta</tspan><tspan
+ sodipodi:role="line"
+ x="766"
+ y="165.64999"
+ id="tspan3089">sin(Ø/2) = delta / (limit * delta) = 1 / limit</tspan><tspan
+ sodipodi:role="line"
+ x="766"
+ y="183.14999"
+ id="tspan3157">Given that sin(Ø/2) = sqrt((1-cos(Ø))/2) **</tspan><tspan
+ sodipodi:role="line"
+ x="766"
+ y="200.64999"
+ id="tspan3151">1 / limit = sqrt((1-cos(Ø))/2)</tspan><tspan
+ sodipodi:role="line"
+ x="766"
+ y="218.14999"
+ id="tspan3161">limit = sqrt(2 / (1-cos(Ø)))</tspan><tspan
+ sodipodi:role="line"
+ x="766"
+ y="235.64999"
+ id="tspan3815"
+ style="font-weight:normal">1-cos(Ø) = 2 / sqr(limit) </tspan><tspan
+ sodipodi:role="line"
+ x="766"
+ y="253.14999"
+ id="tspan3043">Since Ø = pi - ß ...</tspan><tspan
+ sodipodi:role="line"
+ x="766"
+ y="270.64999"
+ id="tspan3868">1-cos(pi - ß) = 2 / sqr(limit)</tspan><tspan
+ sodipodi:role="line"
+ x="766"
+ y="288.14999"
+ id="tspan3047">and given cos(pi-ß) = -cos(ß) ** ... </tspan><tspan
+ sodipodi:role="line"
+ x="766"
+ y="296.09836"
+ style="font-size:4px;font-weight:normal"
+ id="tspan3823"> </tspan><tspan
+ sodipodi:role="line"
+ x="766"
+ y="310.64999"
+ style="font-weight:bold"
+ id="tspan3122">1+cos(ß) = 2 / sqr(limit) </tspan><tspan
+ sodipodi:role="line"
+ x="766"
+ y="318.59836"
+ style="font-size:4px;font-weight:normal"
+ id="tspan3118"> </tspan><tspan
+ sodipodi:role="line"
+ x="766"
+ y="333.14999"
+ style="font-weight:normal"
+ id="tspan3114">cos(ß) = 2 / sqr(limit) - 1</tspan><tspan
+ sodipodi:role="line"
+ x="766"
+ y="350.64999"
+ style="font-weight:bold"
+ id="tspan3051" /><tspan
+ sodipodi:role="line"
+ x="766"
+ y="368.14999"
+ style="font-weight:normal"
+ id="tspan3066">Example: if miter limit = 2 (ie 2 times delta) then </tspan><tspan
+ sodipodi:role="line"
+ x="766"
+ y="385.64999"
+ style="font-weight:normal"
+ id="tspan3070">cos(ß) = (2 / 4) -1 = -0.5 and so ß = 120 degrees. </tspan><tspan
+ sodipodi:role="line"
+ x="766"
+ y="403.14999"
+ style="font-weight:normal"
+ id="tspan3072">Therefore, when ß &gt; 120 deg. (or Ø &lt; 60 deg.), the</tspan><tspan
+ sodipodi:role="line"
+ x="766"
+ y="420.64999"
+ style="font-weight:normal"
+ id="tspan3090">distance point 'b' would be from point 'a' would exceed </tspan><tspan
+ sodipodi:role="line"
+ x="766"
+ y="438.14999"
+ style="font-weight:normal"
+ id="tspan3094">the limit.</tspan><tspan
+ sodipodi:role="line"
+ x="766"
+ y="446.09836"
+ id="tspan3171"
+ style="font-size:4px;font-weight:bold"> </tspan><tspan
+ sodipodi:role="line"
+ x="766"
+ y="451.09836"
+ style="font-size:4px;font-weight:bold"
+ id="tspan3049" /><tspan
+ sodipodi:role="line"
+ x="766"
+ y="462.78452"
+ id="tspan3163"
+ style="font-size:11px">** see http://en.wikipedia.org/wiki/List_of_trigonometric_identities</tspan><tspan
+ sodipodi:role="line"
+ x="766"
+ y="476.53452"
+ id="tspan3153" /><tspan
+ sodipodi:role="line"
+ x="766"
+ y="490.28452"
+ id="tspan3145" /><tspan
+ sodipodi:role="line"
+ x="766"
+ y="504.03452"
+ id="tspan4124"
+ style="font-weight:bold" /><tspan
+ sodipodi:role="line"
+ x="766"
+ y="517.78448"
+ id="tspan4116" /><tspan
+ sodipodi:role="line"
+ x="766"
+ y="531.53448"
+ id="tspan4095" /></text>
+ <path
+ style="color:#000000;fill:none;stroke:#000000;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:2, 2;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
+ d="m 684.7,144.1 -10.6,5.9 5.4,10.1"
+ id="path4091"
+ inkscape:connector-curvature="0"
+ sodipodi:nodetypes="ccc" />
+ <text
+ xml:space="preserve"
+ style="font-size:10px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-indent:0;text-align:start;text-decoration:none;line-height:125%;letter-spacing:0px;word-spacing:0px;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;text-anchor:start;baseline-shift:baseline;color:#000000;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1px;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate;font-family:Tahoma;-inkscape-font-specification:Tahoma"
+ x="588.19745"
+ y="208.67169"
+ id="text3977-1"
+ sodipodi:linespacing="125%"><tspan
+ sodipodi:role="line"
+ id="tspan3979-7"
+ x="588.19745"
+ y="208.67169"
+ style="font-size:14px">a</tspan></text>
+ <g
+ id="g3841"
+ transform="translate(400,-20.7)">
+ <path
+ sodipodi:nodetypes="cc"
+ inkscape:connector-curvature="0"
+ id="path3026"
+ d="M 175.6,276.8 233.7,175.7"
+ style="color:#000000;fill:none;stroke:#000000;stroke-width:1.8;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:7.2, 7.2;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" />
+ <path
+ sodipodi:nodetypes="cc"
+ inkscape:connector-curvature="0"
+ id="path3809"
+ d="m 227.7,188.7 c 27.7,17.9 31.6,57.6 -0.5,76.7"
+ style="color:#000000;fill:none;stroke:#000000;stroke-width:1.81;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:7.24, 7.24;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" />
+ </g>
+ <path
+ style="color:#000000;fill:#00ff00;fill-opacity:1;stroke:#000000;stroke-width:2.1383;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
+ d="m 724.8,212.4 -9.2,24.2 -5.6,-8.3 -46.8,31.5 5.4,8.3 -26,-0.8 9.4,-24.3 5.5,8.3 47,-31.3 -5.6,-8.3 z"
+ id="path3777-9"
+ inkscape:connector-curvature="0"
+ sodipodi:nodetypes="ccccccccccc"
+ inkscape:transform-center-x="-96.45"
+ inkscape:transform-center-y="-137.3" />
+ <text
+ xml:space="preserve"
+ style="font-size:14px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-indent:0;text-align:start;text-decoration:none;line-height:125%;letter-spacing:0px;word-spacing:0px;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;text-anchor:start;baseline-shift:baseline;color:#000000;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1px;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate;font-family:Tahoma;-inkscape-font-specification:Tahoma"
+ x="595.66949"
+ y="246.41019"
+ id="text3845"
+ sodipodi:linespacing="125%"><tspan
+ sodipodi:role="line"
+ id="tspan3847"
+ x="595.66949"
+ y="246.41019"
+ style="font-size:20px;font-weight:bold;-inkscape-font-specification:Tahoma Bold">Ø</tspan></text>
+ <text
+ sodipodi:linespacing="125%"
+ id="text3849"
+ y="246.41019"
+ x="595.66949"
+ style="font-size:14px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-indent:0;text-align:start;text-decoration:none;line-height:125%;letter-spacing:0px;word-spacing:0px;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;text-anchor:start;baseline-shift:baseline;color:#000000;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1px;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate;font-family:Tahoma;-inkscape-font-specification:Tahoma"
+ xml:space="preserve"><tspan
+ style="font-size:20px;font-weight:bold;-inkscape-font-specification:Tahoma Bold"
+ y="246.41019"
+ x="595.66949"
+ id="tspan3851"
+ sodipodi:role="line">Ø</tspan></text>
+ <path
+ style="color:#000000;fill:none;stroke:#000000;stroke-width:3.6;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
+ d="M 530.8,333.3 603,210 677.5,330.2"
+ id="path2985-1-1"
+ inkscape:connector-curvature="0"
+ sodipodi:nodetypes="ccc" />
+ </g>
+</svg>
diff --git a/upstream/clipper-6.4.2/License.txt b/upstream/clipper-6.4.2/License.txt
new file mode 100644
index 0000000..3d94797
--- /dev/null
+++ b/upstream/clipper-6.4.2/License.txt
@@ -0,0 +1,24 @@
+Boost Software License - Version 1.0 - August 17th, 2003
+http://www.boost.org/LICENSE_1_0.txt
+
+Permission is hereby granted, free of charge, to any person or organization
+obtaining a copy of the software and accompanying documentation covered by
+this license (the "Software") to use, reproduce, display, distribute,
+execute, and transmit the Software, and to prepare derivative works of the
+Software, and to permit third-parties to whom the Software is furnished to
+do so, all subject to the following:
+
+The copyright notices in the Software and this entire statement, including
+the above license grant, this restriction and the following disclaimer,
+must be included in all copies of the Software, in whole or in part, and
+all derivative works of the Software, unless such copies or derivative
+works are solely in the form of machine-executable object code generated by
+a source language processor.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE, TITLE AND NON-INFRINGEMENT. IN NO EVENT
+SHALL THE COPYRIGHT HOLDERS OR ANYONE DISTRIBUTING THE SOFTWARE BE LIABLE
+FOR ANY DAMAGES OR OTHER LIABILITY, WHETHER IN CONTRACT, TORT OR OTHERWISE,
+ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
+DEALINGS IN THE SOFTWARE. \ No newline at end of file
diff --git a/upstream/clipper-6.4.2/README b/upstream/clipper-6.4.2/README
new file mode 100644
index 0000000..a3ed26f
--- /dev/null
+++ b/upstream/clipper-6.4.2/README
@@ -0,0 +1,413 @@
+=====================================================================
+Clipper Change Log
+=====================================================================
+v6.4.2 (27 February 2017) Rev 512
+* Several minor bugfixes: #152 #160 #161 #162
+
+v6.4 (2 July 2015) Rev 495
+* Numerous generally minor bugfixes
+
+v6.2.1 (31 October 2014) Rev 482
+* Bugfix in ClipperOffset.Execute where the Polytree.IsHole property
+ was returning incorrect values with negative offsets
+* Very minor improvement to join rounding in ClipperOffset
+* Fixed CPP OpenGL demo.
+
+v6.2.0 (17 October 2014) Rev 477
+* Numerous minor bugfixes, too many to list.
+ (See revisions 454-475 in Sourceforge Repository)
+* The ZFillFunction (custom callback function) has had its parameters
+ changed.
+* Curves demo removed (temporarily).
+* Deprecated functions have been removed.
+
+v6.1.5 (26 February 2014) Rev 460
+* Improved the joining of output polygons sharing a common edge
+ when those common edges are horizontal.
+* Fixed a bug in ClipperOffset.AddPath() which would produce
+ incorrect solutions when open paths were added before closed paths.
+* Minor code tidy and performance improvement
+
+v6.1.4 (6 February 2014)
+* Fixed bugs in MinkowskiSum
+* Fixed minor bug when using Clipper.ForceSimplify.
+* Modified use_xyz callback so that all 4 vertices around an
+ intersection point are now passed to the callback function.
+
+v6.1.3a (22 January 2014) Rev 453
+* Fixed buggy PointInPolygon function (C++ and C# only).
+ Note this bug only affected the newly exported function, the
+ internal PointInPolygon function used by Clipper was OK.
+
+v6.1.3 (19 January 2014) Rev 452
+* Fixed potential endless loop condition when adding open
+ paths to Clipper.
+* Fixed missing implementation of SimplifyPolygon function
+ in C++ code.
+* Fixed incorrect upper range constant for polygon coordinates
+ in Delphi code.
+* Added PointInPolygon function.
+* Overloaded MinkowskiSum function to accommodate multi-contour
+ paths.
+
+v6.1.2 (15 December 2013) Rev 444
+* Fixed broken C++ header file.
+* Minor improvement to joining polygons.
+
+v6.1.1 (13 December 2013) Rev 441
+* Fixed a couple of bugs affecting open paths that could
+ raise unhandled exceptions.
+
+v6.1.0 (12 December 2013)
+* Deleted: Previously deprecated code has been removed.
+* Modified: The OffsetPaths function is now deprecated as it has
+ been replaced by the ClipperOffset class which is much more
+ flexible.
+* Bugfixes: Several minor bugs have been fixed including
+ occasionally an incorrect nesting within the PolyTree structure.
+
+v6.0.0 (30 October 2013)
+* Added: Open path (polyline) clipping. A new 'Curves' demo
+ application showcases this (see the 'Curves' directory).
+* Update: Major improvement in the merging of
+ shared/collinear edges in clip solutions (see Execute).
+* Added: The IntPoint structure now has an optional 'Z' member.
+ (See the precompiler directive use_xyz.)
+* Added: Users can now force Clipper to use 32bit integers
+ (via the precompiler directive use_int32) instead of using
+ 64bit integers.
+* Modified: To accommodate open paths, the Polygon and Polygons
+ structures have been renamed Path and Paths respectively. The
+ AddPolygon and AddPolygons methods of the ClipperBase class
+ have been renamed AddPath and AddPaths respectively. Several
+ other functions have been similarly renamed.
+* Modified: The PolyNode Class has a new IsOpen property.
+* Modified: The Clipper class has a new ZFillFunction property.
+* Added: MinkowskiSum and MinkowskiDiff functions added.
+* Added: Several other new functions have been added including
+ PolyTreeToPaths, OpenPathsFromPolyTree and ClosedPathsFromPolyTree.
+* Added: The Clipper constructor now accepts an optional InitOptions
+ parameter to simplify setting properties.
+* Bugfixes: Numerous minor bugs have been fixed.
+* Deprecated: Version 6 is a major upgrade from previous versions
+ and quite a number of changes have been made to exposed structures
+ and functions. To minimize inconvenience to existing library users,
+ some code has been retained and some added to maintain backward
+ compatibility. However, because this code will be removed in a
+ future update, it has been marked as deprecated and a precompiler
+ directive use_deprecated has been defined.
+
+v5.1.6 (23 May 2013)
+* BugFix: CleanPolygon function was buggy.
+* Changed: The behaviour of the 'miter' JoinType has been
+ changed so that when squaring occurs, it's no longer
+ extended up to the miter limit but is squared off at
+ exactly 'delta' units. (This improves the look of mitering
+ with larger limits at acute angles.)
+* Added: New OffsetPolyLines function
+* Update: Minor code refactoring and optimisations
+
+v5.1.5 (5 May 2013)
+* Added: ForceSimple property to Clipper class
+* Update: Improved documentation
+
+v5.1.4 (24 March 2013)
+* Update: CleanPolygon function enhanced.
+* Update: Documentation improved.
+
+v5.1.3 (14 March 2013)
+* Bugfix: Minor bugfixes.
+* Update: Documentation significantly improved.
+
+v5.1.2 (26 February 2013)
+* Bugfix: PolyNode class was missing a constructor.
+* Update: The MiterLimit parameter in the OffsetPolygons
+ function has been renamed Limit and can now also be used to
+ limit the number of vertices used to construct arcs when
+ JoinType is set to jtRound.
+
+v5.1.0 (17 February 2013)
+* Update: ExPolygons has been replaced with the PolyTree &
+ PolyNode classes to more fully represent the parent-child
+ relationships of the polygons returned by Clipper.
+* Added: New CleanPolygon and CleanPolygons functions.
+* Bugfix: Another orientation bug fixed.
+
+v5.0.2 - 30 December 2012
+* Bugfix: Significant fixes in and tidy of the internal
+ Int128 class (which is used only when polygon coordinate
+ values are greater than ±0x3FFFFFFF (~1.07e9)).
+* Update: The Area algorithm has been updated and is faster.
+* Update: Documentation updates. The newish but undocumented
+ 'CheckInputs' parameter of the OffsetPolygons function has been
+ renamed 'AutoFix' and documented too. The comments on rounding
+ have also been improved (ie clearer and expanded).
+
+v4.10.0 - 25 December 2012
+* Bugfix: Orientation bugs should now be resolved (finally!).
+* Bugfix: Bug in Int128 class
+
+v4.9.8 - 2 December 2012
+* Bugfix: Further fixes to rare Orientation bug.
+
+v4.9.7 - 29 November 2012
+* Bugfix: Bug that very rarely returned the wrong polygon
+ orientation.
+* Bugfix: Obscure bug affecting OffsetPolygons when using
+ jtRound for the JoinType parameter and when polygons also
+ contain very large coordinate values (> +/-100000000000).
+
+v4.9.6 - 9 November 2012
+* Bugfix: Another obscure bug related to joining polygons.
+
+v4.9.4 - 2 November 2012
+* Bugfix: Bugs in Int128 class occasionally causing
+ wrong orientations.
+* Bugfix: Further fixes related to joining polygons.
+
+v4.9.0 - 9 October 2012
+* Bugfix: Obscure bug related to joining polygons.
+
+v4.8.9 - 25 September 2012
+* Bugfix: Obscure bug related to precision of intersections.
+
+v4.8.8 - 30 August 2012
+* Bugfix: Fixed bug in OffsetPolygons function introduced in
+ version 4.8.5.
+
+v4.8.7 - 24 August 2012
+* Bugfix: ReversePolygon function in C++ translation was broken.
+* Bugfix: Two obscure bugs affecting orientation fixed too.
+
+v4.8.6 - 11 August 2012
+* Bugfix: Potential for memory overflow errors when using
+ ExPolygons structure.
+* Bugfix: The polygon coordinate range has been reduced to
+ +/- 0x3FFFFFFFFFFFFFFF (4.6e18).
+* Update: ReversePolygons function was misnamed ReversePoints in C++.
+* Update: SimplifyPolygon function now takes a PolyFillType parameter.
+
+v4.8.5 - 15 July 2012
+* Bugfix: Potential for memory overflow errors in OffsetPolygons().
+
+v4.8.4 - 1 June 2012
+* Bugfix: Another obscure bug affecting ExPolygons structure.
+
+v4.8.3 - 27 May 2012
+* Bugfix: Obscure bug causing incorrect removal of a vertex.
+
+v4.8.2 - 21 May 2012
+* Bugfix: Obscure bug could cause an exception when using
+ ExPolygon structure.
+
+v4.8.1 - 12 May 2012
+* Update: Cody tidy and minor bug fixes.
+
+v4.8.0 - 30 April 2012
+* Bugfix: Occasional errors in orientation fixed.
+* Update: Added notes on rounding to the documentation.
+
+v4.7.6 - 11 April 2012
+* Fixed a bug in Orientation function (affecting C# translations only).
+* Minor documentation update.
+
+v4.7.5 - 28 March 2012
+* Bugfix: Fixed a recently introduced bug that occasionally caused an
+ unhandled exception in C++ and C# translations.
+
+v4.7.4 - 15 March 2012
+* Bugfix: Another minor bugfix.
+
+v4.7.2 - 4 March 2012
+* Bugfix: Fixed bug introduced in ver 4.7 which sometimes caused
+ an exception if ExPolygon structure was passed to Clipper's
+ Execute method.
+
+v4.7.1 - 3 March 2012
+* Bugfix: Rare crash when JoinCommonEdges joined polygons that
+ 'cancelled' each other.
+* Bugfix: Clipper's internal Orientation method occasionally
+ returned wrong result.
+* Update: Improved C# code (thanks to numerous excellent suggestions
+ from David Piepgrass)
+
+v4.7 - 10 February 2012
+* Improved the joining of output polygons sharing a common edge.
+
+v4.6.6 - 3 February 2012
+* Bugfix: Another obscure bug occasionally causing incorrect
+ polygon orientation.
+
+v4.6.5 - 17 January 2012
+* Bugfix: Obscure bug occasionally causing incorrect hole
+ assignment in ExPolygon structure.
+
+v4.6.4 - 8 November 2011
+* Added: SimplifyPolygon and SimplifyPolygons functions.
+
+v4.6.3 - 11 November 2011
+* Bugfix: Fixed another minor mitering bug in OffsetPolygons.
+
+v4.6.2 - 10 November 2011
+* Bugfix: Fixed a rare bug in the orientation of polygons
+ returned by Clipper's Execute() method.
+* Bugfix: Previous update introduced a mitering bug in the
+ OffsetPolygons function.
+
+v4.6 - 29 October 2011
+* Added: Support for Positive and Negative polygon fill
+ types (in addition to the EvenOdd and NonZero fill types).
+* Bugfix: The OffsetPolygons function was generating the
+ occasional artefact when 'shrinking' polygons.
+
+v4.5.5 - 8 October 2011
+* Bugfix: Fixed an obscure bug in Clipper's JoinCommonEdges
+ method.
+* Update: Replaced IsClockwise function with Orientation
+ function. The orientation issues affecting OffsetPolygons
+ should now be finally resolved.
+* Change: The Area function once again returns a signed value.
+
+v4.5.1 - 28 September 2011
+* Deleted: The UseFullCoordinateRange property has been
+ deleted since integer range is now managed implicitly.
+* BugFix: Minor bug in OffsetPolygon mitering.
+* Change: C# JoinType enum moved from Clipper class to
+ ClipperLib namespace.
+* Change: The Area function now returns the absolute area
+ (irrespective of orientation).
+* Change: The IsClockwise function now requires a second
+ parameter - YAxisPositiveUpward - to accommodate displays
+ with Y-axis oriented in either direction
+
+v4.4.4 - 10 September 2011
+* Change: Deleted jtButt from JoinType (used by the
+ OffsetPolygons function).
+* BugFix: Fixed another minor bug in OffsetPolygons function.
+* Update: Further improvements to the help file
+
+v4.4.3 - 29 August 2011
+* BugFix: fixed a minor rounding issue in OffsetPolygons
+ function (affected C++ & C# translations).
+* BugFix: fixed a minor bug in OffsetPolygons' function
+ declaration (affected C++ translation only).
+* Change: 'clipper' namespace changed to 'ClipperLib'
+ namespace in both C++ and C# code to remove the ambiguity
+ between the Clipper class and the namespace. (This also
+ required numerous updates to the accompanying demos.)
+
+v4.4.2 - 26 August 2011
+* BugFix: minor bugfixes in Clipper.
+* Update: the OffsetPolygons function has been significantly
+ improved by offering 4 different join styles.
+
+v4.4.0 - 6 August 2011
+* BugFix: A number of minor bugs have been fixed that mostly
+ affected the new ExPolygons structure.
+
+v4.3.0 - 17 June 2011
+* New: ExPolygons structure that explicitly associates 'hole'
+ polygons with their 'outer' container polygons.
+* New: Execute method overloaded so the solution parameter
+ can now be either Polygons or ExPolygons.
+* BugFix: Fixed a rare bug in solution polygons orientation.
+
+v4.2.8 - 21 May 2011
+* Update: JoinCommonEdges() improved once more.
+* BugFix: Several minor bugs fixed.
+
+v4.2.6 - 1 May 2011
+* Bugfix: minor bug in SlopesEqual function.
+* Update: Merging of output polygons sharing common edges
+ has been significantly inproved
+
+v4.2.4 - 26 April 2011
+ Input polygon coordinates can now contain the full range of
+ signed 64bit integers (ie +/-9,223,372,036,854,775,807). This
+ means that floating point values can be converted to and from
+ Clipper's 64bit integer coordinates structure (IntPoint) and
+ still retain a precision of up to 18 decimal places. However,
+ since the large-integer math that supports this expanded range
+ imposes a small cost on performance (~15%), a new property
+ UseFullCoordinateRange has been added to the Clipper class to
+ allow users the choice of whether or not to use this expanded
+ coordinate range. If this property is disabled, coordinate values
+ are restricted to +/-1,500,000,000.
+
+v4.2 - 12 April 2011
+ JoinCommonEdges() code significantly improved plus other minor
+ improvements.
+
+v4.1.2 - 9 April 2011
+* Update: Minor code tidy.
+* Bugfix: Possible endless loop in JoinCommonEdges() in clipper.pas.
+
+v4.1.1 - 8 April 2011
+* Update: All polygon coordinates are now stored as 64bit integers
+ (though they're still restricted to range -1.5e9 to +1.5e9 pending
+ the inclusion of code supporting 64bit math).
+* Change: AddPolygon and AddPolygons methods now return boolean
+ values.
+* Bugfix: Bug in JoinCommonEdges() caused potential endless loop.
+* Bugfix: Bug in IsClockwise(). (C++ code only)
+
+v4.0 - 5 April 2011
+* Clipper 4 is a major rewrite of earlier versions. The biggest
+ change is that floating point values are no longer used,
+ except for the storing of edge slope values. The main benefit
+ of this is the issue of numerical robustness has been
+ addressed. Due to other major code improvements Clipper v4
+ is approximately 40% faster than Clipper v3.
+* The AddPolyPolygon method has been renamed to AddPolygons.
+* The IgnoreOrientation property has been removed.
+* The clipper_misc library has been merged back into the
+ main clipper library.
+
+v3.1.0 - 17 February 2011
+* Bugfix: Obscure bug in TClipperBase.SetDx method that caused
+ problems with very small edges ( edges <1/1000th pixel in size).
+
+v3.0.3 - 9 February 2011
+* Bugfix: Significant bug, but only in C# code.
+* Update: Minor refactoring.
+
+v3.0 - 31 January 2011
+* Update: Major rewrite of the portion of code that calculates
+ the output polygons' orientation.
+* Update: Help file significantly improved.
+* Change: Renamed ForceOrientation property to IgnoreOrientation.
+ If the orientation of output polygons is not important, or can
+ be managed separately, clipping routines can be sped up by about
+ 60% by setting IgnoreOrientation to true. Defaults to false.
+* Change: The OffsetPolygon and Area functions have been moved to
+ the new unit - clipper_misc.
+
+2.99 - 15 January 2011
+* Bugfix: Obscure bug in AddPolygon method could cause an endless loop.
+
+2.8 - 20 November 2010
+* Updated: Output polygons which previously shared a common
+ edge are now merged.
+* Changed: The orientation of outer polygons is now clockwise
+ when the display's Y axis is positive downwards (as is
+ typical for most Windows applications). Inner polygons
+ (holes) have the opposite orientation.
+* Added: Support module for Cairo Graphics Library (with demo).
+* Updated: C# and C++ demos.
+
+2.522 - 15 October 2010
+* Added C# translation (thanks to Olivier Lejeune) and
+ a link to Ruby bindings (thanks to Mike Owens).
+
+2.0 - 30 July 2010
+* Clipper now clips using both the Even-Odd (alternate) and
+ Non-Zero (winding) polygon filling rules. (Previously Clipper
+ assumed the Even-Odd rule for polygon filling.)
+
+1.4c - 16 June 2010
+* Added C++ support for AGG graphics library
+
+1.2s - 2 June 2010
+* Added C++ translation of clipper.pas
+
+1.0 - 9 May 2010 \ No newline at end of file
diff --git a/upstream/clipper-6.4.2/cpp/CMakeLists.txt b/upstream/clipper-6.4.2/cpp/CMakeLists.txt
new file mode 100644
index 0000000..32293cb
--- /dev/null
+++ b/upstream/clipper-6.4.2/cpp/CMakeLists.txt
@@ -0,0 +1,21 @@
+CMAKE_MINIMUM_REQUIRED(VERSION 2.6.0)
+PROJECT(polyclipping)
+
+SET(CMAKE_BUILD_TYPE "Release" CACHE STRING "Release type")
+# The header name clipper.hpp is too generic, so install in a subdirectory
+SET(CMAKE_INSTALL_INCDIR "${CMAKE_INSTALL_PREFIX}/include/polyclipping")
+SET(CMAKE_INSTALL_LIBDIR "${CMAKE_INSTALL_PREFIX}/lib${LIB_SUFFIX}")
+SET(CMAKE_INSTALL_PKGCONFIGDIR "${CMAKE_INSTALL_PREFIX}/share/pkgconfig")
+SET(PCFILE "${CMAKE_CURRENT_BINARY_DIR}/polyclipping.pc")
+
+SET(BUILD_SHARED_LIBS ON CACHE BOOL
+ "Build shared libraries (.dll/.so) instead of static ones (.lib/.a)")
+ADD_LIBRARY(polyclipping clipper.cpp)
+
+CONFIGURE_FILE (polyclipping.pc.cmakein "${PCFILE}" @ONLY)
+
+INSTALL (FILES clipper.hpp DESTINATION "${CMAKE_INSTALL_INCDIR}")
+INSTALL (TARGETS polyclipping LIBRARY DESTINATION "${CMAKE_INSTALL_LIBDIR}")
+INSTALL (FILES "${PCFILE}" DESTINATION "${CMAKE_INSTALL_PKGCONFIGDIR}")
+
+SET_TARGET_PROPERTIES(polyclipping PROPERTIES VERSION 22.0.0 SOVERSION 22 )
diff --git a/upstream/clipper-6.4.2/cpp/clipper.cpp b/upstream/clipper-6.4.2/cpp/clipper.cpp
new file mode 100644
index 0000000..d0e5ba2
--- /dev/null
+++ b/upstream/clipper-6.4.2/cpp/clipper.cpp
@@ -0,0 +1,4629 @@
+/*******************************************************************************
+* *
+* Author : Angus Johnson *
+* Version : 6.4.2 *
+* Date : 27 February 2017 *
+* Website : http://www.angusj.com *
+* Copyright : Angus Johnson 2010-2017 *
+* *
+* License: *
+* Use, modification & distribution is subject to Boost Software License Ver 1. *
+* http://www.boost.org/LICENSE_1_0.txt *
+* *
+* Attributions: *
+* The code in this library is an extension of Bala Vatti's clipping algorithm: *
+* "A generic solution to polygon clipping" *
+* Communications of the ACM, Vol 35, Issue 7 (July 1992) pp 56-63. *
+* http://portal.acm.org/citation.cfm?id=129906 *
+* *
+* Computer graphics and geometric modeling: implementation and algorithms *
+* By Max K. Agoston *
+* Springer; 1 edition (January 4, 2005) *
+* http://books.google.com/books?q=vatti+clipping+agoston *
+* *
+* See also: *
+* "Polygon Offsetting by Computing Winding Numbers" *
+* Paper no. DETC2005-85513 pp. 565-575 *
+* ASME 2005 International Design Engineering Technical Conferences *
+* and Computers and Information in Engineering Conference (IDETC/CIE2005) *
+* September 24-28, 2005 , Long Beach, California, USA *
+* http://www.me.berkeley.edu/~mcmains/pubs/DAC05OffsetPolygon.pdf *
+* *
+*******************************************************************************/
+
+/*******************************************************************************
+* *
+* This is a translation of the Delphi Clipper library and the naming style *
+* used has retained a Delphi flavour. *
+* *
+*******************************************************************************/
+
+#include "clipper.hpp"
+#include <cmath>
+#include <vector>
+#include <algorithm>
+#include <stdexcept>
+#include <cstring>
+#include <cstdlib>
+#include <ostream>
+#include <functional>
+
+namespace ClipperLib {
+
+static double const pi = 3.141592653589793238;
+static double const two_pi = pi *2;
+static double const def_arc_tolerance = 0.25;
+
+enum Direction { dRightToLeft, dLeftToRight };
+
+static int const Unassigned = -1; //edge not currently 'owning' a solution
+static int const Skip = -2; //edge that would otherwise close a path
+
+#define HORIZONTAL (-1.0E+40)
+#define TOLERANCE (1.0e-20)
+#define NEAR_ZERO(val) (((val) > -TOLERANCE) && ((val) < TOLERANCE))
+
+struct TEdge {
+ IntPoint Bot;
+ IntPoint Curr; //current (updated for every new scanbeam)
+ IntPoint Top;
+ double Dx;
+ PolyType PolyTyp;
+ EdgeSide Side; //side only refers to current side of solution poly
+ int WindDelta; //1 or -1 depending on winding direction
+ int WindCnt;
+ int WindCnt2; //winding count of the opposite polytype
+ int OutIdx;
+ TEdge *Next;
+ TEdge *Prev;
+ TEdge *NextInLML;
+ TEdge *NextInAEL;
+ TEdge *PrevInAEL;
+ TEdge *NextInSEL;
+ TEdge *PrevInSEL;
+};
+
+struct IntersectNode {
+ TEdge *Edge1;
+ TEdge *Edge2;
+ IntPoint Pt;
+};
+
+struct LocalMinimum {
+ cInt Y;
+ TEdge *LeftBound;
+ TEdge *RightBound;
+};
+
+struct OutPt;
+
+//OutRec: contains a path in the clipping solution. Edges in the AEL will
+//carry a pointer to an OutRec when they are part of the clipping solution.
+struct OutRec {
+ int Idx;
+ bool IsHole;
+ bool IsOpen;
+ OutRec *FirstLeft; //see comments in clipper.pas
+ PolyNode *PolyNd;
+ OutPt *Pts;
+ OutPt *BottomPt;
+};
+
+struct OutPt {
+ int Idx;
+ IntPoint Pt;
+ OutPt *Next;
+ OutPt *Prev;
+};
+
+struct Join {
+ OutPt *OutPt1;
+ OutPt *OutPt2;
+ IntPoint OffPt;
+};
+
+struct LocMinSorter
+{
+ inline bool operator()(const LocalMinimum& locMin1, const LocalMinimum& locMin2)
+ {
+ return locMin2.Y < locMin1.Y;
+ }
+};
+
+//------------------------------------------------------------------------------
+//------------------------------------------------------------------------------
+
+inline cInt Round(double val)
+{
+ if ((val < 0)) return static_cast<cInt>(val - 0.5);
+ else return static_cast<cInt>(val + 0.5);
+}
+//------------------------------------------------------------------------------
+
+inline cInt Abs(cInt val)
+{
+ return val < 0 ? -val : val;
+}
+
+//------------------------------------------------------------------------------
+// PolyTree methods ...
+//------------------------------------------------------------------------------
+
+void PolyTree::Clear()
+{
+ for (PolyNodes::size_type i = 0; i < AllNodes.size(); ++i)
+ delete AllNodes[i];
+ AllNodes.resize(0);
+ Childs.resize(0);
+}
+//------------------------------------------------------------------------------
+
+PolyNode* PolyTree::GetFirst() const
+{
+ if (!Childs.empty())
+ return Childs[0];
+ else
+ return 0;
+}
+//------------------------------------------------------------------------------
+
+int PolyTree::Total() const
+{
+ int result = (int)AllNodes.size();
+ //with negative offsets, ignore the hidden outer polygon ...
+ if (result > 0 && Childs[0] != AllNodes[0]) result--;
+ return result;
+}
+
+//------------------------------------------------------------------------------
+// PolyNode methods ...
+//------------------------------------------------------------------------------
+
+PolyNode::PolyNode(): Parent(0), Index(0), m_IsOpen(false)
+{
+}
+//------------------------------------------------------------------------------
+
+int PolyNode::ChildCount() const
+{
+ return (int)Childs.size();
+}
+//------------------------------------------------------------------------------
+
+void PolyNode::AddChild(PolyNode& child)
+{
+ unsigned cnt = (unsigned)Childs.size();
+ Childs.push_back(&child);
+ child.Parent = this;
+ child.Index = cnt;
+}
+//------------------------------------------------------------------------------
+
+PolyNode* PolyNode::GetNext() const
+{
+ if (!Childs.empty())
+ return Childs[0];
+ else
+ return GetNextSiblingUp();
+}
+//------------------------------------------------------------------------------
+
+PolyNode* PolyNode::GetNextSiblingUp() const
+{
+ if (!Parent) //protects against PolyTree.GetNextSiblingUp()
+ return 0;
+ else if (Index == Parent->Childs.size() - 1)
+ return Parent->GetNextSiblingUp();
+ else
+ return Parent->Childs[Index + 1];
+}
+//------------------------------------------------------------------------------
+
+bool PolyNode::IsHole() const
+{
+ bool result = true;
+ PolyNode* node = Parent;
+ while (node)
+ {
+ result = !result;
+ node = node->Parent;
+ }
+ return result;
+}
+//------------------------------------------------------------------------------
+
+bool PolyNode::IsOpen() const
+{
+ return m_IsOpen;
+}
+//------------------------------------------------------------------------------
+
+#ifndef use_int32
+
+//------------------------------------------------------------------------------
+// Int128 class (enables safe math on signed 64bit integers)
+// eg Int128 val1((long64)9223372036854775807); //ie 2^63 -1
+// Int128 val2((long64)9223372036854775807);
+// Int128 val3 = val1 * val2;
+// val3.AsString => "85070591730234615847396907784232501249" (8.5e+37)
+//------------------------------------------------------------------------------
+
+class Int128
+{
+ public:
+ ulong64 lo;
+ long64 hi;
+
+ Int128(long64 _lo = 0)
+ {
+ lo = (ulong64)_lo;
+ if (_lo < 0) hi = -1; else hi = 0;
+ }
+
+
+ Int128(const Int128 &val): lo(val.lo), hi(val.hi){}
+
+ Int128(const long64& _hi, const ulong64& _lo): lo(_lo), hi(_hi){}
+
+ Int128& operator = (const long64 &val)
+ {
+ lo = (ulong64)val;
+ if (val < 0) hi = -1; else hi = 0;
+ return *this;
+ }
+
+ bool operator == (const Int128 &val) const
+ {return (hi == val.hi && lo == val.lo);}
+
+ bool operator != (const Int128 &val) const
+ { return !(*this == val);}
+
+ bool operator > (const Int128 &val) const
+ {
+ if (hi != val.hi)
+ return hi > val.hi;
+ else
+ return lo > val.lo;
+ }
+
+ bool operator < (const Int128 &val) const
+ {
+ if (hi != val.hi)
+ return hi < val.hi;
+ else
+ return lo < val.lo;
+ }
+
+ bool operator >= (const Int128 &val) const
+ { return !(*this < val);}
+
+ bool operator <= (const Int128 &val) const
+ { return !(*this > val);}
+
+ Int128& operator += (const Int128 &rhs)
+ {
+ hi += rhs.hi;
+ lo += rhs.lo;
+ if (lo < rhs.lo) hi++;
+ return *this;
+ }
+
+ Int128 operator + (const Int128 &rhs) const
+ {
+ Int128 result(*this);
+ result+= rhs;
+ return result;
+ }
+
+ Int128& operator -= (const Int128 &rhs)
+ {
+ *this += -rhs;
+ return *this;
+ }
+
+ Int128 operator - (const Int128 &rhs) const
+ {
+ Int128 result(*this);
+ result -= rhs;
+ return result;
+ }
+
+ Int128 operator-() const //unary negation
+ {
+ if (lo == 0)
+ return Int128(-hi, 0);
+ else
+ return Int128(~hi, ~lo + 1);
+ }
+
+ operator double() const
+ {
+ const double shift64 = 18446744073709551616.0; //2^64
+ if (hi < 0)
+ {
+ if (lo == 0) return (double)hi * shift64;
+ else return -(double)(~lo + ~hi * shift64);
+ }
+ else
+ return (double)(lo + hi * shift64);
+ }
+
+};
+//------------------------------------------------------------------------------
+
+Int128 Int128Mul (long64 lhs, long64 rhs)
+{
+ bool negate = (lhs < 0) != (rhs < 0);
+
+ if (lhs < 0) lhs = -lhs;
+ ulong64 int1Hi = ulong64(lhs) >> 32;
+ ulong64 int1Lo = ulong64(lhs & 0xFFFFFFFF);
+
+ if (rhs < 0) rhs = -rhs;
+ ulong64 int2Hi = ulong64(rhs) >> 32;
+ ulong64 int2Lo = ulong64(rhs & 0xFFFFFFFF);
+
+ //nb: see comments in clipper.pas
+ ulong64 a = int1Hi * int2Hi;
+ ulong64 b = int1Lo * int2Lo;
+ ulong64 c = int1Hi * int2Lo + int1Lo * int2Hi;
+
+ Int128 tmp;
+ tmp.hi = long64(a + (c >> 32));
+ tmp.lo = long64(c << 32);
+ tmp.lo += long64(b);
+ if (tmp.lo < b) tmp.hi++;
+ if (negate) tmp = -tmp;
+ return tmp;
+};
+#endif
+
+//------------------------------------------------------------------------------
+// Miscellaneous global functions
+//------------------------------------------------------------------------------
+
+bool Orientation(const Path &poly)
+{
+ return Area(poly) >= 0;
+}
+//------------------------------------------------------------------------------
+
+double Area(const Path &poly)
+{
+ int size = (int)poly.size();
+ if (size < 3) return 0;
+
+ double a = 0;
+ for (int i = 0, j = size -1; i < size; ++i)
+ {
+ a += ((double)poly[j].X + poly[i].X) * ((double)poly[j].Y - poly[i].Y);
+ j = i;
+ }
+ return -a * 0.5;
+}
+//------------------------------------------------------------------------------
+
+double Area(const OutPt *op)
+{
+ const OutPt *startOp = op;
+ if (!op) return 0;
+ double a = 0;
+ do {
+ a += (double)(op->Prev->Pt.X + op->Pt.X) * (double)(op->Prev->Pt.Y - op->Pt.Y);
+ op = op->Next;
+ } while (op != startOp);
+ return a * 0.5;
+}
+//------------------------------------------------------------------------------
+
+double Area(const OutRec &outRec)
+{
+ return Area(outRec.Pts);
+}
+//------------------------------------------------------------------------------
+
+bool PointIsVertex(const IntPoint &Pt, OutPt *pp)
+{
+ OutPt *pp2 = pp;
+ do
+ {
+ if (pp2->Pt == Pt) return true;
+ pp2 = pp2->Next;
+ }
+ while (pp2 != pp);
+ return false;
+}
+//------------------------------------------------------------------------------
+
+//See "The Point in Polygon Problem for Arbitrary Polygons" by Hormann & Agathos
+//http://citeseerx.ist.psu.edu/viewdoc/download?doi=10.1.1.88.5498&rep=rep1&type=pdf
+int PointInPolygon(const IntPoint &pt, const Path &path)
+{
+ //returns 0 if false, +1 if true, -1 if pt ON polygon boundary
+ int result = 0;
+ size_t cnt = path.size();
+ if (cnt < 3) return 0;
+ IntPoint ip = path[0];
+ for(size_t i = 1; i <= cnt; ++i)
+ {
+ IntPoint ipNext = (i == cnt ? path[0] : path[i]);
+ if (ipNext.Y == pt.Y)
+ {
+ if ((ipNext.X == pt.X) || (ip.Y == pt.Y &&
+ ((ipNext.X > pt.X) == (ip.X < pt.X)))) return -1;
+ }
+ if ((ip.Y < pt.Y) != (ipNext.Y < pt.Y))
+ {
+ if (ip.X >= pt.X)
+ {
+ if (ipNext.X > pt.X) result = 1 - result;
+ else
+ {
+ double d = (double)(ip.X - pt.X) * (ipNext.Y - pt.Y) -
+ (double)(ipNext.X - pt.X) * (ip.Y - pt.Y);
+ if (!d) return -1;
+ if ((d > 0) == (ipNext.Y > ip.Y)) result = 1 - result;
+ }
+ } else
+ {
+ if (ipNext.X > pt.X)
+ {
+ double d = (double)(ip.X - pt.X) * (ipNext.Y - pt.Y) -
+ (double)(ipNext.X - pt.X) * (ip.Y - pt.Y);
+ if (!d) return -1;
+ if ((d > 0) == (ipNext.Y > ip.Y)) result = 1 - result;
+ }
+ }
+ }
+ ip = ipNext;
+ }
+ return result;
+}
+//------------------------------------------------------------------------------
+
+int PointInPolygon (const IntPoint &pt, OutPt *op)
+{
+ //returns 0 if false, +1 if true, -1 if pt ON polygon boundary
+ int result = 0;
+ OutPt* startOp = op;
+ for(;;)
+ {
+ if (op->Next->Pt.Y == pt.Y)
+ {
+ if ((op->Next->Pt.X == pt.X) || (op->Pt.Y == pt.Y &&
+ ((op->Next->Pt.X > pt.X) == (op->Pt.X < pt.X)))) return -1;
+ }
+ if ((op->Pt.Y < pt.Y) != (op->Next->Pt.Y < pt.Y))
+ {
+ if (op->Pt.X >= pt.X)
+ {
+ if (op->Next->Pt.X > pt.X) result = 1 - result;
+ else
+ {
+ double d = (double)(op->Pt.X - pt.X) * (op->Next->Pt.Y - pt.Y) -
+ (double)(op->Next->Pt.X - pt.X) * (op->Pt.Y - pt.Y);
+ if (!d) return -1;
+ if ((d > 0) == (op->Next->Pt.Y > op->Pt.Y)) result = 1 - result;
+ }
+ } else
+ {
+ if (op->Next->Pt.X > pt.X)
+ {
+ double d = (double)(op->Pt.X - pt.X) * (op->Next->Pt.Y - pt.Y) -
+ (double)(op->Next->Pt.X - pt.X) * (op->Pt.Y - pt.Y);
+ if (!d) return -1;
+ if ((d > 0) == (op->Next->Pt.Y > op->Pt.Y)) result = 1 - result;
+ }
+ }
+ }
+ op = op->Next;
+ if (startOp == op) break;
+ }
+ return result;
+}
+//------------------------------------------------------------------------------
+
+bool Poly2ContainsPoly1(OutPt *OutPt1, OutPt *OutPt2)
+{
+ OutPt* op = OutPt1;
+ do
+ {
+ //nb: PointInPolygon returns 0 if false, +1 if true, -1 if pt on polygon
+ int res = PointInPolygon(op->Pt, OutPt2);
+ if (res >= 0) return res > 0;
+ op = op->Next;
+ }
+ while (op != OutPt1);
+ return true;
+}
+//----------------------------------------------------------------------
+
+bool SlopesEqual(const TEdge &e1, const TEdge &e2, bool UseFullInt64Range)
+{
+#ifndef use_int32
+ if (UseFullInt64Range)
+ return Int128Mul(e1.Top.Y - e1.Bot.Y, e2.Top.X - e2.Bot.X) ==
+ Int128Mul(e1.Top.X - e1.Bot.X, e2.Top.Y - e2.Bot.Y);
+ else
+#endif
+ return (e1.Top.Y - e1.Bot.Y) * (e2.Top.X - e2.Bot.X) ==
+ (e1.Top.X - e1.Bot.X) * (e2.Top.Y - e2.Bot.Y);
+}
+//------------------------------------------------------------------------------
+
+bool SlopesEqual(const IntPoint pt1, const IntPoint pt2,
+ const IntPoint pt3, bool UseFullInt64Range)
+{
+#ifndef use_int32
+ if (UseFullInt64Range)
+ return Int128Mul(pt1.Y-pt2.Y, pt2.X-pt3.X) == Int128Mul(pt1.X-pt2.X, pt2.Y-pt3.Y);
+ else
+#endif
+ return (pt1.Y-pt2.Y)*(pt2.X-pt3.X) == (pt1.X-pt2.X)*(pt2.Y-pt3.Y);
+}
+//------------------------------------------------------------------------------
+
+bool SlopesEqual(const IntPoint pt1, const IntPoint pt2,
+ const IntPoint pt3, const IntPoint pt4, bool UseFullInt64Range)
+{
+#ifndef use_int32
+ if (UseFullInt64Range)
+ return Int128Mul(pt1.Y-pt2.Y, pt3.X-pt4.X) == Int128Mul(pt1.X-pt2.X, pt3.Y-pt4.Y);
+ else
+#endif
+ return (pt1.Y-pt2.Y)*(pt3.X-pt4.X) == (pt1.X-pt2.X)*(pt3.Y-pt4.Y);
+}
+//------------------------------------------------------------------------------
+
+inline bool IsHorizontal(TEdge &e)
+{
+ return e.Dx == HORIZONTAL;
+}
+//------------------------------------------------------------------------------
+
+inline double GetDx(const IntPoint pt1, const IntPoint pt2)
+{
+ return (pt1.Y == pt2.Y) ?
+ HORIZONTAL : (double)(pt2.X - pt1.X) / (pt2.Y - pt1.Y);
+}
+//---------------------------------------------------------------------------
+
+inline void SetDx(TEdge &e)
+{
+ cInt dy = (e.Top.Y - e.Bot.Y);
+ if (dy == 0) e.Dx = HORIZONTAL;
+ else e.Dx = (double)(e.Top.X - e.Bot.X) / dy;
+}
+//---------------------------------------------------------------------------
+
+inline void SwapSides(TEdge &Edge1, TEdge &Edge2)
+{
+ EdgeSide Side = Edge1.Side;
+ Edge1.Side = Edge2.Side;
+ Edge2.Side = Side;
+}
+//------------------------------------------------------------------------------
+
+inline void SwapPolyIndexes(TEdge &Edge1, TEdge &Edge2)
+{
+ int OutIdx = Edge1.OutIdx;
+ Edge1.OutIdx = Edge2.OutIdx;
+ Edge2.OutIdx = OutIdx;
+}
+//------------------------------------------------------------------------------
+
+inline cInt TopX(TEdge &edge, const cInt currentY)
+{
+ return ( currentY == edge.Top.Y ) ?
+ edge.Top.X : edge.Bot.X + Round(edge.Dx *(currentY - edge.Bot.Y));
+}
+//------------------------------------------------------------------------------
+
+void IntersectPoint(TEdge &Edge1, TEdge &Edge2, IntPoint &ip)
+{
+#ifdef use_xyz
+ ip.Z = 0;
+#endif
+
+ double b1, b2;
+ if (Edge1.Dx == Edge2.Dx)
+ {
+ ip.Y = Edge1.Curr.Y;
+ ip.X = TopX(Edge1, ip.Y);
+ return;
+ }
+ else if (Edge1.Dx == 0)
+ {
+ ip.X = Edge1.Bot.X;
+ if (IsHorizontal(Edge2))
+ ip.Y = Edge2.Bot.Y;
+ else
+ {
+ b2 = Edge2.Bot.Y - (Edge2.Bot.X / Edge2.Dx);
+ ip.Y = Round(ip.X / Edge2.Dx + b2);
+ }
+ }
+ else if (Edge2.Dx == 0)
+ {
+ ip.X = Edge2.Bot.X;
+ if (IsHorizontal(Edge1))
+ ip.Y = Edge1.Bot.Y;
+ else
+ {
+ b1 = Edge1.Bot.Y - (Edge1.Bot.X / Edge1.Dx);
+ ip.Y = Round(ip.X / Edge1.Dx + b1);
+ }
+ }
+ else
+ {
+ b1 = Edge1.Bot.X - Edge1.Bot.Y * Edge1.Dx;
+ b2 = Edge2.Bot.X - Edge2.Bot.Y * Edge2.Dx;
+ double q = (b2-b1) / (Edge1.Dx - Edge2.Dx);
+ ip.Y = Round(q);
+ if (std::fabs(Edge1.Dx) < std::fabs(Edge2.Dx))
+ ip.X = Round(Edge1.Dx * q + b1);
+ else
+ ip.X = Round(Edge2.Dx * q + b2);
+ }
+
+ if (ip.Y < Edge1.Top.Y || ip.Y < Edge2.Top.Y)
+ {
+ if (Edge1.Top.Y > Edge2.Top.Y)
+ ip.Y = Edge1.Top.Y;
+ else
+ ip.Y = Edge2.Top.Y;
+ if (std::fabs(Edge1.Dx) < std::fabs(Edge2.Dx))
+ ip.X = TopX(Edge1, ip.Y);
+ else
+ ip.X = TopX(Edge2, ip.Y);
+ }
+ //finally, don't allow 'ip' to be BELOW curr.Y (ie bottom of scanbeam) ...
+ if (ip.Y > Edge1.Curr.Y)
+ {
+ ip.Y = Edge1.Curr.Y;
+ //use the more vertical edge to derive X ...
+ if (std::fabs(Edge1.Dx) > std::fabs(Edge2.Dx))
+ ip.X = TopX(Edge2, ip.Y); else
+ ip.X = TopX(Edge1, ip.Y);
+ }
+}
+//------------------------------------------------------------------------------
+
+void ReversePolyPtLinks(OutPt *pp)
+{
+ if (!pp) return;
+ OutPt *pp1, *pp2;
+ pp1 = pp;
+ do {
+ pp2 = pp1->Next;
+ pp1->Next = pp1->Prev;
+ pp1->Prev = pp2;
+ pp1 = pp2;
+ } while( pp1 != pp );
+}
+//------------------------------------------------------------------------------
+
+void DisposeOutPts(OutPt*& pp)
+{
+ if (pp == 0) return;
+ pp->Prev->Next = 0;
+ while( pp )
+ {
+ OutPt *tmpPp = pp;
+ pp = pp->Next;
+ delete tmpPp;
+ }
+}
+//------------------------------------------------------------------------------
+
+inline void InitEdge(TEdge* e, TEdge* eNext, TEdge* ePrev, const IntPoint& Pt)
+{
+ std::memset(e, 0, sizeof(TEdge));
+ e->Next = eNext;
+ e->Prev = ePrev;
+ e->Curr = Pt;
+ e->OutIdx = Unassigned;
+}
+//------------------------------------------------------------------------------
+
+void InitEdge2(TEdge& e, PolyType Pt)
+{
+ if (e.Curr.Y >= e.Next->Curr.Y)
+ {
+ e.Bot = e.Curr;
+ e.Top = e.Next->Curr;
+ } else
+ {
+ e.Top = e.Curr;
+ e.Bot = e.Next->Curr;
+ }
+ SetDx(e);
+ e.PolyTyp = Pt;
+}
+//------------------------------------------------------------------------------
+
+TEdge* RemoveEdge(TEdge* e)
+{
+ //removes e from double_linked_list (but without removing from memory)
+ e->Prev->Next = e->Next;
+ e->Next->Prev = e->Prev;
+ TEdge* result = e->Next;
+ e->Prev = 0; //flag as removed (see ClipperBase.Clear)
+ return result;
+}
+//------------------------------------------------------------------------------
+
+inline void ReverseHorizontal(TEdge &e)
+{
+ //swap horizontal edges' Top and Bottom x's so they follow the natural
+ //progression of the bounds - ie so their xbots will align with the
+ //adjoining lower edge. [Helpful in the ProcessHorizontal() method.]
+ std::swap(e.Top.X, e.Bot.X);
+#ifdef use_xyz
+ std::swap(e.Top.Z, e.Bot.Z);
+#endif
+}
+//------------------------------------------------------------------------------
+
+void SwapPoints(IntPoint &pt1, IntPoint &pt2)
+{
+ IntPoint tmp = pt1;
+ pt1 = pt2;
+ pt2 = tmp;
+}
+//------------------------------------------------------------------------------
+
+bool GetOverlapSegment(IntPoint pt1a, IntPoint pt1b, IntPoint pt2a,
+ IntPoint pt2b, IntPoint &pt1, IntPoint &pt2)
+{
+ //precondition: segments are Collinear.
+ if (Abs(pt1a.X - pt1b.X) > Abs(pt1a.Y - pt1b.Y))
+ {
+ if (pt1a.X > pt1b.X) SwapPoints(pt1a, pt1b);
+ if (pt2a.X > pt2b.X) SwapPoints(pt2a, pt2b);
+ if (pt1a.X > pt2a.X) pt1 = pt1a; else pt1 = pt2a;
+ if (pt1b.X < pt2b.X) pt2 = pt1b; else pt2 = pt2b;
+ return pt1.X < pt2.X;
+ } else
+ {
+ if (pt1a.Y < pt1b.Y) SwapPoints(pt1a, pt1b);
+ if (pt2a.Y < pt2b.Y) SwapPoints(pt2a, pt2b);
+ if (pt1a.Y < pt2a.Y) pt1 = pt1a; else pt1 = pt2a;
+ if (pt1b.Y > pt2b.Y) pt2 = pt1b; else pt2 = pt2b;
+ return pt1.Y > pt2.Y;
+ }
+}
+//------------------------------------------------------------------------------
+
+bool FirstIsBottomPt(const OutPt* btmPt1, const OutPt* btmPt2)
+{
+ OutPt *p = btmPt1->Prev;
+ while ((p->Pt == btmPt1->Pt) && (p != btmPt1)) p = p->Prev;
+ double dx1p = std::fabs(GetDx(btmPt1->Pt, p->Pt));
+ p = btmPt1->Next;
+ while ((p->Pt == btmPt1->Pt) && (p != btmPt1)) p = p->Next;
+ double dx1n = std::fabs(GetDx(btmPt1->Pt, p->Pt));
+
+ p = btmPt2->Prev;
+ while ((p->Pt == btmPt2->Pt) && (p != btmPt2)) p = p->Prev;
+ double dx2p = std::fabs(GetDx(btmPt2->Pt, p->Pt));
+ p = btmPt2->Next;
+ while ((p->Pt == btmPt2->Pt) && (p != btmPt2)) p = p->Next;
+ double dx2n = std::fabs(GetDx(btmPt2->Pt, p->Pt));
+
+ if (std::max(dx1p, dx1n) == std::max(dx2p, dx2n) &&
+ std::min(dx1p, dx1n) == std::min(dx2p, dx2n))
+ return Area(btmPt1) > 0; //if otherwise identical use orientation
+ else
+ return (dx1p >= dx2p && dx1p >= dx2n) || (dx1n >= dx2p && dx1n >= dx2n);
+}
+//------------------------------------------------------------------------------
+
+OutPt* GetBottomPt(OutPt *pp)
+{
+ OutPt* dups = 0;
+ OutPt* p = pp->Next;
+ while (p != pp)
+ {
+ if (p->Pt.Y > pp->Pt.Y)
+ {
+ pp = p;
+ dups = 0;
+ }
+ else if (p->Pt.Y == pp->Pt.Y && p->Pt.X <= pp->Pt.X)
+ {
+ if (p->Pt.X < pp->Pt.X)
+ {
+ dups = 0;
+ pp = p;
+ } else
+ {
+ if (p->Next != pp && p->Prev != pp) dups = p;
+ }
+ }
+ p = p->Next;
+ }
+ if (dups)
+ {
+ //there appears to be at least 2 vertices at BottomPt so ...
+ while (dups != p)
+ {
+ if (!FirstIsBottomPt(p, dups)) pp = dups;
+ dups = dups->Next;
+ while (dups->Pt != pp->Pt) dups = dups->Next;
+ }
+ }
+ return pp;
+}
+//------------------------------------------------------------------------------
+
+bool Pt2IsBetweenPt1AndPt3(const IntPoint pt1,
+ const IntPoint pt2, const IntPoint pt3)
+{
+ if ((pt1 == pt3) || (pt1 == pt2) || (pt3 == pt2))
+ return false;
+ else if (pt1.X != pt3.X)
+ return (pt2.X > pt1.X) == (pt2.X < pt3.X);
+ else
+ return (pt2.Y > pt1.Y) == (pt2.Y < pt3.Y);
+}
+//------------------------------------------------------------------------------
+
+bool HorzSegmentsOverlap(cInt seg1a, cInt seg1b, cInt seg2a, cInt seg2b)
+{
+ if (seg1a > seg1b) std::swap(seg1a, seg1b);
+ if (seg2a > seg2b) std::swap(seg2a, seg2b);
+ return (seg1a < seg2b) && (seg2a < seg1b);
+}
+
+//------------------------------------------------------------------------------
+// ClipperBase class methods ...
+//------------------------------------------------------------------------------
+
+ClipperBase::ClipperBase() //constructor
+{
+ m_CurrentLM = m_MinimaList.begin(); //begin() == end() here
+ m_UseFullRange = false;
+}
+//------------------------------------------------------------------------------
+
+ClipperBase::~ClipperBase() //destructor
+{
+ Clear();
+}
+//------------------------------------------------------------------------------
+
+void RangeTest(const IntPoint& Pt, bool& useFullRange)
+{
+ if (useFullRange)
+ {
+ if (Pt.X > hiRange || Pt.Y > hiRange || -Pt.X > hiRange || -Pt.Y > hiRange)
+ throw clipperException("Coordinate outside allowed range");
+ }
+ else if (Pt.X > loRange|| Pt.Y > loRange || -Pt.X > loRange || -Pt.Y > loRange)
+ {
+ useFullRange = true;
+ RangeTest(Pt, useFullRange);
+ }
+}
+//------------------------------------------------------------------------------
+
+TEdge* FindNextLocMin(TEdge* E)
+{
+ for (;;)
+ {
+ while (E->Bot != E->Prev->Bot || E->Curr == E->Top) E = E->Next;
+ if (!IsHorizontal(*E) && !IsHorizontal(*E->Prev)) break;
+ while (IsHorizontal(*E->Prev)) E = E->Prev;
+ TEdge* E2 = E;
+ while (IsHorizontal(*E)) E = E->Next;
+ if (E->Top.Y == E->Prev->Bot.Y) continue; //ie just an intermediate horz.
+ if (E2->Prev->Bot.X < E->Bot.X) E = E2;
+ break;
+ }
+ return E;
+}
+//------------------------------------------------------------------------------
+
+TEdge* ClipperBase::ProcessBound(TEdge* E, bool NextIsForward)
+{
+ TEdge *Result = E;
+ TEdge *Horz = 0;
+
+ if (E->OutIdx == Skip)
+ {
+ //if edges still remain in the current bound beyond the skip edge then
+ //create another LocMin and call ProcessBound once more
+ if (NextIsForward)
+ {
+ while (E->Top.Y == E->Next->Bot.Y) E = E->Next;
+ //don't include top horizontals when parsing a bound a second time,
+ //they will be contained in the opposite bound ...
+ while (E != Result && IsHorizontal(*E)) E = E->Prev;
+ }
+ else
+ {
+ while (E->Top.Y == E->Prev->Bot.Y) E = E->Prev;
+ while (E != Result && IsHorizontal(*E)) E = E->Next;
+ }
+
+ if (E == Result)
+ {
+ if (NextIsForward) Result = E->Next;
+ else Result = E->Prev;
+ }
+ else
+ {
+ //there are more edges in the bound beyond result starting with E
+ if (NextIsForward)
+ E = Result->Next;
+ else
+ E = Result->Prev;
+ MinimaList::value_type locMin;
+ locMin.Y = E->Bot.Y;
+ locMin.LeftBound = 0;
+ locMin.RightBound = E;
+ E->WindDelta = 0;
+ Result = ProcessBound(E, NextIsForward);
+ m_MinimaList.push_back(locMin);
+ }
+ return Result;
+ }
+
+ TEdge *EStart;
+
+ if (IsHorizontal(*E))
+ {
+ //We need to be careful with open paths because this may not be a
+ //true local minima (ie E may be following a skip edge).
+ //Also, consecutive horz. edges may start heading left before going right.
+ if (NextIsForward)
+ EStart = E->Prev;
+ else
+ EStart = E->Next;
+ if (IsHorizontal(*EStart)) //ie an adjoining horizontal skip edge
+ {
+ if (EStart->Bot.X != E->Bot.X && EStart->Top.X != E->Bot.X)
+ ReverseHorizontal(*E);
+ }
+ else if (EStart->Bot.X != E->Bot.X)
+ ReverseHorizontal(*E);
+ }
+
+ EStart = E;
+ if (NextIsForward)
+ {
+ while (Result->Top.Y == Result->Next->Bot.Y && Result->Next->OutIdx != Skip)
+ Result = Result->Next;
+ if (IsHorizontal(*Result) && Result->Next->OutIdx != Skip)
+ {
+ //nb: at the top of a bound, horizontals are added to the bound
+ //only when the preceding edge attaches to the horizontal's left vertex
+ //unless a Skip edge is encountered when that becomes the top divide
+ Horz = Result;
+ while (IsHorizontal(*Horz->Prev)) Horz = Horz->Prev;
+ if (Horz->Prev->Top.X > Result->Next->Top.X) Result = Horz->Prev;
+ }
+ while (E != Result)
+ {
+ E->NextInLML = E->Next;
+ if (IsHorizontal(*E) && E != EStart &&
+ E->Bot.X != E->Prev->Top.X) ReverseHorizontal(*E);
+ E = E->Next;
+ }
+ if (IsHorizontal(*E) && E != EStart && E->Bot.X != E->Prev->Top.X)
+ ReverseHorizontal(*E);
+ Result = Result->Next; //move to the edge just beyond current bound
+ } else
+ {
+ while (Result->Top.Y == Result->Prev->Bot.Y && Result->Prev->OutIdx != Skip)
+ Result = Result->Prev;
+ if (IsHorizontal(*Result) && Result->Prev->OutIdx != Skip)
+ {
+ Horz = Result;
+ while (IsHorizontal(*Horz->Next)) Horz = Horz->Next;
+ if (Horz->Next->Top.X == Result->Prev->Top.X ||
+ Horz->Next->Top.X > Result->Prev->Top.X) Result = Horz->Next;
+ }
+
+ while (E != Result)
+ {
+ E->NextInLML = E->Prev;
+ if (IsHorizontal(*E) && E != EStart && E->Bot.X != E->Next->Top.X)
+ ReverseHorizontal(*E);
+ E = E->Prev;
+ }
+ if (IsHorizontal(*E) && E != EStart && E->Bot.X != E->Next->Top.X)
+ ReverseHorizontal(*E);
+ Result = Result->Prev; //move to the edge just beyond current bound
+ }
+
+ return Result;
+}
+//------------------------------------------------------------------------------
+
+bool ClipperBase::AddPath(const Path &pg, PolyType PolyTyp, bool Closed)
+{
+#ifdef use_lines
+ if (!Closed && PolyTyp == ptClip)
+ throw clipperException("AddPath: Open paths must be subject.");
+#else
+ if (!Closed)
+ throw clipperException("AddPath: Open paths have been disabled.");
+#endif
+
+ int highI = (int)pg.size() -1;
+ if (Closed) while (highI > 0 && (pg[highI] == pg[0])) --highI;
+ while (highI > 0 && (pg[highI] == pg[highI -1])) --highI;
+ if ((Closed && highI < 2) || (!Closed && highI < 1)) return false;
+
+ //create a new edge array ...
+ TEdge *edges = new TEdge [highI +1];
+
+ bool IsFlat = true;
+ //1. Basic (first) edge initialization ...
+ try
+ {
+ edges[1].Curr = pg[1];
+ RangeTest(pg[0], m_UseFullRange);
+ RangeTest(pg[highI], m_UseFullRange);
+ InitEdge(&edges[0], &edges[1], &edges[highI], pg[0]);
+ InitEdge(&edges[highI], &edges[0], &edges[highI-1], pg[highI]);
+ for (int i = highI - 1; i >= 1; --i)
+ {
+ RangeTest(pg[i], m_UseFullRange);
+ InitEdge(&edges[i], &edges[i+1], &edges[i-1], pg[i]);
+ }
+ }
+ catch(...)
+ {
+ delete [] edges;
+ throw; //range test fails
+ }
+ TEdge *eStart = &edges[0];
+
+ //2. Remove duplicate vertices, and (when closed) collinear edges ...
+ TEdge *E = eStart, *eLoopStop = eStart;
+ for (;;)
+ {
+ //nb: allows matching start and end points when not Closed ...
+ if (E->Curr == E->Next->Curr && (Closed || E->Next != eStart))
+ {
+ if (E == E->Next) break;
+ if (E == eStart) eStart = E->Next;
+ E = RemoveEdge(E);
+ eLoopStop = E;
+ continue;
+ }
+ if (E->Prev == E->Next)
+ break; //only two vertices
+ else if (Closed &&
+ SlopesEqual(E->Prev->Curr, E->Curr, E->Next->Curr, m_UseFullRange) &&
+ (!m_PreserveCollinear ||
+ !Pt2IsBetweenPt1AndPt3(E->Prev->Curr, E->Curr, E->Next->Curr)))
+ {
+ //Collinear edges are allowed for open paths but in closed paths
+ //the default is to merge adjacent collinear edges into a single edge.
+ //However, if the PreserveCollinear property is enabled, only overlapping
+ //collinear edges (ie spikes) will be removed from closed paths.
+ if (E == eStart) eStart = E->Next;
+ E = RemoveEdge(E);
+ E = E->Prev;
+ eLoopStop = E;
+ continue;
+ }
+ E = E->Next;
+ if ((E == eLoopStop) || (!Closed && E->Next == eStart)) break;
+ }
+
+ if ((!Closed && (E == E->Next)) || (Closed && (E->Prev == E->Next)))
+ {
+ delete [] edges;
+ return false;
+ }
+
+ if (!Closed)
+ {
+ m_HasOpenPaths = true;
+ eStart->Prev->OutIdx = Skip;
+ }
+
+ //3. Do second stage of edge initialization ...
+ E = eStart;
+ do
+ {
+ InitEdge2(*E, PolyTyp);
+ E = E->Next;
+ if (IsFlat && E->Curr.Y != eStart->Curr.Y) IsFlat = false;
+ }
+ while (E != eStart);
+
+ //4. Finally, add edge bounds to LocalMinima list ...
+
+ //Totally flat paths must be handled differently when adding them
+ //to LocalMinima list to avoid endless loops etc ...
+ if (IsFlat)
+ {
+ if (Closed)
+ {
+ delete [] edges;
+ return false;
+ }
+ E->Prev->OutIdx = Skip;
+ MinimaList::value_type locMin;
+ locMin.Y = E->Bot.Y;
+ locMin.LeftBound = 0;
+ locMin.RightBound = E;
+ locMin.RightBound->Side = esRight;
+ locMin.RightBound->WindDelta = 0;
+ for (;;)
+ {
+ if (E->Bot.X != E->Prev->Top.X) ReverseHorizontal(*E);
+ if (E->Next->OutIdx == Skip) break;
+ E->NextInLML = E->Next;
+ E = E->Next;
+ }
+ m_MinimaList.push_back(locMin);
+ m_edges.push_back(edges);
+ return true;
+ }
+
+ m_edges.push_back(edges);
+ bool leftBoundIsForward;
+ TEdge* EMin = 0;
+
+ //workaround to avoid an endless loop in the while loop below when
+ //open paths have matching start and end points ...
+ if (E->Prev->Bot == E->Prev->Top) E = E->Next;
+
+ for (;;)
+ {
+ E = FindNextLocMin(E);
+ if (E == EMin) break;
+ else if (!EMin) EMin = E;
+
+ //E and E.Prev now share a local minima (left aligned if horizontal).
+ //Compare their slopes to find which starts which bound ...
+ MinimaList::value_type locMin;
+ locMin.Y = E->Bot.Y;
+ if (E->Dx < E->Prev->Dx)
+ {
+ locMin.LeftBound = E->Prev;
+ locMin.RightBound = E;
+ leftBoundIsForward = false; //Q.nextInLML = Q.prev
+ } else
+ {
+ locMin.LeftBound = E;
+ locMin.RightBound = E->Prev;
+ leftBoundIsForward = true; //Q.nextInLML = Q.next
+ }
+
+ if (!Closed) locMin.LeftBound->WindDelta = 0;
+ else if (locMin.LeftBound->Next == locMin.RightBound)
+ locMin.LeftBound->WindDelta = -1;
+ else locMin.LeftBound->WindDelta = 1;
+ locMin.RightBound->WindDelta = -locMin.LeftBound->WindDelta;
+
+ E = ProcessBound(locMin.LeftBound, leftBoundIsForward);
+ if (E->OutIdx == Skip) E = ProcessBound(E, leftBoundIsForward);
+
+ TEdge* E2 = ProcessBound(locMin.RightBound, !leftBoundIsForward);
+ if (E2->OutIdx == Skip) E2 = ProcessBound(E2, !leftBoundIsForward);
+
+ if (locMin.LeftBound->OutIdx == Skip)
+ locMin.LeftBound = 0;
+ else if (locMin.RightBound->OutIdx == Skip)
+ locMin.RightBound = 0;
+ m_MinimaList.push_back(locMin);
+ if (!leftBoundIsForward) E = E2;
+ }
+ return true;
+}
+//------------------------------------------------------------------------------
+
+bool ClipperBase::AddPaths(const Paths &ppg, PolyType PolyTyp, bool Closed)
+{
+ bool result = false;
+ for (Paths::size_type i = 0; i < ppg.size(); ++i)
+ if (AddPath(ppg[i], PolyTyp, Closed)) result = true;
+ return result;
+}
+//------------------------------------------------------------------------------
+
+void ClipperBase::Clear()
+{
+ DisposeLocalMinimaList();
+ for (EdgeList::size_type i = 0; i < m_edges.size(); ++i)
+ {
+ TEdge* edges = m_edges[i];
+ delete [] edges;
+ }
+ m_edges.clear();
+ m_UseFullRange = false;
+ m_HasOpenPaths = false;
+}
+//------------------------------------------------------------------------------
+
+void ClipperBase::Reset()
+{
+ m_CurrentLM = m_MinimaList.begin();
+ if (m_CurrentLM == m_MinimaList.end()) return; //ie nothing to process
+ std::sort(m_MinimaList.begin(), m_MinimaList.end(), LocMinSorter());
+
+ m_Scanbeam = ScanbeamList(); //clears/resets priority_queue
+ //reset all edges ...
+ for (MinimaList::iterator lm = m_MinimaList.begin(); lm != m_MinimaList.end(); ++lm)
+ {
+ InsertScanbeam(lm->Y);
+ TEdge* e = lm->LeftBound;
+ if (e)
+ {
+ e->Curr = e->Bot;
+ e->Side = esLeft;
+ e->OutIdx = Unassigned;
+ }
+
+ e = lm->RightBound;
+ if (e)
+ {
+ e->Curr = e->Bot;
+ e->Side = esRight;
+ e->OutIdx = Unassigned;
+ }
+ }
+ m_ActiveEdges = 0;
+ m_CurrentLM = m_MinimaList.begin();
+}
+//------------------------------------------------------------------------------
+
+void ClipperBase::DisposeLocalMinimaList()
+{
+ m_MinimaList.clear();
+ m_CurrentLM = m_MinimaList.begin();
+}
+//------------------------------------------------------------------------------
+
+bool ClipperBase::PopLocalMinima(cInt Y, const LocalMinimum *&locMin)
+{
+ if (m_CurrentLM == m_MinimaList.end() || (*m_CurrentLM).Y != Y) return false;
+ locMin = &(*m_CurrentLM);
+ ++m_CurrentLM;
+ return true;
+}
+//------------------------------------------------------------------------------
+
+IntRect ClipperBase::GetBounds()
+{
+ IntRect result;
+ MinimaList::iterator lm = m_MinimaList.begin();
+ if (lm == m_MinimaList.end())
+ {
+ result.left = result.top = result.right = result.bottom = 0;
+ return result;
+ }
+ result.left = lm->LeftBound->Bot.X;
+ result.top = lm->LeftBound->Bot.Y;
+ result.right = lm->LeftBound->Bot.X;
+ result.bottom = lm->LeftBound->Bot.Y;
+ while (lm != m_MinimaList.end())
+ {
+ //todo - needs fixing for open paths
+ result.bottom = std::max(result.bottom, lm->LeftBound->Bot.Y);
+ TEdge* e = lm->LeftBound;
+ for (;;) {
+ TEdge* bottomE = e;
+ while (e->NextInLML)
+ {
+ if (e->Bot.X < result.left) result.left = e->Bot.X;
+ if (e->Bot.X > result.right) result.right = e->Bot.X;
+ e = e->NextInLML;
+ }
+ result.left = std::min(result.left, e->Bot.X);
+ result.right = std::max(result.right, e->Bot.X);
+ result.left = std::min(result.left, e->Top.X);
+ result.right = std::max(result.right, e->Top.X);
+ result.top = std::min(result.top, e->Top.Y);
+ if (bottomE == lm->LeftBound) e = lm->RightBound;
+ else break;
+ }
+ ++lm;
+ }
+ return result;
+}
+//------------------------------------------------------------------------------
+
+void ClipperBase::InsertScanbeam(const cInt Y)
+{
+ m_Scanbeam.push(Y);
+}
+//------------------------------------------------------------------------------
+
+bool ClipperBase::PopScanbeam(cInt &Y)
+{
+ if (m_Scanbeam.empty()) return false;
+ Y = m_Scanbeam.top();
+ m_Scanbeam.pop();
+ while (!m_Scanbeam.empty() && Y == m_Scanbeam.top()) { m_Scanbeam.pop(); } // Pop duplicates.
+ return true;
+}
+//------------------------------------------------------------------------------
+
+void ClipperBase::DisposeAllOutRecs(){
+ for (PolyOutList::size_type i = 0; i < m_PolyOuts.size(); ++i)
+ DisposeOutRec(i);
+ m_PolyOuts.clear();
+}
+//------------------------------------------------------------------------------
+
+void ClipperBase::DisposeOutRec(PolyOutList::size_type index)
+{
+ OutRec *outRec = m_PolyOuts[index];
+ if (outRec->Pts) DisposeOutPts(outRec->Pts);
+ delete outRec;
+ m_PolyOuts[index] = 0;
+}
+//------------------------------------------------------------------------------
+
+void ClipperBase::DeleteFromAEL(TEdge *e)
+{
+ TEdge* AelPrev = e->PrevInAEL;
+ TEdge* AelNext = e->NextInAEL;
+ if (!AelPrev && !AelNext && (e != m_ActiveEdges)) return; //already deleted
+ if (AelPrev) AelPrev->NextInAEL = AelNext;
+ else m_ActiveEdges = AelNext;
+ if (AelNext) AelNext->PrevInAEL = AelPrev;
+ e->NextInAEL = 0;
+ e->PrevInAEL = 0;
+}
+//------------------------------------------------------------------------------
+
+OutRec* ClipperBase::CreateOutRec()
+{
+ OutRec* result = new OutRec;
+ result->IsHole = false;
+ result->IsOpen = false;
+ result->FirstLeft = 0;
+ result->Pts = 0;
+ result->BottomPt = 0;
+ result->PolyNd = 0;
+ m_PolyOuts.push_back(result);
+ result->Idx = (int)m_PolyOuts.size() - 1;
+ return result;
+}
+//------------------------------------------------------------------------------
+
+void ClipperBase::SwapPositionsInAEL(TEdge *Edge1, TEdge *Edge2)
+{
+ //check that one or other edge hasn't already been removed from AEL ...
+ if (Edge1->NextInAEL == Edge1->PrevInAEL ||
+ Edge2->NextInAEL == Edge2->PrevInAEL) return;
+
+ if (Edge1->NextInAEL == Edge2)
+ {
+ TEdge* Next = Edge2->NextInAEL;
+ if (Next) Next->PrevInAEL = Edge1;
+ TEdge* Prev = Edge1->PrevInAEL;
+ if (Prev) Prev->NextInAEL = Edge2;
+ Edge2->PrevInAEL = Prev;
+ Edge2->NextInAEL = Edge1;
+ Edge1->PrevInAEL = Edge2;
+ Edge1->NextInAEL = Next;
+ }
+ else if (Edge2->NextInAEL == Edge1)
+ {
+ TEdge* Next = Edge1->NextInAEL;
+ if (Next) Next->PrevInAEL = Edge2;
+ TEdge* Prev = Edge2->PrevInAEL;
+ if (Prev) Prev->NextInAEL = Edge1;
+ Edge1->PrevInAEL = Prev;
+ Edge1->NextInAEL = Edge2;
+ Edge2->PrevInAEL = Edge1;
+ Edge2->NextInAEL = Next;
+ }
+ else
+ {
+ TEdge* Next = Edge1->NextInAEL;
+ TEdge* Prev = Edge1->PrevInAEL;
+ Edge1->NextInAEL = Edge2->NextInAEL;
+ if (Edge1->NextInAEL) Edge1->NextInAEL->PrevInAEL = Edge1;
+ Edge1->PrevInAEL = Edge2->PrevInAEL;
+ if (Edge1->PrevInAEL) Edge1->PrevInAEL->NextInAEL = Edge1;
+ Edge2->NextInAEL = Next;
+ if (Edge2->NextInAEL) Edge2->NextInAEL->PrevInAEL = Edge2;
+ Edge2->PrevInAEL = Prev;
+ if (Edge2->PrevInAEL) Edge2->PrevInAEL->NextInAEL = Edge2;
+ }
+
+ if (!Edge1->PrevInAEL) m_ActiveEdges = Edge1;
+ else if (!Edge2->PrevInAEL) m_ActiveEdges = Edge2;
+}
+//------------------------------------------------------------------------------
+
+void ClipperBase::UpdateEdgeIntoAEL(TEdge *&e)
+{
+ if (!e->NextInLML)
+ throw clipperException("UpdateEdgeIntoAEL: invalid call");
+
+ e->NextInLML->OutIdx = e->OutIdx;
+ TEdge* AelPrev = e->PrevInAEL;
+ TEdge* AelNext = e->NextInAEL;
+ if (AelPrev) AelPrev->NextInAEL = e->NextInLML;
+ else m_ActiveEdges = e->NextInLML;
+ if (AelNext) AelNext->PrevInAEL = e->NextInLML;
+ e->NextInLML->Side = e->Side;
+ e->NextInLML->WindDelta = e->WindDelta;
+ e->NextInLML->WindCnt = e->WindCnt;
+ e->NextInLML->WindCnt2 = e->WindCnt2;
+ e = e->NextInLML;
+ e->Curr = e->Bot;
+ e->PrevInAEL = AelPrev;
+ e->NextInAEL = AelNext;
+ if (!IsHorizontal(*e)) InsertScanbeam(e->Top.Y);
+}
+//------------------------------------------------------------------------------
+
+bool ClipperBase::LocalMinimaPending()
+{
+ return (m_CurrentLM != m_MinimaList.end());
+}
+
+//------------------------------------------------------------------------------
+// TClipper methods ...
+//------------------------------------------------------------------------------
+
+Clipper::Clipper(int initOptions) : ClipperBase() //constructor
+{
+ m_ExecuteLocked = false;
+ m_UseFullRange = false;
+ m_ReverseOutput = ((initOptions & ioReverseSolution) != 0);
+ m_StrictSimple = ((initOptions & ioStrictlySimple) != 0);
+ m_PreserveCollinear = ((initOptions & ioPreserveCollinear) != 0);
+ m_HasOpenPaths = false;
+#ifdef use_xyz
+ m_ZFill = 0;
+#endif
+}
+//------------------------------------------------------------------------------
+
+#ifdef use_xyz
+void Clipper::ZFillFunction(ZFillCallback zFillFunc)
+{
+ m_ZFill = zFillFunc;
+}
+//------------------------------------------------------------------------------
+#endif
+
+bool Clipper::Execute(ClipType clipType, Paths &solution, PolyFillType fillType)
+{
+ return Execute(clipType, solution, fillType, fillType);
+}
+//------------------------------------------------------------------------------
+
+bool Clipper::Execute(ClipType clipType, PolyTree &polytree, PolyFillType fillType)
+{
+ return Execute(clipType, polytree, fillType, fillType);
+}
+//------------------------------------------------------------------------------
+
+bool Clipper::Execute(ClipType clipType, Paths &solution,
+ PolyFillType subjFillType, PolyFillType clipFillType)
+{
+ if( m_ExecuteLocked ) return false;
+ if (m_HasOpenPaths)
+ throw clipperException("Error: PolyTree struct is needed for open path clipping.");
+ m_ExecuteLocked = true;
+ solution.resize(0);
+ m_SubjFillType = subjFillType;
+ m_ClipFillType = clipFillType;
+ m_ClipType = clipType;
+ m_UsingPolyTree = false;
+ bool succeeded = ExecuteInternal();
+ if (succeeded) BuildResult(solution);
+ DisposeAllOutRecs();
+ m_ExecuteLocked = false;
+ return succeeded;
+}
+//------------------------------------------------------------------------------
+
+bool Clipper::Execute(ClipType clipType, PolyTree& polytree,
+ PolyFillType subjFillType, PolyFillType clipFillType)
+{
+ if( m_ExecuteLocked ) return false;
+ m_ExecuteLocked = true;
+ m_SubjFillType = subjFillType;
+ m_ClipFillType = clipFillType;
+ m_ClipType = clipType;
+ m_UsingPolyTree = true;
+ bool succeeded = ExecuteInternal();
+ if (succeeded) BuildResult2(polytree);
+ DisposeAllOutRecs();
+ m_ExecuteLocked = false;
+ return succeeded;
+}
+//------------------------------------------------------------------------------
+
+void Clipper::FixHoleLinkage(OutRec &outrec)
+{
+ //skip OutRecs that (a) contain outermost polygons or
+ //(b) already have the correct owner/child linkage ...
+ if (!outrec.FirstLeft ||
+ (outrec.IsHole != outrec.FirstLeft->IsHole &&
+ outrec.FirstLeft->Pts)) return;
+
+ OutRec* orfl = outrec.FirstLeft;
+ while (orfl && ((orfl->IsHole == outrec.IsHole) || !orfl->Pts))
+ orfl = orfl->FirstLeft;
+ outrec.FirstLeft = orfl;
+}
+//------------------------------------------------------------------------------
+
+bool Clipper::ExecuteInternal()
+{
+ bool succeeded = true;
+ try {
+ Reset();
+ m_Maxima = MaximaList();
+ m_SortedEdges = 0;
+
+ succeeded = true;
+ cInt botY, topY;
+ if (!PopScanbeam(botY)) return false;
+ InsertLocalMinimaIntoAEL(botY);
+ while (PopScanbeam(topY) || LocalMinimaPending())
+ {
+ ProcessHorizontals();
+ ClearGhostJoins();
+ if (!ProcessIntersections(topY))
+ {
+ succeeded = false;
+ break;
+ }
+ ProcessEdgesAtTopOfScanbeam(topY);
+ botY = topY;
+ InsertLocalMinimaIntoAEL(botY);
+ }
+ }
+ catch(...)
+ {
+ succeeded = false;
+ }
+
+ if (succeeded)
+ {
+ //fix orientations ...
+ for (PolyOutList::size_type i = 0; i < m_PolyOuts.size(); ++i)
+ {
+ OutRec *outRec = m_PolyOuts[i];
+ if (!outRec->Pts || outRec->IsOpen) continue;
+ if ((outRec->IsHole ^ m_ReverseOutput) == (Area(*outRec) > 0))
+ ReversePolyPtLinks(outRec->Pts);
+ }
+
+ if (!m_Joins.empty()) JoinCommonEdges();
+
+ //unfortunately FixupOutPolygon() must be done after JoinCommonEdges()
+ for (PolyOutList::size_type i = 0; i < m_PolyOuts.size(); ++i)
+ {
+ OutRec *outRec = m_PolyOuts[i];
+ if (!outRec->Pts) continue;
+ if (outRec->IsOpen)
+ FixupOutPolyline(*outRec);
+ else
+ FixupOutPolygon(*outRec);
+ }
+
+ if (m_StrictSimple) DoSimplePolygons();
+ }
+
+ ClearJoins();
+ ClearGhostJoins();
+ return succeeded;
+}
+//------------------------------------------------------------------------------
+
+void Clipper::SetWindingCount(TEdge &edge)
+{
+ TEdge *e = edge.PrevInAEL;
+ //find the edge of the same polytype that immediately preceeds 'edge' in AEL
+ while (e && ((e->PolyTyp != edge.PolyTyp) || (e->WindDelta == 0))) e = e->PrevInAEL;
+ if (!e)
+ {
+ if (edge.WindDelta == 0)
+ {
+ PolyFillType pft = (edge.PolyTyp == ptSubject ? m_SubjFillType : m_ClipFillType);
+ edge.WindCnt = (pft == pftNegative ? -1 : 1);
+ }
+ else
+ edge.WindCnt = edge.WindDelta;
+ edge.WindCnt2 = 0;
+ e = m_ActiveEdges; //ie get ready to calc WindCnt2
+ }
+ else if (edge.WindDelta == 0 && m_ClipType != ctUnion)
+ {
+ edge.WindCnt = 1;
+ edge.WindCnt2 = e->WindCnt2;
+ e = e->NextInAEL; //ie get ready to calc WindCnt2
+ }
+ else if (IsEvenOddFillType(edge))
+ {
+ //EvenOdd filling ...
+ if (edge.WindDelta == 0)
+ {
+ //are we inside a subj polygon ...
+ bool Inside = true;
+ TEdge *e2 = e->PrevInAEL;
+ while (e2)
+ {
+ if (e2->PolyTyp == e->PolyTyp && e2->WindDelta != 0)
+ Inside = !Inside;
+ e2 = e2->PrevInAEL;
+ }
+ edge.WindCnt = (Inside ? 0 : 1);
+ }
+ else
+ {
+ edge.WindCnt = edge.WindDelta;
+ }
+ edge.WindCnt2 = e->WindCnt2;
+ e = e->NextInAEL; //ie get ready to calc WindCnt2
+ }
+ else
+ {
+ //nonZero, Positive or Negative filling ...
+ if (e->WindCnt * e->WindDelta < 0)
+ {
+ //prev edge is 'decreasing' WindCount (WC) toward zero
+ //so we're outside the previous polygon ...
+ if (Abs(e->WindCnt) > 1)
+ {
+ //outside prev poly but still inside another.
+ //when reversing direction of prev poly use the same WC
+ if (e->WindDelta * edge.WindDelta < 0) edge.WindCnt = e->WindCnt;
+ //otherwise continue to 'decrease' WC ...
+ else edge.WindCnt = e->WindCnt + edge.WindDelta;
+ }
+ else
+ //now outside all polys of same polytype so set own WC ...
+ edge.WindCnt = (edge.WindDelta == 0 ? 1 : edge.WindDelta);
+ } else
+ {
+ //prev edge is 'increasing' WindCount (WC) away from zero
+ //so we're inside the previous polygon ...
+ if (edge.WindDelta == 0)
+ edge.WindCnt = (e->WindCnt < 0 ? e->WindCnt - 1 : e->WindCnt + 1);
+ //if wind direction is reversing prev then use same WC
+ else if (e->WindDelta * edge.WindDelta < 0) edge.WindCnt = e->WindCnt;
+ //otherwise add to WC ...
+ else edge.WindCnt = e->WindCnt + edge.WindDelta;
+ }
+ edge.WindCnt2 = e->WindCnt2;
+ e = e->NextInAEL; //ie get ready to calc WindCnt2
+ }
+
+ //update WindCnt2 ...
+ if (IsEvenOddAltFillType(edge))
+ {
+ //EvenOdd filling ...
+ while (e != &edge)
+ {
+ if (e->WindDelta != 0)
+ edge.WindCnt2 = (edge.WindCnt2 == 0 ? 1 : 0);
+ e = e->NextInAEL;
+ }
+ } else
+ {
+ //nonZero, Positive or Negative filling ...
+ while ( e != &edge )
+ {
+ edge.WindCnt2 += e->WindDelta;
+ e = e->NextInAEL;
+ }
+ }
+}
+//------------------------------------------------------------------------------
+
+bool Clipper::IsEvenOddFillType(const TEdge& edge) const
+{
+ if (edge.PolyTyp == ptSubject)
+ return m_SubjFillType == pftEvenOdd; else
+ return m_ClipFillType == pftEvenOdd;
+}
+//------------------------------------------------------------------------------
+
+bool Clipper::IsEvenOddAltFillType(const TEdge& edge) const
+{
+ if (edge.PolyTyp == ptSubject)
+ return m_ClipFillType == pftEvenOdd; else
+ return m_SubjFillType == pftEvenOdd;
+}
+//------------------------------------------------------------------------------
+
+bool Clipper::IsContributing(const TEdge& edge) const
+{
+ PolyFillType pft, pft2;
+ if (edge.PolyTyp == ptSubject)
+ {
+ pft = m_SubjFillType;
+ pft2 = m_ClipFillType;
+ } else
+ {
+ pft = m_ClipFillType;
+ pft2 = m_SubjFillType;
+ }
+
+ switch(pft)
+ {
+ case pftEvenOdd:
+ //return false if a subj line has been flagged as inside a subj polygon
+ if (edge.WindDelta == 0 && edge.WindCnt != 1) return false;
+ break;
+ case pftNonZero:
+ if (Abs(edge.WindCnt) != 1) return false;
+ break;
+ case pftPositive:
+ if (edge.WindCnt != 1) return false;
+ break;
+ default: //pftNegative
+ if (edge.WindCnt != -1) return false;
+ }
+
+ switch(m_ClipType)
+ {
+ case ctIntersection:
+ switch(pft2)
+ {
+ case pftEvenOdd:
+ case pftNonZero:
+ return (edge.WindCnt2 != 0);
+ case pftPositive:
+ return (edge.WindCnt2 > 0);
+ default:
+ return (edge.WindCnt2 < 0);
+ }
+ break;
+ case ctUnion:
+ switch(pft2)
+ {
+ case pftEvenOdd:
+ case pftNonZero:
+ return (edge.WindCnt2 == 0);
+ case pftPositive:
+ return (edge.WindCnt2 <= 0);
+ default:
+ return (edge.WindCnt2 >= 0);
+ }
+ break;
+ case ctDifference:
+ if (edge.PolyTyp == ptSubject)
+ switch(pft2)
+ {
+ case pftEvenOdd:
+ case pftNonZero:
+ return (edge.WindCnt2 == 0);
+ case pftPositive:
+ return (edge.WindCnt2 <= 0);
+ default:
+ return (edge.WindCnt2 >= 0);
+ }
+ else
+ switch(pft2)
+ {
+ case pftEvenOdd:
+ case pftNonZero:
+ return (edge.WindCnt2 != 0);
+ case pftPositive:
+ return (edge.WindCnt2 > 0);
+ default:
+ return (edge.WindCnt2 < 0);
+ }
+ break;
+ case ctXor:
+ if (edge.WindDelta == 0) //XOr always contributing unless open
+ switch(pft2)
+ {
+ case pftEvenOdd:
+ case pftNonZero:
+ return (edge.WindCnt2 == 0);
+ case pftPositive:
+ return (edge.WindCnt2 <= 0);
+ default:
+ return (edge.WindCnt2 >= 0);
+ }
+ else
+ return true;
+ break;
+ default:
+ return true;
+ }
+}
+//------------------------------------------------------------------------------
+
+OutPt* Clipper::AddLocalMinPoly(TEdge *e1, TEdge *e2, const IntPoint &Pt)
+{
+ OutPt* result;
+ TEdge *e, *prevE;
+ if (IsHorizontal(*e2) || ( e1->Dx > e2->Dx ))
+ {
+ result = AddOutPt(e1, Pt);
+ e2->OutIdx = e1->OutIdx;
+ e1->Side = esLeft;
+ e2->Side = esRight;
+ e = e1;
+ if (e->PrevInAEL == e2)
+ prevE = e2->PrevInAEL;
+ else
+ prevE = e->PrevInAEL;
+ } else
+ {
+ result = AddOutPt(e2, Pt);
+ e1->OutIdx = e2->OutIdx;
+ e1->Side = esRight;
+ e2->Side = esLeft;
+ e = e2;
+ if (e->PrevInAEL == e1)
+ prevE = e1->PrevInAEL;
+ else
+ prevE = e->PrevInAEL;
+ }
+
+ if (prevE && prevE->OutIdx >= 0 && prevE->Top.Y < Pt.Y && e->Top.Y < Pt.Y)
+ {
+ cInt xPrev = TopX(*prevE, Pt.Y);
+ cInt xE = TopX(*e, Pt.Y);
+ if (xPrev == xE && (e->WindDelta != 0) && (prevE->WindDelta != 0) &&
+ SlopesEqual(IntPoint(xPrev, Pt.Y), prevE->Top, IntPoint(xE, Pt.Y), e->Top, m_UseFullRange))
+ {
+ OutPt* outPt = AddOutPt(prevE, Pt);
+ AddJoin(result, outPt, e->Top);
+ }
+ }
+ return result;
+}
+//------------------------------------------------------------------------------
+
+void Clipper::AddLocalMaxPoly(TEdge *e1, TEdge *e2, const IntPoint &Pt)
+{
+ AddOutPt( e1, Pt );
+ if (e2->WindDelta == 0) AddOutPt(e2, Pt);
+ if( e1->OutIdx == e2->OutIdx )
+ {
+ e1->OutIdx = Unassigned;
+ e2->OutIdx = Unassigned;
+ }
+ else if (e1->OutIdx < e2->OutIdx)
+ AppendPolygon(e1, e2);
+ else
+ AppendPolygon(e2, e1);
+}
+//------------------------------------------------------------------------------
+
+void Clipper::AddEdgeToSEL(TEdge *edge)
+{
+ //SEL pointers in PEdge are reused to build a list of horizontal edges.
+ //However, we don't need to worry about order with horizontal edge processing.
+ if( !m_SortedEdges )
+ {
+ m_SortedEdges = edge;
+ edge->PrevInSEL = 0;
+ edge->NextInSEL = 0;
+ }
+ else
+ {
+ edge->NextInSEL = m_SortedEdges;
+ edge->PrevInSEL = 0;
+ m_SortedEdges->PrevInSEL = edge;
+ m_SortedEdges = edge;
+ }
+}
+//------------------------------------------------------------------------------
+
+bool Clipper::PopEdgeFromSEL(TEdge *&edge)
+{
+ if (!m_SortedEdges) return false;
+ edge = m_SortedEdges;
+ DeleteFromSEL(m_SortedEdges);
+ return true;
+}
+//------------------------------------------------------------------------------
+
+void Clipper::CopyAELToSEL()
+{
+ TEdge* e = m_ActiveEdges;
+ m_SortedEdges = e;
+ while ( e )
+ {
+ e->PrevInSEL = e->PrevInAEL;
+ e->NextInSEL = e->NextInAEL;
+ e = e->NextInAEL;
+ }
+}
+//------------------------------------------------------------------------------
+
+void Clipper::AddJoin(OutPt *op1, OutPt *op2, const IntPoint OffPt)
+{
+ Join* j = new Join;
+ j->OutPt1 = op1;
+ j->OutPt2 = op2;
+ j->OffPt = OffPt;
+ m_Joins.push_back(j);
+}
+//------------------------------------------------------------------------------
+
+void Clipper::ClearJoins()
+{
+ for (JoinList::size_type i = 0; i < m_Joins.size(); i++)
+ delete m_Joins[i];
+ m_Joins.resize(0);
+}
+//------------------------------------------------------------------------------
+
+void Clipper::ClearGhostJoins()
+{
+ for (JoinList::size_type i = 0; i < m_GhostJoins.size(); i++)
+ delete m_GhostJoins[i];
+ m_GhostJoins.resize(0);
+}
+//------------------------------------------------------------------------------
+
+void Clipper::AddGhostJoin(OutPt *op, const IntPoint OffPt)
+{
+ Join* j = new Join;
+ j->OutPt1 = op;
+ j->OutPt2 = 0;
+ j->OffPt = OffPt;
+ m_GhostJoins.push_back(j);
+}
+//------------------------------------------------------------------------------
+
+void Clipper::InsertLocalMinimaIntoAEL(const cInt botY)
+{
+ const LocalMinimum *lm;
+ while (PopLocalMinima(botY, lm))
+ {
+ TEdge* lb = lm->LeftBound;
+ TEdge* rb = lm->RightBound;
+
+ OutPt *Op1 = 0;
+ if (!lb)
+ {
+ //nb: don't insert LB into either AEL or SEL
+ InsertEdgeIntoAEL(rb, 0);
+ SetWindingCount(*rb);
+ if (IsContributing(*rb))
+ Op1 = AddOutPt(rb, rb->Bot);
+ }
+ else if (!rb)
+ {
+ InsertEdgeIntoAEL(lb, 0);
+ SetWindingCount(*lb);
+ if (IsContributing(*lb))
+ Op1 = AddOutPt(lb, lb->Bot);
+ InsertScanbeam(lb->Top.Y);
+ }
+ else
+ {
+ InsertEdgeIntoAEL(lb, 0);
+ InsertEdgeIntoAEL(rb, lb);
+ SetWindingCount( *lb );
+ rb->WindCnt = lb->WindCnt;
+ rb->WindCnt2 = lb->WindCnt2;
+ if (IsContributing(*lb))
+ Op1 = AddLocalMinPoly(lb, rb, lb->Bot);
+ InsertScanbeam(lb->Top.Y);
+ }
+
+ if (rb)
+ {
+ if (IsHorizontal(*rb))
+ {
+ AddEdgeToSEL(rb);
+ if (rb->NextInLML)
+ InsertScanbeam(rb->NextInLML->Top.Y);
+ }
+ else InsertScanbeam( rb->Top.Y );
+ }
+
+ if (!lb || !rb) continue;
+
+ //if any output polygons share an edge, they'll need joining later ...
+ if (Op1 && IsHorizontal(*rb) &&
+ m_GhostJoins.size() > 0 && (rb->WindDelta != 0))
+ {
+ for (JoinList::size_type i = 0; i < m_GhostJoins.size(); ++i)
+ {
+ Join* jr = m_GhostJoins[i];
+ //if the horizontal Rb and a 'ghost' horizontal overlap, then convert
+ //the 'ghost' join to a real join ready for later ...
+ if (HorzSegmentsOverlap(jr->OutPt1->Pt.X, jr->OffPt.X, rb->Bot.X, rb->Top.X))
+ AddJoin(jr->OutPt1, Op1, jr->OffPt);
+ }
+ }
+
+ if (lb->OutIdx >= 0 && lb->PrevInAEL &&
+ lb->PrevInAEL->Curr.X == lb->Bot.X &&
+ lb->PrevInAEL->OutIdx >= 0 &&
+ SlopesEqual(lb->PrevInAEL->Bot, lb->PrevInAEL->Top, lb->Curr, lb->Top, m_UseFullRange) &&
+ (lb->WindDelta != 0) && (lb->PrevInAEL->WindDelta != 0))
+ {
+ OutPt *Op2 = AddOutPt(lb->PrevInAEL, lb->Bot);
+ AddJoin(Op1, Op2, lb->Top);
+ }
+
+ if(lb->NextInAEL != rb)
+ {
+
+ if (rb->OutIdx >= 0 && rb->PrevInAEL->OutIdx >= 0 &&
+ SlopesEqual(rb->PrevInAEL->Curr, rb->PrevInAEL->Top, rb->Curr, rb->Top, m_UseFullRange) &&
+ (rb->WindDelta != 0) && (rb->PrevInAEL->WindDelta != 0))
+ {
+ OutPt *Op2 = AddOutPt(rb->PrevInAEL, rb->Bot);
+ AddJoin(Op1, Op2, rb->Top);
+ }
+
+ TEdge* e = lb->NextInAEL;
+ if (e)
+ {
+ while( e != rb )
+ {
+ //nb: For calculating winding counts etc, IntersectEdges() assumes
+ //that param1 will be to the Right of param2 ABOVE the intersection ...
+ IntersectEdges(rb , e , lb->Curr); //order important here
+ e = e->NextInAEL;
+ }
+ }
+ }
+
+ }
+}
+//------------------------------------------------------------------------------
+
+void Clipper::DeleteFromSEL(TEdge *e)
+{
+ TEdge* SelPrev = e->PrevInSEL;
+ TEdge* SelNext = e->NextInSEL;
+ if( !SelPrev && !SelNext && (e != m_SortedEdges) ) return; //already deleted
+ if( SelPrev ) SelPrev->NextInSEL = SelNext;
+ else m_SortedEdges = SelNext;
+ if( SelNext ) SelNext->PrevInSEL = SelPrev;
+ e->NextInSEL = 0;
+ e->PrevInSEL = 0;
+}
+//------------------------------------------------------------------------------
+
+#ifdef use_xyz
+void Clipper::SetZ(IntPoint& pt, TEdge& e1, TEdge& e2)
+{
+ if (pt.Z != 0 || !m_ZFill) return;
+ else if (pt == e1.Bot) pt.Z = e1.Bot.Z;
+ else if (pt == e1.Top) pt.Z = e1.Top.Z;
+ else if (pt == e2.Bot) pt.Z = e2.Bot.Z;
+ else if (pt == e2.Top) pt.Z = e2.Top.Z;
+ else (*m_ZFill)(e1.Bot, e1.Top, e2.Bot, e2.Top, pt);
+}
+//------------------------------------------------------------------------------
+#endif
+
+void Clipper::IntersectEdges(TEdge *e1, TEdge *e2, IntPoint &Pt)
+{
+ bool e1Contributing = ( e1->OutIdx >= 0 );
+ bool e2Contributing = ( e2->OutIdx >= 0 );
+
+#ifdef use_xyz
+ SetZ(Pt, *e1, *e2);
+#endif
+
+#ifdef use_lines
+ //if either edge is on an OPEN path ...
+ if (e1->WindDelta == 0 || e2->WindDelta == 0)
+ {
+ //ignore subject-subject open path intersections UNLESS they
+ //are both open paths, AND they are both 'contributing maximas' ...
+ if (e1->WindDelta == 0 && e2->WindDelta == 0) return;
+
+ //if intersecting a subj line with a subj poly ...
+ else if (e1->PolyTyp == e2->PolyTyp &&
+ e1->WindDelta != e2->WindDelta && m_ClipType == ctUnion)
+ {
+ if (e1->WindDelta == 0)
+ {
+ if (e2Contributing)
+ {
+ AddOutPt(e1, Pt);
+ if (e1Contributing) e1->OutIdx = Unassigned;
+ }
+ }
+ else
+ {
+ if (e1Contributing)
+ {
+ AddOutPt(e2, Pt);
+ if (e2Contributing) e2->OutIdx = Unassigned;
+ }
+ }
+ }
+ else if (e1->PolyTyp != e2->PolyTyp)
+ {
+ //toggle subj open path OutIdx on/off when Abs(clip.WndCnt) == 1 ...
+ if ((e1->WindDelta == 0) && abs(e2->WindCnt) == 1 &&
+ (m_ClipType != ctUnion || e2->WindCnt2 == 0))
+ {
+ AddOutPt(e1, Pt);
+ if (e1Contributing) e1->OutIdx = Unassigned;
+ }
+ else if ((e2->WindDelta == 0) && (abs(e1->WindCnt) == 1) &&
+ (m_ClipType != ctUnion || e1->WindCnt2 == 0))
+ {
+ AddOutPt(e2, Pt);
+ if (e2Contributing) e2->OutIdx = Unassigned;
+ }
+ }
+ return;
+ }
+#endif
+
+ //update winding counts...
+ //assumes that e1 will be to the Right of e2 ABOVE the intersection
+ if ( e1->PolyTyp == e2->PolyTyp )
+ {
+ if ( IsEvenOddFillType( *e1) )
+ {
+ int oldE1WindCnt = e1->WindCnt;
+ e1->WindCnt = e2->WindCnt;
+ e2->WindCnt = oldE1WindCnt;
+ } else
+ {
+ if (e1->WindCnt + e2->WindDelta == 0 ) e1->WindCnt = -e1->WindCnt;
+ else e1->WindCnt += e2->WindDelta;
+ if ( e2->WindCnt - e1->WindDelta == 0 ) e2->WindCnt = -e2->WindCnt;
+ else e2->WindCnt -= e1->WindDelta;
+ }
+ } else
+ {
+ if (!IsEvenOddFillType(*e2)) e1->WindCnt2 += e2->WindDelta;
+ else e1->WindCnt2 = ( e1->WindCnt2 == 0 ) ? 1 : 0;
+ if (!IsEvenOddFillType(*e1)) e2->WindCnt2 -= e1->WindDelta;
+ else e2->WindCnt2 = ( e2->WindCnt2 == 0 ) ? 1 : 0;
+ }
+
+ PolyFillType e1FillType, e2FillType, e1FillType2, e2FillType2;
+ if (e1->PolyTyp == ptSubject)
+ {
+ e1FillType = m_SubjFillType;
+ e1FillType2 = m_ClipFillType;
+ } else
+ {
+ e1FillType = m_ClipFillType;
+ e1FillType2 = m_SubjFillType;
+ }
+ if (e2->PolyTyp == ptSubject)
+ {
+ e2FillType = m_SubjFillType;
+ e2FillType2 = m_ClipFillType;
+ } else
+ {
+ e2FillType = m_ClipFillType;
+ e2FillType2 = m_SubjFillType;
+ }
+
+ cInt e1Wc, e2Wc;
+ switch (e1FillType)
+ {
+ case pftPositive: e1Wc = e1->WindCnt; break;
+ case pftNegative: e1Wc = -e1->WindCnt; break;
+ default: e1Wc = Abs(e1->WindCnt);
+ }
+ switch(e2FillType)
+ {
+ case pftPositive: e2Wc = e2->WindCnt; break;
+ case pftNegative: e2Wc = -e2->WindCnt; break;
+ default: e2Wc = Abs(e2->WindCnt);
+ }
+
+ if ( e1Contributing && e2Contributing )
+ {
+ if ((e1Wc != 0 && e1Wc != 1) || (e2Wc != 0 && e2Wc != 1) ||
+ (e1->PolyTyp != e2->PolyTyp && m_ClipType != ctXor) )
+ {
+ AddLocalMaxPoly(e1, e2, Pt);
+ }
+ else
+ {
+ AddOutPt(e1, Pt);
+ AddOutPt(e2, Pt);
+ SwapSides( *e1 , *e2 );
+ SwapPolyIndexes( *e1 , *e2 );
+ }
+ }
+ else if ( e1Contributing )
+ {
+ if (e2Wc == 0 || e2Wc == 1)
+ {
+ AddOutPt(e1, Pt);
+ SwapSides(*e1, *e2);
+ SwapPolyIndexes(*e1, *e2);
+ }
+ }
+ else if ( e2Contributing )
+ {
+ if (e1Wc == 0 || e1Wc == 1)
+ {
+ AddOutPt(e2, Pt);
+ SwapSides(*e1, *e2);
+ SwapPolyIndexes(*e1, *e2);
+ }
+ }
+ else if ( (e1Wc == 0 || e1Wc == 1) && (e2Wc == 0 || e2Wc == 1))
+ {
+ //neither edge is currently contributing ...
+
+ cInt e1Wc2, e2Wc2;
+ switch (e1FillType2)
+ {
+ case pftPositive: e1Wc2 = e1->WindCnt2; break;
+ case pftNegative : e1Wc2 = -e1->WindCnt2; break;
+ default: e1Wc2 = Abs(e1->WindCnt2);
+ }
+ switch (e2FillType2)
+ {
+ case pftPositive: e2Wc2 = e2->WindCnt2; break;
+ case pftNegative: e2Wc2 = -e2->WindCnt2; break;
+ default: e2Wc2 = Abs(e2->WindCnt2);
+ }
+
+ if (e1->PolyTyp != e2->PolyTyp)
+ {
+ AddLocalMinPoly(e1, e2, Pt);
+ }
+ else if (e1Wc == 1 && e2Wc == 1)
+ switch( m_ClipType ) {
+ case ctIntersection:
+ if (e1Wc2 > 0 && e2Wc2 > 0)
+ AddLocalMinPoly(e1, e2, Pt);
+ break;
+ case ctUnion:
+ if ( e1Wc2 <= 0 && e2Wc2 <= 0 )
+ AddLocalMinPoly(e1, e2, Pt);
+ break;
+ case ctDifference:
+ if (((e1->PolyTyp == ptClip) && (e1Wc2 > 0) && (e2Wc2 > 0)) ||
+ ((e1->PolyTyp == ptSubject) && (e1Wc2 <= 0) && (e2Wc2 <= 0)))
+ AddLocalMinPoly(e1, e2, Pt);
+ break;
+ case ctXor:
+ AddLocalMinPoly(e1, e2, Pt);
+ }
+ else
+ SwapSides( *e1, *e2 );
+ }
+}
+//------------------------------------------------------------------------------
+
+void Clipper::SetHoleState(TEdge *e, OutRec *outrec)
+{
+ TEdge *e2 = e->PrevInAEL;
+ TEdge *eTmp = 0;
+ while (e2)
+ {
+ if (e2->OutIdx >= 0 && e2->WindDelta != 0)
+ {
+ if (!eTmp) eTmp = e2;
+ else if (eTmp->OutIdx == e2->OutIdx) eTmp = 0;
+ }
+ e2 = e2->PrevInAEL;
+ }
+ if (!eTmp)
+ {
+ outrec->FirstLeft = 0;
+ outrec->IsHole = false;
+ }
+ else
+ {
+ outrec->FirstLeft = m_PolyOuts[eTmp->OutIdx];
+ outrec->IsHole = !outrec->FirstLeft->IsHole;
+ }
+}
+//------------------------------------------------------------------------------
+
+OutRec* GetLowermostRec(OutRec *outRec1, OutRec *outRec2)
+{
+ //work out which polygon fragment has the correct hole state ...
+ if (!outRec1->BottomPt)
+ outRec1->BottomPt = GetBottomPt(outRec1->Pts);
+ if (!outRec2->BottomPt)
+ outRec2->BottomPt = GetBottomPt(outRec2->Pts);
+ OutPt *OutPt1 = outRec1->BottomPt;
+ OutPt *OutPt2 = outRec2->BottomPt;
+ if (OutPt1->Pt.Y > OutPt2->Pt.Y) return outRec1;
+ else if (OutPt1->Pt.Y < OutPt2->Pt.Y) return outRec2;
+ else if (OutPt1->Pt.X < OutPt2->Pt.X) return outRec1;
+ else if (OutPt1->Pt.X > OutPt2->Pt.X) return outRec2;
+ else if (OutPt1->Next == OutPt1) return outRec2;
+ else if (OutPt2->Next == OutPt2) return outRec1;
+ else if (FirstIsBottomPt(OutPt1, OutPt2)) return outRec1;
+ else return outRec2;
+}
+//------------------------------------------------------------------------------
+
+bool OutRec1RightOfOutRec2(OutRec* outRec1, OutRec* outRec2)
+{
+ do
+ {
+ outRec1 = outRec1->FirstLeft;
+ if (outRec1 == outRec2) return true;
+ } while (outRec1);
+ return false;
+}
+//------------------------------------------------------------------------------
+
+OutRec* Clipper::GetOutRec(int Idx)
+{
+ OutRec* outrec = m_PolyOuts[Idx];
+ while (outrec != m_PolyOuts[outrec->Idx])
+ outrec = m_PolyOuts[outrec->Idx];
+ return outrec;
+}
+//------------------------------------------------------------------------------
+
+void Clipper::AppendPolygon(TEdge *e1, TEdge *e2)
+{
+ //get the start and ends of both output polygons ...
+ OutRec *outRec1 = m_PolyOuts[e1->OutIdx];
+ OutRec *outRec2 = m_PolyOuts[e2->OutIdx];
+
+ OutRec *holeStateRec;
+ if (OutRec1RightOfOutRec2(outRec1, outRec2))
+ holeStateRec = outRec2;
+ else if (OutRec1RightOfOutRec2(outRec2, outRec1))
+ holeStateRec = outRec1;
+ else
+ holeStateRec = GetLowermostRec(outRec1, outRec2);
+
+ //get the start and ends of both output polygons and
+ //join e2 poly onto e1 poly and delete pointers to e2 ...
+
+ OutPt* p1_lft = outRec1->Pts;
+ OutPt* p1_rt = p1_lft->Prev;
+ OutPt* p2_lft = outRec2->Pts;
+ OutPt* p2_rt = p2_lft->Prev;
+
+ //join e2 poly onto e1 poly and delete pointers to e2 ...
+ if( e1->Side == esLeft )
+ {
+ if( e2->Side == esLeft )
+ {
+ //z y x a b c
+ ReversePolyPtLinks(p2_lft);
+ p2_lft->Next = p1_lft;
+ p1_lft->Prev = p2_lft;
+ p1_rt->Next = p2_rt;
+ p2_rt->Prev = p1_rt;
+ outRec1->Pts = p2_rt;
+ } else
+ {
+ //x y z a b c
+ p2_rt->Next = p1_lft;
+ p1_lft->Prev = p2_rt;
+ p2_lft->Prev = p1_rt;
+ p1_rt->Next = p2_lft;
+ outRec1->Pts = p2_lft;
+ }
+ } else
+ {
+ if( e2->Side == esRight )
+ {
+ //a b c z y x
+ ReversePolyPtLinks(p2_lft);
+ p1_rt->Next = p2_rt;
+ p2_rt->Prev = p1_rt;
+ p2_lft->Next = p1_lft;
+ p1_lft->Prev = p2_lft;
+ } else
+ {
+ //a b c x y z
+ p1_rt->Next = p2_lft;
+ p2_lft->Prev = p1_rt;
+ p1_lft->Prev = p2_rt;
+ p2_rt->Next = p1_lft;
+ }
+ }
+
+ outRec1->BottomPt = 0;
+ if (holeStateRec == outRec2)
+ {
+ if (outRec2->FirstLeft != outRec1)
+ outRec1->FirstLeft = outRec2->FirstLeft;
+ outRec1->IsHole = outRec2->IsHole;
+ }
+ outRec2->Pts = 0;
+ outRec2->BottomPt = 0;
+ outRec2->FirstLeft = outRec1;
+
+ int OKIdx = e1->OutIdx;
+ int ObsoleteIdx = e2->OutIdx;
+
+ e1->OutIdx = Unassigned; //nb: safe because we only get here via AddLocalMaxPoly
+ e2->OutIdx = Unassigned;
+
+ TEdge* e = m_ActiveEdges;
+ while( e )
+ {
+ if( e->OutIdx == ObsoleteIdx )
+ {
+ e->OutIdx = OKIdx;
+ e->Side = e1->Side;
+ break;
+ }
+ e = e->NextInAEL;
+ }
+
+ outRec2->Idx = outRec1->Idx;
+}
+//------------------------------------------------------------------------------
+
+OutPt* Clipper::AddOutPt(TEdge *e, const IntPoint &pt)
+{
+ if( e->OutIdx < 0 )
+ {
+ OutRec *outRec = CreateOutRec();
+ outRec->IsOpen = (e->WindDelta == 0);
+ OutPt* newOp = new OutPt;
+ outRec->Pts = newOp;
+ newOp->Idx = outRec->Idx;
+ newOp->Pt = pt;
+ newOp->Next = newOp;
+ newOp->Prev = newOp;
+ if (!outRec->IsOpen)
+ SetHoleState(e, outRec);
+ e->OutIdx = outRec->Idx;
+ return newOp;
+ } else
+ {
+ OutRec *outRec = m_PolyOuts[e->OutIdx];
+ //OutRec.Pts is the 'Left-most' point & OutRec.Pts.Prev is the 'Right-most'
+ OutPt* op = outRec->Pts;
+
+ bool ToFront = (e->Side == esLeft);
+ if (ToFront && (pt == op->Pt)) return op;
+ else if (!ToFront && (pt == op->Prev->Pt)) return op->Prev;
+
+ OutPt* newOp = new OutPt;
+ newOp->Idx = outRec->Idx;
+ newOp->Pt = pt;
+ newOp->Next = op;
+ newOp->Prev = op->Prev;
+ newOp->Prev->Next = newOp;
+ op->Prev = newOp;
+ if (ToFront) outRec->Pts = newOp;
+ return newOp;
+ }
+}
+//------------------------------------------------------------------------------
+
+OutPt* Clipper::GetLastOutPt(TEdge *e)
+{
+ OutRec *outRec = m_PolyOuts[e->OutIdx];
+ if (e->Side == esLeft)
+ return outRec->Pts;
+ else
+ return outRec->Pts->Prev;
+}
+//------------------------------------------------------------------------------
+
+void Clipper::ProcessHorizontals()
+{
+ TEdge* horzEdge;
+ while (PopEdgeFromSEL(horzEdge))
+ ProcessHorizontal(horzEdge);
+}
+//------------------------------------------------------------------------------
+
+inline bool IsMinima(TEdge *e)
+{
+ return e && (e->Prev->NextInLML != e) && (e->Next->NextInLML != e);
+}
+//------------------------------------------------------------------------------
+
+inline bool IsMaxima(TEdge *e, const cInt Y)
+{
+ return e && e->Top.Y == Y && !e->NextInLML;
+}
+//------------------------------------------------------------------------------
+
+inline bool IsIntermediate(TEdge *e, const cInt Y)
+{
+ return e->Top.Y == Y && e->NextInLML;
+}
+//------------------------------------------------------------------------------
+
+TEdge *GetMaximaPair(TEdge *e)
+{
+ if ((e->Next->Top == e->Top) && !e->Next->NextInLML)
+ return e->Next;
+ else if ((e->Prev->Top == e->Top) && !e->Prev->NextInLML)
+ return e->Prev;
+ else return 0;
+}
+//------------------------------------------------------------------------------
+
+TEdge *GetMaximaPairEx(TEdge *e)
+{
+ //as GetMaximaPair() but returns 0 if MaxPair isn't in AEL (unless it's horizontal)
+ TEdge* result = GetMaximaPair(e);
+ if (result && (result->OutIdx == Skip ||
+ (result->NextInAEL == result->PrevInAEL && !IsHorizontal(*result)))) return 0;
+ return result;
+}
+//------------------------------------------------------------------------------
+
+void Clipper::SwapPositionsInSEL(TEdge *Edge1, TEdge *Edge2)
+{
+ if( !( Edge1->NextInSEL ) && !( Edge1->PrevInSEL ) ) return;
+ if( !( Edge2->NextInSEL ) && !( Edge2->PrevInSEL ) ) return;
+
+ if( Edge1->NextInSEL == Edge2 )
+ {
+ TEdge* Next = Edge2->NextInSEL;
+ if( Next ) Next->PrevInSEL = Edge1;
+ TEdge* Prev = Edge1->PrevInSEL;
+ if( Prev ) Prev->NextInSEL = Edge2;
+ Edge2->PrevInSEL = Prev;
+ Edge2->NextInSEL = Edge1;
+ Edge1->PrevInSEL = Edge2;
+ Edge1->NextInSEL = Next;
+ }
+ else if( Edge2->NextInSEL == Edge1 )
+ {
+ TEdge* Next = Edge1->NextInSEL;
+ if( Next ) Next->PrevInSEL = Edge2;
+ TEdge* Prev = Edge2->PrevInSEL;
+ if( Prev ) Prev->NextInSEL = Edge1;
+ Edge1->PrevInSEL = Prev;
+ Edge1->NextInSEL = Edge2;
+ Edge2->PrevInSEL = Edge1;
+ Edge2->NextInSEL = Next;
+ }
+ else
+ {
+ TEdge* Next = Edge1->NextInSEL;
+ TEdge* Prev = Edge1->PrevInSEL;
+ Edge1->NextInSEL = Edge2->NextInSEL;
+ if( Edge1->NextInSEL ) Edge1->NextInSEL->PrevInSEL = Edge1;
+ Edge1->PrevInSEL = Edge2->PrevInSEL;
+ if( Edge1->PrevInSEL ) Edge1->PrevInSEL->NextInSEL = Edge1;
+ Edge2->NextInSEL = Next;
+ if( Edge2->NextInSEL ) Edge2->NextInSEL->PrevInSEL = Edge2;
+ Edge2->PrevInSEL = Prev;
+ if( Edge2->PrevInSEL ) Edge2->PrevInSEL->NextInSEL = Edge2;
+ }
+
+ if( !Edge1->PrevInSEL ) m_SortedEdges = Edge1;
+ else if( !Edge2->PrevInSEL ) m_SortedEdges = Edge2;
+}
+//------------------------------------------------------------------------------
+
+TEdge* GetNextInAEL(TEdge *e, Direction dir)
+{
+ return dir == dLeftToRight ? e->NextInAEL : e->PrevInAEL;
+}
+//------------------------------------------------------------------------------
+
+void GetHorzDirection(TEdge& HorzEdge, Direction& Dir, cInt& Left, cInt& Right)
+{
+ if (HorzEdge.Bot.X < HorzEdge.Top.X)
+ {
+ Left = HorzEdge.Bot.X;
+ Right = HorzEdge.Top.X;
+ Dir = dLeftToRight;
+ } else
+ {
+ Left = HorzEdge.Top.X;
+ Right = HorzEdge.Bot.X;
+ Dir = dRightToLeft;
+ }
+}
+//------------------------------------------------------------------------
+
+/*******************************************************************************
+* Notes: Horizontal edges (HEs) at scanline intersections (ie at the Top or *
+* Bottom of a scanbeam) are processed as if layered. The order in which HEs *
+* are processed doesn't matter. HEs intersect with other HE Bot.Xs only [#] *
+* (or they could intersect with Top.Xs only, ie EITHER Bot.Xs OR Top.Xs), *
+* and with other non-horizontal edges [*]. Once these intersections are *
+* processed, intermediate HEs then 'promote' the Edge above (NextInLML) into *
+* the AEL. These 'promoted' edges may in turn intersect [%] with other HEs. *
+*******************************************************************************/
+
+void Clipper::ProcessHorizontal(TEdge *horzEdge)
+{
+ Direction dir;
+ cInt horzLeft, horzRight;
+ bool IsOpen = (horzEdge->WindDelta == 0);
+
+ GetHorzDirection(*horzEdge, dir, horzLeft, horzRight);
+
+ TEdge* eLastHorz = horzEdge, *eMaxPair = 0;
+ while (eLastHorz->NextInLML && IsHorizontal(*eLastHorz->NextInLML))
+ eLastHorz = eLastHorz->NextInLML;
+ if (!eLastHorz->NextInLML)
+ eMaxPair = GetMaximaPair(eLastHorz);
+
+ MaximaList::const_iterator maxIt;
+ MaximaList::const_reverse_iterator maxRit;
+ if (m_Maxima.size() > 0)
+ {
+ //get the first maxima in range (X) ...
+ if (dir == dLeftToRight)
+ {
+ maxIt = m_Maxima.begin();
+ while (maxIt != m_Maxima.end() && *maxIt <= horzEdge->Bot.X) maxIt++;
+ if (maxIt != m_Maxima.end() && *maxIt >= eLastHorz->Top.X)
+ maxIt = m_Maxima.end();
+ }
+ else
+ {
+ maxRit = m_Maxima.rbegin();
+ while (maxRit != m_Maxima.rend() && *maxRit > horzEdge->Bot.X) maxRit++;
+ if (maxRit != m_Maxima.rend() && *maxRit <= eLastHorz->Top.X)
+ maxRit = m_Maxima.rend();
+ }
+ }
+
+ OutPt* op1 = 0;
+
+ for (;;) //loop through consec. horizontal edges
+ {
+
+ bool IsLastHorz = (horzEdge == eLastHorz);
+ TEdge* e = GetNextInAEL(horzEdge, dir);
+ while(e)
+ {
+
+ //this code block inserts extra coords into horizontal edges (in output
+ //polygons) whereever maxima touch these horizontal edges. This helps
+ //'simplifying' polygons (ie if the Simplify property is set).
+ if (m_Maxima.size() > 0)
+ {
+ if (dir == dLeftToRight)
+ {
+ while (maxIt != m_Maxima.end() && *maxIt < e->Curr.X)
+ {
+ if (horzEdge->OutIdx >= 0 && !IsOpen)
+ AddOutPt(horzEdge, IntPoint(*maxIt, horzEdge->Bot.Y));
+ maxIt++;
+ }
+ }
+ else
+ {
+ while (maxRit != m_Maxima.rend() && *maxRit > e->Curr.X)
+ {
+ if (horzEdge->OutIdx >= 0 && !IsOpen)
+ AddOutPt(horzEdge, IntPoint(*maxRit, horzEdge->Bot.Y));
+ maxRit++;
+ }
+ }
+ };
+
+ if ((dir == dLeftToRight && e->Curr.X > horzRight) ||
+ (dir == dRightToLeft && e->Curr.X < horzLeft)) break;
+
+ //Also break if we've got to the end of an intermediate horizontal edge ...
+ //nb: Smaller Dx's are to the right of larger Dx's ABOVE the horizontal.
+ if (e->Curr.X == horzEdge->Top.X && horzEdge->NextInLML &&
+ e->Dx < horzEdge->NextInLML->Dx) break;
+
+ if (horzEdge->OutIdx >= 0 && !IsOpen) //note: may be done multiple times
+ {
+#ifdef use_xyz
+ if (dir == dLeftToRight) SetZ(e->Curr, *horzEdge, *e);
+ else SetZ(e->Curr, *e, *horzEdge);
+#endif
+ op1 = AddOutPt(horzEdge, e->Curr);
+ TEdge* eNextHorz = m_SortedEdges;
+ while (eNextHorz)
+ {
+ if (eNextHorz->OutIdx >= 0 &&
+ HorzSegmentsOverlap(horzEdge->Bot.X,
+ horzEdge->Top.X, eNextHorz->Bot.X, eNextHorz->Top.X))
+ {
+ OutPt* op2 = GetLastOutPt(eNextHorz);
+ AddJoin(op2, op1, eNextHorz->Top);
+ }
+ eNextHorz = eNextHorz->NextInSEL;
+ }
+ AddGhostJoin(op1, horzEdge->Bot);
+ }
+
+ //OK, so far we're still in range of the horizontal Edge but make sure
+ //we're at the last of consec. horizontals when matching with eMaxPair
+ if(e == eMaxPair && IsLastHorz)
+ {
+ if (horzEdge->OutIdx >= 0)
+ AddLocalMaxPoly(horzEdge, eMaxPair, horzEdge->Top);
+ DeleteFromAEL(horzEdge);
+ DeleteFromAEL(eMaxPair);
+ return;
+ }
+
+ if(dir == dLeftToRight)
+ {
+ IntPoint Pt = IntPoint(e->Curr.X, horzEdge->Curr.Y);
+ IntersectEdges(horzEdge, e, Pt);
+ }
+ else
+ {
+ IntPoint Pt = IntPoint(e->Curr.X, horzEdge->Curr.Y);
+ IntersectEdges( e, horzEdge, Pt);
+ }
+ TEdge* eNext = GetNextInAEL(e, dir);
+ SwapPositionsInAEL( horzEdge, e );
+ e = eNext;
+ } //end while(e)
+
+ //Break out of loop if HorzEdge.NextInLML is not also horizontal ...
+ if (!horzEdge->NextInLML || !IsHorizontal(*horzEdge->NextInLML)) break;
+
+ UpdateEdgeIntoAEL(horzEdge);
+ if (horzEdge->OutIdx >= 0) AddOutPt(horzEdge, horzEdge->Bot);
+ GetHorzDirection(*horzEdge, dir, horzLeft, horzRight);
+
+ } //end for (;;)
+
+ if (horzEdge->OutIdx >= 0 && !op1)
+ {
+ op1 = GetLastOutPt(horzEdge);
+ TEdge* eNextHorz = m_SortedEdges;
+ while (eNextHorz)
+ {
+ if (eNextHorz->OutIdx >= 0 &&
+ HorzSegmentsOverlap(horzEdge->Bot.X,
+ horzEdge->Top.X, eNextHorz->Bot.X, eNextHorz->Top.X))
+ {
+ OutPt* op2 = GetLastOutPt(eNextHorz);
+ AddJoin(op2, op1, eNextHorz->Top);
+ }
+ eNextHorz = eNextHorz->NextInSEL;
+ }
+ AddGhostJoin(op1, horzEdge->Top);
+ }
+
+ if (horzEdge->NextInLML)
+ {
+ if(horzEdge->OutIdx >= 0)
+ {
+ op1 = AddOutPt( horzEdge, horzEdge->Top);
+ UpdateEdgeIntoAEL(horzEdge);
+ if (horzEdge->WindDelta == 0) return;
+ //nb: HorzEdge is no longer horizontal here
+ TEdge* ePrev = horzEdge->PrevInAEL;
+ TEdge* eNext = horzEdge->NextInAEL;
+ if (ePrev && ePrev->Curr.X == horzEdge->Bot.X &&
+ ePrev->Curr.Y == horzEdge->Bot.Y && ePrev->WindDelta != 0 &&
+ (ePrev->OutIdx >= 0 && ePrev->Curr.Y > ePrev->Top.Y &&
+ SlopesEqual(*horzEdge, *ePrev, m_UseFullRange)))
+ {
+ OutPt* op2 = AddOutPt(ePrev, horzEdge->Bot);
+ AddJoin(op1, op2, horzEdge->Top);
+ }
+ else if (eNext && eNext->Curr.X == horzEdge->Bot.X &&
+ eNext->Curr.Y == horzEdge->Bot.Y && eNext->WindDelta != 0 &&
+ eNext->OutIdx >= 0 && eNext->Curr.Y > eNext->Top.Y &&
+ SlopesEqual(*horzEdge, *eNext, m_UseFullRange))
+ {
+ OutPt* op2 = AddOutPt(eNext, horzEdge->Bot);
+ AddJoin(op1, op2, horzEdge->Top);
+ }
+ }
+ else
+ UpdateEdgeIntoAEL(horzEdge);
+ }
+ else
+ {
+ if (horzEdge->OutIdx >= 0) AddOutPt(horzEdge, horzEdge->Top);
+ DeleteFromAEL(horzEdge);
+ }
+}
+//------------------------------------------------------------------------------
+
+bool Clipper::ProcessIntersections(const cInt topY)
+{
+ if( !m_ActiveEdges ) return true;
+ try {
+ BuildIntersectList(topY);
+ size_t IlSize = m_IntersectList.size();
+ if (IlSize == 0) return true;
+ if (IlSize == 1 || FixupIntersectionOrder()) ProcessIntersectList();
+ else return false;
+ }
+ catch(...)
+ {
+ m_SortedEdges = 0;
+ DisposeIntersectNodes();
+ throw clipperException("ProcessIntersections error");
+ }
+ m_SortedEdges = 0;
+ return true;
+}
+//------------------------------------------------------------------------------
+
+void Clipper::DisposeIntersectNodes()
+{
+ for (size_t i = 0; i < m_IntersectList.size(); ++i )
+ delete m_IntersectList[i];
+ m_IntersectList.clear();
+}
+//------------------------------------------------------------------------------
+
+void Clipper::BuildIntersectList(const cInt topY)
+{
+ if ( !m_ActiveEdges ) return;
+
+ //prepare for sorting ...
+ TEdge* e = m_ActiveEdges;
+ m_SortedEdges = e;
+ while( e )
+ {
+ e->PrevInSEL = e->PrevInAEL;
+ e->NextInSEL = e->NextInAEL;
+ e->Curr.X = TopX( *e, topY );
+ e = e->NextInAEL;
+ }
+
+ //bubblesort ...
+ bool isModified;
+ do
+ {
+ isModified = false;
+ e = m_SortedEdges;
+ while( e->NextInSEL )
+ {
+ TEdge *eNext = e->NextInSEL;
+ IntPoint Pt;
+ if(e->Curr.X > eNext->Curr.X)
+ {
+ IntersectPoint(*e, *eNext, Pt);
+ if (Pt.Y < topY) Pt = IntPoint(TopX(*e, topY), topY);
+ IntersectNode * newNode = new IntersectNode;
+ newNode->Edge1 = e;
+ newNode->Edge2 = eNext;
+ newNode->Pt = Pt;
+ m_IntersectList.push_back(newNode);
+
+ SwapPositionsInSEL(e, eNext);
+ isModified = true;
+ }
+ else
+ e = eNext;
+ }
+ if( e->PrevInSEL ) e->PrevInSEL->NextInSEL = 0;
+ else break;
+ }
+ while ( isModified );
+ m_SortedEdges = 0; //important
+}
+//------------------------------------------------------------------------------
+
+
+void Clipper::ProcessIntersectList()
+{
+ for (size_t i = 0; i < m_IntersectList.size(); ++i)
+ {
+ IntersectNode* iNode = m_IntersectList[i];
+ {
+ IntersectEdges( iNode->Edge1, iNode->Edge2, iNode->Pt);
+ SwapPositionsInAEL( iNode->Edge1 , iNode->Edge2 );
+ }
+ delete iNode;
+ }
+ m_IntersectList.clear();
+}
+//------------------------------------------------------------------------------
+
+bool IntersectListSort(IntersectNode* node1, IntersectNode* node2)
+{
+ return node2->Pt.Y < node1->Pt.Y;
+}
+//------------------------------------------------------------------------------
+
+inline bool EdgesAdjacent(const IntersectNode &inode)
+{
+ return (inode.Edge1->NextInSEL == inode.Edge2) ||
+ (inode.Edge1->PrevInSEL == inode.Edge2);
+}
+//------------------------------------------------------------------------------
+
+bool Clipper::FixupIntersectionOrder()
+{
+ //pre-condition: intersections are sorted Bottom-most first.
+ //Now it's crucial that intersections are made only between adjacent edges,
+ //so to ensure this the order of intersections may need adjusting ...
+ CopyAELToSEL();
+ std::sort(m_IntersectList.begin(), m_IntersectList.end(), IntersectListSort);
+ size_t cnt = m_IntersectList.size();
+ for (size_t i = 0; i < cnt; ++i)
+ {
+ if (!EdgesAdjacent(*m_IntersectList[i]))
+ {
+ size_t j = i + 1;
+ while (j < cnt && !EdgesAdjacent(*m_IntersectList[j])) j++;
+ if (j == cnt) return false;
+ std::swap(m_IntersectList[i], m_IntersectList[j]);
+ }
+ SwapPositionsInSEL(m_IntersectList[i]->Edge1, m_IntersectList[i]->Edge2);
+ }
+ return true;
+}
+//------------------------------------------------------------------------------
+
+void Clipper::DoMaxima(TEdge *e)
+{
+ TEdge* eMaxPair = GetMaximaPairEx(e);
+ if (!eMaxPair)
+ {
+ if (e->OutIdx >= 0)
+ AddOutPt(e, e->Top);
+ DeleteFromAEL(e);
+ return;
+ }
+
+ TEdge* eNext = e->NextInAEL;
+ while(eNext && eNext != eMaxPair)
+ {
+ IntersectEdges(e, eNext, e->Top);
+ SwapPositionsInAEL(e, eNext);
+ eNext = e->NextInAEL;
+ }
+
+ if(e->OutIdx == Unassigned && eMaxPair->OutIdx == Unassigned)
+ {
+ DeleteFromAEL(e);
+ DeleteFromAEL(eMaxPair);
+ }
+ else if( e->OutIdx >= 0 && eMaxPair->OutIdx >= 0 )
+ {
+ if (e->OutIdx >= 0) AddLocalMaxPoly(e, eMaxPair, e->Top);
+ DeleteFromAEL(e);
+ DeleteFromAEL(eMaxPair);
+ }
+#ifdef use_lines
+ else if (e->WindDelta == 0)
+ {
+ if (e->OutIdx >= 0)
+ {
+ AddOutPt(e, e->Top);
+ e->OutIdx = Unassigned;
+ }
+ DeleteFromAEL(e);
+
+ if (eMaxPair->OutIdx >= 0)
+ {
+ AddOutPt(eMaxPair, e->Top);
+ eMaxPair->OutIdx = Unassigned;
+ }
+ DeleteFromAEL(eMaxPair);
+ }
+#endif
+ else throw clipperException("DoMaxima error");
+}
+//------------------------------------------------------------------------------
+
+void Clipper::ProcessEdgesAtTopOfScanbeam(const cInt topY)
+{
+ TEdge* e = m_ActiveEdges;
+ while( e )
+ {
+ //1. process maxima, treating them as if they're 'bent' horizontal edges,
+ // but exclude maxima with horizontal edges. nb: e can't be a horizontal.
+ bool IsMaximaEdge = IsMaxima(e, topY);
+
+ if(IsMaximaEdge)
+ {
+ TEdge* eMaxPair = GetMaximaPairEx(e);
+ IsMaximaEdge = (!eMaxPair || !IsHorizontal(*eMaxPair));
+ }
+
+ if(IsMaximaEdge)
+ {
+ if (m_StrictSimple) m_Maxima.push_back(e->Top.X);
+ TEdge* ePrev = e->PrevInAEL;
+ DoMaxima(e);
+ if( !ePrev ) e = m_ActiveEdges;
+ else e = ePrev->NextInAEL;
+ }
+ else
+ {
+ //2. promote horizontal edges, otherwise update Curr.X and Curr.Y ...
+ if (IsIntermediate(e, topY) && IsHorizontal(*e->NextInLML))
+ {
+ UpdateEdgeIntoAEL(e);
+ if (e->OutIdx >= 0)
+ AddOutPt(e, e->Bot);
+ AddEdgeToSEL(e);
+ }
+ else
+ {
+ e->Curr.X = TopX( *e, topY );
+ e->Curr.Y = topY;
+#ifdef use_xyz
+ e->Curr.Z = topY == e->Top.Y ? e->Top.Z : (topY == e->Bot.Y ? e->Bot.Z : 0);
+#endif
+ }
+
+ //When StrictlySimple and 'e' is being touched by another edge, then
+ //make sure both edges have a vertex here ...
+ if (m_StrictSimple)
+ {
+ TEdge* ePrev = e->PrevInAEL;
+ if ((e->OutIdx >= 0) && (e->WindDelta != 0) && ePrev && (ePrev->OutIdx >= 0) &&
+ (ePrev->Curr.X == e->Curr.X) && (ePrev->WindDelta != 0))
+ {
+ IntPoint pt = e->Curr;
+#ifdef use_xyz
+ SetZ(pt, *ePrev, *e);
+#endif
+ OutPt* op = AddOutPt(ePrev, pt);
+ OutPt* op2 = AddOutPt(e, pt);
+ AddJoin(op, op2, pt); //StrictlySimple (type-3) join
+ }
+ }
+
+ e = e->NextInAEL;
+ }
+ }
+
+ //3. Process horizontals at the Top of the scanbeam ...
+ m_Maxima.sort();
+ ProcessHorizontals();
+ m_Maxima.clear();
+
+ //4. Promote intermediate vertices ...
+ e = m_ActiveEdges;
+ while(e)
+ {
+ if(IsIntermediate(e, topY))
+ {
+ OutPt* op = 0;
+ if( e->OutIdx >= 0 )
+ op = AddOutPt(e, e->Top);
+ UpdateEdgeIntoAEL(e);
+
+ //if output polygons share an edge, they'll need joining later ...
+ TEdge* ePrev = e->PrevInAEL;
+ TEdge* eNext = e->NextInAEL;
+ if (ePrev && ePrev->Curr.X == e->Bot.X &&
+ ePrev->Curr.Y == e->Bot.Y && op &&
+ ePrev->OutIdx >= 0 && ePrev->Curr.Y > ePrev->Top.Y &&
+ SlopesEqual(e->Curr, e->Top, ePrev->Curr, ePrev->Top, m_UseFullRange) &&
+ (e->WindDelta != 0) && (ePrev->WindDelta != 0))
+ {
+ OutPt* op2 = AddOutPt(ePrev, e->Bot);
+ AddJoin(op, op2, e->Top);
+ }
+ else if (eNext && eNext->Curr.X == e->Bot.X &&
+ eNext->Curr.Y == e->Bot.Y && op &&
+ eNext->OutIdx >= 0 && eNext->Curr.Y > eNext->Top.Y &&
+ SlopesEqual(e->Curr, e->Top, eNext->Curr, eNext->Top, m_UseFullRange) &&
+ (e->WindDelta != 0) && (eNext->WindDelta != 0))
+ {
+ OutPt* op2 = AddOutPt(eNext, e->Bot);
+ AddJoin(op, op2, e->Top);
+ }
+ }
+ e = e->NextInAEL;
+ }
+}
+//------------------------------------------------------------------------------
+
+void Clipper::FixupOutPolyline(OutRec &outrec)
+{
+ OutPt *pp = outrec.Pts;
+ OutPt *lastPP = pp->Prev;
+ while (pp != lastPP)
+ {
+ pp = pp->Next;
+ if (pp->Pt == pp->Prev->Pt)
+ {
+ if (pp == lastPP) lastPP = pp->Prev;
+ OutPt *tmpPP = pp->Prev;
+ tmpPP->Next = pp->Next;
+ pp->Next->Prev = tmpPP;
+ delete pp;
+ pp = tmpPP;
+ }
+ }
+
+ if (pp == pp->Prev)
+ {
+ DisposeOutPts(pp);
+ outrec.Pts = 0;
+ return;
+ }
+}
+//------------------------------------------------------------------------------
+
+void Clipper::FixupOutPolygon(OutRec &outrec)
+{
+ //FixupOutPolygon() - removes duplicate points and simplifies consecutive
+ //parallel edges by removing the middle vertex.
+ OutPt *lastOK = 0;
+ outrec.BottomPt = 0;
+ OutPt *pp = outrec.Pts;
+ bool preserveCol = m_PreserveCollinear || m_StrictSimple;
+
+ for (;;)
+ {
+ if (pp->Prev == pp || pp->Prev == pp->Next)
+ {
+ DisposeOutPts(pp);
+ outrec.Pts = 0;
+ return;
+ }
+
+ //test for duplicate points and collinear edges ...
+ if ((pp->Pt == pp->Next->Pt) || (pp->Pt == pp->Prev->Pt) ||
+ (SlopesEqual(pp->Prev->Pt, pp->Pt, pp->Next->Pt, m_UseFullRange) &&
+ (!preserveCol || !Pt2IsBetweenPt1AndPt3(pp->Prev->Pt, pp->Pt, pp->Next->Pt))))
+ {
+ lastOK = 0;
+ OutPt *tmp = pp;
+ pp->Prev->Next = pp->Next;
+ pp->Next->Prev = pp->Prev;
+ pp = pp->Prev;
+ delete tmp;
+ }
+ else if (pp == lastOK) break;
+ else
+ {
+ if (!lastOK) lastOK = pp;
+ pp = pp->Next;
+ }
+ }
+ outrec.Pts = pp;
+}
+//------------------------------------------------------------------------------
+
+int PointCount(OutPt *Pts)
+{
+ if (!Pts) return 0;
+ int result = 0;
+ OutPt* p = Pts;
+ do
+ {
+ result++;
+ p = p->Next;
+ }
+ while (p != Pts);
+ return result;
+}
+//------------------------------------------------------------------------------
+
+void Clipper::BuildResult(Paths &polys)
+{
+ polys.reserve(m_PolyOuts.size());
+ for (PolyOutList::size_type i = 0; i < m_PolyOuts.size(); ++i)
+ {
+ if (!m_PolyOuts[i]->Pts) continue;
+ Path pg;
+ OutPt* p = m_PolyOuts[i]->Pts->Prev;
+ int cnt = PointCount(p);
+ if (cnt < 2) continue;
+ pg.reserve(cnt);
+ for (int i = 0; i < cnt; ++i)
+ {
+ pg.push_back(p->Pt);
+ p = p->Prev;
+ }
+ polys.push_back(pg);
+ }
+}
+//------------------------------------------------------------------------------
+
+void Clipper::BuildResult2(PolyTree& polytree)
+{
+ polytree.Clear();
+ polytree.AllNodes.reserve(m_PolyOuts.size());
+ //add each output polygon/contour to polytree ...
+ for (PolyOutList::size_type i = 0; i < m_PolyOuts.size(); i++)
+ {
+ OutRec* outRec = m_PolyOuts[i];
+ int cnt = PointCount(outRec->Pts);
+ if ((outRec->IsOpen && cnt < 2) || (!outRec->IsOpen && cnt < 3)) continue;
+ FixHoleLinkage(*outRec);
+ PolyNode* pn = new PolyNode();
+ //nb: polytree takes ownership of all the PolyNodes
+ polytree.AllNodes.push_back(pn);
+ outRec->PolyNd = pn;
+ pn->Parent = 0;
+ pn->Index = 0;
+ pn->Contour.reserve(cnt);
+ OutPt *op = outRec->Pts->Prev;
+ for (int j = 0; j < cnt; j++)
+ {
+ pn->Contour.push_back(op->Pt);
+ op = op->Prev;
+ }
+ }
+
+ //fixup PolyNode links etc ...
+ polytree.Childs.reserve(m_PolyOuts.size());
+ for (PolyOutList::size_type i = 0; i < m_PolyOuts.size(); i++)
+ {
+ OutRec* outRec = m_PolyOuts[i];
+ if (!outRec->PolyNd) continue;
+ if (outRec->IsOpen)
+ {
+ outRec->PolyNd->m_IsOpen = true;
+ polytree.AddChild(*outRec->PolyNd);
+ }
+ else if (outRec->FirstLeft && outRec->FirstLeft->PolyNd)
+ outRec->FirstLeft->PolyNd->AddChild(*outRec->PolyNd);
+ else
+ polytree.AddChild(*outRec->PolyNd);
+ }
+}
+//------------------------------------------------------------------------------
+
+void SwapIntersectNodes(IntersectNode &int1, IntersectNode &int2)
+{
+ //just swap the contents (because fIntersectNodes is a single-linked-list)
+ IntersectNode inode = int1; //gets a copy of Int1
+ int1.Edge1 = int2.Edge1;
+ int1.Edge2 = int2.Edge2;
+ int1.Pt = int2.Pt;
+ int2.Edge1 = inode.Edge1;
+ int2.Edge2 = inode.Edge2;
+ int2.Pt = inode.Pt;
+}
+//------------------------------------------------------------------------------
+
+inline bool E2InsertsBeforeE1(TEdge &e1, TEdge &e2)
+{
+ if (e2.Curr.X == e1.Curr.X)
+ {
+ if (e2.Top.Y > e1.Top.Y)
+ return e2.Top.X < TopX(e1, e2.Top.Y);
+ else return e1.Top.X > TopX(e2, e1.Top.Y);
+ }
+ else return e2.Curr.X < e1.Curr.X;
+}
+//------------------------------------------------------------------------------
+
+bool GetOverlap(const cInt a1, const cInt a2, const cInt b1, const cInt b2,
+ cInt& Left, cInt& Right)
+{
+ if (a1 < a2)
+ {
+ if (b1 < b2) {Left = std::max(a1,b1); Right = std::min(a2,b2);}
+ else {Left = std::max(a1,b2); Right = std::min(a2,b1);}
+ }
+ else
+ {
+ if (b1 < b2) {Left = std::max(a2,b1); Right = std::min(a1,b2);}
+ else {Left = std::max(a2,b2); Right = std::min(a1,b1);}
+ }
+ return Left < Right;
+}
+//------------------------------------------------------------------------------
+
+inline void UpdateOutPtIdxs(OutRec& outrec)
+{
+ OutPt* op = outrec.Pts;
+ do
+ {
+ op->Idx = outrec.Idx;
+ op = op->Prev;
+ }
+ while(op != outrec.Pts);
+}
+//------------------------------------------------------------------------------
+
+void Clipper::InsertEdgeIntoAEL(TEdge *edge, TEdge* startEdge)
+{
+ if(!m_ActiveEdges)
+ {
+ edge->PrevInAEL = 0;
+ edge->NextInAEL = 0;
+ m_ActiveEdges = edge;
+ }
+ else if(!startEdge && E2InsertsBeforeE1(*m_ActiveEdges, *edge))
+ {
+ edge->PrevInAEL = 0;
+ edge->NextInAEL = m_ActiveEdges;
+ m_ActiveEdges->PrevInAEL = edge;
+ m_ActiveEdges = edge;
+ }
+ else
+ {
+ if(!startEdge) startEdge = m_ActiveEdges;
+ while(startEdge->NextInAEL &&
+ !E2InsertsBeforeE1(*startEdge->NextInAEL , *edge))
+ startEdge = startEdge->NextInAEL;
+ edge->NextInAEL = startEdge->NextInAEL;
+ if(startEdge->NextInAEL) startEdge->NextInAEL->PrevInAEL = edge;
+ edge->PrevInAEL = startEdge;
+ startEdge->NextInAEL = edge;
+ }
+}
+//----------------------------------------------------------------------
+
+OutPt* DupOutPt(OutPt* outPt, bool InsertAfter)
+{
+ OutPt* result = new OutPt;
+ result->Pt = outPt->Pt;
+ result->Idx = outPt->Idx;
+ if (InsertAfter)
+ {
+ result->Next = outPt->Next;
+ result->Prev = outPt;
+ outPt->Next->Prev = result;
+ outPt->Next = result;
+ }
+ else
+ {
+ result->Prev = outPt->Prev;
+ result->Next = outPt;
+ outPt->Prev->Next = result;
+ outPt->Prev = result;
+ }
+ return result;
+}
+//------------------------------------------------------------------------------
+
+bool JoinHorz(OutPt* op1, OutPt* op1b, OutPt* op2, OutPt* op2b,
+ const IntPoint Pt, bool DiscardLeft)
+{
+ Direction Dir1 = (op1->Pt.X > op1b->Pt.X ? dRightToLeft : dLeftToRight);
+ Direction Dir2 = (op2->Pt.X > op2b->Pt.X ? dRightToLeft : dLeftToRight);
+ if (Dir1 == Dir2) return false;
+
+ //When DiscardLeft, we want Op1b to be on the Left of Op1, otherwise we
+ //want Op1b to be on the Right. (And likewise with Op2 and Op2b.)
+ //So, to facilitate this while inserting Op1b and Op2b ...
+ //when DiscardLeft, make sure we're AT or RIGHT of Pt before adding Op1b,
+ //otherwise make sure we're AT or LEFT of Pt. (Likewise with Op2b.)
+ if (Dir1 == dLeftToRight)
+ {
+ while (op1->Next->Pt.X <= Pt.X &&
+ op1->Next->Pt.X >= op1->Pt.X && op1->Next->Pt.Y == Pt.Y)
+ op1 = op1->Next;
+ if (DiscardLeft && (op1->Pt.X != Pt.X)) op1 = op1->Next;
+ op1b = DupOutPt(op1, !DiscardLeft);
+ if (op1b->Pt != Pt)
+ {
+ op1 = op1b;
+ op1->Pt = Pt;
+ op1b = DupOutPt(op1, !DiscardLeft);
+ }
+ }
+ else
+ {
+ while (op1->Next->Pt.X >= Pt.X &&
+ op1->Next->Pt.X <= op1->Pt.X && op1->Next->Pt.Y == Pt.Y)
+ op1 = op1->Next;
+ if (!DiscardLeft && (op1->Pt.X != Pt.X)) op1 = op1->Next;
+ op1b = DupOutPt(op1, DiscardLeft);
+ if (op1b->Pt != Pt)
+ {
+ op1 = op1b;
+ op1->Pt = Pt;
+ op1b = DupOutPt(op1, DiscardLeft);
+ }
+ }
+
+ if (Dir2 == dLeftToRight)
+ {
+ while (op2->Next->Pt.X <= Pt.X &&
+ op2->Next->Pt.X >= op2->Pt.X && op2->Next->Pt.Y == Pt.Y)
+ op2 = op2->Next;
+ if (DiscardLeft && (op2->Pt.X != Pt.X)) op2 = op2->Next;
+ op2b = DupOutPt(op2, !DiscardLeft);
+ if (op2b->Pt != Pt)
+ {
+ op2 = op2b;
+ op2->Pt = Pt;
+ op2b = DupOutPt(op2, !DiscardLeft);
+ };
+ } else
+ {
+ while (op2->Next->Pt.X >= Pt.X &&
+ op2->Next->Pt.X <= op2->Pt.X && op2->Next->Pt.Y == Pt.Y)
+ op2 = op2->Next;
+ if (!DiscardLeft && (op2->Pt.X != Pt.X)) op2 = op2->Next;
+ op2b = DupOutPt(op2, DiscardLeft);
+ if (op2b->Pt != Pt)
+ {
+ op2 = op2b;
+ op2->Pt = Pt;
+ op2b = DupOutPt(op2, DiscardLeft);
+ };
+ };
+
+ if ((Dir1 == dLeftToRight) == DiscardLeft)
+ {
+ op1->Prev = op2;
+ op2->Next = op1;
+ op1b->Next = op2b;
+ op2b->Prev = op1b;
+ }
+ else
+ {
+ op1->Next = op2;
+ op2->Prev = op1;
+ op1b->Prev = op2b;
+ op2b->Next = op1b;
+ }
+ return true;
+}
+//------------------------------------------------------------------------------
+
+bool Clipper::JoinPoints(Join *j, OutRec* outRec1, OutRec* outRec2)
+{
+ OutPt *op1 = j->OutPt1, *op1b;
+ OutPt *op2 = j->OutPt2, *op2b;
+
+ //There are 3 kinds of joins for output polygons ...
+ //1. Horizontal joins where Join.OutPt1 & Join.OutPt2 are vertices anywhere
+ //along (horizontal) collinear edges (& Join.OffPt is on the same horizontal).
+ //2. Non-horizontal joins where Join.OutPt1 & Join.OutPt2 are at the same
+ //location at the Bottom of the overlapping segment (& Join.OffPt is above).
+ //3. StrictSimple joins where edges touch but are not collinear and where
+ //Join.OutPt1, Join.OutPt2 & Join.OffPt all share the same point.
+ bool isHorizontal = (j->OutPt1->Pt.Y == j->OffPt.Y);
+
+ if (isHorizontal && (j->OffPt == j->OutPt1->Pt) &&
+ (j->OffPt == j->OutPt2->Pt))
+ {
+ //Strictly Simple join ...
+ if (outRec1 != outRec2) return false;
+ op1b = j->OutPt1->Next;
+ while (op1b != op1 && (op1b->Pt == j->OffPt))
+ op1b = op1b->Next;
+ bool reverse1 = (op1b->Pt.Y > j->OffPt.Y);
+ op2b = j->OutPt2->Next;
+ while (op2b != op2 && (op2b->Pt == j->OffPt))
+ op2b = op2b->Next;
+ bool reverse2 = (op2b->Pt.Y > j->OffPt.Y);
+ if (reverse1 == reverse2) return false;
+ if (reverse1)
+ {
+ op1b = DupOutPt(op1, false);
+ op2b = DupOutPt(op2, true);
+ op1->Prev = op2;
+ op2->Next = op1;
+ op1b->Next = op2b;
+ op2b->Prev = op1b;
+ j->OutPt1 = op1;
+ j->OutPt2 = op1b;
+ return true;
+ } else
+ {
+ op1b = DupOutPt(op1, true);
+ op2b = DupOutPt(op2, false);
+ op1->Next = op2;
+ op2->Prev = op1;
+ op1b->Prev = op2b;
+ op2b->Next = op1b;
+ j->OutPt1 = op1;
+ j->OutPt2 = op1b;
+ return true;
+ }
+ }
+ else if (isHorizontal)
+ {
+ //treat horizontal joins differently to non-horizontal joins since with
+ //them we're not yet sure where the overlapping is. OutPt1.Pt & OutPt2.Pt
+ //may be anywhere along the horizontal edge.
+ op1b = op1;
+ while (op1->Prev->Pt.Y == op1->Pt.Y && op1->Prev != op1b && op1->Prev != op2)
+ op1 = op1->Prev;
+ while (op1b->Next->Pt.Y == op1b->Pt.Y && op1b->Next != op1 && op1b->Next != op2)
+ op1b = op1b->Next;
+ if (op1b->Next == op1 || op1b->Next == op2) return false; //a flat 'polygon'
+
+ op2b = op2;
+ while (op2->Prev->Pt.Y == op2->Pt.Y && op2->Prev != op2b && op2->Prev != op1b)
+ op2 = op2->Prev;
+ while (op2b->Next->Pt.Y == op2b->Pt.Y && op2b->Next != op2 && op2b->Next != op1)
+ op2b = op2b->Next;
+ if (op2b->Next == op2 || op2b->Next == op1) return false; //a flat 'polygon'
+
+ cInt Left, Right;
+ //Op1 --> Op1b & Op2 --> Op2b are the extremites of the horizontal edges
+ if (!GetOverlap(op1->Pt.X, op1b->Pt.X, op2->Pt.X, op2b->Pt.X, Left, Right))
+ return false;
+
+ //DiscardLeftSide: when overlapping edges are joined, a spike will created
+ //which needs to be cleaned up. However, we don't want Op1 or Op2 caught up
+ //on the discard Side as either may still be needed for other joins ...
+ IntPoint Pt;
+ bool DiscardLeftSide;
+ if (op1->Pt.X >= Left && op1->Pt.X <= Right)
+ {
+ Pt = op1->Pt; DiscardLeftSide = (op1->Pt.X > op1b->Pt.X);
+ }
+ else if (op2->Pt.X >= Left&& op2->Pt.X <= Right)
+ {
+ Pt = op2->Pt; DiscardLeftSide = (op2->Pt.X > op2b->Pt.X);
+ }
+ else if (op1b->Pt.X >= Left && op1b->Pt.X <= Right)
+ {
+ Pt = op1b->Pt; DiscardLeftSide = op1b->Pt.X > op1->Pt.X;
+ }
+ else
+ {
+ Pt = op2b->Pt; DiscardLeftSide = (op2b->Pt.X > op2->Pt.X);
+ }
+ j->OutPt1 = op1; j->OutPt2 = op2;
+ return JoinHorz(op1, op1b, op2, op2b, Pt, DiscardLeftSide);
+ } else
+ {
+ //nb: For non-horizontal joins ...
+ // 1. Jr.OutPt1.Pt.Y == Jr.OutPt2.Pt.Y
+ // 2. Jr.OutPt1.Pt > Jr.OffPt.Y
+
+ //make sure the polygons are correctly oriented ...
+ op1b = op1->Next;
+ while ((op1b->Pt == op1->Pt) && (op1b != op1)) op1b = op1b->Next;
+ bool Reverse1 = ((op1b->Pt.Y > op1->Pt.Y) ||
+ !SlopesEqual(op1->Pt, op1b->Pt, j->OffPt, m_UseFullRange));
+ if (Reverse1)
+ {
+ op1b = op1->Prev;
+ while ((op1b->Pt == op1->Pt) && (op1b != op1)) op1b = op1b->Prev;
+ if ((op1b->Pt.Y > op1->Pt.Y) ||
+ !SlopesEqual(op1->Pt, op1b->Pt, j->OffPt, m_UseFullRange)) return false;
+ };
+ op2b = op2->Next;
+ while ((op2b->Pt == op2->Pt) && (op2b != op2))op2b = op2b->Next;
+ bool Reverse2 = ((op2b->Pt.Y > op2->Pt.Y) ||
+ !SlopesEqual(op2->Pt, op2b->Pt, j->OffPt, m_UseFullRange));
+ if (Reverse2)
+ {
+ op2b = op2->Prev;
+ while ((op2b->Pt == op2->Pt) && (op2b != op2)) op2b = op2b->Prev;
+ if ((op2b->Pt.Y > op2->Pt.Y) ||
+ !SlopesEqual(op2->Pt, op2b->Pt, j->OffPt, m_UseFullRange)) return false;
+ }
+
+ if ((op1b == op1) || (op2b == op2) || (op1b == op2b) ||
+ ((outRec1 == outRec2) && (Reverse1 == Reverse2))) return false;
+
+ if (Reverse1)
+ {
+ op1b = DupOutPt(op1, false);
+ op2b = DupOutPt(op2, true);
+ op1->Prev = op2;
+ op2->Next = op1;
+ op1b->Next = op2b;
+ op2b->Prev = op1b;
+ j->OutPt1 = op1;
+ j->OutPt2 = op1b;
+ return true;
+ } else
+ {
+ op1b = DupOutPt(op1, true);
+ op2b = DupOutPt(op2, false);
+ op1->Next = op2;
+ op2->Prev = op1;
+ op1b->Prev = op2b;
+ op2b->Next = op1b;
+ j->OutPt1 = op1;
+ j->OutPt2 = op1b;
+ return true;
+ }
+ }
+}
+//----------------------------------------------------------------------
+
+static OutRec* ParseFirstLeft(OutRec* FirstLeft)
+{
+ while (FirstLeft && !FirstLeft->Pts)
+ FirstLeft = FirstLeft->FirstLeft;
+ return FirstLeft;
+}
+//------------------------------------------------------------------------------
+
+void Clipper::FixupFirstLefts1(OutRec* OldOutRec, OutRec* NewOutRec)
+{
+ //tests if NewOutRec contains the polygon before reassigning FirstLeft
+ for (PolyOutList::size_type i = 0; i < m_PolyOuts.size(); ++i)
+ {
+ OutRec* outRec = m_PolyOuts[i];
+ OutRec* firstLeft = ParseFirstLeft(outRec->FirstLeft);
+ if (outRec->Pts && firstLeft == OldOutRec)
+ {
+ if (Poly2ContainsPoly1(outRec->Pts, NewOutRec->Pts))
+ outRec->FirstLeft = NewOutRec;
+ }
+ }
+}
+//----------------------------------------------------------------------
+
+void Clipper::FixupFirstLefts2(OutRec* InnerOutRec, OutRec* OuterOutRec)
+{
+ //A polygon has split into two such that one is now the inner of the other.
+ //It's possible that these polygons now wrap around other polygons, so check
+ //every polygon that's also contained by OuterOutRec's FirstLeft container
+ //(including 0) to see if they've become inner to the new inner polygon ...
+ OutRec* orfl = OuterOutRec->FirstLeft;
+ for (PolyOutList::size_type i = 0; i < m_PolyOuts.size(); ++i)
+ {
+ OutRec* outRec = m_PolyOuts[i];
+
+ if (!outRec->Pts || outRec == OuterOutRec || outRec == InnerOutRec)
+ continue;
+ OutRec* firstLeft = ParseFirstLeft(outRec->FirstLeft);
+ if (firstLeft != orfl && firstLeft != InnerOutRec && firstLeft != OuterOutRec)
+ continue;
+ if (Poly2ContainsPoly1(outRec->Pts, InnerOutRec->Pts))
+ outRec->FirstLeft = InnerOutRec;
+ else if (Poly2ContainsPoly1(outRec->Pts, OuterOutRec->Pts))
+ outRec->FirstLeft = OuterOutRec;
+ else if (outRec->FirstLeft == InnerOutRec || outRec->FirstLeft == OuterOutRec)
+ outRec->FirstLeft = orfl;
+ }
+}
+//----------------------------------------------------------------------
+void Clipper::FixupFirstLefts3(OutRec* OldOutRec, OutRec* NewOutRec)
+{
+ //reassigns FirstLeft WITHOUT testing if NewOutRec contains the polygon
+ for (PolyOutList::size_type i = 0; i < m_PolyOuts.size(); ++i)
+ {
+ OutRec* outRec = m_PolyOuts[i];
+ OutRec* firstLeft = ParseFirstLeft(outRec->FirstLeft);
+ if (outRec->Pts && firstLeft == OldOutRec)
+ outRec->FirstLeft = NewOutRec;
+ }
+}
+//----------------------------------------------------------------------
+
+void Clipper::JoinCommonEdges()
+{
+ for (JoinList::size_type i = 0; i < m_Joins.size(); i++)
+ {
+ Join* join = m_Joins[i];
+
+ OutRec *outRec1 = GetOutRec(join->OutPt1->Idx);
+ OutRec *outRec2 = GetOutRec(join->OutPt2->Idx);
+
+ if (!outRec1->Pts || !outRec2->Pts) continue;
+ if (outRec1->IsOpen || outRec2->IsOpen) continue;
+
+ //get the polygon fragment with the correct hole state (FirstLeft)
+ //before calling JoinPoints() ...
+ OutRec *holeStateRec;
+ if (outRec1 == outRec2) holeStateRec = outRec1;
+ else if (OutRec1RightOfOutRec2(outRec1, outRec2)) holeStateRec = outRec2;
+ else if (OutRec1RightOfOutRec2(outRec2, outRec1)) holeStateRec = outRec1;
+ else holeStateRec = GetLowermostRec(outRec1, outRec2);
+
+ if (!JoinPoints(join, outRec1, outRec2)) continue;
+
+ if (outRec1 == outRec2)
+ {
+ //instead of joining two polygons, we've just created a new one by
+ //splitting one polygon into two.
+ outRec1->Pts = join->OutPt1;
+ outRec1->BottomPt = 0;
+ outRec2 = CreateOutRec();
+ outRec2->Pts = join->OutPt2;
+
+ //update all OutRec2.Pts Idx's ...
+ UpdateOutPtIdxs(*outRec2);
+
+ if (Poly2ContainsPoly1(outRec2->Pts, outRec1->Pts))
+ {
+ //outRec1 contains outRec2 ...
+ outRec2->IsHole = !outRec1->IsHole;
+ outRec2->FirstLeft = outRec1;
+
+ if (m_UsingPolyTree) FixupFirstLefts2(outRec2, outRec1);
+
+ if ((outRec2->IsHole ^ m_ReverseOutput) == (Area(*outRec2) > 0))
+ ReversePolyPtLinks(outRec2->Pts);
+
+ } else if (Poly2ContainsPoly1(outRec1->Pts, outRec2->Pts))
+ {
+ //outRec2 contains outRec1 ...
+ outRec2->IsHole = outRec1->IsHole;
+ outRec1->IsHole = !outRec2->IsHole;
+ outRec2->FirstLeft = outRec1->FirstLeft;
+ outRec1->FirstLeft = outRec2;
+
+ if (m_UsingPolyTree) FixupFirstLefts2(outRec1, outRec2);
+
+ if ((outRec1->IsHole ^ m_ReverseOutput) == (Area(*outRec1) > 0))
+ ReversePolyPtLinks(outRec1->Pts);
+ }
+ else
+ {
+ //the 2 polygons are completely separate ...
+ outRec2->IsHole = outRec1->IsHole;
+ outRec2->FirstLeft = outRec1->FirstLeft;
+
+ //fixup FirstLeft pointers that may need reassigning to OutRec2
+ if (m_UsingPolyTree) FixupFirstLefts1(outRec1, outRec2);
+ }
+
+ } else
+ {
+ //joined 2 polygons together ...
+
+ outRec2->Pts = 0;
+ outRec2->BottomPt = 0;
+ outRec2->Idx = outRec1->Idx;
+
+ outRec1->IsHole = holeStateRec->IsHole;
+ if (holeStateRec == outRec2)
+ outRec1->FirstLeft = outRec2->FirstLeft;
+ outRec2->FirstLeft = outRec1;
+
+ if (m_UsingPolyTree) FixupFirstLefts3(outRec2, outRec1);
+ }
+ }
+}
+
+//------------------------------------------------------------------------------
+// ClipperOffset support functions ...
+//------------------------------------------------------------------------------
+
+DoublePoint GetUnitNormal(const IntPoint &pt1, const IntPoint &pt2)
+{
+ if(pt2.X == pt1.X && pt2.Y == pt1.Y)
+ return DoublePoint(0, 0);
+
+ double Dx = (double)(pt2.X - pt1.X);
+ double dy = (double)(pt2.Y - pt1.Y);
+ double f = 1 *1.0/ std::sqrt( Dx*Dx + dy*dy );
+ Dx *= f;
+ dy *= f;
+ return DoublePoint(dy, -Dx);
+}
+
+//------------------------------------------------------------------------------
+// ClipperOffset class
+//------------------------------------------------------------------------------
+
+ClipperOffset::ClipperOffset(double miterLimit, double arcTolerance)
+{
+ this->MiterLimit = miterLimit;
+ this->ArcTolerance = arcTolerance;
+ m_lowest.X = -1;
+}
+//------------------------------------------------------------------------------
+
+ClipperOffset::~ClipperOffset()
+{
+ Clear();
+}
+//------------------------------------------------------------------------------
+
+void ClipperOffset::Clear()
+{
+ for (int i = 0; i < m_polyNodes.ChildCount(); ++i)
+ delete m_polyNodes.Childs[i];
+ m_polyNodes.Childs.clear();
+ m_lowest.X = -1;
+}
+//------------------------------------------------------------------------------
+
+void ClipperOffset::AddPath(const Path& path, JoinType joinType, EndType endType)
+{
+ int highI = (int)path.size() - 1;
+ if (highI < 0) return;
+ PolyNode* newNode = new PolyNode();
+ newNode->m_jointype = joinType;
+ newNode->m_endtype = endType;
+
+ //strip duplicate points from path and also get index to the lowest point ...
+ if (endType == etClosedLine || endType == etClosedPolygon)
+ while (highI > 0 && path[0] == path[highI]) highI--;
+ newNode->Contour.reserve(highI + 1);
+ newNode->Contour.push_back(path[0]);
+ int j = 0, k = 0;
+ for (int i = 1; i <= highI; i++)
+ if (newNode->Contour[j] != path[i])
+ {
+ j++;
+ newNode->Contour.push_back(path[i]);
+ if (path[i].Y > newNode->Contour[k].Y ||
+ (path[i].Y == newNode->Contour[k].Y &&
+ path[i].X < newNode->Contour[k].X)) k = j;
+ }
+ if (endType == etClosedPolygon && j < 2)
+ {
+ delete newNode;
+ return;
+ }
+ m_polyNodes.AddChild(*newNode);
+
+ //if this path's lowest pt is lower than all the others then update m_lowest
+ if (endType != etClosedPolygon) return;
+ if (m_lowest.X < 0)
+ m_lowest = IntPoint(m_polyNodes.ChildCount() - 1, k);
+ else
+ {
+ IntPoint ip = m_polyNodes.Childs[(int)m_lowest.X]->Contour[(int)m_lowest.Y];
+ if (newNode->Contour[k].Y > ip.Y ||
+ (newNode->Contour[k].Y == ip.Y &&
+ newNode->Contour[k].X < ip.X))
+ m_lowest = IntPoint(m_polyNodes.ChildCount() - 1, k);
+ }
+}
+//------------------------------------------------------------------------------
+
+void ClipperOffset::AddPaths(const Paths& paths, JoinType joinType, EndType endType)
+{
+ for (Paths::size_type i = 0; i < paths.size(); ++i)
+ AddPath(paths[i], joinType, endType);
+}
+//------------------------------------------------------------------------------
+
+void ClipperOffset::FixOrientations()
+{
+ //fixup orientations of all closed paths if the orientation of the
+ //closed path with the lowermost vertex is wrong ...
+ if (m_lowest.X >= 0 &&
+ !Orientation(m_polyNodes.Childs[(int)m_lowest.X]->Contour))
+ {
+ for (int i = 0; i < m_polyNodes.ChildCount(); ++i)
+ {
+ PolyNode& node = *m_polyNodes.Childs[i];
+ if (node.m_endtype == etClosedPolygon ||
+ (node.m_endtype == etClosedLine && Orientation(node.Contour)))
+ ReversePath(node.Contour);
+ }
+ } else
+ {
+ for (int i = 0; i < m_polyNodes.ChildCount(); ++i)
+ {
+ PolyNode& node = *m_polyNodes.Childs[i];
+ if (node.m_endtype == etClosedLine && !Orientation(node.Contour))
+ ReversePath(node.Contour);
+ }
+ }
+}
+//------------------------------------------------------------------------------
+
+void ClipperOffset::Execute(Paths& solution, double delta)
+{
+ solution.clear();
+ FixOrientations();
+ DoOffset(delta);
+
+ //now clean up 'corners' ...
+ Clipper clpr;
+ clpr.AddPaths(m_destPolys, ptSubject, true);
+ if (delta > 0)
+ {
+ clpr.Execute(ctUnion, solution, pftPositive, pftPositive);
+ }
+ else
+ {
+ IntRect r = clpr.GetBounds();
+ Path outer(4);
+ outer[0] = IntPoint(r.left - 10, r.bottom + 10);
+ outer[1] = IntPoint(r.right + 10, r.bottom + 10);
+ outer[2] = IntPoint(r.right + 10, r.top - 10);
+ outer[3] = IntPoint(r.left - 10, r.top - 10);
+
+ clpr.AddPath(outer, ptSubject, true);
+ clpr.ReverseSolution(true);
+ clpr.Execute(ctUnion, solution, pftNegative, pftNegative);
+ if (solution.size() > 0) solution.erase(solution.begin());
+ }
+}
+//------------------------------------------------------------------------------
+
+void ClipperOffset::Execute(PolyTree& solution, double delta)
+{
+ solution.Clear();
+ FixOrientations();
+ DoOffset(delta);
+
+ //now clean up 'corners' ...
+ Clipper clpr;
+ clpr.AddPaths(m_destPolys, ptSubject, true);
+ if (delta > 0)
+ {
+ clpr.Execute(ctUnion, solution, pftPositive, pftPositive);
+ }
+ else
+ {
+ IntRect r = clpr.GetBounds();
+ Path outer(4);
+ outer[0] = IntPoint(r.left - 10, r.bottom + 10);
+ outer[1] = IntPoint(r.right + 10, r.bottom + 10);
+ outer[2] = IntPoint(r.right + 10, r.top - 10);
+ outer[3] = IntPoint(r.left - 10, r.top - 10);
+
+ clpr.AddPath(outer, ptSubject, true);
+ clpr.ReverseSolution(true);
+ clpr.Execute(ctUnion, solution, pftNegative, pftNegative);
+ //remove the outer PolyNode rectangle ...
+ if (solution.ChildCount() == 1 && solution.Childs[0]->ChildCount() > 0)
+ {
+ PolyNode* outerNode = solution.Childs[0];
+ solution.Childs.reserve(outerNode->ChildCount());
+ solution.Childs[0] = outerNode->Childs[0];
+ solution.Childs[0]->Parent = outerNode->Parent;
+ for (int i = 1; i < outerNode->ChildCount(); ++i)
+ solution.AddChild(*outerNode->Childs[i]);
+ }
+ else
+ solution.Clear();
+ }
+}
+//------------------------------------------------------------------------------
+
+void ClipperOffset::DoOffset(double delta)
+{
+ m_destPolys.clear();
+ m_delta = delta;
+
+ //if Zero offset, just copy any CLOSED polygons to m_p and return ...
+ if (NEAR_ZERO(delta))
+ {
+ m_destPolys.reserve(m_polyNodes.ChildCount());
+ for (int i = 0; i < m_polyNodes.ChildCount(); i++)
+ {
+ PolyNode& node = *m_polyNodes.Childs[i];
+ if (node.m_endtype == etClosedPolygon)
+ m_destPolys.push_back(node.Contour);
+ }
+ return;
+ }
+
+ //see offset_triginometry3.svg in the documentation folder ...
+ if (MiterLimit > 2) m_miterLim = 2/(MiterLimit * MiterLimit);
+ else m_miterLim = 0.5;
+
+ double y;
+ if (ArcTolerance <= 0.0) y = def_arc_tolerance;
+ else if (ArcTolerance > std::fabs(delta) * def_arc_tolerance)
+ y = std::fabs(delta) * def_arc_tolerance;
+ else y = ArcTolerance;
+ //see offset_triginometry2.svg in the documentation folder ...
+ double steps = pi / std::acos(1 - y / std::fabs(delta));
+ if (steps > std::fabs(delta) * pi)
+ steps = std::fabs(delta) * pi; //ie excessive precision check
+ m_sin = std::sin(two_pi / steps);
+ m_cos = std::cos(two_pi / steps);
+ m_StepsPerRad = steps / two_pi;
+ if (delta < 0.0) m_sin = -m_sin;
+
+ m_destPolys.reserve(m_polyNodes.ChildCount() * 2);
+ for (int i = 0; i < m_polyNodes.ChildCount(); i++)
+ {
+ PolyNode& node = *m_polyNodes.Childs[i];
+ m_srcPoly = node.Contour;
+
+ int len = (int)m_srcPoly.size();
+ if (len == 0 || (delta <= 0 && (len < 3 || node.m_endtype != etClosedPolygon)))
+ continue;
+
+ m_destPoly.clear();
+ if (len == 1)
+ {
+ if (node.m_jointype == jtRound)
+ {
+ double X = 1.0, Y = 0.0;
+ for (cInt j = 1; j <= steps; j++)
+ {
+ m_destPoly.push_back(IntPoint(
+ Round(m_srcPoly[0].X + X * delta),
+ Round(m_srcPoly[0].Y + Y * delta)));
+ double X2 = X;
+ X = X * m_cos - m_sin * Y;
+ Y = X2 * m_sin + Y * m_cos;
+ }
+ }
+ else
+ {
+ double X = -1.0, Y = -1.0;
+ for (int j = 0; j < 4; ++j)
+ {
+ m_destPoly.push_back(IntPoint(
+ Round(m_srcPoly[0].X + X * delta),
+ Round(m_srcPoly[0].Y + Y * delta)));
+ if (X < 0) X = 1;
+ else if (Y < 0) Y = 1;
+ else X = -1;
+ }
+ }
+ m_destPolys.push_back(m_destPoly);
+ continue;
+ }
+ //build m_normals ...
+ m_normals.clear();
+ m_normals.reserve(len);
+ for (int j = 0; j < len - 1; ++j)
+ m_normals.push_back(GetUnitNormal(m_srcPoly[j], m_srcPoly[j + 1]));
+ if (node.m_endtype == etClosedLine || node.m_endtype == etClosedPolygon)
+ m_normals.push_back(GetUnitNormal(m_srcPoly[len - 1], m_srcPoly[0]));
+ else
+ m_normals.push_back(DoublePoint(m_normals[len - 2]));
+
+ if (node.m_endtype == etClosedPolygon)
+ {
+ int k = len - 1;
+ for (int j = 0; j < len; ++j)
+ OffsetPoint(j, k, node.m_jointype);
+ m_destPolys.push_back(m_destPoly);
+ }
+ else if (node.m_endtype == etClosedLine)
+ {
+ int k = len - 1;
+ for (int j = 0; j < len; ++j)
+ OffsetPoint(j, k, node.m_jointype);
+ m_destPolys.push_back(m_destPoly);
+ m_destPoly.clear();
+ //re-build m_normals ...
+ DoublePoint n = m_normals[len -1];
+ for (int j = len - 1; j > 0; j--)
+ m_normals[j] = DoublePoint(-m_normals[j - 1].X, -m_normals[j - 1].Y);
+ m_normals[0] = DoublePoint(-n.X, -n.Y);
+ k = 0;
+ for (int j = len - 1; j >= 0; j--)
+ OffsetPoint(j, k, node.m_jointype);
+ m_destPolys.push_back(m_destPoly);
+ }
+ else
+ {
+ int k = 0;
+ for (int j = 1; j < len - 1; ++j)
+ OffsetPoint(j, k, node.m_jointype);
+
+ IntPoint pt1;
+ if (node.m_endtype == etOpenButt)
+ {
+ int j = len - 1;
+ pt1 = IntPoint((cInt)Round(m_srcPoly[j].X + m_normals[j].X *
+ delta), (cInt)Round(m_srcPoly[j].Y + m_normals[j].Y * delta));
+ m_destPoly.push_back(pt1);
+ pt1 = IntPoint((cInt)Round(m_srcPoly[j].X - m_normals[j].X *
+ delta), (cInt)Round(m_srcPoly[j].Y - m_normals[j].Y * delta));
+ m_destPoly.push_back(pt1);
+ }
+ else
+ {
+ int j = len - 1;
+ k = len - 2;
+ m_sinA = 0;
+ m_normals[j] = DoublePoint(-m_normals[j].X, -m_normals[j].Y);
+ if (node.m_endtype == etOpenSquare)
+ DoSquare(j, k);
+ else
+ DoRound(j, k);
+ }
+
+ //re-build m_normals ...
+ for (int j = len - 1; j > 0; j--)
+ m_normals[j] = DoublePoint(-m_normals[j - 1].X, -m_normals[j - 1].Y);
+ m_normals[0] = DoublePoint(-m_normals[1].X, -m_normals[1].Y);
+
+ k = len - 1;
+ for (int j = k - 1; j > 0; --j) OffsetPoint(j, k, node.m_jointype);
+
+ if (node.m_endtype == etOpenButt)
+ {
+ pt1 = IntPoint((cInt)Round(m_srcPoly[0].X - m_normals[0].X * delta),
+ (cInt)Round(m_srcPoly[0].Y - m_normals[0].Y * delta));
+ m_destPoly.push_back(pt1);
+ pt1 = IntPoint((cInt)Round(m_srcPoly[0].X + m_normals[0].X * delta),
+ (cInt)Round(m_srcPoly[0].Y + m_normals[0].Y * delta));
+ m_destPoly.push_back(pt1);
+ }
+ else
+ {
+ k = 1;
+ m_sinA = 0;
+ if (node.m_endtype == etOpenSquare)
+ DoSquare(0, 1);
+ else
+ DoRound(0, 1);
+ }
+ m_destPolys.push_back(m_destPoly);
+ }
+ }
+}
+//------------------------------------------------------------------------------
+
+void ClipperOffset::OffsetPoint(int j, int& k, JoinType jointype)
+{
+ //cross product ...
+ m_sinA = (m_normals[k].X * m_normals[j].Y - m_normals[j].X * m_normals[k].Y);
+ if (std::fabs(m_sinA * m_delta) < 1.0)
+ {
+ //dot product ...
+ double cosA = (m_normals[k].X * m_normals[j].X + m_normals[j].Y * m_normals[k].Y );
+ if (cosA > 0) // angle => 0 degrees
+ {
+ m_destPoly.push_back(IntPoint(Round(m_srcPoly[j].X + m_normals[k].X * m_delta),
+ Round(m_srcPoly[j].Y + m_normals[k].Y * m_delta)));
+ return;
+ }
+ //else angle => 180 degrees
+ }
+ else if (m_sinA > 1.0) m_sinA = 1.0;
+ else if (m_sinA < -1.0) m_sinA = -1.0;
+
+ if (m_sinA * m_delta < 0)
+ {
+ m_destPoly.push_back(IntPoint(Round(m_srcPoly[j].X + m_normals[k].X * m_delta),
+ Round(m_srcPoly[j].Y + m_normals[k].Y * m_delta)));
+ m_destPoly.push_back(m_srcPoly[j]);
+ m_destPoly.push_back(IntPoint(Round(m_srcPoly[j].X + m_normals[j].X * m_delta),
+ Round(m_srcPoly[j].Y + m_normals[j].Y * m_delta)));
+ }
+ else
+ switch (jointype)
+ {
+ case jtMiter:
+ {
+ double r = 1 + (m_normals[j].X * m_normals[k].X +
+ m_normals[j].Y * m_normals[k].Y);
+ if (r >= m_miterLim) DoMiter(j, k, r); else DoSquare(j, k);
+ break;
+ }
+ case jtSquare: DoSquare(j, k); break;
+ case jtRound: DoRound(j, k); break;
+ }
+ k = j;
+}
+//------------------------------------------------------------------------------
+
+void ClipperOffset::DoSquare(int j, int k)
+{
+ double dx = std::tan(std::atan2(m_sinA,
+ m_normals[k].X * m_normals[j].X + m_normals[k].Y * m_normals[j].Y) / 4);
+ m_destPoly.push_back(IntPoint(
+ Round(m_srcPoly[j].X + m_delta * (m_normals[k].X - m_normals[k].Y * dx)),
+ Round(m_srcPoly[j].Y + m_delta * (m_normals[k].Y + m_normals[k].X * dx))));
+ m_destPoly.push_back(IntPoint(
+ Round(m_srcPoly[j].X + m_delta * (m_normals[j].X + m_normals[j].Y * dx)),
+ Round(m_srcPoly[j].Y + m_delta * (m_normals[j].Y - m_normals[j].X * dx))));
+}
+//------------------------------------------------------------------------------
+
+void ClipperOffset::DoMiter(int j, int k, double r)
+{
+ double q = m_delta / r;
+ m_destPoly.push_back(IntPoint(Round(m_srcPoly[j].X + (m_normals[k].X + m_normals[j].X) * q),
+ Round(m_srcPoly[j].Y + (m_normals[k].Y + m_normals[j].Y) * q)));
+}
+//------------------------------------------------------------------------------
+
+void ClipperOffset::DoRound(int j, int k)
+{
+ double a = std::atan2(m_sinA,
+ m_normals[k].X * m_normals[j].X + m_normals[k].Y * m_normals[j].Y);
+ int steps = std::max((int)Round(m_StepsPerRad * std::fabs(a)), 1);
+
+ double X = m_normals[k].X, Y = m_normals[k].Y, X2;
+ for (int i = 0; i < steps; ++i)
+ {
+ m_destPoly.push_back(IntPoint(
+ Round(m_srcPoly[j].X + X * m_delta),
+ Round(m_srcPoly[j].Y + Y * m_delta)));
+ X2 = X;
+ X = X * m_cos - m_sin * Y;
+ Y = X2 * m_sin + Y * m_cos;
+ }
+ m_destPoly.push_back(IntPoint(
+ Round(m_srcPoly[j].X + m_normals[j].X * m_delta),
+ Round(m_srcPoly[j].Y + m_normals[j].Y * m_delta)));
+}
+
+//------------------------------------------------------------------------------
+// Miscellaneous public functions
+//------------------------------------------------------------------------------
+
+void Clipper::DoSimplePolygons()
+{
+ PolyOutList::size_type i = 0;
+ while (i < m_PolyOuts.size())
+ {
+ OutRec* outrec = m_PolyOuts[i++];
+ OutPt* op = outrec->Pts;
+ if (!op || outrec->IsOpen) continue;
+ do //for each Pt in Polygon until duplicate found do ...
+ {
+ OutPt* op2 = op->Next;
+ while (op2 != outrec->Pts)
+ {
+ if ((op->Pt == op2->Pt) && op2->Next != op && op2->Prev != op)
+ {
+ //split the polygon into two ...
+ OutPt* op3 = op->Prev;
+ OutPt* op4 = op2->Prev;
+ op->Prev = op4;
+ op4->Next = op;
+ op2->Prev = op3;
+ op3->Next = op2;
+
+ outrec->Pts = op;
+ OutRec* outrec2 = CreateOutRec();
+ outrec2->Pts = op2;
+ UpdateOutPtIdxs(*outrec2);
+ if (Poly2ContainsPoly1(outrec2->Pts, outrec->Pts))
+ {
+ //OutRec2 is contained by OutRec1 ...
+ outrec2->IsHole = !outrec->IsHole;
+ outrec2->FirstLeft = outrec;
+ if (m_UsingPolyTree) FixupFirstLefts2(outrec2, outrec);
+ }
+ else
+ if (Poly2ContainsPoly1(outrec->Pts, outrec2->Pts))
+ {
+ //OutRec1 is contained by OutRec2 ...
+ outrec2->IsHole = outrec->IsHole;
+ outrec->IsHole = !outrec2->IsHole;
+ outrec2->FirstLeft = outrec->FirstLeft;
+ outrec->FirstLeft = outrec2;
+ if (m_UsingPolyTree) FixupFirstLefts2(outrec, outrec2);
+ }
+ else
+ {
+ //the 2 polygons are separate ...
+ outrec2->IsHole = outrec->IsHole;
+ outrec2->FirstLeft = outrec->FirstLeft;
+ if (m_UsingPolyTree) FixupFirstLefts1(outrec, outrec2);
+ }
+ op2 = op; //ie get ready for the Next iteration
+ }
+ op2 = op2->Next;
+ }
+ op = op->Next;
+ }
+ while (op != outrec->Pts);
+ }
+}
+//------------------------------------------------------------------------------
+
+void ReversePath(Path& p)
+{
+ std::reverse(p.begin(), p.end());
+}
+//------------------------------------------------------------------------------
+
+void ReversePaths(Paths& p)
+{
+ for (Paths::size_type i = 0; i < p.size(); ++i)
+ ReversePath(p[i]);
+}
+//------------------------------------------------------------------------------
+
+void SimplifyPolygon(const Path &in_poly, Paths &out_polys, PolyFillType fillType)
+{
+ Clipper c;
+ c.StrictlySimple(true);
+ c.AddPath(in_poly, ptSubject, true);
+ c.Execute(ctUnion, out_polys, fillType, fillType);
+}
+//------------------------------------------------------------------------------
+
+void SimplifyPolygons(const Paths &in_polys, Paths &out_polys, PolyFillType fillType)
+{
+ Clipper c;
+ c.StrictlySimple(true);
+ c.AddPaths(in_polys, ptSubject, true);
+ c.Execute(ctUnion, out_polys, fillType, fillType);
+}
+//------------------------------------------------------------------------------
+
+void SimplifyPolygons(Paths &polys, PolyFillType fillType)
+{
+ SimplifyPolygons(polys, polys, fillType);
+}
+//------------------------------------------------------------------------------
+
+inline double DistanceSqrd(const IntPoint& pt1, const IntPoint& pt2)
+{
+ double Dx = ((double)pt1.X - pt2.X);
+ double dy = ((double)pt1.Y - pt2.Y);
+ return (Dx*Dx + dy*dy);
+}
+//------------------------------------------------------------------------------
+
+double DistanceFromLineSqrd(
+ const IntPoint& pt, const IntPoint& ln1, const IntPoint& ln2)
+{
+ //The equation of a line in general form (Ax + By + C = 0)
+ //given 2 points (x¹,y¹) & (x²,y²) is ...
+ //(y¹ - y²)x + (x² - x¹)y + (y² - y¹)x¹ - (x² - x¹)y¹ = 0
+ //A = (y¹ - y²); B = (x² - x¹); C = (y² - y¹)x¹ - (x² - x¹)y¹
+ //perpendicular distance of point (x³,y³) = (Ax³ + By³ + C)/Sqrt(A² + B²)
+ //see http://en.wikipedia.org/wiki/Perpendicular_distance
+ double A = double(ln1.Y - ln2.Y);
+ double B = double(ln2.X - ln1.X);
+ double C = A * ln1.X + B * ln1.Y;
+ C = A * pt.X + B * pt.Y - C;
+ return (C * C) / (A * A + B * B);
+}
+//---------------------------------------------------------------------------
+
+bool SlopesNearCollinear(const IntPoint& pt1,
+ const IntPoint& pt2, const IntPoint& pt3, double distSqrd)
+{
+ //this function is more accurate when the point that's geometrically
+ //between the other 2 points is the one that's tested for distance.
+ //ie makes it more likely to pick up 'spikes' ...
+ if (Abs(pt1.X - pt2.X) > Abs(pt1.Y - pt2.Y))
+ {
+ if ((pt1.X > pt2.X) == (pt1.X < pt3.X))
+ return DistanceFromLineSqrd(pt1, pt2, pt3) < distSqrd;
+ else if ((pt2.X > pt1.X) == (pt2.X < pt3.X))
+ return DistanceFromLineSqrd(pt2, pt1, pt3) < distSqrd;
+ else
+ return DistanceFromLineSqrd(pt3, pt1, pt2) < distSqrd;
+ }
+ else
+ {
+ if ((pt1.Y > pt2.Y) == (pt1.Y < pt3.Y))
+ return DistanceFromLineSqrd(pt1, pt2, pt3) < distSqrd;
+ else if ((pt2.Y > pt1.Y) == (pt2.Y < pt3.Y))
+ return DistanceFromLineSqrd(pt2, pt1, pt3) < distSqrd;
+ else
+ return DistanceFromLineSqrd(pt3, pt1, pt2) < distSqrd;
+ }
+}
+//------------------------------------------------------------------------------
+
+bool PointsAreClose(IntPoint pt1, IntPoint pt2, double distSqrd)
+{
+ double Dx = (double)pt1.X - pt2.X;
+ double dy = (double)pt1.Y - pt2.Y;
+ return ((Dx * Dx) + (dy * dy) <= distSqrd);
+}
+//------------------------------------------------------------------------------
+
+OutPt* ExcludeOp(OutPt* op)
+{
+ OutPt* result = op->Prev;
+ result->Next = op->Next;
+ op->Next->Prev = result;
+ result->Idx = 0;
+ return result;
+}
+//------------------------------------------------------------------------------
+
+void CleanPolygon(const Path& in_poly, Path& out_poly, double distance)
+{
+ //distance = proximity in units/pixels below which vertices
+ //will be stripped. Default ~= sqrt(2).
+
+ size_t size = in_poly.size();
+
+ if (size == 0)
+ {
+ out_poly.clear();
+ return;
+ }
+
+ OutPt* outPts = new OutPt[size];
+ for (size_t i = 0; i < size; ++i)
+ {
+ outPts[i].Pt = in_poly[i];
+ outPts[i].Next = &outPts[(i + 1) % size];
+ outPts[i].Next->Prev = &outPts[i];
+ outPts[i].Idx = 0;
+ }
+
+ double distSqrd = distance * distance;
+ OutPt* op = &outPts[0];
+ while (op->Idx == 0 && op->Next != op->Prev)
+ {
+ if (PointsAreClose(op->Pt, op->Prev->Pt, distSqrd))
+ {
+ op = ExcludeOp(op);
+ size--;
+ }
+ else if (PointsAreClose(op->Prev->Pt, op->Next->Pt, distSqrd))
+ {
+ ExcludeOp(op->Next);
+ op = ExcludeOp(op);
+ size -= 2;
+ }
+ else if (SlopesNearCollinear(op->Prev->Pt, op->Pt, op->Next->Pt, distSqrd))
+ {
+ op = ExcludeOp(op);
+ size--;
+ }
+ else
+ {
+ op->Idx = 1;
+ op = op->Next;
+ }
+ }
+
+ if (size < 3) size = 0;
+ out_poly.resize(size);
+ for (size_t i = 0; i < size; ++i)
+ {
+ out_poly[i] = op->Pt;
+ op = op->Next;
+ }
+ delete [] outPts;
+}
+//------------------------------------------------------------------------------
+
+void CleanPolygon(Path& poly, double distance)
+{
+ CleanPolygon(poly, poly, distance);
+}
+//------------------------------------------------------------------------------
+
+void CleanPolygons(const Paths& in_polys, Paths& out_polys, double distance)
+{
+ out_polys.resize(in_polys.size());
+ for (Paths::size_type i = 0; i < in_polys.size(); ++i)
+ CleanPolygon(in_polys[i], out_polys[i], distance);
+}
+//------------------------------------------------------------------------------
+
+void CleanPolygons(Paths& polys, double distance)
+{
+ CleanPolygons(polys, polys, distance);
+}
+//------------------------------------------------------------------------------
+
+void Minkowski(const Path& poly, const Path& path,
+ Paths& solution, bool isSum, bool isClosed)
+{
+ int delta = (isClosed ? 1 : 0);
+ size_t polyCnt = poly.size();
+ size_t pathCnt = path.size();
+ Paths pp;
+ pp.reserve(pathCnt);
+ if (isSum)
+ for (size_t i = 0; i < pathCnt; ++i)
+ {
+ Path p;
+ p.reserve(polyCnt);
+ for (size_t j = 0; j < poly.size(); ++j)
+ p.push_back(IntPoint(path[i].X + poly[j].X, path[i].Y + poly[j].Y));
+ pp.push_back(p);
+ }
+ else
+ for (size_t i = 0; i < pathCnt; ++i)
+ {
+ Path p;
+ p.reserve(polyCnt);
+ for (size_t j = 0; j < poly.size(); ++j)
+ p.push_back(IntPoint(path[i].X - poly[j].X, path[i].Y - poly[j].Y));
+ pp.push_back(p);
+ }
+
+ solution.clear();
+ solution.reserve((pathCnt + delta) * (polyCnt + 1));
+ for (size_t i = 0; i < pathCnt - 1 + delta; ++i)
+ for (size_t j = 0; j < polyCnt; ++j)
+ {
+ Path quad;
+ quad.reserve(4);
+ quad.push_back(pp[i % pathCnt][j % polyCnt]);
+ quad.push_back(pp[(i + 1) % pathCnt][j % polyCnt]);
+ quad.push_back(pp[(i + 1) % pathCnt][(j + 1) % polyCnt]);
+ quad.push_back(pp[i % pathCnt][(j + 1) % polyCnt]);
+ if (!Orientation(quad)) ReversePath(quad);
+ solution.push_back(quad);
+ }
+}
+//------------------------------------------------------------------------------
+
+void MinkowskiSum(const Path& pattern, const Path& path, Paths& solution, bool pathIsClosed)
+{
+ Minkowski(pattern, path, solution, true, pathIsClosed);
+ Clipper c;
+ c.AddPaths(solution, ptSubject, true);
+ c.Execute(ctUnion, solution, pftNonZero, pftNonZero);
+}
+//------------------------------------------------------------------------------
+
+void TranslatePath(const Path& input, Path& output, const IntPoint delta)
+{
+ //precondition: input != output
+ output.resize(input.size());
+ for (size_t i = 0; i < input.size(); ++i)
+ output[i] = IntPoint(input[i].X + delta.X, input[i].Y + delta.Y);
+}
+//------------------------------------------------------------------------------
+
+void MinkowskiSum(const Path& pattern, const Paths& paths, Paths& solution, bool pathIsClosed)
+{
+ Clipper c;
+ for (size_t i = 0; i < paths.size(); ++i)
+ {
+ Paths tmp;
+ Minkowski(pattern, paths[i], tmp, true, pathIsClosed);
+ c.AddPaths(tmp, ptSubject, true);
+ if (pathIsClosed)
+ {
+ Path tmp2;
+ TranslatePath(paths[i], tmp2, pattern[0]);
+ c.AddPath(tmp2, ptClip, true);
+ }
+ }
+ c.Execute(ctUnion, solution, pftNonZero, pftNonZero);
+}
+//------------------------------------------------------------------------------
+
+void MinkowskiDiff(const Path& poly1, const Path& poly2, Paths& solution)
+{
+ Minkowski(poly1, poly2, solution, false, true);
+ Clipper c;
+ c.AddPaths(solution, ptSubject, true);
+ c.Execute(ctUnion, solution, pftNonZero, pftNonZero);
+}
+//------------------------------------------------------------------------------
+
+enum NodeType {ntAny, ntOpen, ntClosed};
+
+void AddPolyNodeToPaths(const PolyNode& polynode, NodeType nodetype, Paths& paths)
+{
+ bool match = true;
+ if (nodetype == ntClosed) match = !polynode.IsOpen();
+ else if (nodetype == ntOpen) return;
+
+ if (!polynode.Contour.empty() && match)
+ paths.push_back(polynode.Contour);
+ for (int i = 0; i < polynode.ChildCount(); ++i)
+ AddPolyNodeToPaths(*polynode.Childs[i], nodetype, paths);
+}
+//------------------------------------------------------------------------------
+
+void PolyTreeToPaths(const PolyTree& polytree, Paths& paths)
+{
+ paths.resize(0);
+ paths.reserve(polytree.Total());
+ AddPolyNodeToPaths(polytree, ntAny, paths);
+}
+//------------------------------------------------------------------------------
+
+void ClosedPathsFromPolyTree(const PolyTree& polytree, Paths& paths)
+{
+ paths.resize(0);
+ paths.reserve(polytree.Total());
+ AddPolyNodeToPaths(polytree, ntClosed, paths);
+}
+//------------------------------------------------------------------------------
+
+void OpenPathsFromPolyTree(PolyTree& polytree, Paths& paths)
+{
+ paths.resize(0);
+ paths.reserve(polytree.Total());
+ //Open paths are top level only, so ...
+ for (int i = 0; i < polytree.ChildCount(); ++i)
+ if (polytree.Childs[i]->IsOpen())
+ paths.push_back(polytree.Childs[i]->Contour);
+}
+//------------------------------------------------------------------------------
+
+std::ostream& operator <<(std::ostream &s, const IntPoint &p)
+{
+ s << "(" << p.X << "," << p.Y << ")";
+ return s;
+}
+//------------------------------------------------------------------------------
+
+std::ostream& operator <<(std::ostream &s, const Path &p)
+{
+ if (p.empty()) return s;
+ Path::size_type last = p.size() -1;
+ for (Path::size_type i = 0; i < last; i++)
+ s << "(" << p[i].X << "," << p[i].Y << "), ";
+ s << "(" << p[last].X << "," << p[last].Y << ")\n";
+ return s;
+}
+//------------------------------------------------------------------------------
+
+std::ostream& operator <<(std::ostream &s, const Paths &p)
+{
+ for (Paths::size_type i = 0; i < p.size(); i++)
+ s << p[i];
+ s << "\n";
+ return s;
+}
+//------------------------------------------------------------------------------
+
+} //ClipperLib namespace
diff --git a/upstream/clipper-6.4.2/cpp/clipper.hpp b/upstream/clipper-6.4.2/cpp/clipper.hpp
new file mode 100644
index 0000000..df1f813
--- /dev/null
+++ b/upstream/clipper-6.4.2/cpp/clipper.hpp
@@ -0,0 +1,406 @@
+/*******************************************************************************
+* *
+* Author : Angus Johnson *
+* Version : 6.4.2 *
+* Date : 27 February 2017 *
+* Website : http://www.angusj.com *
+* Copyright : Angus Johnson 2010-2017 *
+* *
+* License: *
+* Use, modification & distribution is subject to Boost Software License Ver 1. *
+* http://www.boost.org/LICENSE_1_0.txt *
+* *
+* Attributions: *
+* The code in this library is an extension of Bala Vatti's clipping algorithm: *
+* "A generic solution to polygon clipping" *
+* Communications of the ACM, Vol 35, Issue 7 (July 1992) pp 56-63. *
+* http://portal.acm.org/citation.cfm?id=129906 *
+* *
+* Computer graphics and geometric modeling: implementation and algorithms *
+* By Max K. Agoston *
+* Springer; 1 edition (January 4, 2005) *
+* http://books.google.com/books?q=vatti+clipping+agoston *
+* *
+* See also: *
+* "Polygon Offsetting by Computing Winding Numbers" *
+* Paper no. DETC2005-85513 pp. 565-575 *
+* ASME 2005 International Design Engineering Technical Conferences *
+* and Computers and Information in Engineering Conference (IDETC/CIE2005) *
+* September 24-28, 2005 , Long Beach, California, USA *
+* http://www.me.berkeley.edu/~mcmains/pubs/DAC05OffsetPolygon.pdf *
+* *
+*******************************************************************************/
+
+#ifndef clipper_hpp
+#define clipper_hpp
+
+#define CLIPPER_VERSION "6.4.2"
+
+//use_int32: When enabled 32bit ints are used instead of 64bit ints. This
+//improve performance but coordinate values are limited to the range +/- 46340
+//#define use_int32
+
+//use_xyz: adds a Z member to IntPoint. Adds a minor cost to perfomance.
+//#define use_xyz
+
+//use_lines: Enables line clipping. Adds a very minor cost to performance.
+#define use_lines
+
+//use_deprecated: Enables temporary support for the obsolete functions
+//#define use_deprecated
+
+#include <vector>
+#include <list>
+#include <set>
+#include <stdexcept>
+#include <cstring>
+#include <cstdlib>
+#include <ostream>
+#include <functional>
+#include <queue>
+
+namespace ClipperLib {
+
+enum ClipType { ctIntersection, ctUnion, ctDifference, ctXor };
+enum PolyType { ptSubject, ptClip };
+//By far the most widely used winding rules for polygon filling are
+//EvenOdd & NonZero (GDI, GDI+, XLib, OpenGL, Cairo, AGG, Quartz, SVG, Gr32)
+//Others rules include Positive, Negative and ABS_GTR_EQ_TWO (only in OpenGL)
+//see http://glprogramming.com/red/chapter11.html
+enum PolyFillType { pftEvenOdd, pftNonZero, pftPositive, pftNegative };
+
+#ifdef use_int32
+ typedef int cInt;
+ static cInt const loRange = 0x7FFF;
+ static cInt const hiRange = 0x7FFF;
+#else
+ typedef signed long long cInt;
+ static cInt const loRange = 0x3FFFFFFF;
+ static cInt const hiRange = 0x3FFFFFFFFFFFFFFFLL;
+ typedef signed long long long64; //used by Int128 class
+ typedef unsigned long long ulong64;
+
+#endif
+
+struct IntPoint {
+ cInt X;
+ cInt Y;
+#ifdef use_xyz
+ cInt Z;
+ IntPoint(cInt x = 0, cInt y = 0, cInt z = 0): X(x), Y(y), Z(z) {};
+#else
+ IntPoint(cInt x = 0, cInt y = 0): X(x), Y(y) {};
+#endif
+
+ friend inline bool operator== (const IntPoint& a, const IntPoint& b)
+ {
+ return a.X == b.X && a.Y == b.Y;
+ }
+ friend inline bool operator!= (const IntPoint& a, const IntPoint& b)
+ {
+ return a.X != b.X || a.Y != b.Y;
+ }
+};
+//------------------------------------------------------------------------------
+
+typedef std::vector< IntPoint > Path;
+typedef std::vector< Path > Paths;
+
+inline Path& operator <<(Path& poly, const IntPoint& p) {poly.push_back(p); return poly;}
+inline Paths& operator <<(Paths& polys, const Path& p) {polys.push_back(p); return polys;}
+
+std::ostream& operator <<(std::ostream &s, const IntPoint &p);
+std::ostream& operator <<(std::ostream &s, const Path &p);
+std::ostream& operator <<(std::ostream &s, const Paths &p);
+
+struct DoublePoint
+{
+ double X;
+ double Y;
+ DoublePoint(double x = 0, double y = 0) : X(x), Y(y) {}
+ DoublePoint(IntPoint ip) : X((double)ip.X), Y((double)ip.Y) {}
+};
+//------------------------------------------------------------------------------
+
+#ifdef use_xyz
+typedef void (*ZFillCallback)(IntPoint& e1bot, IntPoint& e1top, IntPoint& e2bot, IntPoint& e2top, IntPoint& pt);
+#endif
+
+enum InitOptions {ioReverseSolution = 1, ioStrictlySimple = 2, ioPreserveCollinear = 4};
+enum JoinType {jtSquare, jtRound, jtMiter};
+enum EndType {etClosedPolygon, etClosedLine, etOpenButt, etOpenSquare, etOpenRound};
+
+class PolyNode;
+typedef std::vector< PolyNode* > PolyNodes;
+
+class PolyNode
+{
+public:
+ PolyNode();
+ virtual ~PolyNode(){};
+ Path Contour;
+ PolyNodes Childs;
+ PolyNode* Parent;
+ PolyNode* GetNext() const;
+ bool IsHole() const;
+ bool IsOpen() const;
+ int ChildCount() const;
+private:
+ //PolyNode& operator =(PolyNode& other);
+ unsigned Index; //node index in Parent.Childs
+ bool m_IsOpen;
+ JoinType m_jointype;
+ EndType m_endtype;
+ PolyNode* GetNextSiblingUp() const;
+ void AddChild(PolyNode& child);
+ friend class Clipper; //to access Index
+ friend class ClipperOffset;
+};
+
+class PolyTree: public PolyNode
+{
+public:
+ ~PolyTree(){ Clear(); };
+ PolyNode* GetFirst() const;
+ void Clear();
+ int Total() const;
+private:
+ //PolyTree& operator =(PolyTree& other);
+ PolyNodes AllNodes;
+ friend class Clipper; //to access AllNodes
+};
+
+bool Orientation(const Path &poly);
+double Area(const Path &poly);
+int PointInPolygon(const IntPoint &pt, const Path &path);
+
+void SimplifyPolygon(const Path &in_poly, Paths &out_polys, PolyFillType fillType = pftEvenOdd);
+void SimplifyPolygons(const Paths &in_polys, Paths &out_polys, PolyFillType fillType = pftEvenOdd);
+void SimplifyPolygons(Paths &polys, PolyFillType fillType = pftEvenOdd);
+
+void CleanPolygon(const Path& in_poly, Path& out_poly, double distance = 1.415);
+void CleanPolygon(Path& poly, double distance = 1.415);
+void CleanPolygons(const Paths& in_polys, Paths& out_polys, double distance = 1.415);
+void CleanPolygons(Paths& polys, double distance = 1.415);
+
+void MinkowskiSum(const Path& pattern, const Path& path, Paths& solution, bool pathIsClosed);
+void MinkowskiSum(const Path& pattern, const Paths& paths, Paths& solution, bool pathIsClosed);
+void MinkowskiDiff(const Path& poly1, const Path& poly2, Paths& solution);
+
+void PolyTreeToPaths(const PolyTree& polytree, Paths& paths);
+void ClosedPathsFromPolyTree(const PolyTree& polytree, Paths& paths);
+void OpenPathsFromPolyTree(PolyTree& polytree, Paths& paths);
+
+void ReversePath(Path& p);
+void ReversePaths(Paths& p);
+
+struct IntRect { cInt left; cInt top; cInt right; cInt bottom; };
+
+//enums that are used internally ...
+enum EdgeSide { esLeft = 1, esRight = 2};
+
+//forward declarations (for stuff used internally) ...
+struct TEdge;
+struct IntersectNode;
+struct LocalMinimum;
+struct OutPt;
+struct OutRec;
+struct Join;
+
+typedef std::vector < OutRec* > PolyOutList;
+typedef std::vector < TEdge* > EdgeList;
+typedef std::vector < Join* > JoinList;
+typedef std::vector < IntersectNode* > IntersectList;
+
+//------------------------------------------------------------------------------
+
+//ClipperBase is the ancestor to the Clipper class. It should not be
+//instantiated directly. This class simply abstracts the conversion of sets of
+//polygon coordinates into edge objects that are stored in a LocalMinima list.
+class ClipperBase
+{
+public:
+ ClipperBase();
+ virtual ~ClipperBase();
+ virtual bool AddPath(const Path &pg, PolyType PolyTyp, bool Closed);
+ bool AddPaths(const Paths &ppg, PolyType PolyTyp, bool Closed);
+ virtual void Clear();
+ IntRect GetBounds();
+ bool PreserveCollinear() {return m_PreserveCollinear;};
+ void PreserveCollinear(bool value) {m_PreserveCollinear = value;};
+protected:
+ void DisposeLocalMinimaList();
+ TEdge* AddBoundsToLML(TEdge *e, bool IsClosed);
+ virtual void Reset();
+ TEdge* ProcessBound(TEdge* E, bool IsClockwise);
+ void InsertScanbeam(const cInt Y);
+ bool PopScanbeam(cInt &Y);
+ bool LocalMinimaPending();
+ bool PopLocalMinima(cInt Y, const LocalMinimum *&locMin);
+ OutRec* CreateOutRec();
+ void DisposeAllOutRecs();
+ void DisposeOutRec(PolyOutList::size_type index);
+ void SwapPositionsInAEL(TEdge *edge1, TEdge *edge2);
+ void DeleteFromAEL(TEdge *e);
+ void UpdateEdgeIntoAEL(TEdge *&e);
+
+ typedef std::vector<LocalMinimum> MinimaList;
+ MinimaList::iterator m_CurrentLM;
+ MinimaList m_MinimaList;
+
+ bool m_UseFullRange;
+ EdgeList m_edges;
+ bool m_PreserveCollinear;
+ bool m_HasOpenPaths;
+ PolyOutList m_PolyOuts;
+ TEdge *m_ActiveEdges;
+
+ typedef std::priority_queue<cInt> ScanbeamList;
+ ScanbeamList m_Scanbeam;
+};
+//------------------------------------------------------------------------------
+
+class Clipper : public virtual ClipperBase
+{
+public:
+ Clipper(int initOptions = 0);
+ bool Execute(ClipType clipType,
+ Paths &solution,
+ PolyFillType fillType = pftEvenOdd);
+ bool Execute(ClipType clipType,
+ Paths &solution,
+ PolyFillType subjFillType,
+ PolyFillType clipFillType);
+ bool Execute(ClipType clipType,
+ PolyTree &polytree,
+ PolyFillType fillType = pftEvenOdd);
+ bool Execute(ClipType clipType,
+ PolyTree &polytree,
+ PolyFillType subjFillType,
+ PolyFillType clipFillType);
+ bool ReverseSolution() { return m_ReverseOutput; };
+ void ReverseSolution(bool value) {m_ReverseOutput = value;};
+ bool StrictlySimple() {return m_StrictSimple;};
+ void StrictlySimple(bool value) {m_StrictSimple = value;};
+ //set the callback function for z value filling on intersections (otherwise Z is 0)
+#ifdef use_xyz
+ void ZFillFunction(ZFillCallback zFillFunc);
+#endif
+protected:
+ virtual bool ExecuteInternal();
+private:
+ JoinList m_Joins;
+ JoinList m_GhostJoins;
+ IntersectList m_IntersectList;
+ ClipType m_ClipType;
+ typedef std::list<cInt> MaximaList;
+ MaximaList m_Maxima;
+ TEdge *m_SortedEdges;
+ bool m_ExecuteLocked;
+ PolyFillType m_ClipFillType;
+ PolyFillType m_SubjFillType;
+ bool m_ReverseOutput;
+ bool m_UsingPolyTree;
+ bool m_StrictSimple;
+#ifdef use_xyz
+ ZFillCallback m_ZFill; //custom callback
+#endif
+ void SetWindingCount(TEdge& edge);
+ bool IsEvenOddFillType(const TEdge& edge) const;
+ bool IsEvenOddAltFillType(const TEdge& edge) const;
+ void InsertLocalMinimaIntoAEL(const cInt botY);
+ void InsertEdgeIntoAEL(TEdge *edge, TEdge* startEdge);
+ void AddEdgeToSEL(TEdge *edge);
+ bool PopEdgeFromSEL(TEdge *&edge);
+ void CopyAELToSEL();
+ void DeleteFromSEL(TEdge *e);
+ void SwapPositionsInSEL(TEdge *edge1, TEdge *edge2);
+ bool IsContributing(const TEdge& edge) const;
+ bool IsTopHorz(const cInt XPos);
+ void DoMaxima(TEdge *e);
+ void ProcessHorizontals();
+ void ProcessHorizontal(TEdge *horzEdge);
+ void AddLocalMaxPoly(TEdge *e1, TEdge *e2, const IntPoint &pt);
+ OutPt* AddLocalMinPoly(TEdge *e1, TEdge *e2, const IntPoint &pt);
+ OutRec* GetOutRec(int idx);
+ void AppendPolygon(TEdge *e1, TEdge *e2);
+ void IntersectEdges(TEdge *e1, TEdge *e2, IntPoint &pt);
+ OutPt* AddOutPt(TEdge *e, const IntPoint &pt);
+ OutPt* GetLastOutPt(TEdge *e);
+ bool ProcessIntersections(const cInt topY);
+ void BuildIntersectList(const cInt topY);
+ void ProcessIntersectList();
+ void ProcessEdgesAtTopOfScanbeam(const cInt topY);
+ void BuildResult(Paths& polys);
+ void BuildResult2(PolyTree& polytree);
+ void SetHoleState(TEdge *e, OutRec *outrec);
+ void DisposeIntersectNodes();
+ bool FixupIntersectionOrder();
+ void FixupOutPolygon(OutRec &outrec);
+ void FixupOutPolyline(OutRec &outrec);
+ bool IsHole(TEdge *e);
+ bool FindOwnerFromSplitRecs(OutRec &outRec, OutRec *&currOrfl);
+ void FixHoleLinkage(OutRec &outrec);
+ void AddJoin(OutPt *op1, OutPt *op2, const IntPoint offPt);
+ void ClearJoins();
+ void ClearGhostJoins();
+ void AddGhostJoin(OutPt *op, const IntPoint offPt);
+ bool JoinPoints(Join *j, OutRec* outRec1, OutRec* outRec2);
+ void JoinCommonEdges();
+ void DoSimplePolygons();
+ void FixupFirstLefts1(OutRec* OldOutRec, OutRec* NewOutRec);
+ void FixupFirstLefts2(OutRec* InnerOutRec, OutRec* OuterOutRec);
+ void FixupFirstLefts3(OutRec* OldOutRec, OutRec* NewOutRec);
+#ifdef use_xyz
+ void SetZ(IntPoint& pt, TEdge& e1, TEdge& e2);
+#endif
+};
+//------------------------------------------------------------------------------
+
+class ClipperOffset
+{
+public:
+ ClipperOffset(double miterLimit = 2.0, double roundPrecision = 0.25);
+ ~ClipperOffset();
+ void AddPath(const Path& path, JoinType joinType, EndType endType);
+ void AddPaths(const Paths& paths, JoinType joinType, EndType endType);
+ void Execute(Paths& solution, double delta);
+ void Execute(PolyTree& solution, double delta);
+ void Clear();
+ double MiterLimit;
+ double ArcTolerance;
+private:
+ Paths m_destPolys;
+ Path m_srcPoly;
+ Path m_destPoly;
+ std::vector<DoublePoint> m_normals;
+ double m_delta, m_sinA, m_sin, m_cos;
+ double m_miterLim, m_StepsPerRad;
+ IntPoint m_lowest;
+ PolyNode m_polyNodes;
+
+ void FixOrientations();
+ void DoOffset(double delta);
+ void OffsetPoint(int j, int& k, JoinType jointype);
+ void DoSquare(int j, int k);
+ void DoMiter(int j, int k, double r);
+ void DoRound(int j, int k);
+};
+//------------------------------------------------------------------------------
+
+class clipperException : public std::exception
+{
+ public:
+ clipperException(const char* description): m_descr(description) {}
+ virtual ~clipperException() throw() {}
+ virtual const char* what() const throw() {return m_descr.c_str();}
+ private:
+ std::string m_descr;
+};
+//------------------------------------------------------------------------------
+
+} //ClipperLib namespace
+
+#endif //clipper_hpp
+
+
diff --git a/upstream/clipper-6.4.2/cpp/cpp_cairo/Cairo Resources.txt b/upstream/clipper-6.4.2/cpp/cpp_cairo/Cairo Resources.txt
new file mode 100644
index 0000000..e868eec
--- /dev/null
+++ b/upstream/clipper-6.4.2/cpp/cpp_cairo/Cairo Resources.txt
@@ -0,0 +1,6 @@
+http://cairographics.org/
+
+The Windows dynamic linked libraries necessary to run Cairo can be downloaded from
+http://www.gtk.org/download/win32.php
+All the dlls listed under the heading "Required third party dependencies" are
+required except gettext-runtime.dll.
diff --git a/upstream/clipper-6.4.2/cpp/cpp_cairo/cairo.sln b/upstream/clipper-6.4.2/cpp/cpp_cairo/cairo.sln
new file mode 100644
index 0000000..651e81a
--- /dev/null
+++ b/upstream/clipper-6.4.2/cpp/cpp_cairo/cairo.sln
@@ -0,0 +1,20 @@
+
+Microsoft Visual Studio Solution File, Format Version 11.00
+# Visual C++ Express 2010
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "cairo", "cairo.vcxproj", "{6AFBCA2B-9262-6D28-7506-E13747347388}"
+EndProject
+Global
+ GlobalSection(SolutionConfigurationPlatforms) = preSolution
+ Debug|Win32 = Debug|Win32
+ Release|Win32 = Release|Win32
+ EndGlobalSection
+ GlobalSection(ProjectConfigurationPlatforms) = postSolution
+ {6AFBCA2B-9262-6D28-7506-E13747347388}.Debug|Win32.ActiveCfg = Debug|Win32
+ {6AFBCA2B-9262-6D28-7506-E13747347388}.Debug|Win32.Build.0 = Debug|Win32
+ {6AFBCA2B-9262-6D28-7506-E13747347388}.Release|Win32.ActiveCfg = Release|Win32
+ {6AFBCA2B-9262-6D28-7506-E13747347388}.Release|Win32.Build.0 = Release|Win32
+ EndGlobalSection
+ GlobalSection(SolutionProperties) = preSolution
+ HideSolutionNode = FALSE
+ EndGlobalSection
+EndGlobal
diff --git a/upstream/clipper-6.4.2/cpp/cpp_cairo/cairo.vcxproj b/upstream/clipper-6.4.2/cpp/cpp_cairo/cairo.vcxproj
new file mode 100644
index 0000000..9816ce1
--- /dev/null
+++ b/upstream/clipper-6.4.2/cpp/cpp_cairo/cairo.vcxproj
@@ -0,0 +1,93 @@
+<?xml version="1.0" encoding="utf-8"?>
+<Project DefaultTargets="Build" ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+ <ItemGroup Label="ProjectConfigurations">
+ <ProjectConfiguration Include="Debug|Win32">
+ <Configuration>Debug</Configuration>
+ <Platform>Win32</Platform>
+ </ProjectConfiguration>
+ <ProjectConfiguration Include="Release|Win32">
+ <Configuration>Release</Configuration>
+ <Platform>Win32</Platform>
+ </ProjectConfiguration>
+ </ItemGroup>
+ <PropertyGroup Label="Globals">
+ <Keyword>Win32Proj</Keyword>
+ </PropertyGroup>
+ <Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="Configuration">
+ <ConfigurationType>Application</ConfigurationType>
+ <UseDebugLibraries>true</UseDebugLibraries>
+ <CharacterSet>Unicode</CharacterSet>
+ </PropertyGroup>
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="Configuration">
+ <ConfigurationType>Application</ConfigurationType>
+ <UseDebugLibraries>false</UseDebugLibraries>
+ </PropertyGroup>
+ <Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />
+ <ImportGroup Label="ExtensionSettings">
+ </ImportGroup>
+ <ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
+ <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
+ </ImportGroup>
+ <ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
+ <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
+ </ImportGroup>
+ <PropertyGroup Label="UserMacros" />
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
+ <LinkIncremental>true</LinkIncremental>
+ <IncludePath>C:\Program Files %28x86%29\Borland\Clipper\PreReleaseTesting\cpp\cairo_src;$(IncludePath)</IncludePath>
+ <SourcePath>C:\Program Files %28x86%29\Borland\Clipper\PreReleaseTesting\cpp\cairo_src;C:\Program Files %28x86%29\Borland\graphics32\Examples\Vcl\Drawing\Clipper\PreReleaseTesting\cpp\cairo_src;$(SourcePath)</SourcePath>
+ </PropertyGroup>
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
+ <LinkIncremental>true</LinkIncremental>
+ </PropertyGroup>
+ <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
+ <ClCompile>
+ <PreprocessorDefinitions>WIN32;_DEBUG;_WINDOWS;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ <AdditionalIncludeDirectories>C:\Program Files (x86)\Borland\graphics32\Examples\Vcl\Drawing\Clipper\PreReleaseTesting\cpp\cairo_src;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+ <RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>
+ <WarningLevel>Level3</WarningLevel>
+ <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
+ <Optimization>Disabled</Optimization>
+ <UseUnicodeForAssemblerListing>
+ </UseUnicodeForAssemblerListing>
+ </ClCompile>
+ <Link>
+ <TargetMachine>MachineX86</TargetMachine>
+ <GenerateDebugInformation>true</GenerateDebugInformation>
+ <SubSystem>Windows</SubSystem>
+ </Link>
+ </ItemDefinitionGroup>
+ <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
+ <ClCompile>
+ <PreprocessorDefinitions>WIN32;NDEBUG;_WINDOWS;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ <AdditionalIncludeDirectories>C:\Program Files (x86)\Borland\graphics32\Examples\Vcl\Drawing\Clipper\PreReleaseTesting\cpp\cairo_src;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+ <RuntimeLibrary>MultiThreadedDLL</RuntimeLibrary>
+ <WarningLevel>Level3</WarningLevel>
+ <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
+ </ClCompile>
+ <Link>
+ <TargetMachine>MachineX86</TargetMachine>
+ <GenerateDebugInformation>true</GenerateDebugInformation>
+ <SubSystem>Windows</SubSystem>
+ <EnableCOMDATFolding>true</EnableCOMDATFolding>
+ <OptimizeReferences>true</OptimizeReferences>
+ </Link>
+ </ItemDefinitionGroup>
+ <ItemGroup>
+ <ClCompile Include="..\clipper.cpp" />
+ <ClCompile Include="cairo_clipper.cpp" />
+ <ClCompile Include="main.cpp" />
+ </ItemGroup>
+ <ItemGroup>
+ <ClInclude Include="..\cairo_src\cairo.h" />
+ <ClInclude Include="..\clipper.hpp" />
+ <ClInclude Include="cairo_clipper.hpp" />
+ </ItemGroup>
+ <ItemGroup>
+ <Library Include="libcairo-2.lib" />
+ </ItemGroup>
+ <Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
+ <ImportGroup Label="ExtensionTargets">
+ </ImportGroup>
+</Project> \ No newline at end of file
diff --git a/upstream/clipper-6.4.2/cpp/cpp_cairo/cairo_clipper.cpp b/upstream/clipper-6.4.2/cpp/cpp_cairo/cairo_clipper.cpp
new file mode 100644
index 0000000..72d5930
--- /dev/null
+++ b/upstream/clipper-6.4.2/cpp/cpp_cairo/cairo_clipper.cpp
@@ -0,0 +1,133 @@
+/*******************************************************************************
+* *
+* Author : Angus Johnson *
+* Version : 1.1 *
+* Date : 4 April 2011 *
+* Copyright : Angus Johnson 2010-2011 *
+* *
+* License: *
+* Use, modification & distribution is subject to Boost Software License Ver 1. *
+* http://www.boost.org/LICENSE_1_0.txt *
+* *
+* Modified by Mike Owens to support coordinate transformation *
+*******************************************************************************/
+
+#include <stdexcept>
+#include <cmath>
+#include <iostream>
+#include <cairo.h>
+#include "clipper.hpp"
+#include "cairo_clipper.hpp"
+
+namespace ClipperLib {
+ namespace cairo {
+
+ namespace {
+
+ inline cInt Round(double val)
+ {
+ if ((val < 0)) return (cInt)(val - 0.5); else return (cInt)(val + 0.5);
+ }
+
+ void transform_point(cairo_t* pen, Transform transform, cInt* x, cInt* y)
+ {
+ double _x = (double)*x, _y = (double)*y;
+ switch (transform)
+ {
+ case tDeviceToUser:
+ cairo_device_to_user(pen, &_x, &_y);
+ break;
+ case tUserToDevice:
+ cairo_user_to_device(pen, &_x, &_y);
+ break;
+ default:
+ ;
+ }
+ *x = Round(_x); *y = Round(_y);
+ }
+ }
+
+ void cairo_to_clipper(cairo_t* cr,
+ Paths &pg,
+ int scaling_factor,
+ Transform transform)
+ {
+ if (scaling_factor > 8 || scaling_factor < 0)
+ throw clipperCairoException("cairo_to_clipper: invalid scaling factor");
+ double scaling = std::pow((double)10, scaling_factor);
+
+ pg.clear();
+ cairo_path_t *path = cairo_copy_path_flat(cr);
+
+ int poly_count = 0;
+ for (int i = 0; i < path->num_data; i += path->data[i].header.length) {
+ if( path->data[i].header.type == CAIRO_PATH_CLOSE_PATH) poly_count++;
+ }
+
+ pg.resize(poly_count);
+ int i = 0, pc = 0;
+ while (pc < poly_count)
+ {
+ int vert_count = 1;
+ int j = i;
+ while(j < path->num_data && path->data[j].header.type != CAIRO_PATH_CLOSE_PATH)
+ {
+ if (path->data[j].header.type == CAIRO_PATH_LINE_TO)
+ vert_count++;
+ j += path->data[j].header.length;
+ }
+ pg[pc].resize(vert_count);
+ if (path->data[i].header.type != CAIRO_PATH_MOVE_TO) {
+ pg.resize(pc);
+ break;
+ }
+ pg[pc][0].X = Round(path->data[i+1].point.x *scaling);
+ pg[pc][0].Y = Round(path->data[i+1].point.y *scaling);
+ if (transform != tNone)
+ transform_point(cr, transform, &pg[pc][0].X, &pg[pc][0].Y);
+
+ i += path->data[i].header.length;
+
+ j = 1;
+ while (j < vert_count && i < path->num_data && path->data[i].header.type == CAIRO_PATH_LINE_TO) {
+ pg[pc][j].X = Round(path->data[i+1].point.x *scaling);
+ pg[pc][j].Y = Round(path->data[i+1].point.y *scaling);
+ if (transform != tNone)
+ transform_point(cr, transform, &pg[pc][j].X, &pg[pc][j].Y);
+ j++;
+ i += path->data[i].header.length;
+ }
+ pc++;
+ i += path->data[i].header.length;
+ }
+ cairo_path_destroy(path);
+ }
+ //--------------------------------------------------------------------------
+
+ void clipper_to_cairo(const Paths &pg, cairo_t* cr, int scaling_factor, Transform transform)
+ {
+ if (scaling_factor > 8 || scaling_factor < 0)
+ throw clipperCairoException("clipper_to_cairo: invalid scaling factor");
+ double scaling = std::pow((double)10, scaling_factor);
+ for (size_t i = 0; i < pg.size(); ++i)
+ {
+ size_t sz = pg[i].size();
+ if (sz < 3)
+ continue;
+ cairo_new_sub_path(cr);
+ //std::cerr << "sub path";
+ for (size_t j = 0; j < sz; ++j) {
+ cInt x = pg[i][j].X, y = pg[i][j].Y;
+ if (transform != tNone)
+ transform_point(cr, transform, &x, &y);
+ //std::cerr << " (" << (double)x / scaling << "," << (double)y / scaling << ")";
+ cairo_line_to(cr, (double)x / scaling, (double)y / scaling);
+ }
+ //std::cerr << std::endl;
+ cairo_close_path(cr);
+ }
+ }
+ //--------------------------------------------------------------------------
+
+ }
+}
diff --git a/upstream/clipper-6.4.2/cpp/cpp_cairo/cairo_clipper.hpp b/upstream/clipper-6.4.2/cpp/cpp_cairo/cairo_clipper.hpp
new file mode 100644
index 0000000..7c52dfd
--- /dev/null
+++ b/upstream/clipper-6.4.2/cpp/cpp_cairo/cairo_clipper.hpp
@@ -0,0 +1,59 @@
+/*******************************************************************************
+* *
+* Author : Angus Johnson *
+* Version : 1.1 *
+* Date : 4 April 2011 *
+* Copyright : Angus Johnson 2010-2011 *
+* *
+* License: *
+* Use, modification & distribution is subject to Boost Software License Ver 1. *
+* http://www.boost.org/LICENSE_1_0.txt *
+* *
+* Modified by Mike Owens to support coordinate transformation *
+*******************************************************************************/
+
+#ifndef CLIPPER_CAIRO_CLIPPER_HPP
+#define CLIPPER_CAIRO_CLIPPER_HPP
+
+#include "clipper.hpp"
+
+typedef struct _cairo cairo_t;
+
+namespace ClipperLib {
+ namespace cairo {
+
+ enum Transform {
+ tNone,
+ tUserToDevice,
+ tDeviceToUser
+ };
+
+//nb: Since Clipper only accepts integer coordinates, fractional values have to
+//be scaled up and down when being passed to and from Clipper. This is easily
+//accomplished by setting the scaling factor (10^x) in the following functions.
+//When scaling, remember that on most platforms, integer is only a 32bit value.
+ void cairo_to_clipper(cairo_t* cr,
+ ClipperLib::Paths &pg,
+ int scaling_factor = 0,
+ Transform transform = tNone);
+
+ void clipper_to_cairo(const ClipperLib::Paths &pg,
+ cairo_t* cr,
+ int scaling_factor = 0,
+ Transform transform = tNone);
+ }
+
+ class clipperCairoException : public std::exception
+ {
+ public:
+ clipperCairoException(const char* description)
+ throw(): std::exception(), m_description (description) {}
+ virtual ~clipperCairoException() throw() {}
+ virtual const char* what() const throw() {return m_description.c_str();}
+ private:
+ std::string m_description;
+ };
+}
+
+#endif
+
diff --git a/upstream/clipper-6.4.2/cpp/cpp_cairo/cairo_clipper.o b/upstream/clipper-6.4.2/cpp/cpp_cairo/cairo_clipper.o
new file mode 100644
index 0000000..c7ca888
--- /dev/null
+++ b/upstream/clipper-6.4.2/cpp/cpp_cairo/cairo_clipper.o
Binary files differ
diff --git a/upstream/clipper-6.4.2/cpp/cpp_cairo/libcairo-2.lib b/upstream/clipper-6.4.2/cpp/cpp_cairo/libcairo-2.lib
new file mode 100644
index 0000000..9be9bc1
--- /dev/null
+++ b/upstream/clipper-6.4.2/cpp/cpp_cairo/libcairo-2.lib
Binary files differ
diff --git a/upstream/clipper-6.4.2/cpp/cpp_cairo/main.cpp b/upstream/clipper-6.4.2/cpp/cpp_cairo/main.cpp
new file mode 100644
index 0000000..b196a22
--- /dev/null
+++ b/upstream/clipper-6.4.2/cpp/cpp_cairo/main.cpp
@@ -0,0 +1,182 @@
+//---------------------------------------------------------------------------
+
+#include <windows.h>
+#include <cstring>
+#include <cmath>
+#include <sstream>
+#pragma hdrstop
+
+#include "clipper.hpp"
+#include "cairo.h"
+#include "cairo-win32.h"
+#include "cairo_clipper.hpp"
+//---------------------------------------------------------------------------
+
+int offsetVal;
+
+LRESULT CALLBACK WndProcedure(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam);
+
+int CALLBACK wWinMain(HINSTANCE hInstance,
+ HINSTANCE hPrevInstance, LPTSTR lpCmdLine, int nCmdShow)
+{
+ WCHAR* ClsName = L"CairoApp";
+ WCHAR* WndName = L"A Simple Cairo Clipper Demo";
+ offsetVal = 0;
+
+ MSG Msg;
+ HWND hWnd;
+ WNDCLASSEX WndClsEx;
+
+ // Create the application window
+ WndClsEx.cbSize = sizeof(WNDCLASSEX);
+ WndClsEx.style = CS_HREDRAW | CS_VREDRAW;
+ WndClsEx.lpfnWndProc = WndProcedure;
+ WndClsEx.cbClsExtra = 0;
+ WndClsEx.cbWndExtra = 0;
+ WndClsEx.hIcon = LoadIcon(NULL, IDI_APPLICATION);
+ WndClsEx.hCursor = LoadCursor(NULL, IDC_ARROW);
+ WndClsEx.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH);
+ WndClsEx.lpszMenuName = NULL;
+ WndClsEx.lpszClassName = ClsName;
+ WndClsEx.hInstance = hInstance;
+ WndClsEx.hIconSm = LoadIcon(NULL, IDI_APPLICATION);
+
+ // Register the application
+ RegisterClassEx(&WndClsEx);
+
+ // Create the window object
+ hWnd = CreateWindow(ClsName, WndName, WS_OVERLAPPEDWINDOW,
+ CW_USEDEFAULT, CW_USEDEFAULT, 400, 300,
+ NULL, NULL, hInstance, NULL);
+ if( !hWnd ) return 0;
+
+ ShowWindow(hWnd, SW_SHOWNORMAL);
+ UpdateWindow(hWnd);
+
+ while( GetMessage(&Msg, NULL, 0, 0) )
+ {
+ TranslateMessage(&Msg);
+ DispatchMessage(&Msg);
+ }
+ return Msg.wParam;
+}
+//------------------------------------------------------------------------------
+
+
+void OnPaint(HWND hWnd, HDC dc)
+{
+ RECT rec;
+ GetClientRect(hWnd, &rec);
+ cairo_surface_t* surface = cairo_win32_surface_create(dc);
+ cairo_t* cr = cairo_create(surface);
+
+ cairo_set_fill_rule(cr, CAIRO_FILL_RULE_WINDING);
+ cairo_set_line_width (cr, 2.0);
+
+ //fill background with white ...
+ cairo_rectangle(cr, 0, 0, rec.right, rec.bottom);
+ cairo_set_source_rgba(cr, 1, 1, 1, 1);
+ cairo_fill(cr);
+
+ using namespace ClipperLib;
+
+ const int scaling = 2;
+
+ Clipper clpr; //clipper class
+ Paths pg; //std::vector for polygon(s) storage
+
+ //create a circular pattern, add the path to clipper and then draw it ...
+ cairo_arc(cr, 170,110,70,0,2*3.1415926);
+ cairo_close_path(cr);
+ cairo::cairo_to_clipper(cr, pg, scaling);
+ clpr.AddPaths(pg, ptSubject, true);
+ cairo_set_source_rgba(cr, 0, 0, 1, 0.25);
+ cairo_fill_preserve (cr);
+ cairo_set_source_rgba(cr, 0, 0, 0, 0.5);
+ cairo_stroke (cr);
+
+ //draw a star and another circle, add them to clipper and draw ...
+ cairo_move_to(cr, 60,110);
+ cairo_line_to (cr, 240,70);
+ cairo_line_to (cr, 110,210);
+ cairo_line_to (cr, 140,25);
+ cairo_line_to (cr, 230,200);
+ cairo_close_path(cr);
+ cairo_new_sub_path(cr);
+ cairo_arc(cr, 190,50,20,0,2*3.1415926);
+ cairo_close_path(cr);
+ cairo::cairo_to_clipper(cr, pg, scaling);
+ clpr.AddPaths(pg, ptClip, true);
+ cairo_set_source_rgba(cr, 1, 0, 0, 0.25);
+ cairo_fill_preserve (cr);
+ cairo_set_source_rgba(cr, 0, 0, 0, 0.5);
+ cairo_stroke (cr);
+
+ clpr.Execute(ctIntersection, pg, pftNonZero, pftNonZero);
+ //now do something fancy with the returned polygons ...
+ OffsetPaths(pg, pg, offsetVal * std::pow((double)10,scaling), jtMiter, etClosed);
+
+ //finally copy the clipped path back to the cairo context and draw it ...
+ cairo::clipper_to_cairo(pg, cr, scaling);
+ cairo_set_source_rgba(cr, 1, 1, 0, 1);
+ cairo_fill_preserve (cr);
+ cairo_set_source_rgba(cr, 0, 0, 0, 1);
+ cairo_stroke (cr);
+
+ cairo_text_extents_t extent;
+ cairo_set_font_size(cr,11);
+ std::stringstream ss;
+ ss << "Polygon offset = " << offsetVal << ". (Adjust with arrow keys)";
+ std::string s = ss.str();
+ cairo_text_extents(cr, s.c_str(), &extent);
+ cairo_move_to(cr, 10, rec.bottom - extent.height);
+ cairo_show_text(cr, s.c_str());
+
+ cairo_destroy (cr);
+ cairo_surface_destroy (surface);
+}
+//------------------------------------------------------------------------------
+
+LRESULT CALLBACK WndProcedure(HWND hWnd, UINT Msg, WPARAM wParam, LPARAM lParam)
+{
+ PAINTSTRUCT ps;
+ HDC Handle;
+
+ switch(Msg)
+ {
+ case WM_DESTROY:
+ PostQuitMessage(WM_QUIT);
+ return 0;
+
+ case WM_PAINT:
+ Handle = BeginPaint(hWnd, &ps);
+ OnPaint(hWnd, Handle);
+ EndPaint(hWnd, &ps);
+ return 0;
+
+ case WM_KEYDOWN:
+ switch(wParam)
+ {
+ case VK_ESCAPE:
+ PostQuitMessage(0);
+ return 0;
+ case VK_RIGHT:
+ case VK_UP:
+ if (offsetVal < 20) offsetVal++;
+ InvalidateRect(hWnd, 0, false);
+ return 0;
+ case VK_LEFT:
+ case VK_DOWN:
+ if (offsetVal > -20) offsetVal--;
+ InvalidateRect(hWnd, 0, false);
+ return 0;
+ default:
+ return DefWindowProc(hWnd, Msg, wParam, lParam);
+ }
+
+ default:
+ return DefWindowProc(hWnd, Msg, wParam, lParam);
+ }
+}
+//---------------------------------------------------------------------------
+
diff --git a/upstream/clipper-6.4.2/cpp/polyclipping.pc.cmakein b/upstream/clipper-6.4.2/cpp/polyclipping.pc.cmakein
new file mode 100644
index 0000000..7cf55f2
--- /dev/null
+++ b/upstream/clipper-6.4.2/cpp/polyclipping.pc.cmakein
@@ -0,0 +1,13 @@
+prefix=@CMAKE_INSTALL_PREFIX@
+exec_prefix=@CMAKE_INSTALL_PREFIX@
+libdir=@CMAKE_INSTALL_LIBDIR@
+sharedlibdir=@CMAKE_INSTALL_LIBDIR@
+includedir=@CMAKE_INSTALL_INCDIR@
+
+Name: polyclipping
+Description: polygon clipping library
+Version: @VERSION@
+
+Requires:
+Libs: -L${libdir} -L${sharedlibdir} -lpolyclipping
+Cflags: -I${includedir}
diff --git a/upstream/cpp-base64 b/upstream/cpp-base64
new file mode 160000
+Subproject 80525f93cbabaa11bbcae137f24467f97d74345
diff --git a/upstream/poisson-disk-sampling b/upstream/poisson-disk-sampling
new file mode 160000
+Subproject b5d11d6325878c5e120364e673eadcd3df1cb47
diff --git a/upstream/voronoi b/upstream/voronoi
new file mode 160000
+Subproject fc9ed1ce6661ccc73783ee9193fa77e8a673b83