@toplast/generator
Version:
Collage generator for Toplast
94 lines (93 loc) • 4.32 kB
JavaScript
;
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;