wined3d: Reimplement wined3d_ftoa().

The current implementation is not precise enough when the FPU is in REAL4
mode, which also happens to be the mode d3d9 sets by default. Doing the same
thing with integer math is a huge pain, so just replace the decimal separator
instead.
This commit is contained in:
Henri Verbeet 2013-11-22 10:45:00 +01:00 committed by Alexandre Julliard
parent 5f15a5633c
commit 12f16f2127
1 changed files with 7 additions and 40 deletions

View File

@ -3806,51 +3806,18 @@ const char *wined3d_debug_location(DWORD location)
return buf[0] ? wine_dbg_sprintf("%s", &buf[3]) : "0"; return buf[0] ? wine_dbg_sprintf("%s", &buf[3]) : "0";
} }
/* This should be equivalent to using the %.8e format specifier, but always /* Print a floating point value with the %.8e format specifier, always using
* using '.' as decimal separator. This doesn't handle +/-INF or NAN, since * '.' as decimal separator. */
* the GLSL and ARB parsers wouldn't be able to handle those anyway. */
void wined3d_ftoa(float value, char *s) void wined3d_ftoa(float value, char *s)
{ {
int x, frac, exponent; int idx = 1;
const char *sign = "";
double d;
d = value;
if (copysignf(1.0f, value) < 0.0f) if (copysignf(1.0f, value) < 0.0f)
{ ++idx;
d = -d;
sign = "-";
}
if (d == 0.0f) sprintf(s, "%.8e", value);
{ if (isfinite(value))
x = 0; s[idx] = '.';
frac = 0;
exponent = 0;
}
else
{
double t, diff;
exponent = floorf(log10f(d));
d /= pow(10.0, exponent);
x = d;
t = (d - x) * 100000000;
frac = t;
diff = t - frac;
if ((diff > 0.5) || (diff == 0.5 && (frac & 1)))
{
if (++frac >= 100000000)
{
frac = 0;
++x;
}
}
}
sprintf(s, "%s%d.%08de%+03d", sign, x, frac, exponent);
} }
void wined3d_release_dc(HWND window, HDC dc) void wined3d_release_dc(HWND window, HDC dc)