Skip to content

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

Closed
wants to merge 3 commits into from
Closed

Conversation

morsssss
Copy link
Contributor

@morsssss morsssss commented Aug 6, 2021

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

Propagating lossless conversion from libgd to our bundled gd.
Changing "quantization" to "quality" as in libgd.
Adding test.
@morsssss
Copy link
Contributor Author

P.S. This is the parallel PR in libgd: libgd/libgd#698

Copy link
Member

@nikic nikic left a 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
Comment on lines 381 to 383
/* constant for webp encoding */
REGISTER_LONG_CONSTANT("IMG_WEBP_LOSSLESS", PHP_IMG_WEBP_LOSSLESS, CONST_CS | CONST_PERSISTENT);

Copy link
Member

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:

Suggested change
/* 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)

Copy link
Contributor Author

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.

Copy link
Member

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.

Copy link
Contributor Author

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

Copy link
Member

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.

Copy link
Member

@cmb69 cmb69 left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Thank you!

@morsssss
Copy link
Contributor Author

Thank you!

Thank you for your consistent patience and good cheer!

@cmb69 cmb69 closed this in eb6c9eb Aug 12, 2021
jrfnl added a commit to PHPCompatibility/PHPCompatibility that referenced this pull request Mar 9, 2022
> 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
jrfnl added a commit to jrfnl/doc-en that referenced this pull request Mar 11, 2022
> 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
cmb69 pushed a commit to php/doc-en that referenced this pull request Mar 11, 2022
* 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.
tiffany-taylor pushed a commit to tiffany-taylor/doc-en that referenced this pull request Jan 16, 2023
* 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.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
Projects
None yet
Development

Successfully merging this pull request may close these issues.

5 participants