mirror of
https://github.com/lovell/sharp.git
synced 2026-02-05 14:16:17 +01:00
Compare commits
12 Commits
v0.33.0-al
...
v0.33.0-al
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
68ac12292c | ||
|
|
a9aa7339ce | ||
|
|
08108f5fad | ||
|
|
58e3c4c70e | ||
|
|
f8cf25ca56 | ||
|
|
ca95979ecc | ||
|
|
392f6afb5e | ||
|
|
7c97aabaf8 | ||
|
|
fcc7e84bee | ||
|
|
226a9a13ef | ||
|
|
4d3c9ae3d1 | ||
|
|
f31011d759 |
2
.github/workflows/ci.yml
vendored
2
.github/workflows/ci.yml
vendored
@@ -141,7 +141,7 @@ jobs:
|
||||
npm pkg set "optionalDependencies.@sharpen/sharp-linux-arm=file:./npm/linux-arm"
|
||||
npm run clean
|
||||
npm install --ignore-scripts
|
||||
npx mocha --no-config --spec=test/unit/io.js
|
||||
npx mocha --no-config --spec=test/unit/io.js --timeout=30000
|
||||
[[ -n $prebuild_upload ]] && npx prebuild || true
|
||||
macstadium-runner:
|
||||
permissions:
|
||||
|
||||
@@ -10,7 +10,7 @@
|
||||
'sharp_libvips_lib_dir': '<!(node -p "require(\'./lib/libvips\').buildSharpLibvipsLibDir()")'
|
||||
},
|
||||
'targets': [{
|
||||
'target_name': 'win-libvips-cpp',
|
||||
'target_name': 'libvips-cpp',
|
||||
'conditions': [
|
||||
['OS == "win"', {
|
||||
# Build libvips C++ binding for Windows due to MSVC std library ABI changes
|
||||
@@ -81,7 +81,7 @@
|
||||
],
|
||||
'dependencies': [
|
||||
'<!(node -p "require(\'node-addon-api\').gyp")',
|
||||
'win-libvips-cpp'
|
||||
'libvips-cpp'
|
||||
],
|
||||
'variables': {
|
||||
'conditions': [
|
||||
@@ -243,7 +243,7 @@
|
||||
}
|
||||
},
|
||||
}, {
|
||||
'target_name': 'win-copy-dlls',
|
||||
'target_name': 'copy-dll',
|
||||
'type': 'none',
|
||||
'dependencies': [
|
||||
'sharp-<(platform_and_arch)'
|
||||
|
||||
@@ -13,6 +13,9 @@ Requires libvips v8.14.5
|
||||
* Make `compression` option of `heif` mandatory to help reduce HEIF vs HEIC confusion.
|
||||
[#3740](https://github.com/lovell/sharp/issues/3740)
|
||||
|
||||
* Ensure correct interpretation of 16-bit raw input.
|
||||
[#3808](https://github.com/lovell/sharp/issues/3808)
|
||||
|
||||
## v0.32 - *flow*
|
||||
|
||||
Requires libvips v8.14.5
|
||||
|
||||
@@ -3,8 +3,8 @@
|
||||
|
||||
'use strict';
|
||||
|
||||
const util = require('util');
|
||||
const stream = require('stream');
|
||||
const util = require('node:util');
|
||||
const stream = require('node:stream');
|
||||
const is = require('./is');
|
||||
|
||||
require('./sharp');
|
||||
|
||||
@@ -3,7 +3,7 @@
|
||||
|
||||
'use strict';
|
||||
|
||||
const spawnSync = require('child_process').spawnSync;
|
||||
const { spawnSync } = require('node:child_process');
|
||||
const semverCoerce = require('semver/functions/coerce');
|
||||
const semverGreaterThanOrEqualTo = require('semver/functions/gte');
|
||||
const detectLibc = require('detect-libc');
|
||||
|
||||
@@ -3,7 +3,7 @@
|
||||
|
||||
'use strict';
|
||||
|
||||
const path = require('path');
|
||||
const path = require('node:path');
|
||||
const is = require('./is');
|
||||
const sharp = require('./sharp');
|
||||
|
||||
|
||||
@@ -3,7 +3,7 @@
|
||||
|
||||
'use strict';
|
||||
|
||||
const events = require('events');
|
||||
const events = require('node:events');
|
||||
const detectLibc = require('detect-libc');
|
||||
|
||||
const is = require('./is');
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "@sharpen/sharp-darwin-arm64",
|
||||
"version": "0.0.1-alpha.1",
|
||||
"version": "0.0.1-alpha.4",
|
||||
"description": "Prebuilt sharp for use with macOS ARM64",
|
||||
"homepage": "https://sharp.pixelplumbing.com",
|
||||
"repository": {
|
||||
@@ -22,6 +22,7 @@
|
||||
"publishConfig": {
|
||||
"access": "public"
|
||||
},
|
||||
"type": "commonjs",
|
||||
"exports": {
|
||||
"./sharp.node": "./lib/sharp-darwin-arm64.node",
|
||||
"./package": "./package.json"
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "@sharpen/sharp-darwin-x64",
|
||||
"version": "0.0.1-alpha.1",
|
||||
"version": "0.0.1-alpha.4",
|
||||
"description": "Prebuilt sharp for use with macOS x64",
|
||||
"homepage": "https://sharp.pixelplumbing.com",
|
||||
"repository": {
|
||||
@@ -22,6 +22,7 @@
|
||||
"publishConfig": {
|
||||
"access": "public"
|
||||
},
|
||||
"type": "commonjs",
|
||||
"exports": {
|
||||
"./sharp.node": "./lib/sharp-darwin-x64.node",
|
||||
"./package": "./package.json"
|
||||
|
||||
@@ -5,7 +5,7 @@
|
||||
|
||||
// Populate contents of all packages with the current GitHub release
|
||||
|
||||
const { writeFile, copyFile } = require('node:fs/promises');
|
||||
const { writeFile, copyFile, rm } = require('node:fs/promises');
|
||||
const path = require('node:path');
|
||||
const { Readable } = require('node:stream');
|
||||
const { pipeline } = require('node:stream/promises');
|
||||
@@ -46,10 +46,12 @@ workspaces.map(async platform => {
|
||||
return;
|
||||
}
|
||||
// Extract prebuild tarball
|
||||
const lib = path.join(dir, 'lib');
|
||||
await rm(lib, { recursive: true });
|
||||
await pipeline(
|
||||
Readable.fromWeb(response.body),
|
||||
createGunzip(),
|
||||
extract(path.join(dir, 'lib'), { map: mapTarballEntry })
|
||||
extract(lib, { map: mapTarballEntry })
|
||||
);
|
||||
// Generate README
|
||||
const { name, description } = require(`./${platform}/package.json`);
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "@sharpen/sharp-linux-arm",
|
||||
"version": "0.0.1-alpha.1",
|
||||
"version": "0.0.1-alpha.4",
|
||||
"description": "Prebuilt sharp for use with Linux (glibc) ARM (32-bit)",
|
||||
"homepage": "https://sharp.pixelplumbing.com",
|
||||
"repository": {
|
||||
@@ -22,6 +22,7 @@
|
||||
"publishConfig": {
|
||||
"access": "public"
|
||||
},
|
||||
"type": "commonjs",
|
||||
"exports": {
|
||||
"./sharp.node": "./lib/sharp-linux-arm.node",
|
||||
"./package": "./package.json"
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "@sharpen/sharp-linux-arm64",
|
||||
"version": "0.0.1-alpha.1",
|
||||
"version": "0.0.1-alpha.4",
|
||||
"description": "Prebuilt sharp for use with Linux (glibc) ARM64",
|
||||
"homepage": "https://sharp.pixelplumbing.com",
|
||||
"repository": {
|
||||
@@ -22,6 +22,7 @@
|
||||
"publishConfig": {
|
||||
"access": "public"
|
||||
},
|
||||
"type": "commonjs",
|
||||
"exports": {
|
||||
"./sharp.node": "./lib/sharp-linux-arm64.node",
|
||||
"./package": "./package.json"
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "@sharpen/sharp-linux-x64",
|
||||
"version": "0.0.1-alpha.1",
|
||||
"version": "0.0.1-alpha.4",
|
||||
"description": "Prebuilt sharp for use with Linux (glibc) x64",
|
||||
"homepage": "https://sharp.pixelplumbing.com",
|
||||
"repository": {
|
||||
@@ -22,6 +22,7 @@
|
||||
"publishConfig": {
|
||||
"access": "public"
|
||||
},
|
||||
"type": "commonjs",
|
||||
"exports": {
|
||||
"./sharp.node": "./lib/sharp-linux-x64.node",
|
||||
"./package": "./package.json"
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "@sharpen/sharp-linuxmusl-arm64",
|
||||
"version": "0.0.1-alpha.1",
|
||||
"version": "0.0.1-alpha.4",
|
||||
"description": "Prebuilt sharp for use with Linux (musl) ARM64",
|
||||
"homepage": "https://sharp.pixelplumbing.com",
|
||||
"repository": {
|
||||
@@ -22,6 +22,7 @@
|
||||
"publishConfig": {
|
||||
"access": "public"
|
||||
},
|
||||
"type": "commonjs",
|
||||
"exports": {
|
||||
"./sharp.node": "./lib/sharp-linuxmusl-arm64.node",
|
||||
"./package": "./package.json"
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "@sharpen/sharp-linuxmusl-x64",
|
||||
"version": "0.0.1-alpha.1",
|
||||
"version": "0.0.1-alpha.4",
|
||||
"description": "Prebuilt sharp for use with Linux (musl) x64",
|
||||
"homepage": "https://sharp.pixelplumbing.com",
|
||||
"repository": {
|
||||
@@ -22,6 +22,7 @@
|
||||
"publishConfig": {
|
||||
"access": "public"
|
||||
},
|
||||
"type": "commonjs",
|
||||
"exports": {
|
||||
"./sharp.node": "./lib/sharp-linuxmusl-x64.node",
|
||||
"./package": "./package.json"
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "@sharpen/sharp-win32-ia32",
|
||||
"version": "0.0.1-alpha.1",
|
||||
"version": "0.0.1-alpha.4",
|
||||
"description": "Prebuilt sharp for use with Windows x86 (32-bit)",
|
||||
"homepage": "https://sharp.pixelplumbing.com",
|
||||
"repository": {
|
||||
@@ -13,18 +13,19 @@
|
||||
"url": "https://opencollective.com/libvips"
|
||||
},
|
||||
"preferUnplugged": true,
|
||||
"optionalDependencies": {
|
||||
"@sharpen/sharp-libvips-win32-ia32": "0.0.1-alpha.1"
|
||||
},
|
||||
"files": [
|
||||
"lib"
|
||||
"lib",
|
||||
"versions.json",
|
||||
"THIRD-PARTY-NOTICES.md"
|
||||
],
|
||||
"publishConfig": {
|
||||
"access": "public"
|
||||
},
|
||||
"type": "commonjs",
|
||||
"exports": {
|
||||
"./sharp.node": "./lib/sharp-win32-ia32.node",
|
||||
"./package": "./package.json"
|
||||
"./package": "./package.json",
|
||||
"./versions": "./versions.json"
|
||||
},
|
||||
"engines": {
|
||||
"node": "^18.17.0 || ^20.3.0 || >=21.0.0",
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "@sharpen/sharp-win32-x64",
|
||||
"version": "0.0.1-alpha.1",
|
||||
"version": "0.0.1-alpha.4",
|
||||
"description": "Prebuilt sharp for use with Windows x64",
|
||||
"homepage": "https://sharp.pixelplumbing.com",
|
||||
"repository": {
|
||||
@@ -13,15 +13,15 @@
|
||||
"url": "https://opencollective.com/libvips"
|
||||
},
|
||||
"preferUnplugged": true,
|
||||
"optionalDependencies": {
|
||||
"@sharpen/sharp-libvips-win32-x64": "0.0.1-alpha.1"
|
||||
},
|
||||
"files": [
|
||||
"lib"
|
||||
"lib",
|
||||
"versions.json",
|
||||
"THIRD-PARTY-NOTICES.md"
|
||||
],
|
||||
"publishConfig": {
|
||||
"access": "public"
|
||||
},
|
||||
"type": "commonjs",
|
||||
"exports": {
|
||||
"./sharp.node": "./lib/sharp-win32-x64.node",
|
||||
"./package": "./package.json"
|
||||
|
||||
47
package.json
47
package.json
@@ -1,7 +1,7 @@
|
||||
{
|
||||
"name": "sharp",
|
||||
"description": "High performance Node.js image processing, the fastest module to resize JPEG, PNG, WebP, GIF, AVIF and TIFF images",
|
||||
"version": "0.33.0-alpha.2",
|
||||
"version": "0.33.0-alpha.4",
|
||||
"author": "Lovell Fuller <npm@lovell.info>",
|
||||
"homepage": "https://github.com/lovell/sharp",
|
||||
"contributors": [
|
||||
@@ -103,13 +103,14 @@
|
||||
"docs-serve": "cd docs && npx serve",
|
||||
"docs-publish": "cd docs && npx firebase-tools deploy --project pixelplumbing --only hosting:pixelplumbing-sharp"
|
||||
},
|
||||
"type": "commonjs",
|
||||
"main": "lib/index.js",
|
||||
"types": "lib/index.d.ts",
|
||||
"files": [
|
||||
"binding.gyp",
|
||||
"install/**",
|
||||
"lib/**",
|
||||
"src/**"
|
||||
"install",
|
||||
"lib",
|
||||
"src"
|
||||
],
|
||||
"repository": {
|
||||
"type": "git",
|
||||
@@ -140,27 +141,27 @@
|
||||
"semver": "^7.5.4"
|
||||
},
|
||||
"optionalDependencies": {
|
||||
"@sharpen/sharp-darwin-arm64": "0.0.1-alpha.2",
|
||||
"@sharpen/sharp-darwin-x64": "0.0.1-alpha.2",
|
||||
"@sharpen/sharp-linux-arm": "0.0.1-alpha.2",
|
||||
"@sharpen/sharp-linux-arm64": "0.0.1-alpha.2",
|
||||
"@sharpen/sharp-linux-x64": "0.0.1-alpha.2",
|
||||
"@sharpen/sharp-linuxmusl-arm64": "0.0.1-alpha.2",
|
||||
"@sharpen/sharp-linuxmusl-x64": "0.0.1-alpha.2",
|
||||
"@sharpen/sharp-win32-ia32": "0.0.1-alpha.2",
|
||||
"@sharpen/sharp-win32-x64": "0.0.1-alpha.2"
|
||||
"@sharpen/sharp-darwin-arm64": "0.0.1-alpha.4",
|
||||
"@sharpen/sharp-darwin-x64": "0.0.1-alpha.4",
|
||||
"@sharpen/sharp-libvips-darwin-arm64": "0.0.1-alpha.2",
|
||||
"@sharpen/sharp-libvips-darwin-x64": "0.0.1-alpha.2",
|
||||
"@sharpen/sharp-libvips-linux-arm": "0.0.1-alpha.2",
|
||||
"@sharpen/sharp-libvips-linux-arm64": "0.0.1-alpha.2",
|
||||
"@sharpen/sharp-libvips-linux-x64": "0.0.1-alpha.2",
|
||||
"@sharpen/sharp-libvips-linuxmusl-arm64": "0.0.1-alpha.2",
|
||||
"@sharpen/sharp-libvips-linuxmusl-x64": "0.0.1-alpha.2",
|
||||
"@sharpen/sharp-linux-arm": "0.0.1-alpha.4",
|
||||
"@sharpen/sharp-linux-arm64": "0.0.1-alpha.4",
|
||||
"@sharpen/sharp-linux-x64": "0.0.1-alpha.4",
|
||||
"@sharpen/sharp-linuxmusl-arm64": "0.0.1-alpha.4",
|
||||
"@sharpen/sharp-linuxmusl-x64": "0.0.1-alpha.4",
|
||||
"@sharpen/sharp-win32-ia32": "0.0.1-alpha.4",
|
||||
"@sharpen/sharp-win32-x64": "0.0.1-alpha.4"
|
||||
},
|
||||
"devDependencies": {
|
||||
"@sharpen/sharp-libvips-darwin-arm64": "0.0.1-alpha.1",
|
||||
"@sharpen/sharp-libvips-darwin-x64": "0.0.1-alpha.1",
|
||||
"@sharpen/sharp-libvips-dev": "0.0.1-alpha.1",
|
||||
"@sharpen/sharp-libvips-linux-arm": "0.0.1-alpha.1",
|
||||
"@sharpen/sharp-libvips-linux-arm64": "0.0.1-alpha.1",
|
||||
"@sharpen/sharp-libvips-linux-x64": "0.0.1-alpha.1",
|
||||
"@sharpen/sharp-libvips-linuxmusl-arm64": "0.0.1-alpha.1",
|
||||
"@sharpen/sharp-libvips-linuxmusl-x64": "0.0.1-alpha.1",
|
||||
"@sharpen/sharp-libvips-win32-ia32": "0.0.1-alpha.1",
|
||||
"@sharpen/sharp-libvips-win32-x64": "0.0.1-alpha.1",
|
||||
"@sharpen/sharp-libvips-dev": "0.0.1-alpha.2",
|
||||
"@sharpen/sharp-libvips-win32-ia32": "0.0.1-alpha.2",
|
||||
"@sharpen/sharp-libvips-win32-x64": "0.0.1-alpha.2",
|
||||
"@types/node": "*",
|
||||
"async": "^3.2.4",
|
||||
"cc": "^3.0.1",
|
||||
|
||||
@@ -363,12 +363,13 @@ namespace sharp {
|
||||
if (descriptor->isBuffer) {
|
||||
if (descriptor->rawChannels > 0) {
|
||||
// Raw, uncompressed pixel data
|
||||
bool const is8bit = vips_band_format_is8bit(descriptor->rawDepth);
|
||||
image = VImage::new_from_memory(descriptor->buffer, descriptor->bufferLength,
|
||||
descriptor->rawWidth, descriptor->rawHeight, descriptor->rawChannels, descriptor->rawDepth);
|
||||
if (descriptor->rawChannels < 3) {
|
||||
image.get_image()->Type = VIPS_INTERPRETATION_B_W;
|
||||
image.get_image()->Type = is8bit ? VIPS_INTERPRETATION_B_W : VIPS_INTERPRETATION_GREY16;
|
||||
} else {
|
||||
image.get_image()->Type = VIPS_INTERPRETATION_sRGB;
|
||||
image.get_image()->Type = is8bit ? VIPS_INTERPRETATION_sRGB : VIPS_INTERPRETATION_RGB16;
|
||||
}
|
||||
if (descriptor->rawPremultiplied) {
|
||||
image = image.unpremultiply();
|
||||
|
||||
13
src/sharp.cc
13
src/sharp.cc
@@ -1,6 +1,8 @@
|
||||
// Copyright 2013 Lovell Fuller and others.
|
||||
// SPDX-License-Identifier: Apache-2.0
|
||||
|
||||
#include <mutex> // NOLINT(build/c++11)
|
||||
|
||||
#include <napi.h>
|
||||
#include <vips/vips8>
|
||||
|
||||
@@ -10,14 +12,11 @@
|
||||
#include "utilities.h"
|
||||
#include "stats.h"
|
||||
|
||||
static void* sharp_vips_init(void*) {
|
||||
vips_init("sharp");
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
Napi::Object init(Napi::Env env, Napi::Object exports) {
|
||||
static GOnce sharp_vips_init_once = G_ONCE_INIT;
|
||||
g_once(&sharp_vips_init_once, static_cast<GThreadFunc>(sharp_vips_init), nullptr);
|
||||
static std::once_flag sharp_vips_init_once;
|
||||
std::call_once(sharp_vips_init_once, []() {
|
||||
vips_init("sharp");
|
||||
});
|
||||
|
||||
g_log_set_handler("VIPS", static_cast<GLogLevelFlags>(G_LOG_LEVEL_WARNING),
|
||||
static_cast<GLogFunc>(sharp::VipsWarningCallback), nullptr);
|
||||
|
||||
@@ -284,4 +284,42 @@ describe('Raw pixel data', function () {
|
||||
);
|
||||
}
|
||||
});
|
||||
|
||||
describe('16-bit roundtrip', () => {
|
||||
it('grey', async () => {
|
||||
const grey = 42000;
|
||||
const png = await sharp(
|
||||
Uint16Array.from([grey]),
|
||||
{ raw: { width: 1, height: 1, channels: 1 } }
|
||||
)
|
||||
.toColourspace('grey16')
|
||||
.png({ compressionLevel: 0 })
|
||||
.toBuffer();
|
||||
const raw = await sharp(png)
|
||||
.toColourspace('grey16')
|
||||
.raw({ depth: 'ushort' })
|
||||
.toBuffer();
|
||||
|
||||
assert.strictEqual(raw.readUint16LE(0), grey);
|
||||
});
|
||||
|
||||
it('RGB', async () => {
|
||||
const rgb = [10946, 28657, 46368];
|
||||
const png = await sharp(
|
||||
Uint16Array.from(rgb),
|
||||
{ raw: { width: 1, height: 1, channels: 3 } }
|
||||
)
|
||||
.toColourspace('rgb16')
|
||||
.png({ compressionLevel: 0 })
|
||||
.toBuffer();
|
||||
const raw = await sharp(png)
|
||||
.toColourspace('rgb16')
|
||||
.raw({ depth: 'ushort' })
|
||||
.toBuffer();
|
||||
|
||||
assert.strictEqual(raw.readUint16LE(0), rgb[0]);
|
||||
assert.strictEqual(raw.readUint16LE(2), rgb[1]);
|
||||
assert.strictEqual(raw.readUint16LE(4), rgb[2]);
|
||||
});
|
||||
});
|
||||
});
|
||||
|
||||
Reference in New Issue
Block a user