From 02a0e985961b7472f32ab31e864bafbf6f387f18 Mon Sep 17 00:00:00 2001 From: JunsuChoi Date: Mon, 6 Jul 2020 17:01:56 +0900 Subject: [PATCH] SvgLoader: Support x,y rounded rect Change-Id: I45d8f7ff3604da0a80c09e2495ed8c0301310094 --- src/loaders/svg_loader/tvgSvgSceneBuilder.cpp | 21 +++++++++++++++++-- test/svgs/rect.svg | 7 +++++++ 2 files changed, 26 insertions(+), 2 deletions(-) create mode 100644 test/svgs/rect.svg diff --git a/src/loaders/svg_loader/tvgSvgSceneBuilder.cpp b/src/loaders/svg_loader/tvgSvgSceneBuilder.cpp index 66b3593c..2451103e 100644 --- a/src/loaders/svg_loader/tvgSvgSceneBuilder.cpp +++ b/src/loaders/svg_loader/tvgSvgSceneBuilder.cpp @@ -150,11 +150,28 @@ unique_ptr _shapeBuildHelper(SvgNode* node) break; } case SvgNodeType::Rect: { - if (node->node.rect.rx == node->node.rect.ry) { + if (node->node.rect.rx == node->node.rect.ry || (node->node.rect.rx == 0 || node->node.rect.ry == 0)) { shape->appendRect(node->node.rect.x, node->node.rect.y, node->node.rect.w, node->node.rect.h, node->node.rect.rx); } else { - //TODO: Support rounded rectangle + float x = node->node.rect.x; + float y = node->node.rect.y; + float w = node->node.rect.w; + float h = node->node.rect.h; + float rx = node->node.rect.rx; + float ry = node->node.rect.ry; + float rhx = rx / 2; + float rhy = ry / 2; + shape->moveTo(x + rx, y); + shape->lineTo(x + w - rx, y); + shape->cubicTo(x + w - rx + rhx, y, x + w, y + ry - rhy, x + w, y + ry); + shape->lineTo(x + w, y + h - ry); + shape->cubicTo(x + w, y + h - ry + rhy, x + w - rx + rhx, y + h, x + w - rx, y + h); + shape->lineTo(x + rx, y + h); + shape->cubicTo(x + rx - rhx, y + h, x, y + h - ry + rhy, x, y + h - ry); + shape->lineTo(x, y + ry); + shape->cubicTo(x, y + ry - rhy, x + rx - rhx, y, x + rx, y); + shape->close(); } break; } diff --git a/test/svgs/rect.svg b/test/svgs/rect.svg new file mode 100644 index 00000000..2e829058 --- /dev/null +++ b/test/svgs/rect.svg @@ -0,0 +1,7 @@ + + + + + + +