mirror of
https://github.com/visioncortex/vtracer.git
synced 2026-08-31 17:35:54 -07:00
f4fe428038
Config(simplify=...) / property in Python; simplify option in Node, with the tolerance documented in .pyi, index.d.ts, and both READMEs. The Node README's option list also catches up with the clustering rename and the binary/watershed options, and test.js drops the stale colorMode key (silently ignored since the rename, so its bw assertion was testing the default path) and asserts simplify shrinks output.
61 lines
2.5 KiB
JavaScript
61 lines
2.5 KiB
JavaScript
'use strict';
|
|
const assert = require('assert');
|
|
const fs = require('fs');
|
|
const path = require('path');
|
|
const vtracer = require('./index.js');
|
|
|
|
const SAMPLE = path.join(__dirname, '..', 'docs', 'assets', 'samples', 'tank-unit-preview.png');
|
|
const data = fs.readFileSync(SAMPLE);
|
|
|
|
// encoded bytes, default options
|
|
let svg = vtracer.convertBuffer(data);
|
|
assert(svg.includes('<svg') && svg.includes('<path'), 'default convertBuffer');
|
|
console.log('convertBuffer default:', (svg.match(/<path/g) || []).length, 'paths');
|
|
|
|
// options: bw clustering -> all black
|
|
svg = vtracer.convertBuffer(data, { clustering: 'bw' });
|
|
assert(svg.includes('fill="#000000"'), 'bw produces black');
|
|
console.log('convertBuffer bw:', (svg.match(/<path/g) || []).length, 'paths');
|
|
|
|
// curve simplification shrinks the output
|
|
{
|
|
const plain = vtracer.convertBuffer(data);
|
|
const simplified = vtracer.convertBuffer(data, { simplify: 2 });
|
|
assert(simplified.length < plain.length, 'simplify shrinks output');
|
|
console.log('convertBuffer simplify:', plain.length, '->', simplified.length, 'bytes');
|
|
}
|
|
|
|
// options: mosaic + polygon + palette
|
|
svg = vtracer.convertBuffer(data, { hierarchical: 'cutout', mode: 'polygon', palette: ['#000000', '#ffffff'], optimize: 2 });
|
|
assert(svg.includes('<svg'), 'mosaic+palette');
|
|
console.log('convertBuffer cutout/polygon/palette:', (svg.match(/<path/g) || []).length, 'paths');
|
|
|
|
// preset
|
|
svg = vtracer.convertBuffer(data, { preset: 'poster' });
|
|
console.log('convertBuffer poster:', (svg.match(/<path/g) || []).length, 'paths');
|
|
|
|
// raw pixels: 20x20, left red / right blue
|
|
const w = 20, h = 20;
|
|
const rgba = Buffer.alloc(w * h * 4);
|
|
for (let y = 0; y < h; y++) for (let x = 0; x < w; x++) {
|
|
const i = (y * w + x) * 4;
|
|
const [r, g, b] = x < w / 2 ? [220, 40, 40] : [40, 40, 220];
|
|
rgba[i] = r; rgba[i + 1] = g; rgba[i + 2] = b; rgba[i + 3] = 255;
|
|
}
|
|
svg = vtracer.convertPixels(rgba, w, h);
|
|
assert(svg.includes('<svg'), 'convertPixels');
|
|
console.log('convertPixels:', (svg.match(/<path/g) || []).length, 'paths');
|
|
|
|
// file I/O
|
|
const out = path.join(require('os').tmpdir(), 'vtracer_node_out.svg');
|
|
vtracer.convertFileSync(SAMPLE, out, { mode: 'spline' });
|
|
assert(fs.statSync(out).size > 0, 'convertFileSync wrote file');
|
|
console.log('convertFileSync wrote:', fs.statSync(out).size, 'bytes');
|
|
|
|
// error handling
|
|
assert.throws(() => vtracer.convertBuffer(data, { palette: ['nope'] }), /rrggbb/, 'bad palette rejected');
|
|
assert.throws(() => vtracer.convertPixels(Buffer.alloc(8), 10, 10), /rgba length/, 'bad pixel length rejected');
|
|
console.log('errors rejected OK');
|
|
|
|
console.log('ALL OK');
|