From 8d5e4e883d6ebf5373dcd3775e2f9191f46068bb Mon Sep 17 00:00:00 2001 From: Hermet Park Date: Thu, 17 Sep 2020 11:28:05 +0900 Subject: [PATCH] common path: code refactoring. revise duplicate() method for clean & neat code. --- src/lib/tvgShape.cpp | 2 +- src/lib/tvgShapeImpl.h | 50 ++++++++++++++++++++---------------------- 2 files changed, 25 insertions(+), 27 deletions(-) diff --git a/src/lib/tvgShape.cpp b/src/lib/tvgShape.cpp index e75af91b..9f5aa0d9 100644 --- a/src/lib/tvgShape.cpp +++ b/src/lib/tvgShape.cpp @@ -52,7 +52,7 @@ unique_ptr Shape::gen() noexcept unique_ptr Shape::duplicate() const noexcept { auto shape = Shape::gen(); - shape->pImpl->duplicate(IMPL); + if (!shape->pImpl->duplicate(IMPL)) return nullptr; return shape; } diff --git a/src/lib/tvgShapeImpl.h b/src/lib/tvgShapeImpl.h index 5cda05a8..42254592 100644 --- a/src/lib/tvgShapeImpl.h +++ b/src/lib/tvgShapeImpl.h @@ -163,44 +163,42 @@ struct Shape::Impl return true; } - void duplicate(Shape::Impl *s) + bool duplicate(Shape::Impl *src) { - if (memcmp(color, s->color, sizeof(color))) { - memcpy(color, s->color, sizeof(color)); - flag = RenderUpdateFlag::Color; - } + //Color + *color = *src->color; + flag = RenderUpdateFlag::Color; - if (s->path) { + //Copy Path + if (src->path) { path = new ShapePath(); - - path->cmdCnt = s->path->cmdCnt; - path->ptsCnt = s->path->ptsCnt; - path->reservedCmdCnt = s->path->reservedCmdCnt; - path->reservedPtsCnt = s->path->reservedPtsCnt; + if (!path) return false; + *path = *src->path; path->cmds = static_cast(malloc(sizeof(PathCommand) * path->reservedCmdCnt)); + if (!path->cmds) return false; + memcpy(path->cmds, src->path->cmds, sizeof(PathCommand) * path->cmdCnt); + path->pts = static_cast(malloc(sizeof(Point) * path->reservedPtsCnt)); + if (!path->pts) return false; + memcpy(path->pts, src->path->pts, sizeof(Point) * path->ptsCnt); - memcpy(path->cmds, s->path->cmds, sizeof(PathCommand) * s->path->cmdCnt); - memcpy(path->pts, s->path->pts, sizeof(Point) * s->path->ptsCnt); - - flag = RenderUpdateFlag::Path; + flag |= RenderUpdateFlag::Path; } - if (s->stroke) { + //Copy Stroke + if (src->stroke) { stroke = new ShapeStroke(); - strokeCap(s->stroke->cap); - strokeColor(s->stroke->color[0], s->stroke->color[1], - s->stroke->color[2], s->stroke->color[3]); - strokeJoin(s->stroke->join); - strokeWidth(s->stroke->width); - - if (s->stroke->dashPattern && s->stroke->dashCnt > 0) { - strokeDash(s->stroke->dashPattern, s->stroke->dashCnt); - } + if (!stroke) return false; + *stroke = *src->stroke; + stroke->dashPattern = static_cast(malloc(sizeof(float) * stroke->dashCnt)); + memcpy(stroke->dashPattern, src->stroke->dashPattern, sizeof(float) * stroke->dashCnt); + flag |= RenderUpdateFlag::Stroke; } - //TODO: add fill + //TODO: Copy Fill + + return true; } };