diff options
Diffstat (limited to 'include/yasl')
| -rw-r--r-- | include/yasl/yasl.h | 10 |
1 files changed, 7 insertions, 3 deletions
diff --git a/include/yasl/yasl.h b/include/yasl/yasl.h index 77666f8..df94800 100644 --- a/include/yasl/yasl.h +++ b/include/yasl/yasl.h @@ -6,6 +6,7 @@ #include <stdint.h> #include <limits.h> #include <float.h> +#include <math.h> #include "yasl/timing.h" @@ -52,17 +53,20 @@ struct yasl_rect2i { static inline int yasl_scale_to_device(double logical, uint32_t scale_120) { if (!scale_120 || !(logical >= -DBL_MAX && logical <= DBL_MAX)) return 0; - double px = logical * ((double)scale_120 / YASL_SCALE_UNIT); + double px = (scale_120 == YASL_SCALE_UNIT) ? logical : (logical * ((double)scale_120 / YASL_SCALE_UNIT)); if (px >= INT_MAX) return INT_MAX; if (px <= INT_MIN) return INT_MIN; - return (int)(px < 0 ? px - 0.5 : px + 0.5); + return (int)(px + copysign(0.5, px)); } static inline int yasl_scale_to_logical(int device, uint32_t scale_120) { if (!scale_120) return 0; + if (scale_120 == YASL_SCALE_UNIT) return device; int64_t px = (int64_t)device * YASL_SCALE_UNIT; - px = (px + (px < 0 ? -(int64_t)(scale_120 / 2) : scale_120 / 2)) / scale_120; + int64_t half = (int64_t)(scale_120 / 2); + int64_t bias = (px < 0) ? -half : half; + px = (px + bias) / scale_120; if (px > INT_MAX) return INT_MAX; if (px < INT_MIN) return INT_MIN; return (int)px; |
