UNPKG

@toplast/generator

Version:

Collage generator for Toplast

94 lines (93 loc) 4.32 kB
"use strict"; var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) { function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } return new (P || (P = Promise))(function (resolve, reject) { function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); } step((generator = generator.apply(thisArg, _arguments || [])).next()); }); }; Object.defineProperty(exports, "__esModule", { value: true }); exports.Grid = void 0; const canvas_1 = require("canvas"); const base_1 = require("../base"); const getWidthAndHeight = (itemsLength, coverSize) => { const size = Math.sqrt(itemsLength) * coverSize; return { width: size, height: size }; }; class Grid extends base_1.Base { constructor(items, displayCaptions = true) { super(getWidthAndHeight(items.length, Grid.COVER_SIZE)); this.SIZE = Math.sqrt(items.length); this.items = items; this.displayCaptions = displayCaptions; } generateCanvas() { return __awaiter(this, void 0, void 0, function* () { yield Promise.all([ this.generateDisplayCaptions(), this.generateCoverImages(), ]); }); } generateDisplayCaptions() { return __awaiter(this, void 0, void 0, function* () { if (!this.displayCaptions) return; let POSITION = 0; for (let i = 0; i < this.SIZE; i++) { for (let j = 0; j < this.SIZE; j++) { const { title, description } = this.items[POSITION]; const xAxis = j * Grid.COVER_SIZE; const yAxis = i * Grid.COVER_SIZE; this.context.globalCompositeOperation = "source-over"; this.addGradient(xAxis, yAxis); if (title) this.addTitle(title, xAxis, yAxis); if (description) this.addDescription(description, xAxis, yAxis); POSITION++; } } }); } addGradient(xAxis, yAxis) { const GRADIENT = this.context.createLinearGradient(xAxis, yAxis, xAxis, yAxis + Grid.COVER_SIZE); GRADIENT.addColorStop(0, "rgba(0, 0, 0, .5)"); GRADIENT.addColorStop(0.1, "rgba(0, 0, 0, .4)"); GRADIENT.addColorStop(0.28, "rgba(0, 0, 0, 0)"); this.context.fillStyle = GRADIENT; this.context.fillRect(xAxis, yAxis, Grid.COVER_SIZE, Grid.COVER_SIZE); } addTitle(text, xAxis, yAxis) { this.context.fillStyle = "rgb(255, 255, 255)"; this.addScalableText(text, xAxis + 5, yAxis + 5 + 16, Grid.COVER_SIZE - 10, 'bold %Spx "RobotoCondensed-Bold, ArialUnicode"', 16); } addDescription(text, xAxis, yAxis) { this.context.fillStyle = "rgb(240, 240, 240)"; this.addScalableText(text, xAxis + 5, yAxis + 5 + 20 + 14, Grid.COVER_SIZE - 10, 'bold %Spx "RobotoCondensed, ArialUnicode"', 14); } generateCoverImages() { return __awaiter(this, void 0, void 0, function* () { const promises = []; let POSITION = 0; for (let i = 0; i < this.SIZE; i++) { for (let j = 0; j < this.SIZE; j++) { const { image } = this.items[POSITION]; const xAxis = j * Grid.COVER_SIZE; const yAxis = i * Grid.COVER_SIZE; promises.push({ xAxis, yAxis, image }); POSITION++; } } yield Promise.all(promises.map(({ xAxis, yAxis, image }) => __awaiter(this, void 0, void 0, function* () { const loadedImage = yield (0, canvas_1.loadImage)(image); this.context.globalCompositeOperation = "destination-over"; this.context.drawImage(loadedImage, xAxis, yAxis, Grid.COVER_SIZE, Grid.COVER_SIZE); }))); }); } } exports.Grid = Grid; Grid.COVER_SIZE = 250;