A Node.JS binding for librsvg.
Install the librsvg library and header files. Usually you have to look for a development package version. You must also have a functioning build tool chain including pkg-config. You can find instructions for different operating systems below:
-
Ubuntu:
sudo apt-get install librsvg2-dev
-
Mac OS X:
brew install librsvg
If, after installing LibRSVG through homebrew you are experiencing not found issues when installing this module, try manually exporting the package config path for any not found package with a command like this:
export PKG_CONFIG_PATH=/usr/local/opt/zlib/lib/pkgconfig
Then try reinstalling this module.
-
Windows:
Install msys2. Follow the instructions to ensure all packages are up-to-date. The installer defaults to install at C:\msys64. If you install to a different path you will need to update the GTK_Root variable in binding.gyp.
Install build tools and librsvg via the pacman package manager:
pacman -S mingw-w64-x86_64-toolchain base-devel pacman -S mingw-w64-x86_64-librsvg
Install Node.JS LTS for your platform, currently the latest v10.
Install the C++ build tools node-gyp by following the installation instructions.
Install sevruga into your project by running the npm install command in its root folder:
npm install sevruga
Note that the --save
option is now the default.
- Clone this project with
git clone https://github.com/Streampunk/sevruga.git
- Enter the project folder with
cd sevruga
- Run
npm install
sevruga exports the function renderSVG that returns a promise that will be resolved when the supplied SVG data has been parsed and rendered to the supplied buffer according to the supplied width and height parameters. Timing parameters for the stages of render are available from the returned object as shown in the example below.
renderSVG requires three parameters:
- A string containing the svg definition
- An allocated buffer of sufficient size for the render results.
- A params object which must include width and height members. An optional pngPath can be provided which if present will cause the output of a png version of the render result at the path provided.
const sevruga = require('sevruga');
const fs = require('fs');
async function svgTest() {
const svgStr = fs.readFileSync(`${__dirname}/svg/Test.svg`, { encoding: 'utf8' }); // returns a string
const params = { width: 1920, height: 1080 };
const renderBuf = Buffer.alloc(params.width * params.height * 4); // ARGB 8-bit per component
const t = await sevruga.renderSVG(svgStr, renderBuf, params);
console.log(`Parse: ${t.parseTime}, Render: ${t.renderTime}, Total: ${t.totalTime}`);
}
svgTest()
.catch(err => console.log(`Sevruga render failed: ${err}`));
A Node.js transform stream implementation is also available. This allows a stream of SVG files to be processed, producing a stream of rendered buffers. This approach supports back-pressure so that there will be a limit on resources consumed.
const sevruga = require('../index.js');
const fs = require('fs');
function svgStreamTest() {
const svgStr = fs.readFileSync(`${__dirname}/svg/Test.svg`, { encoding: 'utf8' });
const params = { width: 1920, height: 1080 };
svgStream = sevruga.createRenderStream(params)
svgStream.on('data', buf => {
const t = buf.timings;
console.log(`Parse: ${t.parseTime}, Render: ${t.renderTime}, Total: ${t.totalTime}`);
});
svgStream.on('error', console.error);
let i = 10;
const write = str => {
var ok = true;
do {
i -= 1;
if (i === 0) {
// last time!
svgStream.end(str);
} else {
ok = svgStream.write(str, 'utf8');
// console.log('Write data', ok);
}
} while (i > 0 && ok);
if (i > 0) {
// had to stop early!
// write some more once it drains
// console.log("So draining.");
svgStream.once('drain', () => write(svgStr));
}
}
write(svgStr);
}
svgStreamTest();
Contributions can be made via pull requests and will be considered by the author on their merits. Enhancement requests and bug reports should be raised as github issues. For support, please contact Streampunk Media.
This software is released under the Apache 2.0 license. Copyright 2018 Streampunk Media Ltd.