- // Round to the desired precision. Note that this might take z outside the 0..1 range.
- *offset = from_fp64<DestFloat>(pos1 + z * (pos2 - pos1));
- z = (to_fp64(*offset) - pos1) / (pos2 - pos1);
-
- // Round to the minimum number of bits we have measured earlier.
- // The card will do this for us anyway, but if we know what the real z
- // is, we can pick a better total_weight below.
- z *= size; // Move to pixel coordinates,
- z = lrintf(z / movit_texel_subpixel_precision) * movit_texel_subpixel_precision; // Round.
- z /= size; // Move back to normalized coordinates.
-
- // Choose total weight w so that we minimize total squared error
- // for the effective weights:
- //
- // e = (w(1-z) - a)² + (wz - b)²
- //
- // Differentiating by w and setting equal to zero:
- //
- // 2(w(1-z) - a)(1-z) + 2(wz - b)z = 0
- // w(1-z)² - a(1-z) + wz² - bz = 0
- // w((1-z)² + z²) = a(1-z) + bz
- // w = (a(1-z) + bz) / ((1-z)² + z²)
- //
- // If z had infinite precision, this would simply reduce to w = w1 + w2.
- *total_weight = (w1 * (1 - z) + w2 * z) / (z * z + (1 - z) * (1 - z));
-
- if (sum_sq_error != NULL) {
- float err1 = *total_weight * (1 - z) - w1;
- float err2 = *total_weight * z - w2;
- *sum_sq_error = err1 * err1 + err2 * err2;
- }
+string output_glsl_vec2(const string &name, float x, float y)
+{
+ // Use stringstream to be independent of the current locale in a thread-safe manner.
+ stringstream ss;
+ ss.imbue(locale("C"));
+ ss.precision(8);
+ ss << scientific;
+ ss << "const vec2 " << name << " = vec2(" << x << ", " << y << ");\n";
+ return ss.str();