%module{Slic3r::XS};

%{
#include <xsinit.h>
#include "clipper.hpp"
#include "libslic3r/ClipperUtils.hpp"
%}

%package{Slic3r::Geometry::Clipper};

%{

IV
_constant()
  ALIAS:
    JT_MITER        = jtMiter
    JT_ROUND        = jtRound
    JT_SQUARE       = jtSquare
  CODE:
    RETVAL = ix;
  OUTPUT: RETVAL

Polygons
offset(polygons, delta, joinType = ClipperLib::jtMiter, miterLimit = 3)
    Polygons                polygons
    const float             delta
    ClipperLib::JoinType    joinType
    double                  miterLimit
    CODE:
        RETVAL = offset(polygons, delta, joinType, miterLimit);
    OUTPUT:
        RETVAL

ExPolygons
offset_ex(polygons, delta, joinType = ClipperLib::jtMiter, miterLimit = 3)
    Polygons                polygons
    const float             delta
    ClipperLib::JoinType    joinType
    double                  miterLimit
    CODE:
        RETVAL = offset_ex(polygons, delta, joinType, miterLimit);
    OUTPUT:
        RETVAL

Polygons
offset2(polygons, delta1, delta2, joinType = ClipperLib::jtMiter, miterLimit = 3)
    Polygons                polygons
    const float             delta1
    const float             delta2
    ClipperLib::JoinType    joinType
    double                  miterLimit
    CODE:
        RETVAL = offset2(polygons, delta1, delta2, joinType, miterLimit);
    OUTPUT:
        RETVAL

ExPolygons
offset2_ex(polygons, delta1, delta2, joinType = ClipperLib::jtMiter, miterLimit = 3)
    Polygons                polygons
    const float             delta1
    const float             delta2
    ClipperLib::JoinType    joinType
    double                  miterLimit
    CODE:
        RETVAL = offset2_ex(polygons, delta1, delta2, joinType, miterLimit);
    OUTPUT:
        RETVAL

Polygons
diff(subject, clip, safety_offset = false)
    Polygons    subject
    Polygons    clip
    bool        safety_offset
    CODE:
        RETVAL = diff(subject, clip, safety_offset);
    OUTPUT:
        RETVAL

ExPolygons
diff_ex(subject, clip, safety_offset = false)
    Polygons    subject
    Polygons    clip
    bool        safety_offset
    CODE:
        RETVAL = diff_ex(subject, clip, safety_offset);
    OUTPUT:
        RETVAL

Polylines
diff_pl(subject, clip)
    Polylines   subject
    Polygons    clip
    CODE:
        RETVAL = diff_pl(subject, clip);
    OUTPUT:
        RETVAL

Polygons
intersection(subject, clip, safety_offset = false)
    Polygons                    subject
    Polygons                    clip
    bool                        safety_offset
    CODE:
        RETVAL = intersection(subject, clip, safety_offset);
    OUTPUT:
        RETVAL

ExPolygons
intersection_ex(subject, clip, safety_offset = false)
    Polygons                    subject
    Polygons                    clip
    bool                        safety_offset
    CODE:
        RETVAL = intersection_ex(subject, clip, safety_offset);
    OUTPUT:
        RETVAL

Polylines
intersection_pl(subject, clip)
    Polylines                   subject
    Polygons                    clip
    CODE:
        RETVAL = intersection_pl(subject, clip);
    OUTPUT:
        RETVAL

Polygons
union(subject, safety_offset = false)
    Polygons    subject
    bool        safety_offset
    CODE:
        RETVAL = union_(subject, safety_offset);
    OUTPUT:
        RETVAL

ExPolygons
union_ex(subject, safety_offset = false)
    Polygons                    subject
    bool                        safety_offset
    CODE:
        RETVAL = union_ex(subject, safety_offset);
    OUTPUT:
        RETVAL

%}