Mercurial > hg > svgui
comparison layer/WaveformLayer.cpp @ 673:b5d3dea6d869
Fix strange pixel offset in waveform rendering; round values in labels rather than flooring them
author | Chris Cannam |
---|---|
date | Wed, 09 Oct 2013 14:55:49 +0100 |
parents | ea786e8bd931 |
children | 26c5f7fd4807 1a0dfcbffaf1 |
comparison
equal
deleted
inserted
replaced
672:ee99f5c0050c | 673:b5d3dea6d869 |
---|---|
668 | 668 |
669 m_model->getSummaries(ch, frame0, frame1 - frame0, | 669 m_model->getSummaries(ch, frame0, frame1 - frame0, |
670 *ranges, modelZoomLevel); | 670 *ranges, modelZoomLevel); |
671 | 671 |
672 #ifdef DEBUG_WAVEFORM_PAINT | 672 #ifdef DEBUG_WAVEFORM_PAINT |
673 std::cerr << ranges->size() << " ranges from " << frame0 << " to " << frame1 << std::endl; | 673 std::cerr << "channel " << ch << ": " << ranges->size() << " ranges from " << frame0 << " to " << frame1 << " at zoom level " << modelZoomLevel << std::endl; |
674 #endif | 674 #endif |
675 | 675 |
676 if (mergingChannels || mixingChannels) { | 676 if (mergingChannels || mixingChannels) { |
677 if (m_model->getChannelCount() > 1) { | 677 if (m_model->getChannelCount() > 1) { |
678 if (!otherChannelRanges) { | 678 if (!otherChannelRanges) { |
842 if (meanBottom > meanTop) --meanBottom; | 842 if (meanBottom > meanTop) --meanBottom; |
843 else drawMean = false; | 843 else drawMean = false; |
844 } | 844 } |
845 | 845 |
846 if (x != x0 && prevRangeBottom != -1) { | 846 if (x != x0 && prevRangeBottom != -1) { |
847 if (prevRangeBottom > rangeBottom && | 847 if (prevRangeBottom > rangeBottom + 1 && |
848 prevRangeTop > rangeBottom) { | 848 prevRangeTop > rangeBottom + 1) { |
849 // paint->setPen(midColour); | 849 // paint->setPen(midColour); |
850 paint->setPen(baseColour); | 850 paint->setPen(baseColour); |
851 paint->drawLine(x-1, prevRangeTop, x, rangeBottom); | 851 paint->drawLine(x-1, prevRangeTop, x, rangeBottom + 1); |
852 paint->setPen(prevRangeTopColour); | 852 paint->setPen(prevRangeTopColour); |
853 paint->drawPoint(x-1, prevRangeTop); | 853 paint->drawPoint(x-1, prevRangeTop); |
854 } else if (prevRangeBottom < rangeTop && | 854 } else if (prevRangeBottom < rangeTop - 1 && |
855 prevRangeTop < rangeTop) { | 855 prevRangeTop < rangeTop - 1) { |
856 // paint->setPen(midColour); | 856 // paint->setPen(midColour); |
857 paint->setPen(baseColour); | 857 paint->setPen(baseColour); |
858 paint->drawLine(x-1, prevRangeBottom, x, rangeTop); | 858 paint->drawLine(x-1, prevRangeBottom, x, rangeTop - 1); |
859 paint->setPen(prevRangeBottomColour); | 859 paint->setPen(prevRangeBottomColour); |
860 paint->drawPoint(x-1, prevRangeBottom); | 860 paint->drawPoint(x-1, prevRangeBottom); |
861 } | 861 } |
862 } | 862 } |
863 | 863 |
872 } else { | 872 } else { |
873 paint->setPen(midColour); | 873 paint->setPen(midColour); |
874 } | 874 } |
875 | 875 |
876 #ifdef DEBUG_WAVEFORM_PAINT | 876 #ifdef DEBUG_WAVEFORM_PAINT |
877 std::cerr << "range " << rangeBottom << " -> " << rangeTop << std::endl; | 877 std::cerr << "range " << rangeBottom << " -> " << rangeTop << ", means " << meanBottom << " -> " << meanTop << ", raw range " << range.min() << " -> " << range.max() << std::endl; |
878 #endif | 878 #endif |
879 | 879 |
880 if (rangeTop == rangeBottom) { | 880 if (rangeTop == rangeBottom) { |
881 paint->drawPoint(x, rangeTop); | 881 paint->drawPoint(x, rangeTop); |
882 } else { | 882 } else { |
988 if (fabs(range.min()) < 0.01) { | 988 if (fabs(range.min()) < 0.01) { |
989 min = range.min(); | 989 min = range.min(); |
990 max = range.max(); | 990 max = range.max(); |
991 singleValue = (min == max); | 991 singleValue = (min == max); |
992 } else { | 992 } else { |
993 int imin = int(range.min() * 1000); | 993 int imin = lrint(range.min() * 10000); |
994 int imax = int(range.max() * 1000); | 994 int imax = lrint(range.max() * 10000); |
995 singleValue = (imin == imax); | 995 singleValue = (imin == imax); |
996 min = float(imin)/1000; | 996 min = float(imin)/10000; |
997 max = float(imax)/1000; | 997 max = float(imax)/10000; |
998 } | 998 } |
999 | 999 |
1000 int db = int(AudioLevel::multiplier_to_dB(std::max(fabsf(range.min()), | 1000 int db = int(AudioLevel::multiplier_to_dB(std::max(fabsf(range.min()), |
1001 fabsf(range.max()))) | 1001 fabsf(range.max()))) |
1002 * 100); | 1002 * 100); |