pica
Version:
High quality image resize in browser.
1 lines • 122 kB
Source Map (JSON)
{"version":3,"file":"pica.mjs","names":[],"sources":["../node_modules/multimath/lib/base64decode.mjs","../node_modules/multimath/lib/wa_detect.mjs","../node_modules/multimath/lib/multimath.mjs","../node_modules/glur/lib/blur_mono16.mjs","../src/mm_unsharp_mask/unsharp_mask.ts","../src/mm_unsharp_mask/unsharp_mask_wasm.ts","../src/mm_unsharp_mask/unsharp_mask_wasm_base64.ts","../src/mm_unsharp_mask/index.ts","../src/mm_resize/resize_filter_info.ts","../src/mm_resize/resize_filter_gen.ts","../src/mm_resize/convolve.ts","../src/mm_resize/resize.ts","../src/mm_resize/resize_wasm.ts","../src/mm_resize/convolve_wasm_base64.ts","../src/mm_resize/index.ts","../src/mathlib.ts","../src/pool.ts","../src/utils.ts","../src/stepper.ts","../src/tiler.ts","../src/supported_features.ts","../src/pica_main.ts"],"sourcesContent":["// base64 decode str -> Uint8Array, to load WA modules\n//\nconst BASE64_MAP = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/'\n\nexport default function base64decode (str) {\n const input = str.replace(/[\\r\\n=]/g, ''), // remove CR/LF & padding to simplify scan\n max = input.length\n\n const out = new Uint8Array((max * 3) >> 2)\n\n // Collect by 6*4 bits (3 bytes)\n\n let bits = 0\n let ptr = 0\n\n for (let idx = 0; idx < max; idx++) {\n if ((idx % 4 === 0) && idx) {\n out[ptr++] = (bits >> 16) & 0xFF\n out[ptr++] = (bits >> 8) & 0xFF\n out[ptr++] = bits & 0xFF\n }\n\n bits = (bits << 6) | BASE64_MAP.indexOf(input.charAt(idx))\n }\n\n // Dump tail\n\n const tailbits = (max % 4) * 6\n\n if (tailbits === 0) {\n out[ptr++] = (bits >> 16) & 0xFF\n out[ptr++] = (bits >> 8) & 0xFF\n out[ptr++] = bits & 0xFF\n } else if (tailbits === 18) {\n out[ptr++] = (bits >> 10) & 0xFF\n out[ptr++] = (bits >> 2) & 0xFF\n } else if (tailbits === 12) {\n out[ptr++] = (bits >> 4) & 0xFF\n }\n\n return out\n}\n","// Detect WebAssembly support.\n// - Check global WebAssembly object\n// - Try to load simple module (can be disabled via CSP)\n//\nlet wa\n\nexport default function hasWebAssembly () {\n // use cache if called before;\n if (typeof wa !== 'undefined') return wa\n\n wa = false\n\n if (typeof WebAssembly === 'undefined') return wa\n\n // If WebAssenbly is disabled, code can throw on compile\n try {\n // https://github.com/brion/min-wasm-fail/blob/master/min-wasm-fail.in.js\n // Additional check that WA internals are correct\n\n const bin = new Uint8Array([0, 97, 115, 109, 1, 0, 0, 0, 1, 6, 1, 96, 1, 127, 1, 127, 3, 2, 1, 0, 5, 3, 1, 0, 1, 7, 8, 1, 4, 116, 101, 115, 116, 0, 0, 10, 16, 1, 14, 0, 32, 0, 65, 1, 54, 2, 0, 32, 0, 40, 2, 0, 11])\n const module = new WebAssembly.Module(bin)\n const instance = new WebAssembly.Instance(module, {})\n\n // test storing to and loading from a non-zero location via a parameter.\n // Safari on iOS 11.2.5 returns 0 unexpectedly at non-zero locations\n if (instance.exports.test(4) !== 0) wa = true\n\n return wa\n } catch (__) {}\n\n return wa\n}\n","import base64decode from './base64decode.mjs'\nimport hasWebAssembly from './wa_detect.mjs'\n\nconst DEFAULT_OPTIONS = {\n js: true,\n wasm: true\n}\n\nclass MultiMath {\n constructor (options) {\n const opts = Object.assign({}, DEFAULT_OPTIONS, options || {})\n\n this.options = opts\n\n this.__cache = {}\n\n this.__init_promise = null\n this.__modules = opts.modules || {}\n this.__memory = null\n this.__wasm = {}\n\n this.__isLE = ((new Uint32Array((new Uint8Array([1, 0, 0, 0])).buffer))[0] === 1)\n\n if (!this.options.js && !this.options.wasm) {\n throw new Error('mathlib: at least \"js\" or \"wasm\" should be enabled')\n }\n }\n\n has_wasm () { return hasWebAssembly() }\n\n use (module) {\n this.__modules[module.name] = module\n\n // Pin the best possible implementation\n if (this.options.wasm && this.has_wasm() && module.wasm_fn) {\n this[module.name] = module.wasm_fn\n } else {\n this[module.name] = module.fn\n }\n\n return this\n }\n\n init () {\n if (this.__init_promise) return this.__init_promise\n\n if (!this.options.js && this.options.wasm && !this.has_wasm()) {\n return Promise.reject(new Error('mathlib: only \"wasm\" was enabled, but it\\'s not supported'))\n }\n\n this.__init_promise = Promise.all(Object.keys(this.__modules).map(name => {\n const module = this.__modules[name]\n\n if (!this.options.wasm || !this.has_wasm() || !module.wasm_fn) return null\n\n // If already compiled - exit\n if (this.__wasm[name]) return null\n\n // Compile wasm source\n return WebAssembly.compile(base64decode(module.wasm_src))\n .then(m => { this.__wasm[name] = m })\n }))\n .then(() => this)\n\n return this.__init_promise\n }\n\n // //////////////////////////////////////////////////////////////////////////////\n // Methods below are for internal use from plugins\n\n // Increase current memory to include specified number of bytes. Do nothing if\n // size is already ok. You probably don't need to call this method directly,\n // because it will be invoked from `.__instance()`.\n //\n __reallocate (bytes) {\n if (!this.__memory) {\n this.__memory = new WebAssembly.Memory({\n initial: Math.ceil(bytes / (64 * 1024))\n })\n return this.__memory\n }\n\n const mem_size = this.__memory.buffer.byteLength\n\n if (mem_size < bytes) {\n this.__memory.grow(Math.ceil((bytes - mem_size) / (64 * 1024)))\n }\n\n return this.__memory\n }\n\n // Returns instantinated webassembly item by name, with specified memory size\n // and environment.\n // - use cache if available\n // - do sync module init, if async init was not called earlier\n // - allocate memory if not enougth\n // - can export functions to webassembly via \"env_extra\",\n // for example, { exp: Math.exp }\n //\n __instance (name, memsize, env_extra) {\n if (memsize) this.__reallocate(memsize)\n\n // If .init() was not called, do sync compile\n if (!this.__wasm[name]) {\n const module = this.__modules[name]\n this.__wasm[name] = new WebAssembly.Module(base64decode(module.wasm_src))\n }\n\n if (!this.__cache[name]) {\n const env_base = {\n memoryBase: 0,\n memory: this.__memory,\n tableBase: 0,\n table: new WebAssembly.Table({ initial: 0, element: 'anyfunc' })\n }\n\n this.__cache[name] = new WebAssembly.Instance(this.__wasm[name], {\n env: Object.assign(env_base, env_extra || {})\n })\n }\n\n return this.__cache[name]\n }\n\n // Helper to calculate memory aligh for pointers. Webassembly does not require\n // this, but you may wish to experiment. Default base = 8;\n //\n __align (number, base) {\n base = base || 8\n const reminder = number % base\n return number + (reminder ? base - reminder : 0)\n }\n}\n\nexport default MultiMath\n","// Calculate Gaussian blur of an image using IIR filter\n// The method is taken from Intel's white paper and code example attached to it:\n// https://software.intel.com/en-us/articles/iir-gaussian-blur-filter\n// -implementation-using-intel-advanced-vector-extensions\n\nfunction gaussCoef (sigma) {\n if (sigma < 0.5) {\n sigma = 0.5\n }\n\n const a = Math.exp(0.726 * 0.726) / sigma,\n g1 = Math.exp(-a),\n g2 = Math.exp(-2 * a),\n k = (1 - g1) * (1 - g1) / (1 + 2 * a * g1 - g2)\n\n const a0 = k\n const a1 = k * (a - 1) * g1\n const a2 = k * (a + 1) * g1\n const a3 = -k * g2\n const b1 = 2 * g1\n const b2 = -g2\n const left_corner = (a0 + a1) / (1 - b1 - b2)\n const right_corner = (a2 + a3) / (1 - b1 - b2)\n\n // Attempt to force type to FP32.\n return new Float32Array([a0, a1, a2, a3, b1, b2, left_corner, right_corner])\n}\n\nfunction convolveMono16 (src, out, line, coeff, width, height) {\n // takes src image and writes the blurred and transposed result into out\n\n let prev_src, curr_src, curr_out, prev_out, prev_prev_out\n let src_index, out_index, line_index\n let i, j\n let coeff_a0, coeff_a1, coeff_b1, coeff_b2\n\n for (i = 0; i < height; i++) {\n src_index = i * width\n out_index = i\n line_index = 0\n\n // left to right\n prev_src = src[src_index]\n prev_prev_out = prev_src * coeff[6]\n prev_out = prev_prev_out\n\n coeff_a0 = coeff[0]\n coeff_a1 = coeff[1]\n coeff_b1 = coeff[4]\n coeff_b2 = coeff[5]\n\n for (j = 0; j < width; j++) {\n curr_src = src[src_index]\n\n curr_out = curr_src * coeff_a0 +\n prev_src * coeff_a1 +\n prev_out * coeff_b1 +\n prev_prev_out * coeff_b2\n\n prev_prev_out = prev_out\n prev_out = curr_out\n prev_src = curr_src\n\n line[line_index] = prev_out\n line_index++\n src_index++\n }\n\n src_index--\n line_index--\n out_index += height * (width - 1)\n\n // right to left\n prev_src = src[src_index]\n prev_prev_out = prev_src * coeff[7]\n prev_out = prev_prev_out\n curr_src = prev_src\n\n coeff_a0 = coeff[2]\n coeff_a1 = coeff[3]\n\n for (j = width - 1; j >= 0; j--) {\n curr_out = curr_src * coeff_a0 +\n prev_src * coeff_a1 +\n prev_out * coeff_b1 +\n prev_prev_out * coeff_b2\n\n prev_prev_out = prev_out\n prev_out = curr_out\n\n prev_src = curr_src\n curr_src = src[src_index]\n\n out[out_index] = line[line_index] + prev_out\n\n src_index--\n line_index--\n out_index -= height\n }\n }\n}\n\nfunction blurMono16 (src, width, height, radius) {\n // Quick exit on zero radius\n if (!radius) { return }\n\n const out = new Uint16Array(src.length),\n tmp_line = new Float32Array(Math.max(width, height))\n\n const coeff = gaussCoef(radius)\n\n convolveMono16(src, out, tmp_line, coeff, width, height, radius)\n convolveMono16(out, src, tmp_line, coeff, height, width, radius)\n}\n\nexport default blurMono16\n","// Unsharp mask filter\n//\n// http://stackoverflow.com/a/23322820/1031804\n// USM(O) = O + (2 * (Amount / 100) * (O - GB))\n// GB - gaussian blur.\n//\n// Image is converted from RGB to HSV, unsharp mask is applied to the\n// brightness channel and then image is converted back to RGB.\n//\nimport { blurMono16 } from 'glur'\nimport type { MathImageBuffer } from '../mathlib'\n\nfunction hsv_v16 (img: MathImageBuffer, width: number, height: number): Uint16Array {\n const size = width * height\n const out = new Uint16Array(size)\n let r, g, b, max\n for (let i = 0; i < size; i++) {\n r = img[4 * i]\n g = img[4 * i + 1]\n b = img[4 * i + 2]\n max = (r >= g && r >= b) ? r : (g >= b && g >= r) ? g : b\n out[i] = max << 8\n }\n return out\n}\n\nexport default function unsharp (\n img: MathImageBuffer,\n width: number,\n height: number,\n amount: number,\n radius: number,\n threshold: number\n): void {\n let v1, v2, vmul\n let diff, iTimes4\n\n if (amount === 0 || radius < 0.5) {\n return\n }\n if (radius > 2.0) {\n radius = 2.0\n }\n\n const brightness = hsv_v16(img, width, height)\n\n const blured = new Uint16Array(brightness) // copy, because blur modifies src\n\n blurMono16(blured, width, height, radius)\n\n const amountFp = (amount / 100 * 0x1000 + 0.5)|0\n const thresholdFp = threshold << 8\n\n const size = width * height\n\n for (let i = 0; i < size; i++) {\n v1 = brightness[i]\n diff = v1 - blured[i]\n\n if (Math.abs(diff) >= thresholdFp) {\n // add unsharp mask to the brightness channel\n v2 = v1 + ((amountFp * diff + 0x800) >> 12)\n\n // Both v1 and v2 are within [0.0 .. 255.0] (0000-FF00) range, never going into\n // [255.003 .. 255.996] (FF01-FFFF). This allows to round this value as (x+.5)|0\n // later without overflowing.\n v2 = v2 > 0xff00 ? 0xff00 : v2\n v2 = v2 < 0x0000 ? 0x0000 : v2\n\n // Avoid division by 0. V=0 means rgb(0,0,0), unsharp with unsharpAmount>0 cannot\n // change this value (because diff between colors gets inflated), so no need to verify correctness.\n v1 = v1 !== 0 ? v1 : 1\n\n // Multiplying V in HSV model by a constant is equivalent to multiplying each component\n // in RGB by the same constant (same for HSL), see also:\n // https://beesbuzz.biz/code/16-hsv-color-transforms\n vmul = ((v2 << 12) / v1)|0\n\n // Result will be in [0..255] range because:\n // - all numbers are positive\n // - r,g,b <= (v1/256)\n // - r,g,b,(v1/256),(v2/256) <= 255\n // So highest this number can get is X*255/X+0.5=255.5 which is < 256 and rounds down.\n\n iTimes4 = i * 4\n img[iTimes4] = (img[iTimes4] * vmul + 0x800) >> 12 // R\n img[iTimes4 + 1] = (img[iTimes4 + 1] * vmul + 0x800) >> 12 // G\n img[iTimes4 + 2] = (img[iTimes4 + 2] * vmul + 0x800) >> 12 // B\n }\n }\n}\n","import type { MathWasmContext, MathImageBuffer } from '../mathlib'\n\nexport default function unsharp (\n this: MathWasmContext,\n img: MathImageBuffer,\n width: number,\n height: number,\n amount: number,\n radius: number,\n threshold: number\n): void {\n if (amount === 0 || radius < 0.5) {\n return\n }\n\n if (radius > 2.0) {\n radius = 2.0\n }\n\n const pixels = width * height\n\n const img_bytes_cnt = pixels * 4\n const hsv_bytes_cnt = pixels * 2\n const blur_bytes_cnt = pixels * 2\n const blur_line_byte_cnt = Math.max(width, height) * 4 // float32 array\n const blur_coeffs_byte_cnt = 8 * 4 // float32 array\n\n const img_offset = 0\n const hsv_offset = img_bytes_cnt\n const blur_offset = hsv_offset + hsv_bytes_cnt\n const blur_tmp_offset = blur_offset + blur_bytes_cnt\n const blur_line_offset = blur_tmp_offset + blur_bytes_cnt\n const blur_coeffs_offset = blur_line_offset + blur_line_byte_cnt\n\n const instance = this.__instance(\n 'unsharp_mask',\n img_bytes_cnt + hsv_bytes_cnt + blur_bytes_cnt * 2 + blur_line_byte_cnt + blur_coeffs_byte_cnt,\n { exp: Math.exp }\n )\n\n // 32-bit copy is much faster in chrome\n const img32 = new Uint32Array(img.buffer)\n const mem32 = new Uint32Array(this.__memory!.buffer)\n mem32.set(img32)\n\n // HSL\n let fn = (instance.exports.hsv_v16 || instance.exports._hsv_v16) as Function | undefined\n if (!fn) throw new Error('WASM hsv_v16 function is not available')\n fn(img_offset, hsv_offset, width, height)\n\n // BLUR\n fn = (instance.exports.blurMono16 || instance.exports._blurMono16) as Function | undefined\n if (!fn) throw new Error('WASM blurMono16 function is not available')\n fn(hsv_offset, blur_offset, blur_tmp_offset,\n blur_line_offset, blur_coeffs_offset, width, height, radius)\n\n // UNSHARP\n fn = (instance.exports.unsharp || instance.exports._unsharp) as Function | undefined\n if (!fn) throw new Error('WASM unsharp function is not available')\n fn(img_offset, img_offset, hsv_offset,\n blur_offset, width, height, amount, threshold)\n\n // 32-bit copy is much faster in chrome\n img32.set(new Uint32Array(this.__memory!.buffer, 0, pixels))\n}\n","// This is autogenerated file from math.wasm, don't edit.\n//\nexport default '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'\n","import fn from './unsharp_mask'\nimport wasm_fn from './unsharp_mask_wasm'\nimport wasm_src from './unsharp_mask_wasm_base64'\n\nexport default {\n name: 'unsharp_mask' as const,\n fn,\n wasm_fn,\n wasm_src\n}\n","import type { MathResizeFilter } from '../mathlib'\n\n// Filter definitions to build tables for\n// resizing convolvers.\n//\n// Presets for quality 0..3. Filter functions + window size\n//\nexport interface FilterInfo {\n win: number\n fn: (x: number) => number\n}\n\nconst filter: Record<MathResizeFilter, FilterInfo> = {\n // Nearest neighbor\n box: {\n win: 0.5,\n fn (x: number) {\n if (x < 0) x = -x\n return (x < 0.5) ? 1.0 : 0.0\n }\n },\n // // Hamming\n hamming: {\n win: 1.0,\n fn (x: number) {\n if (x < 0) x = -x\n if (x >= 1.0) { return 0.0 }\n if (x < 1.19209290E-07) { return 1.0 }\n const xpi = x * Math.PI\n return ((Math.sin(xpi) / xpi) * (0.54 + 0.46 * Math.cos(xpi / 1.0)))\n }\n },\n // Lanczos, win = 2\n lanczos2: {\n win: 2.0,\n fn (x: number) {\n if (x < 0) x = -x\n if (x >= 2.0) { return 0.0 }\n if (x < 1.19209290E-07) { return 1.0 }\n const xpi = x * Math.PI\n return (Math.sin(xpi) / xpi) * Math.sin(xpi / 2.0) / (xpi / 2.0)\n }\n },\n // Lanczos, win = 3\n lanczos3: {\n win: 3.0,\n fn (x: number) {\n if (x < 0) x = -x\n if (x >= 3.0) { return 0.0 }\n if (x < 1.19209290E-07) { return 1.0 }\n const xpi = x * Math.PI\n return (Math.sin(xpi) / xpi) * Math.sin(xpi / 3.0) / (xpi / 3.0)\n }\n },\n // Magic Kernel Sharp 2013, win = 2.5\n // http://johncostella.com/magic/\n mks2013: {\n win: 2.5,\n fn (x: number) {\n if (x < 0) x = -x\n if (x >= 2.5) { return 0.0 }\n if (x >= 1.5) { return -0.125 * (x - 2.5) * (x - 2.5) }\n if (x >= 0.5) { return 0.25 * (4 * x * x - 11 * x + 7) }\n return 1.0625 - 1.75 * x * x\n }\n }\n}\n\nexport default {\n filter\n}\n","// Calculate convolution filters for each destination point,\n// and pack data to Int16Array:\n//\n// [ shift, length, data..., shift2, length2, data..., ... ]\n//\n// - shift - offset in src image\n// - length - filter length (in src points)\n// - data - filter values sequence\n//\nimport FILTER_INFO from './resize_filter_info'\nimport type { MathResizeFilter } from '../mathlib'\n\n// Precision of fixed FP values\nconst FIXED_FRAC_BITS = 14\n\nfunction toFixedPoint (num: number): number {\n return Math.round(num * ((1 << FIXED_FRAC_BITS) - 1))\n}\n\nexport default function resizeFilterGen (\n filter: MathResizeFilter,\n srcSize: number,\n destSize: number,\n scale: number,\n offset: number\n): Int16Array {\n const filterFunction = FILTER_INFO.filter[filter].fn\n\n const scaleInverted = 1.0 / scale\n const scaleClamped = Math.min(1.0, scale) // For upscale\n\n // Filter window (averaging interval), scaled to src image\n const srcWindow = FILTER_INFO.filter[filter].win / scaleClamped\n\n let destPixel, srcPixel, srcFirst, srcLast, filterElementSize,\n floatFilter, fxpFilter, total, pxl, idx, floatVal, filterTotal, filterVal\n let leftNotEmpty, rightNotEmpty, filterShift, filterSize\n\n const maxFilterElementSize = Math.floor((srcWindow + 1) * 2)\n const packedFilter = new Int16Array((maxFilterElementSize + 2) * destSize)\n let packedFilterPtr = 0\n\n const slowCopy = !packedFilter.subarray || !packedFilter.set\n\n // For each destination pixel calculate source range and built filter values\n for (destPixel = 0; destPixel < destSize; destPixel++) {\n // Scaling should be done relative to central pixel point\n srcPixel = (destPixel + 0.5) * scaleInverted + offset\n\n srcFirst = Math.max(0, Math.floor(srcPixel - srcWindow))\n srcLast = Math.min(srcSize - 1, Math.ceil(srcPixel + srcWindow))\n\n filterElementSize = srcLast - srcFirst + 1\n floatFilter = new Float32Array(filterElementSize)\n fxpFilter = new Int16Array(filterElementSize)\n\n total = 0.0\n\n // Fill filter values for calculated range\n for (pxl = srcFirst, idx = 0; pxl <= srcLast; pxl++, idx++) {\n floatVal = filterFunction(((pxl + 0.5) - srcPixel) * scaleClamped)\n total += floatVal\n floatFilter[idx] = floatVal\n }\n\n // Normalize filter, convert to fixed point and accumulate conversion error\n filterTotal = 0\n\n for (idx = 0; idx < floatFilter.length; idx++) {\n filterVal = floatFilter[idx] / total\n filterTotal += filterVal\n fxpFilter[idx] = toFixedPoint(filterVal)\n }\n\n // Compensate normalization error, to minimize brightness drift\n fxpFilter[destSize >> 1] += toFixedPoint(1.0 - filterTotal)\n\n //\n // Now pack filter to useable form\n //\n // 1. Trim leading and trailing zero values, and compensate shift/length\n // 2. Put all to single array in this format:\n //\n // [ pos shift, data length, value1, value2, value3, ... ]\n //\n\n leftNotEmpty = 0\n while (leftNotEmpty < fxpFilter.length && fxpFilter[leftNotEmpty] === 0) {\n leftNotEmpty++\n }\n\n if (leftNotEmpty < fxpFilter.length) {\n rightNotEmpty = fxpFilter.length - 1\n while (rightNotEmpty > 0 && fxpFilter[rightNotEmpty] === 0) {\n rightNotEmpty--\n }\n\n filterShift = srcFirst + leftNotEmpty\n filterSize = rightNotEmpty - leftNotEmpty + 1\n\n packedFilter[packedFilterPtr++] = filterShift // shift\n packedFilter[packedFilterPtr++] = filterSize // size\n\n if (!slowCopy) {\n packedFilter.set(fxpFilter.subarray(leftNotEmpty, rightNotEmpty + 1), packedFilterPtr)\n packedFilterPtr += filterSize\n } else {\n // fallback for old IE < 11, without subarray/set methods\n for (idx = leftNotEmpty; idx <= rightNotEmpty; idx++) {\n packedFilter[packedFilterPtr++] = fxpFilter[idx]\n }\n }\n } else {\n // zero data, write header only\n packedFilter[packedFilterPtr++] = 0 // shift\n packedFilter[packedFilterPtr++] = 0 // size\n }\n }\n return packedFilter\n}\n","// Resize convolvers, pure JS implementation\n//\n// Precision of fixed FP values\n// var FIXED_FRAC_BITS = 14;\n\nfunction clampTo8 (i: number): number { return i < 0 ? 0 : (i > 255 ? 255 : i) }\nfunction clampNegative (i: number): number { return i >= 0 ? i : 0 }\n\nimport type { MathImageBuffer } from '../mathlib'\n\n// Convolve image data in horizontal direction. Can be used for:\n//\n// 1. bitmap with premultiplied alpha\n// 2. bitmap without alpha (all values 255)\n//\n// Notes:\n//\n// - output is transposed\n// - output resolution is ~15 bits per channel(for better precision).\n//\nfunction convolveHor (\n src: MathImageBuffer,\n dest: Uint16Array,\n srcW: number,\n srcH: number,\n destW: number,\n filters: Int16Array\n): void {\n let r, g, b, a\n let filterPtr, filterShift, filterSize\n let srcPtr, srcY, destX, filterVal\n let srcOffset = 0, destOffset = 0\n\n // For each row\n for (srcY = 0; srcY < srcH; srcY++) {\n filterPtr = 0\n\n // Apply precomputed filters to each destination row point\n for (destX = 0; destX < destW; destX++) {\n // Get the filter that determines the current output pixel.\n filterShift = filters[filterPtr++]\n filterSize = filters[filterPtr++]\n\n srcPtr = (srcOffset + (filterShift * 4))|0\n\n r = g = b = a = 0\n\n // Apply the filter to the row to get the destination pixel r, g, b, a\n for (; filterSize > 0; filterSize--) {\n filterVal = filters[filterPtr++]\n\n // Use reverse order to workaround deopts in old v8 (node v.10)\n // Big thanks to @mraleph (Vyacheslav Egorov) for the tip.\n a = (a + filterVal * src[srcPtr + 3])|0\n b = (b + filterVal * src[srcPtr + 2])|0\n g = (g + filterVal * src[srcPtr + 1])|0\n r = (r + filterVal * src[srcPtr])|0\n srcPtr = (srcPtr + 4)|0\n }\n\n // Store 15 bits between passes for better precision\n // Instead of shift to 14 (FIXED_FRAC_BITS), shift to 7 only\n //\n dest[destOffset + 3] = clampNegative(a >> 7)\n dest[destOffset + 2] = clampNegative(b >> 7)\n dest[destOffset + 1] = clampNegative(g >> 7)\n dest[destOffset] = clampNegative(r >> 7)\n destOffset = (destOffset + srcH * 4)|0\n }\n\n destOffset = ((srcY + 1) * 4)|0\n srcOffset = ((srcY + 1) * srcW * 4)|0\n }\n}\n\n// Supplementary method for `convolveHor()`\n//\nfunction convolveVert (\n src: Uint16Array,\n dest: Uint8Array,\n srcW: number,\n srcH: number,\n destW: number,\n filters: Int16Array\n): void {\n let r, g, b, a\n let filterPtr, filterShift, filterSize\n let srcPtr, srcY, destX, filterVal\n let srcOffset = 0, destOffset = 0\n\n // For each row\n for (srcY = 0; srcY < srcH; srcY++) {\n filterPtr = 0\n\n // Apply precomputed filters to each destination row point\n for (destX = 0; destX < destW; destX++) {\n // Get the filter that determines the current output pixel.\n filterShift = filters[filterPtr++]\n filterSize = filters[filterPtr++]\n\n srcPtr = (srcOffset + (filterShift * 4))|0\n\n r = g = b = a = 0\n\n // Apply the filter to the row to get the destination pixel r, g, b, a\n for (; filterSize > 0; filterSize--) {\n filterVal = filters[filterPtr++]\n\n // Use reverse order to workaround deopts in old v8 (node v.10)\n // Big thanks to @mraleph (Vyacheslav Egorov) for the tip.\n a = (a + filterVal * src[srcPtr + 3])|0\n b = (b + filterVal * src[srcPtr + 2])|0\n g = (g + filterVal * src[srcPtr + 1])|0\n r = (r + filterVal * src[srcPtr])|0\n srcPtr = (srcPtr + 4)|0\n }\n\n // Sync with premultiplied version for exact result match\n r >>= 7\n g >>= 7\n b >>= 7\n a >>= 7\n\n // Bring this value back in range + round result.\n //\n dest[destOffset + 3] = clampTo8((a + (1 << 13)) >> 14)\n dest[destOffset + 2] = clampTo8((b + (1 << 13)) >> 14)\n dest[destOffset + 1] = clampTo8((g + (1 << 13)) >> 14)\n dest[destOffset] = clampTo8((r + (1 << 13)) >> 14)\n destOffset = (destOffset + srcH * 4)|0\n }\n\n destOffset = ((srcY + 1) * 4)|0\n srcOffset = ((srcY + 1) * srcW * 4)|0\n }\n}\n\n// Premultiply & convolve image data in horizontal direction. Can be used for:\n//\n// - Any bitmap data, extracted with `.getImageData()` method (with\n// non-premultiplied alpha)\n//\n// For images without alpha channel this method is slower than `convolveHor()`\n//\nfunction convolveHorWithPre (\n src: MathImageBuffer,\n dest: Uint16Array,\n srcW: number,\n srcH: number,\n destW: number,\n filters: Int16Array\n): void {\n let r, g, b, a, alpha\n let filterPtr, filterShift, filterSize\n let srcPtr, srcY, destX, filterVal\n let srcOffset = 0, destOffset = 0\n\n // For each row\n for (srcY = 0; srcY < srcH; srcY++) {\n filterPtr = 0\n\n // Apply precomputed filters to each destination row point\n for (destX = 0; destX < destW; destX++) {\n // Get the filter that determines the current output pixel.\n filterShift = filters[filterPtr++]\n filterSize = filters[filterPtr++]\n\n srcPtr = (srcOffset + (filterShift * 4))|0\n\n r = g = b = a = 0\n\n // Apply the filter to the row to get the destination pixel r, g, b, a\n for (; filterSize > 0; filterSize--) {\n filterVal = filters[filterPtr++]\n\n // Use reverse order to workaround deopts in old v8 (node v.10)\n // Big thanks to @mraleph (Vyacheslav Egorov) for the tip.\n alpha = src[srcPtr + 3]\n a = (a + filterVal * alpha)|0\n b = (b + filterVal * src[srcPtr + 2] * alpha)|0\n g = (g + filterVal * src[srcPtr + 1] * alpha)|0\n r = (r + filterVal * src[srcPtr] * alpha)|0\n srcPtr = (srcPtr + 4)|0\n }\n\n // Premultiply is (* alpha / 255).\n // Postpone division for better performance\n b = (b / 255)|0\n g = (g / 255)|0\n r = (r / 255)|0\n\n // Store 15 bits between passes for better precision\n // Instead of shift to 14 (FIXED_FRAC_BITS), shift to 7 only\n //\n dest[destOffset + 3] = clampNegative(a >> 7)\n dest[destOffset + 2] = clampNegative(b >> 7)\n dest[destOffset + 1] = clampNegative(g >> 7)\n dest[destOffset] = clampNegative(r >> 7)\n destOffset = (destOffset + srcH * 4)|0\n }\n\n destOffset = ((srcY + 1) * 4)|0\n srcOffset = ((srcY + 1) * srcW * 4)|0\n }\n}\n\n// Supplementary method for `convolveHorWithPre()`\n//\nfunction convolveVertWithPre (\n src: Uint16Array,\n dest: Uint8Array,\n srcW: number,\n srcH: number,\n destW: number,\n filters: Int16Array\n): void {\n let r, g, b, a\n let filterPtr, filterShift, filterSize\n let srcPtr, srcY, destX, filterVal\n let srcOffset = 0, destOffset = 0\n\n // For each row\n for (srcY = 0; srcY < srcH; srcY++) {\n filterPtr = 0\n\n // Apply precomputed filters to each destination row point\n for (destX = 0; destX < destW; destX++) {\n // Get the filter that determines the current output pixel.\n filterShift = filters[filterPtr++]\n filterSize = filters[filterPtr++]\n\n srcPtr = (srcOffset + (filterShift * 4))|0\n\n r = g = b = a = 0\n\n // Apply the filter to the row to get the destination pixel r, g, b, a\n for (; filterSize > 0; filterSize--) {\n filterVal = filters[filterPtr++]\n\n // Use reverse order to workaround deopts in old v8 (node v.10)\n // Big thanks to @mraleph (Vyacheslav Egorov) for the tip.\n a = (a + filterVal * src[srcPtr + 3])|0\n b = (b + filterVal * src[srcPtr + 2])|0\n g = (g + filterVal * src[srcPtr + 1])|0\n r = (r + filterVal * src[srcPtr])|0\n srcPtr = (srcPtr + 4)|0\n }\n\n // Downscale to leave room for un-premultiply\n r >>= 7\n g >>= 7\n b >>= 7\n a >>= 7\n\n // Un-premultiply\n a = clampTo8((a + (1 << 13)) >> 14)\n if (a > 0) {\n r = (r * 255 / a)|0\n g = (g * 255 / a)|0\n b = (b * 255 / a)|0\n }\n\n // Bring this value back in range + round result.\n // Shift value = FIXED_FRAC_BITS + 7\n //\n dest[destOffset + 3] = a\n dest[destOffset + 2] = clampTo8((b + (1 << 13)) >> 14)\n dest[destOffset + 1] = clampTo8((g + (1 << 13)) >> 14)\n dest[destOffset] = clampTo8((r + (1 << 13)) >> 14)\n destOffset = (destOffset + srcH * 4)|0\n }\n\n destOffset = ((srcY + 1) * 4)|0\n srcOffset = ((srcY + 1) * srcW * 4)|0\n }\n}\n\nexport {\n convolveHor,\n convolveVert,\n convolveHorWithPre,\n convolveVertWithPre\n}\n","import createFilters from './resize_filter_gen'\nimport { convolveHor, convolveVert, convolveHorWithPre, convolveVertWithPre } from './convolve'\nimport type { MathResizeOptions, MathImageBuffer } from '../mathlib'\n\nfunction hasAlpha (src: MathImageBuffer, width: number, height: number): boolean {\n let ptr = 3\n const len = (width * height * 4)|0\n while (ptr < len) {\n if (src[ptr] !== 255) return true\n ptr = (ptr + 4)|0\n }\n return false\n}\n\nfunction resetAlpha (dst: Uint8Array, width: number, height: number): void {\n let ptr = 3\n const len = (width * height * 4)|0\n while (ptr < len) { dst[ptr] = 0xFF; ptr = (ptr + 4)|0 }\n}\n\nexport default function resize (options: MathResizeOptions): Uint8Array {\n const src = options.src\n const srcW = options.width\n const srcH = options.height\n const destW = options.toWidth\n const destH = options.toHeight\n const scaleX = options.scaleX || options.toWidth / options.width\n const scaleY = options.scaleY || options.toHeight / options.height\n const offsetX = options.offsetX || 0\n const offsetY = options.offsetY || 0\n const dest = options.dest || new Uint8Array(destW * destH * 4)\n\n const filter = typeof options.filter === 'undefined' ? 'mks2013' : options.filter\n const filtersX = createFilters(filter, srcW, destW, scaleX, offsetX),\n filtersY = createFilters(filter, srcH, destH, scaleY, offsetY)\n\n const tmp = new Uint16Array(destW * srcH * 4)\n\n // Autodetect if alpha channel exists, and use appropriate method\n if (hasAlpha(src, srcW, srcH)) {\n convolveHorWithPre(src, tmp, srcW, srcH, destW, filtersX)\n convolveVertWithPre(tmp, dest, srcH, destW, destH, filtersY)\n } else {\n convolveHor(src, tmp, srcW, srcH, destW, filtersX)\n convolveVert(tmp, dest, srcH, destW, destH, filtersY)\n resetAlpha(dest, destW, destH)\n }\n\n return dest\n}\n","import createFilters from './resize_filter_gen'\nimport type { MathResizeOptions, MathWasmContext, MathImageBuffer } from '../mathlib'\n\nfunction hasAlpha (src: MathImageBuffer, width: number, height: number): boolean {\n let ptr = 3\n const len = (width * height * 4)|0\n while (ptr < len) {\n if (src[ptr] !== 255) return true\n ptr = (ptr + 4)|0\n }\n return false\n}\n\nfunction resetAlpha (dst: Uint8Array, width: number, height: number): void {\n let ptr = 3\n const len = (width * height * 4)|0\n while (ptr < len) { dst[ptr] = 0xFF; ptr = (ptr + 4)|0 }\n}\n\nfunction asUint8Array (src: Int16Array): Uint8Array {\n return new Uint8Array(src.buffer, 0, src.byteLength)\n}\n\nlet IS_LE = true\n// should not crash everything on module load in old browsers\ntry {\n IS_LE = ((new Uint32Array((new Uint8Array([1, 0, 0, 0])).buffer))[0] === 1)\n} catch (__) {}\n\nfunction copyInt16asLE (src: Int16Array, target: Uint8Array, target_offset: number): void {\n if (IS_LE) {\n target.set(asUint8Array(src), target_offset)\n return\n }\n\n for (let ptr = target_offset, i = 0; i < src.length; i++) {\n const data = src[i]\n target[ptr++] = data & 0xFF\n target[ptr++] = (data >> 8) & 0xFF\n }\n}\n\nexport default function resize_wasm (this: MathWasmContext, options: MathResizeOptions): Uint8Array {\n const src = options.src\n const srcW = options.width\n const srcH = options.height\n const destW = options.toWidth\n const destH = options.toHeight\n const scaleX = options.scaleX || options.toWidth / options.width\n const scaleY = options.scaleY || options.toHeight / options.height\n const offsetX = options.offsetX || 0.0\n const offsetY = options.offsetY || 0.0\n const dest = options.dest || new Uint8Array(destW * destH * 4)\n\n const filter = typeof options.filter === 'undefined' ? 'mks2013' : options.filter\n const filtersX = createFilters(filter, srcW, destW, scaleX, offsetX),\n filtersY = createFilters(filter, srcH, destH, scaleY, offsetY)\n\n // destination is 0 too.\n const src_offset = 0\n const src_size = Math.max(src.byteLength, dest.byteLength)\n // buffer between convolve passes\n const tmp_offset = this.__align(src_offset + src_size)\n const tmp_size = srcH * destW * 4 * 2 // 2 bytes per channel\n\n const filtersX_offset = this.__align(tmp_offset + tmp_size)\n const filtersY_offset = this.__align(filtersX_offset + filtersX.byteLength)\n const alloc_bytes = filtersY_offset + filtersY.byteLength\n\n const instance = this.__instance('resize', alloc_bytes)\n\n //\n // Fill memory block with data to process\n //\n\n const mem = new Uint8Array(this.__memory!.buffer)\n const mem32 = new Uint32Array(this.__memory!.buffer)\n\n // 32-bit copy is much faster in chrome\n const src32 = new Uint32Array(src.buffer)\n mem32.set(src32)\n\n // We should guarantee LE bytes order. Filters are not big, so\n // speed difference is not significant vs direct .set()\n copyInt16asLE(filtersX, mem, filtersX_offset)\n copyInt16asLE(filtersY, mem, filtersY_offset)\n\n // Now call webassembly method\n // emsdk does method names with '_'\n const fn = (instance.exports.convolveHV || instance.exports._convolveHV) as Function | undefined\n if (!fn) throw new Error('WASM resize function is not available')\n\n if (hasAlpha(src, srcW, srcH)) {\n fn(filtersX_offset, filtersY_offset, tmp_offset, srcW, srcH, destW, destH, 1)\n } else {\n fn(filtersX_offset, filtersY_offset, tmp_offset, srcW, srcH, destW, destH, 0)\n resetAlpha(dest, destW, destH)\n }\n\n //\n // Copy data back to typed array\n //\n\n // 32-bit copy is much faster in chrome\n const dest32 = new Uint32Array(dest.buffer)\n dest32.set(new Uint32Array(this.__memory!.buffer, 0, destH * destW))\n\n return dest\n}\n","// This is autogenerated file from math.wasm, don't edit.\n//\nexport default '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'\n","import fn from './resize'\nimport wasm_fn from './resize_wasm'\nimport wasm_src from './convolve_wasm_base64'\n\nexport default {\n name: 'resize' as const,\n fn,\n wasm_fn,\n wasm_src\n}\n","// Collection of math functions\n//\n// 1. Combine components together\n// 2. Has async init to load wasm modules\n//\nimport { MultiMath } from 'multimath'\n\nimport mm_unsharp_mask from './mm_unsharp_mask'\nimport mm_resize from './mm_resize'\n\nexport type MathFeaturesMap = { js: boolean; wasm: boolean }\nexport type { MultiMathPlugin as MathPlugin } from 'multimath'\nexport type MathImageBuffer = Uint8Array | Uint8ClampedArray\nexport type MathWasmContext = MultiMath\n\nexport type MathResizeFilter = 'box' | 'hamming' | 'lanczos2' | 'lanczos3' | 'mks2013'\n\nexport interface MathResizeOptions {\n src: MathImageBuffer\n width: number\n height: number\n toWidth: number\n toHeight: number\n dest?: Uint8Array\n scaleX: number\n scaleY: number\n offsetX: number\n offsetY: number\n filter: MathResizeFilter\n}\n\nexport interface MathResizeAndUnsharpOptions extends MathResizeOptions {\n unsharpAmount: number\n unsharpRadius: number\n unsharpThreshold: number\n}\n\nexport default class MathLib extends MultiMath {\n declare features: MathFeaturesMap\n declare resize: typeof mm_resize.fn\n declare unsharp_mask: typeof mm_unsharp_mask.fn\n\n constructor (requested_features?: readonly string[]) {\n const __requested_features = requested_features || []\n\n const features = {\n js: __requested_features.indexOf('js') >= 0,\n wasm: __requested_features.indexOf('wasm') >= 0\n }\n\n super(features)\n\n this.features = {\n js: features.js,\n wasm: features.wasm && this.has_wasm()\n }\n\n this.use(mm_unsharp_mask)\n this.use(mm_resize)\n }\n\n resizeAndUnsharp (options: MathResizeAndUnsharpOptions): Uint8Array {\n const result = this.resize(options)\n\n if (options.unsharpAmount) {\n this.unsharp_mask(\n result,\n options.toWidth,\n options.toHeight,\n options.unsharpAmount,\n options.unsharpRadius,\n options.unsharpThreshold\n )\n }\n\n return result\n }\n}\n","const GC_INTERVAL = 100\n\n// Acquired items\nexport interface PoolResource<T> {\n value: T\n release: () => void\n}\n\n// Internal storage format\ninterface PoolResourceDescriptor<T> {\n id: number\n lastUsed: number\n value: T\n destroy: () => void\n}\n\nexport default class Pool<T> {\n create: () => { value: T, destroy: () => void }\n available: Array<PoolResourceDescriptor<T>>\n acquired: Record<number, PoolResourceDescriptor<T>>\n lastId: number\n timeoutId: ReturnType<typeof setTimeout> | 0\n idle: number\n\n constructor (create: () => { value: T, destroy: () => void }, idle?: number) {\n this.create = create\n\n this.available = []\n this.acquired = {}\n this.lastId = 1\n\n this.timeoutId = 0\n this.idle = idle || 2000\n }\n\n acquire (): PoolResource<T> {\n let descriptor: PoolResourceDescriptor<T>\n\n if (this.available.length !== 0) {\n descriptor = this.available.pop() as PoolResourceDescriptor<T>\n } else {\n const init = this.create()\n descriptor = { ...init, id: this.lastId++, lastUsed: 0 }\n }\n this.acquired[descriptor.id] = descriptor\n return { value: descriptor.value, release: () => this.release(descriptor) }\n }\n\n release (descriptor: PoolResourceDescriptor<T>): void {\n delete this.acquired[descriptor.id]\n\n descriptor.lastUsed = Date.now()\n this.available.push(descriptor)\n\n if (this.timeoutId === 0) {\n this.timeoutId = setTimeout(() => this.gc(), GC_INTERVAL)\n }\n }\n\n gc (): void {\n const now = Date.now()\n\n this.available = this.available.filter(descriptor => {\n if (now - descriptor.lastUsed > this.idle) {\n descriptor.destroy()\n return false\n }\n return true\n })\n\n if (this.available.length !== 0) {\n this.timeoutId = setTimeout(() => this.gc(), GC_INTERVAL)\n } else {\n this.timeoutId = 0\n }\n }\n}\n","import type { CibResizeQuality, Filter, Limiter, PicaCanvas } from './types'\n\n// Uses constructor.name — safe because all targets are browser built-ins or\n// native Node.js library classes that minifiers don't rename. If this ever\n// breaks after a toolchain change, fall back to Object.prototype.toString:\n// Object.prototype.toString.call(obj) === '[object HTMLCanvasElement]' etc.\nfunction objClass (obj: unknown): string {\n return (obj as any)?.constructor?.name ?? ''\n}\n\nexport function isCanvas (element: unknown): element is PicaCanvas {\n const cname = objClass(element)\n\n return cname === 'HTMLCanvasElement' ||\n cname === 'OffscreenCanvas' ||\n cname === 'Canvas' /* node-canvas */ ||\n cname === 'CanvasElement' /* @napi-rs/canvas */\n}\n\nexport function isImage (element: unknown): element is HTMLImageElement {\n return objClass(element) === 'HTMLImageElement'\n}\n\nexport function isImageBitmap (element: unknown): element is ImageBitmap {\n return objClass(element) === 'ImageBitmap'\n}\n\nexport function limiter (concurrency: number): Limiter {\n let active = 0\n const queue: Array<() => void> = []\n\n function roll () {\n if (active < concurrency && queue.length) {\n active++\n queue.shift()?.()\n }\n }\n\n return function limit<T> (fn: () => Promise<T>): Promise<T> {\n return new Promise((resolve, reject) => {\n queue.push(() => {\n fn().then(\n result => {\n resolve(result)\n active--\n roll()\n },\n err => {\n reject(err)\n active--\n roll()\n }\n )\n })\n\n roll()\n })\n }\n}\n\nexport function cib_quality_name (num: number): ResizeQuality {\n switch (num) {\n case 0: return 'pixelated'\n case 1: return 'low'\n case 2: return 'medium'\n }\n return 'high'\n}\n\nconst CIB_QUALITY_FILTERS: Filter[] = ['box', 'hamming', 'lanczos2', 'lanczos3']\n\nexport function cib_quality_filter (num: CibResizeQuality): Filter {\n return CIB_QUALITY_FILTERS[num]\n}\n\nexport function is_cib_filter (filter: Filter): boolean {\n return CIB_QUALITY_FILTERS.indexOf(filter) >= 0\n}\n\nexport function filter_to_cib_quality (filter: Filter): CibResizeQuality | undefined {\n const index = CIB_QUALITY_FILTERS.indexOf(filter)\n\n return index >= 0 ? index as CibResizeQuality : undefined\n}\n\ntype ResizeQuality = 'pixelated' | 'low' | 'medium' | 'high'\n","export type Stage = [width: number, height: number]\n\n// Add intermediate resizing steps when scaling down by a very large factor.\n//\n// For example, when resizing 10000x10000 down to 10x10, it'll resize it to\n// 300x300 first.\n//\n// It's needed because tiler has issues when the entire tile is scaled down\n// to a few pixels (1024px source tile with border size 3 should result in\n// at least 3+3+2 = 8px target tile, so max scale factor is 128 here).\n//\n// Also, adding intermediate steps can speed up processing if we use lower\n// quality algorithms for first stages.\n//\n\n// min size = 0 results in infinite loop,\n// min size = 1 can consume large amount of memory\nconst MIN_INNER_TILE_SIZE = 2\n\nconst DEST_TILE_BORDER = 3 // Max possible filter window size\n\nexport default function createStages (\n fromWidth: number,\n fromHeight: number,\n toWidth: number,\n toHeight: number,\n srcTileSize: number\n): Stage[] {\n const scaleX = toWidth / fromWidth\n const scaleY = toHeight / fromHeight\n\n // derived from createRegions equation:\n // innerTileWidth = pixelFloor(srcTileSize * scaleX) - 2 * destTileBorder;\n const minScale = (2 * DEST_TILE_BORDER + MIN_INNER_TILE_SIZE + 1) / srcTileSize\n\n // refuse to scale image multiple times by less than twice each time,\n // it could only happen because of invalid options\n if (minScale > 0.5) return [[toWidth, toHeight]]\n\n const stageCount = Math.ceil(Math.log(Math.min(scaleX, scaleY)) / Math.log(minScale))\n\n // no additional resizes are necessary,\n // stageCount can be zero or be negative when enlarging the image\n if (stageCount <= 1) return [[toWidth, toHeight]]\n\n const result: Stage[] = []\n\n for (let i = 0; i < stageCount; i++) {\n const width = Math.round(\n Math.pow(\n Math.pow(fromWidth, stageCount - i - 1) * Math.pow(toWidth, i + 1),\n 1 / stageCount\n )\n )\n\n const height = Math.round(\n Math.pow(\n Math.pow(fromHeight, stageCount - i - 1) * Math.pow(toHeight, i + 1),\n 1 / stageCount\n )\n )\n\n result.push([width, height])\n }\n\n return result\n}\n","export interface Tile {\n toX: number\n toY: number\n toWidth: number\n toHeight: number\n toInnerX: number\n toInnerY: number\n toInnerWidth: number\n toInnerHeight: number\n offsetX: number\n offsetY: number\n scaleX: number\n scaleY: number\n x: number\n y: number\n width: number\n height: number\n}\n\nexport interface TilerOptions {\n width: number\n height: number\n srcTileSize: number\n toWidth: number\n toHeight: number\n destTileBorder: number\n}\n\n// Split original image into multiple 1024x1024 chunks to reduce memory usage\n// (images have to be unpacked into typed arrays for resizing) and allow\n// parallel processing of multiple tiles at a time.\n//\n\n/*\n * pixelFloor and pixelCeil are modified versions of Math.floor and Math.ceil\n * functions which take into account floating point arithmetic errors.\n * Those errors can cause undesired increments/decrements of sizes and offsets:\n * Math.ceil(36 / (36 / 500)) = 501\n * pixelCeil(36 / (36 / 500)) = 500\n */\n\nconst PIXEL_EPSILON = 1e-5\n\nfunction pixelFloor (x: number): number {\n const nearest = Math.round(x)\n\n if (Math.abs(x - nearest) < PIXEL_EPSILON) { return nearest }\n return Math.floor(x)\n}\n\nfunction pixelCeil (x: number): number {\n const nearest = Math.round(x)\n\n if (Math.abs(x - nearest) < PIXEL_EPSILON) { return nearest }\n return Math.ceil(x)\n}\n\nexport default function createRegions (options: TilerOptions): Tile[] {\n const scaleX = options.toWidth / options.width\n const scaleY = options.toHeight / options.height\n\n const innerTileWidth = pixelFloor(options.srcTileSize * scaleX) - 2 * options.destTileBorder\n const innerTileHeight = pixelFloor(options.srcTileSize * scaleY) - 2 * options.destTileBorder\n\n // prevent infinite loop, this should never happen\n if (innerTileWidth < 1 || innerTileHeight < 1) {\n throw new Error('Internal error in pica: target tile width/height is too small.')\n }\n\n let x, y\n let innerX, innerY, toTileWidth, toTileHeight\n const tiles: Tile[] = []\n let tile: Tile\n\n // we go top-to-bottom instead of left-to-right so the image is displayed\n // from top to bottom in the browser\n for (innerY = 0; innerY < options.toHeight; innerY += innerTileHeight) {\n for (innerX = 0; innerX < options.toWidth; innerX += innerTileWidth) {\n x = innerX - options.destTileBorder\n if (x < 0) { x = 0 }\n toTileWidth = innerX + innerTileWidth + options.destTileBorder - x\n if (x + toTileWidth >= options.toWidth) {\n toTileWidth = options.toWidth - x\n }\n\n y = innerY - options.destTileBorder\n if (y < 0) { y = 0 }\n toTileHeight = innerY + innerTileHeight + options.destTileBorder - y\n if (y + toTileHeight >= options.toHeight) {\n toTileHeight = options.toHeight - y\n }\n\n tile = {\n toX: x,\n toY: y,\n toWidth: toTileWidth,\n toHeight: toTileHeight,\n\n toInnerX: innerX,\n toInnerY: innerY,\n toInnerWidth: innerTileWidth,\n toInnerHeight: innerTileHeight,\n\n offsetX: x / scaleX - pixelFloor(x / scaleX),\n offsetY: y / scaleY - pixelFloor(y / scaleY),\n scaleX,\n scaleY,\n\n x: pixelFloor(x / scaleX),\n y: pixelFloor(y / scaleY),\n width: pixelCeil(toTileWidth / scaleX),\n height: pixelCeil(toTileHeight / scaleY)\n }\n\n tiles.push(tile)\n }\n }\n\n return tiles\n}\n","import type { PicaCanvas, PicaCanvasCtx } from './types'\n\nexport interface SupportedFeatures {\n canvas: boolean\n offscreen_canvas: boolean\n may_be_worker: boolean\n create_image_bitmap: boolean\n safari_put_image_data_fix: boolean\n bug_canvas_orientation_region: boolean\n bug_image_bitmap_orientation_region: boolean\n cib_resize: boolean\n}\n\n// 3x2 JPEG with EXIF orientation 6 (rotate 90deg clockwise when decoded).\n//\n// Stored pixels, before orientation (Black, White):\n//\n// B W B\n// B B B\n//\n// After orientation is applied, decoded image should be 2x3:\n//\n// B B\n// B W <- pixel at (1, 1) should be white if region crop is correct\n// B B\n//\n// If crop coordinates are applied before orientation, region (1, 1, 1, 1)\n// returns black instead. The checks below use this to detect region/orientation\n// bugs in canvas drawImage() and createImageBitmap().\nconst ORIENTED_JPEG_BASE64 =\n '/9j/4QAiRXhpZgAATU0AKgAAAAgAAQESAAMAAAABAAYAAAAAAAD/4AAQskZJRgABAQAAA' +\n 'QABAAD/2wBDAAMCAgICAgMCAgIDAwMDBAYEBAQEBAgGBgUGCQgKCgkICQkKDA8MCgsOCw' +\n 'kJDRENDg8QEBEQCgwSExIQEw8QEBD/wAALCAACAAMBAREA/8QAFAABAAAAAAAAAAAAAAAA' +\n 'AAAACf/EABsQAAMBAQADAAAAAAAAAAAAAAECAwQFABEx/9oACAEBAAA/AC06fW6va0ps' +\n '7PT179E88MiV02arrCEkjGQZiSEnKc5ovxURVHoADz//2Q=='\n\nconst features: SupportedFeatures = {\n canvas: false,\n offscreen_canvas: false,\n may_be_worker: false,\n create_image_bitmap: false,\n safari_put_image_data_fix: false,\n bug_canvas_orientation_region: true,\n bug_image_bitmap_orientation_region: true,\n cib_resize: false\n}\n\nlet checked = false\nlet checking: Promise<SupportedFeatures> | null = null\n\nconst ctxOpts: CanvasRenderingContext2DSettings = { willReadFrequently: true }\n\nfunction check_canvas (): boolean {\n if (typeof document === 'undefined' || !document.createElement) return false\n\n try {\n const canvas = document.createElement('canvas')\n canvas.width = 2\n canvas.height = 1\n\n const ctx = canvas.getContext('2d', ctxOpts)!\n\n // Fingerprinting protection can randomize readback.\n // In that case we can not rely on canvas pixel data.\n let d = ctx.createImageData(2, 1)\n\n d.data[0] = 12; d.data[1] = 23; d.data[2] = 34; d.data[3] = 255\n d.data[4] = 45; d.data[5] = 56; d.data[6] = 67; d.data[7] = 255\n ctx.putImageData(d, 0, 0)\n d = ctx.getImageData(0, 0, 2, 1)\n\n return d.data[0] === 12 && d.data[1] === 23 && d.data[2] === 34 && d.data[3] === 255 &&\n d.data[4] === 45 && d.data[5] === 56 && d.data[6] === 67 && d.data[7] === 255\n } catch (__) {\n return false\n }\n}\n\nfunction check_offscreen_canvas (): boolean {\n if (typeof OffscreenCanvas === 'undefined') return false\n\n try {\n const canvas = new OffscreenCanvas(2, 1)\n const ctx = canvas.getContext('2d', ctxOpts)!\n\n // Fingerprinting protection can randomize readback.\n // In that case we can not rely on canvas pixel data.\n let d = ctx.createImageData(2, 1)\n\n d.data[0] = 12; d.data[1] = 23; d.data[2] = 34; d.data[3] = 255\n d.data[4] = 45; d.data[5] = 56; d.data[6] = 67; d.data[7] = 255\n ctx.putImageData(d, 0, 0)\n d = ctx.getImageData(0, 0, 2, 1)\n\n return d.data[0] === 12 && d.data[1] === 23 && d.data[2] === 34 && d.data[3] === 255 &&\n d.data[4] === 45 && d.data[5] === 56 && d.data[6] === 67 && d.data[7] === 255\n } catch (__) {\n return false\n }\n}\n\nfunction check_create_image_bitmap (): boolean {\n return typeof createImageBitmap !== 'undefined'\n}\n\nfunction check_may_be_worker (): boolean {\n return typeof Worker !== 'undefined' &&\n // Filter out IE <= 11 for sure\n (typeof URL !== 'undefined' && !!URL.createObjectURL)\n}\n\nfunction check_safari_put_image_data_fix (): boolean {\n try {\n return !!(typeof navigator !== 'undefined' &&\n navigator.userAgent &&\n navigator.userAgent.indexOf('Safari') >= 0 &&\n navigator.userAgent.indexOf('Chrome') < 0)\n } catch (__) {\n return false\n }\n}\n\nfunction check_bug_canvas_orientation_region_async (): Promise<boolean> {\n return Promise.resolve().then(() => {\n const canOffscreenCanvas = check_offscreen_canvas() &&\n check_create_image_bitmap() &&\n typeof Blob !== 'undefined' &&\n typeof atob !== 'undefined'\n\n if (canOffscreenCanvas) {\n const binary = atob(ORIENTED_JPEG_BASE64)\n const bytes = new Uint8Array(binary.length)\n\n for (let i = 0; i < binary.length; i++) {\n bytes[i] = binary.charCodeAt(i)\n }\n\n return createImageBitmap(new Blob([bytes], { type: 'image/jpeg' }))\n .then(bitmap => {\n const canvas = new OffscreenCanvas(1, 1)\n\n try {\n const ctx = canvas.getContext('2d', ctxOpts)!\n ctx.drawImage(bitmap, 1, 1, 1, 1, 0, 0, 1, 1)\n\n return ctx.getImageData(0, 0, 1, 1).data[0] < 240\n } finally {\n bitmap.close()\n }\n })\n }\n\n if (check_canvas() && typeof Image !== 'undefined') {\n return new Promise<boolean>(resolve => {\n const image = new Image()\n\n image.onload = () => {\n try {\n const canvas = document.createElement('canvas')\n canvas.width = 1\n canvas.height = 1\n\n const ctx = canvas.getContext('2d', ctxOpts)!\n ctx.drawImage(image, 1, 1, 1, 1, 0, 0, 1, 1)\n\n resolve(ctx.getImageData(0, 0, 1, 1).data[0] < 240)\n } catch (__) {\n resolve(true)\n }\n }\n\n image.onerror = () => resolve(true)\n image.src = `data:image/jpeg;base64,${ORIENTED_JPEG_BASE64}`\n })\n }\n\n return true\n })\n .catch(() => true)\n}\n\nfunction check_bug_image_bitmap_orientation_region_async (): Promise<boolean> {\n return Promise.resolve().then(() => {\n if (!features.create_image_bitmap && !check_create_image_bitmap()) return true\n if (typeof Blob === 'undefined' || typeof atob === 'undefined') return true\n\n const canOffscreenCanvas = check_offscreen_canvas()\n const canCanvas = check_canvas()\n\n if (!canOffscreenCanvas && !canCanvas) return true\n\n const binary = atob(ORIENTED_JPEG_BASE64)\n const bytes = new Uint8Array(binary.length)\n\n for (let i = 0; i < binary.length; i++) {\n bytes[i] = binary.charCodeAt(i)\n }\n\n return createImageBitmap(new Blob([bytes], { type: 'image/jpeg' }))\n .then(imageBitmap => createImageBitmap(imageBitmap, 1, 1, 1, 1)\n .then(bitmap => {\n let canvas: PicaCanvas\n\n if (canOffscreenCanvas) {\n canvas = new OffscreenCanvas(1, 1)\n } else {\n canvas = document.createElement('canvas')\n canvas.width = 1\n canvas.height = 1\n }\n\n try {\n const ctx = canvas.getContext('2d', ctxOpts) as PicaCanvasCtx\n ctx.drawImage(bitmap, 0, 0)\n\n return bitmap.width !== 1 || bitmap.height !== 1 ||\n ctx.getImageData(0, 0, 1, 1).data[0] < 240\n } finally {\n imageBitmap.close()\n bitmap.close()\n }\n }, () => {\n imageBitmap.close()\n return true\n }))\n })\n .catch(() => true)\n}\n\nfunction check_cib_resize_async (): Promise<boolean> {\n return Promise.resolve().then(() => {\n if (!check_create_image_bitmap()) return false\n\n const SRC_SIZE = 20\n const DST_SIZE = 5\n\n let canvas: PicaCanvas | null\n\n if (features.canvas || check_canvas()) {\n canvas = document.createElement('canvas')\n canvas.width = SRC_SIZE\n canvas.height = SRC_SIZE\n } else if (features.offscreen_canvas || check_offscreen_canvas()) {\n canvas = new OffscreenCanvas(SRC_SIZE, SRC_SIZE)\n // Chrome fails to createImageBitmap() from canvas without drawing\n // anything on it.\n const ctx = canvas.getContext('2d', ctxOpts)!\n ctx.clearRect(0, 0, SRC_SIZE, SRC_SIZE)\n } else {\n return false\n }\n\n return createImageBitmap(canvas, 0, 0, SRC_SIZE, SRC_SIZE, {\n resizeWidth: DST_SIZE,\n resizeHeight: DST_SIZE,\n resizeQuality: 'high'\n })\n .then(bitmap => {\n const status = bitmap.width === DST_SIZE && !!bitmap.close\n\n if (bitmap.close) bitmap.close()\n canvas = null\n return status\n })\n })\n .catch(() => false)\n}\n\nexport function get_supported_features (): Promise<SupportedFeatures> {\n if (checked) return Promise.resolve(Object.assign({}, features))\n if (checking) return checking.then(() => Object.assign({}, features))\n\n features.canvas = check_canvas()\n features.offscreen_canvas = check_offscreen_canvas()\n features.may_be_worker = check_may_be_worker()\n features.create_image_bitmap = check_create_image_bitmap()\n features.safari_put_image_data_fix = check_safari_put_image_data_fix()\n\n const bugCanvasOrientationRegion = check_bug_canvas_orientation_region_async()\n .then(result => { features.bug_canvas_orientation_region = result })\n .catch(() => {})\n\n const bugImageBitmapOrientationRegion = check_bug_image_bitmap_orientation_region_async()\n .then(result => { features.bug_image_bitmap_orientation_region = result })\n .catch(() => {})\n\n const cibResize = check_cib_resize_async()\n .then(result => { features.cib_resize = result })\n .catch(() => {})\n\n checking = Promise.all([\n bugCanvasOrientationRegion,\n bugImageBitmapOrientationRegion,\n cibResize\n ]).then(() => {\n checked = true\n checking = null\n return Object.assign({}, features)\n }, err => {\n checking = null\n throw err\n })\n\n return checking\n}\n","import MathLib, { type MathResizeAndUnsharpOptions } from './mathlib'\nimport Pool from './pool'\nimport * as utils from './utils'\nimport createStages from './stepper'\nimport createRegions, { type Tile } from './tiler'\nimport * as supported_features from './supported_features'\nimport type {\n Capabilities,\n CreateCanvasPreference,\n PicaFeaturesFlat,\n Filter,\n Limiter,\n PicaCanvas,\n PicaCanvasCtx,\n PicaOptions,\n PicaSource,\n ResizeBufferOptions,\n ResizeContext,\n ResizeFeaturesMap,\n ResizeParams,\n TileResizeJob,\n TileResizeJobBase,\n ResizeOptions,\n ResizeResult,\n ResolvedPicaOptions,\n StageEnv,\n WorkerFeaturesResult,\n WorkerMethod,\n WorkerResizePayload\n} from './types'\n\nexport type {\n PicaFeaturesFlat,\n Filter,\n PicaCanvas,\n PicaOptions,\n PicaSource,\n ResizeBufferOptions,\n ResizeOptions,\n CibResizeQuality\n} from './types'\n\ndeclare const __PICA_WORKER_SRC__: string | undefined\n\nconst WORKER_SRC = typeof __PICA_WORKER_SRC__ !== 'undefined' ? __PICA_WORKER_SRC__ : ''\n\nlet concurrency = 1\nif (typeof navigator !== 'undefined') {\n concurrency = Math.min(navigator.hardwareConcurrency || 1, 4)\n}\n\nconst DEFAULT_PICA_OPTS: ResolvedPicaOptions = {\n tile: 1024,\n concurrency,\n features: ['js', 'wasm', 'ww'],\n idle: 2000,\n}\n\nconst DEFAULT_RESIZE_OPTS = {\n filter: 'mks2013',\n unsharpAmount: 0,\n unsharpRadius: 0.0,\n unsharpThreshold: 0\n}\n\nconst ctxOpts: CanvasRenderingContext2DSettings = { willReadFrequently: true }\n\n// //////////////////////////////////////////////////////////////////////////////\n// API methods\n\nexport class Pica {\n private options: ResolvedPicaOptions\n private __limit: Limiter\n private resize_features: ResizeFeaturesMap\n private __workersPool: Pool<Worker> | null\n private capabilities: Capabilities\n private __requested_features: PicaFeaturesFlat\n private __mathlib: MathLib | null\n private __initPromise?: Promise<this>\n\n constructor (options?: PicaOptions) {\n this.options = Object.assign({}, DEFAULT_PICA_OPTS, options || {})\n\n const workerRequested = this.options.features.indexOf('ww') >= 0 || this.options.features.indexOf('all') >= 0\n\n if (workerRequested && !this.options.workerURL && !WORKER_SRC) {\n throw new Error('Pica: cannot use WebWorker without workerURL')\n }\n\n this.__limit = utils.limiter(this.options.concurrency)\n\n // List of enabled resize methods, according to options & browser/node.js\n this.resize_features = {\n js: false, // pure JS implementation, can be disabled for testing\n wasm: false, // webassembly implementation for heavy functions\n cib: false, // resize via createImageBitmap (only FF at this moment)\n ww: false // webworkers\n }\n\n this.__workersPool = null\n this.capabilities = {\n worker: false,\n ww_offscreen_canvas: false,\n canvas: false,\n offscreen_canvas: false,\n may_be_worker: false,\n create_image_bitmap: false,\n safari_put_image_data_fix: false,\n bug_canvas_orientation_region: true,\n bug_image_bitmap_orientation_region: true,\n cib_resize: false\n }\n\n // Store requested features for webworkers\n this.__requested_features = []\n\n this.__mathlib = null\n }\n\n init (): Promise<this> {\n if (this.__initPromise) return this.__initPromise\n\n this.__initPromise = this.__init()\n\n return this.__initPromise\n }\n\n private async __init (): Promise<this> {\n let features = this.options.features.slice()\n\n if (features.indexOf('all') >= 0) {\n features = ['cib', 'wasm', 'js', 'ww']\n }\n\n this.__requested_features = features\n\n this.__mathlib = new MathLib(features)\n\n const result = await supported_features.get_supported_features()\n Object.assign(this.capabilities, result)\n\n if (this.capabilities.cib_resize && features.indexOf('cib') >= 0) {\n this.resize_features.cib = true\n }\n\n // Check WebWorker support if requested\n if (this.capabilities.may_be_worker && features.indexOf('ww') >= 0 && (WORKER_SRC || this.options.workerURL)) {\n this.__workersPool = new Pool(() => this.__createWorkerSlot(), this.options.idle)\n }\n\n if (this.__workersPool) {\n try {\n const result = await this.__invokeWorker<WorkerFeaturesResult>('get_supported_features')\n const resultData = result && result.data\n if (resultData) {\n this.capabilities.worker = true\n this.resize_features.ww = true\n this.capabilities.ww_offscreen_canvas = !!resultData.offscreen_canvas\n }\n } catch (__) {}\n }\n\n const mathlib = await this.__mathlib.init()\n // Copy detected resize methods\n Object.assign(this.resize_features, mathlib.features)\n\n return this\n }\n\n createCanvas (width: number, height: number, preferOffscreen?: CreateCanvasPreference): PicaCanvas {\n if (preferOffscreen && this.capabilities.offscreen_canvas) {\n return new OffscreenCanvas(width, height)\n }\n\n if (this.capabilities.canvas) {\n const canvas = document.createElement('canvas')\n canvas.width = width\n canvas.height = height\n return canvas\n }\n\n if (this.capabilities.ww_offscreen_canvas) {\n return new OffscreenCanvas(width, height)\n }\n\n throw new Error('Pica: cannot create canvas')\n }\n\n private __createWorkerSlot (): { value: Worker, destroy: () => void } {\n if (this.options.workerURL) {\n const worker = new Worker(String(this.options.workerURL))\n return { value: worker, destroy () { worker.terminate() } }\n }\n\n if (WORKER_SRC) {\n const objectURL = window.URL.createObjectURL(new Blob([WORKER_SRC], { type: 'text/javascript' }))\n const worker = new Worker(objectURL)\n return {\n value: worker,\n destroy () {\n worker.terminate()\n if (typeof window !== 'undefined') {\n window.URL?.revokeObjectURL?.(objectURL)\n }\n }\n }\n }\n\n throw new Error('Pica: no worker source available')\n }\n\n // Call resizer in webworker or locally, depending on config\n private __invokeWorker<TResult> (\n method: WorkerMethod,\n payload?: Record<string, unknown>,\n transfer?: Transferable[],\n opts?: { cancelToken?: Promise<unknown> }\n ): Promise<TResult> {\n return new Promise((resolve, reject) => {\n const w = this.__workersPool!.acquire()\n\n if (opts && opts.cancelToken) opts.cancelToken.catch(err => reject(err))\n\n w.value.onmessage = ev => {\n w.release()\n\n if (ev.data.err) reject(ev.data.err)\n else resolve(ev.data)\n }\n\n w.value.postMessage(Object.assign({ method }, payload || {}), transfer || [])\n })\n }\n\n private async __invokeResize (tileJob: TileResizeJob, ctx: ResizeContext): Promise<ResizeResult> {\n await Promise.resolve()\n\n if (!this.resize_features.ww) {\n // not possible to have ImageBitmap here if user disabled WW\n if (tileJob.kind !== 'array') throw new Error('Pica: resize tile data is missing')\n\n const mathOpts: MathResizeAndUnsharpOptions = {\n src: tileJob.src,\n width: tileJob.width,\n height: tileJob.height,\n toWidth: tileJob.toWidth,\n toHeight: tileJob.toHeight,\n scaleX: tileJob.scaleX,\n scaleY: tileJob.scaleY,\n offsetX: tileJob.offsetX,\n offsetY: tileJob.offsetY,\n filter: tileJob.filter,\n unsharpAmount: tileJob.unsharpAmount,\n unsharpRadius: tileJob.unsharpRadius,\n unsharpThreshold: tileJob.unsharpThreshold\n }\n\n return { kind: 'array', data: this.__mathlib!.resizeAndUnsharp(mathOpts) }\n }\n\n const transfer = []\n\n if (tileJob.kind === 'array') transfer.push(tileJob.src.buffer)\n else transfer.push(tileJob.src)\n\n return this.__invokeWorker<ResizeResult>(\n 'resize',\n {\n job: tileJob,\n features: this.__requested_features\n } satisfies Omit<WorkerResizePayload, 'method'>,\n transfer,\n ctx\n )\n }\n\n // this function can return promise if createImageBitmap is used\n private __extractTileData (\n tile: Tile,\n from: PicaSource,\n stageEnv: StageEnv,\n extractTo: TileResizeJobBase\n ): TileResizeJob {\n if (this.resize_features.ww && this.capabilities.ww_offscreen_canvas) {\n this.debug('Create tile imageBitmap')\n\n const tileCanvas = this.createCanvas(tile.width, tile.height, { preferOffscreen: true })\n const tileCtx = tileCanvas.getContext('2d', ctxOpts) as PicaCanvasCtx\n\n tileCtx.drawImage(stageEnv.srcImageBitmap || from,\n tile.x, tile.y, tile.width, tile.height,\n 0, 0, tile.width, tile.height)\n\n if (!('transferToImageBitmap' in tileCanvas)) {\n throw new Error('Pica: offscreen canvas is not available for worker transfer')\n }\n\n return Object.assign({}, extractTo, {\n kind: 'bitmap' as const,\n src: tileCanvas.transferToImageBitmap()\n })\n\n // Direct region extraction, intentionally disabled. This can be faster,\n // but has known EXIF orientation bugs in some browsers.\n //\n // return createImageBitmap(stageEnv.srcImageBitmap || from, tile.x, tile.y, tile.width, tile.height)\n // .then(bitmap => {\n // extractTo.src = bitmap;\n // return extractTo;\n // });\n }\n\n // Extract tile RGBA buffer, depending on input type\n if (utils.isCanvas(from)) {\n if (!stageEnv.srcCtx) stageEnv.srcCtx = from.getContext('2d', ctxOpts) as PicaCanvasCtx\n\n // If input is Canvas - extract region data directly\n this.debug('Get tile pixel data')\n return Object.assign({}, extractTo, {\n kind: 'array' as const,\n src: stageEnv.srcCtx.getImageData(tile.x, tile.y, tile.width, tile.height).data\n })\n }\n\n // If input is Image or decoded to ImageBitmap,\n // draw region to temporary canvas and extract data from it\n //\n // Note! Attempt to reuse this canvas causes significant slowdown in chrome\n //\n this.debug('Draw tile imageBitmap/image to temporary canvas')\n\n const tmpCanvas = this.createCanvas(tile.width, tile.height, { preferOffscreen: true })\n\n const tmpCtx = tmpCanvas.getContext('2d', ctxOpts) as PicaCanvasCtx\n tmpCtx.globalCompositeOperation = 'copy'\n tmpCtx.drawImage(stageEnv.srcImageBitmap || from,\n tile.x, tile.y, tile.width, tile.height,\n 0, 0, tile.width, tile.height)\n\n this.debug('Get tile pixel data')\n\n const src = tmpCtx.getImageData(0, 0, tile.width, tile.height).data\n\n // Safari 12 workaround\n // https://github.com/nodeca/pica/issues/199\n tmpCanvas.width = tmpCanvas.height = 0\n\n return Object.assign({}, extractTo, {\n kind: 'array' as const,\n src\n })\n }\n\n private __landTileData (tile: Tile, result: ResizeResult, stageEnv: StageEnv): null {\n if (result.kind === 'bitmap') {\n stageEnv.toCtx!.drawImage(result.data, tile.toX, tile.toY)\n result.data.close()\n return null\n }\n\n this.debug('Draw tile')\n\n const toImageData = stageEnv.toCtx!.createImageData(tile.toWidth, tile.toHeight)\n toImageData.data.set(result.data)\n\n if (this.capabilities.safari_put_image_data_fix) {\n // Safari draws thin white stripes between tiles without this fix\n stageEnv.toCtx!.putImageData(toImageData, tile.toX, tile.toY,\n tile.toInnerX - tile.toX, tile.toInnerY - tile.toY,\n tile.toInnerWidth + 1e-5, tile.toInnerHeight + 1e-5)\n } else {\n stageEnv.toCtx!.putImageData(toImageData, tile.toX, tile.toY,\n tile.toInnerX - tile.toX, tile.toInnerY - tile.toY,\n tile.toInnerWidth, tile.toInnerHeight)\n }\n\n return null\n }\n\n private async __tileAndResize (\n from: PicaSource,\n to: PicaCanvas,\n resizeParams: ResizeParams,\n ctx: ResizeContext\n ): Promise<PicaCanvas> {\n const stageEnv: StageEnv = {\n srcCtx: null,\n srcImageBitmap: null,\n isImageBitmapReused: false,\n toCtx: null\n }\n\n const processTile = (tile: Tile) => this.__limit(async () => {\n if (ctx.canceled) return ctx.cancelToken\n\n const tileJob: TileResizeJobBase = {\n width: tile.width,\n height: tile.height,\n toWidth: tile.toWidth,\n toHeight: tile.toHeight,\n scaleX: tile.scaleX,\n scaleY: tile.scaleY,\n offsetX: tile.offsetX,\n offsetY: tile.offsetY,\n filter: resizeParams.filter,\n unsharpAmount: resizeParams.unsharpAmount,\n unsharpRadius: resizeParams.unsharpRadius,\n unsharpThreshold: resizeParams.unsharpThreshold\n }\n\n this.debug('Invoke resize math')\n\n const extractedTileJob = await this.__extractTileData(tile, from, stageEnv, tileJob)\n\n this.debug('Invoke resize math')\n const result = await this.__invokeResize(extractedTileJob, ctx)\n\n if (ctx.canceled) return ctx.cancelToken\n return this.__landTileData(tile, result, stageEnv)\n })\n\n // Need to normalize data source first. It can be canvas or image.\n // If image - try to decode in background if possible\n await Promise.resolve()\n\n stageEnv.toCtx = to.getContext('2d', ctxOpts) as PicaCanvasCtx\n\n if (utils.isCanvas(from)) {\n // Source is ready as-is.\n } else if (utils.isImageBitmap(from)) {\n stageEnv.srcImageBitmap = from\n stageEnv.isImageBitmapReused = true\n } else if (utils.isImage(from)) {\n // try to decode image in background for faster next operations;\n // if we're using offscreen canvas, cib is called per tile, so not needed here\n if (this.capabilities.create_image_bitmap) {\n this.debug('Decode image via createImageBitmap')\n\n // Suppress error to use fallback, if method fails\n // https://github.com/nodeca/pica/issues/190\n try {\n stageEnv.srcImageBitmap = await createImageBitmap(from)\n } catch (__) {}\n }\n } else {\n throw new Error('Pica: \".from\" should be Image, Canvas or ImageBitmap')\n }\n\n if (ctx.canceled) return ctx.cancelToken as Promise<PicaCanvas>\n\n this.debug('Calculate tiles')\n\n //\n // Here we are with \"normalized\" source,\n // follow to tiling\n //\n\n const regions = createRegions({\n width: resizeParams.width,\n height: resizeParams.height,\n srcTileSize: this.options.tile,\n toWidth: resizeParams.toWidth,\n toHeight: resizeParams.toHeight,\n destTileBorder: Math.ceil(Math.max(3, 2.5 * resizeParams.unsharpRadius | 0))\n })\n\n const jobs = regions.map(tile => processTile(tile))\n\n function cleanup (stageEnv: StageEnv) {\n if (stageEnv.srcImageBitmap) {\n if (!stageEnv.isImageBitmapReused) stageEnv.srcImageBitmap.close()\n stageEnv.srcImageBitmap = null\n }\n }\n\n this.debug('Process tiles')\n\n try {\n await Promise.all(jobs)\n this.debug('Finished!')\n cleanup(stageEnv)\n return to\n } catch (err) {\n cleanup(stageEnv)\n throw err\n }\n }\n\n private async __planStagesAndResize (\n from: PicaSource,\n to: PicaCanvas,\n resizeParams: ResizeParams,\n ctx: ResizeContext\n ): Promise<PicaCanvas> {\n let src: PicaSource = from\n let srcWidth = resizeParams.width\n let srcHeight = resizeParams.height\n\n const stages = createStages(\n resizeParams.width,\n resizeParams.height,\n resizeParams.toWidth,\n resizeParams.toHeight,\n this.options.tile\n )\n\n while (stages.length > 0) {\n if (ctx.canceled) return ctx.cancelToken as Promise<PicaCanvas>\n\n const [toWidth, toHeight] = stages.shift()!\n const isLastStage = stages.length === 0\n\n // Optimization for legacy filters -\n // only use user-defined quality for the last stage,\n // use simpler (Hamming) filter for the first stages where\n // scale factor is large enough (more than 2-3)\n //\n // For advanced filters (mks2013 and custom) - skip optimization,\n // because need to apply sharpening every time\n let filter: Filter\n if (isLastStage || !utils.is_cib_filter(resizeParams.filter)) filter = resizeParams.filter\n else if (resizeParams.filter === 'box') filter = 'box'\n else filter = 'hamming'\n\n const stageParams: ResizeParams = { ...resizeParams, filter, width: srcWidth, height: srcHeight, toWidth, toHeight }\n const dest = isLastStage ? to : this.createCanvas(toWidth, toHeight, { preferOffscreen: true })\n\n // Previous intermediate canvas (not the original `from`) can be freed after use\n const prevTmp = src !== from ? src as PicaCanvas : undefined\n\n try {\n await this.__tileAndResize(src, dest, stageParams, ctx)\n } finally {\n // Safari 12 workaround: https://github.com/nodeca/pica/issues/199\n if (prevTmp) prevTmp.width = prevTmp.height = 0\n }\n\n src = dest\n srcWidth = toWidth\n srcHeight = toHeight\n }\n\n return to\n }\n\n private async __resizeViaCreateImageBitmap (\n from: PicaSource,\n to: PicaCanvas,\n resizeParams: ResizeParams,\n ctx: ResizeContext\n ): Promise<PicaCanvas> {\n let toCtx: PicaCanvasCtx | null = to.getContext('2d', ctxOpts) as PicaCanvasCtx\n\n this.debug('Resize via createImageBitmap()')\n\n const imageBitmap = await createImageBitmap(from, {\n resizeWidth: resizeParams.toWidth,\n resizeHeight: resizeParams.toHeight,\n resizeQuality: utils.cib_quality_name(utils.filter_to_cib_quality(resizeParams.filter) ?? 3)\n })\n if (ctx.canceled) return ctx.cancelToken as Promise<PicaCanvas>\n\n // if no unsharp - draw directly to output canvas\n if (!resizeParams.unsharpAmount) {\n toCtx.drawImage(imageBitmap, 0, 0)\n imageBitmap.close()\n toCtx = null\n\n this.debug('Finished!')\n\n return to\n }\n\n this.debug('Unsharp result')\n\n let tmpCanvas: PicaCanvas | null = this.createCanvas(resizeParams.toWidth, resizeParams.toHeight)\n\n let tmpCtx: PicaCanvasCtx | null = tmpCanvas.getContext('2d', ctxOpts) as PicaCanvasCtx\n\n tmpCtx.drawImage(imageBitmap, 0, 0)\n imageBitmap.close()\n\n let iData: ImageData | null = tmpCtx.getImageData(0, 0, resizeParams.toWidth, resizeParams.toHeight)\n\n this.__mathlib!.unsharp_mask(\n iData.data,\n resizeParams.toWidth,\n resizeParams.toHeight,\n resizeParams.unsharpAmount,\n resizeParams.unsharpRadius,\n resizeParams.unsharpThreshold\n )\n\n toCtx.putImageData(iData, 0, 0)\n\n // Safari 12 workaround\n // https://github.com/nodeca/pica/issues/199\n tmpCanvas.width = tmpCanvas.height = 0\n\n iData = tmpCtx = tmpCanvas = toCtx = null\n\n this.debug('Finished!')\n\n return to\n }\n\n async resize<TCanvas extends PicaCanvas> (\n from: PicaSource,\n to: TCanvas,\n options?: ResizeOptions\n ): Promise<TCanvas> {\n this.debug('Start resize...')\n\n const requested: ResizeOptions = {}\n\n if (options) {\n Object.assign(requested, options)\n }\n\n let filter: Filter = (requested.filter || DEFAULT_RESIZE_OPTS.filter) as Filter\n\n // Legacy `.quality` option\n if (Object.prototype.hasOwnProperty.call(requested, 'quality')) {\n const quality = requested.quality\n if (typeof quality !== 'number' || quality < 0 || quality > 3) {\n throw new Error(`Pica: .quality should be [0..3], got ${quality}`)\n }\n filter = utils.cib_quality_filter(quality)\n }\n\n const resizeParams: ResizeParams = {\n filter,\n unsharpAmount: requested.unsharpAmount || DEFAULT_RESIZE_OPTS.unsharpAmount,\n unsharpRadius: requested.unsharpRadius || DEFAULT_RESIZE_OPTS.unsharpRadius,\n unsharpThreshold: requested.unsharpThreshold || DEFAULT_RESIZE_OPTS.unsharpThreshold,\n width: utils.isImage(from) ? from.naturalWidth : from.width,\n height: utils.isImage(from) ? from.naturalHeight : from.height,\n toWidth: to.width,\n toHeight: to.height\n }\n\n if (resizeParams.unsharpRadius > 2) resizeParams.unsharpRadius = 2\n\n // Prevent stepper from infinite loop\n if (to.width === 0 || to.height === 0) {\n return Promise.reject(new Error(`Invalid output size: ${to.width}x${to.height}`))\n }\n\n const ctx: ResizeContext = {\n cancelToken: requested.cancelToken,\n canceled: false\n }\n\n if (ctx.cancelToken) {\n // Wrap cancelToken to avoid successive resolve & set flag\n ctx.cancelToken = ctx.cancelToken.then(\n data => { ctx.canceled = true; throw data },\n err => { ctx.canceled = true; throw err }\n )\n }\n\n await this.init()\n\n if (ctx.canceled) return ctx.cancelToken as Promise<TCanvas>\n\n // createImageBitmap doesn't work for images (Image, ImageBitmap) with\n // Exif orientation in Chrome. Enforce canvas use for such inputs.\n // see https://bugs.chromium.org/p/chromium/issues/detail?id=1220671\n if (this.capabilities.bug_image_bitmap_orientation_region &&\n (utils.isImage(from) || (utils.isImageBitmap(from)))) {\n const tmpCanvas = this.createCanvas(resizeParams.width, resizeParams.height)\n const tmpCtx = tmpCanvas.getContext('2d', ctxOpts) as PicaCanvasCtx\n tmpCtx.drawImage(from, 0, 0)\n from = tmpCanvas\n }\n\n // if createImageBitmap supports resize, just do it and return\n if (this.resize_features.cib) {\n if (utils.is_cib_filter(resizeParams.filter)) {\n return this.__resizeViaCreateImageBitmap(from, to, resizeParams, ctx) as Promise<TCanvas>\n }\n\n this.debug('cib is enabled, but not supports provided filter, fallback to manual math')\n }\n\n if (!this.capabilities.canvas && !this.capabilities.offscreen_canvas) {\n const err = new Error('Pica: cannot use getImageData on canvas, ' +\n \"make sure fingerprinting protection isn't enabled\")\n // @ts-ignore\n err.code = 'ERR_GET_IMAGE_DATA'\n throw err\n }\n\n //\n // No easy way, let's resize manually via arrays\n //\n\n return this.__planStagesAndResize(from, to, resizeParams, ctx) as Promise<TCanvas>\n }\n\n // RGBA buffer resize\n //\n async resizeBuffer (options: ResizeBufferOptions): Promise<Uint8Array> {\n const opts = Object.assign({}, DEFAULT_RESIZE_OPTS, options)\n\n // Legacy `.quality` option\n if (Object.prototype.hasOwnProperty.call(opts, 'quality')) {\n const quality = opts.quality\n if (typeof quality !== 'number' || quality < 0 || quality > 3) {\n throw new Error(`Pica: .quality should be [0..3], got ${quality}`)\n }\n opts.filter = utils.cib_quality_filter(quality)\n }\n\n await this.init()\n if (!this.__mathlib) throw new Error('Pica: math library is not initialized')\n\n const mathOpts: MathResizeAndUnsharpOptions = {\n src: opts.src,\n width: opts.width,\n height: opts.height,\n toWidth: opts.toWidth,\n toHeight: opts.toHeight,\n dest: opts.dest,\n scaleX: opts.toWidth / opts.width,\n scaleY: opts.toHeight / opts.height,\n offsetX: 0,\n offsetY: 0,\n filter: opts.filter,\n unsharpAmount: opts.unsharpAmount,\n unsharpRadius: opts.unsharpRadius,\n unsharpThreshold: opts.unsharpThreshold\n }\n\n return this.__mathlib.resizeAndUnsharp(mathOpts)\n }\n\n async toBlob (canvas: HTMLCanvasElement | OffscreenCanvas, mimeType?: string, quality?: number): Promise<Blob> {\n mimeType = mimeType || 'image/png'\n\n // Ordinary Canvas\n if ('toBlob' in canvas && canvas.toBlob) {\n return new Promise(resolve => {\n canvas.toBlob(blob => resolve(blob as Blob), mimeType, quality)\n })\n }\n\n // OffscreenCanvas\n if ('convertToBlob' in canvas && canvas.convertToBlob) {\n return canvas.convertToBlob({\n type: mimeType,\n quality\n })\n }\n\n // Fallback for old browsers\n const asString = atob((canvas as HTMLCanvasElement).toDataURL(mimeType, quality).split(',')[1])\n const len = asString.length\n const asBuffer = new Uint8Array(len)\n\n for (let i = 0; i < len; i++) {\n asBuffer[i] = asString.charCodeAt(i)\n }\n\n return new Blob([asBuffer], { type: mimeType })\n }\n\n debug (..._args: unknown[]): void {}\n}\n\nexport default function pica (options?: PicaOptions): Pica {\n return new Pica(options)\n}\n"],"x_google_ignoreList":[0,1,2,3],"mappings":"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"}