annotate layer/Colour3DPlotLayer.h @ 473:4f4f943bfdfc

* Merge from one-fftdataserver-per-fftmodel branch. This bit of reworking (which is not described very accurately by the title of the branch) turns the MatrixFile object into something that either reads or writes, but not both, and separates the FFT file cache reader and writer implementations separately. This allows the FFT data server to have a single thread owning writers and one reader per "customer" thread, and for all locking to be vastly simplified and concentrated in the data server alone (because none of the classes it makes use of is used in more than one thread at a time). The result is faster and more trustworthy code.
author Chris Cannam
date Tue, 27 Jan 2009 13:25:10 +0000
parents 13e8edbffbd7
children 3f4b10e76ccd
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@0 16 #ifndef _COLOUR_3D_PLOT_H_
Chris@0 17 #define _COLOUR_3D_PLOT_H_
Chris@0 18
Chris@193 19 #include "SliceableLayer.h"
Chris@0 20
Chris@128 21 #include "data/model/DenseThreeDimensionalModel.h"
Chris@0 22
Chris@0 23 class View;
Chris@0 24 class QPainter;
Chris@0 25 class QImage;
Chris@0 26
Chris@0 27 /**
Chris@0 28 * This is a view that displays dense 3-D data (time, some sort of
Chris@0 29 * binned y-axis range, value) as a colour plot with value mapped to
Chris@0 30 * colour range. Its source is a DenseThreeDimensionalModel.
Chris@0 31 *
Chris@0 32 * This was the original implementation for the spectrogram view, but
Chris@0 33 * it was replaced with a more efficient implementation that derived
Chris@0 34 * the spectrogram itself from a DenseTimeValueModel instead of using
Chris@0 35 * a three-dimensional model. This class is retained in case it
Chris@0 36 * becomes useful, but it will probably need some cleaning up if it's
Chris@0 37 * ever actually used.
Chris@0 38 */
Chris@0 39
Chris@193 40 class Colour3DPlotLayer : public SliceableLayer
Chris@0 41 {
Chris@0 42 Q_OBJECT
Chris@0 43
Chris@0 44 public:
Chris@44 45 Colour3DPlotLayer();
Chris@0 46 ~Colour3DPlotLayer();
Chris@0 47
Chris@156 48 virtual const ZoomConstraint *getZoomConstraint() const {
Chris@156 49 return m_model ? m_model->getZoomConstraint() : 0;
Chris@156 50 }
Chris@0 51 virtual const Model *getModel() const { return m_model; }
Chris@44 52 virtual void paint(View *v, QPainter &paint, QRect rect) const;
Chris@0 53
Chris@44 54 virtual int getVerticalScaleWidth(View *v, QPainter &) const;
Chris@44 55 virtual void paintVerticalScale(View *v, QPainter &paint, QRect rect) const;
Chris@25 56
Chris@44 57 virtual QString getFeatureDescription(View *v, QPoint &) const;
Chris@25 58
Chris@44 59 virtual bool snapToFeatureFrame(View *v, int &frame,
Chris@28 60 size_t &resolution,
Chris@28 61 SnapType snap) const;
Chris@24 62
Chris@44 63 virtual bool isLayerScrollable(const View *v) const;
Chris@25 64
Chris@287 65 virtual ColourSignificance getLayerColourSignificance() const {
Chris@287 66 return ColourHasMeaningfulValue;
Chris@287 67 }
Chris@183 68
Chris@0 69 void setModel(const DenseThreeDimensionalModel *model);
Chris@0 70
Chris@115 71 virtual int getCompletion(View *) const { return m_model->getCompletion(); }
Chris@24 72
Chris@0 73 virtual PropertyList getProperties() const;
Chris@0 74 virtual PropertyType getPropertyType(const PropertyName &) const;
Chris@159 75 virtual QString getPropertyLabel(const PropertyName &) const;
Chris@346 76 virtual QString getPropertyIconName(const PropertyName &) const;
Chris@159 77 virtual QString getPropertyGroupName(const PropertyName &) const;
Chris@0 78 virtual int getPropertyRangeAndValue(const PropertyName &,
Chris@216 79 int *min, int *max, int *deflt) const;
Chris@0 80 virtual QString getPropertyValueLabel(const PropertyName &,
Chris@0 81 int value) const;
Chris@0 82 virtual void setProperty(const PropertyName &, int value);
Chris@197 83 virtual void setProperties(const QXmlAttributes &);
Chris@11 84
Chris@197 85 enum ColourScale { LinearScale, LogScale, PlusMinusOneScale };
Chris@159 86
Chris@159 87 void setColourScale(ColourScale);
Chris@159 88 ColourScale getColourScale() const { return m_colourScale; }
Chris@159 89
Chris@197 90 void setColourMap(int map);
Chris@197 91 int getColourMap() const;
Chris@197 92
Chris@197 93 void setNormalizeColumns(bool n);
Chris@197 94 bool getNormalizeColumns() const;
Chris@197 95
Chris@197 96 void setNormalizeVisibleArea(bool n);
Chris@197 97 bool getNormalizeVisibleArea() const;
Chris@197 98
Chris@357 99 void setInvertVertical(bool i);
Chris@357 100 bool getInvertVertical() const;
Chris@357 101
Chris@465 102 void setOpaque(bool i);
Chris@465 103 bool getOpaque() const;
Chris@465 104
Chris@444 105 virtual bool getValueExtents(float &min, float &max,
Chris@444 106 bool &logarithmic, QString &unit) const;
Chris@444 107
Chris@444 108 virtual bool getDisplayExtents(float &min, float &max) const;
Chris@444 109 virtual bool setDisplayExtents(float min, float max);
Chris@444 110
Chris@444 111 virtual int getVerticalZoomSteps(int &defaultStep) const;
Chris@444 112 virtual int getCurrentVerticalZoomStep() const;
Chris@444 113 virtual void setVerticalZoomStep(int);
Chris@444 114 virtual RangeMapper *getNewVerticalZoomRangeMapper() const;
Chris@444 115
Chris@193 116 virtual const Model *getSliceableModel() const { return m_model; }
Chris@193 117
Chris@316 118 virtual void toXml(QTextStream &stream, QString indent = "",
Chris@316 119 QString extraAttributes = "") const;
Chris@197 120
Chris@0 121 protected slots:
Chris@0 122 void cacheInvalid();
Chris@0 123 void cacheInvalid(size_t startFrame, size_t endFrame);
Chris@461 124 void modelChanged();
Chris@461 125 void modelChanged(size_t, size_t);
Chris@0 126
Chris@0 127 protected:
Chris@0 128 const DenseThreeDimensionalModel *m_model; // I do not own this
Chris@0 129
Chris@0 130 mutable QImage *m_cache;
Chris@469 131 mutable QImage *m_peaksCache;
Chris@461 132 mutable size_t m_cacheValidStart;
Chris@461 133 mutable size_t m_cacheValidEnd;
Chris@98 134
Chris@159 135 ColourScale m_colourScale;
Chris@461 136 bool m_colourScaleSet;
Chris@197 137 int m_colourMap;
Chris@197 138 bool m_normalizeColumns;
Chris@197 139 bool m_normalizeVisibleArea;
Chris@357 140 bool m_invertVertical;
Chris@465 141 bool m_opaque;
Chris@469 142 size_t m_peakResolution;
Chris@197 143
Chris@444 144 int m_miny;
Chris@444 145 int m_maxy;
Chris@444 146
Chris@467 147 DenseThreeDimensionalModel::Column getColumn(size_t col) const;
Chris@159 148
Chris@469 149 int getColourScaleWidth(QPainter &) const;
Chris@469 150 void fillCache(size_t firstBin, size_t lastBin) const;
Chris@469 151 void paintDense(View *v, QPainter &paint, QRect rect) const;
Chris@472 152 void paintSmooth(View *v, QPainter &paint, QRect rect) const;
Chris@0 153 };
Chris@0 154
Chris@0 155 #endif