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
19namespace llvm {
20namespace 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/// }
42class 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
49public:
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