encodeUniversalBlock function

Uint8List encodeUniversalBlock(
  1. List<(int, int, int, int)> pixels
)

Encodes one 4×4 block (sixteen (r, g, b, a) tuples, row-major).

Implementation

Uint8List encodeUniversalBlock(List<(int, int, int, int)> pixels) {
  final fit = blockEndpoints(pixels);
  final e0 = _round(fit.high);
  final e1 = _round(fit.low);
  final alpha = blockAlphaRange(pixels);

  final block = Uint8List(kUniversalBlockBytes);
  block[0] = e0.$1;
  block[1] = e0.$2;
  block[2] = e0.$3;
  block[3] = e1.$1;
  block[4] = e1.$2;
  block[5] = e1.$3;
  block[_kAlphaHigh] = alpha.high;
  block[_kAlphaLow] = alpha.low;

  for (var i = 0; i < 16; i++) {
    final (r, g, b, a) = pixels[i];
    _putWeight(block, _kColorWeights, i, _nearestColorWeight(r, g, b, e0, e1));
    _putWeight(
      block,
      _kAlphaWeights,
      i,
      _nearestAlphaWeight(a, alpha.high, alpha.low),
    );
  }
  return block;
}