-
Notifications
You must be signed in to change notification settings - Fork 7.9k
Lossless conversion for webp #7348
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Conversation
Propagating lossless conversion from libgd to our bundled gd. Changing "quantization" to "quality" as in libgd. Adding test.
P.S. This is the parallel PR in libgd: libgd/libgd#698 |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Looks good to me. @cmb69?
ext/gd/gd.c
Outdated
/* constant for webp encoding */ | ||
REGISTER_LONG_CONSTANT("IMG_WEBP_LOSSLESS", PHP_IMG_WEBP_LOSSLESS, CONST_CS | CONST_PERSISTENT); | ||
|
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
What happens if ext/gd is compiled against a libgd which does not support lossless WebP encoding? Furthermore, there is currently no way to detect whether it is supported. So maybe:
/* constant for webp encoding */ | |
REGISTER_LONG_CONSTANT("IMG_WEBP_LOSSLESS", PHP_IMG_WEBP_LOSSLESS, CONST_CS | CONST_PERSISTENT); | |
#ifdef gdWebpLossless | |
/* constant for webp encoding */ | |
REGISTER_LONG_CONSTANT("IMG_WEBP_LOSSLESS", gdWebpLossless, CONST_CS | CONST_PERSISTENT); | |
#endif |
(and ditch the definition of PHP_IMG_WEBP_LOSSLESS
)
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I think I get it. Going forward, libgd will require a version of libwebp that's recent enough to support lossless WebP encoding. But your concern is that someone might use an older version of libgd. That older version wouldn't support losselss WebP... but it also wouldn't have the new gdWebpLossless
defined.
If I'm getting that right, I think this solution is pretty clever.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
That older version wouldn't support losselss WebP... but it also wouldn't have the new gdWebpLossless defined.
Right.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Now I see precedent for this in the code:
#ifdef gdEffectMultiply
REGISTER_LONG_CONSTANT("IMG_EFFECT_MULTIPLY", gdEffectMultiply, CONST_CS | CONST_PERSISTENT);
#endif
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Interesting! gdEffectMultiply is defined as of libgd 2.1.1, but we're still supporting 2.1.0. Still, something that can be removed sometime in the future.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Thank you!
Thank you for your consistent patience and good cheer! |
> GD: > * `imagewebp()` can do lossless WebP encoding by passing `IMG_WEBP_LOSSLESS` as > quality. This constant is only defined, if a libgd is used which supports > lossless WebP encoding. Includes unit tests. Refs: * https://github.com/php/php-src/blob/3a71fcf5caf042a4ce8a586a6b554fd70432e1e2/UPGRADING#L568-L571 * php/php-src#7348 * php/php-src@eb6c9eb
> GD: > * Avif support is now available through the `imagecreatefromavif()` and > `imageavif()` functions, if libgd has been built with avif support. While not mentioned in the changelog entry, the commit to PHP does contain a new constant declaration... Refs: * https://github.com/php/php-src/blob/f67986a9218f4889d9352a87c29337a5b6eaa4bd/UPGRADING#L245-L247 * php/php-src#7026 * php/php-src@81f6d36#diff-00d1efef2247b288c86a6c3bfefac111a4774fbc5453fdc02dcf36c4a23da283R373 > GD: > * `imagewebp()` can do lossless WebP encoding by passing `IMG_WEBP_LOSSLESS` as > quality. This constant is only defined, if a libgd is used which supports > lossless WebP encoding. Refs: * https://github.com/php/php-src/blob/3a71fcf5caf042a4ce8a586a6b554fd70432e1e2/UPGRADING#L568-L571 * php/php-src#7348 * php/php-src@eb6c9eb
* PHP 8.1 | MigrationGuide/New constants: add missing constants [1] > * Added CURLOPT_DOH_URL option > * Added certificate blob options when for libcurl >= 7.71.0: > > CURLOPT_ISSUERCERT_BLOB > CURLOPT_PROXY_ISSUERCERT > CURLOPT_PROXY_ISSUERCERT_BLOB > CURLOPT_PROXY_SSLCERT_BLOB > CURLOPT_PROXY_SSLKEY_BLOB > CURLOPT_SSLCERT_BLOB > CURLOPT_SSLKEY_BLOB Refs: * https://github.com/php/php-src/blob/f67986a9218f4889d9352a87c29337a5b6eaa4bd/UPGRADING#L220-L229 * php/php-src#6612 * php/php-src@3dad63b * php/php-src#7194 * php/php-src@b11785c * PHP 8.1 | MigrationGuide/New constants: add missing constants [2] > GD: > * Avif support is now available through the `imagecreatefromavif()` and > `imageavif()` functions, if libgd has been built with avif support. While not mentioned in the changelog entry, the commit to PHP does contain a new constant declaration... Refs: * https://github.com/php/php-src/blob/f67986a9218f4889d9352a87c29337a5b6eaa4bd/UPGRADING#L245-L247 * php/php-src#7026 * php/php-src@81f6d36#diff-00d1efef2247b288c86a6c3bfefac111a4774fbc5453fdc02dcf36c4a23da283R373 > GD: > * `imagewebp()` can do lossless WebP encoding by passing `IMG_WEBP_LOSSLESS` as > quality. This constant is only defined, if a libgd is used which supports > lossless WebP encoding. Refs: * https://github.com/php/php-src/blob/3a71fcf5caf042a4ce8a586a6b554fd70432e1e2/UPGRADING#L568-L571 * php/php-src#7348 * php/php-src@eb6c9eb * PHP 8.1 | MigrationGuide/New constants: add missing constants [3] > Added `POSIX_RLIMIT_KQUEUES` and `POSIX_RLIMIT_NPTS`. These rlimits are only available on FreeBSD. Refs: * https://www.php.net/manual/en/migration81.new-features.php#migration81.new-features.posix * php/php-src#6608 * php/php-src@ebca8de * PHP 8.1 | MigrationGuide/New constants: add missing constants [4] Refs: * https://wiki.php.net/rfc/readonly_properties_v2 * php/php-src#7089 * php/php-src@6780aaa * PHP 8.1 | MigrationGuide/New constants: add missing constants [5] While not mentioned anywhere at all, the commit to PHP itself adding support for the Sodium xchacha* functions, does declare a couple of new constants as well... Refs: * php/php-src#6868 * php/php-src@f7f1f7f#diff-3fe4027560fd299248af1dc1efe04287cc2b6418e8f01755c05c9db64b668b1eR352-R357 While not mentioned anywhere at all, the commit to PHP itself adding support for the Sodium ristretto255* functions, also declares a number of new constants as well... Refs: * php/php-src#6922 * php/php-src@9b794f8#diff-3fe4027560fd299248af1dc1efe04287cc2b6418e8f01755c05c9db64b668b1eR368-R381 Co-authored-by: jrfnl <[email protected]> Closes GH-1449.
* PHP 8.1 | MigrationGuide/New constants: add missing constants [1] > * Added CURLOPT_DOH_URL option > * Added certificate blob options when for libcurl >= 7.71.0: > > CURLOPT_ISSUERCERT_BLOB > CURLOPT_PROXY_ISSUERCERT > CURLOPT_PROXY_ISSUERCERT_BLOB > CURLOPT_PROXY_SSLCERT_BLOB > CURLOPT_PROXY_SSLKEY_BLOB > CURLOPT_SSLCERT_BLOB > CURLOPT_SSLKEY_BLOB Refs: * https://github.com/php/php-src/blob/f67986a9218f4889d9352a87c29337a5b6eaa4bd/UPGRADING#L220-L229 * php/php-src#6612 * php/php-src@3dad63b * php/php-src#7194 * php/php-src@b11785c * PHP 8.1 | MigrationGuide/New constants: add missing constants [2] > GD: > * Avif support is now available through the `imagecreatefromavif()` and > `imageavif()` functions, if libgd has been built with avif support. While not mentioned in the changelog entry, the commit to PHP does contain a new constant declaration... Refs: * https://github.com/php/php-src/blob/f67986a9218f4889d9352a87c29337a5b6eaa4bd/UPGRADING#L245-L247 * php/php-src#7026 * php/php-src@81f6d36#diff-00d1efef2247b288c86a6c3bfefac111a4774fbc5453fdc02dcf36c4a23da283R373 > GD: > * `imagewebp()` can do lossless WebP encoding by passing `IMG_WEBP_LOSSLESS` as > quality. This constant is only defined, if a libgd is used which supports > lossless WebP encoding. Refs: * https://github.com/php/php-src/blob/3a71fcf5caf042a4ce8a586a6b554fd70432e1e2/UPGRADING#L568-L571 * php/php-src#7348 * php/php-src@eb6c9eb * PHP 8.1 | MigrationGuide/New constants: add missing constants [3] > Added `POSIX_RLIMIT_KQUEUES` and `POSIX_RLIMIT_NPTS`. These rlimits are only available on FreeBSD. Refs: * https://www.php.net/manual/en/migration81.new-features.php#migration81.new-features.posix * php/php-src#6608 * php/php-src@ebca8de * PHP 8.1 | MigrationGuide/New constants: add missing constants [4] Refs: * https://wiki.php.net/rfc/readonly_properties_v2 * php/php-src#7089 * php/php-src@6780aaa * PHP 8.1 | MigrationGuide/New constants: add missing constants [5] While not mentioned anywhere at all, the commit to PHP itself adding support for the Sodium xchacha* functions, does declare a couple of new constants as well... Refs: * php/php-src#6868 * php/php-src@f7f1f7f#diff-3fe4027560fd299248af1dc1efe04287cc2b6418e8f01755c05c9db64b668b1eR352-R357 While not mentioned anywhere at all, the commit to PHP itself adding support for the Sodium ristretto255* functions, also declares a number of new constants as well... Refs: * php/php-src#6922 * php/php-src@9b794f8#diff-3fe4027560fd299248af1dc1efe04287cc2b6418e8f01755c05c9db64b668b1eR368-R381 Co-authored-by: jrfnl <[email protected]> Closes phpGH-1449.
I'm propagating lossless conversion from libgd to our bundled gd.
I've also changed "quantization" to "quality", as it is in libgd, making our webp code just a little closer to what's in libgd.
Added test as well.
Note that this change adds a new possible value of
101
for quality, indicating losslessness. This will need to be documented./cc @adamsilverstein