/*
 * Copyright 2022 Rive
 */

#include "utils/rive_utf.hpp"
#include "rive/core/type_conversions.hpp"

using namespace rive;

int UTF::CountUTF8Length(const uint8_t utf8[])
{
    unsigned lead = *utf8;
    assert(lead != 0xFF);
    assert((lead & 0xC0) != 0x80); // 10xxxxxx is not a legal lead byte
    if ((lead & 0x80) == 0)
    {
        return 1;
    }
    int n = 1;
    lead <<= 1;
    while (lead & 0x80)
    {
        n += 1;
        lead <<= 1;
    }
    assert(n >= 1 && n <= 4);
    return n;
}

// Return the unichar pointed to by the utf8 pointer, and then
// update the pointer to point to the next sequence.
Unichar UTF::NextUTF8(const uint8_t** utf8Ptr)
{
    const uint8_t* text = *utf8Ptr;

    uint32_t c = 0;
    int n = CountUTF8Length(text);
    assert(n >= 1 && n <= 4);

    unsigned first = *text++;
    if (n == 1)
    {
        c = first;
    }
    else
    {
        c = first & ((unsigned)0xFF >> n);
        --n;
        do
        {
            c = (c << 6) | (*text++ & 0x3F);
        } while (--n);
    }
    *utf8Ptr = text; // update the pointer
    return c;
}

int UTF::ToUTF16(Unichar uni, uint16_t utf16[])
{
    if (uni > 0xFFFF)
    {
        utf16[0] = castTo<uint16_t>((0xD800 - 64) | (uni >> 10));
        utf16[1] = castTo<uint16_t>(0xDC00 | (uni & 0x3FF));
        return 2;
    }
    utf16[0] = castTo<uint16_t>(uni);
    return 1;
}
