From: <rel...@us...> - 2009-10-25 22:17:22
|
Revision: 406 http://modplug.svn.sourceforge.net/modplug/?rev=406&view=rev Author: relabsoluness Date: 2009-10-25 22:17:12 +0000 (Sun, 25 Oct 2009) Log Message: ----------- [New] Sequence editor: Can now copy/cut/paste order selections. [Fix] Autosave: 'Modified since last autosave'-flag wasn't updated when document was set modified using ThreadSafeSetModified. [Mod] VC2003 build: Added command line optimization options to zlib project. [Ref] Minor cleanup. Modified Paths: -------------- trunk/OpenMPT/mptrack/CreditStatic.cpp trunk/OpenMPT/mptrack/Ctrl_pat.h trunk/OpenMPT/mptrack/Ctrl_seq.cpp trunk/OpenMPT/mptrack/MainFrm.cpp trunk/OpenMPT/mptrack/Mainfrm.h trunk/OpenMPT/mptrack/Moddoc.cpp trunk/OpenMPT/mptrack/Moddoc.h trunk/OpenMPT/soundlib/ModSequence.cpp trunk/OpenMPT/soundlib/ModSequence.h trunk/OpenMPT/soundlib/Sndfile.h trunk/OpenMPT/zlib/contrib/vstudio/vc7/zlibstat.vcproj Modified: trunk/OpenMPT/mptrack/CreditStatic.cpp =================================================================== --- trunk/OpenMPT/mptrack/CreditStatic.cpp 2009-10-24 19:05:56 UTC (rev 405) +++ trunk/OpenMPT/mptrack/CreditStatic.cpp 2009-10-25 22:17:12 UTC (rev 406) @@ -226,6 +226,7 @@ BOOL CCreditStatic::OnEraseBkgnd(CDC* pDC) { + UNREFERENCED_PARAMETER(pDC); return TRUE; // return CStatic::OnEraseBkgnd(pDC); @@ -539,8 +540,8 @@ CFont* pOldFont = NULL; BOOL bSuccess = FALSE; - BOOL bUnderline; - BOOL bItalic; + BYTE bUnderline; + BYTE bItalic; int rmcode = 0; if (!m_szWork.IsEmpty()) { @@ -668,7 +669,7 @@ } CRect r(m_ClientRect); r.top = r.bottom-m_nClip; - int x = memDC.DrawText((const char *)m_szWork,m_szWork.GetLength()-rmcode,&r,DT_TOP|DT_CENTER| + memDC.DrawText((const char *)m_szWork,m_szWork.GetLength()-rmcode,&r,DT_TOP|DT_CENTER| DT_NOPREFIX | DT_SINGLELINE); m_bDrawText=FALSE; } @@ -737,8 +738,8 @@ BOOL bSuccess = FALSE; BOOL bIsBitmap = FALSE; - BOOL bUnderline; - BOOL bItalic; + BYTE bUnderline; + BYTE bItalic; int rmcode = 0; CBitmap bitmap; @@ -839,7 +840,7 @@ CSize size; if(m_szWork.GetLength()-rmcode != 0) { - int x = memDC.DrawText((const char *)m_szWork,m_szWork.GetLength()-rmcode,&r,DT_TOP|DT_CENTER| + memDC.DrawText((const char *)m_szWork,m_szWork.GetLength()-rmcode,&r,DT_TOP|DT_CENTER| DT_NOPREFIX | DT_SINGLELINE); size = memDC.GetTextExtent((LPCTSTR)m_szWork,m_szWork.GetLength()-rmcode); } @@ -923,7 +924,7 @@ LOGPALETTE *pLP = (LOGPALETTE *) new BYTE[nSize]; pLP->palVersion = 0x300; - pLP->palNumEntries = nColors; + pLP->palNumEntries = (WORD)nColors; for( int i=0; i < nColors; i++) { Modified: trunk/OpenMPT/mptrack/Ctrl_pat.h =================================================================== --- trunk/OpenMPT/mptrack/Ctrl_pat.h 2009-10-24 19:05:56 UTC (rev 405) +++ trunk/OpenMPT/mptrack/Ctrl_pat.h 2009-10-25 22:17:12 UTC (rev 406) @@ -9,6 +9,7 @@ { ORDERINDEX nOrdLo; ORDERINDEX nOrdHi; + ORDERINDEX GetSelCount() const {return nOrdHi - nOrdLo + 1;} }; //=========================== @@ -84,7 +85,11 @@ // Set given sqeuence and update orderlist display. void SelectSequence(const SEQUENCEINDEX nSeq); -public: + // Clipboard. + void OnEditCopy(); + void OnEditCut(); + void OnEditPaste(); + //{{AFX_VIRTUAL(COrderList) virtual BOOL PreTranslateMessage(MSG *pMsg); virtual void UpdateView(DWORD dwHintMask=0, CObject *pObj=NULL); @@ -119,6 +124,7 @@ afx_msg LRESULT OnDragonDropping(WPARAM bDoDrop, LPARAM lParam); afx_msg LRESULT OnHelpHitTest(WPARAM, LPARAM lParam); afx_msg void OnSelectSequence(UINT nid); + afx_msg LRESULT OnCustomKeyMsg(WPARAM, LPARAM); //}}AFX_MSG DECLARE_MESSAGE_MAP() }; Modified: trunk/OpenMPT/mptrack/Ctrl_seq.cpp =================================================================== --- trunk/OpenMPT/mptrack/Ctrl_seq.cpp 2009-10-24 19:05:56 UTC (rev 405) +++ trunk/OpenMPT/mptrack/Ctrl_seq.cpp 2009-10-25 22:17:12 UTC (rev 406) @@ -57,6 +57,7 @@ ON_COMMAND_RANGE(ID_SEQUENCE_ITEM, ID_SEQUENCE_ITEM + MAX_SEQUENCES + 1, OnSelectSequence) ON_MESSAGE(WM_MOD_DRAGONDROPPING, OnDragonDropping) ON_MESSAGE(WM_HELPHITTEST, OnHelpHitTest) + ON_MESSAGE(WM_MOD_KEYCOMMAND, OnCustomKeyMsg) //}}AFX_MSG_MAP END_MESSAGE_MAP() @@ -455,6 +456,169 @@ } +static const char szClipboardOrdersHdr[] = "OpenMPT %3s\x0D\x0A"; +static const char szClipboardOrdCountFieldHdr[] = "OrdNum: %u\x0D\x0A"; +static const char szClipboardOrdersFieldHdr[] = "OrdLst: "; + + +void COrderList::OnEditCut() +//-------------------------- +{ + OnEditCopy(); + OnDeleteOrder(); +} + + +void COrderList::OnEditPaste() +//---------------------------- +{ + CMainFrame *pMainFrm = CMainFrame::GetMainFrame(); + CSoundFile* pSf = m_pModDoc->GetSoundFile(); + if (!pMainFrm) + return; + BeginWaitCursor(); + if (pMainFrm->OpenClipboard()) + { + HGLOBAL hCpy = ::GetClipboardData(CF_TEXT); + LPCSTR p; + + if ((hCpy) && ((p = (LPCSTR)GlobalLock(hCpy)) != NULL)) + { + const DWORD dwMemSize = GlobalSize(hCpy); + + if (dwMemSize > sizeof(szClipboardOrdersHdr) && + memcmp(p, "OpenMPT ", 8) == 0 && + memcmp(p + 11, "\x0D\x0A", 2) == 0) + { + char buf[8]; + p += sizeof(szClipboardOrdersHdr) - 1; + std::istrstream iStrm(p, dwMemSize - sizeof(szClipboardOrdersHdr) + 1); + ORDERINDEX nCount = 0; + std::vector<PATTERNINDEX> vecPat; + while (iStrm.get(buf, sizeof(buf), '\n')) + { + if (memcmp(buf, "OrdNum:", 8) == 0) // Read expected order count. + iStrm >> nCount; + else if (memcmp(buf, "OrdLst:", 8) != 0) + { // Unrecognized data -> skip line. + iStrm.ignore((std::numeric_limits<std::streamsize>::max)(), '\n'); + continue; + } + else // Read orders. + { + LimitMax(nCount, pSf->GetModSpecifications().ordersMax); + vecPat.reserve(nCount); + char bufItem[16]; + while (iStrm.peek() >= 32 && iStrm.getline(bufItem, sizeof(bufItem), ' ')) + { + if (vecPat.size() >= pSf->GetModSpecifications().ordersMax) + break; + if (!(isdigit(bufItem[0]) || bufItem[0] == '+' || bufItem[0] == '-')) + continue; + PATTERNINDEX nPat = pSf->Order.GetInvalidPatIndex(); + if (bufItem[0] == '+') + nPat = pSf->Order.GetIgnoreIndex(); + else if (isdigit(bufItem[0])) + { + nPat = ConvertStrTo<PATTERNINDEX>(bufItem); + if (nPat >= pSf->GetModSpecifications().patternsMax) + nPat = pSf->Order.GetInvalidPatIndex(); + } + vecPat.push_back(nPat); + } + nCount = pSf->Order.Insert(m_nScrollPos, (ORDERINDEX)vecPat.size()); + for (ORDERINDEX nOrd = 0; nOrd < nCount; nOrd++) + pSf->Order[m_nScrollPos + nOrd] = vecPat[nOrd]; + } + m_pModDoc->SetModified(); + m_pModDoc->UpdateAllViews(NULL, HINT_MODSEQUENCE, NULL); + } + } + GlobalUnlock(hCpy); + } + CloseClipboard(); + } + EndWaitCursor(); +} + + +void COrderList::OnEditCopy() +//--------------------------- +{ + CMainFrame *pMainFrm = CMainFrame::GetMainFrame(); + if ((!pMainFrm)) return; + + const ORD_SELECTION ordsel = GetCurSel(false); + + DWORD dwMemSize; + HGLOBAL hCpy; + + BeginWaitCursor(); + dwMemSize = sizeof(szClipboardOrdersHdr) + sizeof(szClipboardOrdersFieldHdr) + sizeof(szClipboardOrdCountFieldHdr); + dwMemSize += ordsel.GetSelCount() * 6 + 8; + if ((pMainFrm->OpenClipboard()) && ((hCpy = GlobalAlloc(GMEM_MOVEABLE|GMEM_DDESHARE, dwMemSize))!=NULL)) + { + LPCSTR pszFormatName; + EmptyClipboard(); + switch(m_pModDoc->GetSoundFile()->GetType()) + { + case MOD_TYPE_S3M: pszFormatName = "S3M"; break; + case MOD_TYPE_XM: pszFormatName = "XM"; break; + case MOD_TYPE_IT: pszFormatName = "IT"; break; + case MOD_TYPE_MPT: pszFormatName = "MPT"; break; + default: pszFormatName = "MOD"; break; + } + LPSTR p = (LPSTR)GlobalLock(hCpy); + if (p) + { + const ModSequence& seq = m_pModDoc->GetSoundFile()->Order; + wsprintf(p, szClipboardOrdersHdr, pszFormatName); + p += strlen(p); + wsprintf(p, szClipboardOrdCountFieldHdr, ordsel.GetSelCount()); + strcat(p, szClipboardOrdersFieldHdr); + p += strlen(p); + for(ORDERINDEX i = ordsel.nOrdLo; i <= ordsel.nOrdHi; i++) + { + std::string str; + if (seq[i] == seq.GetInvalidPatIndex()) + str = "-"; + else if (seq[i] == seq.GetIgnoreIndex()) + str = "+"; + else + str = Stringify(seq[i]); + memcpy(p, str.c_str(), str.size()); + p += str.size(); + *p++ = ' '; + } + *p++ = 0x0D; + *p++ = 0x0A; + *p = 0; + } + GlobalUnlock(hCpy); + SetClipboardData(CF_TEXT, (HANDLE) hCpy); + CloseClipboard(); + } + EndWaitCursor(); +} + + +LRESULT COrderList::OnCustomKeyMsg(WPARAM wParam, LPARAM) +//------------------------------------------------------- +{ + if (wParam == kcNull) + return 0; + + switch(wParam) + { + case kcEditCopy: OnEditCopy(); return wParam; + case kcEditCut: OnEditCut(); return wParam; + case kcEditPaste: OnEditPaste(); return wParam; + } + + return 0; +} + + void COrderList::UpdateView(DWORD dwHintMask, CObject *pObj) //---------------------------------------------------------- { @@ -604,6 +768,7 @@ CWnd::OnSetFocus(pWnd); InvalidateSelection(); UpdateInfoText(); + CMainFrame::GetMainFrame()->m_pOrderlistHasFocus = this; } @@ -613,6 +778,7 @@ CWnd::OnKillFocus(pWnd); InvalidateSelection(); m_bShift = FALSE; + CMainFrame::GetMainFrame()->m_pOrderlistHasFocus = nullptr; } @@ -998,10 +1164,8 @@ // remove selection m_nScrollPos2nd = ORDERINDEX_INVALID; - for(int i = 0; i <= (selection.nOrdHi - selection.nOrdLo); i++) - { - m_pModDoc->RemoveOrder(pSndFile->Order.GetCurrentSequenceIndex(), selection.nOrdLo); - } + pSndFile->Order.Remove(selection.nOrdLo, selection.nOrdHi); + InvalidateRect(NULL, FALSE); m_pModDoc->UpdateAllViews(NULL, HINT_MODSEQUENCE, this); Modified: trunk/OpenMPT/mptrack/MainFrm.cpp =================================================================== --- trunk/OpenMPT/mptrack/MainFrm.cpp 2009-10-24 19:05:56 UTC (rev 405) +++ trunk/OpenMPT/mptrack/MainFrm.cpp 2009-10-25 22:17:12 UTC (rev 406) @@ -289,6 +289,7 @@ { m_bModTreeHasFocus = false; //rewbs.customKeys m_pNoteMapHasFocus = NULL; //rewbs.customKeys + m_pOrderlistHasFocus = nullptr; m_bOptionsLocked = false; //rewbs.customKeys m_pJustModifiedDoc = NULL; @@ -2523,7 +2524,7 @@ pModDoc->m_bModifiedChanged=false; }*/ if (m_pJustModifiedDoc) { - m_pJustModifiedDoc->SetModifiedFlag(true); + m_pJustModifiedDoc->SetModified(true); m_pJustModifiedDoc = NULL; } @@ -2720,7 +2721,7 @@ // case ID_NETLINK_UT: pszURL = "http://www.united-trackers.org"; break; // case ID_NETLINK_OSMUSIC: pszURL = "http://www.osmusic.net/"; break; // case ID_NETLINK_HANDBOOK: pszURL = "http://www.modplug.com/mods/handbook/handbook.htm"; break; - case ID_NETLINK_MPTFR: pszURL = "http://mpt.new.fr/"; break; +// case ID_NETLINK_MPTFR: pszURL = "http://mpt.new.fr/"; break; case ID_NETLINK_FORUMS: pszURL = "http://www.lpchip.com/modplug"; break; case ID_NETLINK_PLUGINS: pszURL = "http://www.kvraudio.com"; break; case ID_NETLINK_MODARCHIVE: pszURL = "http://modarchive.org/"; break; @@ -2828,6 +2829,8 @@ return m_wndTree.PostMessageToModTree(WM_MOD_KEYCOMMAND, wParam, lParam); if (m_pNoteMapHasFocus) return m_pNoteMapHasFocus->PostMessage(WM_MOD_KEYCOMMAND, wParam, lParam); + if (m_pOrderlistHasFocus) + return m_pOrderlistHasFocus->PostMessage(WM_MOD_KEYCOMMAND, wParam, lParam); //Else send it to the active view CView* pView = GetActiveView(); Modified: trunk/OpenMPT/mptrack/Mainfrm.h =================================================================== --- trunk/OpenMPT/mptrack/Mainfrm.h 2009-10-24 19:05:56 UTC (rev 405) +++ trunk/OpenMPT/mptrack/Mainfrm.h 2009-10-25 22:17:12 UTC (rev 406) @@ -544,6 +544,7 @@ static CInputHandler* GetInputHandler() { return m_InputHandler; } //rewbs.customKeys bool m_bModTreeHasFocus; //rewbs.customKeys CWnd *m_pNoteMapHasFocus; //rewbs.customKeys + CWnd* m_pOrderlistHasFocus; long GetSampleRate(); //rewbs.VSTTimeInfo long GetTotalSampleCount(); //rewbs.VSTTimeInfo double GetApproxBPM(); //rewbs.VSTTimeInfo Modified: trunk/OpenMPT/mptrack/Moddoc.cpp =================================================================== --- trunk/OpenMPT/mptrack/Moddoc.cpp 2009-10-24 19:05:56 UTC (rev 405) +++ trunk/OpenMPT/mptrack/Moddoc.cpp 2009-10-25 22:17:12 UTC (rev 406) @@ -149,7 +149,7 @@ m_SndFile.m_nMixLevels = m_SndFile.GetModSpecifications().defaultMixLevels; m_SndFile.m_pConfig->SetMixLevels(m_SndFile.m_nMixLevels); // ...and the order length - m_SndFile.Order.resize(m_SndFile.GetModSpecifications().ordersMax); + m_SndFile.Order.resize(min(MAX_ORDERS, m_SndFile.GetModSpecifications().ordersMax)); theApp.GetDefaultMidiMacro(&m_SndFile.m_MidiCfg); ReinitRecordState(); @@ -1105,22 +1105,22 @@ return true; } -bool CModDoc::IsChannelRecord1(CHANNELINDEX channel) -//-------------------------------------------------- + +bool CModDoc::IsChannelRecord1(CHANNELINDEX channel) const +//-------------------------------------------------------- { - UINT m = 1 << (channel&7); - return (MultiRecordMask[channel>>3] & m) ? true : false; + return m_bsMultiRecordMask[channel]; } -bool CModDoc::IsChannelRecord2(CHANNELINDEX channel) -//-------------------------------------------------- + +bool CModDoc::IsChannelRecord2(CHANNELINDEX channel) const +//-------------------------------------------------------- { - UINT m = 1 << (channel&7); - return (MultiSplitRecordMask[channel>>3] & m) ? true : false; + return m_bsMultiSplitRecordMask[channel]; } -BYTE CModDoc::IsChannelRecord(CHANNELINDEX channel) -//------------------------------------------------- +BYTE CModDoc::IsChannelRecord(CHANNELINDEX channel) const +//------------------------------------------------------- { if(IsChannelRecord1(channel)) return 1; if(IsChannelRecord2(channel)) return 2; @@ -1130,38 +1130,46 @@ void CModDoc::Record1Channel(CHANNELINDEX channel, bool select) //------------------------------------------------------------- { - UINT m = 1 << (channel&7); - - if(!select){ - if(MultiRecordMask[channel>>3] & m) MultiRecordMask[channel>>3] ^= m; - if(MultiSplitRecordMask[channel>>3] & m) MultiSplitRecordMask[channel>>3] ^= m; + if (!select) + { + m_bsMultiRecordMask.reset(channel); + m_bsMultiSplitRecordMask.reset(channel); } - else{ - MultiRecordMask[channel>>3] ^= m; - if(MultiSplitRecordMask[channel>>3] & m) MultiSplitRecordMask[channel>>3] ^= m; + else + { + m_bsMultiRecordMask.flip(channel); + m_bsMultiSplitRecordMask.reset(channel); } } void CModDoc::Record2Channel(CHANNELINDEX channel, bool select) //------------------------------------------------------------- { - UINT m = 1 << (channel&7); - - if(!select){ - if(MultiRecordMask[channel>>3] & m) MultiRecordMask[channel>>3] ^= m; - if(MultiSplitRecordMask[channel>>3] & m) MultiSplitRecordMask[channel>>3] ^= m; + if (!select) + { + m_bsMultiRecordMask.reset(channel); + m_bsMultiSplitRecordMask.reset(channel); } - else{ - MultiSplitRecordMask[channel>>3] ^= m; - if(MultiRecordMask[channel>>3] & m) MultiRecordMask[channel>>3] ^= m; + else + { + m_bsMultiSplitRecordMask.flip(channel); + m_bsMultiRecordMask.reset(channel); } } void CModDoc::ReinitRecordState(bool unselect) //-------------------------------------------- { - memset(MultiRecordMask, unselect ? 0 : 0xff, sizeof(MultiRecordMask)); - memset(MultiSplitRecordMask, unselect ? 0 : 0xff, sizeof(MultiSplitRecordMask)); + if (unselect) + { + m_bsMultiRecordMask.reset(); + m_bsMultiSplitRecordMask.reset(); + } + else + { + m_bsMultiRecordMask.set(); + m_bsMultiSplitRecordMask.set(); + } } // -! NEW_FEATURE#0015 Modified: trunk/OpenMPT/mptrack/Moddoc.h =================================================================== --- trunk/OpenMPT/mptrack/Moddoc.h 2009-10-24 19:05:56 UTC (rev 405) +++ trunk/OpenMPT/mptrack/Moddoc.h 2009-10-25 22:17:12 UTC (rev 406) @@ -38,7 +38,7 @@ #define HINT_SPEEDCHANGE 0x40000 //rewbs.envRowGrid #define HINT_SEQNAMES 0x80000 #define HINT_MAXHINTFLAG HINT_SEQNAMES -//Bits 0-18 are reserved. +//Bits 0-19 are reserved. #define HINT_MASK_FLAGS (2*HINT_MAXHINTFLAG - 1) //When applied to hint parameter, should give the flag part. #define HINT_MASK_ITEM (~HINT_MASK_FLAGS) //To nullify update hintbits from hint parameter. #define HintFlagPart(x) ((x) & HINT_MASK_FLAGS) @@ -136,8 +136,8 @@ // -> CODE#0015 // -> DESC="channels management dlg" - BYTE MultiRecordMask[(MAX_CHANNELS+7)/8]; - BYTE MultiSplitRecordMask[(MAX_CHANNELS+7)/8]; + std::bitset<MAX_BASECHANNELS> m_bsMultiRecordMask; + std::bitset<MAX_BASECHANNELS> m_bsMultiSplitRecordMask; // -! NEW_FEATURE#0015 protected: // create from serialization only @@ -227,9 +227,9 @@ // -> DESC="channels management dlg" bool NoFxChannel(CHANNELINDEX nChn, bool bNoFx, bool updateMix = true); bool IsChannelNoFx(CHANNELINDEX nChn) const; - bool IsChannelRecord1(CHANNELINDEX channel); - bool IsChannelRecord2(CHANNELINDEX channel); - BYTE IsChannelRecord(CHANNELINDEX channel); + bool IsChannelRecord1(CHANNELINDEX channel) const; + bool IsChannelRecord2(CHANNELINDEX channel) const; + BYTE IsChannelRecord(CHANNELINDEX channel) const; void Record1Channel(CHANNELINDEX channel, bool select = true); void Record2Channel(CHANNELINDEX channel, bool select = true); void ReinitRecordState(bool unselect = true); Modified: trunk/OpenMPT/soundlib/ModSequence.cpp =================================================================== --- trunk/OpenMPT/soundlib/ModSequence.cpp 2009-10-24 19:05:56 UTC (rev 405) +++ trunk/OpenMPT/soundlib/ModSequence.cpp 2009-10-25 22:17:12 UTC (rev 406) @@ -137,6 +137,47 @@ } +void ModSequence::Remove(ORDERINDEX nPosBegin, ORDERINDEX nPosEnd) +//---------------------------------------------------------------- +{ + const ORDERINDEX nLengthTt = GetLengthTailTrimmed(); + if (nPosEnd < nPosBegin || nPosEnd >= nLengthTt) + return; + const ORDERINDEX nMoveCount = nLengthTt - (nPosEnd + 1); + // Move orders left. + if (nMoveCount > 0) + memmove(m_pArray + nPosBegin, m_pArray + nPosEnd + 1, sizeof(PATTERNINDEX) * nMoveCount); + // Clear tail orders. + std::fill(m_pArray + nPosBegin + nMoveCount, m_pArray + nLengthTt, GetInvalidPatIndex()); +} + + +ORDERINDEX ModSequence::Insert(ORDERINDEX nPos, ORDERINDEX nCount, PATTERNINDEX nFill) +//------------------------------------------------------------------------------------ +{ + if (nPos >= m_pSndFile->GetModSpecifications().ordersMax || nCount == 0) + return (nCount = 0); + const ORDERINDEX nLengthTt = GetLengthTailTrimmed(); + // Limit number of orders to be inserted. + LimitMax(nCount, ORDERINDEX(m_pSndFile->GetModSpecifications().ordersMax - nPos)); + // Calculate new length. + const ORDERINDEX nNewLength = min(nLengthTt + nCount, m_pSndFile->GetModSpecifications().ordersMax); + // Resize if needed. + if (nNewLength > GetLength()) + resize(nNewLength); + // Calculate how many orders would need to be moved(nNeededSpace) and how many can actually + // be moved(nFreeSpace). + const ORDERINDEX nNeededSpace = nLengthTt - nPos; + const ORDERINDEX nFreeSpace = GetLength() - (nPos + nCount); + // Move orders nCount steps right starting from nPos. + if (nPos < nLengthTt) + memmove(m_pArray + nPos + nCount, m_pArray + nPos, min(nFreeSpace, nNeededSpace) * sizeof(PATTERNINDEX)); + // Set nFill to new orders. + std::fill(begin() + nPos, begin() + nPos + nCount, nFill); + return nCount; +} + + void ModSequence::Append(PATTERNINDEX nPat) //----------------------------------------- { @@ -209,8 +250,9 @@ //---------------------------------------------------------------- { if (nSeq == GetCurrentSequenceIndex()) - CopyCacheToStorage(); - return m_Sequences[nSeq]; + return *this; + else + return m_Sequences[nSeq]; } Modified: trunk/OpenMPT/soundlib/ModSequence.h =================================================================== --- trunk/OpenMPT/soundlib/ModSequence.h 2009-10-24 19:05:56 UTC (rev 405) +++ trunk/OpenMPT/soundlib/ModSequence.h 2009-10-25 22:17:12 UTC (rev 406) @@ -37,6 +37,16 @@ void Append() {Append(GetInvalidPatIndex());} // Appends InvalidPatIndex. void Append(PATTERNINDEX nPat); // Appends given patindex. + // Inserts nCount orders starting from nPos using nFill as the pattern index for all inserted orders. + // Sequence will automatically grow if needed and if it can't grow enough, some tail + // orders will be discarded. + // Return: Number of orders inserted. + ORDERINDEX Insert(ORDERINDEX nPos, ORDERINDEX nCount) {return Insert(nPos, nCount, GetInvalidPatIndex());} + ORDERINDEX Insert(ORDERINDEX nPos, ORDERINDEX nCount, PATTERNINDEX nFill); + + // Removes orders from range [nPosBegin, nPosEnd]. + void Remove(ORDERINDEX nPosBegin, ORDERINDEX nPosEnd); + void clear(); void resize(ORDERINDEX nNewSize) {resize(nNewSize, GetInvalidPatIndex());} void resize(ORDERINDEX nNewSize, PATTERNINDEX nFill); Modified: trunk/OpenMPT/soundlib/Sndfile.h =================================================================== --- trunk/OpenMPT/soundlib/Sndfile.h 2009-10-24 19:05:56 UTC (rev 405) +++ trunk/OpenMPT/soundlib/Sndfile.h 2009-10-25 22:17:12 UTC (rev 406) @@ -727,12 +727,12 @@ void WriteInstrumentPropertyForAllInstruments(__int32 code, __int16 size, FILE* f, MODINSTRUMENT* instruments[], UINT nInstruments); void SaveExtendedInstrumentProperties(MODINSTRUMENT *instruments[], UINT nInstruments, FILE* f); void SaveExtendedSongProperties(FILE* f); - void LoadExtendedSongProperties(const MODTYPE modtype, LPCBYTE ptr, const LPCBYTE startpos, const size_t seachlimit, bool* pInterpretMptMade = false); + void LoadExtendedSongProperties(const MODTYPE modtype, LPCBYTE ptr, const LPCBYTE startpos, const size_t seachlimit, bool* pInterpretMptMade = nullptr); // Reads extended instrument properties(XM/IT/MPTM). // If no errors occur and song extension tag is found, returns pointer to the beginning // of the tag, else returns NULL. - LPCBYTE LoadExtendedInstrumentProperties(const LPCBYTE pStart, const LPCBYTE pEnd, bool* pInterpretMptMade = false); + LPCBYTE LoadExtendedInstrumentProperties(const LPCBYTE pStart, const LPCBYTE pEnd, bool* pInterpretMptMade = nullptr); #endif // MODPLUG_NO_FILESAVE // MOD Convert function Modified: trunk/OpenMPT/zlib/contrib/vstudio/vc7/zlibstat.vcproj =================================================================== --- trunk/OpenMPT/zlib/contrib/vstudio/vc7/zlibstat.vcproj 2009-10-24 19:05:56 UTC (rev 405) +++ trunk/OpenMPT/zlib/contrib/vstudio/vc7/zlibstat.vcproj 2009-10-25 22:17:12 UTC (rev 406) @@ -68,6 +68,7 @@ ATLMinimizesCRunTimeLibraryUsage="FALSE"> <Tool Name="VCCLCompilerTool" + AdditionalOptions="/O2 /Ob1" InlineFunctionExpansion="1" AdditionalIncludeDirectories="..\..\..;..\..\masmx86" PreprocessorDefinitions="WIN32;ZLIB_WINAPI" @@ -116,6 +117,7 @@ ATLMinimizesCRunTimeLibraryUsage="FALSE"> <Tool Name="VCCLCompilerTool" + AdditionalOptions="/O2 /Ob1" InlineFunctionExpansion="1" AdditionalIncludeDirectories="..\..\..;..\..\masmx86" PreprocessorDefinitions="WIN32;ZLIB_WINAPI;ASMV;ASMINF" @@ -165,6 +167,7 @@ ATLMinimizesCRunTimeLibraryUsage="FALSE"> <Tool Name="VCCLCompilerTool" + AdditionalOptions="/O2 /Ob1" InlineFunctionExpansion="1" AdditionalIncludeDirectories="..\..\..;..\..\masmx86" PreprocessorDefinitions="WIN32;ZLIB_WINAPI" This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |