From: <sag...@us...> - 2009-11-12 22:29:04
|
Revision: 417 http://modplug.svn.sourceforge.net/modplug/?rev=417&view=rev Author: saga-games Date: 2009-11-12 21:32:08 +0000 (Thu, 12 Nov 2009) Log Message: ----------- [New] Pattern Editor: The "paste flood" command pastes the clipboard content again and again until it hits the bottom of the pattern (overflow paste will be disabled autmatically if paste flood is used, for obvious reasons) [Fix] Instrument Editor: Last patch changed semantic of CViewInstrument::EnvGetValue a bit. [Fix] Further fixes to Invert Loop. Still not perfect. [Ref] Updated modular code dictionary description. Modified Paths: -------------- trunk/OpenMPT/mptrack/CommandSet.cpp trunk/OpenMPT/mptrack/CommandSet.h trunk/OpenMPT/mptrack/Moddoc.h trunk/OpenMPT/mptrack/Modedit.cpp trunk/OpenMPT/mptrack/Undo.cpp trunk/OpenMPT/mptrack/View_ins.cpp trunk/OpenMPT/mptrack/View_pat.cpp trunk/OpenMPT/mptrack/View_pat.h trunk/OpenMPT/mptrack/resource.h trunk/OpenMPT/soundlib/Snd_fx.cpp trunk/OpenMPT/soundlib/Sndfile.cpp trunk/OpenMPT/soundlib/Sndfile.h Modified: trunk/OpenMPT/mptrack/CommandSet.cpp =================================================================== --- trunk/OpenMPT/mptrack/CommandSet.cpp 2009-11-07 23:38:07 UTC (rev 416) +++ trunk/OpenMPT/mptrack/CommandSet.cpp 2009-11-12 21:32:08 UTC (rev 417) @@ -2345,6 +2345,11 @@ commands[kcNoteFadeOld].isHidden = false; commands[kcNoteFadeOld].isDummy = false; + commands[kcEditPasteFlood].UID = 1793; + commands[kcEditPasteFlood].Message = "Paste Flood"; + commands[kcEditPasteFlood].isHidden = false; + commands[kcEditPasteFlood].isDummy = false; + #ifdef _DEBUG for (int i=0; i<kcNumCommands; i++) { if (commands[i].UID != 0) { // ignore unset UIDs Modified: trunk/OpenMPT/mptrack/CommandSet.h =================================================================== --- trunk/OpenMPT/mptrack/CommandSet.h 2009-11-07 23:38:07 UTC (rev 416) +++ trunk/OpenMPT/mptrack/CommandSet.h 2009-11-12 21:32:08 UTC (rev 417) @@ -84,6 +84,7 @@ kcEditPaste, kcEditMixPaste, kcEditMixPasteITStyle, + kcEditPasteFlood, kcSwitchOverflowPaste, kcEditSelectAll, kcEditFind, Modified: trunk/OpenMPT/mptrack/Moddoc.h =================================================================== --- trunk/OpenMPT/mptrack/Moddoc.h 2009-11-07 23:38:07 UTC (rev 416) +++ trunk/OpenMPT/mptrack/Moddoc.h 2009-11-12 21:32:08 UTC (rev 417) @@ -240,8 +240,8 @@ BOOL ShrinkPattern(PATTERNINDEX nPattern); // Copy&Paste - BOOL CopyPattern(PATTERNINDEX nPattern, DWORD dwBeginSel, DWORD dwEndSel); - BOOL PastePattern(PATTERNINDEX nPattern, DWORD dwBeginSel, BOOL mix, BOOL ITStyleMix=FALSE); //rewbs.mixpaste + bool CopyPattern(PATTERNINDEX nPattern, DWORD dwBeginSel, DWORD dwEndSel); + bool PastePattern(PATTERNINDEX nPattern, DWORD dwBeginSel, bool mix, bool ITStyleMix = false, bool PasteFlood = false); BOOL CopyEnvelope(UINT nIns, UINT nEnv); BOOL PasteEnvelope(UINT nIns, UINT nEnv); Modified: trunk/OpenMPT/mptrack/Modedit.cpp =================================================================== --- trunk/OpenMPT/mptrack/Modedit.cpp 2009-11-07 23:38:07 UTC (rev 416) +++ trunk/OpenMPT/mptrack/Modedit.cpp 2009-11-12 21:32:08 UTC (rev 417) @@ -995,8 +995,8 @@ static LPCSTR lpszClipboardPatternHdr = "ModPlug Tracker %3s\x0D\x0A"; -BOOL CModDoc::CopyPattern(PATTERNINDEX nPattern, DWORD dwBeginSel, DWORD dwEndSel) -//------------------------------------------------------------------------ +bool CModDoc::CopyPattern(PATTERNINDEX nPattern, DWORD dwBeginSel, DWORD dwEndSel) +//-------------------------------------------------------------------------------- { CMainFrame *pMainFrm = CMainFrame::GetMainFrame(); DWORD dwMemSize; @@ -1004,7 +1004,7 @@ UINT nrows = (dwEndSel >> 16) - (dwBeginSel >> 16) + 1; UINT ncols = ((dwEndSel & 0xFFFF) >> 3) - ((dwBeginSel & 0xFFFF) >> 3) + 1; - if ((!pMainFrm) || (nPattern >= m_SndFile.Patterns.Size()) || (!m_SndFile.Patterns[nPattern])) return FALSE; + if ((!pMainFrm) || (nPattern >= m_SndFile.Patterns.Size()) || (!m_SndFile.Patterns[nPattern])) return false; BeginWaitCursor(); dwMemSize = strlen(lpszClipboardPatternHdr) + 1; dwMemSize += nrows * (ncols * 12 + 2); @@ -1138,20 +1138,16 @@ CloseClipboard(); } EndWaitCursor(); - return TRUE; + return true; } -//rewbs.mixpaste: using eric's method, as it is fat more elegant. -// -> CODE#0014 -// -> DESC="vst wet/dry slider" //BOOL CModDoc::PastePattern(UINT nPattern, DWORD dwBeginSel) -BOOL CModDoc::PastePattern(PATTERNINDEX nPattern, DWORD dwBeginSel, BOOL mix, BOOL ITStyleMix) -// -! NEW_FEATURE#0014 -//--------------------------------------------------------- +bool CModDoc::PastePattern(PATTERNINDEX nPattern, DWORD dwBeginSel, bool mix, bool ITStyleMix, bool PasteFlood) +//------------------------------------------------------------------------------------------------------------- { CMainFrame *pMainFrm = CMainFrame::GetMainFrame(); - if ((!pMainFrm) || (nPattern >= m_SndFile.Patterns.Size()) || (!m_SndFile.Patterns[nPattern])) return FALSE; + if ((!pMainFrm) || (nPattern >= m_SndFile.Patterns.Size()) || (!m_SndFile.Patterns[nPattern])) return false; BeginWaitCursor(); if (pMainFrm->OpenClipboard()) { @@ -1168,11 +1164,11 @@ UINT col; bool bS3MCommands = false, bOk = false; MODTYPE origFormat = MOD_TYPE_IT; - UINT len = 0; + UINT len = 0, startLen; MODCOMMAND origModCmd; ORDERINDEX oCurrentOrder; //jojo.echopaste - ROWINDEX rTemp; + ROWINDEX rTemp, startRow; PATTERNINDEX pTemp; GetEditPosition(rTemp, pTemp, oCurrentOrder); @@ -1199,15 +1195,24 @@ bOk = true; GetPatternUndo()->PrepareUndo(nPattern, 0, 0, m_SndFile.m_nChannels, m_SndFile.PatternSize[nPattern]); + startLen = len; + startRow = nrow; - while ((nrow < m_SndFile.PatternSize[nPattern]) && (len + 11 < dwMemSize)) + while ((nrow < m_SndFile.PatternSize[nPattern])) { - // Search for column separator - while (p[len] != '|') + // Search for column separator or end of paste data + while ((len + 11 >= dwMemSize) || p[len] != '|') { - if (len + 11 >= dwMemSize) goto PasteDone; - if (!p[len]) goto PasteDone; - len++; + if (len + 11 >= dwMemSize || !p[len]) + { + if((PasteFlood == true) && (nrow != startRow)) // prevent infinite loop with malformed clipboard data + len = startLen; // paste from beginning + else + goto PasteDone; + } else + { + len++; + } } col = ncol; // Paste columns @@ -1359,8 +1364,9 @@ m += m_SndFile.m_nChannels; nrow++; - //jojo.echopaste - if(CMainFrame::m_dwPatternSetup & PATTERN_OVERFLOWPASTE) + // Overflow paste. Continue pasting in next pattern if enabled. + // If Paste Flood is enabled, this won't be called due to obvious reasons. + if((CMainFrame::m_dwPatternSetup & PATTERN_OVERFLOWPASTE) && !PasteFlood) { while(nrow >= m_SndFile.PatternSize[nPattern]) { @@ -1387,7 +1393,7 @@ CloseClipboard(); } EndWaitCursor(); - return TRUE; + return true; } Modified: trunk/OpenMPT/mptrack/Undo.cpp =================================================================== --- trunk/OpenMPT/mptrack/Undo.cpp 2009-11-07 23:38:07 UTC (rev 416) +++ trunk/OpenMPT/mptrack/Undo.cpp 2009-11-12 21:32:08 UTC (rev 417) @@ -31,6 +31,12 @@ // Create undo point. +// Parameter list: +// - pattern: Pattern of which an undo step should be created from. +// - x: first channel +// - y: first row +// - cx: last channel +// - cy: last row bool CPatternUndo::PrepareUndo(PATTERNINDEX pattern, UINT x, UINT y, UINT cx, UINT cy) //------------------------------------------------------------------------------------ { Modified: trunk/OpenMPT/mptrack/View_ins.cpp =================================================================== --- trunk/OpenMPT/mptrack/View_ins.cpp 2009-11-07 23:38:07 UTC (rev 416) +++ trunk/OpenMPT/mptrack/View_ins.cpp 2009-11-12 21:32:08 UTC (rev 417) @@ -246,7 +246,7 @@ { INSTRUMENTENVELOPE *envelope = GetEnvelopePtr(); if(envelope == nullptr) return 0; - if(nPoint < (int)envelope->nNodes) return envelope->Values[nPoint]; + if(nPoint >= 0 && nPoint < (int)envelope->nNodes) return envelope->Values[nPoint]; return 0; } Modified: trunk/OpenMPT/mptrack/View_pat.cpp =================================================================== --- trunk/OpenMPT/mptrack/View_pat.cpp 2009-11-07 23:38:07 UTC (rev 416) +++ trunk/OpenMPT/mptrack/View_pat.cpp 2009-11-12 21:32:08 UTC (rev 417) @@ -53,7 +53,8 @@ ON_COMMAND(ID_EDIT_CUT, OnEditCut) ON_COMMAND(ID_EDIT_COPY, OnEditCopy) ON_COMMAND(ID_EDIT_PASTE, OnEditPaste) - ON_COMMAND(ID_EDIT_MIXPASTE, OnEditMixPaste) //rewbs.mixPaste + ON_COMMAND(ID_EDIT_MIXPASTE, OnEditMixPaste) + ON_COMMAND(ID_EDIT_PASTEFLOOD, OnEditPasteFlood) ON_COMMAND(ID_EDIT_SELECT_ALL, OnEditSelectAll) ON_COMMAND(ID_EDIT_SELECTCOLUMN,OnEditSelectColumn) ON_COMMAND(ID_EDIT_SELECTCOLUMN2,OnSelectCurrentColumn) @@ -1004,10 +1005,24 @@ } } + //end rewbs.mixPaste +void CViewPattern::OnEditPasteFlood() +//----------------------------------- +{ + CModDoc *pModDoc = GetDocument(); + if (pModDoc && IsEditingEnabled_bmsg()) + { + pModDoc->PastePattern(m_nPattern, m_dwBeginSel, false, false, true); + InvalidatePattern(FALSE); + SetFocus(); + } +} + + void CViewPattern::OnLButtonDown(UINT nFlags, CPoint point) //-------------------------------------------------- { @@ -3613,6 +3628,7 @@ case kcEditPaste: OnEditPaste(); return wParam; case kcEditMixPaste: OnEditMixPaste(); return wParam; case kcEditMixPasteITStyle: OnEditMixPasteITStyle(); return wParam; + case kcEditPasteFlood: OnEditPasteFlood(); return wParam; case kcEditSelectAll: OnEditSelectAll(); return wParam; case kcTogglePluginEditor: TogglePluginEditor((m_dwCursor & 0xFFFF) >> 3); return wParam; case kcToggleFollowSong: SendCtrlMessage(CTRLMSG_PAT_FOLLOWSONG); return wParam; @@ -4824,6 +4840,7 @@ AppendMenu(hMenu, MF_STRING, ID_EDIT_COPY, "Copy\t" + ih->GetKeyTextFromCommand(kcEditCopy)); AppendMenu(hMenu, MF_STRING, ID_EDIT_PASTE, "Paste\t" + ih->GetKeyTextFromCommand(kcEditPaste)); AppendMenu(hMenu, MF_STRING, ID_EDIT_MIXPASTE, "Mix Paste\t" + ih->GetKeyTextFromCommand(kcEditMixPaste)); + AppendMenu(hMenu, MF_STRING, ID_EDIT_PASTEFLOOD, "Paste Flood\t" + ih->GetKeyTextFromCommand(kcEditPasteFlood)); DWORD greyed = pModDoc->GetPatternUndo()->CanUndo()?FALSE:MF_GRAYED; if (!greyed || !(CMainFrame::m_dwPatternSetup&PATTERN_OLDCTXMENUSTYLE)) { Modified: trunk/OpenMPT/mptrack/View_pat.h =================================================================== --- trunk/OpenMPT/mptrack/View_pat.h 2009-11-07 23:38:07 UTC (rev 416) +++ trunk/OpenMPT/mptrack/View_pat.h 2009-11-12 21:32:08 UTC (rev 417) @@ -230,6 +230,7 @@ afx_msg void OnEditPaste(); afx_msg void OnEditMixPaste(); //rewbs.mixPaste afx_msg void OnEditMixPasteITStyle(); //rewbs.mixPaste + afx_msg void OnEditPasteFlood(); afx_msg void OnClearSelection(bool ITStyle=false, RowMask sb = DefaultRowMask); //rewbs.customKeys afx_msg void OnGrowSelection(); //rewbs.customKeys afx_msg void OnShrinkSelection(); //rewbs.customKeys Modified: trunk/OpenMPT/mptrack/resource.h =================================================================== --- trunk/OpenMPT/mptrack/resource.h 2009-11-07 23:38:07 UTC (rev 416) +++ trunk/OpenMPT/mptrack/resource.h 2009-11-12 21:32:08 UTC (rev 417) @@ -1152,6 +1152,7 @@ #define ID_ORDERLIST_EDIT_CUT 59232 #define ID_ORDERLIST_EDIT_PASTE 59233 #define ID_CHANNEL_RENAME 59234 +#define ID_EDIT_PASTEFLOOD 59235 // Next default values for new objects // @@ -1159,7 +1160,7 @@ #ifndef APSTUDIO_READONLY_SYMBOLS #define _APS_3D_CONTROLS 1 #define _APS_NEXT_RESOURCE_VALUE 523 -#define _APS_NEXT_COMMAND_VALUE 59235 +#define _APS_NEXT_COMMAND_VALUE 59236 #define _APS_NEXT_CONTROL_VALUE 2412 #define _APS_NEXT_SYMED_VALUE 901 #endif Modified: trunk/OpenMPT/soundlib/Snd_fx.cpp =================================================================== --- trunk/OpenMPT/soundlib/Snd_fx.cpp 2009-11-07 23:38:07 UTC (rev 416) +++ trunk/OpenMPT/soundlib/Snd_fx.cpp 2009-11-12 21:32:08 UTC (rev 417) @@ -2530,7 +2530,6 @@ if((m_nType & MOD_TYPE_MOD) != 0) // MOD: Invert Loop { pChn->nEFxSpeed = param; - pChn->pEFxSample = pChn->pModSample; if(m_dwSongFlags & SONG_FIRSTTICK) InvertLoop(pChn); } else // XM: Set Active Midi Macro @@ -2701,7 +2700,7 @@ if((m_nType & MOD_TYPE_MOD) == 0 || pChn->nEFxSpeed == 0) return; // we obviously also need a sample for this - MODSAMPLE *pModSample = pChn->pEFxSample; + MODSAMPLE *pModSample = pChn->pModSample; if(pModSample == nullptr || pModSample->pSample == nullptr || !(pModSample->uFlags & CHN_LOOP)) return; pChn->nEFxDelay += ModEFxTable[pChn->nEFxSpeed & 0x0F]; Modified: trunk/OpenMPT/soundlib/Sndfile.cpp =================================================================== --- trunk/OpenMPT/soundlib/Sndfile.cpp 2009-11-07 23:38:07 UTC (rev 416) +++ trunk/OpenMPT/soundlib/Sndfile.cpp 2009-11-12 21:32:08 UTC (rev 417) @@ -127,8 +127,8 @@ - use 'VE[.' for VolEnv.Values[MAX_ENVPOINTS] -* In use CODE tag dictionnary (alphabetical order): [ see in Sndfile.cpp ] --------------------------------------------------------------------------- +* In use CODE tag dictionary (alphabetical order): [ see in Sndfile.cpp ] +------------------------------------------------------------------------- !!!!!!!!!!!!!!!!!!!!!!!!!!!!! !!! SECTION TO BE UPDATED !!! @@ -209,6 +209,9 @@ PERN PitchEnv.nReleaseNode AERN PanEnv.nReleaseNode VERN VolEnv.nReleaseNode +PFLG PitchEnv.dwFlag +AFLG PanEnv.dwFlags +VFLG VolEnv.dwFlags ----------------------------------------------------------------------------------------------- ---------------------------------------------------------------------------------------------*/ Modified: trunk/OpenMPT/soundlib/Sndfile.h =================================================================== --- trunk/OpenMPT/soundlib/Sndfile.h 2009-11-07 23:38:07 UTC (rev 416) +++ trunk/OpenMPT/soundlib/Sndfile.h 2009-11-12 21:32:08 UTC (rev 417) @@ -205,7 +205,6 @@ LONG nRestorePanOnNewNote; //If > 0, nPan should be set to nRestorePanOnNewNote - 1 on new note. Used to recover from panswing. UINT nOldGlobalVolSlide; DWORD nEFxOffset; // offset memory for Invert Loop (EFx, .MOD only) - MODSAMPLE *pEFxSample; // sample memory for Invert Loop (EFx, .MOD only) // 8-bit members BYTE nRestoreResonanceOnNewNote; //Like above BYTE nRestoreCutoffOnNewNote; //Like above This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |