Ardour  8.12
fastmeter.h
Go to the documentation of this file.
1 /*
2  * Copyright (C) 2003 Paul Davis <paul@linuxaudiosystems.com>
3  * Copyright (C) 2017 Robin Gareus <robin@gareus.org>
4  *
5  * This program is free software; you can redistribute it and/or modify
6  * it under the terms of the GNU General Public License as published by
7  * the Free Software Foundation; either version 2 of the License, or
8  * (at your option) any later version.
9  *
10  * This program is distributed in the hope that it will be useful,
11  * but WITHOUT ANY WARRANTY; without even the implied warranty of
12  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13  * GNU General Public License for more details.
14  *
15  * You should have received a copy of the GNU General Public License along
16  * with this program; if not, write to the Free Software Foundation, Inc.,
17  * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
18  */
19 
20 #ifndef _WIDGETS_FAST_METER_H_
21 #define _WIDGETS_FAST_METER_H_
22 
23 #include <map>
24 #include <boost/tuple/tuple.hpp>
25 #include <boost/tuple/tuple_comparison.hpp>
26 #include <cairomm/pattern.h>
27 #include "gtkmm2ext/cairo_widget.h"
28 
29 #include "widgets/visibility.h"
30 
31 namespace ArdourWidgets {
32 
34 public:
35  enum Orientation {
37  Vertical
38  };
39 
40  FastMeter (long hold_cnt, unsigned long width, Orientation, int len=0,
41  int clr0=0x008800ff, int clr1=0x008800ff,
42  int clr2=0x00ff00ff, int clr3=0x00ff00ff,
43  int clr4=0xffaa00ff, int clr5=0xffaa00ff,
44  int clr6=0xffff00ff, int clr7=0xffff00ff,
45  int clr8=0xff0000ff, int clr9=0xff0000ff,
46  int bgc0=0x333333ff, int bgc1=0x444444ff,
47  int bgh0=0x991122ff, int bgh1=0x551111ff,
48  float stp0 = 55.0, // log_meter(-18);
49  float stp1 = 77.5, // log_meter(-9);
50  float stp2 = 92.5, // log_meter(-3); // 95.0, // log_meter(-2);
51  float stp3 = 100.0,
52  int styleflags = 3
53  );
54  virtual ~FastMeter ();
55  static void flush_pattern_cache();
56 
57  void set (float level, float peak = -1);
58  void clear ();
59 
60  float get_level() { return current_level; }
61  float get_user_level() { return current_user_level; }
62  float get_peak() { return current_peak; }
63 
64  long hold_count() { return hold_cnt; }
65  void set_hold_count (long);
66  void set_highlight (bool);
67  bool get_highlight () { return highlight; }
68  void render (Cairo::RefPtr<Cairo::Context> const&, cairo_rectangle_t*);
69 
70 protected:
73 
74 private:
75  Cairo::RefPtr<Cairo::Pattern> fgpattern;
76  Cairo::RefPtr<Cairo::Pattern> bgpattern;
77  gint pixheight;
78  gint pixwidth;
79 
80  float _stp[4];
81  int _clr[10];
82  int _bgc[2];
83  int _bgh[2];
85 
91  unsigned long hold_cnt;
92  unsigned long hold_state;
95  float current_peak;
97  bool highlight;
98 
99  uint32_t outline_color;
100 
101  void vertical_expose (cairo_t*, cairo_rectangle_t*);
104  void queue_vertical_redraw (const Glib::RefPtr<Gdk::Window>&, float);
105 
106  void horizontal_expose (cairo_t*, cairo_rectangle_t*);
109  void queue_horizontal_redraw (const Glib::RefPtr<Gdk::Window>&, float);
110 
111  static bool no_rgba_overlay;
112 
113  static Cairo::RefPtr<Cairo::Pattern> generate_meter_pattern (
114  int, int, int *, float *, int, bool);
115  static Cairo::RefPtr<Cairo::Pattern> request_vertical_meter (
116  int, int, int *, float *, int);
117  static Cairo::RefPtr<Cairo::Pattern> request_horizontal_meter (
118  int, int, int *, float *, int);
119 
120  static Cairo::RefPtr<Cairo::Pattern> generate_meter_background (
121  int, int, int *, bool, bool);
122  static Cairo::RefPtr<Cairo::Pattern> request_vertical_background (
123  int, int, int *, bool);
124  static Cairo::RefPtr<Cairo::Pattern> request_horizontal_background (
125  int, int, int *, bool);
126 
129  int w, int h,
130  float stp0, float stp1, float stp2, float stp3,
131  int c0, int c1, int c2, int c3,
132  int c4, int c5, int c6, int c7,
133  int c8, int c9, int st
134  )
135  : dim(w, h)
136  , stp(stp0, stp1, stp2, stp3)
137  , cols(c0, c1, c2, c3, c4, c5, c6, c7, c8, c9)
138  , style(st)
139  {}
140  inline bool operator<(const Pattern10MapKey& rhs) const {
141  return (dim < rhs.dim)
142  || (dim == rhs.dim && stp < rhs.stp)
143  || (dim == rhs.dim && stp == rhs.stp && cols < rhs.cols)
144  || (dim == rhs.dim && stp == rhs.stp && cols == rhs.cols && style < rhs.style);
145  }
146  boost::tuple<int, int> dim;
147  boost::tuple<float, float, float, float> stp;
148  boost::tuple<int, int, int, int, int, int, int, int, int, int> cols;
149  int style;
150  };
151  typedef std::map<Pattern10MapKey, Cairo::RefPtr<Cairo::Pattern> > Pattern10Map;
152 
154  PatternBgMapKey (int w, int h, int c0, int c1, bool shade)
155  : dim(w, h)
156  , cols(c0, c1)
157  , sh(shade)
158  {}
159  inline bool operator<(const PatternBgMapKey& rhs) const {
160  return (dim < rhs.dim) || (dim == rhs.dim && cols < rhs.cols) || (dim == rhs.dim && cols == rhs.cols && (sh && !rhs.sh));
161  }
162  boost::tuple<int, int> dim;
163  boost::tuple<int, int> cols;
164  bool sh;
165  };
166  typedef std::map<PatternBgMapKey, Cairo::RefPtr<Cairo::Pattern> > PatternBgMap;
167 
172  static int min_pattern_metric_size; // min dimension for axis that displays the meter level
173  static int max_pattern_metric_size; // max dimension for axis that displays the meter level
174 };
175 
176 
177 } /* namespace */
178 
179 #endif
void vertical_size_allocate(Gtk::Allocation &)
static Pattern10Map hm_pattern_cache
Definition: fastmeter.h:170
static Cairo::RefPtr< Cairo::Pattern > request_horizontal_meter(int, int, int *, float *, int)
std::map< Pattern10MapKey, Cairo::RefPtr< Cairo::Pattern > > Pattern10Map
Definition: fastmeter.h:151
Cairo::RefPtr< Cairo::Pattern > bgpattern
Definition: fastmeter.h:76
GdkRectangle pixrect
Definition: fastmeter.h:87
void render(Cairo::RefPtr< Cairo::Context > const &, cairo_rectangle_t *)
FastMeter(long hold_cnt, unsigned long width, Orientation, int len=0, int clr0=0x008800ff, int clr1=0x008800ff, int clr2=0x00ff00ff, int clr3=0x00ff00ff, int clr4=0xffaa00ff, int clr5=0xffaa00ff, int clr6=0xffff00ff, int clr7=0xffff00ff, int clr8=0xff0000ff, int clr9=0xff0000ff, int bgc0=0x333333ff, int bgc1=0x444444ff, int bgh0=0x991122ff, int bgh1=0x551111ff, float stp0=55.0, float stp1=77.5, float stp2=92.5, float stp3=100.0, int styleflags=3)
void on_size_request(GtkRequisition *)
This is a default handler for the signal signal_size_request().
static Cairo::RefPtr< Cairo::Pattern > request_vertical_background(int, int, int *, bool)
static Cairo::RefPtr< Cairo::Pattern > generate_meter_background(int, int, int *, bool, bool)
void set(float level, float peak=-1)
Cairo::RefPtr< Cairo::Pattern > fgpattern
Definition: fastmeter.h:75
static void flush_pattern_cache()
void horizontal_size_request(GtkRequisition *)
static PatternBgMap vb_pattern_cache
Definition: fastmeter.h:169
static Pattern10Map vm_pattern_cache
Definition: fastmeter.h:168
static Cairo::RefPtr< Cairo::Pattern > request_vertical_meter(int, int, int *, float *, int)
void vertical_expose(cairo_t *, cairo_rectangle_t *)
static Cairo::RefPtr< Cairo::Pattern > generate_meter_pattern(int, int, int *, float *, int, bool)
static bool no_rgba_overlay
Definition: fastmeter.h:111
static Cairo::RefPtr< Cairo::Pattern > request_horizontal_background(int, int, int *, bool)
GdkRectangle last_peak_rect
Definition: fastmeter.h:88
unsigned long hold_state
Definition: fastmeter.h:92
void horizontal_expose(cairo_t *, cairo_rectangle_t *)
static int min_pattern_metric_size
Definition: fastmeter.h:172
void queue_vertical_redraw(const Glib::RefPtr< Gdk::Window > &, float)
void vertical_size_request(GtkRequisition *)
void horizontal_size_allocate(Gtk::Allocation &)
static int max_pattern_metric_size
Definition: fastmeter.h:173
void on_size_allocate(Gtk::Allocation &)
This is a default handler for the signal signal_size_allocate().
unsigned long hold_cnt
Definition: fastmeter.h:91
static PatternBgMap hb_pattern_cache
Definition: fastmeter.h:171
std::map< PatternBgMapKey, Cairo::RefPtr< Cairo::Pattern > > PatternBgMap
Definition: fastmeter.h:166
Orientation orientation
Definition: fastmeter.h:86
void queue_horizontal_redraw(const Glib::RefPtr< Gdk::Window > &, float)
@ Vertical
Definition: editing.h:250
boost::tuple< int, int, int, int, int, int, int, int, int, int > cols
Definition: fastmeter.h:148
bool operator<(const Pattern10MapKey &rhs) const
Definition: fastmeter.h:140
boost::tuple< float, float, float, float > stp
Definition: fastmeter.h:147
Pattern10MapKey(int w, int h, float stp0, float stp1, float stp2, float stp3, int c0, int c1, int c2, int c3, int c4, int c5, int c6, int c7, int c8, int c9, int st)
Definition: fastmeter.h:128
bool operator<(const PatternBgMapKey &rhs) const
Definition: fastmeter.h:159
PatternBgMapKey(int w, int h, int c0, int c1, bool shade)
Definition: fastmeter.h:154
link region and track false waveform clip level
#define LIBWIDGETS_API
gint width
Definition: xcursors.h:1