ECCE @ EIC Software
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Groups Pages
G4Colour.cc
Go to the documentation of this file. Or view the newest version in sPHENIX GitHub for file G4Colour.cc
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 
36 red (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 
45 red (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 
76 G4Colour::operator G4ThreeVector() {
77  return G4ThreeVector(red,green,blue);
78 }
79 
80 std::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  if (
98  (red != c.red) ||
99  (green != c.green) ||
100  (blue != c.blue) ||
101  (alpha != c.alpha)
102  )
103  return true;
104  return false;
105 }
106 
107 std::map<G4String, G4Colour> G4Colour::fColourMap;
109 
110 void G4Colour::AddToMap(const G4String& key, const G4Colour& colour)
111 {
112  // Allow only master thread to populate the map
114  static G4bool first = true;
115  if (first) {
116  first = false;
118  ("G4Colour::AddToMap(const G4String& key, const G4Colour& colour)",
119  "greps0002", JustWarning,
120  "Attempt to add to colour map from non-master thread.");
121  }
122  return;
123  }
124 
125  // Convert to lower case since colour map is case insensitive
126  G4String myKey(key);
127  myKey.toLower();
128 
129  std::map<G4String, G4Colour>::iterator iter = fColourMap.find(myKey);
130 
131  if (iter == fColourMap.end()) fColourMap[myKey] = colour;
132  else {
134  ed << "G4Colour with key " << myKey << " already exists." << G4endl;
136  ("G4Colour::AddToMap(const G4String& key, const G4Colour& colour)",
137  "greps0001", JustWarning, ed,
138  "Colour key exists");
139  }
140 }
141 
143 {
144  if (fInitColourMap) return;
145 
146  fInitColourMap = true;
147 
148  // Standard colours
149  AddToMap("white", G4Colour::White());
150  AddToMap("grey", G4Colour::Grey());
151  AddToMap("gray", G4Colour::Gray());
152  AddToMap("black", G4Colour::Black());
153  AddToMap("brown", G4Colour::Brown());
154  AddToMap("red", G4Colour::Red());
155  AddToMap("green", G4Colour::Green());
156  AddToMap("blue", G4Colour::Blue());
157  AddToMap("cyan", G4Colour::Cyan());
158  AddToMap("magenta", G4Colour::Magenta());
159  AddToMap("yellow", G4Colour::Yellow());
160 }
161 
163 {
164  // Add standard colours to map
165  InitialiseColourMap(); // Initialises if not already initialised
166 
167  G4String myKey(key);
168  myKey.toLower();
169 
170  std::map<G4String, G4Colour>::iterator iter = fColourMap.find(myKey);
171 
172  // Don't modify "result" if colour was not found in map
173  if (iter == fColourMap.end()) return false;
174 
175  result = iter->second;
176 
177  return true;
178 }
179 
180 const std::map<G4String, G4Colour>& G4Colour::GetMap()
181 {
182  // Add standard colours to map
183  InitialiseColourMap(); // Initialises if not already initialised
184 
185  return fColourMap;
186 }