From 28483f0deb36d8b7b32e38a7666e50c589edc771 Mon Sep 17 00:00:00 2001 From: "Andrey M. Tokarev" Date: Sat, 6 Sep 2014 09:51:31 +0400 Subject: [PATCH 01/13] Fix main layout memory leak --- mscore/musescore.cpp | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/mscore/musescore.cpp b/mscore/musescore.cpp index 9c702ef8bd3c..c4c82aad9752 100644 --- a/mscore/musescore.cpp +++ b/mscore/musescore.cpp @@ -526,9 +526,9 @@ MuseScore::MuseScore() mainWindow->setChildrenCollapsible(false); mainWindow->setOrientation(Qt::Vertical); - QLayout* mlayout = new QVBoxLayout; - mlayout->setMargin(0); - mlayout->setSpacing(0); +// QLayout* mlayout = new QVBoxLayout; +// mlayout->setMargin(0); +// mlayout->setSpacing(0); // mainWindow->setLayout(mlayout); QWidget* mainScore = new QWidget; From e74af12d7c693291501aa7df650e92e9a355c991 Mon Sep 17 00:00:00 2001 From: "Andrey M. Tokarev" Date: Sat, 6 Sep 2014 09:52:20 +0400 Subject: [PATCH 02/13] Fix score font memory leak --- libmscore/sym.cpp | 32 ++++++++++++++++---------------- libmscore/sym.h | 6 +++--- mscore/musescore.cpp | 2 +- 3 files changed, 20 insertions(+), 20 deletions(-) diff --git a/libmscore/sym.cpp b/libmscore/sym.cpp index 250e40b42422..d7de3a1be1cd 100644 --- a/libmscore/sym.cpp +++ b/libmscore/sym.cpp @@ -5224,10 +5224,10 @@ QString ScoreFont::symToHtml(SymId s, int leftMargin, const TextStyle* ts, qreal size = ts->font(_spatium).pointSizeF(); } else { - size = _font->pixelSize(); + size = _font.pixelSize(); } - QString family = _font->family(); + QString family = _font.family(); return QString( "" "" @@ -5249,8 +5249,8 @@ QString ScoreFont::symToHtml(SymId s, int leftMargin, const TextStyle* ts, qreal QString ScoreFont::symToHtml(SymId s1, SymId s2, int leftMargin) { - qreal size = _font->pixelSize(); - QString family = _font->family(); + qreal size = _font.pixelSize(); + QString family = _font.family(); return QString( "" @@ -5330,19 +5330,19 @@ void ScoreFont::load() exit(-1); } #endif - _font = new QFont(); - _font->setWeight(QFont::Normal); // if not set we get system default - _font->setItalic(false); - _font->setFamily(_family); - _font->setStyleStrategy(QFont::NoFontMerging); + _font = QFont(); + _font.setWeight(QFont::Normal); // if not set we get system default + _font.setItalic(false); + _font.setFamily(_family); + _font.setStyleStrategy(QFont::NoFontMerging); // horizontal hinting is bad as note hooks do not attach to stems // properly at some magnifications - _font->setHintingPreference(QFont::PreferVerticalHinting); + _font.setHintingPreference(QFont::PreferVerticalHinting); qreal size = 20.0 * MScore::DPI / PPI; QFont font2(font()); // See comment below - _font->setPixelSize(lrint(size)); + _font.setPixelSize(lrint(size)); font2.setPixelSize(lrint(size)*100); // See comment below // Since under Windows HintingPreferences always behave as PreferFullHinting (integer result) // unless DirectWrite is enabled during Qt compilation (and it would work only for Windows 7 @@ -5560,7 +5560,7 @@ void ScoreFont::load() { SymId::unicodeNoteDoubleWhole, QString("%1%2").arg(QChar(0xd834)).arg(QChar(0xdd5c)) }, { SymId::unicodeNoteWhole, QString("%1%2").arg(QChar(0xd834)).arg(QChar(0xdd5d)) }, { SymId::unicodeNoteHalfUp, QString("%1%2").arg(QChar(0xd834)).arg(QChar(0xdd5e)) }, - { SymId::unicodeNoteQuarterUp, QString("%1%2").arg(QChar(0xd834)).arg(QChar(0xdd5f)) }, + { SymId::unicodeNoteQuarterUp, QString("%1%2").arg(QChar(0xd834)).arg(QChar(0xdd5f)) }, { SymId::unicodeNote8thUp, QString("%1%2").arg(QChar(0xd834)).arg(QChar(0xdd60)) }, { SymId::unicodeNote16thUp, QString("%1%2").arg(QChar(0xd834)).arg(QChar(0xdd61)) }, { SymId::unicodeNote32ndUp, QString("%1%2").arg(QChar(0xd834)).arg(QChar(0xdd62)) }, @@ -5568,19 +5568,19 @@ void ScoreFont::load() { SymId::unicodeNote128thUp, QString("%1%2").arg(QChar(0xd834)).arg(QChar(0xdd64)) }, { SymId::unicodeAugmentationDot, QString("%1%2").arg(QChar(0xd834)).arg(QChar(0xdd6D)) } }; - + for (const UnicodeAlternate& unicode : unicodes) { Sym* sym = &_symbols[int(unicode.id)]; sym->setString(unicode.string); sym->setBbox(QRectF(_fm->tightBoundingRect(sym->string()))); } - - + + // add space symbol Sym* sym = &_symbols[int(SymId::space)]; sym->setString("\u0020"); sym->setBbox(QRectF(_fm->tightBoundingRect(sym->string()))); - + /*for (int i = 1; i < int(SymId::lastSym); ++i) { Sym sym = _symbols[i]; if (!sym.isValid()) diff --git a/libmscore/sym.h b/libmscore/sym.h index b43de5ee5753..686cb120b13a 100644 --- a/libmscore/sym.h +++ b/libmscore/sym.h @@ -2436,7 +2436,7 @@ enum class SymId { unicodeNote64thUp, unicodeNote128thUp, unicodeAugmentationDot, - + // MuseScore local symbols, precomposed symbols to mimic some emmentaler glyphs ornamentPrallMordent, @@ -2515,7 +2515,7 @@ class Sym { //--------------------------------------------------------- class ScoreFont { - QFont* _font; + QFont _font; QFontMetricsF* _fm = 0; QVector _symbols; QString _name; @@ -2543,7 +2543,7 @@ class ScoreFont { static const char* fallbackTextFont(); static const QVector& scoreFonts() { return _scoreFonts; } - const QFont& font() const { return *_font; } + const QFont& font() const { return _font; } const QString& toString(SymId id) const { return _symbols[int(id)].string(); } void draw(SymId id, QPainter* painter, qreal mag, const QPointF& pos = QPointF()) const; diff --git a/mscore/musescore.cpp b/mscore/musescore.cpp index c4c82aad9752..a063550058bf 100644 --- a/mscore/musescore.cpp +++ b/mscore/musescore.cpp @@ -2077,7 +2077,7 @@ void loadTranslation(QString filename, QString localeName) defaultFi = shortDefaultFi; defaultlp = shortDefaultlp; } - } + } // qDebug() << userFi.exists(); // qDebug() << userFi.lastModified() << defaultFi.lastModified(); From 6347be247ce7b00d928fdf7e4e9b89897e2ef70c Mon Sep 17 00:00:00 2001 From: "Andrey M. Tokarev" Date: Sat, 6 Sep 2014 10:02:42 +0400 Subject: [PATCH 03/13] Fix TabScoreView memory leak --- mscore/scoretab.cpp | 6 ++++++ mscore/scoretab.h | 2 ++ 2 files changed, 8 insertions(+) diff --git a/mscore/scoretab.cpp b/mscore/scoretab.cpp index 5b3fd253dbaf..4d06ca08e022 100644 --- a/mscore/scoretab.cpp +++ b/mscore/scoretab.cpp @@ -79,6 +79,12 @@ ScoreTab::ScoreTab(QList* sl, QWidget* parent) connect(tab, SIGNAL(tabCloseRequested(int)), this, SIGNAL(tabCloseRequested(int))); } +ScoreTab::~ScoreTab() + { + for (int i = 0; i != tab->count(); ++i) + tab->removeTab(i); + } + //--------------------------------------------------------- // view //--------------------------------------------------------- diff --git a/mscore/scoretab.h b/mscore/scoretab.h index 9c2221e6fe01..3e0591a2a5d7 100644 --- a/mscore/scoretab.h +++ b/mscore/scoretab.h @@ -65,6 +65,8 @@ class ScoreTab : public QWidget { public: ScoreTab(QList*, QWidget* parent = 0); + ~ScoreTab(); + void insertTab(Score*); void setTabText(int, const QString&); int currentIndex() const; From 1cbb7130e0fa7bbeac37d97738bd9665a5853269 Mon Sep 17 00:00:00 2001 From: "Andrey M. Tokarev" Date: Sat, 6 Sep 2014 10:21:19 +0400 Subject: [PATCH 04/13] Fix M_new_divis memory leak --- aeolus/model.cpp | 310 +++++++++++++++++++++++------------------------ 1 file changed, 155 insertions(+), 155 deletions(-) diff --git a/aeolus/model.cpp b/aeolus/model.cpp index 8bddd03487cf..29b5f6b57f06 100644 --- a/aeolus/model.cpp +++ b/aeolus/model.cpp @@ -94,14 +94,14 @@ void Model::init() // init audio Divis* D = _divis; for (int d = 0; d < _ndivis; d++, D++) { - M_new_divis* M = new M_new_divis (); - M->_flags = D->_flags; - M->_dmask = D->_dmask; - M->_asect = D->_asect; - M->_swell = D->_param [Divis::SWELL].fval(); - M->_tfreq = D->_param [Divis::TFREQ].fval(); - M->_tmodd = D->_param [Divis::TMODD].fval(); - _aeolus->newDivis(M); + M_new_divis M; + M._flags = D->_flags; + M._dmask = D->_dmask; + M._asect = D->_asect; + M._swell = D->_param [Divis::SWELL].fval(); + M._tfreq = D->_param [Divis::TFREQ].fval(); + M._tmodd = D->_param [Divis::TMODD].fval(); + _aeolus->newDivis(&M); } init_iface(); @@ -471,57 +471,57 @@ int Model::read_instr () else if (sscanf (q, "%s%d%d%n", t1, &k, &s, &n) != 3) stat = ARGS; else - { - q += n; - if (_ndivis == NDIVIS) - { - fprintf (stderr, "Line %d: can't create more than %d divisions\n", line, NDIVIS); - stat = ERROR; - } - else if (strlen (t1) > 15) stat = BAD_STR1; - else if ((k < 0) || (k > _nkeybd)) stat = BAD_KEYBD; - else if ((s < 1) || (s > NASECT)) stat = BAD_ASECT; - else - { - D = _divis + _ndivis++; - strcpy (D->_label, t1); + { + q += n; + if (_ndivis == NDIVIS) + { + fprintf (stderr, "Line %d: can't create more than %d divisions\n", line, NDIVIS); + stat = ERROR; + } + else if (strlen (t1) > 15) stat = BAD_STR1; + else if ((k < 0) || (k > _nkeybd)) stat = BAD_KEYBD; + else if ((s < 1) || (s > NASECT)) stat = BAD_ASECT; + else + { + D = _divis + _ndivis++; + strcpy (D->_label, t1); if (_nasect < s) _nasect = s; - D->_asect = s - 1; + D->_asect = s - 1; D->_keybd = k - 1; - if (k--) D->_dmask = _keybd [k]._flags & 127; - } - } - } + if (k--) D->_dmask = _keybd [k]._flags & 127; + } + } + } else if (! strcmp (p, "/divis/end")) { - if (!D || G) stat = BAD_SCOPE; + if (!D || G) stat = BAD_SCOPE; else D = 0; - } + } else if (! strcmp (p, "/group/new")) { - if (D || G) stat = BAD_SCOPE; + if (D || G) stat = BAD_SCOPE; else if (sscanf (q, "%s%n", t1, &n) != 1) stat = ARGS; else - { - q += n; - if (_ngroup == NGROUP) - { - fprintf (stderr, "Line %d: can't create more than %d groups\n", line, NGROUP); - stat = ERROR; - } - else if (strlen (t1) > 15) stat = BAD_STR1; - else - { - G = _group + _ngroup++; - strcpy (G->_label, t1); - } - } - } + { + q += n; + if (_ngroup == NGROUP) + { + fprintf (stderr, "Line %d: can't create more than %d groups\n", line, NGROUP); + stat = ERROR; + } + else if (strlen (t1) > 15) stat = BAD_STR1; + else + { + G = _group + _ngroup++; + strcpy (G->_label, t1); + } + } + } else if (! strcmp (p, "/group/end")) { - if (D || !G) stat = BAD_SCOPE; + if (D || !G) stat = BAD_SCOPE; else G = 0; - } + } else if (! strcmp (p, "/tuning")) { if (D || G) @@ -537,195 +537,195 @@ int Model::read_instr () else if (! strcmp (p, "/rank")) { - if (!D && G) stat = BAD_SCOPE; + if (!D && G) stat = BAD_SCOPE; else if (sscanf (q, "%c%d%s%n", &c, &d, t1, &n) != 3) stat = ARGS; else - { - q += n; + { + q += n; if (D->_nrank == Divis::NRANK) - { - fprintf (stderr, "Line %d: can't create more than %d ranks per division\n", line, Divis::NRANK); - stat = ERROR; - } + { + fprintf (stderr, "Line %d: can't create more than %d ranks per division\n", line, Divis::NRANK); + stat = ERROR; + } else if (strlen (t1) > 63) stat = BAD_STR1; else - { + { A = new Addsynth; - strcpy (A->_filename, t1); + strcpy (A->_filename, t1); if (A->load (_stops)) - { - stat = ERROR; - delete A; - } + { + stat = ERROR; + delete A; + } else - { + { A->_pan = c; A->_del = d; - R = D->_ranks + D->_nrank++; + R = D->_ranks + D->_nrank++; R->_count = 0; R->_sdef = A; R->_wave = 0; - } - } - } - } + } + } + } + } else if (! strcmp (p, "/tremul")) { - if (D) - { + if (D) + { float val1; float val2; - if (sscanf (q, "%f%f%n", &val1, &val2, &n) != 2) + if (sscanf (q, "%f%f%n", &val1, &val2, &n) != 2) stat = ARGS; else { D->_param[Divis::TFREQ].set(val1); D->_param[Divis::TMODD].set(val2); - q += n; - D->_flags |= Divis::HAS_TREM; - } - } - else if (G) - { - if (sscanf (q, "%d%s%s%n", &d, t1, t2, &n) != 3) stat = ARGS; + q += n; + D->_flags |= Divis::HAS_TREM; + } + } + else if (G) + { + if (sscanf (q, "%d%s%s%n", &d, t1, t2, &n) != 3) stat = ARGS; else - { - q += n; + { + q += n; if (G->_nifelm == Group::NIFELM) stat = BAD_IFACE; else if ((d < 1) || (d > _ndivis)) stat = BAD_DIVIS; - else if (strlen (t1) > 7) stat = BAD_STR1; - else if (strlen (t2) > 31) stat = BAD_STR2; + else if (strlen (t1) > 7) stat = BAD_STR1; + else if (strlen (t2) > 31) stat = BAD_STR2; else - { + { d--; - I = G->_ifelms + G->_nifelm++; - strcpy (I->_mnemo, t1); - strcpy (I->_label, t2); - I->_type = Ifelm::TREMUL; - I->_action0 = (16 << 24) | (d << 16) | 0; - I->_action1 = (16 << 24) | (d << 16) | 1; - } - } - } + I = G->_ifelms + G->_nifelm++; + strcpy (I->_mnemo, t1); + strcpy (I->_label, t2); + I->_type = Ifelm::TREMUL; + I->_action0 = (16 << 24) | (d << 16) | 0; + I->_action1 = (16 << 24) | (d << 16) | 1; + } + } + } else stat = BAD_SCOPE; - } + } else if (! strcmp (p, "/swell")) { - if (!D || G) stat = BAD_SCOPE; + if (!D || G) stat = BAD_SCOPE; else D->_flags |= Divis::HAS_SWELL; - } + } else if (! strcmp (p, "/stop")) { - if (D || !G) stat = BAD_SCOPE; + if (D || !G) stat = BAD_SCOPE; else if (sscanf (q, "%d%d%d%n", &k, &d, &r, &n) != 3) stat = ARGS; else - { - q += n; + { + q += n; if (G->_nifelm == Group::NIFELM) stat = BAD_IFACE; else if ((k < 0) || (k > _nkeybd)) stat = BAD_KEYBD; else if ((d < 1) || (d > _ndivis)) stat = BAD_DIVIS; else if ((r < 1) || (r > _divis [d - 1]._nrank)) stat = BAD_RANK; else - { + { k--; d--; r--; - I = G->_ifelms + G->_nifelm++; + I = G->_ifelms + G->_nifelm++; R = _divis [d]._ranks + r; strcpy (I->_label, R->_sdef->_stopname); strcpy (I->_mnemo, R->_sdef->_mnemonic); I->_keybd = k; if (k >= 0) - { + { I->_type = Ifelm::KBDRANK; - k = _keybd [k]._flags & 127; - } - else - { + k = _keybd [k]._flags & 127; + } + else + { I->_type = Ifelm::DIVRANK; - k = 128; - } + k = 128; + } I->_action0 = (6 << 24) | (d << 16) | (r << 8) | k; I->_action1 = (7 << 24) | (d << 16) | (r << 8) | k; - } - } - } + } + } + } else if (! strcmp (p, "/coupler")) { - if (D || !G) stat = BAD_SCOPE; + if (D || !G) stat = BAD_SCOPE; else if (sscanf (q, "%d%d%s%s%n", &k, &d, t1, t2, &n) != 4) stat = ARGS; else - { - q += n; + { + q += n; if (G->_nifelm == Group::NIFELM) stat = BAD_IFACE; else if ((k < 1) || (k > _nkeybd)) stat = BAD_KEYBD; else if ((d < 1) || (d > _ndivis)) stat = BAD_DIVIS; - else if (strlen (t1) > 7) stat = BAD_STR1; - else if (strlen (t2) > 31) stat = BAD_STR2; + else if (strlen (t1) > 7) stat = BAD_STR1; + else if (strlen (t2) > 31) stat = BAD_STR2; else - { + { k--; d--; - I = G->_ifelms + G->_nifelm++; + I = G->_ifelms + G->_nifelm++; strcpy (I->_mnemo, t1); strcpy (I->_label, t2); I->_type = Ifelm::COUPLER; - I->_keybd = k; + I->_keybd = k; k = _keybd [k]._flags & 127; I->_action0 = (4 << 24) | (d << 16) | k; I->_action1 = (5 << 24) | (d << 16) | k; - } - } - } + } + } + } else stat = COMM; if (stat <= DONE) - { + { while (isspace (*q)) q++; if (*q > ' ') stat = MORE; - } + } switch (stat) - { + { case COMM: - fprintf (stderr, "Line %d: unknown command '%s'\n", line, p); + fprintf (stderr, "Line %d: unknown command '%s'\n", line, p); break; case ARGS: - fprintf (stderr, "Line %d: missing arguments in '%s' command\n", line, p); + fprintf (stderr, "Line %d: missing arguments in '%s' command\n", line, p); break; case MORE: - fprintf (stderr, "Line %d: extra arguments in '%s' command\n", line, p); + fprintf (stderr, "Line %d: extra arguments in '%s' command\n", line, p); break; case NO_INSTR: - fprintf (stderr, "Line %d: command '%s' outside instrument scope\n", line, p); + fprintf (stderr, "Line %d: command '%s' outside instrument scope\n", line, p); break; case IN_INSTR: - fprintf (stderr, "Line %d: command '%s' inside instrument scope\n", line, p); + fprintf (stderr, "Line %d: command '%s' inside instrument scope\n", line, p); break; case BAD_SCOPE: - fprintf (stderr, "Line %d: command '%s' in wrong scope\n", line, p); + fprintf (stderr, "Line %d: command '%s' in wrong scope\n", line, p); break; case BAD_ASECT: - fprintf (stderr, "Line %d: no section '%d'\n", line, s); + fprintf (stderr, "Line %d: no section '%d'\n", line, s); break; case BAD_RANK: - fprintf (stderr, "Line %d: no rank '%d' in division '%d'\n", line, r, d); + fprintf (stderr, "Line %d: no rank '%d' in division '%d'\n", line, r, d); break; case BAD_KEYBD: - fprintf (stderr, "Line %d: no keyboard '%d'\n", line, k); + fprintf (stderr, "Line %d: no keyboard '%d'\n", line, k); break; case BAD_DIVIS: - fprintf (stderr, "Line %d: no division '%d'\n", line, d); + fprintf (stderr, "Line %d: no division '%d'\n", line, d); break; case BAD_IFACE: - fprintf (stderr, "Line %d: can't create more than '%d' elements per group\n", line, Group::NIFELM); + fprintf (stderr, "Line %d: can't create more than '%d' elements per group\n", line, Group::NIFELM); break; case BAD_STR1: - fprintf (stderr, "Line %d: string '%s' is too long\n", line, t1); + fprintf (stderr, "Line %d: string '%s' is too long\n", line, t1); break; case BAD_STR2: - fprintf (stderr, "Line %d: string '%s' is too long\n", line, t1); + fprintf (stderr, "Line %d: string '%s' is too long\n", line, t1); break; - } + } } f.close(); @@ -748,7 +748,7 @@ int Model::write_instr() sprintf (buff, "%s/definition", _instr); if (! (F = fopen (buff, "w"))) { - fprintf (stderr, "Can't open '%s' for writing\n", buff); + fprintf (stderr, "Can't open '%s' for writing\n", buff); return 1; } printf ("Writing '%s'\n", buff); @@ -763,21 +763,21 @@ int Model::write_instr() fprintf (F, "\n# Keyboards\n#\n"); for (k = 0; k < _nkeybd; k++) { - if (_keybd [k]._flags & Keybd::IS_PEDAL) fprintf (F, "/pedal/new %s\n", _keybd [k]._label); + if (_keybd [k]._flags & Keybd::IS_PEDAL) fprintf (F, "/pedal/new %s\n", _keybd [k]._label); else fprintf (F, "/manual/new %s\n", _keybd [k]._label); } fprintf (F, "\n# Divisions\n#\n"); for (d = 0; d < _ndivis; d++) { - D = _divis + d; + D = _divis + d; fprintf (F, "/divis/new %-7s %d %d\n", D->_label, D->_keybd + 1, D->_asect + 1); for (r = 0; r < D->_nrank; r++) - { + { R = D->_ranks + r; - A = R->_sdef; + A = R->_sdef; fprintf (F, "/rank %c %3d %s\n", A->_pan, A->_del, A->_filename); - } + } if (D->_flags & Divis::HAS_SWELL) fprintf (F, "/swell\n"); if (D->_flags & Divis::HAS_TREM) fprintf (F, "/tremul %3.1f %3.1f\n", D->_param [Divis::TFREQ].fval(), D->_param [Divis::TMODD].fval()); @@ -787,34 +787,34 @@ int Model::write_instr() fprintf (F, "# Interface groups\n#\n"); for (g = 0; g < _ngroup; g++) { - G = _group + g; + G = _group + g; fprintf (F, "/group/new %-7s\n", G->_label); for (i = 0; i < G->_nifelm; i++) - { - I = G->_ifelms + i; + { + I = G->_ifelms + i; switch (I->_type) - { - case Ifelm::DIVRANK: - case Ifelm::KBDRANK: + { + case Ifelm::DIVRANK: + case Ifelm::KBDRANK: k = I->_keybd; d = (I->_action0 >> 16) & 255; r = (I->_action0 >> 8) & 255; fprintf (F, "/stop %d %d %2d\n", k + 1, d + 1, r + 1); - break; + break; - case Ifelm::COUPLER: + case Ifelm::COUPLER: k = I->_keybd; d = (I->_action0 >> 16) & 255; fprintf (F, "/coupler %d %d %-7s %s\n", k + 1, d + 1, I->_mnemo, I->_label); - break; + break; - case Ifelm::TREMUL: + case Ifelm::TREMUL: d = (I->_action0 >> 16) & 255; D = _divis + d; fprintf (F, "/tremul %d %-7s %s\n", d + 1, I->_mnemo, I->_label); - break; - } - } + break; + } + } fprintf (F, "/group/end\n\n"); } From 6da8c087284b16f13eb406b9a41cf56e3293638b Mon Sep 17 00:00:00 2001 From: "Andrey M. Tokarev" Date: Sat, 6 Sep 2014 10:28:19 +0400 Subject: [PATCH 05/13] Fix QFontMetricsF memory leak --- libmscore/sym.cpp | 14 +++++++------- libmscore/sym.h | 10 +++++----- 2 files changed, 12 insertions(+), 12 deletions(-) diff --git a/libmscore/sym.cpp b/libmscore/sym.cpp index d7de3a1be1cd..10f7315626a0 100644 --- a/libmscore/sym.cpp +++ b/libmscore/sym.cpp @@ -5361,7 +5361,7 @@ void ScoreFont::load() qDebug("Json parse error in <%s>(offset: %d): %s", qPrintable(fi.fileName()), error.offset, qPrintable(error.errorString())); - _fm = new QFontMetricsF(font()); + _fm = QFontMetricsF(font()); QFontMetrics fm2(font2); // See comment above for (auto i : o.keys()) { bool ok; @@ -5373,7 +5373,7 @@ void ScoreFont::load() Sym* sym = &_symbols[int(symId)]; sym->setString(codeToString(code)); sym->setWidth((fm2.width(sym->string()))/100.0); // Renormalization; see comment above - sym->setBbox(QRectF(_fm->tightBoundingRect(sym->string()))); + sym->setBbox(QRectF(_fm.tightBoundingRect(sym->string()))); } //else // qDebug("unknown glyph: %s", qPrintable(i)); @@ -5506,7 +5506,7 @@ void ScoreFont::load() for (SymId id : c.rids) s += _symbols[int(id)].string(); sym->setString(s); - sym->setBbox(QRectF(_fm->tightBoundingRect(s))); + sym->setBbox(QRectF(_fm.tightBoundingRect(s))); } } @@ -5544,7 +5544,7 @@ void ScoreFont::load() if (ok) { QString s = codeToString(code); sym->setString(s); - sym->setBbox(QRectF(_fm->tightBoundingRect(s))); + sym->setBbox(QRectF(_fm.tightBoundingRect(s))); } break; } @@ -5572,14 +5572,14 @@ void ScoreFont::load() for (const UnicodeAlternate& unicode : unicodes) { Sym* sym = &_symbols[int(unicode.id)]; sym->setString(unicode.string); - sym->setBbox(QRectF(_fm->tightBoundingRect(sym->string()))); + sym->setBbox(QRectF(_fm.tightBoundingRect(sym->string()))); } // add space symbol Sym* sym = &_symbols[int(SymId::space)]; sym->setString("\u0020"); - sym->setBbox(QRectF(_fm->tightBoundingRect(sym->string()))); + sym->setBbox(QRectF(_fm.tightBoundingRect(sym->string()))); /*for (int i = 1; i < int(SymId::lastSym); ++i) { Sym sym = _symbols[i]; @@ -5642,7 +5642,7 @@ const QRectF ScoreFont::bbox(SymId id, qreal mag) const const QRectF ScoreFont::bbox(const QString& s, qreal mag) const { - QRectF r(_fm->tightBoundingRect(s)); + QRectF r(_fm.tightBoundingRect(s)); return QRectF(r.x() * mag, r.y() * mag, r.width() * mag, r.height() * mag); } diff --git a/libmscore/sym.h b/libmscore/sym.h index 686cb120b13a..876328c681ca 100644 --- a/libmscore/sym.h +++ b/libmscore/sym.h @@ -2516,7 +2516,7 @@ class Sym { class ScoreFont { QFont _font; - QFontMetricsF* _fm = 0; + QFontMetricsF _fm; QVector _symbols; QString _name; QString _family; @@ -2530,9 +2530,9 @@ class ScoreFont { void load(); public: - ScoreFont() {} + ScoreFont() : _fm(_font) {} ScoreFont(const char* n, const char* f, const char* p, const char* fn) - : _name(n), _family(f), _fontPath(p), _filename(fn) { + : _fm(_font), _name(n), _family(f), _fontPath(p), _filename(fn) { _symbols = QVector(int(SymId::lastSym) + 1); } @@ -2554,9 +2554,9 @@ class ScoreFont { QString symToHtml(SymId, SymId, int leftMargin=0); QPixmap sym2pixmap(SymId id, qreal mag); - qreal height(SymId id, qreal mag) const { return _fm->tightBoundingRect(toString(id)).height() * mag; } + qreal height(SymId id, qreal mag) const { return _fm.tightBoundingRect(toString(id)).height() * mag; } qreal width(SymId id, qreal mag) const { return _symbols[int(id)].width() * mag; } - qreal width(const QString& s, qreal mag) const { return _fm->width(s) * mag; } + qreal width(const QString& s, qreal mag) const { return _fm.width(s) * mag; } const QRectF bbox(SymId id, qreal mag) const; const QRectF bbox(const QString& s, qreal mag) const; QPointF attach(SymId id, qreal mag) const { return _symbols[int(id)].attach() * mag; } From 330e232c9bd48bf2280c7eff4974058c144387b5 Mon Sep 17 00:00:00 2001 From: "Andrey M. Tokarev" Date: Sat, 6 Sep 2014 11:44:27 +0400 Subject: [PATCH 06/13] Fix Element memory leak --- mscore/palette.cpp | 5 +++++ mscore/palette.h | 2 ++ 2 files changed, 7 insertions(+) diff --git a/mscore/palette.cpp b/mscore/palette.cpp index 0d30c9bfaddd..6ca73c8539d7 100644 --- a/mscore/palette.cpp +++ b/mscore/palette.cpp @@ -41,6 +41,11 @@ namespace Ms { +PaletteCell::~PaletteCell() + { + delete element; + } + //--------------------------------------------------------- // needsStaff // should a staff been drawn if e is used as icon in diff --git a/mscore/palette.h b/mscore/palette.h index 7c02d9ff575b..90dc41a0aa81 100644 --- a/mscore/palette.h +++ b/mscore/palette.h @@ -38,6 +38,8 @@ class Palette; //--------------------------------------------------------- struct PaletteCell { + ~PaletteCell(); + Element* element { 0 }; QString name; // used for tool tip QString tag; From 80c062412a234aab262d787b6a257de31eeedf58 Mon Sep 17 00:00:00 2001 From: "Andrey M. Tokarev" Date: Sat, 6 Sep 2014 12:23:37 +0400 Subject: [PATCH 07/13] Fix icon action (char*) memory leak --- libmscore/icon.cpp | 4 ++-- libmscore/icon.h | 10 +++++----- mscore/musescore.h | 8 ++++---- mscore/qmlplugin.cpp | 2 +- mscore/shortcut.cpp | 18 ++++++++---------- mscore/shortcut.h | 2 +- 6 files changed, 21 insertions(+), 23 deletions(-) diff --git a/libmscore/icon.cpp b/libmscore/icon.cpp index 5f671a15ff6c..2d6f29be1419 100644 --- a/libmscore/icon.cpp +++ b/libmscore/icon.cpp @@ -23,7 +23,7 @@ void Icon::write(Xml& xml) const { xml.stag(name()); xml.tag("subtype", int(_iconType)); - if (_action) + if (!_action.isEmpty()) xml.tag("action", _action); xml.etag(); } @@ -37,7 +37,7 @@ void Icon::read(XmlReader& e) while (e.readNextStartElement()) { const QStringRef& tag(e.name()); if (tag == "action") - _action = strdup(e.readElementText().toLatin1().data()); + _action = e.readElementText(); else if (tag == "subtype") _iconType = IconType(e.readInt()); else diff --git a/libmscore/icon.h b/libmscore/icon.h index 6ef7f33f2db5..6c0a21710acf 100644 --- a/libmscore/icon.h +++ b/libmscore/icon.h @@ -26,18 +26,18 @@ class Icon : public Element { Q_OBJECT IconType _iconType; - const char* _action; + QString _action; QIcon _icon; public: - Icon(Score* s) : Element(s), _iconType(IconType::NONE), _action(0) { } + Icon(Score* s) : Element(s), _iconType(IconType::NONE) { } virtual Icon* clone() const { return new Icon(*this); } virtual Element::Type type() const { return Element::Type::ICON; } IconType iconType() const { return _iconType; } void setIconType(IconType val) { _iconType = val; } - void setAction(const char* s, const QIcon& i) { _action = s; _icon = i; } - const char* action() const { return _action; } - QIcon icon() const { return _icon; } + void setAction(const QString& s, const QIcon& i) { _action = s; _icon = i; } + QString action() const { return _action; } + QIcon icon() const { return _icon; } virtual void write(Xml&) const; virtual void read(XmlReader&); }; diff --git a/mscore/musescore.h b/mscore/musescore.h index 9408bec20983..40fb30f96fa0 100644 --- a/mscore/musescore.h +++ b/mscore/musescore.h @@ -103,7 +103,7 @@ extern const char* voiceActions[]; struct IconAction { IconType subtype; - const char* action; + const QString action; }; //--------------------------------------------------------- @@ -374,7 +374,7 @@ class MuseScore : public QMainWindow, public MuseScoreCore { bool saveFile(); bool saveFile(Score* score); void fingeringMenu(); - + int pluginIdxFromPath(QString pluginPath); void startDebugger(); void midiinToggled(bool); @@ -654,7 +654,7 @@ class MuseScore : public QMainWindow, public MuseScoreCore { ScoreView* currentScoreView() const { return cv; } void showMessage(const QString& s, int timeout); void helpBrowser(const QString = QString()) const; - + void registerPlugin(PluginDescription*); void unregisterPlugin(PluginDescription*); }; @@ -666,7 +666,7 @@ extern MasterSynthesizer* synti; MasterSynthesizer* synthesizerFactory(); Driver* driverFactory(Seq*, QString driver); -extern QAction* getAction(const char*); +extern QAction* getAction(const QString&); extern Shortcut* midiActionMap[128]; extern void loadTranslation(QString fileName, QString localeName); extern void setMscoreLocale(QString localeName); diff --git a/mscore/qmlplugin.cpp b/mscore/qmlplugin.cpp index faddd716b0bf..07ef49caff5f 100644 --- a/mscore/qmlplugin.cpp +++ b/mscore/qmlplugin.cpp @@ -122,7 +122,7 @@ Score* QmlPlugin::newScore(const QString& name, const QString& part, int measure void QmlPlugin::cmd(const QString& s) { - Shortcut* sc = Shortcut::getShortcut(s.toLatin1().data()); + Shortcut* sc = Shortcut::getShortcut(s); if (sc) msc->cmd(sc->action()); else diff --git a/mscore/shortcut.cpp b/mscore/shortcut.cpp index 03a04a954c6c..77222e19b506 100644 --- a/mscore/shortcut.cpp +++ b/mscore/shortcut.cpp @@ -177,11 +177,11 @@ QString Shortcut::help() const // getShortcut //--------------------------------------------------------- -Shortcut* Shortcut::getShortcut(const char* id) +Shortcut* Shortcut::getShortcut(const QString& id) { Shortcut* s = _shortcuts.value(id); if (s == 0) { - qDebug("Internal error: shortcut <%s> not found", id); + qDebug("Internal error: shortcut <%s> not found", id.toStdString().c_str()); return 0; } return s; @@ -192,7 +192,7 @@ Shortcut* Shortcut::getShortcut(const char* id) // returns action for shortcut //--------------------------------------------------------- -QAction* getAction(const char* id) +QAction* getAction(const QString& id) { Shortcut* s = Shortcut::getShortcut(id); if (s) @@ -409,7 +409,7 @@ void Shortcut::load() const QStringRef& tag(e.name()); if (tag == "key") { QString val(e.readElementText()); - sc = getShortcut(val.toLatin1().data()); + sc = getShortcut(val); if (!sc) qDebug("cannot find shortcut <%s>", qPrintable(val)); else @@ -445,12 +445,11 @@ void Shortcut::load() //--------------------------------------------------------- struct Shortcut1 { - char* key; + QString key; QList keys; QKeySequence::StandardKey standardKey; - Shortcut1() { key = 0; standardKey = QKeySequence::UnknownKey; } - ~Shortcut1() { if (key) free(key); } + Shortcut1() { standardKey = QKeySequence::UnknownKey; } }; //--------------------------------------------------------- @@ -471,11 +470,10 @@ static QList loadDefaultShortcuts() while (e.readNextStartElement()) { if (e.name() == "SC") { Shortcut1* sc = new Shortcut1; - sc->key = 0; while (e.readNextStartElement()) { const QStringRef& tag(e.name()); if (tag == "key") - sc->key = strdup(e.readElementText().toLatin1().data()); + sc->key = e.readElementText(); else if (tag == "std") sc->standardKey = QKeySequence::StandardKey(e.readInt()); else if (tag == "seq") @@ -552,7 +550,7 @@ void Shortcut::reset() _keys.clear(); QList sl = loadDefaultShortcuts(); foreach(Shortcut1* sc, sl) { - if (strcmp(sc->key, _key) == 0) { + if (strcmp(sc->key.toStdString().c_str(), _key) == 0) { setKeys(sc->keys); setStandardKey(sc->standardKey); break; diff --git a/mscore/shortcut.h b/mscore/shortcut.h index 8ec72375c7e5..b0c315f53260 100644 --- a/mscore/shortcut.h +++ b/mscore/shortcut.h @@ -183,7 +183,7 @@ class Shortcut { static void save(); static void resetToDefault(); static bool dirty; - static Shortcut* getShortcut(const char* key); + static Shortcut* getShortcut(const QString& key); static const QMap& shortcuts() { return _shortcuts; } static QActionGroup* getActionGroupForWidget(MsWidget w); static QActionGroup* getActionGroupForWidget(MsWidget w, Qt::ShortcutContext newShortcutContext); From b7c10b6ee952709f245a4f8563e84c2f48a1eeaa Mon Sep 17 00:00:00 2001 From: "Andrey M. Tokarev" Date: Sat, 6 Sep 2014 12:44:14 +0400 Subject: [PATCH 08/13] Replace Shortcut key type char* with QString --- mscore/musescore.cpp | 12 ++++++------ mscore/preferences.cpp | 12 +++++++++--- mscore/shortcut.cpp | 8 ++++---- mscore/shortcut.h | 4 ++-- 4 files changed, 21 insertions(+), 15 deletions(-) diff --git a/mscore/musescore.cpp b/mscore/musescore.cpp index a063550058bf..36a8e7820b64 100644 --- a/mscore/musescore.cpp +++ b/mscore/musescore.cpp @@ -2583,17 +2583,17 @@ void MuseScore::changeState(ScoreState val) QAction* a = s->action(); if (!a) continue; - if (enable && strcmp(s->key(), "undo") == 0) + if (enable && s->key() == "undo") a->setEnabled((s->state() & val) && (cs ? cs->undo()->canUndo() : false)); - else if (enable && strcmp(s->key(), "redo") == 0) + else if (enable && s->key() == "redo") a->setEnabled((s->state() & val) && (cs ? cs->undo()->canRedo() : false)); - else if (enable && strcmp(s->key(), "cut") == 0) + else if (enable && s->key() == "cut") a->setEnabled(cs && cs->selection().state() != SelState::NONE); - else if (enable && strcmp(s->key(), "copy") == 0) + else if (enable && s->key() == "copy") a->setEnabled(cs && cs->selection().state() != SelState::NONE); - else if (enable && strcmp(s->key(), "select-similar-range") == 0) + else if (enable && s->key() == "select-similar-range") a->setEnabled(cs && cs->selection().state() == SelState::RANGE); - else if (enable && strcmp(s->key(), "synth-control") == 0) { + else if (enable && s->key() == "synth-control") { Driver* driver = seq ? seq->driver() : 0; // a->setEnabled(driver && driver->getSynth()); if (MScore::debugMode) diff --git a/mscore/preferences.cpp b/mscore/preferences.cpp index 50bb1f60dc62..8c1e4d3eba69 100644 --- a/mscore/preferences.cpp +++ b/mscore/preferences.cpp @@ -1037,11 +1037,17 @@ void PreferenceDialog::updateSCListView() newItem->setIcon(0, *icons[int(s->icon())]); newItem->setText(1, s->keysToString()); newItem->setData(0, Qt::UserRole, s->key()); - QString accessibleInfo = tr("Action: %1; Shortcut: %2").arg(newItem->text(0)).arg(newItem->text(1).isEmpty() ? tr("No shortcut defined") : newItem->text(1)); + QString accessibleInfo = tr("Action: %1; Shortcut: %2") + .arg(newItem->text(0)).arg(newItem->text(1).isEmpty() + ? tr("No shortcut defined") : newItem->text(1)); newItem->setData(0, Qt::AccessibleTextRole, accessibleInfo); newItem->setData(1, Qt::AccessibleTextRole, accessibleInfo); - if (enableExperimental || (strncmp(s->key(), "media", 5) != 0 && strncmp(s->key(), "layer", 5) != 0 && strncmp(s->key(), "insert-fretframe", 16) != 0)) - shortcutList->addTopLevelItem(newItem); + if (enableExperimental + || (!s->key().startsWith("media") + && !s->key().startsWith("layer") + && !s->key().startsWith("insert-fretframe"))) { + shortcutList->addTopLevelItem(newItem); + } } shortcutList->resizeColumnToContents(0); } diff --git a/mscore/shortcut.cpp b/mscore/shortcut.cpp index 77222e19b506..665977d8679a 100644 --- a/mscore/shortcut.cpp +++ b/mscore/shortcut.cpp @@ -314,7 +314,7 @@ void Shortcut::init() // _shortcuts.clear(); for (unsigned i = 0;; ++i) { - if (sc[i]._key == 0) + if (sc[i]._key.isEmpty()) break; _shortcuts[sc[i]._key] = &sc[i]; } @@ -338,7 +338,7 @@ void Shortcut::save() xml.stag("Shortcuts"); for (unsigned i = 0;; ++i) { Shortcut* s = &sc[i]; - if (s->_key == 0) + if (s->_key.isEmpty()) break; s->write(xml); } @@ -371,7 +371,7 @@ void Shortcut::read(XmlReader& e) while (e.readNextStartElement()) { const QStringRef& tag(e.name()); if (tag == "key") - _key = strdup(e.readElementText().toLatin1().data()); // memory leak! + _key = e.readElementText(); else if (tag == "std") _standardKey = QKeySequence::StandardKey(e.readInt()); else if (tag == "seq") @@ -550,7 +550,7 @@ void Shortcut::reset() _keys.clear(); QList sl = loadDefaultShortcuts(); foreach(Shortcut1* sc, sl) { - if (strcmp(sc->key.toStdString().c_str(), _key) == 0) { + if (sc->key == _key) { setKeys(sc->keys); setStandardKey(sc->standardKey); break; diff --git a/mscore/shortcut.h b/mscore/shortcut.h index b0c315f53260..44c9fe468498 100644 --- a/mscore/shortcut.h +++ b/mscore/shortcut.h @@ -82,7 +82,7 @@ static const int KEYSEQ_SIZE = 4; //--------------------------------------------------------- class Shortcut { - const char* _key { 0 }; //! xml tag name for configuration file + QString _key; //! xml tag name for configuration file const char* _descr { 0 }; //! descriptor, shown in editor const char* _text { 0 }; //! text as shown on buttons or menus const char* _help { 0 }; //! ballon help @@ -155,7 +155,7 @@ class Shortcut { QAction* action() const; - const char* key() const { return _key; } + QString key() const { return _key; } QString descr() const; QString text() const; QString help() const; From e2c9e3fe7ee591b2f16d5dd47ba03c39d717005e Mon Sep 17 00:00:00 2001 From: "Andrey M. Tokarev" Date: Sat, 6 Sep 2014 12:52:39 +0400 Subject: [PATCH 09/13] Replace remaining char* strings in Shortcut with QString --- mscore/menus.cpp | 8 ++++---- mscore/shortcut.cpp | 8 ++++---- mscore/shortcut.h | 14 +++++++------- 3 files changed, 15 insertions(+), 15 deletions(-) diff --git a/mscore/menus.cpp b/mscore/menus.cpp index 7bf1d415b7af..2c93d1ca9d6e 100644 --- a/mscore/menus.cpp +++ b/mscore/menus.cpp @@ -202,7 +202,7 @@ Palette* MuseScore::newDynamicsPalette(bool master) sp->append(dynamic, dynamic->dynamicTypeName()); } } - + return sp; } @@ -276,7 +276,7 @@ Palette* MuseScore::newAccidentalsPalette(bool basic) QAction* action = s->action(); QIcon icon(action->icon()); ik->setAction("add-brackets", icon); - sp->append(ik, s->help()); + sp->append(ik, s->help()); return sp; } @@ -544,7 +544,7 @@ Palette* MuseScore::newBreathPalette() sp->setDrawGrid(true); for (int i = 0; i < 4; ++i) { - if (i == 1) // do not add two similar breaths. //TODO add support for other break mark + if (i == 1) // do not add two similar breaths. //TODO add support for other break mark continue; Breath* a = new Breath(gscore); a->setBreathType(i); @@ -930,7 +930,7 @@ Palette* MuseScore::newTextPalette() st->setTextStyleType(TextStyleType::TEMPO); st->setText(tr("Swing")); st->setSwing(true); - sp->append(st, tr("Swing")); + sp->append(st, tr("Swing")); RehearsalMark* rhm = new RehearsalMark(gscore); rhm->setTrack(0); diff --git a/mscore/shortcut.cpp b/mscore/shortcut.cpp index 665977d8679a..3c4374244d40 100644 --- a/mscore/shortcut.cpp +++ b/mscore/shortcut.cpp @@ -152,7 +152,7 @@ void Shortcut::setKeys(const QList& ks) QString Shortcut::descr() const { - return qApp->translate("action", _descr); + return qApp->translate("action", _descr.toStdString().c_str()); } //--------------------------------------------------------- @@ -161,7 +161,7 @@ QString Shortcut::descr() const QString Shortcut::text() const { - return qApp->translate("action", _text); + return qApp->translate("action", _text.toStdString().c_str()); } //--------------------------------------------------------- @@ -170,7 +170,7 @@ QString Shortcut::text() const QString Shortcut::help() const { - return qApp->translate("action", _help); + return qApp->translate("action", _help.toStdString().c_str()); } //--------------------------------------------------------- @@ -222,7 +222,7 @@ QAction* Shortcut::action() const _action->setShortcuts(_keys); _action->setShortcutContext(_context); - if (_help) { + if (!_help.isEmpty()) { _action->setToolTip(help()); _action->setWhatsThis(help()); } diff --git a/mscore/shortcut.h b/mscore/shortcut.h index 44c9fe468498..5e6a5eb685d2 100644 --- a/mscore/shortcut.h +++ b/mscore/shortcut.h @@ -82,13 +82,13 @@ static const int KEYSEQ_SIZE = 4; //--------------------------------------------------------- class Shortcut { - QString _key; //! xml tag name for configuration file - const char* _descr { 0 }; //! descriptor, shown in editor - const char* _text { 0 }; //! text as shown on buttons or menus - const char* _help { 0 }; //! ballon help - int _state { 0 }; //! shortcut is valid in this Mscore state - //! (or'd list of states) - int _flags { 0 }; + QString _key; //! xml tag name for configuration file + QString _descr; //! descriptor, shown in editor + QString _text; //! text as shown on buttons or menus + QString _help; //! ballon help + int _state = 0; //! shortcut is valid in this Mscore state + //! (or'd list of states) + int _flags = 0; QList _keys; //! shortcut list From b339e305341d30ab5900d5a9e186bba8118f2c09 Mon Sep 17 00:00:00 2001 From: "Andrey M. Tokarev" Date: Sat, 6 Sep 2014 13:03:25 +0400 Subject: [PATCH 10/13] Fix KeySym memory leak --- libmscore/keysig.cpp | 54 +++++++++++++++++++------------------------- libmscore/keysig.h | 4 ++-- mscore/keyedit.cpp | 8 +++---- 3 files changed, 29 insertions(+), 37 deletions(-) diff --git a/libmscore/keysig.cpp b/libmscore/keysig.cpp index a1a81c6aaa89..bfe387da7483 100644 --- a/libmscore/keysig.cpp +++ b/libmscore/keysig.cpp @@ -56,8 +56,8 @@ KeySig::KeySig(const KeySig& k) : Element(k) { _showCourtesy = k._showCourtesy; - foreach(KeySym* ks, k.keySymbols) - keySymbols.append(new KeySym(*ks)); + for (const KeySym& ks: k.keySymbols) + keySymbols.append(ks); _sig = k._sig; _hideNaturals = false; } @@ -75,7 +75,7 @@ qreal KeySig::mag() const // setCustom //--------------------------------------------------------- -void KeySig::setCustom(const QList& symbols) +void KeySig::setCustom(const QList& symbols) { _sig.setCustomType(0); keySymbols = symbols; @@ -87,9 +87,9 @@ void KeySig::setCustom(const QList& symbols) void KeySig::addLayout(SymId sym, qreal x, int line) { - KeySym* ks = new KeySym; - ks->sym = sym; - ks->spos = QPointF(x, qreal(line) * .5); + KeySym ks; + ks.sym = sym; + ks.spos = QPointF(x, qreal(line) * .5); keySymbols.append(ks); } @@ -103,20 +103,18 @@ void KeySig::layout() setbbox(QRectF()); if (staff() && !staff()->genKeySig()) { // no key sigs on TAB staves - qDeleteAll(keySymbols); keySymbols.clear(); return; } if (isCustom()) { - foreach(KeySym* ks, keySymbols) { - ks->pos = ks->spos * _spatium; - addbbox(symBbox(ks->sym).translated(ks->pos)); + for (KeySym& ks: keySymbols) { + ks.pos = ks.spos * _spatium; + addbbox(symBbox(ks.sym).translated(ks.pos)); } return; } - qDeleteAll(keySymbols); keySymbols.clear(); // determine current clef for this staff @@ -249,9 +247,9 @@ void KeySig::layout() // compute bbox setbbox(QRectF()); - for (KeySym* ks : keySymbols) { - ks->pos = ks->spos * _spatium; - addbbox(symBbox(ks->sym).translated(ks->pos)); + for (KeySym& ks : keySymbols) { + ks.pos = ks.spos * _spatium; + addbbox(symBbox(ks.sym).translated(ks.pos)); } } @@ -262,8 +260,8 @@ void KeySig::layout() void KeySig::draw(QPainter* p) const { p->setPen(curColor()); - foreach(const KeySym* ks, keySymbols) - drawSymbol(ks->sym, p, QPointF(ks->pos.x(), ks->pos.y())); + for (const KeySym& ks: keySymbols) + drawSymbol(ks.sym, p, QPointF(ks.pos.x(), ks.pos.y())); } //--------------------------------------------------------- @@ -334,10 +332,10 @@ void KeySig::write(Xml& xml) const Element::writeProperties(xml); if (_sig.custom()) { xml.tag("custom", _sig.customType()); - foreach(const KeySym* ks, keySymbols) { + for (const KeySym& ks: keySymbols) { xml.stag("KeySym"); - xml.tag("sym", int(ks->sym)); - xml.tag("pos", ks->spos); + xml.tag("sym", int(ks.sym)); + xml.tag("pos", ks.spos); xml.etag(); } } @@ -361,13 +359,13 @@ void KeySig::read(XmlReader& e) while (e.readNextStartElement()) { const QStringRef& tag(e.name()); if (tag == "KeySym") { - KeySym* ks = new KeySym; + KeySym ks; while (e.readNextStartElement()) { const QStringRef& tag(e.name()); if (tag == "sym") - ks->sym = SymId(e.readInt()); + ks.sym = SymId(e.readInt()); else if (tag == "pos") - ks->spos = e.readPoint(); + ks.spos = e.readPoint(); else e.unknown(); } @@ -408,11 +406,9 @@ bool KeySig::operator==(const KeySig& k) const if (n != k.keySymbols.size()) return false; for (int i = 0; i < n; ++i) { - KeySym* ks1 = keySymbols[i]; - KeySym* ks2 = k.keySymbols[i]; - if (ks1->sym != ks2->sym) + if (keySymbols[i].sym != k.keySymbols[i].sym) return false; - if (ks1->spos != ks2->spos) + if (keySymbols[i].spos != k.keySymbols[i].spos) return false; } return true; @@ -432,11 +428,7 @@ void KeySig::changeKeySigEvent(const KeySigEvent& t) KeySig* ks = _score->customKeySig(t.customType()); if (!ks) return; - foreach(KeySym* k, keySymbols) - delete k; - keySymbols.clear(); - foreach(KeySym* k, ks->keySymbols) - keySymbols.append(new KeySym(*k)); + keySymbols = ks->keySymbols; } setKeySigEvent(t); } diff --git a/libmscore/keysig.h b/libmscore/keysig.h index e0b1c9b20d31..23f86f7b2994 100644 --- a/libmscore/keysig.h +++ b/libmscore/keysig.h @@ -48,7 +48,7 @@ class KeySig : public Element { bool _showCourtesy; bool _hideNaturals; // used in layout to override score style (needed for the Continuous panel) - QList keySymbols; + QList keySymbols; KeySigEvent _sig; void addLayout(SymId sym, qreal x, int y); @@ -68,7 +68,7 @@ class KeySig : public Element { Segment* segment() const { return (Segment*)parent(); } Measure* measure() const { return parent() ? (Measure*)parent()->parent() : nullptr; } Space space() const; - void setCustom(const QList& symbols); + void setCustom(const QList& symbols); virtual void write(Xml&) const; virtual void read(XmlReader&); //@ -7 (flats) -- +7 (sharps) diff --git a/mscore/keyedit.cpp b/mscore/keyedit.cpp index 9b5d2c46249b..fb31b5ab4dff 100644 --- a/mscore/keyedit.cpp +++ b/mscore/keyedit.cpp @@ -325,7 +325,7 @@ KeyEditor::KeyEditor(QWidget* parent) void KeyEditor::addClicked() { - QList symbols; + QList symbols; double extraMag = 2.0; const QList al = canvas->getAccidentals(); @@ -337,11 +337,11 @@ void KeyEditor::addClicked() xoff = pos.x(); } foreach(Accidental* a, al) { - KeySym* s = new KeySym; - s->sym = a->symbol(); + KeySym s; + s.sym = a->symbol(); QPointF pos = a->ipos(); pos.rx() -= xoff; - s->spos = pos / spatium; + s.spos = pos / spatium; symbols.append(s); } From 51c2ca936ee58726f3b5e1da285efb53dac29566 Mon Sep 17 00:00:00 2001 From: "Andrey M. Tokarev" Date: Sat, 6 Sep 2014 13:08:37 +0400 Subject: [PATCH 11/13] Fix Clef elements memory leak --- libmscore/clef.cpp | 5 +++++ libmscore/clef.h | 1 + 2 files changed, 6 insertions(+) diff --git a/libmscore/clef.cpp b/libmscore/clef.cpp index 25873778d61c..cee20adbfd36 100644 --- a/libmscore/clef.cpp +++ b/libmscore/clef.cpp @@ -101,6 +101,11 @@ Clef::Clef(const Clef& c) layout1(); } +Clef::~Clef() + { + qDeleteAll(elements); + } + //--------------------------------------------------------- // mag //--------------------------------------------------------- diff --git a/libmscore/clef.h b/libmscore/clef.h index 2dc7542849b7..64598b536691 100644 --- a/libmscore/clef.h +++ b/libmscore/clef.h @@ -137,6 +137,7 @@ class Clef : public Element { public: Clef(Score*); Clef(const Clef&); + ~Clef(); virtual Clef* clone() const { return new Clef(*this); } virtual Element::Type type() const { return Element::Type::CLEF; } virtual void setSelected(bool f); From a49a32e3747199adbd5e1f4d5088765c91f3e8a7 Mon Sep 17 00:00:00 2001 From: "Andrey M. Tokarev" Date: Sat, 6 Sep 2014 20:54:37 +0400 Subject: [PATCH 12/13] Check for corner case of self assignment --- mscore/importmidi_view.cpp | 2 ++ 1 file changed, 2 insertions(+) diff --git a/mscore/importmidi_view.cpp b/mscore/importmidi_view.cpp index fee8e5f96712..6dc2f0403f59 100644 --- a/mscore/importmidi_view.cpp +++ b/mscore/importmidi_view.cpp @@ -258,6 +258,8 @@ void TracksView::setFrozenColCount(int count) void TracksView::setItemDelegate(SeparatorDelegate *delegate) { + if (delegate == _delegate) + return; delete _delegate; _delegate = delegate; QTableView::setItemDelegate(delegate); From 6832e9678aeed3327b893905c0c14824e9520292 Mon Sep 17 00:00:00 2001 From: "Andrey M. Tokarev" Date: Sat, 6 Sep 2014 21:04:26 +0400 Subject: [PATCH 13/13] Fix M_def_rank memory leak --- aeolus/model.cpp | 40 ++++++++++++++++++++-------------------- 1 file changed, 20 insertions(+), 20 deletions(-) diff --git a/aeolus/model.cpp b/aeolus/model.cpp index 29b5f6b57f06..89e71ae647ae 100644 --- a/aeolus/model.cpp +++ b/aeolus/model.cpp @@ -186,26 +186,26 @@ void Model::proc_rank (int g, int i, int comm) } else if (R->_count != _count) { R->_count = _count; - M_def_rank* M = new M_def_rank (comm); - M->_divis = d; - M->_rank = r; - M->_group = g; - M->_ifelm = i; - M->_fsamp = _aeolus->_fsamp; - M->_fbase = _fbase; - M->_scale = scales [_itemp]._data; - M->_sdef = R->_sdef; - M->_wave = R->_wave; - M->_path = _waves; - -//WS send_event(TO_IFACE, new M_ifc_ifelm (MT_IFC_ELATT, M->_group, M->_ifelm)); - - M->_wave = new Rankwave (M->_sdef->_n0, M->_sdef->_n1); - if (M->_wave->load (M->_path, M->_sdef, M->_fsamp, M->_fbase, M->_scale)) - M->_wave->gen_waves (M->_sdef, M->_fsamp, M->_fbase, M->_scale); - - _aeolus->_divisp [M->_divis]->set_rank (M->_rank, M->_wave, M->_sdef->_pan, M->_sdef->_del); - _divis [M->_divis]._ranks [M->_rank]._wave = M->_wave; + M_def_rank M(comm); + M._divis = d; + M._rank = r; + M._group = g; + M._ifelm = i; + M._fsamp = _aeolus->_fsamp; + M._fbase = _fbase; + M._scale = scales [_itemp]._data; + M._sdef = R->_sdef; + M._wave = R->_wave; + M._path = _waves; + +//WS send_event(TO_IFACE, new M_ifc_ifelm (MT_IFC_ELATT, M._group, M._ifelm)); + + M._wave = new Rankwave (M._sdef->_n0, M._sdef->_n1); + if (M._wave->load (M._path, M._sdef, M._fsamp, M._fbase, M._scale)) + M._wave->gen_waves (M._sdef, M._fsamp, M._fbase, M._scale); + + _aeolus->_divisp [M._divis]->set_rank (M._rank, M._wave, M._sdef->_pan, M._sdef->_del); + _divis [M._divis]._ranks [M._rank]._wave = M._wave; } } }