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;
}