+ cairo_close_path (cr);
+ VECTORICONSTROKEFILL(1.0);
+ }
+ else if ((_elements & VectorIcon) && _icon == TransportLoop) {
+ const double x = get_width() * .5;
+ const double y = get_height() * .5;
+ const double r = std::min(x, y);
+
+ cairo_arc (cr, x, y, r * .6, 0, 2 * M_PI);
+ cairo_arc_negative (cr, x, y, r * .3, 2 * M_PI, 0);
+
+ VECTORICONSTROKEFILL(1.0);
+#define ARCARROW(rad, ang) \
+ x + (rad) * sin((ang) * 2.0 * M_PI), y + (rad) * cos((ang) * 2.0 * M_PI)
+
+ cairo_move_to (cr, ARCARROW(r * .30, .72));
+ cairo_line_to (cr, ARCARROW(r * .08, .72));
+ cairo_line_to (cr, ARCARROW(r * .54, .60));
+ cairo_line_to (cr, ARCARROW(r * .73, .72));
+ cairo_line_to (cr, ARCARROW(r * .60, .72));
+
+ cairo_set_source_rgba (cr, 0, 0, 0, 1.0);
+ cairo_stroke_preserve(cr);
+ cairo_close_path (cr);
+ cairo_set_source_rgba (cr, 1, 1, 1, 1.0);
+ cairo_fill(cr);
+#undef ARCARROW
+ }
+ else if ((_elements & VectorIcon) && _icon == TransportMetronom) {
+ const double x = get_width() * .5;
+ const double y = get_height() * .5;
+ const double wh = std::min(x, y);
+ const double h = wh * .8;
+ const double w = wh * .5;
+ const double lw = w * .25;
+
+ cairo_rectangle (cr,
+ x - w * .7, y + h * .25,
+ w * 1.4, lw);
+
+ VECTORICONSTROKEFILL(1.0);
+
+ cairo_move_to (cr, x - w, y + h);
+ cairo_line_to (cr, x + w, y + h);
+ cairo_line_to (cr, x + w * .35, y - h);
+ cairo_line_to (cr, x - w * .35, y - h);
+ cairo_line_to (cr, x - w, y + h);
+
+ cairo_move_to (cr, x - w + lw, y + h -lw);
+ cairo_line_to (cr, x - w * .35 + lw, y - h + lw);
+ cairo_line_to (cr, x + w * .35 - lw, y - h + lw);
+ cairo_line_to (cr, x + w - lw, y + h -lw);
+ cairo_line_to (cr, x - w + lw, y + h -lw);
+
+ VECTORICONSTROKEFILL(1.0);
+
+ // ddx = .70 w = .75 * .5 wh = .375 wh
+ // ddy = .75 h - lw = .75 * .8 wh - wh .5 * .2 = .5 wh
+ // ang = (ddx/ddy):
+ // -> angle = atan (ang) = atan (375 / .5) ~= 36deg
+ const double dx = lw * .2; // 1 - cos(tan^-1(ang))
+ const double dy = lw * .4; // 1 - sin(tan^-1(ang))
+ cairo_move_to (cr, x - w * .3 , y + h * .25 + lw * .5);
+ cairo_line_to (cr, x - w + dx , y - h + lw + dy);
+ cairo_line_to (cr, x - w + lw , y - h + lw);
+ cairo_line_to (cr, x - w * .3 + lw, y + h * .25 + lw * .5);
+ cairo_close_path (cr);
+
+ VECTORICONSTROKEFILL(1.0);
+
+ cairo_rectangle (cr,
+ x - w * .7, y + h * .25,
+ w * 1.4, lw);
+ cairo_fill(cr);
+ }
+ else if (_elements & VectorIcon) {
+ // missing icon
+ assert(0);
+ }
+#undef VECTORICONSTROKEFILL
+
+ const int text_margin = char_pixel_width();
+ // Text, if any
+ if (!_pixbuf && ((_elements & Text)==Text) && !_text.empty()) {
+ assert(_layout);
+#if 0 // DEBUG style (print on hover)
+ if (_hovering || (_elements & Inactive)) {
+ bool layout_font = true;
+ Pango::FontDescription fd = _layout->get_font_description();
+ if (fd.gobj() == NULL) {
+ layout_font = false;
+ fd = get_pango_context()->get_font_description();
+ }
+ printf("%s: f:%dx%d aw:%.3f bh:%.0f t:%dx%d (%dx%d) %s\"%s\"\n",
+ get_name().c_str(),
+ char_pixel_width(), char_pixel_height(), char_avg_pixel_width(),
+ ceil(char_pixel_height() * BASELINESTRETCH),
+ _text_width, _text_height,
+ get_width(), get_height(),
+ layout_font ? "L:" : "W:",
+ fd.to_string().c_str());
+ }
+#endif
+
+ cairo_save (cr);
+ cairo_rectangle (cr, 2, 1, get_width() - 4, get_height() - 2);
+ cairo_clip(cr);
+
+ cairo_new_path (cr);
+ ArdourCanvas::set_source_rgba (cr, text_color);
+ const double text_ypos = (get_height() - _text_height) * .5;
+
+ if (_elements & Menu) {
+ // always left align (dropdown)
+ cairo_move_to (cr, text_margin, text_ypos);
+ pango_cairo_show_layout (cr, _layout->gobj());
+ } else if ( (_elements & Indicator) == Indicator) {
+ // left/right align depending on LED position