void Page::LayOutVertically() { Doc *doc = dynamic_cast<Doc *>(GetParent()); assert(doc); // Doc::SetDrawingPage should have been called before // Make sure we have the correct page assert(this == doc->GetDrawingPage()); // Reset the vertical alignment Functor resetVerticalAlignment(&Object::ResetVerticalAlignment); this->Process(&resetVerticalAlignment, NULL); FunctorDocParams calcLegerLinesParams(doc); Functor calcLedgerLines(&Object::CalcLedgerLines); this->Process(&calcLedgerLines, &calcLegerLinesParams); // Align the content of the page using system aligners // After this: // - each Staff object will then have its StaffAlignment pointer initialized Functor alignVertically(&Object::AlignVertically); Functor alignVerticallyEnd(&Object::AlignVerticallyEnd); AlignVerticallyParams alignVerticallyParams(doc, &alignVerticallyEnd); this->Process(&alignVertically, &alignVerticallyParams, &alignVerticallyEnd); // Adjust the position of outside articulations FunctorDocParams calcArticParams(doc); Functor calcArtic(&Object::CalcArtic); this->Process(&calcArtic, &calcArticParams); // Render it for filling the bounding box View view; BBoxDeviceContext bBoxDC(&view, 0, 0); view.SetDoc(doc); // Do not do the layout in this view - otherwise we will loop... view.SetPage(this->GetIdx(), false); view.DrawCurrentPage(&bBoxDC, false); // Adjust the position of outside articulations with slurs end and start positions FunctorDocParams adjustArticWithSlursParams(doc); Functor adjustArticWithSlurs(&Object::AdjustArticWithSlurs); this->Process(&adjustArticWithSlurs, &adjustArticWithSlursParams); // Fill the arrays of bounding boxes (above and below) for each staff alignment for which the box overflows. SetOverflowBBoxesParams setOverflowBBoxesParams(doc); Functor setOverflowBBoxes(&Object::SetOverflowBBoxes); Functor setOverflowBBoxesEnd(&Object::SetOverflowBBoxesEnd); this->Process(&setOverflowBBoxes, &setOverflowBBoxesParams, &setOverflowBBoxesEnd); // Adjust the positioners of floationg elements (slurs, hairpin, dynam, etc) Functor adjustFloatingPostioners(&Object::AdjustFloatingPostioners); AdjustFloatingPostionersParams adjustFloatingPostionersParams(doc, &adjustFloatingPostioners); this->Process(&adjustFloatingPostioners, &adjustFloatingPostionersParams); // Adjust the overlap of the staff aligmnents by looking at the overflow bounding boxes params.clear(); Functor adjustStaffOverlap(&Object::AdjustStaffOverlap); AdjustStaffOverlapParams adjustStaffOverlapParams(&adjustStaffOverlap); this->Process(&adjustStaffOverlap, &adjustStaffOverlapParams); // Set the Y position of each StaffAlignment // Adjust the Y shift to make sure there is a minimal space (staffMargin) between each staff Functor adjustYPos(&Object::AdjustYPos); AdjustYPosParams adjustYPosParams(doc, &adjustYPos); this->Process(&adjustYPos, &adjustYPosParams); // Adjust system Y position AlignSystemsParams alignSystemsParams; alignSystemsParams.m_shift = doc->m_drawingPageHeight - doc->m_drawingPageTopMar; alignSystemsParams.m_systemMargin = (doc->GetSpacingSystem()) * doc->GetDrawingUnit(100); Functor alignSystems(&Object::AlignSystems); this->Process(&alignSystems, &alignSystemsParams); }