Geant4 11.1.1
Toolkit for the simulation of the passage of particles through matter
All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Pages
G4Colour.cc
Go to the documentation of this file.
1//
2// ********************************************************************
3// * License and Disclaimer *
4// * *
5// * The Geant4 software is copyright of the Copyright Holders of *
6// * the Geant4 Collaboration. It is provided under the terms and *
7// * conditions of the Geant4 Software License, included in the file *
8// * LICENSE and available at http://cern.ch/geant4/license . These *
9// * include a list of copyright holders. *
10// * *
11// * Neither the authors of this software system, nor their employing *
12// * institutes,nor the agencies providing financial support for this *
13// * work make any representation or warranty, express or implied, *
14// * regarding this software system or assume any liability for its *
15// * use. Please see the license in the file LICENSE and URL above *
16// * for the full disclaimer and the limitation of liability. *
17// * *
18// * This code implementation is the result of the scientific and *
19// * technical work of the GEANT4 collaboration. *
20// * By using, copying, modifying or distributing the software (or *
21// * any work based on the software) you agree to acknowledge its *
22// * use in resulting scientific publications, and indicate your *
23// * acceptance of all terms of the Geant4 Software license. *
24// ********************************************************************
25//
26//
27//
28//
29// John Allison 20th October 1996
30
31#include "G4Colour.hh"
32
33#include "G4Threading.hh"
34
36red (r), green (gr), blue (b), alpha (a)
37{
38 if( red > 1.0 ){red = 1.0;} if( red < 0.0 ){red = 0.0;}
39 if( green > 1.0 ){green = 1.0;} if( green < 0.0 ){green = 0.0;}
40 if( blue > 1.0 ){blue = 1.0;} if( blue < 0.0 ){blue = 0.0;}
41 if( alpha > 1.0 ){alpha = 1.0;} if( alpha < 0.0 ){alpha = 0.0;}
42}
43
45red (v.x()), green (v.y()), blue (v.z()), alpha (1.)
46{
47 if( red > 1.0 ){red = 1.0;} if( red < 0.0 ){red = 0.0;}
48 if( green > 1.0 ){green = 1.0;} if( green < 0.0 ){green = 0.0;}
49 if( blue > 1.0 ){blue = 1.0;} if( blue < 0.0 ){blue = 0.0;}
50}
51
53{
54 red = r;
55 if( red > 1.0 ){red = 1.0;} if( red < 0.0 ){red = 0.0;}
56}
57
59{
60 green = gr;
61 if( green > 1.0 ){green = 1.0;} if( green < 0.0 ){green = 0.0;}
62}
63
65{
66 blue = b;
67 if( blue > 1.0 ){blue = 1.0;} if( blue < 0.0 ){blue = 0.0;}
68}
69
71{
72 alpha = a;
73 if( alpha > 1.0 ){alpha = 1.0;} if( alpha < 0.0 ){alpha = 0.0;}
74}
75
76G4Colour::operator G4ThreeVector() {
77 return G4ThreeVector(red,green,blue);
78}
79
80std::ostream& operator << (std::ostream& os, const G4Colour& c) {
81 os << '(' << c.red << ',' << c.green << ',' << c.blue
82 << ',' << c.alpha << ')';
83 const std::map<G4String, G4Colour>& colourMap = G4Colour::GetMap();
84 // Reverse iterator to pick up English spelling of grey!! :)
85 std::map<G4String, G4Colour>::const_reverse_iterator ri;
86 for (ri = colourMap.rbegin(); ri != colourMap.rend(); ++ri) {
87 if (c == ri->second) {
88 os << " (" << ri->first << ')';
89 break;
90 }
91 }
92
93 return os;
94}
95
97 return (red != c.red) ||
98 (green != c.green) ||
99 (blue != c.blue) ||
100 (alpha != c.alpha);
101}
102
103std::map<G4String, G4Colour> G4Colour::fColourMap;
104G4bool G4Colour::fInitColourMap = false;
105
106void G4Colour::AddToMap(const G4String& key, const G4Colour& colour)
107{
108 // Allow only master thread to populate the map
110 static G4bool first = true;
111 if (first) {
112 first = false;
114 ("G4Colour::AddToMap(const G4String& key, const G4Colour& colour)",
115 "greps0002", JustWarning,
116 "Attempt to add to colour map from non-master thread.");
117 }
118 return;
119 }
120
121 // Convert to lower case since colour map is case insensitive
123
124 if (fColourMap.find(myKey) == fColourMap.end()) fColourMap[myKey] = colour;
125 else {
127 ed << "G4Colour with key " << myKey << " already exists." << G4endl;
129 ("G4Colour::AddToMap(const G4String& key, const G4Colour& colour)",
130 "greps0001", JustWarning, ed,
131 "Colour key exists");
132 }
133}
134
136{
137 if (fInitColourMap) return;
138
139 fInitColourMap = true;
140
141 // Standard colours
142 AddToMap("white", G4Colour::White());
143 AddToMap("grey", G4Colour::Grey());
144 AddToMap("gray", G4Colour::Gray());
145 AddToMap("black", G4Colour::Black());
146 AddToMap("brown", G4Colour::Brown());
147 AddToMap("red", G4Colour::Red());
148 AddToMap("green", G4Colour::Green());
149 AddToMap("blue", G4Colour::Blue());
150 AddToMap("cyan", G4Colour::Cyan());
151 AddToMap("magenta", G4Colour::Magenta());
152 AddToMap("yellow", G4Colour::Yellow());
153}
154
156{
157 // Add standard colours to map
158 InitialiseColourMap(); // Initialises if not already initialised
159
161
162 // NOLINTNEXTLINE(modernize-use-auto): Explicitly want a const_iterator
163 std::map<G4String, G4Colour>::const_iterator iter = fColourMap.find(myKey);
164
165 // Don't modify "result" if colour was not found in map
166 if (iter == fColourMap.cend()) return false;
167
168 result = iter->second;
169
170 return true;
171}
172
173const std::map<G4String, G4Colour>& G4Colour::GetMap()
174{
175 // Add standard colours to map
176 InitialiseColourMap(); // Initialises if not already initialised
177
178 return fColourMap;
179}
180
182{
183 if (red < rhs.red) return true;
184 if (red == rhs.red) {
185 if (green < rhs.green) return true;
186 if (green == rhs.green) {
187 if (blue < rhs.blue) return true;
188 if (blue == rhs.blue) {
189 if (alpha < rhs.alpha) return true;
190 }
191 }
192 }
193 return false;
194}
std::ostream & operator<<(std::ostream &os, const G4Colour &c)
Definition: G4Colour.cc:80
@ JustWarning
void G4Exception(const char *originOfException, const char *exceptionCode, G4ExceptionSeverity severity, const char *description)
Definition: G4Exception.cc:59
std::ostringstream G4ExceptionDescription
Definition: G4Exception.hh:40
CLHEP::Hep3Vector G4ThreeVector
double G4double
Definition: G4Types.hh:83
bool G4bool
Definition: G4Types.hh:86
#define G4endl
Definition: G4ios.hh:57
static G4Colour White()
Definition: G4Colour.hh:156
static G4bool GetColour(const G4String &key, G4Colour &result)
Definition: G4Colour.cc:155
void SetAlpha(G4double)
Definition: G4Colour.cc:70
static G4Colour Yellow()
Definition: G4Colour.hh:166
static G4Colour Green()
Definition: G4Colour.hh:162
static void AddToMap(const G4String &key, const G4Colour &colour)
Definition: G4Colour.cc:106
static void InitialiseColourMap()
Definition: G4Colour.cc:135
static G4Colour Red()
Definition: G4Colour.hh:161
static G4Colour Brown()
Definition: G4Colour.hh:160
static G4Colour Grey()
Definition: G4Colour.hh:158
void SetGreen(G4double)
Definition: G4Colour.cc:58
static const std::map< G4String, G4Colour > & GetMap()
Definition: G4Colour.cc:173
static G4Colour Black()
Definition: G4Colour.hh:159
G4bool operator!=(const G4Colour &c) const
Definition: G4Colour.cc:96
static G4Colour Magenta()
Definition: G4Colour.hh:165
static G4Colour Blue()
Definition: G4Colour.hh:163
void SetRed(G4double)
Definition: G4Colour.cc:52
static G4Colour Gray()
Definition: G4Colour.hh:157
G4Colour(G4double r_=1., G4double g_=1., G4double b_=1., G4double a_=1.)
Definition: G4Colour.cc:35
void SetBlue(G4double)
Definition: G4Colour.cc:64
G4bool operator<(const G4Colour &rhs) const
Definition: G4Colour.cc:181
static G4Colour Cyan()
Definition: G4Colour.hh:164
G4String to_lower_copy(G4String str)
Return lowercased copy of string.
G4bool IsMasterThread()
Definition: G4Threading.cc:124