The spica renderer
spectrum.h
1 #ifdef _MSC_VER
2 #pragma once
3 #endif
4 
5 #ifndef _SPICA_SPECTRUM_H_
6 #define _SPICA_SPECTRUM_H_
7 
8 #include <iostream>
9 #include <vector>
10 
11 #include "common.h"
12 
13 namespace spica {
14 
18  class SPICA_EXPORTS RGBSpectrum {
19  public:
21  RGBSpectrum();
22  explicit RGBSpectrum(double l);
23 
29  RGBSpectrum(double red, double green, double blue);
30 
33  RGBSpectrum(const std::vector<double>& nm,
34  const std::vector<double>& values);
35 
39  ~RGBSpectrum();
40 
42  RGBSpectrum& operator=(const RGBSpectrum& c);
44  bool operator==(const RGBSpectrum& c) const;
46  bool operator!=(const RGBSpectrum& c) const;
48  RGBSpectrum& operator+=(const RGBSpectrum& c);
52  RGBSpectrum& operator+=(double x);
54  RGBSpectrum& operator-=(const RGBSpectrum& c);
58  RGBSpectrum& operator-=(double x);
60  RGBSpectrum& operator*=(const RGBSpectrum& c);
62  RGBSpectrum& operator*=(double s);
64  RGBSpectrum& operator/=(const RGBSpectrum& c);
66  RGBSpectrum& operator/=(double s);
68  RGBSpectrum operator-() const;
69 
70  static RGBSpectrum fromXYZ(double x, double y, double z);
71 
72  static RGBSpectrum minimum(const RGBSpectrum& c1, const RGBSpectrum& c2);
73  static RGBSpectrum maximum(const RGBSpectrum& c1, const RGBSpectrum& c2);
74 
75  static RGBSpectrum sqrt(const RGBSpectrum& c);
76  static RGBSpectrum exp(const RGBSpectrum& c);
77  static RGBSpectrum log(const RGBSpectrum& c);
78  static RGBSpectrum clamp(const RGBSpectrum& c,
79  const RGBSpectrum& lo = RGBSpectrum(0.0, 0.0, 0.0),
80  const RGBSpectrum& hi = RGBSpectrum(INFTY, INFTY, INFTY));
81 
82  bool isBlack() const;
83  bool isInf() const;
84  bool isNaN() const;
85  bool isValid() const;
86  double dot(const RGBSpectrum& RGBSpectrum) const;
87  double norm() const;
88  double squaredNorm() const;
89  double gray() const;
90 
92  inline double red() const { return r_; }
94  inline double green() const { return g_; }
96  inline double blue() const { return b_; }
97 
99  inline double operator[](int i) const {
100  Assertion(i >= 0 && i <= 2, "Index out of range!!");
101  if (i == 0) return r_;
102  if (i == 1) return g_;
103  if (i == 2) return b_;
104  return 0.0;
105  }
106 
108  inline double& ref(int i) {
109  Assertion(i >= 0 && i <= 2, "Index out of range!!");
110  if (i == 0) return r_;
111  if (i == 1) return g_;
112  return b_;
113  }
114 
116  inline RGBSpectrum toRGB() const {
117  return { r_, g_, b_ };
118  }
119 
121  std::string toString() const;
122 
123  // Public fields
124  static const int channels = 3;
125 
126  private:
127  double r_, g_, b_;
128  };
129 
130  using Spectrum = RGBSpectrum;
131 
132 } // namespace spica
133 
134 SPICA_EXPORTS spica::RGBSpectrum operator+(const spica::RGBSpectrum& c1, const spica::RGBSpectrum& c2);
135 SPICA_EXPORTS spica::RGBSpectrum operator+(double x, const spica::RGBSpectrum& c);
136 SPICA_EXPORTS spica::RGBSpectrum operator+(const spica::RGBSpectrum& c, double x);
137 SPICA_EXPORTS spica::RGBSpectrum operator-(const spica::RGBSpectrum& c1, const spica::RGBSpectrum& c2);
138 SPICA_EXPORTS spica::RGBSpectrum operator-(double x, const spica::RGBSpectrum& c);
139 SPICA_EXPORTS spica::RGBSpectrum operator-(const spica::RGBSpectrum& c, double x);
140 SPICA_EXPORTS spica::RGBSpectrum operator*(const spica::RGBSpectrum& c1, const spica::RGBSpectrum& c2);
141 SPICA_EXPORTS spica::RGBSpectrum operator*(const spica::RGBSpectrum& c1, double s);
142 SPICA_EXPORTS spica::RGBSpectrum operator*(double s, const spica::RGBSpectrum& c2);
143 SPICA_EXPORTS spica::RGBSpectrum operator/(const spica::RGBSpectrum& c1, const spica::RGBSpectrum& c2);
144 SPICA_EXPORTS spica::RGBSpectrum operator/(const spica::RGBSpectrum& c1, double s);
145 SPICA_EXPORTS std::ostream& operator<<(std::ostream& os, const spica::RGBSpectrum& c);
146 
147 #endif // SPICA_RGBSpectrum_H_
double blue() const
Blue component.
Definition: spectrum.h:96
double operator[](int i) const
Element accessor.
Definition: spectrum.h:99
RGB spectrum.
Definition: spectrum.h:18
double green() const
Green component.
Definition: spectrum.h:94
double & ref(int i)
Element accessor.
Definition: spectrum.h:108
RGBSpectrum toRGB() const
Convert to RGB spcetrum.
Definition: spectrum.h:116
double red() const
Red component.
Definition: spectrum.h:92