X-Git-Url: http://git.cinelerra-gg.org/git/?a=blobdiff_plain;f=cinelerra-5.1%2Fplugins%2Fgraphic%2Fgraphic.h;fp=cinelerra-5.1%2Fplugins%2Fgraphic%2Fgraphic.h;h=a539701a241bccc2f8a75bf514c262dac06e8e1e;hb=30bdb85eb33a8ee7ba675038a86c6be59c43d7bd;hp=0000000000000000000000000000000000000000;hpb=52fcc46226f9df46f9ce9d0566dc568455a7db0b;p=goodguy%2Fhistory.git diff --git a/cinelerra-5.1/plugins/graphic/graphic.h b/cinelerra-5.1/plugins/graphic/graphic.h new file mode 100644 index 00000000..a539701a --- /dev/null +++ b/cinelerra-5.1/plugins/graphic/graphic.h @@ -0,0 +1,280 @@ + +/* + * CINELERRA + * Copyright (C) 1997-2011 Adam Williams + * + * 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; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + */ + +#ifndef GRAPHIC_H +#define GRAPHIC_H + +#include "guicast.h" +#include "fourier.h" +#include "pluginaclient.h" + + +#define MAX_WINDOW 262144 +//#define WINDOW_SIZE 16384 +#define MAXMAGNITUDE 15 +#define MAXFREQ 20000 +#define MIN_DB -15 +#define MAX_DB 15 + + +class GraphicGUI; +class GraphicEQ; + + + +class GraphicPoint +{ +public: + GraphicPoint(); +// Frequency in Hz + int freq; +// Amplitude in DB + double value; +}; + + + +class GraphicConfig +{ +public: + GraphicConfig(); + ~GraphicConfig(); + + int equivalent(GraphicConfig &that); + void copy_from(GraphicConfig &that); + void interpolate(GraphicConfig &prev, + GraphicConfig &next, + int64_t prev_frame, + int64_t next_frame, + int64_t current_frame); + void insert_point(GraphicPoint *point); + void delete_point(int number); + + ArrayList points; +// double wetness; + int window_size; +}; + + + +class GraphicCanvas : public BC_SubWindow +{ +public: + GraphicCanvas(GraphicEQ *plugin, GraphicGUI *gui, int x, int y, int w, int h); + virtual ~GraphicCanvas(); + int button_press_event(); + int cursor_motion_event(); + int button_release_event(); + void process(int buttonpress, int motion, int draw); + int freq_to_y(int freq, + ArrayList *points, + double *envelope); + void insert_point(GraphicPoint *point); + GraphicEQ *plugin; + GraphicGUI *gui; + +// Temporary envelope when editing + void new_temps(); + void save_temps(); + + ArrayList temp_points; + double temp_envelope[MAX_WINDOW / 2]; + + + + + int state; + enum + { + NONE, + DRAG_POINT + }; + int x_diff, y_diff; +}; + +class FreqTextBox : public BC_TextBox +{ +public: + FreqTextBox(GraphicEQ *plugin, + GraphicGUI *gui, + int x, + int y, + int w); + int handle_event(); + void update(int freq); + GraphicEQ *plugin; + GraphicGUI *gui; +}; + +class ValueTextBox : public BC_TextBox +{ +public: + ValueTextBox(GraphicEQ *plugin, + GraphicGUI *gui, + int x, + int y, + int w); + int handle_event(); + void update(float value); + GraphicEQ *plugin; + GraphicGUI *gui; +}; + +class GraphicReset : public BC_GenericButton +{ +public: + GraphicReset(GraphicEQ *plugin, + GraphicGUI *gui, + int x, + int y); + int handle_event(); + GraphicEQ *plugin; + GraphicGUI *gui; +}; + + +class GraphicSize : public BC_PopupMenu +{ +public: + GraphicSize(GraphicGUI *window, GraphicEQ *plugin, int x, int y); + + int handle_event(); + void create_objects(); // add initial items + void update(int size); + + GraphicGUI *window; + GraphicEQ *plugin; +}; + + +class GraphicWetness : public BC_FPot +{ +public: + GraphicWetness(GraphicGUI *window, GraphicEQ *plugin, int x, int y); + int handle_event(); + GraphicGUI *window; + GraphicEQ *plugin; +}; + + +class GraphicGUI : public PluginClientWindow +{ +public: + GraphicGUI(GraphicEQ *plugin); + ~GraphicGUI(); + + void create_objects(); + int keypress_event(); + void update_canvas(); + int resize_event(int w, int h); + void draw_ticks(); + void update_textboxes(); + + FreqTextBox *freq_text; + ValueTextBox *value_text; + BC_Title *freq_title; + BC_Title *level_title; + BC_Title *size_title; + + GraphicCanvas *canvas; + GraphicReset *reset; + GraphicSize *size; +// GraphicWetness *wetness; + GraphicEQ *plugin; +}; + + + + + +class GraphicGUIFrame : public PluginClientFrame +{ +public: + GraphicGUIFrame(int window_size, int sample_rate); + virtual ~GraphicGUIFrame(); + double *data; +// Maximum of window in frequency domain + double freq_max; +// Maximum of window in time domain + double time_max; + int window_size; +}; + + + +class GraphicFFT : public CrossfadeFFT +{ +public: + GraphicFFT(GraphicEQ *plugin); + ~GraphicFFT(); + + int post_process(); + int signal_process(); + int read_samples(int64_t output_sample, + int samples, + Samples *buffer); +// Current GUI frame being filled + GraphicGUIFrame *frame; + + GraphicEQ *plugin; +}; + + + +class GraphicEQ : public PluginAClient +{ +public: + GraphicEQ(PluginServer *server); + ~GraphicEQ(); + + int is_realtime(); + void read_data(KeyFrame *keyframe); + void save_data(KeyFrame *keyframe); + int process_buffer(int64_t size, + Samples *buffer, + int64_t start_position, + int sample_rate); + void update_gui(); + double freq_to_magnitude(double frequency, + ArrayList *points, + double *envelope); + void calculate_envelope(ArrayList *points, + double *envelope); + int active_point_exists(); + void reconfigure(); + + + PLUGIN_CLASS_MEMBERS(GraphicConfig) + + + + double envelope[MAX_WINDOW / 2]; + int active_point; +// For refreshing the canvas + GraphicGUIFrame *last_frame; + GraphicFFT *fft; + int need_reconfigure; + int w, h; +}; + + + +#endif // GRAPHIC_H