00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026 #include "spli.h"
00027
00028
00029
00030 #define DEG60 (60*M_PI/180)
00031 #define DEG120 (120*M_PI/180)
00032
00033
00034
00035
00036 PRIVATE VOID specpal_basic( SPL_FLOAT H, SPL_FLOAT S,
00037 SPL_FLOAT *R, SPL_FLOAT *G, SPL_FLOAT *B )
00038 {
00039 H = H*M_PI/180.;
00040 *B = 1-S;
00041 *R = (1 + cos(H)/cos(DEG60-H))/3;
00042 *G = (1 + cos(DEG120-H)/cos(-DEG60+H))/3;
00043 *R += (1-S)*(1-*R);
00044 *G += (1-S)*(1-*G);
00045 }
00046
00047
00048
00049
00050 PRIVATE VOID specpal_hsi2rgb( SPL_FLOAT H, SPL_FLOAT S, SPL_FLOAT I,
00051 SPL_FLOAT *r, SPL_FLOAT *g, SPL_FLOAT *b )
00052 {
00053 SPL_FLOAT R, G, B;
00054 SPL_FLOAT II;
00055
00056 if (H<0) H+=360;
00057
00058 if ((H>0)&&(H<=120)) specpal_basic(H,S,&R,&G,&B);
00059 else if ((H>120)&&(H<=240)) specpal_basic(H-120,S,&G,&B,&R);
00060 else specpal_basic(H-240,S,&B,&R,&G);
00061
00062 II=R;
00063 if (G>II) II=G;
00064 if (B>II) II=B;
00065
00066 R*=I/II;
00067 G*=I/II;
00068 B*=I/II;
00069
00070 if (R>1) R=1;
00071 if (G>1) G=1;
00072 if (B>1) B=1;
00073
00074 if (R<0) R=0;
00075 if (G<0) G=0;
00076 if (B<0) B=0;
00077
00078 *r=R;
00079 *g=G;
00080 *b=B;
00081 }
00082
00083
00084
00085
00086
00087
00088
00089
00090
00091 PUBLIC VOID XAPI spectral_color( SPL_INT colornum,
00092 SPL_FLOAT ncolors, SPL_FLOAT *r, SPL_FLOAT *g, SPL_FLOAT *b )
00093 {
00094 #define ZLEVEL 0.25
00095 SPL_FLOAT h, s, i;
00096
00097 if (colornum<=0) { *r = *g = *b = 0; return; }
00098 if (colornum>=ncolors-1) { *r = *g = *b = 1; return; }
00099
00100 colornum--;
00101 ncolors-=3;
00102
00103 if (!ncolors) { *r = 1; *g = *b = 0.2; return; }
00104
00105 h=(180.*colornum)/ncolors-120;
00106 s=1;
00107 i=ZLEVEL+((1-ZLEVEL)*colornum)/ncolors;
00108
00109 specpal_hsi2rgb(h,s,i,r,g,b);
00110 }
00111
00112