Esempio n. 1
0
  /** Reads the given print element. */
  private static MusicReaderContext readPrint(MusicReaderContext context, MxlPrint mxlPrint) {
    MxlPrintAttributes mxlPA = mxlPrint.getPrintAttributes();

    // system and page break
    Boolean newSystem = mxlPA.getNewSystem();
    SystemBreak systemBreak =
        (newSystem == null ? null : (newSystem ? SystemBreak.NewSystem : SystemBreak.NoNewSystem));
    Boolean newPage = mxlPA.getNewPage();
    PageBreak pageBreak =
        (newPage == null ? null : (newPage ? PageBreak.NewPage : PageBreak.NoNewPage));
    context =
        context.withScore(
            ScoreController.writeColumnElement(
                context.getScore(),
                atMeasure(context.getMP().getMeasure()),
                new Break(pageBreak, systemBreak)));

    // we assume that custom system layout information is just used in combination with
    // forced system/page breaks. so we ignore system-layout elements which are not combined
    // with system/page breaks.
    // the first measure of a score is also ok.
    if (context.getMP().getMeasure() == 0
        || systemBreak == SystemBreak.NewSystem
        || pageBreak == PageBreak.NewPage) {

      // first page or new page?
      boolean isPageBreak = pageBreak == PageBreak.NewPage;
      boolean isPageStarted = (context.getMP().getMeasure() == 0 || isPageBreak);
      if (isPageBreak) {
        // increment page index
        context = context.incPageIndex();
      }

      // first system or new system?
      boolean isSystemBreak = isPageBreak || systemBreak == SystemBreak.NewSystem;
      if (isSystemBreak) {
        // increment system index
        context = context.incSystemIndex();
      }

      // read system layout, if there
      MxlSystemLayout mxlSystemLayout = mxlPrint.getLayout().getSystemLayout();
      if (mxlSystemLayout != null) {
        SystemLayoutReader.Value sl =
            SystemLayoutReader.read(mxlSystemLayout, context.getTenthMm());
        SystemLayout systemLayout = sl.systemLayout;

        // for first systems on a page, use top-system-distance
        if (isPageStarted) {
          systemLayout = systemLayout.withSystemDistance(sl.topSystemDistance);
        }

        // apply values
        ScoreHeader scoreHeader =
            context
                .getScore()
                .getScoreHeader()
                .withSystemLayout(context.getSystemIndex(), systemLayout);
        context = context.withScore(context.getScore().withScoreHeader(scoreHeader));
      }
    }

    // staff layouts
    for (MxlStaffLayout mxlStaffLayout : mxlPrint.getLayout().getStaffLayouts()) {
      int staffIndex = mxlStaffLayout.getNumberNotNull() - 1;
      context =
          context.withScore(
              ScoreController.withStaffLayout(
                  context.getScore(),
                  context.getSystemIndex(),
                  context.getPartStavesIndices().getStart() + staffIndex,
                  readStaffLayout(mxlStaffLayout, context.getTenthMm()).staffLayout));
    }

    return context;
  }