#pragma rtGlobals=3 // Use modern global access method and strict wave access. //======================================================= // Add commnad to panel Menu menu "Jonnys Panels" //puts the panels on the IGOR menus "HCL Colours", /Q, buildHCLGUI() end //======================================================= // this calls the functions which make the panel and globals function buildHCLGUI() DFRef StartDir=GetDataFolderDFR() setdatafolder root: if (itemsinlist(winlist("HCL_Panel",";","WIN:64"))>0) dowindow /f $("HCL_Panel") else execute/q/z ("HCL_Panel()") endif Setdatafolder StartDir end //======================================================= Window HCL_Panel() : Panel PauseUpdate; Silent 1 // building window... NewPanel /W=(200,100,480,350)/k=1 as "HCL Colours" Button HCL_Butt_SH,pos={10,170},size={60,30},title="Single Hue",fColor=(65280,0,0),proc=HCL_button Button HCL_Butt_DH,pos={75,170},size={60,30},title="Bipolar",fColor=(65280,0,0),proc=HCL_button Button HCL_Butt_MH,pos={140,170},size={60,30},title="Multi-Hue",fColor=(65280,0,0),proc=HCL_button Button HCL_Butt_BH,pos={205,170},size={60,30},title="Hue-Blend",fColor=(65280,0,0),proc=HCL_button Button HCL_Butt_Load,pos={10,210},size={60,30},title="Import Vals",fColor=(65280,30000,0),proc=HCL_button_Load Button HCL_Butt_SetD,pos={75,210},size={60,30},title="Set Range",fColor=(65280,30000,0),proc=HCL_button_Set SetVariable HCL_setvar_hues,pos={30,20},size={220,16},title="Hue List",value= _STR:"0,120,240",bodyWidth=200 SetVariable HCL_setvar_c0,pos={20,50},size={100,16},title="Chroma start" SetVariable HCL_setvar_c0,limits={0,1,0},value= _NUM:0.5,live= 1,bodyWidth=30 SetVariable HCL_setvar_cinf,pos={140,50},size={100,16},title="Chroma finish" SetVariable HCL_setvar_cinf,limits={0,1,0},value= _NUM:0.5,live= 1,bodyWidth=30 SetVariable HCL_setvar_l0,pos={20,80},size={100,16},title="Lumin. start" SetVariable HCL_setvar_l0,limits={0,1,0},value= _NUM:0,live= 1,bodyWidth=30 SetVariable HCL_setvar_linf,pos={140,80},size={100,16},title="Lumin. finish" SetVariable HCL_setvar_linf,limits={0,1,0},value= _NUM:1,live= 1,bodyWidth=30 SetVariable HCL_setvar_d0,pos={20,110},size={100,16},title="Data start" SetVariable HCL_setvar_d0,limits={-inf,inf,0},value= _NUM:0,live= 1,bodyWidth=30 SetVariable HCL_setvar_dinf,pos={140,110},size={100,16},title="Data finish" SetVariable HCL_setvar_dinf,limits={-inf,inf,0},value= _NUM:1,live= 1,bodyWidth=30 SetVariable HCL_setvar_Lvls,pos={20,140},size={100,16},title="Lvls",bodyWidth=30 SetVariable HCL_setvar_Lvls,limits={1,256,0},value= _NUM:16,live= 1 SetVariable HCL_setvar_Name,pos={140,140},size={100,16},title="Name",value= _STR:"ColTabHCL",bodyWidth=80,live= 1 Checkbox HCL_chcbox_Disp,pos={145,210},size={100,16},title="Plot tab",value=1 Checkbox HCL_chcbox_Aux,pos={145,225},size={100,16},title="Plot vals",value=1 PopupMenu HCL_Pop_Type,pos={210,215},size={100,16},title="",value="HCL;HSL;",mode=1 EndMacro //-----------------------------------------------------------------------------------------------------------------------------------------------------------// Function HCL_button(ControlName) : ButtonControl String ControlName variable OK = 1 // get panel values ControlInfo HCL_setvar_hues String HueListStr = S_Value ControlInfo HCL_setvar_Name String NameStr = CleanupName(S_Value, 0) ControlInfo HCL_setvar_Lvls variable Lvls = v_value ControlInfo HCL_setvar_d0 variable d0 = v_value ControlInfo HCL_setvar_dinf variable dinf = v_value ControlInfo HCL_setvar_l0 variable lum0 = v_value ControlInfo HCL_setvar_linf variable luminf = v_value ControlInfo HCL_setvar_c0 variable chr0 = v_value ControlInfo HCL_setvar_cinf variable chrinf = v_value controlinfo HCL_pop_Type // get the approprite func ref String TabStr = S_Value if(cmpstr("HCL",TabStr)==0) FUNCREF ColrTabs_Proto_Func RGB_func= HCL2RGB elseif(cmpstr("HSL",TabStr)==0) FUNCREF ColrTabs_Proto_Func RGB_func= HSL2RGB endif // Check for valid L0 if(ColourTabs_CheckVal(lum0,0,1)==0) return 0 endif // Check for LumInf if(ColourTabs_CheckVal(luminf,0,1)==0) return 0 endif // Check for C0 if(ColourTabs_CheckVal(chr0,0,1)==0) return 0 endif // Check for CInf if(ColourTabs_CheckVal(chrinf,0,1)==0) return 0 endif // Check data range if(numtype(d0+dinf)!=0 || ((d0-dinf)==0)) return 0 endif // call the appropriate function if(cmpstr(ControlName,"HCL_Butt_SH")==0) OK = ColorTabs_SingleHue(HueListStr, Lvls, chr0, chrinf, lum0,luminf, d0, dinf, NameStr,RGB_func,TabStr) elseif(cmpstr(ControlName,"HCL_Butt_DH")==0) OK = ColorTabs_DoubleHue(HueListStr, Lvls, chr0, chrinf, lum0, luminf, d0, dinf, NameStr,RGB_func,TabStr) elseif(cmpstr(ControlName,"HCL_Butt_MH")==0) OK = ColorTabs_CatHue(HueListStr, Lvls, chr0, chrinf, lum0, luminf, d0, dinf, NameStr,RGB_func,TabStr) elseif(cmpstr(ControlName,"HCL_Butt_BH")==0) OK = ColorTabs_BlendHue(HueListStr, Lvls, chr0, chrinf, lum0, luminf, d0, dinf, NameStr,RGB_func,TabStr) endif if(OK == 1) wave destHCL=$(NameStr+"_"+TabStr) destHCL[][0]/=360 destHCL[][0]=mod(destHCL[p][0],1) ControlInfo HCL_chcbox_Aux if(v_value==1) display/K=1 ModifyGraph gfSize=12 appendtograph/l=l1 $(NameStr+"_RGB")[][0],$(NameStr+"_RGB")[][1],$(NameStr+"_RGB")[][2] appendtograph/l=l2 $(NameStr+"_"+TabStr)[][0],$(NameStr+"_"+TabStr)[][1],$(NameStr+"_"+TabStr)[][2] ModifyGraph mode=4,marker=19,useMrkStrokeRGB=1,mirror=1,standoff=0,btLen=5 ModifyGraph rgb($(NameStr+"_RGB")#1)=(0,52224,0) ModifyGraph rgb($(NameStr+"_RGB")#2)=(16384,16384,65280) ModifyGraph rgb($(NameStr+"_"+TabStr))=(0,0,0) ModifyGraph rgb($(NameStr+"_"+TabStr)#1)=(40000,40000,40000) ModifyGraph rgb($(NameStr+"_"+TabStr)#2)=(60000,60000,60000) ModifyGraph msize($(NameStr+"_RGB")#2)=2,msize($(NameStr+"_RGB")#1)=3.5,msize($(NameStr+"_RGB"))=5 ModifyGraph axisEnab(l1)={0,0.4},axisEnab(l2)={0.6,1},freePos(l1)={0,kwFraction}, freePos(l2)={0,kwFraction} ModifyGraph highTrip(l1)=100000 newfreeaxis/t t1 ModifyGraph nticks(t1)=0,freePos(t1)={0.6,kwFraction} newfreeaxis/b b1 ModifyGraph nticks(b1)=0,freePos(b1)={0.6,kwFraction} String LegendStr = "" LegendStr += "\s("+NameStr+"_"+TabStr+") Hue/360\r" LegendStr += "\s("+NameStr+"_"+TabStr+"#1) Sat/Chr\r" LegendStr += "\s("+NameStr+"_"+TabStr+"#2) Lum\r\r" LegendStr += "\s("+NameStr+"_RGB) Red\r" LegendStr += "\s("+NameStr+"_RGB#1) Green\r" LegendStr += "\s("+NameStr+"_RGB#2) Blue\r" TextBox/C/N=text0/F=0/A=RC/E/X=0.00/Y=0.00/J LegendStr endif ControlInfo HCL_chcbox_Disp if(v_value==1) display/K=1 ModifyGraph margin=0,width=226.772,height=113.386,gfSize=12 ColorScale/C/N=text0/F=0/A=MC vert=0,cindex=$(NameStr+"_RGB") endif endif End //-----------------------------------------------------------------------------------------------------------------------------------------------------------// Function ColrTabs_Proto_Func(Hue,Sat,Lum,ResWave) variable Hue,Sat,Lum wave ResWave End //-----------------------------------------------------------------------------------------------------------------------------------------------------------// // This funciton makes a colour table wave which has a single Hue and Chroma, and alters either the Luminocity or Chroma Function ColorTabs_SingleHue(HueStr, NumLvls, C0, CInf, L0, LInf, Val0, ValInf, NameStr, RGB_func, TabStr) String HueStr,NameStr,TabStr variable NumLvls, C0, CInf, L0, LInf, Val0, ValInf FUNCREF ColrTabs_Proto_Func RGB_func variable Hue = str2num(stringfromlist(0,HueStr,",")) // Check for valid number of colour levels if(ColourTabs_CheckVal(NumLvls,1,256)==0) return 0 endif // Check for valid Hue if(ColourTabs_CheckVal(Hue,0,360)==0) return 0 endif // Make a wave to store the RGB values for a single set of HCL values Make/o/n=(3) RGB_tmp // Make the new colourscale wave Make/o/n=(NumLvls,3) $(NameStr+"_RGB")/WAVE=ColourTabWv=0 Make/o/n=(NumLvls,3) $(NameStr+"_"+TabStr)/WAVE=HSLTabWv=0 Setscale/i x, Val0,ValInf, " ", ColourTabWv,HSLTabWv SetHCLNote(ColourTabWv,HueStr,l0,linf,C0,Cinf,NumLvls,Val0,ValInf) // make variables for loops to get RGB values for each set of HCL values variable i variable LDelta = (LInf - L0)/(NumLvls-1) variable CDelta = (CInf - C0)/(NumLvls-1) // start the loop for(i=0;i1)? 1 : ColourTabWv ColourTabWv*=(65535) redimension/u/w ColourTabWv // Kill the Temp wave Killwaves/z RGB_tmp return 1 End //-----------------------------------------------------------------------------------------------------------------------------------------------------------// // This funciton makes a colour table wave which has a single Hue and Chroma, and alters either the Luminocity or Chroma Function ColorTabs_DoubleHue(HueStr, NumLvls, C0, CInf, L0, LInf, Val0, ValInf, NameStr, RGB_func,TabStr) String HueStr, NameStr,TabStr variable NumLvls, C0, CInf, L0, LInf, Val0, ValInf FUNCREF ColrTabs_Proto_Func RGB_func variable Hue1 = str2num(stringfromlist(0,HueStr,",")) variable Hue2 = str2num(stringfromlist(1,HueStr,",")) // Check for valid number of colour levels if(ColourTabs_CheckVal(NumLvls,1,256)==0) return 0 endif // Check for valid Hue1 if(ColourTabs_CheckVal(Hue1,0,360)==0) return 0 endif // Check for valid Hue2 if(ColourTabs_CheckVal(Hue2,0,360)==0) return 0 endif // Make a wave to store the RGB values for a single set of HCL values Make/o/n=(3) RGB_tmp // Make the new colourscale wave Make/o/n=(NumLvls,3) $(NameStr+"_RGB")/WAVE=ColourTabWv=0 Make/o/n=(NumLvls,3) $(NameStr+"_"+TabStr)/WAVE=HSLTabWv=0 Setscale/i x, Val0,ValInf, " ", ColourTabWv,HSLTabWv SetHCLNote(ColourTabWv,HueStr,l0,linf,C0,Cinf,NumLvls,Val0,ValInf) // make variables for loops to get RGB values for each set of HCL values variable i variable NumEnd = (mod(NumLvls,2)==0)? 2 : 1 variable LDelta = 2*(LInf - L0)/(NumLvls-NumEnd) variable CDelta = 2*(CInf - C0)/(NumLvls-NumEnd) // start the loop for(i=0;i<(NumLvls/2);i+=1) variable i_L = L0 + i*LDelta variable i_C = C0 + i*CDelta // Hue 1 RGB_func(Hue1, i_C, i_L,RGB_tmp) ColourTabWv[i][0]=RGB_tmp[0] ColourTabWv[i][1]=RGB_tmp[1] ColourTabWv[i][2]=RGB_tmp[2] // Hue 2 HCL2RGB(Hue2, i_C, i_L,RGB_tmp) ColourTabWv[NumLvls-i-1][0]=RGB_tmp[0] ColourTabWv[NumLvls-i-1][1]=RGB_tmp[1] ColourTabWv[NumLvls-i-1][2]=RGB_tmp[2] // HSL values HSLTabWv[i][0]=Hue1 HSLTabWv[NumLvls-i-1][0]=Hue2 HSLTabWv[i][1]=i_C HSLTabWv[i][2]=i_L HSLTabWv[NumLvls-i-1][1]=i_C HSLTabWv[NumLvls-i-1][2]=i_L endfor // scale and redimension the colour table wave ColourTabWv=(ColourTabWv>1)? 1 : ColourTabWv ColourTabWv*=(65535) redimension/u/w ColourTabWv // Kill the Temp wave Killwaves/z RGB_tmp return 1 End //-----------------------------------------------------------------------------------------------------------------------------------------------------------// // This funciton makes a colour table wave which has a single Hue and Chroma, and alters either the Luminocity or Chroma Function ColorTabs_CatHue(HueStr, NumLvls, C0, CInf, L0, LInf, Val0, ValInf, NameStr, RGB_func,TabStr) String HueStr,NameStr,TabStr variable NumLvls, C0, CInf, L0, LInf, Val0, ValInf FUNCREF ColrTabs_Proto_Func RGB_func // Check for valid Hue String variable N_Hues = itemsinlist(HueStr,",") if(N_Hues==0) return 0 endif // Check for valid number of colour levels if(ColourTabs_CheckVal(NumLvls,1,256)==0) return 0 endif // Make a wave to store the RGB values for a single set of HCL values Make/o/n=(3) RGB_tmp // Make the new colourscale wave Make/o/n=(N_Hues*NumLvls,3) $(NameStr+"_RGB")/WAVE=ColourTabWv=0 Make/o/n=(N_Hues*NumLvls,3) $(NameStr+"_"+TabStr)/WAVE=HSLTabWv=0 Setscale/i x, Val0,ValInf, " ", ColourTabWv,HSLTabWv SetHCLNote(ColourTabWv,HueStr,l0,linf,C0,Cinf,NumLvls,Val0,ValInf) // make variables for loops to get RGB values for each set of HCL values variable i,i_Hue variable LDelta = (LInf - L0)/(NumLvls-1) variable CDelta = (CInf - C0)/(NumLvls-1) // start the loop for lum and chroma for(i=0;i<(NumLvls);i+=1) variable i_L = L0 + i*LDelta variable i_C = C0 + i*CDelta // loop the hues for(i_Hue=0;i_Hue1)? 1 : ColourTabWv ColourTabWv*=(65535) redimension/u/w ColourTabWv // Kill the Temp wave Killwaves/z RGB_tmp return 1 End //-----------------------------------------------------------------------------------------------------------------------------------------------------------// // This funciton makes a colour table wave which has a single Hue and Chroma, and alters either the Luminocity or Chroma Function ColorTabs_BlendHue(HueStr, NumLvls, C0, CInf, L0, LInf, Val0, ValInf, NameStr, RGB_func,TabStr) String HueStr,NameStr,TabStr variable NumLvls, C0, CInf, L0, LInf, Val0, ValInf FUNCREF ColrTabs_Proto_Func RGB_func variable Hue1 = str2num(stringfromlist(0,HueStr,",")) variable Hue2 = str2num(stringfromlist(1,HueStr,",")) // Check for valid number of colour levels if(ColourTabs_CheckVal(NumLvls,1,256)==0) return 0 endif // Check for valid Hue if(ColourTabs_CheckVal(Hue1,0,inf)==0) return 0 endif // Check for valid Hue if(ColourTabs_CheckVal(Hue2,0,inf)==0) return 0 endif // Make a wave to store the RGB values for a single set of HCL values Make/o/n=(3) RGB_tmp // Make the new colourscale wave Make/o/n=(NumLvls,3) $(NameStr+"_RGB")/WAVE=ColourTabWv=0 Make/o/n=(NumLvls,3) $(NameStr+"_"+TabStr)/WAVE=HSLTabWv=0 Setscale/i x, Val0,ValInf, " ", ColourTabWv,HSLTabWv SetHCLNote(ColourTabWv,HueStr,l0,linf,C0,Cinf,NumLvls,Val0,ValInf) // make variables for loops to get RGB values for each set of HCL values variable i variable LDelta = (LInf - L0)/(NumLvls-1) variable CDelta = (CInf - C0)/(NumLvls-1) variable HDelta = (Hue2-Hue1)/(NumLvls-1) // start the loop for(i=0;i1)? 1 : ColourTabWv ColourTabWv*=(65535) redimension/u/w ColourTabWv // Kill the Temp wave Killwaves/z RGB_tmp return 1 End //-----------------------------------------------------------------------------------------------------------------------------------------------------------// // This function checks for valid Hue values Function ColourTabs_CheckVal(Val, MinVal, MaxVal) variable Val, MinVal, MaxVal if(ValMaxVal) return 0 elseif(numtype(Val)!=0) return 0 endif return 1 End //-----------------------------------------------------------------------------------------------------------------------------------------------------------// // This function maps from HCL to RGB colourspace Function HCL2RGB(Hue, Chroma, Lum,RGB_Dest) variable Hue, Chroma, Lum wave RGB_Dest variable H_prime = Hue/60 variable X_val = Chroma * (1 - ABS( mod(H_prime,2)-1) ) variable Red, Green, Blue RGB_Dest = 0 if(H_prime<1) Red = Chroma Green = X_val Blue = 0 elseif(H_prime<2) Red = X_val Green = Chroma Blue = 0 elseif(H_prime<3) Red = 0 Green = Chroma Blue = X_val elseif(H_prime<4) Red = 0 Green = X_val Blue = Chroma elseif(H_prime<5) Red = X_val Green = 0 Blue = Chroma else Red = Chroma Green = 0 Blue = X_val endif variable offset = Lum - (0.30*Red + 0.59*Green + 0.11*Blue) RGB_Dest[0]=Red+offset RGB_Dest[1]=Green+offset RGB_Dest[2]=Blue+offset RGB_Dest=(RGB_Dest<0)? 0 : RGB_Dest End //-----------------------------------------------------------------------------------------------------------------------------------------------------------// // This function maps from HCL to RGB colourspace Function HSL2RGB(Hue, Sat, Lum,RGB_Dest) variable Hue, Sat, Lum wave RGB_Dest variable Chroma = (1-abs((2*Lum)-1))*Sat variable H_prime = Hue/60 variable X_val = Chroma * (1 - ABS( mod(H_prime,2)-1) ) variable Red, Green, Blue RGB_Dest = 0 if(H_prime<1) Red = Chroma Green = X_val Blue = 0 elseif(H_prime<2) Red = X_val Green = Chroma Blue = 0 elseif(H_prime<3) Red = 0 Green = Chroma Blue = X_val elseif(H_prime<4) Red = 0 Green = X_val Blue = Chroma elseif(H_prime<5) Red = X_val Green = 0 Blue = Chroma else Red = Chroma Green = 0 Blue = X_val endif variable offset = Lum - (0.5*Chroma) RGB_Dest[0]=Red+offset RGB_Dest[1]=Green+offset RGB_Dest[2]=Blue+offset RGB_Dest=(RGB_Dest<0)? 0 : RGB_Dest End //======================================================= function SetHCLNote(ColourTabWv,HueStr,l0,linf,C0,Cinf,NumLvls,Val0,ValInf) wave ColourTabWv String HueStr Variable l0,linf,C0,Cinf,NumLvls,Val0,ValInf Note/K ColourTabWv Note/NOCR ColourTabWv,"Type=HCLColIndex;" Note/NOCR ColourTabWv,"HueStr="+HueStr+";" Note/NOCR ColourTabWv,"L0="+num2str(l0)+";" Note/NOCR ColourTabWv,"LInf="+num2str(linf)+";" Note/NOCR ColourTabWv,"C0="+num2str(C0)+";" Note/NOCR ColourTabWv,"CInf="+num2str(Cinf)+";" Note/NOCR ColourTabWv,"Val0="+num2str(Val0)+";" Note/NOCR ColourTabWv,"ValInf="+num2str(ValInf)+";" Note/NOCR ColourTabWv,"Levels="+num2str(NumLvls)+";" end //======================================================= Function HCL_button_Load(ControlName) : ButtonControl String ControlName String cdfBefore = GetDataFolder(1) Execute/Q/Z "CreateBrowser prompt=\"Select a colour index wave containing HCL settings\", showWaves=1, showVars=0,showStrs=0" SVAR S_BrowserList=S_BrowserList if(strlen(S_BrowserList)>0) wave/z Source = $(stringfromlist(0,S_BrowserList)) String WaveNote=note(Source) string Type = StringByKey("Type", WaveNote, "=") if(cmpstr(Type,"HCLColIndex")==0) dowindow /f/z $("HCL_Panel") SetVariable HCL_setvar_hues,value= _STR:StringByKey("HueStr", WaveNote, "=") SetVariable HCL_setvar_c0,value= _NUM:NumberByKey("C0", WaveNote, "=") SetVariable HCL_setvar_cinf,value= _NUM:NumberByKey("CInf", WaveNote, "=") SetVariable HCL_setvar_l0,value= _NUM:NumberByKey("L0", WaveNote, "=") SetVariable HCL_setvar_linf,value= _NUM:NumberByKey("LInf", WaveNote, "=") SetVariable HCL_setvar_d0,value= _NUM:NumberByKey("Val0", WaveNote, "=") SetVariable HCL_setvar_dinf,value= _NUM:NumberByKey("ValInf", WaveNote, "=") SetVariable HCL_setvar_lvls,value= _NUM:NumberByKey("Levels", WaveNote, "=") else DoAlert 0, "The chosen wave is not a valid HCL Color index wave." endif endif SetDataFolder cdfBefore End //======================================================= Function HCL_button_Set(ControlName) : ButtonControl String ControlName String cdfBefore = GetDataFolder(1) Execute/Q/Z "CreateBrowser prompt=\"Select a wave to specify data range for Color table wave scaling\", showWaves=1, showVars=0,showStrs=0" SVAR S_BrowserList=S_BrowserList if(strlen(S_BrowserList)>0) wave/z Source = $(stringfromlist(0,S_BrowserList)) SetVariable HCL_setvar_d0,value= _NUM:waveMin(Source) SetVariable HCL_setvar_dinf,value= _NUM:waveMax(Source) endif SetDataFolder cdfBefore End //=======================================================