From 0674c39993f2508343be6a8493feb93ae10e8bf3 Mon Sep 17 00:00:00 2001 From: Kleis Auke Wolthuizen Date: Fri, 1 Sep 2023 12:40:47 +0200 Subject: [PATCH] Add the `&ll` parameter (#386) To control whether the resulting image should be lossless compressed. This only applies to formats that offer both lossy and lossless compression capabilities, such as WebP. --- src/api/parsers/query.cpp | 28 +++++++++++++++------------- src/api/processors/stream.cpp | 3 +++ 2 files changed, 18 insertions(+), 13 deletions(-) diff --git a/src/api/parsers/query.cpp b/src/api/parsers/query.cpp index 4a81e0e..eddd6a7 100644 --- a/src/api/parsers/query.cpp +++ b/src/api/parsers/query.cpp @@ -14,8 +14,8 @@ using enums::MaskType; using enums::Output; using enums::Position; -// `&[precrop]=true` -constexpr size_t MAX_KEY_LENGTH = sizeof("precrop") - 1; +// `&[lossless]=true` +constexpr size_t MAX_KEY_LENGTH = sizeof("lossless") - 1; // A vector must not have more than 65536 elements. const size_t MAX_VECTOR_SIZE = 65536; @@ -66,6 +66,7 @@ const TypeMap &type_map = { {"l", typeid(int)}, {"output", typeid(Output)}, {"il", typeid(bool)}, + {"ll", typeid(bool)}, // TODO(kleisauke): Documentation needed. {"af", typeid(bool)}, {"page", typeid(int)}, {"n", typeid(int)}, @@ -75,19 +76,20 @@ const TypeMap &type_map = { }; const SynonymMap &synonym_map = { - {"shape", "mask"}, // &shape= was deprecated since API version 4 - {"strim", "mtrim"}, // &strim= was deprecated since API version 4 - {"or", "ro"}, // &or= was deprecated since API version 5 - {"t", "fit"}, // &t= was deprecated since API version 5 + {"shape", "mask"}, // &shape= was deprecated since API version 4 + {"strim", "mtrim"}, // &strim= was deprecated since API version 4 + {"or", "ro"}, // &or= was deprecated since API version 5 + {"t", "fit"}, // &t= was deprecated since API version 5 // TODO(kleisauke): Synonym this within a major release (since it breaks BC). - //{"bri", "mod"}, + //{"bri", "mod"}, // Some handy synonyms - {"pages", "n"}, - {"width", "w"}, - {"height", "h"}, - {"align", "a"}, - {"level", "l"}, - {"quality", "q"}, + {"pages", "n"}, + {"width", "w"}, + {"height", "h"}, + {"align", "a"}, + {"level", "l"}, + {"quality", "q"}, + {"lossless", "ll"}, }; const NginxKeySet &nginx_keys = { diff --git a/src/api/processors/stream.cpp b/src/api/processors/stream.cpp index d7ce15e..3774dd5 100644 --- a/src/api/processors/stream.cpp +++ b/src/api/processors/stream.cpp @@ -356,6 +356,9 @@ void Stream::append_save_options(vips::VOption *options) const { }, static_cast(config_.webp_quality)); + // Enable lossless compression, if necessary + options->set("lossless", query_->get("ll", false)); + // Set quality (default is 80) options->set("Q", quality);