codepointsToUtf16CodeUnits function
Encode code points as UTF16 code units.
Implementation
List<int> codepointsToUtf16CodeUnits(List<int> codepoints,
{int offset = 0,
int? length,
int replacementCodepoint = _UNICODE_REPLACEMENT_CHARACTER_CODEPOINT}) {
final listRange = codepoints;
var encodedLength = 0;
for (final value in listRange) {
if ((value >= 0 && value < _UNICODE_UTF16_RESERVED_LO) ||
(value > _UNICODE_UTF16_RESERVED_HI && value <= _UNICODE_PLANE_ONE_MAX)) {
encodedLength++;
} else if (value > _UNICODE_PLANE_ONE_MAX &&
value <= _UNICODE_VALID_RANGE_MAX) {
encodedLength += 2;
} else {
encodedLength++;
}
}
final codeUnitsBuffer = List<int>.filled(encodedLength, -1);
var j = 0;
for (final value in listRange) {
if ((value >= 0 && value < _UNICODE_UTF16_RESERVED_LO) ||
(value > _UNICODE_UTF16_RESERVED_HI && value <= _UNICODE_PLANE_ONE_MAX)) {
codeUnitsBuffer[j++] = value;
} else if (value > _UNICODE_PLANE_ONE_MAX &&
value <= _UNICODE_VALID_RANGE_MAX) {
var base = value - _UNICODE_UTF16_OFFSET;
codeUnitsBuffer[j++] = _UNICODE_UTF16_SURROGATE_UNIT_0_BASE +
((base & _UNICODE_UTF16_HI_MASK) >> 10);
codeUnitsBuffer[j++] =
_UNICODE_UTF16_SURROGATE_UNIT_1_BASE + (base & _UNICODE_UTF16_LO_MASK);
} else {
codeUnitsBuffer[j++] = replacementCodepoint;
}
}
return codeUnitsBuffer;
}