/*
 * Copyright 2013 Google Inc.
 *
 * Use of this source code is governed by a BSD-style license that can be
 * found in the LICENSE file.
 */

#include "tests/Test.h"

#include "include/core/SkTypes.h"
#include "include/private/SkFixed.h"
#include "src/core/SkBitmapProcState.h"
#include "src/opts/SkBitmapProcState_opts.h"

#include <cstddef>
#include <cstdint>
#include <string>

int highBits(uint32_t rv) {
    return (rv >> 18) & ((1 << 14) - 1);
}

int middleBits(uint32_t rv) {
    return (rv >> 14) & ((1 << 4) - 1);
}

int lowBits(uint32_t rv) {
    return rv & ((1 << 14) - 1);
}

DEF_TEST(MatrixProcs_pack_clamp, r) {
    struct TestCase {
        std::string name;
        SkFixed input;
        unsigned max;
        uint32_t expectedOutput;
    };
    // The input values are somewhat arbitrary, inspired by real-world values
    // with some edge cases added as well.
    TestCase tests[] = {
        // Negative values keep the fractional part out of convenience, but it is effectively
        // ignored later.
        {"-2.100 => {0x00, 0xe, 0x00}", SkFloatToFixed(-2.100f), 63, 0x38000},
        {"-1.900 => {0x00, 0x1, 0x00}", SkFloatToFixed(-1.900f), 63, 0x04000},
        {"-0.500 => {0x00, 0x8, 0x00}", SkFloatToFixed(-0.500f), 63, 0x20000},
        {"0.0000 => {0x00, 0x0, 0x01}", SkFloatToFixed(0.0000f), 63, 0x000001},
        {"0.0416 => {0x00, 0x0, 0x01}", SkFloatToFixed(0.0416f), 63, 0x000001},
        {"1.8583 => {0x01, 0xd, 0x02}", SkFloatToFixed(1.8583f), 63, 0x074002},
        {"3.6749 => {0x03, 0xa, 0x04}", SkFloatToFixed(3.6749f), 63, 0x0e8004},
        {"5.4916 => {0x05, 0x7, 0x06}", SkFloatToFixed(5.4916f), 63, 0x15c006},
        {"7.3083 => {0x07, 0x4, 0x08}", SkFloatToFixed(7.3083f), 63, 0x1d0008},
        {"9.0000 => {0x09, 0x0, 0x0a}", SkFloatToFixed(9.0000f), 63, 0x24000a},
        {"50.000 => {0x32, 0x0, 0x33}", SkFloatToFixed(50.000f), 63, 0xc80033},
        {"50.875 => {0x32, 0xe, 0x33}", SkFloatToFixed(50.875f), 63, 0xcb8033},
        {"62.123 => {0x3e, 0x1, 0x3f}", SkFloatToFixed(62.123f), 63, 0xf8403f},
        {"62.999 => {0x3e, 0xf, 0x3f}", SkFloatToFixed(62.999f), 63, 0xfbc03f},
        {"63.000 => {0x3f, 0x0, 0x3f}", SkFloatToFixed(63.000f), 63, 0xfc003f},
        // Similarly, overflow keeps the fractional part.
        {"64.500 => {0x3f, 0x8, 0x3f}", SkFloatToFixed(64.500f), 63, 0xfe003f},
        {"127.20 => {0x3f, 0x3, 0x3f}", SkFloatToFixed(127.20f), 63, 0xfcc03f},
        // Maximum has changed from 63 to 256
        {"64.510 => {0x40,  0x8, 0x41}",  SkFloatToFixed(64.510f), 256, 0x1020041},
        {"127.21 => {0x7f,  0x3, 0x80}",  SkFloatToFixed(127.21f), 256, 0x1fcc080},
        {"256.77 => {0x100, 0xc, 0x100}", SkFloatToFixed(256.77f), 256, 0x4030100},
        {"10000. => {0x100, 0x0, 0x100}", SkFloatToFixed(10000.f), 256, 0x4000100},
    };

    constexpr size_t NUM_TESTS = sizeof(tests) / sizeof(TestCase);

    for (size_t i = 0; i < NUM_TESTS; i++) {
        TestCase tc = tests[i];
        uint32_t rv = sktests::pack_clamp(tc.input, tc.max);
        uint32_t exp = tc.expectedOutput;

        REPORTER_ASSERT(r, rv == tc.expectedOutput,
                        "%s | %x != %x | {%x, %x, %x} != {%x, %x, %x}\n",
                        tc.name.c_str(), rv, exp,
                        highBits(rv), middleBits(rv), lowBits(rv),
                        highBits(exp), middleBits(exp), lowBits(exp));
    }
}

DEF_TEST(MatrixProcs_pack_clamp_out_of_range, r) {
    // See https://crbug.com/1357122
    struct TestCase {
        std::string name;
        SkFixed input;
        unsigned max;
        uint32_t expectedOutput;
    };

    // None of these should crash or cause UBSAN errors, although if they were used in drawing,
    // they might be incorrect due to packing 16 bits of SkFixed into 14 bits of space.
    static constexpr unsigned MAX_PACKED_VALUE = (1 << 14) - 1;
    TestCase tests[] = {
        {"16000.42=>{0xff, 6, 0xff}", SkFloatToFixed(16000.42f), 255, 0x3fd80ff},
        {"17000.42=>{0xff, 6, 0xff}", SkFloatToFixed(17000.42f), 255, 0x3fd80ff},
        {"18000.42=>{0xff, 6, 0xff}", SkFloatToFixed(18000.42f), 255, 0x3fd80ff},

        {"16000.42=>{0x3e80, 6, 0x3e81}", SkFloatToFixed(16000.42f), MAX_PACKED_VALUE, 0xfa01be81},
        {"16382.00=>{0x3ffe, 0, 0x3fff}", SkFloatToFixed(16382.00f), MAX_PACKED_VALUE, 0xfff83fff},
        {"16382.51=>{0x3ffe, 8, 0x3fff}}", SkFloatToFixed(16382.51f), MAX_PACKED_VALUE, 0xfffa3fff},
        {"17000.42=>{0x3fff, 6, 0x3fff}", SkFloatToFixed(17000.42f), MAX_PACKED_VALUE, 0xfffdbfff},
        {"18000.42=>{0x3fff, 6, 0x3fff}", SkFloatToFixed(18000.42f), MAX_PACKED_VALUE, 0xfffdbfff},
        // Adding 1 to this would overflow and cause an UBSAN issue, if it were not suppressed.
        // We suppress the warning and it wraps around.
        {"32767.90=>{0x3fff, e, 0x0}", SkFloatToFixed(32767.90f), MAX_PACKED_VALUE, 0xffff8000},
    };

    constexpr size_t NUM_TESTS = sizeof(tests) / sizeof(TestCase);

    for (size_t i = 0; i < NUM_TESTS; i++) {
        TestCase tc = tests[i];
        uint32_t rv = sktests::pack_clamp(tc.input, tc.max);
        uint32_t exp = tc.expectedOutput;

        REPORTER_ASSERT(r, rv == tc.expectedOutput,
                        "%s | %x != %x | {%x, %x, %x} != {%x, %x, %x}\n",
                        tc.name.c_str(), rv, exp,
                        highBits(rv), middleBits(rv), lowBits(rv),
                        highBits(exp), middleBits(exp), lowBits(exp));
    }
}

DEF_TEST(MatrixProcs_pack_repeat, r) {
    struct TestCase {
        std::string name;
        SkFixed input;
        unsigned max;
        uint32_t expectedOutput;
        size_t width;
    };
    TestCase tests[] = {
        // negative values wrap back around
        {"-0.300 => {0x2c, 0xc, 0x2d}", SkFloatToFixed(-0.300f), 63, 0xb3002d, 63},
        {"-0.200 => {0x33, 0x3, 0x34}", SkFloatToFixed(-0.200f), 63, 0xccc034, 63},
        {"-0.100 => {0x39, 0x9, 0x3a}", SkFloatToFixed(-0.100f), 63, 0xe6403a, 63},
        // The domain of the function is primarily [0.0, 1.0)
        {"0.0000 => {0x00, 0x0, 0x01}", SkFloatToFixed(0.0000f), 63, 0x000001, 63},
        {"0.1000 => {0x06, 0x6, 0x07}", SkFloatToFixed(0.1000f), 63, 0x198007, 63},
        {"0.1234 => {0x07, 0xe, 0x08}", SkFloatToFixed(0.1234f), 63, 0x1f8008, 63},
        {"0.2000 => {0x0c, 0xc, 0x0d}", SkFloatToFixed(0.2000f), 63, 0x33000d, 63},
        {"0.3000 => {0x13, 0x3, 0x14}", SkFloatToFixed(0.3000f), 63, 0x4cc014, 63},
        {"0.4000 => {0x19, 0x9, 0x1a}", SkFloatToFixed(0.4000f), 63, 0x66401a, 63},
        {"0.5000 => {0x20, 0x0, 0x21}", SkFloatToFixed(0.5000f), 63, 0x800021, 63},
        {"0.5678 => {0x24, 0x5, 0x25}", SkFloatToFixed(0.5678f), 63, 0x914025, 63},
        {"0.6000 => {0x26, 0x6, 0x27}", SkFloatToFixed(0.6000f), 63, 0x998027, 63},
        {"0.7000 => {0x2c, 0xc, 0x2d}", SkFloatToFixed(0.7000f), 63, 0xb3002d, 63},
        {"0.8000 => {0x33, 0x3, 0x34}", SkFloatToFixed(0.8000f), 63, 0xccc034, 63},
        {"0.9000 => {0x39, 0x9, 0x3a}", SkFloatToFixed(0.9000f), 63, 0xe6403a, 63},
        {"0.9500 => {0x3c, 0xc, 0x3d}", SkFloatToFixed(0.9500f), 63, 0xf3003d, 63},
        {"0.9990 => {0x3f, 0xe, 0x00}", SkFloatToFixed(0.9990f), 63, 0xff8000, 63},
        // As we go past 1.0, we wrap around, conceptually similar to modular arithmetic.
        {"1.0000 => {0x00, 0x0, 0x01}", SkFloatToFixed(1.0000f), 63, 0x000001, 63},
        {"1.1000 => {0x06, 0x6, 0x07}", SkFloatToFixed(1.1000f), 63, 0x198007, 63},
        {"1.1234 => {0x07, 0xe, 0x08}", SkFloatToFixed(1.1234f), 63, 0x1f8008, 63},
        {"1.9500 => {0x3c, 0xc, 0x3d}", SkFloatToFixed(1.9500f), 63, 0xf3003d, 63},
        // Maximum has changed from 63 to 256
        {"0.4567 => {0x75, 0x5, 0x76}", SkFloatToFixed(0.4567f), 256, 0x1d54076, 256},
        {"1.0000 => {0x00, 0x0, 0x01}", SkFloatToFixed(1.0000f), 256, 0x0000001, 256},
        {"1.2345 => {0x3c, 0x4, 0x3d}", SkFloatToFixed(1.2345f), 256, 0x0f1003d, 256},
        // width does not have to match the maximum value (e.g. rescaling)
        {"0.1111 [64,128] => {0x07, 0x3, 0x07}", SkFloatToFixed(0.1111f), 64, 0x1cc007, 128},
        {"0.1111 [64,256] => {0x07, 0x3, 0x07}", SkFloatToFixed(0.1111f), 64, 0x1cc007, 256},
        {"0.1111 [64,512] => {0x07, 0x3, 0x07}", SkFloatToFixed(0.1111f), 64, 0x1cc007, 512},
        {"0.1111 [64, 32] => {0x07, 0x3, 0x09}", SkFloatToFixed(0.1111f), 64, 0x1cc009, 32},
        {"0.1111 [64,  8] => {0x07, 0x3, 0x0f}", SkFloatToFixed(0.1111f), 64, 0x1cc00f, 8},
    };

    constexpr size_t NUM_TESTS = sizeof(tests) / sizeof(TestCase);

    for (size_t i = 0; i < NUM_TESTS; i++) {
        TestCase tc = tests[i];
        uint32_t rv = sktests::pack_repeat(tc.input, tc.max, tc.width);
        uint32_t exp = tc.expectedOutput;

        REPORTER_ASSERT(r, rv == tc.expectedOutput,
                        "%s | %x != %x | {%x, %x, %x} != {%x, %x, %x}\n",
                        tc.name.c_str(), rv, exp,
                        highBits(rv), middleBits(rv), lowBits(rv),
                        highBits(exp), middleBits(exp), lowBits(exp));
    }
}

DEF_TEST(MatrixProcs_pack_mirror, r) {
    struct TestCase {
        std::string name;
        SkFixed input;
        unsigned max;
        uint32_t expectedOutput;
        size_t width;
    };
    TestCase tests[] = {
        // negative values are treated similarly to absolute values, except
        // the first integer is bigger than the last integer.
        {"-0.300 => {0x13, 0xc, 0x12}", SkFloatToFixed(-0.300f), 63, 0x4f0012, 63},
        {"-0.200 => {0x0c, 0x3, 0x0b}", SkFloatToFixed(-0.200f), 63, 0x30c00b, 63},
        {"-0.100 => {0x06, 0x9, 0x05}", SkFloatToFixed(-0.100f), 63, 0x1a4005, 63},
        // The domain of the function is primarily [0.0, 1.0)
        {"0.0000 => {0x00, 0x0, 0x01}", SkFloatToFixed(0.0000f), 63, 0x000001, 63},
        {"0.1000 => {0x06, 0x6, 0x07}", SkFloatToFixed(0.1000f), 63, 0x198007, 63},
        {"0.1234 => {0x07, 0xe, 0x08}", SkFloatToFixed(0.1234f), 63, 0x1f8008, 63},
        {"0.2000 => {0x0c, 0xc, 0x0d}", SkFloatToFixed(0.2000f), 63, 0x33000d, 63},
        {"0.3000 => {0x13, 0x3, 0x14}", SkFloatToFixed(0.3000f), 63, 0x4cc014, 63},
        {"0.4000 => {0x19, 0x9, 0x1a}", SkFloatToFixed(0.4000f), 63, 0x66401a, 63},
        {"0.5000 => {0x20, 0x0, 0x21}", SkFloatToFixed(0.5000f), 63, 0x800021, 63},
        {"0.5678 => {0x24, 0x5, 0x25}", SkFloatToFixed(0.5678f), 63, 0x914025, 63},
        {"0.6000 => {0x26, 0x6, 0x27}", SkFloatToFixed(0.6000f), 63, 0x998027, 63},
        {"0.7000 => {0x2c, 0xc, 0x2d}", SkFloatToFixed(0.7000f), 63, 0xb3002d, 63},
        {"0.8000 => {0x33, 0x3, 0x34}", SkFloatToFixed(0.8000f), 63, 0xccc034, 63},
        {"0.9000 => {0x39, 0x9, 0x3a}", SkFloatToFixed(0.9000f), 63, 0xe6403a, 63},
        {"0.9500 => {0x3c, 0xc, 0x3d}", SkFloatToFixed(0.9500f), 63, 0xf3003d, 63},
        {"0.9990 => {0x3f, 0xe, 0x3f}", SkFloatToFixed(0.9990f), 63, 0xff803f, 63},
        // As we go past 1.0, we bounce back, as off a wall or reflecting off a mirror.
        {"1.0000 => {0x3f, 0x0, 0x3e}", SkFloatToFixed(1.0000f), 63, 0xfc003e, 63},
        {"1.1000 => {0x39, 0x6, 0x38}", SkFloatToFixed(1.1000f), 63, 0xe58038, 63},
        {"1.1234 => {0x38, 0xe, 0x37}", SkFloatToFixed(1.1234f), 63, 0xe38037, 63},
        {"1.9500 => {0x03, 0xc, 0x02}", SkFloatToFixed(1.9500f), 63, 0xf0002, 63},
        // Maximum has changed from 63 to 256
        {"0.4567 => {0x75, 0x5, 0x76}", SkFloatToFixed(0.4567f), 256, 0x1d54076, 256},
        {"1.0000 => {0x100,0x0, 0xff}", SkFloatToFixed(1.0000f), 256, 0x40000ff, 256},
        {"1.2345 => {0xc4, 0x4, 0xc3}", SkFloatToFixed(1.2345f), 256, 0x31100c3, 256},
        // width does not have to match the maximum value (e.g. rescaling)
        {"0.1111 [64,128] => {0x07, 0x3, 0x07}", SkFloatToFixed(0.1111f), 64, 0x1cc007, 128},
        {"0.1111 [64,256] => {0x07, 0x3, 0x07}", SkFloatToFixed(0.1111f), 64, 0x1cc007, 256},
        {"0.1111 [64,512] => {0x07, 0x3, 0x07}", SkFloatToFixed(0.1111f), 64, 0x1cc007, 512},
        {"0.1111 [64, 32] => {0x07, 0x3, 0x09}", SkFloatToFixed(0.1111f), 64, 0x1cc009, 32},
        {"0.1111 [64,  8] => {0x07, 0x3, 0x0f}", SkFloatToFixed(0.1111f), 64, 0x1cc00f, 8},
    };

    constexpr size_t NUM_TESTS = sizeof(tests) / sizeof(TestCase);

    for (size_t i = 0; i < NUM_TESTS; i++) {
        TestCase tc = tests[i];
        uint32_t rv = sktests::pack_mirror(tc.input, tc.max, tc.width);
        uint32_t exp = tc.expectedOutput;

        REPORTER_ASSERT(r, rv == tc.expectedOutput,
                        "%s | %x != %x | {%x, %x, %x} != {%x, %x, %x}\n",
                        tc.name.c_str(), rv, exp,
                        highBits(rv), middleBits(rv), lowBits(rv),
                        highBits(exp), middleBits(exp), lowBits(exp));
    }
}

DEF_TEST(MatrixProcs_unpack_int, r) {
    struct TestCase {
        std::string name;
        uint32_t input;
        int expectedLowerBound;
        int expectedLerp;
        int expectedUpperBound;
    };
    // These are selected from earlier tests to make sure the packed values unpack correctly.
    TestCase tests[] = {
        {"0x000000  => {0x00, 0x0, 0x00}",   0x000000,  0x00,  0x0, 0x00},
        {"0x074002  => {0x01, 0xd, 0x02}",   0x074002,  0x01,  0xd, 0x02},
        {"0x15c006  => {0x05, 0x7, 0x06}",   0x15c006,  0x05,  0x7, 0x06},
        {"0x1d0008  => {0x07, 0x4, 0x08}",   0x1d0008,  0x07,  0x4, 0x08},
        {"0x24000a  => {0x09, 0x0, 0x0a}",   0x24000a,  0x09,  0x0, 0x0a},
        {"0xfc003f  => {0x3f, 0x0, 0x3f}",   0xfc003f,  0x3f,  0x0, 0x3f},
        {"0x4000100 => {0x100, 0x0, 0x100}", 0x4000100, 0x100, 0x0, 0x100},
    };

    constexpr size_t NUM_TESTS = sizeof(tests) / sizeof(TestCase);

    for (size_t i = 0; i < NUM_TESTS; i++) {
        TestCase tc = tests[i];
        int lower, upper, lerp;
        sktests::decode_packed_coordinates_and_weight(tc.input, &lower, &upper, &lerp);

        REPORTER_ASSERT(r, lower == tc.expectedLowerBound,
                "%s lower %x != %x", tc.name.c_str(), lower, tc.expectedLowerBound);
        REPORTER_ASSERT(r, lerp == tc.expectedLerp,
                "%s lerp %x != %x", tc.name.c_str(), lerp, tc.expectedLerp);
        REPORTER_ASSERT(r, upper == tc.expectedUpperBound,
                "%s upper %x != %x", tc.name.c_str(), upper, tc.expectedUpperBound);
        // Make sure our helpers work as expected.
        SkASSERT(tc.expectedLowerBound == highBits(tc.input));
        SkASSERT(tc.expectedLerp == middleBits(tc.input));
        SkASSERT(tc.expectedUpperBound == lowBits(tc.input));
    }
}
