Ejemplo n.º 1
0
SkPM4f SkPM4f::FromF16(const uint16_t half[4]) {
    return {{
        SkHalfToFloat(half[0]),
        SkHalfToFloat(half[1]),
        SkHalfToFloat(half[2]),
        SkHalfToFloat(half[3])
    }};
}
Ejemplo n.º 2
0
static bool eq_within_half_float(float a, float b) {
    const float kTolerance = 1.0f / (1 << (8 + 10));

    SkHalf ha = SkFloatToHalf(a);
    SkHalf hb = SkFloatToHalf(b);
    float a2 = SkHalfToFloat(ha);
    float b2 = SkHalfToFloat(hb);
    return fabsf(a2 - b2) <= kTolerance;
}
Ejemplo n.º 3
0
DEF_TEST(FloatToHalf_finite, r) {
#if 0
    for (uint64_t bits = 0; bits <= 0xffffffff; bits++) {
#else
    SkRandom rand;
    for (int i = 0; i < 1000000; i++) {
        uint32_t bits = rand.nextU();
#endif
        float f;
        memcpy(&f, &bits, 4);
        if (isfinite(f) && isfinite(SkHalfToFloat(SkFloatToHalf(f)))) {
            uint16_t h1 = SkFloatToHalf_finite(Sk4f(f,0,0,0))[0],
                     h2 = SkFloatToHalf(f);
            bool ok = (h1 == h2 || h1 == h2-1);
            REPORTER_ASSERT(r, ok);
            if (!ok) {
                SkDebugf("%08x (%g) -> %04x, want %04x (%g)\n",
                         bits, f, h1, h2, SkHalfToFloat(h2));
                break;
            }
        }
    }
}
Ejemplo n.º 4
0
DEF_TEST(SkHalfToFloat_finite_ftz, r) {
    for (uint32_t h = 0; h <= 0xffff; h++) {
        if (!is_finite(h)) {
            // _finite_ftz() only works for values that can be represented as a finite half float.
            continue;
        }

        // _finite_ftz() may flush denorms to zero.  0.0f will compare == with both +0.0f and -0.0f.
        float expected  = SkHalfToFloat(h),
              alternate = is_denorm(h) ? 0.0f : expected;

        float actual = SkHalfToFloat_finite_ftz(h)[0];

        REPORTER_ASSERT(r, actual == expected || actual == alternate);
    }
}
Ejemplo n.º 5
0
DEF_TEST(HalfToFloat_01, r) {
    for (uint16_t h = 0; h < 0x8000; h++) {
        float f = SkHalfToFloat(h);
        if (f >= 0 && f <= 1) {
            float got = SkHalfToFloat_01(h)[0];
            if (got != f) {
                SkDebugf("0x%04x -> 0x%08x (%g), want 0x%08x (%g)\n",
                        h,
                        u(got), got,
                        u(f), f);
            }
            REPORTER_ASSERT(r, SkHalfToFloat_01(h)[0] == f);
            REPORTER_ASSERT(r, SkFloatToHalf_01(SkHalfToFloat_01(h)) == h);
        }
    }
}
Ejemplo n.º 6
0
DEF_TEST(HalfToFloat_finite, r) {
    for (uint32_t h = 0; h <= 0xffff; h++) {
        float f = SkHalfToFloat(h);
        if (isfinite(f)) {
            float got = SkHalfToFloat_finite(h)[0];
            if (got != f) {
                SkDebugf("0x%04x -> 0x%08x (%g), want 0x%08x (%g)\n",
                        h,
                        u(got), got,
                        u(f), f);
            }
            REPORTER_ASSERT(r, SkHalfToFloat_finite(h)[0] == f);
            uint64_t result;
            SkFloatToHalf_finite(SkHalfToFloat_finite(h)).store(&result);
            REPORTER_ASSERT(r, result == h);
        }
    }
}
Ejemplo n.º 7
0
 static void half_to_float(float dst[], const uint16_t src[], int n) {
     while (n-->0) {
         *dst++ = SkHalfToFloat(*src++);
     }
 }