mirror of
https://github.com/X11Libre/xserver.git
synced 2026-09-29 21:46:40 +00:00
dix: add utility functions for double to/fro FP1616/FP3232 conversion
Co-authored-by: Jeremy Huddleston <jeremyhu@apple.com> Signed-off-by: Peter Hutterer <peter.hutterer@who-t.net> Reviewed-by: Peter Hutterer <peter.hutterer@who-t.net> Reviewed-by: Jeremy Huddleston <jeremyhu@apple.com> Reviewed-by: Mark Kettenis <kettenis@openbsd.org>
This commit is contained in:
parent
09dbfcb0ad
commit
f9c6903d4a
3 changed files with 197 additions and 0 deletions
|
|
@ -759,3 +759,66 @@ input_option_set_value(InputOption *opt, const char *value)
|
|||
if (value)
|
||||
opt->value = strdup(value);
|
||||
}
|
||||
|
||||
|
||||
/* FP1616/FP3232 conversion functions.
|
||||
* Fixed point types are encoded as signed integral and unsigned frac. So any
|
||||
* negative number -n.m is encoded as floor(n) + (1 - 0.m).
|
||||
*/
|
||||
double
|
||||
fp1616_to_double(FP1616 in)
|
||||
{
|
||||
double ret;
|
||||
|
||||
ret = (double)(in >> 16);
|
||||
ret += (double)(in & 0xffff) * (1.0 / (1UL << 16)); /* Optimized: ldexp((double)(in & 0xffff), -16); */
|
||||
return ret;
|
||||
}
|
||||
|
||||
double
|
||||
fp3232_to_double(FP3232 in)
|
||||
{
|
||||
double ret;
|
||||
ret = (double)in.integral;
|
||||
ret += (double)in.frac * (1.0 / (1ULL << 32)); /* Optimized: ldexp((double)in.frac, -32); */
|
||||
return ret;
|
||||
}
|
||||
|
||||
|
||||
FP1616
|
||||
double_to_fp1616(double in)
|
||||
{
|
||||
FP1616 ret;
|
||||
int32_t integral;
|
||||
double tmp;
|
||||
uint32_t frac_d;
|
||||
|
||||
tmp = floor(in);
|
||||
integral = (int32_t)tmp;
|
||||
|
||||
tmp = (in - integral) * (1UL << 16); /* Optimized: ldexp(in - integral, 16) */
|
||||
frac_d = (uint16_t)tmp;
|
||||
|
||||
ret = integral << 16;
|
||||
ret |= frac_d & 0xffff;
|
||||
return ret;
|
||||
}
|
||||
|
||||
FP3232
|
||||
double_to_fp3232(double in)
|
||||
{
|
||||
FP3232 ret;
|
||||
int32_t integral;
|
||||
double tmp;
|
||||
uint32_t frac_d;
|
||||
|
||||
tmp = floor(in);
|
||||
integral = (int32_t)tmp;
|
||||
|
||||
tmp = (in - integral) * (1ULL << 32); /* Optimized: ldexp(in - integral, 32) */
|
||||
frac_d = (uint32_t)tmp;
|
||||
|
||||
ret.integral = integral;
|
||||
ret.frac = frac_d;
|
||||
return ret;
|
||||
}
|
||||
|
|
|
|||
Loading…
Reference in a new issue