spek

Acoustic spectrum analyser
git clone http://git.hanabi.in/repos/spek.git
Log | Files | Refs | README

commit 8544a03c3c996ecb1b30a1b10a65488ad687256b
parent 0745673f907a15c208eb83d2b9e93593ef9ea1d4
Author: Alexander Kojevnikov <alexander@kojevnikov.com>
Date:   Fri, 17 Aug 2012 22:15:02 -0700

Save spectrogram as an image

Diffstat:
Msrc/spek-spectrogram.cc | 5+++++
Dsrc/spek-spectrogram.vala | 35-----------------------------------
Msrc/spek-window.cc | 41+++++++++++++++++++++++++++++++++++++----
Msrc/spek-window.hh | 2++
Msrc/spek-window.vala | 26--------------------------
Msrc/spek.cc | 2++
6 files changed, 46 insertions(+), 65 deletions(-)

diff --git a/src/spek-spectrogram.cc b/src/spek-spectrogram.cc @@ -76,6 +76,11 @@ void SpekSpectrogram::open(const wxString& path) void SpekSpectrogram::save(const wxString& path) { + wxSize size = GetClientSize(); + wxBitmap bitmap(size.GetWidth(), size.GetHeight()); + wxMemoryDC dc(bitmap); + render(dc); + bitmap.SaveFile(path, wxBITMAP_TYPE_PNG); } void SpekSpectrogram::on_idle(wxIdleEvent& evt) diff --git a/src/spek-spectrogram.vala b/src/spek-spectrogram.vala @@ -1,35 +0,0 @@ -/* spek-spectrogram.vala - * - * Copyright (C) 2010-2011 Alexander Kojevnikov <alexander@kojevnikov.com> - * - * Spek is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * Spek is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with Spek. If not, see <http://www.gnu.org/licenses/>. - */ - -using Cairo; -using Gdk; -using Gtk; -using Pango; - -namespace Spek { - class Spectrogram : DrawingArea { - - public void save (string file_name) { - Allocation allocation; - get_allocation (out allocation); - var surface = new ImageSurface (Format.RGB24, allocation.width, allocation.height); - draw (new Cairo.Context (surface)); - surface.write_to_png (file_name); - } - } -} diff --git a/src/spek-window.cc b/src/spek-window.cc @@ -31,7 +31,8 @@ BEGIN_EVENT_TABLE(SpekWindow, wxFrame) EVT_MENU(wxID_ABOUT, SpekWindow::on_about) END_EVENT_TABLE() -SpekWindow::SpekWindow(const wxString& path) : wxFrame(NULL, -1, wxEmptyString) +SpekWindow::SpekWindow(const wxString& path) : + path(path), wxFrame(NULL, -1, wxEmptyString) { SetTitle(_("Spek - Acoustic Spectrum Analyser")); // TODO: test on all platforms @@ -79,6 +80,7 @@ SpekWindow::SpekWindow(const wxString& path) : wxFrame(NULL, -1, wxEmptyString) toolbar->Realize(); this->spectrogram = new SpekSpectrogram(this); + this->cur_dir = wxGetHomeDir(); if (!path.IsEmpty()) { open(path); @@ -119,7 +121,6 @@ static const char *audio_extensions[] = { void SpekWindow::on_open(wxCommandEvent& WXUNUSED(event)) { - static wxString cur_dir = wxGetHomeDir(); static wxString filters = wxEmptyString; static int filter_index = 1; @@ -142,7 +143,7 @@ void SpekWindow::on_open(wxCommandEvent& WXUNUSED(event)) wxFileDialog *dlg = new wxFileDialog( this, _("Open File"), - cur_dir, + this->cur_dir, wxEmptyString, filters, wxFD_OPEN @@ -150,7 +151,7 @@ void SpekWindow::on_open(wxCommandEvent& WXUNUSED(event)) dlg->SetFilterIndex(filter_index); if (dlg->ShowModal() == wxID_OK) { - cur_dir = dlg->GetDirectory(); + this->cur_dir = dlg->GetDirectory(); filter_index = dlg->GetFilterIndex(); open(dlg->GetPath()); } @@ -160,6 +161,37 @@ void SpekWindow::on_open(wxCommandEvent& WXUNUSED(event)) void SpekWindow::on_save(wxCommandEvent& WXUNUSED(event)) { + static wxString filters = wxEmptyString; + + if (filters.IsEmpty()) { + filters = _("PNG images"); + filters += wxT("|*.png"); + } + + wxFileDialog *dlg = new wxFileDialog( + this, + _("Save Spectrogram"), + this->cur_dir, + wxEmptyString, + filters, + wxFD_SAVE + ); + + // Suggested name is <file_name>.png + wxString name = _("Untitled"); + if (!this->path.IsEmpty()) { + wxFileName file_name(this->path); + name = file_name.GetFullName(); + } + name += wxT(".png"); + dlg->SetFilename(name); + + if (dlg->ShowModal() == wxID_OK) { + this->cur_dir = dlg->GetDirectory(); + this->spectrogram->save(dlg->GetPath()); + } + + dlg->Destroy(); } void SpekWindow::on_exit(wxCommandEvent& WXUNUSED(event)) @@ -179,6 +211,7 @@ void SpekWindow::open(const wxString& path) { wxFileName file_name(path); if (file_name.FileExists()) { + this->path = path; wxString full_name = file_name.GetFullName(); // TRANSLATORS: window title, %s is replaced with the file name wxString title = wxString::Format(_("Spek - %s"), full_name.c_str()); diff --git a/src/spek-window.hh b/src/spek-window.hh @@ -37,6 +37,8 @@ private: void open(const wxString& path); SpekSpectrogram *spectrogram; + wxString path; + wxString cur_dir; DECLARE_EVENT_TABLE() }; diff --git a/src/spek-window.vala b/src/spek-window.vala @@ -50,10 +50,6 @@ namespace Spek { info_bar.message_type = MessageType.INFO; info_bar.response.connect(() => info_bar.hide()); - filter_png = new FileFilter (); - filter_png.set_name (_("PNG images")); - filter_png.add_pattern ("*.png"); - var vbox = new VBox (false, 0); vbox.pack_start (info_bar, false, true, 0); add (vbox); @@ -85,28 +81,6 @@ namespace Spek { drag_finish (cx, false, false, time); } - private void on_file_save () { - var chooser = new FileChooserDialog ( - _("Save Spectrogram"), this, FileChooserAction.SAVE, - Stock.CANCEL, ResponseType.CANCEL, - Stock.SAVE, ResponseType.ACCEPT, null); - chooser.set_default_response (ResponseType.ACCEPT); - chooser.set_current_folder (cur_dir); - - // Suggested name is <file_name>.png - var file_name = Path.get_basename (spectrogram.file_name ?? _("Untitled")); - file_name += ".png"; - chooser.set_current_name (file_name); - chooser.add_filter (filter_png); - chooser.set_filter (filter_png); - if (chooser.run () == ResponseType.ACCEPT) { - file_name = chooser.get_filename (); - cur_dir = Path.get_dirname (file_name); - spectrogram.save (file_name); - } - chooser.destroy (); - } - private void on_edit_preferences () { var dlg = new PreferencesDialog (); dlg.transient_for = this; diff --git a/src/spek.cc b/src/spek.cc @@ -40,6 +40,8 @@ IMPLEMENT_APP(Spek) bool Spek::OnInit() { + wxInitAllImageHandlers(); + SpekPlatform::init(); SpekPreferences::get().init(); spek_audio_init();