Beispiel #1
0
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);
    }
  }
}
Beispiel #2
0
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);
}
Beispiel #3
0
Coord GlBezierCurve::computeCurvePointOnCPU(const std::vector<Coord> &controlPoints, float t) {
  return computeBezierPoint(controlPoints, t);
}