AUTODEFINE "OFF" ' Compile as Window $INCLUDE "windowssdk.inc" $INCLUDE "Shlwapi.inc" 'COLORS_API int fncolors(void); 'COLORS_API int xy2d (int n, int x, int y); ' Splits "Inp$" by "Deliminator" into "RetArray" returns number of strings placed into "RetArray" DECLARE Split(Inp$:STRING,Deliminator:CHAR,RetArray:POINTER),INT DECLARE CDECL cmpFunc(a:POINTER,b:POINTER),INT DECLARE CDECL IMPORT, atan2(DOUBLE y, DOUBLE x),DOUBLE '/* CONST filename = "Colors.txt" CONST index = 2345 CONST cBase_Color = 19 :' Field number for Base Color (0 based) CONST Base_Colors = 30 :' Max number of Base Colors CONST _Base_Color = 192 :' Column where Base Color Starts CONST lBase_Color = 14 :' Length of Base Color in Chars CONST cColor = 21 :' Field number for Color Name (0 based) CONST _Color = 220 :' Column where Color Name Starts '*/ /* CONST filename = "Colors-140.txt" CONST index = 150 CONST Base_Colors = 30 :' Max number of Base Colors CONST _Base_Color = 21 :' Column where Base Color Starts CONST cBase_Color = 4 :' Field number for Base Color (0 based) CONST lBase_Color = 6 :' Length of Base Color in Chars CONST _Color = 28 :' Column where Color Name Starts CONST cColor = 5 :' Field number for Color Name (0 based) */ CONST pi = 3.14159265358979323846264338327950288 TYPE CieLABtype DEF l:DOUBLE DEF a:DOUBLE DEF b:DOUBLE ENDTYPE TYPE HSVtype DEF h:DOUBLE DEF s:DOUBLE DEF v:DOUBLE ENDTYPE DEF win:WINDOW DEF win2:DIALOG DEF myfile:FILE DEF sp[25]:INT DEF sp$[25]:STRING DEF changed=0,update=0,fnd=0,irgb[index,3],lb=-1,lbmax=-1,max=0,maxcntr=0:INT DEF cntr,i,j,l,rows,rr,scntr,msg,mx,my,r,g,b,clip,test:INT DEF cntrf,cntrl:INT DEF mc,red,green,blue:UINT DEF btn[8]="BASE",h[16]:ISTRING DEF icol[16,index],ihex[16,index]:ISTRING DEF idata[index],istr[index],sdata[index],lbcol[Base_Colors],lbtext="*All",indata,saveas,header[4],path,temp:STRING DEF tmp,t:STRING DEF p1,p2:STRING DEF del=",":CHAR t = "," test = 0 ENUM controls b_exit = 1000 b_next b_prev b_rgb_base b_static1 b_listbox b_update b_chg_color b_static2 b_static3 b_listbox2 b_exit2 ENDENUM IF test = 1 THEN OPENCONSOLE ClearData() path = GETSTARTPATH IF (OPENFILE(myfile,path + filename,"R") = 0) READ(myfile,indata) header[0] = indata READ(myfile,indata) header[1] = indata READ(myfile,indata) header[2] = indata READ(myfile,indata) header[3] = indata cntr = -1 p1 = "" p2 = "" WHILE READ(myfile,indata) = 0 IF MID$(indata,1,12) = p1 AND MID$(indata,34) = p2 THEN GOTO skipit p1 = MID$(indata,1,12) p2 = MID$(indata,_COLOR+1) IF MID$(indata,_COLOR-1,1) <> "," MESSAGEBOX 0,STR$(cntr)+" "+indata,"Problem" END ENDIF cntr++ idata[cntr] = indata rows = Split(indata,del,sp) FOR rr = 0 TO rows - 1 temp = *(sp[rr]) SELECT rr ' Red CASE 0 r = VAL(temp) irgb[cntr,0] = r ' Green CASE 1 g = VAL(temp) irgb[cntr,1] = g ' Blue CASE 2 b = VAL(temp) irgb[cntr,2] = b ' Hex CASE 3 ihex[0,cntr] = temp ' Base CASE cBase_Color 'temp = RTRIM$(temp) icol[0,cntr] = temp IF lb = -1 lb++ lbcol[lb] = temp ELSE fnd = 0 FOR i = 0 TO lb IF lbcol[i] = temp fnd = 1 i = lb + 1 ENDIF NEXT i IF fnd = 0 lb++ lbcol[lb] = temp IF lb > Base_Colors MESSAGEBOX win,"Too many Base Colors","Error" END ENDIF ENDIF ENDIF ' Color CASE cColor IF cntr>0 IF ihex[0,cntr] = ihex[0,cntr-1] temp = "**" + temp ENDIF ENDIF istr[cntr] = temp ENDSELECT NEXT rr LABEL skipit ENDWHILE CLOSEFILE myfile maxcntr = cntr max = cntr ENDIF OPENWINDOW win,0,0,1300,804,0x80C80080,0,"Color Bars - RGB -"+STR$(maxcntr+1)+" defs",&handler_win SETFONT win,"Courier New",10,400 FRONTPEN win,RGB(0,0,0) BACKPEN win,RGB(255,255,255) CONTROL win,@BUTTON,"Exit",1200,10,60,25,0x50010001,b_exit CONTROL win,@BUTTON,"Next",1200,45,60,25,0x50010001,b_next CONTROL win,@BUTTON,"Prev",1200,80,60,25,0x50010001,b_prev CONTROL win,@BUTTON,btn,1200,115,60,25,0x50010001,b_rgb_base CONTROL win,@STATIC,"Limit to",1159,158,60,22,0x50010001,b_static1 CONTROL win,@LISTBOX,"",1160,180,130,280,0x50800142|@CTLISTSTANDARD,b_listbox CONTROL win,@BUTTON,"Update",1200,480,60,25,0x50010001,b_update CONTROL win,@BUTTON,"Change\nColor",1200,510,60,45,0x50010001|@CTLBTNMULTI,b_chg_color CONTROL win,@STATIC,"Save as",1200,590,60,22,0x50010001,b_static2 CONTROL win,@STATIC,"*Undef",1170,610,110,22,0x50010001,b_static3 SETCONTROLCOLOR win,b_exit,RGB(0,0,0),RGB(255,0,0) 'Black, Red SETCONTROLCOLOR win,b_next,RGB(0,0,0),RGB(102,205,0) 'Black, Green SETCONTROLCOLOR win,b_prev,RGB(0,0,0),RGB(255,215,0) 'Black, Yellow SETCONTROLCOLOR win,b_rgb_base,RGB(0,0,0),RGB(092,172,238) 'Black, Blue SETCONTROLCOLOR win,b_static1,RGB(255,0,0),RGB(0,0,0) 'Red, Black SETCONTROLCOLOR win,b_listbox,RGB(0,0,0),RGB(0,255,255) 'Black, Cyan SETCONTROLCOLOR win,b_update,RGB(0,0,0),RGB(211,211,211) 'Black, Gray SETCONTROLCOLOR win,b_chg_color,RGB(0,0,0),RGB(255,192,203) 'Black, Pink SETCONTROLCOLOR win,b_static2,RGB(255,0,0),RGB(0,0,0) 'Red, Black SETCONTROLCOLOR win,b_static3,RGB(0,0,0),RGB(0,0,0) 'Black, Black SETFONT win,"Arial",12,700,0,b_static3 lbmax = lb ADDSTRING win,b_listbox,"*All" FOR i = 0 to lbmax ADDSTRING win,b_listbox,lbcol[i] NEXT i SETSELECTED win,b_listbox,0 cntr = -1 scntr = cntr cntrf = 0 FOR i = 10 TO 1000 STEP 160 FOR j = 25 TO 750 STEP 45 cntr++ Legend(i,j,155,20,0,0,0,irgb[cntr,0],irgb[cntr,1],irgb[cntr,2], _ RTRIM$(icol[0,cntr])+":"+istr[cntr],ihex[0,cntr]) NEXT j NEXT i cntrl = cntr DispSE() SHOWWINDOW(win,@SWHIDE,b_chg_color) SHOWWINDOW(win,@SWHIDE,b_static2) SHOWWINDOW(win,@SWHIDE,b_static3) SHOWWINDOW(win2,@SWHIDE) CREATEDIALOG win2,0,0,240,360,0x80C80080,win,"Pick a Color",&handler_win2 SETFONT win2,"Arial",10,700 FRONTPEN win2,RGB(0,0,0) BACKPEN win2,RGB(255,255,255) CONTROL win2,@BUTTON,"Exit",170,10,60,25,0x50010001,b_exit2 CONTROL win2,@LISTBOX,"",10,10,150,330,0x50800142|@CTLISTSTANDARD,b_listbox2 WAITUNTIL IsWindowClosed(win) IF test = 1 THEN CLOSECONSOLE END SUB handler_win(),int SELECT @CLASS CASE @IDCREATE CENTERWINDOW win CASE @IDCLOSEWINDOW CASE& @IDDESTROY CLOSEWINDOW win CASE @IDLBUTTONDN mx = @MOUSEX my = @MOUSEY IF mx > 7 AND mx < 1126 IF my > 10 AND my < 764 mc = GETPIXEL(win,mx,my) DecToRGB(mc) h = HEX$(mc) IF LEN(h) < 6 THEN h = STRING$(6-LEN(h),"0") + HEX$(mc) temp = "RGB("+USING("0###",red)+","+USING("0###",green)+","+USING("0###",blue)+") 0x"+h 'temp += "\n"+STR$(mx)+STR$(my) INT ha, sa, va ColorToHSV(mc, ha, sa, va) temp+= STR$(ha) + " - " + STR$(sa) + " - " + STR$(va) + " - " IF update = 1 UpdateRec("#" + h) ELSE msg = MESSAGEBOX win,temp,"Send to Clipboard",@MB_YESNO|@MB_ICONQUESTION 'IF msg = @IDYES THEN clip = SendToClipBoard(win,temp) ENDIF ENDIF ENDIF CASE @IDCONTROL SELECT @CONTROLID CASE b_listbox IF @NOTIFYCODE = @LBNSELCHANGE clearwin() SHOWWINDOW(win,@SWHIDE,b_chg_color) SHOWWINDOW(win,@SWHIDE,b_static2) SHOWWINDOW(win,@SWHIDE,b_static3) lb = GETSELECTED(win,b_listbox) lbtext = GETSTRING(win,b_listbox,lb) i = LEN(temp) ClearData() maxcntr = -1 tmp = btn SELECT tmp CASE "RGB" FOR i = 0 TO max temp = idata[i] ' Base Color IF lbtext = "*All" OR lbtext = MID$(temp,_Base_Color,LEN(lbtext)) maxcntr++ ' Base Color sdata[maxcntr] = MID$(temp,_Base_Color,lBase_Color) + t + STR$(i) ENDIF NEXT i IF lbtext = "*All" SETCAPTION win,"Color Bars - BASE -"+STR$(maxcntr+1)+" defs" ELSE SETCAPTION win,"Color Bars - BASE -"+STR$(maxcntr+1)+" defs for "+lbtext ENDIF CASE "BASE" FOR i = 0 TO max temp = idata[i] ' Base Color IF lbtext = "*All" OR lbtext = MID$(temp,_Base_Color,LEN(lbtext)) maxcntr++ sdata[maxcntr] = temp ENDIF NEXT i IF lbtext = "*All" SETCAPTION win,"Color Bars - RGB -"+STR$(maxcntr+1)+" defs" ELSE SETCAPTION win,"Color Bars - RGB -"+STR$(maxcntr+1)+" defs for "+lbtext ENDIF ENDSELECT DoQsortDE(maxcntr) SplitRGB() SETCONTROLTEXT win,b_rgb_base,btn cntr = -1 cntrf = 0 FOR i = 10 TO 1000 STEP 160 FOR j = 25 TO 750 STEP 45 cntr++ IF cntr > maxcntr i = 1010 j = 760 cntr = maxcntr ELSE IF lbtext = "*All" Legend(i,j,155,20,0,0,0,irgb[cntr,0],irgb[cntr,1],irgb[cntr,2], _ RTRIM$(icol[0,cntr])+":"+istr[cntr],ihex[0,cntr]) ELSE Legend(i,j,155,20,0,0,0,irgb[cntr,0],irgb[cntr,1],irgb[cntr,2], _ istr[cntr],ihex[0,cntr]) ENDIF ENDIF NEXT j NEXT i cntrl = cntr DispSE() IF lbtext = "*Undef" AND update = 1 SHOWWINDOW(win,@SWSHOW,b_chg_color) SHOWWINDOW(win,@SWSHOW,b_static2) SHOWWINDOW(win,@SWSHOW,b_static3) DOMODAL win2,0 ELSE SHOWWINDOW(win,@SWHIDE,b_chg_color) SHOWWINDOW(win,@SWHIDE,b_static2) SHOWWINDOW(win,@SWHIDE,b_static3) ENDIF ENDIF ' Exit CASE b_exit IF changed = 1 MESSAGEBOX 0,"Writing new file","Info" IF (OPENFILE(myfile,path + "ColorsF.txt","W")=0) FOR i = 0 TO 3 WRITE(myfile,header[i]) NEXT i FOR i = 0 TO max WRITE(myfile,idata[i]) NEXT i CLOSEFILE myfile tmp = TIME$ tmp = MID$(tmp,1,2) + "-" + MID$(tmp,4,2) + "-" + MID$(tmp,7,2) tmp = "Colors-" + DATE$("yyyy-MM-dd") + "_-_" + tmp + ".txt" IF COPYFILE(path + "Colors.txt", path + tmp, 0) = 0 MESSAGEBOX 0, path + "Colors.txt NOT copied","Info" ENDIF IF COPYFILE(path + "ColorsF.txt", path + "Colors.txt", 0) = 0 MESSAGEBOX 0, path + "ColorsF.txt NOT copied","Info" ENDIF ENDIF ENDIF CLOSEWINDOW win ' Next CASE b_next clearwin() scntr = cntr cntrf = cntr + 1 FOR i = 10 TO 1000 STEP 160 FOR j = 25 TO 750 STEP 45 cntr++ IF cntr > maxcntr i = 1010 j = 760 cntr = maxcntr ELSE IF lbtext = "*All" Legend(i,j,155,20,0,0,0,irgb[cntr,0],irgb[cntr,1],irgb[cntr,2], _ RTRIM$(icol[0,cntr])+":"+istr[cntr],ihex[0,cntr]) ELSE Legend(i,j,155,20,0,0,0,irgb[cntr,0],irgb[cntr,1],irgb[cntr,2], _ istr[cntr],ihex[0,cntr]) ENDIF ENDIF NEXT j NEXT i cntrl = cntr DispSE() ' Prev CASE b_prev clearwin() cntr = cntr - 119 - 119 IF cntr < 0 THEN cntr = -1 cntrf = cntr + 1 FOR i = 10 TO 1000 STEP 160 FOR j = 25 TO 750 STEP 45 cntr++ IF cntr > maxcntr i = 1010 j = 760 cntr = maxcntr ELSE IF lbtext = "*All" Legend(i,j,155,20,0,0,0,irgb[cntr,0],irgb[cntr,1],irgb[cntr,2], _ RTRIM$(icol[0,cntr])+":"+istr[cntr],ihex[0,cntr]) ELSE Legend(i,j,155,20,0,0,0,irgb[cntr,0],irgb[cntr,1],irgb[cntr,2], _ istr[cntr],ihex[0,cntr]) ENDIF ENDIF NEXT j NEXT i cntrl = cntr DispSE() ' RGB or Base Color CASE b_rgb_base clearwin() ClearData() maxcntr = max IF btn = "BASE" btn = "RGB" SetCaption win,"Color Bars - BASE -"+STR$(maxcntr+1)+" defs" SETCONTROLCOLOR win,b_rgb_base,RGB(0,0,0),RGB(217,217,025) 'Gold FOR i = 0 TO maxcntr temp = idata[i] ' Base Color sdata[i] = MID$(temp,_Base_Color,lBase_Color) + t + STR$(i) 'IF i<10 OR i>max-3 THEN PRINTCONSOLE(STR$(i)+" s "+sdata[i]) NEXT i ELSE btn = "BASE" SetCaption win,"Color Bars - RGB -"+STR$(maxcntr+1)+" defs" SETCONTROLCOLOR win,b_rgb_base,RGB(0,0,0),RGB(092,172,238) 'Blue FOR i = 0 TO maxcntr sdata[i] = idata[i] NEXT i ENDIF DoQsort(maxcntr) SplitRGB() SETCONTROLTEXT win,b_rgb_base,btn cntr = -1 cntrf = 0 FOR i = 10 TO 1000 STEP 160 FOR j = 25 TO 750 STEP 45 cntr++ IF lbtext = "*All" Legend(i,j,155,20,0,0,0,irgb[cntr,0],irgb[cntr,1],irgb[cntr,2], _ RTRIM$(icol[0,cntr])+":"+istr[cntr],ihex[0,cntr]) ELSE Legend(i,j,155,20,0,0,0,irgb[cntr,0],irgb[cntr,1],irgb[cntr,2], _ istr[cntr],ihex[0,cntr]) ENDIF NEXT j NEXT i cntrl = cntr DispSE() ' chg Color CASE b_chg_color CASE& b_update update = 1 SHOWWINDOW(win,@SWSHOW,b_chg_color) SHOWWINDOW(win,@SWSHOW,b_static2) SHOWWINDOW(win,@SWSHOW,b_static3) DOMODAL win2,0 ENDSELECT ENDSELECT RETURN 0 ENDSUB SUB handler_win2(),int SELECT @CLASS CASE @IDINITDIALOG CENTERWINDOW win2 SETFONT win2,"Arial",12,700,0,b_exit2 SETFONT win2,"Arial",12,700,0,b_listbox2 SETCONTROLCOLOR win2,b_exit2,RGB(0,0,0),RGB(255,0,0) 'Black, Red ADDSTRING win2,b_listbox2,"*Undef" FOR i = 0 to lbmax ADDSTRING win2,b_listbox2,lbcol[i] NEXT i SETSELECTED win2,b_listbox2,0 CASE @IDCLOSEWINDOW CASE& @IDDESTROY CLOSEDIALOG win2,@IDOK CASE @IDCONTROL SELECT @CONTROLID CASE b_listbox2 IF @NOTIFYCODE = @LBNSELCHANGE lb = GETSELECTED(win2,b_listbox2) saveas = GETSTRING(win2,b_listbox2,lb) SETCONTROLTEXT win,b_static3,saveas l = LEN(saveas) IF l < lBase_Color THEN saveas = saveas + STRING$(lBase_Color-l," ") CLOSEDIALOG win2,@IDOK ENDIF ' Exit CASE b_exit2 CLOSEDIALOG win2,@IDOK ENDSELECT ENDSELECT RETURN 0 ENDSUB SUB clearwin() RECT win,1,1,1290,799,rgb(255,255,255),rgb(255,255,255) RETURN ENDSUB SUB Legend(x:int,y:int,width:int,height:int,br:int,bg:int,bb:int,fr:int,fg:int,fb:int,msg:string,hex:STRING) '---------------------------------------------------------------------------------------- ' HOW TO USE: ' x, y = position ' width = width in pixels ' height = height in pixels ' br, bg, bb = border color ' fr, fg, fb = fill color ' msg = legend name '---------------------------------------------------------------------------------------- IF msg = "---" THEN RETURN RECT win,x,y,width,height,RGB(br,bg,bb),RGB(fr,fg,fb) MOVE win,x,y-18 IF INSTR(msg,"**") FRONTPEN win,RGB(255,0,0) BACKPEN win,RGB(0,255,255) ELSE FRONTPEN win,0 BACKPEN win,RGB(255,255,255) ENDIF PRINT win,msg FRONTPEN win,0 BACKPEN win,RGB(255,255,255) MOVE win,x+2,y+2 PRINT win,USING("0###",fr)+" "+USING("0###",fg)+" "+USING("0###",fb) :'+"-"+USING("###",cntr) 'PRINT win,hex RETURN ENDSUB INT sortByHUE INT invert SUB DoQsort(count:INT) DEF v = &sdata + 0:POINTER DEF d:INT count++ ' step 1: sort all pages by HUE sortByHUE = TRUE qsort(v, count, 255, &cmpFunc) ' step 2: sort each page by BRIGHTNESS sortByHUE = FALSE INT number_of_pages = count / (7 * 17) + 1 INT counter = 0 INT j FOR j = 1 TO number_of_pages counter += 7 * 17 INT size = 7 * 17 IF counter > count THEN size = counter - count ENDIF v = &sdata[(7 * 17) * (j - 1)] + 0 qsort(v, size, 255, &cmpFunc) NEXT j ' step 3: invert columns 2, 4, 6 on each page '/* INT columns = count / (17) + 1 string temp[17] counter = -17 invert = 1 INT w FOR j = 1 TO columns - 1 counter += 17 invert = 1 - invert IF invert THEN FOR w = 1 TO 17 IF counter + 17 - w <= count THEN temp[w - 1] = sdata[counter + 17 - w] next w FOR w = 1 TO 17 IF counter + w - 1 <= count THEN sdata[counter + w - 1] = temp[w - 1] NEXT w ENDIF NEXT j '*/ ' continue IF btn = "RGB" FOR d = 0 TO maxcntr r = VAL(MID$(sdata[d],lBase_Color+2)) sdata[d] = idata[r] NEXT d ENDIF IF (OPENFILE(myfile,path + "Colors-Sorted.txt","W") = 0) FOR i = 0 TO 3 WRITE(myfile,header[i]) NEXT i FOR d = 0 TO maxcntr WRITE(myfile,sdata[d]) NEXT d ENDIF CLOSEFILE myfile RETURN ENDSUB SUB DoQsortDE(count:INT) DEF v = &sdata + 0:POINTER DEF d:INT count++ qsort(v, count, 255, &cmpFuncDE) MESSAGEBOX 0,"DoQsortDE","End" ' IF btn = "RGB" ' FOR d = 0 TO maxcntr ' r = VAL(MID$(sdata[d],sort_len+1)) ' sdata[d] = idata[r] ' NEXT d ' ENDIF IF (OPENFILE(myfile,path + "Colors-Sorted.txt","W") = 0) FOR i = 0 TO 3 WRITE(myfile,header[i]) NEXT i FOR d = 0 TO maxcntr WRITE(myfile,sdata[d]) NEXT d ENDIF CLOSEFILE myfile RETURN ENDSUB SUB cmpFunc(a:POINTER,b:POINTER),INT DEF temp:STRING DEF hsva,hsvb:HSVType temp = *a hsva.h = VAL(MID$(temp,159,10)) hsva.s = VAL(MID$(temp,170,10)) hsva.v = VAL(MID$(temp,181,10)) temp = *b hsvb.h = VAL(MID$(temp,159,10)) hsvb.s = VAL(MID$(temp,170,10)) hsvb.v = VAL(MID$(temp,181,10)) INT sortValuea = hsva.v INT sortValueb = hsvb.v IF sortByHUE THEN sortValuea = hsva.h sortValueb = hsvb.h ENDIF RETURN sortValueA - sortValueB ENDSUB SUB cmpFuncDE(a:POINTER,b:POINTER),DOUBLE DEF temp:STRING DEF laba,labb:CieLABtype temp = *a laba.l = VAL(MID$(temp,112,11)) laba.a = VAL(MID$(temp,124,11)) laba.b = VAL(MID$(temp,136,11)) temp = *b labb.l = VAL(MID$(temp,112,11)) labb.a = VAL(MID$(temp,124,11)) labb.b = VAL(MID$(temp,136,11)) RETURN Ciede2000(laba,labb) ENDSUB SUB ExtractRGB(string text, INT r BYREF, INT g BYREF, INT b BYREF) string red, green, blue INT pos1 = INSTR(text, ",") IF pos1 THEN INT pos2 = INSTR(text, ",", pos1 + 1) IF pos2 THEN INT pos3 = INSTR(text, ",", pos2 + 1) IF pos3 THEN red = LEFT$(text, pos1-1) green = MID$(text, pos1 +1, pos2 - pos1 -1) blue = MID$(text, pos2 +1, pos3 - pos2 -1) r = VAL(red) g = VAL(green) b = VAL(blue) ENDIF ENDIF ENDIF ENDSUB SUB ColorToHSV(UINT value, INT h BYREF, INT s BYREF, INT v BYREF) word hue, sat, _val ColorRGBToHLS(value, &hue, &_val, &sat) ' see https://source.winehq.org/WineAPI/ColorRGBToHLS.html h = hue s = sat v = _val ENDSUB SUB ClearData() FOR i = 0 TO index - 1 irgb[i,0] = 0 irgb[i,1] = 0 irgb[i,2] = 0 ihex[0,i] = "" sdata[i] = "" istr[i] = "" icol[0,i] = "" NEXT i RETURN ENDSUB SUB SplitRGB() DEF c,m:INT FOR m = 0 TO maxcntr indata = sdata[m] r = INSTR(indata,",") 'IF m<4 THEN messagebox 0,indata+STR$(r),"Info" IF r > 0 c = -1 DO c++ sp$[c] = MID$(indata,1,r-1) indata = MID$(indata,r+1) r = INSTR(indata,",") 'IF m<4 THEN messagebox 0,indata+STR$(r),"Info2" UNTIL r = 0 c++ sp$[c] = indata ENDIF 'IF m<4 THEN MESSAGEBOX 0,STR$(c),"C" ' Red irgb[m,0] = VAL(sp$[0]) ' Green irgb[m,1] = VAL(sp$[1]) ' Blue irgb[m,2] = VAL(sp$[2]) ' HEX ihex[0,m] = sp$[3] ' Base icol[0,m] = RTRIM$(sp$[cBase_Color]) ' Color istr[m] = sp$[cColor] NEXT m cntr = -1 RETURN ENDSUB SUB DecToRGB(decimal:UINT) '---------------------------------------------------------------------------------------- ' Returns RGB Triplet from integer ' Original idea: TexasPete ' Please note : Red,Green and Blue Must be Global and declared outside of this function '---------------------------------------------------------------------------------------- DEF GetRed,GetGreen,GetBlue:UINT ' GetRed blue = (decimal/(256*256)) green = ((decimal-blue*256*256)/256) GetRed = (decimal-blue*256*256-green*256) ' GetGreen blue = (decimal/(256*256)) GetGreen = (decimal-blue*256*256)/256 ' GetBlue GetBlue = (decimal/(256*256)) red = GetRed green = GetGreen blue = GetBlue RETURN ENDSUB SUB UpdateRec(text:STRING) DEF ii,ll:INT FOR ii = 0 TO max ll = INSTR(idata[ii],text) IF ll msg = MESSAGEBOX 0,STR$(ll)+" "+text+" - "+MID$(idata[ii],_Base_Color,lBase_Color)+"\n"+saveas+"\n\n"+MID$(idata[ii],_Color),"Update",@MB_YESNO|@MB_ICONQUESTION IF msg = @IDYES ' up to Base Color Color temp = MID$(idata[ii],1,_Base_Color-1) + saveas + MID$(idata[ii],_Color-14) idata[ii] = temp changed = 1 ENDIF ENDIF NEXT ii RETURN ENDSUB SUB DispSE() RECT win,1180,655,100,25,rgb(255,0,0),rgb(255,0,0) MOVE win,1190,660 PRINT win,"Start ", USING("####",cntrf) RECT win,1180,705,100,25,rgb(255,0,0),rgb(255,0,0) MOVE win,1190,710 PRINT win," End ", USING("####",cntrl) RETURN ENDSUB SUB deg2rad(deg:DOUBLE),DOUBLE RETURN (deg * (pi / 180.0)) ENDSUB SUB rad2Deg(rad:DOUBLE),DOUBLE RETURN ((180.0 / pi) * rad) ENDSUB SUB pow(value:DOUBLE,power:DOUBLE),DOUBLE RETURN (value^power) ENDSUB SUB Ciede2000(lab1:CieLABtype,lab2:CieLABtype),DOUBLE /* * "For these and all other numerical/graphical [sub]delta E00 values * reported in this article, we set the parametric weighting factors * to unity(i.e., k_L = k_C = k_H = 1.0)." (Page 27). */ DEF k_L = 1.0, k_C = 1.0, k_H = 1.0:DOUBLE DEF deg360InRad = deg2Rad(360.0):DOUBLE DEF deg180InRad = deg2Rad(180.0):DOUBLE DEF pow25To7 = 6103515625.0:DOUBLE /* pow(25, 7) */ DEF C1,C2,barC,G,a1Prime,a2Prime,CPrime1,CPrime2,hPrime1,hPrime2:DOUBLE DEF deltaLPrime,deltaCPrime,DeltahPrime,CPrimeProduct,deltaHPrime2:DOUBLE DEF barLPrime,barCPrime,barhPrime,T,deltaTheta,R_C,S_L,S_C,S_H,R_T:DOUBLE DEF hPrimeSum,deltaE:DOUBLE DEF d1,d2:DOUBLE /* * Step 1 */ /* Equation 2 */ C1 = SQRT((lab1.a * lab1.a) + (lab1.b * lab1.b)) C2 = SQRT((lab2.a * lab2.a) + (lab2.b * lab2.b)) /* Equation 3 */ barC = (C1 + C2) / 2.0 /* Equation 4 */ G = 0.5 * (1 - SQRT(pow(barC, 7) / (pow(barC, 7) + pow25To7))) /* Equation 5 */ a1Prime = (1.0 + G) * lab1.a a2Prime = (1.0 + G) * lab2.a /* Equation 6 */ CPrime1 = SQRT((a1Prime * a1Prime) + (lab1.b * lab1.b)) CPrime2 = SQRT((a2Prime * a2Prime) + (lab2.b * lab2.b)) /* Equation 7 */ IF (lab1.b = 0 AND a1Prime = 0) hPrime1 = 0.0 ELSE hPrime1 = atan2(lab1.b, a1Prime) /* * This must be converted to a hue angle in degrees between 0 * and 360 by addition of 2[sub] to negative hue angles. */ IF (hPrime1 < 0) THEN hPrime1 += deg360InRad ENDIF IF (lab2.b = 0 AND a2Prime = 0) hPrime2 = 0.0 ELSE hPrime2 = atan2(lab2.b, a2Prime) /* * This must be converted to a hue angle in degrees between 0 * and 360 by addition of 2[sub] to negative hue angles. */ IF (hPrime2 < 0) THEN hPrime2 += deg360InRad ENDIF /* * Step 2 */ /* Equation 8 */ deltaLPrime = lab2.l - lab1.l /* Equation 9 */ deltaCPrime = CPrime2 - CPrime1 /* Equation 10 */ CPrimeProduct = CPrime1 * CPrime2 IF (CPrimeProduct = 0) deltahPrime = 0 ELSE /* Avoid the fabs() call */ deltahPrime = hPrime2 - hPrime1 IF (deltahPrime < -deg180InRad) deltahPrime += deg360InRad ELSEIF (deltahPrime > deg180InRad) deltahPrime -= deg360InRad ENDIF ENDIF /* Equation 11 */ deltaHPrime2 = 2.0 * SQRT(CPrimeProduct) * SIN(deltahPrime / 2.0) /* * Step 3 */ /* Equation 12 */ barLPrime = (lab1.l + lab2.l) / 2.0 /* Equation 13 */ barCPrime = (CPrime1 + CPrime2) / 2.0 /* Equation 14 */ barhPrime = hPrime1 + hPrime2 hPrimeSum = hPrime1 + hPrime2 IF (CPrime1 * CPrime2 = 0) barhPrime = hPrimeSum ELSE IF (ABS(hPrime1 - hPrime2) <= deg180InRad) barhPrime = hPrimeSum / 2.0 ELSE IF (hPrimeSum < deg360InRad) barhPrime = (hPrimeSum + deg360InRad) / 2.0 ELSE barhPrime = (hPrimeSum - deg360InRad) / 2.0 ENDIF ENDIF ENDIF /* Equation 15 */ T = 1.0 - (0.17 * COS(barhPrime - deg2Rad(30.0))) + _ (0.24 * COS(2.0 * barhPrime)) + _ (0.32 * COS((3.0 * barhPrime) + deg2Rad(6.0))) - _ (0.20 * COS((4.0 * barhPrime) - deg2Rad(63.0))) /* Equation 16 */ 'deltaTheta = deg2Rad(30.0) * EXP(-pow((barhPrime - deg2Rad(275.0)) / deg2Rad(25.0), 2.0)) d1=deg2Rad(30.0) d2=EXP(-pow((barhPrime - deg2Rad(275.0)) / deg2Rad(25.0), 2.0)) deltaTheta=d1*d2 /* Equation 17 */ R_C = 2.0 * SQRT(pow(barCPrime, 7.0) / (pow(barCPrime, 7.0) + pow25To7)) /* Equation 18 */ S_L = 1 + ((0.015 * pow(barLPrime - 50.0, 2.0)) / SQRT(20 + pow(barLPrime - 50.0, 2.0))) /* Equation 19 */ S_C = 1 + (0.045 * barCPrime) /* Equation 20 */ S_H = 1 + (0.015 * barCPrime * T) /* Equation 21 */ R_T = (-SIN(2.0 * deltaTheta)) * R_C /* Equation 22 */ deltaE = SQRT( _ pow(deltaLPrime / (k_L * S_L), 2.0) + _ pow(deltaCPrime / (k_C * S_C), 2.0) + _ pow(deltaHPrime2 / (k_H * S_H), 2.0) + _ (R_T * (deltaCPrime / (k_C * S_C)) * (deltaHPrime2 / (k_H * S_H)))) RETURN (deltaE) ENDSUB /* '---- print text to console window ----------- SUB PrintConsole(text:STRING) STATIC UINT stdout UINT charwritten IF stdout=0 OPENCONSOLE stdout=GetStdHandle(-11) SetWindowPos(FindWindow(0,__FILE__),HWND_TOPMOST,0, 0, 0, 0,SWP_NOMOVE | SWP_NOSIZE) test=1 ENDIF WriteConsole(stdout,text+"\n",len(text)+2,&charwritten,0) RETURN ENDSUB */ ' Split created by Ficko _asm Split: push ebp mov ebp, esp push esi push edi push ebx mov edi, [ebp+8] mov esi, [ebp+16] xor ecx, ecx xor ebx, ebx movzx eax, byte [ebp+12] C01:mov [esi], edi inc ebx C00:cmp byte [edi], 0 jz Exit inc ecx scasb jnz C00 lea esi, [esi+4] mov [edi-1], ah jmp C01 Exit: mov dword [esi+4], 0 ;Can be omited since we have return value. xchg eax, ebx pop ebx pop edi pop esi leave ret 0x0C _endasm