From: <sag...@us...> - 2009-11-06 20:40:35
|
Revision: 413 http://modplug.svn.sourceforge.net/modplug/?rev=413&view=rev Author: saga-games Date: 2009-11-06 20:40:06 +0000 (Fri, 06 Nov 2009) Log Message: ----------- [New] Pattern editor: Channel rename dialog in channel header context menu [Fix] Mod Specs: The XM and MOD format does not support "---" or "+++" items in the order list. "+++" and "---" are left out when saving as XM. The XM format supports up to 255 patterns in theory, but pattern 254/255 are still loaded as "+++"/"---" for now. [Fix] General tab: Channel name input field was not limited properly. [Imp] Orderlist: Middle click can now also be used for queuing patterns. [Imp] Orderlist: "+++" pattern item cannot be entered when writing an MOD / XM file. Modified Paths: -------------- trunk/OpenMPT/mptrack/Ctrl_pat.h trunk/OpenMPT/mptrack/Ctrl_seq.cpp trunk/OpenMPT/mptrack/Modedit.cpp trunk/OpenMPT/mptrack/View_gen.cpp trunk/OpenMPT/mptrack/View_pat.cpp trunk/OpenMPT/mptrack/View_pat.h trunk/OpenMPT/mptrack/dlg_misc.cpp trunk/OpenMPT/mptrack/dlg_misc.h trunk/OpenMPT/mptrack/mptrack.rc trunk/OpenMPT/mptrack/resource.h trunk/OpenMPT/soundlib/Load_med.cpp trunk/OpenMPT/soundlib/Load_mod.cpp trunk/OpenMPT/soundlib/Load_xm.cpp trunk/OpenMPT/soundlib/mod_specifications.h Modified: trunk/OpenMPT/mptrack/Ctrl_pat.h =================================================================== --- trunk/OpenMPT/mptrack/Ctrl_pat.h 2009-11-06 17:48:42 UTC (rev 412) +++ trunk/OpenMPT/mptrack/Ctrl_pat.h 2009-11-06 20:40:06 UTC (rev 413) @@ -54,6 +54,7 @@ BOOL UpdateScrollInfo(); void UpdateInfoText(); int GetFontWidth(); + void QueuePattern(CPoint pt); ORDERINDEX GetOrderFromPoint(const CRect& rect, const CPoint& pt) const; @@ -105,6 +106,7 @@ afx_msg void OnLButtonDblClk(UINT, CPoint); afx_msg void OnRButtonDown(UINT, CPoint); afx_msg void OnLButtonUp(UINT, CPoint); + afx_msg void OnMButtonDown(UINT, CPoint); afx_msg void OnMouseMove(UINT, CPoint); afx_msg void OnHScroll(UINT nSBCode, UINT nPos, CScrollBar*); afx_msg void OnSize(UINT nType, int cx, int cy); Modified: trunk/OpenMPT/mptrack/Ctrl_seq.cpp =================================================================== --- trunk/OpenMPT/mptrack/Ctrl_seq.cpp 2009-11-06 17:48:42 UTC (rev 412) +++ trunk/OpenMPT/mptrack/Ctrl_seq.cpp 2009-11-06 20:40:06 UTC (rev 413) @@ -36,6 +36,7 @@ ON_WM_LBUTTONDBLCLK() ON_WM_LBUTTONUP() ON_WM_RBUTTONDOWN() + ON_WM_MBUTTONDOWN() ON_WM_SETFOCUS() ON_WM_KILLFOCUS() ON_WM_HSCROLL() @@ -384,15 +385,17 @@ ord = 0; else { - if(ord > maxpat && ord < pSndFile->Order.GetIgnoreIndex()) - ord = pSndFile->Order.GetIgnoreIndex(); + const PATTERNINDEX nFirstInvalid = pSndFile->GetModSpecifications().hasIgnoreIndex ? pSndFile->Order.GetIgnoreIndex() : pSndFile->Order.GetInvalidPatIndex(); + if(ord > maxpat && ord < nFirstInvalid) + ord = nFirstInvalid; } } else if (nChar == '-') { + const PATTERNINDEX nFirstInvalid = pSndFile->GetModSpecifications().hasIgnoreIndex ? pSndFile->Order.GetIgnoreIndex() : pSndFile->Order.GetInvalidPatIndex(); ord--; if (ord < 0) ord = pSndFile->Order.GetInvalidPatIndex(); else - if ((ord > maxpat) && (ord < pSndFile->Order.GetIgnoreIndex())) ord = maxpat; + if ((ord > maxpat) && (ord < nFirstInvalid)) ord = maxpat; } if (ord != pSndFile->Order[m_nScrollPos]) { @@ -714,7 +717,7 @@ while (rect.left < rcClient.right) { bool bHighLight = ((bFocus) && (nIndex >= selection.nOrdLo && nIndex <= selection.nOrdHi)) ? true : false; - const PATTERNINDEX nPat = ((nIndex >= 0) && (nIndex < pSndFile->Order.GetLength())) ? pSndFile->Order[nIndex] : PATTERNINDEX_INVALID; + const PATTERNINDEX nPat = (nIndex < pSndFile->Order.GetLength()) ? pSndFile->Order[nIndex] : PATTERNINDEX_INVALID; if ((rect.right = rect.left + m_cxFont) > rcClient.right) rect.right = rcClient.right; rect.right--; if (bHighLight) { @@ -800,21 +803,7 @@ if (ih->CtrlPressed()) { // queue pattern - //m_nScrollPos2nd = ORDERINDEX_INVALID; - if (m_pModDoc) - { - CSoundFile *pSndFile = m_pModDoc->GetSoundFile(); - ORDERINDEX nOrder = GetOrderFromPoint(rect, pt); - if ((nOrder >= 0) && (nOrder < pSndFile->Order.GetLength())) - { - if (pSndFile->m_nSeqOverride == static_cast<UINT>(nOrder)+1) { - pSndFile->m_nSeqOverride=0; - } else { - pSndFile->m_nSeqOverride = nOrder+1; - } - InvalidateRect(NULL, FALSE); - } - } + QueuePattern(pt); } else { // mark pattern (+skip to) @@ -858,7 +847,7 @@ if (rect.PtInRect(pt)) { ORDERINDEX n = GetOrderFromPoint(rect, pt); - if ((n >= 0) && (n == m_nDropPos) && (m_pModDoc)) + if ((n != ORDERINDEX_INVALID) && (n == m_nDropPos) && (m_pModDoc)) { // drag multiple orders (not quite as easy...) ORD_SELECTION selection = GetCurSel(false); @@ -934,9 +923,9 @@ n = GetOrderFromPoint(rect, pt); if (n >= pSndFile->Order.GetLength() || n >= pSndFile->GetModSpecifications().ordersMax) n = ORDERINDEX_INVALID; } - if (n != (int)m_nDropPos) + if (n != m_nDropPos) { - if (n >= 0) + if (n != ORDERINDEX_INVALID) { m_nDropPos = n; InvalidateRect(NULL, FALSE); @@ -1067,6 +1056,14 @@ } +void COrderList::OnMButtonDown(UINT nFlags, CPoint pt) +//---------------------------------------------------- +{ + UNREFERENCED_PARAMETER(nFlags); + QueuePattern(pt); +} + + void COrderList::OnHScroll(UINT nSBCode, UINT nPos, CScrollBar*) //-------------------------------------------------------------- { @@ -1349,3 +1346,28 @@ m_pModDoc->SetModified(); m_pModDoc->UpdateAllViews(NULL, HINT_MODSEQUENCE, this); } + + +void COrderList::QueuePattern(CPoint pt) +//-------------------------------------- +{ + CRect rect; + GetClientRect(&rect); + + if(!rect.PtInRect(pt)) return; + if (m_pModDoc == nullptr) return; + CSoundFile *pSndFile = m_pModDoc->GetSoundFile(); + if(pSndFile == nullptr) return; + + ORDERINDEX nOrder = GetOrderFromPoint(rect, pt); + + if (nOrder < pSndFile->Order.GetLength()) + { + if (pSndFile->m_nSeqOverride == static_cast<UINT>(nOrder) + 1) { + pSndFile->m_nSeqOverride = 0; + } else { + pSndFile->m_nSeqOverride = nOrder + 1; + } + InvalidateRect(NULL, FALSE); + } +} Modified: trunk/OpenMPT/mptrack/Modedit.cpp =================================================================== --- trunk/OpenMPT/mptrack/Modedit.cpp 2009-11-06 17:48:42 UTC (rev 412) +++ trunk/OpenMPT/mptrack/Modedit.cpp 2009-11-06 20:40:06 UTC (rev 413) @@ -329,6 +329,18 @@ } } + // If not supported, remove "+++" separator order items. + if(CSoundFile::GetModSpecifications(nNewType).hasIgnoreIndex == false) + { + for(ORDERINDEX nOrd = m_SndFile.Order.GetLengthTailTrimmed() - 1; nOrd > 0; nOrd--) + { + if(m_SndFile.Order[nOrd] == m_SndFile.Order.GetIgnoreIndex()) + { + m_SndFile.Order.Remove(nOrd, nOrd); + } + } + } + BEGIN_CRITICAL(); m_SndFile.ChangeModTypeTo(nNewType); if (!newTypeIsXM_IT_MPT && (m_SndFile.m_dwSongFlags & SONG_LINEARSLIDES)) Modified: trunk/OpenMPT/mptrack/View_gen.cpp =================================================================== --- trunk/OpenMPT/mptrack/View_gen.cpp 2009-11-06 17:48:42 UTC (rev 412) +++ trunk/OpenMPT/mptrack/View_gen.cpp 2009-11-06 20:40:06 UTC (rev 413) @@ -362,9 +362,13 @@ int pan = pSndFile->ChnSettings[nChn].nPan; m_sbPan[ichn].SetPos(pan/4); SetDlgItemInt(IDC_EDIT2+ichn*2, pan); + + // Channel name memcpy(s, pSndFile->ChnSettings[nChn].szName, MAX_CHANNELNAME); - s[MAX_CHANNELNAME-1] = 0; - SetDlgItemText(IDC_EDIT9+ichn, s); + s[MAX_CHANNELNAME - 1] = 0; + SetDlgItemText(IDC_EDIT9 + ichn, s); + ((CEdit*)(GetDlgItem(IDC_EDIT9 + ichn)))->LimitText(MAX_CHANNELNAME - 1); + // Channel effect m_CbnEffects[ichn].SetRedraw(FALSE); m_CbnEffects[ichn].ResetContent(); Modified: trunk/OpenMPT/mptrack/View_pat.cpp =================================================================== --- trunk/OpenMPT/mptrack/View_pat.cpp 2009-11-06 17:48:42 UTC (rev 412) +++ trunk/OpenMPT/mptrack/View_pat.cpp 2009-11-06 20:40:06 UTC (rev 413) @@ -108,6 +108,7 @@ ON_COMMAND(ID_PATTERN_AMPLIFY, OnPatternAmplify) ON_COMMAND(ID_CLEAR_SELECTION, OnClearSelectionFromMenu) ON_COMMAND(ID_SHOWTIMEATROW, OnShowTimeAtRow) + ON_COMMAND(ID_CHANNEL_RENAME, OnRenameChannel) ON_COMMAND_RANGE(ID_CHANGE_INSTRUMENT, ID_CHANGE_INSTRUMENT+MAX_INSTRUMENTS, OnSelectInstrument) ON_UPDATE_COMMAND_UI(ID_EDIT_UNDO, OnUpdateUndo) ON_COMMAND_RANGE(ID_PLUGSELECT, ID_PLUGSELECT+MAX_MIXPLUGINS, OnSelectPlugin) //rewbs.patPlugName @@ -1242,6 +1243,7 @@ AppendMenu(hMenu, MF_SEPARATOR, 0, ""); BuildRecordCtxMenu(hMenu, nChn, pModDoc); BuildChannelControlCtxMenu(hMenu); + BuildChannelMiscCtxMenu(hMenu, pSndFile); } } @@ -2533,13 +2535,13 @@ return; } - UINT nChn = GetChanFromCursor(m_nMenuParam); + CHANNELINDEX nChn = GetChanFromCursor(m_nMenuParam); CString str; str.Format("Remove channel %d?\nNote: Affects all patterns and no undo", nChn+1); if(CMainFrame::GetMainFrame()->MessageBox(str , "Remove channel", MB_YESNO | MB_ICONQUESTION) == IDYES) { BOOL chnMask[MAX_CHANNELS]; - for(UINT i = 0; i<MAX_CHANNELS; chnMask[i] = FALSE, i++) {} + for(CHANNELINDEX i = 0; i < MAX_CHANNELS; chnMask[i] = FALSE, i++) {} chnMask[nChn] = TRUE; pModDoc->RemoveChannels(chnMask); SetCurrentPattern(m_nPattern); //Updating the screen. @@ -4961,6 +4963,16 @@ } +bool CViewPattern::BuildChannelMiscCtxMenu(HMENU hMenu, CSoundFile* pSndFile) +//--------------------------------------------------------------------------- +{ + if((pSndFile->m_nType & (MOD_TYPE_IT|MOD_TYPE_MPT)) == 0) return false; + AppendMenu(hMenu, MF_SEPARATOR, 0, 0); + AppendMenu(hMenu, MF_STRING, ID_CHANNEL_RENAME, "Rename channel"); + return true; +} + + UINT CViewPattern::GetSelectionStartRow() { //----------------------------------------- return min(GetRowFromCursor(m_dwBeginSel), GetRowFromCursor(m_dwEndSel)); @@ -5160,3 +5172,20 @@ iRow = m_nRow; } } + + +void CViewPattern::OnRenameChannel() +//---------------------------------- +{ + CModDoc *pModDoc = GetDocument(); + if(pModDoc == nullptr) return; + CSoundFile *pSndFile = pModDoc->GetSoundFile(); + if(pSndFile == nullptr) return; + + CHANNELINDEX nChn = GetChanFromCursor(m_nMenuParam); + CChannelRenameDlg dlg(this, pSndFile->ChnSettings[nChn].szName, nChn + 1); + if(dlg.DoModal() != IDOK || dlg.bChanged == false) return; + + strcpy(pSndFile->ChnSettings[nChn].szName, dlg.m_sName); + pModDoc->UpdateAllViews(NULL, HINT_MODCHANNELS); +} Modified: trunk/OpenMPT/mptrack/View_pat.h =================================================================== --- trunk/OpenMPT/mptrack/View_pat.h 2009-11-06 17:48:42 UTC (rev 412) +++ trunk/OpenMPT/mptrack/View_pat.h 2009-11-06 20:40:06 UTC (rev 413) @@ -298,6 +298,7 @@ afx_msg void OnSelectInstrument(UINT nid); afx_msg void OnRunScript(); afx_msg void OnShowTimeAtRow(); + afx_msg void OnRenameChannel(); //}}AFX_MSG DECLARE_MESSAGE_MAP() @@ -324,6 +325,7 @@ bool BuildTransposeCtxMenu(HMENU hMenu, CInputHandler* ih); bool BuildSetInstCtxMenu(HMENU hMenu, CInputHandler* ih, CSoundFile* pSndFile); bool BuildAmplifyCtxMenu(HMENU hMenu, CInputHandler* ih); + bool BuildChannelMiscCtxMenu(HMENU hMenu, CSoundFile* pSndFile); UINT GetSelectionStartRow(); UINT GetSelectionEndRow(); Modified: trunk/OpenMPT/mptrack/dlg_misc.cpp =================================================================== --- trunk/OpenMPT/mptrack/dlg_misc.cpp 2009-11-06 17:48:42 UTC (rev 412) +++ trunk/OpenMPT/mptrack/dlg_misc.cpp 2009-11-06 20:40:06 UTC (rev 413) @@ -635,6 +635,43 @@ } //end rewbs.removeChansDlgCleanup + +/////////////////////////////////////////////////////////// +// CChannelRenameDlg + +BOOL CChannelRenameDlg::OnInitDialog() +//------------------------------------ +{ + CDialog::OnInitDialog(); + + CHAR s[32]; + wsprintf(s, "Set name for channel %d:", m_nChannel); + SetDlgItemText(IDC_STATIC_CHANNEL_NAME, s); + SetDlgItemText(IDC_EDIT_CHANNEL_NAME, m_sName); + ((CEdit*)(GetDlgItem(IDC_EDIT_CHANNEL_NAME)))->LimitText(MAX_CHANNELNAME - 1); + + return TRUE; +} + + +void CChannelRenameDlg::OnOK() +//---------------------------- +{ + CHAR sNewName[MAX_CHANNELNAME]; + GetDlgItemText(IDC_EDIT_CHANNEL_NAME, sNewName, MAX_CHANNELNAME); + if(!strcmp(sNewName, m_sName)) + { + bChanged = false; + CDialog::OnCancel(); + } else + { + strcpy(m_sName, sNewName); + bChanged = true; + CDialog::OnOK(); + } +} + + ////////////////////////////////////////////////////////////////////////////////////////// // Find/Replace Dialog Modified: trunk/OpenMPT/mptrack/dlg_misc.h =================================================================== --- trunk/OpenMPT/mptrack/dlg_misc.h 2009-11-06 17:48:42 UTC (rev 412) +++ trunk/OpenMPT/mptrack/dlg_misc.h 2009-11-06 20:40:06 UTC (rev 413) @@ -111,6 +111,33 @@ ///////////////////////////////////////////////////////////////////////// +// Channel rename dialog + +//===================================== +class CChannelRenameDlg: public CDialog +//===================================== +{ +protected: + CHANNELINDEX m_nChannel; + +public: + CHAR m_sName[MAX_CHANNELNAME]; + bool bChanged; + +public: + CChannelRenameDlg(CWnd *parent, CHAR *sName, CHANNELINDEX nChannel) : CDialog(IDD_CHANNEL_NAME, parent) + { + strcpy(m_sName, sName); + m_nChannel = nChannel; + bChanged = false; + } + + virtual BOOL OnInitDialog(); + virtual void OnOK(); +}; + + +///////////////////////////////////////////////////////////////////////// // Search/Replace #define PATSEARCH_NOTE 0x01 Modified: trunk/OpenMPT/mptrack/mptrack.rc =================================================================== --- trunk/OpenMPT/mptrack/mptrack.rc 2009-11-06 17:48:42 UTC (rev 412) +++ trunk/OpenMPT/mptrack/mptrack.rc 2009-11-06 20:40:06 UTC (rev 413) @@ -70,7 +70,18 @@ GROUPBOX "Presets",IDC_STATIC,6,234,294,36 END +IDD_CHANNEL_NAME DIALOGEX 0, 0, 154, 58 +STYLE DS_SETFONT | DS_MODALFRAME | DS_FIXEDSYS | WS_POPUP | WS_CAPTION | WS_SYSMENU +CAPTION "Channel name" +FONT 8, "MS Shell Dlg", 400, 0, 0x1 +BEGIN + LTEXT "IDC_STATIC_CHANNEL_NAME",IDC_STATIC_CHANNEL_NAME,6,6,138,8 + EDITTEXT IDC_EDIT_CHANNEL_NAME,6,18,138,12,ES_AUTOHSCROLL + DEFPUSHBUTTON "OK",IDOK,42,36,50,14 + PUSHBUTTON "Cancel",IDCANCEL,96,36,50,14 +END + ///////////////////////////////////////////////////////////////////////////// // // DESIGNINFO @@ -94,6 +105,14 @@ TOPMARGIN, 7 BOTTOMMARGIN, 274 END + + IDD_CHANNEL_NAME, DIALOG + BEGIN + LEFTMARGIN, 7 + RIGHTMARGIN, 147 + TOPMARGIN, 7 + BOTTOMMARGIN, 51 + END END #endif // APSTUDIO_INVOKED Modified: trunk/OpenMPT/mptrack/resource.h =================================================================== --- trunk/OpenMPT/mptrack/resource.h 2009-11-06 17:48:42 UTC (rev 412) +++ trunk/OpenMPT/mptrack/resource.h 2009-11-06 20:40:06 UTC (rev 413) @@ -115,6 +115,7 @@ #define IDR_DEFAULT_KEYBINDINGS 519 #define IDR_BUILTIN_TUNINGS 520 #define IDD_CLEANUP_SONG 521 +#define IDD_CHANNEL_NAME 522 #define IDC_BUTTON1 1001 #define IDC_BUTTON2 1002 #define IDC_BUTTON3 1003 @@ -909,6 +910,8 @@ #define IDC_CHK_OPTIMIZE_SAMPLES 2406 #define IDC_CHK_MERGE_SEQUENCES 2408 #define IDC_CHECK_PT1X 2409 +#define IDC_STATIC_CHANNEL_NAME 2410 +#define IDC_EDIT_CHANNEL_NAME 2411 #define ID_FILE_NEWMOD 32771 #define ID_FILE_NEWXM 32772 #define ID_FILE_NEWS3M 32773 @@ -1145,18 +1148,19 @@ #define ID_CLEANUP_REARRANGESAMPLES 59228 #define ID_ORDERLIST_RENDER 59229 #define ID_EDIT_CLEANUP 59230 -#define ID_ORDERLIST_EDIT_COPY 59231 -#define ID_ORDERLIST_EDIT_CUT 59232 -#define ID_ORDERLIST_EDIT_PASTE 59233 +#define ID_ORDERLIST_EDIT_COPY 59231 +#define ID_ORDERLIST_EDIT_CUT 59232 +#define ID_ORDERLIST_EDIT_PASTE 59233 +#define ID_CHANNEL_RENAME 59234 // Next default values for new objects // #ifdef APSTUDIO_INVOKED #ifndef APSTUDIO_READONLY_SYMBOLS #define _APS_3D_CONTROLS 1 -#define _APS_NEXT_RESOURCE_VALUE 522 -#define _APS_NEXT_COMMAND_VALUE 59234 -#define _APS_NEXT_CONTROL_VALUE 2410 +#define _APS_NEXT_RESOURCE_VALUE 523 +#define _APS_NEXT_COMMAND_VALUE 59235 +#define _APS_NEXT_CONTROL_VALUE 2412 #define _APS_NEXT_SYMED_VALUE 901 #endif #endif Modified: trunk/OpenMPT/soundlib/Load_med.cpp =================================================================== --- trunk/OpenMPT/soundlib/Load_med.cpp 2009-11-06 17:48:42 UTC (rev 412) +++ trunk/OpenMPT/soundlib/Load_med.cpp 2009-11-06 20:40:06 UTC (rev 413) @@ -636,7 +636,7 @@ } else { UINT nOrders, nSections; - UINT nTrks = BigEndianW(pmsh2->numtracks); + WORD nTrks = BigEndianW(pmsh2->numtracks); if ((nTrks >= 4) && (nTrks <= 32)) m_nChannels = nTrks; DWORD playseqtable = BigEndian(pmsh2->playseqtable); UINT numplayseqs = BigEndianW(pmsh2->numpseqs); Modified: trunk/OpenMPT/soundlib/Load_mod.cpp =================================================================== --- trunk/OpenMPT/soundlib/Load_mod.cpp 2009-11-06 17:48:42 UTC (rev 412) +++ trunk/OpenMPT/soundlib/Load_mod.cpp 2009-11-06 20:40:06 UTC (rev 413) @@ -507,7 +507,7 @@ UINT nbp=0, norders=128; for (UINT iord=0; iord<128; iord++) { - if (Order[iord] == 0xFF) + if (Order[iord] == Order.GetInvalidPatIndex()) { norders = iord; break; Modified: trunk/OpenMPT/soundlib/Load_xm.cpp =================================================================== --- trunk/OpenMPT/soundlib/Load_xm.cpp 2009-11-06 17:48:42 UTC (rev 412) +++ trunk/OpenMPT/soundlib/Load_xm.cpp 2009-11-06 20:40:06 UTC (rev 413) @@ -758,17 +758,21 @@ if(xmheader.channels > MAX_BASECHANNELS) xmheader.channels = MAX_BASECHANNELS; xmheader.channels = LittleEndianW(xmheader.channels); - xmheader.patterns = 0; - WORD nOrders = Order.GetLengthTailTrimmed(), nPatterns = 0; - xmheader.orders = LittleEndianW(nOrders); - xmheader.size = LittleEndian(xmheader.size + nOrders); - - for (i = 0; i < nOrders; i++) { // walk over orderlist and find last used pattern - if((Order[i] >= nPatterns) && (Order[i] < MAX_PATTERNS)) { - nPatterns = Order[i] + 1; + // Find out number of orders and patterns used. + // +++ and --- patterns are not taken into consideration as FastTracker does not support them. + ORDERINDEX nMaxOrds = 0; + PATTERNINDEX nPatterns = 0; + for(ORDERINDEX nOrd = 0; nOrd < Order.GetLengthTailTrimmed(); nOrd++) + { + if(Patterns.IsValidIndex(Order[nOrd])) + { + nMaxOrds++; + if(Order[nOrd] >= nPatterns) nPatterns = Order[nOrd] + 1; } } - xmheader.patterns = LittleEndianW(nPatterns); + xmheader.orders = LittleEndianW((WORD)nMaxOrds); + xmheader.patterns = LittleEndianW((WORD)nPatterns); + xmheader.size = LittleEndian((DWORD)(xmheader.size + nMaxOrds)); if(m_nInstruments > 0) xmheader.instruments = LittleEndianW(m_nInstruments); @@ -786,7 +790,15 @@ xmheader.speed = LittleEndianW(CLAMP(m_nDefaultSpeed, 1, 31)); fwrite(&xmheader, 1, sizeof(xmheader), f); - Order.WriteAsByte(f, nOrders); + // write order list (wihout +++ and ---, explained above) + for(ORDERINDEX nOrd = 0; nOrd < Order.GetLengthTailTrimmed(); nOrd++) + { + if(Patterns.IsValidIndex(Order[nOrd])) + { + BYTE nOrdval = static_cast<BYTE>(Order[nOrd]); + fwrite(&nOrdval, 1, sizeof(BYTE), f); + } + } // Writing patterns for (i = 0; i < nPatterns; i++) if (Patterns[i]) Modified: trunk/OpenMPT/soundlib/mod_specifications.h =================================================================== --- trunk/OpenMPT/soundlib/mod_specifications.h 2009-11-06 17:48:42 UTC (rev 412) +++ trunk/OpenMPT/soundlib/mod_specifications.h 2009-11-06 20:40:06 UTC (rev 413) @@ -41,6 +41,7 @@ UINT envelopePointsMax; // Maximum number of points of each envelope char commands[MAX_EFFECTS + 1]; // An array holding all commands this format supports; commands that are not supported are marked with "?" char volcommands[MAX_VOLCMDS + 1]; // dito, but for volume column + bool hasIgnoreIndex; // Does "+++" pattern exist? }; @@ -79,6 +80,7 @@ 240, //Envelope point count " JFEGHLKRXODB?CQATI?SMNVW?UY?P?Z\\:#", // Supported Effects " vpcdabuhlrgfe:o", // Supported Volume Column commands + true, // Has "+++" pattern }; @@ -112,6 +114,7 @@ 0, //No instrument envelopes " 0123456789ABCD?FF?E???????????????", // Supported Effects " ???????????????", // Supported Volume Column commands + false, // Doesn't have "+++" pattern }; // MOD with MPT extensions. @@ -143,6 +146,7 @@ 0, //No instrument envelopes " 0123456789ABCD?FF?E???????????????", // Supported Effects " ???????????????", // Supported Volume Column commands + false, // Doesn't have "+++" pattern }; const CModSpecifications xm = @@ -154,8 +158,8 @@ false, //No notecut. true, //Has noteoff. false, //No notefade. - 64, //Pattern max. - 128, //Order max. + 255, //Pattern max. + 255, //Order max. 1, //Channel min 32, //Channel max 32, //Min tempo @@ -173,6 +177,7 @@ 12, //Envelope point count " 0123456789ABCDRFFTE???GHK?YXPLZ\\:#", // Supported Effects " vpcdabuhlrg????", // Supported Volume Column commands + false, // Doesn't have "+++" pattern }; // XM with MPT extensions @@ -185,7 +190,7 @@ false, //No notecut. true, //Has noteoff. false, //No notefade. - 240, //Pattern max. + 255, //Pattern max. 256, //Order max. 1, //Channel min 127, //Channel max @@ -204,18 +209,20 @@ 12, //Envelope point count " 0123456789ABCDRFFTE???GHK?YXPLZ\\:#", // Supported Effects " vpcdabuhlrgfe:o", // Supported Volume Column commands + false, // Doesn't have "+++" pattern }; const CModSpecifications s3m = { + //TODO: Set correct values. "s3m", //File extension 13, //Minimum note index 120, //Maximum note index true, //Has notecut. false, //No noteoff. false, //No notefade. - 240, //Pattern max. - 256, //Order max. + 99, //Pattern max. + 255, //Order max. 1, //Channel min 32, //Channel max 32, //Min tempo @@ -233,6 +240,7 @@ 0, //No instrument envelopes " JFEGHLKRXODB?CQATI?SMNVW?U????????", // Supported Effects " vp?????????????", // Supported Volume Column commands + true, // Has "+++" pattern }; // S3M with MPT extensions @@ -246,7 +254,7 @@ false, //No noteoff. false, //No notefade. 240, //Pattern max. - 256, //Order max. + 255, //Order max. 1, //Channel min 32, //Channel max 32, //Min tempo @@ -264,6 +272,7 @@ 0, //No instrument envelopes " JFEGHLKRXODB?CQATI?SMNVW?UY?P?Z\\:#", // Supported Effects " vp?????????????", // Supported Volume Column commands + true, // Has "+++" pattern }; const CModSpecifications it = @@ -294,6 +303,7 @@ 25, //Envelope point count " JFEGHLKRXODB?CQATI?SMNVW?UY?P?Z???", // Supported Effects " vpcdab?h??gfe??", // Supported Volume Column commands + true, // Has "+++" pattern }; const CModSpecifications itEx = @@ -324,6 +334,7 @@ 25, //Envelope point count " JFEGHLKRXODB?CQATI?SMNVW?UY?P?Z\\:#", // Supported Effects " vpcdab?h??gfe:o", // Supported Volume Column commands + true, // Has "+++" pattern }; } //namespace ModSpecs This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |