in packages/utilities/fast-colors/src/color-scale.ts [143:194]
public findNextColor(
position: number,
contrast: number,
searchDown: boolean = false,
interpolationMode: ColorInterpolationSpace = ColorInterpolationSpace.RGB,
contrastErrorMargin: number = 0.005,
maxSearchIterations: number = 32
): number {
if (isNaN(position) || position <= 0) {
position = 0;
} else if (position >= 1) {
position = 1;
}
const startingColor: ColorRGBA64 = this.getColor(position, interpolationMode);
const finalPosition: number = searchDown ? 0 : 1;
const finalColor: ColorRGBA64 = this.getColor(finalPosition, interpolationMode);
const finalContrast: number = contrastRatio(startingColor, finalColor);
if (finalContrast <= contrast) {
return finalPosition;
}
let testRangeMin: number = searchDown ? 0 : position;
let testRangeMax: number = searchDown ? position : 0;
let mid: number = finalPosition;
let iterations: number = 0;
while (iterations <= maxSearchIterations) {
mid = Math.abs(testRangeMax - testRangeMin) / 2 + testRangeMin;
const midColor: ColorRGBA64 = this.getColor(mid, interpolationMode);
const midContrast: number = contrastRatio(startingColor, midColor);
if (Math.abs(midContrast - contrast) <= contrastErrorMargin) {
return mid;
} else if (midContrast > contrast) {
if (searchDown) {
testRangeMin = mid;
} else {
testRangeMax = mid;
}
} else {
if (searchDown) {
testRangeMax = mid;
} else {
testRangeMin = mid;
}
}
iterations++;
}
return mid;
}