X-Git-Url: https://git.siccegge.de//index.cgi?p=frida%2Ffrida.git;a=blobdiff_plain;f=src%2Fgui%2Fwidgets%2FCFGScene.cxx;h=75a39f049e5d280186b7e36920f1b1290d4cac01;hp=81c973540f25aeeaccdf57891d92b5e77abf4a37;hb=9230b2cf1a95c50e2bf0b4ca8e214bddd45cf65f;hpb=31a4c0d5267f2c482ad4d8d4d0f7b86584cf58f2 diff --git a/src/gui/widgets/CFGScene.cxx b/src/gui/widgets/CFGScene.cxx index 81c9735..75a39f0 100644 --- a/src/gui/widgets/CFGScene.cxx +++ b/src/gui/widgets/CFGScene.cxx @@ -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() {