7e2ef779e3479f25f76e893268f0e838c312884e
[idea/community.git] / platform / analysis-impl / src / com / intellij / codeHighlighting / ColorGenerator.java
1 /*
2  * Copyright 2000-2016 JetBrains s.r.o.
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  * http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  */
16 package com.intellij.codeHighlighting;
17
18 import com.intellij.ui.JBColor;
19 import com.intellij.util.MathUtil;
20 import org.jetbrains.annotations.NotNull;
21
22 import java.awt.*;
23 import java.util.ArrayList;
24 import java.util.Collections;
25 import java.util.List;
26
27 public class ColorGenerator {
28   @NotNull
29   public static List<Color> generateLinearColorSequence(@NotNull List<? extends Color> anchorColors, int colorsBetweenAnchors) {
30     assert colorsBetweenAnchors >= 0;
31     if (anchorColors.isEmpty()) return Collections.singletonList(JBColor.GRAY);
32     if (anchorColors.size() == 1) return Collections.singletonList(anchorColors.get(0));
33
34     int segmentCount = anchorColors.size() - 1;
35     List<Color> result = new ArrayList<>(anchorColors.size() + segmentCount * colorsBetweenAnchors);
36     result.add(anchorColors.get(0));
37
38     for (int i = 0; i < segmentCount; i++) {
39       Color color1 = anchorColors.get(i);
40       Color color2 = anchorColors.get(i + 1);
41
42       List<Color> linearColors = generateLinearColorSequence(color1, color2, colorsBetweenAnchors);
43
44       // skip first element from sequence to avoid duplication from connected segments
45       result.addAll(linearColors.subList(1, linearColors.size()));
46     }
47     return result;
48   }
49
50   @NotNull
51   static List<Color> generateLinearColorSequence(@NotNull Color color1, @NotNull Color color2, int colorsBetweenAnchors) {
52     assert colorsBetweenAnchors >= 0;
53
54     List<Color> result = new ArrayList<>(colorsBetweenAnchors + 2);
55     result.add(color1);
56
57     for (int i = 1; i <= colorsBetweenAnchors; i++) {
58       float ratio = (float)i / (colorsBetweenAnchors + 1);
59
60       //noinspection UseJBColor
61       result.add(new Color(
62         ratio(color1.getRed(), color2.getRed(), ratio),
63         ratio(color1.getGreen(), color2.getGreen(), ratio),
64         ratio(color1.getBlue(), color2.getBlue(), ratio)
65       ));
66     }
67
68     result.add(color2);
69     return result;
70   }
71
72   private static int ratio(int val1, int val2, float ratio) {
73     int value = (int)(val1 + (val2 - val1) * ratio);
74     return MathUtil.clamp(value, 0, 255);
75   }
76 }