X-Git-Url: https://git.siccegge.de//index.cgi?a=blobdiff_plain;f=src%2Fgui%2Fwidgets%2FCFGScene.cxx;h=271f30354eaf66aed3ba39f1fc77d7b3ac1c53b5;hb=be25639ecafa1ec2d37c8e2d6c8225c12ddb59ff;hp=c40e2498494a85a403156feb0c1d83864da93d5e;hpb=7e983f239ca96faf5c8ba92cd4de54eba5235f75;p=frida%2Ffrida.git diff --git a/src/gui/widgets/CFGScene.cxx b/src/gui/widgets/CFGScene.cxx index c40e249..271f303 100644 --- a/src/gui/widgets/CFGScene.cxx +++ b/src/gui/widgets/CFGScene.cxx @@ -30,7 +30,14 @@ void CFGScene::drawBackground(QPainter* painter, const QRectF & rect) { } } -void CFGScene::drawLine(QPainter* painter, BasicBlockWidget * from, BasicBlockWidget * to, int8_t side) { +/* 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); if ((to_p - from_p).y() > 0) { @@ -66,6 +73,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) { @@ -75,32 +89,37 @@ void CFGScene::spaceWidgets() { if (NULL != next[0] && (next[0]->getEntry() - widget->getEntry()).y() > 0 && (next[0]->getEntry() - out).y() < 50) { - widget->moveBy(0, -1); + widget->moveBy(0, -3); changed = true; } else if (NULL != next[1] && (next[1]->getEntry() - widget->getEntry()).y() > 0 && (next[1]->getEntry() - out).y() < 50) { - widget->moveBy(0, -1); + widget->moveBy(0, -3); changed = true; } } } 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()); relevantRect.adjust(-20, -20, 20, 20); for (QGraphicsItem * item : items(relevantRect)) { - if (item == widget) continue; - if (std::find(widgets.begin(), widgets.end(), item) == widgets.end()) continue; + if (item == widget) + continue; + if (std::find(widgets.begin(), widgets.end(), item) == widgets.end()) + continue; QRectF itemrect = item->boundingRect(); itemrect.moveTo(item->scenePos()); while (relevantRect.intersects(itemrect)) { if (widget->scenePos().x() > item->scenePos().x()) { - widget->moveBy(1, 0); + widget->moveBy(3, 0); relevantRect.moveTo(widget->scenePos()); } else { - item->moveBy(1, 0); + item->moveBy(3, 0); itemrect.moveTo(item->scenePos()); } }