MuseScore Plugins  3.5
Plugins API for MuseScore
sym.h
1 //=============================================================================
2 // MuseScore
3 // Music Composition & Notation
4 //
5 // Copyright (C) 2002-2011 Werner Schweer
6 //
7 // This program is free software; you can redistribute it and/or modify
8 // it under the terms of the GNU General Public License version 2
9 // as published by the Free Software Foundation and appearing in
10 // the file LICENCE.GPL
11 //=============================================================================
12 
13 #ifndef __SYM_H__
14 #define __SYM_H__
15 
16 #include "config.h"
17 #include "style.h"
18 
19 #include "ft2build.h"
20 #include FT_FREETYPE_H
21 
22 // Needs to be duplicated here and in style.h since moc doesn't handle macros from #include'd files
23 #ifdef SCRIPT_INTERFACE
24 #define BEGIN_QT_REGISTERED_ENUM(Name) \
25 class MSQE_##Name { \
26  Q_GADGET \
27  public:
28 #define END_QT_REGISTERED_ENUM(Name) \
29  Q_ENUM(Name); \
30  }; \
31 using Name = MSQE_##Name::Name;
32 #else
33 #define BEGIN_QT_REGISTERED_ENUM(Name)
34 #define END_QT_REGISTERED_ENUM(Name)
35 #endif
36 
37 namespace Ms {
38 
39 //---------------------------------------------------------
40 // SymId
41 // must be in sync with symNames
42 //---------------------------------------------------------
43 
44 BEGIN_QT_REGISTERED_ENUM(SymId)
45 enum class SymId {
46 
47  // SMuFL standard symbol ID's
49  noSym,
268  accdnCombDot,
285  accdnPull,
286  accdnPush,
552  arpeggiatoUp,
558  arrowBlackUp,
566  arrowOpenUp,
574  arrowWhiteUp,
643  barlineFinal,
644  barlineHeavy,
647  barlineShort,
649  barlineTick,
666  brace,
667  bracket,
669  bracketTop,
670  brassBend,
683  brassFlip,
698  brassPlop,
699  brassScoop,
700  brassSmear,
706  bridgeClef,
707  buzzRoll,
708  cClef,
709  cClef8vb,
711  cClefArrowUp,
712  cClefChange,
715  cClefSquare,
716  caesura,
718  caesuraShort,
719  caesuraThick,
725  chantCaesura,
726  chantCclef,
751  chantEpisema,
752  chantFclef,
764  chantPunctum,
777  chantStaff,
786  chantVirgula,
787  clef15,
788  clef8,
790  coda,
791  codaSquare,
826  csymMinor,
831  curlewSign,
832  daCapo,
833  dalSegno,
861  dynamicFF,
862  dynamicFFF,
863  dynamicFFFF,
864  dynamicFFFFF,
866  dynamicForte,
873  dynamicMF,
874  dynamicMP,
876  dynamicMezzo,
879  dynamicPF,
880  dynamicPP,
881  dynamicPPP,
882  dynamicPPPP,
883  dynamicPPPPP,
885  dynamicPiano,
896  dynamicZ,
906  elecAudioIn,
908  elecAudioOut,
910  elecCamera,
911  elecDataIn,
912  elecDataOut,
913  elecDisc,
914  elecDownload,
915  elecEject,
918  elecHeadset,
919  elecLineIn,
920  elecLineOut,
921  elecLoop,
929  elecMIDIIn,
930  elecMIDIOut,
935  elecMonitor,
936  elecMute,
937  elecPause,
938  elecPlay,
941  elecReplay,
942  elecRewind,
943  elecShuffle,
946  elecStop,
947  elecTape,
948  elecUSB,
949  elecUnmute,
950  elecUpload,
952  elecVideoIn,
953  elecVideoOut,
962  fClef,
963  fClef15ma,
964  fClef15mb,
965  fClef8va,
966  fClef8vb,
968  fClefArrowUp,
969  fClefChange,
971  fClefTurned,
972  fermataAbove,
973  fermataBelow,
986  figbass0,
987  figbass1,
988  figbass2,
990  figbass3,
991  figbass4,
993  figbass5,
997  figbass6,
1000  figbass7,
1004  figbass8,
1005  figbass9,
1013  figbassFlat,
1017  figbassPlus,
1018  figbassSharp,
1019  fingering0,
1021  fingering1,
1023  fingering2,
1025  fingering3,
1027  fingering4,
1029  fingering5,
1031  fingering6,
1033  fingering7,
1035  fingering8,
1037  fingering9,
1065  flag1024thUp,
1066  flag128thDown,
1067  flag128thUp,
1068  flag16thDown,
1069  flag16thUp,
1070  flag256thDown,
1071  flag256thUp,
1072  flag32ndDown,
1073  flag32ndUp,
1074  flag512thDown,
1075  flag512thUp,
1076  flag64thDown,
1077  flag64thUp,
1078  flag8thDown,
1079  flag8thUp,
1091  fretboardO,
1092  fretboardX,
1097  functionDD,
1100  functionEight,
1102  functionFive,
1103  functionFour,
1116  functionMinus,
1120  functionNine,
1121  functionOne,
1126  functionPlus,
1130  functionRing,
1135  functionSeven,
1136  functionSix,
1140  functionThree,
1141  functionTwo,
1144  functionZero,
1145  gClef,
1146  gClef15ma,
1147  gClef15mb,
1148  gClef8va,
1149  gClef8vb,
1150  gClef8vbCClef,
1151  gClef8vbOld,
1154  gClefArrowUp,
1155  gClefChange,
1158  gClefReversed,
1159  gClefTurned,
1160  glissandoDown,
1161  glissandoUp,
1171  guitarFadeIn,
1172  guitarFadeOut,
1173  guitarGolpe,
1178  guitarShake,
1179  guitarString0,
1180  guitarString1,
1181  guitarString2,
1182  guitarString3,
1183  guitarString4,
1184  guitarString5,
1185  guitarString6,
1186  guitarString7,
1187  guitarString8,
1188  guitarString9,
1190  guitarStrumUp,
1200  handbellsGyro,
1214  harpMetalRod,
1240  harpTuningKey,
1245  kahnBackChug,
1246  kahnBackFlap,
1247  kahnBackRiff,
1248  kahnBackRip,
1250  kahnBallDig,
1253  kahnChug,
1254  kahnClap,
1257  kahnDrawStep,
1258  kahnDrawTap,
1259  kahnFlam,
1260  kahnFlap,
1261  kahnFlapStep,
1262  kahnFlat,
1263  kahnFleaHop,
1264  kahnFleaTap,
1265  kahnGraceTap,
1269  kahnHeel,
1271  kahnHeelClick,
1272  kahnHeelDrop,
1273  kahnHeelStep,
1274  kahnHeelTap,
1275  kahnHop,
1276  kahnJumpApart,
1280  kahnLeap,
1283  kahnLeftCatch,
1284  kahnLeftCross,
1285  kahnLeftFoot,
1287  kahnLeftTurn,
1290  kahnPull,
1291  kahnPush,
1292  kahnRiff,
1293  kahnRiffle,
1296  kahnRightFoot,
1298  kahnRightTurn,
1299  kahnRip,
1300  kahnRipple,
1301  kahnScrape,
1302  kahnScuff,
1303  kahnScuffle,
1304  kahnShuffle,
1305  kahnSlam,
1306  kahnSlap,
1307  kahnSlideStep,
1308  kahnSlideTap,
1309  kahnSnap,
1310  kahnStamp,
1312  kahnStep,
1313  kahnStepStamp,
1314  kahnStomp,
1316  kahnTap,
1317  kahnToe,
1318  kahnToeClick,
1319  kahnToeDrop,
1320  kahnToeStep,
1321  kahnToeTap,
1322  kahnTrench,
1323  kahnWing,
1325  kahnZank,
1326  kahnZink,
1370  kievanCClef,
1382  kodalyHandDo,
1383  kodalyHandFa,
1384  kodalyHandLa,
1385  kodalyHandMi,
1386  kodalyHandRe,
1387  kodalyHandSo,
1388  kodalyHandTi,
1390  legerLine,
1392  legerLineWide,
1491  lyricsElision,
1504  medRenNatural,
1525  mensuralCclef,
1554  mensuralFclef,
1556  mensuralGclef,
1659  metNote16thUp,
1663  metNote32ndUp,
1667  metNote64thUp,
1669  metNote8thUp,
1673  metNoteHalfUp,
1676  metNoteWhole,
1679  miscDoNotCopy,
1683  note1024thUp,
1684  note128thDown,
1685  note128thUp,
1686  note16thDown,
1687  note16thUp,
1688  note256thDown,
1689  note256thUp,
1690  note32ndDown,
1691  note32ndUp,
1692  note512thDown,
1693  note512thUp,
1694  note64thDown,
1695  note64thUp,
1696  note8thDown,
1697  note8thUp,
1698  noteABlack,
1700  noteAFlatHalf,
1702  noteAHalf,
1706  noteAWhole,
1707  noteBBlack,
1709  noteBFlatHalf,
1711  noteBHalf,
1715  noteBWhole,
1716  noteCBlack,
1718  noteCFlatHalf,
1720  noteCHalf,
1724  noteCWhole,
1725  noteDBlack,
1727  noteDFlatHalf,
1729  noteDHalf,
1733  noteDWhole,
1734  noteDoBlack,
1735  noteDoHalf,
1736  noteDoWhole,
1739  noteEBlack,
1741  noteEFlatHalf,
1743  noteEHalf,
1747  noteEWhole,
1749  noteEmptyHalf,
1751  noteFBlack,
1753  noteFFlatHalf,
1755  noteFHalf,
1759  noteFWhole,
1760  noteFaBlack,
1761  noteFaHalf,
1762  noteFaWhole,
1763  noteGBlack,
1765  noteGFlatHalf,
1767  noteGHalf,
1771  noteGWhole,
1772  noteHBlack,
1773  noteHHalf,
1777  noteHWhole,
1778  noteHalfDown,
1779  noteHalfUp,
1780  noteLaBlack,
1781  noteLaHalf,
1782  noteLaWhole,
1783  noteMiBlack,
1784  noteMiHalf,
1785  noteMiWhole,
1787  noteQuarterUp,
1788  noteReBlack,
1789  noteReHalf,
1790  noteReWhole,
1833  noteSiBlack,
1834  noteSiHalf,
1835  noteSiWhole,
1836  noteSoBlack,
1837  noteSoHalf,
1838  noteSoWhole,
1839  noteTiBlack,
1840  noteTiHalf,
1841  noteTiWhole,
1842  noteWhole,
1843  noteheadBlack,
1909  noteheadHalf,
1924  noteheadNull,
1992  noteheadWhole,
1997  noteheadXHalf,
2005  octaveBassa,
2006  octaveLoco,
2083  ornamentComma,
2087  ornamentHaydn,
2154  ornamentTrill,
2155  ornamentTurn,
2164  ottava,
2165  ottavaAlta,
2166  ottavaBassa,
2167  ottavaBassaBa,
2168  ottavaBassaVb,
2170  pictAgogo,
2172  pictAnvil,
2175  pictBassDrum,
2177  pictBeaterBow,
2178  pictBeaterBox,
2282  pictBell,
2284  pictBellPlate,
2285  pictBellTree,
2288  pictBongos,
2289  pictBrakeDrum,
2290  pictCabasa,
2291  pictCannon,
2292  pictCarHorn,
2293  pictCastanets,
2295  pictCelesta,
2296  pictCencerro,
2297  pictCenter1,
2298  pictCenter2,
2299  pictCenter3,
2301  pictChimes,
2304  pictClaves,
2305  pictCoins,
2306  pictConga,
2307  pictCowBell,
2309  pictCrotales,
2310  pictCrushStem,
2311  pictCuica,
2313  pictDamp1,
2314  pictDamp2,
2315  pictDamp3,
2316  pictDamp4,
2318  pictDrumStick,
2319  pictDuckCall,
2321  pictEmptyTrap,
2323  pictFlexatone,
2326  pictGlassHarp,
2329  pictGlsp,
2332  pictGong,
2334  pictGuiro,
2338  pictGumHardUp,
2346  pictGumSoftUp,
2347  pictHalfOpen1,
2348  pictHalfOpen2,
2349  pictHandbell,
2350  pictHiHat,
2352  pictJawHarp,
2356  pictLionsRoar,
2358  pictLogDrum,
2360  pictMar,
2362  pictMaraca,
2363  pictMaracas,
2364  pictMegaphone,
2369  pictOnRim,
2370  pictOpen,
2374  pictQuijada,
2375  pictRainstick,
2376  pictRatchet,
2377  pictRecoReco,
2379  pictRim1,
2380  pictRim2,
2381  pictRim3,
2390  pictSiren,
2391  pictSistrum,
2396  pictSlitDrum,
2397  pictSnareDrum,
2401  pictStickShot,
2402  pictSuperball,
2404  pictSwishStem,
2405  pictTabla,
2406  pictTamTam,
2410  pictTenorDrum,
2412  pictTimbales,
2413  pictTimpani,
2414  pictTomTom,
2418  pictTriangle,
2419  pictTubaphone,
2424  pictVib,
2427  pictVibraslap,
2429  pictWhip,
2433  pictWoodBlock,
2442  pictXyl,
2443  pictXylBass,
2445  pictXylTenor,
2447  pictXylTrough,
2449  pluckedDamp,
2458  quindicesima,
2462  repeat1Bar,
2463  repeat2Bars,
2464  repeat4Bars,
2468  repeatDot,
2469  repeatDots,
2470  repeatLeft,
2471  repeatRight,
2473  rest1024th,
2474  rest128th,
2475  rest16th,
2476  rest256th,
2477  rest32nd,
2478  rest512th,
2479  rest64th,
2480  rest8th,
2483  restHBar,
2484  restHBarLeft,
2486  restHBarRight,
2487  restHalf,
2489  restLonga,
2490  restMaxima,
2491  restQuarter,
2493  restQuarterZ,
2494  restWhole,
2496  reversedBrace,
2500  schaefferClef,
2504  segno,
2505  segnoSerpent1,
2506  segnoSerpent2,
2509  smnFlat,
2510  smnFlatWhite,
2515  smnNatural,
2516  smnSharp,
2517  smnSharpDown,
2518  smnSharpWhite,
2521  staff1Line,
2524  staff2Lines,
2527  staff3Lines,
2530  staff4Lines,
2533  staff5Lines,
2536  staff6Lines,
2558  stem,
2561  stemBuzzRoll,
2562  stemDamp,
2568  stemRimShot,
2572  stemSwished,
2591  stringsMuteOn,
2599  stringsUpBow,
2602  systemDivider,
2618  textTie,
2625  timeSig0,
2628  timeSig1,
2631  timeSig2,
2634  timeSig3,
2637  timeSig4,
2640  timeSig5,
2643  timeSig6,
2646  timeSig7,
2649  timeSig8,
2652  timeSig9,
2661  timeSigComma,
2662  timeSigCommon,
2665  timeSigCut2,
2666  timeSigCut3,
2670  timeSigEquals,
2677  timeSigMinus,
2684  timeSigPlus,
2686  timeSigSlash,
2687  timeSigX,
2688  tremolo1,
2689  tremolo2,
2690  tremolo3,
2691  tremolo4,
2692  tremolo5,
2704  tuplet0,
2705  tuplet1,
2706  tuplet2,
2707  tuplet3,
2708  tuplet4,
2709  tuplet5,
2710  tuplet6,
2711  tuplet7,
2712  tuplet8,
2713  tuplet9,
2714  tupletColon,
2719  ventiduesima,
2757  wiggleRandom1,
2758  wiggleRandom2,
2759  wiggleRandom3,
2760  wiggleRandom4,
2767  wiggleTrill,
2778  wiggleVibrato,
2814  wiggleWavy,
2828  windOpenHole,
2833  windRimOnly,
2838  windTrillKey,
2841 
2842 // EXTENSIONS
2843 // SMuFL stylistic alternates which we need to access directly
2844 
2845  noteheadDoubleWholeAlt, // double whole with double side bars
2846  fourStringTabClefSerif, // TAB clef in script style
2847  sixStringTabClefSerif, // TAB clef in script style
2848  cClefFrench,
2850  fClefFrench,
2852  braceSmall,
2853  braceLarge,
2854  braceLarger,
2855 
2856 // MuseScore local symbols, precomposed symbols to mimic some emmentaler glyphs
2857 
2862 // ornamentDownPrall,
2866 
2867 // additional symbols
2868 
2869  noteLongaUp,
2870  noteLongaDown,
2873  space,
2874 
2875 // END OF TABLE
2876 
2877  lastSym
2879  };
2880 END_QT_REGISTERED_ENUM(SymId)
2881 
2882 //---------------------------------------------------------
2883 // Sym
2885 //---------------------------------------------------------
2886 
2887 class Sym {
2888  protected:
2889  int _code = -1;
2890  FT_UInt _index;
2891  QRectF _bbox;
2892  qreal _advance;
2893 
2894  QPointF _stemDownNW;
2895  QPointF _stemUpSE;
2896  QPointF _cutOutNE;
2897  QPointF _cutOutNW;
2898  QPointF _cutOutSE;
2899  QPointF _cutOutSW;
2900  std::vector<SymId> _ids; // not empty if this is a compound symbol
2901 
2902  public:
2903  Sym() { }
2904 
2905  bool isValid() const { return _code != -1; }
2906 
2907  void setSymList(const std::vector<SymId>& sl) { _ids = sl; }
2908  const std::vector<SymId>& symList() const { return _ids; }
2909 
2910  FT_UInt index() const { return _index; }
2911  void setIndex(FT_UInt i) { _index = i; }
2912 
2913  int code() const { return _code; }
2914  void setCode(int val) { _code = val; }
2915 
2916  QRectF bbox() const { return _bbox; }
2917  void setBbox(QRectF val) { _bbox = val; }
2918 
2919  qreal advance() const { return _advance; }
2920  void setAdvance(qreal val) { _advance = val; }
2921 
2922  QPointF stemDownNW() const { return _stemDownNW; }
2923  void setStemDownNW(const QPointF& r) { _stemDownNW = r; }
2924  QPointF stemUpSE() const { return _stemUpSE; }
2925  void setStemUpSE(const QPointF& r) { _stemUpSE = r; }
2926  QPointF cutOutNE() const { return _cutOutNE; }
2927  void setCutOutNE(const QPointF& r) { _cutOutNE = r; }
2928  QPointF cutOutNW() const { return _cutOutNW; }
2929  void setCutOutNW(const QPointF& r) { _cutOutNW = r; }
2930  QPointF cutOutSE() const { return _cutOutSE; }
2931  void setCutOutSE(const QPointF& r) { _cutOutSE = r; }
2932  QPointF cutOutSW() const { return _cutOutSW; }
2933  void setCutOutSW(const QPointF& r) { _cutOutSW = r; }
2934 
2935  static SymId name2id(const QString& s) { return lnhash.value(s, SymId::noSym); } // return noSym if not found
2936  static SymId oldName2id(const QString s) { return lonhash.value(s, SymId::noSym);}
2937  static const char* id2name(SymId id);
2938 
2939  static QString id2userName(SymId id) { return qApp->translate("symUserNames", symUserNames[int(id)]); }
2940  static SymId userName2id(const QString& s);
2941 
2942  static const std::array<const char*, int (SymId::lastSym)+1> symNames;
2943  static const std::array<const char*, int(SymId::lastSym)+1> symUserNames;
2944  static const QVector<SymId> commonScoreSymbols;
2945 
2946  static QHash<QString, SymId> lnhash;
2947  static QHash<QString, SymId> lonhash;
2948  friend class ScoreFont;
2949  };
2950 
2951 //---------------------------------------------------------
2952 // GlyphKey
2954 //---------------------------------------------------------
2955 
2956 struct GlyphKey {
2957  FT_Face face;
2958  SymId id;
2959  qreal magX;
2960  qreal magY;
2961  qreal worldScale;
2962  QColor color;
2963 
2964  public:
2965  GlyphKey(FT_Face _f, SymId _id, float mx, float my, float s, QColor c)
2966  : face(_f), id(_id), magX(mx), magY(my), worldScale(s), color(c) {}
2967  bool operator==(const GlyphKey&) const;
2968  };
2969 
2970 //---------------------------------------------------------
2971 // GlyphPixmap
2973 //---------------------------------------------------------
2974 
2975 struct GlyphPixmap {
2976  QPixmap pm;
2977  QPointF offset;
2978  };
2979 
2980 inline uint qHash(const GlyphKey& k)
2981  {
2982  return (int(k.id) << 16) + (int(k.magX * 100) << 8) + k.magY * 100;
2983  }
2984 
2985 //---------------------------------------------------------
2986 // ScoreFont
2988 //---------------------------------------------------------
2989 
2990 class ScoreFont {
2991  FT_Face face = 0;
2992  QVector<Sym> _symbols;
2993  QString _name;
2994  QString _family;
2995  QString _fontPath;
2996  QString _filename;
2997  QByteArray fontImage;
2998  QCache<GlyphKey, GlyphPixmap>* cache { 0 };
2999  std::list<std::pair<Sid, QVariant>> _engravingDefaults;
3000  double _textEnclosureThickness = 0;
3001  mutable QFont* font { 0 };
3002 
3003  static QVector<ScoreFont> _scoreFonts;
3004  static std::array<uint, size_t(SymId::lastSym)+1> _mainSymCodeTable;
3005  void load();
3006  void computeMetrics(Sym* sym, int code);
3007 
3008  public:
3009  ScoreFont() {}
3010  ScoreFont(const ScoreFont&);
3011  ScoreFont(const char* n, const char* f, const char* p, const char* fn)
3012  : _name(n), _family(f), _fontPath(p), _filename(fn) {
3013  _symbols = QVector<Sym>(int(SymId::lastSym) + 1);
3014  }
3015  ~ScoreFont();
3016 
3017  const QString& name() const { return _name; }
3018  const QString& family() const { return _family; }
3019  std::list<std::pair<Sid, QVariant>> engravingDefaults() { return _engravingDefaults; }
3020  double textEnclosureThickness() { return _textEnclosureThickness; }
3021 
3022  QString fontPath() const { return _fontPath; }
3023 
3024  static ScoreFont* fontFactory(QString);
3025  static ScoreFont* fallbackFont();
3026  static const char* fallbackTextFont();
3027  static const QVector<ScoreFont>& scoreFonts() { return _scoreFonts; }
3028  static QJsonObject initGlyphNamesJson();
3029 
3030  QString toString(SymId) const;
3031  QPixmap sym2pixmap(SymId, qreal) { return QPixmap(); } // TODOxxxx
3032 
3033  void draw(SymId id, QPainter*, const QSizeF& mag, const QPointF& pos, qreal scale) const;
3034  void draw(SymId id, QPainter*, qreal mag, const QPointF& pos, qreal scale) const;
3035  void draw(SymId id, QPainter*, qreal mag, const QPointF& pos) const;
3036  void draw(SymId id, QPainter*, const QSizeF& mag, const QPointF& pos) const;
3037  void draw(SymId id, QPainter*, qreal mag, const QPointF& pos, int n) const;
3038  void draw(const std::vector<SymId>&, QPainter*, qreal mag, const QPointF& pos) const;
3039  void draw(const std::vector<SymId>&, QPainter*, const QSizeF& mag, const QPointF& pos) const;
3040  void draw(const std::vector<SymId>&, QPainter*, qreal mag, const QPointF& pos, qreal scale) const;
3041  void draw(const std::vector<SymId>&, QPainter*, const QSizeF& mag, const QPointF& pos, qreal scale) const;
3042 
3043  qreal height(SymId id, qreal mag) const { return bbox(id, mag).height(); }
3044  qreal width(SymId id, qreal mag) const { return bbox(id, mag).width(); }
3045  qreal advance(SymId id, qreal mag) const;
3046  qreal width(const std::vector<SymId>&, qreal mag) const;
3047 
3048  const QRectF bbox(SymId id, const QSizeF&) const;
3049  const QRectF bbox(SymId id, qreal mag) const;
3050  const QRectF bbox(const std::vector<SymId>& s, const QSizeF& mag) const;
3051  const QRectF bbox(const std::vector<SymId>& s, qreal mag) const;
3052  QPointF stemDownNW(SymId id, qreal mag) const;
3053  QPointF stemUpSE(SymId id, qreal mag) const;
3054  QPointF cutOutNE(SymId id, qreal mag) const;
3055  QPointF cutOutNW(SymId id, qreal mag) const;
3056  QPointF cutOutSE(SymId id, qreal mag) const;
3057  QPointF cutOutSW(SymId id, qreal mag) const;
3058 
3059  bool isValid(SymId id) const { return sym(id).isValid(); }
3060  bool useFallbackFont(SymId id) const;
3061 
3062  const Sym& sym(SymId id) const { return _symbols[int(id)]; }
3063 
3064  friend void initScoreFonts();
3065  };
3066 
3067 extern void initScoreFonts();
3068 
3069 } // namespace Ms
3070 
3071 Q_DECLARE_METATYPE(Ms::SymId);
3072 #endif
3073 
SymId
Definition: sym.h:45
Definition: cursor.cpp:30