src/gui/painting/qpainterpath.cpp
changeset 3 41300fa6a67c
parent 0 1918ee327afb
child 4 3b1da2848fc7
--- a/src/gui/painting/qpainterpath.cpp	Tue Jan 26 12:42:25 2010 +0200
+++ b/src/gui/painting/qpainterpath.cpp	Tue Feb 02 00:43:10 2010 +0200
@@ -688,6 +688,8 @@
         return;
     Element elm = { p.x(), p.y(), LineToElement };
     d->elements.append(elm);
+
+    d->convex = d->elements.size() == 3 || (d->elements.size() == 4 && d->isClosed());
 }
 
 /*!
@@ -960,6 +962,8 @@
     ensureData();
     detach();
 
+    bool first = d_func()->elements.size() < 2;
+
     d_func()->elements.reserve(d_func()->elements.size() + 5);
     moveTo(r.x(), r.y());
 
@@ -970,6 +974,7 @@
 
     d_func()->elements << l1 << l2 << l3 << l4;
     d_func()->require_moveTo = true;
+    d_func()->convex = first;
 }
 
 /*!
@@ -1039,6 +1044,7 @@
     detach();
 
     Q_D(QPainterPath);
+    bool first = d_func()->elements.size() < 2;
     d->elements.reserve(d->elements.size() + 13);
 
     QPointF pts[12];
@@ -1051,6 +1057,8 @@
     cubicTo(pts[6], pts[7], pts[8]);           // 180 -> 90
     cubicTo(pts[9], pts[10], pts[11]);         // 90 - >0
     d_func()->require_moveTo = true;
+
+    d_func()->convex = first;
 }
 
 /*!
@@ -3027,14 +3035,17 @@
     ensureData();
     detach();
 
-    arcMoveTo(x, y, rxx2, ryy2, 90);
-    arcTo(x, y, rxx2, ryy2, 90, 90);
-    arcTo(x, y+h-ryy2, rxx2, ryy2, 2*90, 90);
-    arcTo(x+w-rxx2, y+h-ryy2, rxx2, ryy2, 3*90, 90);
-    arcTo(x+w-rxx2, y, rxx2, ryy2, 0, 90);
+    bool first = d_func()->elements.size() < 2;
+
+    arcMoveTo(x, y, rxx2, ryy2, 180);
+    arcTo(x, y, rxx2, ryy2, 180, -90);
+    arcTo(x+w-rxx2, y, rxx2, ryy2, 90, -90);
+    arcTo(x+w-rxx2, y+h-ryy2, rxx2, ryy2, 0, -90);
+    arcTo(x, y+h-ryy2, rxx2, ryy2, 270, -90);
     closeSubpath();
 
     d_func()->require_moveTo = true;
+    d_func()->convex = first;
 }
 
 /*!
@@ -3081,14 +3092,17 @@
     ensureData();
     detach();
 
-    arcMoveTo(x, y, rxx2, ryy2, 90);
-    arcTo(x, y, rxx2, ryy2, 90, 90);
-    arcTo(x, y+h-ryy2, rxx2, ryy2, 2*90, 90);
-    arcTo(x+w-rxx2, y+h-ryy2, rxx2, ryy2, 3*90, 90);
-    arcTo(x+w-rxx2, y, rxx2, ryy2, 0, 90);
+    bool first = d_func()->elements.size() < 2;
+
+    arcMoveTo(x, y, rxx2, ryy2, 180);
+    arcTo(x, y, rxx2, ryy2, 180, -90);
+    arcTo(x+w-rxx2, y, rxx2, ryy2, 90, -90);
+    arcTo(x+w-rxx2, y+h-ryy2, rxx2, ryy2, 0, -90);
+    arcTo(x, y+h-ryy2, rxx2, ryy2, 270, -90);
     closeSubpath();
 
     d_func()->require_moveTo = true;
+    d_func()->convex = first;
 }
 
 /*!
@@ -3269,6 +3283,7 @@
     d_func()->dirtyControlBounds = dirty;
     delete d_func()->pathConverter;
     d_func()->pathConverter = 0;
+    d_func()->convex = false;
 }
 
 void QPainterPath::computeBoundingRect() const