Set PNG bitdepth based on number of colours #2855

Removes use of deprecated libvips API
This commit is contained in:
Lovell Fuller 2021-08-26 22:05:29 +01:00
parent 4e84f743e4
commit 3402656ec5
5 changed files with 12 additions and 7 deletions

View File

@ -4,6 +4,11 @@
Requires libvips v8.11.3 Requires libvips v8.11.3
### v0.29.1 - TBD
* Ensure correct PNG bitdepth is set based on number of colours.
[#2855](https://github.com/lovell/sharp/issues/2855)
### v0.29.0 - 17th August 2021 ### v0.29.0 - 17th August 2021
* Drop support for Node.js 10, now requires Node.js >= 12.13.0. * Drop support for Node.js 10, now requires Node.js >= 12.13.0.

View File

@ -232,7 +232,7 @@ const Sharp = function (input, options) {
pngAdaptiveFiltering: false, pngAdaptiveFiltering: false,
pngPalette: false, pngPalette: false,
pngQuality: 100, pngQuality: 100,
pngColours: 256, pngBitdepth: 8,
pngDither: 1, pngDither: 1,
webpQuality: 80, webpQuality: 80,
webpAlphaQuality: 100, webpAlphaQuality: 100,

View File

@ -405,7 +405,7 @@ function png (options) {
const colours = options.colours || options.colors; const colours = options.colours || options.colors;
if (is.defined(colours)) { if (is.defined(colours)) {
if (is.integer(colours) && is.inRange(colours, 2, 256)) { if (is.integer(colours) && is.inRange(colours, 2, 256)) {
this.options.pngColours = colours; this.options.pngBitdepth = 1 << 31 - Math.clz32(Math.ceil(Math.log2(colours)));
} else { } else {
throw is.invalidParameterError('colours', 'integer between 2 and 256', colours); throw is.invalidParameterError('colours', 'integer between 2 and 256', colours);
} }

View File

@ -799,7 +799,7 @@ class PipelineWorker : public Napi::AsyncWorker {
->set("filter", baton->pngAdaptiveFiltering ? VIPS_FOREIGN_PNG_FILTER_ALL : VIPS_FOREIGN_PNG_FILTER_NONE) ->set("filter", baton->pngAdaptiveFiltering ? VIPS_FOREIGN_PNG_FILTER_ALL : VIPS_FOREIGN_PNG_FILTER_NONE)
->set("palette", baton->pngPalette) ->set("palette", baton->pngPalette)
->set("Q", baton->pngQuality) ->set("Q", baton->pngQuality)
->set("colours", baton->pngColours) ->set("bitdepth", baton->pngBitdepth)
->set("dither", baton->pngDither))); ->set("dither", baton->pngDither)));
baton->bufferOut = static_cast<char*>(area->data); baton->bufferOut = static_cast<char*>(area->data);
baton->bufferOutLength = area->length; baton->bufferOutLength = area->length;
@ -955,7 +955,7 @@ class PipelineWorker : public Napi::AsyncWorker {
->set("filter", baton->pngAdaptiveFiltering ? VIPS_FOREIGN_PNG_FILTER_ALL : VIPS_FOREIGN_PNG_FILTER_NONE) ->set("filter", baton->pngAdaptiveFiltering ? VIPS_FOREIGN_PNG_FILTER_ALL : VIPS_FOREIGN_PNG_FILTER_NONE)
->set("palette", baton->pngPalette) ->set("palette", baton->pngPalette)
->set("Q", baton->pngQuality) ->set("Q", baton->pngQuality)
->set("colours", baton->pngColours) ->set("bitdepth", baton->pngBitdepth)
->set("dither", baton->pngDither)); ->set("dither", baton->pngDither));
baton->formatOut = "png"; baton->formatOut = "png";
} else if (baton->formatOut == "webp" || (mightMatchInput && isWebp) || } else if (baton->formatOut == "webp" || (mightMatchInput && isWebp) ||
@ -1429,7 +1429,7 @@ Napi::Value pipeline(const Napi::CallbackInfo& info) {
baton->pngAdaptiveFiltering = sharp::AttrAsBool(options, "pngAdaptiveFiltering"); baton->pngAdaptiveFiltering = sharp::AttrAsBool(options, "pngAdaptiveFiltering");
baton->pngPalette = sharp::AttrAsBool(options, "pngPalette"); baton->pngPalette = sharp::AttrAsBool(options, "pngPalette");
baton->pngQuality = sharp::AttrAsUint32(options, "pngQuality"); baton->pngQuality = sharp::AttrAsUint32(options, "pngQuality");
baton->pngColours = sharp::AttrAsUint32(options, "pngColours"); baton->pngBitdepth = sharp::AttrAsUint32(options, "pngBitdepth");
baton->pngDither = sharp::AttrAsDouble(options, "pngDither"); baton->pngDither = sharp::AttrAsDouble(options, "pngDither");
baton->webpQuality = sharp::AttrAsUint32(options, "webpQuality"); baton->webpQuality = sharp::AttrAsUint32(options, "webpQuality");
baton->webpAlphaQuality = sharp::AttrAsUint32(options, "webpAlphaQuality"); baton->webpAlphaQuality = sharp::AttrAsUint32(options, "webpAlphaQuality");

View File

@ -146,7 +146,7 @@ struct PipelineBaton {
bool pngAdaptiveFiltering; bool pngAdaptiveFiltering;
bool pngPalette; bool pngPalette;
int pngQuality; int pngQuality;
int pngColours; int pngBitdepth;
double pngDither; double pngDither;
int webpQuality; int webpQuality;
int webpAlphaQuality; int webpAlphaQuality;
@ -276,7 +276,7 @@ struct PipelineBaton {
pngAdaptiveFiltering(false), pngAdaptiveFiltering(false),
pngPalette(false), pngPalette(false),
pngQuality(100), pngQuality(100),
pngColours(256), pngBitdepth(8),
pngDither(1.0), pngDither(1.0),
webpQuality(80), webpQuality(80),
webpAlphaQuality(100), webpAlphaQuality(100),