annotate layer/LayerGeometryProvider.h @ 1386:fc3d89f88690 spectrogramparam

Use log-frequency rather than log-bin for calculating x coord in spectrum. This has the advantage that frequency positions don't move when we change the window size or oversampling ratio, but it does give us an unhelpfully large amount of space for very low frequencies - to be considered
author Chris Cannam
date Mon, 12 Nov 2018 11:34:34 +0000
parents bc2cb82050a0
children 28075cc658c9
rev   line source
Chris@916 1 /* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
Chris@916 2
Chris@916 3 /*
Chris@916 4 Sonic Visualiser
Chris@916 5 An audio file viewer and annotation editor.
Chris@916 6 Centre for Digital Music, Queen Mary, University of London.
Chris@916 7
Chris@916 8 This program is free software; you can redistribute it and/or
Chris@916 9 modify it under the terms of the GNU General Public License as
Chris@916 10 published by the Free Software Foundation; either version 2 of the
Chris@916 11 License, or (at your option) any later version. See the file
Chris@916 12 COPYING included with this distribution for more information.
Chris@916 13 */
Chris@916 14
Chris@1325 15 #ifndef SV_LAYER_GEOMETRY_PROVIDER_H
Chris@1325 16 #define SV_LAYER_GEOMETRY_PROVIDER_H
Chris@916 17
Chris@916 18 #include "base/BaseTypes.h"
Chris@1325 19 #include "base/ZoomLevel.h"
Chris@916 20
Chris@1030 21 #include <QMutex>
Chris@1030 22 #include <QMutexLocker>
Chris@1031 23 #include <QPainter>
Chris@1030 24
Chris@916 25 class ViewManager;
Chris@918 26 class View;
Chris@916 27 class Layer;
Chris@916 28
Chris@1090 29 /**
Chris@1090 30 * Interface for classes that provide geometry information (such as
Chris@1090 31 * size, start frame, and a large number of other properties) about
Chris@1090 32 * the disposition of a layer. The main implementor of this interface
Chris@1090 33 * is the View class, but other implementations may be used in
Chris@1090 34 * different circumstances, e.g. as a proxy to handle hi-dpi
Chris@1090 35 * coordinate mapping.
Chris@1090 36 *
Chris@1090 37 * Note it is expected that some implementations of this may be
Chris@1090 38 * disposable, created on-the-fly for a single use. Code that receives
Chris@1090 39 * a LayerGeometryProvider pointer as an argument to something should
Chris@1090 40 * not, in general, store that pointer as it may be invalidated before
Chris@1090 41 * the next use. Use getId() to instead obtain a persistent identifier
Chris@1090 42 * for a LayerGeometryProvider, for example to establish whether the
Chris@1090 43 * same one is being provided in two separate calls.
Chris@1090 44 */
Chris@916 45 class LayerGeometryProvider
Chris@916 46 {
Chris@1044 47 protected:
Chris@1044 48 static int getNextId() {
Chris@1030 49 static QMutex idMutex;
Chris@1030 50 static int nextId = 1;
Chris@1044 51 static int maxId = INT_MAX;
Chris@1030 52 QMutexLocker locker(&idMutex);
Chris@1044 53 int id = nextId;
Chris@1044 54 if (nextId == maxId) {
Chris@1044 55 // we don't expect this to happen in the lifetime of a
Chris@1044 56 // process, but it would be undefined behaviour if it did
Chris@1044 57 // since we're using a signed int, so we should really
Chris@1044 58 // guard for it...
Chris@1044 59 nextId = 1;
Chris@1044 60 } else {
Chris@1044 61 nextId++;
Chris@1044 62 }
Chris@1044 63 return id;
Chris@1044 64 }
Chris@1044 65
Chris@1044 66 public:
Chris@1044 67 LayerGeometryProvider() { }
Chris@1030 68
Chris@1030 69 /**
Chris@1044 70 * Retrieve the id of this object.
Chris@1030 71 */
Chris@1044 72 virtual int getId() const = 0;
Chris@1030 73
Chris@916 74 /**
Chris@916 75 * Retrieve the first visible sample frame on the widget.
Chris@916 76 * This is a calculated value based on the centre-frame, widget
Chris@916 77 * width and zoom level. The result may be negative.
Chris@916 78 */
Chris@916 79 virtual sv_frame_t getStartFrame() const = 0;
Chris@916 80
Chris@916 81 /**
Chris@916 82 * Return the centre frame of the visible widget. This is an
Chris@916 83 * exact value that does not depend on the zoom block size. Other
Chris@916 84 * frame values (start, end) are calculated from this based on the
Chris@916 85 * zoom and other factors.
Chris@916 86 */
Chris@916 87 virtual sv_frame_t getCentreFrame() const = 0;
Chris@916 88
Chris@916 89 /**
Chris@916 90 * Retrieve the last visible sample frame on the widget.
Chris@916 91 * This is a calculated value based on the centre-frame, widget
Chris@916 92 * width and zoom level.
Chris@916 93 */
Chris@916 94 virtual sv_frame_t getEndFrame() const = 0;
Chris@916 95
Chris@916 96 /**
Chris@916 97 * Return the pixel x-coordinate corresponding to a given sample
Chris@916 98 * frame (which may be negative).
Chris@916 99 */
Chris@916 100 virtual int getXForFrame(sv_frame_t frame) const = 0;
Chris@916 101
Chris@916 102 /**
Chris@916 103 * Return the closest frame to the given pixel x-coordinate.
Chris@916 104 */
Chris@916 105 virtual sv_frame_t getFrameForX(int x) const = 0;
Chris@916 106
Chris@919 107 virtual sv_frame_t getModelsStartFrame() const = 0;
Chris@919 108 virtual sv_frame_t getModelsEndFrame() const = 0;
Chris@919 109
Chris@916 110 /**
Chris@1030 111 * Return the closest pixel x-coordinate corresponding to a given
Chris@1030 112 * view x-coordinate.
Chris@1030 113 */
Chris@1030 114 virtual int getXForViewX(int viewx) const = 0;
Chris@1030 115
Chris@1030 116 /**
Chris@1030 117 * Return the closest view x-coordinate corresponding to a given
Chris@1030 118 * pixel x-coordinate.
Chris@1030 119 */
Chris@1030 120 virtual int getViewXForX(int x) const = 0;
Chris@1030 121
Chris@1030 122 /**
Chris@1085 123 * Return the (maybe fractional) pixel y-coordinate corresponding
Chris@1085 124 * to a given frequency, if the frequency range is as specified.
Chris@1085 125 * This does not imply any policy about layer frequency ranges,
Chris@1085 126 * but it might be useful for layers to match theirs up if
Chris@1085 127 * desired.
Chris@916 128 *
Chris@916 129 * Not thread-safe in logarithmic mode. Call only from GUI thread.
Chris@916 130 */
Chris@1085 131 virtual double getYForFrequency(double frequency,
Chris@1085 132 double minFreq, double maxFreq,
Chris@916 133 bool logarithmic) const = 0;
Chris@916 134
Chris@916 135 /**
Chris@1085 136 * Return the closest frequency to the given (maybe fractional)
Chris@1085 137 * pixel y-coordinate, if the frequency range is as specified.
Chris@916 138 *
Chris@916 139 * Not thread-safe in logarithmic mode. Call only from GUI thread.
Chris@916 140 */
Chris@1085 141 virtual double getFrequencyForY(double y,
Chris@1085 142 double minFreq, double maxFreq,
Chris@1082 143 bool logarithmic) const = 0;
Chris@916 144
Chris@918 145 virtual int getTextLabelHeight(const Layer *layer, QPainter &) const = 0;
Chris@918 146
Chris@918 147 virtual bool getValueExtents(QString unit, double &min, double &max,
Chris@918 148 bool &log) const = 0;
Chris@918 149
Chris@916 150 /**
Chris@1183 151 * Return the zoom level, i.e. the number of frames per pixel or
Chris@1183 152 * pixels per frame
Chris@916 153 */
Chris@1183 154 virtual ZoomLevel getZoomLevel() const = 0;
Chris@916 155
Chris@916 156 /**
Chris@916 157 * To be called from a layer, to obtain the extent of the surface
Chris@916 158 * that the layer is currently painting to. This may be the extent
Chris@916 159 * of the view (if 1x display scaling is in effect) or of a larger
Chris@916 160 * cached pixmap (if greater display scaling is in effect).
Chris@916 161 */
Chris@916 162 virtual QRect getPaintRect() const = 0;
Chris@916 163
Chris@916 164 virtual QSize getPaintSize() const { return getPaintRect().size(); }
Chris@916 165 virtual int getPaintWidth() const { return getPaintRect().width(); }
Chris@916 166 virtual int getPaintHeight() const { return getPaintRect().height(); }
Chris@916 167
Chris@916 168 virtual bool hasLightBackground() const = 0;
Chris@916 169 virtual QColor getForeground() const = 0;
Chris@916 170 virtual QColor getBackground() const = 0;
Chris@916 171
Chris@916 172 virtual ViewManager *getViewManager() const = 0;
Chris@916 173
Chris@916 174 virtual bool shouldIlluminateLocalFeatures(const Layer *, QPoint &) const = 0;
Chris@919 175 virtual bool shouldShowFeatureLabels() const = 0;
Chris@916 176
Chris@916 177 virtual void drawMeasurementRect(QPainter &p, const Layer *,
Chris@916 178 QRect rect, bool focus) const = 0;
Chris@916 179
Chris@1030 180 virtual void updatePaintRect(QRect r) = 0;
Chris@1030 181
Chris@918 182 virtual View *getView() = 0;
Chris@918 183 virtual const View *getView() const = 0;
Chris@916 184 };
Chris@916 185
Chris@916 186 #endif