UNPKG

core-graphics

Version:

A core library for creating shape-based graphic editors

128 lines (110 loc) 4.99 kB
'use strict'; Object.defineProperty(exports, "__esModule", { value: true }); exports.getSceneCanvas = getSceneCanvas; exports.getSceneBlob = getSceneBlob; exports.default = getScenePNGBlob; exports.getSceneBase64 = getSceneBase64; var _react = require('react'); var React = _interopRequireWildcard(_react); var _server = require('react-dom/server'); var _boundingBox = require('../utils/bounding-box'); var _base = require('../utils/base64'); var _staticRenderer = require('../renderer/static-renderer'); var _staticRenderer2 = _interopRequireDefault(_staticRenderer); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj.default = obj; return newObj; } } var SCENE_PADDING = 128; function renderSVGToBase64(elem) { var svgString = (0, _server.renderToStaticMarkup)(elem); var addedXMLNamespace = svgString.replace(/<svg/, '<svg xmlns="http://www.w3.org/2000/svg"\n xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" '); var base64Encoded = (0, _base.btoa)(addedXMLNamespace); var src = 'data:image/svg+xml;base64,' + base64Encoded; return src; } function getSceneRenderViewport(params) { var scene = params.scene; var shapesDeclarations = params.shapesDeclarations; var _params$minWidth = params.minWidth; var minWidth = _params$minWidth === undefined ? SCENE_PADDING * 2 : _params$minWidth; var _params$minHeight = params.minHeight; var minHeight = _params$minHeight === undefined ? SCENE_PADDING * 2 : _params$minHeight; var _params$padding = params.padding; var padding = _params$padding === undefined ? SCENE_PADDING : _params$padding; if (scene.shapesOrder.length === 0) { var _width = Math.max(minWidth, padding * 2); var _height = Math.max(minHeight, padding * 2); return { x1: 0, x2: _width, y1: 0, y2: _height, width: _width, height: _height }; } var bb = (0, _boundingBox.getSceneBB)({ scene: scene, shapesDeclarations: shapesDeclarations }); var width = bb.width; var height = bb.height; var hPadding = Math.max(padding, (minWidth - width) / 2); var vPadding = Math.max(padding, (minHeight - height) / 2); return (0, _boundingBox.roundBB)((0, _boundingBox.padBB)({ left: hPadding, right: hPadding, top: vPadding, bottom: vPadding }, bb)); } ; function getSceneCanvas(params, cb) { var scene = params.scene; var shapesDeclarations = params.shapesDeclarations; var grid = params.grid; var minWidth = params.minWidth; var minHeight = params.minHeight; var padding = params.padding; var $canvas = document.createElement('canvas'); var ctx = $canvas.getContext('2d'); var viewport = getSceneRenderViewport({ shapesDeclarations: shapesDeclarations, scene: scene, minWidth: minWidth, minHeight: minHeight, padding: padding }); var width = viewport.width; var height = viewport.height; var pixelRatio = window.devicePixelRatio || 1; $canvas.width = width * pixelRatio; $canvas.height = height * pixelRatio; ctx.scale(pixelRatio, pixelRatio); ctx.fillStyle = '#ffffff'; ctx.fillRect(0, 0, $canvas.width, $canvas.height); var $image = new Image(); $image.onload = function (e) { ctx.drawImage($image, 0, 0, viewport.width, viewport.height); cb($canvas, { width: width, height: height }); }; $image.src = renderSVGToBase64(React.createElement(_staticRenderer2.default, { scene: scene, grid: grid, shapesDeclarations: shapesDeclarations, viewport: viewport })); } function getSceneBlob(params, cb) { var _params$type = params.type; var type = _params$type === undefined ? 'image/png' : _params$type; var _params$quality = params.quality; var quality = _params$quality === undefined ? 0.92 : _params$quality; getSceneCanvas(params, function (canvas, dims) { canvas.toBlob(function (blob) { return cb(blob, dims); }, type, quality); }); } ; function getScenePNGBlob(params, cb) { var _params$quality2 = params.quality; var quality = _params$quality2 === undefined ? 0.92 : _params$quality2; getSceneCanvas(params, function (canvas, dims) { canvas.toBlob(function (blob) { return cb(blob, dims); }, 'image/png', quality); }); } ; function getSceneBase64(params, cb) { var _params$type2 = params.type; var type = _params$type2 === undefined ? 'image/png' : _params$type2; var _params$quality3 = params.quality; var quality = _params$quality3 === undefined ? 0.92 : _params$quality3; getSceneCanvas(params, function (canvas, dims) { var data = canvas.toDataURL(type, quality); cb(data, dims); }); } ;