package com.xenoage.zong.musiclayout.stamper;
import com.xenoage.utils.math.geom.Point2f;
import com.xenoage.zong.core.Score;
import com.xenoage.zong.musiclayout.layouter.scoreframelayout.util.StaffStampings;
import com.xenoage.zong.musiclayout.spacing.FrameSpacing;
import com.xenoage.zong.musiclayout.spacing.SystemSpacing;
import com.xenoage.zong.musiclayout.stampings.StaffStamping;
import java.util.List;
import static com.xenoage.utils.collections.CollectionUtils.alist;
import static com.xenoage.utils.kernel.Range.range;
/**
* Creates the {@link StaffStampings} for a {@link FrameSpacing}.
*
* @author Andreas Wenger
*/
public class StaffStamper {
public static final StaffStamper staffStamper = new StaffStamper();
public StaffStampings createStaffStampings(Score score, FrameSpacing frame) {
int systemsCount = frame.getSystems().size();
int stavesCount = score.getStavesCount();
List<StaffStamping> allStaves = alist(systemsCount * stavesCount);
//go through the systems
for (int iSystem : range(systemsCount)) {
SystemSpacing system = frame.getSystems().get(iSystem);
float systemXOffset = system.getMarginLeftMm();
//create staves of the system
float yOffset = system.getOffsetYMm();
for (int iStaff : range(stavesCount)) {
yOffset += system.getStaffDistanceMm(iStaff);
int linesCount = score.getStaff(iStaff).getLinesCount();
float interlineSpace = score.getInterlineSpace(iStaff);
StaffStamping staff = new StaffStamping(system, iStaff,
new Point2f(systemXOffset, yOffset), system.widthMm, linesCount, interlineSpace);
allStaves.add(staff);
yOffset += system.getStaffHeightMm(iStaff);
}
}
return new StaffStampings(allStaves, systemsCount, stavesCount);
}
}