- double inv_det = 1.0 / (
- m[6] * m[1] * m[5] - m[6] * m[2] * m[4] -
- m[3] * m[1] * m[8] + m[3] * m[2] * m[7] +
- m[0] * m[4] * m[8] - m[0] * m[5] * m[7]);
+ // 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();
+}
+
+string output_glsl_vec3(const string &name, float x, float y, float z)
+{
+ // 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 vec3 " << name << " = vec3(" << x << ", " << y << ", " << z << ");\n";
+ return ss.str();
+}
+
+template<class DestFloat>
+void combine_two_samples(float w1, float w2, float pos1, float pos2, float num_subtexels, float inv_num_subtexels,
+ DestFloat *offset, DestFloat *total_weight, float *sum_sq_error)
+{
+ assert(movit_initialized);
+ assert(w1 * w2 >= 0.0f); // Should not have differing signs.
+ float z; // Normalized 0..1 between pos1 and pos2.
+ if (fabs(w1 + w2) < 1e-6) {
+ z = 0.5f;
+ } else {
+ z = w2 / (w1 + w2);
+ }
+
+ // Round to the desired precision. Note that this might take z outside the 0..1 range.
+ *offset = from_fp32<DestFloat>(pos1 + z * (pos2 - pos1));
+ z = (to_fp32(*offset) - pos1) / (pos2 - pos1);