On Fri, 28 Feb 2025 21:48:54 GMT, John Hendrikx <jhendr...@openjdk.org> wrote:

>> good point!
>> 
>> This is exactly the reason for the code in ScaledMath:71
>> 
>> return Math.ceil(d - Math.ulp(d)) / scale;
>
> Come to think of it, most the issues here are caused by using functions like 
> `floor` and `ceil`.  It might be an idea to change these functions to bias 
> them slightly towards rounding to the closest value, instead of always doing 
> a straight up `floor` or `ceil`.
> 
> For example, let's say I calculate a size as `3.0000001`; ceiling this (with 
> snapSize) to `4` is quite ridiculous; obviously `3` was intended, but the 
> ceiling function won't care.  But what if we subtracted a value (assuming 
> we're dealing with pixels of course, which the `snap` functions are)? We 
> could bias it slightly towards the correct value by using something 
> ridiculously small like 1/10000th of a pixel. For example:
> 
> `3.0000001` - 1/10000th of a pixel = `2.9999`. Ceiling this value yields the 
> intended `3`.  We could work much safer with near snapped values, as there is 
> much less risk of a one ulp difference being dramatically amplified by 
> floor/ceil functions.

> good point!
> 
> This is exactly the reason for the code in ScaledMath:71
> 
> ```
> return Math.ceil(d - Math.ulp(d)) / scale;
> ```

Yeah, but I think we may want to subtract more than just 1 ulp.  A one ulp 
difference can be created after any operation (like add/subtract).  Do two of 
these without resnapping, and the difference will be >1 ulp)

-------------

PR Review Comment: https://git.openjdk.org/jfx/pull/1723#discussion_r1976048373

Reply via email to