@revizly/sharp 0.33.6-revizly2 → 0.34.0-revizly2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -300,6 +300,7 @@ const Sharp = function (input, options) {
300
300
  webpLossless: false,
301
301
  webpNearLossless: false,
302
302
  webpSmartSubsample: false,
303
+ webpSmartDeblock: false,
303
304
  webpPreset: 'default',
304
305
  webpEffort: 4,
305
306
  webpMinSize: false,
package/lib/index.d.ts CHANGED
@@ -1076,6 +1076,10 @@ declare namespace sharp {
1076
1076
  chromaSubsampling?: string | undefined;
1077
1077
  /** Boolean indicating whether the image is interlaced using a progressive scan */
1078
1078
  isProgressive?: boolean | undefined;
1079
+ /** Boolean indicating whether the image is palette-based (GIF, PNG). */
1080
+ isPalette?: boolean | undefined;
1081
+ /** Number of bits per sample for each channel (GIF, PNG). */
1082
+ bitsPerSample?: number | undefined;
1079
1083
  /** Number of pages/frames contained within the image, with support for TIFF, HEIF, PDF, animated GIF and animated WebP */
1080
1084
  pages?: number | undefined;
1081
1085
  /** Number of pixels high each page in a multi-page image will be. */
@@ -1102,8 +1106,8 @@ declare namespace sharp {
1102
1106
  tifftagPhotoshop?: Buffer | undefined;
1103
1107
  /** The encoder used to compress an HEIF file, `av1` (AVIF) or `hevc` (HEIC) */
1104
1108
  compression?: 'av1' | 'hevc';
1105
- /** Default background colour, if present, for PNG (bKGD) and GIF images, either an RGB Object or a single greyscale value */
1106
- background?: { r: number; g: number; b: number } | number;
1109
+ /** Default background colour, if present, for PNG (bKGD) and GIF images */
1110
+ background?: { r: number; g: number; b: number } | { gray: number };
1107
1111
  /** Details of each level in a multi-level image provided as an array of objects, requires libvips compiled with support for OpenSlide */
1108
1112
  levels?: LevelMetadata[] | undefined;
1109
1113
  /** Number of Sub Image File Directories in an OME-TIFF image */
package/lib/input.js CHANGED
@@ -434,15 +434,16 @@ function _isStreamInput () {
434
434
  * - `density`: Number of pixels per inch (DPI), if present
435
435
  * - `chromaSubsampling`: String containing JPEG chroma subsampling, `4:2:0` or `4:4:4` for RGB, `4:2:0:4` or `4:4:4:4` for CMYK
436
436
  * - `isProgressive`: Boolean indicating whether the image is interlaced using a progressive scan
437
+ * - `isPalette`: Boolean indicating whether the image is palette-based (GIF, PNG).
438
+ * - `bitsPerSample`: Number of bits per sample for each channel (GIF, PNG, HEIF).
437
439
  * - `pages`: Number of pages/frames contained within the image, with support for TIFF, HEIF, PDF, animated GIF and animated WebP
438
440
  * - `pageHeight`: Number of pixels high each page in a multi-page image will be.
439
- * - `paletteBitDepth`: Bit depth of palette-based image (GIF, PNG).
440
441
  * - `loop`: Number of times to loop an animated image, zero refers to a continuous loop.
441
442
  * - `delay`: Delay in ms between each page in an animated image, provided as an array of integers.
442
443
  * - `pagePrimary`: Number of the primary page in a HEIF image
443
444
  * - `levels`: Details of each level in a multi-level image provided as an array of objects, requires libvips compiled with support for OpenSlide
444
445
  * - `subifds`: Number of Sub Image File Directories in an OME-TIFF image
445
- * - `background`: Default background colour, if present, for PNG (bKGD) and GIF images, either an RGB Object or a single greyscale value
446
+ * - `background`: Default background colour, if present, for PNG (bKGD) and GIF images
446
447
  * - `compression`: The encoder used to compress an HEIF file, `av1` (AVIF) or `hevc` (HEIC)
447
448
  * - `resolutionUnit`: The unit of resolution (density), either `inch` or `cm`, if present
448
449
  * - `hasProfile`: Boolean indicating the presence of an embedded ICC profile
package/lib/output.js CHANGED
@@ -623,6 +623,7 @@ function png (options) {
623
623
  * @param {boolean} [options.lossless=false] - use lossless compression mode
624
624
  * @param {boolean} [options.nearLossless=false] - use near_lossless compression mode
625
625
  * @param {boolean} [options.smartSubsample=false] - use high quality chroma subsampling
626
+ * @param {boolean} [options.smartDeblock=false] - auto-adjust the deblocking filter, can improve low contrast edges (slow)
626
627
  * @param {string} [options.preset='default'] - named preset for preprocessing/filtering, one of: default, photo, picture, drawing, icon, text
627
628
  * @param {number} [options.effort=4] - CPU effort, between 0 (fastest) and 6 (slowest)
628
629
  * @param {number} [options.loop=0] - number of animation iterations, use 0 for infinite animation
@@ -658,6 +659,9 @@ function webp (options) {
658
659
  if (is.defined(options.smartSubsample)) {
659
660
  this._setBooleanOption('webpSmartSubsample', options.smartSubsample);
660
661
  }
662
+ if (is.defined(options.smartDeblock)) {
663
+ this._setBooleanOption('webpSmartDeblock', options.smartDeblock);
664
+ }
661
665
  if (is.defined(options.preset)) {
662
666
  if (is.string(options.preset) && is.inArray(options.preset, ['default', 'photo', 'picture', 'drawing', 'icon', 'text'])) {
663
667
  this.options.webpPreset = options.preset;
@@ -1123,8 +1127,6 @@ function heif (options) {
1123
1127
  * The prebuilt binaries do not include this - see
1124
1128
  * {@link https://sharp.pixelplumbing.com/install#custom-libvips installing a custom libvips}.
1125
1129
  *
1126
- * Image metadata (EXIF, XMP) is unsupported.
1127
- *
1128
1130
  * @since 0.31.3
1129
1131
  *
1130
1132
  * @param {Object} [options] - output options
@@ -1132,7 +1134,9 @@ function heif (options) {
1132
1134
  * @param {number} [options.quality] - calculate `distance` based on JPEG-like quality, between 1 and 100, overrides distance if specified
1133
1135
  * @param {number} [options.decodingTier=0] - target decode speed tier, between 0 (highest quality) and 4 (lowest quality)
1134
1136
  * @param {boolean} [options.lossless=false] - use lossless compression
1135
- * @param {number} [options.effort=7] - CPU effort, between 3 (fastest) and 9 (slowest)
1137
+ * @param {number} [options.effort=7] - CPU effort, between 1 (fastest) and 9 (slowest)
1138
+ * @param {number} [options.loop=0] - number of animation iterations, use 0 for infinite animation
1139
+ * @param {number|number[]} [options.delay] - delay(s) between animation frames (in milliseconds)
1136
1140
  * @returns {Sharp}
1137
1141
  * @throws {Error} Invalid options
1138
1142
  */
@@ -1169,13 +1173,14 @@ function jxl (options) {
1169
1173
  }
1170
1174
  }
1171
1175
  if (is.defined(options.effort)) {
1172
- if (is.integer(options.effort) && is.inRange(options.effort, 3, 9)) {
1176
+ if (is.integer(options.effort) && is.inRange(options.effort, 1, 9)) {
1173
1177
  this.options.jxlEffort = options.effort;
1174
1178
  } else {
1175
- throw is.invalidParameterError('effort', 'integer between 3 and 9', options.effort);
1179
+ throw is.invalidParameterError('effort', 'integer between 1 and 9', options.effort);
1176
1180
  }
1177
1181
  }
1178
1182
  }
1183
+ trySetAnimationOptions(options, this.options);
1179
1184
  return this._updateFormatOut('jxl', options);
1180
1185
  }
1181
1186
 
package/lib/resize.js CHANGED
@@ -72,7 +72,9 @@ const kernel = {
72
72
  cubic: 'cubic',
73
73
  mitchell: 'mitchell',
74
74
  lanczos2: 'lanczos2',
75
- lanczos3: 'lanczos3'
75
+ lanczos3: 'lanczos3',
76
+ mks2013: 'mks2013',
77
+ mks2021: 'mks2021'
76
78
  };
77
79
 
78
80
  /**
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@revizly/sharp",
3
3
  "description": "High performance Node.js image processing, the fastest module to resize JPEG, PNG, WebP, GIF, AVIF and TIFF images",
4
- "version": "0.33.6-revizly2",
4
+ "version": "0.34.0-revizly2",
5
5
  "author": "Lovell Fuller <npm@lovell.info>",
6
6
  "homepage": "https://sharp.pixelplumbing.com",
7
7
  "contributors": [
@@ -148,19 +148,19 @@
148
148
  "@revizly/sharp-linux-x64": "0.33.6-revizly1"
149
149
  },
150
150
  "devDependencies": {
151
- "@emnapi/runtime": "^1.2.0",
151
+ "@emnapi/runtime": "^1.3.1",
152
152
  "@revizly/sharp-libvips-dev": "1.0.9",
153
153
  "@types/node": "*",
154
154
  "cc": "^3.0.1",
155
- "emnapi": "^1.2.0",
155
+ "emnapi": "^1.3.1",
156
156
  "exif-reader": "^2.0.1",
157
157
  "extract-zip": "^2.0.1",
158
158
  "icc": "^3.0.0",
159
- "jsdoc-to-markdown": "^9.0.0",
159
+ "jsdoc-to-markdown": "^9.0.5",
160
160
  "license-checker": "^25.0.1",
161
- "mocha": "^10.7.3",
162
- "node-addon-api": "^8.1.0",
163
- "nyc": "^17.0.0",
161
+ "mocha": "^10.8.2",
162
+ "node-addon-api": "^8.2.1",
163
+ "nyc": "^17.1.0",
164
164
  "prebuild": "^13.0.1",
165
165
  "semistandard": "^17.0.0",
166
166
  "tar-fs": "^3.0.6",
package/src/binding.gyp CHANGED
@@ -18,7 +18,7 @@
18
18
  # Build libvips C++ binding for Windows due to MSVC std library ABI changes
19
19
  'type': 'shared_library',
20
20
  'defines': [
21
- 'VIPS_CPLUSPLUS_EXPORTS',
21
+ '_VIPS_PUBLIC=__declspec(dllexport)',
22
22
  '_ALLOW_KEYWORD_MACROS'
23
23
  ],
24
24
  'sources': [
@@ -45,6 +45,9 @@
45
45
  'Release': {
46
46
  'msvs_settings': {
47
47
  'VCCLCompilerTool': {
48
+ "AdditionalOptions": [
49
+ "/std:c++17"
50
+ ],
48
51
  'ExceptionHandling': 1,
49
52
  'Optimization': 1,
50
53
  'WholeProgramOptimization': 'true'
@@ -172,6 +175,7 @@
172
175
  '-l:libvips-cpp.so.<(vips_version)'
173
176
  ],
174
177
  'ldflags': [
178
+ '-lstdc++fs',
175
179
  '-Wl,-s',
176
180
  '-Wl,--disable-new-dtags',
177
181
  '-Wl,-z,nodelete',
@@ -207,14 +211,14 @@
207
211
  }]
208
212
  ],
209
213
  'cflags_cc': [
210
- '-std=c++0x',
214
+ '-std=c++17',
211
215
  '-fexceptions',
212
216
  '-Wall',
213
217
  '-Os'
214
218
  ],
215
219
  'xcode_settings': {
216
- 'CLANG_CXX_LANGUAGE_STANDARD': 'c++11',
217
- 'MACOSX_DEPLOYMENT_TARGET': '10.13',
220
+ 'CLANG_CXX_LANGUAGE_STANDARD': 'c++17',
221
+ 'MACOSX_DEPLOYMENT_TARGET': '10.15',
218
222
  'GCC_ENABLE_CPP_EXCEPTIONS': 'YES',
219
223
  'GCC_ENABLE_CPP_RTTI': 'YES',
220
224
  'OTHER_CPLUSPLUSFLAGS': [
@@ -234,6 +238,9 @@
234
238
  ['OS == "win"', {
235
239
  'msvs_settings': {
236
240
  'VCCLCompilerTool': {
241
+ "AdditionalOptions": [
242
+ "/std:c++17"
243
+ ],
237
244
  'ExceptionHandling': 1,
238
245
  'Optimization': 1,
239
246
  'WholeProgramOptimization': 'true'
package/src/common.h CHANGED
@@ -20,13 +20,9 @@
20
20
  #error "libvips version 8.16.0+ is required - please see https://sharp.pixelplumbing.com/install"
21
21
  #endif
22
22
 
23
- #if ((!defined(__clang__)) && defined(__GNUC__) && (__GNUC__ < 4 || (__GNUC__ == 4 && __GNUC_MINOR__ < 6)))
24
- #error "GCC version 4.6+ is required for C++11 features - please see https://sharp.pixelplumbing.com/install"
25
- #endif
26
-
27
- #if (defined(__clang__) && defined(__has_feature))
28
- #if (!__has_feature(cxx_range_for))
29
- #error "clang version 3.0+ is required for C++11 features - please see https://sharp.pixelplumbing.com/install"
23
+ #if defined(__has_include)
24
+ #if !__has_include(<filesystem>)
25
+ #error "C++17 compiler required - please see https://sharp.pixelplumbing.com/install"
30
26
  #endif
31
27
  #endif
32
28
 
package/src/metadata.cc CHANGED
@@ -3,6 +3,7 @@
3
3
 
4
4
  #include <numeric>
5
5
  #include <vector>
6
+ #include <cmath>
6
7
 
7
8
  #include <napi.h>
8
9
  #include <vips/vips8>
@@ -47,8 +48,11 @@ class MetadataWorker : public Napi::AsyncWorker {
47
48
  if (image.get_typeof("interlaced") == G_TYPE_INT) {
48
49
  baton->isProgressive = image.get_int("interlaced") == 1;
49
50
  }
50
- if (image.get_typeof("palette-bit-depth") == G_TYPE_INT) {
51
- baton->paletteBitDepth = image.get_int("palette-bit-depth");
51
+ if (image.get_typeof(VIPS_META_PALETTE) == G_TYPE_INT) {
52
+ baton->isPalette = image.get_int(VIPS_META_PALETTE);
53
+ }
54
+ if (image.get_typeof(VIPS_META_BITS_PER_SAMPLE) == G_TYPE_INT) {
55
+ baton->bitsPerSample = image.get_int(VIPS_META_BITS_PER_SAMPLE);
52
56
  }
53
57
  if (image.get_typeof(VIPS_META_N_PAGES) == G_TYPE_INT) {
54
58
  baton->pages = image.get_int(VIPS_META_N_PAGES);
@@ -171,8 +175,13 @@ class MetadataWorker : public Napi::AsyncWorker {
171
175
  info.Set("chromaSubsampling", baton->chromaSubsampling);
172
176
  }
173
177
  info.Set("isProgressive", baton->isProgressive);
174
- if (baton->paletteBitDepth > 0) {
175
- info.Set("paletteBitDepth", baton->paletteBitDepth);
178
+ info.Set("isPalette", baton->isPalette);
179
+ if (baton->bitsPerSample > 0) {
180
+ info.Set("bitsPerSample", baton->bitsPerSample);
181
+ if (baton->isPalette) {
182
+ // Deprecated, remove with libvips 8.17.0
183
+ info.Set("paletteBitDepth", baton->bitsPerSample);
184
+ }
176
185
  }
177
186
  if (baton->pages > 0) {
178
187
  info.Set("pages", baton->pages);
@@ -218,15 +227,15 @@ class MetadataWorker : public Napi::AsyncWorker {
218
227
  info.Set("subifds", baton->subifds);
219
228
  }
220
229
  if (!baton->background.empty()) {
230
+ Napi::Object background = Napi::Object::New(env);
221
231
  if (baton->background.size() == 3) {
222
- Napi::Object background = Napi::Object::New(env);
223
232
  background.Set("r", baton->background[0]);
224
233
  background.Set("g", baton->background[1]);
225
234
  background.Set("b", baton->background[2]);
226
- info.Set("background", background);
227
235
  } else {
228
- info.Set("background", baton->background[0]);
236
+ background.Set("gray", round(baton->background[0] * 100 / 255));
229
237
  }
238
+ info.Set("background", background);
230
239
  }
231
240
  info.Set("hasProfile", baton->hasProfile);
232
241
  info.Set("hasAlpha", baton->hasAlpha);
package/src/metadata.h CHANGED
@@ -24,7 +24,8 @@ struct MetadataBaton {
24
24
  int density;
25
25
  std::string chromaSubsampling;
26
26
  bool isProgressive;
27
- int paletteBitDepth;
27
+ bool isPalette;
28
+ int bitsPerSample;
28
29
  int pages;
29
30
  int pageHeight;
30
31
  int loop;
@@ -59,7 +60,8 @@ struct MetadataBaton {
59
60
  channels(0),
60
61
  density(0),
61
62
  isProgressive(false),
62
- paletteBitDepth(0),
63
+ isPalette(false),
64
+ bitsPerSample(0),
63
65
  pages(0),
64
66
  pageHeight(0),
65
67
  loop(-1),
package/src/pipeline.cc CHANGED
@@ -3,6 +3,7 @@
3
3
 
4
4
  #include <algorithm>
5
5
  #include <cmath>
6
+ #include <filesystem>
6
7
  #include <map>
7
8
  #include <memory>
8
9
  #include <numeric>
@@ -20,17 +21,6 @@
20
21
  #include "operations.h"
21
22
  #include "pipeline.h"
22
23
 
23
- #ifdef _WIN32
24
- #define STAT64_STRUCT __stat64
25
- #define STAT64_FUNCTION _stat64
26
- #elif defined(_LARGEFILE64_SOURCE)
27
- #define STAT64_STRUCT stat64
28
- #define STAT64_FUNCTION stat64
29
- #else
30
- #define STAT64_STRUCT stat
31
- #define STAT64_FUNCTION stat
32
- #endif
33
-
34
24
  class PipelineWorker : public Napi::AsyncWorker {
35
25
  public:
36
26
  PipelineWorker(Napi::Function callback, PipelineBaton *baton,
@@ -929,6 +919,7 @@ class PipelineWorker : public Napi::AsyncWorker {
929
919
  ->set("lossless", baton->webpLossless)
930
920
  ->set("near_lossless", baton->webpNearLossless)
931
921
  ->set("smart_subsample", baton->webpSmartSubsample)
922
+ ->set("smart_deblock", baton->webpSmartDeblock)
932
923
  ->set("preset", baton->webpPreset)
933
924
  ->set("effort", baton->webpEffort)
934
925
  ->set("min_size", baton->webpMinSize)
@@ -1136,6 +1127,7 @@ class PipelineWorker : public Napi::AsyncWorker {
1136
1127
  ->set("lossless", baton->webpLossless)
1137
1128
  ->set("near_lossless", baton->webpNearLossless)
1138
1129
  ->set("smart_subsample", baton->webpSmartSubsample)
1130
+ ->set("smart_deblock", baton->webpSmartDeblock)
1139
1131
  ->set("preset", baton->webpPreset)
1140
1132
  ->set("effort", baton->webpEffort)
1141
1133
  ->set("min_size", baton->webpMinSize)
@@ -1304,9 +1296,11 @@ class PipelineWorker : public Napi::AsyncWorker {
1304
1296
  Callback().Call(Receiver().Value(), { env.Null(), data, info });
1305
1297
  } else {
1306
1298
  // Add file size to info
1307
- struct STAT64_STRUCT st;
1308
- if (STAT64_FUNCTION(baton->fileOut.data(), &st) == 0) {
1309
- info.Set("size", static_cast<uint32_t>(st.st_size));
1299
+ if (baton->formatOut != "dz" || sharp::IsDzZip(baton->fileOut)) {
1300
+ try {
1301
+ uint32_t const size = static_cast<uint32_t>(std::filesystem::file_size(baton->fileOut));
1302
+ info.Set("size", size);
1303
+ } catch (...) {}
1310
1304
  }
1311
1305
  Callback().Call(Receiver().Value(), { env.Null(), info });
1312
1306
  }
@@ -1419,6 +1413,7 @@ class PipelineWorker : public Napi::AsyncWorker {
1419
1413
  {"lossless", baton->webpLossless ? "true" : "false"},
1420
1414
  {"near_lossless", baton->webpNearLossless ? "true" : "false"},
1421
1415
  {"smart_subsample", baton->webpSmartSubsample ? "true" : "false"},
1416
+ {"smart_deblock", baton->webpSmartDeblock ? "true" : "false"},
1422
1417
  {"preset", vips_enum_nick(VIPS_TYPE_FOREIGN_WEBP_PRESET, baton->webpPreset)},
1423
1418
  {"min_size", baton->webpMinSize ? "true" : "false"},
1424
1419
  {"mixed", baton->webpMixed ? "true" : "false"},
@@ -1676,6 +1671,7 @@ Napi::Value pipeline(const Napi::CallbackInfo& info) {
1676
1671
  baton->webpLossless = sharp::AttrAsBool(options, "webpLossless");
1677
1672
  baton->webpNearLossless = sharp::AttrAsBool(options, "webpNearLossless");
1678
1673
  baton->webpSmartSubsample = sharp::AttrAsBool(options, "webpSmartSubsample");
1674
+ baton->webpSmartDeblock = sharp::AttrAsBool(options, "webpSmartDeblock");
1679
1675
  baton->webpPreset = sharp::AttrAsEnum<VipsForeignWebpPreset>(options, "webpPreset", VIPS_TYPE_FOREIGN_WEBP_PRESET);
1680
1676
  baton->webpEffort = sharp::AttrAsUint32(options, "webpEffort");
1681
1677
  baton->webpMinSize = sharp::AttrAsBool(options, "webpMinSize");
package/src/pipeline.h CHANGED
@@ -157,6 +157,7 @@ struct PipelineBaton {
157
157
  bool webpNearLossless;
158
158
  bool webpLossless;
159
159
  bool webpSmartSubsample;
160
+ bool webpSmartDeblock;
160
161
  VipsForeignWebpPreset webpPreset;
161
162
  int webpEffort;
162
163
  bool webpMinSize;
@@ -328,6 +329,7 @@ struct PipelineBaton {
328
329
  webpNearLossless(false),
329
330
  webpLossless(false),
330
331
  webpSmartSubsample(false),
332
+ webpSmartDeblock(false),
331
333
  webpPreset(VIPS_FOREIGN_WEBP_PRESET_DEFAULT),
332
334
  webpEffort(4),
333
335
  webpMinSize(false),