Verovio
Source code documentation
alignfunctor.h
1 // Name: alignfunctor.h
3 // Author: David Bauer
4 // Created: 2023
5 // Copyright (c) Authors and others. All rights reserved.
7 
8 #ifndef __VRV_ALIGNFUNCTOR_H__
9 #define __VRV_ALIGNFUNCTOR_H__
10 
11 #include "functor.h"
12 
13 namespace vrv {
14 
15 //----------------------------------------------------------------------------
16 // AlignMeterParams
17 //----------------------------------------------------------------------------
22  const MeterSig *meterSig = NULL;
23  const Mensur *mensur = NULL;
24  // Not const since we are cumulating proportion
25  Proport *proport = NULL;
26  data_DURATION equivalence = DURATION_brevis;
27  bool metcon = true;
28 };
29 
30 //----------------------------------------------------------------------------
31 // AlignHorizontallyFunctor
32 //----------------------------------------------------------------------------
33 
41 public:
47  virtual ~AlignHorizontallyFunctor() = default;
49 
50  /*
51  * Abstract base implementation
52  */
53  bool ImplementsEndInterface() const override { return true; }
54 
55  /*
56  * Functor interface
57  */
59  FunctorCode VisitLayer(Layer *layer) override;
60  FunctorCode VisitLayerEnd(Layer *layer) override;
61  FunctorCode VisitLayerElement(LayerElement *layerElement) override;
62  FunctorCode VisitMeasure(Measure *measure) override;
63  FunctorCode VisitMeasureEnd(Measure *measure) override;
64  FunctorCode VisitMeterSigGrp(MeterSigGrp *meterSigGrp) override;
65  FunctorCode VisitStaff(Staff *staff) override;
66  FunctorCode VisitSystem(System *system) override;
68 
69 protected:
70  //
71 private:
72  //
73 public:
74  //
75 private:
76  // The measureAligner
77  MeasureAligner *m_measureAligner;
78  // The time
79  Fraction m_time;
80  // The current MeterSig, Mensur and Proport
81  AlignMeterParams m_currentParams;
82  // The current notation type
83  data_NOTATIONTYPE m_notationType;
84  // Indicates the state in processing the caution scoreDef
85  ElementScoreDefRole m_scoreDefRole;
86  // Indicates if we are in the first measure (for the scoreDef role)
87  bool m_isFirstMeasure;
88  // Indicates if we have multiple layer alignment references in the measure
89  bool m_hasMultipleLayer;
90 };
91 
92 //----------------------------------------------------------------------------
93 // AlignMeasuresFunctor
94 //----------------------------------------------------------------------------
95 
101 public:
107  virtual ~AlignMeasuresFunctor() = default;
109 
110  /*
111  * Abstract base implementation
112  */
113  bool ImplementsEndInterface() const override { return true; }
114 
115  /*
116  * Set if castoff system widths should be stored
117  */
118  void StoreCastOffSystemWidths(bool storeWidths) { m_storeCastOffSystemWidths = storeWidths; }
119 
120  /*
121  * Functor interface
122  */
124  FunctorCode VisitDiv(Div *div) override;
125  FunctorCode VisitMeasure(Measure *measure) override;
126  FunctorCode VisitScoreDef(ScoreDef *scoreDef) override;
127  FunctorCode VisitSection(Section *section) override;
128  FunctorCode VisitSystem(System *system) override;
129  FunctorCode VisitSystemEnd(System *system) override;
131 
132 protected:
133  //
134 private:
135  //
136 public:
137  //
138 private:
139  // The cumulated shift
140  int m_shift;
141  // The cumulated justifiable width
142  int m_justifiableWidth;
143  // Shift next measure due to section restart?
144  bool m_applySectionRestartShift;
145  // Store castoff system widths if true
146  bool m_storeCastOffSystemWidths;
147 };
148 
149 //----------------------------------------------------------------------------
150 // AlignVerticallyFunctor
151 //----------------------------------------------------------------------------
152 
158 public:
164  virtual ~AlignVerticallyFunctor() = default;
166 
167  /*
168  * Abstract base implementation
169  */
170  bool ImplementsEndInterface() const override { return true; }
171 
172  /*
173  * Functor interface
174  */
176  FunctorCode VisitDiv(Div *div) override;
177  FunctorCode VisitFig(Fig *fig) override;
178  FunctorCode VisitMeasure(Measure *measure) override;
179  FunctorCode VisitPageEnd(Page *page) override;
180  FunctorCode VisitRend(Rend *rend) override;
181  FunctorCode VisitRunningElement(RunningElement *runningElement) override;
182  FunctorCode VisitStaff(Staff *staff) override;
183  FunctorCode VisitStaffAlignmentEnd(StaffAlignment *staffAlignment) override;
184  FunctorCode VisitSyllable(Syllable *syllable) override;
185  FunctorCode VisitSystem(System *system) override;
186  FunctorCode VisitSystemEnd(System *system) override;
187  FunctorCode VisitVerse(Verse *verse) override;
189 
190 protected:
191  //
192 private:
193  //
194 public:
195  //
196 private:
197  // The systemAligner
198  SystemAligner *m_systemAligner;
199  // The staff index
200  int m_staffIdx;
201  // The staffN
202  int m_staffN;
203  // The cumulated shift for the default alignment
204  int m_cumulatedShift;
205  // The sum of justification factors per page
206  int m_justificationSum;
207  // The page width - used for setting the horizontal position of <rend> withing text layout elements
208  int m_pageWidth;
209 };
210 
211 //----------------------------------------------------------------------------
212 // AlignSystemsFunctor
213 //----------------------------------------------------------------------------
214 
219 public:
224  AlignSystemsFunctor(Doc *doc);
225  virtual ~AlignSystemsFunctor() = default;
227 
228  /*
229  * Abstract base implementation
230  */
231  bool ImplementsEndInterface() const override { return true; }
232 
233  /*
234  * Setter for shift and spacing
235  */
237  void SetShift(int shift) { m_shift = shift; }
238  void SetSystemSpacing(int spacing) { m_systemSpacing = spacing; }
240 
241  /*
242  * Functor interface
243  */
245  FunctorCode VisitPage(Page *page) override;
246  FunctorCode VisitPageEnd(Page *page) override;
247  FunctorCode VisitSystem(System *system) override;
249 
250 protected:
251  //
252 private:
253  //
254 public:
255  //
256 private:
257  // The cumulated shift
258  int m_shift;
259  // The system margin
260  int m_systemSpacing;
261  // The (clef) overflow below of the previous system
262  int m_prevBottomOverflow;
263  int m_prevBottomClefOverflow;
264  // The sum of justification factors per page
265  double m_justificationSum;
266 };
267 
268 } // namespace vrv
269 
270 #endif // __VRV_ALIGNFUNCTOR_H__
This class aligns horizontally the content of a page.
Definition: alignfunctor.h:40
bool ImplementsEndInterface() const override
Return true if the functor implements the end interface.
Definition: alignfunctor.h:53
This class aligns the measures by adjusting the m_drawingXRel position looking at the MeasureAligner.
Definition: alignfunctor.h:100
bool ImplementsEndInterface() const override
Return true if the functor implements the end interface.
Definition: alignfunctor.h:113
This class aligns the system by adjusting the m_drawingYRel position looking at the SystemAligner.
Definition: alignfunctor.h:218
bool ImplementsEndInterface() const override
Return true if the functor implements the end interface.
Definition: alignfunctor.h:231
This class vertically aligns the content of a page.
Definition: alignfunctor.h:157
bool ImplementsEndInterface() const override
Return true if the functor implements the end interface.
Definition: alignfunctor.h:170
This class represents an MEI Div.
Definition: div.h:24
This abstract class is the base class for all mutable functors that need access to the document.
Definition: functor.h:151
This class is a hold the data and corresponds to the model of a MVC design pattern.
Definition: doc.h:41
This class models the MEI <fig> element.
Definition: fig.h:23
Definition: fraction.h:19
This class is a base class for the Layer (<layer>) content.
Definition: layerelement.h:51
This class represents a layer in a laid-out score (Doc).
Definition: layer.h:39
This class aligns the content of a measure It contains a vector of Alignment.
Definition: horizontalaligner.h:425
This class represents a measure in a page-based score (Doc).
Definition: measure.h:46
This class models the MEI <mensur> element.
Definition: mensur.h:34
This class represents a MEI meterSigGrp.
Definition: metersiggrp.h:32
This class models the MEI <meterSig> element.
Definition: metersig.h:34
This class represents a page in a laid-out score (Doc).
Definition: page.h:31
This class models the MEI <proport> element.
Definition: proport.h:23
This class models the MEI <rend> element.
Definition: rend.h:33
This class represents running elements (headers and footers).
Definition: runningelement.h:28
This class stores an alignement position staves will point to.
Definition: verticalaligner.h:172
This class represents a staff in a laid-out score (Doc).
Definition: staff.h:107
This class models the MEI <mensur> element.
Definition: syllable.h:25
This class aligns the content of a system It contains a vector of StaffAlignment.
Definition: verticalaligner.h:31
This class represents a system in a laid-out score (Doc).
Definition: system.h:36
Definition: verse.h:28
Regroup pointers to meterSig, mensur and proport objects.
Definition: alignfunctor.h:21