src/polyline.cpp in rays-0.1.46 vs src/polyline.cpp in rays-0.1.47
- old
+ new
@@ -15,44 +15,45 @@
struct Polyline::Data
{
PointList points;
- bool loop = false;
+ bool loop = false, fill = false;
template <typename I, typename FUN>
- void reset (I begin, I end, bool loop_, FUN to_point_fun)
+ void reset (I begin, I end, bool loop_, bool fill_, FUN to_point_fun)
{
- size_t size = end - begin;
- if (0 < size && size < 3 && loop_)
+ if (begin > end)
argument_error(__FILE__, __LINE__);
points.clear();
+ loop = loop_;
+ fill = fill_;
+
+ size_t size = end - begin;
+ if (size <= 0) return;
+
points.reserve(size);
for (auto it = begin; it != end; ++it)
points.emplace_back(to_point_fun(*it));
-
- loop = loop_ && size > 0;
}
};// Polyline::Data
void
Polyline_create (
- Polyline* polyline, const Path& path, bool loop, bool reverse)
+ Polyline* polyline, const Path& path, bool loop, bool hole)
{
- assert(polyline);
-
Path cleaned;
ClipperLib::CleanPolygon(path, cleaned);
- auto to_point = [](const IntPoint& point) {return from_clipper(point);};
- if (reverse)
- polyline->self->reset(cleaned.rbegin(), cleaned.rend(), loop, to_point);
+ auto fun = [](const IntPoint& point) {return from_clipper(point);};
+ if (hole)
+ polyline->self->reset(cleaned.rbegin(), cleaned.rend(), loop, loop, fun);
else
- polyline->self->reset(cleaned. begin(), cleaned. end(), loop, to_point);
+ polyline->self->reset(cleaned. begin(), cleaned. end(), loop, loop, fun);
}
template <typename I>
static void
reset_path (Path* path, I begin, I end)
@@ -61,16 +62,16 @@
for (auto it = begin; it != end; ++it)
path->emplace_back(to_clipper(*it));
}
void
- Polyline_get_path (Path* path, const Polyline& polyline, bool reverse)
+ Polyline_get_path (Path* path, const Polyline& polyline, bool hole)
{
assert(path);
const auto& points = polyline.self->points;
- if (reverse)
+ if (hole)
reset_path(path, points.rbegin(), points.rend());
else
reset_path(path, points. begin(), points. end());
}
@@ -79,13 +80,22 @@
{
}
Polyline::Polyline (const Point* points, size_t size, bool loop)
{
- self->reset(points, points + size, loop, [](const Point& p) {return p;});
+ self->reset(
+ points, points + size, loop, loop,
+ [](const Point& p) {return p;});
}
+ Polyline::Polyline (const Point* points, size_t size, bool loop, bool fill)
+ {
+ self->reset(
+ points, points + size, loop, fill,
+ [](const Point& p) {return p;});
+ }
+
Polyline::~Polyline ()
{
}
bool
@@ -112,10 +122,16 @@
Polyline::loop () const
{
return self->loop;
}
+ bool
+ Polyline::fill () const
+ {
+ return self->fill;
+ }
+
size_t
Polyline::size () const
{
return self->points.size();
}
@@ -144,11 +160,10 @@
return self->points[index];
}
Polyline::operator bool () const
{
- size_t s = size();
- return !((s == 1 || s == 2) && self->loop);
+ return true;
}
bool
Polyline::operator ! () const
{