- char buf[1024];
- sprintf(buf,
- "const mat3 %s = mat3(\n"
- " %.8f, %.8f, %.8f,\n"
- " %.8f, %.8f, %.8f,\n"
- " %.8f, %.8f, %.8f);\n\n",
- name.c_str(),
- m(0,0), m(1,0), m(2,0),
- m(0,1), m(1,1), m(2,1),
- m(0,2), m(1,2), m(2,2));
- return buf;
-}
-
-void combine_two_samples(float w1, float w2, float *offset, float *total_weight, float *sum_sq_error)
-{
- assert(movit_initialized);
- assert(w1 * w2 >= 0.0f); // Should not have differing signs.
- float z; // Just a shorter name for offset.
- if (fabs(w1 + w2) < 1e-6) {
- z = 0.5f;
- } else {
- z = w2 / (w1 + w2);
- }
-
- // 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 = lrintf(z / movit_texel_subpixel_precision) * movit_texel_subpixel_precision;
-
- // 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));
- *offset = 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;
- }
-
- assert(*offset >= 0.0f);
- assert(*offset <= 1.0f);
+ // 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 mat3 " << name << " = mat3(\n";
+ ss << " " << m(0,0) << ", " << m(1,0) << ", " << m(2,0) << ",\n";
+ ss << " " << m(0,1) << ", " << m(1,1) << ", " << m(2,1) << ",\n";
+ ss << " " << m(0,2) << ", " << m(1,2) << ", " << m(2,2) << ");\n\n";
+ return ss.str();