void computeBezierPoints(const vector<Coord> &controlPoints, vector<Coord> &curvePoints, unsigned int nbCurvePoints) { assert(controlPoints.size() > 1); switch(controlPoints.size()) { case 2: computeLinearBezierPoints(controlPoints[0], controlPoints[1], curvePoints, nbCurvePoints); break; case 3: computeQuadraticBezierPoints(controlPoints[0], controlPoints[1], controlPoints[2], curvePoints, nbCurvePoints); break; case 4: computeCubicBezierPoints(controlPoints[0], controlPoints[1], controlPoints[2], controlPoints[3], curvePoints, nbCurvePoints); break; default: curvePoints.resize(nbCurvePoints); float h = 1.0 / static_cast<float>(nbCurvePoints - 1); // With Visual Studio, the parallelization of the curve points computation // leads to incorrect results (why? I don't know ...) #if defined(_OPENMP) && !defined(_MSC_VER) #pragma omp parallel for #endif for (int i = 0 ; i < static_cast<int>(nbCurvePoints) ; ++i) { float curStep = i * h; curvePoints[i] = computeBezierPoint(controlPoints, curStep); } } }
void WobblyWindowsEffect::paintWindow(EffectWindow* w, int mask, QRegion region, WindowPaintData& data) { if (windows.contains(w)) { WindowWobblyInfos& wwi = windows[w]; int tx = w->geometry().x(); int ty = w->geometry().y(); double left = 0.0; double top = 0.0; double right = w->width(); double bottom = w->height(); for (int i = 0; i < data.quads.count(); ++i) { for (int j = 0; j < 4; ++j) { WindowVertex& v = data.quads[i][j]; Pair oldPos = {tx + v.x(), ty + v.y()}; Pair newPos = computeBezierPoint(wwi, oldPos); v.move(newPos.x - tx, newPos.y - ty); } left = qMin(left, data.quads[i].left()); top = qMin(top, data.quads[i].top()); right = qMax(right, data.quads[i].right()); bottom = qMax(bottom, data.quads[i].bottom()); } m_updateRegion = m_updateRegion.united(QRect(w->x() + left, w->y() + top, right - left + 2, bottom - top + 2)); } // Call the next effect. effects->paintWindow(w, mask, region, data); }
Coord GlBezierCurve::computeCurvePointOnCPU(const std::vector<Coord> &controlPoints, float t) { return computeBezierPoint(controlPoints, t); }