UNPKG

@pdfme/pdf-lib

Version:

Create and modify PDF files with JavaScript

105 lines 3.64 kB
"use strict"; var __importDefault = (this && this.__importDefault) || function (mod) { return (mod && mod.__esModule) ? mod : { "default": mod }; }; Object.defineProperty(exports, "__esModule", { value: true }); exports.PNG = exports.PngType = void 0; const upng_1 = __importDefault(require("@pdf-lib/upng")); const getImageType = (ctype) => { if (ctype === 0) return PngType.Greyscale; if (ctype === 2) return PngType.Truecolour; if (ctype === 3) return PngType.IndexedColour; if (ctype === 4) return PngType.GreyscaleWithAlpha; if (ctype === 6) return PngType.TruecolourWithAlpha; throw new Error(`Unknown color type: ${ctype}`); }; const splitAlphaChannel = (rgbaChannel) => { const pixelCount = Math.floor(rgbaChannel.length / 4); const rgbChannel = new Uint8Array(pixelCount * 3); const alphaChannel = new Uint8Array(pixelCount * 1); let rgbaOffset = 0; let rgbOffset = 0; let alphaOffset = 0; while (rgbaOffset < rgbaChannel.length) { rgbChannel[rgbOffset++] = rgbaChannel[rgbaOffset++]; rgbChannel[rgbOffset++] = rgbaChannel[rgbaOffset++]; rgbChannel[rgbOffset++] = rgbaChannel[rgbaOffset++]; alphaChannel[alphaOffset++] = rgbaChannel[rgbaOffset++]; } return { rgbChannel, alphaChannel }; }; var PngType; (function (PngType) { PngType["Greyscale"] = "Greyscale"; PngType["Truecolour"] = "Truecolour"; PngType["IndexedColour"] = "IndexedColour"; PngType["GreyscaleWithAlpha"] = "GreyscaleWithAlpha"; PngType["TruecolourWithAlpha"] = "TruecolourWithAlpha"; })(PngType || (exports.PngType = PngType = {})); class PNG { constructor(pngData) { Object.defineProperty(this, "rgbChannel", { enumerable: true, configurable: true, writable: true, value: void 0 }); Object.defineProperty(this, "alphaChannel", { enumerable: true, configurable: true, writable: true, value: void 0 }); Object.defineProperty(this, "type", { enumerable: true, configurable: true, writable: true, value: void 0 }); Object.defineProperty(this, "width", { enumerable: true, configurable: true, writable: true, value: void 0 }); Object.defineProperty(this, "height", { enumerable: true, configurable: true, writable: true, value: void 0 }); Object.defineProperty(this, "bitsPerComponent", { enumerable: true, configurable: true, writable: true, value: void 0 }); const upng = upng_1.default.decode(pngData.buffer); const frames = upng_1.default.toRGBA8(upng); if (frames.length > 1) throw new Error(`Animated PNGs are not supported`); const frame = new Uint8Array(frames[0]); const { rgbChannel, alphaChannel } = splitAlphaChannel(frame); this.rgbChannel = rgbChannel; const hasAlphaValues = alphaChannel.some((a) => a < 255); if (hasAlphaValues) this.alphaChannel = alphaChannel; this.type = getImageType(upng.ctype); this.width = upng.width; this.height = upng.height; this.bitsPerComponent = 8; } } exports.PNG = PNG; Object.defineProperty(PNG, "load", { enumerable: true, configurable: true, writable: true, value: (pngData) => new PNG(pngData) }); //# sourceMappingURL=png.js.map