Skip to content

Commit bd53112

Browse files
committed
FEAT: Add support for reversed round, triangle, and reversed triangle line caps
1 parent f33976d commit bd53112

1 file changed

Lines changed: 66 additions & 15 deletions

File tree

agg-src/include/agg_math_stroke.h

Lines changed: 66 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,11 @@ namespace agg
3030
{
3131
butt_cap,
3232
square_cap,
33-
round_cap
33+
round_cap,
34+
round_revert_cap,
35+
triangle_cap,
36+
triangle_revert_cap,
37+
max_cap
3438
};
3539

3640
//------------------------------------------------------------line_join_e
@@ -327,24 +331,38 @@ namespace agg
327331
dx1 *= m_width;
328332
dy1 *= m_width;
329333

330-
if(m_line_cap != round_cap)
331-
{
332-
if(m_line_cap == square_cap)
333-
{
334-
dx2 = dy1 * m_width_sign;
335-
dy2 = dx1 * m_width_sign;
336-
}
334+
switch (m_line_cap) {
335+
case square_cap:
336+
dx2 = dy1 * m_width_sign;
337+
dy2 = dx1 * m_width_sign;
338+
AGG_FALLTHROUGH
339+
case butt_cap:
337340
add_vertex(vc, v0.x - dx1 - dx2, v0.y + dy1 - dy2);
338341
add_vertex(vc, v0.x + dx1 - dx2, v0.y - dy1 - dy2);
342+
return;
343+
case triangle_cap:
344+
case triangle_revert_cap:
345+
dx2 = dy1 * m_width_sign;
346+
dy2 = dx1 * m_width_sign;
347+
348+
add_vertex(vc, v0.x, v0.y + dy1 - dy2);
349+
if (m_line_cap == triangle_revert_cap) {
350+
add_vertex(vc, v0.x + dx1 + dx2, v0.y);
351+
} else {
352+
add_vertex(vc, v0.x - dx1 - dx2, v0.y);
353+
}
354+
add_vertex(vc, v0.x, v0.y - dy1 - dy2);
355+
return;
339356
}
340-
else
341-
{
342-
double da = std::acos(m_width_abs / (m_width_abs + 0.125 / m_approx_scale)) * 2;
343-
double a1;
344-
int i;
345-
int n = int(pi / da);
346357

347-
da = pi / (n + 1);
358+
359+
double da = std::acos(m_width_abs / (m_width_abs + 0.125 / m_approx_scale)) * 2;
360+
double a1;
361+
int i;
362+
int n = int(pi / da);
363+
da = pi / (n + 1);
364+
365+
if (m_line_cap == round_cap) {
348366
add_vertex(vc, v0.x - dx1, v0.y + dy1);
349367
if(m_width_sign > 0)
350368
{
@@ -370,6 +388,39 @@ namespace agg
370388
}
371389
add_vertex(vc, v0.x + dx1, v0.y - dy1);
372390
}
391+
else { // round_revert_cap
392+
dx2 = dy1 * m_width_sign;
393+
dy2 = dx1 * m_width_sign;
394+
double arc_radius = m_width_abs * 0.65;
395+
396+
// Start from extended position (like square_cap).
397+
add_vertex(vc, v0.x - dx1 - dx2, v0.y + dy1 - dy2);
398+
if(m_width_sign > 0)
399+
{
400+
a1 = std::atan2(dy1, -dx1);
401+
a1 += da;
402+
for(i = 0; i < n; i++)
403+
{
404+
double rx = std::cos(a1) * m_width;
405+
double ry = std::sin(a1) * m_width;
406+
add_vertex(vc, v0.x - rx - dx2, v0.y + ry - dy2);
407+
a1 += da;
408+
}
409+
}
410+
else
411+
{
412+
a1 = std::atan2(-dy1, dx1);
413+
a1 -= da;
414+
for(i = 0; i < n; i++)
415+
{
416+
double rx = std::cos(a1) * m_width;
417+
double ry = std::sin(a1) * m_width;
418+
add_vertex(vc, v0.x - rx - dx2, v0.y - ry - dy2);
419+
a1 -= da;
420+
}
421+
}
422+
add_vertex(vc, v0.x + dx1 - dx2, v0.y - dy1 - dy2);
423+
}
373424
}
374425

375426
//-----------------------------------------------------------------------

0 commit comments

Comments
 (0)