Verovio
Source code documentation
view.h
1 // Name: view.h
3 // Author: Laurent Pugin
4 // Created: 2010
5 // Copyright (c) Authors and others. All rights reserved.
7 
8 #ifndef __VRV_RENDERER_H__
9 #define __VRV_RENDERER_H__
10 
11 #include <optional>
12 
13 #include "devicecontextbase.h"
14 #include "scoredef.h"
15 #include "textelement.h"
16 #include "vrvdef.h"
17 
18 namespace vrv {
19 
20 class Accid;
21 class AnnotScore;
22 class Arpeg;
23 class BarLine;
24 class Beam;
25 class BeamSegment;
26 class BeamSpan;
27 class BracketSpan;
28 class Breath;
29 class Caesura;
30 class Chord;
31 class ControlElement;
32 class DeviceContext;
33 class Dir;
34 class Div;
35 class DivLine;
36 class Doc;
37 class Dynam;
38 class EditorialElement;
39 class Ending;
40 class F;
41 class Fb;
42 class Fig;
43 class Fing;
44 class FloatingCurvePositioner;
45 class Fermata;
46 class Gliss;
47 class Graphic;
48 class Hairpin;
49 class Harm;
50 class KeyAccid;
51 class Layer;
52 class LayerElement;
53 class Lb;
54 class Liquescent;
55 class Measure;
56 class MNum;
57 class Mordent;
58 class Nc;
59 class Neume;
60 class Num;
61 class Octave;
62 class Options;
63 class Ornam;
64 class Page;
65 class PageElement;
66 class Pedal;
67 class PgFoot;
68 class PgHead;
69 class PitchInflection;
70 class Reh;
71 class Rend;
72 class RepeatMark;
73 class RunningElement;
74 class Slur;
75 class Staff;
76 class Svg;
77 class Syl;
78 class Syllable;
79 class Symbol;
80 class SymbolDef;
81 class System;
82 class SystemElement;
83 class Tempo;
84 class Text;
85 class TextDrawingParams;
86 class TextElement;
87 class TextLayoutElement;
88 class Tie;
89 class Trill;
90 class Turn;
91 class Tuplet;
92 class TupletBracket;
93 class TupletNum;
94 class Verse;
95 
96 // Helper enums
97 enum class SlurHandling { Ignore, Initialize, Drawing };
98 
99 //----------------------------------------------------------------------------
100 // View
101 //----------------------------------------------------------------------------
102 
106 class View {
107 public:
110  View();
111  virtual ~View();
113 
118 
123  void SetDoc(Doc *doc);
124 
132  int ToDeviceContextX(int i);
133  int ToLogicalX(int i);
134  int ToDeviceContextY(int i);
135  int ToLogicalY(int i);
136  Point ToDeviceContext(Point p);
137  Point ToLogical(Point p);
139 
146  void SetPage(Page *page, bool doLayout);
147 
156  void DrawCurrentPage(DeviceContext *dc, bool background = true);
157 
161  double GetPPUFactor() const;
162 
168  int CalculatePitchCode(Layer *layer, int y_n, int x_pos, int *octave);
170 
175  SlurHandling GetSlurHandling() const { return m_slurHandling; }
176  void SetSlurHandling(SlurHandling slurHandling) { m_slurHandling = slurHandling; }
178 
179 protected:
186  void DrawPageElement(DeviceContext *dc, PageElement *element);
187  void DrawSystem(DeviceContext *dc, System *system);
188  void DrawSystemList(DeviceContext *dc, System *system, const ClassId classId);
189  void DrawScoreDef(DeviceContext *dc, ScoreDef *scoreDef, Measure *measure, int x, BarLine *barLine = NULL,
190  bool isLastMeasure = false, bool isLastSystem = false);
191  void DrawStaffGrp(DeviceContext *dc, Measure *measure, StaffGrp *staffGrp, int x, bool topStaffGrp = false,
192  bool abbreviations = false);
193  void DrawStaffDef(DeviceContext *dc, Staff *staff, Measure *measure);
194  void DrawStaffDefCautionary(DeviceContext *dc, Staff *staff, Measure *measure);
195  void DrawStaffDefLabels(DeviceContext *dc, Measure *measure, StaffGrp *staffGrp, int x, bool abbreviations = false);
196  void DrawGrpSym(DeviceContext *dc, Measure *measure, StaffGrp *staffGrp, int &x);
197  void DrawLabels(DeviceContext *dc, ScoreDef *scoreDef, Object *object, int x, int y, bool abbreviations,
198  int staffSize, int space);
199  void DrawBracket(DeviceContext *dc, int x, int y1, int y2, int staffSize);
200  void DrawBracketSq(DeviceContext *dc, int x, int y1, int y2, int staffSize);
201  void DrawBrace(DeviceContext *dc, int x, int y1, int y2, int staffSize);
202  void DrawBarLines(DeviceContext *dc, Measure *measure, StaffGrp *staffGrp, BarLine *barLine, bool isLastMeasure,
203  bool isLastSystem, int &yBottomPrevious);
204  void DrawBarLine(DeviceContext *dc, int yTop, int yBottom, BarLine *barLine, data_BARRENDITION form,
205  bool inStaffSpace = false, bool eraseIntersections = false);
206  void DrawBarLineDots(DeviceContext *dc, Staff *staff, BarLine *barLine);
207  void DrawLedgerLines(DeviceContext *dc, Staff *staff, const ArrayOfLedgerLines &lines, bool below, bool cueSize);
208  void DrawMeasure(DeviceContext *dc, Measure *measure, System *system);
209  void DrawMeterSigGrp(DeviceContext *dc, Layer *layer, Staff *staff);
210  void DrawMNum(DeviceContext *dc, MNum *mnum, Measure *measure, System *system, int yOffset);
211  void DrawStaff(DeviceContext *dc, Staff *staff, Measure *measure, System *system);
212  void DrawStaffLines(DeviceContext *dc, Staff *staff, StaffDef *staffDef, Measure *measure, System *system);
213  void DrawLayer(DeviceContext *dc, Layer *layer, Staff *staff, Measure *measure);
214  void DrawLayerList(DeviceContext *dc, Layer *layer, Staff *staff, Measure *measure, const ClassId classId);
215  void DrawLayerDefLabels(
216  DeviceContext *dc, ScoreDef *scoreDef, Staff *staff, StaffDef *staffDef, int x, bool abbreviations = false);
217  void DrawSystemDivider(DeviceContext *dc, System *system, Measure *firstMeasure);
219 
225  void DrawDiv(DeviceContext *dc, Div *div, System *system);
226  void DrawRunningElements(DeviceContext *dc, Page *page);
227  void DrawTextLayoutElement(DeviceContext *dc, TextLayoutElement *textLayoutElement);
229 
239  void DrawSystemChildren(DeviceContext *dc, Object *parent, System *system);
240  void DrawMeasureChildren(DeviceContext *dc, Object *parent, Measure *measure, System *system);
241  void DrawStaffChildren(DeviceContext *dc, Object *parent, Staff *staff, Measure *measure);
242  void DrawLayerChildren(DeviceContext *dc, Object *parent, Layer *layer, Staff *staff, Measure *measure);
243  void DrawTextChildren(DeviceContext *dc, Object *parent, TextDrawingParams &params);
244  void DrawFbChildren(DeviceContext *dc, Object *parent, TextDrawingParams &params);
245  void DrawRunningChildren(DeviceContext *dc, Object *parent, TextDrawingParams &params);
247 
253  void DrawSystemEditorialElement(DeviceContext *dc, EditorialElement *element, System *system);
254  void DrawMeasureEditorialElement(DeviceContext *dc, EditorialElement *element, Measure *measure, System *system);
255  void DrawStaffEditorialElement(DeviceContext *dc, EditorialElement *element, Staff *staff, Measure *measure);
256  void DrawLayerEditorialElement(
257  DeviceContext *dc, EditorialElement *element, Layer *layer, Staff *staff, Measure *measure);
258  void DrawTextEditorialElement(DeviceContext *dc, EditorialElement *element, TextDrawingParams &params);
259  void DrawFbEditorialElement(DeviceContext *dc, EditorialElement *element, TextDrawingParams &params);
260  void DrawRunningEditorialElement(DeviceContext *dc, EditorialElement *element, TextDrawingParams &params);
262 
268  void DrawAnnot(DeviceContext *dc, EditorialElement *element, bool isTextElement = false);
270 
278  void DrawLayerElement(DeviceContext *dc, LayerElement *element, Layer *layer, Staff *staff, Measure *measure);
280 
289  void DrawAccid(DeviceContext *dc, LayerElement *element, Layer *layer, Staff *staff, Measure *measure);
290  void DrawArtic(DeviceContext *dc, LayerElement *element, Layer *layer, Staff *staff, Measure *measure);
291  void DrawBarLine(DeviceContext *dc, LayerElement *element, Layer *layer, Staff *staff, Measure *measure);
292  void DrawBeatRpt(DeviceContext *dc, LayerElement *element, Layer *layer, Staff *staff, Measure *measure);
293  void DrawBTrem(DeviceContext *dc, LayerElement *element, Layer *layer, Staff *staff, Measure *measure);
294  void DrawChord(DeviceContext *dc, LayerElement *element, Layer *layer, Staff *staff, Measure *measure);
295  void DrawClef(DeviceContext *dc, LayerElement *element, Layer *layer, Staff *staff, Measure *measure);
296  void DrawCustos(DeviceContext *dc, LayerElement *element, Layer *layer, Staff *staff, Measure *measure);
297  void DrawDot(DeviceContext *dc, LayerElement *element, Layer *layer, Staff *staff, Measure *measure);
298  void DrawDots(DeviceContext *dc, LayerElement *element, Layer *layer, Staff *staff, Measure *measure);
299  void DrawDurationElement(DeviceContext *dc, LayerElement *element, Layer *layer, Staff *staff, Measure *measure);
300  void DrawFlag(DeviceContext *dc, LayerElement *element, Layer *layer, Staff *staff, Measure *measure);
301  void DrawGenericLayerElement(
302  DeviceContext *dc, LayerElement *element, Layer *layer, Staff *staff, Measure *measure);
303  void DrawGraceGrp(DeviceContext *dc, LayerElement *element, Layer *layer, Staff *staff, Measure *measure);
304  void DrawHalfmRpt(DeviceContext *dc, LayerElement *element, Layer *layer, Staff *staff, Measure *measure);
305  void DrawKeySig(DeviceContext *dc, LayerElement *element, Layer *layer, Staff *staff, Measure *measure);
306  void DrawLigature(DeviceContext *dc, LayerElement *element, Layer *layer, Staff *staff, Measure *measure);
307  void DrawMeterSig(DeviceContext *dc, LayerElement *element, Layer *layer, Staff *staff, Measure *measure);
308  void DrawMRest(DeviceContext *dc, LayerElement *element, Layer *layer, Staff *staff, Measure *measure);
309  void DrawMRpt(DeviceContext *dc, LayerElement *element, Layer *layer, Staff *staff, Measure *measure);
310  void DrawMRpt2(DeviceContext *dc, LayerElement *element, Layer *layer, Staff *staff, Measure *measure);
311  void DrawMSpace(DeviceContext *dc, LayerElement *element, Layer *layer, Staff *staff, Measure *measure);
312  void DrawMultiRest(DeviceContext *dc, LayerElement *element, Layer *layer, Staff *staff, Measure *measure);
313  void DrawMultiRpt(DeviceContext *dc, LayerElement *element, Layer *layer, Staff *staff, Measure *measure);
314  void DrawNote(DeviceContext *dc, LayerElement *element, Layer *layer, Staff *staff, Measure *measure);
315  void DrawRest(DeviceContext *dc, LayerElement *element, Layer *layer, Staff *staff, Measure *measure);
316  void DrawSpace(DeviceContext *dc, LayerElement *element, Layer *layer, Staff *staff, Measure *measure);
317  void DrawStem(DeviceContext *dc, LayerElement *element, Layer *layer, Staff *staff, Measure *measure);
318  void DrawStemMod(DeviceContext *dc, LayerElement *element, Staff *staff);
319  void DrawSyl(DeviceContext *dc, LayerElement *element, Layer *layer, Staff *staff, Measure *measure);
320  void DrawTuplet(DeviceContext *dc, LayerElement *element, Layer *layer, Staff *staff, Measure *measure);
321  void DrawVerse(DeviceContext *dc, LayerElement *element, Layer *layer, Staff *staff, Measure *measure);
323 
331  void DrawAcciaccaturaSlash(DeviceContext *dc, Stem *stem, Staff *staff);
332  void DrawChordCluster(DeviceContext *dc, Chord *chord, Layer *layer, Staff *staff, Measure *measure);
333  void DrawClefEnclosing(DeviceContext *dc, Clef *clef, Staff *staff, char32_t glyph, int x, int y);
334  void DrawDotsPart(DeviceContext *dc, int x, int y, unsigned char dots, const Staff *staff, bool dimin = false);
335  void DrawKeySigCancellation(
336  DeviceContext *dc, KeySig *keySig, Staff *staff, Clef *clef, int clefLocOffset, int beginCancel, int &x);
337  void DrawKeyAccid(DeviceContext *dc, KeyAccid *keyAccid, Staff *staff, Clef *clef, int clefLocOffset, int &x);
338  void DrawMeterSig(DeviceContext *dc, MeterSig *meterSig, Staff *staff, int horizOffset);
340  int DrawMeterSigFigures(DeviceContext *dc, int x, int y, MeterSig *meterSig, int den, Staff *staff);
341  void DrawMRptPart(DeviceContext *dc, int xCentered, char32_t smulfCode, int num, bool line, Staff *staff);
343 
350  void DrawTextElement(DeviceContext *dc, TextElement *element, TextDrawingParams &params);
352 
358  void DrawFb(DeviceContext *dc, Staff *staff, Fb *element, TextDrawingParams &params);
359  void DrawF(DeviceContext *dc, F *figure, TextDrawingParams &params);
360 
362 
371  void DrawFig(DeviceContext *dc, Fig *fig, TextDrawingParams &params);
372  void DrawLb(DeviceContext *dc, Lb *lb, TextDrawingParams &params);
373  void DrawNum(DeviceContext *dc, Num *num, TextDrawingParams &params);
374  void DrawRend(DeviceContext *dc, Rend *rend, TextDrawingParams &params);
375  void DrawGraphic(DeviceContext *dc, Graphic *graphic, TextDrawingParams &params, int staffSize, bool dimin);
376  void DrawSvg(DeviceContext *dc, Svg *svg, TextDrawingParams &params, int staffSize, bool dimin);
377  void DrawSymbol(DeviceContext *dc, Symbol *symbol, TextDrawingParams &params);
378  void DrawText(DeviceContext *dc, Text *text, TextDrawingParams &params);
379  void DrawTextEnclosure(DeviceContext *dc, const TextDrawingParams &params, int staffSize);
380 
386  void DrawBeam(DeviceContext *dc, LayerElement *element, Layer *layer, Staff *staff, Measure *measure);
387  void DrawFTrem(DeviceContext *dc, LayerElement *element, Layer *layer, Staff *staff, Measure *measure);
388  void DrawBeamSpan(DeviceContext *dc, BeamSpan *beamSpan, System *system, Object *graphic = NULL);
390 
396  void DrawDivLine(DeviceContext *dc, LayerElement *element, Layer *layer, Staff *staff, Measure *measure);
397  void DrawSyllable(DeviceContext *dc, LayerElement *element, Layer *layer, Staff *staff, Measure *measure);
398  void DrawLiquescent(DeviceContext *dc, LayerElement *element, Layer *layer, Staff *staff, Measure *measure);
399  void DrawNc(DeviceContext *dc, LayerElement *element, Layer *layer, Staff *staff, Measure *measure);
400  void DrawNeume(DeviceContext *dc, LayerElement *element, Layer *layer, Staff *staff, Measure *measure);
401  void DrawOriscus(DeviceContext *dc, LayerElement *element, Layer *layer, Staff *staff, Measure *measure);
402  void DrawQuilisma(DeviceContext *dc, LayerElement *element, Layer *layer, Staff *staff, Measure *measure);
404 
410  void DrawNcAsNotehead(DeviceContext *dc, Nc *nc, Layer *layer, Staff *staff, Measure *measure);
411  void DrawNcGlyphs(DeviceContext *dc, Nc *nc, Staff *staff);
413 
421  void DrawControlElement(DeviceContext *dc, ControlElement *element, Measure *measure, System *system);
422  void DrawTimeSpanningElement(DeviceContext *dc, Object *element, System *system);
423  void DrawArpeg(DeviceContext *dc, Arpeg *arpeg, Measure *measure, System *system);
424  void DrawArpegEnclosing(DeviceContext *dc, Arpeg *arpeg, Staff *staff, char32_t startGlyph, char32_t fillGlyph,
425  char32_t endGlyph, int x, int y, int height, bool cueSize);
426  void DrawBreath(DeviceContext *dc, Breath *breath, Measure *measure, System *system);
427  void DrawCaesura(DeviceContext *dc, Caesura *caesura, Measure *measure, System *system);
428  void DrawControlElementText(DeviceContext *dc, ControlElement *element, Measure *measure, System *system);
429  void DrawDynam(DeviceContext *dc, Dynam *dynam, Measure *measure, System *system);
430  void DrawDynamSymbolOnly(DeviceContext *dc, Staff *staff, Dynam *dynam, const std::u32string &dynamSymbol,
431  data_HORIZONTALALIGNMENT alignment, TextDrawingParams &params);
432  void DrawFermata(DeviceContext *dc, Fermata *fermata, Measure *measure, System *system);
433  void DrawFing(DeviceContext *dc, Fing *fing, Measure *measure, System *system);
434  void DrawHarm(DeviceContext *dc, Harm *harm, Measure *measure, System *system);
435  void DrawMordent(DeviceContext *dc, Mordent *mordent, Measure *measure, System *system);
436  void DrawPedal(DeviceContext *dc, Pedal *pedal, Measure *measure, System *system);
437  void DrawReh(DeviceContext *dc, Reh *reh, Measure *measure, System *system);
438  void DrawRepeatMark(DeviceContext *dc, RepeatMark *repeatMark, Measure *measure, System *system);
439  void DrawTempo(DeviceContext *dc, Tempo *tempo, Measure *measure, System *system);
440  void DrawTrill(DeviceContext *dc, Trill *trill, Measure *measure, System *system);
441  void DrawTurn(DeviceContext *dc, Turn *turn, Measure *measure, System *system);
443 
449  void DrawControlElementConnector(DeviceContext *dc, ControlElement *element, int x1, int x2, Staff *staff,
450  char spanningType, Object *graphic = NULL);
451  void DrawAnnotScore(DeviceContext *dc, AnnotScore *annotScore, int x1, int x2, Staff *staff, char spanningType,
452  Object *graphic = NULL);
453  void DrawBracketSpan(DeviceContext *dc, BracketSpan *bracketSpan, int x1, int x2, Staff *staff, char spanningType,
454  Object *graphic = NULL);
455  void DrawFConnector(
456  DeviceContext *dc, F *f, int x1, int x2, Staff *staff, char spanningType, Object *graphic = NULL);
457  void DrawGliss(
458  DeviceContext *dc, Gliss *gliss, int x1, int x2, Staff *staff, char spanningType, Object *graphic = NULL);
459  void DrawHairpin(
460  DeviceContext *dc, Hairpin *hairpin, int x1, int x2, Staff *staff, char spanningType, Object *graphic = NULL);
461  void DrawOctave(
462  DeviceContext *dc, Octave *octave, int x1, int x2, Staff *staff, char spanningType, Object *graphic = NULL);
463  void DrawPedalLine(
464  DeviceContext *dc, Pedal *pedal, int x1, int x2, Staff *staff, char spanningType, Object *graphic = NULL);
465  void DrawPitchInflection(DeviceContext *dc, PitchInflection *pitchInflection, int x1, int x2, Staff *staff,
466  char spanningType, Object *graphic = NULL);
467  void DrawSlur(
468  DeviceContext *dc, Slur *slur, int x1, int x2, Staff *staff, char spanningType, Object *graphic = NULL);
469  void DrawTie(DeviceContext *dc, Tie *tie, int x1, int x2, Staff *staff, char spanningType, Object *graphic = NULL);
470  void DrawTrillExtension(
471  DeviceContext *dc, Trill *trill, int x1, int x2, Staff *staff, char spanningType, Object *graphic = NULL);
472  void DrawSylConnector(
473  DeviceContext *dc, Syl *syl, int x1, int x2, Staff *staff, char spanningType, Object *graphic = NULL);
475 
480  void DrawSylConnectorLines(DeviceContext *dc, int x1, int x2, int y, Syl *syl, Staff *staff);
482 
489  void DrawSystemElement(DeviceContext *dc, SystemElement *element, System *system);
490  void DrawEnding(DeviceContext *dc, Ending *ending, System *system);
492 
501  void DrawMensur(DeviceContext *dc, LayerElement *element, Layer *layer, Staff *staff, Measure *measure);
502  void DrawMensuralNote(DeviceContext *dc, LayerElement *element, Layer *layer, Staff *staff, Measure *measure);
503  void DrawDotInLigature(DeviceContext *dc, LayerElement *element, Layer *layer, Staff *staff, Measure *measure);
504  void DrawPlica(DeviceContext *dc, LayerElement *element, Layer *layer, Staff *staff, Measure *measure);
505  void DrawProport(DeviceContext *dc, LayerElement *element, Layer *layer, Staff *staff, Measure *measure);
507 
513  void DrawMensuralStem(DeviceContext *dc, Note *note, Staff *staff, data_STEMDIRECTION dir, int xn, int originY);
514  void DrawMaximaToBrevis(DeviceContext *dc, int y, LayerElement *element, Layer *layer, Staff *staff);
515  void DrawProportFigures(DeviceContext *dc, int x, int y, int num, int numBase, Staff *staff);
516  void DrawLigatureNote(DeviceContext *dc, LayerElement *element, Layer *layer, Staff *staff);
518 
527  void DrawTabClef(DeviceContext *dc, LayerElement *element, Layer *layer, Staff *staff, Measure *measure);
528  void DrawTabDurSym(DeviceContext *dc, LayerElement *element, Layer *layer, Staff *staff, Measure *measure);
529  void DrawTabGrp(DeviceContext *dc, LayerElement *element, Layer *layer, Staff *staff, Measure *measure);
530  void DrawTabNote(DeviceContext *dc, LayerElement *element, Layer *layer, Staff *staff, Measure *measure);
532 
538  void DrawTupletBracket(DeviceContext *dc, LayerElement *element, Layer *layer, Staff *staff, Measure *measure);
539  void DrawTupletNum(DeviceContext *dc, LayerElement *element, Layer *layer, Staff *staff, Measure *measure);
540 
546  void DrawVerticalLine(DeviceContext *dc, int y1, int y2, int x1, int width, int dashLength = 0, int gapLength = 0);
547  void DrawHorizontalLine(
548  DeviceContext *dc, int x1, int x2, int y1, int width, int dashLength = 0, int gapLength = 0);
549  void DrawObliqueLine(
550  DeviceContext *dc, int x1, int x2, int y1, int y2, int width, int dashLength = 0, int gapLength = 0);
551  void DrawVerticalSegmentedLine(
552  DeviceContext *dc, int x1, SegmentedLine &line, int width, int dashLength = 0, int gapLength = 0);
553  void DrawHorizontalSegmentedLine(
554  DeviceContext *dc, int y1, SegmentedLine &line, int width, int dashLength = 0, int gapLength = 0);
555  void DrawSmuflCode(
556  DeviceContext *dc, int x, int y, char32_t code, int staffSize, bool dimin, bool setBBGlyph = false);
557  // void DrawSmuflCodeWithCustomFont(DeviceContext *dc, const std::string &customFont, int x, int y, char32_t code,
558  // int staffSize, bool dimin, bool setBBGlyph = false);
559 
560  void DrawThickBezierCurve(
561  DeviceContext *dc, Point bezier[4], int thickness, int staffSize, int penWidth, PenStyle penStyle = PEN_SOLID);
562  void DrawTextString(DeviceContext *dc, const std::u32string &str, TextDrawingParams &params);
563  void DrawDirString(DeviceContext *dc, const std::u32string &str, TextDrawingParams &params);
564  void DrawDynamString(DeviceContext *dc, const std::u32string &str, TextDrawingParams &params, Rend *rend);
565  void DrawHarmString(DeviceContext *dc, const std::u32string &str, TextDrawingParams &params);
566  void DrawSmuflLine(DeviceContext *dc, Point orig, int length, int staffSize, bool dimin, char32_t fill,
567  char32_t start = 0, char32_t end = 0);
568  void DrawSmuflString(DeviceContext *dc, int x, int y, std::u32string s, data_HORIZONTALALIGNMENT alignment,
569  int staffSize = 100, bool dimin = false, bool setBBGlyph = false);
570  void DrawLyricString(DeviceContext *dc, const std::u32string &str, int staffSize = 100,
571  std::optional<TextDrawingParams> params = std::nullopt);
572  void DrawNotFilledEllipse(DeviceContext *dc, int x1, int y1, int x2, int y2, int lineThinkness);
573  void DrawFilledRectangle(DeviceContext *dc, int x1, int y1, int x2, int y2);
574  void DrawNotFilledRectangle(DeviceContext *dc, int x1, int y1, int x2, int y2, int lineThinkness, int radius);
575  void DrawFilledRoundedRectangle(DeviceContext *dc, int x1, int y1, int x2, int y2, int radius);
576  void DrawObliquePolygon(DeviceContext *dc, int x1, int y1, int x2, int y2, int height);
577  void DrawDiamond(DeviceContext *dc, int x1, int y1, int height, int width, bool fill, int linewidth);
578  void DrawDot(DeviceContext *dc, int x, int y, int staffSize, bool dimin = false);
579  void DrawSquareBracket(DeviceContext *dc, bool leftBracket, int x, int y, int height, int width,
580  int horizontalThickness, int verticalThickness);
581  void DrawEnclosingBrackets(DeviceContext *dc, int x, int y, int height, int width, int offset, int bracketWidth,
582  int horizontalThickness, int verticalThickness);
583  void DrawVerticalDots(DeviceContext *dc, int x, const SegmentedLine &line, int barlineWidth, int interval);
584  void DrawSymbolDef(DeviceContext *dc, Object *parent, SymbolDef *symbolDef, int x, int y, int staffSize, bool dimin,
585  data_HORIZONTALALIGNMENT alignement = HORIZONTALALIGNMENT_left);
587 
594 
595 private:
600  data_STEMDIRECTION GetTupletCoordinates(Tuplet *tuplet, Layer *layer, Point *start, Point *end, Point *center);
601  std::u32string IntToTupletFigures(unsigned short number);
602  std::u32string IntToTimeSigFigures(unsigned short number);
603  std::u32string IntToSmuflFigures(unsigned short number, int offset);
604  int NestedTuplets(Object *object);
605  int GetSylYRel(int verseN, Staff *staff, data_STAFFREL place);
606  int GetFYRel(F *f, Staff *staff);
608 
613  FloatingCurvePositioner *CalcInitialSlur(
614  DeviceContext *dc, Slur *slur, int x1, int x2, Staff *staff, char spanningType);
616 
620  void CalcBrevisPoints(
621  Note *note, Staff *staff, Point *topLeft, Point *bottomRight, int sides[4], int shape, bool isMensuralBlack);
622  void CalcObliquePoints(Note *note1, Note *note2, Staff *staff, Point points[4], int sides[4], int shape,
623  bool isMensuralBlack, bool firstHalf, bool straight);
624 
629  void DrawBeamSegment(
630  DeviceContext *dc, BeamSegment *segment, BeamDrawingInterface *beamInterface, Layer *layer, Staff *staff);
631  void DrawFTremSegment(DeviceContext *dc, Staff *staff, FTrem *fTrem);
633 
637  bool HasValidTimeSpanningOrder(DeviceContext *dc, Object *element, LayerElement *start, LayerElement *end) const;
638 
642  data_STEMDIRECTION GetMensuralStemDir(Layer *layer, Note *note, int verticalCenter);
643 
644 public:
649 
656  Page *m_currentPage;
658 
659 protected:
665 
669  SlurHandling m_slurHandling;
670 
677 
678 private:
679  //----------------//
680  // Static members //
681  //----------------//
682 
685  static thread_local int s_drawingLigX[2], s_drawingLigY[2];
686  static thread_local bool s_drawingLigObliqua;
688 };
689 
690 } // namespace vrv
691 
692 #endif
This class models the MEI <annot> element where @type is score.
Definition: annotscore.h:24
This class models the MEI <arpeg> element.
Definition: arpeg.h:31
This class is an interface for MEI beam elements (beam, beamSpan).
Definition: drawinginterface.h:97
Class for storing drawing parameters when calculating beams.
Definition: beam.h:36
This class models the MEI <beamSpan> element.
Definition: beamspan.h:36
This class models the MEI <bracketSpan> element.
Definition: bracketspan.h:28
This class models the MEI <breath> element.
Definition: breath.h:24
This class models the MEI <caesura> element.
Definition: caesura.h:29
This class represents elements appearing within a measure.
Definition: controlelement.h:33
This class is an abstract device context.
Definition: devicecontext.h:57
This class is a hold the data and corresponds to the model of a MVC design pattern.
Definition: doc.h:41
Definition: dynam.h:33
This class represents a MEI ending.
Definition: ending.h:33
This class models the MEI <f> element.
Definition: f.h:24
This class models the MEI <fTrem> element.
Definition: ftrem.h:25
This class models the MEI <fb> element.
Definition: fb.h:23
This class models the MEI <fermata> element.
Definition: fermata.h:32
This class models the MEI <fig> element.
Definition: fig.h:23
This class models the MEI <fing> element.
Definition: fing.h:25
This class represents a basic object for a curve (slur, tie) in the layout domain.
Definition: floatingobject.h:329
This class models the MEI <gliss> element.
Definition: gliss.h:28
Implements the graphic element in MEI.
Definition: graphic.h:30
This class models the MEI <hairpin> element.
Definition: hairpin.h:31
This class models the MEI <harm> element.
Definition: harm.h:32
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 models the MEI <lb>
Definition: lb.h:23
This class represents a measure in a page-based score (Doc).
Definition: measure.h:46
This class models the MEI <meterSig> element.
Definition: metersig.h:34
This class models the MEI <mordent> element.
Definition: mordent.h:32
This class models the MEI <nc> element.
Definition: nc.h:41
This class models the MEI <note> element.
Definition: note.h:67
This class models the MEI <num> element.
Definition: num.h:24
This class represents a basic object.
Definition: object.h:61
This class models the MEI <octave> element.
Definition: octave.h:31
This class contains the document styling parameters.
Definition: options.h:576
This class represents a page in a laid-out score (Doc).
Definition: page.h:31
This class models the MEI <pedal> element.
Definition: pedal.h:34
This class models the MEI <dir> element.
Definition: pitchinflection.h:23
Simple class for representing points.
Definition: devicecontextbase.h:203
This class models the MEI <reh> element.
Definition: reh.h:30
This class models the MEI <rend> element.
Definition: rend.h:33
This class models the MEI <ornam> element.
Definition: repeatmark.h:32
This class represents a MEI scoreDef.
Definition: scoredef.h:135
Definition: boundingbox.h:337
Definition: slur.h:57
This class represents a staff in a laid-out score (Doc).
Definition: staff.h:107
Definition: svg.h:20
Syl is a TimeSpanningInterface for managing syllable connectors.
Definition: syl.h:36
Definition: symboldef.h:20
This class models the MEI <symbol> element.
Definition: symbol.h:25
This class represents elements appearing within a measure.
Definition: systemelement.h:26
This class represents a system in a laid-out score (Doc).
Definition: system.h:36
This class is an interface for <tempo> elements at the measure level.
Definition: tempo.h:33
This class stores current drawing parameters for text.
Definition: textelement.h:90
Definition: textelement.h:22
This class models CDATA (text)
Definition: text.h:23
This class models the MEI <tie> element.
Definition: tie.h:27
This class models the MEI <trill> element.
Definition: trill.h:34
Definition: tuplet.h:33
This class models the MEI <turn> element.
Definition: turn.h:32
This class is a drawing context and corresponds to the view of a MVC design pattern.
Definition: view.h:106
void DrawCurrentPage(DeviceContext *dc, bool background=true)
Method that actually draw the current page.
void SetPage(Page *page, bool doLayout)
Set the current page.
void SetScoreDefDrawingWidth(DeviceContext *dc, ScoreDef *scoreDef)
Calculate the ScoreDef width by taking into account its widest key signature.
int m_currentColor
The color currently being used when drawing.
Definition: view.h:664
Options * m_options
Options of the document.
Definition: view.h:648
View()
Constructors and destructors.
void SetDoc(Doc *doc)
Set the document the view is pointing to (mandatory).
Doc * m_doc
Document.
Definition: view.h:646
ScoreDef m_drawingScoreDef
The current drawing score def.
Definition: view.h:676
SlurHandling GetSlurHandling() const
Control how slurs are handled.
Definition: view.h:175
int DrawMeterSigFigures(DeviceContext *dc, int x, int y, MeterSig *meterSig, int den, Staff *staff)
Returns the width of the drawn figures.
double GetPPUFactor() const
Return the pixel per unit factor of the current page (if any, 1.0 otherwise)
SlurHandling m_slurHandling
Control the handling of slurs.
Definition: view.h:669
bool GetNotationMode()
Simply returns the value of the last note-type element (mensural or neume)