00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024 #include "rgbillum.h"
00025 #include "memory.h"
00026
00027 using namespace lux;
00028
00029 #include "data/rgbD65_32.h"
00030
00031 void RGBIllumSPD::init(RGBColor s) {
00032 lambdaMin = illumrgb2spect_start;
00033 lambdaMax = illumrgb2spect_end;
00034 int n = illumrgb2spect_bins;
00035 delta = (lambdaMax - lambdaMin) / (n-1);
00036 invDelta = 1.f / delta;
00037 nSamples = n;
00038
00039 AllocateSamples(n);
00040
00041
00042 for (int i = 0; i < n; i++)
00043 samples[i] = 0.f;
00044
00045 float r = s.c[0];
00046 float g = s.c[1];
00047 float b = s.c[2];
00048
00049 if (r <= g && r <= b)
00050 {
00051 AddWeighted(r, illumrgb2spect_white);
00052
00053 if (g <= b)
00054 {
00055 AddWeighted(g - r, illumrgb2spect_cyan);
00056 AddWeighted(b - g, illumrgb2spect_blue);
00057 }
00058 else
00059 {
00060 AddWeighted(b - r, illumrgb2spect_cyan);
00061 AddWeighted(g - b, illumrgb2spect_green);
00062 }
00063 }
00064 else if (g <= r && g <= b)
00065 {
00066 AddWeighted(g, illumrgb2spect_white);
00067
00068 if (r <= b)
00069 {
00070 AddWeighted(r - g, illumrgb2spect_magenta);
00071 AddWeighted(b - r, illumrgb2spect_blue);
00072 }
00073 else
00074 {
00075 AddWeighted(b - g, illumrgb2spect_magenta);
00076 AddWeighted(r - b, illumrgb2spect_red);
00077 }
00078 }
00079 else
00080 {
00081 AddWeighted(b, illumrgb2spect_white);
00082
00083 if (r <= g)
00084 {
00085 AddWeighted(r - b, illumrgb2spect_yellow);
00086 AddWeighted(g - r, illumrgb2spect_green);
00087 }
00088 else
00089 {
00090 AddWeighted(g - b, illumrgb2spect_yellow);
00091 AddWeighted(r - g, illumrgb2spect_red);
00092 }
00093 }
00094
00095 Scale(illumrgb2spect_scale);
00096 Clamp();
00097 }
00098