UNPKG

@visactor/vgrammar-wordcloud-shape

Version:

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

65 lines (61 loc) 3.79 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: !0 }), exports.filling = void 0; const wordle_1 = require("./wordle"); function filling(words, layoutConfig, segmentationOutput) { const {size: size, fillingTimes: fillingTimes, fillingXStep: fillingXStep, fillingYStep: fillingYStep, getFillingFontStyle: getFillingFontStyle, getFillingFontWeight: getFillingFontWeight, getFillingFontFamily: getFillingFontFamily, fillingInitialFontSize: fillingInitialFontSize, fillingDeltaFontSize: fillingDeltaFontSize, fillingInitialOpacity: fillingInitialOpacity, fillingDeltaOpacity: fillingDeltaOpacity, fillingRotateList: fillingRotateList, getFillingPadding: getFillingPadding, random: random, board: board, minFillFontSize: minFillFontSize} = layoutConfig, {boardSize: boardSize, shapeBounds: shapeBounds, tempCanvas: canvas, randomGenerator: randomGenerator} = segmentationOutput, ctx = canvas.getContext("2d", { willReadFrequently: !0 }); let fontSize = fillingInitialFontSize, opacity = fillingInitialOpacity; const placedFillingWords = []; for (let i = 0; i < fillingTimes; i++) filling1Time(fontSize, opacity), fontSize = Math.max(fontSize > fillingDeltaFontSize ? fontSize - fillingDeltaFontSize : fillingDeltaFontSize, minFillFontSize), opacity = opacity > fillingDeltaOpacity ? opacity - fillingDeltaOpacity : fillingDeltaOpacity; return placedFillingWords; function filling1Time(fontSize, opacity) { const fillingWords = words.map((word => { const {text: text, color: color, fillingColor: fillingColor, hasPlaced: hasPlaced, datum: datum} = word; return { x: 0, y: 0, weight: 0, text: text, fontFamily: getFillingFontFamily(datum), fontStyle: getFillingFontStyle(datum), fontWeight: getFillingFontWeight(datum), fontSize: fontSize, rotate: fillingRotateList[~~(randomGenerator() * fillingRotateList.length)], padding: getFillingPadding(datum), opacity: opacity, visible: !0, color: color, fillingColor: fillingColor, hasPlaced: hasPlaced, datum: datum }; })); randomArray(fillingWords); let wi = 0; const {x1: x1, y1: y1, x2: x2, y2: y2} = shapeBounds, [startX, startY] = [ x1 + ~~(randomGenerator() * fillingXStep * 2), y1 + ~~(randomGenerator() * fillingYStep * 2) ]; for (let y = startY; y <= y2; y += fillingYStep) for (let x = startX; x <= x2; x += fillingXStep) { (0, wordle_1.measureSprite)(canvas, ctx, fillingWords, wi); const word = fillingWords[wi]; word.x = x, word.y = y; const {wordSize: wordSize, bounds: bounds, hasPlaced: hasPlaced} = word; if (!hasPlaced || !bounds) { ++wi === fillingWords.length && (wi = 0, random && randomArray(fillingWords)); continue; } const {dTop: dTop, dBottom: dBottom, dLeft: dLeft, dRight: dRight} = bounds; word.x - dLeft < 0 || word.x + dRight > size[0] || word.y - dTop < 0 || word.y + dBottom > size[1] || word.hasText && word.sprite && !(0, wordle_1.isCollideWithBoard)(word, board, boardSize) && ((0, wordle_1.placeWordOnBoard)(word, board, boardSize), placedFillingWords.push(Object.assign({}, word)), ++wi === fillingWords.length && (wi = 0, random && randomArray(fillingWords))); } } function randomArray(words) { return words.sort((() => randomGenerator() - .5)); } } exports.filling = filling; //# sourceMappingURL=filling.js.map