wl_fixed_to_double() function only correct when fixed value is greater than zero

Pekka Paalanen ppaalanen at gmail.com
Tue Jan 17 15:27:19 UTC 2023

On Mon, 16 Jan 2023 14:43:43 +0800
"程安絮" <chenganxu2014 at sina.com> wrote:

> In file main.go is my implementation of FixedToFloat64 vs
> wl_fixed_to_double, the comments can help you to understand my codes.
> Since event wl_touch::orientation's orientation arg is fixed value
> and can be negative, I think this bug is not acceptable. Besides, I
> don't understand how wl_fixed_to_double works, can anyone illustrate
> that for me? 
> --------------------------------程安絮


that wl_fixed_to_double() implementation in C is a far too smart trick
for no other good reason than trying to be fast in a case where speed
is not needed.

The human readable conversion would be:

double wl_fixed_to_double(wl_fixed_t f)
        return (double)f / 256.0;

The trick code seems to be just fine through. I've attached a test
program that iterates through all possible wl_fixed_t values and
ensures the trivial conversion agrees with the trick conversion.

I cannot explain how it works, but it does seem to work.

-------------- next part --------------
A non-text attachment was scrubbed...
Name: fixed.c
Type: text/x-c++src
Size: 641 bytes
Desc: not available
URL: <https://lists.freedesktop.org/archives/wayland-devel/attachments/20230117/dee462bf/attachment.c>
-------------- next part --------------
A non-text attachment was scrubbed...
Name: not available
Type: application/pgp-signature
Size: 833 bytes
Desc: OpenPGP digital signature
URL: <https://lists.freedesktop.org/archives/wayland-devel/attachments/20230117/dee462bf/attachment.sig>

More information about the wayland-devel mailing list