1 | //===-- xray-graph.h - XRay Function Call Graph Renderer --------*- C++ -*-===// |
2 | // |
3 | // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. |
4 | // See https://llvm.org/LICENSE.txt for license information. |
5 | // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception |
6 | // |
7 | //===----------------------------------------------------------------------===// |
8 | // |
9 | // A class to get a color from a specified gradient. |
10 | // |
11 | //===----------------------------------------------------------------------===// |
12 | |
13 | #ifndef XRAY_COLOR_HELPER_H |
14 | #define XRAY_COLOR_HELPER_H |
15 | |
16 | #include "llvm/ADT/ArrayRef.h" |
17 | #include <tuple> |
18 | |
19 | namespace llvm { |
20 | namespace xray { |
21 | |
22 | /// The color helper class it a healper class which allows you to easily get a |
23 | /// color in a gradient. This is used to color-code edges in XRay-Graph tools. |
24 | /// |
25 | /// There are two types of color schemes in this class: |
26 | /// - Sequential schemes, which are used to represent information from some |
27 | /// minimum to some maximum. These take an input in the range [0,1] |
28 | /// - Diverging schemes, which are used to represent information representing |
29 | /// differenes, or a range that goes from negative to positive. These take |
30 | /// an input in the range [-1,1]. |
31 | /// Usage; |
32 | /// ColorHelper S(ColorHelper::SequentialScheme::OrRd); //Chose a color scheme. |
33 | /// for (double p = 0.0; p <= 1; p += 0.1){ |
34 | /// cout() << S.getColor(p) << " \n"; // Sample the gradient at 0.1 intervals |
35 | /// } |
36 | /// |
37 | /// ColorHelper D(ColorHelper::DivergingScheme::Spectral); // Choose a color |
38 | /// // scheme. |
39 | /// for (double p= -1; p <= 1 ; p += 0.1){ |
40 | /// cout() << D.getColor(p) << " \n"; // sample the gradient at 0.1 intervals |
41 | /// } |
42 | class ColorHelper { |
43 | double MinIn; |
44 | double MaxIn; |
45 | |
46 | ArrayRef<std::tuple<uint8_t, uint8_t, uint8_t>> ColorMap; |
47 | ArrayRef<std::tuple<uint8_t, uint8_t, uint8_t>> BoundMap; |
48 | |
49 | public: |
50 | /// Enum of the availible Sequential Color Schemes |
51 | enum class SequentialScheme { |
52 | // Schemes based on the ColorBrewer Color schemes of the same name from |
53 | // http://www.colorbrewer.org/ by Cynthis A Brewer Penn State University. |
54 | Greys, |
55 | OrRd, |
56 | PuBu |
57 | }; |
58 | |
59 | ColorHelper(SequentialScheme S); |
60 | |
61 | /// Enum of the availible Diverging Color Schemes |
62 | enum class DivergingScheme { |
63 | // Schemes based on the ColorBrewer Color schemes of the same name from |
64 | // http://www.colorbrewer.org/ by Cynthis A Brewer Penn State University. |
65 | PiYG |
66 | }; |
67 | |
68 | ColorHelper(DivergingScheme S); |
69 | |
70 | // Sample the gradient at the input point. |
71 | std::tuple<uint8_t, uint8_t, uint8_t> getColorTuple(double Point) const; |
72 | |
73 | std::string getColorString(double Point) const; |
74 | |
75 | // Get the Default color, at the moment allways black. |
76 | std::tuple<uint8_t, uint8_t, uint8_t> getDefaultColorTuple() const { |
77 | return std::make_tuple(args: 0, args: 0, args: 0); |
78 | } |
79 | |
80 | std::string getDefaultColorString() const { return "black" ; } |
81 | |
82 | // Convert a tuple to a string |
83 | static std::string getColorString(std::tuple<uint8_t, uint8_t, uint8_t> t); |
84 | }; |
85 | } // namespace xray |
86 | } // namespace llvm |
87 | #endif |
88 | |