void asciimage::Shape::renderLine(QPainter* painter, int scale, const Style& style) const { Q_ASSERT(type() == Type::LINE); Q_ASSERT(points().size() == 2); if (scale == 1) { if (!isStraightLine()) { painter->setRenderHint(QPainter::Antialiasing, true); } painter->setPen(style.color()); painter->drawLine(points()[0], points()[1]); } else { if (isStraightLine()) { const QRect b = boundingRect(); painter->setPen(style.color()); painter->setBrush(style.color()); painter->drawRect(scaledOuterRect(b, scale)); } else { painter->setRenderHint(QPainter::Antialiasing, true); painter->setPen(QPen(style.color(), scale, Qt::SolidLine, Qt::SquareCap)); painter->drawLine(p(points()[0], scale), p(points()[1], scale)); } } }
void cleanUpPointsInStraightLines( const std::vector<CGPoint> &i_points, std::vector<CGPoint> &o_expath, CGFloat i_error2 ) { size_t nbOfPts = i_points.size(); if ( nbOfPts < 3 ) { o_expath.assign( i_points.begin(), i_points.end() ); return; } auto current = i_points.begin(); o_expath.push_back( *current ); while ( current != i_points.end() ) { size_t remaining = i_points.end() - current; if ( remaining < 3 ) { o_expath.push_back( *current ); ++current; } else { auto segEnd = current + 3; while ( segEnd != i_points.end() and isStraightLine( current, segEnd, i_error2 ) ) { ++segEnd; } current = segEnd; --segEnd; // back track o_expath.push_back( *segEnd ); } } }