summaryrefslogtreecommitdiff
path: root/include
diff options
context:
space:
mode:
Diffstat (limited to 'include')
-rw-r--r--include/yasl/yasl.h10
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;