+76
-3
@@ -154,6 +154,10 @@ auto center_y(vamp_zero::score_layout_item const& item) -> std::float32_t {
|
||||
return item.bounds.y + item.bounds.height * 0.5F;
|
||||
}
|
||||
|
||||
auto right_edge(vamp_zero::score_layout_item const& item) -> std::float32_t {
|
||||
return item.bounds.x + item.bounds.width;
|
||||
}
|
||||
|
||||
auto near(std::float32_t left, std::float32_t right) -> std::bool_t {
|
||||
return std::abs(left - right) < 0.02F;
|
||||
}
|
||||
@@ -325,7 +329,11 @@ BOOST_AUTO_TEST_CASE(score_layout_orders_preamble_on_staff_baselines) {
|
||||
|
||||
BOOST_TEST(clefs.front()->bounds.x < keys.front()->bounds.x);
|
||||
BOOST_TEST(keys.front()->bounds.x < times.front()->bounds.x);
|
||||
BOOST_TEST(near(clefs.front()->origin.y, staff_lines.front()->from.y + layout.staff_spacing * 3.0F));
|
||||
BOOST_TEST(near(clefs.front()->origin.y, staff_lines.front()->from.y + layout.staff_spacing * 3.5F));
|
||||
BOOST_TEST(near(keys.front()->origin.y, staff_lines.front()->from.y + layout.staff_spacing * 2.5F));
|
||||
BOOST_REQUIRE_GE(times.size(), 2U);
|
||||
BOOST_TEST(near(times[0]->origin.y, staff_lines.front()->from.y + layout.staff_spacing * 1.5F));
|
||||
BOOST_TEST(near(times[1]->origin.y, staff_lines.front()->from.y + layout.staff_spacing * 3.5F));
|
||||
}
|
||||
|
||||
BOOST_AUTO_TEST_CASE(score_layout_attaches_stems_to_notehead_anchors) {
|
||||
@@ -337,8 +345,10 @@ BOOST_AUTO_TEST_CASE(score_layout_attaches_stems_to_notehead_anchors) {
|
||||
BOOST_REQUIRE_EQUAL(heads.size(), 1U);
|
||||
BOOST_REQUIRE_EQUAL(stems.size(), 1U);
|
||||
|
||||
BOOST_TEST(near(stems.front()->from.x, heads.front()->origin.x + layout.staff_spacing * 1.336F));
|
||||
BOOST_TEST(near(stems.front()->from.y, heads.front()->origin.y - layout.staff_spacing * 0.288F));
|
||||
BOOST_TEST(stems.front()->from.x < heads.front()->bounds.x + heads.front()->bounds.width);
|
||||
BOOST_TEST(stems.front()->from.x > heads.front()->bounds.x + heads.front()->bounds.width - layout.staff_spacing * 0.25F);
|
||||
BOOST_TEST(stems.front()->from.y > heads.front()->bounds.y);
|
||||
BOOST_TEST(stems.front()->from.y < heads.front()->bounds.y + heads.front()->bounds.height);
|
||||
BOOST_TEST(stems.front()->to.y < stems.front()->from.y);
|
||||
}
|
||||
|
||||
@@ -403,3 +413,66 @@ BOOST_AUTO_TEST_CASE(score_layout_beams_eighth_tuplets_and_labels_them) {
|
||||
BOOST_REQUIRE_EQUAL(tuplets.size(), 1U);
|
||||
BOOST_TEST(tuplets.front()->text == "3");
|
||||
}
|
||||
|
||||
BOOST_AUTO_TEST_CASE(score_layout_keeps_dense_notation_inside_measure_guard) {
|
||||
auto first = note_with_ticks({pitch('c', "#")}, 2048);
|
||||
auto second = note_with_ticks({pitch('d', "#")}, 2048);
|
||||
auto third = note_with_ticks({pitch('e', "n")}, 6144);
|
||||
auto fourth = note_with_ticks({pitch('f', "#")}, 4096);
|
||||
auto fifth = note_with_ticks({pitch('g', "#")}, 2048);
|
||||
fourth.tie_to_next = true;
|
||||
|
||||
auto score = score_with_measure({
|
||||
.time_signature = "4/4",
|
||||
.key_signature = "C",
|
||||
.notes = {std::move(first), std::move(second), std::move(third), std::move(fourth), std::move(fifth)},
|
||||
});
|
||||
auto layout = vamp_zero::layout_score_page({.x = 0.0F, .y = 0.0F, .width = 976.0F, .height = 484.0F}, score, 0U);
|
||||
|
||||
auto barlines = layout_items(layout, vamp_zero::score_layout_item_role::FINAL_BARLINE, 0U, 0U);
|
||||
BOOST_REQUIRE_EQUAL(barlines.size(), 1U);
|
||||
auto guarded_right = barlines.front()->from.x - layout.staff_spacing;
|
||||
auto roles = {
|
||||
vamp_zero::score_layout_item_role::NOTEHEAD,
|
||||
vamp_zero::score_layout_item_role::ACCIDENTAL,
|
||||
vamp_zero::score_layout_item_role::STEM,
|
||||
vamp_zero::score_layout_item_role::FLAG,
|
||||
vamp_zero::score_layout_item_role::BEAM,
|
||||
vamp_zero::score_layout_item_role::DOT,
|
||||
vamp_zero::score_layout_item_role::TIE,
|
||||
};
|
||||
for (auto role : roles) {
|
||||
for (auto const* item : layout_items(layout, role, 0U, 0U)) {
|
||||
BOOST_TEST(right_edge(*item) <= guarded_right);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
BOOST_AUTO_TEST_CASE(score_layout_raises_chord_symbols_above_high_notation) {
|
||||
auto high = note({pitch('c', "n", 6)});
|
||||
high.chord_symbol = "Cmaj7";
|
||||
auto score = score_with_notes({std::move(high)});
|
||||
auto layout = vamp_zero::layout_score_page({.x = 0.0F, .y = 0.0F, .width = 976.0F, .height = 484.0F}, score, 0U);
|
||||
|
||||
auto chords = layout_items(layout, vamp_zero::score_layout_item_role::CHORD_SYMBOL, 0U, 0U);
|
||||
BOOST_REQUIRE_EQUAL(chords.size(), 1U);
|
||||
auto top_y = std::numeric_limits<std::float32_t>::max();
|
||||
auto roles = {
|
||||
vamp_zero::score_layout_item_role::NOTEHEAD,
|
||||
vamp_zero::score_layout_item_role::ACCIDENTAL,
|
||||
vamp_zero::score_layout_item_role::STEM,
|
||||
vamp_zero::score_layout_item_role::FLAG,
|
||||
vamp_zero::score_layout_item_role::BEAM,
|
||||
vamp_zero::score_layout_item_role::DOT,
|
||||
vamp_zero::score_layout_item_role::TUPLET,
|
||||
vamp_zero::score_layout_item_role::TUPLET_BRACKET,
|
||||
vamp_zero::score_layout_item_role::TIE,
|
||||
};
|
||||
for (auto role : roles) {
|
||||
for (auto const* item : layout_items(layout, role, 0U, 0U)) {
|
||||
top_y = std::min(top_y, item->bounds.y);
|
||||
}
|
||||
}
|
||||
BOOST_TEST(right_edge(*chords.front()) <= layout.bounds.x + layout.bounds.width);
|
||||
BOOST_TEST(chords.front()->bounds.y + chords.front()->bounds.height <= top_y - layout.staff_spacing * 0.40F);
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user