pica
Version:
High quality image resize in browser.
56 lines (43 loc) • 1.73 kB
JavaScript
'use strict';
module.exports = function unsharp(img, width, height, amount, radius, threshold) {
if (amount === 0 || radius < 0.5) {
return;
}
if (radius > 2.0) {
radius = 2.0;
}
var pixels = width * height;
var img_bytes_cnt = pixels * 4;
var hsv_bytes_cnt = pixels * 2;
var blur_bytes_cnt = pixels * 2;
var blur_line_byte_cnt = Math.max(width, height) * 4; // float32 array
var blur_coeffs_byte_cnt = 8 * 4; // float32 array
var img_offset = 0;
var hsv_offset = img_bytes_cnt;
var blur_offset = hsv_offset + hsv_bytes_cnt;
var blur_tmp_offset = blur_offset + blur_bytes_cnt;
var blur_line_offset = blur_tmp_offset + blur_bytes_cnt;
var blur_coeffs_offset = blur_line_offset + blur_line_byte_cnt;
var instance = this.__instance(
'unsharp_mask',
img_bytes_cnt + hsv_bytes_cnt + blur_bytes_cnt * 2 + blur_line_byte_cnt + blur_coeffs_byte_cnt,
{ exp: Math.exp }
);
// 32-bit copy is much faster in chrome
var img32 = new Uint32Array(img.buffer);
var mem32 = new Uint32Array(this.__memory.buffer);
mem32.set(img32);
// HSL
var fn = instance.exports.hsv_v16 || instance.exports._hsv_v16;
fn(img_offset, hsv_offset, width, height);
// BLUR
fn = instance.exports.blurMono16 || instance.exports._blurMono16;
fn(hsv_offset, blur_offset, blur_tmp_offset,
blur_line_offset, blur_coeffs_offset, width, height, radius);
// UNSHARP
fn = instance.exports.unsharp || instance.exports._unsharp;
fn(img_offset, img_offset, hsv_offset,
blur_offset, width, height, amount, threshold);
// 32-bit copy is much faster in chrome
img32.set(new Uint32Array(this.__memory.buffer, 0, pixels));
};