comparison layer/Colour3DPlotRenderer.cpp @ 1123:343887ac6766 spectrogram-minor-refactor

Some tidying
author Chris Cannam
date Fri, 22 Jul 2016 14:42:36 +0100
parents 94370157b265
children b71a0491d287
comparison
equal deleted inserted replaced
1122:94370157b265 1123:343887ac6766
28 28
29 #include "view/ViewManager.h" // for main model sample rate. Pity 29 #include "view/ViewManager.h" // for main model sample rate. Pity
30 30
31 #include <vector> 31 #include <vector>
32 32
33 #define DEBUG_SPECTROGRAM_REPAINT 1 //!!! name 33 #define DEBUG_COLOUR_PLOT_REPAINT 1
34 34
35 using namespace std; 35 using namespace std;
36 36
37 Colour3DPlotRenderer::RenderResult 37 Colour3DPlotRenderer::RenderResult
38 Colour3DPlotRenderer::render(const LayerGeometryProvider *v, QPainter &paint, QRect rect) 38 Colour3DPlotRenderer::render(const LayerGeometryProvider *v, QPainter &paint, QRect rect)
117 if (renderType == DirectTranslucent) { 117 if (renderType == DirectTranslucent) {
118 MagnitudeRange range = renderDirectTranslucent(v, paint, rect); 118 MagnitudeRange range = renderDirectTranslucent(v, paint, rect);
119 return { rect, range }; 119 return { rect, range };
120 } 120 }
121 121
122 #ifdef DEBUG_COLOUR_PLOT_REPAINT
122 cerr << "cache start " << m_cache.getStartFrame() 123 cerr << "cache start " << m_cache.getStartFrame()
123 << " valid left " << m_cache.getValidLeft() 124 << " valid left " << m_cache.getValidLeft()
124 << " valid right " << m_cache.getValidRight() 125 << " valid right " << m_cache.getValidRight()
125 << endl; 126 << endl;
126 cerr << " view start " << startFrame 127 cerr << " view start " << startFrame
127 << " x0 " << x0 128 << " x0 " << x0
128 << " x1 " << x1 129 << " x1 " << x1
129 << endl; 130 << endl;
131 #endif
130 132
131 if (m_cache.isValid()) { // some part of the cache is valid 133 if (m_cache.isValid()) { // some part of the cache is valid
132 134
133 if (v->getXForFrame(m_cache.getStartFrame()) == 135 if (v->getXForFrame(m_cache.getStartFrame()) ==
134 v->getXForFrame(startFrame) && 136 v->getXForFrame(startFrame) &&
135 m_cache.getValidLeft() <= x0 && 137 m_cache.getValidLeft() <= x0 &&
136 m_cache.getValidRight() >= x1) { 138 m_cache.getValidRight() >= x1) {
137 139
140 #ifdef DEBUG_COLOUR_PLOT_REPAINT
138 cerr << "cache hit" << endl; 141 cerr << "cache hit" << endl;
142 #endif
139 143
140 // cache is valid for the complete requested area 144 // cache is valid for the complete requested area
141 paint.drawImage(rect, m_cache.getImage(), rect); 145 paint.drawImage(rect, m_cache.getImage(), rect);
142 146
143 //!!! a dev debug check
144 if (!m_magCache.areColumnsSet(x0, x1 - x0)) {
145 cerr << "NB Columns (" << x0 << " -> " << x1-x0
146 << ") not set in mag cache" << endl;
147 // throw std::logic_error("Columns not set in mag cache");
148 }
149
150 MagnitudeRange range = m_magCache.getRange(x0, x1 - x0); 147 MagnitudeRange range = m_magCache.getRange(x0, x1 - x0);
151 148
152 return { rect, range }; 149 return { rect, range };
153 150
154 } else { 151 } else {
152 #ifdef DEBUG_COLOUR_PLOT_REPAINT
155 cerr << "cache partial hit" << endl; 153 cerr << "cache partial hit" << endl;
154 #endif
156 155
157 // cache doesn't begin at the right frame or doesn't 156 // cache doesn't begin at the right frame or doesn't
158 // contain the complete view, but might be scrollable or 157 // contain the complete view, but might be scrollable or
159 // partially usable 158 // partially usable
160 m_cache.scrollTo(v, startFrame); 159 m_cache.scrollTo(v, startFrame);
246 245
247 MagnitudeRange range = m_magCache.getRange(reqx0, reqx1 - reqx0); 246 MagnitudeRange range = m_magCache.getRange(reqx0, reqx1 - reqx0);
248 247
249 return { pr, range }; 248 return { pr, range };
250 249
251 //!!! todo: timing/incomplete paint
252
253 //!!! todo: peak frequency style
254
255 //!!! todo: transparent style from Colour3DPlot
256
257 //!!! todo: view magnitudes / normalise visible area
258
259 //!!! todo: alter documentation for view mag stuff (cached paints
260 //!!! do not update MagnitudeRange)
261
262 //!!! todo, here or in caller: illuminateLocalFeatures 250 //!!! todo, here or in caller: illuminateLocalFeatures
263 251
264 //!!! todo: colourmap rotation 252 //!!! todo: handle vertical range other than full range of column
265 253
266 //!!! fft model scaling? 254 //!!! fft model scaling?
267
268 //!!! should we own the Dense3DModelPeakCache here? or should it persist
269 } 255 }
270 256
271 Colour3DPlotRenderer::RenderType 257 Colour3DPlotRenderer::RenderType
272 Colour3DPlotRenderer::decideRenderType(const LayerGeometryProvider *v) const 258 Colour3DPlotRenderer::decideRenderType(const LayerGeometryProvider *v) const
273 { 259 {
367 // get column -> scale -> record extents -> 353 // get column -> scale -> record extents ->
368 // normalise -> peak pick -> apply display gain -> 354 // normalise -> peak pick -> apply display gain ->
369 // distribute/interpolate 355 // distribute/interpolate
370 356
371 ColumnOp::Column fullColumn = model->getColumn(sx); 357 ColumnOp::Column fullColumn = model->getColumn(sx);
372
373 // cerr << "x " << x << ", sx " << sx << ", col height " << fullColumn.size()
374 // << ", minbin " << minbin << ", maxbin " << maxbin << endl;
375 358
376 ColumnOp::Column column = 359 ColumnOp::Column column =
377 vector<float>(fullColumn.data() + minbin, 360 vector<float>(fullColumn.data() + minbin,
378 fullColumn.data() + maxbin + 1); 361 fullColumn.data() + maxbin + 1);
379 362
380 magRange.sample(column); 363 magRange.sample(column);
381 364
382 //!!! fft scale if (m_colourScale != ColourScaleType::Phase) { 365 //!!! fft scale if (m_colourScale != ColourScaleType::Phase) {
383 // column = ColumnOp::fftScale(column, m_fftSize); 366 // column = ColumnOp::fftScale(column, m_fftSize);
384 // } 367 // }
385
386 //!!! extents recordColumnExtents(column,
387 // sx,
388 // overallMag,
389 // overallMagChanged);
390 368
391 // if (m_colourScale != ColourScaleType::Phase) { 369 // if (m_colourScale != ColourScaleType::Phase) {
392 preparedColumn = ColumnOp::normalize(column, m_params.normalization); 370 preparedColumn = ColumnOp::normalize(column, m_params.normalization);
393 // } 371 // }
394 372
764 // x is the on-canvas pixel coord; sx (later) will be the 742 // x is the on-canvas pixel coord; sx (later) will be the
765 // source column index 743 // source column index
766 744
767 ++columnCount; 745 ++columnCount;
768 746
769 #ifdef DEBUG_SPECTROGRAM_REPAINT 747 #ifdef DEBUG_COLOUR_PLOT_REPAINT
770 cerr << "x = " << x << ", binforx[x] = " << binforx[x] << endl; 748 cerr << "x = " << x << ", binforx[x] = " << binforx[x] << endl;
771 #endif 749 #endif
772 750
773 if (binforx[x] < 0) continue; 751 if (binforx[x] < 0) continue;
774 752
782 vector<float> pixelPeakColumn; 760 vector<float> pixelPeakColumn;
783 MagnitudeRange magRange; 761 MagnitudeRange magRange;
784 762
785 for (int sx = sx0; sx < sx1; ++sx) { 763 for (int sx = sx0; sx < sx1; ++sx) {
786 764
787 #ifdef DEBUG_SPECTROGRAM_REPAINT 765 #ifdef DEBUG_COLOUR_PLOT_REPAINT
788 cerr << "sx = " << sx << endl; 766 cerr << "sx = " << sx << endl;
789 #endif 767 #endif
790 768
791 if (sx < 0 || sx >= modelWidth) { 769 if (sx < 0 || sx >= modelWidth) {
792 continue; 770 continue;
811 //!!! fft scale if (m_colourScale != ColourScaleType::Phase) { 789 //!!! fft scale if (m_colourScale != ColourScaleType::Phase) {
812 // column = ColumnOp::fftScale(column, m_fftSize); 790 // column = ColumnOp::fftScale(column, m_fftSize);
813 // } 791 // }
814 792
815 magRange.sample(column); 793 magRange.sample(column);
816
817 //!!! extents recordColumnExtents(column,
818 // sx,
819 // overallMag,
820 // overallMagChanged);
821 794
822 // if (m_colourScale != ColourScaleType::Phase) { 795 // if (m_colourScale != ColourScaleType::Phase) {
823 column = ColumnOp::normalize(column, m_params.normalization); 796 column = ColumnOp::normalize(column, m_params.normalization);
824 // } 797 // }
825 798
961 934
962 //!!! fft scale if (m_colourScale != ColourScaleType::Phase) { 935 //!!! fft scale if (m_colourScale != ColourScaleType::Phase) {
963 // column = ColumnOp::fftScale(column, getFFTSize()); 936 // column = ColumnOp::fftScale(column, getFFTSize());
964 // } 937 // }
965 938
966 //!!! extents recordColumnExtents(column,
967 // sx,
968 // overallMag,
969 // overallMagChanged);
970
971 //!!! if (m_colourScale != ColourScaleType::Phase) { 939 //!!! if (m_colourScale != ColourScaleType::Phase) {
972 column = ColumnOp::normalize(column, m_params.normalization); 940 column = ColumnOp::normalize(column, m_params.normalization);
973 //!!! } 941 //!!! }
974 942
975 preparedColumn = column; 943 preparedColumn = column;