Don't like ads? PRO users don't see any ads ;-)
Guest

VariablePathShape

By: a guest on Jun 30th, 2012  |  syntax: C++  |  size: 5.97 KB  |  hits: 15  |  expires: Never
download  |  raw  |  embed  |  report abuse  |  print
Text below is selected. Please press Ctrl+C to copy to your clipboard. (⌘+C on Mac)
  1. QPainterPath VariablePathShape::outline() const
  2. {
  3.    
  4.     QPainterPath path;
  5.     foreach(KoSubpath * subpath, m_subpaths) {
  6.         // go through forward
  7.         // add an offset to left
  8.         QPointF offset(-5.,0.);
  9.         KoPathPoint * lastPoint = subpath->first();
  10.         bool activeCP = false;
  11.         foreach(KoPathPoint * currPoint, *subpath) {
  12.             KoPathPoint::PointProperties currProperties = currPoint->properties();
  13.             if (currPoint == subpath->first()) {
  14.                 if (currProperties & KoPathPoint::StartSubpath) {
  15.                     Q_ASSERT(!qIsNaNPoint(currPoint->point()));
  16.                     path.moveTo(currPoint->point() + offset);
  17.                 }
  18.             } else if (activeCP && currPoint->activeControlPoint1()) {
  19.                 Q_ASSERT(!qIsNaNPoint(lastPoint->controlPoint2()));
  20.                 Q_ASSERT(!qIsNaNPoint(currPoint->controlPoint1()));
  21.                 Q_ASSERT(!qIsNaNPoint(currPoint->point()));
  22.                 path.cubicTo(
  23.                     lastPoint->controlPoint2() + offset,
  24.                     currPoint->controlPoint1() + offset,
  25.                     currPoint->point() + offset);
  26.             } else if( activeCP || currPoint->activeControlPoint1()) {
  27.                 Q_ASSERT(!qIsNaNPoint(lastPoint->controlPoint2()));
  28.                 Q_ASSERT(!qIsNaNPoint(currPoint->controlPoint1()));
  29.                 path.quadTo(
  30.                     activeCP ? lastPoint->controlPoint2() + offset : currPoint->controlPoint1() + offset,
  31.                     currPoint->point() + offset);
  32.             } else {
  33.                 Q_ASSERT(!qIsNaNPoint(currPoint->point()));
  34.                 path.lineTo(currPoint->point() + offset);
  35.             }
  36.             if (currProperties & KoPathPoint::CloseSubpath && currProperties & KoPathPoint::StopSubpath) {
  37.                 // add curve when there is a curve on the way to the first point
  38.                 KoPathPoint * firstPoint = subpath->first();
  39.                 Q_ASSERT(!qIsNaNPoint(firstPoint->point()));
  40.                 if (currPoint->activeControlPoint2() && firstPoint->activeControlPoint1()) {
  41.                     path.cubicTo(
  42.                         currPoint->controlPoint2() + offset,
  43.                         firstPoint->controlPoint1() + offset,
  44.                         firstPoint->point() + offset);
  45.                 }
  46.                 else if(currPoint->activeControlPoint2() || firstPoint->activeControlPoint1()) {
  47.                     Q_ASSERT(!qIsNaNPoint(currPoint->point()));
  48.                     Q_ASSERT(!qIsNaNPoint(currPoint->controlPoint1()));
  49.                     path.quadTo(
  50.                         currPoint->activeControlPoint2() ? currPoint->controlPoint2() + offset : firstPoint->controlPoint1() + offset,
  51.                         firstPoint->point() + offset);
  52.                 }
  53.                 path.closeSubpath();
  54.             }
  55.  
  56.             if (currPoint->activeControlPoint2()) {
  57.                 activeCP = true;
  58.             } else {
  59.                 activeCP = false;
  60.             }
  61.             lastPoint = currPoint;
  62.         }
  63.         offset = QPointF(5.0, 0);
  64.         // go through backward
  65.         // TODO
  66.         lastPoint = subpath->first();
  67.         activeCP = false;
  68.         foreach(KoPathPoint * currPoint, *subpath) {
  69.             KoPathPoint::PointProperties currProperties = currPoint->properties();
  70.             if (currPoint == subpath->first()) {
  71.                 if (currProperties & KoPathPoint::StartSubpath) {
  72.                     Q_ASSERT(!qIsNaNPoint(currPoint->point()));
  73.                     path.moveTo(currPoint->point() + offset);
  74.                 }
  75.             } else if (activeCP && currPoint->activeControlPoint1()) {
  76.                 Q_ASSERT(!qIsNaNPoint(lastPoint->controlPoint2()));
  77.                 Q_ASSERT(!qIsNaNPoint(currPoint->controlPoint1()));
  78.                 Q_ASSERT(!qIsNaNPoint(currPoint->point()));
  79.                 path.cubicTo(
  80.                     lastPoint->controlPoint2() + offset,
  81.                     currPoint->controlPoint1() + offset,
  82.                     currPoint->point() + offset);
  83.             } else if( activeCP || currPoint->activeControlPoint1()) {
  84.                 Q_ASSERT(!qIsNaNPoint(lastPoint->controlPoint2()));
  85.                 Q_ASSERT(!qIsNaNPoint(currPoint->controlPoint1()));
  86.                 path.quadTo(
  87.                     activeCP ? lastPoint->controlPoint2() + offset : currPoint->controlPoint1() + offset,
  88.                     currPoint->point() + offset);
  89.             } else {
  90.                 Q_ASSERT(!qIsNaNPoint(currPoint->point()));
  91.                 path.lineTo(currPoint->point() + offset);
  92.             }
  93.             if (currProperties & KoPathPoint::CloseSubpath && currProperties & KoPathPoint::StopSubpath) {
  94.                 // add curve when there is a curve on the way to the first point
  95.                 KoPathPoint * firstPoint = subpath->first();
  96.                 Q_ASSERT(!qIsNaNPoint(firstPoint->point()));
  97.                 if (currPoint->activeControlPoint2() && firstPoint->activeControlPoint1()) {
  98.                     path.cubicTo(
  99.                         currPoint->controlPoint2() + offset,
  100.                         firstPoint->controlPoint1() + offset,
  101.                         firstPoint->point() + offset);
  102.                 }
  103.                 else if(currPoint->activeControlPoint2() || firstPoint->activeControlPoint1()) {
  104.                     Q_ASSERT(!qIsNaNPoint(currPoint->point()));
  105.                     Q_ASSERT(!qIsNaNPoint(currPoint->controlPoint1()));
  106.                     path.quadTo(
  107.                         currPoint->activeControlPoint2() ? currPoint->controlPoint2() + offset : firstPoint->controlPoint1() + offset,
  108.                         firstPoint->point() + offset);
  109.                 }
  110.                 path.closeSubpath();
  111.             }
  112.  
  113.             if (currPoint->activeControlPoint2()) {
  114.                 activeCP = true;
  115.             } else {
  116.                 activeCP = false;
  117.             }
  118.             lastPoint = currPoint;
  119.         }
  120.     }
  121.     return path;
  122. }