From 0d1eaef313fecfa21a7fe7c6a7ab6db48a0849c7 Mon Sep 17 00:00:00 2001 From: Hermet Park Date: Thu, 25 Feb 2021 12:41:20 +0900 Subject: [PATCH 01/16] Update CONTRIBUTING.md fix typo --- CONTRIBUTING.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 57b154f..ea5da10 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -78,7 +78,7 @@ You can keep the file name, but don't please contain any prefix(tvg) nor suffix( Once you submitted a pull request(PR), please make it sure below check list. - Reviewers: Check Reviewers List - - Assginees: You + - Assignees: You - Labels: Patch Purpose - CODING STYLE CHECK: Must be perfect

-- 2.7.4 From 6072de5ebdddbbcbcbddc5e398a0ff36d3bcf662 Mon Sep 17 00:00:00 2001 From: Hermet Park Date: Thu, 25 Feb 2021 15:59:14 +0900 Subject: [PATCH 02/16] scene: fix a composition regression bug. Pre-condition is broken when this commit come - b60a773d12ef5ab558e95066b2deecea8d859e8c Both condition should be identitcal so that comp logic is perfectly performed. --- src/lib/tvgSceneImpl.h | 22 +++++++++++++--------- 1 file changed, 13 insertions(+), 9 deletions(-) diff --git a/src/lib/tvgSceneImpl.h b/src/lib/tvgSceneImpl.h index 1d28ea5..26269cf 100644 --- a/src/lib/tvgSceneImpl.h +++ b/src/lib/tvgSceneImpl.h @@ -44,12 +44,23 @@ struct Scene::Impl return true; } + bool needComposition(uint32_t opacity) + { + //Half translucent requires intermediate composition. + if (opacity == 255 || opacity == 0) return false; + + //If scene has several children or only scene, it may require composition. + if (paints.count > 1) return true; + if (paints.count == 1 && (*paints.data)->pImpl->type == PaintType::Scene) return true; + return false; + } + void* update(RenderMethod &renderer, const RenderTransform* transform, uint32_t opacity, Array& clips, RenderUpdateFlag flag) { /* Overriding opacity value. If this scene is half-translucent, It must do intermeidate composition with that opacity value. */ this->opacity = static_cast(opacity); - if (opacity > 0) opacity = 255; + if (needComposition(opacity)) opacity = 255; for (auto paint = paints.data; paint < (paints.data + paints.count); ++paint) { (*paint)->pImpl->update(renderer, transform, opacity, clips, static_cast(flag)); @@ -64,14 +75,7 @@ struct Scene::Impl { Compositor* cmp = nullptr; - //If scene has several children or only scene, it may require composition. - auto condition = false; - if ((paints.count > 1) || (paints.count == 1 && (*paints.data)->pImpl->type == PaintType::Scene)) { - condition = true; - } - - //Half translucent. This condition requires intermediate composition. - if ((opacity < 255 && opacity > 0) && condition) { + if (needComposition(opacity)) { uint32_t x, y, w, h; if (!bounds(renderer, &x, &y, &w, &h)) return false; cmp = renderer.target(x, y, w, h); -- 2.7.4 From 3594c66a9819a73c57708207cf6bb97463e2f574 Mon Sep 17 00:00:00 2001 From: Hermet Park Date: Thu, 25 Feb 2021 19:14:23 +0900 Subject: [PATCH 03/16] examples images: correct file change mode. For consistency, thorvg keeps file chmod => 664. --- src/examples/images/bones.svg | 0 src/examples/images/human.svg | 0 src/examples/images/mask-gradient.svg | 0 src/examples/images/mask.svg | 0 4 files changed, 0 insertions(+), 0 deletions(-) mode change 100755 => 100644 src/examples/images/bones.svg mode change 100755 => 100644 src/examples/images/human.svg mode change 100755 => 100644 src/examples/images/mask-gradient.svg mode change 100755 => 100644 src/examples/images/mask.svg diff --git a/src/examples/images/bones.svg b/src/examples/images/bones.svg old mode 100755 new mode 100644 diff --git a/src/examples/images/human.svg b/src/examples/images/human.svg old mode 100755 new mode 100644 diff --git a/src/examples/images/mask-gradient.svg b/src/examples/images/mask-gradient.svg old mode 100755 new mode 100644 diff --git a/src/examples/images/mask.svg b/src/examples/images/mask.svg old mode 100755 new mode 100644 -- 2.7.4 From 274beddd2e12ee78ff9b7027abc6e94971b3f06c Mon Sep 17 00:00:00 2001 From: Juyeong Lee Date: Fri, 26 Feb 2021 01:29:31 +0900 Subject: [PATCH 04/16] Fix typo in CONTRIBUTING.md --- CONTRIBUTING.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index ea5da10..ba3017e 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -58,7 +58,7 @@ You can keep the file name, but don't please contain any prefix(tvg) nor suffix( We introduced new method Paint::composite() to support composite behaviors.
This allows paints to composite with other paints instances.
- Composite behaviors depends on its compoite method type.
+ Composite behaviors depend on its composite method type.
Here we firstly introduced "ClipPath" method to support clipping by path unit of paint.
tagetPaint->composite(srcPaint, CompositeMethod::ClipPath);
-- 2.7.4 From 65fc1939d763937f1326c9616329ad8d2134802b Mon Sep 17 00:00:00 2001 From: Hermet Park Date: Wed, 3 Mar 2021 10:53:32 +0900 Subject: [PATCH 05/16] sw_engine fill: fix wrong gradient transformation There transformation logic was not identical between shape & gradient gradient transform was applied into center of gradient world, while shape wasn't. So... we correct gradient transform metric to shape like. @Issues: 255 --- src/lib/sw_engine/tvgSwFill.cpp | 18 ++++++------------ 1 file changed, 6 insertions(+), 12 deletions(-) diff --git a/src/lib/sw_engine/tvgSwFill.cpp b/src/lib/sw_engine/tvgSwFill.cpp index 654da50..882f3b7 100644 --- a/src/lib/sw_engine/tvgSwFill.cpp +++ b/src/lib/sw_engine/tvgSwFill.cpp @@ -106,18 +106,12 @@ bool _prepareLinear(SwFill* fill, const LinearGradient* linear, const Matrix* tr if (linear->linear(&x1, &y1, &x2, &y2) != Result::Success) return false; if (transform) { - auto sx = sqrt(pow(transform->e11, 2) + pow(transform->e21, 2)); - auto sy = sqrt(pow(transform->e12, 2) + pow(transform->e22, 2)); - auto cx = (x2 - x1) * 0.5f + x1; - auto cy = (y2 - y1) * 0.5f + y1; - auto dx = x1 - cx; - auto dy = y1 - cy; - x1 = dx * transform->e11 + dy * transform->e12 + transform->e13 + (cx * sx); - y1 = dx * transform->e21 + dy * transform->e22 + transform->e23 + (cy * sy); - dx = x2 - cx; - dy = y2 - cy; - x2 = dx * transform->e11 + dy * transform->e12 + transform->e13 + (cx * sx); - y2 = dx * transform->e21 + dy * transform->e22 + transform->e23 + (cy * sy); + auto t1 = x1; + x1 = t1 * transform->e11 + y1 * transform->e12 + transform->e13; + y1 = t1 * transform->e21 + y1 * transform->e22 + transform->e23; + auto t2 = x2; + x2 = t2 * transform->e11 + y2 * transform->e12 + transform->e13; + y2 = t2 * transform->e21 + y2 * transform->e22 + transform->e23; } fill->linear.dx = x2 - x1; -- 2.7.4 From 142960f982dfc962b4807d6dc2ea0a8b6feff785 Mon Sep 17 00:00:00 2001 From: Mira Grudzinska Date: Sun, 28 Feb 2021 13:01:16 +0100 Subject: [PATCH 06/16] canvas: replacement of the bitwise OR operator with the logical one Bitwise logical operators do not perform short-circuiting. --- src/lib/tvgCanvasImpl.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/lib/tvgCanvasImpl.h b/src/lib/tvgCanvasImpl.h index 2e24f18..98dd4b9 100644 --- a/src/lib/tvgCanvasImpl.h +++ b/src/lib/tvgCanvasImpl.h @@ -82,7 +82,7 @@ struct Canvas::Impl Array clips; auto flag = RenderUpdateFlag::None; - if (refresh | force) flag = RenderUpdateFlag::All; + if (refresh || force) flag = RenderUpdateFlag::All; //Update single paint node if (paint) { -- 2.7.4 From 922b7d1843752badeedb13cc52c02a23cae658f8 Mon Sep 17 00:00:00 2001 From: Mira Grudzinska Date: Tue, 2 Mar 2021 15:17:25 +0100 Subject: [PATCH 07/16] svgloader: fillRule value passed to the shape The value was loadeed but not set to the shape. --- src/loaders/svg/tvgSvgSceneBuilder.cpp | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/loaders/svg/tvgSvgSceneBuilder.cpp b/src/loaders/svg/tvgSvgSceneBuilder.cpp index 1414227..e215478 100644 --- a/src/loaders/svg/tvgSvgSceneBuilder.cpp +++ b/src/loaders/svg/tvgSvgSceneBuilder.cpp @@ -233,6 +233,9 @@ void _applyProperty(SvgNode* node, Shape* vg, float vx, float vy, float vw, floa vg->fill(style->fill.paint.r, style->fill.paint.g, style->fill.paint.b, style->fill.opacity); } + //Apply the fill rule + vg->fill((tvg::FillRule)style->fill.fillRule); + //Apply node opacity if (style->opacity < 255) vg->opacity(style->opacity); -- 2.7.4 From 4c1ee6715768a43358edf6cf97b364322aef3d4f Mon Sep 17 00:00:00 2001 From: Mira Grudzinska Date: Thu, 25 Feb 2021 23:43:26 +0100 Subject: [PATCH 08/16] sw_engine fill: fixing the infinite loop condition Fixed in the fillFetchLinear() function. --- src/lib/sw_engine/tvgSwFill.cpp | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/lib/sw_engine/tvgSwFill.cpp b/src/lib/sw_engine/tvgSwFill.cpp index 882f3b7..676cd6e 100644 --- a/src/lib/sw_engine/tvgSwFill.cpp +++ b/src/lib/sw_engine/tvgSwFill.cpp @@ -257,7 +257,8 @@ void fillFetchLinear(const SwFill* fill, uint32_t* dst, uint32_t y, uint32_t x, } //we have to fallback to float math } else { - while (dst < dst + len) { + uint32_t counter = 0; + while (counter++ < len) { *dst = _pixel(fill, t / GRADIENT_STOP_SIZE); ++dst; t += inc; -- 2.7.4 From b03ece6466ecdcd1c95d6dc975dfbbf789ce65ec Mon Sep 17 00:00:00 2001 From: Mira Grudzinska Date: Thu, 4 Mar 2021 01:20:36 +0100 Subject: [PATCH 09/16] svgloader: fixing SVG image display when viewBox size is not given When viewBox is not given its dimensions should be determined by the height and width parameters --- src/loaders/svg/tvgSvgLoader.cpp | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/src/loaders/svg/tvgSvgLoader.cpp b/src/loaders/svg/tvgSvgLoader.cpp index 1585887..f6c9c6e 100644 --- a/src/loaders/svg/tvgSvgLoader.cpp +++ b/src/loaders/svg/tvgSvgLoader.cpp @@ -744,7 +744,7 @@ static bool _attrParseSvgNode(void* data, const char* key, const char* value) if (!strcmp(value, "none")) doc->preserveAspect = false; } else if (!strcmp(key, "style")) { return simpleXmlParseW3CAttribute(value, _parseStyleAttr, loader); - } + } #ifdef THORVG_LOG_ENABLED else if (!strcmp(key, "xmlns") || !strcmp(key, "xmlns:xlink") || !strcmp (key, "xmlns:svg")) { //No action @@ -2607,8 +2607,14 @@ bool SvgLoader::header() h = vh = loaderData.doc->node.doc.vh; //Override size - if (loaderData.doc->node.doc.w > 0) w = loaderData.doc->node.doc.w; - if (loaderData.doc->node.doc.h > 0) h = loaderData.doc->node.doc.h; + if (loaderData.doc->node.doc.w > 0) { + w = loaderData.doc->node.doc.w; + if (vw < FLT_EPSILON) vw = w; + } + if (loaderData.doc->node.doc.h > 0) { + h = loaderData.doc->node.doc.h; + if (vh < FLT_EPSILON) vh = h; + } preserveAspect = loaderData.doc->node.doc.preserveAspect; } else { -- 2.7.4 From cfc01de82742b73f2e1ea90f6414e287fa20292f Mon Sep 17 00:00:00 2001 From: Hermet Park Date: Thu, 4 Mar 2021 11:14:16 +0900 Subject: [PATCH 10/16] capi: fix incorrect composite api. Api prototype is completely wrong, now it's corrected. --- inc/thorvg_capi.h | 9 +++++---- src/bindings/capi/tvgCapi.cpp | 4 ++-- 2 files changed, 7 insertions(+), 6 deletions(-) diff --git a/inc/thorvg_capi.h b/inc/thorvg_capi.h index 25ccbdb..87c9476 100644 --- a/inc/thorvg_capi.h +++ b/inc/thorvg_capi.h @@ -579,15 +579,16 @@ TVG_EXPORT Tvg_Paint* tvg_paint_duplicate(Tvg_Paint* paint); TVG_EXPORT Tvg_Result tvg_paint_get_bounds(const Tvg_Paint* paint, float* x, float* y, float* w, float* h); /*! -* \fn TVG_EXPORT Tvg_Result tvg_paint_set_composite_method(const Tvg_Paint* paint, Tvg_Composite_Method method) -* \brief The function set composition method -* \param[in] paint Tvg_Paint pointer +* \fn TVG_EXPORT Tvg_Result tvg_paint_set_composite_method(Tvg_Paint* paint, Tvg_Paint* target, Tvg_Composite_Method method) +* \brief The function set composition method. +* \param[in] paint Tvg_Paint composition source +* \param[in] target Tvg_Paint composition target * \param[in] method Tvg_Composite_Method used composite method * \return Tvg_Result return value * - TVG_RESULT_SUCCESS: if ok. * - TVG_RESULT_INVALID_PARAMETERS: if paint is invalid */ -TVG_EXPORT Tvg_Result tvg_paint_set_composite_method(const Tvg_Paint* paint, Tvg_Composite_Method method); +TVG_EXPORT Tvg_Result tvg_paint_set_composite_method(Tvg_Paint* paint, Tvg_Paint* target, Tvg_Composite_Method method); /************************************************************************/ /* Shape API */ diff --git a/src/bindings/capi/tvgCapi.cpp b/src/bindings/capi/tvgCapi.cpp index 410a08f..1384f2c 100644 --- a/src/bindings/capi/tvgCapi.cpp +++ b/src/bindings/capi/tvgCapi.cpp @@ -191,10 +191,10 @@ TVG_EXPORT Tvg_Result tvg_paint_get_bounds(const Tvg_Paint* paint, float* x, flo return (Tvg_Result) reinterpret_cast(paint)->bounds(x, y, w, h); } -TVG_EXPORT Tvg_Result tvg_paint_set_composite_method(const Tvg_Paint* paint, Tvg_Composite_Method method) +TVG_EXPORT Tvg_Result tvg_paint_set_composite_method(Tvg_Paint* paint, Tvg_Paint* target, Tvg_Composite_Method method) { if (!paint) return TVG_RESULT_INVALID_ARGUMENT; - return (Tvg_Result) reinterpret_cast(paint)->composite(unique_ptr((Paint*)(paint)), (CompositeMethod)method); + return (Tvg_Result) reinterpret_cast(paint)->composite(unique_ptr((Paint*)(target)), (CompositeMethod)method); } /************************************************************************/ -- 2.7.4 From 1d6ab0f7fc02c4ec2893c577608e79633dad51a0 Mon Sep 17 00:00:00 2001 From: Mira Grudzinska Date: Thu, 4 Mar 2021 01:07:42 +0100 Subject: [PATCH 11/16] svgloader: fixing linear gradient transformation Gradient stop points were incorrectly transformed when building the scene in the SVG loader. --- src/loaders/svg/tvgSvgSceneBuilder.cpp | 22 ++++++++++------------ 1 file changed, 10 insertions(+), 12 deletions(-) diff --git a/src/loaders/svg/tvgSvgSceneBuilder.cpp b/src/loaders/svg/tvgSvgSceneBuilder.cpp index e215478..38b3b6e 100644 --- a/src/loaders/svg/tvgSvgSceneBuilder.cpp +++ b/src/loaders/svg/tvgSvgSceneBuilder.cpp @@ -77,17 +77,15 @@ unique_ptr _applyLinearGradientProperty(SvgStyleGradient* g, con } if (g->transform) { - float cy = ((float) rh) * 0.5 + ry; - float cx = ((float) rw) * 0.5 + rx; - - //= T(x - cx, y - cy) x g->transform x T(cx, cy) - //Calc start point - g->linear->x1 = (g->transform->e11 * cx) + (g->transform->e12 * cy) + g->linear->x1 + g->transform->e13 - cx; - g->linear->y1 = (g->transform->e21 * cx) + (g->transform->e22 * cy) + g->linear->y1 + g->transform->e23 - cy; - - //Calc end point - g->linear->x2 = (g->transform->e11 * cx) + (g->transform->e12 * cy) + g->linear->x2 + g->transform->e13 - cx; - g->linear->y2 = (g->transform->e21 * cx) + (g->transform->e22 * cy) + g->linear->y2 + g->transform->e23 - cy; + //Calc start point + auto x = g->linear->x1; + g->linear->x1 = x * g->transform->e11 + g->linear->y1 * g->transform->e12 + g->transform->e13; + g->linear->y1 = x * g->transform->e21 + g->linear->y1 * g->transform->e22 + g->transform->e23; + + //Calc end point + x = g->linear->x2; + g->linear->x2 = x * g->transform->e11 + g->linear->y2 * g->transform->e12 + g->transform->e13; + g->linear->y2 = x * g->transform->e21 + g->linear->y2 * g->transform->e22 + g->transform->e23; } fillGrad->linear(g->linear->x1, g->linear->y1, g->linear->x2, g->linear->y2); @@ -276,7 +274,7 @@ void _applyProperty(SvgNode* node, Shape* vg, float vx, float vy, float vw, floa vg->composite(move(comp), CompositeMethod::ClipPath); } } - //Composite Alpha Mask + //Composite Alpha Mask if (((int)style->comp.flags & (int)SvgCompositeFlags::AlphaMask)) { auto compNode = style->comp.node; if (compNode->child.count > 0) { -- 2.7.4 From 228f904a4ce0168b09a079e798ed83d08b4d0bfd Mon Sep 17 00:00:00 2001 From: JunsuChoi Date: Thu, 4 Mar 2021 11:26:52 +0900 Subject: [PATCH 12/16] svg_loader SvgLoader: Fix copy conditions for stop of gradient When getting a linked stop list, if there is no existing stop list in current gradient, it is copied. --- src/loaders/svg/tvgSvgLoader.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/loaders/svg/tvgSvgLoader.cpp b/src/loaders/svg/tvgSvgLoader.cpp index f6c9c6e..1afb338 100644 --- a/src/loaders/svg/tvgSvgLoader.cpp +++ b/src/loaders/svg/tvgSvgLoader.cpp @@ -2375,7 +2375,7 @@ static SvgStyleGradient* _gradientDup(Array* gradients, const gradList = gradients->data; for (uint32_t i = 0; i < gradients->count; ++i) { if (!((*gradList)->id->compare(*result->ref))) { - if (result->stops.count > 0) { + if (result->stops.count == 0) { _cloneGradStops(&result->stops, &(*gradList)->stops); } //TODO: Properly inherit other property -- 2.7.4 From a0841563633633cf1001db4fb1085ac6c53996be Mon Sep 17 00:00:00 2001 From: JunsuChoi Date: Fri, 5 Mar 2021 12:40:18 +0900 Subject: [PATCH 13/16] svg_loader SvgPath: Remove unnecessary optimization code This condition(optimization) is not a step suggested by arc implementation. https://www.w3.org/TR/SVG11/implnote.html#ArcCorrectionOutOfRangeRadii (Step2) This code is useful if the arc is too small to represent. However, scaling often occurs in vectors, which can create unnecessary problems. example path --- src/loaders/svg/tvgSvgPath.cpp | 7 ------- 1 file changed, 7 deletions(-) diff --git a/src/loaders/svg/tvgSvgPath.cpp b/src/loaders/svg/tvgSvgPath.cpp index 880cd7b..c0bc450 100644 --- a/src/loaders/svg/tvgSvgPath.cpp +++ b/src/loaders/svg/tvgSvgPath.cpp @@ -90,13 +90,6 @@ void _pathAppendArcTo(Array* cmds, Array* pts, Point* cur, P //Correction of out-of-range radii, see F6.6.1 (step 2) rx = fabsf(rx); ry = fabsf(ry); - if ((rx < 0.5f) || (ry < 0.5f)) { - Point p = {x, y}; - cmds->push(PathCommand::LineTo); - pts->push(p); - *cur = p; - return; - } angle = angle * M_PI / 180.0f; cosPhi = cosf(angle); -- 2.7.4 From c7c6f33536a6e5cc7470cab6dea7b4ed78d16fad Mon Sep 17 00:00:00 2001 From: Hermet Park Date: Sun, 7 Mar 2021 11:58:01 +0900 Subject: [PATCH 14/16] Update README.md updated svg part. --- README.md | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index b907c58..0a12d7f 100644 --- a/README.md +++ b/README.md @@ -141,7 +141,15 @@ This path drawing result shows like this.

-Next, this code snippet shows you how to draw SVG image. +## SVG (Scalable Vector Graphics) + +ThorVG supports SVG rendering through its own SVG interpreter. It basically aims to satisfy with [SVG Tiny Specification](https://www.w3.org/TR/SVGTiny12/) for the lightweight system such as embeded. Most cases ThorVG supports the SVG spec fully but some partial SVG features were not supported officially yet. Next list shows the unsupported features by ThorVG. + + - CSS Styles + - Filters + - Images + +Next code snippet shows you how to draw SVG image using ThorVG. ```cpp auto picture = tvg::Picture::gen(); //generate a picture -- 2.7.4 From a4bc97646ef3c3455124c3af470d0eff71287ade Mon Sep 17 00:00:00 2001 From: Hermet Park Date: Sun, 7 Mar 2021 12:05:58 +0900 Subject: [PATCH 15/16] Update README.md --- README.md | 36 ++++++++++++++++++++---------------- 1 file changed, 20 insertions(+), 16 deletions(-) diff --git a/README.md b/README.md index 0a12d7f..7b2a73b 100644 --- a/README.md +++ b/README.md @@ -31,6 +31,7 @@ Basically your program could use this library functions by calling slick and nea - [Building ThorVG](#building-thorvg) - [Meson Build](#meson-build) - [Quick Start](#quick-start) +- [SVG](#svg) - [Examples](#examples) - [Tools](#tools) - [ThorVG Viewer](#thorvg-viewer) @@ -141,9 +142,26 @@ This path drawing result shows like this.

-## SVG (Scalable Vector Graphics) +Now begin rendering & finish it at a particular time. -ThorVG supports SVG rendering through its own SVG interpreter. It basically aims to satisfy with [SVG Tiny Specification](https://www.w3.org/TR/SVGTiny12/) for the lightweight system such as embeded. Most cases ThorVG supports the SVG spec fully but some partial SVG features were not supported officially yet. Next list shows the unsupported features by ThorVG. +```cpp +canvas->draw(); +canvas->sync(); +``` + +Then you can acquire the rendered image from the buffer memory. + +Lastly, terminate the engine after usage. + +```cpp +tvg::Initializer::term(tvg::CanvasEngine::Sw); +``` +[Back to contents](#contents) +
+
+## SVG + +ThorVG supports SVG(Scalable Vector Graphics) rendering through its own SVG interpreter. It basically aims to satisfy with [SVG Tiny Specification](https://www.w3.org/TR/SVGTiny12/) for the lightweight system such as embeded. Most cases ThorVG supports the SVG spec fully but some partial SVG features were not supported officially yet. Next list shows the unsupported features by ThorVG. - CSS Styles - Filters @@ -163,20 +181,6 @@ And here is the result.

-Begin rendering & finish it at a particular time. - -```cpp -canvas->draw(); -canvas->sync(); -``` - -Now you can acquire the rendered image from the buffer memory. - -Lastly, terminate the engine after usage. - -```cpp -tvg::Initializer::term(tvg::CanvasEngine::Sw); -``` [Back to contents](#contents)

-- 2.7.4 From b196b4a82b5dc7c68ca0b61113ff770dba8f9c0a Mon Sep 17 00:00:00 2001 From: Hermet Park Date: Tue, 9 Mar 2021 14:26:50 +0900 Subject: [PATCH 16/16] bump up version. Change-Id: I664ef791eef4afac8ce5b8ecc9dec7166a6f6c52 --- packaging/thorvg.spec | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packaging/thorvg.spec b/packaging/thorvg.spec index 8b7f6f5..b9e3aa6 100644 --- a/packaging/thorvg.spec +++ b/packaging/thorvg.spec @@ -1,6 +1,6 @@ Name: thorvg Summary: Thor Vector Graphics Library -Version: 0.0.1 +Version: 0.0.2 Release: 1 Group: Graphics System/Rendering Engine License: MIT -- 2.7.4