cleanup (inspection "Java | Class structure | Utility class is not 'final'")
[idea/community.git] / platform / analysis-impl / src / com / intellij / codeHighlighting / ColorGenerator.java
1 // Copyright 2000-2020 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license that can be found in the LICENSE file.
2 package com.intellij.codeHighlighting;
3
4 import com.intellij.ui.JBColor;
5 import com.intellij.util.MathUtil;
6 import org.jetbrains.annotations.NotNull;
7
8 import java.awt.*;
9 import java.util.ArrayList;
10 import java.util.Collections;
11 import java.util.List;
12
13 public final class ColorGenerator {
14   @NotNull
15   public static List<Color> generateLinearColorSequence(@NotNull List<? extends Color> anchorColors, int colorsBetweenAnchors) {
16     assert colorsBetweenAnchors >= 0;
17     if (anchorColors.isEmpty()) return Collections.singletonList(JBColor.GRAY);
18     if (anchorColors.size() == 1) return Collections.singletonList(anchorColors.get(0));
19
20     int segmentCount = anchorColors.size() - 1;
21     List<Color> result = new ArrayList<>(anchorColors.size() + segmentCount * colorsBetweenAnchors);
22     result.add(anchorColors.get(0));
23
24     for (int i = 0; i < segmentCount; i++) {
25       Color color1 = anchorColors.get(i);
26       Color color2 = anchorColors.get(i + 1);
27
28       List<Color> linearColors = generateLinearColorSequence(color1, color2, colorsBetweenAnchors);
29
30       // skip first element from sequence to avoid duplication from connected segments
31       result.addAll(linearColors.subList(1, linearColors.size()));
32     }
33     return result;
34   }
35
36   @NotNull
37   static List<Color> generateLinearColorSequence(@NotNull Color color1, @NotNull Color color2, int colorsBetweenAnchors) {
38     assert colorsBetweenAnchors >= 0;
39
40     List<Color> result = new ArrayList<>(colorsBetweenAnchors + 2);
41     result.add(color1);
42
43     for (int i = 1; i <= colorsBetweenAnchors; i++) {
44       float ratio = (float)i / (colorsBetweenAnchors + 1);
45
46       //noinspection UseJBColor
47       result.add(new Color(
48         ratio(color1.getRed(), color2.getRed(), ratio),
49         ratio(color1.getGreen(), color2.getGreen(), ratio),
50         ratio(color1.getBlue(), color2.getBlue(), ratio)
51       ));
52     }
53
54     result.add(color2);
55     return result;
56   }
57
58   private static int ratio(int val1, int val2, float ratio) {
59     int value = (int)(val1 + (val2 - val1) * ratio);
60     return MathUtil.clamp(value, 0, 255);
61   }
62 }