generatePalette method

List<HTMLColor> generatePalette(
  1. int size
)

Generates a new palette with specific color size.

Implementation

List<HTMLColor> generatePalette(int size) {
  if (size <= _basicColors.length) {
    var palette = <HTMLColor>[];
    while (palette.length < size) {
      palette.add(_basicColors[palette.length]);
    }
    return palette;
  }

  var blocks = LinkedHashMap<HTMLColor, List<HTMLColor>>.fromEntries(
      _basicColors.map((e) => MapEntry(e, <HTMLColor>[])));

  var colorsSize = blocks.length;

  var colorsPerBlock = Math.max((_basicColors.length / size) - 1, 1) + 1;

  while (colorsSize < size) {
    var colorsSizeMark = colorsSize;

    for (var entry in blocks.entries) {
      var keyColor = entry.key;

      var changeDarkAmount = keyColor.getDarkerSpace() ~/ colorsPerBlock;
      var changeBrightAmount = keyColor.getBrighterSpace() ~/ colorsPerBlock;

      var blockColors = entry.value;

      var init = blockColors.isEmpty ? keyColor : blockColors[0];
      var end = blockColors.isEmpty
          ? keyColor
          : blockColors[blockColors.length - 1];

      var c1 = changeDarkAmount > 10 ? init.darker(changeDarkAmount) : null;
      var c2 =
          changeBrightAmount > 10 ? end.brighter(changeBrightAmount) : null;

      if (c1 != null) {
        blockColors.insert(0, c1);
        colorsSize++;
        if (colorsSize == size) break;
      }
      if (c2 != null) {
        blockColors.add(c2);
        colorsSize++;
        if (colorsSize == size) break;
      }
    }

    if (colorsSize == colorsSizeMark) break;
  }

  var blocksColors = blocks
      .map((key, value) =>
          MapEntry(key, value..insert(value.length ~/ 2, key)))
      .values;

  var palette = blocksColors.expand((e) => e).toList();
  palette.sort();
  return palette;
}