generatePalette method
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;
}