static inline Polygon qwtToPointsFiltered( const QRectF &boundingRect, const QwtScaleMap &xMap, const QwtScaleMap &yMap, const QwtSeriesData<QPointF> *series, int from, int to ) { // F.e. in scatter plots ( no connecting lines ) we // can sort out all duplicates ( not only consecutive points ) Polygon polygon( to - from + 1 ); Point *points = polygon.data(); QwtPixelMatrix pixelMatrix( boundingRect.toAlignedRect() ); int numPoints = 0; for ( int i = from; i <= to; i++ ) { const QPointF sample = series->sample( i ); const int x = qwtRoundValue( xMap.transform( sample.x() ) ); const int y = qwtRoundValue( yMap.transform( sample.y() ) ); if ( pixelMatrix.testAndSetPixel( x, y, true ) == false ) { points[ numPoints ].rx() = x; points[ numPoints ].ry() = y; numPoints++; } } polygon.resize( numPoints ); return polygon; }
/*! \brief Draw symbols \param painter Painter \param symbol Curve symbol \param xMap x map \param yMap y map \param from index of the first point to be painted \param to index of the last point to be painted \sa setSymbol(), draw(), drawCurve() */ void QwtPlotCurve::drawSymbols(QPainter *painter, const QwtSymbol &symbol, const QwtScaleMap &xMap, const QwtScaleMap &yMap, int from, int to) const { painter->setBrush(symbol.brush()); painter->setPen(QwtPainter::scaledPen(symbol.pen())); const QwtMetricsMap &metricsMap = QwtPainter::metricsMap(); QRect rect; rect.setSize(metricsMap.screenToLayout(symbol.size())); if ( to > from && d_data->paintAttributes & PaintFiltered ) { const QRect window = painter->window(); if ( window.isEmpty() ) return; PrivateData::PixelMatrix pixelMatrix(window); for (int i = from; i <= to; i++) { const QPoint pi( xMap.transform(x(i)), yMap.transform(y(i)) ); if ( pixelMatrix.testPixel(pi) ) { rect.moveCenter(pi); symbol.draw(painter, rect); } } } else { for (int i = from; i <= to; i++) { const int xi = xMap.transform(x(i)); const int yi = yMap.transform(y(i)); rect.moveCenter(QPoint(xi, yi)); symbol.draw(painter, rect); } } }
/*! Draw dots \param painter Painter \param xMap x map \param yMap y map \param from index of the first point to be painted \param to index of the last point to be painted \sa draw(), drawCurve(), drawSticks(), drawLines(), drawSteps() */ void QwtPlotCurve::drawDots(QPainter *painter, const QwtScaleMap &xMap, const QwtScaleMap &yMap, int from, int to) const { const QRect window = painter->window(); if ( window.isEmpty() ) return; const bool doFill = d_data->brush.style() != Qt::NoBrush; QwtPolygon polyline; if ( doFill ) polyline.resize(to - from + 1); if ( to > from && d_data->paintAttributes & PaintFiltered ) { if ( doFill ) { QPoint pp( xMap.transform(x(from)), yMap.transform(y(from)) ); QwtPainter::drawPoint(painter, pp.x(), pp.y()); polyline.setPoint(0, pp); int count = 1; for (int i = from + 1; i <= to; i++) { const QPoint pi(xMap.transform(x(i)), yMap.transform(y(i))); if ( pi != pp ) { QwtPainter::drawPoint(painter, pi.x(), pi.y()); polyline.setPoint(count, pi); count++; pp = pi; } } if ( int(polyline.size()) != count ) polyline.resize(count); } else { // if we don't need to fill, we can sort out // duplicates independent from the order PrivateData::PixelMatrix pixelMatrix(window); for (int i = from; i <= to; i++) { const QPoint p( xMap.transform(x(i)), yMap.transform(y(i)) ); if ( pixelMatrix.testPixel(p) ) QwtPainter::drawPoint(painter, p.x(), p.y()); } } } else { for (int i = from; i <= to; i++) { const int xi = xMap.transform(x(i)); const int yi = yMap.transform(y(i)); QwtPainter::drawPoint(painter, xi, yi); if ( doFill ) polyline.setPoint(i - from, xi, yi); } } if ( doFill ) { if ( d_data->paintAttributes & ClipPolygons ) polyline = QwtClipper::clipPolygon(painter->window(), polyline); fillCurve(painter, xMap, yMap, polyline); } }
/*! Draw dots \param painter Painter \param xMap x map \param yMap y map \param from index of the first point to be painted \param to index of the last point to be painted \sa draw(), drawCurve(), drawSticks(), drawLines(), drawSteps() */ void QwtPlotCurve::drawDots(QPainter *painter, const QwtScaleMap &xMap, const QwtScaleMap &yMap, int from, int to) const { const bool doFill = d_data->brush.style() != Qt::NoBrush; QwtPolygonF polyline; if ( doFill ) polyline.resize(to - from + 1); if ( to > from && d_data->paintAttributes & PaintFiltered ) { if ( doFill || d_data->canvasRect.isEmpty() ) { QPointF pp( xMap.xTransform(x(from)), yMap.xTransform(y(from)) ); QwtPainter::drawPoint(painter, pp.x(), pp.y()); polyline[0] = pp; int count = 1; for (int i = from + 1; i <= to; i++) { const QPointF pi(xMap.xTransform(x(i)), yMap.xTransform(y(i))); if ( pi != pp ) { QwtPainter::drawPoint(painter, pi.x(), pi.y()); polyline[count] = pi; count++; pp = pi; } } if ( int(polyline.size()) != count ) polyline.resize(count); } else { // if we don't need to fill, we can sort out // duplicates independent from the order PrivateData::PixelMatrix pixelMatrix(d_data->canvasRect); for (int i = from; i <= to; i++) { const QPointF p( xMap.xTransform(x(i)), yMap.xTransform(y(i)) ); if ( pixelMatrix.testPixel(p.toPoint()) ) QwtPainter::drawPoint(painter, p.x(), p.y()); } } } else { for (int i = from; i <= to; i++) { const double xi = xMap.xTransform(x(i)); const double yi = yMap.xTransform(y(i)); QwtPainter::drawPoint(painter, xi, yi); if ( doFill ) polyline[i - from] = QPointF(xi, yi); } } if ( doFill ) { if ( d_data->canvasRect.isValid() && (d_data->paintAttributes & ClipPolygons) ) polyline = QwtClipper::clipPolygonF(d_data->canvasRect, polyline); fillCurve(painter, xMap, yMap, polyline); } }