#pragma once #include #include #include #include #include #include #include #include namespace vamp_zero { enum class score_accidental_mark { NONE, FLAT, NATURAL, SHARP, DOUBLE_FLAT, DOUBLE_SHARP, TRIPLE_FLAT, TRIPLE_SHARP, }; enum class score_layout_item_kind { FILL_RECT, STROKE_RECT, STROKE_LINE, CURVE, GLYPH, TEXT, }; enum class score_layout_item_role { PAPER, BORDER, STAFF_LINE, BARLINE, FINAL_BARLINE, CLEF, KEY_SIGNATURE, TIME_SIGNATURE, NOTEHEAD, REST, ACCIDENTAL, STEM, FLAG, BEAM, DOT, TIE, TUPLET, TUPLET_BRACKET, OCTAVE_SHIFT, TREMOLO, TITLE, COMPOSER, PART, PAGE_NUMBER, MEASURE_NUMBER, SECTION_LABEL, CHORD_SYMBOL, LYRIC, }; struct score_layout_item { vamp_zero::score_layout_item_kind kind{}; vamp_zero::score_layout_item_role role{}; luma::rect bounds{}; luma::point origin{}; luma::point from{}; luma::point control{}; luma::point to{}; luma::color color{}; std::float32_t thickness{}; std::float32_t staff_spacing{}; std::int32_t codepoint{}; std::int32_t text_scale{}; std::float32_t text_size_multiplier{1.0F}; std::size_t system_index{std::numeric_limits::max()}; std::size_t measure_index{std::numeric_limits::max()}; std::size_t note_index{std::numeric_limits::max()}; std::string text{}; }; struct score_page_layout { luma::rect bounds{}; std::float32_t staff_spacing{}; std::vector items{}; }; struct score_system_range { std::size_t first_measure{}; std::size_t measure_count{}; std::size_t first_note{}; std::size_t note_count{std::numeric_limits::max()}; }; constexpr auto score_measures_per_system = std::size_t{4}; constexpr auto score_systems_per_page = std::size_t{3}; auto notated_accidentals_for_measure(vamp_zero::score_measure const& measure, std::string_view inherited_key_signature) -> std::vector; auto score_system_ranges(vamp_zero::score_document const& score) -> std::vector; auto score_page_count(vamp_zero::score_document const& score) -> std::size_t; auto layout_score_page(luma::rect bounds, vamp_zero::score_document const& score, std::size_t page_index) -> vamp_zero::score_page_layout; auto draw_score_layout(luma::draw_context& context, vamp_zero::score_page_layout const& layout) -> void; auto draw_score_page(luma::draw_context& context, luma::rect bounds, vamp_zero::score_document const& score, std::size_t page_index) -> void; }