]> git.siccegge.de Git - frida/frida.git/commitdiff
Add comments on how the graph is drawn
authorChristoph Egger <christoph@christoph-egger.org>
Mon, 25 May 2015 11:17:05 +0000 (13:17 +0200)
committerChristoph Egger <christoph@christoph-egger.org>
Mon, 25 May 2015 11:17:05 +0000 (13:17 +0200)
src/gui/widgets/CFGScene.cxx

index c40e2498494a85a403156feb0c1d83864da93d5e..aa27f2c1722caed1bfc2bb5e277ec10ab5495573 100644 (file)
@@ -30,6 +30,12 @@ void CFGScene::drawBackground(QPainter* painter, const QRectF & rect) {
        }
 }
 
+/* Forward edges:  Forward (downward) edges are just drawn straight
+ *                 down and then to the right side
+ * Backward edges: Consider the smallest rectangle that contains both,
+ *                 source and destination block. Draw the edge along
+ *                 the shorter side of that rectangle
+ */
 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);
@@ -66,6 +72,13 @@ void CFGScene::drawLine(QPainter* painter, BasicBlockWidget * from, BasicBlockWi
 
 void CFGScene::spaceWidgets() {
        bool changed = false;
+
+       /* While some BasicBlockWidget overlaps with a direct predecessor,
+        * move that widget down one step. Move each widget at most once
+        * per iteration so that widgets with severall incoming edges
+        * don't outrun these with less -- preserving order by address
+        * where appropriate.
+        */
        do {
                changed = false;
                for (BasicBlockWidget * widget : widgets) {
@@ -86,6 +99,9 @@ void CFGScene::spaceWidgets() {
                }
        } while (changed);
 
+       /* If there are still BasicBlockWidgets overlapping (BasicBlocks
+        * that don't have a direct edge) spread them sideways.
+        */
        for (BasicBlockWidget * widget : widgets) {
                QRectF relevantRect = widget->boundingRect();
                relevantRect.moveTo(widget->scenePos());