/* * This file is part of project OpenEmbroidery. It's copyrighted by * the contributors recorded in the version control history of the file. * Original project location https://code.electrolab.fr/openEmbroidery/openEmbroidery_software * * SPDX-License-Identifier: CECILL-2.1 * License-Filename: Licence_CeCILL_V2.1-en.txt */ #include "curves/OE_pointcurve.h" #include "OE_utils.h" #include #include #include #include #include #include #include unsigned char OE_pointcurve::controlLineColor[] = {100, 60, 92, 255}; unsigned char OE_pointcurve::controlPointColor[] = {100, 60, 92, 255}; unsigned char OE_pointcurve::controlEndPointColor[] = {100, 60, 92, 255}; OE_pointcurve::OE_pointcurve() { } OE_pointcurve::OE_pointcurve(std::vector points, bool closed) { pts = points; this->closed = closed; // Flag indicating if shapes should be treated as closed. } OE_pointcurve::~OE_pointcurve() { } bool OE_pointcurve::getPoint(uint16_t nb, float* x, float* y) { if (pts.size() && nb<=pts.size()) { *x = pts.at(nb-1).x; *y = pts.at(nb-1).y; return true; } return false; } bool OE_pointcurve::getPoint(uint16_t nb, vector_2d& pt) { if (pts.size() && nb<=pts.size()) { pt.x = pts.at(nb-1).x; pt.y = pts.at(nb-1).y; return true; } return false; } bool OE_pointcurve::setPoint(uint16_t nb, float x, float y) { return setPoint(nb, vector_2d(x, y)); } bool OE_pointcurve::setPoint(uint16_t nb, vector_2d coord) { if (nb<=pts.size()) { pts[(nb-1)] = coord; setNeedRefresh(); return true; } return false; } bool OE_pointcurve::movePoint(uint16_t nb, vector_2d coord) { nb--; if (nb0) { pts[nb-1] = pts[nb-1] + offset; } if (nb != pts.size()-1) { pts[nb+1] = pts[nb+1] + offset; } } } pts[(nb)] = coord; setNeedRefresh(); return true; } return false; } bool OE_pointcurve::addPoint(float x, float y) { pts.push_back(vector_2d(x, y)); setNeedRefresh(); return true; } bool OE_pointcurve::addPoint(vector_2d pt) { pts.push_back(pt); setNeedRefresh(); return true; } void OE_pointcurve::lineTo(float x, float y) { float px,py, dx,dy; if (pts.size() > 0) { getPoint(pts.size(), &px, &py); dx = x - px; dy = y - py; addPoint(px + dx/3.0f, py + dy/3.0f); addPoint(x - dx/3.0f, y - dy/3.0f); addPoint(x, y); } } void OE_pointcurve::lineTo(vector_2d pt) { vector_2d p,d; if (pts.size()>0) { getPoint(pts.size(), p); d = pt-p; addPoint(p + d/3.0f); addPoint(pt - d/3.0f); addPoint(pt); } } void OE_pointcurve::setClosed(bool closed) { if (pts.size() > 0) { if (closed && pts[0]!=pts[pts.size()-1]) { lineTo(pts[0]); } } OE_curve::setClosed(closed); } void OE_pointcurve::cubicBezTo(float cpx1, float cpy1, float cpx2, float cpy2, float x, float y) { addPoint(cpx1, cpy1); addPoint(cpx2, cpy2); addPoint(x, y); } void OE_pointcurve::refresh(float dpi, bool force) { OE_curve::refresh(dpi, force); } void OE_pointcurve::move(vector_2d offset) { for (unsigned i=0; i