// SPDX-FileCopyrightText: Copyright (c) Ken Martin, Will Schroeder, Bill Lorensen
// SPDX-License-Identifier: BSD-3-Clause
/**
* @class vtkColorSeries
* @brief stores a list of colors.
*
*
* The vtkColorSeries stores palettes of colors. There are several default
* palettes (or schemes) available and functions to control several aspects
* of what colors are returned. In essence a color scheme is set and then
* the number of colors and individual color values may be requested.
*
* For a web page showcasing the default palettes, see:
* VTKColorSeriesPatches;
* ColorSeriesPatches
* was used to generate this table.
*
* It is also possible to add schemes beyond the default palettes.
* Whenever \a SetColorScheme is called with a string for which no palette
* already exists, a new, empty palette is created.
* You may then use \a SetNumberOfColors and \a SetColor to populate the
* palette.
* You may not extend default palettes by calling functions that alter
* a scheme; if called while a predefined palette is in use, they
* will create a new non-default scheme and populate it with the current
* palette before continuing.
*
* The "Brewer" palettes are courtesy of
* Cynthia A. Brewer (Dept. of Geography, Pennsylvania State University)
* and under the Apache License. See the source code for details.
*/
#ifndef vtkColorSeries_h
#define vtkColorSeries_h
#include "vtkColor.h" // Needed for vtkColor[34]ub
#include "vtkCommonColorModule.h" // For export macro
#include "vtkObject.h"
#include "vtkStdString.h" // Needed for arguments
#include "vtkWrappingHints.h" // For VTK_MARSHALAUTO
VTK_ABI_NAMESPACE_BEGIN
class vtkLookupTable;
class VTKCOMMONCOLOR_EXPORT VTK_MARSHALAUTO vtkColorSeries : public vtkObject
{
public:
vtkTypeMacro(vtkColorSeries, vtkObject);
void PrintSelf(ostream& os, vtkIndent indent) override;
/**
* Create a new vtkColorSeries with the SPECTRUM color scheme.
*/
static vtkColorSeries* New();
/**
* Enum of the available color schemes
*/
enum ColorSchemes
{
/// 7 different hues.
SPECTRUM = 0,
/// 6 warm colors (red to yellow).
WARM,
/// 7 cool colors (green to purple).
COOL,
/// 7 different blues.
BLUES,
/// 7 colors from blue to magenta.
WILD_FLOWER,
/// 6 colors from green to orange.
CITRUS,
/// purple-grey-orange diverging ColorBrewer scheme (11 colors)
BREWER_DIVERGING_PURPLE_ORANGE_11,
/// purple-grey-orange diverging ColorBrewer scheme (10 colors)
BREWER_DIVERGING_PURPLE_ORANGE_10,
/// purple-grey-orange diverging ColorBrewer scheme (9 colors)
BREWER_DIVERGING_PURPLE_ORANGE_9,
/// purple-grey-orange diverging ColorBrewer scheme (8 colors)
BREWER_DIVERGING_PURPLE_ORANGE_8,
/// purple-grey-orange diverging ColorBrewer scheme (7 colors)
BREWER_DIVERGING_PURPLE_ORANGE_7,
/// purple-grey-orange diverging ColorBrewer scheme (6 colors)
BREWER_DIVERGING_PURPLE_ORANGE_6,
/// purple-grey-orange diverging ColorBrewer scheme (5 colors)
BREWER_DIVERGING_PURPLE_ORANGE_5,
/// purple-grey-orange diverging ColorBrewer scheme (4 colors)
BREWER_DIVERGING_PURPLE_ORANGE_4,
/// purple-grey-orange diverging ColorBrewer scheme (3 colors)
BREWER_DIVERGING_PURPLE_ORANGE_3,
/// diverging spectral ColorBrewer scheme (11 colors)
BREWER_DIVERGING_SPECTRAL_11,
/// diverging spectral ColorBrewer scheme (10 colors)
BREWER_DIVERGING_SPECTRAL_10,
/// diverging spectral ColorBrewer scheme (9 colors)
BREWER_DIVERGING_SPECTRAL_9,
/// diverging spectral ColorBrewer scheme (8 colors)
BREWER_DIVERGING_SPECTRAL_8,
/// diverging spectral ColorBrewer scheme (7 colors)
BREWER_DIVERGING_SPECTRAL_7,
/// diverging spectral ColorBrewer scheme (6 colors)
BREWER_DIVERGING_SPECTRAL_6,
/// diverging spectral ColorBrewer scheme (5 colors)
BREWER_DIVERGING_SPECTRAL_5,
/// diverging spectral ColorBrewer scheme (4 colors)
BREWER_DIVERGING_SPECTRAL_4,
/// diverging spectral ColorBrewer scheme (3 colors)
BREWER_DIVERGING_SPECTRAL_3,
/// brown-blue-green diverging ColorBrewer scheme (11 colors)
BREWER_DIVERGING_BROWN_BLUE_GREEN_11,
/// brown-blue-green diverging ColorBrewer scheme (10 colors)
BREWER_DIVERGING_BROWN_BLUE_GREEN_10,
/// brown-blue-green diverging ColorBrewer scheme (9 colors)
BREWER_DIVERGING_BROWN_BLUE_GREEN_9,
/// brown-blue-green diverging ColorBrewer scheme (8 colors)
BREWER_DIVERGING_BROWN_BLUE_GREEN_8,
/// brown-blue-green diverging ColorBrewer scheme (7 colors)
BREWER_DIVERGING_BROWN_BLUE_GREEN_7,
/// brown-blue-green diverging ColorBrewer scheme (6 colors)
BREWER_DIVERGING_BROWN_BLUE_GREEN_6,
/// brown-blue-green diverging ColorBrewer scheme (5 colors)
BREWER_DIVERGING_BROWN_BLUE_GREEN_5,
/// brown-blue-green diverging ColorBrewer scheme (4 colors)
BREWER_DIVERGING_BROWN_BLUE_GREEN_4,
/// brown-blue-green diverging ColorBrewer scheme (3 colors)
BREWER_DIVERGING_BROWN_BLUE_GREEN_3,
/// blue to green sequential ColorBrewer scheme (9 colors)
BREWER_SEQUENTIAL_BLUE_GREEN_9,
/// blue to green sequential ColorBrewer scheme (8 colors)
BREWER_SEQUENTIAL_BLUE_GREEN_8,
/// blue to green sequential ColorBrewer scheme (7 colors)
BREWER_SEQUENTIAL_BLUE_GREEN_7,
/// blue to green sequential ColorBrewer scheme (6 colors)
BREWER_SEQUENTIAL_BLUE_GREEN_6,
/// blue to green sequential ColorBrewer scheme (5 colors)
BREWER_SEQUENTIAL_BLUE_GREEN_5,
/// blue to green sequential ColorBrewer scheme (4 colors)
BREWER_SEQUENTIAL_BLUE_GREEN_4,
/// blue to green sequential ColorBrewer scheme (3 colors)
BREWER_SEQUENTIAL_BLUE_GREEN_3,
/// yellow-orange-brown sequential ColorBrewer scheme (9 colors)
BREWER_SEQUENTIAL_YELLOW_ORANGE_BROWN_9,
/// yellow-orange-brown sequential ColorBrewer scheme (8 colors)
BREWER_SEQUENTIAL_YELLOW_ORANGE_BROWN_8,
/// yellow-orange-brown sequential ColorBrewer scheme (7 colors)
BREWER_SEQUENTIAL_YELLOW_ORANGE_BROWN_7,
/// yellow-orange-brown sequential ColorBrewer scheme (6 colors)
BREWER_SEQUENTIAL_YELLOW_ORANGE_BROWN_6,
/// yellow-orange-brown sequential ColorBrewer scheme (5 colors)
BREWER_SEQUENTIAL_YELLOW_ORANGE_BROWN_5,
/// yellow-orange-brown sequential ColorBrewer scheme (4 colors)
BREWER_SEQUENTIAL_YELLOW_ORANGE_BROWN_4,
/// yellow-orange-brown sequential ColorBrewer scheme (3 colors)
BREWER_SEQUENTIAL_YELLOW_ORANGE_BROWN_3,
/// blue to purple sequential ColorBrewer scheme (9 colors)
BREWER_SEQUENTIAL_BLUE_PURPLE_9,
/// blue to purple sequential ColorBrewer scheme (8 colors)
BREWER_SEQUENTIAL_BLUE_PURPLE_8,
/// blue to purple sequential ColorBrewer scheme (7 colors)
BREWER_SEQUENTIAL_BLUE_PURPLE_7,
/// blue to purple sequential ColorBrewer scheme (6 colors)
BREWER_SEQUENTIAL_BLUE_PURPLE_6,
/// blue to purple sequential ColorBrewer scheme (5 colors)
BREWER_SEQUENTIAL_BLUE_PURPLE_5,
/// blue to purple sequential ColorBrewer scheme (4 colors)
BREWER_SEQUENTIAL_BLUE_PURPLE_4,
/// blue to purple sequential ColorBrewer scheme (3 colors)
BREWER_SEQUENTIAL_BLUE_PURPLE_3,
/// qualitative ColorBrewer scheme good for accenting
BREWER_QUALITATIVE_ACCENT,
/// a dark set of qualitative colors from ColorBrewer
BREWER_QUALITATIVE_DARK2,
/// a qualitative ColorBrewer scheme useful for color set members
BREWER_QUALITATIVE_SET2,
/// a qualitative ColorBrewer scheme composed of pastel colors
BREWER_QUALITATIVE_PASTEL2,
/// a qualitative ColorBrewer scheme composed of pastel colors
BREWER_QUALITATIVE_PASTEL1,
/// a qualitative ColorBrewer scheme useful for color set members
BREWER_QUALITATIVE_SET1,
/// a qualitative ColorBrewer scheme with pairs of matching colors
BREWER_QUALITATIVE_PAIRED,
/// a qualitative ColorBrewer scheme useful for color set members
BREWER_QUALITATIVE_SET3,
/// User specified color scheme.
CUSTOM
};
/**
* An enum defining how lookup tables should be used: either as a
* list of discrete colors to choose from (categorical), or as an
* ordered list of color set - points to interpolate among (ordinal).
*/
enum LUTMode
{
/// indexed lookup is off
ORDINAL = 0,
/// indexed lookup is on
CATEGORICAL
};
///@{
/**
* Set the color scheme that should be used.
* The variant of this function that takes an integer should pass a
* number from those in the enum, or a value returned by the string variant.
* The variant that accepts a string returns the integer index
* of the resulting palette (whether it already existed or is newly-created).
*/
virtual void SetColorScheme(int scheme);
virtual int SetColorSchemeByName(const vtkStdString& schemeName);
///@}
/**
* Return the number of schemes currently defined.
*/
int GetNumberOfColorSchemes() const;
/**
* Get the color scheme that is currently being used.
*/
virtual vtkStdString GetColorSchemeName() const;
/**
* Set the name of the current color scheme
*/
virtual void SetColorSchemeName(const vtkStdString& name);
/**
* Return the ID of the color scheme currently in use.
*/
virtual int GetColorScheme() const;
/**
* Get the number of colors available in the current color scheme.
*/
virtual int GetNumberOfColors() const;
/**
* Set the number of colors to be stored in a non-default color scheme.
* Calling this function on a predefined color scheme will cause the scheme
* to be duplicated to a new custom scheme.
*/
virtual void SetNumberOfColors(int numColors);
/**
* Get the color at the specified index. If the index is out of range then
* black will be returned.
*/
vtkColor3ub GetColor(int index) const;
/**
* Get the color at the specified index. If the index is out of range then
* the call wraps around, i.e. uses the mod operator.
*/
vtkColor3ub GetColorRepeating(int index) const;
/**
* Set the color at the specified index. Does nothing if the index is out of
* range.
*/
virtual void SetColor(int index, const vtkColor3ub& color);
/**
* Adds the color to the end of the list.
*/
virtual void AddColor(const vtkColor3ub& color);
/**
* Inserts the color at the specified index in the list.
*/
virtual void InsertColor(int index, const vtkColor3ub& color);
/**
* Removes the color at the specified index in the list.
*/
virtual void RemoveColor(int index);
/**
* Clears the list of colors.
*/
virtual void ClearColors();
/**
* Make a deep copy of the supplied object.
*/
virtual void DeepCopy(vtkColorSeries* chartColors);
/**
* Populate a lookup table with all the colors in the current scheme.
* The default behavior is to return categorical data. Set lutIndexing
* to ORDINAL to return ordinal data. Any other value for lutIndexing
* is treated as CATEGORICAL.
*/
void BuildLookupTable(vtkLookupTable* lkup, int lutIndexing = CATEGORICAL);
/**
* Create a new lookup table with all the colors in the current scheme.
* The caller is responsible for deleting the table after use.
* The default behavior is to return categorical data. Set lutIndexing
* to ORDINAL to return ordinal data. Any other value for lutIndexing
* is treated as CATEGORICAL.
*/
VTK_NEWINSTANCE
vtkLookupTable* CreateLookupTable(int lutIndexing = CATEGORICAL);
protected:
vtkColorSeries();
~vtkColorSeries() override;
/**
* If the current scheme is a predefined (read-only) scheme,
* copy the current colors to a new scheme and modify the new scheme instead.
*/
virtual void CopyOnWrite();
///@{
/**
* Private data pointer of the class, stores the color list.
*/
class Private;
Private* Storage;
///@}
/**
* The color scheme being used.
*/
int ColorScheme;
/// The color scheme being used.
vtkStdString ColorSchemeName;
private:
vtkColorSeries(const vtkColorSeries&) = delete;
void operator=(const vtkColorSeries&) = delete;
};
VTK_ABI_NAMESPACE_END
#endif // vtkColorSeries_h