annotate layer/Colour3DPlotLayer.h @ 1269:f2894944c6b8

Make the overlays at either end translucent, so they don't completely crop out any underlying text or necessary info (e.g. selection extents)
author Chris Cannam
date Thu, 19 Apr 2018 14:35:59 +0100
parents a34a2a25907c
children d79e21855aef
rev   line source
Chris@58 1 /* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
Chris@0 2
Chris@0 3 /*
Chris@59 4 Sonic Visualiser
Chris@59 5 An audio file viewer and annotation editor.
Chris@59 6 Centre for Digital Music, Queen Mary, University of London.
Chris@182 7 This file copyright 2006 Chris Cannam and QMUL.
Chris@0 8
Chris@59 9 This program is free software; you can redistribute it and/or
Chris@59 10 modify it under the terms of the GNU General Public License as
Chris@59 11 published by the Free Software Foundation; either version 2 of the
Chris@59 12 License, or (at your option) any later version. See the file
Chris@59 13 COPYING included with this distribution for more information.
Chris@0 14 */
Chris@0 15
Chris@1068 16 #ifndef COLOUR_3D_PLOT_LAYER_H
Chris@1068 17 #define COLOUR_3D_PLOT_LAYER_H
Chris@0 18
Chris@193 19 #include "SliceableLayer.h"
Chris@1082 20 #include "VerticalBinLayer.h"
Chris@0 21
Chris@1097 22 #include "ColourScale.h"
Chris@1097 23 #include "Colour3DPlotRenderer.h"
Chris@1097 24
Chris@128 25 #include "data/model/DenseThreeDimensionalModel.h"
Chris@0 26
Chris@0 27 class View;
Chris@0 28 class QPainter;
Chris@0 29 class QImage;
Chris@0 30
Chris@0 31 /**
Chris@0 32 * This is a view that displays dense 3-D data (time, some sort of
Chris@0 33 * binned y-axis range, value) as a colour plot with value mapped to
Chris@0 34 * colour range. Its source is a DenseThreeDimensionalModel.
Chris@0 35 *
Chris@0 36 * This was the original implementation for the spectrogram view, but
Chris@1068 37 * it was replaced for that purpose with a more efficient
Chris@1068 38 * implementation that derived the spectrogram itself from a
Chris@1068 39 * DenseTimeValueModel instead of using a three-dimensional model.
Chris@0 40 */
Chris@1110 41 class Colour3DPlotLayer : public VerticalBinLayer
Chris@0 42 {
Chris@0 43 Q_OBJECT
Chris@0 44
Chris@0 45 public:
Chris@44 46 Colour3DPlotLayer();
Chris@0 47 ~Colour3DPlotLayer();
Chris@0 48
Chris@156 49 virtual const ZoomConstraint *getZoomConstraint() const {
Chris@156 50 return m_model ? m_model->getZoomConstraint() : 0;
Chris@156 51 }
Chris@0 52 virtual const Model *getModel() const { return m_model; }
Chris@916 53 virtual void paint(LayerGeometryProvider *v, QPainter &paint, QRect rect) const;
Chris@1101 54 virtual void setSynchronousPainting(bool synchronous);
Chris@0 55
Chris@916 56 virtual int getVerticalScaleWidth(LayerGeometryProvider *v, bool, QPainter &) const;
Chris@916 57 virtual void paintVerticalScale(LayerGeometryProvider *v, bool, QPainter &paint, QRect rect) const;
Chris@25 58
Chris@916 59 virtual QString getFeatureDescription(LayerGeometryProvider *v, QPoint &) const;
Chris@25 60
Chris@916 61 virtual bool snapToFeatureFrame(LayerGeometryProvider *v, sv_frame_t &frame,
Chris@1266 62 int &resolution,
Chris@1266 63 SnapType snap) const;
Chris@24 64
Chris@916 65 virtual void setLayerDormant(const LayerGeometryProvider *v, bool dormant);
Chris@475 66
Chris@916 67 virtual bool isLayerScrollable(const LayerGeometryProvider *v) const;
Chris@25 68
Chris@287 69 virtual ColourSignificance getLayerColourSignificance() const {
Chris@287 70 return ColourHasMeaningfulValue;
Chris@287 71 }
Chris@183 72
Chris@0 73 void setModel(const DenseThreeDimensionalModel *model);
Chris@0 74
Chris@916 75 virtual int getCompletion(LayerGeometryProvider *) const { return m_model->getCompletion(); }
Chris@24 76
Chris@0 77 virtual PropertyList getProperties() const;
Chris@0 78 virtual PropertyType getPropertyType(const PropertyName &) const;
Chris@159 79 virtual QString getPropertyLabel(const PropertyName &) const;
Chris@346 80 virtual QString getPropertyIconName(const PropertyName &) const;
Chris@159 81 virtual QString getPropertyGroupName(const PropertyName &) const;
Chris@0 82 virtual int getPropertyRangeAndValue(const PropertyName &,
Chris@216 83 int *min, int *max, int *deflt) const;
Chris@0 84 virtual QString getPropertyValueLabel(const PropertyName &,
Chris@1266 85 int value) const;
Chris@1099 86 virtual QString getPropertyValueIconName(const PropertyName &,
Chris@1099 87 int value) const;
Chris@534 88 virtual RangeMapper *getNewPropertyRangeMapper(const PropertyName &) const;
Chris@0 89 virtual void setProperty(const PropertyName &, int value);
Chris@197 90 virtual void setProperties(const QXmlAttributes &);
Chris@11 91
Chris@1105 92 void setColourScale(ColourScaleType);
Chris@1105 93 ColourScaleType getColourScale() const { return m_colourScale; }
Chris@159 94
Chris@197 95 void setColourMap(int map);
Chris@197 96 int getColourMap() const;
Chris@197 97
Chris@534 98 /**
Chris@534 99 * Set the gain multiplier for sample values in this view.
Chris@534 100 * The default is 1.0.
Chris@534 101 */
Chris@534 102 void setGain(float gain);
Chris@534 103 float getGain() const;
Chris@531 104
Chris@531 105 /**
Chris@531 106 * Specify the scale for the y axis.
Chris@531 107 */
Chris@1103 108 void setBinScale(BinScale);
Chris@1103 109 BinScale getBinScale() const;
Chris@531 110
Chris@719 111 /**
Chris@1104 112 * Specify the normalization mode for individual columns.
Chris@719 113 */
Chris@1104 114 void setNormalization(ColumnNormalization);
Chris@1104 115 ColumnNormalization getNormalization() const;
Chris@1104 116
Chris@1104 117 /**
Chris@1104 118 * Specify whether to normalize the visible area.
Chris@1104 119 */
Chris@1104 120 void setNormalizeVisibleArea(bool);
Chris@1104 121 bool getNormalizeVisibleArea() const;
Chris@719 122
Chris@357 123 void setInvertVertical(bool i);
Chris@357 124 bool getInvertVertical() const;
Chris@357 125
Chris@465 126 void setOpaque(bool i);
Chris@465 127 bool getOpaque() const;
Chris@465 128
Chris@535 129 void setSmooth(bool i);
Chris@535 130 bool getSmooth() const;
Chris@535 131
Chris@904 132 virtual bool getValueExtents(double &min, double &max,
Chris@444 133 bool &logarithmic, QString &unit) const;
Chris@444 134
Chris@904 135 virtual bool getDisplayExtents(double &min, double &max) const;
Chris@904 136 virtual bool setDisplayExtents(double min, double max);
Chris@444 137
Chris@916 138 virtual bool getYScaleValue(const LayerGeometryProvider *, int /* y */,
Chris@904 139 double &/* value */, QString &/* unit */) const;
Chris@725 140
Chris@444 141 virtual int getVerticalZoomSteps(int &defaultStep) const;
Chris@444 142 virtual int getCurrentVerticalZoomStep() const;
Chris@444 143 virtual void setVerticalZoomStep(int);
Chris@444 144 virtual RangeMapper *getNewVerticalZoomRangeMapper() const;
Chris@444 145
Chris@193 146 virtual const Model *getSliceableModel() const { return m_model; }
Chris@193 147
Chris@316 148 virtual void toXml(QTextStream &stream, QString indent = "",
Chris@316 149 QString extraAttributes = "") const;
Chris@197 150
Chris@0 151 protected slots:
Chris@0 152 void cacheInvalid();
Chris@908 153 void cacheInvalid(sv_frame_t startFrame, sv_frame_t endFrame);
Chris@461 154 void modelChanged();
Chris@908 155 void modelChangedWithin(sv_frame_t, sv_frame_t);
Chris@0 156
Chris@0 157 protected:
Chris@0 158 const DenseThreeDimensionalModel *m_model; // I do not own this
Chris@0 159
Chris@1105 160 ColourScaleType m_colourScale;
Chris@1104 161 bool m_colourScaleSet;
Chris@1104 162 int m_colourMap;
Chris@1104 163 float m_gain;
Chris@1103 164 BinScale m_binScale;
Chris@1104 165 ColumnNormalization m_normalization; // of individual columns
Chris@1104 166 bool m_normalizeVisibleArea;
Chris@1104 167 bool m_invertVertical;
Chris@1104 168 bool m_opaque;
Chris@1104 169 bool m_smooth;
Chris@1104 170 int m_peakResolution;
Chris@197 171
Chris@725 172 // Minimum and maximum bin numbers visible within the view. We
Chris@725 173 // always snap to whole bins at view edges.
Chris@1104 174 int m_miny;
Chris@1104 175 int m_maxy;
Chris@1100 176
Chris@1104 177 bool m_synchronous;
Chris@1104 178
Chris@1105 179 static ColourScaleType convertToColourScale(int value);
Chris@1105 180 static int convertFromColourScale(ColourScaleType);
Chris@1104 181 static std::pair<ColumnNormalization, bool> convertToColumnNorm(int value);
Chris@1104 182 static int convertFromColumnNorm(ColumnNormalization norm, bool visible);
Chris@1101 183
Chris@1100 184 mutable Dense3DModelPeakCache *m_peakCache;
Chris@1100 185 const int m_peakCacheDivisor;
Chris@1100 186 Dense3DModelPeakCache *getPeakCache() const;
Chris@1100 187
Chris@1121 188 typedef std::map<int, MagnitudeRange> ViewMagMap; // key is view id
Chris@1121 189 mutable ViewMagMap m_viewMags;
Chris@1235 190 mutable ViewMagMap m_lastRenderedMags; // when in normalizeVisibleArea mode
Chris@1235 191 void invalidateMagnitudes();
Chris@1121 192
Chris@1100 193 typedef std::map<int, Colour3DPlotRenderer *> ViewRendererMap; // key is view id
Chris@1100 194 mutable ViewRendererMap m_renderers;
Chris@1121 195
Chris@1113 196 Colour3DPlotRenderer *getRenderer(const LayerGeometryProvider *) const;
Chris@1107 197 void invalidateRenderers();
Chris@1100 198
Chris@725 199 /**
Chris@725 200 * Return the y coordinate at which the given bin "starts"
Chris@725 201 * (i.e. at the bottom of the bin, if the given bin is an integer
Chris@725 202 * and the vertical scale is the usual way up). Bin number may be
Chris@725 203 * fractional, to obtain a position part-way through a bin.
Chris@725 204 */
Chris@1113 205 double getYForBin(const LayerGeometryProvider *, double bin) const;
Chris@903 206
Chris@903 207 /**
Chris@725 208 * Return the bin number, possibly fractional, at the given y
Chris@725 209 * coordinate. Note that the whole numbers occur at the positions
Chris@725 210 * at which the bins "start" (i.e. the bottom of the visible bin,
Chris@725 211 * if the vertical scale is the usual way up).
Chris@725 212 */
Chris@1113 213 double getBinForY(const LayerGeometryProvider *, double y) const;
Chris@159 214
Chris@469 215 int getColourScaleWidth(QPainter &) const;
Chris@1101 216
Chris@1107 217 void paintWithRenderer(LayerGeometryProvider *v, QPainter &paint, QRect rect) const;
Chris@0 218 };
Chris@0 219
Chris@0 220 #endif