]> git.siccegge.de Git - frida/frida.git/commitdiff
Add support for backward edges
authorChristoph Egger <siccegge@faui49man12.informatik.uni-erlangen.de>
Thu, 4 Dec 2014 18:56:15 +0000 (19:56 +0100)
committerChristoph Egger <siccegge@faui49man12.informatik.uni-erlangen.de>
Thu, 4 Dec 2014 18:56:15 +0000 (19:56 +0100)
src/gui/widgets/BasicBlockWidget.hxx
src/gui/widgets/CFGScene.cxx
src/gui/widgets/CFGScene.hxx

index dd2fa30208d8a347c1672aed7e94a85a80d421f2..5fda53e68d5beb93420fe24ae59bd80484c4b3dd 100644 (file)
@@ -30,10 +30,10 @@ public:
                return mapToScene(QPointF(width/2, 0));
        }
 
-    std::tuple<QPointF, QPointF, QPointF> getExits() const {
-        return std::make_tuple(mapToScene(QPointF(  width/3, height)),
-                               mapToScene(QPointF(  width/2, height)),
-                               mapToScene(QPointF(2*width/3, height)));
+    std::array<QPointF, 3> getExits() const {
+        return { {  mapToScene(QPointF(  width/3, height)),
+                                       mapToScene(QPointF(  width/2, height)),
+                                       mapToScene(QPointF(2*width/3, height)) } };
     }
 
     void paint(QPainter *painter, const QStyleOptionGraphicsItem *option,
index 81c973540f25aeeaccdf57891d92b5e77abf4a37..75a39f049e5d280186b7e36920f1b1290d4cac01 100644 (file)
@@ -6,7 +6,7 @@ void CFGScene::drawBackground(QPainter* painter, const QRectF & rect) {
     spaceWidgets();
 
     for (BasicBlockWidget * widget : widgets) {
-        QPointF kopf = widget->getEntry();
+               QPointF kopf = widget->getEntry();
         painter->setPen(QColor(0x00, 0xff, 0x00, 0xff));
         painter->drawLine(kopf, kopf - QPointF(0, 20));
 
@@ -16,25 +16,52 @@ void CFGScene::drawBackground(QPainter* painter, const QRectF & rect) {
             if (NULL != next[1]) {
                 painter->setPen(QColor(0xff, 0x00, 0x00, 0xff));
                 painter->drawLine(std::get<0>(tails), std::get<0>(tails) + QPointF(0, 20));
-                drawLine(painter, std::get<0>(tails) + QPointF(0, 20), next[1]->getEntry() - QPointF(0, 20));
+                drawLine(painter, widget, next[1], -1);
+
                 painter->setPen(QColor(0x00, 0xff, 0x00, 0xff));
                 painter->drawLine(std::get<2>(tails), std::get<2>(tails) + QPointF(0, 20));
-                drawLine(painter, std::get<2>(tails) + QPointF(0, 20), next[0]->getEntry() - QPointF(0, 20));
+                drawLine(painter, widget, next[0], 1);
             } else {
                 painter->setPen(QColor(0x00, 0x00, 0x00, 0xff));
                 painter->drawLine(std::get<1>(tails), std::get<1>(tails) + QPointF(0, 20));
-                drawLine(painter, std::get<1>(tails) + QPointF(0, 20), next[0]->getEntry() - QPointF(0, 20));
+                drawLine(painter, widget, next[0], 0);
             }
         }
     }
 }
 
-void CFGScene::drawLine(QPainter* painter, QPointF from, QPointF to, bool left) {
-    if ((to - from).y() > 0) {
-        QPointF angle1(from + QPointF(0, (to - from).y())), angle2(to - QPointF(0, (to - from).y() / 2));
-        painter->drawLine(from,   angle1);
-        painter->drawLine(angle1, to);
-    }
+void CFGScene::drawLine(QPainter* painter, BasicBlockWidget * from, BasicBlockWidget * to, int8_t side) {
+       QPointF from_p = from->getExits()[side+1] + QPointF(0, 20);
+       QPointF to_p = to->getEntry() - QPointF(0, 20);
+    if ((to_p - from_p).y() > 0) {
+               /* Forward Edge */
+        QPointF angle1(from_p + QPointF(0, (to_p - from_p).y()));
+        painter->drawLine(from_p,   angle1);
+        painter->drawLine(angle1, to_p);
+    } else {
+               /* Backward Edge */
+               QRectF from_r(from->boundingRect()), to_r(to->boundingRect());
+               from_r.moveTo(from->scenePos());
+               to_r.moveTo(to->scenePos());
+               QRectF bound = from_r | to_r;
+               if (std::abs(bound.right() - from_p.x()) > std::abs(bound.left() - to_p.x())) {
+                       /* we go left */
+                       QPointF middle1 = from_p + QPointF(bound.left() - from_p.x() - 20, 0);
+                       QPointF middle2 = to_p   + QPointF(bound.left() - to_p.x()   - 20, 0);
+
+                       painter->drawLine(from_p, middle1);
+                       painter->drawLine(middle1, middle2);
+                       painter->drawLine(middle2, to_p);
+               } else {
+                       /* we go right */
+                       QPointF middle1 = from_p - QPointF(from_p.x() - bound.right() - 20, 0);
+                       QPointF middle2 = to_p   - QPointF(to_p.x()   - bound.right() - 20, 0);
+
+                       painter->drawLine(from_p, middle1);
+                       painter->drawLine(middle1, middle2);
+                       painter->drawLine(middle2, to_p);
+               }
+       }
 }
 
 void CFGScene::spaceWidgets() {
index 6baa618049d54b113930d86f64eeb01e0c94ee4d..fb395f71f579669b06a87e7662fac322802749f8 100644 (file)
@@ -22,7 +22,7 @@ public:
 private:
     std::vector<BasicBlockWidget*> widgets;
 
-    void drawLine(QPainter* painter, QPointF from, QPointF to, bool left = true);
+    void drawLine(QPainter* painter, BasicBlockWidget * from, BasicBlockWidget * to, int8_t side = 0);
 
     void spaceWidgets();
 };