annotate view/ViewProxy.h @ 1403:10e768adaee5

Retain consistent min freq (rather than min bin no) when changing fft parameters in spectrum; scale ffts by window size rather than fft size in case of oversampling, to avoid fading out because of scale factor including zero padding
author Chris Cannam
date Thu, 15 Nov 2018 15:08:08 +0000
parents b0eeec95ab5b
children a18e78b9c78b
rev   line source
Chris@919 1 /* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
Chris@919 2
Chris@919 3 /*
Chris@919 4 Sonic Visualiser
Chris@919 5 An audio file viewer and annotation editor.
Chris@919 6 Centre for Digital Music, Queen Mary, University of London.
Chris@919 7
Chris@919 8 This program is free software; you can redistribute it and/or
Chris@919 9 modify it under the terms of the GNU General Public License as
Chris@919 10 published by the Free Software Foundation; either version 2 of the
Chris@919 11 License, or (at your option) any later version. See the file
Chris@919 12 COPYING included with this distribution for more information.
Chris@919 13 */
Chris@919 14
Chris@919 15 #ifndef VIEW_PROXY_H
Chris@919 16 #define VIEW_PROXY_H
Chris@919 17
Chris@1077 18 #include "layer/LayerGeometryProvider.h"
Chris@919 19
Chris@919 20 class ViewProxy : public LayerGeometryProvider
Chris@919 21 {
Chris@919 22 public:
Chris@919 23 ViewProxy(View *view, int scaleFactor) :
Chris@1266 24 m_view(view), m_scaleFactor(scaleFactor) { }
Chris@919 25
Chris@1044 26 virtual int getId() const {
Chris@1044 27 return m_view->getId();
Chris@1044 28 }
Chris@919 29 virtual sv_frame_t getStartFrame() const {
Chris@1266 30 return m_view->getStartFrame();
Chris@919 31 }
Chris@919 32 virtual sv_frame_t getCentreFrame() const {
Chris@1266 33 return m_view->getCentreFrame();
Chris@919 34 }
Chris@919 35 virtual sv_frame_t getEndFrame() const {
Chris@1266 36 return m_view->getEndFrame();
Chris@919 37 }
Chris@919 38 virtual int getXForFrame(sv_frame_t frame) const {
Chris@950 39 //!!! not actually correct, if frame lies between view's pixels
Chris@1266 40 return m_scaleFactor * m_view->getXForFrame(frame);
Chris@919 41 }
Chris@919 42 virtual sv_frame_t getFrameForX(int x) const {
Chris@950 43 sv_frame_t f0 = m_view->getFrameForX(x / m_scaleFactor);
Chris@950 44 if (m_scaleFactor == 1) return f0;
Chris@950 45 sv_frame_t f1 = m_view->getFrameForX((x / m_scaleFactor) + 1);
Chris@950 46 return f0 + ((f1 - f0) * (x % m_scaleFactor)) / m_scaleFactor;
Chris@919 47 }
Chris@1030 48 virtual int getXForViewX(int viewx) const {
Chris@1030 49 return viewx * m_scaleFactor;
Chris@1030 50 }
Chris@1030 51 virtual int getViewXForX(int x) const {
Chris@1030 52 return x / m_scaleFactor;
Chris@1030 53 }
Chris@919 54 virtual sv_frame_t getModelsStartFrame() const {
Chris@1266 55 return m_view->getModelsStartFrame();
Chris@919 56 }
Chris@919 57 virtual sv_frame_t getModelsEndFrame() const {
Chris@1266 58 return m_view->getModelsEndFrame();
Chris@919 59 }
Chris@919 60 virtual double getYForFrequency(double frequency,
Chris@1266 61 double minFreq, double maxFreq,
Chris@919 62 bool logarithmic) const {
Chris@1266 63 return m_scaleFactor *
Chris@1266 64 m_view->getYForFrequency(frequency, minFreq, maxFreq, logarithmic);
Chris@919 65 }
Chris@1085 66 virtual double getFrequencyForY(double y, double minFreq, double maxFreq,
Chris@1266 67 bool logarithmic) const {
Chris@1085 68 return m_view->getFrequencyForY
Chris@950 69 (y / m_scaleFactor, minFreq, maxFreq, logarithmic);
Chris@919 70 }
Chris@919 71 virtual int getTextLabelHeight(const Layer *layer, QPainter &paint) const {
Chris@1266 72 return m_scaleFactor * m_view->getTextLabelHeight(layer, paint);
Chris@919 73 }
Chris@919 74 virtual bool getValueExtents(QString unit, double &min, double &max,
Chris@919 75 bool &log) const {
Chris@1266 76 return m_view->getValueExtents(unit, min, max, log);
Chris@919 77 }
Chris@1326 78 virtual ZoomLevel getZoomLevel() const {
Chris@1326 79 ZoomLevel z = m_view->getZoomLevel();
Chris@1326 80 //!!!
Chris@1329 81 // cerr << "getZoomLevel: from " << z << " to ";
Chris@1326 82 if (z.zone == ZoomLevel::FramesPerPixel) {
Chris@1326 83 z.level /= m_scaleFactor;
Chris@1326 84 if (z.level < 1) {
Chris@1326 85 z.level = 1;
Chris@1326 86 }
Chris@1326 87 } else {
Chris@1326 88 //!!!???
Chris@1326 89 z.level *= m_scaleFactor;
Chris@1326 90 }
Chris@1329 91 // cerr << z << endl;
Chris@1266 92 return z;
Chris@919 93 }
Chris@919 94 virtual QRect getPaintRect() const {
Chris@1266 95 QRect r = m_view->getPaintRect();
Chris@1266 96 return QRect(r.x() * m_scaleFactor,
Chris@1266 97 r.y() * m_scaleFactor,
Chris@1266 98 r.width() * m_scaleFactor,
Chris@1266 99 r.height() * m_scaleFactor);
Chris@919 100 }
Chris@954 101 virtual QSize getPaintSize() const {
Chris@954 102 return getPaintRect().size();
Chris@954 103 }
Chris@954 104 virtual int getPaintWidth() const {
Chris@954 105 return getPaintRect().width();
Chris@954 106 }
Chris@954 107 virtual int getPaintHeight() const {
Chris@954 108 return getPaintRect().height();
Chris@954 109 }
Chris@919 110 virtual bool hasLightBackground() const {
Chris@1266 111 return m_view->hasLightBackground();
Chris@919 112 }
Chris@919 113 virtual QColor getForeground() const {
Chris@1266 114 return m_view->getForeground();
Chris@919 115 }
Chris@919 116 virtual QColor getBackground() const {
Chris@1266 117 return m_view->getBackground();
Chris@919 118 }
Chris@919 119 virtual ViewManager *getViewManager() const {
Chris@1266 120 return m_view->getViewManager();
Chris@919 121 }
Chris@1266 122
Chris@954 123 virtual bool shouldIlluminateLocalFeatures(const Layer *layer,
Chris@954 124 QPoint &point) const {
Chris@954 125 QPoint p;
Chris@1266 126 bool should = m_view->shouldIlluminateLocalFeatures(layer, p);
Chris@954 127 point = QPoint(p.x() * m_scaleFactor, p.y() * m_scaleFactor);
Chris@954 128 return should;
Chris@919 129 }
Chris@954 130
Chris@919 131 virtual bool shouldShowFeatureLabels() const {
Chris@1266 132 return m_view->shouldShowFeatureLabels();
Chris@919 133 }
Chris@919 134
Chris@919 135 virtual void drawMeasurementRect(QPainter &p, const Layer *layer,
Chris@919 136 QRect rect, bool focus) const {
Chris@1266 137 m_view->drawMeasurementRect(p, layer, rect, focus);
Chris@919 138 }
Chris@919 139
Chris@1030 140 virtual void updatePaintRect(QRect r) {
Chris@1030 141 m_view->update(r.x() / m_scaleFactor,
Chris@1030 142 r.y() / m_scaleFactor,
Chris@1030 143 r.width() / m_scaleFactor,
Chris@1030 144 r.height() / m_scaleFactor);
Chris@1030 145 }
Chris@1401 146
Chris@1401 147 /**
Chris@1401 148 * Scale up a size in pixels for a hi-dpi display without pixel
Chris@1401 149 * doubling. This is like ViewManager::scalePixelSize, but taking
Chris@1401 150 * and returning floating-point values rather than integer
Chris@1401 151 * pixels. It is also a little more conservative - it never
Chris@1401 152 * shrinks the size, it can only increase or leave it unchanged.
Chris@1401 153 */
Chris@1401 154 virtual double scaleSize(double size) const {
Chris@1401 155 return m_view->scaleSize(size * m_scaleFactor);
Chris@1401 156 }
Chris@1401 157
Chris@1401 158 /**
Chris@1402 159 * Integer version of scaleSize.
Chris@1402 160 */
Chris@1402 161 virtual int scalePixelSize(int size) const {
Chris@1402 162 return m_view->scalePixelSize(size * m_scaleFactor);
Chris@1402 163 }
Chris@1402 164
Chris@1402 165 /**
Chris@1401 166 * Scale up pen width for a hi-dpi display without pixel doubling.
Chris@1401 167 * This is like scaleSize except that it also scales the
Chris@1401 168 * zero-width case.
Chris@1401 169 */
Chris@1401 170 virtual double scalePenWidth(double width) const {
Chris@1401 171 if (width <= 0) { // zero-width pen, produce a scaled one-pixel pen
Chris@1401 172 width = 1;
Chris@1401 173 }
Chris@1401 174 width *= sqrt(double(m_scaleFactor));
Chris@1401 175 return m_view->scalePenWidth(width);
Chris@1401 176 }
Chris@1401 177
Chris@1401 178 /**
Chris@1401 179 * Apply scalePenWidth to a pen.
Chris@1401 180 */
Chris@1401 181 virtual QPen scalePen(QPen pen) const {
Chris@1401 182 return QPen(pen.color(), scalePenWidth(pen.width()));
Chris@1401 183 }
Chris@1030 184
Chris@919 185 virtual View *getView() { return m_view; }
Chris@919 186 virtual const View *getView() const { return m_view; }
Chris@919 187
Chris@919 188 private:
Chris@919 189 View *m_view;
Chris@919 190 int m_scaleFactor;
Chris@919 191 };
Chris@919 192
Chris@919 193 #endif