commit a7f590aa40c0bbde2a6bacd3707b8fe47f104d02 Author: Jonathan Moore Liles Date: Wed Feb 13 23:47:12 2008 -0600 Initial checkin. diff --git a/Makefile b/Makefile new file mode 100644 index 0000000..0bfd029 --- /dev/null +++ b/Makefile @@ -0,0 +1,13 @@ + +CXXFLAGS=-ggdb + +LIBS=`fltk-config --ldflags` +# CXXFLAGS=`fltk-config -cxxflags` + +OBJS=Waveform.o main.o + +.C.o: + $(CXX) $(CXXFLAGS) -c $< -o $@ + +test: Waveform.o main.o + $(CXX) $(CXXFLAGS) $(LIBS) $(OBJS) -o $@ diff --git a/Waveform.C b/Waveform.C new file mode 100644 index 0000000..cd3322d --- /dev/null +++ b/Waveform.C @@ -0,0 +1,179 @@ + +/*******************************************************************************/ +/* Copyright (C) 2008 Jonathan Moore Liles */ +/* */ +/* This program 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 2 of the License, or (at your */ +/* option) any later version. */ +/* */ +/* This program 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 This program; see the file COPYING. If not,write to the Free Software */ +/* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ +/*******************************************************************************/ + +#include + +#include +#include + +#include "Waveform.H" + + +#include + +extern Fl_Color velocity_colors[]; + + +Waveform::Waveform ( int X, int Y, int W, int H, const char *L=0 ) : Fl_Widget( X, Y, W, H, L ) +{ + + +} + +#if 0 +void +Waveform::buble_draw ( void ) +{ + int inc = 10; + for ( tick_t x = 0; x < w() && x < _end; ++x ) + { + float v1 = _peaks[ _start + (x * inc) ] / (float)127; + int lh1 = (float)(h() / 2) * fabs( v1 ); + int ly1 = (h() / 2) - (lh1 / 2); + + + fl_color( selection_color() ); + + fl_color( velocity_colors[ 127 - (int)(127 * fabs( v1 )) ] ); + + fl_pie( x, y() + ly1, inc, lh1, 0, 360 ); + + fl_color( fl_darker( selection_color() ) ); + fl_arc( x, y() + ly1, inc, lh1, 0, 360 ); + + } +} +#endif + +int +Waveform::handle ( int m ) +{ + + if ( m == FL_PUSH ) + { + switch ( Fl::event_button() ) + { + case 1: + _start += 100; + _end += 100; + redraw(); + break; + case 3: + _start -= 100; + _end -= 100; + redraw(); + break; + default: + return 0; + } + + return 1; + } + + return 0; +} + +void +Waveform::draw ( void ) +{ + fl_push_clip( x(), y(), w(), h() ); + draw_box( FL_PLASTIC_UP_BOX, x(), y(), w(), h(), color() ); + + fl_push_matrix(); + + fl_color( selection_color() ); + + int j; + + float scale = 1; + + j = 0; + for ( tick_t x = 0; x < w() && x < _end; ++x ) + { + float lo = _peaks[ _start + j++ ] * scale; + float hi = _peaks[ _start + j++ ] * scale; + + int mid = y() + (h() / 2); + + int rx = this->x() + x; + + fl_line( rx, mid + (h() * lo), rx, mid + (h() * hi) ); + } + + fl_color( fl_darker( fl_darker( selection_color() ) ) ); + + fl_begin_line(); + + j = 0; + for ( tick_t x = 0; x < w() && x < _end; ++x ) + { + float v = _peaks[ _start + j ] * scale; + j += 2; + fl_vertex( this->x() + x, y() + (h() / 2) + ((float)h() * v )); + } + + fl_end_line(); + + fl_begin_line(); + + j = 1; + for ( tick_t x = 0; x < w() && x < _end; ++x ) + { + float v = _peaks[ _start + j ] * scale; + j += 2; + fl_vertex( this->x() + x, y() + (h() / 2) + ((float)h() * v )); + } + + fl_end_line(); + + + fl_pop_matrix(); + + fl_pop_clip(); +} + +#if 0 +void +Waveform::draw ( void ) +{ + fl_push_clip( x(), y(), w(), h() ); + draw_box( FL_PLASTIC_UP_BOX, x(), y(), w(), h(), color() ); + + fl_push_matrix(); + + int inc = 1; + int j = 0; + for ( tick_t x = 0; x < w() && x < _end; ++x ) + { + float lo = _peaks[ _start + j++ ]; + float hi = _peaks[ _start + j++ ]; + + int mid = y() + (h() / 2); + + int rx = this->x() + x; + + fl_color( selection_color() ); + + fl_line( rx, mid + (h() * lo), rx, mid + (h() * hi) ); + } + + fl_pop_matrix(); + +} +#endif diff --git a/Waveform.H b/Waveform.H new file mode 100644 index 0000000..8bc9aba --- /dev/null +++ b/Waveform.H @@ -0,0 +1,46 @@ + +/*******************************************************************************/ +/* Copyright (C) 2008 Jonathan Moore Liles */ +/* */ +/* This program 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 2 of the License, or (at your */ +/* option) any later version. */ +/* */ +/* This program 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 This program; see the file COPYING. If not,write to the Free Software */ +/* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ +/*******************************************************************************/ + +#include +#include + +typedef unsigned long tick_t; + +class Waveform : public Fl_Widget +{ + float *_peaks; + + tick_t _start; + tick_t _end; + + float _scale; /* vertical scaling */ + float _zoom; /* horizontal zoom */ + +public: + + Waveform ( int X, int Y, int W, int H, const char *L ); + + int handle ( int m ); + void draw ( void ); + + void start ( tick_t s ) { _start = s; } + void end ( tick_t e ) { _end = e; } + void peaks ( float *p ) { _peaks = p; } + +}; diff --git a/main.C b/main.C new file mode 100644 index 0000000..8f99d50 --- /dev/null +++ b/main.C @@ -0,0 +1,85 @@ + +/*******************************************************************************/ +/* Copyright (C) 2008 Jonathan Moore Liles */ +/* */ +/* This program 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 2 of the License, or (at your */ +/* option) any later version. */ +/* */ +/* This program 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 This program; see the file COPYING. If not,write to the Free Software */ +/* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ +/*******************************************************************************/ + + +#include +#include +#include + +#include "Waveform.H" + +#include +#include +#include +#include +#include + +Fl_Color velocity_colors[128]; + +void +init_colors ( void ) +{ + for ( int i = 128; i--; ) + velocity_colors[i] = fl_rgb_color( 23, 255 - i * 2, 32 ); +} + +int +main ( int argc, char **argv ) +{ + + init_colors(); + + Fl_Window *main_window = new Fl_Window( 0, 0, 800, 600 ); + + Fl_Scroll *scroll = new Fl_Scroll( 0, 0, 800, 600 ); + + Waveform *wave = new Waveform( 0, 0, 5000, 100, "foo" ); + + FILE *fp; + + fp = fopen( "peaks", "r" ); + + struct stat st; + + fstat( fileno( fp ), &st ); + + size_t len = st.st_size; + + float *peaks = new float[ len / sizeof( float ) ]; + + fread( peaks, len, 1, fp ); + + wave->peaks( peaks ); + wave->start( 0 ); + wave->end( len ); + + wave->color( FL_CYAN ); + wave->selection_color( fl_darker( FL_GRAY ) ); + + wave->selection_color( FL_GREEN ); + + scroll->end(); + + main_window->end(); + main_window->show(); + + wave->redraw(); + + Fl::run(); +}