30 #include <gdkmm/rectangle.h>
34 #define UINT_TO_RGB(u,r,g,b) { (*(r)) = ((u)>>16)&0xff; (*(g)) = ((u)>>8)&0xff; (*(b)) = (u)&0xff; }
35 #define UINT_TO_RGBA(u,r,g,b,a) { UINT_TO_RGB(((u)>>8),r,g,b); (*(a)) = (u)&0xff; }
42 int FastMeter::min_pattern_metric_size = 16;
44 bool FastMeter::no_rgba_overlay =
false;
52 FastMeter::FastMeter (
long hold,
unsigned long dimen,
Orientation o,
int len,
53 int clr0,
int clr1,
int clr2,
int clr3,
54 int clr4,
int clr5,
int clr6,
int clr7,
58 float stp0,
float stp1,
59 float stp2,
float stp3,
64 , _styleflags(styleflags)
102 set_events (Gdk::BUTTON_PRESS_MASK|Gdk::BUTTON_RELEASE_MASK);
138 Pattern10Map::iterator i1;
139 PatternBgMap::iterator ib;
154 Cairo::RefPtr<Cairo::Pattern>
156 int width,
int height,
int *clr,
float *stp,
int styleflags,
bool horiz)
160 const double soft = 3.0 / (double) height;
161 const double offs = -1.0 / (double) height;
163 cairo_pattern_t* pat = cairo_pattern_create_linear (0.0, 0.0, 0.0, height);
171 cairo_pattern_add_color_stop_rgb (pat, 0.0,
172 r/255.0, g/255.0, b/255.0);
174 knee = offs + stp[3] / 115.0f;
177 cairo_pattern_add_color_stop_rgb (pat, 1.0 - knee,
178 r/255.0, g/255.0, b/255.0);
181 cairo_pattern_add_color_stop_rgb (pat, 1.0 - knee + soft,
182 r/255.0, g/255.0, b/255.0);
184 knee = offs + stp[2]/ 115.0f;
187 cairo_pattern_add_color_stop_rgb (pat, 1.0 - knee,
188 r/255.0, g/255.0, b/255.0);
191 cairo_pattern_add_color_stop_rgb (pat, 1.0 - knee + soft,
192 r/255.0, g/255.0, b/255.0);
194 knee = offs + stp[1] / 115.0f;
197 cairo_pattern_add_color_stop_rgb (pat, 1.0 - knee,
198 r/255.0, g/255.0, b/255.0);
201 cairo_pattern_add_color_stop_rgb (pat, 1.0 - knee + soft,
202 r/255.0, g/255.0, b/255.0);
204 knee = offs + stp[0] / 115.0f;
207 cairo_pattern_add_color_stop_rgb (pat, 1.0 - knee,
208 r/255.0, g/255.0, b/255.0);
211 cairo_pattern_add_color_stop_rgb (pat, 1.0 - knee + soft,
212 r/255.0, g/255.0, b/255.0);
215 cairo_pattern_add_color_stop_rgb (pat, 1.0,
216 r/255.0, g/255.0, b/255.0);
219 cairo_pattern_t* shade_pattern = cairo_pattern_create_linear (0.0, 0.0, width, 0.0);
220 cairo_pattern_add_color_stop_rgba (shade_pattern, 0, 0.0, 0.0, 0.0, 0.15);
221 cairo_pattern_add_color_stop_rgba (shade_pattern, 0.4, 1.0, 1.0, 1.0, 0.05);
222 cairo_pattern_add_color_stop_rgba (shade_pattern, 1, 0.0, 0.0, 0.0, 0.25);
224 cairo_surface_t* surface;
226 surface = cairo_image_surface_create (CAIRO_FORMAT_ARGB32, width, height);
227 tc = cairo_create (surface);
228 cairo_set_source (tc, pat);
229 cairo_rectangle (tc, 0, 0, width, height);
231 cairo_pattern_destroy (pat);
233 cairo_set_source (tc, shade_pattern);
234 cairo_rectangle (tc, 0, 0, width, height);
236 cairo_pattern_destroy (shade_pattern);
238 if (styleflags & 2) {
240 cairo_set_line_width(tc, 1.0);
241 cairo_set_source_rgba(tc, .0, .0, .0, 0.4);
243 for (
float y=0.5; y < height; y+= 2.0) {
244 cairo_move_to(tc, 0, y);
245 cairo_line_to(tc, width, y);
251 pat = cairo_pattern_create_for_surface (surface);
253 cairo_surface_destroy (surface);
257 cairo_surface_t* surface;
259 surface = cairo_image_surface_create (CAIRO_FORMAT_ARGB32, height, width);
260 tc = cairo_create (surface);
263 cairo_matrix_init_rotate (&m, -M_PI/2.0);
264 cairo_matrix_translate (&m, -height, 0);
265 cairo_pattern_set_matrix (pat, &m);
266 cairo_set_source (tc, pat);
267 cairo_rectangle (tc, 0, 0, height, width);
269 cairo_pattern_destroy (pat);
270 pat = cairo_pattern_create_for_surface (surface);
272 cairo_surface_destroy (surface);
274 Cairo::RefPtr<Cairo::Pattern> p (
new Cairo::Pattern (pat,
false));
280 Cairo::RefPtr<Cairo::Pattern>
282 int width,
int height,
int *clr,
bool shade,
bool horiz)
284 guint8 r0,g0,b0,r1,g1,b1,a;
286 cairo_pattern_t* pat = cairo_pattern_create_linear (0.0, 0.0, 0.0, height);
291 cairo_pattern_add_color_stop_rgb (pat, 0.0,
292 r1/255.0, g1/255.0, b1/255.0);
294 cairo_pattern_add_color_stop_rgb (pat, 1.0,
295 r0/255.0, g0/255.0, b0/255.0);
298 cairo_pattern_t* shade_pattern = cairo_pattern_create_linear (0.0, 0.0, width, 0.0);
299 cairo_pattern_add_color_stop_rgba (shade_pattern, 0.0, 1.0, 1.0, 1.0, 0.15);
300 cairo_pattern_add_color_stop_rgba (shade_pattern, 0.6, 0.0, 0.0, 0.0, 0.10);
301 cairo_pattern_add_color_stop_rgba (shade_pattern, 1.0, 1.0, 1.0, 1.0, 0.20);
303 cairo_surface_t* surface;
305 surface = cairo_image_surface_create (CAIRO_FORMAT_ARGB32, width, height);
306 tc = cairo_create (surface);
307 cairo_set_source (tc, pat);
308 cairo_rectangle (tc, 0, 0, width, height);
310 cairo_set_source (tc, shade_pattern);
311 cairo_rectangle (tc, 0, 0, width, height);
314 cairo_pattern_destroy (pat);
315 cairo_pattern_destroy (shade_pattern);
317 pat = cairo_pattern_create_for_surface (surface);
320 cairo_surface_destroy (surface);
324 cairo_surface_t* surface;
326 surface = cairo_image_surface_create (CAIRO_FORMAT_ARGB32, height, width);
327 tc = cairo_create (surface);
330 cairo_matrix_init_rotate (&m, -M_PI/2.0);
331 cairo_matrix_translate (&m, -height, 0);
332 cairo_pattern_set_matrix (pat, &m);
333 cairo_set_source (tc, pat);
334 cairo_rectangle (tc, 0, 0, height, width);
336 cairo_pattern_destroy (pat);
337 pat = cairo_pattern_create_for_surface (surface);
339 cairo_surface_destroy (surface);
342 Cairo::RefPtr<Cairo::Pattern> p (
new Cairo::Pattern (pat,
false));
347 Cairo::RefPtr<Cairo::Pattern>
349 int width,
int height,
int *clr,
float *stp,
int styleflags)
355 stp[0], stp[1], stp[2], stp[3],
356 clr[0], clr[1], clr[2], clr[3],
357 clr[4], clr[5], clr[6], clr[7],
358 clr[8], clr[9], styleflags);
360 Pattern10Map::iterator i;
367 width, height, clr, stp, styleflags,
false);
373 Cairo::RefPtr<Cairo::Pattern>
375 int width,
int height,
int *bgc,
bool shade)
382 PatternBgMap::iterator i;
389 width, height, bgc, shade,
false);
395 Cairo::RefPtr<Cairo::Pattern>
397 int width,
int height,
int *clr,
float *stp,
int styleflags)
403 stp[0], stp[1], stp[2], stp[3],
404 clr[0], clr[1], clr[2], clr[3],
405 clr[4], clr[5], clr[6], clr[7],
406 clr[8], clr[9], styleflags);
408 Pattern10Map::iterator i;
415 height, width, clr, stp, styleflags,
true);
421 Cairo::RefPtr<Cairo::Pattern>
423 int width,
int height,
int *bgc,
bool shade)
430 PatternBgMap::iterator i;
437 height, width, bgc, shade,
true);
510 int h = alloc.get_height();
514 if (h != alloc.get_height()) {
515 alloc.set_height (h);
535 int w = alloc.get_width();
539 if (w != alloc.get_width()) {
567 GdkRectangle intersection;
568 GdkRectangle background;
569 GdkRectangle eventarea;
571 cairo_set_source_rgb (cr, 0, 0, 0);
585 background.width =
pixrect.width;
586 background.height =
pixheight - top_of_meter;
588 eventarea.x = area->x;
589 eventarea.y = area->y;
590 eventarea.width = area->width;
591 eventarea.height = area->height;
593 if (gdk_rectangle_intersect (&background, &eventarea, &intersection)) {
594 cairo_set_source (cr,
bgpattern->cobj());
595 cairo_rectangle (cr, intersection.x, intersection.y, intersection.width, intersection.height);
599 if (gdk_rectangle_intersect (&
pixrect, &eventarea, &intersection)) {
601 cairo_set_source (cr,
fgpattern->cobj());
602 cairo_rectangle (cr, intersection.x, intersection.y, intersection.width, intersection.height);
621 cairo_set_source (cr,
fgpattern->cobj());
625 cairo_fill_preserve (cr);
626 cairo_set_source_rgba (cr, 1.0, 1.0, 1.0, 0.3);
640 GdkRectangle intersection;
641 GdkRectangle background;
642 GdkRectangle eventarea;
644 cairo_set_source_rgb (cr, 0, 0, 0);
653 pixrect.width = right_of_meter;
655 background.x = 1 + right_of_meter;
657 background.width =
pixwidth - right_of_meter;
660 eventarea.x = area->x;
661 eventarea.y = area->y;
662 eventarea.width = area->width;
663 eventarea.height = area->height;
665 if (gdk_rectangle_intersect (&background, &eventarea, &intersection)) {
666 cairo_set_source (cr,
bgpattern->cobj());
667 cairo_rectangle (cr, intersection.x, intersection.y, intersection.width, intersection.height);
671 if (gdk_rectangle_intersect (&
pixrect, &eventarea, &intersection)) {
672 cairo_set_source (cr,
fgpattern->cobj());
673 cairo_rectangle (cr, intersection.x, intersection.y, intersection.width, intersection.height);
690 cairo_set_source (cr,
fgpattern->cobj());
694 cairo_fill_preserve (cr);
695 cairo_set_source_rgba (cr, 1.0, 1.0, 1.0, 0.3);
734 #define PIX(X) floor(pixscale * (X))
739 Glib::RefPtr<Gdk::Window> win;
741 if ((win = get_window()) == 0) {
762 rect.height = new_top;
765 if (current_level > old_level) {
772 rect.height =
pixrect.y - rect.y;
779 rect.height =
pixrect.height - rect.height;
782 GdkRegion* region = 0;
785 if (rect.height != 0) {
789 region = gdk_region_rectangle (&rect);
800 region = gdk_region_new ();
808 region = gdk_region_new ();
814 rect.y = max(0, (rect.y & (~1)));
822 gdk_region_union_with_rect (region, &rect);
826 gdk_window_invalidate_region (win->gobj(), region,
true);
829 gdk_region_destroy(region);
844 if (current_level > old_level) {
847 rect.width = new_right -
pixrect.width;
850 rect.x = 1 + new_right;
852 rect.width =
pixrect.width - new_right;
855 GdkRegion* region = 0;
858 if (rect.height != 0) {
862 region = gdk_region_rectangle (&rect);
873 region = gdk_region_new ();
881 region = gdk_region_new ();
888 rect.width = min(3, xpos);
890 rect.width = min(2, xpos);
892 rect.x = 1 + max(0, xpos - rect.width);
893 gdk_region_union_with_rect (region, &rect);
897 gdk_window_invalidate_region (win->gobj(), region,
true);
900 gdk_region_destroy(region);
void render(cairo_t *, cairo_rectangle_t *)
std::map< Pattern10MapKey, Cairo::RefPtr< Cairo::Pattern > > Pattern10Map
std::map< PatternBgMapKey, Cairo::RefPtr< Cairo::Pattern > > PatternBgMap
void horizontal_expose(cairo_t *, cairo_rectangle_t *)
static void flush_pattern_cache()
static Pattern10Map hm_pattern_cache
Cairo::RefPtr< Cairo::Pattern > bgpattern
static bool no_rgba_overlay
void horizontal_size_request(GtkRequisition *)
#define UINT_TO_RGBA(u, r, g, b, a)
static const int max_pattern_metric_size
static PatternBgMap hb_pattern_cache
static Cairo::RefPtr< Cairo::Pattern > generate_meter_background(int, int, int *, bool, bool)
static Cairo::RefPtr< Cairo::Pattern > request_vertical_background(int, int, int *, bool)
void set(float level, float peak=-1)
Cairo::RefPtr< Cairo::Pattern > fgpattern
static Cairo::RefPtr< Cairo::Pattern > request_horizontal_meter(int, int, int *, float *, int)
static Pattern10Map vm_pattern_cache
void vertical_size_request(GtkRequisition *)
void vertical_size_allocate(Gtk::Allocation &)
void queue_vertical_redraw(const Glib::RefPtr< Gdk::Window > &, float)
static int min_pattern_metric_size
LIBGTKMM2EXT_API void rounded_rectangle(Cairo::RefPtr< Cairo::Context > context, double x, double y, double w, double h, double r=10)
static Cairo::RefPtr< Cairo::Pattern > request_vertical_meter(int, int, int *, float *, int)
void on_size_request(GtkRequisition *)
void vertical_expose(cairo_t *, cairo_rectangle_t *)
void queue_horizontal_redraw(const Glib::RefPtr< Gdk::Window > &, float)
void on_size_allocate(Gtk::Allocation &)
GdkRectangle last_peak_rect
static int max_pattern_metric_size
static PatternBgMap vb_pattern_cache
void set_hold_count(long)
static Cairo::RefPtr< Cairo::Pattern > generate_meter_pattern(int, int, int *, float *, int, bool)
void horizontal_size_allocate(Gtk::Allocation &)
static Cairo::RefPtr< Cairo::Pattern > request_horizontal_background(int, int, int *, bool)