From: <sag...@us...> - 2013-11-29 20:37:26
|
Revision: 3334 http://sourceforge.net/p/modplug/code/3334 Author: saga-games Date: 2013-11-29 20:37:19 +0000 (Fri, 29 Nov 2013) Log Message: ----------- [Fix] Sample view: Position marks do no longer flicker when desktop compositing (and thus, Aero) is turned on. [Mod] OpenMPT: Version is now 1.22.07.05 Modified Paths: -------------- trunk/OpenMPT/common/versionNumber.h trunk/OpenMPT/mptrack/View_smp.cpp trunk/OpenMPT/mptrack/View_smp.h Modified: trunk/OpenMPT/common/versionNumber.h =================================================================== --- trunk/OpenMPT/common/versionNumber.h 2013-11-29 17:19:33 UTC (rev 3333) +++ trunk/OpenMPT/common/versionNumber.h 2013-11-29 20:37:19 UTC (rev 3334) @@ -17,7 +17,7 @@ #define VER_MAJORMAJOR 1 #define VER_MAJOR 22 #define VER_MINOR 07 -#define VER_MINORMINOR 04 +#define VER_MINORMINOR 05 //Version string. For example "1.17.02.28" #define MPT_VERSION_STR VER_STRINGIZE(VER_MAJORMAJOR) "." VER_STRINGIZE(VER_MAJOR) "." VER_STRINGIZE(VER_MINOR) "." VER_STRINGIZE(VER_MINORMINOR) Modified: trunk/OpenMPT/mptrack/View_smp.cpp =================================================================== --- trunk/OpenMPT/mptrack/View_smp.cpp 2013-11-29 17:19:33 UTC (rev 3333) +++ trunk/OpenMPT/mptrack/View_smp.cpp 2013-11-29 20:37:19 UTC (rev 3334) @@ -130,9 +130,19 @@ MemsetZero(m_NcButtonState); m_bmpEnvBar.Create(IDB_SMPTOOLBAR, 20, 0, RGB(192,192,192)); m_lastDrawPoint.SetPoint(-1, -1); + offScreenDC = nullptr; + offScreenBitmap = nullptr; } +CViewSample::~CViewSample() +//------------------------- +{ + DeleteObject(offScreenBitmap); + DeleteDC(offScreenDC); +} + + void CViewSample::OnInitialUpdate() //--------------------------------- { @@ -906,7 +916,18 @@ } } } - DrawPositionMarks(hdc); + + // Create off-screen image + DeleteObject(offScreenBitmap); + DeleteDC(offScreenDC); + offScreenDC = CreateCompatibleDC(pDC->m_hDC); + offScreenBitmap = CreateCompatibleBitmap(pDC->m_hDC, m_rcClient.Width(), m_rcClient.Height()); + SelectObject(offScreenDC, offScreenBitmap); + BitBlt(offScreenDC, m_rcClient.left, m_rcClient.top, m_rcClient.Width(), m_rcClient.Height(), pDC->m_hDC, 0, 0, SRCCOPY); + + DrawPositionMarks(); + BitBlt(hdc, m_rcClient.left, m_rcClient.top, m_rcClient.Width(), m_rcClient.Height(), offScreenDC, 0, 0, SRCCOPY); + if (oldpen) ::SelectObject(hdc, oldpen); // -> CODE#0015 @@ -920,21 +941,21 @@ } -void CViewSample::DrawPositionMarks(HDC hdc) -//------------------------------------------ +void CViewSample::DrawPositionMarks() +//----------------------------------- { - CRect rect; if(GetDocument()->GetrSoundFile().GetSample(m_nSample).pSample == nullptr) { return; } - for (UINT i=0; i<MAX_CHANNELS; i++) if (m_dwNotifyPos[i] != Notification::PosInvalid) + CRect rect; + for(CHANNELINDEX i = 0; i < MAX_CHANNELS; i++) if (m_dwNotifyPos[i] != Notification::PosInvalid) { rect.top = -2; rect.left = SampleToScreen(m_dwNotifyPos[i]); rect.right = rect.left + 1; rect.bottom = m_rcClient.bottom + 1; - if ((rect.right >= 0) && (rect.right < m_rcClient.right)) InvertRect(hdc, &rect); + if ((rect.right >= 0) && (rect.right < m_rcClient.right)) InvertRect(offScreenDC, &rect); } } @@ -964,8 +985,7 @@ bool doUpdate = false; for(CHANNELINDEX i = 0; i < MAX_CHANNELS; i++) { - SmpLength newpos = pnotify->pos[i]; - if (m_dwNotifyPos[i] != newpos) + if (m_dwNotifyPos[i] != pnotify->pos[i]) { doUpdate = true; break; @@ -974,12 +994,13 @@ if (doUpdate) { HDC hdc = ::GetDC(m_hWnd); - DrawPositionMarks(hdc); + DrawPositionMarks(); // Erase old marks... for(CHANNELINDEX i = 0; i < MAX_CHANNELS; i++) { m_dwNotifyPos[i] = pnotify->pos[i]; } - DrawPositionMarks(hdc); + DrawPositionMarks(); // ...and draw new ones + BitBlt(hdc, m_rcClient.left, m_rcClient.top, m_rcClient.Width(), m_rcClient.Height(), offScreenDC, 0, 0, SRCCOPY); ::ReleaseDC(m_hWnd, hdc); } } @@ -1694,8 +1715,8 @@ CModDoc *pModDoc = GetDocument(); if (pModDoc) { - CSoundFile *pSndFile = pModDoc->GetSoundFile(); - ModSample &sample = pSndFile->GetSample(m_nSample); + CSoundFile &sndFile = pModDoc->GetrSoundFile(); + ModSample &sample = sndFile.GetSample(m_nSample); if ((m_dwEndSel > m_dwBeginSel + 15) && (m_dwEndSel <= sample.nLength)) { if ((sample.nLoopStart != m_dwBeginSel) || (sample.nLoopEnd != m_dwEndSel)) @@ -1718,8 +1739,8 @@ CModDoc *pModDoc = GetDocument(); if (pModDoc) { - CSoundFile *pSndFile = pModDoc->GetSoundFile(); - ModSample &sample = pSndFile->GetSample(m_nSample); + CSoundFile &sndFile = pModDoc->GetrSoundFile(); + ModSample &sample = sndFile.GetSample(m_nSample); if ((m_dwEndSel > m_dwBeginSel + 15) && (m_dwEndSel <= sample.nLength)) { if ((sample.nSustainStart != m_dwBeginSel) || (sample.nSustainEnd != m_dwEndSel)) @@ -1788,13 +1809,12 @@ //------------------------------ { CModDoc *pModDoc = GetDocument(); - CSoundFile *pSndFile; DWORD dwUpdateFlags = HINT_SAMPLEINFO | HINT_SAMPLEDATA; DWORD len; if (!pModDoc) return; - pSndFile = pModDoc->GetSoundFile(); - ModSample &sample = pSndFile->GetSample(m_nSample); + CSoundFile &sndFile = pModDoc->GetrSoundFile(); + ModSample &sample = sndFile.GetSample(m_nSample); len = sample.nLength; if ((!sample.pSample) || (!len)) return; if (m_dwEndSel > len) m_dwEndSel = len; @@ -1804,7 +1824,7 @@ if (Reporting::Confirm("Remove this sample?", "Remove Sample", true) != cnfYes) return; pModDoc->GetSampleUndo().PrepareUndo(m_nSample, sundo_replace); - pSndFile->DestroySampleThreadsafe(m_nSample); + sndFile.DestroySampleThreadsafe(m_nSample); dwUpdateFlags |= HINT_SMPNAMES; } else @@ -2423,15 +2443,15 @@ CModDoc *pModDoc = GetDocument(); if (pModDoc) { - CSoundFile *pSndFile = pModDoc->GetSoundFile(); - ModSample &sample = pSndFile->GetSample(m_nSample); + CSoundFile &sndFile = pModDoc->GetrSoundFile(); + ModSample &sample = sndFile.GetSample(m_nSample); if ((m_dwMenuParam+4 <= sample.nLoopEnd) && (sample.nLoopStart != m_dwMenuParam)) { pModDoc->GetSampleUndo().PrepareUndo(m_nSample, sundo_none); sample.nLoopStart = m_dwMenuParam; sample.uFlags |= CHN_LOOP; pModDoc->SetModified(); - ctrlSmp::UpdateLoopPoints(sample, *pSndFile); + ctrlSmp::UpdateLoopPoints(sample, sndFile); pModDoc->UpdateAllViews(NULL, (m_nSample << HINT_SHIFT_SMP) | HINT_SAMPLEINFO | HINT_SAMPLEDATA, NULL); } } @@ -2444,15 +2464,15 @@ CModDoc *pModDoc = GetDocument(); if (pModDoc) { - CSoundFile *pSndFile = pModDoc->GetSoundFile(); - ModSample &sample = pSndFile->GetSample(m_nSample); + CSoundFile &sndFile = pModDoc->GetrSoundFile(); + ModSample &sample = sndFile.GetSample(m_nSample); if ((m_dwMenuParam >= sample.nLoopStart+4) && (sample.nLoopEnd != m_dwMenuParam)) { pModDoc->GetSampleUndo().PrepareUndo(m_nSample, sundo_none); sample.nLoopEnd = m_dwMenuParam; sample.uFlags |= CHN_LOOP; pModDoc->SetModified(); - ctrlSmp::UpdateLoopPoints(sample, *pSndFile); + ctrlSmp::UpdateLoopPoints(sample, sndFile); pModDoc->UpdateAllViews(NULL, (m_nSample << HINT_SHIFT_SMP) | HINT_SAMPLEINFO | HINT_SAMPLEDATA, NULL); } } @@ -2465,15 +2485,15 @@ CModDoc *pModDoc = GetDocument(); if (pModDoc) { - CSoundFile *pSndFile = pModDoc->GetSoundFile(); - ModSample &sample = pSndFile->GetSample(m_nSample); + CSoundFile &sndFile = pModDoc->GetrSoundFile(); + ModSample &sample = sndFile.GetSample(m_nSample); if ((m_dwMenuParam+4 <= sample.nSustainEnd) && (sample.nSustainStart != m_dwMenuParam)) { pModDoc->GetSampleUndo().PrepareUndo(m_nSample, sundo_none); sample.nSustainStart = m_dwMenuParam; sample.uFlags |= CHN_SUSTAINLOOP; pModDoc->SetModified(); - ctrlSmp::UpdateLoopPoints(sample, *pSndFile); + ctrlSmp::UpdateLoopPoints(sample, sndFile); pModDoc->UpdateAllViews(NULL, (m_nSample << HINT_SHIFT_SMP) | HINT_SAMPLEINFO | HINT_SAMPLEDATA, NULL); } } @@ -2486,15 +2506,15 @@ CModDoc *pModDoc = GetDocument(); if (pModDoc) { - CSoundFile *pSndFile = pModDoc->GetSoundFile(); - ModSample &sample = pSndFile->GetSample(m_nSample); + CSoundFile &sndFile = pModDoc->GetrSoundFile(); + ModSample &sample = sndFile.GetSample(m_nSample); if ((m_dwMenuParam >= sample.nSustainStart+4) && (sample.nSustainEnd != m_dwMenuParam)) { pModDoc->GetSampleUndo().PrepareUndo(m_nSample, sundo_none); sample.nSustainEnd = m_dwMenuParam; sample.uFlags |= CHN_SUSTAINLOOP; pModDoc->SetModified(); - ctrlSmp::UpdateLoopPoints(sample, *pSndFile); + ctrlSmp::UpdateLoopPoints(sample, sndFile); pModDoc->UpdateAllViews(NULL, (m_nSample << HINT_SHIFT_SMP) | HINT_SAMPLEINFO | HINT_SAMPLEDATA, NULL); } } Modified: trunk/OpenMPT/mptrack/View_smp.h =================================================================== --- trunk/OpenMPT/mptrack/View_smp.h 2013-11-29 17:19:33 UTC (rev 3333) +++ trunk/OpenMPT/mptrack/View_smp.h 2013-11-29 20:37:19 UTC (rev 3334) @@ -26,6 +26,8 @@ protected: CImageList m_bmpEnvBar; CRect m_rcClient; + HDC offScreenDC; + HGDIOBJ offScreenBitmap; SIZE m_sizeTotal; SAMPLEINDEX m_nSample; UINT m_nZoom, m_nScrollPos, m_nScrollFactor, m_nBtnMouseOver; @@ -42,6 +44,7 @@ public: CViewSample(); + ~CViewSample(); DECLARE_SERIAL(CViewSample) protected: @@ -55,7 +58,7 @@ void InvalidateSample(); void SetCurSel(SmpLength nBegin, SmpLength nEnd); void ScrollToPosition(int x); - void DrawPositionMarks(HDC hdc); + void DrawPositionMarks(); void DrawSampleData1(HDC hdc, int ymed, int cx, int cy, int len, int uFlags, PVOID pSampleData); void DrawSampleData2(HDC hdc, int ymed, int cx, int cy, int len, int uFlags, PVOID pSampleData); void DrawNcButton(CDC *pDC, UINT nBtn); This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |