1 [![Continuous-integration](https://github.com/Samsung/thorvg/actions/workflows/actions.yml/badge.svg)](https://github.com/Samsung/thorvg/actions/workflows/actions.yml)
2 [![Gitter](https://badges.gitter.im/thorvg/community.svg)](https://gitter.im/thorvg/community?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge)
7 <img width="500" height="346" src="https://github.com/Samsung/thorvg/blob/master/res/thorvg_card2.png">
10 ThorVG is a platform-independent portable library for drawing vector-based shapes and images. It's written in C++, no dependencies and keeps super compact size. <br />
12 The next list shows drawing primitives ThorVG providing.<br />
13 - Shapes: Line, Arc, Curve, Path, Polygon, etc
14 - Filling: Solid, Linear, Radial Gradient
15 - Scene Graph & Affine Transformation (translation, rotation, scale ...)
16 - Stroking: Width, Join, Cap, Dash
17 - Composition: Blending, Masking, Path Clipping, etc
18 - Pictures: SVG, PNG, Bitmap, ...
20 <img width="930" height="473" src="https://github.com/Samsung/thorvg/blob/master/res/example_primitives.png">
23 Basically your program could use this library functions by calling slick and neat apis while switching drawing context (if you have your own drawing engine), ThorVG serializes drawing commands among volatile paints node, performs sync/asynchronous rendering by its decent engines. The engine is suggested to immediate rendering method so that your system could adaptively integrate with it. ThorVG supports vector images such as SVG, also will support coming popular formats by demands. On rendering, it might introduce intermediate frame buffers for compositing vector scenes but only when it's necessary and these are temporarily used for saving memory. Next figure shows you a brief strategy how to use ThorVG in your system.<br />
26 <img width="900" height="288" src="https://github.com/Samsung/thorvg/blob/master/res/example_flow.png">
31 - [Building ThorVG](#building-thorvg)
32 - [Meson Build](#meson-build)
33 - [Quick Start](#quick-start)
35 - [Practices](#practices)
38 - [Examples](#examples)
40 - [ThorVG Viewer](#thorvg-viewer)
41 - [SVG to PNG](#svg-to-png)
42 - [API Bindings](#api-bindings)
43 - [Issues or Feature Requests?](#issues-or-feature-requests)
48 Basically, ThorVG supports [meson](https://mesonbuild.com/) build system.
51 Install [meson](http://mesonbuild.com/Getting-meson.html) and [ninja](https://ninja-build.org/) if not already installed.
53 Run meson to configure ThorVG.
57 Run ninja to build & install ThorVG.
59 ninja -C build install
61 [Back to contents](#contents)
65 ThorVG renders vector shapes on a given canvas buffer. Here shows quick start to learn basic API usages.
67 First, You can initialize ThorVG engine.
70 tvg::Initializer::init(tvg::CanvasEngine::Sw, 0); //engine method, thread count
73 You can prepare a empty canvas for drawing on it.
76 static uint32_t buffer[WIDTH * HEIGHT]; //canvas target buffer
78 auto canvas = tvg::SwCanvas::gen(); //generate a canvas
79 canvas->target(buffer, WIDTH, WIDTH, HEIGHT); //stride, w, h
82 Next you can draw multiple shapes onto the canvas.
85 auto rect = tvg::Shape::gen(); //generate a round rectangle
86 rect->appendRect(50, 50, 200, 200, 20, 20); //round geometry(x, y, w, h, rx, ry)
87 rect->fill(100, 100, 0, 255); //round rectangle color (r, g, b, a)
88 canvas->push(move(rect)); //push round rectangle drawing command
90 auto circle = tvg::Shape::gen(); //generate a circle
91 circle->appendCircle(400, 400, 100, 100); //circle geometry(cx, cy, radiusW, radiusH)
93 auto fill = tvg::RadialGradient::gen(); //generate radial gradient for circle fill
94 fill->radial(400, 400, 150); //radial fill info(cx, cy, radius)
96 tvg::Fill::ColorStop colorStops[2]; //gradient color info
97 colorStops[0] = {0, 255, 255, 255, 255}; //index, r, g, b, a (1st color value)
98 colorStops[1] = {1, 0, 0, 0, 255}; //index, r, g, b, a (2nd color value)
99 fill.colorStops(colorStop, 2); //set fil with gradient color info
101 circle->fill(move(fill)); //circle color
102 canvas->push(move(circle)); //push circle drawing command
106 This code result looks like this.
109 <img width="416" height="411" src="https://github.com/Samsung/thorvg/blob/master/res/example_shapes.png">
112 Or you can draw pathes with dash stroking.
115 auto path = tvg::Shape::gen(); //generate a path
116 path->moveTo(199, 34); //set sequential path coordinates
117 path->lineTo(253, 143);
118 path->lineTo(374, 160);
119 path->lineTo(287, 244);
120 path->lineTo(307, 365);
121 path->lineTo(199, 309);
122 path->lineTo(97, 365);
123 path->lineTo(112, 245);
124 path->lineTo(26, 161);
125 path->lineTo(146, 143);
128 path->fill(150, 150, 255, 255); //path color
130 path->stroke(3); //stroke width
131 path->stroke(0, 0, 255, 255); //stroke color
132 path->stroke(tvg::StrokeJoin::Round); //stroke join style
133 path->stroke(tvg::StrokeCap::Round); //stroke cap style
135 float pattern[2] = {10, 10};
136 path->stroke(pattern, 2); //stroke dash pattern (line, gap)
138 canvas->push(move(path)); //push path drawing command
142 This path drawing result shows like this.
145 <img width="300" height="300" src="https://github.com/Samsung/thorvg/blob/master/res/example_path.png">
148 Now begin rendering & finish it at a particular time.
155 Then you can acquire the rendered image from the buffer memory.
157 Lastly, terminate the engine after usage.
160 tvg::Initializer::term(tvg::CanvasEngine::Sw);
162 [Back to contents](#contents)
167 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.
173 Next code snippet shows you how to draw SVG image using ThorVG.
176 auto picture = tvg::Picture::gen(); //generate a picture
177 picture->load("tiger.svg"); //Load SVG file.
178 canvas->push(move(picture)); //push picture drawing command
181 And here is the result.
184 <img width="300" height="300" src="https://github.com/Samsung/thorvg/blob/master/res/example_tiger.png">
187 [Back to contents](#contents)
192 ThorVG is integrated in [Tizen](https://www.tizen.org) platform as the vector graphics engine, it's being used for vector primitive drawings and scalable image contents such as SVG, Lottie Animation among the Tizen powered products.
195 <img width="798" height="285" src="https://github.com/Samsung/thorvg/blob/master/res/example_tizen.png">
198 [Back to contents](#contents)
202 We're also building a [Rive](https://rive.app/) port which supports Rive Animation run through ThorVG backend. Rive is a new modern animation platform that supports fancy user interactive vector animation. See project [Rive-Tizen](https://github.com/rive-app/rive-tizen) at [Github](https://github.com/rive-app/)
205 <img width="600" height="324" src="https://github.com/Samsung/thorvg/blob/master/res/example_rive.gif">
208 [Back to contents](#contents)
212 There are various examples to understand ThorVG APIs, Please check sample code in `thorvg/src/examples`
214 To execute examples, you can build them with this meson option.
216 meson -Dexamples=true . build
218 Note that these examples are required EFL `elementary` package for launching. If you're using Linux-based OS, you could easily install its package from your OS distribution server. Otherwise, please visit the official [EFL page](https://enlightenment.org/) for more information.
220 [Back to contents](#contents)
225 [ThorVG viewer](https://samsung.github.io/thorvg.viewer) supports immediate rendering through your browser. You can drag & drop SVG files on the page, see the rendering result on the spot.
227 [Back to contents](#contents)
231 ThorVG provides an executable `svg2png` converter which generate a PNG file from a SVG file.
233 To use `svg2png`, you must turn on its feature in the build option.
235 meson -Dtools=svg2png . build
237 Alternatively, you can add `svg2png` value to `tools` option in `meson_option.txt`. Build output will be located in `{builddir}/src/bin/svg2png/`
239 For more information, see `svg2png` usages:
242 svg2png [svgFileName] [Resolution] [bgColor]
246 $ svg2png input.svg 200x200
247 $ svg2png input.svg 200x200 ff00ff
249 [Back to contents](#contents)
253 Our main development APIs are written in C++ but ThorVG also provides API bindings such as: C.
255 [Back to contents](#contents)
258 ## Issues or Feature Requests?
259 For immediate assistant or support please reach us in [Gitter](https://gitter.im/thorvg/community)