Region *Region::splitDir(double pos, unsigned int dir, bool first) { Point& o1 = _bbox.a; Point& o2 = _bbox.b; Region *newR = NULL; if (dir & R_VERT) { assert(pos > _bbox.a.x); assert(pos < _bbox.b.x); // Vertical recursion: // Create new block. Region *r = new Region(pos, o1.y, o2.x, o2.y); printf("NEW %p\n", r); r->copyAttributes(this); Region *o_up = _up; Region *o_down = _down; // Resize old block. o2.x = pos; pairHor(r, _right); pairHor(this, r); if (dir & R_UP) { if (!first) pairVer(r, _down->_right); if (o_up) o_up->splitDir(pos, R_UP); } else if (dir & R_DOWN) { if (!first) pairVer(_up->_right, r); if (o_down) o_down->splitDir(pos, R_DOWN); } newR = r; } else if (dir & R_HORI) { // Vertical recursion: // Create new block. Region *b = new Region(o1.x, pos, o2.x, o2.y); printf("NEW %p\n", b); b->copyAttributes(this); Region *o_left = _left; Region *o_right = _right; // Resize old block. o2.y = pos; pairVer(b, _down); pairVer(this, b); if (dir & R_LEFT) { if (!first) pairHor(b, _right->_down); if (o_left) o_left->splitDir(pos, R_LEFT); } else if (dir & R_RIGHT) { if (!first) pairHor(_left->_down, b); if (o_right) o_right->splitDir(pos, R_RIGHT); } newR = b; } return newR; }