comparison layer/Colour3DPlotRenderer.cpp @ 1214:be42a33a3db6 3.0-integration

More cache hit counts; make debug output from colour 3d plot renderer (even though it is to SVDEBUG) appear only with explicit debug flag
author Chris Cannam
date Thu, 05 Jan 2017 14:30:49 +0000
parents 34df6ff25472
children 51b6381fc413
comparison
equal deleted inserted replaced
1213:34df6ff25472 1214:be42a33a3db6
15 15
16 #include "Colour3DPlotRenderer.h" 16 #include "Colour3DPlotRenderer.h"
17 #include "RenderTimer.h" 17 #include "RenderTimer.h"
18 18
19 #include "base/Profiler.h" 19 #include "base/Profiler.h"
20 #include "base/HitCount.h"
20 21
21 #include "data/model/DenseThreeDimensionalModel.h" 22 #include "data/model/DenseThreeDimensionalModel.h"
22 #include "data/model/Dense3DModelPeakCache.h" 23 #include "data/model/Dense3DModelPeakCache.h"
23 #include "data/model/FFTModel.h" 24 #include "data/model/FFTModel.h"
24 25
119 MagnitudeRange range = renderDirectTranslucent(v, paint, rect); 120 MagnitudeRange range = renderDirectTranslucent(v, paint, rect);
120 return { rect, range }; 121 return { rect, range };
121 } 122 }
122 123
123 #ifdef DEBUG_COLOUR_PLOT_REPAINT 124 #ifdef DEBUG_COLOUR_PLOT_REPAINT
124 cerr << "cache start " << m_cache.getStartFrame() 125 SVDEBUG << "cache start " << m_cache.getStartFrame()
125 << " valid left " << m_cache.getValidLeft() 126 << " valid left " << m_cache.getValidLeft()
126 << " valid right " << m_cache.getValidRight() 127 << " valid right " << m_cache.getValidRight()
127 << endl; 128 << endl;
128 cerr << " view start " << startFrame 129 SVDEBUG << " view start " << startFrame
129 << " x0 " << x0 130 << " x0 " << x0
130 << " x1 " << x1 131 << " x1 " << x1
131 << endl; 132 << endl;
132 #endif 133 #endif
134
135 static HitCount count("Colour3DPlotRenderer: image cache");
133 136
134 if (m_cache.isValid()) { // some part of the cache is valid 137 if (m_cache.isValid()) { // some part of the cache is valid
135 138
136 if (v->getXForFrame(m_cache.getStartFrame()) == 139 if (v->getXForFrame(m_cache.getStartFrame()) ==
137 v->getXForFrame(startFrame) && 140 v->getXForFrame(startFrame) &&
138 m_cache.getValidLeft() <= x0 && 141 m_cache.getValidLeft() <= x0 &&
139 m_cache.getValidRight() >= x1) { 142 m_cache.getValidRight() >= x1) {
140 143
141 #ifdef DEBUG_COLOUR_PLOT_REPAINT 144 #ifdef DEBUG_COLOUR_PLOT_REPAINT
142 cerr << "cache hit" << endl; 145 SVDEBUG << "cache hit" << endl;
143 #endif 146 #endif
147 count.hit();
144 148
145 // cache is valid for the complete requested area 149 // cache is valid for the complete requested area
146 paint.drawImage(rect, m_cache.getImage(), rect); 150 paint.drawImage(rect, m_cache.getImage(), rect);
147 151
148 MagnitudeRange range = m_magCache.getRange(x0, x1 - x0); 152 MagnitudeRange range = m_magCache.getRange(x0, x1 - x0);
149 153
150 return { rect, range }; 154 return { rect, range };
151 155
152 } else { 156 } else {
153 #ifdef DEBUG_COLOUR_PLOT_REPAINT 157 #ifdef DEBUG_COLOUR_PLOT_REPAINT
154 cerr << "cache partial hit" << endl; 158 SVDEBUG << "cache partial hit" << endl;
155 #endif 159 #endif
160 count.partial();
156 161
157 // cache doesn't begin at the right frame or doesn't 162 // cache doesn't begin at the right frame or doesn't
158 // contain the complete view, but might be scrollable or 163 // contain the complete view, but might be scrollable or
159 // partially usable 164 // partially usable
160 m_cache.scrollTo(v, startFrame); 165 m_cache.scrollTo(v, startFrame);
173 } 178 }
174 } 179 }
175 } 180 }
176 } else { 181 } else {
177 // cache is completely invalid 182 // cache is completely invalid
183 count.miss();
178 m_cache.setStartFrame(startFrame); 184 m_cache.setStartFrame(startFrame);
179 m_magCache.setStartFrame(startFrame); 185 m_magCache.setStartFrame(startFrame);
180 } 186 }
181 187
182 bool rightToLeft = false; 188 bool rightToLeft = false;
461 if (r.contains(illuminatePos)) { 467 if (r.contains(illuminatePos)) {
462 paint.setPen(v->getForeground()); 468 paint.setPen(v->getForeground());
463 } 469 }
464 } 470 }
465 471
466 #ifdef DEBUG_COLOUR_3D_PLOT_LAYER_PAINT 472 #ifdef DEBUG_COLOUR_PLOT_REPAINT
467 // cerr << "rect " << r.x() << "," << r.y() << " " 473 // SVDEBUG << "rect " << r.x() << "," << r.y() << " "
468 // << r.width() << "x" << r.height() << endl; 474 // << r.width() << "x" << r.height() << endl;
469 #endif 475 #endif
470 476
471 paint.drawRect(r); 477 paint.drawRect(r);
472 478
513 binsPerPeak = bpp; 519 binsPerPeak = bpp;
514 } 520 }
515 } 521 }
516 } 522 }
517 523
524 #ifdef DEBUG_COLOUR_PLOT_REPAINT
518 SVDEBUG << "getPreferredPeakCache: zoomLevel = " << zoomLevel 525 SVDEBUG << "getPreferredPeakCache: zoomLevel = " << zoomLevel
519 << ", binResolution " << binResolution 526 << ", binResolution " << binResolution
520 << ", binsPerPeak " << binsPerPeak 527 << ", binsPerPeak " << binsPerPeak
521 << ", peakCacheIndex " << peakCacheIndex 528 << ", peakCacheIndex " << peakCacheIndex
522 << ", peakCaches " << m_sources.peakCaches.size() 529 << ", peakCaches " << m_sources.peakCaches.size()
523 << endl; 530 << endl;
531 #endif
524 } 532 }
525 533
526 void 534 void
527 Colour3DPlotRenderer::renderToCachePixelResolution(const LayerGeometryProvider *v, 535 Colour3DPlotRenderer::renderToCachePixelResolution(const LayerGeometryProvider *v,
528 int x0, int repaintWidth, 536 int x0, int repaintWidth,
529 bool rightToLeft, 537 bool rightToLeft,
530 bool timeConstrained) 538 bool timeConstrained)
531 { 539 {
532 Profiler profiler("Colour3DPlotRenderer::renderToCachePixelResolution"); 540 Profiler profiler("Colour3DPlotRenderer::renderToCachePixelResolution");
533 #ifdef DEBUG_COLOUR_PLOT_REPAINT 541 #ifdef DEBUG_COLOUR_PLOT_REPAINT
534 cerr << "renderToCachePixelResolution" << endl; 542 SVDEBUG << "renderToCachePixelResolution" << endl;
535 #endif 543 #endif
536 544
537 // Draw to the draw buffer, and then copy from there. The draw 545 // Draw to the draw buffer, and then copy from there. The draw
538 // buffer is at the same resolution as the target in the cache, so 546 // buffer is at the same resolution as the target in the cache, so
539 // no extra scaling needed. 547 // no extra scaling needed.
672 Colour3DPlotRenderer::renderToCacheBinResolution(const LayerGeometryProvider *v, 680 Colour3DPlotRenderer::renderToCacheBinResolution(const LayerGeometryProvider *v,
673 int x0, int repaintWidth) 681 int x0, int repaintWidth)
674 { 682 {
675 Profiler profiler("Colour3DPlotRenderer::renderToCacheBinResolution"); 683 Profiler profiler("Colour3DPlotRenderer::renderToCacheBinResolution");
676 #ifdef DEBUG_COLOUR_PLOT_REPAINT 684 #ifdef DEBUG_COLOUR_PLOT_REPAINT
677 cerr << "renderToCacheBinResolution" << endl; 685 SVDEBUG << "renderToCacheBinResolution" << endl;
678 #endif 686 #endif
679 687
680 // Draw to the draw buffer, and then scale-copy from there. Draw 688 // Draw to the draw buffer, and then scale-copy from there. Draw
681 // buffer is at bin resolution, i.e. buffer x == source column 689 // buffer is at bin resolution, i.e. buffer x == source column
682 // number. We use toolkit smooth scaling for interpolation. 690 // number. We use toolkit smooth scaling for interpolation.
738 746
739 for (int x = 0; x < drawBufferWidth; ++x) { 747 for (int x = 0; x < drawBufferWidth; ++x) {
740 binforx[x] = int(leftBoundaryFrame / binResolution) + x; 748 binforx[x] = int(leftBoundaryFrame / binResolution) + x;
741 } 749 }
742 750
751 #ifdef DEBUG_COLOUR_PLOT_REPAINT
743 SVDEBUG << "[BIN] binResolution " << binResolution << endl; 752 SVDEBUG << "[BIN] binResolution " << binResolution << endl;
753 #endif
744 754
745 for (int y = 0; y < h; ++y) { 755 for (int y = 0; y < h; ++y) {
746 binfory[y] = m_sources.verticalBinLayer->getBinForY(v, h - y - 1); 756 binfory[y] = m_sources.verticalBinLayer->getBinForY(v, h - y - 1);
747 } 757 }
748 758
785 if (sourceLeft < 0) { 795 if (sourceLeft < 0) {
786 sourceLeft = 0; 796 sourceLeft = 0;
787 } 797 }
788 798
789 #ifdef DEBUG_COLOUR_PLOT_REPAINT 799 #ifdef DEBUG_COLOUR_PLOT_REPAINT
790 cerr << "repaintWidth = " << repaintWidth 800 SVDEBUG << "repaintWidth = " << repaintWidth
791 << ", targetWidth = " << targetWidth << endl; 801 << ", targetWidth = " << targetWidth << endl;
792 #endif 802 #endif
793 803
794 if (targetWidth > 0) { 804 if (targetWidth > 0) {
795 // we are copying from an image that has already been scaled, 805 // we are copying from an image that has already been scaled,
796 // hence using the same width in both geometries 806 // hence using the same width in both geometries
832 if (peakCacheIndex >= 0) { 842 if (peakCacheIndex >= 0) {
833 divisor = m_sources.peakCaches[peakCacheIndex]->getColumnsPerPeak(); 843 divisor = m_sources.peakCaches[peakCacheIndex]->getColumnsPerPeak();
834 sourceModel = m_sources.peakCaches[peakCacheIndex]; 844 sourceModel = m_sources.peakCaches[peakCacheIndex];
835 } 845 }
836 846
847 #ifdef DEBUG_COLOUR_PLOT_REPAINT
837 SVDEBUG << "renderDrawBuffer: w = " << w << ", h = " << h 848 SVDEBUG << "renderDrawBuffer: w = " << w << ", h = " << h
838 << ", peakCacheIndex = " << peakCacheIndex << " (divisor = " 849 << ", peakCacheIndex = " << peakCacheIndex << " (divisor = "
839 << divisor << "), rightToLeft = " << rightToLeft 850 << divisor << "), rightToLeft = " << rightToLeft
840 << ", timeConstrained = " << timeConstrained << endl; 851 << ", timeConstrained = " << timeConstrained << endl;
841 SVDEBUG << "renderDrawBuffer: normalization = " << int(m_params.normalization) 852 SVDEBUG << "renderDrawBuffer: normalization = " << int(m_params.normalization)
842 << ", binDisplay = " << int(m_params.binDisplay) 853 << ", binDisplay = " << int(m_params.binDisplay)
843 << ", binScale = " << int(m_params.binScale) 854 << ", binScale = " << int(m_params.binScale)
844 << ", alwaysOpaque = " << m_params.alwaysOpaque 855 << ", alwaysOpaque = " << m_params.alwaysOpaque
845 << ", interpolate = " << m_params.interpolate << endl; 856 << ", interpolate = " << m_params.interpolate << endl;
857 #endif
846 858
847 int sh = sourceModel->getHeight(); 859 int sh = sourceModel->getHeight();
848 860
849 int minbin = int(binfory[0] + 0.0001); 861 int minbin = int(binfory[0] + 0.0001);
850 if (minbin >= sh) minbin = sh - 1; 862 if (minbin >= sh) minbin = sh - 1;
852 864
853 int nbins = int(binfory[h-1] + 0.0001) - minbin + 1; 865 int nbins = int(binfory[h-1] + 0.0001) - minbin + 1;
854 if (minbin + nbins > sh) nbins = sh - minbin; 866 if (minbin + nbins > sh) nbins = sh - minbin;
855 867
856 #ifdef DEBUG_COLOUR_PLOT_REPAINT 868 #ifdef DEBUG_COLOUR_PLOT_REPAINT
857 cerr << "minbin = " << minbin << ", nbins = " << nbins << ", last binfory = " 869 SVDEBUG << "minbin = " << minbin << ", nbins = " << nbins << ", last binfory = "
858 << binfory[h-1] << " (rounds to " << int(binfory[h-1]) << ") (model height " << sh << ")" << endl; 870 << binfory[h-1] << " (rounds to " << int(binfory[h-1]) << ") (model height " << sh << ")" << endl;
859 #endif 871 #endif
860 872
861 int psx = -1; 873 int psx = -1;
862 874
875 vector<float> preparedColumn; 887 vector<float> preparedColumn;
876 888
877 int modelWidth = sourceModel->getWidth(); 889 int modelWidth = sourceModel->getWidth();
878 890
879 #ifdef DEBUG_COLOUR_PLOT_REPAINT 891 #ifdef DEBUG_COLOUR_PLOT_REPAINT
880 cerr << "modelWidth " << modelWidth << ", divisor " << divisor << endl; 892 SVDEBUG << "modelWidth " << modelWidth << ", divisor " << divisor << endl;
881 #endif 893 #endif
882 894
883 for (int x = start; x != finish; x += step) { 895 for (int x = start; x != finish; x += step) {
884 896
885 // x is the on-canvas pixel coord; sx (later) will be the 897 // x is the on-canvas pixel coord; sx (later) will be the
895 if (sx0 < 0) sx0 = sx1 - 1; 907 if (sx0 < 0) sx0 = sx1 - 1;
896 if (sx0 < 0) continue; 908 if (sx0 < 0) continue;
897 if (sx1 <= sx0) sx1 = sx0 + 1; 909 if (sx1 <= sx0) sx1 = sx0 + 1;
898 910
899 #ifdef DEBUG_COLOUR_PLOT_REPAINT 911 #ifdef DEBUG_COLOUR_PLOT_REPAINT
900 // cerr << "x = " << x << ", binforx[x] = " << binforx[x] << ", sx range " << sx0 << " -> " << sx1 << endl; 912 // SVDEBUG << "x = " << x << ", binforx[x] = " << binforx[x] << ", sx range " << sx0 << " -> " << sx1 << endl;
901 #endif 913 #endif
902 914
903 vector<float> pixelPeakColumn; 915 vector<float> pixelPeakColumn;
904 MagnitudeRange magRange; 916 MagnitudeRange magRange;
905 917
966 m_magRanges.push_back(magRange); 978 m_magRanges.push_back(magRange);
967 } 979 }
968 980
969 double fractionComplete = double(columnCount) / double(w); 981 double fractionComplete = double(columnCount) / double(w);
970 if (timer.outOfTime(fractionComplete)) { 982 if (timer.outOfTime(fractionComplete)) {
983 #ifdef DEBUG_COLOUR_PLOT_REPAINT
971 SVDEBUG << "out of time" << endl; 984 SVDEBUG << "out of time" << endl;
985 #endif
972 return columnCount; 986 return columnCount;
973 } 987 }
974 } 988 }
975 989
976 return columnCount; 990 return columnCount;
1021 1035
1022 vector<float> preparedColumn; 1036 vector<float> preparedColumn;
1023 1037
1024 int modelWidth = fft->getWidth(); 1038 int modelWidth = fft->getWidth();
1025 #ifdef DEBUG_COLOUR_PLOT_REPAINT 1039 #ifdef DEBUG_COLOUR_PLOT_REPAINT
1026 cerr << "modelWidth " << modelWidth << endl; 1040 SVDEBUG << "modelWidth " << modelWidth << endl;
1027 #endif 1041 #endif
1028 1042
1029 double minFreq = 1043 double minFreq =
1030 (double(minbin) * fft->getSampleRate()) / fft->getFFTSize(); 1044 (double(minbin) * fft->getSampleRate()) / fft->getFFTSize();
1031 double maxFreq = 1045 double maxFreq =