Brunobkr/llama.cpp_AlgMor24_github
ΩFFFΣLLIa • llama.cpp • AlgMor24 ██████╗ ███████╗███████╗███████╗██╗ ██╗ ██╗ █████╗ ██╔═══██╗██╔════╝██╔════╝██╔════╝██║ ██║ ██║██╔══██╗ ██║ ██║█████╗ █████╗ █████╗ ██║ ██║ ██║███████║ ██║ ██║██╔══╝ ██╔══╝ ██╔══╝ ██║ ██║ ██║██╔══██║ ╚██████╔╝██║ ██║ ███████╗███████╗███████╗██║██║ ██║ ╚═════╝ ╚═╝ ╚═╝ ╚══════╝╚══════╝╚══════╝╚═╝╚═╝ ╚═╝ High-Performance LLM / VLM Inference & Autonomous Agentic Ecosystem… See the full description on the dataset page: https://huggingface.co/datasets/Brunobkr/llama.cpp_AlgMor24_github.
03k
1/*!2 Copyright 2013 Lovell Fuller and others.3 SPDX-License-Identifier: Apache-2.04*/5 6import is from './is.mjs';7import sharp from './sharp.mjs';8 9/**10 * Justification alignment11 * @member12 * @private13 */14const align = {15 left: 'low',16 top: 'low',17 low: 'low',18 center: 'centre',19 centre: 'centre',20 right: 'high',21 bottom: 'high',22 high: 'high'23};24 25const inputStreamParameters = [26 // Limits and error handling27 'failOn', 'limitInputPixels', 'limitInputChannels', 'unlimited',28 // Format-generic29 'animated', 'autoOrient', 'density', 'ignoreIcc', 'page', 'pages', 'sequentialRead',30 // Format-specific31 'jp2', 'openSlide', 'pdf', 'raw', 'svg', 'tiff',32 // Deprecated33 'openSlideLevel', 'pdfBackground', 'tiffSubifd'34];35 36/**37 * Extract input options, if any, from an object.38 * @private39 */40function _inputOptionsFromObject (obj) {41 const params = inputStreamParameters42 .filter(p => is.defined(obj[p]))43 .map(p => ([p, obj[p]]));44 return params.length45 ? Object.fromEntries(params)46 : undefined;47}48 49/**50 * Create Object containing input and input-related options.51 * @private52 */53function _createInputDescriptor (input, inputOptions, containerOptions) {54 const inputDescriptor = {55 autoOrient: false,56 failOn: 'warning',57 limitInputPixels: 0x3FFF ** 2,58 limitInputChannels: 5,59 ignoreIcc: false,60 unlimited: false,61 sequentialRead: true62 };63 if (is.string(input)) {64 // filesystem65 inputDescriptor.file = input;66 } else if (is.buffer(input)) {67 // Buffer68 if (input.length === 0) {69 throw Error('Input Buffer is empty');70 }71 inputDescriptor.buffer = input;72 } else if (is.arrayBuffer(input)) {73 if (input.byteLength === 0) {74 throw Error('Input bit Array is empty');75 }76 inputDescriptor.buffer = Buffer.from(input, 0, input.byteLength);77 } else if (is.typedArray(input)) {78 if (input.length === 0) {79 throw Error('Input Bit Array is empty');80 }81 inputDescriptor.buffer = Buffer.from(input.buffer, input.byteOffset, input.byteLength);82 } else if (is.plainObject(input) && !is.defined(inputOptions)) {83 // Plain Object descriptor, e.g. create84 inputOptions = input;85 if (_inputOptionsFromObject(inputOptions)) {86 // Stream with options87 inputDescriptor.buffer = [];88 }89 } else if (!is.defined(input) && !is.defined(inputOptions) && is.object(containerOptions) && containerOptions.allowStream) {90 // Stream without options91 inputDescriptor.buffer = [];92 } else if (Array.isArray(input)) {93 if (input.length > 1) {94 // Join images together95 if (!this.options.joining) {96 this.options.joining = true;97 this.options.join = input.map(i => this._createInputDescriptor(i));98 } else {99 throw new Error('Recursive join is unsupported');100 }101 } else {102 throw new Error('Expected at least two images to join');103 }104 } else {105 throw new Error(`Unsupported input '${input}' of type ${typeof input}${106 is.defined(inputOptions) ? ` when also providing options of type ${typeof inputOptions}` : ''107 }`);108 }109 if (is.object(inputOptions)) {110 // failOn111 if (is.defined(inputOptions.failOn)) {112 if (is.string(inputOptions.failOn) && is.inArray(inputOptions.failOn, ['none', 'truncated', 'error', 'warning'])) {113 inputDescriptor.failOn = inputOptions.failOn;114 } else {115 throw is.invalidParameterError('failOn', 'one of: none, truncated, error, warning', inputOptions.failOn);116 }117 }118 // autoOrient119 if (is.defined(inputOptions.autoOrient)) {120 if (is.bool(inputOptions.autoOrient)) {121 inputDescriptor.autoOrient = inputOptions.autoOrient;122 } else {123 throw is.invalidParameterError('autoOrient', 'boolean', inputOptions.autoOrient);124 }125 }126 // Density127 if (is.defined(inputOptions.density)) {128 if (is.number(inputOptions.density) && is.inRange(inputOptions.density, 1, 100000)) {129 inputDescriptor.density = inputOptions.density;130 } else {131 throw is.invalidParameterError('density', 'number between 1 and 100000', inputOptions.density);132 }133 }134 // Ignore embeddded ICC profile135 if (is.defined(inputOptions.ignoreIcc)) {136 if (is.bool(inputOptions.ignoreIcc)) {137 inputDescriptor.ignoreIcc = inputOptions.ignoreIcc;138 } else {139 throw is.invalidParameterError('ignoreIcc', 'boolean', inputOptions.ignoreIcc);140 }141 }142 // limitInputPixels143 if (is.defined(inputOptions.limitInputPixels)) {144 if (is.bool(inputOptions.limitInputPixels)) {145 inputDescriptor.limitInputPixels = inputOptions.limitInputPixels146 ? 0x3FFF ** 2147 : 0;148 } else if (is.integer(inputOptions.limitInputPixels) && is.inRange(inputOptions.limitInputPixels, 0, Number.MAX_SAFE_INTEGER)) {149 inputDescriptor.limitInputPixels = inputOptions.limitInputPixels;150 } else {151 throw is.invalidParameterError('limitInputPixels', 'positive integer', inputOptions.limitInputPixels);152 }153 }154 // limitInputChannels155 if (is.defined(inputOptions.limitInputChannels)) {156 if (is.bool(inputOptions.limitInputChannels)) {157 inputDescriptor.limitInputChannels = inputOptions.limitInputChannels ? 5 : 0;158 } else if (is.integer(inputOptions.limitInputChannels) && is.inRange(inputOptions.limitInputChannels, 0, Number.MAX_SAFE_INTEGER)) {159 inputDescriptor.limitInputChannels = inputOptions.limitInputChannels;160 } else {161 throw is.invalidParameterError('limitInputChannels', 'positive integer', inputOptions.limitInputChannels);162 }163 }164 // unlimited165 if (is.defined(inputOptions.unlimited)) {166 if (is.bool(inputOptions.unlimited)) {167 inputDescriptor.unlimited = inputOptions.unlimited;168 } else {169 throw is.invalidParameterError('unlimited', 'boolean', inputOptions.unlimited);170 }171 }172 // sequentialRead173 if (is.defined(inputOptions.sequentialRead)) {174 if (is.bool(inputOptions.sequentialRead)) {175 inputDescriptor.sequentialRead = inputOptions.sequentialRead;176 } else {177 throw is.invalidParameterError('sequentialRead', 'boolean', inputOptions.sequentialRead);178 }179 }180 // Raw pixel input181 if (is.defined(inputOptions.raw)) {182 if (183 is.object(inputOptions.raw) &&184 is.integer(inputOptions.raw.width) && is.inRange(inputOptions.raw.width, 1, 100000000) &&185 is.integer(inputOptions.raw.height) && is.inRange(inputOptions.raw.height, 1, 100000000) &&186 is.integer(inputOptions.raw.channels) && is.inRange(inputOptions.raw.channels, 1, 4)187 ) {188 inputDescriptor.rawWidth = inputOptions.raw.width;189 inputDescriptor.rawHeight = inputOptions.raw.height;190 inputDescriptor.rawChannels = inputOptions.raw.channels;191 switch (input.constructor) {192 case Uint8Array:193 case Uint8ClampedArray:194 inputDescriptor.rawDepth = 'uchar';195 break;196 case Int8Array:197 inputDescriptor.rawDepth = 'char';198 break;199 case Uint16Array:200 inputDescriptor.rawDepth = 'ushort';201 break;202 case Int16Array:203 inputDescriptor.rawDepth = 'short';204 break;205 case Uint32Array:206 inputDescriptor.rawDepth = 'uint';207 break;208 case Int32Array:209 inputDescriptor.rawDepth = 'int';210 break;211 case Float32Array:212 inputDescriptor.rawDepth = 'float';213 break;214 case Float64Array:215 inputDescriptor.rawDepth = 'double';216 break;217 default:218 inputDescriptor.rawDepth = 'uchar';219 break;220 }221 } else {222 throw new Error('Expected width, height and channels for raw pixel input');223 }224 inputDescriptor.rawPremultiplied = false;225 if (is.defined(inputOptions.raw.premultiplied)) {226 if (is.bool(inputOptions.raw.premultiplied)) {227 inputDescriptor.rawPremultiplied = inputOptions.raw.premultiplied;228 } else {229 throw is.invalidParameterError('raw.premultiplied', 'boolean', inputOptions.raw.premultiplied);230 }231 }232 inputDescriptor.rawPageHeight = 0;233 if (is.defined(inputOptions.raw.pageHeight)) {234 if (is.integer(inputOptions.raw.pageHeight) && inputOptions.raw.pageHeight > 0 && inputOptions.raw.pageHeight <= inputOptions.raw.height) {235 if (inputOptions.raw.height % inputOptions.raw.pageHeight !== 0) {236 throw new Error(`Expected raw.height ${inputOptions.raw.height} to be a multiple of raw.pageHeight ${inputOptions.raw.pageHeight}`);237 }238 inputDescriptor.rawPageHeight = inputOptions.raw.pageHeight;239 } else {240 throw is.invalidParameterError('raw.pageHeight', 'positive integer', inputOptions.raw.pageHeight);241 }242 }243 }244 // Multi-page input (GIF, TIFF, PDF)245 if (is.defined(inputOptions.animated)) {246 if (is.bool(inputOptions.animated)) {247 inputDescriptor.pages = inputOptions.animated ? -1 : 1;248 } else {249 throw is.invalidParameterError('animated', 'boolean', inputOptions.animated);250 }251 }252 if (is.defined(inputOptions.pages)) {253 if (is.integer(inputOptions.pages) && is.inRange(inputOptions.pages, -1, 100000)) {254 inputDescriptor.pages = inputOptions.pages;255 } else {256 throw is.invalidParameterError('pages', 'integer between -1 and 100000', inputOptions.pages);257 }258 }259 if (is.defined(inputOptions.page)) {260 if (is.integer(inputOptions.page) && is.inRange(inputOptions.page, 0, 100000)) {261 inputDescriptor.page = inputOptions.page;262 } else {263 throw is.invalidParameterError('page', 'integer between 0 and 100000', inputOptions.page);264 }265 }266 // OpenSlide specific options267 if (is.object(inputOptions.openSlide) && is.defined(inputOptions.openSlide.level)) {268 if (is.integer(inputOptions.openSlide.level) && is.inRange(inputOptions.openSlide.level, 0, 256)) {269 inputDescriptor.openSlideLevel = inputOptions.openSlide.level;270 } else {271 throw is.invalidParameterError('openSlide.level', 'integer between 0 and 256', inputOptions.openSlide.level);272 }273 } else if (is.defined(inputOptions.level)) {274 // Deprecated275 if (is.integer(inputOptions.level) && is.inRange(inputOptions.level, 0, 256)) {276 inputDescriptor.openSlideLevel = inputOptions.level;277 } else {278 throw is.invalidParameterError('level', 'integer between 0 and 256', inputOptions.level);279 }280 }281 // TIFF specific options282 if (is.object(inputOptions.tiff) && is.defined(inputOptions.tiff.subifd)) {283 if (is.integer(inputOptions.tiff.subifd) && is.inRange(inputOptions.tiff.subifd, -1, 100000)) {284 inputDescriptor.tiffSubifd = inputOptions.tiff.subifd;285 } else {286 throw is.invalidParameterError('tiff.subifd', 'integer between -1 and 100000', inputOptions.tiff.subifd);287 }288 } else if (is.defined(inputOptions.subifd)) {289 // Deprecated290 if (is.integer(inputOptions.subifd) && is.inRange(inputOptions.subifd, -1, 100000)) {291 inputDescriptor.tiffSubifd = inputOptions.subifd;292 } else {293 throw is.invalidParameterError('subifd', 'integer between -1 and 100000', inputOptions.subifd);294 }295 }296 // SVG specific options297 if (is.object(inputOptions.svg)) {298 if (is.defined(inputOptions.svg.stylesheet)) {299 if (is.string(inputOptions.svg.stylesheet)) {300 inputDescriptor.svgStylesheet = inputOptions.svg.stylesheet;301 } else {302 throw is.invalidParameterError('svg.stylesheet', 'string', inputOptions.svg.stylesheet);303 }304 }305 if (is.defined(inputOptions.svg.highBitdepth)) {306 if (is.bool(inputOptions.svg.highBitdepth)) {307 inputDescriptor.svgHighBitdepth = inputOptions.svg.highBitdepth;308 } else {309 throw is.invalidParameterError('svg.highBitdepth', 'boolean', inputOptions.svg.highBitdepth);310 }311 }312 }313 // PDF specific options314 if (is.object(inputOptions.pdf) && is.defined(inputOptions.pdf.background)) {315 inputDescriptor.pdfBackground = this._getBackgroundColourOption(inputOptions.pdf.background);316 } else if (is.defined(inputOptions.pdfBackground)) {317 // Deprecated318 inputDescriptor.pdfBackground = this._getBackgroundColourOption(inputOptions.pdfBackground);319 }320 // JPEG 2000 specific options321 if (is.object(inputOptions.jp2) && is.defined(inputOptions.jp2.oneshot)) {322 if (is.bool(inputOptions.jp2.oneshot)) {323 inputDescriptor.jp2Oneshot = inputOptions.jp2.oneshot;324 } else {325 throw is.invalidParameterError('jp2.oneshot', 'boolean', inputOptions.jp2.oneshot);326 }327 }328 // Create new image329 if (is.defined(inputOptions.create)) {330 if (331 is.object(inputOptions.create) &&332 is.integer(inputOptions.create.width) && is.inRange(inputOptions.create.width, 1, 100000000) &&333 is.integer(inputOptions.create.height) && is.inRange(inputOptions.create.height, 1, 100000000) &&334 is.integer(inputOptions.create.channels)335 ) {336 inputDescriptor.createWidth = inputOptions.create.width;337 inputDescriptor.createHeight = inputOptions.create.height;338 inputDescriptor.createChannels = inputOptions.create.channels;339 inputDescriptor.createPageHeight = 0;340 if (is.defined(inputOptions.create.pageHeight)) {341 if (is.integer(inputOptions.create.pageHeight) && inputOptions.create.pageHeight > 0 && inputOptions.create.pageHeight <= inputOptions.create.height) {342 if (inputOptions.create.height % inputOptions.create.pageHeight !== 0) {343 throw new Error(`Expected create.height ${inputOptions.create.height} to be a multiple of create.pageHeight ${inputOptions.create.pageHeight}`);344 }345 inputDescriptor.createPageHeight = inputOptions.create.pageHeight;346 } else {347 throw is.invalidParameterError('create.pageHeight', 'positive integer', inputOptions.create.pageHeight);348 }349 }350 // Noise351 if (is.defined(inputOptions.create.noise)) {352 if (!is.object(inputOptions.create.noise)) {353 throw new Error('Expected noise to be an object');354 }355 if (inputOptions.create.noise.type !== 'gaussian') {356 throw new Error('Only gaussian noise is supported at the moment');357 }358 inputDescriptor.createNoiseType = inputOptions.create.noise.type;359 if (!is.inRange(inputOptions.create.channels, 1, 4)) {360 throw is.invalidParameterError('create.channels', 'number between 1 and 4', inputOptions.create.channels);361 }362 inputDescriptor.createNoiseMean = 128;363 if (is.defined(inputOptions.create.noise.mean)) {364 if (is.number(inputOptions.create.noise.mean) && is.inRange(inputOptions.create.noise.mean, 0, 10000)) {365 inputDescriptor.createNoiseMean = inputOptions.create.noise.mean;366 } else {367 throw is.invalidParameterError('create.noise.mean', 'number between 0 and 10000', inputOptions.create.noise.mean);368 }369 }370 inputDescriptor.createNoiseSigma = 30;371 if (is.defined(inputOptions.create.noise.sigma)) {372 if (is.number(inputOptions.create.noise.sigma) && is.inRange(inputOptions.create.noise.sigma, 0, 10000)) {373 inputDescriptor.createNoiseSigma = inputOptions.create.noise.sigma;374 } else {375 throw is.invalidParameterError('create.noise.sigma', 'number between 0 and 10000', inputOptions.create.noise.sigma);376 }377 }378 } else if (is.defined(inputOptions.create.background)) {379 if (!is.inRange(inputOptions.create.channels, 3, 4)) {380 throw is.invalidParameterError('create.channels', 'number between 3 and 4', inputOptions.create.channels);381 }382 inputDescriptor.createBackground = this._getBackgroundColourOption(inputOptions.create.background);383 } else {384 throw new Error('Expected valid noise or background to create a new input image');385 }386 delete inputDescriptor.buffer;387 } else {388 throw new Error('Expected valid width, height and channels to create a new input image');389 }390 }391 // Create a new image with text392 if (is.defined(inputOptions.text)) {393 if (is.object(inputOptions.text) && is.string(inputOptions.text.text)) {394 inputDescriptor.textValue = inputOptions.text.text;395 if (is.defined(inputOptions.text.height) && is.defined(inputOptions.text.dpi)) {396 throw new Error('Expected only one of dpi or height');397 }398 if (is.defined(inputOptions.text.font)) {399 if (is.string(inputOptions.text.font)) {400 inputDescriptor.textFont = inputOptions.text.font;401 } else {402 throw is.invalidParameterError('text.font', 'string', inputOptions.text.font);403 }404 }405 if (is.defined(inputOptions.text.fontfile)) {406 if (is.string(inputOptions.text.fontfile)) {407 inputDescriptor.textFontfile = inputOptions.text.fontfile;408 } else {409 throw is.invalidParameterError('text.fontfile', 'string', inputOptions.text.fontfile);410 }411 }412 if (is.defined(inputOptions.text.width)) {413 if (is.integer(inputOptions.text.width) && is.inRange(inputOptions.text.width, 1, 1000000)) {414 inputDescriptor.textWidth = inputOptions.text.width;415 } else {416 throw is.invalidParameterError('text.width', 'integer between 1 and 1000000', inputOptions.text.width);417 }418 }419 if (is.defined(inputOptions.text.height)) {420 if (is.integer(inputOptions.text.height) && is.inRange(inputOptions.text.height, 1, 1000000)) {421 inputDescriptor.textHeight = inputOptions.text.height;422 } else {423 throw is.invalidParameterError('text.height', 'integer between 1 and 1000000', inputOptions.text.height);424 }425 }426 if (is.defined(inputOptions.text.align)) {427 if (is.string(inputOptions.text.align) && is.string(this.constructor.align[inputOptions.text.align])) {428 inputDescriptor.textAlign = this.constructor.align[inputOptions.text.align];429 } else {430 throw is.invalidParameterError('text.align', 'valid alignment', inputOptions.text.align);431 }432 }433 if (is.defined(inputOptions.text.justify)) {434 if (is.bool(inputOptions.text.justify)) {435 inputDescriptor.textJustify = inputOptions.text.justify;436 } else {437 throw is.invalidParameterError('text.justify', 'boolean', inputOptions.text.justify);438 }439 }440 if (is.defined(inputOptions.text.dpi)) {441 if (is.integer(inputOptions.text.dpi) && is.inRange(inputOptions.text.dpi, 1, 1000000)) {442 inputDescriptor.textDpi = inputOptions.text.dpi;443 } else {444 throw is.invalidParameterError('text.dpi', 'integer between 1 and 1000000', inputOptions.text.dpi);445 }446 }447 if (is.defined(inputOptions.text.rgba)) {448 if (is.bool(inputOptions.text.rgba)) {449 inputDescriptor.textRgba = inputOptions.text.rgba;450 } else {451 throw is.invalidParameterError('text.rgba', 'bool', inputOptions.text.rgba);452 }453 }454 if (is.defined(inputOptions.text.spacing)) {455 if (is.integer(inputOptions.text.spacing) && is.inRange(inputOptions.text.spacing, -1000000, 1000000)) {456 inputDescriptor.textSpacing = inputOptions.text.spacing;457 } else {458 throw is.invalidParameterError('text.spacing', 'integer between -1000000 and 1000000', inputOptions.text.spacing);459 }460 }461 if (is.defined(inputOptions.text.wrap)) {462 if (is.string(inputOptions.text.wrap) && is.inArray(inputOptions.text.wrap, ['word', 'char', 'word-char', 'none'])) {463 inputDescriptor.textWrap = inputOptions.text.wrap;464 } else {465 throw is.invalidParameterError('text.wrap', 'one of: word, char, word-char, none', inputOptions.text.wrap);466 }467 }468 delete inputDescriptor.buffer;469 } else {470 throw new Error('Expected a valid string to create an image with text.');471 }472 }473 // Join images together474 if (is.defined(inputOptions.join)) {475 if (is.defined(this.options.join)) {476 if (is.defined(inputOptions.join.animated)) {477 if (is.bool(inputOptions.join.animated)) {478 inputDescriptor.joinAnimated = inputOptions.join.animated;479 } else {480 throw is.invalidParameterError('join.animated', 'boolean', inputOptions.join.animated);481 }482 }483 if (is.defined(inputOptions.join.across)) {484 if (is.integer(inputOptions.join.across) && is.inRange(inputOptions.join.across, 1, 1000000)) {485 inputDescriptor.joinAcross = inputOptions.join.across;486 } else {487 throw is.invalidParameterError('join.across', 'integer between 1 and 100000', inputOptions.join.across);488 }489 }490 if (is.defined(inputOptions.join.shim)) {491 if (is.integer(inputOptions.join.shim) && is.inRange(inputOptions.join.shim, 0, 1000000)) {492 inputDescriptor.joinShim = inputOptions.join.shim;493 } else {494 throw is.invalidParameterError('join.shim', 'integer between 0 and 100000', inputOptions.join.shim);495 }496 }497 if (is.defined(inputOptions.join.background)) {498 inputDescriptor.joinBackground = this._getBackgroundColourOption(inputOptions.join.background);499 }500 if (is.defined(inputOptions.join.halign)) {501 if (is.string(inputOptions.join.halign) && is.string(this.constructor.align[inputOptions.join.halign])) {502 inputDescriptor.joinHalign = this.constructor.align[inputOptions.join.halign];503 } else {504 throw is.invalidParameterError('join.halign', 'valid alignment', inputOptions.join.halign);505 }506 }507 if (is.defined(inputOptions.join.valign)) {508 if (is.string(inputOptions.join.valign) && is.string(this.constructor.align[inputOptions.join.valign])) {509 inputDescriptor.joinValign = this.constructor.align[inputOptions.join.valign];510 } else {511 throw is.invalidParameterError('join.valign', 'valid alignment', inputOptions.join.valign);512 }513 }514 } else {515 throw new Error('Expected input to be an array of images to join');516 }517 }518 } else if (is.defined(inputOptions)) {519 throw new Error(`Invalid input options ${inputOptions}`);520 }521 return inputDescriptor;522}523 524/**525 * Handle incoming Buffer chunk on Writable Stream.526 * @private527 * @param {Buffer} chunk528 * @param {string} encoding - unused529 * @param {Function} callback530 */531function _write (chunk, _encoding, callback) {532 if (Array.isArray(this.options.input.buffer)) {533 if (is.buffer(chunk)) {534 if (this.options.input.buffer.length === 0) {535 this.on('finish', () => {536 this.streamInFinished = true;537 });538 }539 this.options.input.buffer.push(chunk);540 callback();541 } else {542 callback(new Error('Non-Buffer data on Writable Stream'));543 }544 } else {545 callback(new Error('Unexpected data on Writable Stream'));546 }547}548 549/**550 * Flattens the array of chunks accumulated in input.buffer.551 * @private552 */553function _flattenBufferIn () {554 if (this._isStreamInput()) {555 this.options.input.buffer = Buffer.concat(this.options.input.buffer);556 }557}558 559/**560 * Are we expecting Stream-based input?561 * @private562 * @returns {boolean}563 */564function _isStreamInput () {565 return Array.isArray(this.options.input.buffer);566}567 568/**569 * Fast access to (uncached) image metadata without decoding any compressed pixel data.570 *571 * This is read from the header of the input image.572 * It does not take into consideration any operations to be applied to the output image,573 * such as resize or rotate.574 *575 * Dimensions in the response will respect the `page` and `pages` properties of the576 * {@link /api-constructor/ constructor parameters}.577 *578 * A `Promise` is returned when `callback` is not provided.579 *580 * - `format`: Name of decoder used to parse image e.g. `jpeg`, `png`, `webp`, `gif`, `svg`, `heif`, `tiff`581 * - `mediaType`: Media Type (MIME Type) e.g. `image/jpeg`, `image/png`, `image/svg+xml`, `image/avif`582 * - `size`: Total size of image in bytes, for Stream and Buffer input only583 * - `width`: Number of pixels wide (EXIF orientation is not taken into consideration, see example below)584 * - `height`: Number of pixels high (EXIF orientation is not taken into consideration, see example below)585 * - `space`: Name of colour space interpretation e.g. `srgb`, `rgb`, `cmyk`, `lab`, `b-w` [...](https://www.libvips.org/API/current/enum.Interpretation.html)586 * - `channels`: Number of bands e.g. `3` for sRGB, `4` for CMYK587 * - `depth`: Name of pixel depth format e.g. `uchar`, `char`, `ushort`, `float` [...](https://www.libvips.org/API/current/enum.BandFormat.html)588 * - `density`: Number of pixels per inch (DPI), if present589 * - `chromaSubsampling`: String containing JPEG chroma subsampling, `4:2:0` or `4:4:4` for RGB, `4:2:0:4` or `4:4:4:4` for CMYK590 * - `isProgressive`: Boolean indicating whether the image is interlaced using a progressive scan591 * - `isPalette`: Boolean indicating whether the image is palette-based (GIF, PNG).592 * - `bitsPerSample`: Number of bits per sample for each channel (GIF, PNG, HEIF).593 * - `pages`: Number of pages/frames contained within the image, with support for TIFF, HEIF, PDF, animated GIF and animated WebP594 * - `pageHeight`: Number of pixels high each page in a multi-page image will be.595 * - `loop`: Number of times to loop an animated image, zero refers to a continuous loop.596 * - `delay`: Delay in ms between each page in an animated image, provided as an array of integers.597 * - `pagePrimary`: Number of the primary page in a HEIF image598 * - `levels`: Details of each level in a multi-level image provided as an array of objects, requires libvips compiled with support for OpenSlide599 * - `subifds`: Number of Sub Image File Directories in an OME-TIFF image600 * - `background`: Default background colour, if present, for PNG (bKGD) and GIF images601 * - `compression`: The encoder used to compress an HEIF file, `av1` (AVIF) or `hevc` (HEIC)602 * - `resolutionUnit`: The unit of resolution (density), either `inch` or `cm`, if present603 * - `hasProfile`: Boolean indicating the presence of an embedded ICC profile604 * - `hasAlpha`: Boolean indicating the presence of an alpha transparency channel605 * - `orientation`: Number value of the EXIF Orientation header, if present606 * - `exif`: Buffer containing raw EXIF data, if present607 * - `icc`: Buffer containing raw [ICC](https://www.npmjs.com/package/icc) profile data, if present608 * - `iptc`: Buffer containing raw IPTC data, if present609 * - `xmp`: Buffer containing raw XMP data, if present610 * - `xmpAsString`: String containing XMP data, if valid UTF-8.611 * - `tifftagPhotoshop`: Buffer containing raw TIFFTAG_PHOTOSHOP data, if present612 * - `formatMagick`: String containing format for images loaded via *magick613 * - `comments`: Array of keyword/text pairs representing PNG text blocks, if present.614 * - `gainMap.image`: HDR gain map, if present, as compressed JPEG image.615 *616 * @example617 * const metadata = await sharp(input).metadata();618 *619 * @example620 * const image = sharp(inputJpg);621 * image622 * .metadata()623 * .then(function(metadata) {624 * return image625 * .resize(Math.round(metadata.width / 2))626 * .webp()627 * .toBuffer();628 * })629 * .then(function(data) {630 * // data contains a WebP image half the width and height of the original JPEG631 * });632 *633 * @example634 * // Get dimensions taking EXIF Orientation into account.635 * const { autoOrient } = await sharp(input).metadata();636 * const { width, height } = autoOrient;637 *638 * @param {Function} [callback] - called with the arguments `(err, metadata)`639 * @returns {Promise<Object>|Sharp}640 */641function metadata (callback) {642 const stack = Error();643 if (is.fn(callback)) {644 if (this._isStreamInput()) {645 this.on('finish', () => {646 this._flattenBufferIn();647 sharp.metadata(this.options, (err, metadata) => {648 if (err) {649 callback(is.nativeError(err, stack));650 } else {651 callback(null, metadata);652 }653 });654 });655 } else {656 sharp.metadata(this.options, (err, metadata) => {657 if (err) {658 callback(is.nativeError(err, stack));659 } else {660 callback(null, metadata);661 }662 });663 }664 return this;665 } else {666 if (this._isStreamInput()) {667 return new Promise((resolve, reject) => {668 const finished = () => {669 this._flattenBufferIn();670 sharp.metadata(this.options, (err, metadata) => {671 if (err) {672 reject(is.nativeError(err, stack));673 } else {674 resolve(metadata);675 }676 });677 };678 if (this.writableFinished) {679 finished();680 } else {681 this.once('finish', finished);682 }683 });684 } else {685 return new Promise((resolve, reject) => {686 sharp.metadata(this.options, (err, metadata) => {687 if (err) {688 reject(is.nativeError(err, stack));689 } else {690 resolve(metadata);691 }692 });693 });694 }695 }696}697 698/**699 * Access to pixel-derived image statistics for every channel in the image.700 * A `Promise` is returned when `callback` is not provided.701 *702 * - `channels`: Array of channel statistics for each channel in the image. Each channel statistic contains703 * - `min` (minimum value in the channel)704 * - `max` (maximum value in the channel)705 * - `sum` (sum of all values in a channel)706 * - `squaresSum` (sum of squared values in a channel)707 * - `mean` (mean of the values in a channel)708 * - `stdev` (standard deviation for the values in a channel)709 * - `minX` (x-coordinate of one of the pixel where the minimum lies)710 * - `minY` (y-coordinate of one of the pixel where the minimum lies)711 * - `maxX` (x-coordinate of one of the pixel where the maximum lies)712 * - `maxY` (y-coordinate of one of the pixel where the maximum lies)713 * - `isOpaque`: Is the image fully opaque? Will be `true` if the image has no alpha channel or if every pixel is fully opaque.714 * - `entropy`: Histogram-based estimation of greyscale entropy, discarding alpha channel if any.715 * - `sharpness`: Estimation of greyscale sharpness based on the standard deviation of a Laplacian convolution, discarding alpha channel if any.716 * - `dominant`: Object containing most dominant sRGB colour based on a 4096-bin 3D histogram.717 *718 * **Note**: Statistics are derived from the original input image. Any operations performed on the image must first be719 * written to a buffer in order to run `stats` on the result (see third example).720 *721 * @example722 * const image = sharp(inputJpg);723 * image724 * .stats()725 * .then(function(stats) {726 * // stats contains the channel-wise statistics array and the isOpaque value727 * });728 *729 * @example730 * const { entropy, sharpness, dominant } = await sharp(input).stats();731 * const { r, g, b } = dominant;732 *733 * @example734 * const image = sharp(input);735 * // store intermediate result736 * const part = await image.extract(region).toBuffer();737 * // create new instance to obtain statistics of extracted region738 * const stats = await sharp(part).stats();739 *740 * @param {Function} [callback] - called with the arguments `(err, stats)`741 * @returns {Promise<Object>}742 */743function stats (callback) {744 const stack = Error();745 if (is.fn(callback)) {746 if (this._isStreamInput()) {747 this.on('finish', () => {748 this._flattenBufferIn();749 sharp.stats(this.options, (err, stats) => {750 if (err) {751 callback(is.nativeError(err, stack));752 } else {753 callback(null, stats);754 }755 });756 });757 } else {758 sharp.stats(this.options, (err, stats) => {759 if (err) {760 callback(is.nativeError(err, stack));761 } else {762 callback(null, stats);763 }764 });765 }766 return this;767 } else {768 if (this._isStreamInput()) {769 return new Promise((resolve, reject) => {770 this.on('finish', function () {771 this._flattenBufferIn();772 sharp.stats(this.options, (err, stats) => {773 if (err) {774 reject(is.nativeError(err, stack));775 } else {776 resolve(stats);777 }778 });779 });780 });781 } else {782 return new Promise((resolve, reject) => {783 sharp.stats(this.options, (err, stats) => {784 if (err) {785 reject(is.nativeError(err, stack));786 } else {787 resolve(stats);788 }789 });790 });791 }792 }793}794 795/**796 * Decorate the Sharp prototype with input-related functions.797 * @module Sharp798 * @private799 */800export default (Sharp) => {801 Object.assign(Sharp.prototype, {802 // Private803 _inputOptionsFromObject,804 _createInputDescriptor,805 _write,806 _flattenBufferIn,807 _isStreamInput,808 // Public809 metadata,810 stats811 });812 // Class attributes813 Sharp.align = align;814};815 