js-draw
Version:
Draw pictures using a pen, touchscreen, or mouse! JS-draw is a drawing library for JavaScript and TypeScript.
56 lines (55 loc) • 2.27 kB
JavaScript
import { Rect2 } from '@js-draw/math';
import SVGRenderer from '../../rendering/renderers/SVGRenderer.mjs';
import { svgLoaderAutoresizeClassName } from '../../SVGLoader/SVGLoader.mjs';
import adjustExportedSVGSize from './adjustExportedSVGSize.mjs';
const toSVGInternal = (image, renderFunction, options) => {
const importExportViewport = image.getImportExportViewport().getTemporaryClone();
// If the rectangle has zero width or height, its size can't be increased
// -- set its size to the minimum.
if (options?.minDimension) {
const originalRect = importExportViewport.visibleRect;
let rect = originalRect;
if (rect.w <= 0) {
rect = new Rect2(rect.x, rect.y, options.minDimension, rect.h);
}
if (rect.h <= 0) {
rect = new Rect2(rect.x, rect.y, rect.w, options.minDimension);
}
if (!rect.eq(originalRect)) {
importExportViewport.updateScreenSize(rect.size);
}
}
const { element: result, renderer } = SVGRenderer.fromViewport(importExportViewport, {
sanitize: options.sanitize ?? false,
useViewBoxForPositioning: true,
});
// Use a callback rather than async/await to allow this function to create
// both sync and async render functions
renderFunction(renderer, () => {
if (image.getAutoresizeEnabled()) {
result.classList.add(svgLoaderAutoresizeClassName);
}
else {
result.classList.remove(svgLoaderAutoresizeClassName);
}
const exportRect = importExportViewport.visibleRect;
adjustExportedSVGSize(result, exportRect, options);
return result;
});
return result;
};
export const editorImageToSVGSync = (image, options) => {
return toSVGInternal(image, (renderer, onComplete) => {
image.renderAll(renderer);
onComplete();
}, options);
};
export const editorImageToSVGAsync = (image, preRenderComponent, options) => {
return new Promise((resolve) => {
toSVGInternal(image, async (renderer, onComplete) => {
await image.renderAllAsync(renderer, preRenderComponent);
const result = onComplete();
resolve(result);
}, options);
});
};