Cont'd icon tweaks

* unify line-width calculation
* thin line-width, approximate thickness of
  glyph stroke width at same UI scale
* don't use outlines (except main tool buttons)
  This fixes issues of generic buttons with bright-theme
* pixel align some lines
This commit is contained in:
Robin Gareus 2019-08-27 17:58:58 +02:00
parent db831db1a5
commit 7f2bfa362f
No known key found for this signature in database
GPG key ID: A090BCE02CF57F04

View file

@ -34,6 +34,8 @@ using namespace ArdourWidgets::ArdourIcon;
* (usually white foreground, black outline) * (usually white foreground, black outline)
*/ */
#define DEFAULT_LINE_WIDTH ceil (std::min (width, height) * .035)
#define OUTLINEWIDTH 1.5 // px #define OUTLINEWIDTH 1.5 // px
#define VECTORICONSTROKEFILL(fillalpha) \ #define VECTORICONSTROKEFILL(fillalpha) \
@ -52,6 +54,12 @@ using namespace ArdourWidgets::ArdourIcon;
cairo_set_line_width (cr, (LW)); \ cairo_set_line_width (cr, (LW)); \
cairo_stroke (cr); cairo_stroke (cr);
#define VECTORICONSTROKE(LW, color) \
cairo_set_line_cap (cr, CAIRO_LINE_CAP_ROUND); \
Gtkmm2ext::set_source_rgba (cr, color); \
cairo_set_line_width (cr, (LW)); \
cairo_stroke (cr);
/** inverse color */ /** inverse color */
static void ardour_icon_set_source_inv_rgba (cairo_t *cr, uint32_t color) static void ardour_icon_set_source_inv_rgba (cairo_t *cr, uint32_t color)
@ -125,7 +133,6 @@ static void icon_tool_range (cairo_t *cr, const int width, const int height)
const double x = width * .5; const double x = width * .5;
const double y = height * .5; const double y = height * .5;
const double wh = std::min (x, y) * .55; const double wh = std::min (x, y) * .55;
const double lw = ceil (wh * .1); // line width
const double ar = wh * .6; // arrow const double ar = wh * .6; // arrow
const double bw = ceil (wh) - .5; const double bw = ceil (wh) - .5;
@ -137,10 +144,8 @@ static void icon_tool_range (cairo_t *cr, const int width, const int height)
// left and right box // left and right box
cairo_move_to (cr, x0, y0 - bw); cairo_move_to (cr, x0, y0 - bw);
cairo_line_to (cr, x0, y0 + bw); cairo_line_to (cr, x0, y0 + bw);
VECTORICONSTROKEOUTLINE(lw, 0xffffffff);
cairo_move_to (cr, x1, y0 - bw); cairo_move_to (cr, x1, y0 - bw);
cairo_line_to (cr, x1, y0 + bw); cairo_line_to (cr, x1, y0 + bw);
VECTORICONSTROKEOUTLINE(lw, 0xffffffff);
// arrows // arrows
cairo_move_to (cr, x0 + ar, ym - ar); cairo_move_to (cr, x0 + ar, ym - ar);
@ -154,20 +159,7 @@ static void icon_tool_range (cairo_t *cr, const int width, const int height)
// line connecting the arrows // line connecting the arrows
cairo_move_to (cr, x0, ym); cairo_move_to (cr, x0, ym);
cairo_line_to (cr, x1, ym); cairo_line_to (cr, x1, ym);
VECTORICONSTROKEOUTLINE(lw, 0xffffffff); VECTORICONSTROKEOUTLINE(DEFAULT_LINE_WIDTH, 0xffffffff);
cairo_set_source_rgba (cr, 1, 1, 1, 1.0);
cairo_set_line_width (cr, lw);
cairo_move_to (cr, x0, y0 - bw);
cairo_line_to (cr, x0, y0 + bw);
cairo_stroke (cr);
cairo_move_to (cr, x1, y0 - bw);
cairo_line_to (cr, x1, y0 + bw);
cairo_stroke (cr);
} }
/** Grab/Object tool - 6x8em "hand", with 'em' wide index finger. */ /** Grab/Object tool - 6x8em "hand", with 'em' wide index finger. */
@ -808,7 +800,7 @@ static void icon_zoom (cairo_t *cr, const enum ArdourWidgets::ArdourIcon::Icon i
// add "+", "-" or "[]" // add "+", "-" or "[]"
cairo_set_line_cap (cr, CAIRO_LINE_CAP_BUTT); cairo_set_line_cap (cr, CAIRO_LINE_CAP_BUTT);
cairo_set_line_width (cr, .5 + ceil (.08 * wh)); cairo_set_line_width (cr, .5 + DEFAULT_LINE_WIDTH);
ardour_icon_set_source_inv_rgba (cr, fg_color); ardour_icon_set_source_inv_rgba (cr, fg_color);
if (icon == ZoomIn || icon == ZoomOut) { if (icon == ZoomIn || icon == ZoomOut) {
@ -908,7 +900,7 @@ static void icon_nudge_left (cairo_t *cr, const int width, const int height, con
cairo_move_to (cr, x + tri_x, y - tri_y); cairo_move_to (cr, x + tri_x, y - tri_y);
cairo_line_to (cr, x - tri_x, y); cairo_line_to (cr, x - tri_x, y);
cairo_line_to (cr, x + tri_x, y + tri_y); cairo_line_to (cr, x + tri_x, y + tri_y);
VECTORICONSTROKEOUTLINE(.5 + ceil (.07 * wh), fg_color); VECTORICONSTROKEOUTLINE(.5 + DEFAULT_LINE_WIDTH, fg_color);
} }
/** ">" */ /** ">" */
@ -925,15 +917,16 @@ static void icon_nudge_right (cairo_t *cr, const int width, const int height, co
cairo_move_to (cr, x - tri_x, y - tri_y); cairo_move_to (cr, x - tri_x, y - tri_y);
cairo_line_to (cr, x + tri_x, y); cairo_line_to (cr, x + tri_x, y);
cairo_line_to (cr, x - tri_x, y + tri_y); cairo_line_to (cr, x - tri_x, y + tri_y);
VECTORICONSTROKEOUTLINE(.5 + ceil (.07 * wh), fg_color); VECTORICONSTROKEOUTLINE(.5 + DEFAULT_LINE_WIDTH, fg_color);
} }
/** mixer strip narrow/wide */ /** mixer strip narrow/wide */
static void icon_strip_width (cairo_t *cr, const int width, const int height, const uint32_t fg_color) static void icon_strip_width (cairo_t *cr, const int width, const int height, const uint32_t fg_color)
{ {
const double xm = .5 + rint (width * .5); const double lw = DEFAULT_LINE_WIDTH;
const double ym = .5 + rint (height * .5); const double xm = rint (width * .5) - lw * .5;
const double ym = rint (height * .5) - lw * .5;
const double dx = ceil (width * .3); const double dx = ceil (width * .3);
const double dy = ceil (height * .25); const double dy = ceil (height * .25);
@ -947,7 +940,7 @@ static void icon_strip_width (cairo_t *cr, const int width, const int height, co
const double ary = height * .15; const double ary = height * .15;
Gtkmm2ext::set_source_rgba (cr, fg_color); Gtkmm2ext::set_source_rgba (cr, fg_color);
cairo_set_line_width (cr, ceil (std::min (width, height) * .035)); cairo_set_line_width (cr, lw);
// left + right // left + right
cairo_move_to (cr, x0, y0); cairo_move_to (cr, x0, y0);
@ -1008,32 +1001,29 @@ static void icon_din_midi (cairo_t *cr, const int width, const int height, const
static void icon_plus_sign (cairo_t *cr, const int width, const int height, const uint32_t fg_color) static void icon_plus_sign (cairo_t *cr, const int width, const int height, const uint32_t fg_color)
{ {
const double xc = rint (width * .5); const double lw = DEFAULT_LINE_WIDTH;
const double yc = rint (height * .5); const double lc = fmod (lw * .5, 1.0);
const double wh = ceil (std::min (width, height) * .077) / 2.0; const double xc = rint (width * .5) - lc;
const int ln = std::min (width, height) * .33; const double yc = rint (height * .5) - lc;
const double ln = rint (std::min (width, height) * .3);
cairo_rectangle (cr, cairo_rectangle (cr, xc - lw * .5, yc - ln, lw, ln * 2);
xc - wh, yc - ln, cairo_rectangle (cr, xc - ln, yc - lw * .5, ln * 2, lw);
wh * 2, ln * 2);
cairo_rectangle (cr, Gtkmm2ext::set_source_rgba (cr, fg_color);
xc - ln, yc - wh, cairo_fill (cr);
ln * 2, wh * 2);
VECTORICONSTROKEFILL(0.9);
} }
static void icon_no_parking (cairo_t *cr, const int width, const int height, const uint32_t fg_color) static void icon_no_parking (cairo_t *cr, const int width, const int height, const uint32_t fg_color)
{ {
const double x = width * .5; const double x = width * .5;
const double y = height * .5; const double y = height * .5;
const double r = std::min (x, y) * .65; const double r = std::min (x, y) * .6;
const double rl = .7 * r; const double rl = .7 * r;
cairo_arc (cr, x, y, r, 0, 2. * M_PI); cairo_arc (cr, x, y, r, 0, 2. * M_PI);
cairo_move_to (cr, x - rl, y - rl); cairo_move_to (cr, x - rl, y - rl);
cairo_line_to (cr, x + rl, y + rl); cairo_line_to (cr, x + rl, y + rl);
VECTORICONSTROKEOUTLINE(ceil (.25 * r), fg_color); VECTORICONSTROKE (DEFAULT_LINE_WIDTH, fg_color);
} }
static void icon_save_arrow_box (cairo_t *cr, const int width, const int height, const uint32_t fg_color) static void icon_save_arrow_box (cairo_t *cr, const int width, const int height, const uint32_t fg_color)
@ -1041,28 +1031,33 @@ static void icon_save_arrow_box (cairo_t *cr, const int width, const int height,
const double x = width * .5; const double x = width * .5;
const double y = height * .5; const double y = height * .5;
const double o0 = .5 + std::min (x, y) * .35; const double lw = DEFAULT_LINE_WIDTH;
const double ww = .5 + std::min (x, y) * .55; const double lc = fmod (lw * .5, 1.0);
const double hh = .5 + std::min (x, y) * .45;
const double x0 = rint (x) - lc;
const double y0 = rint (y + std::min (x, y) * .05) - lc;
const double o0 = std::min (x, y) * .35;
const double ww = rint (std::min (x, y) * .55);
const double hh = rint (std::min (x, y) * .45);
const double ar = .5 + std::min (x, y) * .1; const double ar = .5 + std::min (x, y) * .1;
/* box open at top middle */ /* box open at top middle */
cairo_move_to (cr, x - o0, y - hh); cairo_move_to (cr, x0 - o0, y0 - hh);
cairo_line_to (cr, x - ww, y - hh); cairo_line_to (cr, x0 - ww, y0 - hh);
cairo_line_to (cr, x - ww, y + hh); cairo_line_to (cr, x0 - ww, y0 + hh);
cairo_line_to (cr, x + ww, y + hh); cairo_line_to (cr, x0 + ww, y0 + hh);
cairo_line_to (cr, x + ww, y - hh); cairo_line_to (cr, x0 + ww, y0 - hh);
cairo_line_to (cr, x + o0, y - hh); cairo_line_to (cr, x0 + o0, y0 - hh);
VECTORICONSTROKEOUTLINE(1.2 * ar, fg_color); VECTORICONSTROKE (lw, fg_color);
/* downward arrow into the box */ /* downward arrow into the box */
cairo_move_to (cr, x, y - ar); cairo_move_to (cr, x0, y0 - ar);
cairo_line_to (cr, x - ar, y - ar); cairo_line_to (cr, x0 - ar, y0 - ar);
cairo_line_to (cr, x, y); cairo_line_to (cr, x0, y0);
cairo_line_to (cr, x + ar, y - ar); cairo_line_to (cr, x0 + ar, y0 - ar);
cairo_line_to (cr, x, y - ar); cairo_line_to (cr, x0, y0 - ar);
cairo_line_to (cr, x, y - ww - ar); cairo_line_to (cr, x0, y0 - ww - ar);
VECTORICONSTROKEOUTLINE(1.2 * ar, fg_color); VECTORICONSTROKE (lw, fg_color);
} }
static void icon_on_off (cairo_t *cr, const int width, const int height, const uint32_t fg_color) static void icon_on_off (cairo_t *cr, const int width, const int height, const uint32_t fg_color)
@ -1070,10 +1065,14 @@ static void icon_on_off (cairo_t *cr, const int width, const int height, const u
const double x = width * .5; const double x = width * .5;
const double y = height * .5; const double y = height * .5;
const double r = std::min (x, y) * .65; const double r = std::min (x, y) * .65;
cairo_arc (cr, x, y, r, -.3 * M_PI, 1.3 * M_PI); const double lw = DEFAULT_LINE_WIDTH;
cairo_move_to (cr, x, y - r); const double lc = fmod (lw * .5, 1.0);
cairo_line_to (cr, x, y); const double x0 = rint (x) - lc;
VECTORICONSTROKEOUTLINE(ceil (.25 * r), fg_color);
cairo_arc (cr, x0, y, r, -.3 * M_PI, 1.3 * M_PI);
cairo_move_to (cr, x0, y - r);
cairo_line_to (cr, x0, y);
VECTORICONSTROKE (lw, fg_color);
} }
static void icon_bypass (cairo_t *cr, const int width, const int height, const uint32_t fg_color) static void icon_bypass (cairo_t *cr, const int width, const int height, const uint32_t fg_color)
@ -1083,20 +1082,20 @@ static void icon_bypass (cairo_t *cr, const int width, const int height, const u
const double y0 = height * .6; const double y0 = height * .6;
const double r = std::min (x, y) * .75; const double r = std::min (x, y) * .75;
const double o = std::min (x, y) * .275; const double o = std::min (x, y) * .275;
const double pt = std::min (x, y) * .125; const double pt = DEFAULT_LINE_WIDTH;
const double dashes[] = { 1, pt }; const double dashes[] = { 1, pt };
cairo_set_dash (cr, dashes, 2, 0); cairo_set_dash (cr, dashes, 2, 0);
cairo_move_to (cr, x - r, y0); cairo_move_to (cr, x - r, y0);
cairo_line_to (cr, x + r, y0); cairo_line_to (cr, x + r, y0);
VECTORICONSTROKEOUTLINE(pt * .8, fg_color); VECTORICONSTROKE(pt * .8, fg_color);
cairo_set_dash (cr, 0, 0, 0); cairo_set_dash (cr, 0, 0, 0);
cairo_move_to (cr, x - o, y0 - o); cairo_move_to (cr, x - o, y0 - o);
cairo_line_to (cr, x + o, y0 + o); cairo_line_to (cr, x + o, y0 + o);
cairo_move_to (cr, x + o, y0 - o); cairo_move_to (cr, x + o, y0 - o);
cairo_line_to (cr, x - o, y0 + o); cairo_line_to (cr, x - o, y0 + o);
VECTORICONSTROKEOUTLINE(pt * .8, fg_color); VECTORICONSTROKE(pt * .8, fg_color);
cairo_set_line_join (cr, CAIRO_LINE_JOIN_ROUND); cairo_set_line_join (cr, CAIRO_LINE_JOIN_ROUND);
cairo_arc (cr, x, y0, r, 0, 0); cairo_arc (cr, x, y0, r, 0, 0);
@ -1104,7 +1103,7 @@ static void icon_bypass (cairo_t *cr, const int width, const int height, const u
cairo_arc (cr, x, y0, r * 1.17, 1.92 * M_PI, 1.92 * M_PI); cairo_arc (cr, x, y0, r * 1.17, 1.92 * M_PI, 1.92 * M_PI);
cairo_close_path (cr); cairo_close_path (cr);
cairo_arc_negative (cr, x, y0, r, 0, M_PI); cairo_arc_negative (cr, x, y0, r, 0, M_PI);
VECTORICONSTROKEOUTLINE(pt, fg_color); VECTORICONSTROKE(pt, fg_color);
} }
@ -1113,23 +1112,25 @@ static void icon_reset_knob (cairo_t *cr, const int width, const int height, con
const double x = width * .5; const double x = width * .5;
const double y = height * .5; const double y = height * .5;
const double r0 = std::min (x, y) * .3; const double r0 = std::min (x, y) * .3;
const double r1 = std::min (x, y) * .7; const double r1 = std::min (x, y) * .65;
const double ar = std::min (x, y) * .25; const double ar = std::min (x, y) * .25;
const double pt = std::min (x, y) * .125; const double lw = DEFAULT_LINE_WIDTH;
const double lc = fmod (lw * .5, 1.0);
const double x0 = rint (x) - lc;
cairo_arc (cr, x, y, r0, 0, 2. * M_PI); cairo_arc (cr, x0, y, r0, 0, 2. * M_PI);
cairo_move_to (cr, x, y - r0); cairo_move_to (cr, x0, y - r0);
cairo_line_to (cr, x, y); cairo_line_to (cr, x0, y);
VECTORICONSTROKEOUTLINE(pt, fg_color); VECTORICONSTROKE(lw, fg_color);
/* outer ring w/CCW arrow */ /* outer ring w/CCW arrow */
cairo_set_line_join (cr, CAIRO_LINE_JOIN_ROUND); cairo_set_line_join (cr, CAIRO_LINE_JOIN_ROUND);
cairo_arc (cr, x, y, r1, -.25 * M_PI, -.25 * M_PI); cairo_arc (cr, x0, y, r1, -.25 * M_PI, -.25 * M_PI);
cairo_rel_line_to (cr, 0, ar); cairo_rel_line_to (cr, 0, ar);
cairo_rel_line_to (cr, ar, -ar); cairo_rel_line_to (cr, ar, -ar);
cairo_arc (cr, x, y, r1, -.25 * M_PI, -.25 * M_PI); cairo_arc (cr, x0, y, r1, -.25 * M_PI, -.25 * M_PI);
cairo_arc (cr, x, y, r1, -.25 * M_PI, 1.50 * M_PI); cairo_arc (cr, x0, y, r1, -.25 * M_PI, 1.50 * M_PI);
VECTORICONSTROKEOUTLINE(pt, fg_color); VECTORICONSTROKE(lw, fg_color);
} }
static void icon_config_wheel (cairo_t *cr, const int width, const int height, const uint32_t fg_color, int arrow) static void icon_config_wheel (cairo_t *cr, const int width, const int height, const uint32_t fg_color, int arrow)
@ -1137,11 +1138,10 @@ static void icon_config_wheel (cairo_t *cr, const int width, const int height, c
const double x = width * .5; const double x = width * .5;
const double y = height * .5; const double y = height * .5;
const double r0 = std::min (x, y) * .3; const double r0 = std::min (x, y) * .3;
const double r1 = std::min (x, y) * .60; const double r1 = std::min (x, y) * .55;
const double r2 = std::min (x, y) * .75; const double r2 = std::min (x, y) * .70;
const double ar = std::min (x, y) * .25; const double ar = std::min (x, y) * .25;
const double pt = std::min (x, y) * .125; const double lw = DEFAULT_LINE_WIDTH;
for (int i = 0; i < 8; ++i) { for (int i = 0; i < 8; ++i) {
double ang0 = i * 2.0 * M_PI / 8.0; double ang0 = i * 2.0 * M_PI / 8.0;
@ -1153,7 +1153,7 @@ static void icon_config_wheel (cairo_t *cr, const int width, const int height, c
cairo_arc (cr, x, y, r1, ang0 + angm + angd, ang1 - angm - angd); cairo_arc (cr, x, y, r1, ang0 + angm + angd, ang1 - angm - angd);
} }
cairo_close_path (cr); cairo_close_path (cr);
VECTORICONSTROKEOUTLINE(pt, fg_color); VECTORICONSTROKE(lw, fg_color);
cairo_set_line_join (cr, CAIRO_LINE_JOIN_ROUND); cairo_set_line_join (cr, CAIRO_LINE_JOIN_ROUND);
if (arrow == 0) { if (arrow == 0) {
@ -1173,7 +1173,7 @@ static void icon_config_wheel (cairo_t *cr, const int width, const int height, c
cairo_arc (cr, x, y, r0, 1.1 * M_PI, 1.1 * M_PI); cairo_arc (cr, x, y, r0, 1.1 * M_PI, 1.1 * M_PI);
cairo_arc (cr, x, y, r0, 1.1 * M_PI, .5 * M_PI); cairo_arc (cr, x, y, r0, 1.1 * M_PI, .5 * M_PI);
} }
VECTORICONSTROKEOUTLINE(pt, fg_color); VECTORICONSTROKE(lw, fg_color);
} }
static void icon_pcb_via (cairo_t *cr, const int width, const int height, const uint32_t fg_color) static void icon_pcb_via (cairo_t *cr, const int width, const int height, const uint32_t fg_color)
@ -1182,9 +1182,8 @@ static void icon_pcb_via (cairo_t *cr, const int width, const int height, const
const double y = ceil (height * .5) - .5; const double y = ceil (height * .5) - .5;
const double d = rint (std::min (x, y) * .5); const double d = rint (std::min (x, y) * .5);
const double r = std::min (x, y) * .15; const double r = std::min (x, y) * .16;
const double p = std::min (x, y) * .1; const double p = std::min (x, y) * .1;
const double o = std::min (x, y) * .4;
cairo_arc_negative (cr, x+d, y+d, r, 1.15 * M_PI, -.85 * M_PI); cairo_arc_negative (cr, x+d, y+d, r, 1.15 * M_PI, -.85 * M_PI);
cairo_arc (cr, x+d, y+d, d * 1.12, 1.15 * M_PI, 1.15 * M_PI); cairo_arc (cr, x+d, y+d, d * 1.12, 1.15 * M_PI, 1.15 * M_PI);
@ -1194,31 +1193,34 @@ static void icon_pcb_via (cairo_t *cr, const int width, const int height, const
cairo_arc (cr, x-d, y-d, r, .5 * M_PI, .5 * M_PI); cairo_arc (cr, x-d, y-d, r, .5 * M_PI, .5 * M_PI);
cairo_arc (cr, x-d, y+d, r, -.5 * M_PI, 1.5 * M_PI); cairo_arc (cr, x-d, y+d, r, -.5 * M_PI, 1.5 * M_PI);
VECTORICONSTROKEOUTLINE(p, fg_color); VECTORICONSTROKE (p, fg_color);
cairo_arc (cr, x+d, y-d, o, -.5 * M_PI, -.5 * M_PI);
cairo_arc (cr, x+d, y-d, r, -.5 * M_PI, 1.5 * M_PI); cairo_arc (cr, x+d, y-d, r, -.5 * M_PI, 1.5 * M_PI);
VECTORICONSTROKEOUTLINE(p, fg_color); VECTORICONSTROKE (p, fg_color);
} }
static void icon_latency_clock (cairo_t *cr, const int width, const int height, const uint32_t fg_color) static void icon_latency_clock (cairo_t *cr, const int width, const int height, const uint32_t fg_color)
{ {
const double x = width * .5; const double x = width * .5;
const double y = height * .5; const double y = height * .5;
const double y0 = std::min (x, y) * .45; const double y0 = std::min (x, y) * .4;
const double r0 = std::min (x, y) * .1; const double r0 = std::min (x, y) * .1;
const double r1 = std::min (x, y) * .7; const double r1 = std::min (x, y) * .5;
const double pt = std::min (x, y) * .1; const double r2 = std::min (x, y) * .66;
cairo_move_to (cr, x, y - y0); const double lw = DEFAULT_LINE_WIDTH;
cairo_arc (cr, x, y, r1, -.5 * M_PI, 1.25 * M_PI); const double lc = fmod (lw * .5, 1.0);
VECTORICONSTROKEOUTLINE(pt, fg_color); const double x0 = rint (x) - lc;
cairo_arc (cr, x, y, r0, -.4 * M_PI , .9 * M_PI); cairo_move_to (cr, x0, y - y0);
cairo_arc (cr, x, y, y0, 1.25 * M_PI, 1.25 * M_PI); cairo_arc (cr, x0, y, r2, -.5 * M_PI, 1.25 * M_PI);
cairo_arc (cr, x, y, r0, -.4 * M_PI, -.4 * M_PI); VECTORICONSTROKE(lw, fg_color);
cairo_arc (cr, x0, y, r0, -.4 * M_PI , .9 * M_PI);
cairo_arc (cr, x0, y, r1, 1.25 * M_PI, 1.25 * M_PI);
cairo_arc (cr, x0, y, r0, -.4 * M_PI, -.4 * M_PI);
cairo_close_path (cr); cairo_close_path (cr);
VECTORICONSTROKEFILL(1.0); cairo_fill (cr);
} }
/*****************************************************************************/ /*****************************************************************************/
@ -1356,6 +1358,3 @@ ArdourWidgets::ArdourIcon::render (cairo_t *cr,
cairo_restore (cr); cairo_restore (cr);
return rv; return rv;
} }
#undef VECTORICONSTROKEFILL
#undef VECTORICONSTROKEOUTLINE