Fix combining in ResampleEffect again.
authorSteinar H. Gunderson <sgunderson@bigfoot.com>
Sat, 21 Feb 2015 14:33:33 +0000 (15:33 +0100)
committerSteinar H. Gunderson <sgunderson@bigfoot.com>
Sat, 21 Feb 2015 14:33:33 +0000 (15:33 +0100)
It was completely broken after the last patch, so we'd effectively
never combine.

resample_effect_test.cpp
util.cpp

index 9082b26..5b620fd 100644 (file)
@@ -96,11 +96,11 @@ TEST(ResampleEffectTest, DownscaleByTwoGetsCorrectPixelCenters) {
        // the texel center right (everything is nicely symmetric).
        // The approximate magnitudes have been checked against ImageMagick.
        float expected_data[size * size] = {
-                0.0046, -0.0068, -0.0611, -0.0068,  0.0047,
-               -0.0068,  0.0100,  0.0895,  0.0100, -0.0068,
-               -0.0603,  0.0892,  0.7993,  0.0895, -0.0611,
-               -0.0067,  0.0100,  0.0892,  0.0100, -0.0068,
-                0.0045, -0.0067, -0.0603, -0.0068,  0.0046,
+                0.0045, -0.0067, -0.0599, -0.0067,  0.0045,
+               -0.0067,  0.0100,  0.0892,  0.0100, -0.0067,
+               -0.0599,  0.0890,  0.7925,  0.0892, -0.0599,
+               -0.0067,  0.0100,  0.0890,  0.0100, -0.0067,
+                0.0045, -0.0067, -0.0599, -0.0067,  0.0045,
        };
        float data[size * size * 4], out_data[size * size];
 
@@ -205,7 +205,7 @@ TEST(ResampleEffectTest, HeavyResampleGetsSumRight) {
        // Require that we are within 10-bit accuracy. Note that this limit is for
        // one pass only, but the limit is tight enough that it should be good enough
        // for 10-bit accuracy even after two passes.
-       expect_equal(expected_data, out_data, dwidth, dheight, 0.1 / 1023.0);
+       expect_equal(expected_data, out_data, dwidth, dheight, 0.12 / 1023.0);
 }
 
 TEST(ResampleEffectTest, ReadWholePixelFromLeft) {
index 61f3e4d..7fbc67a 100644 (file)
--- a/util.cpp
+++ b/util.cpp
@@ -174,7 +174,7 @@ void combine_two_samples(float w1, float w2, float pos1, float pos2, unsigned si
        if (rounding_behavior == COMBINE_ROUND_TO_FP16) {       
                // Round to fp16. Note that this might take z outside the 0..1 range.
                *offset = fp16_to_fp64(fp64_to_fp16(*offset));
-               z = (z - pos1) / (pos2 - pos1);
+               z = (*offset - pos1) / (pos2 - pos1);
        } else {
                assert(rounding_behavior == COMBINE_DO_NOT_ROUND);
        }