46 #define REFRESH_DELAY 100 53 #define COLOR_CUTOFF_RATIO (0.1/100.0) 62 "##########..........",
63 "##########..........",
64 "##########..........",
65 "##########..........",
66 "##########..........",
67 "##########..........",
68 "##########..........",
69 "##########..........",
70 "##########..........",
71 "##########..........",
72 "..........##########",
73 "..........##########",
74 "..........##########",
75 "..........##########",
76 "..........##########",
77 "..........##########",
78 "..........##########",
79 "..........##########",
80 "..........##########",
81 "..........##########" 87 m_status_time(Q_NULLPTR),
88 m_status_freq(Q_NULLPTR),
89 m_status_ampl(Q_NULLPTR),
93 m_overview(Q_NULLPTR),
101 for (
unsigned int i = 0; i < 256; ++i) {
m_histogram[i] = 0; }
103 QWidget *mainwidget =
new(std::nothrow) QWidget(
this);
104 Q_ASSERT(mainwidget);
105 if (!mainwidget)
return;
106 setCentralWidget(mainwidget);
108 QGridLayout *top_layout =
new(std::nothrow) QGridLayout(mainwidget);
109 Q_ASSERT(top_layout);
110 if (!top_layout)
return;
112 QMenuBar *bar = menuBar();
120 QMenu *file = bar->addMenu(i18n(
"&Sonagram"));
128 QIcon::fromTheme(
_(
"document-export")),
129 i18n(
"&Export to Bitmap..."),
133 QIcon::fromTheme(
_(
"dialog-close")),
141 QStatusBar *status = statusBar();
143 if (!status) return ;
146 QLabel(i18n(
"Time: ------ ms"), status);
148 QLabel(i18n(
"Frequency: ------ Hz"), status);
150 QLabel(i18n(
"Amplitude: --- %"), status);
158 top_layout->addWidget(
m_view, 0, 1);
161 m_view->setAutoFillBackground(
true);
162 m_view->setPalette(palette);
169 top_layout->addWidget(
m_xscale, 1, 1);
177 top_layout->addWidget(
m_yscale, 0, 0);
192 top_layout->setRowStretch(0, 100);
193 top_layout->setRowStretch(1, 0);
194 top_layout->setRowStretch(2, 0);
195 top_layout->setColumnStretch(0, 0);
196 top_layout->setColumnStretch(1, 100);
197 top_layout->activate();
204 int w = sizeHint().width();
205 int h = sizeHint().height();
206 if ((w * 3 / 5) < h) w = (h * 5) / 3;
207 if ((h * 5 / 3) < w) h = (w * 3) / 5;
225 _(
"kfiledialog:///kwave_sonagram"),
227 this, QUrl(),
_(
"*.bmp")
230 dlg->setWindowTitle(i18n(
"Save Sonagram"));
231 if (dlg->exec() == QDialog::Accepted) {
232 QString filename = dlg->
selectedUrl().toLocalFile();
233 if (!filename.isEmpty())
m_image.save(filename,
"BMP");
287 for (
unsigned int i = 0; i < 256; i++)
290 for (
int x = 0; x <
m_image.width(); x++) {
291 for (
int y = 0; y <
m_image.height(); y++) {
292 quint8 p =
static_cast<quint8
>(
m_image.pixelIndex(x, y));
309 const QByteArray &slice)
315 unsigned int image_width =
m_image.width();
316 unsigned int image_height =
m_image.height();
319 if (slice_nr >= image_width)
return;
322 unsigned int size = slice.size();
323 for (y = 0; y < size; y++) {
327 p =
static_cast<quint8
>(
m_image.pixelIndex(slice_nr, y));
331 p = slice[(size - 1) - y];
332 m_image.setPixel(slice_nr, y, p);
337 while (y < image_height) {
338 m_image.setPixel(slice_nr, y++, 0xFE);
354 unsigned long int sum = 0;
355 for (
unsigned int i = 1; i <= 254; i++)
363 while ((last >= 0) && (
m_histogram[last] <= cutoff))
367 for (
int i = 0; i < 255; i++) {
374 v = ((last - i) * 254) / last;
379 c.setHsv( (v * 255) / 255, 255, 255, 255);
382 c.setRgb(v, v, v, 255);
390 m_image.setColor(0xFF, QColor(0, 0, 0, 0).rgba());
467 double *ms,
double *f)
471 if (!qFuzzyIsNull(
m_rate)) {
472 *ms =
static_cast<double>(p.x()) *
482 double y = py - p.y();
484 *f = y / py * (
m_rate / 2.0);
520 setWindowTitle((name.length()) ?
521 i18n(
"Sonagram of %1", name) :
529 QStatusBar *status = statusBar();
532 Q_ASSERT(!qFuzzyIsNull(
m_rate));
536 if (qFuzzyIsNull(
m_rate))
return;
552 if (
m_image.valid(pos.x(), pos.y())) {
553 a =
m_image.pixelIndex(pos.x(), pos.y()) * (100.0 / 254.0);
Kwave::ScaleWidget * m_yscale
#define COLOR_CUTOFF_RATIO
void updateScaleWidgets()
Kwave::ImageView * m_view
QString Q_DECL_EXPORT ms2string(double ms, int precision=6)
#define SONAGRAM_OVERVIEW_HEIGHT
void insertSlice(const unsigned int slice_nr, const QByteArray &slice)
bool connect(Kwave::StreamObject &source, const char *output, Kwave::StreamObject &sink, const char *input)
void setName(const QString &name)
void setPoints(unsigned int points)
void setRate(double rate)
Kwave::ImageView * m_overview
unsigned int m_histogram[256]
void cursorPosChanged(const QPoint pos)
static const char * background[]
void setOverView(const QImage &image)
Kwave::ScaleWidget * m_xscale
virtual ~SonagramWindow()
SonagramWindow(QWidget *parent, const QString &name)
void setImage(QImage image)
void setImage(QImage image)
void translatePixels2TF(const QPoint p, double *ms, double *f)
void setColorMode(int mode)