1 [![Build Status](https://travis-ci.org/Samsung/thorvg.svg?branch=master)](https://travis-ci.org/Samsung/thorvg)
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 - Paints: Line, Arc, Curve, Path, Shapes, Polygons
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, Bitmap, ...
20 <img width="930" height="212" 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)
34 - [Examples](#examples)
36 - [ThorVG Viewer](#thorvg-viewer)
37 - [SVG to PNG](#svg-to-png)
38 - [API Bindings](#api-bindings)
39 - [Issues or Feature Requests?](#issues-or-feature-requests)
44 Basically, ThorVG supports [meson](https://mesonbuild.com/) build system.
47 Install [meson](http://mesonbuild.com/Getting-meson.html) and [ninja](https://ninja-build.org/) if not already installed.
49 Run meson to configure ThorVG.
53 Run ninja to build & install ThorVG.
55 ninja -C build install
57 [Back to contents](#contents)
61 ThorVG renders vector shapes on a given canvas buffer. Here shows quick start to learn basic API usages.
63 First, You can initialize ThorVG engine.
66 tvg::Initializer::init(tvg::CanvasEngine::Sw, 0); //engine method, thread count
69 You can prepare a empty canvas for drawing on it.
72 static uint32_t buffer[WIDTH * HEIGHT]; //canvas target buffer
74 auto canvas = tvg::SwCanvas::gen(); //generate a canvas
75 canvas->target(buffer, WIDTH, WIDTH, HEIGHT); //stride, w, h
78 Next you can draw multiple shapes onto the canvas.
81 auto rect = tvg::Shape::gen(); //generate a round rectangle
82 rect->appendRect(50, 50, 200, 200, 20, 20); //round geometry(x, y, w, h, rx, ry)
83 rect->fill(100, 100, 0, 255); //round rectangle color (r, g, b, a)
84 canvas->push(move(rect)); //push round rectangle drawing command
86 auto circle = tvg::Shape::gen(); //generate a circle
87 circle->appendCircle(400, 400, 100, 100); //circle geometry(cx, cy, radiusW, radiusH)
89 auto fill = tvg::RadialGradient::gen(); //generate radial gradient for circle fill
90 fill->radial(400, 400, 150); //radial fill info(cx, cy, radius)
92 tvg::Fill::ColorStop colorStops[2]; //gradient color info
93 colorStops[0] = {0, 255, 255, 255, 255}; //index, r, g, b, a (1st color value)
94 colorStops[1] = {1, 0, 0, 0, 255}; //index, r, g, b, a (2nd color value)
95 fill.colorStops(colorStop, 2); //set fil with gradient color info
97 circle->fill(move(fill)); //circle color
98 canvas->push(move(circle)); //push circle drawing command
102 This code result looks like this.
105 <img width="416" height="411" src="https://github.com/Samsung/thorvg/blob/master/res/example_shapes.png">
108 Or you can draw pathes with dash stroking.
111 auto path = tvg::Shape::gen(); //generate a path
112 path->moveTo(199, 34); //set sequential path coordinates
113 path->lineTo(253, 143);
114 path->lineTo(374, 160);
115 path->lineTo(287, 244);
116 path->lineTo(307, 365);
117 path->lineTo(199, 309);
118 path->lineTo(97, 365);
119 path->lineTo(112, 245);
120 path->lineTo(26, 161);
121 path->lineTo(146, 143);
124 path->fill(150, 150, 255, 255); //path color
126 path->stroke(3); //stroke width
127 path->stroke(0, 0, 255, 255); //stroke color
128 path->stroke(tvg::StrokeJoin::Round); //stroke join style
129 path->stroke(tvg::StrokeCap::Round); //stroke cap style
131 float pattern[2] = {10, 10};
132 path->stroke(pattern, 2); //stroke dash pattern (line, gap)
134 canvas->push(move(path)); //push path drawing command
138 This path drawing result shows like this.
141 <img width="300" height="300" src="https://github.com/Samsung/thorvg/blob/master/res/example_path.png">
144 Next, this code snippet shows you how to draw SVG image.
147 auto picture = tvg::Picture::gen(); //generate a picture
148 picture->load("tiger.svg"); //Load SVG file.
149 canvas->push(move(picture)); //push picture drawing command
152 And here is the result.
155 <img width="300" height="300" src="https://github.com/Samsung/thorvg/blob/master/res/example_tiger.png">
158 Begin rendering & finish it at a particular time.
165 Now you can acquire the rendered image from the buffer memory.
167 Lastly, terminate the engine after usage.
170 tvg::Initializer::term(tvg::CanvasEngine::Sw);
172 [Back to contents](#contents)
176 There are various examples to understand ThorVG APIs, Please check sample code in `thorvg/src/examples`
178 To execute examples, you can build them with this meson option.
180 meson -Dexamples=true . build
182 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.
184 [Back to contents](#contents)
189 [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.
191 [Back to contents](#contents)
195 ThorVG provides an executable `svg2png` converter which generate a PNG file from a SVG file.
197 To use `svg2png`, you must turn on its feature in the build option.
199 meson -Dtools=svg2png . build
201 Alternatively, you can add `svg2png` value to `tools` option in `meson_option.txt`. Build output will be located in `{builddir}/src/bin/svg2png/`
203 For more information, see `svg2png` usages:
206 svg2png [svgFileName] [Resolution] [bgColor]
210 $ svg2png input.svg 200x200
211 $ svg2png input.svg 200x200 ff00ff
213 [Back to contents](#contents)
217 Our main development APIs are written in C++ but ThorVG also provides API bindings such as: C.
219 [Back to contents](#contents)
222 ## Issues or Feature Requests?
223 For immediate assistant or support please reach us in [Gitter](https://gitter.im/thorvg/community)