UNPKG

@visactor/vgrammar-wordcloud-shape

Version:

Layout WordCloud in specified shape, this is a transform for VGrammar.

136 lines (118 loc) 7.39 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: !0 }), exports.functor = exports.drawSpiral = exports.draw = exports.paint = exports.paintLabels = exports.loadImage = exports.calTextLength = exports.isChinese = exports.fakeRandom = exports.colorListEqual = exports.WORDCLOUD_SHAPE_HOOK_EVENT = void 0; const vrender_core_1 = require("@visactor/vrender-core"), vutils_1 = require("@visactor/vutils"); var WORDCLOUD_SHAPE_HOOK_EVENT; !function(WORDCLOUD_SHAPE_HOOK_EVENT) { WORDCLOUD_SHAPE_HOOK_EVENT.BEFORE_WORDCLOUD_SHAPE_LAYOUT = "beforeWordcloudShapeLayout", WORDCLOUD_SHAPE_HOOK_EVENT.AFTER_WORDCLOUD_SHAPE_LAYOUT = "afterWordcloudShapeLayout", WORDCLOUD_SHAPE_HOOK_EVENT.AFTER_WORDCLOUD_SHAPE_DRAW = "afterWordcloudShapeDraw"; }(WORDCLOUD_SHAPE_HOOK_EVENT = exports.WORDCLOUD_SHAPE_HOOK_EVENT || (exports.WORDCLOUD_SHAPE_HOOK_EVENT = {})); const colorListEqual = (arr0, arr1) => { if (1 === arr1.length && "#537EF5" === arr1[0]) return !0; if (!Array.isArray(arr0) || !Array.isArray(arr1) || arr0.length !== arr1.length) return !1; for (let i = 0; i < arr0.length; i++) if (arr0[i] !== arr1[i]) return !1; return !0; }; exports.colorListEqual = colorListEqual; const fakeRandom = () => { let i = -1; const arr = [ 0, .1, .2, .3, .4, .5, .6, .7, .8, .9 ]; return () => (i = (i + 1) % arr.length, arr[i]); }; exports.fakeRandom = fakeRandom; const isChinese = text => /^[\u4e00-\u9fa5]+$/.test(text); exports.isChinese = isChinese; const calTextLength = (text, textLengthLimit) => { if ((0, vutils_1.isNil)(text)) return 0; let length = 0; for (const char of text) (0, exports.isChinese)(char) ? length += 1 : length += .53; return length; }; function loadImage(url) { return url && ((0, vutils_1.isValidUrl)(url) || (0, vutils_1.isBase64)(url) || url.startsWith("<svg")) ? new Promise(((resolve, reject) => { var _a; const imageMark = (0, vrender_core_1.createImage)({ image: url }), imgData = null === (_a = imageMark.resources) || void 0 === _a ? void 0 : _a.get(url); imgData && "success" === imgData.state && imgData.data ? resolve(imgData.data) : (imageMark.successCallback = () => { var _a; if (imageMark) { const imgData = null === (_a = imageMark.resources) || void 0 === _a ? void 0 : _a.get(url); imgData && "success" === imgData.state && imgData.data ? resolve(imgData.data) : reject(new Error("image load failed" + url)); } else reject(new Error("image load failed" + url)); }, imageMark.failCallback = () => { vutils_1.Logger.getInstance().error("image 加载失败!", url); }); })) : null; } function paintLabels(segmentationOutput) { const {size: size, segmentation: {regions: regions, labels: labels}, shapeBounds: shapeBounds, shapeCenter: shapeCenter} = segmentationOutput, paintCanvas = vrender_core_1.vglobal.createCanvas({ width: size[0], height: size[1] }), ctx = paintCanvas.getContext("2d"), colorList = [ "#FF0000", "#00FF00", "#0000FF", "#FFFF00", "#00FFFF", "#FF00FF" ]; for (let i = 0; i < size[1]; i++) for (let j = 0; j < size[0]; j++) 0 === labels[i * size[0] + j] ? ctx.fillStyle = "#fff" : ctx.fillStyle = colorList[labels[i * size[0] + j] % colorList.length], ctx.fillRect(j, i, 1, 1); regions.forEach((region => { const {center: [x, y], area: area, boundary: boundary, maxPoint: maxPoint, label: label} = region; ctx.fillStyle = "#000", ctx.fillRect(x, y, 3, 3), ctx.font = "15px serif", ctx.fillText(area, x, y); for (const [x, y] of boundary) ctx.fillStyle = "#f00", ctx.fillRect(x, y, 1, 1); const [iMin, iMax, jMin, jMax] = maxPoint; ctx.fillStyle = "#00f", ctx.font = "15px serif", ctx.fillRect(jMin, iMin, 3, 3), ctx.fillText(`${label}_min`, jMin, iMin), ctx.fillRect(jMax, iMax, 3, 3), ctx.fillText(`${label}_max`, jMax, iMax); })); const {x1: x1, y1: y1, width: width, height: height} = shapeBounds; ctx.strokeStyle = "#000", ctx.strokeRect(x1, y1, width, height), ctx.fillStyle = "#000", ctx.fillRect(shapeCenter[0], shapeCenter[1], 3, 3), ctx.fillText("shape center", shapeCenter[0], shapeCenter[1]), document.body.prepend(paintCanvas); } function paint(board, paintSize) { const curSize = paintSize, imageData = new ImageData(curSize[0], curSize[1]), array = imageData.data, w32 = paintSize[0] >> 5; for (let y = 0; y < curSize[1]; y++) for (let x = 0; x < w32; x++) { const string = (board[y * w32 + x] >>> 0).toString(2).padStart(32, "0"); for (let k = 0; k < 32; k++) "1" === string[k] ? (array[4 * ((x << 5) + y * curSize[0] + k) + 0] = 255, array[4 * ((x << 5) + y * curSize[0] + k) + 1] = 255, array[4 * ((x << 5) + y * curSize[0] + k) + 2] = 255, array[4 * ((x << 5) + y * curSize[0] + k) + 3] = 255) : (array[4 * ((x << 5) + y * curSize[0] + k) + 0] = 0, array[4 * ((x << 5) + y * curSize[0] + k) + 1] = 0, array[4 * ((x << 5) + y * curSize[0] + k) + 2] = 0, array[4 * ((x << 5) + y * curSize[0] + k) + 3] = 255), 0 === k && (array[4 * ((x << 5) + y * curSize[0] + k) + 0] = 255, array[4 * ((x << 5) + y * curSize[0] + k) + 1] = 0, array[4 * ((x << 5) + y * curSize[0] + k) + 2] = 0, array[4 * ((x << 5) + y * curSize[0] + k) + 3] = 255); } const canvas = document.createElement("canvas"); canvas.width = curSize[0], canvas.height = curSize[1]; canvas.getContext("2d").putImageData(imageData, 0, 0), document.body.prepend(canvas); } function draw(words, fillingWords, layoutConfig, resizeFactor = 1) { const canvas = document.createElement("canvas"), {size: size} = (Math.PI, layoutConfig); canvas.width = size[0] * resizeFactor, canvas.height = size[1] * resizeFactor; const ctx = canvas.getContext("2d"); function drawText(word, color) { ctx.save(), ctx.textAlign = "center", ctx.font = word.fontStyle + " " + word.fontWeight + " " + word.fontSize * resizeFactor + "px " + word.fontFamily, ctx.globalAlpha = word.opacity, ctx.translate(word.x * resizeFactor, word.y * resizeFactor), word.rotate && ctx.rotate(word.rotate * Math.PI / 180), ctx.fillText(word.text, 0, .3 * word.fontSize * resizeFactor), ctx.restore(); } words.forEach((word => { word.visible && drawText(word); })), fillingWords.forEach((word => { word.visible && drawText(word, "#308ebc"); })), document.body.prepend(canvas); } function drawSpiral(spiral, center, maxR, size) { const canvas = document.createElement("canvas"); canvas.width = size[0], canvas.height = size[1]; const ctx = canvas.getContext("2d"); let dxdy, dx, dy, t = -1; for (;(dxdy = spiral(t += 1)) && (dx = dxdy[0], dy = dxdy[1], !(Math.min(Math.abs(dx), Math.abs(dy)) >= maxR)); ) ctx.fillStyle = "#f00", ctx.fillRect(center[0] + dx, center[1] + dy, 3, 3); document.body.prepend(canvas); } function functor(d) { return "function" == typeof d ? d : function() { return d; }; } exports.calTextLength = calTextLength, exports.loadImage = loadImage, exports.paintLabels = paintLabels, exports.paint = paint, exports.draw = draw, exports.drawSpiral = drawSpiral, exports.functor = functor; //# sourceMappingURL=util.js.map