void QwtPainter::drawPolyline(QPainter *painter, const QwtPolygonF &pa) { QRect clipRect; const bool deviceClipping = isClippingNeeded(painter, clipRect); QwtPolygonF cpa = d_metricsMap.layoutToDevice(pa); if ( deviceClipping ) cpa = QwtClipper::clipPolygonF(clipRect, cpa); #if QT_VERSION >= 0x040000 bool doSplit = false; const QPaintEngine *pe = painter->paintEngine(); if ( pe && pe->type() == QPaintEngine::Raster && painter->pen().width() >= 2 ) { /* The raster paint engine seems to use some algo with O(n*n). ( Qt 4.3 is better than Qt 4.2, but remains unacceptable) To work around this problem, we have to split the polygon into smaller pieces. */ doSplit = true; } if ( doSplit ) { const int numPoints = cpa.size(); const QPointF *points = cpa.data(); const int splitSize = 20; for ( int i = 0; i < numPoints; i += splitSize ) { const int n = qwtMin(splitSize + 1, cpa.size() - i); painter->drawPolyline(points + i, n); } } else #endif painter->drawPolyline(cpa); }
// modified by Ion Vasilief in order to use floating point coordinates void QwtPlotCurve::drawLines(QPainter *painter, const QwtScaleMap &xMap, const QwtScaleMap &yMap, int from, int to) const { int size = to - from + 1; if ( size <= 0 ) return; QwtPolygonF polyline; if ( ( d_data->attributes & Fitted ) && d_data->curveFitter ) { // Transform x and y values to window coordinates // to avoid a distinction between linear and // logarithmic scales. QPolygonF points(size); for (int i = from; i <= to; i++) { QwtDoublePoint &p = points[i]; p.setX( xMap.xTransform(x(i)) ); p.setY( yMap.xTransform(y(i)) ); } points = d_data->curveFitter->fitCurve(points); size = points.size(); if ( size == 0 ) return; // Round QwtDoublePoints to QPoints // When Qwt support for Qt3 has been dropped (Qwt 6.x) // we will use a doubles for painting and the following // step will be obsolete. polyline.resize(size); const QwtDoublePoint *p = points.data(); QPointF *pl = polyline.data(); if ( d_data->paintAttributes & PaintFiltered ) { QPointF pp(p[0].x(), p[0].y()); pl[0] = pp; int count = 1; for (int i = 1; i < size; i++) { const QPointF pi(p[i].x(), p[i].y()); if ( pi != pp ) { pl[count++] = pi; pp = pi; } } if ( count != size ) polyline.resize(count); } else { for ( int i = 0; i < size; i++ ) { pl[i].setX( p[i].x() ); pl[i].setY( p[i].y() ); } } } else { polyline.resize(size); if ( d_data->paintAttributes & PaintFiltered ) { QPointF pp( xMap.xTransform(x(from)), yMap.xTransform(y(from)) ); 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 ) { polyline[count] = pi; count++; pp = pi; } } if ( count != size ) polyline.resize(count); } else { for (int i = from; i <= to; i++) { const QPointF pi(xMap.xTransform(x(i)), yMap.xTransform(y(i))); polyline[i - from] = pi; } } } if ( d_data->paintAttributes & ClipPolygons ) polyline = QwtClipper::clipPolygonF(painter->window(), polyline); QwtPainter::drawPolyline(painter, polyline); if ( d_data->brush.style() != Qt::NoBrush ) fillCurve(painter, xMap, yMap, polyline); }
static inline QwtDoubleRect boundingRect(const QwtPolygonF &polygon) { #if QT_VERSION < 0x040000 if (polygon.isEmpty()) return QwtDoubleRect(0, 0, 0, 0); register const QwtDoublePoint *pd = polygon.data(); double minx, maxx, miny, maxy; minx = maxx = pd->x(); miny = maxy = pd->y(); pd++; for (uint i = 1; i < polygon.size(); i++, pd++) { if (pd->x() < minx) minx = pd->x(); else if (pd->x() > maxx) maxx = pd->x(); if (pd->y() < miny) miny = pd->y(); else if (pd->y() > maxy) maxy = pd->y(); } return QwtDoubleRect(minx, miny, maxx - minx, maxy - miny); #else return polygon.boundingRect(); #endif }