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)